Chromium Code Reviews| Index: src/minsfi/trusted/entry.c |
| diff --git a/src/minsfi/trusted/entry.c b/src/minsfi/trusted/entry.c |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..d78b9bd2ffeccc3d38a8d01a5f08388dbdc31c51 |
| --- /dev/null |
| +++ b/src/minsfi/trusted/entry.c |
| @@ -0,0 +1,61 @@ |
| +/* |
| + * Copyright (c) 2014 The Native Client Authors. All rights reserved. |
| + * Use of this source code is governed by a BSD-style license that can be |
| + * found in the LICENSE file. |
| + */ |
| + |
| +#include "native_client/src/include/minsfi.h" |
| +#include "native_client/src/include/minsfi_priv.h" |
| + |
| +/* |
| + * Fixed offset of the data segment. This must be kept in sync with the |
| + * AllocateDataSegment compiler pass. |
| + */ |
| +#define DATASEG_OFFSET 0x10000 |
| + |
| +/* Globals exported by the sandbox, aka the manifest. */ |
| +extern uint32_t __sfi_pointer_size; |
| +extern const char __sfi_data_segment[]; |
| +extern uint32_t __sfi_data_segment_size; |
| + |
| +/* Entry point of the sandbox */ |
| +extern int _start_minsfi(void); |
| + |
| +/* |
| + * This is the global memory base variable used by the SFI sandboxing. It is |
| + * a 64-bit unsigned integer on both 32-bit and 64-bit platforms. |
| + */ |
| +uint64_t __sfi_memory_base = 0; |
|
jvoung (off chromium)
2014/09/05 00:31:59
Could add some emphasis that this is exported, but
dbrazdil
2014/09/05 19:41:37
Done.
|
| + |
| +static inline void get_manifest(manifest *sb) { |
| + sb->ptr_size = __sfi_pointer_size; |
| + sb->dataseg_offset = DATASEG_OFFSET; |
| + sb->dataseg_size = __sfi_data_segment_size; |
| + sb->dataseg_template = __sfi_data_segment; |
| +} |
| + |
| +int minsfi_exec(void) { |
| + if (__sfi_memory_base == 0) { |
| + char *base; |
| + manifest sb; |
| + |
| + get_manifest(&sb); |
| + base = init_sandbox(&sb); |
| + if (base == NULL) |
| + return EXIT_FAILURE; |
| + |
| + __sfi_memory_base = (uint64_t) ((uintptr_t) base); |
| + } |
| + |
| + return _start_minsfi(); |
| +} |
| + |
| +bool minsfi_destroy(void) { |
| + manifest sb; |
| + |
| + if (__sfi_memory_base == 0) |
| + return true; |
| + |
| + get_manifest(&sb); |
| + return destroy_sandbox((char*) ((uintptr_t) __sfi_memory_base), &sb); |
|
jvoung (off chromium)
2014/09/05 00:31:59
Should this modify __sfi_memory_base back to 0 bef
dbrazdil
2014/09/05 19:41:37
Done. Added tests which check that the base has be
|
| +} |