1 #include "u.h" 2 #include "../port/lib.h" 3 #include "mem.h" 4 #include "dat.h" 5 #include "fns.h" 6 #include "io.h" 7 #include "ureg.h" 8 9 enum { 10 Ax, 11 Bx, 12 Cx, 13 Dx, 14 15 /* 16 * common to intel & amd 17 */ 18 Extfunc = 0x80000000, 19 Procsig, 20 21 /* Procsig bits */ 22 Dxlongmode = 1<<29, 23 }; 24 25 typedef unsigned long long u64intptr; 26 27 static int 28 havelongmode(void) 29 { 30 ulong regs[4]; 31 32 memset(regs, 0, sizeof regs); 33 cpuid(Extfunc, regs); 34 if(regs[Ax] < Extfunc) 35 return 0; 36 37 memset(regs, 0, sizeof regs); 38 cpuid(Procsig, regs); 39 return (regs[Dx] & Dxlongmode) != 0; 40 } 41 42 void 43 warp64(uvlong entry) 44 { 45 u64intptr kzero64 = 0xfffffffff0000000ull; 46 extern void _warp64(ulong); 47 48 print("warp64(%#llux) %#llux %d\n", entry, entry & ~kzero64, nmmap); 49 if(!havelongmode()) { 50 print("can't run 64-bit kernel on 32-bit cpu\n"); 51 delay(5000); 52 exit(0); 53 } 54 if(v_flag) 55 print("mkmultiboot\n"); 56 mkmultiboot(); 57 if(v_flag) 58 print("impulse\n"); 59 /* 60 * No output after impulse(). 61 */ 62 if(v_flag) 63 print("_warp64\n"); 64 impulse(); 65 _warp64(entry & ~kzero64); 66 } 67