mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-19 20:39:01 +00:00
65 lines
No EOL
2.6 KiB
C#
65 lines
No EOL
2.6 KiB
C#
using System;
|
|
using System.Diagnostics;
|
|
using Cosmos.Kernel.Boot.Glue;
|
|
|
|
namespace Cosmos.Kernel.Boot {
|
|
public delegate void HandleInterrupt(ushort aInterrupt, uint aParam);
|
|
|
|
public static class IDT {
|
|
// Do not rename, it is being referenced by name string
|
|
[GlueField(FieldType = GlueFieldTypeEnum.IDT_Array)]
|
|
private static IDTEntryStruct[] mIDTEntries;
|
|
[GlueField(FieldType = GlueFieldTypeEnum.IDT_Pointer)]
|
|
private static DTPointerStruct mIDTPointer;
|
|
|
|
[GluePlaceholderMethod(MethodType = GluePlaceholderMethodTypeEnum.IDT_LoadArray)]
|
|
private static void IDT_LoadArray() {
|
|
// implemented using bare assembly
|
|
}
|
|
|
|
[GluePlaceholderMethod(MethodType = GluePlaceholderMethodTypeEnum.IDT_EnableInterrupts)]
|
|
public static void IDT_EnableInterrupts() {
|
|
}
|
|
|
|
[GluePlaceholderMethod(MethodType = GluePlaceholderMethodTypeEnum.IDT_Register)]
|
|
private static void IDT_RegisterIDT() {
|
|
// implemented using bare assembly
|
|
}
|
|
|
|
[GlueMethod(MethodType = GlueMethodTypeEnum.IDT_SetHandler)]
|
|
private static void IDT_SetHandler(byte aInterruptNumber, uint aBase, ushort aSel, IDTFlagsEnum aFlags) {
|
|
mIDTEntries[aInterruptNumber].AlwaysZero = 0;
|
|
mIDTEntries[aInterruptNumber].Sel = 0x8;
|
|
mIDTEntries[aInterruptNumber].BaseLow = (ushort)(aBase & 0xFFFF);
|
|
mIDTEntries[aInterruptNumber].BaseHi = (ushort)((aBase >> 16) & 0xFFFF);
|
|
mIDTEntries[aInterruptNumber].Flags = 0x8E;//128 /*Present*/| 0 /*Ring0*/| 8 /*32-bit*/| 0xF /*interrupt gate*/;
|
|
DebugUtil.SendIDT_RegisterInterrupt(aInterruptNumber);
|
|
}
|
|
|
|
[GlueMethod(MethodType = GlueMethodTypeEnum.IDT_InterruptHandler)]
|
|
private static void InterruptHandler(ushort aInterrupt, uint aParam) {
|
|
DebugUtil.SendIDT_InterruptOccurred(aInterrupt, aParam);
|
|
//System.Diagnostics.Debugger.Break();
|
|
//Console.WriteLine("Interrupt received:");
|
|
//CustomImplementations.System.ConsoleImpl.Write(" ");
|
|
//CustomImplementations.System.ConsoleImpl.OutputByteValue(aInterrupt);
|
|
//CustomImplementations.System.ConsoleImpl.WriteLine("");
|
|
//CustomImplementations.System.ConsoleImpl.Write(" ");
|
|
//CustomImplementations.System.ConsoleImpl.OutputByteValue(aParam);
|
|
if (aInterrupt >= 32 && aInterrupt <= 47) {
|
|
PIC.HandleIRQ((byte)(aInterrupt - 32), aParam);
|
|
}
|
|
//CustomImplementations.System.ConsoleImpl.WriteLine("");
|
|
}
|
|
|
|
public static void Setup() {
|
|
Console.WriteLine("Start setting up Interrupt Descriptor Table");
|
|
Console.WriteLine("Load the array");
|
|
IDT_LoadArray();
|
|
Console.WriteLine("Register the IDT");
|
|
//System.Diagnostics.Debugger.Break();
|
|
IDT_RegisterIDT();
|
|
//mInterruptHandlers = new EventHandler[256];
|
|
}
|
|
}
|
|
} |