FUUUUUUUUUUUUUUUUUUUUUUU

git-svn-id: https://spexeah.com:8443/svn/Asuro@176 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c
This commit is contained in:
kieron 2017-05-22 00:49:38 +00:00
parent f1dc0516df
commit 5a2004b486
15 changed files with 104 additions and 20 deletions

BIN
Asuro.iso

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -15,7 +15,7 @@ uses
console; console;
type type
TGDT_Entry = bitpacked record TGDT_Entry = packed record
limit_low : uint16; limit_low : uint16;
base_low : uint16; base_low : uint16;
base_middle : uint8; base_middle : uint8;
@ -25,18 +25,20 @@ type
end; end;
PGDT_Entry = ^TGDT_Entry; PGDT_Entry = ^TGDT_Entry;
TGDT_Pointer = bitpacked record TGDT_Pointer = packed record
limit : uint16; limit : uint16;
base : uint32; base : uint32;
end; end;
var var
gdt_entries : array[0..4] of TGDT_Entry; gdt_entries : array[0..6] of TGDT_Entry;
gdt_pointer : TGDT_Pointer; gdt_pointer : TGDT_Pointer;
procedure init(); procedure init();
procedure set_gate(Gate_Number : uint32; Base : uint32; Limit : uint32; Access : uint8; Granularity : uint8); procedure set_gate(Gate_Number : uint32; Base : uint32; Limit : uint32; Access : uint8; Granularity : uint8);
procedure flush;
procedure reload;
implementation implementation
procedure flush_gdt(gdt_pointer : uint32); assembler; nostackframe; procedure flush_gdt(gdt_pointer : uint32); assembler; nostackframe;
@ -54,8 +56,35 @@ asm
@@flush: // It's just data, honest gov'. @@flush: // It's just data, honest gov'.
end; end;
procedure set_gate(Gate_Number : uint32; Base : uint32; Limit : uint32; Access : uint8; Granularity : uint8); procedure flush;
begin 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_low := (Base AND $FFFF);
gdt_entries[Gate_Number].base_middle := (Base SHR 16) AND $FF; gdt_entries[Gate_Number].base_middle := (Base SHR 16) AND $FF;
gdt_entries[Gate_Number].base_high := (Base SHR 24) AND $FF; gdt_entries[Gate_Number].base_high := (Base SHR 24) AND $FF;
@ -70,15 +99,14 @@ end;
procedure init(); procedure init();
begin begin
console.writestringln('GDT: INIT START.'); console.writestringln('GDT: INIT START.');
gdt_pointer.limit := (sizeof(TGDT_Entry) * 5) - 1; gdt_pointer.limit:= 0;
gdt_pointer.base := uint32(@gdt_entries); gdt_pointer.base := uint32(@gdt_entries);
set_gate($00, $00, $00, $00, $00); //OFFSET: 0 set_gate($00, $00, $00, $00, $00); //OFFSET: 0
set_gate($01, $00, $FFFFFFFF, $9A, $CF); //OFFSET: 8 set_gate($01, $00, $FFFFFFFF, $9A, $CF); //OFFSET: 8
set_gate($02, $00, $FFFFFFFF, $92, $CF); //OFFSET: 16 set_gate($02, $00, $FFFFFFFF, $92, $CF); //OFFSET: 16
set_gate($03, $00, $FFFFFFFF, $FA, $CF); //OFFSET: 24 set_gate($03, $00, $FFFFFFFF, $FA, $CF); //OFFSET: 24
set_gate($04, $00, $FFFFFFFF, $F2, $CF); //OFFSET: 32 set_gate($04, $00, $FFFFFFFF, $F2, $CF); //OFFSET: 32
console.writestringln('GDT: FLUSH.'); flush;
flush_gdt(uint32(@gdt_pointer));
console.writestringln('GDT: INIT END.'); console.writestringln('GDT: INIT END.');
end; end;

View File

@ -28,14 +28,21 @@ var
procedure Main(); interrupt; procedure Main(); interrupt;
var var
i : integer; i : integer;
ec : uint32;
begin begin
asm
MOV EAX, [ESP-4]
MOV ec, EAX
end;
CLI; CLI;
for i:=0 to MAX_HOOKS-1 do begin for i:=0 to MAX_HOOKS-1 do begin
if uint32(Hooks[i]) <> 0 then Hooks[i](void(13)); if uint32(Hooks[i]) <> 0 then Hooks[i](void(13));
end; end;
console.writestringln('General Protection Fault.'); console.writestring('General Protection Fault. [');
console.writehex(ec);
console.writestringln(']');
util.halt_and_catch_fire; util.halt_and_catch_fire;
end; end;

View File

@ -42,6 +42,7 @@ var
pint2 : puint32; pint2 : puint32;
keyboard_layout : array [0..1] of TKeyInfo; keyboard_layout : array [0..1] of TKeyInfo;
i : uint32; i : uint32;
cEIP : uint32;
begin begin
multibootinfo:= mbinfo; multibootinfo:= mbinfo;
@ -51,6 +52,10 @@ begin
console.writestringln('Booting Asuro...'); console.writestringln('Booting Asuro...');
for i:=0 to 100000000 do begin
end;
if (multibootmagic <> MULTIBOOT_BOOTLOADER_MAGIC) then begin if (multibootmagic <> MULTIBOOT_BOOTLOADER_MAGIC) then begin
console.setdefaultattribute(console.combinecolors(Red, Black)); console.setdefaultattribute(console.combinecolors(Red, Black));
console.writestringln('Multiboot Compliant Boot-Loader Needed!'); console.writestringln('Multiboot Compliant Boot-Loader Needed!');
@ -62,11 +67,12 @@ begin
idt.init(); idt.init();
isr.init(); isr.init();
irq.init(); irq.init();
tss.init();
pmemorymanager.init(); pmemorymanager.init();
vmemorymanager.init(); vmemorymanager.init();
lmemorymanager.init(); lmemorymanager.init();
tss.init();
scheduler.init(); scheduler.init();
while true do begin end; while true do begin end;

View File

@ -17,9 +17,9 @@ uses
console; console;
type type
{ {TTaskStateSegment = packed record
Res1 : uint16; Res1 : uint16;
IOPBOffset : uint16; IOMap : uint16;
LDTR : uint16; LDTR : uint16;
Res2 : uint16; Res2 : uint16;
GS : uint16; GS : uint16;
@ -54,8 +54,9 @@ type
ESP0 : uint32; ESP0 : uint32;
LINK : uint16; LINK : uint16;
Res12 : uint16; Res12 : uint16;
} end;
PTaskStateSegment = ^TTaskStateSegment;}
{ {
Res12 : uint16; Res12 : uint16;
LINK : uint16; LINK : uint16;
@ -143,6 +144,36 @@ type
end; end;
PTaskStateSegment = ^TTaskStateSegment; 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 var
TaskStateSegment : TTaskStateSegment; TaskStateSegment : TTaskStateSegment;
ptrTaskStateSegment : PTaskStateSegment = @TaskStateSegment; ptrTaskStateSegment : PTaskStateSegment = @TaskStateSegment;
@ -154,15 +185,27 @@ implementation
procedure init; procedure init;
var var
cESP : uint32; cESP : uint32;
cCR3 : uint32;
begin begin
ptrTaskStateSegment^.ss0:= $10; console.writehexln(uint32(ptrTaskStateSegment));
ptrTaskStateSegment^.iomap:= sizeof(TTaskStateSegment); ptrTaskStateSegment^.ss0:= $08;
gdt.set_gate($05, uint32(ptrTaskStateSegment) - KERNEL_VIRTUAL_BASE, sizeof(TTaskStateSegment), $89, $40); //OFFSET: 40 ptrTaskStateSegment^.iomap:= sizeof(TTaskStateSegment)-1;
asm asm
MOV cESP, ESP MOV cESP, ESP
MOV EAX, CR3
MOV cCR3, EAX
end; end;
console.writewordln(sizeof(TTaskStateSegment));
ptrTaskStateSegment^.esp0:= cESP; 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'); console.writestringln('A');
asm asm
mov AX, 40 mov AX, 40