blob: 8cfa356e48c0be0304091ad4c886ae73dd2395b1 [file] [log] [blame]
/*
* Copyright 2017, Data61, CSIRO (ABN 41 687 119 230)
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <autoconf.h>
#include <sel4utils/gen_config.h>
#include <utils/util.h>
#include <sel4/sel4.h>
#include <vka/vka.h>
#include <vka/object.h>
/* Map a page to a virtual address, allocating a page table if necessary.
*
*
* @param vka a vka compliant allocator
* @param pd page directory to map the page into
* @param page capability to the page to map in
* @param vaddr unmapped virtual address to map the page into
* @param rights permissions to map the page with
* @param cacheable 1 if the page should be cached (0 if it is for DMA)
* @param objects array of vka_object_t structure to be populated with paging structures
* info any one are allocated
* @param num_objects Pointer to both the size of the objects array, and the number of
* objects that get allocated
*
* @return error sel4 error code or -1 if allocation failed.
*/
int sel4utils_map_page(vka_t *vka, seL4_CPtr pd, seL4_CPtr frame, void *vaddr,
seL4_CapRights_t rights, int cacheable, vka_object_t *objects, int *num_objects);
/** convenient wrapper this if you don't want to track allocated page tables */
static inline int sel4utils_map_page_leaky(vka_t *vka, seL4_CPtr pd, seL4_CPtr frame, void *vaddr,
seL4_CapRights_t rights, int cacheable)
{
vka_object_t objects[3];
int num = 3;
return sel4utils_map_page(vka, pd, frame, vaddr, rights, cacheable, objects, &num);
}
#include <vspace/vspace.h>
/* Duplicate a page cap and map it into a vspace
*
* @param vka Allocator for resources
* @param vspace vspace to map into
* @param page cptr to duplicate and map
* @param size_bits size of the page to map
*
* @return virtual address of mapping
*/
void *sel4utils_dup_and_map(vka_t *vka, vspace_t *vspace, seL4_CPtr page, size_t size_bits);
/* Unmap a duplicated page cap and free any resources. Is the opposite
* of sel4utils_dup_and_map
*
* @param vka Allocator used to allocated resources
* @param vspace vspace that frame was mapped into
* @param mapping virtual address of mapping to remove
* @param size_bits size of the page to unmap
*
* @return none
*/
void sel4utils_unmap_dup(vka_t *vka, vspace_t *vspace, void *mapping, size_t size_bits);
#if defined(CONFIG_IOMMU) || defined(CONFIG_TK1_SMMU)
int sel4utils_map_iospace_page(vka_t *vka, seL4_CPtr iospace, seL4_CPtr frame, seL4_Word vaddr,
seL4_CapRights_t rights, int cacheable, seL4_Word size_bits,
vka_object_t *pts, int *num_pts);
#endif /* defined(CONFIG_IOMMU) || defined(CONFIG_TK1_SMMU) */
#ifdef CONFIG_VTX
int sel4utils_map_ept_page(vka_t *vka, seL4_CPtr pd, seL4_CPtr frame, seL4_Word vaddr,
seL4_CapRights_t rights, int cacheable, seL4_Word size_bits, vka_object_t *pagetable, vka_object_t *pagedir,
vka_object_t *pdpt);
#endif /* CONFIG_VTX */