lib: trusty: Destroy mapped iovs on device reset

The tipc virtio device has a reuse_mapped setting
where buffers mapped in from non-secure can be
reused across multiple messages to avoid unnecessary
remaps. Free any left over buffers on device reset
so we do not leak any resources.

Bug: 280887032
Change-Id: If7f6e8eb1ffc07ba1fb3b6d96b91f1d7d09ee602
diff --git a/lib/trusty/tipc_virtio_dev.c b/lib/trusty/tipc_virtio_dev.c
index fe29117..14f27d4 100644
--- a/lib/trusty/tipc_virtio_dev.c
+++ b/lib/trusty/tipc_virtio_dev.c
@@ -1096,6 +1096,10 @@
     vqueue_destroy(&dev->vqs[TIPC_VQ_RX]);
     vqueue_destroy(&dev->vqs[TIPC_VQ_TX]);
 
+    /* destroy iovs left over from reuse_mapping */
+    vqueue_unmap_list(&dev->receive_mapped);
+    vqueue_unmap_list(&dev->send_mapped);
+
     /* enter reset state */
     dev->vd.state = VDEV_STATE_RESET;
 
diff --git a/lib/trusty/vqueue.c b/lib/trusty/vqueue.c
index 5a59ac5..9192e94 100644
--- a/lib/trusty/vqueue.c
+++ b/lib/trusty/vqueue.c
@@ -434,6 +434,18 @@
     return ERR_NOT_FOUND;
 }
 
+void vqueue_unmap_list(struct vqueue_mapped_list* mapped_list) {
+    struct vqueue_mem_obj* obj;
+
+    mutex_acquire(&mapped_list->lock);
+    bst_for_every_entry_delete(&mapped_list->list, obj, struct vqueue_mem_obj,
+                               node) {
+        vmm_free_region(vmm_get_kernel_aspace(), (vaddr_t)obj->iov_base);
+        free(obj);
+    }
+    mutex_release(&mapped_list->lock);
+}
+
 static int _vqueue_add_buf_locked(struct vqueue* vq,
                                   struct vqueue_buf* buf,
                                   uint32_t len) {
diff --git a/lib/trusty/vqueue.h b/lib/trusty/vqueue.h
index 05c095f..af9c411 100644
--- a/lib/trusty/vqueue.h
+++ b/lib/trusty/vqueue.h
@@ -106,6 +106,8 @@
                        struct vqueue_mapped_list* mapped_list[],
                        int list_cnt);
 
+void vqueue_unmap_list(struct vqueue_mapped_list* mapped_list);
+
 int vqueue_add_buf(struct vqueue* vq, struct vqueue_buf* buf, uint32_t len);
 
 void vqueue_signal_avail(struct vqueue* vq);