diff options
author | Neal H. Walfield <neal@gnu.org> | 2009-02-24 02:58:53 +0100 |
---|---|---|
committer | Neal H. Walfield <neal@gnu.org> | 2009-02-24 02:59:30 +0100 |
commit | 603de8d432d2e1f025e0f98b744440d95eb7a427 (patch) | |
tree | 6af6d306c24666eb9cbabc13e5d2ee7368e64289 | |
parent | fcfeeb860a6d3e756ba60ab4470f40472697bb0f (diff) |
When making a system call, pass the return address in rbp.
-rw-r--r-- | libviengoos/viengoos/x86_64/ipc.h | 12 | ||||
-rw-r--r-- | viengoos/server.c | 25 | ||||
-rw-r--r-- | viengoos/sysdeps/x86_64/syscall.c | 10 |
3 files changed, 37 insertions, 10 deletions
diff --git a/libviengoos/viengoos/x86_64/ipc.h b/libviengoos/viengoos/x86_64/ipc.h index 5ae6ee4..0eadeca 100644 --- a/libviengoos/viengoos/x86_64/ipc.h +++ b/libviengoos/viengoos/x86_64/ipc.h @@ -33,6 +33,9 @@ vg_ipc_syscall (uintptr_t flags, error_t err = 0; int dummy; +#ifndef NDEBUG + uint64_t ret = __builtin_return_address (0); +#endif __asm__ __volatile__ ("movq %[recv_inline_cap], %%r8\n\t" "movq %[send_activity], %%r9\n\t" @@ -43,13 +46,18 @@ vg_ipc_syscall (uintptr_t flags, "movq %[send_inline_cap], %%r15\n\t" "movq %[target_messenger], %%rax\n\t" "pushq %%rbp\n\t" + "mov %%rcx, %%rbp\n\t" "syscall\n\t" "popq %%rbp\n\t" - : "=a" (err), "=D"(dummy), "=S"(dummy), "=d"(dummy), "=b"(dummy) + : "=a" (err), "=D"(dummy), "=S"(dummy), "=d"(dummy), "=b"(dummy), + "=c"(dummy) : "D" (flags), "S" (recv_activity), "d" (recv_messenger), "b" (recv_buf), +#ifndef NDEBUG + "c" (ret), +#endif [recv_inline_cap] "m" (recv_inline_cap), [send_activity] "m" (send_activity), [target_messenger] "m" (target_messenger), @@ -58,7 +66,7 @@ vg_ipc_syscall (uintptr_t flags, [send_inline_word1] "m" (send_inline_word1), [send_inline_word2] "m" (send_inline_word2), [send_inline_cap] "m" (send_inline_cap) - : "rcx", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", + : "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "memory"); return err; diff --git a/viengoos/server.c b/viengoos/server.c index 33ac0d9..2c74018 100644 --- a/viengoos/server.c +++ b/viengoos/server.c @@ -87,21 +87,22 @@ static struct debug_command trace_buffer_debug = { \ if (level <= 4) \ trace_buffer_add (&rpc_trace, \ - "("OBJECT_NAME_FMT" %s %"PRIdPTR") " format, \ + "("OBJECT_NAME_FMT"@%"PRIxPTR \ + " %s %"PRIdPTR") " format, \ OBJECT_NAME_PRINTF ((struct vg_object *) thread), \ - METHOD, METHOD_ID, \ + user_ret, METHOD, METHOD_ID, \ ##args); \ - debug (level, "("OBJECT_NAME_FMT" %s:%"PRIdPTR") " format, \ + debug (level, "("OBJECT_NAME_FMT"@%"PRIxPTR" %s:%"PRIdPTR") " format, \ OBJECT_NAME_PRINTF ((struct vg_object *) thread), \ - METHOD, METHOD_ID, ##args); \ + user_ret, METHOD, METHOD_ID, ##args); \ } \ while (0) #else # define DEBUG(level, format, args...) \ - debug (level, "("OBJECT_NAME_FMT" %s:%"PRIdPTR") " format, \ - OBJECT_NAME_PRINTF ((struct vg_object *) thread), \ - METHOD, METHOD_ID, ##args) + debug (level, "("OBJECT_NAME_FMT"@%"PRIxPTR" %s:%"PRIdPTR") " format, \ + OBJECT_NAME_PRINTF ((struct vg_object *) thread), \ + user_ret, METHOD, METHOD_ID, ##args) #endif void @@ -115,6 +116,8 @@ server_bootstrap (void) bool page_fault_handler (struct thread *thread, uintptr_t fault, int access) { + uintptr_t user_ret = thread_ip (thread); + #define METHOD "pagefault" #define METHOD_ID ((uintptr_t) (0)) @@ -301,6 +304,12 @@ page_fault_handler (struct thread *thread, uintptr_t fault, int access) return true; } +#ifndef NDEBUG +extern uintptr_t user_ret; +#else +# define user_ret ((uintptr_t) 0) +#endif + void dispatcher (uintptr_t flags, vg_addr_t recv_activity, vg_addr_t recv_messenger, @@ -1450,6 +1459,8 @@ dispatcher (uintptr_t flags, folio_object_content_set (folio, objects_folio_offset (target), false); + memory_object_destroy (principal, target); + memory_frame_free ((uintptr_t) target); vg_object_discard_reply (activity, reply); break; diff --git a/viengoos/sysdeps/x86_64/syscall.c b/viengoos/sysdeps/x86_64/syscall.c index 6481538..e43ac19 100644 --- a/viengoos/sysdeps/x86_64/syscall.c +++ b/viengoos/sysdeps/x86_64/syscall.c @@ -42,16 +42,24 @@ returner (void) panic ("Failed to schedule something!!!"); } +#ifndef NDEBUG +uintptr_t user_ret; +#endif + static void __attribute__ ((used)) dummy (void) { #define S_(x) #x #define S(x) S_(x) - /* On entry, RCX contains the old RIP. */ + /* On entry, RCX contains the user's RIP and R11 the user's flags. */ asm volatile (".global syscall_entry\n\t" "syscall_entry:\n\t" +#ifndef NDEBUG + "mov %%rbp, user_ret\n\t" +#endif + /* Save the user's RSP in RBP and switch to the kernel stack. */ "mov %%rsp, %%rbp\n\t" "leaq stack_end, %%rsp\n\t" |