OLD | NEW |
(Empty) | |
| 1 /* |
| 2 * Copyright 2012 The Native Client Authors. All rights reserved. |
| 3 * Use of this source code is governed by a BSD-style license that can |
| 4 * be found in the LICENSE file. |
| 5 */ |
| 6 |
| 7 #include <signal.h> |
| 8 #include <sys/ucontext.h> |
| 9 |
| 10 #include "native_client/src/trusted/service_runtime/nacl_signal.h" |
| 11 |
| 12 /* |
| 13 * Fill a signal context structure from the raw platform dependent |
| 14 * signal information. |
| 15 */ |
| 16 void NaClSignalContextFromHandler(struct NaClSignalContext *sigCtx, |
| 17 const void *rawCtx) { |
| 18 /* |
| 19 * TODO(petarj): Check whether float registers should be added here. |
| 20 */ |
| 21 ucontext_t *uctx = (ucontext_t *) rawCtx; |
| 22 mcontext_t *mctx = &uctx->uc_mcontext; |
| 23 |
| 24 sigCtx->prog_ctr = mctx->pc; |
| 25 |
| 26 sigCtx->zero = mctx->gregs[0]; |
| 27 sigCtx->at = mctx->gregs[1]; |
| 28 sigCtx->v0 = mctx->gregs[2]; |
| 29 sigCtx->v1 = mctx->gregs[3]; |
| 30 sigCtx->a0 = mctx->gregs[4]; |
| 31 sigCtx->a1 = mctx->gregs[5]; |
| 32 sigCtx->a2 = mctx->gregs[6]; |
| 33 sigCtx->a3 = mctx->gregs[7]; |
| 34 sigCtx->t0 = mctx->gregs[8]; |
| 35 sigCtx->t1 = mctx->gregs[9]; |
| 36 sigCtx->t2 = mctx->gregs[10]; |
| 37 sigCtx->t3 = mctx->gregs[11]; |
| 38 sigCtx->t4 = mctx->gregs[12]; |
| 39 sigCtx->t5 = mctx->gregs[13]; |
| 40 sigCtx->t6 = mctx->gregs[14]; |
| 41 sigCtx->t7 = mctx->gregs[15]; |
| 42 sigCtx->s0 = mctx->gregs[16]; |
| 43 sigCtx->s1 = mctx->gregs[17]; |
| 44 sigCtx->s2 = mctx->gregs[18]; |
| 45 sigCtx->s3 = mctx->gregs[19]; |
| 46 sigCtx->s4 = mctx->gregs[20]; |
| 47 sigCtx->s5 = mctx->gregs[21]; |
| 48 sigCtx->s6 = mctx->gregs[22]; |
| 49 sigCtx->s7 = mctx->gregs[23]; |
| 50 sigCtx->t8 = mctx->gregs[24]; |
| 51 sigCtx->t9 = mctx->gregs[25]; |
| 52 sigCtx->k0 = mctx->gregs[26]; |
| 53 sigCtx->k1 = mctx->gregs[27]; |
| 54 sigCtx->global_ptr = mctx->gregs[28]; |
| 55 sigCtx->stack_ptr = mctx->gregs[29]; |
| 56 sigCtx->frame_ptr = mctx->gregs[30]; |
| 57 sigCtx->return_addr = mctx->gregs[31]; |
| 58 } |
| 59 |
| 60 |
| 61 /* |
| 62 * Update the raw platform dependent signal information from the |
| 63 * signal context structure. |
| 64 */ |
| 65 void NaClSignalContextToHandler(void *rawCtx, |
| 66 const struct NaClSignalContext *sigCtx) { |
| 67 ucontext_t *uctx = (ucontext_t *) rawCtx; |
| 68 mcontext_t *mctx = &uctx->uc_mcontext; |
| 69 |
| 70 mctx->pc = sigCtx->prog_ctr; |
| 71 |
| 72 mctx->gregs[0] = sigCtx->zero; |
| 73 mctx->gregs[1] = sigCtx->at; |
| 74 mctx->gregs[2] = sigCtx->v0; |
| 75 mctx->gregs[3] = sigCtx->v1; |
| 76 mctx->gregs[4] = sigCtx->a0; |
| 77 mctx->gregs[5] = sigCtx->a1; |
| 78 mctx->gregs[6] = sigCtx->a2; |
| 79 mctx->gregs[7] = sigCtx->a3; |
| 80 mctx->gregs[8] = sigCtx->t0; |
| 81 mctx->gregs[9] = sigCtx->t1; |
| 82 mctx->gregs[10] = sigCtx->t2; |
| 83 mctx->gregs[11] = sigCtx->t3; |
| 84 mctx->gregs[12] = sigCtx->t4; |
| 85 mctx->gregs[13] = sigCtx->t5; |
| 86 mctx->gregs[14] = sigCtx->t6; |
| 87 mctx->gregs[15] = sigCtx->t7; |
| 88 mctx->gregs[16] = sigCtx->s0; |
| 89 mctx->gregs[17] = sigCtx->s1; |
| 90 mctx->gregs[18] = sigCtx->s2; |
| 91 mctx->gregs[19] = sigCtx->s3; |
| 92 mctx->gregs[20] = sigCtx->s4; |
| 93 mctx->gregs[21] = sigCtx->s5; |
| 94 mctx->gregs[22] = sigCtx->s6; |
| 95 mctx->gregs[23] = sigCtx->s7; |
| 96 mctx->gregs[24] = sigCtx->t8; |
| 97 mctx->gregs[25] = sigCtx->t9; |
| 98 mctx->gregs[26] = sigCtx->k0; |
| 99 mctx->gregs[27] = sigCtx->k1; |
| 100 mctx->gregs[28] = sigCtx->global_ptr; |
| 101 mctx->gregs[29] = sigCtx->stack_ptr; |
| 102 mctx->gregs[30] = sigCtx->frame_ptr; |
| 103 mctx->gregs[31] = sigCtx->return_addr; |
| 104 } |
OLD | NEW |