Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86, setup: Allow global variables and functions in the decompressor

In order for global variables and functions to work in the
decompressor, we need to fix up the GOT in assembly code.

Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
LKML-Reference: <4C57382E.8050501@zytor.com>

+32
+13
arch/x86/boot/compressed/head_32.S
··· 124 124 rep stosl 125 125 126 126 /* 127 + * Adjust our own GOT 128 + */ 129 + leal _got(%ebx), %edx 130 + leal _egot(%ebx), %ecx 131 + 1: 132 + cmpl %ecx, %edx 133 + jae 2f 134 + addl %ebx, (%edx) 135 + addl $4, %edx 136 + jmp 1b 137 + 2: 138 + 139 + /* 127 140 * Do the decompression, and jump to the new kernel.. 128 141 */ 129 142 leal z_extract_offset_negative(%ebx), %ebp
+13
arch/x86/boot/compressed/head_64.S
··· 280 280 rep stosq 281 281 282 282 /* 283 + * Adjust our own GOT 284 + */ 285 + leaq _got(%rip), %rdx 286 + leaq _egot(%rip), %rcx 287 + 1: 288 + cmpq %rcx, %rdx 289 + jae 2f 290 + addq %rbx, (%rdx) 291 + addq $8, %rdx 292 + jmp 1b 293 + 2: 294 + 295 + /* 283 296 * Do the decompression, and jump to the new kernel.. 284 297 */ 285 298 pushq %rsi /* Save the real mode argument */
+6
arch/x86/boot/compressed/vmlinux.lds.S
··· 41 41 *(.rodata.*) 42 42 _erodata = . ; 43 43 } 44 + .got : { 45 + _got = .; 46 + KEEP(*(.got.plt)) 47 + KEEP(*(.got)) 48 + _egot = .; 49 + } 44 50 .data : { 45 51 _data = . ; 46 52 *(.data)