diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/include/graphics.h | 11 | ||||
| -rw-r--r-- | kernel/include/libk/serial_stdio.h | 1 | ||||
| -rw-r--r-- | kernel/include/libk/stdio.h | 4 | ||||
| -rw-r--r-- | kernel/include/panic.h | 6 | ||||
| -rw-r--r-- | kernel/include/registers.h | 34 | ||||
| -rw-r--r-- | kernel/include/syscall.h | 7 | ||||
| -rw-r--r-- | kernel/include/types.h | 1 | ||||
| -rw-r--r-- | kernel/src/boot/multiboot2.c | 6 | ||||
| -rw-r--r-- | kernel/src/check/panic.c | 37 | ||||
| -rw-r--r-- | kernel/src/check/ssp.c | 3 | ||||
| -rw-r--r-- | kernel/src/check/ubsan.c | 5 | ||||
| -rw-r--r-- | kernel/src/cpu/irq.c | 104 | ||||
| -rw-r--r-- | kernel/src/cpu/irq_stub.S | 5 | ||||
| -rw-r--r-- | kernel/src/cpu/registers.c | 29 | ||||
| -rw-r--r-- | kernel/src/cpu/tss.c | 1 | ||||
| -rw-r--r-- | kernel/src/devices/keyboard.c | 3 | ||||
| -rw-r--r-- | kernel/src/libk/serial_stdio.c | 17 | ||||
| -rw-r--r-- | kernel/src/libk/stdio.c | 45 | ||||
| -rw-r--r-- | kernel/src/mem/paging.c | 5 | ||||
| -rw-r--r-- | kernel/src/misc/graphics.c | 30 | ||||
| -rw-r--r-- | kernel/src/sys/syscall.c | 28 | ||||
| -rw-r--r-- | kernel/src/sys/userspace.c | 8 |
22 files changed, 232 insertions, 158 deletions
diff --git a/kernel/include/graphics.h b/kernel/include/graphics.h index 16805a6..6f6f432 100644 --- a/kernel/include/graphics.h +++ b/kernel/include/graphics.h @@ -10,7 +10,11 @@ struct fb_t { uint32_t height; uint8_t bpp; uint8_t type; -} __attribute__((packed, aligned(8))); + uint32_t x; + uint32_t y; + uint32_t char_col; + uint32_t bg_col; +}; typedef struct fb_t fb_t; extern volatile fb_t main_fb; @@ -23,11 +27,12 @@ extern volatile fb_t main_fb; #define WHITE 0x00ffffff #define BLACK 0x00000000 +void set_color(volatile fb_t* fb, uint32_t char_col, uint32_t bg_col); +void clear_screen(volatile fb_t fb); void fb_draw_pixel(volatile fb_t fb, int32_t x, int32_t y, uint32_t col); void fb_draw_line_low(volatile fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t col); void fb_draw_line_high(volatile fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t col); void fb_draw_line(volatile fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t col); -void fb_draw_character(volatile fb_t fb, char c, int32_t x, int32_t y, uint32_t char_col, uint32_t bg_col); -void fb_draw_string(volatile fb_t fb, const char* str, int32_t x, int32_t y, uint32_t char_col, uint32_t bg_col); +void fb_draw_character(volatile fb_t fb, char c, int32_t x, int32_t y); #endif diff --git a/kernel/include/libk/serial_stdio.h b/kernel/include/libk/serial_stdio.h index 17317d0..5a4dda4 100644 --- a/kernel/include/libk/serial_stdio.h +++ b/kernel/include/libk/serial_stdio.h @@ -8,5 +8,6 @@ void serial_print_string(const char* s); void serial_print_int(uint64_t num); void serial_print_hex(uint64_t num); void serial_printf(const char *s, ...); +void serial_vprintf(const char *s, va_list list); #endif diff --git a/kernel/include/libk/stdio.h b/kernel/include/libk/stdio.h index fc7b8e8..64d16f1 100644 --- a/kernel/include/libk/stdio.h +++ b/kernel/include/libk/stdio.h @@ -3,13 +3,11 @@ #include <types.h> -extern uint32_t curr_x; -extern uint32_t curr_y; - void print_char(char c); void print_string(const char* s); void print_int(uint64_t num); void print_hex(uint64_t num); void printf(const char *s, ...); +void vprintf(const char *s, va_list list); #endif diff --git a/kernel/include/panic.h b/kernel/include/panic.h index 23b02f4..4949c77 100644 --- a/kernel/include/panic.h +++ b/kernel/include/panic.h @@ -1,6 +1,10 @@ #ifndef PANIC_H #define PANIC_H -__attribute__((noreturn)) void panic(void); +#include <types.h> + +extern uint64_t panic_rsp; + +__attribute__((noreturn)) void panic(const char *error, ...); #endif diff --git a/kernel/include/registers.h b/kernel/include/registers.h new file mode 100644 index 0000000..a0c0949 --- /dev/null +++ b/kernel/include/registers.h @@ -0,0 +1,34 @@ +#ifndef REGISTERS_H +#define REGISTERS_H + +#include <types.h> + +struct registers_t { + uint64_t rax; + uint64_t rbx; + uint64_t rcx; + uint64_t rdx; + uint64_t rsi; + uint64_t rdi; + uint64_t rsp; + uint64_t rbp; + uint64_t r8; + uint64_t r9; + uint64_t r10; + uint64_t r11; + uint64_t r12; + uint64_t r13; + uint64_t r14; + uint64_t r15; + uint64_t rip; + uint16_t cs; + uint16_t ds; + uint16_t ss; + uint16_t es; + uint16_t fs; + uint16_t gs; +}; +typedef struct registers_t registers_t; + + +#endif diff --git a/kernel/include/syscall.h b/kernel/include/syscall.h index 440f9e6..399e668 100644 --- a/kernel/include/syscall.h +++ b/kernel/include/syscall.h @@ -1,6 +1,13 @@ #ifndef SYSCALL_H #define SYSCALL_H +#define SYSCALL_READ 0 +#define SYSCALL_WRITE 1 + +#include <types.h> + void syscall_handler(void); +void syscall_read(void); +void syscall_write(char* buff, size_t count); #endif diff --git a/kernel/include/types.h b/kernel/include/types.h index b5f54be..8ce85c8 100644 --- a/kernel/include/types.h +++ b/kernel/include/types.h @@ -4,5 +4,6 @@ #include <stdint.h> #include <stddef.h> #include <stdbool.h> +#include <stdarg.h> #endif diff --git a/kernel/src/boot/multiboot2.c b/kernel/src/boot/multiboot2.c index b111649..21da783 100644 --- a/kernel/src/boot/multiboot2.c +++ b/kernel/src/boot/multiboot2.c @@ -21,10 +21,12 @@ void init_fb(mb2_tag_fb* tag_fb) main_fb.height = tag_fb->framebuffer_height; main_fb.pitch = tag_fb->framebuffer_pitch; main_fb.bpp = tag_fb->framebuffer_bpp; + main_fb.char_col = WHITE; + main_fb.bg_col = BLACK; // identity map framebuffer address - map_addr(main_fb.addr, main_fb.addr, FLAG_PRESENT | FLAG_WRITABLE | FLAG_USER); - map_addr(main_fb.addr + PAGE_SIZE, main_fb.addr + PAGE_SIZE, FLAG_PRESENT | FLAG_WRITABLE | FLAG_USER); + map_addr(main_fb.addr, main_fb.addr, FLAG_PRESENT | FLAG_WRITABLE); + map_addr(main_fb.addr + PAGE_SIZE, main_fb.addr + PAGE_SIZE, FLAG_PRESENT | FLAG_WRITABLE); } void init_mmap(mb2_tag_mmap* tag_mmap) diff --git a/kernel/src/check/panic.c b/kernel/src/check/panic.c index 0480633..c618c40 100644 --- a/kernel/src/check/panic.c +++ b/kernel/src/check/panic.c @@ -1,10 +1,43 @@ #include <libk/stdio.h> #include <panic.h> +#include <graphics.h> + +uint64_t panic_rsp; __attribute__((noreturn)) -void panic() +void panic(const char *s, ...) { - printf("PANIC MODE ENETERED"); + set_color(&main_fb, RED, BLACK); + printf("KERNEL PANIC\n"); +// set_color(&main_fb, WHITE, BLACK); + va_list list; + va_start(list, s); + vprintf(s, list); + va_end(list); + + printf("regs:\n"); + uint64_t i = 0; + printf("rflags: 0x%x; ", *((uint64_t*)panic_rsp + i++)); + printf("r11: 0x%x; ", *((uint64_t*)panic_rsp + i++)); + printf("r10: 0x%x; ", *((uint64_t*)panic_rsp + i++)); + printf("r9: 0x%x\n", *((uint64_t*)panic_rsp + i++)); + printf("r8: 0x%x; ", *((uint64_t*)panic_rsp + i++)); + printf("rdi: 0x%x; ", *((uint64_t*)panic_rsp + i++)); + printf("rsi: 0x%x; ", *((uint64_t*)panic_rsp + i++)); + printf("rdx: 0x%x\n", *((uint64_t*)panic_rsp + i++)); + printf("rcx: 0x%x; ", *((uint64_t*)panic_rsp + i++)); + printf("rax: 0x%x; ", *((uint64_t*)panic_rsp + i++)); + printf("exception: 0x%x; ", *((uint64_t*)panic_rsp + i++)); + printf("rip: 0x%x\n", *((uint64_t*)panic_rsp + i++)); + printf("cs: 0x%x; ", *((uint64_t*)panic_rsp + i++)); + printf("rflags: 0x%x; ", *((uint64_t*)panic_rsp + i++)); + printf("rsp: 0x%x; ", *((uint64_t*)panic_rsp + i++)); + printf("ss: 0x%x\n", *((uint64_t*)panic_rsp + i++)); + printf("1: 0x%x\n", *((uint64_t*)panic_rsp + i++)); + printf("1: 0x%x\n", *((uint64_t*)panic_rsp + i++)); + printf("1: 0x%x\n", *((uint64_t*)panic_rsp + i++)); + printf("1: 0x%x\n", *((uint64_t*)panic_rsp + i++)); + __asm__ volatile ("cli;"); for(;;) { __asm__ volatile ("hlt;"); diff --git a/kernel/src/check/ssp.c b/kernel/src/check/ssp.c index 4b9c72a..86288b1 100644 --- a/kernel/src/check/ssp.c +++ b/kernel/src/check/ssp.c @@ -9,6 +9,5 @@ uintptr_t __stack_chk_guard = STACK_CHK_GUARD; __attribute__((noreturn)) void __stack_chk_fail(void) { - printf("Stack smashing detected"); - panic(); + panic("Stack smashing detected"); } diff --git a/kernel/src/check/ubsan.c b/kernel/src/check/ubsan.c index 8a5f998..2e302bb 100644 --- a/kernel/src/check/ubsan.c +++ b/kernel/src/check/ubsan.c @@ -17,7 +17,7 @@ * Undefined behavior sanitizer runtime support. */ -#include <stdint.h> +#include <types.h> #include <libk/stdio.h> #include <libk/serial_stdio.h> #include <ubsan.h> @@ -53,10 +53,9 @@ static void ubsan_abort(const struct ubsan_source_location* location, if ( !location || !location->filename ) location = &unknown_location; - printf( + panic( "filename = %s; line = %d; column = %d; violation = %s;\n", location->filename, location->line, location->column, violation); - panic(); } #define ABORT_VARIANT(name, params, call) \ diff --git a/kernel/src/cpu/irq.c b/kernel/src/cpu/irq.c index a345251..4670da5 100644 --- a/kernel/src/cpu/irq.c +++ b/kernel/src/cpu/irq.c @@ -47,203 +47,163 @@ const char* const exception_name[] = { void isr0_handler(void) { - printf("%s\n", exception_name[0]); - panic(); + panic("%s\n", exception_name[0]); } void isr1_handler(void) { - printf("%s\n", exception_name[1]); - panic(); + panic("%s\n", exception_name[1]); } void isr2_handler(void) { - printf("%s\n", exception_name[2]); - panic(); + panic("%s\n", exception_name[2]); } void isr3_handler(void) { - printf("%s\n", exception_name[3]); - panic(); + panic("%s\n", exception_name[3]); } void isr4_handler(void) { - printf("%s\n", exception_name[4]); - panic(); + panic("%s\n", exception_name[4]); } void isr5_handler(void) { - printf("%s\n", exception_name[5]); - panic(); + panic("%s\n", exception_name[5]); } void isr6_handler(void) { - printf("%s\n", exception_name[6]); - panic(); + panic("%s\n", exception_name[6]); } void isr7_handler(void) { - printf("%s\n", exception_name[7]); - panic(); + panic("%s\n", exception_name[7]); } void isr8_handler(uint64_t error) { - printf("%s\n", exception_name[8]); - printf("error: %d\n", error); + panic("%s, error: %d\n", exception_name[8], error); } void isr9_handler(void) { - printf("%s\n", exception_name[9]); - panic(); + panic("%s\n", exception_name[9]); } void isr10_handler(uint64_t error) { - printf("%s\n", exception_name[10]); - printf("error: %d\n", error); - panic(); + panic("%s, error: %d\n", exception_name[10], error); } void isr11_handler(uint64_t error) { - printf("%s\n", exception_name[11]); - printf("error: %d\n", error); - panic(); + panic("%s, error: %d\n", exception_name[11], error); } void isr12_handler(uint64_t error) { - printf("%s\n", exception_name[12]); - printf("error: %d\n", error); - panic(); + panic("%s, error: %d\n", exception_name[12], error); } void isr13_handler(uint64_t error) { - printf("%s\n", exception_name[13]); - printf("error: %d\n", error); - panic(); + panic("%s, error: %d\n", exception_name[13], error); } void isr14_handler(uint64_t error) { - printf("%s\n", exception_name[14]); - printf("error: %d\n", error); + printf("%s, error: %d\n", exception_name[14], error); page_fault(error); } void isr15_handler(void) { - printf("%s\n", exception_name[15]); - panic(); + panic("%s\n", exception_name[15]); } void isr16_handler(void) { - printf("%s\n", exception_name[16]); - panic(); + panic("%s\n", exception_name[16]); } void isr17_handler(uint64_t error) { - printf("%s\n", exception_name[17]); - printf("error: %d\n", error); - panic(); + panic("%s, error: %d\n", exception_name[17], error); } void isr18_handler(void) { - printf("%s\n", exception_name[18]); - panic(); + panic("%s\n", exception_name[18]); } void isr19_handler(void) { - printf("%s\n", exception_name[19]); - panic(); + panic("%s\n", exception_name[19]); } void isr20_handler(void) { - printf("%s\n", exception_name[20]); - panic(); + panic("%s\n", exception_name[20]); } void isr21_handler(uint64_t error) { - printf("%s\n", exception_name[21]); - printf("error: %d\n", error); - panic(); + panic("%s, error: %d\n", exception_name[21], error); } void isr22_handler(void) { - printf("%s\n", exception_name[22]); - panic(); + panic("%s\n", exception_name[22]); } void isr23_handler(void) { - printf("%s\n", exception_name[23]); - panic(); + panic("%s\n", exception_name[23]); } void isr24_handler(void) { - printf("%s\n", exception_name[24]); - panic(); + panic("%s\n", exception_name[24]); } void isr25_handler(void) { - printf("%s\n", exception_name[25]); - panic(); + panic("%s\n", exception_name[25]); } void isr26_handler(void) { - printf("%s\n", exception_name[26]); - panic(); + panic("%s\n", exception_name[26]); } void isr27_handler(void) { - printf("%s\n", exception_name[27]); - panic(); + panic("%s\n", exception_name[27]); } void isr28_handler(void) { - printf("%s\n", exception_name[28]); - panic(); + panic("%s\n", exception_name[28]); } void isr29_handler(uint64_t error) { - printf("%s\n", exception_name[29]); - printf("error: %d\n", error); - panic(); + panic("%s, error: %d\n", exception_name[29], error); } void isr30_handler(uint64_t error) { - printf("%s\n", exception_name[30]); - printf("error: %d\n", error); - panic(); + panic("%s, error: %d\n", exception_name[30], error); } void isr31_handler(void) { - printf("%s\n", exception_name[31]); - panic(); + panic("%s\n", exception_name[31]); } void irq0_handler(void) diff --git a/kernel/src/cpu/irq_stub.S b/kernel/src/cpu/irq_stub.S index 5a8149c..f8a05b6 100644 --- a/kernel/src/cpu/irq_stub.S +++ b/kernel/src/cpu/irq_stub.S @@ -1,3 +1,5 @@ +.extern panic_rsp + .macro pushall push %rax push %rcx @@ -29,6 +31,7 @@ isr\number: pushall cld + mov %rsp, panic_rsp call isr\number\()_handler popall iretq @@ -40,6 +43,7 @@ isr\number: pushall mov 0x50(%rsp), %rdi cld + mov %rsp, panic_rsp call isr\number\()_handler popall add $8, %rsp @@ -84,6 +88,7 @@ isr_no_error 31 irq\number: pushall cld + mov %rsp, panic_rsp call irq\number\()_handler popall iretq diff --git a/kernel/src/cpu/registers.c b/kernel/src/cpu/registers.c index 03efcdf..997d4af 100644 --- a/kernel/src/cpu/registers.c +++ b/kernel/src/cpu/registers.c @@ -1,32 +1,7 @@ #include <types.h> -#include <libk/serial_stdio.h> +#include <libk/stdio.h> +#include <registers.h> -struct registers_t { - uint64_t rax; - uint64_t rbx; - uint64_t rcx; - uint64_t rdx; - uint64_t rsi; - uint64_t rdi; - uint64_t rsp; - uint64_t rbp; - uint64_t r8; - uint64_t r9; - uint64_t r10; - uint64_t r11; - uint64_t r12; - uint64_t r13; - uint64_t r14; - uint64_t r15; - uint64_t rip; - uint16_t cs; - uint16_t ds; - uint16_t ss; - uint16_t es; - uint16_t fs; - uint16_t gs; -}; -typedef struct registers_t registers_t; void print_reg(registers_t* registers) { diff --git a/kernel/src/cpu/tss.c b/kernel/src/cpu/tss.c index a1224f6..0dfa18e 100644 --- a/kernel/src/cpu/tss.c +++ b/kernel/src/cpu/tss.c @@ -1,6 +1,7 @@ #include <tss.h> #include <heap.h> #include <libk/stdio.h> +#include <libk/string.h> tss_type tss; diff --git a/kernel/src/devices/keyboard.c b/kernel/src/devices/keyboard.c index c5aa245..0a2e364 100644 --- a/kernel/src/devices/keyboard.c +++ b/kernel/src/devices/keyboard.c @@ -3,6 +3,7 @@ #include <pic.h> #include <io.h> #include <keymap.h> +#include <graphics.h> #include <libk/stdio.h> #include <libk/math.h> #include <libk/string.h> @@ -33,7 +34,7 @@ void keyboard_handler() if (keycode == KEY_SPACE) { write_buff(keyboard_buffer, " ", 1); } else if (keycode == KEY_BACKSPACE) { - if (curr_x != 0) + if (main_fb.x != 0) write_buff(keyboard_buffer, "\b \b", 3); } else if (keycode == KEY_ENTER) { char* output = kalloc(sizeof(char) + 1); diff --git a/kernel/src/libk/serial_stdio.c b/kernel/src/libk/serial_stdio.c index fb61ba1..951a170 100644 --- a/kernel/src/libk/serial_stdio.c +++ b/kernel/src/libk/serial_stdio.c @@ -33,12 +33,19 @@ void serial_print_hex(uint64_t num) void serial_printf(const char *s, ...) { - size_t count = 0; - for(size_t i = 0; i < strlen(s); i++) if(s[i] == '%') count++; - va_list list; va_start(list, s); + serial_vprintf(s, list); + + va_end(list); +} + +void serial_vprintf(const char *s, va_list list) +{ + size_t count = 0; + for(size_t i = 0; i < strlen(s); i++) if(s[i] == '%') count++; + for(size_t i = 0; i < strlen(s); i++) { if(s[i] == '%') @@ -50,12 +57,10 @@ void serial_printf(const char *s, ...) else if(s[i] == 'x') serial_print_hex((uint64_t)va_arg(list, uint64_t)); else { - serial_print_string("Wrong format using serial_printf\n"); + serial_print_string("Wrong format using printf\n"); return; } } else serial_print_char(s[i]); } - - va_end(list); } diff --git a/kernel/src/libk/stdio.c b/kernel/src/libk/stdio.c index e7e372d..8ecd97c 100644 --- a/kernel/src/libk/stdio.c +++ b/kernel/src/libk/stdio.c @@ -1,38 +1,32 @@ -#include <types.h> #include <libk/stdio.h> -#include <libk/serial_stdio.h> -#include <stdarg.h> #include <libk/string.h> #include <graphics.h> #include <serial.h> -uint32_t curr_x; -uint32_t curr_y; - void print_char(char c) { - if (curr_x * 8 >= main_fb.width) { - curr_x = 0; - curr_y++; + if (main_fb.x * 8 >= main_fb.width) { + main_fb.x = 0; + main_fb.y++; } - if (curr_y * 16 >= main_fb.height) { - curr_x = 0; - curr_y = 0; + if (main_fb.y * 16 >= main_fb.height) { + main_fb.x = 0; + main_fb.y = 0; } if (c == '\n') { write_serial('\n'); - curr_x = 0; - curr_y++; + main_fb.x = 0; + main_fb.y++; return; } if (c == '\b') { - if (curr_x != 0) { - curr_x--; + if (main_fb.x != 0) { + main_fb.x--; } return; } - fb_draw_character(main_fb, c, (int32_t)curr_x * 8, (int32_t)curr_y * 16, WHITE, BLACK); - curr_x++; + fb_draw_character(main_fb, c, (int32_t)main_fb.x * 8, (int32_t)main_fb.y * 16); + main_fb.x++; write_serial(c); } @@ -60,12 +54,19 @@ void print_hex(uint64_t num) void printf(const char *s, ...) { - size_t count = 0; - for(size_t i = 0; i < strlen(s); i++) if(s[i] == '%') count++; - va_list list; va_start(list, s); + vprintf(s, list); + + va_end(list); +} + +void vprintf(const char *s, va_list list) +{ + size_t count = 0; + for(size_t i = 0; i < strlen(s); i++) if(s[i] == '%') count++; + for(size_t i = 0; i < strlen(s); i++) { if(s[i] == '%') @@ -83,6 +84,4 @@ void printf(const char *s, ...) } else print_char(s[i]); } - - va_end(list); } diff --git a/kernel/src/mem/paging.c b/kernel/src/mem/paging.c index fd88dbc..5e248cf 100644 --- a/kernel/src/mem/paging.c +++ b/kernel/src/mem/paging.c @@ -1,5 +1,6 @@ #include <types.h> #include <paging.h> +#include <panic.h> #include <heap.h> #include <libk/serial_stdio.h> @@ -64,5 +65,9 @@ void page_fault(uint64_t error) printf("address: 0x%x, error code: %d\n", addr, error); + if (error == 7) { + panic("Accessing privileged page in usermode\n"); + } + map_addr(addr, addr, FLAG_PRESENT | FLAG_WRITABLE | FLAG_USER); } diff --git a/kernel/src/misc/graphics.c b/kernel/src/misc/graphics.c index 7c68b36..92fa9c5 100644 --- a/kernel/src/misc/graphics.c +++ b/kernel/src/misc/graphics.c @@ -18,6 +18,23 @@ void fb_draw_pixel(volatile fb_t fb, int32_t x, int32_t y, uint32_t col) fb_buff[fb_offset / 4] = col; } +void set_color(volatile fb_t* fb, uint32_t char_col, uint32_t bg_col) +{ + fb->char_col = char_col; + fb->bg_col = bg_col; +} + +void clear_screen(volatile fb_t fb) +{ + for (size_t i = 0; i < fb.height; i++) { + for (size_t j = 0; j < fb.width; j++) { + fb_draw_pixel(fb, (int32_t)i, (int32_t)j, BLACK); + } + } + fb.x = 0; + fb.y = 0; +} + /* https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm */ void fb_draw_line_low(volatile fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t col) @@ -82,7 +99,7 @@ void fb_draw_line(volatile fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t } } -void fb_draw_character(volatile fb_t fb, char c, int32_t x, int32_t y, uint32_t char_col, uint32_t bg_col) +void fb_draw_character(volatile fb_t fb, char c, int32_t x, int32_t y) { if (c < 0) return; @@ -92,17 +109,10 @@ void fb_draw_character(volatile fb_t fb, char c, int32_t x, int32_t y, uint32_t for (int32_t j = 0 ; j < 8; j++) { if (font[offset + i] & (1 << (7 - j))) { - fb_draw_pixel(fb, x + j, y + i, char_col); + fb_draw_pixel(fb, x + j, y + i, fb.char_col); } else { - fb_draw_pixel(fb, x + j, y + i, bg_col); + fb_draw_pixel(fb, x + j, y + i, fb.bg_col); } } } } - -void fb_draw_string(volatile fb_t fb, const char* s, int32_t x, int32_t y, uint32_t char_col, uint32_t bg_col) -{ - for (size_t i = 0; i < strlen(s); i++) { - fb_draw_character(fb, s[i], (x + (int32_t)i * 8), y, char_col, bg_col); - } -} diff --git a/kernel/src/sys/syscall.c b/kernel/src/sys/syscall.c index 7f0e492..c526e39 100644 --- a/kernel/src/sys/syscall.c +++ b/kernel/src/sys/syscall.c @@ -1,9 +1,35 @@ #include <libk/stdio.h> #include <syscall.h> +#include <libk/string.h> +#include <heap.h> void syscall_handler() { uint64_t rax; + uint64_t rdi; + uint64_t rsi; __asm__ volatile ("mov %%rax, %0;" : "=r"(rax) : :); - printf("syscall invoked with rax=0x%x\n", rax); + __asm__ volatile ("mov %%rdi, %0;" : "=r"(rdi) : :); + __asm__ volatile ("mov %%rsi, %0;" : "=r"(rsi) : :); + switch(rax) { + case SYSCALL_READ: + syscall_read(); + break; + case SYSCALL_WRITE: + syscall_write((char*)rdi, rsi); + break; + default: + printf("invalid syscall (%d)\n", rax); + } +} + +void syscall_read() +{ + printf("syscall_read()\n"); +} + +void syscall_write(char* buff, size_t count) +{ + printf("syscall_write()\n"); + printf("buff = 0x%x, count = %d\n", buff, count); } diff --git a/kernel/src/sys/userspace.c b/kernel/src/sys/userspace.c index 111180a..fc89746 100644 --- a/kernel/src/sys/userspace.c +++ b/kernel/src/sys/userspace.c @@ -1,11 +1,15 @@ #include <types.h> #include <userspace.h> +#include <libk/stdio.h> +#include <libk/string.h> void begin_userspace() { + // read + __asm__ volatile ("mov $0x0, %rax; syscall;"); + // write __asm__ volatile ("mov $0x1, %rax; syscall;"); - __asm__ volatile ("mov $0x11, %rax; syscall;"); - __asm__ volatile ("mov $0x111, %rax; syscall;"); + while(true) { } } |
