Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; .asm
- INCLUDE ksamd64.inc
- ; Note: MASM sucks
- ; branch hints
- nottaken textequ <byte 2Eh>
- taken textequ <byte 3Eh>
- _text SEGMENT PARA 'code'
- EXTERN ScheduleTask:PROC
- EXTERN current_task:ptr
- __readfsqword PROC
- mov rax,gs:[rcx]
- ret
- __readfsqword ENDP
- __writefsqword PROC
- mov gs:[rcx],rdx
- ret
- __writefsqword ENDP
- SwitchToNextTask PROC
- ; Save context
- push rbx
- push rbp
- push rsi
- push rdi
- push r12
- push r13
- push r14
- push r15
- ; Pass old stack pointer as register argument
- mov rcx,rsp
- sub rsp,32+8
- call ScheduleTask
- ; Return value is new stack to resume
- mov rsp,rax
- ; Restore context
- pop r15
- pop r14
- pop r13
- pop r12
- pop rdi
- pop rsi
- pop rbp
- pop rbx
- pop rax
- jmp rax
- SwitchToNextTask ENDP
- PUBLIC SwitchToTask
- SwitchToTask PROC
- push rbx
- push rbp
- push rsi
- push rdi
- push r12
- push r13
- push r14
- push r15
- ; Save stack pointer of outgoing task
- mov [rdx],rsp
- ; Switch to new stack
- mov rsp,rcx
- pop r15
- pop r14
- pop r13
- pop r12
- pop rdi
- pop rsi
- pop rbp
- pop rbx
- pop rax
- jmp rax
- SwitchToTask ENDP
- ; Stub loads register arguments from initial saved registers
- PUBLIC StartNewTask
- StartNewTask PROC
- mov rcx,r12
- mov rdx,r13
- mov r8,r14
- mov r9,r15
- jmp rbp
- StartNewTask ENDP
- _text ENDS
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement