diff --git a/arch/x86/kernel/include/ihk/context.h b/arch/x86/kernel/include/ihk/context.h index 2aebc038..fe09451d 100644 --- a/arch/x86/kernel/include/ihk/context.h +++ b/arch/x86/kernel/include/ihk/context.h @@ -49,6 +49,7 @@ typedef struct x86_user_context ihk_mc_user_context_t; #define ihk_mc_syscall_arg5(uc) (uc)->gpr.r9 #define ihk_mc_syscall_ret(uc) (uc)->gpr.rax +#define ihk_mc_syscall_number(uc) (uc)->gpr.orig_rax #define ihk_mc_syscall_pc(uc) (uc)->gpr.rip #define ihk_mc_syscall_sp(uc) (uc)->gpr.rsp diff --git a/arch/x86/kernel/include/registers.h b/arch/x86/kernel/include/registers.h index 54912cbf..ba09b259 100644 --- a/arch/x86/kernel/include/registers.h +++ b/arch/x86/kernel/include/registers.h @@ -189,9 +189,30 @@ struct tss64 { } __attribute__((packed)); struct x86_basic_regs { - unsigned long r15, r14, r13, r12, rbp, rbx, r11, r10; - unsigned long r9, r8, rax, rcx, rdx, rsi, rdi, error; - unsigned long rip, cs, rflags, rsp, ss; + unsigned long r15; + unsigned long r14; + unsigned long r13; + unsigned long r12; + unsigned long rbp; + unsigned long rbx; + unsigned long r11; + unsigned long r10; + unsigned long r9; + unsigned long r8; + unsigned long rax; + unsigned long rcx; + unsigned long rdx; + unsigned long rsi; + unsigned long rdi; + union { + unsigned long orig_rax; /* syscall */ + unsigned long error; /* interrupts */ + }; + unsigned long rip; + unsigned long cs; + unsigned long rflags; + unsigned long rsp; + unsigned long ss; }; struct x86_sregs { diff --git a/kernel/syscall.c b/kernel/syscall.c index 6ef6fc52..c6d9646f 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -9928,7 +9928,9 @@ long syscall(int num, ihk_mc_user_context_t *ctx) cpu_enable_interrupt(); if (cpu_local_var(current)->proc->ptrace) { + ihk_mc_syscall_ret(ctx) = -ENOSYS; ptrace_syscall_enter(cpu_local_var(current)); + num = ihk_mc_syscall_number(ctx); } #if 0