blob: 16367ac1d1a0e2008e566eb87ce765d0d9ae1866 [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 <assert.h>
#include <stdint.h>
#include <utils/util.h>
#include <vspace/page.h>
#include <sel4utils/arch/util.h>
#include <sel4utils/sel4_zf_logif.h>
#include <sel4utils/strerror.h>
/* Number of words in 64bits */
#define SEL4UTILS_64_WORDS (sizeof(uint64_t) / sizeof(seL4_Word))
/*
* Get a 64bit value from the ipc buffer, starting from offset.
* Assumes the low bits are in the first register and so on.
*
* @param offset the offser in the ipc buffer to start reading MRs at.
* @return the 64bit value read from the ipc buffer.
*/
static inline uint64_t sel4utils_64_get_mr(seL4_Word offset)
{
uint64_t result = seL4_GetMR(offset);
if (SEL4UTILS_64_WORDS == 2) {
result += (((uint64_t) seL4_GetMR(offset + 1)) << 32llu);
}
return result;
}
/*
* Set the correct MRs for a 64bit value. SEL4UTILS_WORDS_IN_64 MRs will be used.
*
* @param offset offset in the IPC buffer to start setting MRs at.
* @param value the value to set
*/
static inline void sel4utils_64_set_mr(seL4_Word offset, uint64_t value)
{
seL4_SetMR(offset, (seL4_Word) value);
if (SEL4UTILS_64_WORDS == 2) {
seL4_SetMR(offset + 1, (seL4_Word)(value >> 32llu));
}
assert(sel4utils_64_get_mr(offset) == value);
}