summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksav013@gmail.com>2022-08-07 16:39:28 +0200
committerAleksa Vuckovic <aleksav013@gmail.com>2022-08-07 16:43:26 +0200
commit71396c5cd460890c52e348687e6e7c864e2dfeed (patch)
tree72e7dd114cea46c5209dba2e0c2ed9ffeb7f55b5
parent50aaae893611af890a6855158ad0a3e32c7b2c43 (diff)
types.h; libk and heap begining
-rw-r--r--kernel/Makefile3
-rw-r--r--kernel/include/debug.h2
-rw-r--r--kernel/include/font.h18
-rw-r--r--kernel/include/graphics.h2
-rw-r--r--kernel/include/heap.h14
-rw-r--r--kernel/include/idt.h16
-rw-r--r--kernel/include/io.h2
-rw-r--r--kernel/include/irq.h2
-rw-r--r--kernel/include/keyboard.h7
-rw-r--r--kernel/include/keymap.h2
-rw-r--r--kernel/include/libk/math.h8
-rw-r--r--kernel/include/libk/string.h11
-rw-r--r--kernel/include/multiboot2.h2
-rw-r--r--kernel/include/types.h8
-rw-r--r--kernel/src/boot/multiboot2.c3
-rw-r--r--kernel/src/cpu/io.c2
-rw-r--r--kernel/src/cpu/irq.c3
-rw-r--r--kernel/src/devices/keyboard.c36
-rw-r--r--kernel/src/libk/math.c7
-rw-r--r--kernel/src/libk/mem.c0
-rw-r--r--kernel/src/libk/string.c43
-rw-r--r--kernel/src/main.c8
-rw-r--r--kernel/src/mem/heap.c16
-rw-r--r--kernel/src/mem/paging.c3
-rw-r--r--kernel/src/mem/paging_asm.S12
-rw-r--r--kernel/src/misc/debug.c2
-rw-r--r--kernel/src/misc/graphics.c18
27 files changed, 170 insertions, 80 deletions
diff --git a/kernel/Makefile b/kernel/Makefile
index d7a9fd5..22f5775 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -11,7 +11,10 @@ OBJS = \
src/cpu/irq_stub.o \
src/cpu/pic.o \
src/devices/keyboard.o \
+ src/libk/math.o \
+ src/libk/string.o \
src/main.o \
+ src/mem/heap.o \
src/mem/paging_asm.o \
src/mem/paging.o \
src/misc/debug.o \
diff --git a/kernel/include/debug.h b/kernel/include/debug.h
index ebe3a52..74648b9 100644
--- a/kernel/include/debug.h
+++ b/kernel/include/debug.h
@@ -1,8 +1,6 @@
#ifndef DEBUG_H
#define DEBUG_H
-#include <stdint.h>
-
void bochs_breakpoint(void);
#endif
diff --git a/kernel/include/font.h b/kernel/include/font.h
index 2bb00fa..f405a90 100644
--- a/kernel/include/font.h
+++ b/kernel/include/font.h
@@ -1,19 +1,19 @@
#ifndef FONT_H
#define FONT_H
-#include <stdint.h>
+#include <types.h>
#define PSF_FONT_MAGIC 0x864ab572
typedef struct {
- uint32_t magic; /* magic bytes to identify PSF */
- uint32_t version; /* zero */
- uint32_t headersize; /* offset of bitmaps in file, 32 */
- uint32_t flags; /* 0 if there's no unicode table */
- uint32_t numglyph; /* number of glyphs */
- uint32_t bytesperglyph; /* size of each glyph */
- uint32_t height; /* height in pixels */
- uint32_t width; /* width in pixels */
+ uint32_t magic; /* magic bytes to identify PSF */
+ uint32_t version; /* zero */
+ uint32_t headersize; /* offset of bitmaps in file, 32 */
+ uint32_t flags; /* 0 if there's no unicode table */
+ uint32_t numglyph; /* number of glyphs */
+ uint32_t bytesperglyph; /* size of each glyph */
+ uint32_t height; /* height in pixels */
+ uint32_t width; /* width in pixels */
} PSF_font;
/* font i used: /usr/share/kbd/consolefonts/lat9-16.psf.gz */
diff --git a/kernel/include/graphics.h b/kernel/include/graphics.h
index 84505d8..2714f62 100644
--- a/kernel/include/graphics.h
+++ b/kernel/include/graphics.h
@@ -1,7 +1,7 @@
#ifndef GRAPHICS_H
#define GRAPHICS_H
-#include <stdint.h>
+#include <types.h>
struct fb_t {
uint64_t addr;
diff --git a/kernel/include/heap.h b/kernel/include/heap.h
new file mode 100644
index 0000000..ae846bd
--- /dev/null
+++ b/kernel/include/heap.h
@@ -0,0 +1,14 @@
+#ifndef HEAP_H
+#define HEAP_H
+
+#include <types.h>
+
+#define HEAP_START_ADDR 0x00200000
+#define HEAP_SIZE 0x00100000
+#define HEAP_BLOCK_SIZE 0x00000100
+
+void init_heap(uint64_t addr, uint64_t size, uint64_t block_size);
+void* kmalloc(uint32_t size);
+void kfree(void *addr);
+
+#endif
diff --git a/kernel/include/idt.h b/kernel/include/idt.h
index 9ca9c3a..cc2278a 100644
--- a/kernel/include/idt.h
+++ b/kernel/include/idt.h
@@ -1,7 +1,7 @@
#ifndef IDT_H
#define IDT_H
-#include <stdint.h>
+#include <types.h>
#define GDT_CODE_SEG 0x08
@@ -9,13 +9,13 @@
#define TRAP_GATE 0x8F
struct idt_entry {
- uint16_t offset_1; // offset bits 0..15
- uint16_t selector; // a code segment selector in GDT or LDT
- uint8_t ist; // bits 0..2 holds Interrupt Stack Table offset, rest of bits zero.
- uint8_t type_attributes; // gate type, dpl, and p fields
- uint16_t offset_2; // offset bits 16..31
- uint32_t offset_3; // offset bits 32..63
- uint32_t zero; // reserved
+ uint16_t offset_1; // offset bits 0..15
+ uint16_t selector; // a code segment selector in GDT or LDT
+ uint8_t ist; // bits 0..2 holds Interrupt Stack Table offset, rest of bits zero.
+ uint8_t type_attributes; // gate type, dpl, and p fields
+ uint16_t offset_2; // offset bits 16..31
+ uint32_t offset_3; // offset bits 32..63
+ uint32_t zero; // reserved
} __attribute__((packed));
typedef struct idt_entry idt_entry;
diff --git a/kernel/include/io.h b/kernel/include/io.h
index 76c401d..d47abb3 100644
--- a/kernel/include/io.h
+++ b/kernel/include/io.h
@@ -1,7 +1,7 @@
#ifndef IO_H
#define IO_H
-#include <stdint.h>
+#include <types.h>
uint8_t inb(uint32_t port);
void outb(uint32_t port, uint8_t value);
diff --git a/kernel/include/irq.h b/kernel/include/irq.h
index f0e38d6..2f22aff 100644
--- a/kernel/include/irq.h
+++ b/kernel/include/irq.h
@@ -1,7 +1,7 @@
#ifndef IRQ_H
#define IRQ_H
-#include <stdint.h>
+#include <types.h>
// exceptions
void isr0(void);
diff --git a/kernel/include/keyboard.h b/kernel/include/keyboard.h
index 050507d..5d7acd0 100644
--- a/kernel/include/keyboard.h
+++ b/kernel/include/keyboard.h
@@ -1,15 +1,16 @@
#ifndef KEYBOARD_H
#define KEYBOARD_H
-#include <stdint.h>
+#include <types.h>
#define KEYBOARD_DATA_PORT 0x60
#define KEYBOARD_STATUS_PORT 0x64
-uint32_t stoi(const char *s);
-void itos(uint32_t num, char** s);
+uint64_t stoi(const char *s);
+void itos(uint64_t num, char* s);
void print_char(char c);
void print_string(char* s);
void keyboard_handler(void);
+void print_int(uint64_t num);
#endif
diff --git a/kernel/include/keymap.h b/kernel/include/keymap.h
index c027146..c9b8697 100644
--- a/kernel/include/keymap.h
+++ b/kernel/include/keymap.h
@@ -1,7 +1,7 @@
#ifndef KEYMAP_H
#define KEYMAP_H
-#include <stdint.h>
+#include <types.h>
#define KEY_ESCAPE 0x01
#define KEY_1 0x02
diff --git a/kernel/include/libk/math.h b/kernel/include/libk/math.h
new file mode 100644
index 0000000..83ac7fe
--- /dev/null
+++ b/kernel/include/libk/math.h
@@ -0,0 +1,8 @@
+#ifndef MATH_H
+#define MATH_H
+
+#include <types.h>
+
+int64_t abs(int64_t val);
+
+#endif
diff --git a/kernel/include/libk/string.h b/kernel/include/libk/string.h
new file mode 100644
index 0000000..64a7f81
--- /dev/null
+++ b/kernel/include/libk/string.h
@@ -0,0 +1,11 @@
+#ifndef STRING_H
+#define STRING_H
+
+#include <types.h>
+
+size_t strlen(const char* s);
+uint64_t stoi(const char *s);
+void itos(uint64_t num, char* s);
+void strrev(char *s);
+
+#endif
diff --git a/kernel/include/multiboot2.h b/kernel/include/multiboot2.h
index f22fd8e..e7935a6 100644
--- a/kernel/include/multiboot2.h
+++ b/kernel/include/multiboot2.h
@@ -1,7 +1,7 @@
#ifndef MULTIBOOT2_H
#define MULTIBOOT2_H
-#include <stdint.h>
+#include <types.h>
struct mb2_tag_header {
uint32_t type;
diff --git a/kernel/include/types.h b/kernel/include/types.h
new file mode 100644
index 0000000..b5f54be
--- /dev/null
+++ b/kernel/include/types.h
@@ -0,0 +1,8 @@
+#ifndef TYPES_H
+#define TYPES_H
+
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+
+#endif
diff --git a/kernel/src/boot/multiboot2.c b/kernel/src/boot/multiboot2.c
index e228ce1..2badae9 100644
--- a/kernel/src/boot/multiboot2.c
+++ b/kernel/src/boot/multiboot2.c
@@ -1,4 +1,5 @@
-#include <stdint.h>
+#include <types.h>
+
#include <multiboot2.h>
#include <graphics.h>
diff --git a/kernel/src/cpu/io.c b/kernel/src/cpu/io.c
index 6bf67d0..a73c5b1 100644
--- a/kernel/src/cpu/io.c
+++ b/kernel/src/cpu/io.c
@@ -1,4 +1,4 @@
-#include <stdint.h>
+#include <types.h>
uint8_t inb(uint32_t port)
{
diff --git a/kernel/src/cpu/irq.c b/kernel/src/cpu/irq.c
index 1e02f23..c81cc98 100644
--- a/kernel/src/cpu/irq.c
+++ b/kernel/src/cpu/irq.c
@@ -1,4 +1,5 @@
-#include <stdint.h>
+#include <types.h>
+
#include <pic.h>
#include <io.h>
#include <keyboard.h>
diff --git a/kernel/src/devices/keyboard.c b/kernel/src/devices/keyboard.c
index d4b06b9..f873a29 100644
--- a/kernel/src/devices/keyboard.c
+++ b/kernel/src/devices/keyboard.c
@@ -1,11 +1,11 @@
-#include <stdint.h>
-#include <stdbool.h>
+#include <types.h>
#include <pic.h>
#include <io.h>
#include <graphics.h>
#include <debug.h>
#include <keymap.h>
+#include <libk/string.h>
#define KEYBOARD_DATA_PORT 0x60
#define KEYBOARD_STATUS_PORT 0x64
@@ -14,29 +14,6 @@ static uint32_t x;
static uint32_t y;
bool is_pressed[128];
-uint32_t strlen(const char *s);
-
-uint32_t stoi(const char *s)
-{
- static uint32_t num;
- uint32_t s_len = strlen(s);
-
- for (int i = s_len - 1; i >= 0; i--) {
- num += s[i] - '0';
- }
-
- return num;
-}
-
-void itos(uint32_t num, char** s)
-{
- uint32_t i;
- for (i = 0; num; num/=10, i++) {
- *s[i] = num%10 - '0';
- }
- *s[i] = '\0';
-}
-
void print_char(char c)
{
@@ -59,11 +36,18 @@ void print_char(char c)
void print_string(char* s)
{
- for (uint32_t i = 0; i < strlen(s); i++) {
+ 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);
diff --git a/kernel/src/libk/math.c b/kernel/src/libk/math.c
new file mode 100644
index 0000000..c2f9c5e
--- /dev/null
+++ b/kernel/src/libk/math.c
@@ -0,0 +1,7 @@
+#include <types.h>
+
+int64_t abs(int64_t val)
+{
+ if (val < 0) return -val;
+ return val;
+}
diff --git a/kernel/src/libk/mem.c b/kernel/src/libk/mem.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/src/libk/mem.c
diff --git a/kernel/src/libk/string.c b/kernel/src/libk/string.c
new file mode 100644
index 0000000..a4d0191
--- /dev/null
+++ b/kernel/src/libk/string.c
@@ -0,0 +1,43 @@
+#include <types.h>
+
+size_t strlen(const char* s)
+{
+ char *p = (char*)s;
+ while (*p) p++;
+ return p - s;
+}
+
+uint64_t stoi(const char *s)
+{
+ uint64_t num = 0;
+ size_t n = strlen(s);
+
+ for (size_t i = 0; i < n; i++) {
+ num *= 10;
+ num += s[i] - '0';
+ }
+
+ return num;
+}
+
+void strrev(char *s)
+{
+ size_t n = strlen(s);
+ char a[100];
+ for (size_t i = 0; i < n; i++) {
+ a[i] = s[n - 1 - i];
+ }
+ for (size_t i = 0; i < n; i++) {
+ s[i] = a[i];
+ }
+}
+
+void itos(uint64_t num, char* s)
+{
+ size_t i;
+ for (i = 0; num; num/=10, i++) {
+ s[i] = '0' + num%10;
+ }
+ s[i] = '\0';
+ strrev(s);
+}
diff --git a/kernel/src/main.c b/kernel/src/main.c
index bea4ed2..8a57d45 100644
--- a/kernel/src/main.c
+++ b/kernel/src/main.c
@@ -1,16 +1,22 @@
-#include <stdint.h>
+#include <types.h>
+
#include <multiboot2.h>
#include <graphics.h>
#include <idt.h>
#include <debug.h>
#include <paging.h>
+#include <heap.h>
+#include <keyboard.h>
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_idt();
init_fb(multiboot_bootinfo, multiboot_magic);
+ print_int(0x1000);
+
for(;;) {
__asm__ volatile ("hlt;");
}
diff --git a/kernel/src/mem/heap.c b/kernel/src/mem/heap.c
new file mode 100644
index 0000000..545f6ea
--- /dev/null
+++ b/kernel/src/mem/heap.c
@@ -0,0 +1,16 @@
+#include <heap.h>
+
+void init_heap(uint64_t addr, uint64_t size, uint64_t block_size)
+{
+
+}
+
+void* kmalloc(uint32_t size)
+{
+ return (uint64_t*)0x0;
+}
+
+void kfree(void *addr)
+{
+
+}
diff --git a/kernel/src/mem/paging.c b/kernel/src/mem/paging.c
index aa7f91e..3f9e2f5 100644
--- a/kernel/src/mem/paging.c
+++ b/kernel/src/mem/paging.c
@@ -1,4 +1,5 @@
-#include <stdint.h>
+#include <types.h>
+
#include <paging.h>
void load_pt_lvl4(uint64_t*);
diff --git a/kernel/src/mem/paging_asm.S b/kernel/src/mem/paging_asm.S
index 5a1dcf7..508930f 100644
--- a/kernel/src/mem/paging_asm.S
+++ b/kernel/src/mem/paging_asm.S
@@ -2,11 +2,11 @@
.global load_pt_lvl4
load_pt_lvl4:
- push %rbp
- mov %rsp, %rbp
+ push %rbp
+ mov %rsp, %rbp
- mov %rdi, %cr3
+ mov %rdi, %cr3
- mov %rbp, %rsp
- pop %rbp
- ret
+ mov %rbp, %rsp
+ pop %rbp
+ ret
diff --git a/kernel/src/misc/debug.c b/kernel/src/misc/debug.c
index 5f3c327..2a940d3 100644
--- a/kernel/src/misc/debug.c
+++ b/kernel/src/misc/debug.c
@@ -1,5 +1,3 @@
-#include <stdint.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 d4fc7c7..488e4fa 100644
--- a/kernel/src/misc/graphics.c
+++ b/kernel/src/misc/graphics.c
@@ -1,7 +1,10 @@
-#include <stdint.h>
+#include <types.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)
{
@@ -65,12 +68,6 @@ void fb_draw_line_high(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1,
}
}
-int32_t abs(int32_t val)
-{
- if (val < 0) return -val;
- return val;
-}
-
void fb_draw_line(fb_t fb, int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t col)
{
if (abs(y1 - y0) < abs(x1 - x0)) {
@@ -104,13 +101,6 @@ void fb_draw_character(fb_t fb, char c, uint32_t x, uint32_t y, uint32_t char_co
}
}
-uint32_t strlen(const char* s)
-{
- char *p = (char*)s;
- while (*p) p++;
- return p - s;
-}
-
void fb_draw_string(fb_t fb, const char* s, uint32_t x, uint32_t y, uint32_t char_col, uint32_t bg_col)
{
for (uint32_t i = 0; i < strlen(s); i++) {