x86, reboot: Fix relocations in reboot_32.S
tip-bot for H. Peter Anvin
reviewerCommit-ID: 7806a49ab625ebeb1709e5e87299b64932b807a7 Gitweb: http://git.kernel.org/tip/7806a49ab625ebeb1709e5e87299b64932b807a7 Author: H. Peter Anvin <[email protected]> AuthorDate: Mon, 2 May 2011 14:33:24 -0700 Committer: H. Peter Anvin <[email protected]> CommitDate: Mon, 2 May 2011 14:44:46 -0700
x86, reboot: Fix relocations in reboot_32.S
The use of base for %ebx in this file is arbitrary, *except* that we also use it to compute the real-mode segment. Therefore, make it so that r_base really is the true address to which %ebx points.
This resolves kernel bugzilla 33302.
Reported-and-tested-by Alexey Zaytsev <[email protected]>
Signed-off-by H. Peter Anvin <[email protected]>
--- arch/x86/kernel/reboot_32.S | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-)
arch/x86/kernel/reboot_32.S +6 -6
@@ -21,26 +21,26 @@ r_base = . /* Get our own relocated address */ call 1f 1: popl %ebx - subl $1b, %ebx + subl $(1b - r_base), %ebx /* Compute the equivalent real-mode segment */ movl %ebx, %ecx shrl $4, %ecx /* Patch post-real-mode segment jump */ - movw dispatch_table(%ebx,%eax,2),%ax - movw %ax, 101f(%ebx) - movw %cx, 102f(%ebx) + movw (dispatch_table - r_base)(%ebx,%eax,2),%ax + movw %ax, (101f - r_base)(%ebx) + movw %cx, (102f - r_base)(%ebx) /* Set up the IDT for real mode. */ - lidtl machine_real_restart_idt(%ebx) + lidtl (machine_real_restart_idt - r_base)(%ebx) /* * Set up a GDT from which we can load segment descriptors for real * mode. The GDT is not used in real mode; it is just needed here to * prepare the descriptors. */ - lgdtl machine_real_restart_gdt(%ebx) + lgdtl (machine_real_restart_gdt - r_base)(%ebx) /* * Load the data segment registers with 16-bit compatible values