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

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: fix first round of my own feedback Created 10 years 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
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 24 matching lines...) Expand all
51 uint8_t *data_old, uint8_t *data_new, 52 uint8_t *data_old, uint8_t *data_new,
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
bsy 2010/12/15 04:06:50 same CHECK as below would be good (yeah, i know, p
elijahtaylor (use chromium) 2010/12/15 21:26:37 Done On 2010/12/15 04:06:50, bsy wrote:
62 vstate = NCValidateInit(guest_addr, guest_addr + size, nap->bundle_size); 63 vstate = NCValidateInit(guest_addr, guest_addr + size, nap->bundle_size);
63 if (vstate == NULL) { 64 if (vstate == NULL) {
64 return LOAD_BAD_FILE; 65 return LOAD_BAD_FILE;
65 } 66 }
66 NCValidateSegmentPair(data_old, data_new, guest_addr, size, vstate); 67 NCValidateSegmentPair(data_old, data_new, guest_addr, size, vstate);
67 validator_result = NCValidateFinish(vstate); 68 validator_result = NCValidateFinish(vstate);
68 NCValidateFreeState(&vstate); 69 NCValidateFreeState(&vstate);
69 if (validator_result != 0) { 70 if (validator_result != 0) {
70 return LOAD_VALIDATION_FAILED; 71 return LOAD_VALIDATION_FAILED;
71 } 72 }
(...skipping 18 matching lines...) Expand all
90 int NaClValidateCode(struct NaClApp *nap, uintptr_t guest_addr, 91 int NaClValidateCode(struct NaClApp *nap, uintptr_t guest_addr,
91 uint8_t *data, size_t size) { 92 uint8_t *data, size_t size) {
92 struct NaClValidatorState *vstate; 93 struct NaClValidatorState *vstate;
93 int is_ok; 94 int is_ok;
94 95
95 vstate = NaClValidatorStateCreate(guest_addr, size, nap->bundle_size, 96 vstate = NaClValidatorStateCreate(guest_addr, size, nap->bundle_size,
96 RegR15); 97 RegR15);
97 if (vstate == NULL) { 98 if (vstate == NULL) {
98 return LOAD_BAD_FILE; 99 return LOAD_BAD_FILE;
99 } 100 }
101
100 NaClValidatorStateSetLogVerbosity(vstate, LOG_ERROR); 102 NaClValidatorStateSetLogVerbosity(vstate, LOG_ERROR);
101 103
102 if (nap->validator_stub_out_mode) { 104 if (nap->validator_stub_out_mode) {
103 /* In stub out mode, we do two passes. The second pass acts as a sanity 105 /* 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 106 * check, after illegal instructions have been stubbed out with allowable
105 * HLTs. 107 * HLTs.
106 * Start pass one to find errors, and stub out illegal instructions. 108 * Start pass one to find errors, and stub out illegal instructions.
107 */ 109 */
108 NaClValidatorStateSetDoStubOut(vstate, TRUE); 110 NaClValidatorStateSetDoStubOut(vstate, TRUE);
109 NaClValidateSegment(data, guest_addr, size, vstate); 111 NaClValidateSegment(data, guest_addr, size, vstate);
110 NaClValidatorStateDestroy(vstate); 112 NaClValidatorStateDestroy(vstate);
111 vstate = NaClValidatorStateCreate(guest_addr, size, nap->bundle_size, 113 vstate = NaClValidatorStateCreate(guest_addr, size, nap->bundle_size,
112 RegR15); 114 RegR15);
113 NaClValidatorStateSetLogVerbosity(vstate, LOG_ERROR); 115 NaClValidatorStateSetLogVerbosity(vstate, LOG_ERROR);
114 } 116 }
115 NaClValidateSegment(data, guest_addr, size, vstate); 117 NaClValidateSegment(data, guest_addr, size, vstate);
116 is_ok = NaClValidatesOk(vstate); 118 is_ok = NaClValidatesOk(vstate);
117 NaClValidatorStateDestroy(vstate); 119 NaClValidatorStateDestroy(vstate);
118 if (!is_ok) { 120 if (!is_ok) {
119 return LOAD_VALIDATION_FAILED; 121 return LOAD_VALIDATION_FAILED;
120 } 122 }
121 return LOAD_OK; 123 return LOAD_OK;
122 } 124 }
123 125
124 int NaClValidateCodeReplacement(struct NaClApp *nap, uintptr_t guest_addr, 126 int NaClValidateCodeReplacement(struct NaClApp *nap, uintptr_t guest_addr,
125 uint8_t *data_old, uint8_t *data_new, 127 uint8_t *data_old, uint8_t *data_new,
126 size_t size) { 128 size_t size) {
127 UNREFERENCED_PARAMETER(nap); 129 struct NaClValidatorState *vstate;
128 UNREFERENCED_PARAMETER(guest_addr); 130 int is_ok;
129 UNREFERENCED_PARAMETER(data_old); 131
130 UNREFERENCED_PARAMETER(data_new); 132 if (nap->validator_stub_out_mode) {
131 UNREFERENCED_PARAMETER(size); 133 NaClLog(1, "NaClValidateCodeReplacement: "
132 NaClLog(1, "NaClValidateCodeReplacement: " 134 "stub_out_mode not supported for code replacement\n");
133 "code replacement not yet supported on x86_64\n"); 135 return LOAD_BAD_FILE;
134 return LOAD_UNIMPLEMENTED; 136 }
137
bsy 2010/12/15 04:06:50 a check here that guest_addr starts at bundle boun
elijahtaylor (use chromium) 2010/12/15 21:26:37 Done. On 2010/12/15 04:06:50, bsy wrote:
138 vstate = NaClValidatorStateCreate(guest_addr, size, nap->bundle_size,
139 RegR15);
140 if (vstate == NULL) {
141 return LOAD_BAD_FILE;
142 }
143 NaClValidatorStateSetLogVerbosity(vstate, LOG_ERROR);
144
145 NaClValidateSegmentPair(data_old, data_new, guest_addr, size, vstate);
146 is_ok = NaClValidatesOk(vstate);
147 NaClValidatorStateDestroy(vstate);
148 if (!is_ok) {
149 return LOAD_VALIDATION_FAILED;
150 }
151 return LOAD_OK;
135 } 152 }
136 153
137
138 int NaClCopyCode(struct NaClApp *nap, uintptr_t guest_addr, 154 int NaClCopyCode(struct NaClApp *nap, uintptr_t guest_addr,
139 uint8_t *data_old, uint8_t *data_new, 155 uint8_t *data_old, uint8_t *data_new,
140 size_t size) { 156 size_t size) {
157 int result;
141 UNREFERENCED_PARAMETER(nap); 158 UNREFERENCED_PARAMETER(nap);
142 UNREFERENCED_PARAMETER(guest_addr); 159
143 UNREFERENCED_PARAMETER(data_old); 160 result = NaClCopyCodeIter(data_old, data_new, guest_addr, size);
144 UNREFERENCED_PARAMETER(data_new); 161 if (result != 0) {
145 UNREFERENCED_PARAMETER(size); 162 return LOAD_UNLOADABLE;
146 NaClLog(1, "NaClCopyCode: " 163 }
147 "code replacement not yet supported on x86_64\n"); 164 return LOAD_OK;
148 return LOAD_UNIMPLEMENTED;
149 } 165 }
150 166
151 # endif 167 # endif
152 168
153 #elif NACL_ARCH(NACL_BUILD_ARCH) == NACL_arm 169 #elif NACL_ARCH(NACL_BUILD_ARCH) == NACL_arm
154 170
155 # include "native_client/src/trusted/validator_arm/ncvalidate.h" 171 # include "native_client/src/trusted/validator_arm/ncvalidate.h"
156 172
157 int NaClValidateCode(struct NaClApp *nap, uintptr_t guest_addr, 173 int NaClValidateCode(struct NaClApp *nap, uintptr_t guest_addr,
158 uint8_t *data, size_t size) { 174 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"); 233 NaClLog(LOG_ERROR, "VALIDATION FAILED.\n");
218 NaClLog(LOG_ERROR, 234 NaClLog(LOG_ERROR,
219 "Run sel_ldr in debug mode to ignore validation failure.\n"); 235 "Run sel_ldr in debug mode to ignore validation failure.\n");
220 NaClLog(LOG_ERROR, 236 NaClLog(LOG_ERROR,
221 "Run ncval <module-name> for validation error details.\n"); 237 "Run ncval <module-name> for validation error details.\n");
222 rcode = LOAD_VALIDATION_FAILED; 238 rcode = LOAD_VALIDATION_FAILED;
223 } 239 }
224 } 240 }
225 return rcode; 241 return rcode;
226 } 242 }
OLDNEW
« no previous file with comments | « no previous file | src/trusted/validator_x86/nccopycode.h » ('j') | src/trusted/validator_x86/nccopycode.c » ('J')

Powered by Google App Engine
This is Rietveld 408576698