From da08dfd94149585f7279ef971f55852fc073ff4b Mon Sep 17 00:00:00 2001 From: kieron Date: Tue, 16 May 2017 11:53:51 +0000 Subject: [PATCH] Fixed GDT Code up - not tested properly yet, but it compiles. git-svn-id: https://spexeah.com:8443/svn/Asuro@19 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c --- src/gdt.pas | 99 ++++++++++++++++++++++++++------------------------ src/kernel.pas | 2 + src/types.pas | 25 +++++++++++++ src/util.pas | 14 +++---- 4 files changed, 85 insertions(+), 55 deletions(-) create mode 100644 src/types.pas diff --git a/src/gdt.pas b/src/gdt.pas index c8a53d12..f557d331 100644 --- a/src/gdt.pas +++ b/src/gdt.pas @@ -3,10 +3,14 @@ unit gdt; interface uses - util; + util, + types; -type - TSegementDescriptor = bitpacked record +procedure create(base : dword; limit : dword; flags : byte); +procedure init(); + +type + TSegmentDescriptor = bitpacked record limit_low : WORD; base_low : WORD; access : Byte; @@ -15,55 +19,35 @@ type end; PSegmentDescriptor = ^TSegmentDescriptor; -var - GDTarr : array of TSegementDescriptor; - GDTptr : PSegmentDescriptor; - GDT_length : integer = 0; - - procedure init(); - procedure create(base : dword; limit : dword; flags : byte); - implementation -procedure init(); -var - data_addr : dword; -begin - GDTptr := @GDTarr[0]; - data_addr := (@GDTarr[2] - @GDTarr[0]) shr 16; - create($0000, $0000, $00); //null segment / GDT pointer - create($0000, $FFFF, $9A); //code descriptor - create($0000, $FFFF, $92); //data descriptor - asm - LGDT GDTptr - MOV AX, data_addr - MOV DS, AX - MOV SS, AX - MOV ES, AX - MOV FS, AX - MOV GS, AX - end; -end; +var + GDTarr : array [0..5] of TSegmentDescriptor; + GDTptr : PSegmentDescriptor; + GDT_length : integer = 0; procedure create(base : dword; limit : dword; flags : byte); var descriptor : array[0..8] of Byte; - descriptor_ptr : ^Byte = @descriptor[0]; - s_descriptor : TSegementDescriptor; - s_descriptor_ptr : ^TSegementDescriptor = @s_descriptor; + descriptor_ptr : PByte; + + s_descriptor : TSegmentDescriptor; + s_descriptor_ptr : PSegmentDescriptor; begin - if limit <= 65536 then begin - descriptor[6] := $40 - end else begin - if (limit and $FFF) <> $FFF then begin - limit := (limit SHR 12) -1 - end else begin - limit := limit SHR 12; - end; + descriptor_ptr:= @descriptor[0]; + s_descriptor_ptr:= @s_descriptor; + if limit <= 65536 then begin + descriptor[6] := $40 + end else begin + if (limit and $FFF) <> $FFF then begin + limit := (limit SHR 12) -1 + end else begin + limit := limit SHR 12; + end; end; - descriptor[6] := $C0; + descriptor[6] := $C0; descriptor[0] := limit and $FF; descriptor[1] := (limit shr 8) and $FF; @@ -77,22 +61,41 @@ begin descriptor[5] := flags; asm - MOV EAX, descriptor_ptr - MOV s_descriptor_ptr, EAX - end; + MOV EAX, descriptor_ptr + MOV s_descriptor_ptr, EAX + end; - descriptor_ptr = @descriptor[4]; + descriptor_ptr:= @descriptor[4]; asm MOV EAX, descriptor_ptr MOV EBX, s_descriptor_ptr ADD EBX, 1 - MOV (EBX), EAX + MOV [EBX], EAX end; GDTarr[GDT_length] := s_descriptor; GDT_length := GDT_length + 1; end; - +procedure init(); +var + data_addr : dword; +begin + GDTptr := @GDTarr[0]; + data_addr := (@GDTarr[2] - @GDTarr[0]) shr 16; + create($0000, $0000, $00); //null segment / GDT pointer + create($0000, $FFFF, $9A); //code descriptor + create($0000, $FFFF, $92); //data descriptor + asm + LGDT GDTptr + MOV EAX, data_addr + MOV DS, AX + MOV SS, AX + MOV ES, AX + MOV FS, AX + MOV GS, AX + end; +end; + end. diff --git a/src/kernel.pas b/src/kernel.pas index 83af5d69..6873868c 100644 --- a/src/kernel.pas +++ b/src/kernel.pas @@ -5,6 +5,7 @@ interface uses multiboot, util, + gdt, console, bios_data_area, keyboard; @@ -18,6 +19,7 @@ var c : byte; begin + gdt.init(); console.init(); console.writestringln('Booting Asuro...'); if (mbmagic <> MULTIBOOT_BOOTLOADER_MAGIC) then begin diff --git a/src/types.pas b/src/types.pas new file mode 100644 index 00000000..a78a15f1 --- /dev/null +++ b/src/types.pas @@ -0,0 +1,25 @@ +unit types; + +interface + +type + //Standard Types + Int8 = BYTE; + Int16 = WORD; + Int32 = DWORD; + Int64 = QWORD; + + //Pointer Types + PByte = ^Byte; + PInt8 = PByte; + PInt16 = ^Int16; + PInt32 = ^Int32; + PInt64 = ^Int64; + + Void = ^Int32; + + + +implementation + +end. diff --git a/src/util.pas b/src/util.pas index 5839ac0b..29174461 100644 --- a/src/util.pas +++ b/src/util.pas @@ -32,7 +32,7 @@ begin switchendian:= (lo(b) SHL 4) OR hi(b); end; -procedure outl(port : word; val : longword); [public, alias: 'outl']; +procedure outl(port : word; val : longword); [public, alias: 'util_outl']; begin asm PUSH EAX @@ -45,7 +45,7 @@ begin end; end; -procedure outw(port : word; val : word); [public, alias: 'outw']; +procedure outw(port : word; val : word); [public, alias: 'util_outw']; begin asm PUSH EAX @@ -58,7 +58,7 @@ begin end; end; -procedure outb(port : word; val : byte); [public, alias: 'outb']; +procedure outb(port : word; val : byte); [public, alias: 'util_outb']; begin asm PUSH EAX @@ -71,7 +71,7 @@ begin end; end; -procedure halt_and_catch_fire(); [public, alias: 'halt_and_catch_fire']; +procedure halt_and_catch_fire(); [public, alias: 'util_halt_and_catch_fire']; begin asm cli @@ -79,7 +79,7 @@ begin end; end; -function inl(port : word) : dword; [public, alias: 'inl']; +function inl(port : word) : dword; [public, alias: 'util_inl']; begin asm PUSH EAX @@ -92,7 +92,7 @@ begin end; end; -function inw(port : word) : word; [public, alias: 'inw']; +function inw(port : word) : word; [public, alias: 'util_inw']; begin asm PUSH EAX @@ -105,7 +105,7 @@ begin end; end; -function inb(port : word) : byte; [public, alias: 'inb']; +function inb(port : word) : byte; [public, alias: 'util_inb']; begin asm PUSH EAX