lkml.org 
[lkml]   [2007]   [Nov]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
From
SubjectRe: [GIT PULL] x86 setup: correct booting on 486DX4
Date
"H. Peter Anvin" <hpa@zytor.com> writes:

> Hi Linus; please pull:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/hpa/linux-2.6-x86setup.git
> for-linus
>
> H. Peter Anvin (1):
> x86 setup: correct booting on 486DX4
>
> arch/x86/boot/pmjump.S | 32 +++++++++++++++++++++-----------
> 1 files changed, 21 insertions(+), 11 deletions(-)
>
> [Full diff and log follows]

Looks reasonable to me.

> commit ac3b37b78c5f0f0be0b476a35370650f7bad482f
> Author: H. Peter Anvin <hpa@zytor.com>
> Date: Sun Nov 4 14:33:41 2007 -0800
>
> x86 setup: correct booting on 486DX4
>
> Apparently, the 486DX4 does not correctly serialize a mov to %cr0, so
> we really do need the far jump immediately afterwards. This means
> losing the nice separation between 16- and 32-bit code, but c'est la
> vie.
>
> Also pass %ebx = %edi = %ebp = 0 to support future extension of the
> 32-bit boot protocol.
>
> Signed-off-by: H. Peter Anvin <hpa@zytor.com>
>
> diff --git a/arch/x86/boot/pmjump.S b/arch/x86/boot/pmjump.S
> index 2e55923..17e6dec 100644
> --- a/arch/x86/boot/pmjump.S
> +++ b/arch/x86/boot/pmjump.S
> @@ -28,27 +28,37 @@
> * void protected_mode_jump(u32 entrypoint, u32 bootparams);
> */
> protected_mode_jump:
> - xorl %ebx, %ebx # Flag to indicate this is a boot
> movl %edx, %esi # Pointer to boot_params table
> - movl %eax, 2f # Patch ljmpl instruction
> +
> + xorl %edx, %edx
> + movw %cs, %dx
> + shll $4, %edx # Patch ljmpl instruction
> + addl %edx, 2f
> jmp 1f # Short jump to flush instruction q.
>
> 1:
> movw $__BOOT_DS, %cx
> + xorl %ebx, %ebx # Per protocol
> + xorl %ebp, %ebp # Per protocol
> + xorl %edi, %edi # Per protocol
>
> movl %cr0, %edx
> orb $1, %dl # Protected mode (PE) bit
> movl %edx, %cr0
> +
> + .byte 0x66, 0xea # ljmpl opcode
> +2: .long 3f # Offset
> + .word __BOOT_CS # Segment
>
> - movw %cx, %ds
> - movw %cx, %es
> - movw %cx, %fs
> - movw %cx, %gs
> - movw %cx, %ss
> + .code32
> +3:
> + movl %ecx, %ds
> + movl %ecx, %es
> + movl %ecx, %fs
> + movl %ecx, %gs
> + movl %ecx, %ss
>
> # Jump to the 32-bit entrypoint
> - .byte 0x66, 0xea # ljmpl opcode
> -2: .long 0 # offset
> - .word __BOOT_CS # segment
> -
> + jmpl *%eax
> +
> .size protected_mode_jump, .-protected_mode_jump
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2007-11-05 01:19    [W:0.035 / U:0.344 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site