/*
 * Copyright 2017, Data61
 * Commonwealth Scientific and Industrial Research Organisation (CSIRO)
 * ABN 41 687 119 230.
 *
 * 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(DATA61_BSD)
 */

#pragma once

#include <autoconf.h>
#include <sel4/types.h>
#include <allocman/cspace/cspace.h>
#include <vka/vka.h>

/* This is a proxy allocator that just passes any allocs/frees to a vka interface */
static inline cspacepath_t _cspace_vka_make_path(void *_cspace, seL4_CPtr slot)
{
    vka_t *vka = (vka_t*)_cspace;
    cspacepath_t path;
    vka_cspace_make_path(vka, slot, &path);
    return path;
}

static int _cspace_vka_alloc(struct allocman *alloc, void *_cspace, cspacepath_t *slot)
{
    vka_t *vka = (vka_t*)_cspace;
    (void)alloc;
    return vka_cspace_alloc_path(vka, slot);
}
static void _cspace_vka_free(struct allocman *alloc, void *_cspace, const cspacepath_t *slot)
{
    vka_t *vka = (vka_t*)_cspace;
    (void)alloc;
    vka_cspace_free(vka, slot->capPtr);
}

/**
 * Make a cspace interface from a VKA. It is the responsibility of the caller to ensure
 * that this pointer remains valid for as long as this cspace is used
 *
 * @param vka Allocator to proxy cspace calls to
 * @return cspace_interface that can be given to allocman
 */
static inline struct cspace_interface cspace_vka_make_interface(vka_t *vka) {
    return (struct cspace_interface){
        .alloc = _cspace_vka_alloc,
        .free = _cspace_vka_free,
        .make_path = _cspace_vka_make_path,
        /* VKA is not guaranteed to recurse */
        .properties = ALLOCMAN_DEFAULT_PROPERTIES,
        .cspace = vka
    };
}

