From 7383da296af3719a5228e47213fe83ff6cf46155 Mon Sep 17 00:00:00 2001 From: Stefan Berger Date: Tue, 9 Jun 2020 14:23:26 +0000 Subject: [PATCH] [Pal/{Linux,Linux-SGX}] Implement pal_ucontext_get_ip() --- Pal/include/arch/x86_64/Linux/ucontext.h | 4 ++++ Pal/src/host/Linux-SGX/sgx_exception.c | 4 ++-- Pal/src/host/Linux/db_exception.c | 5 ++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Pal/include/arch/x86_64/Linux/ucontext.h b/Pal/include/arch/x86_64/Linux/ucontext.h index 8fa972f2..8c378f55 100644 --- a/Pal/include/arch/x86_64/Linux/ucontext.h +++ b/Pal/include/arch/x86_64/Linux/ucontext.h @@ -152,6 +152,10 @@ static inline void pal_context_to_ucontext(ucontext_t* uc, PAL_CONTEXT* context) uc->uc_mcontext.fpregs = (struct _libc_fpstate*)context->fpregs; } +static inline uint64_t pal_ucontext_get_ip(ucontext_t* uc) { + return uc->uc_mcontext.gregs[REG_RIP]; +} + #else /* __WORDSIZE == 32 */ /* Type for general register. */ diff --git a/Pal/src/host/Linux-SGX/sgx_exception.c b/Pal/src/host/Linux-SGX/sgx_exception.c index 09349ce4..d709b62c 100644 --- a/Pal/src/host/Linux-SGX/sgx_exception.c +++ b/Pal/src/host/Linux-SGX/sgx_exception.c @@ -127,7 +127,7 @@ static void handle_sync_signal(int signum, siginfo_t* info, struct ucontext* uc) for (size_t i = 0; i < g_rpc_queue->rpc_threads_cnt; i++) INLINE_SYSCALL(tkill, 2, g_rpc_queue->rpc_threads[i], SIGUSR2); - unsigned long rip = uc->uc_mcontext.gregs[REG_RIP]; + unsigned long rip = pal_ucontext_get_ip(uc); if (rip != (unsigned long)async_exit_pointer) { /* exception happened in untrusted PAL code (during syscall handling): fatal in Graphene */ @@ -162,7 +162,7 @@ static void handle_async_signal(int signum, siginfo_t* info, struct ucontext* uc for (size_t i = 0; i < g_rpc_queue->rpc_threads_cnt; i++) INLINE_SYSCALL(tkill, 2, g_rpc_queue->rpc_threads[i], SIGUSR2); - unsigned long rip = uc->uc_mcontext.gregs[REG_RIP]; + unsigned long rip = pal_ucontext_get_ip(uc); if (rip != (unsigned long)async_exit_pointer) { /* signal arrived while in untrusted PAL code (during syscall handling), emulate as if diff --git a/Pal/src/host/Linux/db_exception.c b/Pal/src/host/Linux/db_exception.c index ec2f4eb1..33b6209d 100644 --- a/Pal/src/host/Linux/db_exception.c +++ b/Pal/src/host/Linux/db_exception.c @@ -141,7 +141,7 @@ static void handle_sync_signal(int signum, siginfo_t* info, struct ucontext* uc) int event = get_pal_event(signum); assert(event > 0); - uintptr_t rip = uc->uc_mcontext.gregs[REG_RIP]; + uintptr_t rip = pal_ucontext_get_ip(uc); if (!ADDR_IN_PAL(rip)) { /* exception happened in application or LibOS code, normal benign case */ perform_signal_handling(event, info, uc); @@ -174,8 +174,7 @@ static void handle_async_signal(int signum, siginfo_t* info, struct ucontext* uc int event = get_pal_event(signum); assert(event > 0); - uintptr_t rip = uc->uc_mcontext.gregs[REG_RIP]; - + uintptr_t rip = pal_ucontext_get_ip(uc); if (!ADDR_IN_PAL(rip)) { /* signal arrived while in application or LibOS code, normal benign case */ perform_signal_handling(event, info, uc);