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

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

Issue 269703002: Non-SFI Mode: Add nonsfi_loader and plumbing to test it (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client
Patch Set: Review Created 6 years, 7 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 | Annotate | Revision Log
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"
8
7 #include <assert.h> 9 #include <assert.h>
8 #include <errno.h> 10 #include <errno.h>
9 #include <fcntl.h> 11 #include <fcntl.h>
10 #include <limits.h> 12 #include <limits.h>
11 #include <pthread.h> 13 #include <pthread.h>
12 #include <stdio.h> 14 #include <stdio.h>
13 #include <stdlib.h> 15 #include <stdlib.h>
14 #include <string.h> 16 #include <string.h>
15 #include <sys/mman.h> 17 #include <sys/mman.h>
16 #include <sys/stat.h> 18 #include <sys/stat.h>
(...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after
471 return 0; 473 return 0;
472 } 474 }
473 475
474 static void irt_stub_func(const char *name) { 476 static void irt_stub_func(const char *name) {
475 fprintf(stderr, "Error: Unimplemented IRT function: %s\n", name); 477 fprintf(stderr, "Error: Unimplemented IRT function: %s\n", name);
476 abort(); 478 abort();
477 } 479 }
478 480
479 #define DEFINE_STUB(name) \ 481 #define DEFINE_STUB(name) \
480 static void irt_stub_##name() { irt_stub_func(#name); } 482 static void irt_stub_##name() { irt_stub_func(#name); }
481 #define USE_STUB(s, name) (typeof(s.name)) irt_stub_##name 483 #define USE_STUB(s, name) (__typeof__(s.name)) irt_stub_##name
482 484
483 static const struct nacl_irt_basic irt_basic = { 485 static const struct nacl_irt_basic irt_basic = {
484 irt_exit, 486 irt_exit,
485 irt_gettod, 487 irt_gettod,
486 irt_clock_func, 488 irt_clock_func,
487 irt_nanosleep, 489 irt_nanosleep,
488 irt_sched_yield, 490 irt_sched_yield,
489 irt_sysconf, 491 irt_sysconf,
490 }; 492 };
491 493
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 return size; 603 return size;
602 } 604 }
603 break; 605 break;
604 } 606 }
605 } 607 }
606 fprintf(stderr, "Warning: unavailable IRT interface queried: %s\n", 608 fprintf(stderr, "Warning: unavailable IRT interface queried: %s\n",
607 interface_ident); 609 interface_ident);
608 return 0; 610 return 0;
609 } 611 }
610 612
611 int main(int argc, char **argv, char **environ) { 613 int nacl_irt_nonsfi_entry(int argc, char **argv, char **environ,
614 nacl_entry_func_t entry_func) {
612 /* Find size of environ array. */ 615 /* Find size of environ array. */
613 size_t env_count = 0; 616 size_t env_count = 0;
614 while (environ[env_count] != NULL) 617 while (environ[env_count] != NULL)
615 env_count++; 618 env_count++;
616 619
617 size_t count = 620 size_t count =
618 1 /* cleanup_func pointer */ 621 1 /* cleanup_func pointer */
619 + 2 /* envc and argc counts */ 622 + 2 /* envc and argc counts */
620 + argc + 1 /* argv array, with terminator */ 623 + argc + 1 /* argv array, with terminator */
621 + env_count + 1 /* environ array, with terminator */ 624 + env_count + 1 /* environ array, with terminator */
(...skipping 16 matching lines...) Expand all
638 data[pos++] = (uintptr_t) environ[i]; 641 data[pos++] = (uintptr_t) environ[i];
639 data[pos++] = 0; 642 data[pos++] = 0;
640 /* auxv[0] */ 643 /* auxv[0] */
641 data[pos++] = AT_SYSINFO; 644 data[pos++] = AT_SYSINFO;
642 data[pos++] = (uintptr_t) irt_interface_query; 645 data[pos++] = (uintptr_t) irt_interface_query;
643 /* auxv[1] */ 646 /* auxv[1] */
644 data[pos++] = 0; 647 data[pos++] = 0;
645 data[pos++] = 0; 648 data[pos++] = 0;
646 assert(pos == count); 649 assert(pos == count);
647 650
651 entry_func(data);
652 return 1;
653 }
654
655 #if defined(DEFINE_MAIN)
656 int main(int argc, char **argv, char **environ) {
648 /* 657 /*
649 * On Linux, we rename _start() to _user_start() to avoid a clash 658 * On Linux, we rename _start() to _user_start() to avoid a clash
650 * with the "_start" routine in the host toolchain. On Mac OS X, 659 * with the "_start" routine in the host toolchain. On Mac OS X,
651 * lacking objcopy, doing the symbol renaming is trickier, but also 660 * lacking objcopy, doing the symbol renaming is trickier, but also
652 * unnecessary, because the host toolchain doesn't have a "_start" 661 * unnecessary, because the host toolchain doesn't have a "_start"
653 * routine. 662 * routine.
654 */ 663 */
664 nacl_entry_func_t entry_func =
655 #if defined(__APPLE__) 665 #if defined(__APPLE__)
656 _start(data); 666 _start;
657 #else 667 #else
658 _user_start(data); 668 _user_start;
659 #endif 669 #endif
660 return 1; 670
671 return nacl_irt_nonsfi_entry(argc, argv, environ, entry_func);
661 } 672 }
673 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698