Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(38)

Side by Side Diff: src/trusted/service_runtime/sel_validate_image.c

Issue 5738003: Resurrect Petr's 64-bit dynamic code modification CL:... (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client/
Patch Set: '' Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/trusted/validator_x86/nccopycode.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2010 The Native Client Authors. All rights reserved. 2 * Copyright 2010 The Native Client Authors. All rights reserved.
3 * Use of this source code is governed by a BSD-style license that can 3 * Use of this source code is governed by a BSD-style license that can
4 * be found in the LICENSE file. 4 * be found in the LICENSE file.
5 */ 5 */
6 6
7 #include "native_client/src/shared/platform/nacl_log.h" 7 #include "native_client/src/shared/platform/nacl_log.h"
8 #include "native_client/src/trusted/service_runtime/sel_ldr.h" 8 #include "native_client/src/trusted/service_runtime/sel_ldr.h"
9 9
10 10
11 #if NACL_ARCH(NACL_BUILD_ARCH) == NACL_x86 11 #if NACL_ARCH(NACL_BUILD_ARCH) == NACL_x86
12 12
13 # include "native_client/src/trusted/validator_x86/nccopycode.h"
14
13 # if NACL_TARGET_SUBARCH == 32 15 # if NACL_TARGET_SUBARCH == 32
14 16
15 # include "native_client/src/trusted/validator_x86/ncvalidate.h" 17 # include "native_client/src/trusted/validator_x86/ncvalidate.h"
16 # include "native_client/src/trusted/validator_x86/nccopycode.h"
17 18
18 int NaClValidateCode(struct NaClApp *nap, uintptr_t guest_addr, 19 int NaClValidateCode(struct NaClApp *nap, uintptr_t guest_addr,
19 uint8_t *data, size_t size) { 20 uint8_t *data, size_t size) {
20 struct NCValidatorState *vstate; 21 struct NCValidatorState *vstate;
21 int validator_result; 22 int validator_result;
22 23
23 if (nap->validator_stub_out_mode) { 24 if (nap->validator_stub_out_mode) {
24 /* In stub out mode, we do two passes. The second pass acts as a 25 /* In stub out mode, we do two passes. The second pass acts as a
25 sanity check that bad instructions were indeed overwritten with 26 sanity check that bad instructions were indeed overwritten with
26 allowable HLTs. */ 27 allowable HLTs. */
(...skipping 25 matching lines...) Expand all
52 size_t size) { 53 size_t size) {
53 struct NCValidatorState *vstate; 54 struct NCValidatorState *vstate;
54 int validator_result; 55 int validator_result;
55 56
56 if (nap->validator_stub_out_mode) { 57 if (nap->validator_stub_out_mode) {
57 NaClLog(1, "NaClValidateCodeReplacement: " 58 NaClLog(1, "NaClValidateCodeReplacement: "
58 "stub_out_mode not supported for code replacement\n"); 59 "stub_out_mode not supported for code replacement\n");
59 return LOAD_BAD_FILE; 60 return LOAD_BAD_FILE;
60 } 61 }
61 62
63 if ((guest_addr % nap->bundle_size) != 0 ||
64 (size % nap->bundle_size) != 0) {
65 NaClLog(1, "NaClValidateCodeReplacement: "
66 "code replacement is not properly bundle-aligned\n");
67 return LOAD_BAD_FILE;
68 }
69
62 vstate = NCValidateInit(guest_addr, guest_addr + size, nap->bundle_size); 70 vstate = NCValidateInit(guest_addr, guest_addr + size, nap->bundle_size);
63 if (vstate == NULL) { 71 if (vstate == NULL) {
64 return LOAD_BAD_FILE; 72 return LOAD_BAD_FILE;
65 } 73 }
66 NCValidateSegmentPair(data_old, data_new, guest_addr, size, vstate); 74 NCValidateSegmentPair(data_old, data_new, guest_addr, size, vstate);
67 validator_result = NCValidateFinish(vstate); 75 validator_result = NCValidateFinish(vstate);
68 NCValidateFreeState(&vstate); 76 NCValidateFreeState(&vstate);
69 if (validator_result != 0) { 77 if (validator_result != 0) {
70 return LOAD_VALIDATION_FAILED; 78 return LOAD_VALIDATION_FAILED;
71 } 79 }
72 return LOAD_OK; 80 return LOAD_OK;
73 } 81 }
74 82
75 int NaClCopyCode(struct NaClApp *nap, uintptr_t guest_addr, 83 int NaClCopyCode(struct NaClApp *nap, uintptr_t guest_addr,
76 uint8_t *data_old, uint8_t *data_new, 84 uint8_t *data_old, uint8_t *data_new,
77 size_t size) { 85 size_t size) {
78 int result; 86 int result;
79 result = NCCopyCode(data_old, data_new, guest_addr, size, nap->bundle_size); 87 result = NCCopyCode(data_old, data_new, guest_addr, size, nap->bundle_size);
80 if (result != 0) { 88 if (0 == result) {
81 return LOAD_UNLOADABLE; 89 return LOAD_UNLOADABLE;
82 } 90 }
83 return LOAD_OK; 91 return LOAD_OK;
84 } 92 }
85 93
86 # else 94 # else
87 95
88 # include "native_client/src/trusted/validator_x86/ncvalidate_iter.h" 96 # include "native_client/src/trusted/validator_x86/ncvalidate_iter.h"
89 97
90 int NaClValidateCode(struct NaClApp *nap, uintptr_t guest_addr, 98 int NaClValidateCode(struct NaClApp *nap, uintptr_t guest_addr,
91 uint8_t *data, size_t size) { 99 uint8_t *data, size_t size) {
92 struct NaClValidatorState *vstate; 100 struct NaClValidatorState *vstate;
93 int is_ok; 101 int is_ok;
94 102
95 vstate = NaClValidatorStateCreate(guest_addr, size, nap->bundle_size, 103 vstate = NaClValidatorStateCreate(guest_addr, size, nap->bundle_size,
96 RegR15); 104 RegR15);
97 if (vstate == NULL) { 105 if (vstate == NULL) {
98 return LOAD_BAD_FILE; 106 return LOAD_BAD_FILE;
99 } 107 }
108
100 NaClValidatorStateSetLogVerbosity(vstate, LOG_ERROR); 109 NaClValidatorStateSetLogVerbosity(vstate, LOG_ERROR);
101 110
102 if (nap->validator_stub_out_mode) { 111 if (nap->validator_stub_out_mode) {
103 /* In stub out mode, we do two passes. The second pass acts as a sanity 112 /* In stub out mode, we do two passes. The second pass acts as a sanity
104 * check, after illegal instructions have been stubbed out with allowable 113 * check, after illegal instructions have been stubbed out with allowable
105 * HLTs. 114 * HLTs.
106 * Start pass one to find errors, and stub out illegal instructions. 115 * Start pass one to find errors, and stub out illegal instructions.
107 */ 116 */
108 NaClValidatorStateSetDoStubOut(vstate, TRUE); 117 NaClValidatorStateSetDoStubOut(vstate, TRUE);
109 NaClValidateSegment(data, guest_addr, size, vstate); 118 NaClValidateSegment(data, guest_addr, size, vstate);
110 NaClValidatorStateDestroy(vstate); 119 NaClValidatorStateDestroy(vstate);
111 vstate = NaClValidatorStateCreate(guest_addr, size, nap->bundle_size, 120 vstate = NaClValidatorStateCreate(guest_addr, size, nap->bundle_size,
112 RegR15); 121 RegR15);
113 NaClValidatorStateSetLogVerbosity(vstate, LOG_ERROR); 122 NaClValidatorStateSetLogVerbosity(vstate, LOG_ERROR);
114 } 123 }
115 NaClValidateSegment(data, guest_addr, size, vstate); 124 NaClValidateSegment(data, guest_addr, size, vstate);
116 is_ok = NaClValidatesOk(vstate); 125 is_ok = NaClValidatesOk(vstate);
117 NaClValidatorStateDestroy(vstate); 126 NaClValidatorStateDestroy(vstate);
118 if (!is_ok) { 127 if (!is_ok) {
119 return LOAD_VALIDATION_FAILED; 128 return LOAD_VALIDATION_FAILED;
120 } 129 }
121 return LOAD_OK; 130 return LOAD_OK;
122 } 131 }
123 132
124 int NaClValidateCodeReplacement(struct NaClApp *nap, uintptr_t guest_addr, 133 int NaClValidateCodeReplacement(struct NaClApp *nap, uintptr_t guest_addr,
125 uint8_t *data_old, uint8_t *data_new, 134 uint8_t *data_old, uint8_t *data_new,
126 size_t size) { 135 size_t size) {
127 UNREFERENCED_PARAMETER(nap); 136 struct NaClValidatorState *vstate;
128 UNREFERENCED_PARAMETER(guest_addr); 137 int is_ok;
129 UNREFERENCED_PARAMETER(data_old); 138
130 UNREFERENCED_PARAMETER(data_new); 139 if (nap->validator_stub_out_mode) {
131 UNREFERENCED_PARAMETER(size); 140 NaClLog(1, "NaClValidateCodeReplacement: "
132 NaClLog(1, "NaClValidateCodeReplacement: " 141 "stub_out_mode not supported for code replacement\n");
133 "code replacement not yet supported on x86_64\n"); 142 return LOAD_BAD_FILE;
134 return LOAD_UNIMPLEMENTED; 143 }
144
145 if ((guest_addr % nap->bundle_size) != 0 ||
146 (size % nap->bundle_size) != 0) {
147 NaClLog(1, "NaClValidateCodeReplacement: "
148 "code replacement is not properly bundle-aligned\n");
149 return LOAD_BAD_FILE;
150 }
151
152 vstate = NaClValidatorStateCreate(guest_addr, size, nap->bundle_size,
153 RegR15);
154 if (NULL == vstate) {
155 return LOAD_BAD_FILE;
156 }
157 NaClValidatorStateSetLogVerbosity(vstate, LOG_ERROR);
158
159 NaClValidateSegmentPair(data_old, data_new, guest_addr, size, vstate);
160 is_ok = NaClValidatesOk(vstate);
161 NaClValidatorStateDestroy(vstate);
162 if (!is_ok) {
163 return LOAD_VALIDATION_FAILED;
164 }
165 return LOAD_OK;
135 } 166 }
136 167
137
138 int NaClCopyCode(struct NaClApp *nap, uintptr_t guest_addr, 168 int NaClCopyCode(struct NaClApp *nap, uintptr_t guest_addr,
139 uint8_t *data_old, uint8_t *data_new, 169 uint8_t *data_old, uint8_t *data_new,
140 size_t size) { 170 size_t size) {
171 int result;
141 UNREFERENCED_PARAMETER(nap); 172 UNREFERENCED_PARAMETER(nap);
142 UNREFERENCED_PARAMETER(guest_addr); 173
143 UNREFERENCED_PARAMETER(data_old); 174 result = NaClCopyCodeIter(data_old, data_new, guest_addr, size);
144 UNREFERENCED_PARAMETER(data_new); 175 if (0 == result) {
145 UNREFERENCED_PARAMETER(size); 176 return LOAD_UNLOADABLE;
146 NaClLog(1, "NaClCopyCode: " 177 }
147 "code replacement not yet supported on x86_64\n"); 178 return LOAD_OK;
148 return LOAD_UNIMPLEMENTED;
149 } 179 }
150 180
151 # endif 181 # endif
152 182
153 #elif NACL_ARCH(NACL_BUILD_ARCH) == NACL_arm 183 #elif NACL_ARCH(NACL_BUILD_ARCH) == NACL_arm
154 184
155 # include "native_client/src/trusted/validator_arm/ncvalidate.h" 185 # include "native_client/src/trusted/validator_arm/ncvalidate.h"
156 186
157 int NaClValidateCode(struct NaClApp *nap, uintptr_t guest_addr, 187 int NaClValidateCode(struct NaClApp *nap, uintptr_t guest_addr,
158 uint8_t *data, size_t size) { 188 uint8_t *data, size_t size) {
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 NaClLog(LOG_ERROR, "VALIDATION FAILED.\n"); 247 NaClLog(LOG_ERROR, "VALIDATION FAILED.\n");
218 NaClLog(LOG_ERROR, 248 NaClLog(LOG_ERROR,
219 "Run sel_ldr in debug mode to ignore validation failure.\n"); 249 "Run sel_ldr in debug mode to ignore validation failure.\n");
220 NaClLog(LOG_ERROR, 250 NaClLog(LOG_ERROR,
221 "Run ncval <module-name> for validation error details.\n"); 251 "Run ncval <module-name> for validation error details.\n");
222 rcode = LOAD_VALIDATION_FAILED; 252 rcode = LOAD_VALIDATION_FAILED;
223 } 253 }
224 } 254 }
225 return rcode; 255 return rcode;
226 } 256 }
OLDNEW
« no previous file with comments | « no previous file | src/trusted/validator_x86/nccopycode.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698