lkml.org 
[lkml]   [2023]   [May]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 03/20] x86: decompressor: Call trampoline as a normal function
    Date
    Move the long return to switch to 32-bit mode into the trampoline code
    so we can call it as an ordinary function. This will allow us to call it
    directly from C code in a subsequent patch.

    Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
    ---
    arch/x86/boot/compressed/head_64.S | 25 +++++++++-----------
    arch/x86/boot/compressed/pgtable.h | 2 +-
    2 files changed, 12 insertions(+), 15 deletions(-)

    diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S
    index 59340e533dff8369..81b53b576cdd05ae 100644
    --- a/arch/x86/boot/compressed/head_64.S
    +++ b/arch/x86/boot/compressed/head_64.S
    @@ -457,18 +457,9 @@ SYM_CODE_START(startup_64)
    /* Save the trampoline address in RCX */
    movq %rax, %rcx

    - /*
    - * Load the address of trampoline_return() into RDI.
    - * It will be used by the trampoline to return to the main code.
    - */
    - leaq trampoline_return(%rip), %rdi
    -
    - /* Switch to compatibility mode (CS.L = 0 CS.D = 1) via far return */
    - pushq $__KERNEL32_CS
    leaq TRAMPOLINE_32BIT_CODE_OFFSET(%rax), %rax
    - pushq %rax
    - lretq
    -trampoline_return:
    + call *%rax
    +
    /* Restore the stack, the 32-bit trampoline uses its own stack */
    leaq rva(boot_stack_end)(%rbx), %rsp

    @@ -566,16 +557,22 @@ SYM_FUNC_START_LOCAL_NOALIGN(.Lrelocated)
    jmp *%rax
    SYM_FUNC_END(.Lrelocated)

    - .code32
    /*
    * This is the 32-bit trampoline that will be copied over to low memory.
    *
    - * RDI contains the return address (might be above 4G).
    * ECX contains the base address of the trampoline memory.
    * Non zero RDX means trampoline needs to enable 5-level paging.
    */
    SYM_CODE_START(trampoline_32bit_src)
    - /* Set up data and stack segments */
    + popq %rdi
    + /* Switch to compatibility mode (CS.L = 0 CS.D = 1) via far return */
    + pushq $__KERNEL32_CS
    + leaq 0f(%rip), %rax
    + pushq %rax
    + lretq
    +
    + .code32
    +0: /* Set up data and stack segments */
    movl $__KERNEL_DS, %eax
    movl %eax, %ds
    movl %eax, %ss
    diff --git a/arch/x86/boot/compressed/pgtable.h b/arch/x86/boot/compressed/pgtable.h
    index cc9b2529a08634b4..91dbb99203fbce2d 100644
    --- a/arch/x86/boot/compressed/pgtable.h
    +++ b/arch/x86/boot/compressed/pgtable.h
    @@ -6,7 +6,7 @@
    #define TRAMPOLINE_32BIT_PGTABLE_OFFSET 0

    #define TRAMPOLINE_32BIT_CODE_OFFSET PAGE_SIZE
    -#define TRAMPOLINE_32BIT_CODE_SIZE 0x80
    +#define TRAMPOLINE_32BIT_CODE_SIZE 0xA0

    #define TRAMPOLINE_32BIT_STACK_END TRAMPOLINE_32BIT_SIZE

    --
    2.39.2
    \
     
     \ /
      Last update: 2023-05-08 09:04    [W:8.468 / U:0.652 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site