Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/CtxSwitch-x86_64.S

    r63364d8 r212c2187  
    3939#define SP_OFFSET       ( 0 * PTR_BYTE )
    4040#define FP_OFFSET       ( 1 * PTR_BYTE )
     41#define PC_OFFSET       ( 2 * PTR_BYTE )
    4142
    42 //-----------------------------------------------------------------------------
    43 // Regular context switch routine which enables switching from one context to anouther
    44         .text
     43.text
    4544        .align 2
    46         .globl CtxSwitch
    47         .type  CtxSwitch, @function
     45.globl  CtxSwitch
    4846CtxSwitch:
     47
     48        // Save floating & SSE control words on the stack.
     49
     50        subq   $8,%rsp
     51        stmxcsr 0(%rsp)         // 4 bytes
     52        fnstcw  4(%rsp)         // 2 bytes
    4953
    5054        // Save volatile registers on the stack.
     
    7478        popq %r15
    7579
     80        // Load floating & SSE control words from the stack.
     81
     82        fldcw   4(%rsp)
     83        ldmxcsr 0(%rsp)
     84        addq   $8,%rsp
     85
    7686        // Return to thread.
    7787
    7888        ret
    79         .size  CtxSwitch, .-CtxSwitch
    8089
    81 //-----------------------------------------------------------------------------
    82 // Stub used to create new stacks which are ready to be context switched to
    83         .text
     90//.text
     91//      .align 2
     92//.globl        CtxStore
     93//CtxStore:
     94//      // Save floating & SSE control words on the stack.
     95//
     96//      subq   $8,%rsp
     97//      stmxcsr 0(%rsp)         // 4 bytes
     98//      fnstcw  4(%rsp)         // 2 bytes
     99//
     100//      // Save volatile registers on the stack.
     101//
     102//      pushq %r15
     103//      pushq %r14
     104//      pushq %r13
     105//      pushq %r12
     106//      pushq %rbx
     107//
     108//      // Save old context in the "from" area.
     109//
     110//      movq %rsp,SP_OFFSET(%rdi)
     111//      movq %rbp,FP_OFFSET(%rdi)
     112//
     113//      // Return to thread
     114//
     115//      ret
     116//
     117//.text
     118//      .align 2
     119//.globl        CtxRet
     120//CtxRet:
     121//      // Load new context from the "to" area.
     122//
     123//      movq SP_OFFSET(%rdi),%rsp
     124//      movq FP_OFFSET(%rdi),%rbp
     125//
     126//      // Load volatile registers from the stack.
     127//
     128//      popq %rbx
     129//      popq %r12
     130//      popq %r13
     131//      popq %r14
     132//      popq %r15
     133//
     134//      // Load floating & SSE control words from the stack.
     135//
     136//      fldcw   4(%rsp)
     137//      ldmxcsr 0(%rsp)
     138//      addq   $8,%rsp
     139//
     140//      // Return to thread.
     141//
     142//      ret
     143
     144
     145.text
    84146        .align 2
    85         .globl CtxInvokeStub
    86         .type    CtxInvokeStub, @function
     147.globl  CtxInvokeStub
    87148CtxInvokeStub:
    88149        movq %rbx, %rdi
    89150        jmp *%r12
    90         .size  CtxInvokeStub, .-CtxInvokeStub
    91151
    92152// Local Variables: //
Note: See TracChangeset for help on using the changeset viewer.