The Pedigree Project 0.1
modules/drivers/common/virtio-blk/main.cc
1/* Copyright (c) 2026, Pedigree Developers. SPDX-License-Identifier: ISC */
2#include "pedigree/kernel/linker/KernelElf.h"
3#include "pedigree/kernel/utilities/List.h"
4#include "pedigree/kernel/utilities/new"
5
6#include "VirtioBlkController.h"
7#include "modules/Module.h"
8
9namespace {
10List<Device*> candidates;
12
13void collect(Device* pci) {
14 for (size_t i = 0; i < pci->getNumChildren(); ++i) {
15 if (pci->getChild(i)->getSpecificType() == String("virtio-blk-controller")) {
16 return;
17 }
18 }
19 candidates.pushBack(pci);
20}
21
22Module::UnloadAdmission admitUnload(bool) {
23 for (auto* controller : controllers) {
24 if (!controller->prepareDiskRemoval()) {
25 for (auto* rollback : controllers) {
26 rollback->cancelDiskRemoval();
27 }
28 return Module::UnloadAdmission::Busy;
29 }
30 }
31 return Module::UnloadAdmission::Ready;
32}
33
34bool entry() {
35 Device::searchByVendorIdAndDeviceId(0x1af4, 0x1042, collect);
36 Device::searchByVendorIdAndDeviceId(0x1af4, 0x1001, collect);
37 while (candidates.count()) {
38 Device* pci = candidates.popFront();
39 auto* controller = new VirtioBlkController(pci);
40 if (!controller->initialiseController()) {
41 controller->shutdown();
42 delete controller;
43 continue;
44 }
45 {
47 controller->setParent(pci);
48 pci->addChild(controller);
49 }
50 controllers.pushBack(controller);
51 }
52 if (!controllers.count()) {
53 return false;
54 }
55 return KernelElf::instance().registerUnloadAdmission(&entry, &admitUnload);
56}
57
58void exit() {
59 while (controllers.count()) {
60 VirtioBlkController* controller = controllers.popFront();
61 controller->shutdown();
62 {
64 controller->getParent()->removeChild(controller);
65 controller->setParent(nullptr);
66 }
67 delete controller;
68 }
69}
70} // namespace
71
72MODULE_INFO("virtio-blk", &entry, &exit, "pci", "virtio-pci", "scsi");
size_t getNumChildren()
Definition Device.cc:143
Device * getChild(size_t n)
Definition Device.cc:139
void addChild(Device *pDevice)
Definition Device.cc:135
virtual const String & getSpecificType()
Definition Device.h:183
Device * getParent() const
Definition Device.h:166
void setParent(Device *p)
Definition Device.h:170
void removeChild(size_t n)
Definition Device.cc:147
bool registerUnloadAdmission(ModuleEntry ownerEntry, Module::UnloadAdmissionHook hook)
Definition KernelElf.cc:994
static KernelElf & instance()
Definition KernelElf.h:135
Definition List.h:61
T popFront()
Definition List.h:330
size_t count() const
Definition List.h:212
void pushBack(const T &value)
Definition List.h:216