diff options
Diffstat (limited to 'arch/x86/idt/Idt.cpp')
| -rw-r--r-- | arch/x86/idt/Idt.cpp | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/arch/x86/idt/Idt.cpp b/arch/x86/idt/Idt.cpp index cd263fb..e24cbfe 100644 --- a/arch/x86/idt/Idt.cpp +++ b/arch/x86/idt/Idt.cpp @@ -30,7 +30,7 @@ DescInterrupt32::DescInterrupt32(uint32 offset, uint16 selector, uint8 attr) } }; -uint64 DescInterrupt32::getDescriptor() +uint64 DescInterrupt32::getDescriptor() const { uint64 desc = 0; @@ -42,6 +42,11 @@ uint64 DescInterrupt32::getDescriptor() return desc; }; +uint32 DescInterrupt32::getOffset() const +{ + return offsetLow | offsetHight << 16; +}; + DescInterrupt32 DescInterrupt32::InterruptKernelLong(uint32 offset, uint16 selector) { return DescInterrupt32( @@ -86,6 +91,7 @@ MngIdt::MngIdt() currIdx = NULL; idtLoaded = false; isInitialize = true; + irqInterruptStart = firstSystemIntNumber; } }; @@ -97,10 +103,24 @@ bool MngIdt::canDescriptorWrite(uint8 idx) bool MngIdt::addDescriptor(DescInterrupt32 desc) { - if(!canDescriptorWrite(currIdx) or isIntReserved(currIdx)) return false; + uint64 descqw = desc.getDescriptor(); + + if(!canDescriptorWrite(currIdx) or isIntReserved(currIdx) + or desc.getOffset() == NULL) return false; + + idt[currIdx] = descqw; + + uint8 attributes = descqw >> 40; + + if((attributes & RING_DRIVERSH or + attributes & RING_DRIVERSL) and + (irqInterruptStart == firstSystemIntNumber)) + { + irqInterruptStart = (uint8)(descqw >> 16); + } - idt[currIdx] = desc.getDescriptor(); while(isIntReserved(++currIdx)); + return true; }; @@ -168,3 +188,13 @@ void DescInterrupt32::setDpl(uint8 dpl) { attributes = (dpl & 0x03) << 5; }; + +bool MngIdt::isInterruptSet(uint8 numberInterrupt) +{ + return idt[numberInterrupt]; +}; + +uint8 MngIdt::getIrqInterruptStart() +{ + return irqInterruptStart; +}; |
