summaryrefslogtreecommitdiff
path: root/kernel/src
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src')
-rw-r--r--kernel/src/boot/multiboot2.c15
-rw-r--r--kernel/src/cpu/idt.c3
-rw-r--r--kernel/src/cpu/io.c1
-rw-r--r--kernel/src/cpu/irq.c80
-rw-r--r--kernel/src/devices/keyboard.c55
-rw-r--r--kernel/src/libk/math.c1
-rw-r--r--kernel/src/libk/stdio.c76
-rw-r--r--kernel/src/libk/string.c7
-rw-r--r--kernel/src/main.c7
-rw-r--r--kernel/src/mem/heap.c1
-rw-r--r--kernel/src/mem/paging.c8
-rw-r--r--kernel/src/misc/debug.c2
-rw-r--r--kernel/src/misc/graphics.c33
13 files changed, 176 insertions, 113 deletions
diff --git a/kernel/src/boot/multiboot2.c b/kernel/src/boot/multiboot2.c
index fd8a652..75a1f8d 100644
--- a/kernel/src/boot/multiboot2.c
+++ b/kernel/src/boot/multiboot2.c
@@ -1,14 +1,11 @@
#include <types.h>
-
#include <multiboot2.h>
+
#include <graphics.h>
#include <debug.h>
-
#define KERNEL_VMA 0xc0000000
-fb_t fb;
-
/* https://www.gnu.org/software/grub/manual/multiboot2/html_node/Boot-information-format.html */
void init_fb(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic)
@@ -39,9 +36,9 @@ void init_fb(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic)
tag_header += tag_header->size / 8 + ((tag_header->size % 8) > 0);
}
- fb.addr = tag_fb->framebuffer_addr;
- fb.width = tag_fb->framebuffer_width;
- fb.height = tag_fb->framebuffer_height;
- fb.pitch = tag_fb->framebuffer_pitch;
- fb.bpp = tag_fb->framebuffer_bpp;
+ main_fb.addr = tag_fb->framebuffer_addr;
+ main_fb.width = tag_fb->framebuffer_width;
+ main_fb.height = tag_fb->framebuffer_height;
+ main_fb.pitch = tag_fb->framebuffer_pitch;
+ main_fb.bpp = tag_fb->framebuffer_bpp;
}
diff --git a/kernel/src/cpu/idt.c b/kernel/src/cpu/idt.c
index bf285b7..e900c77 100644
--- a/kernel/src/cpu/idt.c
+++ b/kernel/src/cpu/idt.c
@@ -1,4 +1,5 @@
#include <idt.h>
+
#include <irq.h>
#include <pic.h>
@@ -14,7 +15,7 @@ void add_to_idt(uint16_t num, uint64_t offset, uint16_t selector, uint8_t type)
{
idt_table[num].offset_1 = offset & 0xFFFF;
idt_table[num].offset_2 = (offset >> 16) & 0xFFFF;
- idt_table[num].offset_3 = offset >> 32;
+ idt_table[num].offset_3 = (uint32_t)(offset >> 32);
idt_table[num].selector = selector;
idt_table[num].type_attributes = type;
idt_table[num].ist = 0;
diff --git a/kernel/src/cpu/io.c b/kernel/src/cpu/io.c
index a73c5b1..84298cb 100644
--- a/kernel/src/cpu/io.c
+++ b/kernel/src/cpu/io.c
@@ -1,4 +1,5 @@
#include <types.h>
+#include <io.h>
uint8_t inb(uint32_t port)
{
diff --git a/kernel/src/cpu/irq.c b/kernel/src/cpu/irq.c
index c81cc98..be0d2a2 100644
--- a/kernel/src/cpu/irq.c
+++ b/kernel/src/cpu/irq.c
@@ -1,11 +1,13 @@
#include <types.h>
+#include <irq_handler.h>
#include <pic.h>
#include <io.h>
#include <keyboard.h>
-#include <graphics.h>
+#include <paging.h>
+#include <libk/stdio.h>
-char* exception_name[] = {
+const char* exception_name[] = {
"Divide-by-zero Error",
"Debug",
"Non-maskable Interrupt",
@@ -42,162 +44,172 @@ char* exception_name[] = {
void isr0_handler(void)
{
- fb_draw_string(fb, exception_name[0], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[0]);
}
void isr1_handler(void)
{
- fb_draw_string(fb, exception_name[1], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[1]);
}
void isr2_handler(void)
{
- fb_draw_string(fb, exception_name[2], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[2]);
}
void isr3_handler(void)
{
- fb_draw_string(fb, exception_name[3], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[3]);
}
void isr4_handler(void)
{
- fb_draw_string(fb, exception_name[4], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[4]);
}
void isr5_handler(void)
{
- fb_draw_string(fb, exception_name[5], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[5]);
}
void isr6_handler(void)
{
- fb_draw_string(fb, exception_name[6], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[6]);
}
void isr7_handler(void)
{
- fb_draw_string(fb, exception_name[7], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[7]);
}
void isr8_handler(uint64_t error)
{
- fb_draw_string(fb, exception_name[8], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[8]);
+ printf("error: %d\n", error);
}
void isr9_handler(void)
{
- fb_draw_string(fb, exception_name[9], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[9]);
}
void isr10_handler(uint64_t error)
{
- fb_draw_string(fb, exception_name[10], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[10]);
+ printf("error: %d\n", error);
}
void isr11_handler(uint64_t error)
{
- fb_draw_string(fb, exception_name[11], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[11]);
+ printf("error: %d\n", error);
}
void isr12_handler(uint64_t error)
{
- fb_draw_string(fb, exception_name[12], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[12]);
+ printf("error: %d\n", error);
}
void isr13_handler(uint64_t error)
{
- fb_draw_string(fb, exception_name[13], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[13]);
+ printf("error: %d\n", error);
}
void isr14_handler(uint64_t error)
{
- fb_draw_string(fb, exception_name[14], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[14]);
+ printf("error: %d\n", error);
}
void isr15_handler(void)
{
- fb_draw_string(fb, exception_name[15], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[15]);
}
void isr16_handler(void)
{
- fb_draw_string(fb, exception_name[16], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[16]);
}
void isr17_handler(uint64_t error)
{
- fb_draw_string(fb, exception_name[17], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[17]);
+ printf("error: %d\n", error);
}
void isr18_handler(void)
{
- fb_draw_string(fb, exception_name[18], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[18]);
}
void isr19_handler(void)
{
- fb_draw_string(fb, exception_name[19], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[19]);
}
void isr20_handler(void)
{
- fb_draw_string(fb, exception_name[20], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[20]);
}
void isr21_handler(uint64_t error)
{
- fb_draw_string(fb, exception_name[21], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[21]);
+ printf("error: %d\n", error);
}
void isr22_handler(void)
{
- fb_draw_string(fb, exception_name[22], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[22]);
}
void isr23_handler(void)
{
- fb_draw_string(fb, exception_name[23], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[23]);
}
void isr24_handler(void)
{
- fb_draw_string(fb, exception_name[24], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[24]);
}
void isr25_handler(void)
{
- fb_draw_string(fb, exception_name[25], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[25]);
}
void isr26_handler(void)
{
- fb_draw_string(fb, exception_name[26], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[26]);
}
void isr27_handler(void)
{
- fb_draw_string(fb, exception_name[27], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[27]);
}
void isr28_handler(void)
{
- fb_draw_string(fb, exception_name[28], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[28]);
}
void isr29_handler(uint64_t error)
{
- fb_draw_string(fb, exception_name[29], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[29]);
+ printf("error: %d\n", error);
}
void isr30_handler(uint64_t error)
{
- fb_draw_string(fb, exception_name[30], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[30]);
+ printf("error: %d\n", error);
}
void isr31_handler(void)
{
- fb_draw_string(fb, exception_name[31], 0, 0, WHITE, BLACK);
+ printf("%s\n", exception_name[31]);
}
void irq0_handler(void)
diff --git a/kernel/src/devices/keyboard.c b/kernel/src/devices/keyboard.c
index f873a29..76c12c7 100644
--- a/kernel/src/devices/keyboard.c
+++ b/kernel/src/devices/keyboard.c
@@ -1,53 +1,17 @@
#include <types.h>
+#include <keyboard.h>
#include <pic.h>
#include <io.h>
-#include <graphics.h>
-#include <debug.h>
#include <keymap.h>
-#include <libk/string.h>
+#include <libk/stdio.h>
+#include <libk/math.h>
#define KEYBOARD_DATA_PORT 0x60
#define KEYBOARD_STATUS_PORT 0x64
-static uint32_t x;
-static uint32_t y;
bool is_pressed[128];
-void print_char(char c)
-{
-
- if (c == '\n') {
- x = 0;
- y++;
- return;
- }
- if (x * 8 >= fb.width) {
- x = 0;
- y++;
- }
- if (y * 16 >= fb.height) {
- x = 0;
- y = 0;
- }
- fb_draw_character(fb, c, x * 8, y * 16, WHITE, BLACK);
- x++;
-}
-
-void print_string(char* s)
-{
- for (size_t i = 0; i < strlen(s); i++) {
- print_char(s[i]);
- }
-}
-
-void print_int(uint64_t num)
-{
- char a[100];
- itos(num, a);
- print_string(a);
-}
-
void keyboard_handler(void)
{
uint8_t status = inb(KEYBOARD_STATUS_PORT);
@@ -58,21 +22,18 @@ void keyboard_handler(void)
if (keycode < keymap_len) {
is_pressed[keycode] = true;
if (keycode == KEY_SPACE) {
- print_char(' ');
+ printf(" ");
} else if (keycode == KEY_BACKSPACE) {
- if (!x) return;
- x--;
- print_char(' ');
- x--;
+ printf("\b \b");
} else if (keycode == KEY_ENTER) {
- print_char(keymap[keycode]);
+ printf("%c", keymap[keycode]);
} else {
if (keymap[keycode] == ' ') return;
if (is_pressed[KEY_LSHIFT] || is_pressed[KEY_RSHIFT])
- print_char(shift_keymap[keycode]);
+ printf("%c", shift_keymap[keycode]);
else
- print_char(keymap[keycode]);
+ printf("%c", keymap[keycode]);
}
} else {
is_pressed[keycode - 128] = false;
diff --git a/kernel/src/libk/math.c b/kernel/src/libk/math.c
index c2f9c5e..f625fb5 100644
--- a/kernel/src/libk/math.c
+++ b/kernel/src/libk/math.c
@@ -1,4 +1,5 @@
#include <types.h>
+#include <libk/math.h>
int64_t abs(int64_t val)
{
diff --git a/kernel/src/libk/stdio.c b/kernel/src/libk/stdio.c
new file mode 100644
index 0000000..b8ddb67
--- /dev/null
+++ b/kernel/src/libk/stdio.c
@@ -0,0 +1,76 @@
+#include <types.h>
+#include <libk/stdio.h>
+
+#include <stdarg.h>
+#include <libk/string.h>
+#include <graphics.h>
+
+int32_t x;
+int32_t y;
+
+inline void print_char(char c)
+{
+ if (c == '\n') {
+ x = 0;
+ y++;
+ return;
+ }
+ if (c == '\b') {
+ if (x != 0) {
+ x--;
+ }
+ return;
+ }
+ if (x * 8 >= (int32_t)main_fb.width) {
+ x = 0;
+ y++;
+ }
+ if (y * 16 >= (int32_t)main_fb.height) {
+ x = 0;
+ y = 0;
+ }
+ fb_draw_character(main_fb, c, x * 8, y * 16, WHITE, BLACK);
+ x++;
+}
+
+inline void print_string(const char* s)
+{
+ for (size_t i = 0; i < strlen(s); i++) {
+ print_char(s[i]);
+ }
+}
+
+inline void print_int(uint64_t num)
+{
+ char a[100];
+ itos(num, a);
+ print_string(a);
+}
+
+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);
+
+ for(size_t i = 0; i < strlen(s); i++)
+ {
+ if(s[i] == '%')
+ {
+ i++;
+ if(s[i] == 'c') print_char((char)va_arg(list, uint32_t));
+ else if(s[i] == 's') print_string(va_arg(list, char*));
+ else if(s[i] == 'd') print_int((uint64_t)va_arg(list, uint64_t));
+ else
+ {
+ print_string("Wrong format using printf\n");
+ return;
+ }
+ }
+ else print_char(s[i]);
+ }
+
+ va_end(list);
+}
diff --git a/kernel/src/libk/string.c b/kernel/src/libk/string.c
index a4d0191..fde9645 100644
--- a/kernel/src/libk/string.c
+++ b/kernel/src/libk/string.c
@@ -1,10 +1,11 @@
#include <types.h>
+#include <libk/string.h>
size_t strlen(const char* s)
{
char *p = (char*)s;
while (*p) p++;
- return p - s;
+ return (size_t)(p - s);
}
uint64_t stoi(const char *s)
@@ -14,7 +15,7 @@ uint64_t stoi(const char *s)
for (size_t i = 0; i < n; i++) {
num *= 10;
- num += s[i] - '0';
+ num += (uint64_t)(s[i] - '0');
}
return num;
@@ -36,7 +37,7 @@ void itos(uint64_t num, char* s)
{
size_t i;
for (i = 0; num; num/=10, i++) {
- s[i] = '0' + num%10;
+ s[i] = (char)('0' + num%10);
}
s[i] = '\0';
strrev(s);
diff --git a/kernel/src/main.c b/kernel/src/main.c
index 8a57d45..80b0d6a 100644
--- a/kernel/src/main.c
+++ b/kernel/src/main.c
@@ -3,19 +3,20 @@
#include <multiboot2.h>
#include <graphics.h>
#include <idt.h>
-#include <debug.h>
#include <paging.h>
#include <heap.h>
#include <keyboard.h>
+#include <libk/stdio.h>
+int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic);
int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic)
{
init_paging();
- init_heap(HEAP_START_ADDR, HEAP_SIZE, HEAP_BLOCK_SIZE);
+// init_heap(HEAP_START_ADDR, HEAP_SIZE, HEAP_BLOCK_SIZE);
init_idt();
init_fb(multiboot_bootinfo, multiboot_magic);
- print_int(0x1000);
+ __asm__ volatile ("int $2;");
for(;;) {
__asm__ volatile ("hlt;");
diff --git a/kernel/src/mem/heap.c b/kernel/src/mem/heap.c
index 545f6ea..b47cec0 100644
--- a/kernel/src/mem/heap.c
+++ b/kernel/src/mem/heap.c
@@ -1,3 +1,4 @@
+#include <types.h>
#include <heap.h>
void init_heap(uint64_t addr, uint64_t size, uint64_t block_size)
diff --git a/kernel/src/mem/paging.c b/kernel/src/mem/paging.c
index f0181cd..fdd1dd2 100644
--- a/kernel/src/mem/paging.c
+++ b/kernel/src/mem/paging.c
@@ -1,7 +1,8 @@
#include <types.h>
-
#include <paging.h>
+#include <libk/stdio.h>
+
void load_pt_lvl4(uint64_t*);
__attribute__((aligned(4096))) uint64_t page_table_lvl4[512];
@@ -35,3 +36,8 @@ void init_paging(void)
load_pt_lvl4(page_table_lvl4);
}
+
+void page_fault(uint64_t error)
+{
+ printf("%d\n", error);
+}
diff --git a/kernel/src/misc/debug.c b/kernel/src/misc/debug.c
index 2a940d3..d244d7a 100644
--- a/kernel/src/misc/debug.c
+++ b/kernel/src/misc/debug.c
@@ -1,3 +1,5 @@
+#include <debug.h>
+
void bochs_breakpoint(void)
{
__asm__ volatile ("xchgw %bx, %bx;");
diff --git a/kernel/src/misc/graphics.c b/kernel/src/misc/graphics.c
index 488e4fa..5cb11bf 100644
--- a/kernel/src/misc/graphics.c
+++ b/kernel/src/misc/graphics.c
@@ -1,19 +1,22 @@
#include <types.h>
+#include <graphics.h>
#include <multiboot2.h>
-#include <graphics.h>
#include <font.h>
#include <libk/string.h>
#include <libk/math.h>
-uint64_t* pixel_offset(fb_t fb, uint32_t x, uint32_t y)
+fb_t main_fb;
+
+uint64_t* pixel_offset(fb_t fb, int32_t x, int32_t y)
{
- return (uint64_t*)((char*)fb.addr + y * fb.pitch + x * fb.bpp / 8);
+ return (uint64_t*)((char*)fb.addr + y * (int32_t)fb.pitch + x * fb.bpp / 8);
}
-void fb_draw_pixel(fb_t fb, uint32_t x, uint32_t y, uint32_t col)
+void fb_draw_pixel(fb_t fb, int32_t x, int32_t y, uint32_t col)
{
- if (x >= fb.width || y >= fb.height) return;
+ if (x < 0 || y < 0) return;
+ if (x >= (int32_t)fb.width || y >= (int32_t)fb.height) return;
uint32_t* fb_offset = (uint32_t*)pixel_offset(fb, x, y);
*fb_offset = col;
@@ -21,7 +24,7 @@ void fb_draw_pixel(fb_t fb, uint32_t x, uint32_t y, uint32_t col)
/* https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm */
-void fb_draw_line_low(fb_t fb, uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint32_t col)
+void fb_draw_line_low(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t col)
{
int32_t dx = x1 - x0;
int32_t dy = y1 - y0;
@@ -45,7 +48,7 @@ void fb_draw_line_low(fb_t fb, uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y
}
-void fb_draw_line_high(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t col)
+void fb_draw_line_high(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t col)
{
int32_t dx = x1 - x0;
int32_t dy = y1 - y0;
@@ -68,7 +71,7 @@ void fb_draw_line_high(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1,
}
}
-void fb_draw_line(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t col)
+void fb_draw_line(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t col)
{
if (abs(y1 - y0) < abs(x1 - x0)) {
if (x0 > x1)
@@ -83,14 +86,14 @@ void fb_draw_line(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32
}
}
-void fb_draw_character(fb_t fb, char c, uint32_t x, uint32_t y, uint32_t char_col, uint32_t bg_col)
+void fb_draw_character(fb_t fb, char c, int32_t x, int32_t y, uint32_t char_col, uint32_t bg_col)
{
if (c < 0) return;
- uint32_t offset = 32 + c * 16;
- for (uint32_t i = 0 ; i < 16; i++)
+ int32_t offset = 32 + c * 16;
+ for (int32_t i = 0 ; i < 16; i++)
{
- for (uint32_t j = 0 ; j < 8; j++)
+ 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);
@@ -101,9 +104,9 @@ void fb_draw_character(fb_t fb, char c, uint32_t x, uint32_t y, uint32_t char_co
}
}
-void fb_draw_string(fb_t fb, const char* s, uint32_t x, uint32_t y, uint32_t char_col, uint32_t bg_col)
+void fb_draw_string(fb_t fb, const char* s, int32_t x, int32_t y, uint32_t char_col, uint32_t bg_col)
{
- for (uint32_t i = 0; i < strlen(s); i++) {
- fb_draw_character(fb, s[i], x + i * 8, y, char_col, 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);
}
}