From 760446deacc8264f584eb58d0cef7b855e720727 Mon Sep 17 00:00:00 2001 From: Don Porter Date: Tue, 25 Oct 2016 22:51:39 -0400 Subject: [PATCH] Address bug report #11, by using 64-bit offsets and lengths internally. Create a regression test to capture this case --- LibOS/buildglibc.py | 2 + LibOS/shim/include/shim_fs.h | 2 +- LibOS/shim/include/shim_handle.h | 2 +- LibOS/shim/include/shim_vma.h | 24 +++--- LibOS/shim/src/bookkeep/shim_vma.c | 84 ++++++++++---------- LibOS/shim/src/fs/chroot/fs.c | 10 ++- LibOS/shim/src/fs/dev/fs.c | 4 +- LibOS/shim/src/shim_parser.c | 2 +- LibOS/shim/src/sys/shim_mmap.c | 2 +- LibOS/shim/test/regression/.gitignore | 1 + LibOS/shim/test/regression/Makefile | 2 + LibOS/shim/test/regression/manifest.template | 2 +- Pal/src/db_streams.c | 8 +- Pal/src/host/Linux-SGX/db_files.c | 4 +- Pal/src/host/Linux-SGX/db_memory.c | 6 +- Pal/src/host/Linux-SGX/db_streams.c | 2 +- Pal/src/host/Linux/db_files.c | 5 +- Pal/src/host/Linux/db_memory.c | 6 +- Pal/src/host/Linux/db_streams.c | 2 +- Pal/src/pal.h | 1 + Pal/src/pal_internal.h | 20 ++--- 21 files changed, 100 insertions(+), 91 deletions(-) diff --git a/LibOS/buildglibc.py b/LibOS/buildglibc.py index 6f8b5240..15079d60 100755 --- a/LibOS/buildglibc.py +++ b/LibOS/buildglibc.py @@ -126,6 +126,8 @@ if not do_install: link_binaries = [ ( 'elf', 'ld-linux-x86-64.so.2' ), ( 'nptl', 'libpthread.so.0' ), + ( '', 'libc.so' ), + ( '', 'libc.so.6' ), ( 'nptl_db','libthread_db.so.1' ), ( 'math', 'libm.so.6' ), ( 'dlfcn', 'libdl.so.2' ), diff --git a/LibOS/shim/include/shim_fs.h b/LibOS/shim/include/shim_fs.h index 1e23d85d..fbe8abb6 100644 --- a/LibOS/shim/include/shim_fs.h +++ b/LibOS/shim/include/shim_fs.h @@ -69,7 +69,7 @@ struct shim_fs_ops { int (*move) (const char * trim_old_name, const char * trim_new_name); int (*copy) (const char * trim_old_name, const char * trim_new_name); - int (*truncate) (struct shim_handle * hdl, int len); + int (*truncate) (struct shim_handle * hdl, uint64_t len); /* hstat: get status of the file */ int (*hstat) (struct shim_handle * hdl, struct stat * buf); diff --git a/LibOS/shim/include/shim_handle.h b/LibOS/shim/include/shim_handle.h index 17331780..1ccf97f0 100644 --- a/LibOS/shim/include/shim_handle.h +++ b/LibOS/shim/include/shim_handle.h @@ -117,7 +117,7 @@ struct shim_dev_ops { /* seek: the content from the file opened as handle */ int (*seek) (struct shim_handle * hdl, off_t offset, int wence); - int (*truncate) (struct shim_handle * hdl, int len); + int (*truncate) (struct shim_handle * hdl, uint64_t len); int (*mode) (const char * name, mode_t * mode); diff --git a/LibOS/shim/include/shim_vma.h b/LibOS/shim/include/shim_vma.h index 50c4c9bc..c0c252f5 100644 --- a/LibOS/shim/include/shim_vma.h +++ b/LibOS/shim/include/shim_vma.h @@ -42,10 +42,10 @@ struct shim_handle; struct shim_vma { REFTYPE ref_count; void * addr; - int length; + uint64_t length; int prot; int flags; - int offset; + uint64_t offset; struct shim_handle * file; struct list_head list; char comment[VMA_COMMENT_LEN]; @@ -89,35 +89,35 @@ static inline PAL_FLG PAL_PROT (int prot, int flags) int init_vma (void); /* Bookkeeping mmap() system call */ -int bkeep_mmap (void * addr, int length, int prot, int flags, - struct shim_handle * file, int offset, const char * comment); +int bkeep_mmap (void * addr, uint64_t length, int prot, int flags, + struct shim_handle * file, uint64_t offset, const char * comment); /* Bookkeeping munmap() system call */ -int bkeep_munmap (void * addr, int length, const int * flags); +int bkeep_munmap (void * addr, uint64_t length, const int * flags); /* Bookkeeping mprotect() system call */ -int bkeep_mprotect (void * addr, int length, int prot, const int * flags); +int bkeep_mprotect (void * addr, uint64_t length, int prot, const int * flags); /* Get vma bookkeeping handle */ void get_vma (struct shim_vma * vma); void put_vma (struct shim_vma * vma); -int lookup_supervma (const void * addr, int len, struct shim_vma ** vma); -int lookup_overlap_vma (const void * addr, int len, struct shim_vma ** vma); +int lookup_supervma (const void * addr, uint64_t len, struct shim_vma ** vma); +int lookup_overlap_vma (const void * addr, uint64_t len, struct shim_vma ** vma); struct shim_vma * next_vma (struct shim_vma * vma); -void * get_unmapped_vma (int len, int flags); -void * get_unmapped_vma_for_cp (int len); +void * get_unmapped_vma (uint64_t len, int flags); +void * get_unmapped_vma_for_cp (uint64_t len); -int dump_all_vmas (struct shim_thread * thread, char * buf, int size); +int dump_all_vmas (struct shim_thread * thread, char * buf, uint64_t size); void unmap_all_vmas (void); /* Debugging */ void debug_print_vma_list (void); -void print_vma_hash (struct shim_vma * vma, void * addr, int len, +void print_vma_hash (struct shim_vma * vma, void * addr, uint64_t len, bool force_protect); /* Constants */ diff --git a/LibOS/shim/src/bookkeep/shim_vma.c b/LibOS/shim/src/bookkeep/shim_vma.c index 1c201513..73364670 100644 --- a/LibOS/shim/src/bookkeep/shim_vma.c +++ b/LibOS/shim/src/bookkeep/shim_vma.c @@ -57,35 +57,35 @@ static LIST_HEAD(vma_list); static LOCKTYPE vma_list_lock; static inline int test_vma_equal (struct shim_vma * tmp, - const void * addr, int length) + const void * addr, uint64_t length) { return tmp->addr == addr && tmp->addr + tmp->length == addr + length; } static inline int test_vma_contain (struct shim_vma * tmp, - const void * addr, int length) + const void * addr, uint64_t length) { return tmp->addr <= addr && tmp->addr + tmp->length >= addr + length; } static inline int test_vma_startin (struct shim_vma * tmp, - const void * addr, int length) + const void * addr, uint64_t length) { return tmp->addr >= addr && tmp->addr < addr + length; } static inline int test_vma_endin (struct shim_vma * tmp, - const void * addr, int length) + const void * addr, uint64_t length) { return tmp->addr + tmp->length > addr && tmp->addr + tmp->length <= addr + length; } static inline int test_vma_overlap (struct shim_vma * tmp, - const void * addr, int length) + const void * addr, uint64_t length) { return test_vma_contain (tmp, addr + 1, 0) || test_vma_contain (tmp, addr + length - 1, 0) || @@ -130,10 +130,10 @@ static inline void assert_vma (void) } } -static struct shim_vma * __lookup_vma (const void * addr, int len); -static struct shim_vma * __lookup_supervma (const void * addr, int length, +static struct shim_vma * __lookup_vma (const void * addr, uint64_t len); +static struct shim_vma * __lookup_supervma (const void * addr, uint64_t length, struct shim_vma ** prev); -static struct shim_vma * __lookup_overlap_vma (const void * addr, int length, +static struct shim_vma * __lookup_overlap_vma (const void * addr, uint64_t length, struct shim_vma ** prev); void get_vma (struct shim_vma * vma) @@ -174,11 +174,11 @@ static void __remove_vma (struct shim_vma * vma) put_vma(vma); } -static int __bkeep_mmap (void * addr, int length, int prot, int flags, - struct shim_handle * file, int offset, +static int __bkeep_mmap (void * addr, uint64_t length, int prot, int flags, + struct shim_handle * file, uint64_t offset, const char * comment); -static int __bkeep_mprotect (void * addr, int length, int prot, +static int __bkeep_mprotect (void * addr, uint64_t length, int prot, const int * flags); static struct shim_vma * get_new_vma (void) @@ -217,7 +217,7 @@ static inline void __set_comment (struct shim_vma * vma, const char * comment) return; } - int len = strlen(comment); + uint64_t len = strlen(comment); if (len > VMA_COMMENT_LEN - 1) len = VMA_COMMENT_LEN - 1; @@ -225,9 +225,9 @@ static inline void __set_comment (struct shim_vma * vma, const char * comment) memcpy(vma->comment, comment, len + 1); } -static int __bkeep_mmap (void * addr, int length, +static int __bkeep_mmap (void * addr, uint64_t length, int prot, int flags, - struct shim_handle * file, int offset, + struct shim_handle * file, uint64_t offset, const char * comment) { struct shim_vma * prev = NULL; @@ -331,8 +331,8 @@ err: return ret; } -int bkeep_mmap (void * addr, int length, int prot, int flags, - struct shim_handle * file, int offset, const char * comment) +int bkeep_mmap (void * addr, uint64_t length, int prot, int flags, + struct shim_handle * file, uint64_t offset, const char * comment) { if (!addr || !length) return -EINVAL; @@ -351,7 +351,7 @@ int bkeep_mmap (void * addr, int length, int prot, int flags, * We need to split the area aur reduce the size * Check the address falls between alread allocated area or not */ -static int __bkeep_munmap (void * addr, int length, const int * flags) +static int __bkeep_munmap (void * addr, uint64_t length, const int * flags) { struct shim_vma * tmp, * n; @@ -423,7 +423,7 @@ static int __bkeep_munmap (void * addr, int length, const int * flags) return 0; } -int bkeep_munmap (void * addr, int length, const int * flags) +int bkeep_munmap (void * addr, uint64_t length, const int * flags) { if (!addr || !length) return -EINVAL; @@ -436,7 +436,7 @@ int bkeep_munmap (void * addr, int length, const int * flags) return ret; } -static int __bkeep_mprotect (void * addr, int length, int prot, +static int __bkeep_mprotect (void * addr, uint64_t length, int prot, const int * flags) { struct shim_vma * tmp = __lookup_vma(addr, length); @@ -469,11 +469,11 @@ static int __bkeep_mprotect (void * addr, int length, int prot, if (!check_vma_flags(tmp, flags)) return -EACCES; - int before_length = addr - tmp->addr; - int after_length = tmp->addr + tmp->length - addr - length; - int after_offset = tmp->file ? tmp->offset + tmp->length - + uint64_t before_length = addr - tmp->addr; + uint64_t after_length = tmp->addr + tmp->length - addr - length; + uint64_t after_offset = tmp->file ? tmp->offset + tmp->length - after_length : 0; - int inside_offset = tmp->file ? tmp->offset + before_length : 0; + uint64_t inside_offset = tmp->file ? tmp->offset + before_length : 0; /* split the handler first, because we might call bkeep_mmap */ tmp->addr = (void *) addr; @@ -519,7 +519,7 @@ static int __bkeep_mprotect (void * addr, int length, int prot, * the mapping if it fails */ - int o_length = length; + uint64_t o_length = length; while (length) { struct shim_vma * candidate = NULL; @@ -529,15 +529,15 @@ static int __bkeep_mprotect (void * addr, int length, int prot, if (!check_vma_flags(tmp, flags)) return -EACCES; - int before_length = addr - tmp->addr; - int after_length = tmp->addr + tmp->length > addr + length ? + uint64_t before_length = addr - tmp->addr; + uint64_t after_length = tmp->addr + tmp->length > addr + length ? tmp->addr + tmp->length - addr - length : 0; - int after_offset = tmp->file ? tmp->offset + tmp->length - + uint64_t after_offset = tmp->file ? tmp->offset + tmp->length - after_length : 0; - int inside_length = tmp->addr + tmp->length > addr + length ? + uint64_t inside_length = tmp->addr + tmp->length > addr + length ? length : addr + length - tmp->addr - tmp->length; - int inside_offset = tmp->file ? tmp->offset + before_length : 0; + uint64_t inside_offset = tmp->file ? tmp->offset + before_length : 0; /* split the handler first, because we might call bkeep_mmap */ tmp->addr = (void *) addr; @@ -600,7 +600,7 @@ static int __bkeep_mprotect (void * addr, int length, int prot, return 0; } -int bkeep_mprotect (void * addr, int length, int prot, const int * flags) +int bkeep_mprotect (void * addr, uint64_t length, int prot, const int * flags) { if (!addr || !length) return -EINVAL; @@ -630,7 +630,7 @@ static void __set_heap_top (void * bottom, void * top) debug("heap top adjusted to %p\n", heap_top); } -void * get_unmapped_vma (int length, int flags) +void * get_unmapped_vma (uint64_t length, int flags) { struct shim_vma * new = get_new_vma(), * prev = NULL; if (!new) @@ -694,7 +694,7 @@ void * get_unmapped_vma (int length, int flags) #define NTRIES 4 -void * get_unmapped_vma_for_cp (int length) +void * get_unmapped_vma_for_cp (uint64_t length) { struct shim_vma * new = get_new_vma(), * prev = NULL; if (!new) @@ -742,7 +742,7 @@ void * get_unmapped_vma_for_cp (int length) /* This might not give the same vma but we might need to split after we find something */ -static struct shim_vma * __lookup_overlap_vma (const void * addr, int length, +static struct shim_vma * __lookup_overlap_vma (const void * addr, uint64_t length, struct shim_vma ** pprev) { struct shim_vma * tmp, * prev = NULL; @@ -767,12 +767,12 @@ static struct shim_vma * __lookup_overlap_vma (const void * addr, int length, return NULL; } -int lookup_overlap_vma (const void * addr, int length, +int lookup_overlap_vma (const void * addr, uint64_t length, struct shim_vma ** vma) { struct shim_vma * tmp = NULL; void * tmp_addr = NULL; - int tmp_length; + uint64_t tmp_length; lock(vma_list_lock); if ((tmp = __lookup_overlap_vma(addr, length, NULL)) && vma) @@ -793,7 +793,7 @@ int lookup_overlap_vma (const void * addr, int length, return tmp ? 0: -ENOENT; } -static struct shim_vma * __lookup_vma (const void * addr, int length) +static struct shim_vma * __lookup_vma (const void * addr, uint64_t length) { struct shim_vma * tmp; struct shim_vma * prev __attribute__((unused)) = NULL; @@ -810,7 +810,7 @@ static struct shim_vma * __lookup_vma (const void * addr, int length) return NULL; } -static struct shim_vma * __lookup_supervma (const void * addr, int length, +static struct shim_vma * __lookup_supervma (const void * addr, uint64_t length, struct shim_vma ** pprev) { struct shim_vma * tmp, * prev = NULL; @@ -835,7 +835,7 @@ static struct shim_vma * __lookup_supervma (const void * addr, int length, return NULL; } -int lookup_supervma (const void * addr, int length, struct shim_vma ** vma) +int lookup_supervma (const void * addr, uint64_t length, struct shim_vma ** vma) { struct shim_vma * tmp = NULL; @@ -922,7 +922,7 @@ unmap: } } -int dump_all_vmas (struct shim_thread * thread, char * buf, int size) +int dump_all_vmas (struct shim_thread * thread, char * buf, uint64_t size) { struct shim_vma * vma; int cnt = 0; @@ -1074,11 +1074,11 @@ BEGIN_CP_FUNC(vma) #endif void * send_addr = vma->addr; - int send_size = vma->length; + uint64_t send_size = vma->length; bool protected = false; if (vma->file) { - int file_len = get_file_size(vma->file); + uint64_t file_len = get_file_size(vma->file); if (file_len >= 0 && vma->offset + vma->length > file_len) send_size = file_len > vma->offset ? @@ -1299,7 +1299,7 @@ void debug_print_vma_list (void) } } -void print_vma_hash (struct shim_vma * vma, void * addr, int len, +void print_vma_hash (struct shim_vma * vma, void * addr, uint64_t len, bool force_protect) { if (!addr) diff --git a/LibOS/shim/src/fs/chroot/fs.c b/LibOS/shim/src/fs/chroot/fs.c index 5280afbd..f3f5757c 100644 --- a/LibOS/shim/src/fs/chroot/fs.c +++ b/LibOS/shim/src/fs/chroot/fs.c @@ -848,9 +848,9 @@ out: return ret; } -static int chroot_truncate (struct shim_handle * hdl, int len) +static int chroot_truncate (struct shim_handle * hdl, uint64_t len) { - int ret = 0; + uint64_t ret = 0; if (NEED_RECREATE(hdl) && (ret = chroot_recreate(hdl)) < 0) return ret; @@ -865,8 +865,12 @@ static int chroot_truncate (struct shim_handle * hdl, int len) atomic_set(&data->size, len); } - if ((ret = DkStreamSetLength(hdl->pal_handle, len)) != len) + if ((ret = DkStreamSetLength(hdl->pal_handle, len)) != len) { goto out; + } + + // DEP 10/25/16: Truncate returns 0 on success, not the length + ret = 0; if (file->marker > len) file->marker = len; diff --git a/LibOS/shim/src/fs/dev/fs.c b/LibOS/shim/src/fs/dev/fs.c index 67b236d1..4a219cff 100644 --- a/LibOS/shim/src/fs/dev/fs.c +++ b/LibOS/shim/src/fs/dev/fs.c @@ -103,7 +103,7 @@ static int dev_null_hstat (struct shim_handle * hdl, struct stat * stat) return 0; } -static int dev_null_truncate (struct shim_handle * hdl, int size) +static int dev_null_truncate (struct shim_handle * hdl, uint64_t size) { return 0; } @@ -308,7 +308,7 @@ static int dev_seek (struct shim_handle * hdl, off_t offset, int wence) return hdl->info.dev.dev_ops.seek(hdl, offset, wence); } -static int dev_truncate (struct shim_handle * hdl, int len) +static int dev_truncate (struct shim_handle * hdl, uint64_t len) { if (!hdl->info.dev.dev_ops.truncate) return -EACCES; diff --git a/LibOS/shim/src/shim_parser.c b/LibOS/shim/src/shim_parser.c index 3fe4d116..e33753dc 100644 --- a/LibOS/shim/src/shim_parser.c +++ b/LibOS/shim/src/shim_parser.c @@ -435,7 +435,7 @@ static inline void parse_pointer_arg (va_list * ap) static inline void parse_integer_arg (va_list * ap) { - VPRINTF("%d", ap); + VPRINTF("%ld", ap); } static inline void parse_syscall_args (va_list * ap) diff --git a/LibOS/shim/src/sys/shim_mmap.c b/LibOS/shim/src/sys/shim_mmap.c index edd29a3b..9fafa471 100644 --- a/LibOS/shim/src/sys/shim_mmap.c +++ b/LibOS/shim/src/sys/shim_mmap.c @@ -97,7 +97,7 @@ void * shim_do_mmap (void * addr, size_t length, int prot, int flags, int fd, goto free_reserved; } - if ((ret = hdl->fs->fs_ops->mmap(hdl, &addr, length, prot, + if ((ret = hdl->fs->fs_ops->mmap(hdl, &addr, length, PAL_PROT(prot, flags), flags, offset)) < 0) { put_handle(hdl); goto free_reserved; diff --git a/LibOS/shim/test/regression/.gitignore b/LibOS/shim/test/regression/.gitignore index b5607e0f..66edba36 100644 --- a/LibOS/shim/test/regression/.gitignore +++ b/LibOS/shim/test/regression/.gitignore @@ -3,3 +3,4 @@ !*.cpp !*.template !Makefile* +!*.py diff --git a/LibOS/shim/test/regression/Makefile b/LibOS/shim/test/regression/Makefile index b48c5e4a..64cb9ca9 100644 --- a/LibOS/shim/test/regression/Makefile +++ b/LibOS/shim/test/regression/Makefile @@ -47,6 +47,8 @@ PYTHONENV="PYTHONPATH=../../../../Scripts" regression: $(target) @echo "\n\nBasic Bootstrapping:" @for f in $(wildcard 00_*.py); do env $(PYTHONENV) python $$f; done + @echo "\n\nLarge File Support:" + @for f in $(wildcard 90_*.py); do env $(PYTHONENV) python $$f; done @echo "\n\n" clean-tmp: diff --git a/LibOS/shim/test/regression/manifest.template b/LibOS/shim/test/regression/manifest.template index 585d5821..6dd26110 100644 --- a/LibOS/shim/test/regression/manifest.template +++ b/LibOS/shim/test/regression/manifest.template @@ -5,7 +5,7 @@ loader.syscall_symbol = syscalldb fs.mount.lib.type = chroot fs.mount.lib.path = /lib -fs.mount.lib.uri = file:../../../build +fs.mount.lib.uri = file:../../../../Runtime fs.mount.bin.type = chroot fs.mount.bin.path = /bin diff --git a/Pal/src/db_streams.c b/Pal/src/db_streams.c index 862a54f4..71e1bcdd 100644 --- a/Pal/src/db_streams.c +++ b/Pal/src/db_streams.c @@ -534,8 +534,8 @@ PAL_NUM DkStreamGetName (PAL_HANDLE handle, PAL_PTR buffer, PAL_NUM size) /* _DkStreamMap for internal use. Map specific handle to certain memory, with given protection, offset and size */ -int _DkStreamMap (PAL_HANDLE handle, void ** paddr, int prot, int offset, - int size) +int _DkStreamMap (PAL_HANDLE handle, void ** paddr, int prot, uint64_t offset, + uint64_t size) { void * addr = *paddr; int ret; @@ -618,7 +618,7 @@ void DkStreamUnmap (PAL_PTR addr, PAL_NUM size) /* _DkStreamSetLength for internal use. This function truncate the stream to certain length. This call might not be support for certain streams */ -int _DkStreamSetLength (PAL_HANDLE handle, int length) +uint64_t _DkStreamSetLength (PAL_HANDLE handle, uint64_t length) { if (UNKNOWN_HANDLE(handle)) return -PAL_ERROR_BADHANDLE; @@ -643,7 +643,7 @@ DkStreamSetLength (PAL_HANDLE handle, PAL_NUM length) LEAVE_PAL_CALL_RETURN(0); } - int ret = _DkStreamSetLength(handle, length); + uint64_t ret = _DkStreamSetLength(handle, length); if (ret < 0) { _DkRaiseFailure(-ret); diff --git a/Pal/src/host/Linux-SGX/db_files.c b/Pal/src/host/Linux-SGX/db_files.c index 8fdf8317..ba5e1d2f 100644 --- a/Pal/src/host/Linux-SGX/db_files.c +++ b/Pal/src/host/Linux-SGX/db_files.c @@ -176,7 +176,7 @@ static int file_delete (PAL_HANDLE handle, int access) /* 'map' operation for file stream. */ static int file_map (PAL_HANDLE handle, void ** addr, int prot, - int offset, int size) + uint64_t offset, uint64_t size) { sgx_checksum_t * stubs = (sgx_checksum_t *) handle->file.stubs; unsigned int total = handle->file.total; @@ -229,7 +229,7 @@ static int file_map (PAL_HANDLE handle, void ** addr, int prot, } /* 'setlength' operation for file stream. */ -static int file_setlength (PAL_HANDLE handle, int length) +static uint64_t file_setlength (PAL_HANDLE handle, uint64_t length) { int ret = ocall_ftruncate(handle->file.fd, length); if (ret < 0) diff --git a/Pal/src/host/Linux-SGX/db_memory.c b/Pal/src/host/Linux-SGX/db_memory.c index c3cb38b0..faedaf82 100644 --- a/Pal/src/host/Linux-SGX/db_memory.c +++ b/Pal/src/host/Linux-SGX/db_memory.c @@ -66,7 +66,7 @@ bool _DkCheckMemoryMappable (const void * addr, int size) return false; } -int _DkVirtualMemoryAlloc (void ** paddr, int size, int alloc_type, int prot) +int _DkVirtualMemoryAlloc (void ** paddr, uint64_t size, int alloc_type, int prot) { void * addr = *paddr, * mem; @@ -102,13 +102,13 @@ int _DkVirtualMemoryAlloc (void ** paddr, int size, int alloc_type, int prot) return 0; } -int _DkVirtualMemoryFree (void * addr, int size) +int _DkVirtualMemoryFree (void * addr, uint64_t size) { free_pages(addr, size); return 0; } -int _DkVirtualMemoryProtect (void * addr, int size, int prot) +int _DkVirtualMemoryProtect (void * addr, uint64_t size, int prot) { return 0; } diff --git a/Pal/src/host/Linux-SGX/db_streams.c b/Pal/src/host/Linux-SGX/db_streams.c index 7638539e..8ae81669 100644 --- a/Pal/src/host/Linux-SGX/db_streams.c +++ b/Pal/src/host/Linux-SGX/db_streams.c @@ -93,7 +93,7 @@ int handle_set_cloexec (PAL_HANDLE handle, bool enable) /* _DkStreamUnmap for internal use. Unmap stream at certain memory address. The memory is unmapped as a whole.*/ -int _DkStreamUnmap (void * addr, int size) +int _DkStreamUnmap (void * addr, uint64_t size) { /* Just let the kernel tell us if the mapping isn't good. */ free_pages(addr, size); diff --git a/Pal/src/host/Linux/db_files.c b/Pal/src/host/Linux/db_files.c index b21b647d..cbe00fbc 100644 --- a/Pal/src/host/Linux/db_files.c +++ b/Pal/src/host/Linux/db_files.c @@ -149,7 +149,7 @@ static int file_delete (PAL_HANDLE handle, int access) /* 'map' operation for file stream. */ static int file_map (PAL_HANDLE handle, void ** addr, int prot, - int offset, int size) + uint64_t offset, uint64_t size) { int fd = handle->file.fd; void * mem = *addr; @@ -158,7 +158,6 @@ static int file_map (PAL_HANDLE handle, void ** addr, int prot, /* The memory will always allocated with flag MAP_PRIVATE and MAP_FILE */ - mem = (void *) ARCH_MMAP(mem, size, prot, flags, fd, offset); if (IS_ERR_P(mem)) @@ -169,7 +168,7 @@ static int file_map (PAL_HANDLE handle, void ** addr, int prot, } /* 'setlength' operation for file stream. */ -static int file_setlength (PAL_HANDLE handle, int length) +static uint64_t file_setlength (PAL_HANDLE handle, uint64_t length) { int ret = INLINE_SYSCALL(ftruncate, 2, handle->file.fd, length); diff --git a/Pal/src/host/Linux/db_memory.c b/Pal/src/host/Linux/db_memory.c index 25ca5511..c98bf97e 100644 --- a/Pal/src/host/Linux/db_memory.c +++ b/Pal/src/host/Linux/db_memory.c @@ -40,7 +40,7 @@ bool _DkCheckMemoryMappable (const void * addr, int size) return (addr < DATA_END && addr + size > TEXT_START); } -int _DkVirtualMemoryAlloc (void ** paddr, int size, int alloc_type, +int _DkVirtualMemoryAlloc (void ** paddr, uint64_t size, int alloc_type, int prot) { void * addr = *paddr, * mem = addr; @@ -59,14 +59,14 @@ int _DkVirtualMemoryAlloc (void ** paddr, int size, int alloc_type, return 0; } -int _DkVirtualMemoryFree (void * addr, int size) +int _DkVirtualMemoryFree (void * addr, uint64_t size) { int ret = INLINE_SYSCALL(munmap, 2, addr, size); return IS_ERR(ret) ? unix_to_pal_error(ERRNO(ret)) : 0; } -int _DkVirtualMemoryProtect (void * addr, int size, int prot) +int _DkVirtualMemoryProtect (void * addr, uint64_t size, int prot) { int ret = INLINE_SYSCALL(mprotect, 3, addr, size, HOST_PROT(prot)); diff --git a/Pal/src/host/Linux/db_streams.c b/Pal/src/host/Linux/db_streams.c index 6b0ab2dd..54db3a1b 100644 --- a/Pal/src/host/Linux/db_streams.c +++ b/Pal/src/host/Linux/db_streams.c @@ -103,7 +103,7 @@ int handle_set_cloexec (PAL_HANDLE handle, bool enable) /* _DkStreamUnmap for internal use. Unmap stream at certain memory address. The memory is unmapped as a whole.*/ -int _DkStreamUnmap (void * addr, int size) +int _DkStreamUnmap (void * addr, uint64_t size) { /* Just let the kernel tell us if the mapping isn't good. */ int ret = INLINE_SYSCALL(munmap, 2, addr, size); diff --git a/Pal/src/pal.h b/Pal/src/pal.h index 7df18183..41f736ef 100644 --- a/Pal/src/pal.h +++ b/Pal/src/pal.h @@ -28,6 +28,7 @@ #include #include +#include typedef unsigned long PAL_NUM; typedef const char * PAL_STR; diff --git a/Pal/src/pal_internal.h b/Pal/src/pal_internal.h index c831b83d..670deeeb 100644 --- a/Pal/src/pal_internal.h +++ b/Pal/src/pal_internal.h @@ -75,12 +75,12 @@ struct handle_ops { /* 'map' and 'unmap' will map or unmap the handle into memory space, it's not necessary mapped by mmap, so unmap also needs 'handle' to deal with special cases */ - int (*map) (PAL_HANDLE handle, void ** address, int prot, int offset, - int size); + int (*map) (PAL_HANDLE handle, void ** address, int prot, uint64_t offset, + uint64_t size); /* 'setlength' is used by DkStreamFlush. It truncate the stream to certain size. */ - int (*setlength) (PAL_HANDLE handle, int length); + uint64_t (*setlength) (PAL_HANDLE handle, uint64_t length); /* 'flush' is used by DkStreamFlush. It syncs the stream to the device */ int (*flush) (PAL_HANDLE handle); @@ -298,10 +298,10 @@ int _DkStreamWrite (PAL_HANDLE handle, int offset, int count, const void * buf, const char * addr, int addrlen); int _DkStreamAttributesQuery (const char * uri, PAL_STREAM_ATTR * attr); int _DkStreamAttributesQuerybyHandle (PAL_HANDLE hdl, PAL_STREAM_ATTR * attr); -int _DkStreamMap (PAL_HANDLE handle, void ** addr, int prot, int offset, - int size); -int _DkStreamUnmap (void * addr, int size); -int _DkStreamSetLength (PAL_HANDLE handle, int length); +int _DkStreamMap (PAL_HANDLE handle, void ** addr, int prot, uint64_t offset, + uint64_t size); +int _DkStreamUnmap (void * addr, uint64_t size); +uint64_t _DkStreamSetLength (PAL_HANDLE handle, uint64_t length); int _DkStreamFlush (PAL_HANDLE handle); int _DkStreamGetName (PAL_HANDLE handle, char * buf, int size); const char * _DkStreamRealpath (PAL_HANDLE hdl); @@ -340,9 +340,9 @@ int _DkEventWait (PAL_HANDLE event); int _DkEventClear (PAL_HANDLE event); /* DkVirtualMemory calls */ -int _DkVirtualMemoryAlloc (void ** paddr, int size, int alloc_type, int prot); -int _DkVirtualMemoryFree (void * addr, int size); -int _DkVirtualMemoryProtect (void * addr, int size, int prot); +int _DkVirtualMemoryAlloc (void ** paddr, uint64_t size, int alloc_type, int prot); +int _DkVirtualMemoryFree (void * addr, uint64_t size); +int _DkVirtualMemoryProtect (void * addr, uint64_t size, int prot); /* DkObject calls */ int _DkObjectReference (PAL_HANDLE objectHandle);