diff options
| author | Aleksa Vuckovic <aleksav013@gmail.com> | 2022-08-08 21:25:55 +0200 |
|---|---|---|
| committer | Aleksa Vuckovic <aleksav013@gmail.com> | 2022-08-08 21:26:37 +0200 |
| commit | e11298e56be560de64bbccfe74fef7ff85c623d1 (patch) | |
| tree | d8323a711d0887bd1ef0c55025d93a9b551cc7aa /kernel/src | |
| parent | 0162997df4ae7769bd4fc055b2c03b473846d1f5 (diff) | |
stdio.h; gcc $(WARNINGS)
Diffstat (limited to 'kernel/src')
| -rw-r--r-- | kernel/src/boot/multiboot2.c | 15 | ||||
| -rw-r--r-- | kernel/src/cpu/idt.c | 3 | ||||
| -rw-r--r-- | kernel/src/cpu/io.c | 1 | ||||
| -rw-r--r-- | kernel/src/cpu/irq.c | 80 | ||||
| -rw-r--r-- | kernel/src/devices/keyboard.c | 55 | ||||
| -rw-r--r-- | kernel/src/libk/math.c | 1 | ||||
| -rw-r--r-- | kernel/src/libk/stdio.c | 76 | ||||
| -rw-r--r-- | kernel/src/libk/string.c | 7 | ||||
| -rw-r--r-- | kernel/src/main.c | 7 | ||||
| -rw-r--r-- | kernel/src/mem/heap.c | 1 | ||||
| -rw-r--r-- | kernel/src/mem/paging.c | 8 | ||||
| -rw-r--r-- | kernel/src/misc/debug.c | 2 | ||||
| -rw-r--r-- | kernel/src/misc/graphics.c | 33 |
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); } } |
