From 39713a3736145483dd3310c3605f940ca34f05c3 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Mon, 12 Apr 2021 10:13:21 +0200 Subject: Refactoring --- 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 +++++ 12 files changed, 381 insertions(+) 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 (limited to 'src/core') 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