summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksav013@gmail.com>2022-08-12 15:36:57 +0200
committerAleksa Vuckovic <aleksav013@gmail.com>2022-08-12 15:48:26 +0200
commit5c1c4eb0a4084b666342e6f8eb348eb80be6214b (patch)
tree18fd33482c2cdd66eb6be18ac25ad8bde62012ad
parent97c5f8569a845b6e9b3f75460b3b90a2de9b72a8 (diff)
memcpy, memset; small fixes
-rw-r--r--kernel/include/graphics.h2
-rw-r--r--kernel/include/heap.h3
-rw-r--r--kernel/include/keyboard.h2
-rw-r--r--kernel/include/libk/math.h2
-rw-r--r--kernel/include/libk/stdio.h3
-rw-r--r--kernel/include/libk/string.h3
-rw-r--r--kernel/src/cpu/io.c4
-rw-r--r--kernel/src/cpu/irq_stub.S5
-rw-r--r--kernel/src/devices/keyboard.c3
-rw-r--r--kernel/src/libk/stdio.c32
-rw-r--r--kernel/src/libk/string.c41
-rw-r--r--kernel/src/main.c17
-rw-r--r--kernel/src/mem/heap.c4
-rw-r--r--kernel/src/mem/paging.c2
-rw-r--r--kernel/src/misc/graphics.c6
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;
}