commit 43548acf4c60f144ed9892d9e8a6ff105de197de
parent 92825b9131c1ccd10573c818406529b277a9cc41
Author: erai <erai@omiltem.net>
Date: Sat, 30 Mar 2024 11:16:55 -0400
Top half kernel
Diffstat:
M | as.c | | | 81 | +++++++++++++++++++++++++++++++++---------------------------------------------- |
M | kernel.c | | | 6 | +++++- |
2 files changed, 39 insertions(+), 48 deletions(-)
diff --git a/as.c b/as.c
@@ -351,7 +351,6 @@ emit_pop(c: *assembler, n: int) {
emit_kstart(c: *assembler) {
var hang: *label;
- var loop_top: *label;
var do_iret: *label;
var do_ret: *label;
var done: *label;
@@ -359,7 +358,6 @@ emit_kstart(c: *assembler) {
c.bits32 = 1;
hang = mklabel(c);
- loop_top = mklabel(c);
do_iret = mklabel(c);
do_ret = mklabel(c);
done = mklabel(c);
@@ -370,15 +368,37 @@ emit_kstart(c: *assembler) {
as_jmp(c, OP_JCC + CC_NE, hang);
// Setup an early stack
- as_modri(c, OP_MOVI, R_RSP, 0x00080000);
+ as_modri(c, OP_MOVI, R_RSP, 0x00200000);
+
+ // Align stack to page
+ as_modri(c, OP_ANDI, R_RSP, -0x1000);
+
+ // pt3 -> 1g
+ as_modri(c, OP_SUBI, R_RSP, 0x1000);
+ as_modri(c, OP_MOVI, R_RAX, 0x83);
+ as_modri(c, OP_MOVI, R_RDX, 0);
+ as_modrm(c, OP_STORE, R_RAX, R_RSP, 0, 0, 0);
+ as_modrm(c, OP_STORE, R_RDX, R_RSP, 0, 0, 4);
+ as_modrm(c, OP_STORE, R_RAX, R_RSP, 0, 0, 510 * 8 + 0);
+ as_modrm(c, OP_STORE, R_RDX, R_RSP, 0, 0, 510 * 8 + 4);
+
+ // pt4 -> pt3
+ as_modrr(c, OP_MOVE, R_RAX, R_RSP);
+ as_modri(c, OP_SUBI, R_RSP, 0x1000);
+ as_modri(c, OP_ORI, R_RAX, 3);
+ as_modri(c, OP_MOVI, R_RDX, 0);
+ as_modrm(c, OP_STORE, R_RAX, R_RSP, 0, 0, 0);
+ as_modrm(c, OP_STORE, R_RDX, R_RSP, 0, 0, 4);
+ as_modrm(c, OP_STORE, R_RAX, R_RSP, 0, 0, 511 * 8 + 0);
+ as_modrm(c, OP_STORE, R_RDX, R_RSP, 0, 0, 511 * 8 + 4);
+
+ // Load page table pt4
+ as_modrr(c, OP_WRCRR, R_CR3, R_RSP);
// Allocate space for the gdt
as_modri(c, OP_SUBI, R_RSP, 64);
as_modrr(c, OP_MOVE, R_RBP, R_RSP);
- // Align stack to page
- as_modri(c, OP_ANDI, R_RSP, -0x1000);
-
// Null Segment
as_modri(c, OP_MOVI, R_RAX, 0x00000000);
as_modrm(c, OP_STORE, R_RAX, R_RBP, 0, 0, 8);
@@ -411,47 +431,6 @@ emit_kstart(c: *assembler) {
// Load null idt
as_modm(c, OP_LIDTM, R_RBP, 0, 0, 8);
- // pt1 -> physical
- as_modri(c, OP_MOVI, R_RAX, 3);
- as_modri(c, OP_MOVI, R_RDX, 0);
- as_modri(c, OP_MOVI, R_RDI, 0);
- as_modri(c, OP_SUBI, R_RSP, 0x1000);
- fixup_label(c, loop_top);
- as_modrm(c, OP_STORE, R_RAX, R_RSP, R_RDI, 1, 0);
- as_modrm(c, OP_STORE, R_RDX, R_RSP, R_RDI, 1, 4);
- as_modri(c, OP_ADDI, R_RAX, 0x1000);
- as_modri(c, OP_ADDI, R_RDI, 8);
- as_modri(c, OP_CMPI, R_RDI, 0x1000);
- as_jmp(c, OP_JCC + CC_NE, loop_top);
-
- // pt2 -> pt1
- as_modrr(c, OP_MOVE, R_RAX, R_RSP);
- as_modri(c, OP_SUBI, R_RSP, 0x1000);
- as_modri(c, OP_ORI, R_RAX, 3);
- as_modrm(c, OP_STORE, R_RAX, R_RSP, 0, 0, 0);
- as_modrm(c, OP_STORE, R_RDX, R_RSP, 0, 0, 4);
-
- // pt3 -> pt2
- as_modrr(c, OP_MOVE, R_RAX, R_RSP);
- as_modri(c, OP_SUBI, R_RSP, 0x1000);
- as_modri(c, OP_ORI, R_RAX, 3);
- as_modrm(c, OP_STORE, R_RAX, R_RSP, 0, 0, 0);
- as_modrm(c, OP_STORE, R_RDX, R_RSP, 0, 0, 4);
- as_modrm(c, OP_STORE, R_RAX, R_RSP, 0, 0, 510 * 8 + 0);
- as_modrm(c, OP_STORE, R_RDX, R_RSP, 0, 0, 510 * 8 + 4);
-
- // pt4 -> pt3
- as_modrr(c, OP_MOVE, R_RAX, R_RSP);
- as_modri(c, OP_SUBI, R_RSP, 0x1000);
- as_modri(c, OP_ORI, R_RAX, 3);
- as_modrm(c, OP_STORE, R_RAX, R_RSP, 0, 0, 0);
- as_modrm(c, OP_STORE, R_RDX, R_RSP, 0, 0, 4);
- as_modrm(c, OP_STORE, R_RAX, R_RSP, 0, 0, 511 * 8 + 0);
- as_modrm(c, OP_STORE, R_RDX, R_RSP, 0, 0, 511 * 8 + 4);
-
- // Load page table pt4
- as_modrr(c, OP_WRCRR, R_CR3, R_RSP);
-
// Enable pae
as_modri(c, OP_MOVI, R_RAX, 0xa0);
as_modrr(c, OP_WRCRR, R_CR4, R_RAX);
@@ -501,6 +480,14 @@ emit_kstart(c: *assembler) {
// Reload stack in the top half
as_modri(c, OP_ORI, R_RSP, (-0x8000 << 16));
+ // Kill the lower mapping
+ as_modri(c, OP_MOVI, R_RAX, 0);
+ as_modrm(c, OP_LEA, R_RDI, R_RBP, 0, 0, 64);
+ as_modrm(c, OP_STORE, R_RAX, R_RDI, 0, 0, 4096);
+ as_modrm(c, OP_STORE, R_RAX, R_RDI, 0, 0, 0);
+ as_modri(c, OP_ANDI, R_RDI, 0x7fffffff);
+ as_modrr(c, OP_WRCRR, R_CR3, R_RDI);
+
// Setup a call frame for _kstart
as_jmp(c, OP_JMP, done);
diff --git a/kernel.c b/kernel.c
@@ -4,6 +4,10 @@ _start() {
loop { }
}
-_kstart(mbinfo: *void) {
+ru32(p: *byte): int {
+ return p[0]:int + (p[1]:int << 8) + (p[2]:int << 16) + (p[3]:int << 24);
+}
+
+_kstart(mb: *byte) {
loop { }
}