Skip to content

Commit 2ede531

Browse files
committed
[CHERIoT] ELF/Writer: import entry permissions
The loader was reserving 8, not 4, bits for permission flags, and I'm stealing one of the heretofore unused ones for PermitLoadGlobal.
1 parent b136f35 commit 2ede531

File tree

1 file changed

+11
-2
lines changed

1 file changed

+11
-2
lines changed

lld/ELF/Writer.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3192,17 +3192,26 @@ class CompartmentReportWriter {
31923192
static constexpr uint32_t ImportPermitsLoadStoreCapabilities =
31933193
(1UL << 29);
31943194
static constexpr uint32_t ImportPermitsLoadMutable = (1UL << 28);
3195+
static constexpr uint32_t ImportPermitsLoadGlobal = (1UL << 27);
31953196

31963197
imports.push_back(json::Object{
31973198
{"kind", "MMIO"},
31983199
{"start", entry.start},
3199-
{"length", entry.length & 0xfffffff},
3200+
/*
3201+
* Length and permissions are bit-stuffed into the same 32-bit
3202+
* word, with the top 8 bits reserved for permission flags and
3203+
* the bottom 24 for length. See CHERIoT-RTOS's
3204+
* sdk/core/loader/types.h ReservedPermissionsMask
3205+
*/
3206+
{"length", entry.length & 0x00ffffff},
32003207
{"permits_load", (entry.length & ImportPermitsLoad) != 0},
32013208
{"permits_store", (entry.length & ImportPermitsStore) != 0},
32023209
{"permits_load_store_capabilities",
32033210
(entry.length & ImportPermitsLoadStoreCapabilities) != 0},
32043211
{"permits_load_mutable",
3205-
(entry.length & ImportPermitsLoadMutable) != 0}});
3212+
(entry.length & ImportPermitsLoadMutable) != 0},
3213+
{"permits_load_global",
3214+
(entry.length & ImportPermitsLoadGlobal) != 0}});
32063215
}
32073216
continue;
32083217
}

0 commit comments

Comments
 (0)