static errval_t copy_bios_mem(void) { errval_t err = SYS_ERR_OK; // Get a copy of the VBE BIOS before ACPI touches it struct capref bioscap; err = mm_alloc_range(&pci_mm_physaddr, BIOS_BITS, 0, 1UL << BIOS_BITS, &bioscap, NULL); assert(err_is_ok(err)); void *origbios; struct vregion *origbios_vregion; err = vspace_map_one_frame(&origbios, 1 << BIOS_BITS, bioscap, NULL, &origbios_vregion); assert(err_is_ok(err)); err = frame_alloc(&biosmem, 1 << BIOS_BITS, NULL); assert(err_is_ok(err)); void *newbios; struct vregion *newbios_vregion; err = vspace_map_one_frame(&newbios, 1 << BIOS_BITS, biosmem, NULL, &newbios_vregion); assert(err_is_ok(err)); memcpy(newbios, origbios, 1 << BIOS_BITS); // Unmap both vspace regions again vregion_destroy(origbios_vregion); vregion_destroy(newbios_vregion); // TODO: Implement mm_free() return err; }
errval_t memserv_alloc(struct capref *ret, uint8_t bits, genpaddr_t minbase, genpaddr_t maxlimit) { errval_t err; assert(bits >= MINSIZEBITS); /* refill slot allocator if needed */ err = slot_prealloc_refill(mm_ram.slot_alloc_inst); assert(err_is_ok(err)); /* refill slab allocator if needed */ size_t freecount = slab_freecount(&mm_ram.slabs); while (!refilling && (freecount <= MINSPARENODES)) { refilling = true; struct capref frame; err = msa.a.alloc(&msa.a, &frame); assert(err_is_ok(err)); size_t retsize; err = frame_create(frame, BASE_PAGE_SIZE * 8, &retsize); assert(err_is_ok(err)); assert(retsize % BASE_PAGE_SIZE == 0); assert(retsize >= BASE_PAGE_SIZE); void *buf; err = paging_map_frame(get_current_paging_state(), &buf, retsize, frame, NULL, NULL); if (err_is_fail(err)) { DEBUG_ERR(err, "paging_map_frame failed"); assert(buf); } slab_grow(&mm_ram.slabs, buf, retsize); freecount = slab_freecount(&mm_ram.slabs); } if (freecount > MINSPARENODES) { refilling = false; } if(maxlimit == 0) { err = mm_alloc(&mm_ram, bits, ret, NULL); } else { err = mm_alloc_range(&mm_ram, bits, minbase, maxlimit, ret, NULL); } if (err_is_fail(err)) { debug_printf("in mem_serv:mymm_alloc(bits=%"PRIu8", minbase=%"PRIxGENPADDR ", maxlimit=%"PRIxGENPADDR")\n", bits, minbase, maxlimit); DEBUG_ERR(err, "mem_serv:mymm_alloc"); } return err; }
static errval_t mymm_alloc(struct capref *ret, uint8_t bits, genpaddr_t minbase, genpaddr_t maxlimit) { errval_t err; assert(bits >= MINSIZEBITS); if(maxlimit == 0) { err = mm_alloc(&mm_ram, bits, ret, NULL); } else { err = mm_alloc_range(&mm_ram, bits, minbase, maxlimit, ret, NULL); } return err; }
int cdi_alloc_phys_mem(size_t size, void** vaddr, void** paddr) { LOG cdi_check_init(-1); cdi_check_arg(vaddr, != NULL, -1); cdi_check_arg(paddr, != NULL, -1); size_t pages = NUM_PAGES(size); if (!pages) return -1; paddr_t phys = mm_alloc_range(pages); if (paddr == NO_PAGE) return -1; vaddr_t virt = km_alloc_addr(phys, PE_PRESENT | PE_READWRITE, size); if (!virt) return -1; *vaddr = virt; *paddr = phys; return 0; }