mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-27 08:14:35 +08:00
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 <alexey.zaytsev@gmail.com> Signed-off-by: H. Peter Anvin <hpa@zytor.com> Link: http://lkml.kernel.org/n/tip-08os5wi3yq1no0y4i5m4z7he@git.kernel.org
This commit is contained in:
parent
2be19102b7
commit
7806a49ab6
@ -21,26 +21,26 @@ r_base = .
|
|||||||
/* Get our own relocated address */
|
/* Get our own relocated address */
|
||||||
call 1f
|
call 1f
|
||||||
1: popl %ebx
|
1: popl %ebx
|
||||||
subl $1b, %ebx
|
subl $(1b - r_base), %ebx
|
||||||
|
|
||||||
/* Compute the equivalent real-mode segment */
|
/* Compute the equivalent real-mode segment */
|
||||||
movl %ebx, %ecx
|
movl %ebx, %ecx
|
||||||
shrl $4, %ecx
|
shrl $4, %ecx
|
||||||
|
|
||||||
/* Patch post-real-mode segment jump */
|
/* Patch post-real-mode segment jump */
|
||||||
movw dispatch_table(%ebx,%eax,2),%ax
|
movw (dispatch_table - r_base)(%ebx,%eax,2),%ax
|
||||||
movw %ax, 101f(%ebx)
|
movw %ax, (101f - r_base)(%ebx)
|
||||||
movw %cx, 102f(%ebx)
|
movw %cx, (102f - r_base)(%ebx)
|
||||||
|
|
||||||
/* Set up the IDT for real mode. */
|
/* 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
|
* 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
|
* mode. The GDT is not used in real mode; it is just needed here to
|
||||||
* prepare the descriptors.
|
* 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
|
* Load the data segment registers with 16-bit compatible values
|
||||||
|
Loading…
Reference in New Issue
Block a user