diff --git a/gdt.s b/gdt.s new file mode 100644 index 0000000..2c7274e --- /dev/null +++ b/gdt.s @@ -0,0 +1,5 @@ +global load_gdt + +; lgdt can only be used from assembly so here we are +load_gdt: + lgdt [eax] diff --git a/loader.s b/loader.s index 7428f8f..74a7fd8 100644 --- a/loader.s +++ b/loader.s @@ -10,6 +10,8 @@ CHECKSUM equ -MAGIC_NUMBER ; size in bytes of stack KERNEL_STACK_SIZE equ 4096 extern test_dispatcher +extern load_gdt +extern struct example section .text ; align all instructions to 4 byte boundary by the x86 instruction set law @@ -19,7 +21,10 @@ align 4 dd FLAGS dd CHECKSUM +; sets up our gdt and segment selectors for later use + loader: + call load_gdt call test_dispatcher .loop: diff --git a/makefile b/makefile index 25fb6d3..c4d6045 100644 --- a/makefile +++ b/makefile @@ -33,7 +33,7 @@ os.iso: kernel.elf $(ASM) $(AFLAGS) $< -o $@ # Building C objecets -core/%.o: %.c +%.o: %.c $(CC) $(CFLAGS) $< -o $@ # Running (no recipes called) diff --git a/ports.s b/ports.s index 30b4313..4c73b20 100644 --- a/ports.s +++ b/ports.s @@ -1,4 +1,4 @@ -; Helpers for frame buffer which pretty much have to to be +; Helpers for serial ports which pretty much have to to be ; written in asm global serialport_write_byte diff --git a/stlio.c b/stlio.c index d8ba304..8c0e719 100644 --- a/stlio.c +++ b/stlio.c @@ -31,65 +31,16 @@ u32 read(const u32 n) { return n; } -char* tohex(u32* data, u32 size) { - static char ret[19] = {'\0'}; // 8 bytes + \0 - ret[0] = '0'; ret[1] = 'x'; - const char* map = "0123456789abcdef"; // muh 'tism - switch(size) { - // (unsigned)char/u8/s8 - case (1): { - u8 idx; - u8 val = (u8)*data; - for(u32 i = 0; i<2; i++ ) { - idx = val & 0x0f; - ret[19-i] = map[idx]; - vall >>= 4; - } - break; - } - // s16/u16 - case (2): { - for(u32 i = 0; i<4; i++) { - } - break; - } - // s32/u64 - case (4): { - break; - } - // s64/u64 - case (8): { - break; - } - default: return "Bad-Size"; - } - return "sadf"; -} - void printf(char* fmt) { - u32 i; + // Variadic fuller version of print on seperate branch but its nowhere near stable/ready/working u32 size = strlen(fmt); - for(i = 0; i < size;i++) { - char c = fmt[i]; - switch(c) { - case '\n': { - frame_buffer_newline(); - break; - } - case '%': { - /* only do something if the situation calls for it - * NOTE: this call might not do anything interesting - */ - if((i+1) < size) { - write_char(c); - i += 2; - } - break; - } - default: { - write_char(c); - } + for(u32 i = 0; i < size;i++) { + if(fmt[i] == '\n') { + frame_buffer_newline(); + } + else { + write_char(fmt[i]); } } } diff --git a/stlio.h b/stlio.h index b9dd863..9f38c24 100644 --- a/stlio.h +++ b/stlio.h @@ -2,7 +2,11 @@ #include "framebuffer.h" // Frame buffer driver +// NOTE: not getting computed at compile time so we always have a call u32 strlen(char*); + u32 write(const char*, const u32); + u32 read(const u32); + void printf(char*);