33 lines
1.1 KiB
C++
33 lines
1.1 KiB
C++
#pragma once
|
||
|
||
namespace tinyrpc {
|
||
enum class reg : unsigned int { // https://wiki.osdev.org/System_V_ABI
|
||
kRBP = 6, // 栈底指针
|
||
kRDI = 7, // rdi,调用函数时的第一个参数
|
||
kRSI = 8, // rsi, 调用函数时的第二个参数 这两个是 根据调用约定确定的
|
||
kRETAddr = 9, // 下一个要执行的命令地址,它将被分配给 rip
|
||
kRSP = 13, // 堆栈顶部指针
|
||
/*
|
||
|
||
High memory
|
||
-----------------
|
||
| 调用者的 rbp | <- 被调用函数栈帧的起点
|
||
-----------------
|
||
| 返回地址 (rip) | <- 存储调用函数后的下一条指令地址
|
||
-----------------
|
||
| 局部变量 |
|
||
-----------------
|
||
Low memory
|
||
*/
|
||
};
|
||
|
||
struct coctx { // Coroutine Context
|
||
void* regs[14]{}; // 初始化为 0
|
||
};
|
||
|
||
// 将当前寄存器的状态保存到第一个上下文中,然后从第二个上下文中取出寄存器的状态并将其分配给寄存器。
|
||
extern "C" void coctx_swap(coctx *, coctx *) asm("coctx_swap");
|
||
|
||
|
||
|
||
} |