diff options
| author | Aleksa Vuckovic <aleksav013@gmail.com> | 2022-08-12 15:36:57 +0200 |
|---|---|---|
| committer | Aleksa Vuckovic <aleksav013@gmail.com> | 2022-08-12 15:48:26 +0200 |
| commit | 5c1c4eb0a4084b666342e6f8eb348eb80be6214b (patch) | |
| tree | 18fd33482c2cdd66eb6be18ac25ad8bde62012ad | |
| parent | 97c5f8569a845b6e9b3f75460b3b90a2de9b72a8 (diff) | |
memcpy, memset; small fixes
| -rw-r--r-- | kernel/include/graphics.h | 2 | ||||
| -rw-r--r-- | kernel/include/heap.h | 3 | ||||
| -rw-r--r-- | kernel/include/keyboard.h | 2 | ||||
| -rw-r--r-- | kernel/include/libk/math.h | 2 | ||||
| -rw-r--r-- | kernel/include/libk/stdio.h | 3 | ||||
| -rw-r--r-- | kernel/include/libk/string.h | 3 | ||||
| -rw-r--r-- | kernel/src/cpu/io.c | 4 | ||||
| -rw-r--r-- | kernel/src/cpu/irq_stub.S | 5 | ||||
| -rw-r--r-- | kernel/src/devices/keyboard.c | 3 | ||||
| -rw-r--r-- | kernel/src/libk/stdio.c | 32 | ||||
| -rw-r--r-- | kernel/src/libk/string.c | 41 | ||||
| -rw-r--r-- | kernel/src/main.c | 17 | ||||
| -rw-r--r-- | kernel/src/mem/heap.c | 4 | ||||
| -rw-r--r-- | kernel/src/mem/paging.c | 2 | ||||
| -rw-r--r-- | kernel/src/misc/graphics.c | 6 |
15 files changed, 98 insertions, 31 deletions
diff --git a/kernel/include/graphics.h b/kernel/include/graphics.h index 6876d3a..e974781 100644 --- a/kernel/include/graphics.h +++ b/kernel/include/graphics.h @@ -23,7 +23,7 @@ extern fb_t main_fb; #define WHITE 0x00ffffff #define BLACK 0x00000000 -uint64_t* pixel_offset(fb_t fb, int32_t x, int32_t y); +uint32_t* pixel_offset(fb_t fb, uint32_t x, uint32_t y); void fb_draw_pixel(fb_t fb, int32_t x, int32_t y, 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); void fb_draw_line_high(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t col); diff --git a/kernel/include/heap.h b/kernel/include/heap.h index 5997b7a..88a9ad0 100644 --- a/kernel/include/heap.h +++ b/kernel/include/heap.h @@ -3,7 +3,8 @@ #include <types.h> -#define HEAP_START_ADDR 0x00400000 +#define HEAP_VMEM_ADDR 0xc0400000 +#define HEAP_PMEM_ADDR 0x00400000 #define HEAP_SIZE 0x01000000 #define HEAP_BLOCK_SIZE 0x00000010 diff --git a/kernel/include/keyboard.h b/kernel/include/keyboard.h index 6d395f3..e8dc774 100644 --- a/kernel/include/keyboard.h +++ b/kernel/include/keyboard.h @@ -6,8 +6,6 @@ #define KEYBOARD_DATA_PORT 0x60 #define KEYBOARD_STATUS_PORT 0x64 -uint64_t stoi(const char *s); -void itos(uint64_t num, char* s); void keyboard_handler(void); #endif diff --git a/kernel/include/libk/math.h b/kernel/include/libk/math.h index 27fee80..ec3363a 100644 --- a/kernel/include/libk/math.h +++ b/kernel/include/libk/math.h @@ -3,6 +3,8 @@ #include <types.h> +#define min(a,b) (a > b ? b : a) +#define max(a,b) (a > b ? a : b) #define upper_div(a,b) ((a / b) * b < a ? (a / b) + 1 : (a / b)) int64_t abs(int64_t val); diff --git a/kernel/include/libk/stdio.h b/kernel/include/libk/stdio.h index 6799f11..99064f9 100644 --- a/kernel/include/libk/stdio.h +++ b/kernel/include/libk/stdio.h @@ -3,6 +3,9 @@ #include <types.h> +extern uint32_t curr_x; +extern uint32_t curr_y; + void printf(const char *s, ...); #endif diff --git a/kernel/include/libk/string.h b/kernel/include/libk/string.h index 9fe8448..fd25cac 100644 --- a/kernel/include/libk/string.h +++ b/kernel/include/libk/string.h @@ -8,5 +8,8 @@ uint64_t stoi(const char *s); void itos(uint64_t num, char* s); void itoh(uint64_t num, char* s); void strrev(char *s); +void memcpy(const void* destptr, const void* srcptr, size_t n); +void memset(const void* destptr, uint8_t value, size_t n); +int32_t memcmp(const void* aptr, const void* bptr); #endif diff --git a/kernel/src/cpu/io.c b/kernel/src/cpu/io.c index 84298cb..1a68f08 100644 --- a/kernel/src/cpu/io.c +++ b/kernel/src/cpu/io.c @@ -4,11 +4,11 @@ uint8_t inb(uint32_t port) { uint8_t ret; - __asm__ volatile ("inb %%dx, %%al" : "=a"(ret) : "d"(port)); + __asm__ volatile ("inb %%dx, %%al;" : "=a"(ret) : "d"(port)); return ret; } void outb(uint32_t port, uint8_t value) { - __asm__ volatile ("outb %%al, %%dx" : : "d"(port), "a"(value)); + __asm__ volatile ("outb %%al, %%dx;" : : "d"(port), "a"(value)); } diff --git a/kernel/src/cpu/irq_stub.S b/kernel/src/cpu/irq_stub.S index ddd197a..4db722e 100644 --- a/kernel/src/cpu/irq_stub.S +++ b/kernel/src/cpu/irq_stub.S @@ -38,10 +38,11 @@ isr\number: .macro isr_error number .global isr\number isr\number: - # rdi not saved - pop %rdi + add $8, %rsp pushall cld + # setting error to 0 + mov $0, %rdi call isr\number\()_handler popall iretq diff --git a/kernel/src/devices/keyboard.c b/kernel/src/devices/keyboard.c index 76c12c7..f39f978 100644 --- a/kernel/src/devices/keyboard.c +++ b/kernel/src/devices/keyboard.c @@ -25,7 +25,8 @@ void keyboard_handler(void) printf(" "); } else if (keycode == KEY_BACKSPACE) { - printf("\b \b"); + if (curr_x != 0) + printf("\b \b"); } else if (keycode == KEY_ENTER) { printf("%c", keymap[keycode]); } else { diff --git a/kernel/src/libk/stdio.c b/kernel/src/libk/stdio.c index be75b73..da5d839 100644 --- a/kernel/src/libk/stdio.c +++ b/kernel/src/libk/stdio.c @@ -5,32 +5,32 @@ #include <libk/string.h> #include <graphics.h> -int32_t x; -int32_t y; +uint32_t curr_x; +uint32_t curr_y; inline void print_char(char c) { + if (curr_x * 8 >= main_fb.width) { + curr_x = 0; + curr_y++; + } + if (curr_y * 16 >= main_fb.height) { + curr_x = 0; + curr_y = 0; + } if (c == '\n') { - x = 0; - y++; + curr_x = 0; + curr_y++; return; } if (c == '\b') { - if (x != 0) { - x--; + if (curr_x != 0) { + curr_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++; + fb_draw_character(main_fb, c, (int32_t)curr_x * 8, (int32_t)curr_y * 16, WHITE, BLACK); + curr_x++; } inline void print_string(const char* s) diff --git a/kernel/src/libk/string.c b/kernel/src/libk/string.c index 6d7ab69..be37ba9 100644 --- a/kernel/src/libk/string.c +++ b/kernel/src/libk/string.c @@ -67,3 +67,44 @@ void itoh(uint64_t num, char* s) s[i] = '\0'; strrev(s); } + +void memcpy(const void* destptr, const void* srcptr, size_t n) +{ + uint8_t* dest = (uint8_t*)destptr; + const uint8_t* src = (const uint8_t*)srcptr; + + for(size_t i = 0; i < n; i++) { + dest[i] = src[i]; + } +} + +void memset(const void* destptr, uint8_t value, size_t n) +{ + uint8_t* dest = (uint8_t*)destptr; + + for (size_t i = 0; i < n; i++) { + dest[i] = value; + } +} + +int32_t memcmp(const void* aptr, const void* bptr) +{ + const uint8_t* a = (const uint8_t*)aptr; + const uint8_t* b = (const uint8_t*)bptr; + + const size_t len_a = strlen((char*)a); + const size_t len_b = strlen((char*)b); + + for (size_t i = 0; i < len_a && i < len_b; i++) { + if (a[i] != b[i]) + return a[i] - b[i]; + } + + if (len_a < len_b) { + return -1; + } + if (len_a > len_b) { + return 1; + } + return 0; +} diff --git a/kernel/src/main.c b/kernel/src/main.c index 7cc1084..95951bd 100644 --- a/kernel/src/main.c +++ b/kernel/src/main.c @@ -7,6 +7,7 @@ #include <heap.h> #include <keyboard.h> #include <libk/stdio.h> +#include <libk/string.h> #include <libk/math.h> int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic); @@ -17,6 +18,22 @@ int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) init_heap(); init_fb(multiboot_bootinfo, multiboot_magic); + size_t n = 15; + uint16_t* a = (uint16_t*)kalloc(sizeof(uint16_t) * (uint32_t)n); + for (size_t i = 0; i < n; i++) { + a[i] = (uint16_t)i + 250; + } + + uint8_t* b = (uint8_t*)kalloc(sizeof(uint16_t) * (uint32_t)n); + memcpy(b, a, sizeof(uint16_t) * n); + + for (size_t i = 0; i < 2 * n; i++) { + printf("b[%d] = %d\n", i, b[i]); + } + + __asm__ volatile ("movq $4, 0x1000000;"); + + for(;;) { __asm__ volatile ("hlt;"); } diff --git a/kernel/src/mem/heap.c b/kernel/src/mem/heap.c index 3dfb0ea..229933b 100644 --- a/kernel/src/mem/heap.c +++ b/kernel/src/mem/heap.c @@ -121,7 +121,7 @@ void init_heap() // allocate pages for kheap for (size_t i = 0; i < upper_div(HEAP_SIZE, PAGE_SIZE); i++) - map_addr(HEAP_START_ADDR + i * PAGE_SIZE, HEAP_START_ADDR + i * PAGE_SIZE, FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE); + map_addr(HEAP_VMEM_ADDR + i * PAGE_SIZE, HEAP_PMEM_ADDR + i * PAGE_SIZE, FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE); - kheap_add_block(&main_kheap, HEAP_START_ADDR, HEAP_SIZE, HEAP_BLOCK_SIZE); + kheap_add_block(&main_kheap, HEAP_VMEM_ADDR, HEAP_SIZE, HEAP_BLOCK_SIZE); } diff --git a/kernel/src/mem/paging.c b/kernel/src/mem/paging.c index cd1cb68..531c300 100644 --- a/kernel/src/mem/paging.c +++ b/kernel/src/mem/paging.c @@ -62,7 +62,7 @@ void init_paging(void) void page_fault(uint64_t error) { uint64_t addr; - __asm__ volatile ("mov %%cr2, %0" : "=r"(addr) : : "memory"); + __asm__ volatile ("mov %%cr2, %0;" : "=r"(addr) : : "memory"); map_addr(addr, addr, FLAG_PRESENT | FLAG_WRITABLE | FLAG_HUGE); diff --git a/kernel/src/misc/graphics.c b/kernel/src/misc/graphics.c index 5cb11bf..c899978 100644 --- a/kernel/src/misc/graphics.c +++ b/kernel/src/misc/graphics.c @@ -8,9 +8,9 @@ fb_t main_fb; -uint64_t* pixel_offset(fb_t fb, int32_t x, int32_t y) +uint32_t* pixel_offset(fb_t fb, uint32_t x, uint32_t y) { - return (uint64_t*)((char*)fb.addr + y * (int32_t)fb.pitch + x * fb.bpp / 8); + return (uint32_t*)((char*)fb.addr + y * fb.pitch + x * fb.bpp / 8); } void fb_draw_pixel(fb_t fb, int32_t x, int32_t y, uint32_t col) @@ -18,7 +18,7 @@ void fb_draw_pixel(fb_t fb, int32_t x, int32_t y, uint32_t col) 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); + uint32_t* fb_offset = pixel_offset(fb, (uint32_t)x, (uint32_t)y); *fb_offset = col; } |
