aboutsummaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2021-10-11 23:18:47 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2021-10-11 23:18:47 +0300
commit7237d673904d8568a2f9c290a0247c9d1a07c5d2 (patch)
tree7deabe2dc64ddf05016eb3e3a4f22a7e252b5c35 /arch
parentebd34a9ab3809167e16e4107c8e72d1d81faff9c (diff)
downloadkmi-7237d673904d8568a2f9c290a0247c9d1a07c5d2.tar.gz
kmi-7237d673904d8568a2f9c290a0247c9d1a07c5d2.zip
Start designing vmem framework
Diffstat (limited to 'arch')
-rw-r--r--arch/riscv/common/vmem.c30
-rw-r--r--arch/riscv/config.h14
-rw-r--r--arch/riscv/include/csr.h7
-rw-r--r--arch/riscv/include/vmem.h8
-rw-r--r--arch/riscv/init/init.c55
-rw-r--r--arch/riscv/kernel/main.c4
6 files changed, 89 insertions, 29 deletions
diff --git a/arch/riscv/common/vmem.c b/arch/riscv/common/vmem.c
index ef89ec3..207df34 100644
--- a/arch/riscv/common/vmem.c
+++ b/arch/riscv/common/vmem.c
@@ -1,7 +1,7 @@
#include <apos/string.h>
#include <apos/pmem.h>
+#include <apos/vmem.h>
#include <pages.h>
-#include <vmem.h>
#define pte_ppn(pte) (((pm_t)(pte)) >> 10)
#define pte_flags(pte) (((pm_t)(pte)) & 0xff)
@@ -13,7 +13,7 @@ void map_vmem(struct vm_branch_t *branch,
pm_t paddr, vm_t vaddr,
uint8_t flags, enum mm_order_t order)
{
- enum mm_order_t top = MAX_ORDER;
+ enum mm_order_t top = __mm_max_order;
while(top != order){
size_t idx = pm_to_index(vaddr, top);
@@ -45,3 +45,29 @@ void unmap_vmem(struct vm_branch_t *branch,
branch->leaf[idx] = 0;
}
+
+vm_t map_vregion(struct vm_branch_t *branch, pm_t base, pm_t top, vm_t start, vm_t end)
+{
+ /* TODO: figure out how to find first suitable memory region */
+
+ /* find first free page, iterate forward until we either fit the whole
+ * physical region or hit a used page
+ *
+ * continue until we hit end?
+ */
+}
+
+void unmap_vregion(struct vm_branch_t *branch, pm_t base, pm_t top)
+{
+ /* TODO */
+}
+
+vm_t map_vsize(struct vm_branch_t *branch, size_t size)
+{
+ /* TODO */
+}
+
+void unmap_vsize(struct vm_branch_t *branch, size_t size)
+{
+ /* TODO */
+}
diff --git a/arch/riscv/config.h b/arch/riscv/config.h
index f223ee7..75c898f 100644
--- a/arch/riscv/config.h
+++ b/arch/riscv/config.h
@@ -1,12 +1,12 @@
#include <apos/sizes.h>
+
+/* --- START ARCH USER CONFIG VALUES --- */
+/* physical address to which the kernel will be loaded */
#define PM_KERN 0x83800000
+/* --- END ARCH USER CONFIG VALUES --- */
+
+/* don't touch >:( */
+
#define PM_STACK_BASE (PM_KERN + SZ_2M)
#define PM_STACK_TOP (PM_STACK_BASE + SZ_2M - 2)
#define VM_KERN (-SZ_1G)
-
-#define MAX_ORDER 3
-#define PAGE_SHIFT 12
-#define O0_WIDTH 9
-#define O1_WIDTH 9
-#define O2_WIDTH 9
-#define O3_WIDTH 9
diff --git a/arch/riscv/include/csr.h b/arch/riscv/include/csr.h
index 5da0882..ab25bdd 100644
--- a/arch/riscv/include/csr.h
+++ b/arch/riscv/include/csr.h
@@ -1,8 +1,11 @@
#ifndef APOS_CSR_H
#define APOS_CSR_H
-#define SATP_MODE_39 0x8000000000000000
-#define SATP_MODE_48 0x9000000000000000
+#include <apos/utils.h>
+
+#define SATP_MODE_Sv32 0x80000000
+#define SATP_MODE_Sv39 0x8000000000000000
+#define SATP_MODE_Sv48 0x9000000000000000
#define CSR_SATP 0x180
diff --git a/arch/riscv/include/vmem.h b/arch/riscv/include/vmem.h
index 0aad780..ec2a3ba 100644
--- a/arch/riscv/include/vmem.h
+++ b/arch/riscv/include/vmem.h
@@ -1,7 +1,6 @@
#ifndef APOS_RISCV_VMAP_H
#define APOS_RISCV_VMAP_H
-#include <apos/sizes.h>
#include <apos/types.h>
#include <apos/attrs.h>
@@ -19,11 +18,4 @@ struct __packed vm_branch_t {
struct vm_branch_t *leaf[512];
};
-void map_vmem(struct vm_branch_t *branch,
- pm_t paddr, vm_t vaddr,
- uint8_t flags, enum mm_order_t order);
-
-void unmap_vmem(struct vm_branch_t *branch, vm_t vaddr, enum mm_order_t order);
-
-
#endif /* APOS_RISCV_VMAP_H */
diff --git a/arch/riscv/init/init.c b/arch/riscv/init/init.c
index a64bdf5..48fa661 100644
--- a/arch/riscv/init/init.c
+++ b/arch/riscv/init/init.c
@@ -6,10 +6,10 @@
#include <apos/string.h>
#include <apos/debug.h>
#include <apos/pmem.h>
+#include <apos/vmem.h>
#include <apos/utils.h>
#include <libfdt.h>
#include <pages.h>
-#include <vmem.h>
#include <csr.h>
struct pm_layout_t {
@@ -125,8 +125,38 @@ static void mark_reserved_mem(void *fdt)
mark_area_used(base, top);
}
+static void init_pmem(void *fdt)
+{
+ enum mm_mode_t mmode = get_mmode(fdt);
+
+ size_t max_order = 0;
+ size_t order_width = 9;
+ switch(mmode){
+ case Sv32:
+ max_order = 1;
+ order_width = 10;
+ break;
+
+ case Sv39:
+ max_order = 2;
+ break;
+
+ case Sv48:
+ max_order = 3;
+ break;
+ };
+
+ size_t widths[10] = {0};
+ for(size_t i = 0; i <= max_order; ++i)
+ widths[i] = order_width;
+
+ init_mem(max_order, widths, 12);
+}
+
static void setup_pmem(void *fdt)
{
+ init_pmem(fdt);
+
struct pm_layout_t pmem = get_memlayout(fdt);
pm_t initrd_top = get_initrdtop(fdt);
@@ -203,13 +233,21 @@ struct vm_branch_t *prepare_vmem()
return branch;
}
-void start_vmem(struct vm_branch_t *branch)
+void start_vmem(void *fdt, struct vm_branch_t *branch)
{
- /* assume Sv48 and ASID 0*/
- /* TODO: get ASID from CPU id
- * TODO: more cores lol
- */
- csr_write(CSR_SATP, SATP_MODE_48 | (((pm_t)(branch)) >> 12));
+ /* TODO: get ASID from CPU id */
+
+ /* TODO: probably unnecessary optimisations but this could be cached? */
+ enum mm_mode_t m = get_mmode(fdt);
+
+ if(m == Sv32)
+ csr_write(CSR_SATP, SATP_MODE_Sv32 | pm_to_pnum((pm_t)(branch)));
+ else if (m == Sv39)
+ csr_write(CSR_SATP, SATP_MODE_Sv39 | pm_to_pnum((pm_t)(branch)));
+ else
+ csr_write(CSR_SATP, SATP_MODE_Sv48 | pm_to_pnum((pm_t)(branch)));
+
+ /* Sv57 && Sv64 in the future? */
}
struct init_data_t populate_initdata(void *fdt, struct vm_branch_t *branch)
@@ -240,10 +278,9 @@ void init(void *fdt)
dbg_fdt(fdt);
setup_pmem(fdt);
-
struct vm_branch_t *branch = prepare_vmem();
struct init_data_t d = populate_initdata(fdt, branch);
- start_vmem(branch);
+ start_vmem(fdt, branch);
/* update_pmap(TODO: figure out where to place pmap in vmem); */
void (*main)(struct init_data_t) = (void (*)(struct init_data_t))VM_KERN;
diff --git a/arch/riscv/kernel/main.c b/arch/riscv/kernel/main.c
index 5566d63..c8eca26 100644
--- a/arch/riscv/kernel/main.c
+++ b/arch/riscv/kernel/main.c
@@ -1,5 +1,6 @@
#include <apos/debug.h>
#include <apos/init.h>
+#include <apos/vmem.h>
void __main main(struct init_data_t d)
{
@@ -14,6 +15,7 @@ void __main main(struct init_data_t d)
/* functionality that should be implemented:
* figure out best continuous run of memory (pmap etc)
- * arbitrary mapping and kernel mapping (memory)
+ * arbitrary user and kernel mapping (memory)
+ * vm to pm
*/
}