Debugging: Add code to print backtrace for guest on SIGSEGV
[nativeclient.git] / service_runtime / nacl_memory_object.c
blob9b4610b60f984c9a9fac2f2d14cf84eaac4be39e
1 /*
2 * Copyright 2008, Google Inc.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met:
8 *
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following disclaimer
13 * in the documentation and/or other materials provided with the
14 * distribution.
15 * * Neither the name of Google Inc. nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 * NaCl Simple/secure ELF loader (NaCl SEL) memory object.
36 #include <stdlib.h>
38 #include "native_client/service_runtime/nacl_log.h"
39 #include "native_client/service_runtime/nacl_sync_checked.h"
40 #include "native_client/service_runtime/nacl_memory_object.h"
43 * Takes ownership of NaClDesc object, so no manipulation of ref count.
45 int NaClMemObjCtor(struct NaClMemObj *nmop,
46 struct NaClDesc *ndp,
47 off_t nbytes,
48 off_t offset)
50 if (NULL == ndp) {
51 NaClLog(LOG_FATAL, "NaClMemObjCtor: ndp is NULL\n");
53 nmop->ndp = ndp;
54 NaClDescRef(ndp);
55 nmop->nbytes = nbytes;
56 nmop->offset = offset;
57 return 1;
61 * Placement new copy ctor.
63 int NaClMemObjCopyCtorOff(struct NaClMemObj *nmop,
64 struct NaClMemObj *src,
65 off_t additional)
67 nmop->ndp = src->ndp;
68 NaClDescRef(nmop->ndp);
69 nmop->nbytes = src->nbytes;
70 nmop->offset = src->offset + additional;
71 return 1;
74 void NaClMemObjDtor(struct NaClMemObj *nmop)
76 NaClDescUnref(nmop->ndp);
77 nmop->ndp = NULL;
78 nmop->nbytes = 0;
79 nmop->offset = 0;
82 struct NaClMemObj *NaClMemObjMake(struct NaClDesc *ndp,
83 off_t nbytes,
84 off_t offset)
86 struct NaClMemObj *nmop;
88 if (NULL == ndp) {
89 NaClLog(LOG_WARNING, "NaClMemObjMake: invoked with NULL ndp\n");
90 return NULL; /* anonymous paging file backed memory */
92 if (NULL == (nmop = malloc(sizeof *nmop))) {
93 NaClLog(LOG_FATAL, ("NaClMemObjMake: out of memory creating object"
94 " (NaClDesc = 0x%08"PRIxPTR", offset = 0x%"PRIx64")\n"),
95 (uintptr_t) ndp, (int64_t) offset);
97 (void) NaClMemObjCtor(nmop, ndp, nbytes, offset);
98 return nmop;
101 struct NaClMemObj *NaClMemObjSplit(struct NaClMemObj *orig,
102 off_t additional)
104 struct NaClMemObj *nmop;
105 if (orig == NULL)
106 return NULL;
108 if (NULL == orig)
109 return NULL;
111 if (NULL == (nmop = malloc(sizeof *nmop))) {
112 NaClLog(LOG_FATAL, ("NaClMemObjSplit: out of memory creating object"
113 " (NaClMemObj = 0x%08"PRIxPTR","
114 " additional = 0x%"PRIx64")\n"),
115 (uintptr_t) orig, (int64_t) additional);
117 NaClMemObjCopyCtorOff(nmop, orig, additional);
118 return nmop;
121 void NaClMemObjIncOffset(struct NaClMemObj *nmop,
122 off_t additional)
124 if (NULL != nmop) {
125 nmop->offset += additional;