OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2012 The Native Client Authors. All rights reserved. | 2 * Copyright (c) 2012 The Native Client Authors. All rights reserved. |
3 * Use of this source code is governed by a BSD-style license that can be | 3 * Use of this source code is governed by a BSD-style license that can be |
4 * found in the LICENSE file. | 4 * found in the LICENSE file. |
5 */ | 5 */ |
6 | 6 |
7 #include <assert.h> | 7 #include <assert.h> |
8 #include <errno.h> | 8 #include <errno.h> |
9 #include <pthread.h> | 9 #include <pthread.h> |
10 #include <setjmp.h> | 10 #include <setjmp.h> |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
175 stack_top = g_registered_stack + g_registered_stack_size; | 175 stack_top = g_registered_stack + g_registered_stack_size; |
176 assert(g_registered_stack <= &local_var); | 176 assert(g_registered_stack <= &local_var); |
177 assert(&local_var < stack_top); | 177 assert(&local_var < stack_top); |
178 } | 178 } |
179 | 179 |
180 /* Check the exception handler's initial stack pointer more exactly. */ | 180 /* Check the exception handler's initial stack pointer more exactly. */ |
181 uintptr_t frame_base = entry_regs->stack_ptr + kReturnAddrSize; | 181 uintptr_t frame_base = entry_regs->stack_ptr + kReturnAddrSize; |
182 assert(frame_base % STACK_ALIGNMENT == 0); | 182 assert(frame_base % STACK_ALIGNMENT == 0); |
183 char *frame_top = (char *) (frame_base + kArgSizeOnStack + | 183 char *frame_top = (char *) (frame_base + kArgSizeOnStack + |
184 sizeof(struct CombinedContext)); | 184 sizeof(struct CombinedContext)); |
185 /* Check that no more than the stack alignment size is wasted. */ | 185 if (NONSFI_MODE) { |
Mark Seaborn
2014/09/30 20:32:29
As with the previous change, can you only do chang
Junichi Uekawa
2014/10/01 04:17:13
Done.
| |
186 assert(stack_top - STACK_ALIGNMENT < frame_top); | 186 /* |
187 * Non-SFI mode exception stack will have ucontext_t and | |
188 * siginfo_t, which would be anywhere from 400 bytes to 1.5k | |
189 */ | |
190 assert(stack_top - 1500 < frame_top); | |
191 } else { | |
192 /* Check that no more than the stack alignment size is wasted. */ | |
193 assert(stack_top - STACK_ALIGNMENT < frame_top); | |
194 } | |
187 assert(frame_top <= stack_top); | 195 assert(frame_top <= stack_top); |
188 | 196 |
189 #if defined(__x86_64__) | 197 #if defined(__x86_64__) |
190 /* Check that %rsp and %rbp have safe, %r15-extended values. */ | 198 /* Check that %rsp and %rbp have safe, %r15-extended values. */ |
191 assert(entry_regs->stack_ptr >> 32 == entry_regs->r15 >> 32); | 199 assert(entry_regs->stack_ptr >> 32 == entry_regs->r15 >> 32); |
192 assert(entry_regs->rbp >> 32 == entry_regs->r15 >> 32); | 200 assert(entry_regs->rbp >> 32 == entry_regs->r15 >> 32); |
193 #endif | 201 #endif |
194 | 202 |
195 return_from_exception_handler(); | 203 return_from_exception_handler(); |
196 } | 204 } |
197 | 205 |
198 void test_exception_stack_with_size(char *stack, size_t stack_size) { | 206 void test_exception_stack_with_size(char *stack, size_t stack_size) { |
199 if (0 != nacl_exception_set_handler(exception_handler)) { | 207 if (0 != nacl_exception_set_handler(exception_handler)) { |
200 printf("failed to set exception handler\n"); | 208 printf("failed to set exception handler\n"); |
201 exit(4); | 209 exit(4); |
202 } | 210 } |
211 #if !NONSFI_MODE | |
212 /* TODO(uekawa): Implement set_stack for Non-SFI mode. */ | |
203 if (0 != nacl_exception_set_stack(stack, stack_size)) { | 213 if (0 != nacl_exception_set_stack(stack, stack_size)) { |
204 printf("failed to set alt stack\n"); | 214 printf("failed to set alt stack\n"); |
205 exit(5); | 215 exit(5); |
206 } | 216 } |
207 g_registered_stack = stack; | 217 g_registered_stack = stack; |
208 g_registered_stack_size = stack_size; | 218 g_registered_stack_size = stack_size; |
219 #endif | |
209 | 220 |
210 char crash_stack[0x1000]; | 221 char crash_stack[0x1000]; |
211 RegsFillTestValues(&g_regs_at_crash, /* seed= */ 0); | 222 RegsFillTestValues(&g_regs_at_crash, /* seed= */ 0); |
212 g_regs_at_crash.stack_ptr = (uintptr_t) crash_stack + sizeof(crash_stack); | 223 g_regs_at_crash.stack_ptr = (uintptr_t) crash_stack + sizeof(crash_stack); |
213 g_regs_at_crash.prog_ctr = (uintptr_t) prog_ctr_at_crash; | 224 g_regs_at_crash.prog_ctr = (uintptr_t) prog_ctr_at_crash; |
214 RegsApplySandboxConstraints(&g_regs_at_crash); | 225 RegsApplySandboxConstraints(&g_regs_at_crash); |
215 #if defined(__arm__) | 226 #if defined(__arm__) |
216 /* crash_at_known_address clobbers r0. */ | 227 /* crash_at_known_address clobbers r0. */ |
217 g_regs_at_crash.r0 = 0; | 228 g_regs_at_crash.r0 = 0; |
218 #endif | 229 #endif |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
389 | 400 |
390 void run_test(const char *test_name, void (*test_func)(void)) { | 401 void run_test(const char *test_name, void (*test_func)(void)) { |
391 printf("Running %s...\n", test_name); | 402 printf("Running %s...\n", test_name); |
392 test_func(); | 403 test_func(); |
393 } | 404 } |
394 | 405 |
395 #define RUN_TEST(test_func) (run_test(#test_func, test_func)) | 406 #define RUN_TEST(test_func) (run_test(#test_func, test_func)) |
396 | 407 |
397 int TestMain(void) { | 408 int TestMain(void) { |
398 RUN_TEST(test_exceptions_minimally); | 409 RUN_TEST(test_exceptions_minimally); |
399 RUN_TEST(test_exception_stack_alignments); | 410 if (!NONSFI_MODE) { |
400 RUN_TEST(test_getting_previous_handler); | 411 /* TODO(uekawa): Implement set_stack for Non-SFI mode. */ |
401 RUN_TEST(test_invalid_handlers); | 412 RUN_TEST(test_exception_stack_alignments); |
413 /* NACL_SYSCALL not supported on nonsfi mode */ | |
414 RUN_TEST(test_getting_previous_handler); | |
415 /* Those handlers are not invalid in NonSFI NaCl. */ | |
416 RUN_TEST(test_invalid_handlers); | |
417 } | |
402 /* pthread_join() is broken under qemu-arm. */ | 418 /* pthread_join() is broken under qemu-arm. */ |
403 if (getenv("UNDER_QEMU_ARM") == NULL) | 419 if (getenv("UNDER_QEMU_ARM") == NULL) |
404 RUN_TEST(test_exceptions_on_non_main_thread); | 420 RUN_TEST(test_exceptions_on_non_main_thread); |
405 RUN_TEST(test_catching_various_exception_types); | 421 RUN_TEST(test_catching_various_exception_types); |
406 | 422 |
407 #if defined(__i386__) || defined(__x86_64__) | 423 #if defined(__i386__) || defined(__x86_64__) |
408 RUN_TEST(test_get_x86_direction_flag); | 424 RUN_TEST(test_get_x86_direction_flag); |
409 RUN_TEST(test_unsetting_x86_direction_flag); | 425 RUN_TEST(test_unsetting_x86_direction_flag); |
410 #endif | 426 #endif |
411 | 427 |
412 fprintf(stderr, "** intended_exit_status=0\n"); | 428 fprintf(stderr, "** intended_exit_status=0\n"); |
413 return 0; | 429 return 0; |
414 } | 430 } |
415 | 431 |
416 int main(void) { | 432 int main(void) { |
417 return RunTests(TestMain); | 433 return RunTests(TestMain); |
418 } | 434 } |
OLD | NEW |