aboutsummaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2021-09-25 12:24:24 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2021-09-25 12:24:24 +0300
commit13fe461374c0716404e2ee7726781b9cd12dbaa7 (patch)
tree8081e42fbebe8561d87f4e685e0f2c38b40fc0c4 /arch
parent68fcd6d027b88581992b4fb10ee1edc301e30678 (diff)
downloadkmi-13fe461374c0716404e2ee7726781b9cd12dbaa7.tar.gz
kmi-13fe461374c0716404e2ee7726781b9cd12dbaa7.zip
Added default stack location
Diffstat (limited to 'arch')
-rw-r--r--arch/riscv/config.h6
-rw-r--r--arch/riscv/include/pages.h46
-rw-r--r--arch/riscv/init/head.S2
-rw-r--r--arch/riscv/init/init.c9
4 files changed, 17 insertions, 46 deletions
diff --git a/arch/riscv/config.h b/arch/riscv/config.h
index 3eedb39..8bfe360 100644
--- a/arch/riscv/config.h
+++ b/arch/riscv/config.h
@@ -1,5 +1,7 @@
#include <apos/sizes.h>
-#define PM_KERN 0x83800000
+#define PM_KERN 0x83800000
+#define PM_STACK_BASE 0x83900000
+#define PM_STACK_TOP (PM_STACK_BASE + SZ_2M - 2)
#define VM_KERN ((-1) - SZ_1G)
#define MAX_ORDER 3
@@ -7,4 +9,4 @@
#define O0_WIDTH 9
#define O1_WIDTH 9
#define O2_WIDTH 9
-#define O3_WIDTH 0
+#define O3_WIDTH 9
diff --git a/arch/riscv/include/pages.h b/arch/riscv/include/pages.h
index 9e16c00..1533f7b 100644
--- a/arch/riscv/include/pages.h
+++ b/arch/riscv/include/pages.h
@@ -2,50 +2,14 @@
#define APOS_RISCV_PAGES_H
#include <apos/types.h>
+#include <apos/pmem.h>
-typedef uint8_t pagemask_t;
-typedef uint8_t lockbit_t;
/* assume riscv64 for now */
typedef uint64_t pm_t;
-struct mm_kpages {
- pagemask_t page[64];
-};
-
-struct mm_mpages {
- lockbit_t lockbit[64];
- pagemask_t empty[64];
- pagemask_t full[64];
- struct mm_kpages kilo[512];
-};
-
-/* Sv39 */
-struct mm_gpages {
- lockbit_t lockbit[64];
- pagemask_t empty[64];
- pagemask_t full[64];
- struct mm_mpages mega[512];
-};
-
-struct mm_tpages {
- lockbit_t lockbit[64];
- pagemask_t empty[64];
- pagemask_t full[64];
- struct mm_gpages giga[512];
-};
-
-struct mm_ptinfo {
- short tera_num;
- struct terapages *tera_top;
-
- short giga_num;
- struct gigapages *giga_top;
-
- short mega_num;
- struct megapages *mega_top;
-
- short kilo_num;
- struct kilopages *kilo_top;
-};
+#define MM_KPAGE MM_O0
+#define MM_MPAGE MM_O1
+#define MM_GPAGE MM_O2
+#define MM_TPAGE MM_O3
#endif /* APOS_RISCV_PAGES_H */
diff --git a/arch/riscv/init/head.S b/arch/riscv/init/head.S
index bbd2945..3589ead 100644
--- a/arch/riscv/init/head.S
+++ b/arch/riscv/init/head.S
@@ -2,6 +2,6 @@
.global _start
.type _start, @function
_start:
- /* stack pointer is whatever? */
+ li sp, PM_STACK_TOP
/* go to proper init */
j init
diff --git a/arch/riscv/init/init.c b/arch/riscv/init/init.c
index 5612d0b..86c2563 100644
--- a/arch/riscv/init/init.c
+++ b/arch/riscv/init/init.c
@@ -112,8 +112,8 @@ static pm_t get_kerneltop()
/* interesting, for some reason if I define these to be just char
* pointers I get some wacky values. Not sure why that would be, but
* this works. */
- extern char __init_end[], __kernel_size[];
- return (pm_t)__init_end + (pm_t)__kernel_size;
+ extern char __init_end, __kernel_size;
+ return (pm_t)&__init_end + (pm_t)&__kernel_size;
}
static pm_t get_initrdtop(void *fdt)
@@ -146,11 +146,16 @@ static void setup_pmem(void *fdt)
dbg("kernel_top:\t%#lx\n", kernel_top);
dbg("fdt_top:\t%#lx\n", fdt_top);
+ /* TODO: check that pmap placement doesn't overwrite anything, such as
+ * stack or go over top address of memory */
/* riscv handles two byte boundaries better than one byte, so align
* upwards */
populate_pmap(pmem.base, pmem.top - pmem.base, align_up(top + 1, 2));
/* TODO: mark used pages */
+
+ /* mark init stack */
+ mark_used(PM_STACK_BASE, MM_MPAGE);
}
void init(void *fdt)