Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / native_client / src / trusted / service_runtime / linux / nacl_signal_arm.c
1 /*
2  * Copyright (c) 2010 The Native Client Authors. All rights reserved.
3  * Use of this source code is governed by a BSD-style license that can be
4  * found in the LICENSE file.
5  */
6
7 #include <signal.h>
8 #include <string.h>
9 #if !NACL_ANDROID
10 #include <sys/ucontext.h>
11 #endif
12
13 #include "native_client/src/trusted/service_runtime/linux/android_compat.h"
14 #include "native_client/src/trusted/service_runtime/nacl_signal.h"
15
16 /*
17  * Fill a signal context structure from the raw platform dependent
18  * signal information.
19  */
20 void NaClSignalContextFromHandler(struct NaClSignalContext *sig_ctx,
21                                   const void *raw_ctx) {
22   ucontext_t *uctx = (ucontext_t *) raw_ctx;
23   struct sigcontext *mctx = &uctx->uc_mcontext;
24
25   memset(sig_ctx, 0, sizeof(*sig_ctx));
26
27   sig_ctx->prog_ctr = mctx->arm_pc;
28   sig_ctx->stack_ptr = mctx->arm_sp;
29
30   sig_ctx->r0 = mctx->arm_r0;
31   sig_ctx->r1 = mctx->arm_r1;
32   sig_ctx->r2 = mctx->arm_r2;
33   sig_ctx->r3 = mctx->arm_r3;
34   sig_ctx->r4 = mctx->arm_r4;
35   sig_ctx->r5 = mctx->arm_r5;
36   sig_ctx->r6 = mctx->arm_r6;
37   sig_ctx->r7 = mctx->arm_r7;
38   sig_ctx->r8 = mctx->arm_r8;
39   sig_ctx->r9 = mctx->arm_r9;
40   sig_ctx->r10 = mctx->arm_r10;
41   sig_ctx->r11 = mctx->arm_fp;
42   sig_ctx->r12 = mctx->arm_ip;
43   sig_ctx->lr = mctx->arm_lr;
44   sig_ctx->cpsr = mctx->arm_cpsr;
45 }
46
47
48 /*
49  * Update the raw platform dependent signal information from the
50  * signal context structure.
51  */
52 void NaClSignalContextToHandler(void *raw_ctx,
53                                 const struct NaClSignalContext *sig_ctx) {
54   ucontext_t *uctx = (ucontext_t *) raw_ctx;
55   struct sigcontext *mctx = &uctx->uc_mcontext;
56
57   mctx->arm_pc = sig_ctx->prog_ctr;
58   mctx->arm_sp = sig_ctx->stack_ptr;
59
60   mctx->arm_r0 = sig_ctx->r0;
61   mctx->arm_r1 = sig_ctx->r1;
62   mctx->arm_r2 = sig_ctx->r2;
63   mctx->arm_r3 = sig_ctx->r3;
64   mctx->arm_r4 = sig_ctx->r4;
65   mctx->arm_r5 = sig_ctx->r5;
66   mctx->arm_r6 = sig_ctx->r6;
67   mctx->arm_r7 = sig_ctx->r7;
68   mctx->arm_r8 = sig_ctx->r8;
69   mctx->arm_r9 = sig_ctx->r9;
70   mctx->arm_r10 = sig_ctx->r10;
71   mctx->arm_fp = sig_ctx->r11;
72   mctx->arm_ip = sig_ctx->r12;
73   mctx->arm_lr = sig_ctx->lr;
74   mctx->arm_cpsr = sig_ctx->cpsr;
75 }