You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
4.1 KiB
135 lines
4.1 KiB
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 and fiber local storage data address.
|
|
;
|
|
|
|
mov r8, TeStackLimit[rdx] ; save current stack limit
|
|
mov FbStackLimit[rax], r8 ;
|
|
mov r8, TeFlsData[rdx] ; save fiber local storage data address
|
|
mov FbFlsData[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 ;
|
|
stmxcsr CxMxCsr[r8] ; save floating control and status
|
|
mov r9, [rsp] ; save return address
|
|
mov CxRip[r8], r9 ;
|
|
mov CxRsp[r8], rsp ; save stack pointer
|
|
|
|
;
|
|
; Restore the new fiber stack base, stack limit, and fiber local storage data
|
|
; address.
|
|
;
|
|
|
|
mov r8, FbStackBase[rcx] ; restore stack base
|
|
mov TeStackBase[rdx], r8 ;
|
|
mov r8, FbStackLimit[rcx] ; restore stack limit
|
|
mov TeStackLimit[rdx], r8 ;
|
|
mov r8, FbFlsData[rcx] ; restore fiber local storage data address
|
|
mov TeFlsData[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] ;
|
|
ldmxcsr CxMxCsr[r8] ; restore floating control and status
|
|
mov rsp, CxRsp[r8] ; restore stack pointer
|
|
ret ;
|
|
|
|
LEAF_END SwitchToFiber, _TEXT$00
|
|
|
|
end
|