Advertisement
Guest User

Untitled

a guest
Feb 5th, 2013
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. ; .asm
  3.  
  4. INCLUDE ksamd64.inc
  5.  
  6. ; Note: MASM sucks
  7.  
  8. ; branch hints
  9. nottaken    textequ <byte 2Eh>
  10. taken       textequ <byte 3Eh>
  11.  
  12. _text SEGMENT PARA 'code'
  13.  
  14. EXTERN ScheduleTask:PROC
  15. EXTERN current_task:ptr
  16.  
  17. __readfsqword PROC
  18.     mov rax,gs:[rcx]
  19.     ret
  20. __readfsqword ENDP
  21.  
  22. __writefsqword PROC
  23.     mov gs:[rcx],rdx
  24.     ret
  25. __writefsqword ENDP
  26.  
  27. SwitchToNextTask PROC
  28.     ; Save context
  29.     push rbx
  30.     push rbp
  31.     push rsi
  32.     push rdi
  33.     push r12
  34.     push r13
  35.     push r14
  36.     push r15
  37.  
  38.     ; Pass old stack pointer as register argument
  39.     mov rcx,rsp
  40.  
  41.     sub rsp,32+8
  42.     call ScheduleTask
  43.  
  44.     ; Return value is new stack to resume
  45.     mov rsp,rax
  46.  
  47.     ; Restore context
  48.     pop r15
  49.     pop r14
  50.     pop r13
  51.     pop r12
  52.     pop rdi
  53.     pop rsi
  54.     pop rbp
  55.     pop rbx
  56.     pop rax
  57.     jmp rax
  58. SwitchToNextTask ENDP
  59.  
  60. PUBLIC SwitchToTask
  61. SwitchToTask PROC
  62.     push rbx
  63.     push rbp
  64.     push rsi
  65.     push rdi
  66.     push r12
  67.     push r13
  68.     push r14
  69.     push r15
  70.  
  71.     ; Save stack pointer of outgoing task
  72.     mov [rdx],rsp
  73.  
  74.     ; Switch to new stack
  75.     mov rsp,rcx
  76.  
  77.     pop r15
  78.     pop r14
  79.     pop r13
  80.     pop r12
  81.     pop rdi
  82.     pop rsi
  83.     pop rbp
  84.     pop rbx
  85.     pop rax
  86.     jmp rax
  87. SwitchToTask ENDP
  88.  
  89. ; Stub loads register arguments from initial saved registers
  90. PUBLIC StartNewTask
  91. StartNewTask PROC
  92.     mov rcx,r12
  93.     mov rdx,r13
  94.     mov r8,r14
  95.     mov r9,r15
  96.     jmp rbp
  97. StartNewTask ENDP
  98.  
  99. _text ENDS
  100.  
  101. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement