From 1d1c3ca928451c22fcd5959d6296a40863e6f21b Mon Sep 17 00:00:00 2001 From: Abdelrahman Date: Sat, 5 Oct 2024 23:05:32 +0100 Subject: [PATCH] Split the platform specific mem_utils implementations --- src/common/mem_utils/mem_utils.c | 80 ++------------------ src/common/mem_utils/mem_utils.h | 44 ++--------- src/common/mem_utils/mem_utils_ops.h | 26 +++++++ src/common/mem_utils/posix/mem_utils_posix.c | 33 ++++++++ src/common/mem_utils/posix/mem_utils_posix.h | 33 ++++++++ src/common/mem_utils/win/mem_utils_win.c | 30 ++++++++ src/common/mem_utils/win/mem_utils_win.h | 27 +++++++ src/common/misc/misc_utils.h | 3 +- 8 files changed, 163 insertions(+), 113 deletions(-) create mode 100644 src/common/mem_utils/mem_utils_ops.h create mode 100644 src/common/mem_utils/posix/mem_utils_posix.c create mode 100644 src/common/mem_utils/posix/mem_utils_posix.h create mode 100644 src/common/mem_utils/win/mem_utils_win.c create mode 100644 src/common/mem_utils/win/mem_utils_win.h diff --git a/src/common/mem_utils/mem_utils.c b/src/common/mem_utils/mem_utils.c index af62a6a..4c0edb9 100644 --- a/src/common/mem_utils/mem_utils.c +++ b/src/common/mem_utils/mem_utils.c @@ -1,4 +1,5 @@ #include "mem_utils.h" +#include "mem_utils_ops.h" #include "aliases.h" #include "platform.h" #include @@ -7,35 +8,9 @@ #include #if defined(WAPP_PLATFORM_WINDOWS) -#define WIN32_LEAN_AND_MEAN -#include -#include - -internal const i32 access_types[] = { - [WAPP_MEM_ACCESS_NONE] = PAGE_NOACCESS, - [WAPP_MEM_ACCESS_READ_ONLY] = PAGE_READONLY, - [WAPP_MEM_ACCESS_EXEC_ONLY] = PAGE_EXECUTE, - [WAPP_MEM_ACCESS_READ_WRITE] = PAGE_READWRITE, - [WAPP_MEM_ACCESS_READ_EXEC] = PAGE_EXECUTE_READ, - [WAPP_MEM_ACCESS_READ_WRITE_EXEC] = PAGE_EXECUTE_READWRITE, -}; - -internal inline void *alloc_windows(void *addr, u64 size, MemAccess access, - MemAllocFlags flags); +#include "mem_utils_win.h" #elif defined(WAPP_PLATFORM_POSIX) -#include - -internal const i32 access_types[] = { - [WAPP_MEM_ACCESS_NONE] = PROT_NONE, - [WAPP_MEM_ACCESS_READ_ONLY] = PROT_READ, - [WAPP_MEM_ACCESS_EXEC_ONLY] = PROT_EXEC, - [WAPP_MEM_ACCESS_READ_WRITE] = PROT_READ | PROT_WRITE, - [WAPP_MEM_ACCESS_READ_EXEC] = PROT_READ | PROT_EXEC, - [WAPP_MEM_ACCESS_READ_WRITE_EXEC] = PROT_READ | PROT_WRITE | PROT_EXEC, -}; - -internal inline void *alloc_posix(void *addr, u64 size, MemAccess access, - MemAllocFlags flags); +#include "mem_utils_posix.h" #else #error "Unrecognised platform" #endif @@ -63,53 +38,10 @@ void *wapp_mem_util_align_forward(void *ptr, u64 alignment) { return (void *)p; } -void *wapp_mem_util_alloc(void *addr, u64 size, MemAccess access, - MemAllocFlags flags, MemInitType type) { -#if defined(WAPP_PLATFORM_WINDOWS) - // Ensure memory is committed if it's meant to be initialised - if (type == WAPP_MEM_INIT_INITIALISED) { - flags |= WAPP_MEM_ALLOC_COMMIT; - } - - void *output = alloc_windows(addr, size, access, flags); -#elif defined(WAPP_PLATFORM_POSIX) - void *output = alloc_posix(addr, size, access, flags); -#else -#error "Unrecognised platform" -#endif - - if (type == WAPP_MEM_INIT_INITIALISED) { - memset(output, 0, size); - } - - return output; +void *wapp_mem_util_alloc(void *addr, u64 size, MemAccess access, MemAllocFlags flags, MemInitType type) { + return mem_util_allocate(addr, size, access, flags); } void wapp_mem_util_free(void *ptr, u64 size) { -#if defined(WAPP_PLATFORM_WINDOWS) - VirtualFree(ptr, size, MEM_RELEASE); -#elif defined(WAPP_PLATFORM_POSIX) - munmap(ptr, size); -#endif + mem_util_free(ptr, size); } - -#ifdef WAPP_PLATFORM_WINDOWS -internal inline void *alloc_windows(void *addr, u64 size, MemAccess access, - MemAllocFlags flags) { - return VirtualAlloc(addr, (SIZE_T)size, flags, access_types[access]); -} -#endif - -#if defined(WAPP_PLATFORM_POSIX) -internal inline void *alloc_posix(void *addr, u64 size, MemAccess access, - MemAllocFlags flags) { - i32 alloc_flags = flags | MAP_ANON | MAP_PRIVATE; - -#if defined(WAPP_PLATFORM_LINUX) || defined(WAPP_PLATFORM_GNU) || \ - defined(WAPP_PLATFORM_NET_BSD) - alloc_flags |= MAP_NORESERVE; -#endif - - return mmap(addr, size, access_types[access], alloc_flags, -1, 0); -} -#endif diff --git a/src/common/mem_utils/mem_utils.h b/src/common/mem_utils/mem_utils.h index 048bb85..5da1cd6 100644 --- a/src/common/mem_utils/mem_utils.h +++ b/src/common/mem_utils/mem_utils.h @@ -3,13 +3,12 @@ #include "aliases.h" #include "platform.h" +#include "mem_utils_ops.h" #if defined(WAPP_PLATFORM_WINDOWS) -#define WIN32_LEAN_AND_MEAN -#include -#include +#include "mem_utils_win.h" #elif defined(WAPP_PLATFORM_POSIX) -#include +#include "mem_utils_posix.h" #else #error "Unrecognised platform" #endif @@ -18,42 +17,13 @@ BEGIN_C_LINKAGE #endif // __cplusplus -typedef enum mem_access { - WAPP_MEM_ACCESS_NONE, - WAPP_MEM_ACCESS_READ_ONLY, - WAPP_MEM_ACCESS_EXEC_ONLY, - WAPP_MEM_ACCESS_READ_WRITE, - WAPP_MEM_ACCESS_READ_EXEC, - WAPP_MEM_ACCESS_READ_WRITE_EXEC, -} MemAccess; - -typedef enum mem_alloc_flags { -#if defined(WAPP_PLATFORM_WINDOWS) - WAPP_MEM_ALLOC_RESERVE = MEM_RESERVE, - WAPP_MEM_ALLOC_COMMIT = MEM_COMMIT, -#elif defined(WAPP_PLATFORM_LINUX) || defined(WAPP_PLATFORM_GNU) - WAPP_MEM_ALLOC_RESERVE = 0, - WAPP_MEM_ALLOC_COMMIT = MAP_POPULATE, -#elif defined(WAPP_PLATFORM_FREE_BSD) - WAPP_MEM_ALLOC_RESERVE = 0, - WAPP_MEM_ALLOC_COMMIT = MAP_PREFAULT_READ, -#elif defined(WAPP_PLATFORM_BSD) || defined(WAPP_PLATFORM_UNIX) || \ - defined(WAPP_PLATFORM_APPLE) - WAPP_MEM_ALLOC_RESERVE = 0, - WAPP_MEM_ALLOC_COMMIT = 0, -#endif -} MemAllocFlags; - -typedef enum mem_init_type { - WAPP_MEM_INIT_UNINITIALISED, - WAPP_MEM_INIT_INITIALISED, -} MemInitType; - void *wapp_mem_util_align_forward(void *ptr, u64 alignment); -void *wapp_mem_util_alloc(void *addr, u64 size, MemAccess access, - MemAllocFlags flags, MemInitType type); +void *wapp_mem_util_alloc(void *addr, u64 size, MemAccess access, MemAllocFlags flags, MemInitType type); void wapp_mem_util_free(void *ptr, u64 size); +external void *mem_util_allocate(void *addr, u64 size, MemAccess access, MemAllocFlags flags); +external void mem_util_free(void *ptr, u64 size); + #ifdef __cplusplus END_C_LINKAGE #endif // __cplusplus diff --git a/src/common/mem_utils/mem_utils_ops.h b/src/common/mem_utils/mem_utils_ops.h new file mode 100644 index 0000000..26beecf --- /dev/null +++ b/src/common/mem_utils/mem_utils_ops.h @@ -0,0 +1,26 @@ +#ifndef MEM_UTILS_OPS_H +#define MEM_UTILS_OPS_H + +#ifdef __cplusplus +BEGIN_C_LINKAGE +#endif // __cplusplus + +typedef enum mem_access { + WAPP_MEM_ACCESS_NONE, + WAPP_MEM_ACCESS_READ_ONLY, + WAPP_MEM_ACCESS_EXEC_ONLY, + WAPP_MEM_ACCESS_READ_WRITE, + WAPP_MEM_ACCESS_READ_EXEC, + WAPP_MEM_ACCESS_READ_WRITE_EXEC, +} MemAccess; + +typedef enum mem_init_type { + WAPP_MEM_INIT_UNINITIALISED, + WAPP_MEM_INIT_INITIALISED, +} MemInitType; + +#ifdef __cplusplus +END_C_LINKAGE +#endif // __cplusplus + +#endif // !MEM_UTILS_OPS_H diff --git a/src/common/mem_utils/posix/mem_utils_posix.c b/src/common/mem_utils/posix/mem_utils_posix.c new file mode 100644 index 0000000..56c3d30 --- /dev/null +++ b/src/common/mem_utils/posix/mem_utils_posix.c @@ -0,0 +1,33 @@ +#include "aliases.h" +#include "platform.h" + +#ifdef WAPP_PLATFORM_POSIX + +#include "mem_utils_ops.h" +#include "mem_utils_posix.h" +#include + +internal const i32 access_types[] = { + [WAPP_MEM_ACCESS_NONE] = PROT_NONE, + [WAPP_MEM_ACCESS_READ_ONLY] = PROT_READ, + [WAPP_MEM_ACCESS_EXEC_ONLY] = PROT_EXEC, + [WAPP_MEM_ACCESS_READ_WRITE] = PROT_READ | PROT_WRITE, + [WAPP_MEM_ACCESS_READ_EXEC] = PROT_READ | PROT_EXEC, + [WAPP_MEM_ACCESS_READ_WRITE_EXEC] = PROT_READ | PROT_WRITE | PROT_EXEC, +}; + +void *mem_util_allocate(void *addr, u64 size, MemAccess access, MemAllocFlags flags) { + i32 alloc_flags = flags | MAP_ANON | MAP_PRIVATE; + +#if defined(WAPP_PLATFORM_LINUX) || defined(WAPP_PLATFORM_GNU) || defined(WAPP_PLATFORM_NET_BSD) + alloc_flags |= MAP_NORESERVE; +#endif + + return mmap(addr, size, access_types[access], alloc_flags, -1, 0); +} + +void mem_util_free(void *ptr, u64 size) { + munmap(ptr, size); +} + +#endif // !WAPP_PLATFORM_POSIX diff --git a/src/common/mem_utils/posix/mem_utils_posix.h b/src/common/mem_utils/posix/mem_utils_posix.h new file mode 100644 index 0000000..737e74f --- /dev/null +++ b/src/common/mem_utils/posix/mem_utils_posix.h @@ -0,0 +1,33 @@ +#ifndef MEM_UTILS_POSIX_H +#define MEM_UTILS_POSIX_H + +#include "platform.h" + +#ifdef __cplusplus +BEGIN_C_LINKAGE +#endif // !__cplusplus + +#ifdef WAPP_PLATFORM_POSIX + +#include + +typedef enum mem_alloc_flags { +#if defined(WAPP_PLATFORM_LINUX) || defined(WAPP_PLATFORM_GNU) + WAPP_MEM_ALLOC_RESERVE = 0, + WAPP_MEM_ALLOC_COMMIT = MAP_POPULATE, +#elif defined(WAPP_PLATFORM_FREE_BSD) + WAPP_MEM_ALLOC_RESERVE = 0, + WAPP_MEM_ALLOC_COMMIT = MAP_PREFAULT_READ, +#elif defined(WAPP_PLATFORM_BSD) || defined(WAPP_PLATFORM_UNIX) || defined(WAPP_PLATFORM_APPLE) + WAPP_MEM_ALLOC_RESERVE = 0, + WAPP_MEM_ALLOC_COMMIT = 0, +#endif +} MemAllocFlags; + +#endif // !WAPP_PLATFORM_POSIX + +#ifdef __cplusplus +END_C_LINKAGE +#endif // !__cplusplus + +#endif // !MEM_UTILS_POSIX_H diff --git a/src/common/mem_utils/win/mem_utils_win.c b/src/common/mem_utils/win/mem_utils_win.c new file mode 100644 index 0000000..9c4c30f --- /dev/null +++ b/src/common/mem_utils/win/mem_utils_win.c @@ -0,0 +1,30 @@ +#include "aliases.h" +#include "platform.h" + +#ifdef WAPP_PLATFORM_WINDOWS + +#include "mem_utils_ops.h" +#include "mem_utils_win.h" + +#define WIN32_LEAN_AND_MEAN +#include +#include + +internal const i32 access_types[] = { + [WAPP_MEM_ACCESS_NONE] = PAGE_NOACCESS, + [WAPP_MEM_ACCESS_READ_ONLY] = PAGE_READONLY, + [WAPP_MEM_ACCESS_EXEC_ONLY] = PAGE_EXECUTE, + [WAPP_MEM_ACCESS_READ_WRITE] = PAGE_READWRITE, + [WAPP_MEM_ACCESS_READ_EXEC] = PAGE_EXECUTE_READ, + [WAPP_MEM_ACCESS_READ_WRITE_EXEC] = PAGE_EXECUTE_READWRITE, +}; + +void *mem_util_allocate(void *addr, u64 size, MemAccess access, MemAllocFlags flags) { + return VirtualAlloc(addr, (SIZE_T)size, flags, access_types[access]); +} + +void mem_util_free(void *ptr, u64 size) { + VirtualFree(ptr, size, MEM_RELEASE); +} + +#endif // !WAPP_PLATFORM_WINDOWS diff --git a/src/common/mem_utils/win/mem_utils_win.h b/src/common/mem_utils/win/mem_utils_win.h new file mode 100644 index 0000000..f2b5718 --- /dev/null +++ b/src/common/mem_utils/win/mem_utils_win.h @@ -0,0 +1,27 @@ +#ifndef MEM_UTILS_WIN_H +#define MEM_UTILS_WIN_H + +#include "platform.h" + +#ifdef __cplusplus +BEGIN_C_LINKAGE +#endif // !__cplusplus + +#ifdef WAPP_PLATFORM_WINDOWS + +#define WIN32_LEAN_AND_MEAN +#include +#include + +typedef enum mem_alloc_flags { + WAPP_MEM_ALLOC_RESERVE = MEM_RESERVE, + WAPP_MEM_ALLOC_COMMIT = MEM_COMMIT, +} MemAllocFlags; + +#endif // !WAPP_PLATFORM_WINDOWS + +#ifdef __cplusplus +END_C_LINKAGE +#endif // !__cplusplus + +#endif // !MEM_UTILS_WIN_H diff --git a/src/common/misc/misc_utils.h b/src/common/misc/misc_utils.h index e26ae2c..660f608 100644 --- a/src/common/misc/misc_utils.h +++ b/src/common/misc/misc_utils.h @@ -8,7 +8,6 @@ #define GB(SIZE) (MB(SIZE) * 1024) #define TB(SIZE) (GB(SIZE) * 1024) -#define wapp_misc_utils_padding_size(SIZE) \ - u8 reserved_padding[sizeof(void *) - ((SIZE) % sizeof(void *))] +#define wapp_misc_utils_padding_size(SIZE) u8 reserved_padding[sizeof(void *) - ((SIZE) % sizeof(void *))] #endif // !MISC_UTILS_H