int mempool_destroy(struct mempool *mp) { int rc = VMM_OK; if (!mp) { return VMM_EFAIL; } switch (mp->type) { case MEMPOOL_TYPE_RAW: rc = vmm_host_memunmap(mp->entity_base); break; case MEMPOOL_TYPE_RAM: rc = vmm_host_free_pages(mp->entity_base, mp->d.ram.page_count); break; case MEMPOOL_TYPE_HEAP: vmm_free((void *)mp->entity_base); break; default: return VMM_EINVALID; }; fifo_free(mp->f); vmm_free(mp); return rc; }
static virtual_addr_t __init find_root_system_descriptor(void) { struct acpi_search_area *carea = &acpi_areas[0]; virtual_addr_t area_map; virtual_addr_t rsdp_base = 0; virtual_size_t sz = 0; while (carea->area_name) { vmm_printf("Search for RSDP in %s... ", carea->area_name); sz = carea->phys_end - carea->phys_start; area_map = vmm_host_memmap(carea->phys_start, sz, VMM_MEMORY_FLAGS_NORMAL_NOCACHE); BUG_ON((void *)area_map == NULL); if ((rsdp_base = locate_rsdp_in_area(area_map, sz)) != 0) { vmm_printf("found.\n"); break; } rsdp_base = 0; carea++; vmm_host_memunmap(area_map); vmm_printf("not found.\n"); } if (likely(rsdp_base)) vmm_printf("RSDP Base: 0x%x\n", rsdp_base); return rsdp_base; }
int virtio_queue_cleanup(struct virtio_queue *vq) { int rc = VMM_OK; if (!vq->addr) { goto done; } rc = vmm_host_memunmap((virtual_addr_t)vq->addr, (virtual_size_t)vq->total_size); done: vq->last_avail_idx = 0; vq->last_used_signalled = 0; vq->addr = NULL; vq->guest = NULL; vq->desc_count = 0; vq->align = 0; vq->guest_pfn = 0; vq->guest_page_size = 0; vq->guest_addr = 0; vq->host_addr = 0; vq->total_size = 0; return rc; }