sel4utils: Mapping deferred rights reservations Updated sel4utils to support the new vspace interface function: 'vspace_deferred_rights_map_pages_at_vaddr_fn'. This enables the user to pass in the rights of the memory region when mapping a 'rights deferred' vspace reservation.
diff --git a/libsel4utils/include/sel4utils/vspace_internal.h b/libsel4utils/include/sel4utils/vspace_internal.h index f1a391b..47c961f 100644 --- a/libsel4utils/include/sel4utils/vspace_internal.h +++ b/libsel4utils/include/sel4utils/vspace_internal.h
@@ -434,6 +434,9 @@ int cacheable); int sel4utils_map_pages_at_vaddr(vspace_t *vspace, seL4_CPtr caps[], uintptr_t cookies[], void *vaddr, size_t num_pages, size_t size_bits, reservation_t reservation); +int sel4utils_deferred_rights_map_pages_at_vaddr(vspace_t *vspace, seL4_CPtr caps[], uintptr_t cookies[], void *vaddr, + size_t num_pages, size_t size_bits, seL4_CapRights_t rights, + reservation_t reservation); void sel4utils_unmap_pages(vspace_t *vspace, void *vaddr, size_t num_pages, size_t size_bits, vka_t *vka); void *sel4utils_new_pages(vspace_t *vspace, seL4_CapRights_t rights,
diff --git a/libsel4utils/src/vspace/bootstrap.c b/libsel4utils/src/vspace/bootstrap.c index ad06562..99bf5d9 100644 --- a/libsel4utils/src/vspace/bootstrap.c +++ b/libsel4utils/src/vspace/bootstrap.c
@@ -71,6 +71,7 @@ vspace->map_pages = sel4utils_map_pages; vspace->new_pages_at_vaddr = sel4utils_new_pages_at_vaddr; vspace->map_pages_at_vaddr = sel4utils_map_pages_at_vaddr; + vspace->deferred_rights_map_pages_at_vaddr = sel4utils_deferred_rights_map_pages_at_vaddr; vspace->unmap_pages = sel4utils_unmap_pages; vspace->reserve_range_aligned = sel4utils_reserve_range_aligned;
diff --git a/libsel4utils/src/vspace/vspace.c b/libsel4utils/src/vspace/vspace.c index 01254d0..af21c24 100644 --- a/libsel4utils/src/vspace/vspace.c +++ b/libsel4utils/src/vspace/vspace.c
@@ -357,10 +357,41 @@ return -1; } + if (res->rights_deferred) { + ZF_LOGE("Reservation has no rights associated with it"); + return -1; + } + return map_pages_at_vaddr(vspace, caps, cookies, vaddr, num_pages, size_bits, res->rights, res->cacheable); } +int sel4utils_deferred_rights_map_pages_at_vaddr(vspace_t *vspace, seL4_CPtr caps[], uintptr_t cookies[], void *vaddr, + size_t num_pages, size_t size_bits, + seL4_CapRights_t rights, reservation_t reservation) +{ + sel4utils_alloc_data_t *data = get_alloc_data(vspace); + sel4utils_res_t *res = reservation_to_res(reservation); + + if (!sel4_valid_size_bits(size_bits)) { + ZF_LOGE("Invalid size_bits %zu", size_bits); + return -1; + } + + if (!check_reservation(data->top_level, res, (uintptr_t) vaddr, (uintptr_t)vaddr + num_pages * BIT(size_bits))) { + ZF_LOGE("Invalid reservation"); + return -1; + } + + if (!res->rights_deferred) { + ZF_LOGE("Invalid rights: rights already given to reservation"); + return -1; + } + + return map_pages_at_vaddr(vspace, caps, cookies, vaddr, num_pages, size_bits, + rights, res->cacheable); +} + void *sel4utils_map_pages(vspace_t *vspace, seL4_CPtr caps[], uintptr_t cookies[], seL4_CapRights_t rights, size_t num_pages, size_t size_bits, int cacheable)