From dec3d6959df1a7a876782f3e233d0320d41a0fad Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 12 May 2025 16:45:51 +0200 Subject: [PATCH 1/2] Update `linux.Map_Flags_Bits` Fixes #5151 - Removes `SHARED_VALIDATE` from the enum and turns it into `Map_Shared_Validate :: Map_Flags{.SHARED, .PRIVATE}` so it has the proper value of 0x03. - Adds `DROPPABLE`. - Adds constants `MAP_HUGE_SHIFT` and `MAP_HUGE_MASK`. - Adds the huge page precomputed constants from `mman.h`, defined as the log2 of the size shifted left by `MAP_HUGE_SHIFT`: Map_Huge_16KB Map_Huge_64KB Map_Huge_512KB Map_Huge_1MB Map_Huge_2MB Map_Huge_8MB Map_Huge_16MB Map_Huge_32MB Map_Huge_256MB Map_Huge_512MB Map_Huge_1GB Map_Huge_2GB Map_Huge_16GB --- core/sys/linux/bits.odin | 8 ++++++-- core/sys/linux/types.odin | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/core/sys/linux/bits.odin b/core/sys/linux/bits.odin index 53660dc8f..88f211427 100644 --- a/core/sys/linux/bits.odin +++ b/core/sys/linux/bits.odin @@ -579,7 +579,7 @@ Inotify_Event_Bits :: enum u32 { /* Bits for Mem_Protection bitfield */ -Mem_Protection_Bits :: enum{ +Mem_Protection_Bits :: enum { READ = 0, WRITE = 1, EXEC = 2, @@ -598,7 +598,7 @@ Mem_Protection_Bits :: enum{ Map_Flags_Bits :: enum { SHARED = 0, PRIVATE = 1, - SHARED_VALIDATE = 2, + DROPPABLE = 3, FIXED = 4, ANONYMOUS = 5, // platform-dependent section start @@ -619,6 +619,10 @@ Map_Flags_Bits :: enum { UNINITIALIZED = 26, } +// Not actually flags, but a shift and mask for when HUGETLB is defined +MAP_HUGE_SHIFT :: 26 +MAP_HUGE_MASK :: 63 + /* Bits for MLock_Flags */ diff --git a/core/sys/linux/types.odin b/core/sys/linux/types.odin index 8f2284f56..66af3395e 100644 --- a/core/sys/linux/types.odin +++ b/core/sys/linux/types.odin @@ -371,6 +371,21 @@ Mem_Protection :: bit_set[Mem_Protection_Bits; i32] */ Map_Flags :: bit_set[Map_Flags_Bits; i32] +Map_Shared_Validate :: Map_Flags{.SHARED, .PRIVATE} +Map_Huge_16KB :: transmute(Map_Flags)(u32(14) << MAP_HUGE_SHIFT) +Map_Huge_64KB :: transmute(Map_Flags)(u32(16) << MAP_HUGE_SHIFT) +Map_Huge_512KB :: transmute(Map_Flags)(u32(19) << MAP_HUGE_SHIFT) +Map_Huge_1MB :: transmute(Map_Flags)(u32(20) << MAP_HUGE_SHIFT) +Map_Huge_2MB :: transmute(Map_Flags)(u32(21) << MAP_HUGE_SHIFT) +Map_Huge_8MB :: transmute(Map_Flags)(u32(23) << MAP_HUGE_SHIFT) +Map_Huge_16MB :: transmute(Map_Flags)(u32(24) << MAP_HUGE_SHIFT) +Map_Huge_32MB :: transmute(Map_Flags)(u32(25) << MAP_HUGE_SHIFT) +Map_Huge_256MB :: transmute(Map_Flags)(u32(28) << MAP_HUGE_SHIFT) +Map_Huge_512MB :: transmute(Map_Flags)(u32(29) << MAP_HUGE_SHIFT) +Map_Huge_1GB :: transmute(Map_Flags)(u32(30) << MAP_HUGE_SHIFT) +Map_Huge_2GB :: transmute(Map_Flags)(u32(31) << MAP_HUGE_SHIFT) +Map_Huge_16GB :: transmute(Map_Flags)(u32(34) << MAP_HUGE_SHIFT) + /* Flags for mlock(2). */ From be24feb862808d729b8b89f24116319deefde632 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 12 May 2025 17:13:59 +0200 Subject: [PATCH 2/2] Move things to constants.odin --- core/sys/linux/bits.odin | 6 ++---- core/sys/linux/constants.odin | 19 +++++++++++++++++++ core/sys/linux/types.odin | 17 ++--------------- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/core/sys/linux/bits.odin b/core/sys/linux/bits.odin index 88f211427..d4edf354b 100644 --- a/core/sys/linux/bits.odin +++ b/core/sys/linux/bits.odin @@ -594,6 +594,8 @@ Mem_Protection_Bits :: enum { /* Bits for Map_Flags + + See `constants.odin` for `MAP_SHARED_VALIDATE` and `MAP_HUGE_16KB`, et al. */ Map_Flags_Bits :: enum { SHARED = 0, @@ -619,10 +621,6 @@ Map_Flags_Bits :: enum { UNINITIALIZED = 26, } -// Not actually flags, but a shift and mask for when HUGETLB is defined -MAP_HUGE_SHIFT :: 26 -MAP_HUGE_MASK :: 63 - /* Bits for MLock_Flags */ diff --git a/core/sys/linux/constants.odin b/core/sys/linux/constants.odin index b3bbcafb3..1010c931a 100644 --- a/core/sys/linux/constants.odin +++ b/core/sys/linux/constants.odin @@ -373,3 +373,22 @@ PTRACE_SECCOMP_GET_FILTER :: PTrace_Seccomp_Get_Filter_Type(.SECCOMP_GET_FIL PTRACE_SECCOMP_GET_METADATA :: PTrace_Seccomp_Get_Metadata_Type(.SECCOMP_GET_METADATA) PTRACE_GET_SYSCALL_INFO :: PTrace_Get_Syscall_Info_Type(.GET_SYSCALL_INFO) PTRACE_GET_RSEQ_CONFIGURATION :: PTrace_Get_RSeq_Configuration_Type(.GET_RSEQ_CONFIGURATION) + +MAP_SHARED_VALIDATE :: Map_Flags{.SHARED, .PRIVATE} + +MAP_HUGE_SHIFT :: 26 +MAP_HUGE_MASK :: 63 + +MAP_HUGE_16KB :: transmute(Map_Flags)(u32(14) << MAP_HUGE_SHIFT) +MAP_HUGE_64KB :: transmute(Map_Flags)(u32(16) << MAP_HUGE_SHIFT) +MAP_HUGE_512KB :: transmute(Map_Flags)(u32(19) << MAP_HUGE_SHIFT) +MAP_HUGE_1MB :: transmute(Map_Flags)(u32(20) << MAP_HUGE_SHIFT) +MAP_HUGE_2MB :: transmute(Map_Flags)(u32(21) << MAP_HUGE_SHIFT) +MAP_HUGE_8MB :: transmute(Map_Flags)(u32(23) << MAP_HUGE_SHIFT) +MAP_HUGE_16MB :: transmute(Map_Flags)(u32(24) << MAP_HUGE_SHIFT) +MAP_HUGE_32MB :: transmute(Map_Flags)(u32(25) << MAP_HUGE_SHIFT) +MAP_HUGE_256MB :: transmute(Map_Flags)(u32(28) << MAP_HUGE_SHIFT) +MAP_HUGE_512MB :: transmute(Map_Flags)(u32(29) << MAP_HUGE_SHIFT) +MAP_HUGE_1GB :: transmute(Map_Flags)(u32(30) << MAP_HUGE_SHIFT) +MAP_HUGE_2GB :: transmute(Map_Flags)(u32(31) << MAP_HUGE_SHIFT) +MAP_HUGE_16GB :: transmute(Map_Flags)(u32(34) << MAP_HUGE_SHIFT) \ No newline at end of file diff --git a/core/sys/linux/types.odin b/core/sys/linux/types.odin index 66af3395e..b5670cf87 100644 --- a/core/sys/linux/types.odin +++ b/core/sys/linux/types.odin @@ -368,24 +368,11 @@ Mem_Protection :: bit_set[Mem_Protection_Bits; i32] /* Flags for mmap. + + See `constants.odin` for `MAP_SHARED_VALIDATE` and `MAP_HUGE_16KB`, et al. */ Map_Flags :: bit_set[Map_Flags_Bits; i32] -Map_Shared_Validate :: Map_Flags{.SHARED, .PRIVATE} -Map_Huge_16KB :: transmute(Map_Flags)(u32(14) << MAP_HUGE_SHIFT) -Map_Huge_64KB :: transmute(Map_Flags)(u32(16) << MAP_HUGE_SHIFT) -Map_Huge_512KB :: transmute(Map_Flags)(u32(19) << MAP_HUGE_SHIFT) -Map_Huge_1MB :: transmute(Map_Flags)(u32(20) << MAP_HUGE_SHIFT) -Map_Huge_2MB :: transmute(Map_Flags)(u32(21) << MAP_HUGE_SHIFT) -Map_Huge_8MB :: transmute(Map_Flags)(u32(23) << MAP_HUGE_SHIFT) -Map_Huge_16MB :: transmute(Map_Flags)(u32(24) << MAP_HUGE_SHIFT) -Map_Huge_32MB :: transmute(Map_Flags)(u32(25) << MAP_HUGE_SHIFT) -Map_Huge_256MB :: transmute(Map_Flags)(u32(28) << MAP_HUGE_SHIFT) -Map_Huge_512MB :: transmute(Map_Flags)(u32(29) << MAP_HUGE_SHIFT) -Map_Huge_1GB :: transmute(Map_Flags)(u32(30) << MAP_HUGE_SHIFT) -Map_Huge_2GB :: transmute(Map_Flags)(u32(31) << MAP_HUGE_SHIFT) -Map_Huge_16GB :: transmute(Map_Flags)(u32(34) << MAP_HUGE_SHIFT) - /* Flags for mlock(2). */