summaryrefslogtreecommitdiff
path: root/Kernel/Bus
diff options
context:
space:
mode:
authorLiav A <liavalb@gmail.com>2023-04-26 17:19:05 +0300
committerAndreas Kling <kling@serenityos.org>2023-04-30 06:03:47 +0200
commitbc3eb6d65f847e68d5c5f5d065bd4872f7c7e076 (patch)
tree4b68ca5ba2c74979d06f5fc22c9d0e7d5e826b81 /Kernel/Bus
parent87a32ab869f306ce71820efde0f93154d6a5c4ba (diff)
downloadserenity-bc3eb6d65f847e68d5c5f5d065bd4872f7c7e076.zip
Kernel/VirtIO: Use proper error propagation from the get_config method
This allows us to drop null-checks at call-sites, thus simplifying the code and reducing the chance of nullptr-dereference errors.
Diffstat (limited to 'Kernel/Bus')
-rw-r--r--Kernel/Bus/VirtIO/Console.cpp4
-rw-r--r--Kernel/Bus/VirtIO/Device.cpp6
-rw-r--r--Kernel/Bus/VirtIO/Device.h4
3 files changed, 6 insertions, 8 deletions
diff --git a/Kernel/Bus/VirtIO/Console.cpp b/Kernel/Bus/VirtIO/Console.cpp
index 08a67f040a..b34b186977 100644
--- a/Kernel/Bus/VirtIO/Console.cpp
+++ b/Kernel/Bus/VirtIO/Console.cpp
@@ -22,9 +22,7 @@ UNMAP_AFTER_INIT NonnullLockRefPtr<Console> Console::must_create(PCI::DeviceIden
UNMAP_AFTER_INIT ErrorOr<void> Console::initialize_virtio_resources()
{
TRY(Device::initialize_virtio_resources());
- auto const* cfg = get_config(VirtIO::ConfigurationType::Device);
- if (!cfg)
- return Error::from_errno(ENODEV);
+ auto const* cfg = TRY(get_config(VirtIO::ConfigurationType::Device));
bool success = negotiate_features([&](u64 supported_features) {
u64 negotiated = 0;
if (is_feature_set(supported_features, VIRTIO_CONSOLE_F_SIZE))
diff --git a/Kernel/Bus/VirtIO/Device.cpp b/Kernel/Bus/VirtIO/Device.cpp
index c1d8c08f32..fda0d52062 100644
--- a/Kernel/Bus/VirtIO/Device.cpp
+++ b/Kernel/Bus/VirtIO/Device.cpp
@@ -151,9 +151,9 @@ UNMAP_AFTER_INIT ErrorOr<void> Device::initialize_virtio_resources()
auto mapping_io_window = TRY(IOWindow::create_for_pci_device_bar(device_identifier(), static_cast<PCI::HeaderType0BaseRegister>(cfg.bar)));
m_register_bases[cfg.bar] = move(mapping_io_window);
}
- m_common_cfg = get_config(ConfigurationType::Common, 0);
- m_notify_cfg = get_config(ConfigurationType::Notify, 0);
- m_isr_cfg = get_config(ConfigurationType::ISR, 0);
+ m_common_cfg = TRY(get_config(ConfigurationType::Common, 0));
+ m_notify_cfg = TRY(get_config(ConfigurationType::Notify, 0));
+ m_isr_cfg = TRY(get_config(ConfigurationType::ISR, 0));
} else {
auto mapping_io_window = TRY(IOWindow::create_for_pci_device_bar(device_identifier(), PCI::HeaderType0BaseRegister::BAR0));
m_register_bases[0] = move(mapping_io_window);
diff --git a/Kernel/Bus/VirtIO/Device.h b/Kernel/Bus/VirtIO/Device.h
index cafcb5a38f..582576b78d 100644
--- a/Kernel/Bus/VirtIO/Device.h
+++ b/Kernel/Bus/VirtIO/Device.h
@@ -30,7 +30,7 @@ protected:
virtual StringView class_name() const { return "VirtIO::Device"sv; }
explicit Device(PCI::DeviceIdentifier const&);
- Configuration const* get_config(ConfigurationType cfg_type, u32 index = 0) const
+ ErrorOr<Configuration const*> get_config(ConfigurationType cfg_type, u32 index = 0) const
{
for (auto const& cfg : m_configs) {
if (cfg.cfg_type != cfg_type)
@@ -41,7 +41,7 @@ protected:
}
return &cfg;
}
- return nullptr;
+ return Error::from_errno(ENXIO);
}
template<typename F>