lkml.org 
[lkml]   [2020]   [Apr]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 33/75] x86/head/64: Load segment registers earlier
    Date
    From: Joerg Roedel <jroedel@suse.de>

    Make sure segments are properly set up before setting up an IDT and
    doing anything that might cause a #VC exception. This is later needed
    for early exception handling.

    Signed-off-by: Joerg Roedel <jroedel@suse.de>
    ---
    arch/x86/kernel/head_64.S | 52 +++++++++++++++++++--------------------
    1 file changed, 26 insertions(+), 26 deletions(-)

    diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
    index 20a9df062088..b5ff38bb32f2 100644
    --- a/arch/x86/kernel/head_64.S
    +++ b/arch/x86/kernel/head_64.S
    @@ -168,6 +168,32 @@ SYM_CODE_START(secondary_startup_64)
    movq %rax, boot_gdt_base(%rip)
    lgdt boot_gdt_descr(%rip)

    + /* set up data segments */
    + xorl %eax,%eax
    + movl %eax,%ds
    + movl %eax,%ss
    + movl %eax,%es
    +
    + /*
    + * We don't really need to load %fs or %gs, but load them anyway
    + * to kill any stale realmode selectors. This allows execution
    + * under VT hardware.
    + */
    + movl %eax,%fs
    + movl %eax,%gs
    +
    + /* Set up %gs.
    + *
    + * The base of %gs always points to fixed_percpu_data. If the
    + * stack protector canary is enabled, it is located at %gs:40.
    + * Note that, on SMP, the boot cpu uses init data section until
    + * the per cpu areas are set up.
    + */
    + movl $MSR_GS_BASE,%ecx
    + movl initial_gs(%rip),%eax
    + movl initial_gs+4(%rip),%edx
    + wrmsr
    +
    /* Check if nx is implemented */
    movl $0x80000001, %eax
    cpuid
    @@ -203,32 +229,6 @@ SYM_CODE_START(secondary_startup_64)
    */
    lgdt early_gdt_descr(%rip)

    - /* set up data segments */
    - xorl %eax,%eax
    - movl %eax,%ds
    - movl %eax,%ss
    - movl %eax,%es
    -
    - /*
    - * We don't really need to load %fs or %gs, but load them anyway
    - * to kill any stale realmode selectors. This allows execution
    - * under VT hardware.
    - */
    - movl %eax,%fs
    - movl %eax,%gs
    -
    - /* Set up %gs.
    - *
    - * The base of %gs always points to fixed_percpu_data. If the
    - * stack protector canary is enabled, it is located at %gs:40.
    - * Note that, on SMP, the boot cpu uses init data section until
    - * the per cpu areas are set up.
    - */
    - movl $MSR_GS_BASE,%ecx
    - movl initial_gs(%rip),%eax
    - movl initial_gs+4(%rip),%edx
    - wrmsr
    -
    /* rsi is pointer to real mode structure with interesting info.
    pass it to C */
    movq %rsi, %rdi
    --
    2.17.1
    \
     
     \ /
      Last update: 2020-04-28 17:23    [W:4.119 / U:0.268 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site