summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeal H. Walfield <neal@gnu.org>2009-02-24 02:58:53 +0100
committerNeal H. Walfield <neal@gnu.org>2009-03-01 21:03:09 +0100
commit8a4c77a780e21a91485193d619078f4f47fb59b4 (patch)
tree42f1e398d4c3b596aab0204de465d0138ab9d4ac
parentb7808dc11f8433dfa4b706f2a819e11ce4f370c7 (diff)
When making a system call, pass the return address in rbp.
-rw-r--r--libviengoos/viengoos/x86_64/ipc.h12
-rw-r--r--viengoos/server.c23
-rw-r--r--viengoos/sysdeps/x86_64/syscall.c10
3 files changed, 35 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..a45933a 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,
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"