我正在尝试为系统调用
sigreturn
设置堆栈框架。系统调用读取堆栈顶部的信息(它是一个 ucontext_t 结构)并自动设置信号掩码并设置rip
。但是我不擅长asm
,这是我的代码:
#define _GNU_SOURCE
#include <pthread.h>
#include <ucontext.h>
#include <signal.h>
#include <unistd.h>
#include <time.h>
#include <malloc.h>
void sigreturn_to(ucontext_t *ctx) {
register void *rsp __asm__("rsp");
rsp -= sizeof(ucontext_t);
*(ucontext_t*)rsp = *ctx;
__asm__ __volatile__(
"mov $15, %%rax\n\t"
"syscall"
:
:
:
);
}
void come_here() {
while (1) {
printf("123\n");
}
}
int main() {
ucontext_t ctx;
getcontext(&ctx);
void *main_stack = malloc(40960);
sigemptyset(&ctx.uc_sigmask);
ctx.uc_link = NULL;
ctx.uc_stack.ss_sp = main_stack;
ctx.uc_stack.ss_size = 40960;
makecontext(&ctx, come_here, 0);
sigreturn_to(&ctx);
}
我的目标是将信号掩码和
jmp
原子设置为一个函数(siglongjmp和setcontext只是调用sigprocmask
并设置rip
,它们不是原子的)。所以我想用 sigreturn 系统调用来实现这个。
程序跳转到
come_here
函数失败,我想是我设置了错误的栈帧的原因。你能告诉我如何正确设置栈帧吗?