:github_url: https://github.com/nyx-org/gaia .. _program_listing_file_platform_amd64_apic.hpp: Program Listing for File apic.hpp ================================= |exhale_lsh| :ref:`Return to documentation for file ` (``platform/amd64/apic.hpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp /* SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include namespace Gaia::Amd64 { void ioapic_init(Dev::AcpiPc *pc); void lapic_init(); void lapic_eoi(); void lapic_send_ipi(uint8_t vector); void ioapic_handle_gsi(uint32_t gsi, Hal::InterruptHandler *handler, void *arg, bool lopol, bool edge, Ipl ipl, Hal::InterruptEntry *entry); uint64_t lapic_read_count(); void lapic_one_shot(uint64_t us); void ioapic_redirect_irq(uint8_t irq, uint8_t vector); struct [[gnu::packed]] Madt : Dev::AcpiTable { uint32_t local_interrupt_controller; uint32_t flags; uint8_t entries[]; }; struct [[gnu::packed]] MadtEntry { uint8_t type, length; }; struct [[gnu::packed]] MadtLapic : MadtEntry { uint8_t processor_id; uint8_t apic_id; uint32_t flags; }; struct [[gnu::packed]] MadtIoApic : MadtEntry { uint8_t ioapic_id; uint8_t reserved; uint32_t address; uint32_t interrupt_base; }; struct [[gnu::packed]] MadtIso : MadtEntry { uint8_t bus_source; uint8_t irq_source; uint32_t gsi; uint16_t flags; }; struct IoApic { MadtIoApic ioapic; ListNode link; explicit IoApic(MadtIoApic ioapic) : ioapic(ioapic) {} uint32_t read(uint32_t reg) const; void write(uint32_t reg, uint32_t value) const; size_t get_max_redirect() const; }; struct Iso { MadtIso iso; ListNode link; }; } // namespace Gaia::Amd64