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}