/*
 * Copyright 2014, NICTA
 *
 * This software may be distributed and modified according to the terms of
 * the BSD 2-Clause license. Note that NO WARRANTY is provided.
 * See "LICENSE_BSD2.txt" for details.
 *
 * @TAG(NICTA_BSD)
 */

#ifndef _SEL4UTILS_MAPPING_H_
#define _SEL4UTILS_MAPPING_H_

#include <autoconf.h>
#include <utils/util.h>
#include <sel4/sel4.h>
#include <sel4/sel4_arch/mapping.h>
#include <sel4utils/arch/mapping.h>

#ifdef CONFIG_LIB_SEL4_VKA

#include <vka/vka.h>
#include <vka/object.h>

/*
 * Create and map the paging object for a particular level of the hierarchy
 * This is an architecturarly implemented function, prototyped here to
 * define its interface
 *
 * @param vka a vka compliant allocator
 * @param failed_bits Number of bits left to translate in the vspace hierarchy.
 *                    This is the value returned by seL4_ARCH_Page_Map when a
 *                    seL4_InvalidLookup error occurs
 * @param objects Pointer to a list of objects that may be partially filled already
 *                The created paging object (if any) will be added to the next
 *                free location in this array
 * @param num_objects Pointer to how many objects in the `objects` parameter have
 *                    been defined. If an object is added to the `objects` list
 *                    will be incremented
 * @param vaddr virtual address to map the object at
 * @param vspace_root cap to a root vspace object to map into
 */
static int
sel4utils_create_object_at_level(vka_t *vka, seL4_Word failed_bits, vka_object_t *objects, int *num_objects, void *vaddr, seL4_CPtr vspace_root);

/* 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 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 rights, int cacheable)
{
    vka_object_t objects[3];
    int num = 3;
    return sel4utils_map_page(vka, pd, frame, vaddr, rights, cacheable, objects, &num);
}

#ifdef CONFIG_LIB_SEL4_VSPACE

#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);

#endif /* CONFIG_LIB_SEL4_VSPACE */
#endif /* CONFIG_LIB_SEL4_VKA */

#ifdef CONFIG_ARCH_IA32

#ifdef CONFIG_IOMMU
int sel4utils_map_iospace_page(vka_t *vka, seL4_CPtr iospace, seL4_CPtr frame, seL4_Word vaddr,
                               seL4_CapRights rights, int cacheable, seL4_Word size_bits,
                               vka_object_t *pts, int *num_pts);
#endif

#ifdef CONFIG_VTX
int sel4utils_map_ept_page(vka_t *vka, seL4_CPtr pd, seL4_CPtr frame, seL4_Word vaddr,
                           seL4_CapRights rights, int cacheable, seL4_Word size_bits, vka_object_t *pagetable, vka_object_t *pagedir);

#endif /* CONFIG_VTX */
#endif /* CONFIG_ARCH_IA32 */

#endif /* _SEL4UTILS_MAPPING_H_ */
