Nothing much seriously. Prepare for interrupt handling in long mode.

This commit is contained in:
HyperAssembler 2015-02-07 16:26:20 -08:00
parent 56375a5253
commit 3dd081316b
9 changed files with 80 additions and 438 deletions

19
x64/src/asm/io.asm Normal file
View File

@ -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

37
x64/src/asm/mem.asm Normal file
View File

@ -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

View File

@ -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);

1
x64/src/c/int.c Normal file
View File

@ -0,0 +1 @@
#include "int.h"

3
x64/src/c/int.h Normal file
View File

@ -0,0 +1,3 @@
#ifndef _INT_H_
#define _INT_H_
#endif

7
x64/src/c/io.h Normal file
View File

@ -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

View File

@ -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");
}

View File

@ -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

View File

@ -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;
}