aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile6
-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
5 files changed, 21 insertions, 48 deletions
diff --git a/Makefile b/Makefile
index 324a934..a23ecf3 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@ DO != echo > deps.mk
# this could be done better
DEBUGFLAGS != [ $(DEBUG) ] && echo "-O0 -ggdb3 -DDEBUG" || echo "-flto -O2"
-CFLAGS = -fno-pie -ffreestanding -nostdlib -std=c11 -Wall -Wextra
+CFLAGS = -fno-pie -ffreestanding -nostdlib -std=c17 -Wall -Wextra
DEPFLAGS = -MT $@ -MMD -MP -MF $@.d
all: apos.bin
@@ -57,7 +57,9 @@ apos.bin: kernel.bin init.bin
kernel.elf: $(KERNEL_OBJECTS) $(KERNEL_LD)
$(GENELF) -T $(KERNEL_LD) $(KERNEL_OBJECTS) -o $@
-init.elf: kernel.bin $(INIT_OBJECTS) $(INIT_LD)
+$(INIT_LD): kernel.bin
+
+init.elf: $(INIT_OBJECTS) $(INIT_LD)
$(GENELF) -T $(INIT_LD) $(INIT_OBJECTS) -o $@
kernel.bin: kernel.elf
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)