FUUUUUUUUUUUUUUUUUUUUUUU
git-svn-id: https://spexeah.com:8443/svn/Asuro@176 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c
This commit is contained in:
parent
f1dc0516df
commit
5a2004b486
BIN
bin/kernel.bin
BIN
bin/kernel.bin
Binary file not shown.
Binary file not shown.
BIN
lib/gdt.ppu
BIN
lib/gdt.ppu
Binary file not shown.
BIN
lib/isr13.ppu
BIN
lib/isr13.ppu
Binary file not shown.
BIN
lib/kernel.ppu
BIN
lib/kernel.ppu
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
lib/libpsystem.a
BIN
lib/libpsystem.a
Binary file not shown.
BIN
lib/tss.ppu
BIN
lib/tss.ppu
Binary file not shown.
Binary file not shown.
46
src/gdt.pas
46
src/gdt.pas
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
57
src/tss.pas
57
src/tss.pas
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user