diff --git a/Asuro.iso b/Asuro.iso index 365407e3..8fd335fa 100644 Binary files a/Asuro.iso and b/Asuro.iso differ diff --git a/bin/kernel.bin b/bin/kernel.bin index d5497202..fdf51bac 100755 Binary files a/bin/kernel.bin and b/bin/kernel.bin differ diff --git a/iso/boot/asuro.bin b/iso/boot/asuro.bin index d5497202..fdf51bac 100755 Binary files a/iso/boot/asuro.bin and b/iso/boot/asuro.bin differ diff --git a/lib/gdt.ppu b/lib/gdt.ppu index e6b11cdc..b8d7f980 100644 Binary files a/lib/gdt.ppu and b/lib/gdt.ppu differ diff --git a/lib/isr13.ppu b/lib/isr13.ppu index e938eb98..0a17ba05 100644 Binary files a/lib/isr13.ppu and b/lib/isr13.ppu differ diff --git a/lib/kernel.ppu b/lib/kernel.ppu index c1095b9b..b598c792 100644 Binary files a/lib/kernel.ppu and b/lib/kernel.ppu differ diff --git a/lib/libpconsole.a b/lib/libpconsole.a index a7824489..990726ac 100644 Binary files a/lib/libpconsole.a and b/lib/libpconsole.a differ diff --git a/lib/libpmultiboot.a b/lib/libpmultiboot.a index 2f2cee0f..3f7d1406 100644 Binary files a/lib/libpmultiboot.a and b/lib/libpmultiboot.a differ diff --git a/lib/libpsystem.a b/lib/libpsystem.a index 09f2fd0c..c8952e56 100644 Binary files a/lib/libpsystem.a and b/lib/libpsystem.a differ diff --git a/lib/tss.ppu b/lib/tss.ppu index ba1cf3c6..e70f4416 100644 Binary files a/lib/tss.ppu and b/lib/tss.ppu differ diff --git a/lib/vmemorymanager.ppu b/lib/vmemorymanager.ppu index c5fb2875..95e754a1 100644 Binary files a/lib/vmemorymanager.ppu and b/lib/vmemorymanager.ppu differ diff --git a/src/gdt.pas b/src/gdt.pas index 452386b4..79eedbca 100644 --- a/src/gdt.pas +++ b/src/gdt.pas @@ -15,7 +15,7 @@ uses console; type - TGDT_Entry = bitpacked record + TGDT_Entry = packed record limit_low : uint16; base_low : uint16; base_middle : uint8; @@ -25,18 +25,20 @@ type end; PGDT_Entry = ^TGDT_Entry; - TGDT_Pointer = bitpacked record + TGDT_Pointer = packed record limit : uint16; base : uint32; end; var - gdt_entries : array[0..4] of TGDT_Entry; + gdt_entries : array[0..6] of TGDT_Entry; gdt_pointer : TGDT_Pointer; procedure init(); procedure set_gate(Gate_Number : uint32; Base : uint32; Limit : uint32; Access : uint8; Granularity : uint8); - +procedure flush; +procedure reload; + implementation procedure flush_gdt(gdt_pointer : uint32); assembler; nostackframe; @@ -54,8 +56,35 @@ asm @@flush: // It's just data, honest gov'. end; -procedure set_gate(Gate_Number : uint32; Base : uint32; Limit : uint32; Access : uint8; Granularity : uint8); +procedure flush; begin + console.writestringln('GDT: FLUSH.'); + flush_gdt(uint32(@gdt_pointer)); +end; + +procedure reload_gdt(gdt_ptr : uint32); assembler; +asm + MOV EAX, gdt_ptr + LGDT [EAX] +end; + +procedure reload; +begin + reload_gdt(uint32(@gdt_pointer)); +end; + +procedure set_gate(Gate_Number : uint32; Base : uint32; Limit : uint32; Access : uint8; Granularity : uint8); +var + lLimit : uint32; + +begin + lLimit:= (Gate_Number + 1) * 8; + lLimit:= lLimit - 1; + writestring('lLimit: '); + writewordln(lLimit); + if lLimit > gdt_pointer.limit then begin + gdt_pointer.limit:= lLimit; + end; gdt_entries[Gate_Number].base_low := (Base AND $FFFF); gdt_entries[Gate_Number].base_middle := (Base SHR 16) AND $FF; gdt_entries[Gate_Number].base_high := (Base SHR 24) AND $FF; @@ -70,15 +99,14 @@ end; procedure init(); begin console.writestringln('GDT: INIT START.'); - gdt_pointer.limit := (sizeof(TGDT_Entry) * 5) - 1; - gdt_pointer.base := uint32(@gdt_entries); + gdt_pointer.limit:= 0; + gdt_pointer.base := uint32(@gdt_entries); set_gate($00, $00, $00, $00, $00); //OFFSET: 0 set_gate($01, $00, $FFFFFFFF, $9A, $CF); //OFFSET: 8 set_gate($02, $00, $FFFFFFFF, $92, $CF); //OFFSET: 16 set_gate($03, $00, $FFFFFFFF, $FA, $CF); //OFFSET: 24 set_gate($04, $00, $FFFFFFFF, $F2, $CF); //OFFSET: 32 - console.writestringln('GDT: FLUSH.'); - flush_gdt(uint32(@gdt_pointer)); + flush; console.writestringln('GDT: INIT END.'); end; diff --git a/src/isr/isr13.pas b/src/isr/isr13.pas index 6ace63c9..bdbca9c1 100644 --- a/src/isr/isr13.pas +++ b/src/isr/isr13.pas @@ -28,14 +28,21 @@ var procedure Main(); interrupt; var - i : integer; - + i : integer; + ec : uint32; + begin + asm + MOV EAX, [ESP-4] + MOV ec, EAX + end; CLI; for i:=0 to MAX_HOOKS-1 do begin if uint32(Hooks[i]) <> 0 then Hooks[i](void(13)); end; - console.writestringln('General Protection Fault.'); + console.writestring('General Protection Fault. ['); + console.writehex(ec); + console.writestringln(']'); util.halt_and_catch_fire; end; diff --git a/src/kernel.pas b/src/kernel.pas index 5692ac4b..2d9cd84b 100644 --- a/src/kernel.pas +++ b/src/kernel.pas @@ -42,6 +42,7 @@ var pint2 : puint32; keyboard_layout : array [0..1] of TKeyInfo; i : uint32; + cEIP : uint32; begin multibootinfo:= mbinfo; @@ -51,6 +52,10 @@ begin console.writestringln('Booting Asuro...'); + for i:=0 to 100000000 do begin + + end; + if (multibootmagic <> MULTIBOOT_BOOTLOADER_MAGIC) then begin console.setdefaultattribute(console.combinecolors(Red, Black)); console.writestringln('Multiboot Compliant Boot-Loader Needed!'); @@ -62,11 +67,12 @@ begin idt.init(); isr.init(); irq.init(); + tss.init(); pmemorymanager.init(); vmemorymanager.init(); lmemorymanager.init(); - tss.init(); scheduler.init(); + while true do begin end; diff --git a/src/tss.pas b/src/tss.pas index adbeb8db..e21d6011 100644 --- a/src/tss.pas +++ b/src/tss.pas @@ -17,9 +17,9 @@ uses console; type - { + {TTaskStateSegment = packed record Res1 : uint16; - IOPBOffset : uint16; + IOMap : uint16; LDTR : uint16; Res2 : uint16; GS : uint16; @@ -54,8 +54,9 @@ type ESP0 : uint32; LINK : uint16; Res12 : uint16; - } - + end; + PTaskStateSegment = ^TTaskStateSegment;} + { Res12 : uint16; LINK : uint16; @@ -143,6 +144,36 @@ type end; PTaskStateSegment = ^TTaskStateSegment; + {TTaskStateSegment = packed record + link : uint32; + esp0 : uint32; + ss0 : uint32; + esp1 : uint32; + ss1 : uint32; + esp2 : uint32; + ss2 : uint32; + cr3 : uint32; + eip : uint32; + eflags : uint32; + eax : uint32; + ecx : uint32; + edx : uint32; + ebx : uint32; + esp : uint32; + ebp : uint32; + esi : uint32; + edi : uint32; + es : uint32; + cs : uint32; + ss : uint32; + ds : uint32; + fs : uint32; + gs : uint32; + ldt : uint32; + iomap : uint32; + end; + PTaskStateSegment = ^TTaskStateSegment;} + var TaskStateSegment : TTaskStateSegment; ptrTaskStateSegment : PTaskStateSegment = @TaskStateSegment; @@ -154,15 +185,27 @@ implementation procedure init; var cESP : uint32; + cCR3 : uint32; begin - ptrTaskStateSegment^.ss0:= $10; - ptrTaskStateSegment^.iomap:= sizeof(TTaskStateSegment); - gdt.set_gate($05, uint32(ptrTaskStateSegment) - KERNEL_VIRTUAL_BASE, sizeof(TTaskStateSegment), $89, $40); //OFFSET: 40 + console.writehexln(uint32(ptrTaskStateSegment)); + ptrTaskStateSegment^.ss0:= $08; + ptrTaskStateSegment^.iomap:= sizeof(TTaskStateSegment)-1; asm MOV cESP, ESP + MOV EAX, CR3 + MOV cCR3, EAX end; + console.writewordln(sizeof(TTaskStateSegment)); ptrTaskStateSegment^.esp0:= cESP; + //ptrTaskStateSegment^.CR3:= cCR3; + console.writestring('OLD LIMIT: '); + console.writewordln(gdt.gdt_pointer.limit); + //gdt.set_gate($05, uint32(ptrTaskStateSegment)-KERNEL_VIRTUAL_BASE, sizeof(TTaskStateSegment)-1, $89, $40); //OFFSET: 40 + console.writestring('NEW LIMIT: '); + console.writewordln(gdt.gdt_pointer.limit); + gdt.reload; + while true do begin end; console.writestringln('A'); asm mov AX, 40