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 dependant | |
Mark Seaborn
2012/09/18 03:24:34
"dependent"
petarj
2012/09/19 17:27:51
Done.
| |
14 * signal information. | |
15 */ | |
16 void NaClSignalContextFromHandler(struct NaClSignalContext *sigCtx, | |
17 const void *rawCtx) { | |
18 // TODO(petarj): Check whether float registers should be added here. | |
Mark Seaborn
2012/09/18 03:24:34
Nit: Please use C-style /* ... */ comments
petarj
2012/09/19 17:27:51
Done.
| |
19 ucontext_t *uctx = (ucontext_t *) rawCtx; | |
20 mcontext_t *mctx = &uctx->uc_mcontext; | |
21 | |
22 sigCtx->prog_ctr = mctx->pc; | |
23 | |
24 sigCtx->zero = mctx->gregs[0]; | |
25 sigCtx->at = mctx->gregs[1]; | |
26 sigCtx->v0 = mctx->gregs[2]; | |
27 sigCtx->v1 = mctx->gregs[3]; | |
28 sigCtx->a0 = mctx->gregs[4]; | |
29 sigCtx->a1 = mctx->gregs[5]; | |
30 sigCtx->a2 = mctx->gregs[6]; | |
31 sigCtx->a3 = mctx->gregs[7]; | |
32 sigCtx->t0 = mctx->gregs[8]; | |
33 sigCtx->t1 = mctx->gregs[9]; | |
34 sigCtx->t2 = mctx->gregs[10]; | |
35 sigCtx->t3 = mctx->gregs[11]; | |
36 sigCtx->t4 = mctx->gregs[12]; | |
37 sigCtx->t5 = mctx->gregs[13]; | |
38 sigCtx->t6 = mctx->gregs[14]; | |
39 sigCtx->t7 = mctx->gregs[15]; | |
40 sigCtx->s0 = mctx->gregs[16]; | |
41 sigCtx->s1 = mctx->gregs[17]; | |
42 sigCtx->s2 = mctx->gregs[18]; | |
43 sigCtx->s3 = mctx->gregs[19]; | |
44 sigCtx->s4 = mctx->gregs[20]; | |
45 sigCtx->s5 = mctx->gregs[21]; | |
46 sigCtx->s6 = mctx->gregs[22]; | |
47 sigCtx->s7 = mctx->gregs[23]; | |
48 sigCtx->t8 = mctx->gregs[24]; | |
49 sigCtx->t9 = mctx->gregs[25]; | |
50 sigCtx->k0 = mctx->gregs[26]; | |
51 sigCtx->k1 = mctx->gregs[27]; | |
52 sigCtx->global_ptr = mctx->gregs[28]; | |
53 sigCtx->stack_ptr = mctx->gregs[29]; | |
54 sigCtx->frame_ptr = mctx->gregs[30]; | |
55 sigCtx->return_addr = mctx->gregs[31]; | |
56 } | |
57 | |
58 | |
59 /* | |
60 * Update the raw platform dependant signal information from the | |
Mark Seaborn
2012/09/18 03:24:34
"dependent"
petarj
2012/09/19 17:27:51
Done.
| |
61 * signal context structure. | |
62 */ | |
63 void NaClSignalContextToHandler(void *rawCtx, | |
64 const struct NaClSignalContext *sigCtx) { | |
65 ucontext_t *uctx = (ucontext_t *) rawCtx; | |
66 mcontext_t *mctx = &uctx->uc_mcontext; | |
67 | |
68 mctx->pc = sigCtx->prog_ctr; | |
69 | |
70 mctx->gregs[0] = sigCtx->zero; | |
71 mctx->gregs[1] = sigCtx->at; | |
72 mctx->gregs[2] = sigCtx->v0; | |
73 mctx->gregs[3] = sigCtx->v1; | |
74 mctx->gregs[4] = sigCtx->a0; | |
75 mctx->gregs[5] = sigCtx->a1; | |
76 mctx->gregs[6] = sigCtx->a2; | |
77 mctx->gregs[7] = sigCtx->a3; | |
78 mctx->gregs[8] = sigCtx->t0; | |
79 mctx->gregs[9] = sigCtx->t1; | |
80 mctx->gregs[10] = sigCtx->t2; | |
81 mctx->gregs[11] = sigCtx->t3; | |
82 mctx->gregs[12] = sigCtx->t4; | |
83 mctx->gregs[13] = sigCtx->t5; | |
84 mctx->gregs[14] = sigCtx->t6; | |
85 mctx->gregs[15] = sigCtx->t7; | |
86 mctx->gregs[16] = sigCtx->s0; | |
87 mctx->gregs[17] = sigCtx->s1; | |
88 mctx->gregs[18] = sigCtx->s2; | |
89 mctx->gregs[19] = sigCtx->s3; | |
90 mctx->gregs[20] = sigCtx->s4; | |
91 mctx->gregs[21] = sigCtx->s5; | |
92 mctx->gregs[22] = sigCtx->s6; | |
93 mctx->gregs[23] = sigCtx->s7; | |
94 mctx->gregs[24] = sigCtx->t8; | |
95 mctx->gregs[25] = sigCtx->t9; | |
96 mctx->gregs[26] = sigCtx->k0; | |
97 mctx->gregs[27] = sigCtx->k1; | |
98 mctx->gregs[28] = sigCtx->global_ptr; | |
99 mctx->gregs[29] = sigCtx->stack_ptr; | |
100 mctx->gregs[30] = sigCtx->frame_ptr; | |
101 mctx->gregs[31] = sigCtx->return_addr; | |
102 } | |
OLD | NEW |