mirror of
https://github.com/RGBCube/serenity
synced 2025-07-07 15:37:35 +00:00

The VirtIO specification defines many types of devices with different purposes, and it also defines 3 possible transport mediums where devices could be connected to the host machine. We only care about the PCIe transport, but this commit puts the actual foundations for supporting the lean MMIO transport too in the future. To ensure things are kept abstracted but still functional, the VirtIO transport code is responsible for what is deemed as related to an actual transport type - allocation of interrupt handlers and tinkering with low level transport-related registers, etc.
38 lines
989 B
C++
38 lines
989 B
C++
/*
|
|
* Copyright (c) 2021, the SerenityOS developers.
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/AtomicRefCounted.h>
|
|
#include <Kernel/Bus/VirtIO/Device.h>
|
|
#include <Kernel/Devices/CharacterDevice.h>
|
|
#include <Kernel/Security/Random.h>
|
|
|
|
namespace Kernel::VirtIO {
|
|
|
|
#define REQUESTQ 0
|
|
|
|
class RNG final
|
|
: public AtomicRefCounted<RNG>
|
|
, public VirtIO::Device {
|
|
public:
|
|
static NonnullLockRefPtr<RNG> must_create_for_pci_instance(PCI::DeviceIdentifier const&);
|
|
virtual ~RNG() override = default;
|
|
|
|
virtual ErrorOr<void> initialize_virtio_resources() override;
|
|
|
|
private:
|
|
virtual StringView class_name() const override { return "VirtIORNG"sv; }
|
|
explicit RNG(NonnullOwnPtr<TransportEntity>);
|
|
virtual bool handle_device_config_change() override;
|
|
virtual void handle_queue_update(u16 queue_index) override;
|
|
void request_entropy_from_host();
|
|
|
|
OwnPtr<Memory::Region> m_entropy_buffer;
|
|
EntropySource m_entropy_source;
|
|
};
|
|
|
|
}
|