sp1: vm: Add function to unmap vm regions
Signed-off-by: Ian Moffett <ian@mirocom.org>
This commit is contained in:
@@ -51,15 +51,33 @@ mm_vm_map(struct mmu_vfr *vfr, struct vm_map *mapping, int prot)
|
||||
for (size_t i = 0; i < len; i += gran) {
|
||||
status = mu_mmu_map(vfr, vma + i, pma + i, prot, mapping->ps);
|
||||
|
||||
/*
|
||||
* TODO: We need to clean up here instead of leaving a big hole
|
||||
* when this fails.
|
||||
*/
|
||||
/* Destroy what we created on failure */
|
||||
if (status != STATUS_SUCCESS) {
|
||||
pr_trace("mapping failed, leaked %d bytes\n", len);
|
||||
mm_vm_unmap(vfr, mapping);
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
status_t
|
||||
mm_vm_unmap(struct mmu_vfr *vfr, struct vm_map *mapping)
|
||||
{
|
||||
size_t gran, len;
|
||||
uintptr_t vma;
|
||||
|
||||
if (vfr == NULL || mapping == NULL) {
|
||||
return STATUS_INVALID_PARAM;
|
||||
}
|
||||
|
||||
gran = GRAN(mapping->ps);
|
||||
vma = ALIGN_DOWN(mapping->vma_base, gran);
|
||||
len = ALIGN_UP(len + (len & (gran - 1)), gran);
|
||||
|
||||
for (size_t i = 0; i < len; i += gran) {
|
||||
mu_mmu_unmap(vfr, vma + i, mapping->ps);
|
||||
}
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
* @vma_base: Virtual memory base
|
||||
* @pma_base: Physical memory base
|
||||
* @length: Number of bytes to map
|
||||
*
|
||||
* XXX: `pma_base' is unused when unmapping regions
|
||||
*/
|
||||
struct vm_map {
|
||||
pagesize_t ps;
|
||||
@@ -49,6 +51,14 @@ struct vm_map {
|
||||
*/
|
||||
status_t mm_vm_map(struct mmu_vfr *vfr, struct vm_map *mapping, int prot);
|
||||
|
||||
/*
|
||||
* Destroy a virtual memory mapping
|
||||
*
|
||||
* @vfr: Virtual fuck region to unmap within
|
||||
* @mapping: Mapping to destroy
|
||||
*/
|
||||
status_t mm_vm_unmap(struct mmu_vfr *vfr, struct vm_map *mapping);
|
||||
|
||||
/*
|
||||
* Initialize the virtual memory management
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user