Hacktastic thread jump to C
authorJack Miller <jack@codezen.org>
Fri, 25 Mar 2016 04:18:13 +0000 (23:18 -0500)
committerJack Miller <jack@codezen.org>
Fri, 25 Mar 2016 21:59:17 +0000 (16:59 -0500)
- Obviously nothing has locks yet, so printk is racy.

- CPU kernel stacks aren't going to be random page_alloc addresses
  long-term

- This doesn't belong in apic code

asm/realmode.asm-bin
include/asm/realmode.h
kernel/apic.c

index 4ec661f..ddbf453 100644 (file)
@@ -40,10 +40,12 @@ ORG 0x2000
 
     jmp main /* Skip our header data */
 
-gdtr:
-    DQ 0
 crthree:
     DD 0
+gdtr:
+    DQ 0
+stackpointer:
+    DQ 0
 kernel_entry:
     DQ 0
 
@@ -108,7 +110,11 @@ kernel_gdt:
     mov fs, ax
     mov gs, ax
 
-    jmp $
+    /* Grab our stack pointer, and get into C */
+
+    mov rsp, [stackpointer]
+
+    jmp [kernel_entry]
 
 ALIGN 8
 builtin_gdtr:
index 5d8e4c5..50083ee 100644 (file)
@@ -7,8 +7,9 @@ extern u64 end_realmode_bin;
 
 struct rm_header {
        u8   jmp[2]; /* Two bytes for the jump over data */
-       u64  gdtr;
        u32  cr3;
+       u64  gdtr;
+       u64  sp;
        u64  kernel_entry;
 } __attribute__((packed));
 
index 0a87108..8ea7177 100644 (file)
@@ -25,6 +25,7 @@
 #include <apic.h>
 #include <mmio.h>
 #include <string.h>
+#include <page_alloc.h>
 
 #include <asm/realmode.h>
 #include <asm/barrier.h>
@@ -117,16 +118,27 @@ static void apic_eoi(void)
 
 static struct rm_header *realboot = NULL;
 
+/* Yes, I know this is currently racy as fuck, it just doesn't matter yet */
+
+void secondary_start(void)
+{
+       printk("Here\n");
+       while(1) {}
+}
+
 static void apic_wake_secondary(u8 apic_id)
 {
        u32 lo;
 
        if (!realboot) {
+               void *sp = page_alloc(1);
                map_page(0x2000, 0x2000);
                realboot = (void *) 0x2000;
                memcpy(realboot, &realmode_bin, REALMODE_BIN_LEN);
                realboot->gdtr = (VIRT_BASE + (u64) &GDTR_64);
                realboot->cr3 = get_cr3();
+               realboot->sp = ((u64) sp + (2 * PAGE_SIZE));
+               realboot->kernel_entry = (u64) secondary_start;
        }
 
        lo = ICRL_MT(MT_INIT) | ICRL_ASSERT | ICRL_TRIGGER_LEVEL;