Index: src/trusted/service_runtime/posix/nacl_signal.c |
diff --git a/src/trusted/service_runtime/posix/nacl_signal.c b/src/trusted/service_runtime/posix/nacl_signal.c |
index 4ce545deaf9afa0778a68d7593158ace3708b712..8bced2e0059ae0c42fea4aa0c79a29bfad0003de 100644 |
--- a/src/trusted/service_runtime/posix/nacl_signal.c |
+++ b/src/trusted/service_runtime/posix/nacl_signal.c |
@@ -223,6 +223,7 @@ static int DispatchToUntrustedHandler(struct NaClAppThread *natp, |
new_stack_ptr -= |
sizeof(struct NaClExceptionFrame) - NACL_STACK_PAD_BELOW_ALIGN; |
new_stack_ptr = new_stack_ptr & ~NACL_STACK_ALIGN_MASK; |
+ new_stack_ptr -= NACL_STACK_ARGS_SIZE; |
new_stack_ptr -= NACL_STACK_PAD_BELOW_ALIGN; |
frame_addr = NaClUserToSysAddrRange(nap, new_stack_ptr, |
sizeof(struct NaClExceptionFrame)); |
@@ -272,6 +273,11 @@ static int DispatchToUntrustedHandler(struct NaClAppThread *natp, |
regs->a0 = context_user_addr; |
regs->prog_ctr = NaClUserToSys(nap, nap->exception_handler); |
regs->stack_ptr = NaClUserToSys(nap, new_stack_ptr); |
+ /* |
+ * Per Linux/MIPS convention, PIC functions assume that t9 holds |
+ * the function's address on entry. |
+ */ |
+ regs->t9 = regs->prog_ctr; |
#else |
# error Unsupported architecture |
#endif |