summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiav A <liavalb@gmail.com>2020-03-21 09:45:39 +0200
committerAndreas Kling <kling@serenityos.org>2020-03-24 16:15:33 +0100
commit8d9b6c57b52d569c18701a61bf05fdc10f83d6a7 (patch)
treef7e428134c89b3c657ad8f0176513971c1654bdc
parent0b7fc525e143fbe282466c0ca12360321854088e (diff)
downloadserenity-8d9b6c57b52d569c18701a61bf05fdc10f83d6a7.zip
Interrupts: Use Optional container in IOAPIC
We return the Optional container in find_redirection_entry_by_vector() method instead of a raw integer. This makes the code more readable and correct.
-rw-r--r--Kernel/Interrupts/IOAPIC.cpp25
-rw-r--r--Kernel/Interrupts/IOAPIC.h2
2 files changed, 14 insertions, 13 deletions
diff --git a/Kernel/Interrupts/IOAPIC.cpp b/Kernel/Interrupts/IOAPIC.cpp
index e10509be78..bd7f1eb4eb 100644
--- a/Kernel/Interrupts/IOAPIC.cpp
+++ b/Kernel/Interrupts/IOAPIC.cpp
@@ -24,6 +24,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#include <AK/Optional.h>
#include <AK/StringView.h>
#include <Kernel/ACPI/MultiProcessorParser.h>
#include <Kernel/Arch/i386/CPU.h>
@@ -251,14 +252,14 @@ u8 IOAPIC::read_redirection_entry_vector(u8 index) const
return (read_register((index << 1) + IOAPIC_REDIRECTION_ENTRY_OFFSET) & 0xFF);
}
-int IOAPIC::find_redirection_entry_by_vector(u8 vector) const
+Optional<int> IOAPIC::find_redirection_entry_by_vector(u8 vector) const
{
InterruptDisabler disabler;
for (size_t index = 0; index < m_redirection_entries_count; index++) {
if (read_redirection_entry_vector(index) == (InterruptManagement::acquire_mapped_interrupt_number(vector) + IRQ_VECTOR_BASE))
return index;
}
- return -1;
+ return {};
}
void IOAPIC::disable(const GenericInterruptHandler& handler)
@@ -267,13 +268,13 @@ void IOAPIC::disable(const GenericInterruptHandler& handler)
ASSERT(!is_hard_disabled());
u8 interrupt_vector = handler.interrupt_number();
ASSERT(interrupt_vector >= gsi_base() && interrupt_vector < interrupt_vectors_count());
- int index = find_redirection_entry_by_vector(interrupt_vector);
- if (index == (-1)) {
+ auto found_index = find_redirection_entry_by_vector(interrupt_vector);
+ if (!found_index.has_value()) {
map_interrupt_redirection(interrupt_vector);
- index = find_redirection_entry_by_vector(interrupt_vector);
+ found_index = find_redirection_entry_by_vector(interrupt_vector);
}
- ASSERT(index != (-1));
- mask_redirection_entry(index);
+ ASSERT(found_index.has_value());
+ mask_redirection_entry(found_index.value());
}
void IOAPIC::enable(const GenericInterruptHandler& handler)
@@ -282,13 +283,13 @@ void IOAPIC::enable(const GenericInterruptHandler& handler)
ASSERT(!is_hard_disabled());
u8 interrupt_vector = handler.interrupt_number();
ASSERT(interrupt_vector >= gsi_base() && interrupt_vector < interrupt_vectors_count());
- int index = find_redirection_entry_by_vector(interrupt_vector);
- if (index == (-1)) {
+ auto found_index = find_redirection_entry_by_vector(interrupt_vector);
+ if (!found_index.has_value()) {
map_interrupt_redirection(interrupt_vector);
- index = find_redirection_entry_by_vector(interrupt_vector);
+ found_index = find_redirection_entry_by_vector(interrupt_vector);
}
- ASSERT(index != (-1));
- unmask_redirection_entry(index);
+ ASSERT(found_index.has_value());
+ unmask_redirection_entry(found_index.value());
}
void IOAPIC::eoi(const GenericInterruptHandler& handler) const
diff --git a/Kernel/Interrupts/IOAPIC.h b/Kernel/Interrupts/IOAPIC.h
index 9786d85146..713e28b9e0 100644
--- a/Kernel/Interrupts/IOAPIC.h
+++ b/Kernel/Interrupts/IOAPIC.h
@@ -68,7 +68,7 @@ private:
bool is_redirection_entry_masked(u8 index) const;
u8 read_redirection_entry_vector(u8 index) const;
- int find_redirection_entry_by_vector(u8 vector) const;
+ Optional<int> find_redirection_entry_by_vector(u8 vector) const;
void configure_redirections() const;
void write_register(u32 index, u32 value) const;