void nacl_irt_init(uint32_t *info) { void (*fini)(void) = nacl_startup_fini(info); char **envp = nacl_startup_envp(info); environ = envp; /* * We are the true entry point, never called by a dynamic linker. * So the finalizer function pointer is always NULL. * We don't bother registering anything with atexit anyway, * since we do not expect our own exit function ever to be called. * Any cleanup we might need done must happen in nacl_irt_exit (irt_basic.c). */ assert(fini == NULL); __pthread_initialize(); __libc_init_array(); /* * SRPC is initialized for use by irt_nameservice.c, which is used * by irt_random.c, and (in Chromium) by irt_manifest.c. */ if (!NaClSrpcModuleInit()) { static const char fatal_msg[] = "NaClSrpcModuleInit() failed\n"; write(2, fatal_msg, sizeof(fatal_msg) - 1); _exit(-1); } NaClLogModuleInit(); /* Enable NaClLog'ing used by CHECK(). */ }
int main(void) { NaClLogModuleInit(); if (NaClOsIsSupported() != 1) return -1; printf("OS is supported\n"); if (NaCl_ThisCPUIsBlacklisted()) return -1; printf("CPU is not blacklisted\n"); TestDEPCheckFailurePath(); if (NaClCheckDEP() != 1) return -1; printf("DEP is either working or not required\n"); if (!CPUIDImplIsValid()) return -1; printf("CPUID implementation looks okay\n"); /* * don't use the white list for now * if (NaCl_CPUIsWhitelisted() == 0) return -1; * printf("CPU is whitelisted\n"); */ printf("platform_qual_test: PASS\n"); return 0; }
int main(const int argc, const char *argv[]) { int nextarg; NaClLogModuleInit(); NaClLogSetVerbosity(LOG_FATAL); if (0 != setvbuf(stdout, g_standard_output_buffer, _IOLBF, sizeof g_standard_output_buffer)) { NaClLog(LOG_FATAL, "vdiff: setvbuf failed\n"); } #if NACL_LINUX || NACL_OSX srandom(time(NULL)); #endif VDiffInitializeAvailableDecoders(); nextarg = ParseArgv(argc, argv); if (nextarg == argc) { if (gPrefix == 0) RunRegressionTests(); TestAllInstructions(); } else { int i; gVerbose = TRUE; for (i = nextarg; i < argc; ++i) { TestOneInstruction(argv[i]); } } PrintStats(); /* exit with non-zero error code if there were errors. */ exit(gVDiffStats.errors != 0); }
int main(int argc, const char *argv[]) { NaClLogModuleInit(); if (argc != 4 || strcmp(argv[2], "-o") != 0) { fprintf(stderr, "Usage: %s <input-file> -o <output-file>\n\n", argv[0]); fprintf(stderr, "This tool rewrites ELF objects to replace instructions that are\n" "rejected by the NaCl validator with safe HLT instructions.\n"); return 1; } FixUpELFFile(argv[1], argv[3]); return 0; }
static int IrtInit(void) { static int initialized = 0; if (initialized) { return 0; } if (!NaClSrpcModuleInit()) { return 1; } NaClLogModuleInit(); /* Enable NaClLog'ing used by CHECK(). */ initialized = 1; return 0; }
int main(int ac, char **av) { struct NaClDescIoDesc *src; struct NaClDescIoDesc *dst; struct NaClGioNaClDesc gsrc; struct NaClGioNaClDesc gdst; int num_errors = 0; if (ac != 3) { Usage(); return -1; } NaClLogModuleInit(); NaClTimeInit(); NaClSecureRngModuleInit(); NaClGlobalSecureRngInit(); src = NaClDescIoDescOpen(av[1], NACL_ABI_O_RDONLY, 0); if (NULL == src) { fprintf(stderr, "could not open %s for read\n", av[1]); Usage(); return -2; } dst = NaClDescIoDescOpen(av[2], NACL_ABI_O_WRONLY| NACL_ABI_O_TRUNC| NACL_ABI_O_CREAT, 0666); if (NULL == dst) { fprintf(stderr, "could not open %s for write\n", av[2]); Usage(); return -3; } if (!NaClGioNaClDescCtor(&gsrc, (struct NaClDesc *) src)) { fprintf(stderr, "NaClGioNaClDescCtor faied for source file\n"); return -4; } if (!NaClGioNaClDescCtor(&gdst, (struct NaClDesc *) dst)) { fprintf(stderr, "NaClGioNaClDescCtor faied for destination file\n"); return -5; } num_errors += GioCopy((struct Gio *) &gsrc, (struct Gio *) &gdst); num_errors += ComparePosixFiles(av[1], av[2]); (*NACL_VTBL(Gio, &gdst)->Close)(&gdst.base); (*NACL_VTBL(Gio, &gdst)->Dtor)(&gdst.base); if (0 < num_errors) { return num_errors; } RemoveFile(av[2]); /* reverse copy; reuse gsrc */ dst = NaClDescIoDescOpen(av[2], NACL_ABI_O_WRONLY| NACL_ABI_O_TRUNC| NACL_ABI_O_CREAT, 0666); if (NULL == dst) { fprintf(stderr, "could not open %s for write\n", av[2]); Usage(); return -6; } if (!NaClGioNaClDescCtor(&gdst, (struct NaClDesc *) dst)) { fprintf(stderr, "NaClGioNaClDescCtor faied for destination file\n"); return -7; } /* * We run GioRevCopy twice because if Seek failed to move the file * pointer but reported the file size correctly, it would still * result in a correct output. By running it twice, the destination * data is just overwritten if the implementation is correct, and if * it isn't, we would end up with a file that is twice the source * file size. */ num_errors += GioRevCopy((struct Gio *) &gsrc, (struct Gio *) &gdst); num_errors += GioRevCopy((struct Gio *) &gsrc, (struct Gio *) &gdst); num_errors += ComparePosixFiles(av[1], av[2]); (*NACL_VTBL(Gio, &gdst)->Close)((struct Gio *) &gdst); (*NACL_VTBL(Gio, &gdst)->Dtor)((struct Gio *) &gdst); (*NACL_VTBL(Gio, &gsrc)->Close)((struct Gio *) &gsrc); (*NACL_VTBL(Gio, &gsrc)->Dtor)((struct Gio *) &gsrc); if (0 < num_errors) { return num_errors; } RemoveFile(av[2]); return num_errors; }
int main(int argc, char* argv[]) { NaClLogModuleInit(); hello_world(); NaClLogModuleFini(); return 0; }
int main(int argc, char **argv) { char *nacl_file; struct GioMemoryFileSnapshot gf; struct NaClApp state; struct NaClAppThread nat, *natp = &nat; int errcode; uint32_t initial_addr; uint32_t addr; struct NaClVmmap *mem_map; char *nacl_verbosity = getenv("NACLVERBOSITY"); if (argc < 2) { printf("No nexe file!\n\nFAIL\n"); } nacl_file = argv[1]; NaClLogModuleInit(); NaClLogSetVerbosity((NULL == nacl_verbosity) ? 0 : strtol(nacl_verbosity, (char **) 0, 0)); errcode = GioMemoryFileSnapshotCtor(&gf, nacl_file); ASSERT_NE(errcode, 0); errcode = NaClAppCtor(&state); ASSERT_NE(errcode, 0); errcode = NaClAppLoadFile((struct Gio *) &gf, &state, NACL_ABI_CHECK_OPTION_CHECK); ASSERT_EQ(errcode, 0); InitThread(&state, natp); /* * Initial mappings: * 0. -- Zero page * 1. rx Static code segment * 2. r Read-only data segment * 3. rw Writable data segment * 4. rw Stack * There is no dynamic code area in this case. */ /* Check the initial mappings. */ mem_map = &state.mem_map; ASSERT_EQ(mem_map->nvalid, 5); CheckLowerMappings(mem_map); /* Allocate range */ addr = NaClSysMmap(natp, 0, 3 * NACL_MAP_PAGESIZE, NACL_ABI_PROT_READ | NACL_ABI_PROT_WRITE, NACL_ABI_MAP_ANONYMOUS | NACL_ABI_MAP_PRIVATE, -1, 0); printf("addr=0x%"NACL_PRIx32"\n", addr); initial_addr = addr; /* * The mappings have changed to become: * 0. -- Zero page * 1. rx Static code segment * 2. r Read-only data segment * 3. rw Writable data segment * 4. rw mmap()'d anonymous, 3 pages (new) * 5. rw Stack */ /* Map to overwrite the start of the previously allocated range */ addr = NaClSysMmap(natp, (void *) (uintptr_t) initial_addr, 2 * NACL_MAP_PAGESIZE, NACL_ABI_PROT_READ | NACL_ABI_PROT_WRITE, NACL_ABI_MAP_ANONYMOUS | NACL_ABI_MAP_PRIVATE | NACL_ABI_MAP_FIXED, -1, 0); printf("addr=0x%"NACL_PRIx32"\n", addr); ASSERT_EQ(addr, initial_addr); /* * The mappings have changed to become: * 0. -- Zero page * 1. rx Static code segment * 2. r Read-only data segment * 3. rw Writable data segment * 4. rw mmap()'d anonymous, 2 pages (new) * 5. rw mmap()'d anonymous, 1 pages (previous) * 6. rw Stack */ /* Allocate new page */ addr = NaClSysMmap(natp, 0, NACL_MAP_PAGESIZE, NACL_ABI_PROT_READ | NACL_ABI_PROT_WRITE, NACL_ABI_MAP_ANONYMOUS | NACL_ABI_MAP_PRIVATE, -1, 0); printf("addr=0x%"NACL_PRIx32"\n", addr); /* * Our allocation strategy is to scan down from stack. This is an * implementation detail and not part of the guaranteed semantics, * but it is good to test that what we expect of our implementation * didn't change. */ ASSERT_EQ_MSG(addr, initial_addr - NACL_MAP_PAGESIZE, "Allocation strategy changed!"); /* * The mappings have changed to become: * 0. -- Zero page * 1. rx Static code segment * 2. r Read-only data segment * 3. rw Writable data segment * 4. rw mmap()'d anonymous, 1 pages (new) * 5. rw mmap()'d anonymous, 2 pages * 6. rw mmap()'d anonymous, 1 pages * 7. rw Stack */ NaClVmmapMakeSorted(mem_map); ASSERT_EQ(mem_map->nvalid, 8); CheckLowerMappings(mem_map); NaClVmmapDebug(mem_map, "After allocations"); /* Skip mappings 0, 1, 2 and 3. */ ASSERT_EQ(mem_map->vmentry[4]->page_num, (initial_addr - NACL_MAP_PAGESIZE) >> NACL_PAGESHIFT); ASSERT_EQ(mem_map->vmentry[4]->npages, NACL_PAGES_PER_MAP); ASSERT_EQ(mem_map->vmentry[5]->page_num, initial_addr >> NACL_PAGESHIFT); ASSERT_EQ(mem_map->vmentry[5]->npages, 2 * NACL_PAGES_PER_MAP); ASSERT_EQ(mem_map->vmentry[6]->page_num, (initial_addr + 2 * NACL_MAP_PAGESIZE) >> NACL_PAGESHIFT); ASSERT_EQ(mem_map->vmentry[6]->npages, NACL_PAGES_PER_MAP); /* * Undo effects of previous mmaps */ errcode = NaClSysMunmap(natp, (void *) (uintptr_t) (initial_addr - NACL_MAP_PAGESIZE), NACL_MAP_PAGESIZE * 4); ASSERT_EQ(errcode, 0); /* * Mappings return to being: * 0. -- Zero page * 1. rx Static code segment * 2. r Read-only data segment * 3. rw Writable data segment * 4. rw Stack */ ASSERT_EQ(mem_map->nvalid, 5); CheckLowerMappings(mem_map); /* Allocate range */ addr = NaClSysMmap(natp, 0, 9 * NACL_MAP_PAGESIZE, NACL_ABI_PROT_READ | NACL_ABI_PROT_WRITE, NACL_ABI_MAP_ANONYMOUS | NACL_ABI_MAP_PRIVATE, -1, 0); printf("addr=0x%"NACL_PRIx32"\n", addr); initial_addr = addr; /* * The mappings have changed to become: * 0. -- Zero page * 1. rx Static code segment * 2. r Read-only data segment * 3. rw Writable data segment * 4. rw mmap()'d anonymous, 9 pages (new) * 5. rw Stack */ /* Map into middle of previously allocated range */ addr = NaClSysMmap(natp, (void *) (uintptr_t) (initial_addr + 2 * NACL_MAP_PAGESIZE), 3 * NACL_MAP_PAGESIZE, NACL_ABI_PROT_READ | NACL_ABI_PROT_WRITE, NACL_ABI_MAP_ANONYMOUS | NACL_ABI_MAP_PRIVATE | NACL_ABI_MAP_FIXED, -1, 0); printf("addr=0x%"NACL_PRIx32"\n", addr); ASSERT_EQ(addr, initial_addr + NACL_MAP_PAGESIZE * 2); /* * The mappings have changed to become: * 0. -- Zero page * 1. rx Static code segment * 2. r Read-only data segment * 3. rw Writable data segment * 4. rw mmap()'d anonymous, 2 pages (previous) * 5. rw mmap()'d anonymous, 3 pages (new) * 6. rw mmap()'d anonymous, 4 pages (previous) * 7. rw Stack */ NaClVmmapMakeSorted(mem_map); ASSERT_EQ(mem_map->nvalid, 8); CheckLowerMappings(mem_map); ASSERT_EQ(mem_map->vmentry[4]->page_num, initial_addr >> NACL_PAGESHIFT); ASSERT_EQ(mem_map->vmentry[4]->npages, 2 * NACL_PAGES_PER_MAP); ASSERT_EQ(mem_map->vmentry[5]->page_num, (initial_addr + 2 * NACL_MAP_PAGESIZE) >> NACL_PAGESHIFT); ASSERT_EQ(mem_map->vmentry[5]->npages, 3 * NACL_PAGES_PER_MAP); ASSERT_EQ(mem_map->vmentry[6]->page_num, (initial_addr + 5 * NACL_MAP_PAGESIZE) >> NACL_PAGESHIFT); ASSERT_EQ(mem_map->vmentry[6]->npages, 4 * NACL_PAGES_PER_MAP); /* * Undo effects of previous mmaps */ errcode = NaClSysMunmap(natp, (void *) (uintptr_t) initial_addr, 9 * NACL_MAP_PAGESIZE); ASSERT_EQ(errcode, 0); ASSERT_EQ(mem_map->nvalid, 5); CheckLowerMappings(mem_map); /* * Mappings return to being: * 0. -- Zero page * 1. rx Static code segment * 2. r Read-only data segment * 3. rw Writable data segment * 4. rw Stack */ /* * Check use of hint. */ addr = NaClSysMmap(natp, (void *) (uintptr_t) initial_addr, NACL_MAP_PAGESIZE, NACL_ABI_PROT_READ | NACL_ABI_PROT_WRITE, NACL_ABI_MAP_ANONYMOUS | NACL_ABI_MAP_PRIVATE, -1, 0); ASSERT_LE(addr, 0xffff0000u); printf("addr=0x%"NACL_PRIx32"\n", addr); ASSERT_LE_MSG(initial_addr, addr, "returned address not at or above hint"); errcode = NaClSysMunmap(natp, (void *) (uintptr_t) addr, NACL_MAP_PAGESIZE); ASSERT_EQ(errcode, 0); /* Check handling of zero-sized mappings. */ addr = NaClSysMmap(natp, 0, 0, NACL_ABI_PROT_READ | NACL_ABI_PROT_WRITE, NACL_ABI_MAP_ANONYMOUS | NACL_ABI_MAP_PRIVATE, -1, 0); ASSERT_EQ((int) addr, -NACL_ABI_EINVAL); errcode = NaClSysMunmap(natp, (void *) (uintptr_t) initial_addr, 0); ASSERT_EQ(errcode, -NACL_ABI_EINVAL); printf("PASS\n"); return 0; }