Commit 423e4d19 authored by Ard Biesheuvel's avatar Ard Biesheuvel Committed by Ingo Molnar

x86/boot/compressed: Get rid of GOT fixup code

In a previous patch, we have eliminated GOT entries from the decompressor
binary and added an assertion that the .got section is empty. This means
that the GOT fixup routines that exist in both the 32-bit and 64-bit
startup routines have become dead code, and can be removed.

While at it, drop the KEEP() from the linker script, as it has no effect
on the contents of output sections that are created by the linker itself.
Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
Signed-off-by: default avatarArvind Sankar <nivedita@alum.mit.edu>
Signed-off-by: default avatarKees Cook <keescook@chromium.org>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
Tested-by: default avatarNick Desaulniers <ndesaulniers@google.com>
Tested-by: default avatarSedat Dilek <sedat.dilek@gmail.com>
Reviewed-by: default avatarKees Cook <keescook@chromium.org>
Acked-by: default avatarArvind Sankar <nivedita@alum.mit.edu>
Link: https://lore.kernel.org/r/20200731230820.1742553-4-keescook@chromium.org
parent e544ea57
...@@ -49,16 +49,13 @@ ...@@ -49,16 +49,13 @@
* Position Independent Executable (PIE) so that linker won't optimize * Position Independent Executable (PIE) so that linker won't optimize
* R_386_GOT32X relocation to its fixed symbol address. Older * R_386_GOT32X relocation to its fixed symbol address. Older
* linkers generate R_386_32 relocations against locally defined symbols, * linkers generate R_386_32 relocations against locally defined symbols,
* _bss, _ebss, _got, _egot and _end, in PIE. It isn't wrong, just less * _bss, _ebss and _end, in PIE. It isn't wrong, just less optimal than
* optimal than R_386_RELATIVE. But the x86 kernel fails to properly handle * R_386_RELATIVE. But the x86 kernel fails to properly handle R_386_32
* R_386_32 relocations when relocating the kernel. To generate * relocations when relocating the kernel. To generate R_386_RELATIVE
* R_386_RELATIVE relocations, we mark _bss, _ebss, _got, _egot and _end as * relocations, we mark _bss, _ebss and _end as hidden:
* hidden:
*/ */
.hidden _bss .hidden _bss
.hidden _ebss .hidden _ebss
.hidden _got
.hidden _egot
.hidden _end .hidden _end
__HEAD __HEAD
...@@ -192,19 +189,6 @@ SYM_FUNC_START_LOCAL_NOALIGN(.Lrelocated) ...@@ -192,19 +189,6 @@ SYM_FUNC_START_LOCAL_NOALIGN(.Lrelocated)
shrl $2, %ecx shrl $2, %ecx
rep stosl rep stosl
/*
* Adjust our own GOT
*/
leal _got(%ebx), %edx
leal _egot(%ebx), %ecx
1:
cmpl %ecx, %edx
jae 2f
addl %ebx, (%edx)
addl $4, %edx
jmp 1b
2:
/* /*
* Do the extraction, and jump to the new kernel.. * Do the extraction, and jump to the new kernel..
*/ */
......
...@@ -40,8 +40,6 @@ ...@@ -40,8 +40,6 @@
*/ */
.hidden _bss .hidden _bss
.hidden _ebss .hidden _ebss
.hidden _got
.hidden _egot
.hidden _end .hidden _end
__HEAD __HEAD
...@@ -353,25 +351,6 @@ SYM_CODE_START(startup_64) ...@@ -353,25 +351,6 @@ SYM_CODE_START(startup_64)
/* Set up the stack */ /* Set up the stack */
leaq boot_stack_end(%rbx), %rsp leaq boot_stack_end(%rbx), %rsp
/*
* paging_prepare() and cleanup_trampoline() below can have GOT
* references. Adjust the table with address we are running at.
*
* Zero RAX for adjust_got: the GOT was not adjusted before;
* there's no adjustment to undo.
*/
xorq %rax, %rax
/*
* Calculate the address the binary is loaded at and use it as
* a GOT adjustment.
*/
call 1f
1: popq %rdi
subq $1b, %rdi
call .Ladjust_got
/* /*
* At this point we are in long mode with 4-level paging enabled, * At this point we are in long mode with 4-level paging enabled,
* but we might want to enable 5-level paging or vice versa. * but we might want to enable 5-level paging or vice versa.
...@@ -464,21 +443,6 @@ trampoline_return: ...@@ -464,21 +443,6 @@ trampoline_return:
pushq $0 pushq $0
popfq popfq
/*
* Previously we've adjusted the GOT with address the binary was
* loaded at. Now we need to re-adjust for relocation address.
*
* Calculate the address the binary is loaded at, so that we can
* undo the previous GOT adjustment.
*/
call 1f
1: popq %rax
subq $1b, %rax
/* The new adjustment is the relocation address */
movq %rbx, %rdi
call .Ladjust_got
/* /*
* Copy the compressed kernel to the end of our buffer * Copy the compressed kernel to the end of our buffer
* where decompression in place becomes safe. * where decompression in place becomes safe.
...@@ -556,27 +520,6 @@ SYM_FUNC_START_LOCAL_NOALIGN(.Lrelocated) ...@@ -556,27 +520,6 @@ SYM_FUNC_START_LOCAL_NOALIGN(.Lrelocated)
jmp *%rax jmp *%rax
SYM_FUNC_END(.Lrelocated) SYM_FUNC_END(.Lrelocated)
/*
* Adjust the global offset table
*
* RAX is the previous adjustment of the table to undo (use 0 if it's the
* first time we touch GOT).
* RDI is the new adjustment to apply.
*/
.Ladjust_got:
/* Walk through the GOT adding the address to the entries */
leaq _got(%rip), %rdx
leaq _egot(%rip), %rcx
1:
cmpq %rcx, %rdx
jae 2f
subq %rax, (%rdx) /* Undo previous adjustment */
addq %rdi, (%rdx) /* Apply the new adjustment */
addq $8, %rdx
jmp 1b
2:
ret
.code32 .code32
/* /*
* This is the 32-bit trampoline that will be copied over to low memory. * This is the 32-bit trampoline that will be copied over to low memory.
......
...@@ -43,9 +43,7 @@ SECTIONS ...@@ -43,9 +43,7 @@ SECTIONS
_erodata = . ; _erodata = . ;
} }
.got : { .got : {
_got = .; *(.got)
KEEP(*(.got))
_egot = .;
} }
.got.plt : { .got.plt : {
*(.got.plt) *(.got.plt)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment