Cosmos/source/Cosmos.Kernel.Boot/IDT.cs

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