129 lines
3.5 KiB
NASM
129 lines
3.5 KiB
NASM
|
title "Fiber Switch"
|
||
|
;++
|
||
|
;
|
||
|
; Copyright (c) 2000 Microsoft Corporation
|
||
|
;
|
||
|
; Module Name:
|
||
|
;
|
||
|
; fiber.asm
|
||
|
;
|
||
|
; Abstract:
|
||
|
;
|
||
|
; This module implements the platform specific fiber swtich code.
|
||
|
;
|
||
|
; Author:
|
||
|
;
|
||
|
; David N. Cutler (davec) 7-Jul-2000
|
||
|
;
|
||
|
;--
|
||
|
|
||
|
include ksamd64.inc
|
||
|
|
||
|
;++
|
||
|
;
|
||
|
; VOID
|
||
|
; SwitchToFiber(
|
||
|
; PFIBER NewFiber
|
||
|
; )
|
||
|
;
|
||
|
; Routine Description:
|
||
|
;
|
||
|
; This function saves the state of the current fiber and switches to the
|
||
|
; specified fiber.
|
||
|
;
|
||
|
; Arguments:
|
||
|
;
|
||
|
; NewFiber (rcx) - Supplies the address of the new fiber.
|
||
|
;
|
||
|
; Return Value:
|
||
|
;
|
||
|
; None
|
||
|
;
|
||
|
;--
|
||
|
|
||
|
LEAF_ENTRY SwitchToFiber, _TEXT$00
|
||
|
|
||
|
mov rdx, gs:[TeSelf] ; get TEB address
|
||
|
mov rax, TeFiberData[rdx] ; get current fiber address
|
||
|
|
||
|
;
|
||
|
; Set new deallocation stack and fiber data in TEB.
|
||
|
;
|
||
|
|
||
|
mov r8, FbDeallocationStack[rcx] ; set deallocation stack address
|
||
|
mov TeDeallocationStack[rdx], r8 ;
|
||
|
mov TeFiberData[rdx], rcx ; set new fiber address
|
||
|
|
||
|
;
|
||
|
; Save stack limit.
|
||
|
;
|
||
|
|
||
|
mov r8, TeStackLimit[rdx] ; save current stack limit
|
||
|
mov FbStackLimit[rax], r8 ;
|
||
|
|
||
|
;
|
||
|
; Save the nonvolitile state of the current fiber.
|
||
|
;
|
||
|
|
||
|
lea r8, FbFiberContext[rax] ; get fiber context record address
|
||
|
mov CxRbx[r8], rbx ; save nonvolatile integer registers
|
||
|
mov CxRbp[r8], rbp ;
|
||
|
mov CxRsi[r8], rsi ;
|
||
|
mov CxRdi[r8], rdi ;
|
||
|
mov CxR12[r8], r12 ;
|
||
|
mov CxR13[r8], r13 ;
|
||
|
mov CxR14[r8], r14 ;
|
||
|
mov CxR15[r8], r15 ;
|
||
|
movq CxXmm6[r8], xmm6 ; save nonvolatile floating registers
|
||
|
movq CxXmm7[r8], xmm7 ;
|
||
|
movq CxXmm8[r8], xmm8 ;
|
||
|
movq CxXmm9[r8], xmm9 ;
|
||
|
movq CxXmm10[r8], xmm10 ;
|
||
|
movq CxXmm11[r8], xmm11 ;
|
||
|
movq CxXmm12[r8], xmm12 ;
|
||
|
movq CxXmm13[r8], xmm13 ;
|
||
|
movq CxXmm14[r8], xmm14 ;
|
||
|
movq CxXmm15[r8], xmm15 ;
|
||
|
mov r9, [rsp] ; save return address
|
||
|
mov CxRip[r8], r9 ;
|
||
|
mov CxRsp[r8], rsp ; save stack pointer
|
||
|
|
||
|
;
|
||
|
; Restore the new fiber stack base and stack limit.
|
||
|
;
|
||
|
|
||
|
mov r8, FbStackBase[rcx] ; restore stack base
|
||
|
mov TeStackBase[rdx], r8 ;
|
||
|
mov r8, FbStackLimit[rcx] ; restore stack limit
|
||
|
mov TeStackLimit[rdx], r8 ;
|
||
|
|
||
|
;
|
||
|
; Restore nonvolitile state of the new fiber.
|
||
|
;
|
||
|
|
||
|
lea r8, FbFiberContext[rcx] ; get fiber context address
|
||
|
mov rbx, CxRbx[r8] ; restore nonvolatile integer registers
|
||
|
mov rbp, CxRbp[r8] ;
|
||
|
mov rsi, CxRsi[r8] ;
|
||
|
mov rdi, CxRdi[r8] ;
|
||
|
mov r12, CxR12[r8] ;
|
||
|
mov r13, CxR13[r8] ;
|
||
|
mov r14, CxR14[r8] ;
|
||
|
mov r15, CxR15[r8] ;
|
||
|
movq xmm6, CxXmm6[r8] ; restore nonvolatile floating registers
|
||
|
movq xmm7, CxXmm7[r8] ;
|
||
|
movq xmm8, CxXmm8[r8] ;
|
||
|
movq xmm9, CxXmm9[r8] ;
|
||
|
movq xmm10, CxXmm10[r8] ;
|
||
|
movq xmm11, CxXmm11[r8] ;
|
||
|
movq xmm12, CxXmm12[r8] ;
|
||
|
movq xmm13, CxXmm13[r8] ;
|
||
|
movq xmm14, CxXmm14[r8] ;
|
||
|
movq xmm15, CxXmm15[r8] ;
|
||
|
mov rsp, CxRsp[r8] ; restore stack pointer
|
||
|
ret ;
|
||
|
|
||
|
LEAF_END SwitchToFiber, _TEXT$00
|
||
|
|
||
|
end
|