| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2009, Google Inc. | 2 * Copyright 2009, Google Inc. |
| 3 * All rights reserved. | 3 * All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
| 7 * met: | 7 * met: |
| 8 * | 8 * |
| 9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 EXTERN_C_BEGIN | 72 EXTERN_C_BEGIN |
| 73 | 73 |
| 74 #define NACL_SERVICE_PORT_DESCRIPTOR 3 | 74 #define NACL_SERVICE_PORT_DESCRIPTOR 3 |
| 75 #define NACL_SERVICE_ADDRESS_DESCRIPTOR 4 | 75 #define NACL_SERVICE_ADDRESS_DESCRIPTOR 4 |
| 76 | 76 |
| 77 #define NACL_DEFAULT_ALLOC_MAX (32 << 20) /* total brk and mmap allocs */ | 77 #define NACL_DEFAULT_ALLOC_MAX (32 << 20) /* total brk and mmap allocs */ |
| 78 #define NACL_DEFAULT_STACK_MAX (16 << 20) /* main thread stack */ | 78 #define NACL_DEFAULT_STACK_MAX (16 << 20) /* main thread stack */ |
| 79 | 79 |
| 80 #define NACL_SANDBOX_CHROOT_FD "SBX_D" | 80 #define NACL_SANDBOX_CHROOT_FD "SBX_D" |
| 81 | 81 |
| 82 /* | |
| 83 * Finds the lowest 1 bit in PF_MASKOS. Assumes that at least one | |
| 84 * bit is set, and that this bit is not the highest-order bit. | |
| 85 * | |
| 86 * Let us denote PF_MASKOS by n. Assume n \ne 2^{31}. Let the k^{th} | |
| 87 * bit be the lowest order bit that is set, i.e., | |
| 88 * n = m \cdot 2^{k+1} + 2^k, with k,m integers, m \ge 0, and 0 \le k < 31. | |
| 89 * then (here lhs is C notation, rhs is LaTeX notation): | |
| 90 * n ^ (n-1) = (m \cdot 2^{k+1} + 2^k) | |
| 91 * \oplus (m \dot 2^{k+1} + 2^{k-1} + \ldots + 1) | |
| 92 * = 2^k + 2^{k-1} + \ldots + 1 | |
| 93 * = (2^{k+1}-1) | |
| 94 * so | |
| 95 * ((n ^ (n-1)) + 1U) = 2^{k+1}, (since k < 31, no overflow occurs) and | |
| 96 * ((n ^ (n-1)) + 1U) >> 1 = 2^k. QED. | |
| 97 */ | |
| 98 #define PF_OS_WILL_LOAD (((PF_MASKOS ^ (PF_MASKOS-1)) + 1U) >> 1) | |
| 99 #if PF_MASKOS == (1 << 31) | |
| 100 # error "PF_MASKOS too large, invariant needed for PF_OS_WILL_LOAD violated" | |
| 101 #endif | |
| 102 | |
| 103 #if NACL_WINDOWS | 82 #if NACL_WINDOWS |
| 104 #define WINDOWS_EXCEPTION_TRY do { __try { | 83 #define WINDOWS_EXCEPTION_TRY do { __try { |
| 105 #define WINDOWS_EXCEPTION_CATCH } __except(EXCEPTION_EXECUTE_HANDLER) { \ | 84 #define WINDOWS_EXCEPTION_CATCH } __except(EXCEPTION_EXECUTE_HANDLER) { \ |
| 106 NaClLog(LOG_ERROR, \ | 85 NaClLog(LOG_ERROR, \ |
| 107 "Unhandled Windows exception\n"); \ | 86 "Unhandled Windows exception\n"); \ |
| 108 exit(1); \ | 87 exit(1); \ |
| 109 } \ | 88 } \ |
| 110 } while (0) | 89 } while (0) |
| 111 #else | 90 #else |
| 112 #define WINDOWS_EXCEPTION_TRY do { | 91 #define WINDOWS_EXCEPTION_TRY do { |
| 113 #define WINDOWS_EXCEPTION_CATCH } while (0) | 92 #define WINDOWS_EXCEPTION_CATCH } while (0) |
| 114 #endif | 93 #endif |
| 115 | 94 |
| 116 struct NaClAppThread; | 95 struct NaClAppThread; |
| 117 | 96 |
| 118 struct NaClApp { | 97 struct NaClApp { |
| 119 /* | 98 /* |
| 120 * public, user settable. | 99 * public, user settable. |
| 121 */ | 100 */ |
| 122 uint32_t addr_bits; | 101 uint32_t addr_bits; |
| 123 uint32_t max_data_alloc, stack_size; | 102 uint32_t max_data_alloc; |
| 103 uint32_t stack_size; |
| 124 /* | 104 /* |
| 125 * max_data_alloc controls how much total data memory can be | 105 * max_data_alloc controls how much total data memory can be |
| 126 * allocated to the NaCl process; this is initialized data, | 106 * allocated to the NaCl process; this is initialized data, |
| 127 * uninitialized data, and heap and affects the brk system call. | 107 * uninitialized data, and heap and affects the brk system call. |
| 128 * the text size and rodata size are not included, even though in | 108 * the text size and rodata size are not included, even though in |
| 129 * NaCl the text and rodata pages are also backed by the pager | 109 * NaCl the text and rodata pages are also backed by the pager |
| 130 * since due to relocation the text pages and rodata contents | 110 * since due to relocation the text pages and rodata contents |
| 131 * cannot simply be memory mapped from the executable. | 111 * cannot simply be memory mapped from the executable. |
| 132 * | 112 * |
| 133 * stack_size is the maximum size of the (main) stack. The stack | 113 * stack_size is the maximum size of the (main) stack. The stack |
| 134 * memory is eager allocated (mapped in w/o MAP_NORESERVE) so | 114 * memory is eager allocated (mapped in w/o MAP_NORESERVE) so |
| 135 * there must be enough swap space; page table entries are not | 115 * there must be enough swap space; page table entries are not |
| 136 * populated (no MAP_POPULATE), so actual accesses will likely | 116 * populated (no MAP_POPULATE), so actual accesses will likely |
| 137 * incur page faults. | 117 * incur page faults. |
| 138 */ | 118 */ |
| 139 | 119 |
| 140 /* determined at load time; OS-determined */ | 120 /* determined at load time; OS-determined */ |
| 141 /* read-only */ | 121 /* read-only */ |
| 142 uintptr_t mem_start; | 122 uintptr_t mem_start; |
| 143 | 123 |
| 144 /* only used for ET_EXEC: for CS restriction */ | 124 /* only used for ET_EXEC: for CS restriction */ |
| 145 uint32_t text_region_bytes; /* ro. memsz */ | 125 uint32_t text_region_bytes; /* ro. memsz */ |
| 146 | 126 |
| 147 uintptr_t data_end; | 127 uintptr_t data_end; |
| 148 /* see break_addr below */ | 128 /* see break_addr below */ |
| 149 | 129 |
| 150 Elf32_Addr entry_pt; | 130 uint32_t entry_pt; |
| 151 | 131 |
| 152 /* | 132 /* |
| 153 * Alignment boundary for validation (16 or 32). | 133 * Alignment boundary for validation (16 or 32). |
| 154 */ | 134 */ |
| 155 int align_boundary; | 135 int align_boundary; |
| 156 | 136 |
| 157 /* private */ | |
| 158 Elf32_Ehdr elf_hdr; | |
| 159 | |
| 160 /* | |
| 161 * phdrs and sections are mutually exclusive. | |
| 162 * | |
| 163 * phdrs non-NULL means that an ELF executable -- with starting text | |
| 164 * address of NACL_TRAMPOLINE_END -- is used. sections headers are | |
| 165 * still loaded, for things like bss size. ???? TODO(bsy) | |
| 166 * | |
| 167 * when phdrs is NULL, a relocatable object was used and sections | |
| 168 * will be non-NULL, with the loader performing relocation as part | |
| 169 * of the image load. This is insufficient for C++ since preinit | |
| 170 * and init code is not executed, so global constructors aren't run, | |
| 171 * and multiple section groups for template instantiation are not | |
| 172 * handled properly, among other issues. | |
| 173 */ | |
| 174 Elf32_Phdr *phdrs; /* elf_hdr.e_phnum entries */ | |
| 175 | |
| 176 /* common to both ELF executables and relocatable load images */ | 137 /* common to both ELF executables and relocatable load images */ |
| 177 | 138 |
| 178 uintptr_t springboard_addr; /* relative to mem_start */ | 139 uintptr_t springboard_addr; /* relative to mem_start */ |
| 179 /* | 140 /* |
| 180 * springboard code addr for context switching into app sandbox, relative | 141 * springboard code addr for context switching into app sandbox, relative |
| 181 * to code sandbox CS | 142 * to code sandbox CS |
| 182 */ | 143 */ |
| 183 | 144 |
| 184 /* | 145 /* |
| 185 * The socket at which the app should be accepting connections. The | 146 * The socket at which the app should be accepting connections. The |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 */ | 201 */ |
| 241 struct NaClMutex threads_mu; | 202 struct NaClMutex threads_mu; |
| 242 struct NaClCondVar threads_cv; | 203 struct NaClCondVar threads_cv; |
| 243 struct DynArray threads; /* NaClAppThread pointers */ | 204 struct DynArray threads; /* NaClAppThread pointers */ |
| 244 int num_threads; /* number actually running */ | 205 int num_threads; /* number actually running */ |
| 245 | 206 |
| 246 struct NaClMutex desc_mu; | 207 struct NaClMutex desc_mu; |
| 247 struct DynArray desc_tbl; /* NaClDesc pointers */ | 208 struct DynArray desc_tbl; /* NaClDesc pointers */ |
| 248 }; | 209 }; |
| 249 | 210 |
| 250 #define NACL_MAX_PROGRAM_HEADERS 128 | |
| 251 | |
| 252 enum NaClPhdrCheckAction { | |
| 253 PCA_NONE, | |
| 254 PCA_TEXT_CHECK, | |
| 255 PCA_IGNORE /* ignore this segment. currently used only for PT_PHDR. */ | |
| 256 }; | |
| 257 | |
| 258 struct NaClPhdrChecks { | |
| 259 Elf32_Word p_type; | |
| 260 Elf32_Word p_flags; /* rwx */ | |
| 261 enum NaClPhdrCheckAction action; | |
| 262 int required; /* only for text for now */ | |
| 263 Elf32_Word p_vaddr; /* if non-zero, vaddr must be this */ | |
| 264 }; | |
| 265 | 211 |
| 266 | 212 |
| 267 void NaClAppIncrVerbosity(void); | 213 void NaClAppIncrVerbosity(void); |
| 268 | 214 |
| 269 int NaClAppCtor(struct NaClApp *nap) NACL_WUR; | 215 int NaClAppCtor(struct NaClApp *nap) NACL_WUR; |
| 270 | 216 |
| 271 void NaClAppDtor(struct NaClApp *nap); | 217 void NaClAppDtor(struct NaClApp *nap); |
| 272 | 218 |
| 273 void NaClAppFreeAllMemory(struct NaClApp *nap); | 219 void NaClAppFreeAllMemory(struct NaClApp *nap); |
| 274 | 220 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 288 * detail string and hang that off the nap object, so that more | 234 * detail string and hang that off the nap object, so that more |
| 289 * details are available w/o incrementing verbosity (and polluting | 235 * details are available w/o incrementing verbosity (and polluting |
| 290 * stdout). | 236 * stdout). |
| 291 * | 237 * |
| 292 * note: it may be necessary to flush the icache if the memory | 238 * note: it may be necessary to flush the icache if the memory |
| 293 * allocated for use had already made it into the icache from another | 239 * allocated for use had already made it into the icache from another |
| 294 * NaCl application instance, and the icache does not detect | 240 * NaCl application instance, and the icache does not detect |
| 295 * self-modifying code / data writes and automatically invalidate the | 241 * self-modifying code / data writes and automatically invalidate the |
| 296 * cache lines. | 242 * cache lines. |
| 297 */ | 243 */ |
| 298 | 244 enum NaClAbiCheckOption { |
| 299 | 245 NACL_ABI_CHECK_OPTION_SKIP, |
| 300 enum NaClAbiMismatchOption { | 246 NACL_ABI_CHECK_OPTION_CHECK |
| 301 NACL_ABI_MISMATCH_OPTION_ABORT, | |
| 302 NACL_ABI_MISMATCH_OPTION_IGNORE | |
| 303 }; | 247 }; |
| 304 | 248 |
| 305 NaClErrorCode NaClAppLoadFile(struct Gio *gp, | 249 NaClErrorCode NaClAppLoadFile(struct Gio *gp, |
| 306 struct NaClApp *nap, | 250 struct NaClApp *nap, |
| 307 enum NaClAbiMismatchOption abi_mismatch_option) | 251 enum NaClAbiCheckOption check_abi) |
| 308 NACL_WUR; | 252 NACL_WUR; |
| 309 | 253 |
| 310 size_t NaClAlignPad(size_t val, | 254 size_t NaClAlignPad(size_t val, |
| 311 size_t align); | 255 size_t align); |
| 312 | 256 |
| 313 void NaClAppPrintDetails(struct NaClApp *nap, | 257 void NaClAppPrintDetails(struct NaClApp *nap, |
| 314 struct Gio *gp); | 258 struct Gio *gp); |
| 315 | 259 |
| 316 uint32_t NaClLoad32(uintptr_t addr); | 260 uint32_t NaClLoad32(uintptr_t addr); |
| 317 | 261 |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 513 */ | 457 */ |
| 514 | 458 |
| 515 return addr; | 459 return addr; |
| 516 } | 460 } |
| 517 #else | 461 #else |
| 518 #error Unknown platform! | 462 #error Unknown platform! |
| 519 #endif | 463 #endif |
| 520 | 464 |
| 521 EXTERN_C_END | 465 EXTERN_C_END |
| 522 | 466 |
| 523 #endif | 467 #endif /* NATIVE_CLIENT_SRC_TRUSTED_SERVICE_RUNTIME_SEL_LDR_H__ */ |
| OLD | NEW |