Package: syslinux
Version: 3.31-1
Severity: wishlist
Tags: patch

This patch adds a "default64" command that uses CPUID and only acts when the cpu
is detected to support 64-bit mode.

  It's been obtained from upstream mailing list:

  http://syslinux.zytor.com/archives/2007-January/007832.html

I've tested it succesfuly using qemu/qemu-system-x86-64.  Also, the author
states that it's been tested in his environment for almost a year.

If it gets in time for etch, we could use it in the multiarch CDs to support
i386 and amd64 in the same CD without user intervention.

-- System Information:
Debian Release: 4.0
  APT prefers testing
  APT policy: (500, 'testing')
Architecture: amd64 (x86_64)
Shell:  /bin/sh linked to /bin/bash
Kernel: Linux 2.6.18-3-amd64
Locale: LANG=ca_AD.UTF-8, LC_CTYPE=ca_AD.UTF-8 (charmap=UTF-8)

Versions of packages syslinux depends on:
ii  libc6                        2.3.6.ds1-8 GNU C Library: Shared libraries

Versions of packages syslinux recommends:
ii  mtools                      3.9.10.ds1-3 Tools for manipulating MSDOS files

-- no debconf information
diff -ur syslinux-3.31.orig/cpuinit.inc syslinux-3.31/cpuinit.inc
--- syslinux-3.31.orig/cpuinit.inc      2006-09-26 00:52:22.000000000 -0400
+++ syslinux-3.31/cpuinit.inc   2007-01-03 14:41:27.000000000 -0500
@@ -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,47 @@
 ;
 ; 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 the CPU features byte ($0000_0001, edx)
+; This is bit 30 for Intel CPUs, and bit 29 for AMD CPUs
+;
+               mov eax, 00000000h              ; Find last Intel cpuid #
+               cpuid
+               cmp eax, 00000000h
+               je test_amd
+               mov eax, 00000001h              ; Read Intel CPU flags
+               cpuid
+               bt edx, 30                      ; 64-bit if bit 30 is set
+               jc is_64bit
+
+test_amd:      mov eax, 80000000h              ; Find last AMD cpuid #
+               cpuid
+               cmp eax, 80000000h
+               jbe is_32bit
+               mov eax, 80000001h              ; Read AMD CPU flags
+               cpuid
+               bt edx, 29                      ; 64-bit if bit 29 is set
+               jnc is_32bit
+
+is_64bit:      mov byte [Is64Bit],1            ; Flag that we're 64-bit
+is_32bit:
diff -ur syslinux-3.31.orig/keywords syslinux-3.31/keywords
--- syslinux-3.31.orig/keywords 2006-09-26 00:52:22.000000000 -0400
+++ syslinux-3.31/keywords      2007-01-03 14:02:22.000000000 -0500
@@ -1,6 +1,7 @@
 menu
 append
 default
+default64
 display
 font
 implicit
diff -ur syslinux-3.31.orig/keywords.inc syslinux-3.31/keywords.inc
--- syslinux-3.31.orig/keywords.inc     2006-09-26 00:52:22.000000000 -0400
+++ syslinux-3.31/keywords.inc  2007-01-03 14:02:38.000000000 -0500
@@ -46,6 +46,7 @@
                keyword menu,      pc_comment
                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 -ur syslinux-3.31.orig/kwdhash.gen syslinux-3.31/kwdhash.gen
--- syslinux-3.31.orig/kwdhash.gen      2006-09-26 00:52:27.000000000 -0400
+++ syslinux-3.31/kwdhash.gen   2007-01-03 15:17:26.000000000 -0500
@@ -1,6 +1,7 @@
 hash_menu               equ 0x003719b5
 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 -ur syslinux-3.31.orig/parseconfig.inc syslinux-3.31/parseconfig.inc
--- syslinux-3.31.orig/parseconfig.inc  2006-09-26 00:52:22.000000000 -0400
+++ syslinux-3.31/parseconfig.inc       2007-01-03 16:34:19.000000000 -0500
@@ -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
@@ -389,6 +402,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

Reply via email to