code wiki / _hdl_build / _dxg_enum_probe.nx
_dxg_enum_probe.nx source
↩ module page · 69 lines · 4513 B
1// _dxg_enum_probe.nx -- the REAL minimal-call confirmation for the SOVEREIGN-GPU foundation.
2// Raw openat("/dev/dxg") + raw ioctl LX_DXENUMADAPTERS2 against the real dxgkrnl thunk -> reads
3// the RTX 5080's REAL adapter count + LUID. NO libvulkan/libcuda/libdxcore, NO libc. Raw syscalls.
4//
5// ABI (pinned from WSL2-Linux-Kernel linux-msft-wsl-6.6.y, include/uapi/misc/d3dkmthk.h):
6// #define LX_DXENUMADAPTERS2 _IOWR(0x47, 0x14, struct d3dkmt_enumadapters2)
7// struct d3dkmt_enumadapters2 { __u32 num_adapters; __u32 reserved; __u64 *adapters; } // 16 bytes
8// struct d3dkmt_adapterinfo { d3dkmthandle handle(4); winluid luid(8); u32 num_sources;
9// u32 present_move_regions_preferred; } // 20 bytes
10// _IOWR(0x47,0x14,16) = (3<<30)|(16<<16)|(0x47<<8)|0x14 = 0xC0104714
11//
12// PROTOCOL (two-step): call #1 with num_adapters set to a CAPACITY and adapters -> a buffer of
13// d3dkmt_adapterinfo; the kernel writes back the actual count into num_adapters and fills the
14// array. (LX_DXENUMADAPTERS2 fills up to num_adapters entries and returns the real count.)
15// TAMPER: a magic-0x99 ioctl must return a real errno (-ENOTTY) != the 0x47 result -> no-false-green.
16// license_tier: ORIGINAL
17import "nx_syscalls.nx"
18
19func dp_p(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
20func dp_n(v: i64) -> i64 { let bb: *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;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{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 }
21func dp_x(v: i64) -> i64 { dp_p("0x" as *u8); let bb:*u8=sys_mmap(20); var k:i64=0; var m:i64=v; if m==0{bb[0]=48;k=1}; while m>0{ let d:i64=m&15; if d<10{bb[k]=(48+d) as u8}else{bb[k]=(87+d) as u8}; m=(m>>4); k=k+1 } var i:i64=0; let o:*u8=sys_mmap(20); while i<k{o[i]=bb[k-1-i];i=i+1} sys_write(1,o,k); return 0 }
22
23func main() -> i64 {
24 let fd: i64 = sys_openat_rd("/dev/dxg" as *u8)
25 dp_p("DXGENUM open(/dev/dxg) fd=" as *u8); dp_n(fd); dp_p("\n" as *u8)
26 if fd < 0 { dp_p("DXGENUM verdict=RED reason=open-failed\n" as *u8); sys_exit(1); return 1 }
27
28 // adapter-info output buffer: capacity 8 entries * 20 bytes = 160 bytes (page-mmap'd).
29 let ainfo: *u8 = sys_mmap(4096)
30 var z: i64 = 0
31 while z < 4096 { ainfo[z] = 0 as u8; z = z + 1 }
32
33 // struct d3dkmt_enumadapters2 (16 bytes): [0]=u32 num_adapters, [4]=u32 reserved, [8]=u64 *adapters
34 let req: *u8 = sys_mmap(64)
35 var y: i64 = 0
36 while y < 64 { req[y] = 0 as u8; y = y + 1 }
37 // num_adapters = capacity 8 (little-endian u32)
38 req[0] = 8 as u8; req[1] = 0 as u8; req[2] = 0 as u8; req[3] = 0 as u8
39 // adapters pointer (u64 at offset 8)
40 let ap: i64 = ainfo as i64
41 let r8: *i64 = (req as i64 + 8) as *i64
42 r8[0] = ap
43
44 // TAMPER first (no-false-green control): magic 0x99 must be rejected with a real errno.
45 let tamper: i64 = sys_ioctl(fd, 0x99000000, req as i64)
46 dp_p("DXGENUM tamper(magic=0x99) ret=" as *u8); dp_n(tamper); dp_p("\n" as *u8)
47
48 // REAL CALL: LX_DXENUMADAPTERS2 = 0xC0104714
49 let CODE: i64 = 0xC0104714
50 dp_p("DXGENUM ioctl LX_DXENUMADAPTERS2 code=" as *u8); dp_x(CODE); dp_p("\n" as *u8)
51 let ret: i64 = sys_ioctl(fd, CODE, req as i64)
52 dp_p("DXGENUM ioctl ret=" as *u8); dp_n(ret); dp_p("\n" as *u8)
53
54 // read back num_adapters (kernel may overwrite offset 0 with the real count)
55 let nc: i64 = (req[0] as i64) | ((req[1] as i64)<<8) | ((req[2] as i64)<<16) | ((req[3] as i64)<<24)
56 dp_p("DXGENUM num_adapters(after)=" as *u8); dp_n(nc); dp_p("\n" as *u8)
57
58 // adapter[0] LUID = winluid at offset 4 of d3dkmt_adapterinfo (after 4-byte handle)
59 let luid_a: i64 = (ainfo[4] as i64)|((ainfo[5] as i64)<<8)|((ainfo[6] as i64)<<16)|((ainfo[7] as i64)<<24)
60 let luid_b: i64 = (ainfo[8] as i64)|((ainfo[9] as i64)<<8)|((ainfo[10] as i64)<<16)|((ainfo[11] as i64)<<24)
61 let handle0: i64 = (ainfo[0] as i64)|((ainfo[1] as i64)<<8)|((ainfo[2] as i64)<<16)|((ainfo[3] as i64)<<24)
62 dp_p("DXGENUM adapter[0] handle=" as *u8); dp_x(handle0)
63 dp_p(" luid.a=" as *u8); dp_x(luid_a); dp_p(" luid.b=" as *u8); dp_x(luid_b); dp_p("\n" as *u8)
64
65 sys_close(fd)
66 if ret == 0 { dp_p("DXGENUM verdict=GREEN reason=real-adapter-data-from-5080\n" as *u8) }
67 else { dp_p("DXGENUM verdict=PARTIAL reason=ioctl-reached-device-nonzero-ret(see-code)\n" as *u8) }
68 return 0
69}