Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/amd64/src/asm.S

    r1a5eca4 r3b0f1b9a  
    3131#include <arch/mm/page.h>
    3232#include <arch/istate_struct.h>
    33 #include <arch/kseg_struct.h>
    34 #include <arch/cpu.h>
    3533
    3634.text
     
    180178                subq $(ISTATE_SOFT_SIZE + 8), %rsp
    181179        .endif
    182 
     180       
    183181        /*
    184182         * Save the general purpose registers.
     
    201199
    202200        /*
    203          * Is this trap from the kernel?
    204          */
    205         cmpq $(GDT_SELECTOR(KTEXT_DES)), ISTATE_OFFSET_CS(%rsp)
    206         jz 0f
    207 
    208         /*
    209          * Switch to kernel FS base.
    210          */
    211         swapgs
    212         movl $AMD_MSR_FS, %ecx
    213         movl %gs:KSEG_OFFSET_FSBASE, %eax
    214         movl %gs:KSEG_OFFSET_FSBASE+4, %edx
    215         wrmsr
    216         swapgs
    217 
    218         /*
    219201         * Imitate a regular stack frame linkage.
    220202         * Stop stack traces here if we came from userspace.
    221203         */
    222 0:      movl $0x0, %edx
     204        xorl %edx, %edx
     205        cmpq $(GDT_SELECTOR(KTEXT_DES)), ISTATE_OFFSET_CS(%rsp)
    223206        cmovnzq %rdx, %rbp
    224207
     
    289272        swapgs
    290273       
    291         movq %rsp, %gs:KSEG_OFFSET_USTACK_RSP  /* save this thread's user RSP */
    292         movq %gs:KSEG_OFFSET_KSTACK_RSP, %rsp  /* set this thread's kernel RSP */
    293 
     274        /*
     275         * %gs:0 Scratch space for this thread's user RSP
     276         * %gs:8 Address to be used as this thread's kernel RSP
     277         */
     278       
     279        movq %rsp, %gs:0  /* save this thread's user RSP */
     280        movq %gs:8, %rsp  /* set this thread's kernel RSP */
     281       
    294282        /*
    295283         * Note that the space needed for the imitated istate structure has been
     
    320308
    321309        /*
    322          * Switch to kernel FS base.
    323          */
    324         movl $AMD_MSR_FS, %ecx
    325         movl %gs:KSEG_OFFSET_FSBASE, %eax
    326         movl %gs:KSEG_OFFSET_FSBASE+4, %edx
    327         wrmsr
    328         movq ISTATE_OFFSET_RDX(%rsp), %rdx      /* restore 3rd argument */
    329 
    330         /*
    331310         * Save the return address and the userspace stack on locations that
    332311         * would normally be taken by them.
    333312         */
    334         movq %gs:KSEG_OFFSET_USTACK_RSP, %rax
     313        movq %gs:0, %rax
    335314        movq %rax, ISTATE_OFFSET_RSP(%rsp)
    336315        movq %rcx, ISTATE_OFFSET_RIP(%rsp)
     
    346325        swapgs
    347326        sti
    348 
     327       
    349328        /* Copy the 4th argument where it is expected  */
    350329        movq %r10, %rcx
Note: See TracChangeset for help on using the changeset viewer.