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

Side by Side Diff: tests/exception_test/exception_test.c

Issue 544003002: NonSFI mode: Enable compiling exception_test for NonSFI NaCl on ARM (Closed) Base URL: https://chromium.googlesource.com/native_client/src/native_client.git@master
Patch Set: comments Created 6 years, 3 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
OLDNEW
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 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 longjmp(g_jmp_buf, 1); 115 longjmp(g_jmp_buf, 1);
116 } 116 }
117 117
118 void simple_exception_handler(struct NaClExceptionContext *regs) { 118 void simple_exception_handler(struct NaClExceptionContext *regs) {
119 return_from_exception_handler(); 119 return_from_exception_handler();
120 } 120 }
121 121
122 void exception_handler(struct NaClExceptionContext *context); 122 void exception_handler(struct NaClExceptionContext *context);
123 REGS_SAVER_FUNC_NOPROTO(exception_handler, exception_handler_wrapped); 123 REGS_SAVER_FUNC_NOPROTO(exception_handler, exception_handler_wrapped);
124 124
125 __attribute__((__used__))
Junichi Uekawa 2014/09/09 12:23:58 inline assembly is something external in pexe, so
125 void exception_handler_wrapped(struct NaClSignalContext *entry_regs) { 126 void exception_handler_wrapped(struct NaClSignalContext *entry_regs) {
126 struct NaClExceptionContext *context = 127 struct NaClExceptionContext *context =
127 (struct NaClExceptionContext *) RegsGetArg1(entry_regs); 128 (struct NaClExceptionContext *) RegsGetArg1(entry_regs);
128 struct NaClExceptionPortableContext *portable = 129 struct NaClExceptionPortableContext *portable =
129 nacl_exception_context_get_portable(context); 130 nacl_exception_context_get_portable(context);
130 131
131 printf("handler called\n"); 132 printf("handler called\n");
132 133
133 assert(context->size == (uintptr_t) (portable + 1) - (uintptr_t) context); 134 assert(context->size == (uintptr_t) (portable + 1) - (uintptr_t) context);
134 assert(context->portable_context_size == 135 assert(context->portable_context_size ==
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 #endif 194 #endif
194 195
195 return_from_exception_handler(); 196 return_from_exception_handler();
196 } 197 }
197 198
198 void test_exception_stack_with_size(char *stack, size_t stack_size) { 199 void test_exception_stack_with_size(char *stack, size_t stack_size) {
199 if (0 != nacl_exception_set_handler(exception_handler)) { 200 if (0 != nacl_exception_set_handler(exception_handler)) {
200 printf("failed to set exception handler\n"); 201 printf("failed to set exception handler\n");
201 exit(4); 202 exit(4);
202 } 203 }
203 if (0 != nacl_exception_set_stack(stack, stack_size)) { 204 if (!NONSFI_MODE) {
204 printf("failed to set alt stack\n"); 205 /* TODO(uekawa): Implement set_stack on Non-SFI NaCl. */
205 exit(5); 206 if (0 != nacl_exception_set_stack(stack, stack_size)) {
207 printf("failed to set alt stack\n");
208 exit(5);
209 }
210 g_registered_stack = stack;
211 g_registered_stack_size = stack_size;
206 } 212 }
207 g_registered_stack = stack;
208 g_registered_stack_size = stack_size;
209 213
210 char crash_stack[0x1000]; 214 char crash_stack[0x1000];
211 RegsFillTestValues(&g_regs_at_crash, /* seed= */ 0); 215 RegsFillTestValues(&g_regs_at_crash, /* seed= */ 0);
212 g_regs_at_crash.stack_ptr = (uintptr_t) crash_stack + sizeof(crash_stack); 216 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; 217 g_regs_at_crash.prog_ctr = (uintptr_t) prog_ctr_at_crash;
214 RegsApplySandboxConstraints(&g_regs_at_crash); 218 RegsApplySandboxConstraints(&g_regs_at_crash);
215 #if defined(__arm__) 219 #if defined(__arm__)
216 /* crash_at_known_address clobbers r0. */ 220 /* crash_at_known_address clobbers r0. */
217 g_regs_at_crash.r0 = 0; 221 g_regs_at_crash.r0 = 0;
218 #endif 222 #endif
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 if (!setjmp(g_jmp_buf)) { 323 if (!setjmp(g_jmp_buf)) {
320 __asm__("hlt"); 324 __asm__("hlt");
321 exit(1); 325 exit(1);
322 } 326 }
323 printf("Testing ud2a (an illegal instruction)...\n"); 327 printf("Testing ud2a (an illegal instruction)...\n");
324 if (!setjmp(g_jmp_buf)) { 328 if (!setjmp(g_jmp_buf)) {
325 __asm__("ud2a"); 329 __asm__("ud2a");
326 exit(1); 330 exit(1);
327 } 331 }
328 printf("Testing integer division by zero...\n"); 332 printf("Testing integer division by zero...\n");
333 #if !NONSFI_MODE
334 /* TODO(uekawa): Enable on Non-SFI NaCl. */
329 if (!setjmp(g_jmp_buf)) { 335 if (!setjmp(g_jmp_buf)) {
330 uint32_t result; 336 uint32_t result;
331 __asm__ volatile("idivb %1" 337 __asm__ volatile("idivb %1"
332 : "=a"(result) 338 : "=a"(result)
333 : "r"((uint8_t) 0), "a"((uint16_t) 1)); 339 : "r"((uint8_t) 0), "a"((uint16_t) 1));
334 exit(1); 340 exit(1);
335 } 341 }
336 #endif 342 #endif
343 #endif
337 344
338 /* Clear the jmp_buf to prevent it from being reused accidentally. */ 345 /* Clear the jmp_buf to prevent it from being reused accidentally. */
339 memset(g_jmp_buf, 0, sizeof(g_jmp_buf)); 346 memset(g_jmp_buf, 0, sizeof(g_jmp_buf));
340 } 347 }
341 348
342 349
343 #if defined(__i386__) || defined(__x86_64__) 350 #if !NONSFI_MODE && (defined(__i386__) || defined(__x86_64__))
351 /* TODO(uekawa): Enable on Non-SFI NaCl */
344 352
345 int get_x86_direction_flag(void); 353 int get_x86_direction_flag(void);
346 354
347 void test_get_x86_direction_flag(void) { 355 void test_get_x86_direction_flag(void) {
348 /* 356 /*
349 * Sanity check: Ensure that get_x86_direction_flag() works. We 357 * Sanity check: Ensure that get_x86_direction_flag() works. We
350 * avoid calling assert() with the flag set, because that might not 358 * avoid calling assert() with the flag set, because that might not
351 * work. 359 * work.
352 */ 360 */
353 assert(get_x86_direction_flag() == 0); 361 assert(get_x86_direction_flag() == 0);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 397
390 void run_test(const char *test_name, void (*test_func)(void)) { 398 void run_test(const char *test_name, void (*test_func)(void)) {
391 printf("Running %s...\n", test_name); 399 printf("Running %s...\n", test_name);
392 test_func(); 400 test_func();
393 } 401 }
394 402
395 #define RUN_TEST(test_func) (run_test(#test_func, test_func)) 403 #define RUN_TEST(test_func) (run_test(#test_func, test_func))
396 404
397 int TestMain(void) { 405 int TestMain(void) {
398 RUN_TEST(test_exceptions_minimally); 406 RUN_TEST(test_exceptions_minimally);
399 RUN_TEST(test_exception_stack_alignments); 407 if (!NONSFI_MODE) {
400 RUN_TEST(test_getting_previous_handler); 408 /*
401 RUN_TEST(test_invalid_handlers); 409 * The following tests are for SFI invariants which do not hold
410 * true for Non-SFI mode.
411 */
412 RUN_TEST(test_exception_stack_alignments);
413 RUN_TEST(test_getting_previous_handler);
414 RUN_TEST(test_invalid_handlers);
415 }
402 /* pthread_join() is broken under qemu-arm. */ 416 /* pthread_join() is broken under qemu-arm. */
403 if (getenv("UNDER_QEMU_ARM") == NULL) 417 if (getenv("UNDER_QEMU_ARM") == NULL)
404 RUN_TEST(test_exceptions_on_non_main_thread); 418 RUN_TEST(test_exceptions_on_non_main_thread);
405 RUN_TEST(test_catching_various_exception_types); 419 RUN_TEST(test_catching_various_exception_types);
406 420
407 #if defined(__i386__) || defined(__x86_64__) 421 #if !NONSFI_MODE && (defined(__i386__) || defined(__x86_64__))
422 /* TODO(uekawa): Enable these test for Non-SFI mode too. */
408 RUN_TEST(test_get_x86_direction_flag); 423 RUN_TEST(test_get_x86_direction_flag);
409 RUN_TEST(test_unsetting_x86_direction_flag); 424 RUN_TEST(test_unsetting_x86_direction_flag);
410 #endif 425 #endif
411 426
412 fprintf(stderr, "** intended_exit_status=0\n"); 427 fprintf(stderr, "** intended_exit_status=0\n");
413 return 0; 428 return 0;
414 } 429 }
415 430
416 int main(void) { 431 int main(void) {
417 return RunTests(TestMain); 432 return RunTests(TestMain);
418 } 433 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698