From 39713a3736145483dd3310c3605f940ca34f05c3 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Mon, 12 Apr 2021 10:13:21 +0200 Subject: Refactoring --- src/Makefile | 4 +- src/boot/multiboot.c | 1 - src/boot/multiboot.h | 5 ++- src/bringelle.c | 14 +++---- src/core/asm.h | 13 +++++++ src/core/framebuffer.c | 58 +++++++++++++++++++++++++++++ src/core/framebuffer.h | 35 +++++++++++++++++ src/core/gdt.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++ src/core/gdt.h | 77 ++++++++++++++++++++++++++++++++++++++ src/core/mem.c | 8 ++++ src/core/mem.h | 11 ++++++ src/core/paging.c | 31 ++++++++++++++++ src/core/paging.h | 13 +++++++ src/core/syscall.c | 19 ++++++++++ src/core/syscall.h | 9 +++++ src/core/types.h | 9 +++++ src/int/8042.c | 4 +- src/int/8042.h | 2 +- src/int/idt.c | 39 +++++++++++++++++++ src/int/idt.h | 32 ++++++++++++++++ src/int/int.S | 72 +++++++++++++++++++++++++++++++++++ src/int/pic.c | 99 +++---------------------------------------------- src/int/pic.h | 22 ++--------- src/libc/stdio.h | 2 +- src/utils/asm.h | 13 ------- src/utils/framebuffer.c | 58 ----------------------------- src/utils/framebuffer.h | 27 -------------- src/utils/gdt.c | 98 ------------------------------------------------ src/utils/gdt.h | 77 -------------------------------------- src/utils/mem.c | 8 ---- src/utils/mem.h | 8 ---- src/utils/paging.c | 31 ---------------- src/utils/paging.h | 10 ----- src/utils/syscall.c | 19 ---------- src/utils/syscall.h | 6 --- src/utils/types.h | 9 ----- 36 files changed, 550 insertions(+), 491 deletions(-) create mode 100644 src/core/asm.h create mode 100644 src/core/framebuffer.c create mode 100644 src/core/framebuffer.h create mode 100644 src/core/gdt.c create mode 100644 src/core/gdt.h create mode 100644 src/core/mem.c create mode 100644 src/core/mem.h create mode 100644 src/core/paging.c create mode 100644 src/core/paging.h create mode 100644 src/core/syscall.c create mode 100644 src/core/syscall.h create mode 100644 src/core/types.h create mode 100644 src/int/idt.c create mode 100644 src/int/idt.h delete mode 100644 src/utils/asm.h delete mode 100644 src/utils/framebuffer.c delete mode 100644 src/utils/framebuffer.h delete mode 100644 src/utils/gdt.c delete mode 100644 src/utils/gdt.h delete mode 100644 src/utils/mem.c delete mode 100644 src/utils/mem.h delete mode 100644 src/utils/paging.c delete mode 100644 src/utils/paging.h delete mode 100644 src/utils/syscall.c delete mode 100644 src/utils/syscall.h delete mode 100644 src/utils/types.h diff --git a/src/Makefile b/src/Makefile index 2151883..3643f77 100644 --- a/src/Makefile +++ b/src/Makefile @@ -6,14 +6,14 @@ LD_SCRIPT := linker.ld # Indeed boot.o generated by boot.S should appear # first in the kernel binary (thus it must be linked first, cf the $(EXEC) rule) BOOT_OBJ := $(addsuffix .o,$(basename $(shell find ./boot -name "*.[c|S]" ! -name "boot.S"))) -UTILS_OBJ := $(addsuffix .o,$(basename $(shell find ./utils -name "*.[c|S]"))) +CORE_OBJ := $(addsuffix .o,$(basename $(shell find ./core -name "*.[c|S]"))) LIBC_OBJ := $(addsuffix .o,$(basename $(shell find ./libc -name "*.[c|S]"))) INT_OBJ := $(addsuffix .o,$(basename $(shell find ./int -name "*.[c|S]"))) all: $(EXEC) -$(EXEC): boot/boot.o $(BOOT_OBJ) $(UTILS_OBJ) $(LIBC_OBJ) $(INT_OBJ) bringelle.o +$(EXEC): boot/boot.o $(BOOT_OBJ) $(CORE_OBJ) $(LIBC_OBJ) $(INT_OBJ) bringelle.o ld -n -T $(LD_SCRIPT) -nostdlib -o bringelle $^ %.o: %.S diff --git a/src/boot/multiboot.c b/src/boot/multiboot.c index c41aeb7..71382d5 100644 --- a/src/boot/multiboot.c +++ b/src/boot/multiboot.c @@ -1,5 +1,4 @@ #include "multiboot.h" -#include "utils/mem.h" /// See boot.S extern u8* MB_INFO; diff --git a/src/boot/multiboot.h b/src/boot/multiboot.h index 010f60b..9eae31f 100644 --- a/src/boot/multiboot.h +++ b/src/boot/multiboot.h @@ -1,7 +1,8 @@ #ifndef MULTIBOOT_H #define MULTIBOOT_H -#include "utils/types.h" +#include "core/types.h" +#include "core/mem.h" typedef struct MBI_TAG_HEADER { u32 type; @@ -29,10 +30,12 @@ typedef struct MBI_TAG_FB { * Parse Bootloader boot information structure */ char mb_load_tag(char **data, char type); + /** * Search for Bootloader name */ char mb_load_bl_name(MBI_TAG_BL_NAME *data); + /** * Search for FrameBuffer structure (TODO: Finish) */ diff --git a/src/bringelle.c b/src/bringelle.c index 340e884..49670e8 100644 --- a/src/bringelle.c +++ b/src/bringelle.c @@ -1,14 +1,14 @@ #include "libc/stdio.h" #include "int/pic.h" #include "boot/multiboot.h" -#include "utils/mem.h" -#include "utils/gdt.h" -#include "utils/paging.h" - +#include "core/mem.h" +#include "core/gdt.h" +#include "core/paging.h" char show_tics=0; extern GDT_TSS TSS; +extern void interrupt_enable(); void utask(){ char msg[]="Message from the task :D"; @@ -20,8 +20,8 @@ void bringelle(){ clear(); printc("Booting Bringelle...\n",GREEN); - // Kernel boot sequence - pic_enable_interrupt(); + // ----- Kernel boot sequence + interrupt_enable(); print("Interrupts enabled\n"); paging_enable(); @@ -52,8 +52,6 @@ void bringelle(){ : "=m" (TSS.ss0), "=m" (TSS.esp0) ); - - while(1); } diff --git a/src/core/asm.h b/src/core/asm.h new file mode 100644 index 0000000..be265d8 --- /dev/null +++ b/src/core/asm.h @@ -0,0 +1,13 @@ +#ifndef ASM_H +#define ASM_H + +#define outb(port,value) \ + asm volatile ("outb %%al, %%dx" :: "a"(value), "d" (port) ) + +#define outbj(port,value) \ + asm volatile ("outb %%al, %%dx;" :: "a" (value), "d"(port) ) + +#define inb(port,dst) \ + asm volatile ("inb %%dx, %%al": "=a" (dst) : "d" (port)) + +#endif \ No newline at end of file diff --git a/src/core/framebuffer.c b/src/core/framebuffer.c new file mode 100644 index 0000000..110dc73 --- /dev/null +++ b/src/core/framebuffer.c @@ -0,0 +1,58 @@ +#include "framebuffer.h" + +#define MAX_COL 80 +#define MAX_LINE 25 + +VIDEO_STATE VS={ + (u8 *)0xB8000, + 0, + 0, + BLACK, + GRAY, +}; + +void putchar(char c){ + // Handle newline here + if(c=='\n'){ + VS.col=0; + VS.line+=1; + if(VS.line>=MAX_LINE){ + VS.line=MAX_LINE-1; + scrollup(); + } + return; + } + + // Print char + VS.mem[VS.col*2+MAX_COL*VS.line*2]=c; + VS.mem[VS.col*2+MAX_COL*VS.line*2+1]=VS.fg|VS.bg<<4; + + // Refresh location + VS.col+=1; + if(VS.col>= MAX_COL){ + VS.col=0; + VS.line+=1; + if(VS.line>=MAX_LINE){ + VS.line=MAX_LINE-1; + scrollup(); + } + } +} + +void clear(){ + for(char i=0;i> 16) & 0xFF; + u16 access=entry.access & 0xFF; + u16 limit=(entry.limit >> 16) & 0xF; // Remember: limits it is on 20 bits so 4 last bits + u8 flags=entry.flags & 0xF; + u8 base2=entry.base >> 24; // Take the last 8 bits + descriptor[1]=base|access<<8|limit<<16|flags<<20|base2<<24; + + // Copy descriptor into memory + memcpy(descriptor,(void*)GDTR.base+8*id,8); // Each entry is 64 bits (8 bytes) +} + +int gdt_user_ds_base(){ + char *addr=(char*)GDTR.base+48; + int *base0_15=(int*)addr+2; + int *base16_31=(int*)addr+7; + int base0_15_content=*base0_15 & 0xFFFF; + int base16_21_content=*base16_31 & 0xFFFF; + return(base16_21_content<<16 & base0_15_content); +} \ No newline at end of file diff --git a/src/core/gdt.h b/src/core/gdt.h new file mode 100644 index 0000000..f010891 --- /dev/null +++ b/src/core/gdt.h @@ -0,0 +1,77 @@ +#ifndef GDT_H +#define GDT_H + +#include "types.h" + +#define GDT_MAX_ENTRIES 8 + +// Access byte +#define GDT_AC 1 // Access bit +#define GDT_RW 1 << 1 // Read/Write bit +#define GDT_DC 1 << 2 // Direction bit/Conforming bit +#define GDT_EXEC 1 << 3 // Executable bit +#define GDT_S 1 << 4 // Descriptor type +#define GDT_PRVL_0 0 // Privilege (from 0 to 3) +#define GDT_PRVL_1 1 << 5 +#define GDT_PRVL_2 2 << 5 +#define GDT_PRVL_3 3 << 5 +#define GDT_PR 1 << 7 // Present Bit + +// Flags +#define GDT_SZ 1 << 2 // Size bit +#define GDT_GR 1 << 3 // Granularity bit + +typedef struct GDT_ENTRY { + u32 base; + u32 limit; + u8 flags; + u8 access; +} GDT_ENTRY; + +struct GDT_REGISTER { + u16 limit; + u32 base; +} __attribute__((packed)); + +typedef struct GDT_TSS { + u16 previous_task,previous_task_unused; + u32 esp0; + u16 ss0, ss0_unused; + u32 esp1; + u16 ss1, ss1_unused; + u32 esp2; + u16 ss2, ss2_unused; + u32 cr3; + u32 eip; + u32 eflags; + u32 eax; + u32 ecx; + u32 edx; + u32 ebx; + u32 esp; + u32 ebp; + u32 esi; + u32 edi; + u16 es, es_reserved; + u16 cs, cs_reserved; + u16 ss, ss_reserved; + u16 ds, ds_reserved; + u16 fs, fs_reserved; + u16 gs, gs_reserved; + u16 ldtss, ldtss_reserved; + u16 t_reserved, io_map; +} __attribute__((packed)) GDT_TSS; + +/** + * Copy GDT in memory + */ +void gdt_memcpy(); + +/** + * Write a GDT entry at address addr + */ +void gdt_write_entry(GDT_ENTRY entry, u32 id); + +int gdt_user_ds_base(); + +#endif diff --git a/src/core/mem.c b/src/core/mem.c new file mode 100644 index 0000000..4cefd6d --- /dev/null +++ b/src/core/mem.c @@ -0,0 +1,8 @@ +#include "mem.h" + +void memcpy(void *src, void *dst, int size){ + u8 *char_src=(u8 *)src; + u8 *char_dst=(u8 *)dst; + for(int i=0;i=MAX_LINE){ - VS.line=MAX_LINE-1; - scrollup(); - } - return; - } - - // Print char - VS.mem[VS.col*2+MAX_COL*VS.line*2]=c; - VS.mem[VS.col*2+MAX_COL*VS.line*2+1]=VS.fg|VS.bg<<4; - - // Refresh location - VS.col+=1; - if(VS.col>= MAX_COL){ - VS.col=0; - VS.line+=1; - if(VS.line>=MAX_LINE){ - VS.line=MAX_LINE-1; - scrollup(); - } - } -} - -void clear(){ - for(char i=0;i> 16) & 0xFF; - u16 access=entry.access & 0xFF; - u16 limit=(entry.limit >> 16) & 0xF; // Remember: limits it is on 20 bits so 4 last bits - u8 flags=entry.flags & 0xF; - u8 base2=entry.base >> 24; // Take the last 8 bits - descriptor[1]=base|access<<8|limit<<16|flags<<20|base2<<24; - - // Copy descriptor into memory - memcpy(descriptor,(void*)GDTR.base+8*id,8); // Each entry is 64 bits (8 bytes) -} - -int gdt_user_ds_base(){ - char *addr=(char*)GDTR.base+48; - int *base0_15=(int*)addr+2; - int *base16_31=(int*)addr+7; - int base0_15_content=*base0_15 & 0xFFFF; - int base16_21_content=*base16_31 & 0xFFFF; - return(base16_21_content<<16 & base0_15_content); -} \ No newline at end of file diff --git a/src/utils/gdt.h b/src/utils/gdt.h deleted file mode 100644 index f010891..0000000 --- a/src/utils/gdt.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef GDT_H -#define GDT_H - -#include "types.h" - -#define GDT_MAX_ENTRIES 8 - -// Access byte -#define GDT_AC 1 // Access bit -#define GDT_RW 1 << 1 // Read/Write bit -#define GDT_DC 1 << 2 // Direction bit/Conforming bit -#define GDT_EXEC 1 << 3 // Executable bit -#define GDT_S 1 << 4 // Descriptor type -#define GDT_PRVL_0 0 // Privilege (from 0 to 3) -#define GDT_PRVL_1 1 << 5 -#define GDT_PRVL_2 2 << 5 -#define GDT_PRVL_3 3 << 5 -#define GDT_PR 1 << 7 // Present Bit - -// Flags -#define GDT_SZ 1 << 2 // Size bit -#define GDT_GR 1 << 3 // Granularity bit - -typedef struct GDT_ENTRY { - u32 base; - u32 limit; - u8 flags; - u8 access; -} GDT_ENTRY; - -struct GDT_REGISTER { - u16 limit; - u32 base; -} __attribute__((packed)); - -typedef struct GDT_TSS { - u16 previous_task,previous_task_unused; - u32 esp0; - u16 ss0, ss0_unused; - u32 esp1; - u16 ss1, ss1_unused; - u32 esp2; - u16 ss2, ss2_unused; - u32 cr3; - u32 eip; - u32 eflags; - u32 eax; - u32 ecx; - u32 edx; - u32 ebx; - u32 esp; - u32 ebp; - u32 esi; - u32 edi; - u16 es, es_reserved; - u16 cs, cs_reserved; - u16 ss, ss_reserved; - u16 ds, ds_reserved; - u16 fs, fs_reserved; - u16 gs, gs_reserved; - u16 ldtss, ldtss_reserved; - u16 t_reserved, io_map; -} __attribute__((packed)) GDT_TSS; - -/** - * Copy GDT in memory - */ -void gdt_memcpy(); - -/** - * Write a GDT entry at address addr - */ -void gdt_write_entry(GDT_ENTRY entry, u32 id); - -int gdt_user_ds_base(); - -#endif diff --git a/src/utils/mem.c b/src/utils/mem.c deleted file mode 100644 index 4cefd6d..0000000 --- a/src/utils/mem.c +++ /dev/null @@ -1,8 +0,0 @@ -#include "mem.h" - -void memcpy(void *src, void *dst, int size){ - u8 *char_src=(u8 *)src; - u8 *char_dst=(u8 *)dst; - for(int i=0;i