WHY my gdt base address and idt base address and their size is wrong,the related code is:
Code: Select all
procedure kernel_gdt_set_entry(index:word;Base:qword;Limit:dword;AccessByte:byte;Flags:byte);
begin
PByte(@gdtentry[index].AccessByte)^:=AccessByte;
gdtentry[index].baselow:=base and $FFFF;
gdtentry[index].basemid:=(base shr 16) and $FF;
gdtentry[index].Basehigh1:=(base shr 24) and $FF;
gdtentry[index].Basehigh2:=(base shr 32) and $FFFFFFFF;
gdtentry[index].Flags:=Flags;
gdtentry[index].limitlow:=Limit and $FFFF;
gdtentry[index].Limithigh:=(Limit shr 16) and $F;
gdtentry[index].Reserved:=0;
end;
procedure kernel_idt_set_entry(index:word;address:qword;GateType:byte;PrivilegeLevel:byte);
begin
idtentry[index].DescriptorPrivilegeLevel:=PrivilegeLevel;
idtentry[index].Present:=1;
idtentry[index].SegmentSelector.Index:=1;
idtentry[index].SegmentSelector.TableIndicator:=0;
idtentry[index].SegmentSelector.RequestPrivilegeLevel:=0;
idtentry[index].GateType:=GateType;
idtentry[index].offsetlow:=address and $FFFF;
idtentry[index].offsetmiddle:=(address shr 16) and $FFFF;
idtentry[index].offsethigh:=(address shr 32) and $FFFFFFFF;
idtentry[index].Reserved1:=0;
idtentry[index].Reserved2:=0;
idtentry[index].Reserved3:=0;
idtentry[index].IST:=0;
if(address=0) then idtentry[index].Present:=0 else idtentry[index].Present:=1;
end;
procedure kernel_gdt_initialize;
var tempptr:Px64_gdt_descriptor;
begin
gdt.Offset:=Qword(@gdtentry);
gdt.Size:=sizeof(gdtentry)-1;
kernel_gdt_set_entry(1,0,0,$0,$0);
kernel_gdt_set_entry(2,0,$FFFFF,$9A,$A);
kernel_gdt_set_entry(3,0,$FFFFF,$92,$C);
kernel_gdt_set_entry(4,0,$FFFFF,$FA,$A);
kernel_gdt_set_entry(5,0,$FFFFF,$F2,$C);
tempptr:=@gdt;
asm
lgdt tempptr
end;
end;
procedure kernel_idt_initialize;
var i:word;
tempptr:Px64_idt_descriptor;
begin
idt.Offset:=Qword(@idtentry);
idt.Size:=sizeof(idtentry)-1;
i:=1;
while(i<=256)do
begin
case i of
1:kernel_idt_set_entry(i,Qword(@kernel_idt_handler_division_by_zero),$E,0);
2:kernel_idt_set_entry(i,Qword(@kernel_idt_handler_Debug_exception),$F,0);
3:kernel_idt_set_entry(i,Qword(@kernel_idt_handler_NMI_interrupt),$E,0);
4:kernel_idt_set_entry(i,Qword(@kernel_idt_handler_breakpoint),$F,0);
5:kernel_idt_set_entry(i,Qword(@kernel_idt_handler_overflow),$F,0);
6:kernel_idt_set_entry(i,Qword(@kernel_idt_handler_Bound_Range_exceed),$E,0);
7:kernel_idt_set_entry(i,Qword(@kernel_idt_handler_Invaild_Opcode),$E,0);
8:kernel_idt_set_entry(i,Qword(@kernel_idt_handler_Device_Not_Available),$E,0);
9:kernel_idt_set_entry(i,Qword(@kernel_idt_handler_Double_Fault),$E,0);
10:kernel_idt_set_entry(i,Qword(@kernel_idt_handler_Coprocessor_Segment_overrun),$E,0);
11:kernel_idt_set_entry(i,Qword(@kernel_idt_handler_invaild_TSS),$E,0);
12:kernel_idt_set_entry(i,Qword(@kernel_idt_handler_Segment_Not_Present),$E,0);
13:kernel_idt_set_entry(i,Qword(@kernel_idt_handler_Stack_Segment_Fault),$E,0);
14:kernel_idt_set_entry(i,Qword(@kernel_idt_handler_General_Protection),$E,0);
15:kernel_idt_set_entry(i,Qword(@kernel_idt_handler_Page_Fault),$E,0);
16:kernel_idt_set_entry(i,0,$E,0);
17:kernel_idt_set_entry(i,Qword(@kernel_idt_handler_FPU_Math_Error),$E,0);
18:kernel_idt_set_entry(i,Qword(@kernel_idt_handler_Alignment_Check),$E,0);
19:kernel_idt_set_entry(i,Qword(@kernel_idt_handler_Machine_Check),$E,0);
20:kernel_idt_set_entry(i,Qword(@kernel_idt_handler_SIMD_Floating_Point),$E,0);
21:kernel_idt_set_entry(i,Qword(@kernel_idt_handler_Virtualization_Exception),$E,0);
22..32:kernel_idt_set_entry(i,Qword(@kernel_idt_handler_empty),$E,0);
33:kernel_idt_set_entry(i,Qword(@kernel_idt_handler_timer),$E,3);
34..256:kernel_idt_set_entry(i,Qword(@kernel_idt_handler_empty),$E,0);
end;
inc(i);
end;
tempptr:=@idt;
asm
lidt tempptr
end;
end;
{$ENDIF}
procedure kernel_initialize;
var arch:byte;
begin
arch:=kernel_get_architecture;
case arch of
0,1,2:
begin
{$IF Defined(cpui386) or Defined(cpux86_64) or Defined(cpuia64)}
asm
cli
end;
kernel_gdt_initialize;
kernel_idt_initialize;
asm
sti
end;
{$ENDIF}
end;
end;
end;