Signed-off-by: Ralf Ramsauer <ralf.ramsa...@oth-regensburg.de>
---
 hypervisor/arch/riscv/include/asm/paging.h    | 119 ++++++++++++++++--
 .../arch/riscv/include/asm/paging_modes.h     |  18 +++
 hypervisor/include/jailhouse/header.h         |   5 +
 3 files changed, 130 insertions(+), 12 deletions(-)

diff --git a/hypervisor/arch/riscv/include/asm/paging.h 
b/hypervisor/arch/riscv/include/asm/paging.h
index 866f9a3f..5044a5fb 100644
--- a/hypervisor/arch/riscv/include/asm/paging.h
+++ b/hypervisor/arch/riscv/include/asm/paging.h
@@ -4,7 +4,7 @@
  * Copyright (c) Siemens AG, 2020
  *
  * Authors:
- *  Jan Kiszka <jan.kis...@siemens.com>
+ *  Konrad Schwarz <konrad.schw...@siemens.com>
  *
  * This work is licensed under the terms of the GNU GPL, version 2.  See
  * the COPYING file in the top-level directory.
@@ -14,41 +14,136 @@
 #define _JAILHOUSE_ASM_PAGING_H
 
 #include <jailhouse/types.h>
+#include <jailhouse/header.h>
+#include <asm/csr64.h>
 
 #define PAGE_SHIFT             12
 
-#define MAX_PAGE_TABLE_LEVELS  3
+#define RISCV_PAGE_SV_DEPTH    39
+#define RISCV_HV_PAGE_SV_DEPTH 39
 
+/*
+ * SV32 requires 2, SV39 3, SV48 4. Once we support SV57, this should be 5.
+ */
+#define MAX_PAGE_TABLE_LEVELS  4
 #define PAGE_FLAG_FRAMEBUFFER  0
+/* RISC-v does not insert caching/prefetching/... information into page tables.
+ * Instead, this is done via `Physical Memory Attributes'. However, the ISA
+ * does not define a concrete form of PMAs.  E.g., they could be hardcoded by
+ * physical address in a SoC.
+ */
 #define PAGE_FLAG_DEVICE       0
 
-#define PAGE_DEFAULT_FLAGS     0
-#define PAGE_READONLY_FLAGS    0
-#define PAGE_PRESENT_FLAGS     0
+#define RISCV_PAGE_WIDTH       12
+#define RISCV_PTE_SIZE         3
+#define RISCV_PTES_PER_NODE    (RISCV_PAGE_WIDTH - RISCV_PTE_SIZE)
+
+#define RISCV_PTE_V    0
+#define RISCV_PTE_R    1
+#define RISCV_PTE_W    2
+#define RISCV_PTE_X    3
+#define RISCV_PTE_U    4
+#define RISCV_PTE_G    5
+#define RISCV_PTE_A    6
+#define RISCV_PTE_D    7
+#define RISCV_PTE_RSW  8
+#define RISCV_PTE_RSW_w        2
+
+#define RISCV_PTE_FLAG(FLAG)   (1 << RISCV_PTE_ ## FLAG)
+
+#define        PAGE_DEFAULT_FLAGS      (0\
+                               | RISCV_PTE_FLAG (V)\
+                               | RISCV_PTE_FLAG (R)\
+                               | RISCV_PTE_FLAG (W)\
+                               | RISCV_PTE_FLAG (X)\
+                                       )
+#define PAGE_READONLY_FLAGS    (0\
+                               | RISCV_PTE_FLAG (V)\
+                               | RISCV_PTE_FLAG (R)\
+                               )
+#define PAGE_READWRITE_FLAGS   (0\
+                               | RISCV_PTE_FLAG (V)\
+                               | RISCV_PTE_FLAG (R)\
+                               | RISCV_PTE_FLAG (W)\
+                               )
+#define PAGE_PRESENT_FLAGS     (0\
+                               | RISCV_PTE_FLAG (V)\
+                               )
 #define PAGE_NONPRESENT_FLAGS  0
 
-#define INVALID_PHYS_ADDR      (~0UL)
+#define INVALID_PHYS_ADDR      (~0ul)
 
-#define TEMPORARY_MAPPING_BASE 0x0000008000000000UL
+#define TEMPORARY_MAPPING_BASE (~0ul << (RISCV_PAGE_SV_DEPTH - 1))
 #define NUM_TEMPORARY_PAGES    16
 
-#define REMAP_BASE             0xffffff8000000000UL
 #define NUM_REMAP_BITMAP_PAGES 4
+/*
+ * REMAP_BASE hast to be described by the same top-level PTE as JAILHOUSE_BASE,
+ * otherwise it won't be added to non-CPU 0 page tables automatically
+ */
+#define REMAP_BASE\
+       (JAILHOUSE_BASE & ~0ul << (RISCV_HV_PAGE_SV_DEPTH - 9))
 
-#define CELL_ROOT_PT_PAGES     1
+#if REMAP_BASE + (NUM_REMAP_BITMAP_PAGES * 1ul << /*
+                               */   12 /* ld bytes/page
+                               */ +  3 /* ld bits/byte
+                               */ + 12 /* each bit represents a page
+                               */) > JAILHOUSE_BASE
+
+# error Overlap between REMAP area and JAILHOUSE_BASE!
+#endif
+
+#define CELL_ROOT_PT_PAGES     (1 << 2)
+
+#define ATP_MODE_SHIFT         60
+#define ATP_MODE_SV39          0x8
+#define ATP_MODE_SV48          0x9
+#define ATP_MODE_SV57          0xa
 
 #ifndef __ASSEMBLY__
 
-typedef u64 *pt_entry_t;
+#include <jailhouse/string.h>
+
+typedef size_t *pt_entry_t;
 
-static inline void arch_paging_flush_page_tlbs(unsigned long page_addr)
+/* MMU mode for Jailhouse (S-Mode) */
+extern unsigned char hv_atp_mode;
+
+static inline void arch_paging_flush_page_tlbs(size_t page_addr)
 {
+       asm volatile("sfence.vma /* rd, */ zero, %[addr]" :
+                    : [addr] "r" (page_addr));
 }
 
-static inline void arch_paging_flush_cpu_caches(void *addr, long size)
+/*
+ * In RISC-V, the MMU accesses page tables through the caches (the MMU is a
+ * coherent agent)
+ */
+static inline void arch_paging_flush_cpu_caches(void const *addr, size_t size)
 {
 }
 
+#define ENABLE_MMU(NAME, REG)                                          \
+static inline void enable_mmu_##NAME(u8 mode, unsigned long pt)                
\
+{                                                                      \
+       u64 atp;                                                        \
+                                                                       \
+       atp = (u64)mode << ATP_MODE_SHIFT | (u64)pt >> PAGE_SHIFT;      \
+       asm volatile("sfence.vma\n"                                     \
+                    "csrw %0, %1\n"                                    \
+                    "sfence.vma\n"                                     \
+                    : : "i"(REG), "rK"(atp) : "memory");               \
+}
+
+ENABLE_MMU(satp, CSR_SATP)
+ENABLE_MMU(hgatp, CSR_HGATP)
+
+struct paging_structures;
+struct cell;
+
+void riscv_paging_vcpu_init(struct paging_structures *pg_structs);
+int riscv_paging_cell_init(struct cell *const cell);
+
 #endif /* !__ASSEMBLY__ */
 
 #endif /* !_JAILHOUSE_ASM_PAGING_H */
diff --git a/hypervisor/arch/riscv/include/asm/paging_modes.h 
b/hypervisor/arch/riscv/include/asm/paging_modes.h
index e69de29b..b7beb168 100644
--- a/hypervisor/arch/riscv/include/asm/paging_modes.h
+++ b/hypervisor/arch/riscv/include/asm/paging_modes.h
@@ -0,0 +1,18 @@
+/*
+ * Jailhouse, a Linux-based partitioning hypervisor
+ *
+ * Copyright (c) OTH Regensburg, 2022
+ *
+ * Authors:
+ *  Ralf Ramsauer <ralf.ramsa...@oth-regensburg.de>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ */
+
+#include <jailhouse/paging.h>
+
+extern const struct paging riscv_Sv39[];
+extern const struct paging riscv_Sv48[];
+extern const struct paging riscv_Sv39x4[];
+extern const struct paging riscv_Sv48x4[];
diff --git a/hypervisor/include/jailhouse/header.h 
b/hypervisor/include/jailhouse/header.h
index 518bc5cb..c5285262 100644
--- a/hypervisor/include/jailhouse/header.h
+++ b/hypervisor/include/jailhouse/header.h
@@ -10,6 +10,9 @@
  * the COPYING file in the top-level directory.
  */
 
+#ifndef _JAILHOUSE_HEADER_H
+#define _JAILHOUSE_HEADER_H
+
 #include <asm/jailhouse_header.h>
 
 #define JAILHOUSE_SIGNATURE    "JAILHOUS"
@@ -94,3 +97,5 @@ struct jailhouse_header {
 };
 
 #endif /* !__ASSEMBLY__ */
+
+#endif /* _JAILHOUSE_HEADER_H */
-- 
2.36.1

-- 
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to jailhouse-dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jailhouse-dev/20220627132905.4338-17-ralf.ramsauer%40oth-regensburg.de.

Reply via email to