lkml.org 
[lkml]   [2010]   [Aug]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:x86/setup] x86, setup: Allow global variables and functions in the decompressor
    Commit-ID:  22a57f5896df218356bae6203dfaf04bcfd6c88c
    Gitweb: http://git.kernel.org/tip/22a57f5896df218356bae6203dfaf04bcfd6c88c
    Author: H. Peter Anvin <hpa@linux.intel.com>
    AuthorDate: Mon, 2 Aug 2010 15:34:44 -0700
    Committer: H. Peter Anvin <hpa@linux.intel.com>
    CommitDate: Mon, 2 Aug 2010 15:34:44 -0700

    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>
    ---
    arch/x86/boot/compressed/head_32.S | 13 +++++++++++++
    arch/x86/boot/compressed/head_64.S | 13 +++++++++++++
    arch/x86/boot/compressed/vmlinux.lds.S | 6 ++++++
    3 files changed, 32 insertions(+), 0 deletions(-)

    diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S
    index f543b70..67a655a 100644
    --- a/arch/x86/boot/compressed/head_32.S
    +++ b/arch/x86/boot/compressed/head_32.S
    @@ -124,6 +124,19 @@ relocated:
    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..
    */
    leal z_extract_offset_negative(%ebx), %ebp
    diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S
    index faff0dc..52f85a1 100644
    --- a/arch/x86/boot/compressed/head_64.S
    +++ b/arch/x86/boot/compressed/head_64.S
    @@ -280,6 +280,19 @@ relocated:
    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..
    */
    pushq %rsi /* Save the real mode argument */
    diff --git a/arch/x86/boot/compressed/vmlinux.lds.S b/arch/x86/boot/compressed/vmlinux.lds.S
    index 5ddabce..34d047c 100644
    --- a/arch/x86/boot/compressed/vmlinux.lds.S
    +++ b/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)

    \
     
     \ /
      Last update: 2010-08-03 05:33    [W:0.023 / U:1.332 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site