code wiki / _hdl_build / nx_emu_x86_mode_test.nx

nx_emu_x86_mode_test.nx source

↩ module page · 37 lines · 2723 B

1// nx_emu_x86_mode_test.nx -- x86 full-system ladder R5 rung-1: the MODE-TRANSITION RULE. 2// x86 boots in 16-bit REAL mode; CR0.PE=1 -> 32-bit PROTECTED; CR0.PG=1 + EFER.LME=1 -> 64-bit LONG. 3// This encodes + verifies that state rule (the heart of the boot mode sequence). HONEST SCOPE: this 4// is the rule as a logic function; wiring it into the emu's control-register decode (0F 22 mov cr0, 5// 0F 30 wrmsr) and emulating the 16/32-bit real-mode boot code that drives it = R5 rung-2+ (the 6// substantial part). No hardware writes (Rule 26). expect_exit: 0 license_tier: ORIGINAL 7import "nx_syscalls.nx" 8 9const X86_REAL: i64 = 0 10const X86_PROTECTED: i64 = 1 11const X86_LONG: i64 = 2 12 13func md_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 14func md_putn(v: i64) -> i64 { let b: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)} let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var i: i64=0; while i<k{b[i]=t[k-1-i];i=i+1} sys_write(1,b,k); return 0 } 15 16// the x86 CPU mode from the control bits: CR0.PE, CR0.PG, EFER.LME. 17func x86_mode(pe: i64, pg: i64, lme: i64) -> i64 { 18 if pe == 0 { return X86_REAL } 19 if pg == 1 { if lme == 1 { return X86_LONG } } 20 return X86_PROTECTED 21} 22 23func main() -> i64 { 24 md_puts("x86 full-system ladder R5 rung-1: MODE-TRANSITION RULE (real->protected->long)\n" as *u8) 25 var pass: i64=0 26 var ttl: i64=0 27 28 ttl=ttl+1; md_puts(" T1 reset (PE=0) -> REAL: " as *u8); if x86_mode(0,0,0)==X86_REAL { pass=pass+1; md_puts("PASS\n" as *u8) } else { md_puts("FAIL\n" as *u8) } 29 ttl=ttl+1; md_puts(" T2 CR0.PE=1 -> PROTECTED: " as *u8); if x86_mode(1,0,0)==X86_PROTECTED { pass=pass+1; md_puts("PASS\n" as *u8) } else { md_puts("FAIL\n" as *u8) } 30 ttl=ttl+1; md_puts(" T3 PE+PG+EFER.LME -> LONG: " as *u8); if x86_mode(1,1,1)==X86_LONG { pass=pass+1; md_puts("PASS\n" as *u8) } else { md_puts("FAIL\n" as *u8) } 31 ttl=ttl+1; md_puts(" T4 PE+PG but LME=0 -> PROTECTED: " as *u8); if x86_mode(1,1,0)==X86_PROTECTED { pass=pass+1; md_puts("PASS\n" as *u8) } else { md_puts("FAIL\n" as *u8) } 32 ttl=ttl+1; md_puts(" T5 neg: PE=0 dominates -> REAL: " as *u8); if x86_mode(0,1,1)==X86_REAL { pass=pass+1; md_puts("PASS\n" as *u8) } else { md_puts("FAIL\n" as *u8) } 33 34 md_puts("X86-MODE-GATE passed " as *u8); md_putn(pass); md_puts("/" as *u8); md_putn(ttl) 35 if pass==ttl { md_puts(" verdict=GREEN (mode rule proven; emu-decode + 16/32-bit real-mode = R5 rung-2+)\n" as *u8); sys_exit(0); return 0 } 36 md_puts(" verdict=RED\n" as *u8); sys_exit(1); return 1 37}