Index: kernel/generic/include/mm/as.h
===================================================================
--- kernel/generic/include/mm/as.h	(revision b2fa1204c76e1eaec329888181d281aac04ed61e)
+++ kernel/generic/include/mm/as.h	(revision c101dc091b4b9baa318e7f3ece16975f461497b8)
@@ -169,4 +169,5 @@
 		uintptr_t base;
 		size_t frames;
+		bool anonymous;
 	};
 } mem_backend_data_t;
Index: kernel/generic/src/ddi/ddi.c
===================================================================
--- kernel/generic/src/ddi/ddi.c	(revision b2fa1204c76e1eaec329888181d281aac04ed61e)
+++ kernel/generic/src/ddi/ddi.c	(revision c101dc091b4b9baa318e7f3ece16975f461497b8)
@@ -121,4 +121,5 @@
 	backend_data.base = phys;
 	backend_data.frames = pages;
+	backend_data.anonymous = false;
 	
 	/*
@@ -336,4 +337,5 @@
 	backend_data.base = *phys;
 	backend_data.frames = frames;
+	backend_data.anonymous = true;
 	
 	if (!as_area_create(TASK->as, map_flags, size,
@@ -354,6 +356,5 @@
 NO_TRACE static int dmamem_unmap_anonymous(uintptr_t virt)
 {
-	// TODO: implement unlocking & unmap
-	return EOK;
+	return as_area_destroy(TASK->as, virt);
 }
 
Index: kernel/generic/src/mm/backend_phys.c
===================================================================
--- kernel/generic/src/mm/backend_phys.c	(revision b2fa1204c76e1eaec329888181d281aac04ed61e)
+++ kernel/generic/src/mm/backend_phys.c	(revision c101dc091b4b9baa318e7f3ece16975f461497b8)
@@ -92,5 +92,8 @@
 void phys_destroy(as_area_t *area)
 {
-	/* Nothing to do. */
+	mem_backend_data_t *data = &area->backend_data;
+
+	if (data->anonymous)
+		frame_free_noreserve(data->base, data->frames);
 }
 
