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 63 matching lines...) Expand 10 before | Expand all | Expand 10 after 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 vstate = NaClValidatorStateCreate(guest_addr, size, nap->bundle_size, |
131 UNREFERENCED_PARAMETER(size); | 133 RegR15); |
132 NaClLog(1, "NaClValidateCodeReplacement: " | 134 if (vstate == NULL) { |
133 "code replacement not yet supported on x86_64\n"); | 135 return LOAD_BAD_FILE; |
134 return LOAD_UNIMPLEMENTED; | 136 } |
| 137 NaClValidatorStateSetLogVerbosity(vstate, LOG_ERROR); |
| 138 |
| 139 if (nap->validator_stub_out_mode) { |
| 140 NaClLog(1, "NaClValidateCodeReplacement: " |
| 141 "stub_out_mode not supported for code replacement\n"); |
| 142 return LOAD_BAD_FILE; |
| 143 } |
| 144 NaClValidateSegmentPair(data_old, data_new, guest_addr, size, vstate); |
| 145 is_ok = NaClValidatesOk(vstate); |
| 146 NaClValidatorStateDestroy(vstate); |
| 147 if (!is_ok) { |
| 148 return LOAD_VALIDATION_FAILED; |
| 149 } |
| 150 return LOAD_OK; |
135 } | 151 } |
136 | 152 |
137 | |
138 int NaClCopyCode(struct NaClApp *nap, uintptr_t guest_addr, | 153 int NaClCopyCode(struct NaClApp *nap, uintptr_t guest_addr, |
139 uint8_t *data_old, uint8_t *data_new, | 154 uint8_t *data_old, uint8_t *data_new, |
140 size_t size) { | 155 size_t size) { |
| 156 int result; |
141 UNREFERENCED_PARAMETER(nap); | 157 UNREFERENCED_PARAMETER(nap); |
142 UNREFERENCED_PARAMETER(guest_addr); | 158 |
143 UNREFERENCED_PARAMETER(data_old); | 159 result = NaClCopyCodeIter(data_old, data_new, guest_addr, size); |
144 UNREFERENCED_PARAMETER(data_new); | 160 if (result != 0) { |
145 UNREFERENCED_PARAMETER(size); | 161 return LOAD_UNLOADABLE; |
146 NaClLog(1, "NaClCopyCode: " | 162 } |
147 "code replacement not yet supported on x86_64\n"); | 163 return LOAD_OK; |
148 return LOAD_UNIMPLEMENTED; | |
149 } | 164 } |
150 | 165 |
151 # endif | 166 # endif |
152 | 167 |
153 #elif NACL_ARCH(NACL_BUILD_ARCH) == NACL_arm | 168 #elif NACL_ARCH(NACL_BUILD_ARCH) == NACL_arm |
154 | 169 |
155 # include "native_client/src/trusted/validator_arm/ncvalidate.h" | 170 # include "native_client/src/trusted/validator_arm/ncvalidate.h" |
156 | 171 |
157 int NaClValidateCode(struct NaClApp *nap, uintptr_t guest_addr, | 172 int NaClValidateCode(struct NaClApp *nap, uintptr_t guest_addr, |
158 uint8_t *data, size_t size) { | 173 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"); | 232 NaClLog(LOG_ERROR, "VALIDATION FAILED.\n"); |
218 NaClLog(LOG_ERROR, | 233 NaClLog(LOG_ERROR, |
219 "Run sel_ldr in debug mode to ignore validation failure.\n"); | 234 "Run sel_ldr in debug mode to ignore validation failure.\n"); |
220 NaClLog(LOG_ERROR, | 235 NaClLog(LOG_ERROR, |
221 "Run ncval <module-name> for validation error details.\n"); | 236 "Run ncval <module-name> for validation error details.\n"); |
222 rcode = LOAD_VALIDATION_FAILED; | 237 rcode = LOAD_VALIDATION_FAILED; |
223 } | 238 } |
224 } | 239 } |
225 return rcode; | 240 return rcode; |
226 } | 241 } |
OLD | NEW |