lkml.org 
[lkml]   [2018]   [Feb]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCHv2 3/5] x86/boot/compressed/64: Save and restore trampoline memory
    Date
    The memory area we found for trampoline shouldn't contain anything
    useful. But let's preserve the data anyway. Just to be on safe side.

    paging_prepare() would save the data into a buffer.

    cleanup_trampoline() would restore it back once we are done with the
    trampoline.

    Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Tested-by: Borislav Petkov <bp@suse.de>
    ---
    arch/x86/boot/compressed/head_64.S | 10 ++++++++++
    arch/x86/boot/compressed/pgtable_64.c | 13 +++++++++++++
    2 files changed, 23 insertions(+)

    diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S
    index d598d65db32c..8ba0582c65d5 100644
    --- a/arch/x86/boot/compressed/head_64.S
    +++ b/arch/x86/boot/compressed/head_64.S
    @@ -355,6 +355,16 @@ ENTRY(startup_64)
    lretq
    lvl5:

    + /*
    + * cleanup_trampoline() would restore trampoline memory.
    + *
    + * RSI holds real mode data and needs to be preserved across
    + * this function call.
    + */
    + pushq %rsi
    + call cleanup_trampoline
    + popq %rsi
    +
    /* Zero EFLAGS */
    pushq $0
    popfq
    diff --git a/arch/x86/boot/compressed/pgtable_64.c b/arch/x86/boot/compressed/pgtable_64.c
    index 21d5cc1cd5fa..01d08d3e3e43 100644
    --- a/arch/x86/boot/compressed/pgtable_64.c
    +++ b/arch/x86/boot/compressed/pgtable_64.c
    @@ -1,5 +1,6 @@
    #include <asm/processor.h>
    #include "pgtable.h"
    +#include "../string.h"

    /*
    * __force_order is used by special_insns.h asm code to force instruction
    @@ -18,6 +19,9 @@ struct paging_config {
    unsigned long l5_required;
    };

    +/* Buffer to preserve trampoline memory */
    +static char trampoline_save[TRAMPOLINE_32BIT_SIZE];
    +
    /*
    * Trampoline address will be printed by extract_kernel() for debugging
    * purposes.
    @@ -69,5 +73,14 @@ struct paging_config paging_prepare(void)

    trampoline_32bit = (unsigned long *)paging_config.trampoline_start;

    + /* Preserve trampoline memory */
    + memcpy(trampoline_save, trampoline_32bit, TRAMPOLINE_32BIT_SIZE);
    +
    return paging_config;
    }
    +
    +void cleanup_trampoline(void)
    +{
    + /* Restore trampoline memory */
    + memcpy(trampoline_32bit, trampoline_save, TRAMPOLINE_32BIT_SIZE);
    +}
    --
    2.16.1
    \
     
     \ /
      Last update: 2018-02-27 16:45    [W:5.036 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site