summaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/reboot_32.S
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@linux.intel.com>2011-02-19 00:47:42 +0100
committerH. Peter Anvin <hpa@linux.intel.com>2011-02-19 00:47:42 +0100
commitee1b06ea6aed979da3b4e6b6ffea98ad55a3c5c1 (patch)
tree06b0420b33bdba387d89faba3ed1271492fad9f1 /arch/x86/kernel/reboot_32.S
parentx86, reboot: Move the real-mode reboot code to an assembly file (diff)
downloadlinux-ee1b06ea6aed979da3b4e6b6ffea98ad55a3c5c1.tar.xz
linux-ee1b06ea6aed979da3b4e6b6ffea98ad55a3c5c1.zip
x86, reboot: Fix the use of passed arguments in 32-bit BIOS reboot
The initial version of this patch had %eax being a segment and %ecx being the mode. I had changed the interfaces, but not the actual implementation! Reported-by: Brian Gerst <brgerst@gmail.com> LKML-Reference: <AANLkTikxqk=HEw9R-Du=v-1ti1HDGAY9vaNUep2XARaz@mail.gmail.com> Cc: Stephen Rothwell <sfr@canb.auug.org.au> Cc: Rafael J. Wysocki <rjw@sisk.pl> Cc: Matthieu Castet <castet.matthieu@free.fr>
Diffstat (limited to 'arch/x86/kernel/reboot_32.S')
-rw-r--r--arch/x86/kernel/reboot_32.S10
1 files changed, 7 insertions, 3 deletions
diff --git a/arch/x86/kernel/reboot_32.S b/arch/x86/kernel/reboot_32.S
index f242356a096e..29092b38d816 100644
--- a/arch/x86/kernel/reboot_32.S
+++ b/arch/x86/kernel/reboot_32.S
@@ -23,10 +23,14 @@ r_base = .
1: popl %ebx
subl $1b, %ebx
+ /* Compute the equivalent real-mode segment */
+ movl %ebx, %ecx
+ shrl $4, %ecx
+
/* Patch post-real-mode segment jump */
- movw dispatch_table(%ebx,%ecx,2),%cx
- movw %cx, 101f(%ebx)
- movw %ax, 102f(%ebx)
+ movw dispatch_table(%ebx,%eax,2),%ax
+ movw %ax, 101f(%ebx)
+ movw %cx, 102f(%ebx)
/* Set up the IDT for real mode. */
lidtl machine_real_restart_idt(%ebx)