lkml.org 
[lkml]   [2016]   [Aug]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 04/57] x86/asm/head: use a common function for starting CPUs
    Date
    There are two different pieces of code for starting a CPU: start_cpu0()
    and the end of secondary_startup_64(). They're identical except for the
    stack setup. Combine the common parts into a shared start_cpu()
    function.

    Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
    ---
    arch/x86/kernel/head_64.S | 22 +++++++++++-----------
    1 file changed, 11 insertions(+), 11 deletions(-)

    diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
    index e048142..a212310 100644
    --- a/arch/x86/kernel/head_64.S
    +++ b/arch/x86/kernel/head_64.S
    @@ -264,13 +264,17 @@ ENTRY(secondary_startup_64)
    movl $MSR_GS_BASE,%ecx
    movl initial_gs(%rip),%eax
    movl initial_gs+4(%rip),%edx
    - wrmsr
    + wrmsr

    /* rsi is pointer to real mode structure with interesting info.
    pass it to C */
    movq %rsi, %rdi
    -
    - /* Finally jump to run C code and to be on real kernel address
    + jmp start_cpu
    +ENDPROC(secondary_startup_64)
    +
    +ENTRY(start_cpu)
    + /*
    + * Jump to run C code and to be on a real kernel address.
    * Since we are running on identity-mapped space we have to jump
    * to the full 64bit address, this is only possible as indirect
    * jump. In addition we need to ensure %cs is set so we make this
    @@ -299,7 +303,7 @@ ENTRY(secondary_startup_64)
    pushq $__KERNEL_CS # set correct cs
    pushq %rax # target address in negative space
    lretq
    -ENDPROC(secondary_startup_64)
    +ENDPROC(start_cpu)

    #include "verify_cpu.S"

    @@ -307,15 +311,11 @@ ENDPROC(secondary_startup_64)
    /*
    * Boot CPU0 entry point. It's called from play_dead(). Everything has been set
    * up already except stack. We just set up stack here. Then call
    - * start_secondary().
    + * start_secondary() via start_cpu().
    */
    ENTRY(start_cpu0)
    - movq initial_stack(%rip),%rsp
    - movq initial_code(%rip),%rax
    - pushq $0 # fake return address to stop unwinder
    - pushq $__KERNEL_CS # set correct cs
    - pushq %rax # target address in negative space
    - lretq
    + movq initial_stack(%rip), %rsp
    + jmp start_cpu
    ENDPROC(start_cpu0)
    #endif

    --
    2.7.4
    \
     
     \ /
      Last update: 2016-09-17 09:57    [W:4.230 / U:0.388 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site