diff --git a/kernel.c b/kernel.c index 6a9c271..0872c2c 100644 --- a/kernel.c +++ b/kernel.c @@ -26,18 +26,108 @@ void putchar(char ch) { sbi_call(ch, 0, 0, 0, 0, 0, 0, 1 /* Console Putchar */); } +__attribute__((naked)) +__attribute__((aligned(4))) +void kernel_entry(void) { + __asm__ __volatile__( + "csrw sscratch, sp\n" + "addi sp, sp, -4 * 31\n" + "sw ra, 4 * 0(sp)\n" + "sw gp, 4 * 1(sp)\n" + "sw tp, 4 * 2(sp)\n" + "sw t0, 4 * 3(sp)\n" + "sw t1, 4 * 4(sp)\n" + "sw t2, 4 * 5(sp)\n" + "sw t3, 4 * 6(sp)\n" + "sw t4, 4 * 7(sp)\n" + "sw t5, 4 * 8(sp)\n" + "sw t6, 4 * 9(sp)\n" + "sw a0, 4 * 10(sp)\n" + "sw a1, 4 * 11(sp)\n" + "sw a2, 4 * 12(sp)\n" + "sw a3, 4 * 13(sp)\n" + "sw a4, 4 * 14(sp)\n" + "sw a5, 4 * 15(sp)\n" + "sw a6, 4 * 16(sp)\n" + "sw a7, 4 * 17(sp)\n" + "sw s0, 4 * 18(sp)\n" + "sw s1, 4 * 19(sp)\n" + "sw s2, 4 * 20(sp)\n" + "sw s3, 4 * 21(sp)\n" + "sw s4, 4 * 22(sp)\n" + "sw s5, 4 * 23(sp)\n" + "sw s6, 4 * 24(sp)\n" + "sw s7, 4 * 25(sp)\n" + "sw s8, 4 * 26(sp)\n" + "sw s9, 4 * 27(sp)\n" + "sw s10, 4 * 28(sp)\n" + "sw s11, 4 * 29(sp)\n" + + "csrr a0, sscratch\n" + "sw a0, 4 * 30(sp)\n" + + "mv a0, sp\n" + "call handle_trap\n" + + "lw ra, 4 * 0(sp)\n" + "lw gp, 4 * 1(sp)\n" + "lw tp, 4 * 2(sp)\n" + "lw t0, 4 * 3(sp)\n" + "lw t1, 4 * 4(sp)\n" + "lw t2, 4 * 5(sp)\n" + "lw t3, 4 * 6(sp)\n" + "lw t4, 4 * 7(sp)\n" + "lw t5, 4 * 8(sp)\n" + "lw t6, 4 * 9(sp)\n" + "lw a0, 4 * 10(sp)\n" + "lw a1, 4 * 11(sp)\n" + "lw a2, 4 * 12(sp)\n" + "lw a3, 4 * 13(sp)\n" + "lw a4, 4 * 14(sp)\n" + "lw a5, 4 * 15(sp)\n" + "lw a6, 4 * 16(sp)\n" + "lw a7, 4 * 17(sp)\n" + "lw s0, 4 * 18(sp)\n" + "lw s1, 4 * 19(sp)\n" + "lw s2, 4 * 20(sp)\n" + "lw s3, 4 * 21(sp)\n" + "lw s4, 4 * 22(sp)\n" + "lw s5, 4 * 23(sp)\n" + "lw s6, 4 * 24(sp)\n" + "lw s7, 4 * 25(sp)\n" + "lw s8, 4 * 26(sp)\n" + "lw s9, 4 * 27(sp)\n" + "lw s10, 4 * 28(sp)\n" + "lw s11, 4 * 29(sp)\n" + "lw sp, 4 * 30(sp)\n" + "sret\n" + ); +} + +void handle_trap(struct trap_frame *f) { + uint32_t scause = READ_CSR(scause); + uint32_t stval = READ_CSR(stval); + uint32_t user_pc = READ_CSR(sepc); + + PANIC("Unexpected trap: scause=%x, stval=%x, sepc=%x\n", scause, stval, user_pc); +} + void kernel_main(void) { - // printf("\n\nHello %s\n", "friend :3"); - // printf("60 + 9 = %d, %x\n", 60 + 9, 0x1234abcd); - // + printf("\n\nHello %s\n", "friend :3"); + printf("60 + 9 = %d, %x\n", 60 + 9, 0x1234abcd); + // for (;;) { // __asm__ __volatile__("wfi"); // } - + memset(__bss, 0, (size_t) __bss_end - (size_t) __bss); - PANIC("BOOOO!!! GET INFECTED WITH BOOTKID YOU SKID! 0x1337h@x0r"); - printf("you lucky bitch got away\n"); + WRITE_CSR(stvec, (uint32_t) kernel_entry); + __asm__ __volatile__("unimp"); + + // + // PANIC("BOOOO!!! GET INFECTED WITH BOOTKID YOU SKID! 0x1337h@x0r"); + // printf("you lucky bitch got away\n"); } __attribute__((section(".text.boot"))) @@ -50,3 +140,4 @@ void boot(void) { : [stack_top] "r" (__stack_top) // Pass the stack top address as %[stack_top] ); } + diff --git a/kernel.h b/kernel.h index d8027d0..ba69f82 100644 --- a/kernel.h +++ b/kernel.h @@ -1,10 +1,58 @@ #pragma once +#include "common.h" struct sbiret { long error; long value; }; +struct trap_frame { + uint32_t ra; + uint32_t gp; + uint32_t tp; + uint32_t t0; + uint32_t t1; + uint32_t t2; + uint32_t t3; + uint32_t t4; + uint32_t t5; + uint32_t t6; + uint32_t a0; + uint32_t a1; + uint32_t a2; + uint32_t a3; + uint32_t a4; + uint32_t a5; + uint32_t a6; + uint32_t a7; + uint32_t s0; + uint32_t s1; + uint32_t s2; + uint32_t s3; + uint32_t s4; + uint32_t s5; + uint32_t s6; + uint32_t s7; + uint32_t s8; + uint32_t s9; + uint32_t s10; + uint32_t s11; + uint32_t sp; +} __attribute__ ((packed)); + +#define READ_CSR(reg) \ + ({ \ + unsigned long __tmp; \ + __asm__ __volatile__("csrr %0, " #reg : "=r"(__tmp)); \ + __tmp; \ + }) + +#define WRITE_CSR(reg, value) \ + do { \ + uint32_t __tmp = (value); \ + __asm__ __volatile__("csrw " #reg ", %0 " ::"r"(__tmp)); \ + } while (0) + #define PANIC(fmt, ...) \ do { \ printf("YOU GOT A PANIC ERROR: %s:%d: " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__); \