From fd50c97f1aa02c2391b72ab346cab190e7083797 Mon Sep 17 00:00:00 2001 From: Marvin Friedrich Date: Mon, 2 Nov 2026 21:53:06 +0100 Subject: [PATCH] dev/pci: Unmap memory on allocation failure --- dev/block/nvme/pci.c | 12 ++++++++++-- dev/pci/core.c | 8 +++++++- dev/pci/ecam.c | 8 +++++++- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/dev/block/nvme/pci.c b/dev/block/nvme/pci.c index 00554a7..001e20e 100644 --- a/dev/block/nvme/pci.c +++ b/dev/block/nvme/pci.c @@ -39,8 +39,14 @@ static errno_t map_bar(struct pci_bar* bar, void** out) { for (size_t i = 0; i < len; i += page_size) { errno_t status = pmap_map(&kernel_vma.pmap, vaddr + i, bar->address + i, PTE_READ | PTE_WRITE, CACHE_MMIO); - if (status) + if (status) { + while (i) { + i -= page_size; + pmap_unmap(&kernel_vma.pmap, vaddr + i); + } + vm_free(vaddr, len); return status; + } } *out = (void*)vaddr; @@ -81,8 +87,10 @@ static errno_t nvme_pci_probe(struct pci_device* dev, const struct pci_match* ma if (irq_line) { struct nvme_irq_handler* handler = mem_alloc(sizeof(*handler), 0); - if (!handler) + if (!handler) { + mem_free(controller); return ENOMEM; + } handler->handler.thread = nvme_irq_thread; handler->controller = controller; diff --git a/dev/pci/core.c b/dev/pci/core.c index 730f01b..bc1bf61 100644 --- a/dev/pci/core.c +++ b/dev/pci/core.c @@ -224,8 +224,14 @@ errno_t pci_setup_msix(struct pci_device* dev, struct irq_line** out) { return ENOMEM; for (size_t i = 0; i < map_len; i += page_size) { status = pmap_map(&kernel_vma.pmap, vaddr + i, page_base + i, PTE_READ | PTE_WRITE, CACHE_MMIO); - if (status) + if (status) { + while (i) { + i -= page_size; + pmap_unmap(&kernel_vma.pmap, vaddr + i); + } + vm_free(vaddr, map_len); return status; + } } void* entry = (void*)(vaddr + page_offset); diff --git a/dev/pci/ecam.c b/dev/pci/ecam.c index 6289272..127eefb 100644 --- a/dev/pci/ecam.c +++ b/dev/pci/ecam.c @@ -43,8 +43,14 @@ errno_t pci_ecam_register(phys_t base, uint16_t domain, uint8_t start_bus, uint8 for (size_t i = 0; i < length; i += arch_mem_page_size()) { errno_t status = pmap_map(&kernel_vma.pmap, vaddr + i, phys + i, PTE_READ | PTE_WRITE, CACHE_MMIO); - if (status != 0) + if (status != 0) { + while (i) { + i -= arch_mem_page_size(); + pmap_unmap(&kernel_vma.pmap, vaddr + i); + } + vm_free(vaddr, length); return status; + } } struct pci_ecam* ecam = mem_alloc(sizeof(*ecam), 0);