summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile3
-rw-r--r--kernel/include/graphics.h11
-rw-r--r--kernel/include/libk/serial_stdio.h1
-rw-r--r--kernel/include/libk/stdio.h4
-rw-r--r--kernel/include/panic.h6
-rw-r--r--kernel/include/registers.h34
-rw-r--r--kernel/include/syscall.h7
-rw-r--r--kernel/include/types.h1
-rw-r--r--kernel/src/boot/multiboot2.c6
-rw-r--r--kernel/src/check/panic.c37
-rw-r--r--kernel/src/check/ssp.c3
-rw-r--r--kernel/src/check/ubsan.c5
-rw-r--r--kernel/src/cpu/irq.c104
-rw-r--r--kernel/src/cpu/irq_stub.S5
-rw-r--r--kernel/src/cpu/registers.c29
-rw-r--r--kernel/src/cpu/tss.c1
-rw-r--r--kernel/src/devices/keyboard.c3
-rw-r--r--kernel/src/libk/serial_stdio.c17
-rw-r--r--kernel/src/libk/stdio.c45
-rw-r--r--kernel/src/mem/paging.c5
-rw-r--r--kernel/src/misc/graphics.c30
-rw-r--r--kernel/src/sys/syscall.c28
-rw-r--r--kernel/src/sys/userspace.c8
23 files changed, 234 insertions, 159 deletions
diff --git a/Makefile b/Makefile
index 46dbd93..6dfc304 100644
--- a/Makefile
+++ b/Makefile
@@ -12,7 +12,8 @@ W += -Wwrite-strings
W += -Wredundant-decls -Wnested-externs -Winline -Wno-long-long -Wconversion
W += -Wstrict-prototypes
WNO := -Wno-error=unused-parameter -Wno-error=unused-variable
-WNO += -Wno-error=unused-but-set-variable -Wno-error=infinite-recursion
+WNO += -Wno-error=unused-but-set-variable -Wno-error=unused-but-set-parameter
+WNO += -Wno-error=infinite-recursion
CFLAGS = $(W) $(WNO) -fno-omit-frame-pointer -mcmodel=large
CFLAGS += -mgeneral-regs-only # disables SIMD instructions
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) {
}
}