summaryrefslogtreecommitdiff
path: root/na/arch/riscv/include
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-05-03 01:47:15 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-05-03 01:47:15 +0800
commit2b237b24c4db5513f8046e15d24501257e7feeaa (patch)
tree7b5fcbe3e00d30056064801594b899eb3db5c88b /na/arch/riscv/include
parent4b1b9912caf41fa52818e5d84130016ce00888cc (diff)
downloadlume-2b237b24c4db5513f8046e15d24501257e7feeaa.tar.gz
lume-2b237b24c4db5513f8046e15d24501257e7feeaa.tar.xz
feat: implement KASLR support and runtime address mapping for RISC-V architecture
Co-authored-by: Copilot <copilot@github.com>
Diffstat (limited to 'na/arch/riscv/include')
-rw-r--r--na/arch/riscv/include/arch/config.h40
1 files changed, 34 insertions, 6 deletions
diff --git a/na/arch/riscv/include/arch/config.h b/na/arch/riscv/include/arch/config.h
index c407b25..e7b1027 100644
--- a/na/arch/riscv/include/arch/config.h
+++ b/na/arch/riscv/include/arch/config.h
@@ -8,21 +8,49 @@
*
* These constants define the architecture-specific memory layout.
* Each arch/ implementation must provide this header with the same symbols.
+ *
+ * KASLR: At boot, kaslr_init() randomises g_direct_map_base and
+ * g_vmemmap_base. All MI code must read these runtime variables
+ * (via pa_to_va / vmm helpers) rather than the static defaults.
*/
#include <lume/types.h>
namespace arch {
-/* Direct-map virtual base (higher-half base).
- * SV39: top of 39-bit VA space. VA = PA + direct_map_base. */
+/* ================================================================
+ * Default (compile-time) virtual addresses
+ *
+ * SV39 gives a 512GB virtual address space.
+ * Higher-half layout (defaults before KASLR):
+ *
+ * 0xFFFFFFC0_00000000 (256) Direct map (PA+offset)
+ * 0xFFFFFFD0_00000000 (320) Vmemmap (Frame array)
+ *
+ * The 64GB gap between them is the KASLR slide range.
+ * ================================================================ */
inline constexpr uint64 kDirectMapBaseDefault = 0xFFFFFFC000000000ULL;
-extern uint64 g_direct_map_base;
-
-/* Dedicated VA base for the Frame descriptor array (vmemmap). */
-inline constexpr uint64 kVmemmapBase = 0xFFFFFFD000000000ULL;
+inline constexpr uint64 kVmemmapBaseDefault = 0xFFFFFFD000000000ULL;
/* Physical memory base (where RAM starts on RISC-V virt platform) */
inline constexpr uint64 kPhysBase = 0x80000000ULL;
+/* ================================================================
+ * Runtime (post-KASLR) virtual addresses
+ *
+ * These start equal to the defaults above. If CONFIG_KASLR is
+ * enabled, kaslr_init() adds a random, 1GB-aligned offset
+ * to each, sliding both regions upward in VA space.
+ * ================================================================ */
+extern uint64 g_direct_map_base;
+extern uint64 g_vmemmap_base;
+
+/* ================================================================
+ * KASLR entry point
+ *
+ * Must be called AFTER random_early_init() and BEFORE vmm_init().
+ * When CONFIG_KASLR is disabled this is a no-op.
+ * ================================================================ */
+void kaslr_init();
+
} // namespace arch