From 50bfe6bb19e65e67a686c70c3f4448a398b3596d Mon Sep 17 00:00:00 2001 From: kevinaboos Date: Tue, 1 Aug 2023 19:25:26 +0000 Subject: [PATCH] aarch64: implement new Interrupt Controller abstractions (#972) * Implements the basic set of two interrupt controller abstractions for aarch64: 1. `LocalInterruptController`: an interrupt controller local to each CPU. 2. `SystemWideInterruptController`: the system-wide interrupt controller that is responsible for redirecting interrupts to local CPUs. * These are not yet used, since they haven't been implemented for x86_64. * Make `BOARD_CONFIG` const so that it can be used in other const contexts. * Add board-specific fixed interrupt numbers to `BOARD_CONFIG`. * Temporarily remove the aarch64-specific distinction between various types of interrupt numbers, e.g., local, IPI, shared peripheral, etc. * `InterruptDestination` correspondingly no longer uses a local number. * Once we determine an appropriate abstraction for this that is also compatible with x86, we will restore the `InterruptNumber` type with its constructor-checked correctness conditions. * Device specific: for the PL011 UART device, we no longer enable timer interrupts in `interrupts::init()` because they are better off enabled later. * Remove the `get_int_ctlr` macro in favor of regular accessor code. This will be updated again once we redesign the interrupt controller structs to contain actual owned MMIO objects that offer access to the interrupt chip device. 5c351a230915912b7d9845ae95458e3946c98cbb --- doc/arm_boards/index.html | 2 +- doc/captain/fn.init.html | 2 +- doc/captain/index.html | 2 +- doc/implementors/core/clone/trait.Clone.js | 2 +- doc/implementors/core/fmt/trait.Debug.js | 2 +- doc/implementors/core/marker/trait.Copy.js | 2 +- doc/implementors/core/marker/trait.Freeze.js | 2 +- doc/implementors/core/marker/trait.Send.js | 2 +- doc/implementors/core/marker/trait.Sync.js | 2 +- doc/implementors/core/marker/trait.Unpin.js | 2 +- .../panic/unwind_safe/trait.RefUnwindSafe.js | 2 +- .../panic/unwind_safe/trait.UnwindSafe.js | 2 +- doc/interrupt_controller/all.html | 2 +- doc/interrupt_controller/arch/fn.init.html | 2 +- doc/interrupt_controller/arch/index.html | 4 +- .../arch/sidebar-items.js | 2 +- .../arch/struct.LocalInterruptController.html | 8 +- .../arch/struct.LocalInterruptNumber.html | 12 --- .../arch/struct.Priority.html | 2 +- .../struct.SystemInterruptController.html | 12 +-- .../arch/struct.SystemInterruptNumber.html | 12 --- ...on.html => enum.InterruptDestination.html} | 12 +-- doc/interrupt_controller/index.html | 4 +- doc/interrupt_controller/sidebar-items.js | 2 +- .../trait.LocalInterruptControllerApi.html | 43 ++++----- .../trait.SystemInterruptControllerApi.html | 22 ++--- .../type.InterruptNumber.html | 1 + doc/search-index.js | 2 +- doc/src/arm_boards/lib.rs.html | 20 ++++ doc/src/captain/lib.rs.html | 12 +++ doc/src/interrupt_controller/lib.rs.html | 60 ++++++++---- doc/src/interrupt_controller/x86_64.rs.html | 96 +++++++------------ 32 files changed, 176 insertions(+), 178 deletions(-) delete mode 100644 doc/interrupt_controller/arch/struct.LocalInterruptNumber.html delete mode 100644 doc/interrupt_controller/arch/struct.SystemInterruptNumber.html rename doc/interrupt_controller/{struct.InterruptDestination.html => enum.InterruptDestination.html} (58%) create mode 100644 doc/interrupt_controller/type.InterruptNumber.html diff --git a/doc/arm_boards/index.html b/doc/arm_boards/index.html index 297aaaecce..967ce762fc 100644 --- a/doc/arm_boards/index.html +++ b/doc/arm_boards/index.html @@ -1,4 +1,4 @@ -arm_boards - Rust

Crate arm_boards

source ·
Expand description

Configuration and definitions for specific boards on aarch64 systems.

+arm_boards - Rust

Crate arm_boards

source ·
Expand description

Configuration and definitions for specific boards on aarch64 systems.

Board NameNum CPUsInterrupt ControllerSecondary CPU Startup Method
qemu_virt4GICv3PSCI
diff --git a/doc/captain/fn.init.html b/doc/captain/fn.init.html index 6e5db7de5c..b58937fa38 100644 --- a/doc/captain/fn.init.html +++ b/doc/captain/fn.init.html @@ -1,4 +1,4 @@ -init in captain - Rust

Function captain::init

source ·
pub fn init(
+init in captain - Rust

Function captain::init

source ·
pub fn init(
     kernel_mmi_ref: MmiRef,
     bsp_initial_stack: NoDrop<Stack>,
     drop_after_init: DropAfterInit,
diff --git a/doc/captain/index.html b/doc/captain/index.html
index a0b2af3c4c..9d3df669d5 100644
--- a/doc/captain/index.html
+++ b/doc/captain/index.html
@@ -1,4 +1,4 @@
-captain - Rust

Crate captain

source ·
Expand description

The main initialization routine and setup logic of the OS.

+captain - Rust

Crate captain

source ·
Expand description

The main initialization routine and setup logic of the OS.

The captain steers the ship of Theseus, meaning that it contains basic logic for initializing all of the other crates in the proper order and with the proper flow of data between them.

diff --git a/doc/implementors/core/clone/trait.Clone.js b/doc/implementors/core/clone/trait.Clone.js index 4442ae6058..768435bfb0 100644 --- a/doc/implementors/core/clone/trait.Clone.js +++ b/doc/implementors/core/clone/trait.Clone.js @@ -22,7 +22,7 @@ "gdt":[["impl Clone for AvailableSegmentSelector"]], "hpet":[["impl Clone for HpetAcpiTable"]], "idle":[["impl Clone for IdleState"]], -"interrupt_controller":[["impl Clone for LocalInterruptNumber"],["impl Clone for SystemInterruptControllerId"],["impl Clone for SystemInterruptNumber"],["impl Clone for SystemInterruptControllerVersion"],["impl Clone for Priority"],["impl Clone for LocalInterruptControllerId"],["impl Clone for InterruptDestination"]], +"interrupt_controller":[["impl Clone for SystemInterruptControllerId"],["impl Clone for Priority"],["impl Clone for SystemInterruptControllerVersion"],["impl Clone for LocalInterruptControllerId"],["impl Clone for InterruptDestination"]], "io":[["impl<'io, IO, L, B> Clone for LockableIo<'io, IO, L, B>where\n IO: 'io + ?Sized,\n L: for<'a> Lockable<'a, IO> + ?Sized,\n B: Borrow<L> + Clone,"]], "ixgbe":[["impl Clone for RxBufferSizeKiB"]], "keycodes_ascii":[["impl Clone for KeyEvent"],["impl Clone for KeyAction"],["impl Clone for KeyboardModifiers"],["impl Clone for Keycode"]], diff --git a/doc/implementors/core/fmt/trait.Debug.js b/doc/implementors/core/fmt/trait.Debug.js index a862a538b3..376243d4e3 100644 --- a/doc/implementors/core/fmt/trait.Debug.js +++ b/doc/implementors/core/fmt/trait.Debug.js @@ -28,7 +28,7 @@ "hpet":[["impl Debug for HpetAcpiTable"]], "idle":[["impl Debug for IdleState"]], "intel_ethernet":[["impl Debug for AdvancedTxDescriptor"],["impl Debug for AdvancedRxDescriptor"],["impl Debug for LegacyRxDescriptor"],["impl Debug for LegacyTxDescriptor"]], -"interrupt_controller":[["impl Debug for SystemInterruptControllerId"],["impl Debug for Priority"],["impl Debug for SystemInterruptNumber"],["impl Debug for LocalInterruptControllerId"],["impl Debug for LocalInterruptNumber"],["impl Debug for InterruptDestination"],["impl Debug for SystemInterruptControllerVersion"]], +"interrupt_controller":[["impl Debug for SystemInterruptControllerId"],["impl Debug for Priority"],["impl Debug for LocalInterruptControllerId"],["impl Debug for InterruptDestination"],["impl Debug for SystemInterruptControllerVersion"]], "interrupts":[["impl Debug for EoiBehaviour"]], "io":[["impl Debug for IoError"],["impl Debug for BlockByteTransfer"],["impl<'io, IO, L, B> Debug for LockableIo<'io, IO, L, B>where\n IO: 'io + ?Sized + Debug,\n L: for<'a> Lockable<'a, IO> + ?Sized + Debug,\n B: Borrow<L> + Debug,"]], "irq_safety":[["impl<T: ?Sized + Debug> Debug for RwLockIrqSafe<T>"],["impl<T: ?Sized + Debug> Debug for MutexIrqSafe<T>"]], diff --git a/doc/implementors/core/marker/trait.Copy.js b/doc/implementors/core/marker/trait.Copy.js index 08a2899f0e..8eaab8d71e 100644 --- a/doc/implementors/core/marker/trait.Copy.js +++ b/doc/implementors/core/marker/trait.Copy.js @@ -15,7 +15,7 @@ "gdt":[["impl Copy for AvailableSegmentSelector"]], "hpet":[["impl Copy for HpetAcpiTable"]], "idle":[["impl Copy for IdleState"]], -"interrupt_controller":[["impl Copy for Priority"],["impl Copy for LocalInterruptNumber"],["impl Copy for SystemInterruptNumber"],["impl Copy for SystemInterruptControllerId"],["impl Copy for LocalInterruptControllerId"],["impl Copy for SystemInterruptControllerVersion"],["impl Copy for InterruptDestination"]], +"interrupt_controller":[["impl Copy for Priority"],["impl Copy for SystemInterruptControllerId"],["impl Copy for LocalInterruptControllerId"],["impl Copy for SystemInterruptControllerVersion"],["impl Copy for InterruptDestination"]], "ixgbe":[["impl Copy for RxBufferSizeKiB"]], "keycodes_ascii":[["impl Copy for KeyAction"],["impl Copy for KeyEvent"],["impl Copy for KeyboardModifiers"],["impl Copy for Keycode"]], "madt":[["impl Copy for MadtLocalApicAddressOverride"],["impl Copy for MadtIntSrcOverride"],["impl Copy for MadtIoApic"],["impl<'t> Copy for MadtEntry<'t>"],["impl Copy for MadtLocalApic"],["impl Copy for MadtLocalX2Apic"],["impl Copy for MadtNonMaskableInterrupt"]], diff --git a/doc/implementors/core/marker/trait.Freeze.js b/doc/implementors/core/marker/trait.Freeze.js index df6f1b07dd..1aee887987 100644 --- a/doc/implementors/core/marker/trait.Freeze.js +++ b/doc/implementors/core/marker/trait.Freeze.js @@ -47,7 +47,7 @@ "http_client":[["impl Freeze for HttpResponse",1,["http_client::HttpResponse"]],["impl<'a> Freeze for HttpClient<'a>",1,["http_client::HttpClient"]]], "idle":[["impl Freeze for IdleState",1,["idle::arch::x86_64::IdleState"]]], "intel_ethernet":[["impl Freeze for LegacyTxDescriptor",1,["intel_ethernet::descriptors::LegacyTxDescriptor"]],["impl Freeze for LegacyRxDescriptor",1,["intel_ethernet::descriptors::LegacyRxDescriptor"]],["impl Freeze for AdvancedRxDescriptor",1,["intel_ethernet::descriptors::AdvancedRxDescriptor"]],["impl Freeze for AdvancedTxDescriptor",1,["intel_ethernet::descriptors::AdvancedTxDescriptor"]]], -"interrupt_controller":[["impl Freeze for SystemInterruptControllerVersion",1,["interrupt_controller::arch::SystemInterruptControllerVersion"]],["impl Freeze for SystemInterruptControllerId",1,["interrupt_controller::arch::SystemInterruptControllerId"]],["impl Freeze for LocalInterruptControllerId",1,["interrupt_controller::arch::LocalInterruptControllerId"]],["impl Freeze for SystemInterruptNumber",1,["interrupt_controller::arch::SystemInterruptNumber"]],["impl Freeze for LocalInterruptNumber",1,["interrupt_controller::arch::LocalInterruptNumber"]],["impl Freeze for Priority",1,["interrupt_controller::arch::Priority"]],["impl Freeze for SystemInterruptController",1,["interrupt_controller::arch::SystemInterruptController"]],["impl Freeze for LocalInterruptController",1,["interrupt_controller::arch::LocalInterruptController"]],["impl Freeze for InterruptDestination",1,["interrupt_controller::InterruptDestination"]]], +"interrupt_controller":[["impl Freeze for SystemInterruptControllerVersion",1,["interrupt_controller::arch::SystemInterruptControllerVersion"]],["impl Freeze for SystemInterruptControllerId",1,["interrupt_controller::arch::SystemInterruptControllerId"]],["impl Freeze for LocalInterruptControllerId",1,["interrupt_controller::arch::LocalInterruptControllerId"]],["impl Freeze for Priority",1,["interrupt_controller::arch::Priority"]],["impl Freeze for SystemInterruptController",1,["interrupt_controller::arch::SystemInterruptController"]],["impl Freeze for LocalInterruptController",1,["interrupt_controller::arch::LocalInterruptController"]],["impl Freeze for InterruptDestination",1,["interrupt_controller::InterruptDestination"]]], "interrupts":[["impl Freeze for EoiBehaviour",1,["interrupts::EoiBehaviour"]]], "io":[["impl Freeze for IoError",1,["io::IoError"]],["impl<R> Freeze for ByteReaderWrapper<R>where\n R: Freeze,",1,["io::ByteReaderWrapper"]],["impl<RW> Freeze for ByteReaderWriterWrapper<RW>where\n RW: Freeze,",1,["io::ByteReaderWriterWrapper"]],["impl<RW> Freeze for ByteWriterWrapper<RW>where\n RW: Freeze,",1,["io::ByteWriterWrapper"]],["impl<IO> Freeze for ReaderWriter<IO>where\n IO: Freeze,",1,["io::ReaderWriter"]],["impl<R> Freeze for Reader<R>where\n R: Freeze,",1,["io::Reader"]],["impl<W> Freeze for Writer<W>where\n W: Freeze,",1,["io::Writer"]],["impl<'io, IO: ?Sized, L: ?Sized, B> Freeze for LockableIo<'io, IO, L, B>where\n B: Freeze,",1,["io::LockableIo"]],["impl Freeze for BlockByteTransfer",1,["io::BlockByteTransfer"]]], "ioapic":[["impl Freeze for IoApic",1,["ioapic::IoApic"]]], diff --git a/doc/implementors/core/marker/trait.Send.js b/doc/implementors/core/marker/trait.Send.js index fed3989220..56c190c264 100644 --- a/doc/implementors/core/marker/trait.Send.js +++ b/doc/implementors/core/marker/trait.Send.js @@ -47,7 +47,7 @@ "http_client":[["impl Send for HttpResponse",1,["http_client::HttpResponse"]],["impl<'a> Send for HttpClient<'a>",1,["http_client::HttpClient"]]], "idle":[["impl Send for IdleState",1,["idle::arch::x86_64::IdleState"]]], "intel_ethernet":[["impl Send for LegacyTxDescriptor",1,["intel_ethernet::descriptors::LegacyTxDescriptor"]],["impl Send for LegacyRxDescriptor",1,["intel_ethernet::descriptors::LegacyRxDescriptor"]],["impl Send for AdvancedRxDescriptor",1,["intel_ethernet::descriptors::AdvancedRxDescriptor"]],["impl Send for AdvancedTxDescriptor",1,["intel_ethernet::descriptors::AdvancedTxDescriptor"]]], -"interrupt_controller":[["impl Send for SystemInterruptControllerVersion",1,["interrupt_controller::arch::SystemInterruptControllerVersion"]],["impl Send for SystemInterruptControllerId",1,["interrupt_controller::arch::SystemInterruptControllerId"]],["impl Send for LocalInterruptControllerId",1,["interrupt_controller::arch::LocalInterruptControllerId"]],["impl Send for SystemInterruptNumber",1,["interrupt_controller::arch::SystemInterruptNumber"]],["impl Send for LocalInterruptNumber",1,["interrupt_controller::arch::LocalInterruptNumber"]],["impl Send for Priority",1,["interrupt_controller::arch::Priority"]],["impl Send for SystemInterruptController",1,["interrupt_controller::arch::SystemInterruptController"]],["impl Send for LocalInterruptController",1,["interrupt_controller::arch::LocalInterruptController"]],["impl Send for InterruptDestination",1,["interrupt_controller::InterruptDestination"]]], +"interrupt_controller":[["impl Send for SystemInterruptControllerVersion",1,["interrupt_controller::arch::SystemInterruptControllerVersion"]],["impl Send for SystemInterruptControllerId",1,["interrupt_controller::arch::SystemInterruptControllerId"]],["impl Send for LocalInterruptControllerId",1,["interrupt_controller::arch::LocalInterruptControllerId"]],["impl Send for Priority",1,["interrupt_controller::arch::Priority"]],["impl Send for SystemInterruptController",1,["interrupt_controller::arch::SystemInterruptController"]],["impl Send for LocalInterruptController",1,["interrupt_controller::arch::LocalInterruptController"]],["impl Send for InterruptDestination",1,["interrupt_controller::InterruptDestination"]]], "interrupts":[["impl Send for EoiBehaviour",1,["interrupts::EoiBehaviour"]]], "io":[["impl Send for IoError",1,["io::IoError"]],["impl<R> Send for ByteReaderWrapper<R>where\n R: Send,",1,["io::ByteReaderWrapper"]],["impl<RW> Send for ByteReaderWriterWrapper<RW>where\n RW: Send,",1,["io::ByteReaderWriterWrapper"]],["impl<RW> Send for ByteWriterWrapper<RW>where\n RW: Send,",1,["io::ByteWriterWrapper"]],["impl<IO> Send for ReaderWriter<IO>where\n IO: Send,",1,["io::ReaderWriter"]],["impl<R> Send for Reader<R>where\n R: Send,",1,["io::Reader"]],["impl<W> Send for Writer<W>where\n W: Send,",1,["io::Writer"]],["impl<'io, IO: ?Sized, L: ?Sized, B> Send for LockableIo<'io, IO, L, B>where\n B: Send,\n L: Send,",1,["io::LockableIo"]],["impl Send for BlockByteTransfer",1,["io::BlockByteTransfer"]]], "ioapic":[["impl Send for IoApic",1,["ioapic::IoApic"]]], diff --git a/doc/implementors/core/marker/trait.Sync.js b/doc/implementors/core/marker/trait.Sync.js index 5532bbb9f4..1202b997de 100644 --- a/doc/implementors/core/marker/trait.Sync.js +++ b/doc/implementors/core/marker/trait.Sync.js @@ -47,7 +47,7 @@ "http_client":[["impl Sync for HttpResponse",1,["http_client::HttpResponse"]],["impl<'a> Sync for HttpClient<'a>",1,["http_client::HttpClient"]]], "idle":[["impl Sync for IdleState",1,["idle::arch::x86_64::IdleState"]]], "intel_ethernet":[["impl Sync for LegacyTxDescriptor",1,["intel_ethernet::descriptors::LegacyTxDescriptor"]],["impl Sync for LegacyRxDescriptor",1,["intel_ethernet::descriptors::LegacyRxDescriptor"]],["impl Sync for AdvancedRxDescriptor",1,["intel_ethernet::descriptors::AdvancedRxDescriptor"]],["impl Sync for AdvancedTxDescriptor",1,["intel_ethernet::descriptors::AdvancedTxDescriptor"]]], -"interrupt_controller":[["impl Sync for SystemInterruptControllerVersion",1,["interrupt_controller::arch::SystemInterruptControllerVersion"]],["impl Sync for SystemInterruptControllerId",1,["interrupt_controller::arch::SystemInterruptControllerId"]],["impl Sync for LocalInterruptControllerId",1,["interrupt_controller::arch::LocalInterruptControllerId"]],["impl Sync for SystemInterruptNumber",1,["interrupt_controller::arch::SystemInterruptNumber"]],["impl Sync for LocalInterruptNumber",1,["interrupt_controller::arch::LocalInterruptNumber"]],["impl Sync for Priority",1,["interrupt_controller::arch::Priority"]],["impl Sync for SystemInterruptController",1,["interrupt_controller::arch::SystemInterruptController"]],["impl Sync for LocalInterruptController",1,["interrupt_controller::arch::LocalInterruptController"]],["impl Sync for InterruptDestination",1,["interrupt_controller::InterruptDestination"]]], +"interrupt_controller":[["impl Sync for SystemInterruptControllerVersion",1,["interrupt_controller::arch::SystemInterruptControllerVersion"]],["impl Sync for SystemInterruptControllerId",1,["interrupt_controller::arch::SystemInterruptControllerId"]],["impl Sync for LocalInterruptControllerId",1,["interrupt_controller::arch::LocalInterruptControllerId"]],["impl Sync for Priority",1,["interrupt_controller::arch::Priority"]],["impl Sync for SystemInterruptController",1,["interrupt_controller::arch::SystemInterruptController"]],["impl Sync for LocalInterruptController",1,["interrupt_controller::arch::LocalInterruptController"]],["impl Sync for InterruptDestination",1,["interrupt_controller::InterruptDestination"]]], "interrupts":[["impl Sync for EoiBehaviour",1,["interrupts::EoiBehaviour"]]], "io":[["impl Sync for IoError",1,["io::IoError"]],["impl<R> Sync for ByteReaderWrapper<R>where\n R: Sync,",1,["io::ByteReaderWrapper"]],["impl<RW> Sync for ByteReaderWriterWrapper<RW>where\n RW: Sync,",1,["io::ByteReaderWriterWrapper"]],["impl<RW> Sync for ByteWriterWrapper<RW>where\n RW: Sync,",1,["io::ByteWriterWrapper"]],["impl<IO> Sync for ReaderWriter<IO>where\n IO: Sync,",1,["io::ReaderWriter"]],["impl<R> Sync for Reader<R>where\n R: Sync,",1,["io::Reader"]],["impl<W> Sync for Writer<W>where\n W: Sync,",1,["io::Writer"]],["impl<'io, IO: ?Sized, L: ?Sized, B> Sync for LockableIo<'io, IO, L, B>where\n B: Sync,\n L: Sync,",1,["io::LockableIo"]],["impl Sync for BlockByteTransfer",1,["io::BlockByteTransfer"]]], "ioapic":[["impl Sync for IoApic",1,["ioapic::IoApic"]]], diff --git a/doc/implementors/core/marker/trait.Unpin.js b/doc/implementors/core/marker/trait.Unpin.js index ab1eba9363..513e18a045 100644 --- a/doc/implementors/core/marker/trait.Unpin.js +++ b/doc/implementors/core/marker/trait.Unpin.js @@ -47,7 +47,7 @@ "http_client":[["impl Unpin for HttpResponse",1,["http_client::HttpResponse"]],["impl<'a> Unpin for HttpClient<'a>",1,["http_client::HttpClient"]]], "idle":[["impl Unpin for IdleState",1,["idle::arch::x86_64::IdleState"]]], "intel_ethernet":[["impl Unpin for LegacyTxDescriptor",1,["intel_ethernet::descriptors::LegacyTxDescriptor"]],["impl Unpin for LegacyRxDescriptor",1,["intel_ethernet::descriptors::LegacyRxDescriptor"]],["impl Unpin for AdvancedRxDescriptor",1,["intel_ethernet::descriptors::AdvancedRxDescriptor"]],["impl Unpin for AdvancedTxDescriptor",1,["intel_ethernet::descriptors::AdvancedTxDescriptor"]]], -"interrupt_controller":[["impl Unpin for SystemInterruptControllerVersion",1,["interrupt_controller::arch::SystemInterruptControllerVersion"]],["impl Unpin for SystemInterruptControllerId",1,["interrupt_controller::arch::SystemInterruptControllerId"]],["impl Unpin for LocalInterruptControllerId",1,["interrupt_controller::arch::LocalInterruptControllerId"]],["impl Unpin for SystemInterruptNumber",1,["interrupt_controller::arch::SystemInterruptNumber"]],["impl Unpin for LocalInterruptNumber",1,["interrupt_controller::arch::LocalInterruptNumber"]],["impl Unpin for Priority",1,["interrupt_controller::arch::Priority"]],["impl Unpin for SystemInterruptController",1,["interrupt_controller::arch::SystemInterruptController"]],["impl Unpin for LocalInterruptController",1,["interrupt_controller::arch::LocalInterruptController"]],["impl Unpin for InterruptDestination",1,["interrupt_controller::InterruptDestination"]]], +"interrupt_controller":[["impl Unpin for SystemInterruptControllerVersion",1,["interrupt_controller::arch::SystemInterruptControllerVersion"]],["impl Unpin for SystemInterruptControllerId",1,["interrupt_controller::arch::SystemInterruptControllerId"]],["impl Unpin for LocalInterruptControllerId",1,["interrupt_controller::arch::LocalInterruptControllerId"]],["impl Unpin for Priority",1,["interrupt_controller::arch::Priority"]],["impl Unpin for SystemInterruptController",1,["interrupt_controller::arch::SystemInterruptController"]],["impl Unpin for LocalInterruptController",1,["interrupt_controller::arch::LocalInterruptController"]],["impl Unpin for InterruptDestination",1,["interrupt_controller::InterruptDestination"]]], "interrupts":[["impl Unpin for EoiBehaviour",1,["interrupts::EoiBehaviour"]]], "io":[["impl Unpin for IoError",1,["io::IoError"]],["impl<R> Unpin for ByteReaderWrapper<R>where\n R: Unpin,",1,["io::ByteReaderWrapper"]],["impl<RW> Unpin for ByteReaderWriterWrapper<RW>where\n RW: Unpin,",1,["io::ByteReaderWriterWrapper"]],["impl<RW> Unpin for ByteWriterWrapper<RW>where\n RW: Unpin,",1,["io::ByteWriterWrapper"]],["impl<IO> Unpin for ReaderWriter<IO>where\n IO: Unpin,",1,["io::ReaderWriter"]],["impl<R> Unpin for Reader<R>where\n R: Unpin,",1,["io::Reader"]],["impl<W> Unpin for Writer<W>where\n W: Unpin,",1,["io::Writer"]],["impl<'io, IO, L, B> !Unpin for LockableIo<'io, IO, L, B>",1,["io::LockableIo"]],["impl Unpin for BlockByteTransfer",1,["io::BlockByteTransfer"]]], "ioapic":[["impl Unpin for IoApic",1,["ioapic::IoApic"]]], diff --git a/doc/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js b/doc/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js index bdc4752c30..9035c44c20 100644 --- a/doc/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js +++ b/doc/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js @@ -47,7 +47,7 @@ "http_client":[["impl RefUnwindSafe for HttpResponse",1,["http_client::HttpResponse"]],["impl<'a> !RefUnwindSafe for HttpClient<'a>",1,["http_client::HttpClient"]]], "idle":[["impl RefUnwindSafe for IdleState",1,["idle::arch::x86_64::IdleState"]]], "intel_ethernet":[["impl RefUnwindSafe for LegacyTxDescriptor",1,["intel_ethernet::descriptors::LegacyTxDescriptor"]],["impl RefUnwindSafe for LegacyRxDescriptor",1,["intel_ethernet::descriptors::LegacyRxDescriptor"]],["impl RefUnwindSafe for AdvancedRxDescriptor",1,["intel_ethernet::descriptors::AdvancedRxDescriptor"]],["impl RefUnwindSafe for AdvancedTxDescriptor",1,["intel_ethernet::descriptors::AdvancedTxDescriptor"]]], -"interrupt_controller":[["impl RefUnwindSafe for SystemInterruptControllerVersion",1,["interrupt_controller::arch::SystemInterruptControllerVersion"]],["impl RefUnwindSafe for SystemInterruptControllerId",1,["interrupt_controller::arch::SystemInterruptControllerId"]],["impl RefUnwindSafe for LocalInterruptControllerId",1,["interrupt_controller::arch::LocalInterruptControllerId"]],["impl RefUnwindSafe for SystemInterruptNumber",1,["interrupt_controller::arch::SystemInterruptNumber"]],["impl RefUnwindSafe for LocalInterruptNumber",1,["interrupt_controller::arch::LocalInterruptNumber"]],["impl RefUnwindSafe for Priority",1,["interrupt_controller::arch::Priority"]],["impl RefUnwindSafe for SystemInterruptController",1,["interrupt_controller::arch::SystemInterruptController"]],["impl RefUnwindSafe for LocalInterruptController",1,["interrupt_controller::arch::LocalInterruptController"]],["impl RefUnwindSafe for InterruptDestination",1,["interrupt_controller::InterruptDestination"]]], +"interrupt_controller":[["impl RefUnwindSafe for SystemInterruptControllerVersion",1,["interrupt_controller::arch::SystemInterruptControllerVersion"]],["impl RefUnwindSafe for SystemInterruptControllerId",1,["interrupt_controller::arch::SystemInterruptControllerId"]],["impl RefUnwindSafe for LocalInterruptControllerId",1,["interrupt_controller::arch::LocalInterruptControllerId"]],["impl RefUnwindSafe for Priority",1,["interrupt_controller::arch::Priority"]],["impl RefUnwindSafe for SystemInterruptController",1,["interrupt_controller::arch::SystemInterruptController"]],["impl RefUnwindSafe for LocalInterruptController",1,["interrupt_controller::arch::LocalInterruptController"]],["impl RefUnwindSafe for InterruptDestination",1,["interrupt_controller::InterruptDestination"]]], "interrupts":[["impl RefUnwindSafe for EoiBehaviour",1,["interrupts::EoiBehaviour"]]], "io":[["impl RefUnwindSafe for IoError",1,["io::IoError"]],["impl<R> RefUnwindSafe for ByteReaderWrapper<R>where\n R: RefUnwindSafe,",1,["io::ByteReaderWrapper"]],["impl<RW> RefUnwindSafe for ByteReaderWriterWrapper<RW>where\n RW: RefUnwindSafe,",1,["io::ByteReaderWriterWrapper"]],["impl<RW> RefUnwindSafe for ByteWriterWrapper<RW>where\n RW: RefUnwindSafe,",1,["io::ByteWriterWrapper"]],["impl<IO> RefUnwindSafe for ReaderWriter<IO>where\n IO: RefUnwindSafe,",1,["io::ReaderWriter"]],["impl<R> RefUnwindSafe for Reader<R>where\n R: RefUnwindSafe,",1,["io::Reader"]],["impl<W> RefUnwindSafe for Writer<W>where\n W: RefUnwindSafe,",1,["io::Writer"]],["impl<'io, IO, L, B> !RefUnwindSafe for LockableIo<'io, IO, L, B>",1,["io::LockableIo"]],["impl RefUnwindSafe for BlockByteTransfer",1,["io::BlockByteTransfer"]]], "ioapic":[["impl RefUnwindSafe for IoApic",1,["ioapic::IoApic"]]], diff --git a/doc/implementors/core/panic/unwind_safe/trait.UnwindSafe.js b/doc/implementors/core/panic/unwind_safe/trait.UnwindSafe.js index b71f8bba78..9479086842 100644 --- a/doc/implementors/core/panic/unwind_safe/trait.UnwindSafe.js +++ b/doc/implementors/core/panic/unwind_safe/trait.UnwindSafe.js @@ -47,7 +47,7 @@ "http_client":[["impl UnwindSafe for HttpResponse",1,["http_client::HttpResponse"]],["impl<'a> !UnwindSafe for HttpClient<'a>",1,["http_client::HttpClient"]]], "idle":[["impl UnwindSafe for IdleState",1,["idle::arch::x86_64::IdleState"]]], "intel_ethernet":[["impl UnwindSafe for LegacyTxDescriptor",1,["intel_ethernet::descriptors::LegacyTxDescriptor"]],["impl UnwindSafe for LegacyRxDescriptor",1,["intel_ethernet::descriptors::LegacyRxDescriptor"]],["impl UnwindSafe for AdvancedRxDescriptor",1,["intel_ethernet::descriptors::AdvancedRxDescriptor"]],["impl UnwindSafe for AdvancedTxDescriptor",1,["intel_ethernet::descriptors::AdvancedTxDescriptor"]]], -"interrupt_controller":[["impl UnwindSafe for SystemInterruptControllerVersion",1,["interrupt_controller::arch::SystemInterruptControllerVersion"]],["impl UnwindSafe for SystemInterruptControllerId",1,["interrupt_controller::arch::SystemInterruptControllerId"]],["impl UnwindSafe for LocalInterruptControllerId",1,["interrupt_controller::arch::LocalInterruptControllerId"]],["impl UnwindSafe for SystemInterruptNumber",1,["interrupt_controller::arch::SystemInterruptNumber"]],["impl UnwindSafe for LocalInterruptNumber",1,["interrupt_controller::arch::LocalInterruptNumber"]],["impl UnwindSafe for Priority",1,["interrupt_controller::arch::Priority"]],["impl UnwindSafe for SystemInterruptController",1,["interrupt_controller::arch::SystemInterruptController"]],["impl UnwindSafe for LocalInterruptController",1,["interrupt_controller::arch::LocalInterruptController"]],["impl UnwindSafe for InterruptDestination",1,["interrupt_controller::InterruptDestination"]]], +"interrupt_controller":[["impl UnwindSafe for SystemInterruptControllerVersion",1,["interrupt_controller::arch::SystemInterruptControllerVersion"]],["impl UnwindSafe for SystemInterruptControllerId",1,["interrupt_controller::arch::SystemInterruptControllerId"]],["impl UnwindSafe for LocalInterruptControllerId",1,["interrupt_controller::arch::LocalInterruptControllerId"]],["impl UnwindSafe for Priority",1,["interrupt_controller::arch::Priority"]],["impl UnwindSafe for SystemInterruptController",1,["interrupt_controller::arch::SystemInterruptController"]],["impl UnwindSafe for LocalInterruptController",1,["interrupt_controller::arch::LocalInterruptController"]],["impl UnwindSafe for InterruptDestination",1,["interrupt_controller::InterruptDestination"]]], "interrupts":[["impl UnwindSafe for EoiBehaviour",1,["interrupts::EoiBehaviour"]]], "io":[["impl UnwindSafe for IoError",1,["io::IoError"]],["impl<R> UnwindSafe for ByteReaderWrapper<R>where\n R: UnwindSafe,",1,["io::ByteReaderWrapper"]],["impl<RW> UnwindSafe for ByteReaderWriterWrapper<RW>where\n RW: UnwindSafe,",1,["io::ByteReaderWriterWrapper"]],["impl<RW> UnwindSafe for ByteWriterWrapper<RW>where\n RW: UnwindSafe,",1,["io::ByteWriterWrapper"]],["impl<IO> UnwindSafe for ReaderWriter<IO>where\n IO: UnwindSafe,",1,["io::ReaderWriter"]],["impl<R> UnwindSafe for Reader<R>where\n R: UnwindSafe,",1,["io::Reader"]],["impl<W> UnwindSafe for Writer<W>where\n W: UnwindSafe,",1,["io::Writer"]],["impl<'io, IO, L, B> !UnwindSafe for LockableIo<'io, IO, L, B>",1,["io::LockableIo"]],["impl UnwindSafe for BlockByteTransfer",1,["io::BlockByteTransfer"]]], "ioapic":[["impl UnwindSafe for IoApic",1,["ioapic::IoApic"]]], diff --git a/doc/interrupt_controller/all.html b/doc/interrupt_controller/all.html index e5242b49a3..103efb31d1 100644 --- a/doc/interrupt_controller/all.html +++ b/doc/interrupt_controller/all.html @@ -1 +1 @@ -List of all items in this crate
\ No newline at end of file +List of all items in this crate
\ No newline at end of file diff --git a/doc/interrupt_controller/arch/fn.init.html b/doc/interrupt_controller/arch/fn.init.html index 94151196d2..a3ccb8ad8a 100644 --- a/doc/interrupt_controller/arch/fn.init.html +++ b/doc/interrupt_controller/arch/fn.init.html @@ -1,2 +1,2 @@ -init in interrupt_controller::arch - Rust
pub fn init() -> Result<(), &'static str>
Expand description

Initializes the interrupt controller, on aarch64

+init in interrupt_controller::arch - Rust
pub fn init() -> Result<(), &'static str>
Expand description

Initializes the interrupt controller (not yet used on x86)

\ No newline at end of file diff --git a/doc/interrupt_controller/arch/index.html b/doc/interrupt_controller/arch/index.html index ae64a75837..73769ba214 100644 --- a/doc/interrupt_controller/arch/index.html +++ b/doc/interrupt_controller/arch/index.html @@ -1,2 +1,2 @@ -interrupt_controller::arch - Rust

Structs

Functions

  • Initializes the interrupt controller, on aarch64
\ No newline at end of file +interrupt_controller::arch - Rust

Structs

Functions

  • Initializes the interrupt controller (not yet used on x86)
\ No newline at end of file diff --git a/doc/interrupt_controller/arch/sidebar-items.js b/doc/interrupt_controller/arch/sidebar-items.js index 744402a7fd..9292ec1da1 100644 --- a/doc/interrupt_controller/arch/sidebar-items.js +++ b/doc/interrupt_controller/arch/sidebar-items.js @@ -1 +1 @@ -window.SIDEBAR_ITEMS = {"fn":["init"],"struct":["LocalInterruptController","LocalInterruptControllerId","LocalInterruptNumber","Priority","SystemInterruptController","SystemInterruptControllerId","SystemInterruptControllerVersion","SystemInterruptNumber"]}; \ No newline at end of file +window.SIDEBAR_ITEMS = {"fn":["init"],"struct":["LocalInterruptController","LocalInterruptControllerId","Priority","SystemInterruptController","SystemInterruptControllerId","SystemInterruptControllerVersion"]}; \ No newline at end of file diff --git a/doc/interrupt_controller/arch/struct.LocalInterruptController.html b/doc/interrupt_controller/arch/struct.LocalInterruptController.html index 29cc7e0333..6871543345 100644 --- a/doc/interrupt_controller/arch/struct.LocalInterruptController.html +++ b/doc/interrupt_controller/arch/struct.LocalInterruptController.html @@ -1,10 +1,6 @@ -LocalInterruptController in interrupt_controller::arch - Rust
pub struct LocalInterruptController;
Expand description

Struct representing per-cpu-core interrupt controller chips.

+LocalInterruptController in interrupt_controller::arch - Rust
pub struct LocalInterruptController;
Expand description

Struct representing per-cpu-core interrupt controller chips.

On x86_64, this corresponds to a LocalApic.

-

Trait Implementations§

source§

impl LocalInterruptControllerApi for LocalInterruptController

source§

fn id(&self) -> LocalInterruptControllerId

source§

fn get_local_interrupt_priority(&self, num: LocalInterruptNumber) -> Priority

source§

fn set_local_interrupt_priority( - &self, - num: LocalInterruptNumber, - priority: Priority -)

source§

fn is_local_interrupt_enabled(&self, num: LocalInterruptNumber) -> bool

source§

fn enable_local_interrupt(&self, num: LocalInterruptNumber, enabled: bool)

source§

fn send_ipi(&self, destination: InterruptDestination)

Sends an inter-processor interrupt to a specific CPU.
source§

fn get_minimum_priority(&self) -> Priority

Reads the minimum priority for an interrupt to reach this CPU. Read more
source§

fn set_minimum_priority(&self, priority: Priority)

Changes the minimum priority for an interrupt to reach this CPU. Read more
source§

fn acknowledge_interrupt(&self) -> (LocalInterruptNumber, Priority)

Aarch64-specific way to read the current pending interrupt number & priority. Read more
source§

fn end_of_interrupt(&self, _number: LocalInterruptNumber)

Tell the interrupt controller that the current interrupt has been handled.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere +

Trait Implementations§

source§

impl LocalInterruptControllerApi for LocalInterruptController

source§

fn init_secondary_cpu_interface(&self)

Aarch64-specific way to initialize the secondary CPU interfaces. Read more
source§

fn id(&self) -> LocalInterruptControllerId

source§

fn get_local_interrupt_priority(&self, num: InterruptNumber) -> Priority

source§

fn set_local_interrupt_priority(&self, num: InterruptNumber, priority: Priority)

source§

fn is_local_interrupt_enabled(&self, num: InterruptNumber) -> bool

source§

fn enable_local_interrupt(&self, num: InterruptNumber, enabled: bool)

source§

fn send_ipi(&self, num: InterruptNumber, dest: InterruptDestination)

Sends an inter-processor interrupt. Read more
source§

fn get_minimum_priority(&self) -> Priority

Reads the minimum priority for an interrupt to reach this CPU. Read more
source§

fn set_minimum_priority(&self, priority: Priority)

Changes the minimum priority for an interrupt to reach this CPU. Read more
source§

fn acknowledge_interrupt(&self) -> (InterruptNumber, Priority)

Aarch64-specific way to read the current pending interrupt number & priority. Read more
source§

fn end_of_interrupt(&self, _number: InterruptNumber)

Tell the interrupt controller that the current interrupt has been handled.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

diff --git a/doc/interrupt_controller/arch/struct.LocalInterruptNumber.html b/doc/interrupt_controller/arch/struct.LocalInterruptNumber.html deleted file mode 100644 index 6b04ac238c..0000000000 --- a/doc/interrupt_controller/arch/struct.LocalInterruptNumber.html +++ /dev/null @@ -1,12 +0,0 @@ -LocalInterruptNumber in interrupt_controller::arch - Rust
pub struct LocalInterruptNumber(_);

Trait Implementations§

source§

impl Clone for LocalInterruptNumber

source§

fn clone(&self) -> LocalInterruptNumber

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for LocalInterruptNumber

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Copy for LocalInterruptNumber

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere - T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere - T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere - T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

-
source§

impl<T, U> Into<U> for Twhere - U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

-

That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

-
source§

impl<T> ToOwned for Twhere - T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere - U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere - U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/doc/interrupt_controller/arch/struct.Priority.html b/doc/interrupt_controller/arch/struct.Priority.html index 1b20ee26fa..fc5c15896b 100644 --- a/doc/interrupt_controller/arch/struct.Priority.html +++ b/doc/interrupt_controller/arch/struct.Priority.html @@ -1,4 +1,4 @@ -Priority in interrupt_controller::arch - Rust
pub struct Priority;

Trait Implementations§

source§

impl Clone for Priority

source§

fn clone(&self) -> Priority

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Priority

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Copy for Priority

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere +Priority in interrupt_controller::arch - Rust
pub struct Priority;

Trait Implementations§

source§

impl Clone for Priority

source§

fn clone(&self) -> Priority

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Priority

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Copy for Priority

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

diff --git a/doc/interrupt_controller/arch/struct.SystemInterruptController.html b/doc/interrupt_controller/arch/struct.SystemInterruptController.html index e2df7d6a92..d747829eae 100644 --- a/doc/interrupt_controller/arch/struct.SystemInterruptController.html +++ b/doc/interrupt_controller/arch/struct.SystemInterruptController.html @@ -1,13 +1,13 @@ -SystemInterruptController in interrupt_controller::arch - Rust
pub struct SystemInterruptController { /* private fields */ }
Expand description

Structure representing a top-level/system-wide interrupt controller chip, +SystemInterruptController in interrupt_controller::arch - Rust

pub struct SystemInterruptController { /* private fields */ }
Expand description

Structure representing a top-level/system-wide interrupt controller chip, responsible for routing interrupts between peripherals and CPU cores.

On x86_64, this corresponds to an IoApic.

-

Trait Implementations§

source§

impl SystemInterruptControllerApi for SystemInterruptController

Trait Implementations§

source§

impl SystemInterruptControllerApi for SystemInterruptController

source§

fn id(&self) -> SystemInterruptControllerId

source§

fn version(&self) -> SystemInterruptControllerVersion

source§

fn get_destination( &self, - interrupt_num: SystemInterruptNumber -) -> Result<(Vec<InterruptDestination>, Priority), &'static str>

source§

fn set_destination( + interrupt_num: InterruptNumber +) -> Result<(Vec<CpuId>, Priority), &'static str>

source§

fn set_destination( &self, - sys_int_num: SystemInterruptNumber, - destination: InterruptDestination, + sys_int_num: InterruptNumber, + destination: CpuId, priority: Priority ) -> Result<(), &'static str>

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere diff --git a/doc/interrupt_controller/arch/struct.SystemInterruptNumber.html b/doc/interrupt_controller/arch/struct.SystemInterruptNumber.html deleted file mode 100644 index 47c8f5073a..0000000000 --- a/doc/interrupt_controller/arch/struct.SystemInterruptNumber.html +++ /dev/null @@ -1,12 +0,0 @@ -SystemInterruptNumber in interrupt_controller::arch - Rust
pub struct SystemInterruptNumber(_);

Trait Implementations§

source§

impl Clone for SystemInterruptNumber

source§

fn clone(&self) -> SystemInterruptNumber

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for SystemInterruptNumber

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Copy for SystemInterruptNumber

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere - T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere - T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere - T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

-
source§

impl<T, U> Into<U> for Twhere - U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

-

That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

-
source§

impl<T> ToOwned for Twhere - T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere - U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere - U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/doc/interrupt_controller/struct.InterruptDestination.html b/doc/interrupt_controller/enum.InterruptDestination.html similarity index 58% rename from doc/interrupt_controller/struct.InterruptDestination.html rename to doc/interrupt_controller/enum.InterruptDestination.html index 58a3eaa70b..7bd21021c5 100644 --- a/doc/interrupt_controller/struct.InterruptDestination.html +++ b/doc/interrupt_controller/enum.InterruptDestination.html @@ -1,11 +1,11 @@ -InterruptDestination in interrupt_controller - Rust
pub struct InterruptDestination {
-    pub cpu: CpuId,
-    pub local_number: LocalInterruptNumber,
+InterruptDestination in interrupt_controller - Rust
pub enum InterruptDestination {
+    SpecificCpu(CpuId),
+    AllOtherCpus,
 }
Expand description

The Cpu where this interrupt should be handled, as well as the local interrupt number this gets translated to.

-

On aarch64, the system interrupt number and the local interrupt -number must be the same.

-

Fields§

§cpu: CpuId§local_number: LocalInterruptNumber

Trait Implementations§

source§

impl Clone for InterruptDestination

source§

fn clone(&self) -> InterruptDestination

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for InterruptDestination

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Copy for InterruptDestination

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere +

On aarch64, there is no local_number field as the system interrupt +number and the local interrupt number must be the same.

+

Variants§

§

SpecificCpu(CpuId)

§

AllOtherCpus

Trait Implementations§

source§

impl Clone for InterruptDestination

source§

fn clone(&self) -> InterruptDestination

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for InterruptDestination

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Copy for InterruptDestination

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

diff --git a/doc/interrupt_controller/index.html b/doc/interrupt_controller/index.html index 9cb8cfec5a..9238975127 100644 --- a/doc/interrupt_controller/index.html +++ b/doc/interrupt_controller/index.html @@ -1,2 +1,2 @@ -interrupt_controller - Rust

Re-exports

Modules

Structs

  • The Cpu where this interrupt should be handled, as well as -the local interrupt number this gets translated to.

Traits

\ No newline at end of file +interrupt_controller - Rust

Re-exports

Modules

Enums

  • The Cpu where this interrupt should be handled, as well as +the local interrupt number this gets translated to.

Traits

Type Definitions

\ No newline at end of file diff --git a/doc/interrupt_controller/sidebar-items.js b/doc/interrupt_controller/sidebar-items.js index be171b7cf7..c5e2dee0c6 100644 --- a/doc/interrupt_controller/sidebar-items.js +++ b/doc/interrupt_controller/sidebar-items.js @@ -1 +1 @@ -window.SIDEBAR_ITEMS = {"mod":["arch"],"struct":["InterruptDestination"],"trait":["LocalInterruptControllerApi","SystemInterruptControllerApi"]}; \ No newline at end of file +window.SIDEBAR_ITEMS = {"enum":["InterruptDestination"],"mod":["arch"],"trait":["LocalInterruptControllerApi","SystemInterruptControllerApi"],"type":["InterruptNumber"]}; \ No newline at end of file diff --git a/doc/interrupt_controller/trait.LocalInterruptControllerApi.html b/doc/interrupt_controller/trait.LocalInterruptControllerApi.html index a23147c0cf..ce8b367103 100644 --- a/doc/interrupt_controller/trait.LocalInterruptControllerApi.html +++ b/doc/interrupt_controller/trait.LocalInterruptControllerApi.html @@ -1,32 +1,31 @@ -LocalInterruptControllerApi in interrupt_controller - Rust
pub trait LocalInterruptControllerApi {
+LocalInterruptControllerApi in interrupt_controller - Rust
pub trait LocalInterruptControllerApi {
     // Required methods
-    fn id(&self) -> LocalInterruptControllerId;
-    fn get_local_interrupt_priority(
-        &self,
-        num: LocalInterruptNumber
-    ) -> Priority;
+    fn init_secondary_cpu_interface(&self);
+    fn id(&self) -> LocalInterruptControllerId;
+    fn get_local_interrupt_priority(&self, num: InterruptNumber) -> Priority;
     fn set_local_interrupt_priority(
         &self,
-        num: LocalInterruptNumber,
+        num: InterruptNumber,
         priority: Priority
     );
-    fn is_local_interrupt_enabled(&self, num: LocalInterruptNumber) -> bool;
-    fn enable_local_interrupt(&self, num: LocalInterruptNumber, enabled: bool);
-    fn send_ipi(&self, destination: InterruptDestination);
+    fn is_local_interrupt_enabled(&self, num: InterruptNumber) -> bool;
+    fn enable_local_interrupt(&self, num: InterruptNumber, enabled: bool);
+    fn send_ipi(&self, num: InterruptNumber, dest: InterruptDestination);
     fn get_minimum_priority(&self) -> Priority;
     fn set_minimum_priority(&self, priority: Priority);
-    fn acknowledge_interrupt(&self) -> (LocalInterruptNumber, Priority);
-    fn end_of_interrupt(&self, number: LocalInterruptNumber);
-}

Required Methods§

source

fn id(&self) -> LocalInterruptControllerId

source

fn get_local_interrupt_priority(&self, num: LocalInterruptNumber) -> Priority

source

fn set_local_interrupt_priority( - &self, - num: LocalInterruptNumber, - priority: Priority -)

source

fn is_local_interrupt_enabled(&self, num: LocalInterruptNumber) -> bool

source

fn enable_local_interrupt(&self, num: LocalInterruptNumber, enabled: bool)

source

fn send_ipi(&self, destination: InterruptDestination)

Sends an inter-processor interrupt to a specific CPU.

-
source

fn get_minimum_priority(&self) -> Priority

Reads the minimum priority for an interrupt to reach this CPU.

+ fn acknowledge_interrupt(&self) -> (InterruptNumber, Priority); + fn end_of_interrupt(&self, number: InterruptNumber); +}

Required Methods§

source

fn init_secondary_cpu_interface(&self)

Aarch64-specific way to initialize the secondary CPU interfaces.

+

Must be called once from every secondary CPU.

+

Always panics on x86_64.

+
source

fn id(&self) -> LocalInterruptControllerId

source

fn get_local_interrupt_priority(&self, num: InterruptNumber) -> Priority

source

fn set_local_interrupt_priority(&self, num: InterruptNumber, priority: Priority)

source

fn is_local_interrupt_enabled(&self, num: InterruptNumber) -> bool

source

fn enable_local_interrupt(&self, num: InterruptNumber, enabled: bool)

source

fn send_ipi(&self, num: InterruptNumber, dest: InterruptDestination)

Sends an inter-processor interrupt.

+

If dest is Some, the interrupt is sent to a specific CPU. +If it’s None, all CPUs except the sender receive the interrupt.

+
source

fn get_minimum_priority(&self) -> Priority

Reads the minimum priority for an interrupt to reach this CPU.

Note: aarch64-only, at the moment.

-
source

fn set_minimum_priority(&self, priority: Priority)

Changes the minimum priority for an interrupt to reach this CPU.

+
source

fn set_minimum_priority(&self, priority: Priority)

Changes the minimum priority for an interrupt to reach this CPU.

Note: aarch64-only, at the moment.

-
source

fn acknowledge_interrupt(&self) -> (LocalInterruptNumber, Priority)

Aarch64-specific way to read the current pending interrupt number & priority.

+
source

fn acknowledge_interrupt(&self) -> (InterruptNumber, Priority)

Aarch64-specific way to read the current pending interrupt number & priority.

Always panics on x86_64.

-
source

fn end_of_interrupt(&self, number: LocalInterruptNumber)

Tell the interrupt controller that the current interrupt has been handled.

-

Implementors§

\ No newline at end of file +
source

fn end_of_interrupt(&self, number: InterruptNumber)

Tell the interrupt controller that the current interrupt has been handled.

+

Implementors§

\ No newline at end of file diff --git a/doc/interrupt_controller/trait.SystemInterruptControllerApi.html b/doc/interrupt_controller/trait.SystemInterruptControllerApi.html index 96acafe2d3..4d4a121a6a 100644 --- a/doc/interrupt_controller/trait.SystemInterruptControllerApi.html +++ b/doc/interrupt_controller/trait.SystemInterruptControllerApi.html @@ -1,23 +1,23 @@ -SystemInterruptControllerApi in interrupt_controller - Rust
pub trait SystemInterruptControllerApi {
+SystemInterruptControllerApi in interrupt_controller - Rust
pub trait SystemInterruptControllerApi {
     // Required methods
     fn id(&self) -> SystemInterruptControllerId;
     fn version(&self) -> SystemInterruptControllerVersion;
     fn get_destination(
         &self,
-        interrupt_num: SystemInterruptNumber
-    ) -> Result<(Vec<InterruptDestination>, Priority), &'static str>;
+        interrupt_num: InterruptNumber
+    ) -> Result<(Vec<CpuId>, Priority), &'static str>;
     fn set_destination(
         &self,
-        sys_int_num: SystemInterruptNumber,
-        destination: InterruptDestination,
+        sys_int_num: InterruptNumber,
+        destination: CpuId,
         priority: Priority
     ) -> Result<(), &'static str>;
-}

Required Methods§

Required Methods§

source

fn id(&self) -> SystemInterruptControllerId

source

fn version(&self) -> SystemInterruptControllerVersion

source

fn get_destination( &self, - interrupt_num: SystemInterruptNumber -) -> Result<(Vec<InterruptDestination>, Priority), &'static str>

source

fn set_destination( + interrupt_num: InterruptNumber +) -> Result<(Vec<CpuId>, Priority), &'static str>

source

fn set_destination( &self, - sys_int_num: SystemInterruptNumber, - destination: InterruptDestination, + sys_int_num: InterruptNumber, + destination: CpuId, priority: Priority -) -> Result<(), &'static str>

Implementors§

\ No newline at end of file +) -> Result<(), &'static str>

Implementors§

\ No newline at end of file diff --git a/doc/interrupt_controller/type.InterruptNumber.html b/doc/interrupt_controller/type.InterruptNumber.html new file mode 100644 index 0000000000..27572c62de --- /dev/null +++ b/doc/interrupt_controller/type.InterruptNumber.html @@ -0,0 +1 @@ +InterruptNumber in interrupt_controller - Rust
pub type InterruptNumber = u8;
\ No newline at end of file diff --git a/doc/search-index.js b/doc/search-index.js index 2ad70be0a7..3d5b691f75 100644 --- a/doc/search-index.js +++ b/doc/search-index.js @@ -68,7 +68,7 @@ var searchIndex = JSON.parse('{\ "http_client":{"doc":"Functions for creating and sending HTTP requests and …","t":"DGDLLLLLLLFLLLMLLLLMMLMLLLLLLLL","n":["HttpClient","HttpRequest","HttpResponse","abort","as_result","as_result_err_str","borrow","borrow","borrow_mut","borrow_mut","check_http_request","from","from","header_bytes","header_length","into","into","is_closed","new","packet","reason","send","status_code","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip"],"q":[[0,"http_client"]],"d":["","TODO: create a proper HttpRequest type with header …","An HttpResponse that has been fully received from a remote …","Aborts the connection.","Returns the content of this HttpResponse as a Result, in …","A convenience function that just returns a standard Err …","","","","","Checks to see if the provided HTTP request can be properly …","Returns the argument unchanged.","Returns the argument unchanged.","","The length of all headers","Calls U::from(self).","Calls U::from(self).","Returns whether the connection used by the client is …","Creates a new HTTP client connected to the given remote …","The actual array of raw bytes received from the server, …","The reason, e.g., “OK”, “File not found”","Sends an HTTP request with an optional timeout.","The status code, e.g., 200, 404","","","","","","","",""],"i":[0,0,0,1,2,2,2,1,2,1,0,2,1,2,2,2,1,1,1,2,2,1,2,2,1,2,1,2,1,2,1],"f":[0,0,0,[1],[2,[[5,[[4,[3]]]]]],[2,[[5,[[4,[3]],6]]]],[[]],[[]],[[]],[[]],[[[4,[3]]],7],[[]],[[]],[2,[[4,[3]]]],0,[[]],[[]],[1,7],[[[9,[8]],10,11],[[5,[1,6]]]],0,0,[[1,12,[14,[13]]],[[5,[2,6]]]],0,[[],5],[[],5],[[],5],[[],5],[[],15],[[],15],[[]],[[]]],"c":[],"p":[[3,"HttpClient"],[3,"HttpResponse"],[15,"u8"],[15,"slice"],[4,"Result"],[15,"str"],[15,"bool"],[3,"NetworkInterface"],[3,"Arc"],[15,"u16"],[3,"Endpoint"],[6,"HttpRequest"],[3,"Duration"],[4,"Option"],[3,"TypeId"]]},\ "idle":{"doc":"CPU idle management.","t":"DLLLMMLLFLMMMLLL","n":["IdleState","borrow","borrow_mut","clone","eax","exit_latency","fmt","from","idle_states","into","name","target_residency","tlb_flushed","try_from","try_into","type_id"],"q":[[0,"idle"]],"d":["A CPU idle state.","","","","The value of EAX when calling MWAIT to enter the idle …","The amount of time it takes for the CPU to exit the idle …","","Returns the argument unchanged.","","Calls U::from(self).","The name of the idle state.","The amount of time the CPU must spend in the idle state to …","Whether entering the state flushes the TLB.","","",""],"i":[0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1],"f":[0,[[]],[[]],[1,1],0,0,[[1,2],3],[[]],[[],[[5,[[4,[1]]]]]],[[]],0,0,0,[[],6],[[],6],[[],7]],"c":[],"p":[[3,"IdleState"],[3,"Formatter"],[6,"Result"],[15,"slice"],[4,"Option"],[4,"Result"],[3,"TypeId"]]},\ "intel_ethernet":{"doc":"Definitions of descriptor types and type aliases for NIC …","t":"ADDDDRRIRRRRRRRRRRRILLLLLLLLMMMMMMKLLMKLLMLLLLLLLLLLLLLLLLLLLMKKLLLLLLLLKLLMMMMMMMKLLKLLKLLMMLLLLLLLLLLLLMMKLL","n":["descriptors","AdvancedRxDescriptor","AdvancedTxDescriptor","LegacyRxDescriptor","LegacyTxDescriptor","RX_STATUS_DD","RX_STATUS_EOP","RxDescriptor","TX_CMD_DEXT","TX_CMD_EOP","TX_CMD_IC","TX_CMD_IDE","TX_CMD_IFCS","TX_CMD_RPS","TX_CMD_RS","TX_CMD_VLE","TX_DTYP_ADV","TX_PAYLEN_SHIFT","TX_STATUS_DD","TxDescriptor","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","checksum","cmd","cso","css","data_len","dcmd","descriptor_done","descriptor_done","descriptor_done","dtyp_mac_rsv","end_of_packet","end_of_packet","end_of_packet","errors","fmt","fmt","fmt","fmt","from","from","from","from","get_ext_error","get_ext_status","get_fdf_id","get_hdr_len","get_packet_type","get_pkt_len","get_rsccnt","get_rss_hash","get_rss_type","get_sph","get_vlan_tag","header_buffer_address","init","init","init","init","init","init","into","into","into","into","length","length","length","length","length","packet_buffer_address","packet_buffer_address","paylen_popts_cc_idx_sta","phys_addr","phys_addr","reset_status","reset_status","reset_status","send","send","send","set_packet_address","set_packet_address","set_packet_address","status","status","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vlan","vlan","wait_for_packet_tx","wait_for_packet_tx","wait_for_packet_tx"],"q":[[0,"intel_ethernet"],[1,"intel_ethernet::descriptors"]],"d":["The different descriptor types used by Intel NICs. Usually …","Advanced Receive Descriptor used in the Ixgbe driver. It …","Advanced Transmit Descriptor used by the ixgbe NIC driver.","This struct is a Legacy Receive Descriptor. The driver …","This struct is a Legacy Transmit Descriptor. It’s the …","Rx Status: Descriptor Done","Rx Status: End of Packet","A trait for the minimum set of functions needed to receive …","Tx Command: Descriptor Extension (Advanced format)","Tx Command: End of Packet","Tx Command: Insert Checksum","Tx Command: Interrupt Delay Enable","Tx Command: Insert MAC FCS","Tx Command: Report Packet Sent","Tx Command: Report Status","Tx Command: VLAN Packet Enable","Tx Descriptor Type: advanced","Tx Descriptor paylen shift The paylen is located at bit 46 …","Tx Status: descriptor Done","A trait for the minimum set of functions needed to …","","","","","","","","","Checksum value of the packet after the IP header till the …","Command bits","Checksum offset: where to insert the checksum from the …","Checksum start: where to begin computing the checksum, if …","Length of data buffer","Command bits","Returns true if the descriptor has a received packet …","","","A multi-part field:","Returns true if the descriptor’s packet buffer is the …","","","Receive errors","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Write Back mode function for the Advanced Receive …","Write Back mode function for the Advanced Receive …","Write Back mode function for the Advanced Receive …","Write Back mode function for the Advanced Receive …","Write Back mode function for the Advanced Receive …","Write Back mode function for the Advanced Receive …","Write Back mode function for the Advanced Receive …","Write Back mode function for the Advanced Receive …","Write Back mode function for the Advanced Receive …","Write Back mode function for the Advanced Receive …","Write Back mode function for the Advanced Receive …","Starting physcal address of the receive buffer for the …","Initializes a receive descriptor by clearing its status …","Initializes a transmit descriptor by clearing all of its …","","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","The length of the packet in the descriptor’s packet …","","","Length of the transmit buffer in bytes","Length of the receive buffer in bytes","Starting physcal address of the receive buffer for the …","Starting physical address of the receive buffer for the …","A multi-part field:","The starting physical address of the transmit buffer","The starting physical address of the receive buffer","Clears the status bits of the descriptor.","","","Updates the transmit descriptor to send the packet. We …","","","Updates the descriptor’s physical address.","","","Status bits","Status bits which tell if the descriptor has been used","","","","","","","","","","","","","Vlan tags ","Vlan tags","Polls the Descriptor Done bit until the packet has been …","",""],"i":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,2,3,7,4,2,3,7,2,4,4,4,7,7,13,2,3,7,13,2,3,2,4,2,3,7,4,2,3,7,3,3,3,3,3,3,3,3,3,3,3,3,13,14,4,2,3,7,4,2,3,7,13,2,3,4,2,3,7,7,4,2,13,2,3,14,4,7,13,2,3,4,2,4,2,3,7,4,2,3,7,4,2,3,7,4,2,14,4,7],"f":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,[[],1],[2,1],[3,1],0,[[],1],[2,1],[3,1],0,[[4,5],6],[[2,5],6],[[3,5],6],[[7,5],6],[[]],[[]],[[]],[[]],[3,8],[3,8],[3,8],[3,8],[3,8],[3,8],[3,8],[3,8],[3,8],[3,1],[3,8],0,[9],[[]],[4],[[2,9]],[[3,9]],[7],[[]],[[]],[[]],[[]],[[],8],[2,8],[3,8],0,0,0,0,0,0,0,[[]],[2],[3],[[9,10]],[[4,9,10]],[[7,9,10]],[9],[[2,9]],[[3,9]],0,0,[[],11],[[],11],[[],11],[[],11],[[],11],[[],11],[[],11],[[],11],[[],12],[[],12],[[],12],[[],12],0,0,[[]],[4],[7]],"c":[],"p":[[15,"bool"],[3,"LegacyRxDescriptor"],[3,"AdvancedRxDescriptor"],[3,"LegacyTxDescriptor"],[3,"Formatter"],[6,"Result"],[3,"AdvancedTxDescriptor"],[15,"u64"],[3,"PhysicalAddress"],[15,"u16"],[4,"Result"],[3,"TypeId"],[8,"RxDescriptor"],[8,"TxDescriptor"]]},\ -"interrupt_controller":{"doc":"","t":"DCICCCCICCCKALLLLMKKLLKKKKKLKMKKKKLLLLKDDDDDDDDLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLFLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL","n":["InterruptDestination","LocalInterruptController","LocalInterruptControllerApi","LocalInterruptControllerId","LocalInterruptNumber","Priority","SystemInterruptController","SystemInterruptControllerApi","SystemInterruptControllerId","SystemInterruptControllerVersion","SystemInterruptNumber","acknowledge_interrupt","arch","borrow","borrow_mut","clone","clone_into","cpu","enable_local_interrupt","end_of_interrupt","fmt","from","get_destination","get_local_interrupt_priority","get_minimum_priority","id","id","into","is_local_interrupt_enabled","local_number","send_ipi","set_destination","set_local_interrupt_priority","set_minimum_priority","to_owned","try_from","try_into","type_id","version","LocalInterruptController","LocalInterruptControllerId","LocalInterruptNumber","Priority","SystemInterruptController","SystemInterruptControllerId","SystemInterruptControllerVersion","SystemInterruptNumber","acknowledge_interrupt","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","enable_local_interrupt","end_of_interrupt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","get_destination","get_local_interrupt_priority","get_minimum_priority","id","id","init","into","into","into","into","into","into","into","into","is_local_interrupt_enabled","send_ipi","set_destination","set_local_interrupt_priority","set_minimum_priority","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","version"],"q":[[0,"interrupt_controller"],[39,"interrupt_controller::arch"]],"d":["The Cpu where this interrupt should be handled, as well as …","","","","","","","","","","","Aarch64-specific way to read the current pending interrupt …","","","","","","","","Tell the interrupt controller that the current interrupt …","","Returns the argument unchanged.","","","Reads the minimum priority for an interrupt to reach this …","","","Calls U::from(self).","","","Sends an inter-processor interrupt to a specific CPU.","","","Changes the minimum priority for an interrupt to reach …","","","","","","Struct representing per-cpu-core interrupt controller …","","","","Structure representing a top-level/system-wide interrupt …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","","","","Initializes the interrupt controller, on aarch64","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"i":[0,0,0,0,0,0,0,0,0,0,0,16,0,1,1,1,1,1,16,16,1,1,17,16,16,17,16,1,16,1,16,17,16,16,1,1,1,1,17,0,0,0,0,0,0,0,0,14,15,14,13,10,11,6,2,9,15,14,13,10,11,6,2,9,13,10,11,6,2,9,13,10,11,6,2,9,14,14,13,10,11,6,2,9,15,14,13,10,11,6,2,9,15,14,14,15,14,0,15,14,13,10,11,6,2,9,14,14,15,14,14,13,10,11,6,2,9,15,14,13,10,11,6,2,9,15,14,13,10,11,6,2,9,15,14,13,10,11,6,2,9,15],"f":[0,0,0,0,0,0,0,0,0,0,0,[[]],0,[[]],[[]],[1,1],[[]],0,[[2,3]],[2],[[1,4],5],[[]],[6,[[8,[7]]]],[2,9],[[],9],[[],10],[[],11],[[]],[2,3],0,[1],[[6,1,9],[[8,[7]]]],[[2,9]],[9],[[]],[[],8],[[],8],[[],12],[[],13],0,0,0,0,0,0,0,0,[14],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[13,13],[10,10],[11,11],[6,6],[2,2],[9,9],[[]],[[]],[[]],[[]],[[]],[[]],[[14,2,3]],[[14,2]],[[13,4],5],[[10,4],5],[[11,4],5],[[6,4],5],[[2,4],5],[[9,4],5],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[15,6],[[8,[7]]]],[[14,2],9],[14,9],[15,10],[14,11],[[],[[8,[7]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[14,2],3],[[14,1]],[[15,6,1,9],[[8,[7]]]],[[14,2,9]],[[14,9]],[[]],[[]],[[]],[[]],[[]],[[]],[[],8],[[],8],[[],8],[[],8],[[],8],[[],8],[[],8],[[],8],[[],8],[[],8],[[],8],[[],8],[[],8],[[],8],[[],8],[[],8],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[15,13]],"c":[],"p":[[3,"InterruptDestination"],[3,"LocalInterruptNumber"],[15,"bool"],[3,"Formatter"],[6,"Result"],[3,"SystemInterruptNumber"],[15,"str"],[4,"Result"],[3,"Priority"],[3,"SystemInterruptControllerId"],[3,"LocalInterruptControllerId"],[3,"TypeId"],[3,"SystemInterruptControllerVersion"],[3,"LocalInterruptController"],[3,"SystemInterruptController"],[8,"LocalInterruptControllerApi"],[8,"SystemInterruptControllerApi"]]},\ +"interrupt_controller":{"doc":"","t":"NEGCICCNCICCKALLLLKKLLKKKKKCKLKKKKKLLLLKDDDDDDLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLFLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL","n":["AllOtherCpus","InterruptDestination","InterruptNumber","LocalInterruptController","LocalInterruptControllerApi","LocalInterruptControllerId","Priority","SpecificCpu","SystemInterruptController","SystemInterruptControllerApi","SystemInterruptControllerId","SystemInterruptControllerVersion","acknowledge_interrupt","arch","borrow","borrow_mut","clone","clone_into","enable_local_interrupt","end_of_interrupt","fmt","from","get_destination","get_local_interrupt_priority","get_minimum_priority","id","id","init","init_secondary_cpu_interface","into","is_local_interrupt_enabled","send_ipi","set_destination","set_local_interrupt_priority","set_minimum_priority","to_owned","try_from","try_into","type_id","version","LocalInterruptController","LocalInterruptControllerId","Priority","SystemInterruptController","SystemInterruptControllerId","SystemInterruptControllerVersion","acknowledge_interrupt","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","enable_local_interrupt","end_of_interrupt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","get_destination","get_local_interrupt_priority","get_minimum_priority","id","id","init","init_secondary_cpu_interface","into","into","into","into","into","into","is_local_interrupt_enabled","send_ipi","set_destination","set_local_interrupt_priority","set_minimum_priority","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","version"],"q":[[0,"interrupt_controller"],[40,"interrupt_controller::arch"]],"d":["","The Cpu where this interrupt should be handled, as well as …","","","","","","","","","","","Aarch64-specific way to read the current pending interrupt …","","","","","","","Tell the interrupt controller that the current interrupt …","","Returns the argument unchanged.","","","Reads the minimum priority for an interrupt to reach this …","","","","Aarch64-specific way to initialize the secondary CPU …","Calls U::from(self).","","Sends an inter-processor interrupt.","","","Changes the minimum priority for an interrupt to reach …","","","","","","Struct representing per-cpu-core interrupt controller …","","","Structure representing a top-level/system-wide interrupt …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","","","","Initializes the interrupt controller (not yet used on x86)","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"i":[1,0,0,0,0,0,0,1,0,0,0,0,16,0,1,1,1,1,16,16,1,1,17,16,16,17,16,0,16,1,16,16,17,16,16,1,1,1,1,17,0,0,0,0,0,0,14,15,14,13,9,10,8,15,14,13,9,10,8,13,9,10,8,13,9,10,8,14,14,13,9,10,8,15,14,13,9,10,8,15,14,14,15,14,0,14,15,14,13,9,10,8,14,14,15,14,14,13,9,10,8,15,14,13,9,10,8,15,14,13,9,10,8,15,14,13,9,10,8,15],"f":[0,0,0,0,0,0,0,0,0,0,0,0,[[]],0,[[]],[[]],[1,1],[[]],[[2,3]],[2],[[1,4],5],[[]],[2,[[7,[6]]]],[2,8],[[],8],[[],9],[[],10],0,[[]],[[]],[2,3],[[2,1]],[[2,11,8],[[7,[6]]]],[[2,8]],[8],[[]],[[],7],[[],7],[[],12],[[],13],0,0,0,0,0,0,[14],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[13,13],[9,9],[10,10],[8,8],[[]],[[]],[[]],[[]],[[14,2,3]],[[14,2]],[[13,4],5],[[9,4],5],[[10,4],5],[[8,4],5],[[]],[[]],[[]],[[]],[[]],[[]],[[15,2],[[7,[6]]]],[[14,2],8],[14,8],[15,9],[14,10],[[],[[7,[6]]]],[14],[[]],[[]],[[]],[[]],[[]],[[]],[[14,2],3],[[14,2,1]],[[15,2,11,8],[[7,[6]]]],[[14,2,8]],[[14,8]],[[]],[[]],[[]],[[]],[[],7],[[],7],[[],7],[[],7],[[],7],[[],7],[[],7],[[],7],[[],7],[[],7],[[],7],[[],7],[[],12],[[],12],[[],12],[[],12],[[],12],[[],12],[15,13]],"c":[],"p":[[4,"InterruptDestination"],[6,"InterruptNumber"],[15,"bool"],[3,"Formatter"],[6,"Result"],[15,"str"],[4,"Result"],[3,"Priority"],[3,"SystemInterruptControllerId"],[3,"LocalInterruptControllerId"],[3,"CpuId"],[3,"TypeId"],[3,"SystemInterruptControllerVersion"],[3,"LocalInterruptController"],[3,"SystemInterruptController"],[8,"LocalInterruptControllerApi"],[8,"SystemInterruptControllerApi"]]},\ "interrupts":{"doc":"Basic interrupt handling structures and simple handler …","t":"RENNHRGGDLLLLLLFFLLLLLFFOOLLFFFLLLLLL","n":["CPU_LOCAL_TIMER_IRQ","EoiBehaviour","HandlerDidNotSendEoi","HandlerSentEoi","IDT","IRQ_BASE_OFFSET","InterruptHandler","InterruptNumber","InterruptStackFrame","as_mut","borrow","borrow","borrow_mut","borrow_mut","deref","deregister_interrupt","eoi","eq","fmt","fmt","from","from","init","init_ap","interrupt_handler","interrupt_handler","into","into","is_exception_handler_with_error_code","register_interrupt","register_msi_interrupt","try_from","try_from","try_into","try_into","type_id","type_id"],"q":[[0,"interrupts"]],"d":["The IRQ number reserved for CPU-local timer interrupts, …","","The interrupt handler hasn’t called the eoi function, in …","The interrupt handler has called the eoi function.","The single system-wide Interrupt Descriptor Table (IDT).","The offset added to the first IRQ: 0x20.","A handler function for an interrupt or an exception …","","Wrapper type for the interrupt stack frame pushed by the …","Gives mutable access to the contents of the interrupt …","","","","","","Deregisters an interrupt handler, making it available to …","Send an end of interrupt signal, notifying the interrupt …","","","","Returns the argument unchanged.","Returns the argument unchanged.","Initializes the interrupt subsystem and sets up an initial …","Similar to init(), but for APs to call after the BSP has …","Macro which helps writing cross-platform interrupt …","Macro which helps writing cross-platform interrupt …","Calls U::from(self).","Calls U::from(self).","Returns true if the given address is the exception handler …","Registers an interrupt handler at the given IRQ interrupt …","Allocates and returns an unused interrupt number and sets …","","","","","",""],"i":[0,0,10,10,0,0,0,0,0,1,10,1,10,1,1,0,0,10,10,1,10,1,0,0,0,0,10,1,0,0,0,10,1,10,1,10,1],"f":[0,0,0,0,0,0,0,0,0,[1,[[4,[2,3]]]],[[]],[[]],[[]],[[]],[1],[[5,6],[[8,[7]]]],[[[9,[5]]]],[[10,10],11],[[10,12],13],[[1,12],[[8,[14]]]],[[]],[[]],[[15,15],[[8,[16,7]]]],[[17,15,15],[[8,[16,7]]]],0,0,[[]],[[]],[18,11],[[5,6],[[8,[19]]]],[6,[[8,[5,7]]]],[[],8],[[],8],[[],8],[[],8],[[],20],[[],20]],"c":[],"p":[[3,"InterruptStackFrame"],[3,"InterruptStackFrameValue"],[3,"ReadWrite"],[3,"Volatile"],[15,"u8"],[6,"InterruptHandler"],[15,"str"],[4,"Result"],[4,"Option"],[4,"EoiBehaviour"],[15,"bool"],[3,"Formatter"],[6,"Result"],[3,"Error"],[3,"VirtualAddress"],[3,"LockedIdt"],[3,"CpuId"],[15,"u64"],[15,"usize"],[3,"TypeId"]]},\ "io":{"doc":"Traits and types for expressing I/O transfers of both …","t":"DIIIIDDIDNEIDNDDNDMKLLLLLLLFLLLLLLLLLLLLLLLLLLMMLLLLLKKLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLKLLLLLLLLLLLLLLKLLLLLLKLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLKLLLLLLKLLLLLLLL","n":["BlockByteTransfer","BlockIo","BlockReader","BlockWriter","ByteReader","ByteReaderWrapper","ByteReaderWriterWrapper","ByteWriter","ByteWriterWrapper","InvalidInput","IoError","KnownLength","LockableIo","Other","Reader","ReaderWriter","TimedOut","Writer","block_range","block_size","block_size","block_size","block_size","block_size","block_size","block_size","block_size","blocks_from_bytes","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","byte_range_absolute","bytes_in_block_range","clone","clone_into","deref","deref","deref_mut","flush","flush","flush","flush","flush","flush","flush","flush","flush","flush","flush","flush","flush","flush","flush","flush","flush","flush","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","into","into","into","into","into","into","into","into","into","len","len","len","len","len","len","len","len","new","new","new","read","read","read","read","read_at","read_at","read_at","read_at","read_at","read_at","read_at","read_blocks","read_blocks","read_blocks","read_blocks","read_blocks","read_blocks","read_blocks","seek","seek","seek","seek","seek","to_owned","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","write","write","write","write","write_at","write_at","write_at","write_at","write_at","write_at","write_at","write_blocks","write_blocks","write_blocks","write_blocks","write_blocks","write_blocks","write_blocks","write_str","write_str"],"q":[[0,"io"]],"d":["Describes an operation for performing byte-wise I/O on a …","A parent trait used to specify the block size (in bytes) …","A trait that represents an I/O stream (e.g., an I/O …","A trait that represents an I/O stream (e.g., an I/O …","A trait that represents an I/O stream that can be read …","A wrapper struct that implements a byte-wise reader atop a …","A wrapper struct that implements a byte-wise reader and …","A trait that represents an I/O stream that can be written …","A wrapper struct that implements a byte-wise writer atop a …","An input parameter or argument was incorrect or invalid.","Errors that can be returned from I/O operations.","A trait that represents an I/O stream that has a known …","A struct that holds an IO object wrapped in a Lockable …","A miscellaneous error occurred.","A stateful reader that keeps track of its current offset …","A readable and writable “stateful” I/O stream that …","The I/O operation timed out and was canceled.","A stateful writer that keeps track of its current offset …","The range of blocks to transfer.","Returns the size in bytes of a single block (i.e., sector),","","","","","","","","Calculates block-wise bounds for an I/O transfer based on …","","","","","","","","","","","","","","","","","","","The byte-wise range specified in absolute bytes from the …","The range of bytes relative to the blocks specified by …","","","","","","Flushes this entire writer’s output stream, ensuring …","Flushes this writer’s output stream, ensuring all …","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","","","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Returns the length (size in bytes) of this I/O stream or …","","","","","","","","Creates a new ReaderWriter with an initial offset of 0.","Creates a new Reader with an initial offset of 0.","Creates a new Writer with an initial offset of 0.","","","","","Reads bytes of data from this reader into the given buffer.","","","","","","","Reads blocks of data from this reader into the given buffer…","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Writes bytes of data from the given buffer to this writer.","","","","","","","Writes blocks of data from the given buffer to this writer.","","","","","","","",""],"i":[0,0,0,0,0,0,0,0,0,20,0,0,0,20,0,0,20,0,16,7,3,5,6,8,9,10,14,0,3,5,6,8,9,10,20,14,16,3,5,6,8,9,10,20,14,16,16,16,14,14,8,14,8,4,22,5,5,6,6,8,8,8,10,10,10,14,14,14,14,14,14,20,14,16,3,3,3,5,5,5,6,6,6,8,9,10,20,20,14,14,14,16,3,5,6,8,9,10,20,14,16,30,3,5,6,8,9,10,14,8,9,10,8,9,14,14,31,3,5,8,9,14,14,2,3,5,8,9,14,14,8,9,10,14,14,14,3,5,6,8,9,10,20,14,16,3,5,6,8,9,10,20,14,16,3,5,6,8,9,10,20,14,16,8,10,14,14,22,5,6,8,10,14,14,4,5,6,8,10,14,14,14,14],"f":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[],1],[[[3,[2]]],1],[[[5,[[0,[2,4]]]]],1],[[[6,[[0,[2,4]]]]],1],[[[8,[7]]],1],[[[9,[7]]],1],[[[10,[7]]],1],[[[14,[[0,[7,11]],[0,[[12,[[0,[7,11]]]],11]],[13,[[0,[[12,[[0,[7,11]]]],11]]]]]]],1],[[[15,[1]],1],[[18,[[17,[16]]]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,[[[14,[11,[0,[[12,[11]],11]],[0,[[13,[[0,[[12,[11]],11]]]],19]]]]],[[14,[11,[0,[[12,[11]],11]],[0,[[13,[[0,[[12,[11]],11]]]],19]]]]]],[[]],[8],[[[14,[11,[0,[[12,[11]],11]],[13,[[0,[[12,[11]],11]]]]]]],[[0,[[12,[11]],11]]]],[8],[[],[[21,[20]]]],[[],[[21,[20]]]],[[[5,[[0,[2,4]]]]],[[21,[20]]]],[[[5,[[0,[2,4]]]]],[[21,[20]]]],[[[6,[[0,[2,4]]]]],[[21,[20]]]],[[[6,[[0,[2,4]]]]],[[21,[20]]]],[[[8,[22]]],23],[[[8,[4]]],[[21,[20]]]],[[[8,[22]]],[[21,[20]]]],[[[10,[22]]],23],[[[10,[4]]],[[21,[20]]]],[[[10,[22]]],[[21,[20]]]],[[[14,[[0,[24,11]],[0,[[12,[[0,[24,11]]]],11]],[13,[[0,[[12,[[0,[24,11]]]],11]]]]]]],23],[[[14,[[0,[24,11]],[0,[[12,[[0,[24,11]]]],11]],[13,[[0,[[12,[[0,[24,11]]]],11]]]]]]],23],[[[14,[[0,[4,11]],[0,[[12,[[0,[4,11]]]],11]],[13,[[0,[[12,[[0,[4,11]]]],11]]]]]]],[[21,[20]]]],[[[14,[[0,[22,11]],[0,[[12,[[0,[22,11]]]],11]],[13,[[0,[[12,[[0,[22,11]]]],11]]]]]]],[[21,[20]]]],[[[14,[[0,[22,11]],[0,[[12,[[0,[22,11]]]],11]],[13,[[0,[[12,[[0,[22,11]]]],11]]]]]]],[[21,[20]]]],[[[14,[[0,[4,11]],[0,[[12,[[0,[4,11]]]],11]],[13,[[0,[[12,[[0,[4,11]]]],11]]]]]]],[[21,[20]]]],[[20,25],26],[[[14,[[0,[11,27]],[0,[[12,[[0,[11,27]]]],11,27]],[0,[[13,[[0,[[12,[[0,[11,27]]]],11,27]]]],27]]]],25],26],[[16,25],26],[2,[[3,[2]]]],[28],[[]],[[]],[28],[[[0,[2,4]]],[[5,[[0,[2,4]]]]]],[28],[[]],[[[0,[2,4]]],[[6,[[0,[2,4]]]]]],[[]],[[]],[[]],[[]],[29,20],[[[13,[[0,[[12,[11]],11]]]]],[[14,[11,[0,[[12,[11]],11]],[13,[[0,[[12,[11]],11]]]]]]]],[28],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],1],[[[3,[[0,[30,2]]]]],1],[[[5,[[0,[30,2,4]]]]],1],[[[6,[[0,[30,2,4]]]]],1],[[[8,[30]]],1],[[[9,[30]]],1],[[[10,[30]]],1],[[[14,[[0,[30,11]],[0,[[12,[[0,[30,11]]]],11]],[13,[[0,[[12,[[0,[30,11]]]],11]]]]]]],1],[[[0,[31,22]]],[[8,[[0,[31,22]]]]]],[31,[[9,[31]]]],[22,[[10,[22]]]],[[[8,[31]],[33,[32]]],[[23,[1]]]],[[[9,[31]],[33,[32]]],[[23,[1]]]],[[[14,[[0,[34,11]],[0,[[12,[[0,[34,11]]]],11]],[13,[[0,[[12,[[0,[34,11]]]],11]]]]]],[33,[32]]],[[23,[1]]]],[[[14,[[0,[34,11]],[0,[[12,[[0,[34,11]]]],11]],[13,[[0,[[12,[[0,[34,11]]]],11]]]]]],[33,[32]]],[[23,[1]]]],[[[33,[32]],1],[[21,[1,20]]]],[[[3,[2]],[33,[32]],1],[[21,[1,20]]]],[[[5,[[0,[2,4]]]],[33,[32]],1],[[21,[1,20]]]],[[[8,[31]],[33,[32]],1],[[21,[1,20]]]],[[[9,[31]],[33,[32]],1],[[21,[1,20]]]],[[[14,[[0,[31,11]],[0,[[12,[[0,[31,11]]]],11]],[13,[[0,[[12,[[0,[31,11]]]],11]]]]]],[33,[32]],1],[[21,[1,20]]]],[[[14,[[0,[31,11]],[0,[[12,[[0,[31,11]]]],11]],[13,[[0,[[12,[[0,[31,11]]]],11]]]]]],[33,[32]],1],[[21,[1,20]]]],[[[33,[32]],1],[[21,[1,20]]]],[[[3,[2]],[33,[32]],1],[[21,[1,20]]]],[[[5,[[0,[2,4]]]],[33,[32]],1],[[21,[1,20]]]],[[[8,[2]],[33,[32]],1],[[21,[1,20]]]],[[[9,[2]],[33,[32]],1],[[21,[1,20]]]],[[[14,[[0,[2,11]],[0,[[12,[[0,[2,11]]]],11]],[13,[[0,[[12,[[0,[2,11]]]],11]]]]]],[33,[32]],1],[[21,[1,20]]]],[[[14,[[0,[2,11]],[0,[[12,[[0,[2,11]]]],11]],[13,[[0,[[12,[[0,[2,11]]]],11]]]]]],[33,[32]],1],[[21,[1,20]]]],[[[8,[30]],35],[[23,[36]]]],[[[9,[30]],35],[[23,[36]]]],[[[10,[30]],35],[[23,[36]]]],[[[14,[[0,[37,11]],[0,[[12,[[0,[37,11]]]],11]],[13,[[0,[[12,[[0,[37,11]]]],11]]]]]],35],[[23,[36]]]],[[[14,[[0,[37,11]],[0,[[12,[[0,[37,11]]]],11]],[13,[[0,[[12,[[0,[37,11]]]],11]]]]]],35],[[23,[36]]]],[[]],[[],21],[[],21],[[],21],[[],21],[[],21],[[],21],[[],21],[[],21],[[],21],[[],21],[[],21],[[],21],[[],21],[[],21],[[],21],[[],21],[[],21],[[],21],[[],38],[[],38],[[],38],[[],38],[[],38],[[],38],[[],38],[[],38],[[],38],[[[8,[22]],[33,[32]]],[[23,[1]]]],[[[10,[22]],[33,[32]]],[[23,[1]]]],[[[14,[[0,[24,11]],[0,[[12,[[0,[24,11]]]],11]],[13,[[0,[[12,[[0,[24,11]]]],11]]]]]],[33,[32]]],[[23,[1]]]],[[[14,[[0,[24,11]],[0,[[12,[[0,[24,11]]]],11]],[13,[[0,[[12,[[0,[24,11]]]],11]]]]]],[33,[32]]],[[23,[1]]]],[[[33,[32]],1],[[21,[1,20]]]],[[[5,[[0,[2,4]]]],[33,[32]],1],[[21,[1,20]]]],[[[6,[[0,[2,4]]]],[33,[32]],1],[[21,[1,20]]]],[[[8,[22]],[33,[32]],1],[[21,[1,20]]]],[[[10,[22]],[33,[32]],1],[[21,[1,20]]]],[[[14,[[0,[22,11]],[0,[[12,[[0,[22,11]]]],11]],[13,[[0,[[12,[[0,[22,11]]]],11]]]]]],[33,[32]],1],[[21,[1,20]]]],[[[14,[[0,[22,11]],[0,[[12,[[0,[22,11]]]],11]],[13,[[0,[[12,[[0,[22,11]]]],11]]]]]],[33,[32]],1],[[21,[1,20]]]],[[[33,[32]],1],[[21,[1,20]]]],[[[5,[[0,[2,4]]]],[33,[32]],1],[[21,[1,20]]]],[[[6,[[0,[2,4]]]],[33,[32]],1],[[21,[1,20]]]],[[[8,[4]],[33,[32]],1],[[21,[1,20]]]],[[[10,[4]],[33,[32]],1],[[21,[1,20]]]],[[[14,[[0,[4,11]],[0,[[12,[[0,[4,11]]]],11]],[13,[[0,[[12,[[0,[4,11]]]],11]]]]]],[33,[32]],1],[[21,[1,20]]]],[[[14,[[0,[4,11]],[0,[[12,[[0,[4,11]]]],11]],[13,[[0,[[12,[[0,[4,11]]]],11]]]]]],[33,[32]],1],[[21,[1,20]]]],[[[14,[[0,[39,11]],[0,[[12,[[0,[39,11]]]],11]],[13,[[0,[[12,[[0,[39,11]]]],11]]]]]],29],26],[[[14,[[0,[39,11]],[0,[[12,[[0,[39,11]]]],11]],[13,[[0,[[12,[[0,[39,11]]]],11]]]]]],29],26]],"c":[],"p":[[15,"usize"],[8,"BlockReader"],[3,"ByteReaderWrapper"],[8,"BlockWriter"],[3,"ByteReaderWriterWrapper"],[3,"ByteWriterWrapper"],[8,"BlockIo"],[3,"ReaderWriter"],[3,"Reader"],[3,"Writer"],[8,"Sized"],[8,"Lockable"],[8,"Borrow"],[3,"LockableIo"],[3,"Range"],[3,"BlockByteTransfer"],[4,"Option"],[15,"array"],[8,"Clone"],[4,"IoError"],[4,"Result"],[8,"ByteWriter"],[6,"Result"],[8,"Write"],[3,"Formatter"],[6,"Result"],[8,"Debug"],[15,"never"],[15,"str"],[8,"KnownLength"],[8,"ByteReader"],[15,"u8"],[15,"slice"],[8,"Read"],[4,"SeekFrom"],[15,"u64"],[8,"Seek"],[3,"TypeId"],[8,"Write"]]},\ "ioapic":{"doc":"","t":"DLLLLLFFFLLMLLLLLLL","n":["IoApic","arbitration_id","borrow","borrow_mut","create","from","get_first_ioapic","get_ioapic","get_ioapics","handles_irq","id","id","into","mask_irq","set_irq","try_from","try_into","type_id","version"],"q":[[0,"ioapic"]],"d":["A representation of an IoApic (x86-specific interrupt chip …","gets this IoApic’s arbitration id.","","","Creates a new IoApic struct from the given id, …","Returns the argument unchanged.","Returns the first IoApic that was created, if any, after …","If an IoApic with the given id exists, then lock it …","Returns a reference to the list of IoApics.","Returns whether this IoApic handles the given irq_num, …","gets this IoApic’s id.","The ID of this IoApic.","Calls U::from(self).","Masks (disables) the given IRQ line. NOTE: this function …","Set IRQ to an interrupt vector.","","","","gets this IoApic’s version."],"i":[0,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1],"f":[0,[1,2],[[]],[[]],[[3,4,5,2],[[7,[6]]]],[[]],[[],[[9,[[8,[1]]]]]],[4,[[9,[[8,[1]]]]]],[[],[[11,[4,[10,[1]]]]]],[[1,2],12],[1,2],0,[[]],[[1,4]],[[1,4,13,4],[[7,[6]]]],[[],7],[[],7],[[],14],[1,2]],"c":[],"p":[[3,"IoApic"],[15,"u32"],[3,"PageTable"],[15,"u8"],[3,"PhysicalAddress"],[15,"str"],[4,"Result"],[3,"MutexGuard"],[4,"Option"],[6,"Mutex"],[3,"AtomicMap"],[15,"bool"],[3,"ApicId"],[3,"TypeId"]]},\ diff --git a/doc/src/arm_boards/lib.rs.html b/doc/src/arm_boards/lib.rs.html index 6c4357fd56..7675176398 100644 --- a/doc/src/arm_boards/lib.rs.html +++ b/doc/src/arm_boards/lib.rs.html @@ -52,6 +52,16 @@ 52 53 54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64
//! Configuration and definitions for specific boards on aarch64 systems.
 //!
 //! | Board Name | Num CPUs  | Interrupt Controller | Secondary CPU Startup Method |
@@ -90,6 +100,16 @@
     pub cpu_ids: [mpidr::DefinedMpidrValue; NUM_CPUS],
     pub interrupt_controller: InterruptControllerConfig,
     pub pl011_base_addresses: [PhysicalAddress; NUM_PL011_UARTS],
+
+    /// The IRQ number reserved for the PL011 Single-Serial-Port Controller
+    /// which Theseus currently uses for logging and UART console.
+    pub pl011_rx_spi: u8,
+
+    /// The IRQ number reserved for CPU-local timer interrupts,
+    /// which Theseus currently uses for preemptive task switching.
+    //
+    // aarch64 manuals define the default timer IRQ number to be 30.
+    pub cpu_local_timer_ppi: u8,
 }
 
 // by default & on x86_64, the default.rs file is used
diff --git a/doc/src/captain/lib.rs.html b/doc/src/captain/lib.rs.html
index c98e4e6ad0..caf29e8d46 100644
--- a/doc/src/captain/lib.rs.html
+++ b/doc/src/captain/lib.rs.html
@@ -233,6 +233,12 @@
 233
 234
 235
+236
+237
+238
+239
+240
+241
 
//! The main initialization routine and setup logic of the OS. 
 //!
 //! The `captain` steers the ship of Theseus, meaning that it contains basic logic 
@@ -338,6 +344,9 @@
     // arch-gate: the IDT & special stacks are x86_64 specific
     #[cfg(target_arch = "x86_64")]
     let idt = {
+        // does nothing at the moment on x86_64
+        interrupt_controller::init()?;
+
         let (double_fault_stack, privilege_stack) = {
             let mut kernel_mmi = kernel_mmi_ref.lock();
             (
@@ -351,6 +360,9 @@
     };
 
     #[cfg(target_arch = "aarch64")] {
+        // Initialize the GIC
+        interrupt_controller::init()?;
+
         interrupts::init()?;
 
         // register BSP CpuId
diff --git a/doc/src/interrupt_controller/lib.rs.html b/doc/src/interrupt_controller/lib.rs.html
index 601ae71be3..8e708e4122 100644
--- a/doc/src/interrupt_controller/lib.rs.html
+++ b/doc/src/interrupt_controller/lib.rs.html
@@ -81,6 +81,17 @@
 81
 82
 83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
 
#![no_std]
 #![allow(unused_variables, unused_mut)]
 
@@ -101,22 +112,23 @@
     SystemInterruptControllerVersion,
     SystemInterruptControllerId,
     LocalInterruptControllerId,
-    SystemInterruptNumber,
-    LocalInterruptNumber,
     Priority,
     SystemInterruptController,
     LocalInterruptController,
+    init,
 };
 
+pub type InterruptNumber = u8;
+
 /// The Cpu where this interrupt should be handled, as well as
 /// the local interrupt number this gets translated to.
 ///
-/// On aarch64, the system interrupt number and the local interrupt
-/// number must be the same.
+/// On aarch64, there is no `local_number` field as the system interrupt
+/// number and the local interrupt number must be the same.
 #[derive(Debug, Copy, Clone)]
-pub struct InterruptDestination {
-    pub cpu: CpuId,
-    pub local_number: LocalInterruptNumber,
+pub enum InterruptDestination {
+    SpecificCpu(CpuId),
+    AllOtherCpus,
 }
 
 pub trait SystemInterruptControllerApi {
@@ -125,26 +137,36 @@
 
     fn get_destination(
         &self,
-        interrupt_num: SystemInterruptNumber,
-    ) -> Result<(Vec<InterruptDestination>, Priority), &'static str>;
+        interrupt_num: InterruptNumber,
+    ) -> Result<(Vec<CpuId>, Priority), &'static str>;
 
     fn set_destination(
         &self,
-        sys_int_num: SystemInterruptNumber,
-        destination: InterruptDestination,
+        sys_int_num: InterruptNumber,
+        destination: CpuId,
         priority: Priority,
     ) -> Result<(), &'static str>;
 }
 
 pub trait LocalInterruptControllerApi {
+    /// Aarch64-specific way to initialize the secondary CPU interfaces.
+    ///
+    /// Must be called once from every secondary CPU.
+    ///
+    /// Always panics on x86_64.
+    fn init_secondary_cpu_interface(&self);
+
     fn id(&self) -> LocalInterruptControllerId;
-    fn get_local_interrupt_priority(&self, num: LocalInterruptNumber) -> Priority;
-    fn set_local_interrupt_priority(&self, num: LocalInterruptNumber, priority: Priority);
-    fn is_local_interrupt_enabled(&self, num: LocalInterruptNumber) -> bool;
-    fn enable_local_interrupt(&self, num: LocalInterruptNumber, enabled: bool);
+    fn get_local_interrupt_priority(&self, num: InterruptNumber) -> Priority;
+    fn set_local_interrupt_priority(&self, num: InterruptNumber, priority: Priority);
+    fn is_local_interrupt_enabled(&self, num: InterruptNumber) -> bool;
+    fn enable_local_interrupt(&self, num: InterruptNumber, enabled: bool);
 
-    /// Sends an inter-processor interrupt to a specific CPU.
-    fn send_ipi(&self, destination: InterruptDestination);
+    /// Sends an inter-processor interrupt.
+    ///
+    /// If `dest` is Some, the interrupt is sent to a specific CPU.
+    /// If it's None, all CPUs except the sender receive the interrupt.
+    fn send_ipi(&self, num: InterruptNumber, dest: InterruptDestination);
 
     /// Reads the minimum priority for an interrupt to reach this CPU.
     ///
@@ -159,9 +181,9 @@
     /// Aarch64-specific way to read the current pending interrupt number & priority.
     ///
     /// Always panics on x86_64.
-    fn acknowledge_interrupt(&self) -> (LocalInterruptNumber, Priority);
+    fn acknowledge_interrupt(&self) -> (InterruptNumber, Priority);
 
     /// Tell the interrupt controller that the current interrupt has been handled.
-    fn end_of_interrupt(&self, number: LocalInterruptNumber);
+    fn end_of_interrupt(&self, number: InterruptNumber);
 }
 
\ No newline at end of file diff --git a/doc/src/interrupt_controller/x86_64.rs.html b/doc/src/interrupt_controller/x86_64.rs.html index e7aab5ba61..99fb145774 100644 --- a/doc/src/interrupt_controller/x86_64.rs.html +++ b/doc/src/interrupt_controller/x86_64.rs.html @@ -126,20 +126,6 @@ 126 127 128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142
use super::*;
 
 use {
@@ -154,13 +140,9 @@
 #[derive(Debug, Copy, Clone)]
 pub struct LocalInterruptControllerId(pub u32);
 #[derive(Debug, Copy, Clone)]
-pub struct SystemInterruptNumber(pub(crate) u8);
-#[derive(Debug, Copy, Clone)]
-pub struct LocalInterruptNumber(pub(crate) u8);
-#[derive(Debug, Copy, Clone)]
 pub struct Priority;
 
-    /// Initializes the interrupt controller, on aarch64
+/// Initializes the interrupt controller (not yet used on x86)
 pub fn init() -> Result<(), &'static str> { Ok(()) }
 
 /// Structure representing a top-level/system-wide interrupt controller chip,
@@ -176,109 +158,99 @@
 /// On x86_64, this corresponds to a LocalApic.
 pub struct LocalInterruptController;
 
-// 1st variant: get system controller
-// 2nd variant: get local controller
-macro_rules! get_int_ctlr {
-    ($name:ident, $func:ident, $this:expr) => {
-        let mut $name = get_ioapic($this.id).expect(concat!("BUG: ", stringify!($func), "(): get_ioapic() returned None"));
-    };
-    ($name:ident, $func:ident) => {
-        let mut $name = get_my_apic().expect(concat!("BUG: ", stringify!($func), "(): get_my_apic() returned None"));
-        let mut $name = $name.write();
-    };
-}
-
 impl SystemInterruptControllerApi for SystemInterruptController {
     fn id(&self) -> SystemInterruptControllerId {
-        get_int_ctlr!(int_ctlr, id, self);
+        let mut int_ctlr = get_ioapic(self.id).expect("BUG: id(): get_ioapic() returned None");
         SystemInterruptControllerId(int_ctlr.id())
     }
 
     fn version(&self) -> SystemInterruptControllerVersion {
-        get_int_ctlr!(int_ctlr, version, self);
+        let mut int_ctlr = get_ioapic(self.id).expect("BUG: version(): get_ioapic() returned None");
         SystemInterruptControllerVersion(int_ctlr.version())
     }
 
     fn get_destination(
         &self,
-        interrupt_num: SystemInterruptNumber,
-    ) -> Result<(Vec<InterruptDestination>, Priority), &'static str> {
-        // no way to read the destination for an IRQ number in IoApic
-        unimplemented!()
+        interrupt_num: InterruptNumber,
+    ) -> Result<(Vec<CpuId>, Priority), &'static str> {
+        todo!("Getting interrupt destination from IOAPIC redirection tables is not yet implemented")
     }
 
     fn set_destination(
         &self,
-        sys_int_num: SystemInterruptNumber,
-        destination: InterruptDestination,
+        sys_int_num: InterruptNumber,
+        destination: CpuId,
         priority: Priority,
     ) -> Result<(), &'static str> {
-        get_int_ctlr!(int_ctlr, set_destination, self);
+        let mut int_ctlr = get_ioapic(self.id).expect("BUG: set_destination(): get_ioapic() returned None");
 
         // no support for priority on x86_64
         let _ = priority;
 
-        int_ctlr.set_irq(sys_int_num.0, destination.cpu.into(), destination.local_number.0)
+        int_ctlr.set_irq(sys_int_num, destination.into(), sys_int_num /* <- is this correct? */)
     }
 }
 
 
 impl LocalInterruptControllerApi for LocalInterruptController {
-    fn id(&self) -> LocalInterruptControllerId {
-        get_int_ctlr!(int_ctlr, id);
+    fn init_secondary_cpu_interface(&self) {
+        panic!("This must not be used on x86_64")
+    }
 
+    fn id(&self) -> LocalInterruptControllerId {
+        let int_ctlr = get_my_apic().expect("BUG: id(): get_my_apic() returned None");
+        let int_ctlr = int_ctlr.read();
         LocalInterruptControllerId(int_ctlr.processor_id())
     }
 
-    fn get_local_interrupt_priority(&self, num: LocalInterruptNumber) -> Priority {
-        get_int_ctlr!(int_ctlr, get_local_interrupt_priority);
-
+    fn get_local_interrupt_priority(&self, num: InterruptNumber) -> Priority {
         // No priority support on x86_64
         Priority
     }
 
-    fn set_local_interrupt_priority(&self, num: LocalInterruptNumber, priority: Priority) {
-        get_int_ctlr!(int_ctlr, set_local_interrupt_priority);
-
+    fn set_local_interrupt_priority(&self, num: InterruptNumber, priority: Priority) {
         // No priority support on x86_64
         let _ = priority;
     }
 
-    fn is_local_interrupt_enabled(&self, num: LocalInterruptNumber) -> bool {
+    fn is_local_interrupt_enabled(&self, num: InterruptNumber) -> bool {
         todo!()
     }
 
-    fn enable_local_interrupt(&self, num: LocalInterruptNumber, enabled: bool) {
+    fn enable_local_interrupt(&self, num: InterruptNumber, enabled: bool) {
         todo!()
     }
 
-    fn send_ipi(&self, destination: InterruptDestination) {
-        get_int_ctlr!(int_ctlr, send_ipi);
-        int_ctlr.send_ipi(destination.local_number.0, LapicIpiDestination::One(destination.cpu.into()))
+    fn send_ipi(&self, num: InterruptNumber, dest: InterruptDestination) {
+        use InterruptDestination::*;
+
+        let mut int_ctlr = get_my_apic().expect("BUG: send_ipi(): get_my_apic() returned None");
+        let mut int_ctlr = int_ctlr.write();
+        int_ctlr.send_ipi(num, match dest {
+            SpecificCpu(cpu) => LapicIpiDestination::One(cpu.into()),
+            AllOtherCpus => LapicIpiDestination::AllButMe,
+        });
     }
 
     fn get_minimum_priority(&self) -> Priority {
-        get_int_ctlr!(int_ctlr, get_minimum_priority);
-
         // No priority support on x86_64
         Priority
     }
 
     fn set_minimum_priority(&self, priority: Priority) {
-        get_int_ctlr!(int_ctlr, set_minimum_priority);
-
         // No priority support on x86_64
         let _ = priority;
     }
 
-    fn acknowledge_interrupt(&self) -> (LocalInterruptNumber, Priority) {
+    fn acknowledge_interrupt(&self) -> (InterruptNumber, Priority) {
         panic!("This must not be used on x86_64")
     }
 
-    fn end_of_interrupt(&self, _number: LocalInterruptNumber) {
-        get_int_ctlr!(int_ctlr, end_of_interrupt);
+    fn end_of_interrupt(&self, _number: InterruptNumber) {
+        let mut int_ctlr = get_my_apic().expect("BUG: end_of_interrupt(): get_my_apic() returned None");
+        let mut int_ctlr = int_ctlr.write();
 
-        // On x86, passing the LocalInterruptNumber isn't required.
+        // On x86, passing the number isn't required.
         int_ctlr.eoi();
     }
 }