check that the hardware supports 32 bit before starting Reference: /n/atom/patch/applied/ipl64chk Date: Thu Apr 17 23:13:05 CES 2014 Signed-off-by: quanstro@quanstro.net --- /sys/src/boot/pcipl/cpuid.s Thu Jan 1 00:00:00 1970 +++ /sys/src/boot/pcipl/cpuid.s Thu Apr 17 23:13:05 2014 @@ -0,0 +1,13 @@ +TEXT cpuid(SB), 1, $0 + MOVL regs+0(FP), BP + MOVL 0(BP), AX + MOVL 4(BP), BX + MOVL 8(BP), CX + MOVL 8(BP), DX + BYTE $0x0F; BYTE $0xA2 + MOVL regs+0(FP), BP + MOVL AX, 0(BP) + MOVL BX, 4(BP) + MOVL CX, 8(BP) + MOVL DX, 12(BP) + RET --- /sys/src/boot/pcipl/mkfile Thu Apr 17 23:13:05 2014 +++ /sys/src/boot/pcipl/mkfile Thu Apr 17 23:13:05 2014 @@ -34,7 +34,7 @@ iplpbs: iplpbs.$O $LD -o $target -H3 -T0x0800 -l $prereq -ipl&: l%.$O %.$O sub.$O e820.$O a20.$O edd.$O eddif.$O +ipl&: l%.$O %.$O sub.$O e820.$O a20.$O cpuid.$O edd.$O eddif.$O $LD -o $target -H3 -T0x7c00 -l $prereq install:V: --- /sys/src/boot/pcipl/sub.c Thu Apr 17 23:13:05 2014 +++ /sys/src/boot/pcipl/sub.c Thu Apr 17 23:13:05 2014 @@ -517,12 +517,36 @@ return "i/o error"; } +typedef struct Cpuidreg Cpuidreg; +struct Cpuidreg { + u32int ax; + u32int bx; + u32int cx; + u32int dx; +}; +void cpuid(Cpuidreg*); + +int +check64(void) +{ + Cpuidreg r; + + memset(&r, 0, sizeof r); + r.ax = 0x80000001; + cpuid(&r); + if(r.dx & 1<<29) + return 0; + return -1; +} + char* warp64(Exec ex, void *f) { uchar *e, *d, *b, *t, ulv[8]; ulong n; + if(check64() == -1) + return "hw not 64bit"; if(readn(f, ulv, 8) != 8) return "bad header"; e = (uchar*)(getbe(&ex.entry, 4) & ~0xF0000000UL);