diff -urN syslinux-3.36.orig/cpuinit.inc syslinux-3.36/cpuinit.inc --- syslinux-3.36.orig/cpuinit.inc 2007-02-10 15:47:08.000000000 -0500 +++ syslinux-3.36/cpuinit.inc 2007-04-04 18:04:23.000000000 -0400 @@ -48,12 +48,10 @@ rep movsd ; -; Check if we're 386 (as opposed to 486+); if so we need to blank out -; the WBINVD instruction +; Determine if we're running on a 64-bit CPU ; -; We check for 486 by setting EFLAGS.AC +; First, check if we're 386. If so, we need to blank out the WBINVD instruction ; -%if DO_WBINVD pushfd ; Save the good flags pushfd pop eax @@ -69,6 +67,37 @@ ; ; 386 - Looks like we better blot out the WBINVD instruction ; +%if DO_WBINVD mov byte [try_wbinvd],0c3h ; Near RET -is_486: %endif ; DO_WBINVD + jmp is_32bit +is_486: +; +; Check if this CPU supports the CPUID command +; + pushfd ; Save the flags again + pushfd + pop eax + mov ebx,eax + xor eax,(1 << 21) ; CPUID bit + push eax + popfd + pushfd + pop eax + popfd ; Restore the original flags + xor eax,ebx + jz is_32bit +; +; Now check for the 64-bit flag in bit 29 of the Extended CPU features byte, +; ($8000_0001, edx). +; + mov eax, 80000000h ; Find last extended CPUID # + cpuid + cmp eax, 80000000h + jbe is_32bit + mov eax, 80000001h ; Read Extended CPU flags + cpuid + bt edx, 29 ; 64-bit if bit 29 is set + jnc is_32bit + mov byte [Is64Bit],1 ; Flag that we're 64-bit +is_32bit: diff -urN syslinux-3.36.orig/keywords syslinux-3.36/keywords --- syslinux-3.36.orig/keywords 2007-02-10 15:47:08.000000000 -0500 +++ syslinux-3.36/keywords 2007-04-04 18:04:23.000000000 -0400 @@ -2,6 +2,7 @@ text append default +default64 display font implicit diff -urN syslinux-3.36.orig/keywords.inc syslinux-3.36/keywords.inc --- syslinux-3.36.orig/keywords.inc 2007-02-10 15:47:08.000000000 -0500 +++ syslinux-3.36/keywords.inc 2007-04-04 18:05:12.000000000 -0400 @@ -49,6 +49,7 @@ keyword text, pc_text keyword append, pc_append keyword default, pc_default + keyword default64, pc_default64 keyword display, pc_filecmd, get_msg_file keyword font, pc_filecmd, loadfont keyword implicit, pc_setint16, AllowImplicit diff -urN syslinux-3.36.orig/kwdhash.gen syslinux-3.36/kwdhash.gen --- syslinux-3.36.orig/kwdhash.gen 2007-02-10 15:47:13.000000000 -0500 +++ syslinux-3.36/kwdhash.gen 2007-04-04 18:04:23.000000000 -0400 @@ -2,6 +2,7 @@ hash_text equ 0x003b9b74 hash_append equ 0xc53999a4 hash_default equ 0xcc5159ed +hash_default64 equ 0x4567b1c5 hash_display equ 0xd509bc40 hash_font equ 0x0032b1b4 hash_implicit equ 0xa6f50207 diff -urN syslinux-3.36.orig/parseconfig.inc syslinux-3.36/parseconfig.inc --- syslinux-3.36.orig/parseconfig.inc 2007-02-10 15:47:08.000000000 -0500 +++ syslinux-3.36/parseconfig.inc 2007-04-04 18:04:23.000000000 -0400 @@ -20,7 +20,20 @@ ; ; "default" command ; -pc_default: mov di,default_cmd +pc_default: cmp byte [HasDefault64],0 ; Check if we accepted 'default64' + ja pc_getline ; If so, do nothing + mov di,default_cmd + call getline + mov byte [di-1],0 ; null-terminate + ret + +; +; "default64" command +; +pc_default64: cmp byte [Is64Bit],0 ; Make sure cpu is 64-bit + je pc_getline + mov byte [HasDefault64],1 ; Note that we saw a default64 + mov di,default_cmd call getline mov byte [di-1],0 ; null-terminate ret @@ -414,6 +427,8 @@ SerialPort dw 0 ; Serial port base (or 0 for no serial port) VKernelBytes dw 0 ; Number of bytes used by vkernels VKernel db 0 ; Have we seen any "label" statements? +Is64Bit db 0 ; Is this CPU 64-bit? +HasDefault64 db 0 ; We've seen a 'default64' statement section .latebss alignb 4 ; For the good of REP MOVSD