push r14\r
push r15\r
\r
- mov rax, cr0\r
- push rax\r
-\r
- mov rax, cr4\r
- push rax\r
-\r
; rsi contains MyInfo pointer\r
mov rsi, rcx\r
\r
; rdi contains OthersInfo pointer\r
mov rdi, rdx\r
\r
- ;Store EFLAGS, GDTR and IDTR regiter to stack\r
pushfq\r
- sgdt [rsi + CPU_EXCHANGE_ROLE_INFO.Gdtr]\r
- sidt [rsi + CPU_EXCHANGE_ROLE_INFO.Idtr]\r
\r
; Store the its StackPointer\r
mov [rsi + CPU_EXCHANGE_ROLE_INFO.StackPointer], rsp\r
jmp WaitForOtherStored\r
\r
OtherStored:\r
- ; Since another CPU already stored its state, load them\r
- ; load GDTR value\r
- lgdt [rdi + CPU_EXCHANGE_ROLE_INFO.Gdtr]\r
-\r
- ; load IDTR value\r
- lidt [rdi + CPU_EXCHANGE_ROLE_INFO.Idtr]\r
\r
; load its future StackPointer\r
mov rsp, [rdi + CPU_EXCHANGE_ROLE_INFO.StackPointer]\r
; since the other CPU already get the data it want, leave this procedure\r
popfq\r
\r
- pop rax\r
- mov cr4, rax\r
-\r
- pop rax\r
- mov cr0, rax\r
-\r
pop r15\r
pop r14\r
pop r13\r