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");
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|