From 52b6bc9f842793eaefda53c389205161a0765fcf Mon Sep 17 00:00:00 2001 From: Nathaniel Wesley Filardo Date: Wed, 25 Jun 2025 18:00:07 +0000 Subject: [PATCH 1/2] [CHERIoT] ELF/Writer: fix import entry perm mask The loader reserves 8, not 4, bits for permission flags; the linker should agree. --- lld/ELF/Writer.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index bde9c1aa2fd63..2eb54db75027f 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -3196,7 +3196,13 @@ class CompartmentReportWriter { imports.push_back(json::Object{ {"kind", "MMIO"}, {"start", entry.start}, - {"length", entry.length & 0xfffffff}, + /* + * Length and permissions are bit-stuffed into the same 32-bit + * word, with the top 8 bits reserved for permission flags and + * the bottom 24 for length. See CHERIoT-RTOS's + * sdk/core/loader/types.h ReservedPermissionsMask + */ + {"length", entry.length & 0x00ffffff}, {"permits_load", (entry.length & ImportPermitsLoad) != 0}, {"permits_store", (entry.length & ImportPermitsStore) != 0}, {"permits_load_store_capabilities", From a7980d9f5129c2534e1f88553ff9ed60fe20a33e Mon Sep 17 00:00:00 2001 From: Nathaniel Wesley Filardo Date: Wed, 25 Jun 2025 18:00:07 +0000 Subject: [PATCH 2/2] [CHERIoT] ELF/Writer: import entry LoadGlobal flag I'm stealing one of the heretofore unused flags for PermitLoadGlobal. See https://github.com/CHERIoT-Platform/cheriot-rtos/pull/547 --- lld/ELF/Writer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 2eb54db75027f..e46cad6cbf9dd 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -3192,6 +3192,7 @@ class CompartmentReportWriter { static constexpr uint32_t ImportPermitsLoadStoreCapabilities = (1UL << 29); static constexpr uint32_t ImportPermitsLoadMutable = (1UL << 28); + static constexpr uint32_t ImportPermitsLoadGlobal = (1UL << 27); imports.push_back(json::Object{ {"kind", "MMIO"}, @@ -3208,7 +3209,9 @@ class CompartmentReportWriter { {"permits_load_store_capabilities", (entry.length & ImportPermitsLoadStoreCapabilities) != 0}, {"permits_load_mutable", - (entry.length & ImportPermitsLoadMutable) != 0}}); + (entry.length & ImportPermitsLoadMutable) != 0}, + {"permits_load_global", + (entry.length & ImportPermitsLoadGlobal) != 0}}); } continue; }