
#include <freeldr.h>


KIDTENTRY DECLSPEC_ALIGN(4) i386Idt[32];
KDESCRIPTOR i386IdtDescriptor = {0, 255, (ULONG)i386Idt};

static
void
InitIdtVector(
    UCHAR Vector,
    PVOID ServiceHandler,
    USHORT Access)
{
    i386Idt[Vector].Offset = (ULONG)ServiceHandler & 0xffff;
    i386Idt[Vector].ExtendedOffset = (ULONG)ServiceHandler >> 16;
    i386Idt[Vector].Selector = PMODE_CS;
    i386Idt[Vector].Access = Access;
}

void
InitIdt(void)
{
    InitIdtVector(0, i386DivideByZero, 0x8e00);
    InitIdtVector(1, i386DebugException, 0x8e00);
    InitIdtVector(2, i386NMIException, 0x8e00);
    InitIdtVector(3, i386Breakpoint, 0x8e00);
    InitIdtVector(4, i386Overflow, 0x8e00);
    InitIdtVector(5, i386BoundException, 0x8e00);
    InitIdtVector(6, i386InvalidOpcode, 0x8e00);
    InitIdtVector(7, i386FPUNotAvailable, 0x8e00);
    InitIdtVector(8, i386DoubleFault, 0x8e00);
    InitIdtVector(9, i386CoprocessorSegment, 0x8e00);
    InitIdtVector(10, i386InvalidTSS, 0x8e00);
    InitIdtVector(11, i386SegmentNotPresent, 0x8e00);
    InitIdtVector(12, i386StackException, 0x8e00);
    InitIdtVector(13, i386GeneralProtectionFault, 0x8e00);
    InitIdtVector(14, i386PageFault, 0x8e00);
    InitIdtVector(16, i386CoprocessorError, 0x8e00);
    InitIdtVector(17, i386AlignmentCheck, 0x8e00);
    InitIdtVector(18, i386MachineCheck, 0x8e00);
}
