Nothing much seriously. Prepare for interrupt handling in long mode.
This commit is contained in:
parent
56375a5253
commit
3dd081316b
|
@ -0,0 +1,19 @@
|
|||
global hk_write_port
|
||||
global hk_read_port
|
||||
[SECTION .text]
|
||||
[BITS 64]
|
||||
hk_write_port:
|
||||
mov rdx,rdi
|
||||
mov rax,rsi
|
||||
out dx,eax
|
||||
nop
|
||||
nop
|
||||
ret
|
||||
|
||||
hk_read_port:
|
||||
mov rdx,rdi
|
||||
xor rax,rax
|
||||
in eax,dx
|
||||
nop
|
||||
nop
|
||||
ret
|
|
@ -0,0 +1,37 @@
|
|||
global hk_flush_gdt
|
||||
global hk_flush_tlb
|
||||
;Functions preserve the registers rbx, rsp, rbp, r12, r13, r14, and 15
|
||||
;rax, rdi, rsi, rdx, rcx, r8, r9, r10, r11 are scratch registers.
|
||||
|
||||
[SECTION .text]
|
||||
[BITS 64]
|
||||
hk_flush_gdt:
|
||||
push rbp
|
||||
mov rbp,rsp
|
||||
lgdt [rdi]
|
||||
;reload cs
|
||||
|
||||
push rdx ; data_slct : ss
|
||||
push rbp ; rsp
|
||||
|
||||
pushfq
|
||||
pop rax
|
||||
push rax ; eflags
|
||||
|
||||
push rsi ; cs
|
||||
push qword hk_flush_gdt.reload ;eip
|
||||
iretq
|
||||
.reload:
|
||||
mov es,dx
|
||||
mov fs,dx
|
||||
mov gs,dx
|
||||
mov ds,dx
|
||||
mov rsp,rbp
|
||||
pop rbp
|
||||
ret
|
||||
|
||||
;void hk_flush_tlb(void)
|
||||
hk_flush_tlb:
|
||||
mov rax,cr3
|
||||
mov cr3,rax
|
||||
ret
|
|
@ -12,7 +12,6 @@ extern void HYPKERNEL64 hk_flush_gdt(gdt_ptr_t* gdt_ptr, uint64_t code_slct, uin
|
|||
void HYPKERNEL64 hk_main(multiboot_info_t* multiboot_info)
|
||||
{
|
||||
text_pos = 0;
|
||||
hk_printf("Kernel is now running in x64 mode. Multiboot info is located at %X.\n\n", (uint64_t)multiboot_info);
|
||||
hk_printf("*Setting up GDT...");
|
||||
hk_write_segment_descriptor((void*)&g_gdt[0], 0, 0, 0);
|
||||
hk_write_segment_descriptor((void*)&g_gdt[8], 0, 0, SEG_DPL_0 | SEG_CODE_DATA | SEG_PRESENT | SEG_LONG | SEG_TYPE_CODE_X);
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
#include "int.h"
|
|
@ -0,0 +1,3 @@
|
|||
#ifndef _INT_H_
|
||||
#define _INT_H_
|
||||
#endif
|
|
@ -0,0 +1,7 @@
|
|||
#ifndef _IO_H_
|
||||
#define _IO_H_
|
||||
#include "kdef.h"
|
||||
#include "type.h"
|
||||
extern void HYPKERNEL64 hk_write_port(uint64_t port, int64_t data);
|
||||
extern int64_t HYPKERNEL64 hk_read_port(uint64_t port);
|
||||
#endif
|
265
x86/KeIO32.c
265
x86/KeIO32.c
|
@ -1,265 +0,0 @@
|
|||
#include "KeIO32.h"
|
||||
#include "KeDef.h"
|
||||
#include "KeKernelStruct32.h"
|
||||
#include "KeGraph32.h"
|
||||
VOID KeWriteGDT(_IN_ ULONG32 Index, _IN_ PIAGDT32 Dest, _IN_ PKeGDTDescriptor32 Src)
|
||||
{
|
||||
if (!Dest || !Src)
|
||||
return;
|
||||
ULONG32 temp = 0;
|
||||
ULONG32 datal = 0;
|
||||
ULONG32 datah = 0;
|
||||
temp = (Src->Base);
|
||||
datal = ((temp & 0x0000ffff) << 16 );
|
||||
temp = Src->Limit;
|
||||
datal = datal + (temp & 0x0000ffff);
|
||||
temp = Src->Base;
|
||||
datah = (temp & 0xff000000);
|
||||
datah = datah + Src->AVL;
|
||||
datah = datah + Src->DB;
|
||||
datah = datah + Src->G;
|
||||
datah = datah + Src->P;
|
||||
datah = datah + Src->S;
|
||||
datah = datah + Src->DPL;
|
||||
datah = datah + Src->Type;
|
||||
temp = Src->Limit;
|
||||
temp = temp & 0x000f0000;
|
||||
datah = datah + temp;
|
||||
temp = Src->Base;
|
||||
datah = datah + ((temp & 0x00ff0000) >> 16);
|
||||
*(PULONG32)(Dest+Index) = datal;
|
||||
*((PULONG32)(Dest+Index)+1) = datah;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
VOID KeInitializeKeGDTDescriptor32(_OUT_ PKeGDTDescriptor32 Desc, _IN_ ULONG32 Base, _IN_ ULONG32 Limit, _IN_ ULONG32 G, _IN_ ULONG32 P, _IN_ ULONG32 S, _IN_ ULONG32 Type, _IN_ ULONG32 DPL, _IN_ ULONG32 DB, _IN_ ULONG32 AVL)
|
||||
{
|
||||
if (!Desc)
|
||||
return;
|
||||
Desc->Base = Base;
|
||||
Desc->Limit = Limit;
|
||||
Desc->G = G;
|
||||
Desc->P = P;
|
||||
Desc->S = S;
|
||||
Desc->Type = Type;
|
||||
Desc->DPL = DPL;
|
||||
Desc->DB = DB;
|
||||
Desc->AVL = AVL;
|
||||
return;
|
||||
}
|
||||
|
||||
VOID KeInitializeKeIDTDescriptor32(_OUT_ PKeIDTDescriptor32 Desc, _IN_ ULONG32 GateType, _IN_ ULONG32 DPL, _IN_ ULONG32 D, _IN_ ULONG32 P, _IN_ ULONG32 Selector, _IN_ ULONG32 Offset)
|
||||
{
|
||||
if (!Desc)
|
||||
return;
|
||||
Desc->GateType = GateType;
|
||||
Desc->DPL = DPL;
|
||||
Desc->D = D;
|
||||
Desc->P = P;
|
||||
Desc->Selector = Selector;
|
||||
Desc->Offset = Offset;
|
||||
return;
|
||||
}
|
||||
|
||||
VOID KeSwitchGDT(VOID)
|
||||
{
|
||||
KeGDTDescriptor32 i;
|
||||
|
||||
*((PULONG16)(&KeGDTPtr[0]))= GDT_DESCRIPTOR_NUMBER * sizeof(IAGDT32)-1;
|
||||
*((PULONG32)(&KeGDTPtr[2])) = (ULONG32)&KeGDT[0];
|
||||
|
||||
KeInitializeKeGDTDescriptor32(&i,0x0,0xfffff,KeWriteGDT_G_1,KeWriteGDT_P_1,KeWriteGDT_S_1,KeWriteGDT_Type_Code_ExecuteOnly,KeWriteGDT_DPL_0,KeWriteGDT_DB_1,KeWriteGDT_AVL_0);
|
||||
KeWriteGDT(GDT_INDEX_CODE,&KeGDT[0],&i);
|
||||
|
||||
KeInitializeKeGDTDescriptor32(&i,0x0b8000,0xffff,KeWriteGDT_G_0,KeWriteGDT_P_1,KeWriteGDT_S_1,KeWriteGDT_Type_Data_ReadWrite,KeWriteGDT_DPL_3,KeWriteGDT_DB_0,KeWriteGDT_AVL_0);
|
||||
KeWriteGDT(GDT_INDEX_GRAPH,&KeGDT[0],&i);
|
||||
|
||||
KeInitializeKeGDTDescriptor32(&i,0x0,0xfffff,KeWriteGDT_G_1,KeWriteGDT_P_1,KeWriteGDT_S_1,KeWriteGDT_Type_Data_ReadWrite,KeWriteGDT_DPL_0,KeWriteGDT_DB_1,KeWriteGDT_AVL_0);
|
||||
KeWriteGDT(GDT_INDEX_DATA,&KeGDT[0],&i);
|
||||
|
||||
KeInitializeKeGDTDescriptor32(&i,0,0,0,0,0,0,0,0,0);
|
||||
KeWriteGDT(GDT_INDEX_DUMMY,&KeGDT[0],&i);
|
||||
|
||||
KeInitializeKeGDTDescriptor32(&i,0x0,0xfffff,KeWriteGDT_G_1,KeWriteGDT_P_1,KeWriteGDT_S_1,KeWriteGDT_Type_Code_ExecuteOnly,KeWriteGDT_DPL_3,KeWriteGDT_DB_1,KeWriteGDT_AVL_0);
|
||||
KeWriteGDT(GDT_INDEX_USER_CODE,&KeGDT[0],&i);
|
||||
|
||||
KeInitializeKeGDTDescriptor32(&i,0x0,0xfffff,KeWriteGDT_G_1,KeWriteGDT_P_1,KeWriteGDT_S_1,KeWriteGDT_Type_Data_ReadWrite,KeWriteGDT_DPL_3,KeWriteGDT_DB_1,KeWriteGDT_AVL_0);
|
||||
KeWriteGDT(GDT_INDEX_USER_DATA,&KeGDT[0],&i);
|
||||
}
|
||||
|
||||
VOID KeInitInterrupt(VOID)
|
||||
{
|
||||
KeInit8259A();
|
||||
KeInitIDT();
|
||||
}
|
||||
|
||||
|
||||
VOID KeWriteIDT(_IN_ ULONG32 Index, _IN_ PIAGATE32 Dest, _IN_ PKeIDTDescriptor32 Src)
|
||||
{
|
||||
if (!Dest || !Src)
|
||||
return;
|
||||
ULONG32 datah = 0;
|
||||
ULONG32 datal = 0;
|
||||
ULONG32 temp = 0;
|
||||
temp = Src->Selector;
|
||||
datal = ((temp & 0x0000ffff) << 16);
|
||||
temp = Src->Offset;
|
||||
datal = datal + (temp & 0x0000ffff);
|
||||
|
||||
temp = Src->Offset;
|
||||
datah = datah + (temp & 0xffff0000);
|
||||
datah = datah + Src->P;
|
||||
datah = datah + Src->D;
|
||||
datah = datah + Src->DPL;
|
||||
datah = datah + Src->GateType;
|
||||
|
||||
*(PULONG32)(Dest + Index) = datal;
|
||||
*((PULONG32)(Dest + Index)+1) = datah;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
VOID KeInit8259A(VOID)
|
||||
{
|
||||
_asm_KeWritePort(INT_M_CTL,0x11);
|
||||
_asm_KeWritePort(INT_S_CTL,0x11);
|
||||
_asm_KeWritePort(INT_M_CTLMASK,INT_VECTOR_IRQ0);
|
||||
_asm_KeWritePort(INT_S_CTLMASK,INT_VECTOR_IRQ8);
|
||||
_asm_KeWritePort(INT_M_CTLMASK,0x4);
|
||||
_asm_KeWritePort(INT_S_CTLMASK,0x2);
|
||||
_asm_KeWritePort(INT_M_CTLMASK,0x1);
|
||||
_asm_KeWritePort(INT_S_CTLMASK,0x1);
|
||||
_asm_KeWritePort(INT_M_CTLMASK,0xFD);
|
||||
_asm_KeWritePort(INT_S_CTLMASK,0xFF);
|
||||
}
|
||||
|
||||
|
||||
|
||||
VOID KeExceptionHandler(_IN_ ULONG32 VectorNumber, _IN_ ULONG32 ErrorCode, _IN_ ULONG32 eip, _IN_ ULONG32 cs, _IN_ ULONG32 eFlags)
|
||||
{
|
||||
_asm_KeClearGraph32();
|
||||
_asm_KePrintStr32("Exception Caught:\n");
|
||||
_asm_KePrintStr32("VectorNumber:");
|
||||
_asm_KePrintHex32(VectorNumber);
|
||||
_asm_KePrintStr32("\nErrorCode:");
|
||||
_asm_KePrintHex32(ErrorCode);
|
||||
_asm_KePrintStr32("\nCS:");
|
||||
_asm_KePrintHex32(cs);
|
||||
_asm_KePrintStr32("\nEIP:");
|
||||
_asm_KePrintHex32(eip);
|
||||
_asm_KePrintStr32("\neFlags:");
|
||||
_asm_KePrintHex32(eFlags);
|
||||
}
|
||||
|
||||
VOID KeInitIDT(VOID)
|
||||
{
|
||||
KeIDTDescriptor32 Desc;
|
||||
*(PULONG16)(&KeIDTPtr[0])= IDT_GATE_NUMBER * sizeof(IAGATE32) - 1;
|
||||
*(PULONG32)(&KeIDTPtr[2])= (ULONG32)(&KeIDT[0]);
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeDivideError);
|
||||
KeWriteIDT(INT_VECTOR_DIVIDE,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeSingleStepException);
|
||||
KeWriteIDT(INT_VECTOR_DEBUG,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeNMI);
|
||||
KeWriteIDT(INT_VECTOR_NMI,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeBreakpointException);
|
||||
KeWriteIDT(INT_VECTOR_BREAKPOINT,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeOverflow);
|
||||
KeWriteIDT(INT_VECTOR_OVERFLOW,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeBoundsCheck);
|
||||
KeWriteIDT(INT_VECTOR_BOUNDS,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeInvalidOpcode);
|
||||
KeWriteIDT(INT_VECTOR_INVAL_OP,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeCoprNotAvailable);
|
||||
KeWriteIDT(INT_VECTOR_COPROC_NOT,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeCoprError);
|
||||
KeWriteIDT(INT_VECTOR_COPROC_ERR,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeCoprSegmentOverrun);
|
||||
KeWriteIDT(INT_VECTOR_COPROC_SEG,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeDoubleFault);
|
||||
KeWriteIDT(INT_VECTOR_DOUBLE_FAULT,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeInvalidTSS);
|
||||
KeWriteIDT(INT_VECTOR_INVAL_TSS,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeStackException);
|
||||
KeWriteIDT(INT_VECTOR_STACK_FAULT,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeSegmentNotPresent);
|
||||
KeWriteIDT(INT_VECTOR_SEG_NOT,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeGeneralProtection);
|
||||
KeWriteIDT(INT_VECTOR_PROTECTION,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KePageFault);
|
||||
KeWriteIDT(INT_VECTOR_PAGE_FAULT,&KeIDT[0],&Desc);
|
||||
|
||||
//Interrupts
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeIrqInt00);
|
||||
KeWriteIDT(INT_VECTOR_IRQ0 + 0,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeIrqInt01);
|
||||
KeWriteIDT(INT_VECTOR_IRQ0 + 1,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeIrqInt02);
|
||||
KeWriteIDT(INT_VECTOR_IRQ0 + 2,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeIrqInt03);
|
||||
KeWriteIDT(INT_VECTOR_IRQ0 + 3,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeIrqInt04);
|
||||
KeWriteIDT(INT_VECTOR_IRQ0 + 4,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeIrqInt05);
|
||||
KeWriteIDT(INT_VECTOR_IRQ0 + 5,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeIrqInt06);
|
||||
KeWriteIDT(INT_VECTOR_IRQ0 + 6,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeIrqInt07);
|
||||
KeWriteIDT(INT_VECTOR_IRQ0 + 7,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeIrqInt08);
|
||||
KeWriteIDT(INT_VECTOR_IRQ8 + 0,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeIrqInt09);
|
||||
KeWriteIDT(INT_VECTOR_IRQ8 + 1,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeIrqInt10);
|
||||
KeWriteIDT(INT_VECTOR_IRQ8 + 2,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeIrqInt11);
|
||||
KeWriteIDT(INT_VECTOR_IRQ8 + 3,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeIrqInt12);
|
||||
KeWriteIDT(INT_VECTOR_IRQ8 + 4,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeIrqInt13);
|
||||
KeWriteIDT(INT_VECTOR_IRQ8 + 5,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeIrqInt14);
|
||||
KeWriteIDT(INT_VECTOR_IRQ8 + 6,&KeIDT[0],&Desc);
|
||||
|
||||
KeInitializeKeIDTDescriptor32(&Desc,KeWriteIDT_GateType_InterruptGate,KeWriteIDT_DPL_3,KeWriteIDT_D_1,KeWriteIDT_P_1, GDT_SELECTOR_CODE,(ULONG32)&_asm_KeIrqInt15);
|
||||
KeWriteIDT(INT_VECTOR_IRQ8 + 7,&KeIDT[0],&Desc);
|
||||
|
||||
_asm_KeLoadIDT();
|
||||
}
|
||||
|
||||
VOID KeIrqIntHandler(_IN_ ULONG32 IrqNumber)
|
||||
{
|
||||
_asm_KePrintStr32("\nIrq Interrupt Detected. Irq Number:");
|
||||
_asm_KePrintHex32(IrqNumber);
|
||||
_asm_KePrintStr32("\n");
|
||||
}
|
153
x86/KeIO32.h
153
x86/KeIO32.h
|
@ -1,153 +0,0 @@
|
|||
#ifndef _KeIO32_h_
|
||||
#define _KeIO32_h_
|
||||
|
||||
#include "hkdef32.h"
|
||||
#include "KeGlobalVariables.h"
|
||||
#include "KeCPUStruct32.h"
|
||||
#include "KeKernelStruct32.h"
|
||||
|
||||
#define PRIVILEGE_KERNEL 0
|
||||
#define PRIVILEGE_TASK 1
|
||||
#define PRIVILEGE_USER 3
|
||||
|
||||
typedef VOID (*PExceptionHandler)(VOID);
|
||||
|
||||
void HKA32 _asm_KeWritePort(_IN_ ULONG16 Port, _IN_ ULONG8 Value);
|
||||
ULONG8 HYPKERNELAPI _asm_KeReadPort(_IN_ ULONG16 Port);
|
||||
VOID HYPKERNELAPI _asm_KeLoadIDT(VOID);
|
||||
VOID HYPKERNELAPI KeInit8259A(VOID);
|
||||
VOID HYPKERNELAPI KeInitInterrupt(VOID);
|
||||
VOID HYPKERNELAPI KeSwitchGDT(VOID);
|
||||
VOID HYPKERNELAPI KeInitIDT(VOID);
|
||||
VOID HYPKERNELAPI KeWriteGDT(_IN_ ULONG32 Index, _IN_ PIAGDT32 Dest, _IN_ PKeGDTDescriptor32 Src);
|
||||
VOID HYPKERNELAPI KeWriteIDT(_IN_ ULONG32 Index, _IN_ PIAGATE32 Dest, _IN_ PKeIDTDescriptor32 Src);
|
||||
VOID HYPKERNELAPI KeExceptionHandler(_IN_ ULONG32 VectorNumber, _IN_ ULONG32 ErrorCode, _IN_ ULONG32 eip, _IN_ ULONG32 cs, _IN_ ULONG32 eFlags);
|
||||
VOID HYPKERNELAPI _asm_KeDivideError(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeSingleStepException(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeNMI(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeBreakpointException(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeOverflow(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeBoundsCheck(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeInvalidOpcode(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeCoprNotAvailable(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeDoubleFault(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeCoprSegmentOverrun(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeInvalidTSS(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeSegmentNotPresent(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeStackException(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeGeneralProtection(VOID);
|
||||
VOID HYPKERNELAPI _asm_KePageFault(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeCoprError(VOID);
|
||||
VOID HYPKERNELAPI KeIrqIntHandler(_IN_ ULONG32 IrqNumber);
|
||||
VOID HYPKERNELAPI _asm_KeIrqInt00(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeIrqInt01(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeIrqInt02(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeIrqInt03(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeIrqInt04(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeIrqInt05(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeIrqInt06(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeIrqInt07(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeIrqInt08(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeIrqInt09(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeIrqInt10(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeIrqInt11(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeIrqInt12(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeIrqInt13(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeIrqInt14(VOID);
|
||||
VOID HYPKERNELAPI _asm_KeIrqInt15(VOID);
|
||||
VOID HYPKERNELAPI KeInitializeKeGDTDescriptor32(_OUT_ PKeGDTDescriptor32 Desc, _IN_ ULONG32 Base, _IN_ ULONG32 Limit, _IN_ ULONG32 G, _IN_ ULONG32 P, _IN_ ULONG32 S, _IN_ ULONG32 Type, _IN_ ULONG32 DPL, _IN_ ULONG32 DB, _IN_ ULONG32 AVL);
|
||||
VOID HYPKERNELAPI KeInitializeKeIDTDescriptor32(_OUT_ PKeIDTDescriptor32 Desc, _IN_ ULONG32 GateType, _IN_ ULONG32 DPL, _IN_ ULONG32 D, _IN_ ULONG32 P, _IN_ ULONG32 Selector, _IN_ ULONG32 Offset);
|
||||
|
||||
//KeWriteGDT
|
||||
#define KeWriteGDT_AVL_1 0x00100000
|
||||
#define KeWriteGDT_AVL_0 0x0
|
||||
#define KeWriteGDT_DB_0 0x0
|
||||
#define KeWriteGDT_DB_1 0x00400000
|
||||
#define KeWriteGDT_P_0 0x0
|
||||
#define KeWriteGDT_P_1 0x00008000
|
||||
#define KeWriteGDT_G_0 0x0
|
||||
#define KeWriteGDT_G_1 0x00800000
|
||||
#define KeWriteGDT_L_0 0x0
|
||||
#define KeWriteGDT_L_1 0x00200000
|
||||
#define KeWriteGDT_DPL_0 0x0
|
||||
#define KeWriteGDT_DPL_1 0x00002000
|
||||
#define KeWriteGDT_DPL_2 0x00004000
|
||||
#define KeWriteGDT_DPL_3 0x00006000
|
||||
#define KeWriteGDT_S_0 0x0
|
||||
#define KeWriteGDT_S_1 0x00001000
|
||||
#define KeWriteGDT_Type_Data_ReadOnly 0x0
|
||||
#define KeWriteGDT_Type_Data_ReadOnlyAccessed 0x00000100
|
||||
#define KeWriteGDT_Type_Data_ReadWrite 0x00000200
|
||||
#define KeWriteGDT_Type_Data_ReadWriteAccessed 0x00000300
|
||||
#define KeWriteGDT_Type_Data_ReadOnlyExpandDown 0x00000400
|
||||
#define KeWriteGDT_Type_Data_ReadOnlyExpandDownAccessed 0x00000500
|
||||
#define KeWriteGDT_Type_Data_ReadWriteExpandDown 0x00000600
|
||||
#define KeWriteGDT_Type_Data_ReadWriteExpandDownAccessed 0x00000700
|
||||
#define KeWriteGDT_Type_Code_ExecuteOnly 0x00000800
|
||||
#define KeWriteGDT_Type_Code_ExecuteOnlyAccessed 0x00000900
|
||||
#define KeWriteGDT_Type_Code_ExecuteRead 0x00000A00
|
||||
#define KeWriteGDT_Type_Code_ExecuteReadAccessed 0x00000B00
|
||||
#define KeWriteGDT_Type_Code_ExecuteOnlyConforming 0x00000C00
|
||||
#define KeWriteGDT_Type_Code_ExecuteOnlyConformingAccessed 0x00000D00
|
||||
#define KeWriteGDT_Type_Code_ExecuteReadConforming 0x00000E00
|
||||
#define KeWriteGDT_Type_Code_ExecuteReadConformingAccessed 0x00000F00
|
||||
#define KeWriteGDT_Type_System_Reserved1 0x00000000
|
||||
#define KeWriteGDT_Type_System_16BitsTssAvailable 0x00000100
|
||||
#define KeWriteGDT_Type_System_LDT 0x00000200
|
||||
#define KeWriteGDT_Type_System_16BitsTssBusy 0x00000300
|
||||
#define KeWriteGDT_Type_System_16BitsCallGate 0x00000400
|
||||
#define KeWriteGDT_Type_System_TaskGate 0x00000500
|
||||
#define KeWriteGDT_Type_System_16BitsInterruptGate 0x00000600
|
||||
#define KeWriteGDT_Type_System_16BitsTrapGate 0x00000700
|
||||
#define KeWriteGDT_Type_System_Reserved2 0x00000800
|
||||
#define KeWriteGDT_Type_System_32BitsTSSAvailable 0x00000900
|
||||
#define KeWriteGDT_Type_System_Reserved3 0x00000A00
|
||||
#define KeWriteGDT_Type_System_32BitsTSSBusy 0x00000B00
|
||||
#define KeWriteGDT_Type_System_32BitsCallGate 0x00000C00
|
||||
#define KeWriteGDT_Type_System_Reserved4 0x00000D00
|
||||
#define KeWriteGDT_Type_System_32BitsInterruptGate 0x00000E00
|
||||
#define KeWriteGDT_Type_System_32BitsTrapGate 0x00000F00
|
||||
|
||||
//KeWriteIDT
|
||||
#define KeWriteIDT_P_0 0x0
|
||||
#define KeWriteIDT_P_1 0x00008000
|
||||
#define KeWriteIDT_DPL_0 0x0
|
||||
#define KeWriteIDT_DPL_1 0x00002000
|
||||
#define KeWriteIDT_DPL_2 0x00004000
|
||||
#define KeWriteIDT_DPL_3 0x00006000
|
||||
#define KeWriteIDT_D_0 0x0
|
||||
#define KeWriteIDT_D_1 2048
|
||||
#define KeWriteIDT_GateType_TaskGate 256
|
||||
#define KeWriteIDT_GateType_InterruptGate 1536
|
||||
#define KeWriteIDT_GateType_TrapGate 1792
|
||||
|
||||
|
||||
//PORT
|
||||
#define INT_M_CTL 0x20
|
||||
#define INT_M_CTLMASK 0x21
|
||||
#define INT_S_CTL 0xA0
|
||||
#define INT_S_CTLMASK 0xA1
|
||||
#define INT_VECTOR_IRQ0 0x20
|
||||
#define INT_VECTOR_IRQ8 0x28
|
||||
|
||||
#define RPL_KRNL 0
|
||||
#define RPL_TASK 1
|
||||
#define RPL_USER 3
|
||||
|
||||
#define INT_VECTOR_DIVIDE 0x0
|
||||
#define INT_VECTOR_DEBUG 0x1
|
||||
#define INT_VECTOR_NMI 0x2
|
||||
#define INT_VECTOR_BREAKPOINT 0x3
|
||||
#define INT_VECTOR_OVERFLOW 0x4
|
||||
#define INT_VECTOR_BOUNDS 0x5
|
||||
#define INT_VECTOR_INVAL_OP 0x6
|
||||
#define INT_VECTOR_COPROC_NOT 0x7
|
||||
#define INT_VECTOR_DOUBLE_FAULT 0x8
|
||||
#define INT_VECTOR_COPROC_SEG 0x9
|
||||
#define INT_VECTOR_INVAL_TSS 0xA
|
||||
#define INT_VECTOR_SEG_NOT 0xB
|
||||
#define INT_VECTOR_STACK_FAULT 0xC
|
||||
#define INT_VECTOR_PROTECTION 0xD
|
||||
#define INT_VECTOR_PAGE_FAULT 0xE
|
||||
#define INT_VECTOR_COPROC_ERR 0x10
|
||||
#endif
|
|
@ -13,8 +13,20 @@ extern void hk_init_x64(multiboot_info_t* multiboot_info);
|
|||
extern void BOCHS_MAGIC_BREAKPOINT(void);
|
||||
extern void HLT_CPU(void);
|
||||
|
||||
void HYPKERNEL32 hk_init_x86(multiboot_info_t * multiboot_info)
|
||||
void HYPKERNEL32 hk_main(multiboot_info_t* multiboot_info)
|
||||
{
|
||||
//init text_position
|
||||
text_pos = 0;
|
||||
|
||||
//detect architecture
|
||||
hk_printf("*Checking architecture...\n");
|
||||
if (hk_support_x64() == 1)
|
||||
{
|
||||
hk_printf("Arch: x86_64.\n\n");
|
||||
hk_init_x64(multiboot_info);
|
||||
}
|
||||
hk_printf("Arch: x86.\n\n");
|
||||
|
||||
hk_printf("*Setting up GDT...");
|
||||
//dummy descriptor
|
||||
hk_write_segment_descriptor((void*)(&g_gdt[0]), 0, 0, 0);
|
||||
|
@ -78,24 +90,6 @@ void HYPKERNEL32 hk_init_x86(multiboot_info_t * multiboot_info)
|
|||
hk_printf("Module information is currently unavailable.\n\n");
|
||||
}
|
||||
HLT_CPU();
|
||||
}
|
||||
|
||||
void HYPKERNEL32 hk_main(multiboot_info_t* multiboot_info)
|
||||
{
|
||||
//init text_position
|
||||
text_pos = 0;
|
||||
|
||||
//detect architecture
|
||||
hk_printf("*Checking architecture...\n");
|
||||
if (hk_support_x64() == 0)
|
||||
{
|
||||
hk_printf("Arch: x86.\n\n");
|
||||
hk_init_x86(multiboot_info);
|
||||
}
|
||||
else
|
||||
{
|
||||
hk_printf("Arch: x86_64.\n\n");
|
||||
hk_init_x64(multiboot_info);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue