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

Side by Side Diff: src/nonsfi/irt/irt_interfaces.c

Issue 1212613002: Non-SFI mode: Add Linux asynchronous signal support (Closed) Base URL: https://chromium.googlesource.com/native_client/src/native_client.git@master
Patch Set: Created 5 years, 6 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) 2013 The Native Client Authors. All rights reserved. 2 * Copyright (c) 2013 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 "native_client/src/nonsfi/irt/irt_interfaces.h" 7 #include "native_client/src/nonsfi/irt/irt_interfaces.h"
8 8
9 #include <assert.h> 9 #include <assert.h>
10 #include <errno.h> 10 #include <errno.h>
11 #include <fcntl.h> 11 #include <fcntl.h>
12 #include <limits.h> 12 #include <limits.h>
13 #include <pthread.h> 13 #include <pthread.h>
14 #include <stdio.h> 14 #include <stdio.h>
15 #include <stdlib.h> 15 #include <stdlib.h>
16 #include <string.h> 16 #include <string.h>
17 #include <sys/mman.h> 17 #include <sys/mman.h>
18 #include <sys/stat.h> 18 #include <sys/stat.h>
19 #include <unistd.h> 19 #include <unistd.h>
20 20
21 #if defined(__linux__) 21 #if defined(__linux__)
22 # include <linux/futex.h> 22 # include <linux/futex.h>
23 # include <sys/syscall.h> 23 # include <sys/syscall.h>
24 #endif 24 #endif
25 25
26 #include "native_client/src/include/elf32.h" 26 #include "native_client/src/include/elf32.h"
27 #include "native_client/src/include/elf_auxv.h" 27 #include "native_client/src/include/elf_auxv.h"
28 #include "native_client/src/include/nacl/nacl_exception.h" 28 #include "native_client/src/include/nacl/nacl_exception.h"
29 #include "native_client/src/include/nacl/nacl_signal.h"
29 #include "native_client/src/include/nacl_macros.h" 30 #include "native_client/src/include/nacl_macros.h"
30 #include "native_client/src/public/irt_core.h" 31 #include "native_client/src/public/irt_core.h"
31 #include "native_client/src/public/nonsfi/irt_exception_handling.h" 32 #include "native_client/src/public/nonsfi/irt_signal_handling.h"
32 #include "native_client/src/trusted/service_runtime/include/machine/_types.h" 33 #include "native_client/src/trusted/service_runtime/include/machine/_types.h"
33 #include "native_client/src/trusted/service_runtime/include/sys/mman.h" 34 #include "native_client/src/trusted/service_runtime/include/sys/mman.h"
34 #include "native_client/src/trusted/service_runtime/include/sys/stat.h" 35 #include "native_client/src/trusted/service_runtime/include/sys/stat.h"
35 #include "native_client/src/trusted/service_runtime/include/sys/time.h" 36 #include "native_client/src/trusted/service_runtime/include/sys/time.h"
36 #include "native_client/src/trusted/service_runtime/include/sys/unistd.h" 37 #include "native_client/src/trusted/service_runtime/include/sys/unistd.h"
37 #include "native_client/src/untrusted/irt/irt.h" 38 #include "native_client/src/untrusted/irt/irt.h"
38 #include "native_client/src/untrusted/irt/irt_dev.h" 39 #include "native_client/src/untrusted/irt/irt_dev.h"
39 #include "native_client/src/untrusted/irt/irt_interfaces.h" 40 #include "native_client/src/untrusted/irt/irt_interfaces.h"
40 #include "native_client/src/untrusted/nacl/nacl_random.h" 41 #include "native_client/src/untrusted/nacl/nacl_random.h"
42 #include "native_client/src/untrusted/pthread/pthread_types.h"
Mark Seaborn 2015/06/26 18:31:59 Not used? irt_interfaces.c shouldn't depend on sr
Luis Héctor Chávez 2015/07/06 23:44:59 Removed.
41 43
42 #if defined(__native_client__) && defined(__arm__) 44 #if defined(__native_client__) && defined(__arm__)
43 #include "native_client/src/nonsfi/irt/irt_icache.h" 45 #include "native_client/src/nonsfi/irt/irt_icache.h"
44 #endif 46 #endif
45 47
46 /* 48 /*
47 * This is an implementation of NaCl's IRT interfaces that runs 49 * This is an implementation of NaCl's IRT interfaces that runs
48 * outside of the NaCl sandbox. 50 * outside of the NaCl sandbox.
49 * 51 *
50 * This allows PNaCl to be used as a portability layer without the 52 * This allows PNaCl to be used as a portability layer without the
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 348
347 static void *start_thread(void *arg) { 349 static void *start_thread(void *arg) {
348 struct thread_args args = *(struct thread_args *) arg; 350 struct thread_args args = *(struct thread_args *) arg;
349 free(arg); 351 free(arg);
350 g_tls_value = args.thread_ptr; 352 g_tls_value = args.thread_ptr;
351 args.start_func(); 353 args.start_func();
352 abort(); 354 abort();
353 } 355 }
354 356
355 static int thread_create(void (*start_func)(void), void *stack, 357 static int thread_create(void (*start_func)(void), void *stack,
356 void *thread_ptr) { 358 void *thread_ptr, nacl_irt_tid_t *child_tid) {
357 /* 359 /*
358 * For now, we ignore the stack that user code provides and just use 360 * For now, we ignore the stack that user code provides and just use
359 * the stack that the host libpthread allocates. 361 * the stack that the host libpthread allocates.
360 */ 362 */
361 pthread_attr_t attr; 363 pthread_attr_t attr;
362 int error = pthread_attr_init(&attr); 364 int error = pthread_attr_init(&attr);
363 if (error != 0) 365 if (error != 0)
364 return error; 366 return error;
365 error = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 367 error = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
366 if (error != 0) 368 if (error != 0)
367 return error; 369 return error;
368 struct thread_args *args = malloc(sizeof(struct thread_args)); 370 struct thread_args *args = malloc(sizeof(struct thread_args));
369 if (args == NULL) { 371 if (args == NULL) {
370 error = ENOMEM; 372 error = ENOMEM;
371 goto cleanup; 373 goto cleanup;
372 } 374 }
373 args->start_func = start_func; 375 args->start_func = start_func;
374 args->thread_ptr = thread_ptr; 376 args->thread_ptr = thread_ptr;
375 pthread_t tid; 377 pthread_t tid;
376 error = pthread_create(&tid, &attr, start_thread, args); 378 error = pthread_create(&tid, &attr, start_thread, args);
377 if (error != 0) 379 if (error != 0) {
378 free(args); 380 free(args);
381 } else if (child_tid != NULL) {
382 *child_tid = tid->native_tid;
Mark Seaborn 2015/06/26 18:31:59 This creates an unfortunate dependency on libpthre
Luis Héctor Chávez 2015/07/06 23:44:59 Split that off into https://codereview.chromium.or
383 }
379 cleanup: 384 cleanup:
380 pthread_attr_destroy(&attr); 385 pthread_attr_destroy(&attr);
381 return error; 386 return error;
382 } 387 }
383 388
389 static int thread_create_v0_1(void (*start_func)(void), void *stack,
390 void *thread_ptr) {
391 return thread_create(start_func, stack, thread_ptr, NULL);
392 }
393
384 static void thread_exit(int32_t *stack_flag) { 394 static void thread_exit(int32_t *stack_flag) {
385 *stack_flag = 0; /* Indicate that the user code's stack can be freed. */ 395 *stack_flag = 0; /* Indicate that the user code's stack can be freed. */
386 pthread_exit(NULL); 396 pthread_exit(NULL);
387 } 397 }
388 398
389 static int thread_nice(const int nice) { 399 static int thread_nice(const int nice) {
390 return 0; 400 return 0;
391 } 401 }
392 402
393 /* 403 /*
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
578 irt_munmap, 588 irt_munmap,
579 irt_mprotect, 589 irt_mprotect,
580 }; 590 };
581 591
582 const struct nacl_irt_tls nacl_irt_tls = { 592 const struct nacl_irt_tls nacl_irt_tls = {
583 tls_init, 593 tls_init,
584 tls_get, 594 tls_get,
585 }; 595 };
586 596
587 const struct nacl_irt_thread nacl_irt_thread = { 597 const struct nacl_irt_thread nacl_irt_thread = {
598 thread_create_v0_1,
599 thread_exit,
600 thread_nice,
601 };
602
603 const struct nacl_irt_thread_v0_2 nacl_irt_thread_v0_2 = {
588 thread_create, 604 thread_create,
589 thread_exit, 605 thread_exit,
590 thread_nice, 606 thread_nice,
591 }; 607 };
592 608
593 #if defined(__linux__) 609 #if defined(__linux__)
594 const struct nacl_irt_futex nacl_irt_futex = { 610 const struct nacl_irt_futex nacl_irt_futex = {
595 futex_wait_abs, 611 futex_wait_abs,
596 futex_wake, 612 futex_wake,
597 }; 613 };
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 * The following condition is true when building for Non-SFI Mode, 659 * The following condition is true when building for Non-SFI Mode,
644 * when we're calling Linux syscalls directly. (Counter-intuitively, 660 * when we're calling Linux syscalls directly. (Counter-intuitively,
645 * "__linux__" is not #defined in this case.) 661 * "__linux__" is not #defined in this case.)
646 */ 662 */
647 #if defined(__native_client__) 663 #if defined(__native_client__)
648 const struct nacl_irt_exception_handling nacl_irt_exception_handling = { 664 const struct nacl_irt_exception_handling nacl_irt_exception_handling = {
649 nacl_exception_get_and_set_handler, 665 nacl_exception_get_and_set_handler,
650 nacl_exception_set_stack, 666 nacl_exception_set_stack,
651 nacl_exception_clear_flag, 667 nacl_exception_clear_flag,
652 }; 668 };
669
670 const struct nacl_irt_signal_handling nacl_irt_signal_handling = {
671 nacl_signal_set_handler,
672 nacl_signal_send_async_signal,
673 };
653 #endif 674 #endif
654 675
655 #if defined(__native_client__) && defined(__arm__) 676 #if defined(__native_client__) && defined(__arm__)
656 const struct nacl_irt_icache nacl_irt_icache = { 677 const struct nacl_irt_icache nacl_irt_icache = {
657 irt_clear_cache, 678 irt_clear_cache,
658 }; 679 };
659 #endif 680 #endif
660 681
661 static int g_allow_dev_interfaces = 0; 682 static int g_allow_dev_interfaces = 0;
662 683
663 void nacl_irt_nonsfi_allow_dev_interfaces() { 684 void nacl_irt_nonsfi_allow_dev_interfaces() {
664 g_allow_dev_interfaces = 1; 685 g_allow_dev_interfaces = 1;
665 } 686 }
666 687
667 static int irt_dev_filter(void) { 688 static int irt_dev_filter(void) {
668 return g_allow_dev_interfaces; 689 return g_allow_dev_interfaces;
669 } 690 }
670 691
671 static const struct nacl_irt_interface irt_interfaces[] = { 692 static const struct nacl_irt_interface irt_interfaces[] = {
672 { NACL_IRT_BASIC_v0_1, &nacl_irt_basic, sizeof(nacl_irt_basic), NULL }, 693 { NACL_IRT_BASIC_v0_1, &nacl_irt_basic, sizeof(nacl_irt_basic), NULL },
673 { NACL_IRT_FDIO_v0_1, &nacl_irt_fdio, sizeof(nacl_irt_fdio), NULL }, 694 { NACL_IRT_FDIO_v0_1, &nacl_irt_fdio, sizeof(nacl_irt_fdio), NULL },
674 { NACL_IRT_MEMORY_v0_3, &nacl_irt_memory, sizeof(nacl_irt_memory), NULL }, 695 { NACL_IRT_MEMORY_v0_3, &nacl_irt_memory, sizeof(nacl_irt_memory), NULL },
675 { NACL_IRT_TLS_v0_1, &nacl_irt_tls, sizeof(nacl_irt_tls), NULL }, 696 { NACL_IRT_TLS_v0_1, &nacl_irt_tls, sizeof(nacl_irt_tls), NULL },
676 { NACL_IRT_THREAD_v0_1, &nacl_irt_thread, sizeof(nacl_irt_thread), NULL }, 697 { NACL_IRT_THREAD_v0_1, &nacl_irt_thread, sizeof(nacl_irt_thread), NULL },
698 { NACL_IRT_THREAD_v0_2, &nacl_irt_thread_v0_2,
699 sizeof(nacl_irt_thread_v0_2), NULL },
677 { NACL_IRT_FUTEX_v0_1, &nacl_irt_futex, sizeof(nacl_irt_futex), NULL }, 700 { NACL_IRT_FUTEX_v0_1, &nacl_irt_futex, sizeof(nacl_irt_futex), NULL },
678 { NACL_IRT_RANDOM_v0_1, &nacl_irt_random, sizeof(nacl_irt_random), NULL }, 701 { NACL_IRT_RANDOM_v0_1, &nacl_irt_random, sizeof(nacl_irt_random), NULL },
679 #if defined(__linux__) || defined(__native_client__) 702 #if defined(__linux__) || defined(__native_client__)
680 { NACL_IRT_CLOCK_v0_1, &nacl_irt_clock, sizeof(nacl_irt_clock), NULL }, 703 { NACL_IRT_CLOCK_v0_1, &nacl_irt_clock, sizeof(nacl_irt_clock), NULL },
681 #endif 704 #endif
682 { NACL_IRT_DEV_FILENAME_v0_3, &nacl_irt_dev_filename, 705 { NACL_IRT_DEV_FILENAME_v0_3, &nacl_irt_dev_filename,
683 sizeof(nacl_irt_dev_filename), irt_dev_filter }, 706 sizeof(nacl_irt_dev_filename), irt_dev_filter },
684 { NACL_IRT_DEV_GETPID_v0_1, &nacl_irt_dev_getpid, 707 { NACL_IRT_DEV_GETPID_v0_1, &nacl_irt_dev_getpid,
685 sizeof(nacl_irt_dev_getpid), irt_dev_filter }, 708 sizeof(nacl_irt_dev_getpid), irt_dev_filter },
686 #if defined(__native_client__) 709 #if defined(__native_client__)
687 { NACL_IRT_EXCEPTION_HANDLING_v0_1, &nacl_irt_exception_handling, 710 { NACL_IRT_EXCEPTION_HANDLING_v0_1, &nacl_irt_exception_handling,
688 sizeof(nacl_irt_exception_handling), NULL }, 711 sizeof(nacl_irt_exception_handling), NULL },
712 { NACL_IRT_SIGNAL_HANDLING_v0_1, &nacl_irt_signal_handling,
713 sizeof(nacl_irt_signal_handling), NULL },
689 #endif 714 #endif
690 #if defined(__native_client__) && defined(__arm__) 715 #if defined(__native_client__) && defined(__arm__)
691 { NACL_IRT_ICACHE_v0_1, &nacl_irt_icache, sizeof(nacl_irt_icache), NULL }, 716 { NACL_IRT_ICACHE_v0_1, &nacl_irt_icache, sizeof(nacl_irt_icache), NULL },
692 #endif 717 #endif
693 }; 718 };
694 719
695 size_t nacl_irt_query_core(const char *interface_ident, 720 size_t nacl_irt_query_core(const char *interface_ident,
696 void *table, size_t tablesize) { 721 void *table, size_t tablesize) {
697 return nacl_irt_query_list(interface_ident, table, tablesize, 722 return nacl_irt_query_list(interface_ident, table, tablesize,
698 irt_interfaces, sizeof(irt_interfaces)); 723 irt_interfaces, sizeof(irt_interfaces));
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
753 nacl_entry_func_t entry_func = 778 nacl_entry_func_t entry_func =
754 #if defined(__APPLE__) 779 #if defined(__APPLE__)
755 _start; 780 _start;
756 #else 781 #else
757 _user_start; 782 _user_start;
758 #endif 783 #endif
759 784
760 return nacl_irt_nonsfi_entry(argc, argv, environ, entry_func); 785 return nacl_irt_nonsfi_entry(argc, argv, environ, entry_func);
761 } 786 }
762 #endif 787 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698