Files
exkernel/kernel.c
Fabio Scotto di Santolo 3a102f1e61 Added libc functions
2025-11-30 18:37:12 +01:00

62 lines
1.7 KiB
C

#include "kernel.h"
#include "common.h"
extern uint8_t __bss[], __bss_end[], __stack_top[];
sbiret sbi_call(long arg0, long arg1, long arg2, long arg3, long arg4,
long arg5, long fid, long eid)
{
register long a0 __asm__("a0") = arg0;
register long a1 __asm__("a1") = arg1;
register long a2 __asm__("a2") = arg2;
register long a3 __asm__("a3") = arg3;
register long a4 __asm__("a4") = arg4;
register long a5 __asm__("a5") = arg5;
register long a6 __asm__("a6") = fid;
register long a7 __asm__("a7") = eid;
__asm__ __volatile__(
"ecall"
: "=r"(a0), "=r"(a1)
: "r"(a0), "r"(a1), "r"(a2), "r"(a3), "r"(a4), "r"(a5), "r"(a6), "r"(a7)
: "memory"
);
return (sbiret) { .error = a0, .value = a1 };
}
void putchar(char c)
{
// 1 => sbi_console_putchar()
sbi_call(c, 0, 0, 0, 0, 0, 0, 1);
}
void kernel_main(void)
{
const char *s = "Hello World!";
printf("\nString = '%s'\n", s);
printf("\nPositive Integer = %d\n", 42);
printf("\nNegative Integer = %d\n", -42);
printf("\nHexadecimal = %x\n", 0xdeadbeef);
printf("offsetof(sbiret, error) = %x\n", offsetof(sbiret, error));
printf("offsetof(sbiret, value) = %x\n", offsetof(sbiret, value));
while(1) {
// wfi -> wait for interrupt
__asm__ __volatile__("wfi");
}
}
__attribute__((section(".text.boot")))
__attribute__((naked))
void boot(void)
{
__asm__ __volatile__ (
"mv sp, %[stack_top]\n" // Initialize the kernel stack pointer
"j kernel_main\n" // Unconditional jump to kernel_main
: // No output
: [stack_top] "r" (__stack_top) // Pass the stack top address
);
}