dev/pci: Unmap memory on allocation failure
This commit is contained in:
+10
-2
@@ -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) {
|
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);
|
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;
|
return status;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*out = (void*)vaddr;
|
*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) {
|
if (irq_line) {
|
||||||
struct nvme_irq_handler* handler = mem_alloc(sizeof(*handler), 0);
|
struct nvme_irq_handler* handler = mem_alloc(sizeof(*handler), 0);
|
||||||
if (!handler)
|
if (!handler) {
|
||||||
|
mem_free(controller);
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
|
}
|
||||||
handler->handler.thread = nvme_irq_thread;
|
handler->handler.thread = nvme_irq_thread;
|
||||||
handler->controller = controller;
|
handler->controller = controller;
|
||||||
|
|
||||||
|
|||||||
+7
-1
@@ -224,8 +224,14 @@ errno_t pci_setup_msix(struct pci_device* dev, struct irq_line** out) {
|
|||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
for (size_t i = 0; i < map_len; i += page_size) {
|
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);
|
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;
|
return status;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void* entry = (void*)(vaddr + page_offset);
|
void* entry = (void*)(vaddr + page_offset);
|
||||||
|
|
||||||
|
|||||||
+7
-1
@@ -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()) {
|
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);
|
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;
|
return status;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct pci_ecam* ecam = mem_alloc(sizeof(*ecam), 0);
|
struct pci_ecam* ecam = mem_alloc(sizeof(*ecam), 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user