FUUUUUUUUUUUUUUUUUUUUUUU
git-svn-id: https://spexeah.com:8443/svn/Asuro@176 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c
This commit is contained in:
1 parent
f1dc0516df
commit
5a2004b486
15 files changed
+104
-20
No files matched your search
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
+37
-9
@@ -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;
|
||||||
|
|
||||||
|
|||||||
+10
-3
@@ -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;
|
||||||
|
|
||||||
|
|||||||
+7
-1
@@ -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;
|
||||||
|
|
||||||
|
|||||||
+50
-7
@@ -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
|
||||||
|
|||||||
Reference in new issue
Block a user