tinyrpc/includes/coroutine/coctx.h

38 lines
1.1 KiB
C
Raw Permalink Normal View History

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