mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 15:57:45 +00:00
Kernel: Abstract IRQ controller handling from Interrupt handlers
Now we don't send raw numbers, but we let the IRQController object to figure out the correct IRQ number. This helps in a situation when we have 2 or more IOAPICs, so if IOAPIC 1 is assigned for IRQs 0-23 and IOAPIC 2 is assigned for IRQs 24-47, if an IRQHandler of IRQ 25 invokes disable() for example, it will call his responsible IRQController (IOAPIC 2), and the IRQController will subtract the IRQ number with his assigned offset, and the result is that the second redirection entry in IOAPIC 2 will be masked.
This commit is contained in:
parent
666990fbcb
commit
f86be46c98
11 changed files with 97 additions and 45 deletions
|
@ -33,18 +33,22 @@ namespace Kernel {
|
|||
class PIC final : public IRQController {
|
||||
public:
|
||||
PIC();
|
||||
virtual void enable(u8 number) override;
|
||||
virtual void disable(u8 number) override;
|
||||
virtual void enable(const GenericInterruptHandler&) override;
|
||||
virtual void disable(const GenericInterruptHandler&) override;
|
||||
virtual void hard_disable() override;
|
||||
virtual void eoi(u8 number) const override;
|
||||
virtual void eoi(const GenericInterruptHandler&) const override;
|
||||
virtual bool is_vector_enabled(u8 number) const override;
|
||||
virtual void spurious_eoi(const GenericInterruptHandler&) const override;
|
||||
virtual u16 get_isr() const override;
|
||||
virtual u16 get_irr() const override;
|
||||
virtual u32 get_gsi_base() const override { return 0; }
|
||||
virtual u32 gsi_base() const override { return 0; }
|
||||
virtual size_t interrupt_vectors_count() const { return 16; }
|
||||
virtual const char* model() const override { return "Dual i8259"; }
|
||||
virtual IRQControllerType type() const override { return IRQControllerType::i8259; }
|
||||
|
||||
private:
|
||||
void eoi_interrupt(u8 irq) const;
|
||||
void enable_vector(u8 number);
|
||||
void remap(u8 offset);
|
||||
void complete_eoi() const;
|
||||
virtual void initialize() override;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue