1 : /*
2 : * Copyright (c) 2012 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 <sys/ucontext.h>
9 :
10 : #include "native_client/src/trusted/service_runtime/nacl_signal.h"
11 :
12 : /*
13 : * Definition of the POSIX ucontext_t for Mac OS X can be found in:
14 : * /usr/include/mach/i386/_structs.h
15 : */
16 :
17 26597 : static void SignalContextFromRegs(struct NaClSignalContext *dest,
18 26597 : const x86_thread_state64_t *src) {
19 26597 : dest->prog_ctr = src->__rip;
20 26597 : dest->stack_ptr = src->__rsp;
21 :
22 26597 : dest->rax = src->__rax;
23 26597 : dest->rbx = src->__rbx;
24 26597 : dest->rcx = src->__rcx;
25 26597 : dest->rdx = src->__rdx;
26 26597 : dest->rsi = src->__rsi;
27 26597 : dest->rdi = src->__rdi;
28 26597 : dest->rbp = src->__rbp;
29 26597 : dest->r8 = src->__r8;
30 26597 : dest->r9 = src->__r9;
31 26597 : dest->r10 = src->__r10;
32 26597 : dest->r11 = src->__r11;
33 26597 : dest->r12 = src->__r12;
34 26597 : dest->r13 = src->__r13;
35 26597 : dest->r14 = src->__r14;
36 26597 : dest->r15 = src->__r15;
37 26597 : dest->flags = (uint32_t) src->__rflags;
38 26597 : dest->cs = (uint32_t) src->__cs;
39 26597 : dest->fs = (uint32_t) src->__fs;
40 26597 : dest->gs = (uint32_t) src->__gs;
41 26597 : }
42 :
43 78 : static void SignalContextToRegs(x86_thread_state64_t *dest,
44 78 : const struct NaClSignalContext *src) {
45 78 : dest->__rip = src->prog_ctr;
46 78 : dest->__rsp = src->stack_ptr;
47 :
48 78 : dest->__rax = src->rax;
49 78 : dest->__rbx = src->rbx;
50 78 : dest->__rcx = src->rcx;
51 78 : dest->__rdx = src->rdx;
52 78 : dest->__rsi = src->rsi;
53 78 : dest->__rdi = src->rdi;
54 78 : dest->__rbp = src->rbp;
55 78 : dest->__r8 = src->r8;
56 78 : dest->__r9 = src->r9;
57 78 : dest->__r10 = src->r10;
58 78 : dest->__r11 = src->r11;
59 78 : dest->__r12 = src->r12;
60 78 : dest->__r13 = src->r13;
61 78 : dest->__r14 = src->r14;
62 78 : dest->__r15 = src->r15;
63 78 : dest->__rflags = src->flags;
64 78 : dest->__cs = src->cs;
65 78 : dest->__fs = src->fs;
66 78 : dest->__gs = src->gs;
67 78 : }
68 :
69 26597 : void NaClSignalContextFromMacThreadState(struct NaClSignalContext *dest,
70 26597 : const x86_thread_state_t *src) {
71 26597 : SignalContextFromRegs(dest, &src->uts.ts64);
72 26597 : }
73 :
74 78 : void NaClSignalContextToMacThreadState(x86_thread_state_t *dest,
75 78 : const struct NaClSignalContext *src) {
76 78 : SignalContextToRegs(&dest->uts.ts64, src);
77 78 : }
78 :
79 : /*
80 : * Fill a signal context structure from the raw platform dependent
81 : * signal information.
82 : */
83 0 : void NaClSignalContextFromHandler(struct NaClSignalContext *sig_ctx,
84 0 : const void *raw_ctx) {
85 0 : ucontext_t *uctx = (ucontext_t *) raw_ctx;
86 0 : SignalContextFromRegs(sig_ctx, &uctx->uc_mcontext->__ss);
87 0 : }
88 :
89 : /*
90 : * Update the raw platform dependent signal information from the
91 : * signal context structure.
92 : */
93 0 : void NaClSignalContextToHandler(void *raw_ctx,
94 0 : const struct NaClSignalContext *sig_ctx) {
95 0 : ucontext_t *uctx = (ucontext_t *) raw_ctx;
96 0 : SignalContextToRegs(&uctx->uc_mcontext->__ss, sig_ctx);
97 0 : }
|