/*
 * 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 <inttypes.h>
#include <sel4/sel4.h>

/* --- Debug --- */

#ifdef DEBUG
#include <stdio.h>
#define CSPACEPATHPRINT     printf
#else
#define CSPACEPATHPRINT(...)
#endif

/* cspacepath_t
 * ------------
 *
 * This struct contains all the data to describe a slot in the CSpace.
 * It can be also used to describe a range of slots beginning at 'capPtr'
 * and count 'window'.
 *
  capPtr: The address/pointer to a capability.
 * capDepth: The depth of the address. (Most used value 32-Bit.)
 * root:   Capability pointer to the root CNode in our CSpace.
 * window: Count of caps in the range, beginning with 'capPtr'.
 *
 * !! Now this is where things are getting complicated. !!
 * dest:   Capability pointer to the destination CNode. Resolved relative
 *         to the root parameter.
 * depth:  Number of bits of dest to translate when addressing the
 *         destination CNode.
 * offset: Number of slots into the node at which capabilities start being
 *         placed
 * -------------------------------
 * ??? But what does this mean ???
 * -------------------------------
 * Example: Let's assume a three level cspace layout
 *          ROOT [  |A|              ] 20 = bitlength
 *                   |
 *                   v
 *          A        [  |B|          ]  8 = bitlength
 *                       |
 *                       v
 *          B            [  |x|      ]  4 = bitlength
 *
 *          (where bitlength = guardsize + radix)
 *
 * Let's say we want to address the capability x which lies in the CNode B.
 * That means our destination CNode is B.
 *
 * Imagine capPtr x as a concatenated value of offsets. In other words
 * take the offset value of every level and put them together starting
 * at the root.
 *
 * capPtr x  [rrrr rrrr rrrr rrrr rrrr|aaaa aaaa|bbbb]
 *           |<---------------------->|<------->|<-->|
 * bitlength            20                 8       4
 *
 *
 * In this case to address the CNode B we would get:
 *
 * dest:     [rrrr rrrr rrrr rrrr rrrr|aaaa aaaa]
 *           |<-------------------------------->|
 * depth:               20       +        8       = 28
 *
 * To address the slot where x is, we specify the offset as:
 *
 * offset:   [bbbb]
 *
 */

typedef struct _cspacepath_t {
    seL4_CPtr   capPtr;
    seL4_Word   capDepth;
    seL4_CNode  root;
    seL4_Word   dest;
    seL4_Word   destDepth;
    seL4_Word   offset;
    seL4_Word   window;
} cspacepath_t;

static inline void
cspacepath_swap(cspacepath_t *a, cspacepath_t *b)
{
    cspacepath_t tmp = *a;
    *a = *b;
    *b = tmp;
}

/// --------------------------- Debug --------------------------------
inline static void cspacepath_t_print(const cspacepath_t* src)
{
    (void)(src);
    CSPACEPATHPRINT("capPtr:     0x%" PRIxPTR "\n", src->capPtr);
    CSPACEPATHPRINT("capDepth:   0x%" PRIxPTR "\n", src->capDepth);
    CSPACEPATHPRINT("root:       0x%" PRIxPTR "\n", src->root);
    CSPACEPATHPRINT("dest:       0x%" PRIxPTR "\n", src->dest);
    CSPACEPATHPRINT("destDepth:  0x%" PRIxPTR "\n", src->destDepth);
    CSPACEPATHPRINT("offset:     0x%" PRIxPTR "\n", src->offset);
    CSPACEPATHPRINT("window:     0x%" PRIxPTR "\n", src->window);
}

