소스 검색

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>
H. Peter Anvin 15 년 전
부모
커밋
22a57f5896
3개의 변경된 파일32개의 추가작업 그리고 0개의 파일을 삭제
  1. 13 0
      arch/x86/boot/compressed/head_32.S
  2. 13 0
      arch/x86/boot/compressed/head_64.S
  3. 6 0
      arch/x86/boot/compressed/vmlinux.lds.S

+ 13 - 0
arch/x86/boot/compressed/head_32.S

@@ -123,6 +123,19 @@ relocated:
 	shrl	$2, %ecx
 	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 decompression, and jump to the new kernel..
  */

+ 13 - 0
arch/x86/boot/compressed/head_64.S

@@ -279,6 +279,19 @@ relocated:
 	shrq	$3, %rcx
 	rep	stosq
 
+/*
+ * Adjust our own GOT
+ */
+	leaq	_got(%rip), %rdx
+	leaq	_egot(%rip), %rcx
+1:
+	cmpq	%rcx, %rdx
+	jae	2f
+	addq	%rbx, (%rdx)
+	addq	$8, %rdx
+	jmp	1b
+2:
+	
 /*
  * Do the decompression, and jump to the new kernel..
  */

+ 6 - 0
arch/x86/boot/compressed/vmlinux.lds.S

@@ -41,6 +41,12 @@ SECTIONS
 		*(.rodata.*)
 		_erodata = . ;
 	}
+	.got : {
+		_got = .;
+		KEEP(*(.got.plt))
+		KEEP(*(.got))
+		_egot = .;
+	}
 	.data :	{
 		_data = . ;
 		*(.data)