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}