OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 } |
OLD | NEW |