Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 22a57f58 authored by H. Peter Anvin's avatar H. Peter Anvin
Browse files

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: default avatarH. Peter Anvin <hpa@linux.intel.com>
LKML-Reference: <4C57382E.8050501@zytor.com>
parent 70b0d22d
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -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
Original line number Diff line number Diff line
@@ -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
Original line number Diff line number Diff line
@@ -41,6 +41,12 @@ SECTIONS
		*(.rodata.*)
		_erodata = . ;
	}
	.got : {
		_got = .;
		KEEP(*(.got.plt))
		KEEP(*(.got))
		_egot = .;
	}
	.data :	{
		_data = . ;
		*(.data)