From b565d073c7ac3ec78d0b07ecb844c8b7b77b285e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Hord=C3=A9?= Date: Mon, 14 Jan 2019 14:54:50 +0100 Subject: [PATCH] fix: execution du setup en mode reel fonctionnel, erreur sur A20 --- include/setup.h | 65 ++++++++++++++++++++++++++++++++-- system/realmode/makefile | 4 +-- system/realmode/setup.c | 76 +++++++++++++--------------------------- 3 files changed, 89 insertions(+), 56 deletions(-) diff --git a/include/setup.h b/include/setup.h index a577f80..b51e6cf 100644 --- a/include/setup.h +++ b/include/setup.h @@ -2,6 +2,7 @@ /* COS2000 - Compatible Operating System - LGPL v3 - Hordé Nicolas */ /* */ #include "types.h" +#include "gdt.h" #define E820_MAX_ENTRIES 128 @@ -34,10 +35,68 @@ typedef struct miniregs { u16 flags, hflags; }; struct { - u8 bl, bh, hbx2, hbx3; - u8 dl, dh, hdx2, hdx3; - u8 cl, ch, hcx2, hcx3; u8 al, ah, hax2, hax3; + u8 bl, bh, hbx2, hbx3; + u8 cl, ch, hcx2, hcx3; + u8 dl, dh, hdx2, hdx3; }; }; } miniregs __attribute__ ((packed)); + + +#define STRINGIFY(x) #x +#define MACRO(x) STRINGIFY(x) +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr)) +#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) +#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) +#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:(-!!(e)); })) + +#define EFLAGS_CF 0x00000001 +#define LOOPS_8042 100000 +#define FF_8042 32 +#define LOOPS_A20_ENABLE 255 +#define LOOPS_DELAY 32768 +#define SMAP 0x534d4150 + +#define interrupt(num, regs) ({\ + asm("mov %[eflagsregs],%%eax\n\ + pushl %%eax\n\ + popfl\n\ + mov %[eaxregs],%%eax\n\ + mov %[ebxregs],%%ebx\n\ + mov %[ecxregs],%%ecx\n\ + mov %[edxregs],%%edx\n\ + mov %[esiregs],%%esi\n\ + mov %[ediregs],%%edi\n\ + int %[numregs]\n\ + pushfl\n\ + popl %%eax\n\ + mov %%eax,%[eflagsregs]\n\ + mov %%eax,%[eaxregs]\n\ + mov %%ebx,%[ebxregs]\n\ + mov %%ecx,%[ecxregs]\n\ + mov %%edx,%[edxregs]\n\ + mov %%esi,%[esiregs]\n\ + mov %%edi,%[ediregs]":[eaxregs] "+m" (regs.eax),[ebxregs] "+m" (regs.ebx),[ecxregs] "+m" (regs.ecx),[edxregs] "+m" (regs.edx),[esiregs] "+m" (regs.esi),[ediregs] "+m" (regs.edi),[eflagsregs] "+m" (regs.eflags):[numregs] "i" (num):"%eax","%ebx","%ecx","%edx","%esi","%edi");}) +void cleanreg(miniregs *reg); +u8 initmemory(void); +void showchar(u8 achar); +void showstr(u8 *str); +u8 gettime(void); +u8 waitchar(void); +void initkeyboard(void); +u8 empty8042(void); +void iodelay(void); +u8 testA20(void); +void enableA20kbc(void); +void enableA20fast(void); +u8 enableA20(void); +void memset(void *dst, u8 val, u32 count, u32 size); +void memcpy(void *src, void *dst, u32 count, u32 size); +void initselectors(u32 executingoffset); +void makegdtdes(u32 base, u32 limite, u8 acces, u8 flags, gdtdes * desc); +void initgdt(); +void maskinterrupts(void); +void initcoprocessor(void); +void initpmode(u32 offset); +void main(void); diff --git a/system/realmode/makefile b/system/realmode/makefile index 946239d..0ff652c 100644 --- a/system/realmode/makefile +++ b/system/realmode/makefile @@ -1,5 +1,5 @@ -GCC=gcc -O0 -g -nostdinc -ffreestanding -fno-builtin -Wall -w -I ../../include -march=i386 -m16 -fomit-frame-pointer -fno-pie -no-pie -mno-mmx -mno-sse -mno-80387 -mno-fp-ret-in-387 -c -ASM=gcc -m16 -march=i386 -fomit-frame-pointer -fno-pie -no-pie -mno-mmx -mno-sse -mno-80387 -mno-fp-ret-in-387 -D__ASSEMBLY__ -I ../ -I ../../include -c -o +GCC=gcc -O0 -g -nostdinc -ffreestanding -Wall -Wstrict-prototypes -fno-stack-protector -march=i386 -m16 -mpreferred-stack-boundary=2 -mregparm=3 -fno-pic -fno-strict-aliasing -mno-mmx -mno-sse -w -I ../../include -c +ASM=gcc -O0 -m16 -march=i386 -fno-pic -D__ASSEMBLY__ -I ../ -I ../../include -c -o LINK=ld -m elf_i386 -n CONVERT=dos2unix INDENT=indent -nhnl -l75 -ppi3 -ts8 -bls -nbc -di8 -nbad -nbap -nsob -i8 -bl -bli0 -ncdw -nce -cli8 -cbi0 -npcs -cs -saf -sai -saw -nprs -lp -npsl diff --git a/system/realmode/setup.c b/system/realmode/setup.c index df7eea4..759e70f 100644 --- a/system/realmode/setup.c +++ b/system/realmode/setup.c @@ -1,10 +1,9 @@ -/*******************************************************************************/ +//*******************************************************************************/ /* COS2000 - Compatible Operating System - LGPL v3 - Hordé Nicolas */ /* */ #include "types.h" #include "asm.h" #include "setup.h" -#include "gdt.h" #include "memory.h" struct params { @@ -19,52 +18,13 @@ static struct gdtr gdtreg; /* table de GDT */ static gdtdes gdt[GDT_SIZE]; -#define STRINGIFY(x) #x -#define MACRO(x) STRINGIFY(x) -#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr)) -#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) -#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) -#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:(-!!(e)); })) - u8 kernel_version[] = "COS2000 Version " MACRO(VERSION) "- compiled " __DATE__ ; -#define EFLAGS_CF 0x00000001 -#define LOOPS_8042 100000 -#define FF_8042 32 -#define LOOPS_A20_ENABLE 255 -#define LOOPS_DELAY 32768 -#define SMAP 0x534d4150 - -#define interrupt(num, regs) ({\ - asm("pushal\n\ - mov %[eflagsregs],%%eax\n\ - pushl %%eax\n\ - popfl\n\ - mov %[eaxregs],%%eax\n\ - mov %[ebxregs],%%ebx\n\ - mov %[ecxregs],%%ecx\n\ - mov %[edxregs],%%edx\n\ - mov %[esiregs],%%esi\n\ - mov %[ediregs],%%edi\n\ - mov %[ebpregs],%%ebp\n\ - int %[numregs]\n\ - pushfl\n\ - popl %%eax\n\ - mov %%eax,%[eflagsregs]\n\ - mov %%eax,%[eaxregs]\n\ - mov %%ebx,%[ebxregs]\n\ - mov %%ecx,%[ecxregs]\n\ - mov %%edx,%[edxregs]\n\ - mov %%esi,%[esiregs]\n\ - mov %%edi,%[ediregs]\n\ - mov %%ebp,%[ebpregs]\n\ - popal":[eaxregs] "+m" (regs.eax),[ebxregs] "+m" (regs.ebx),[ecxregs] "+m" (regs.ecx),[edxregs] "+m" (regs.edx),[esiregs] "+m" (regs.esi),[ediregs] "+m" (regs.edi),[ebpregs] "+m" (regs.ebp),[eflagsregs] "+m" (regs.eflags):[numregs] "i" (num):);}) - - u8 initmemory(void) { u32 count = 0; miniregs reg; + cleanreg(®); entrye820 *desc = params.e820_table; static struct entrye820 buf; do { @@ -86,9 +46,22 @@ u8 initmemory(void) return params.e820_numbers= count; } +void showstr(u8 *str) +{ + while (*str!='\000') + showchar(*str++); +} + +void cleanreg(miniregs *reg) +{ + for (u8 i;i