blob: 066323e4d6577d03b00f9c7141ec39d051eadded [file] [log] [blame]
#include <cheri.hh>
namespace
{
/**
* Read the cycle counter.
*/
int rdcycle()
{
int cycles;
#ifdef SAIL
// On Sail, report the number of instructions, the cycle count is
// meaningless.
__asm__ volatile("csrr %0, minstret" : "=r"(cycles));
#elifdef IBEX
// CHERIoT-Ibex does not yet implement rdcycle, so read the CSR
// directly.
__asm__ volatile("csrr %0, mcycle" : "=r"(cycles));
#else
__asm__ volatile("rdcycle %0" : "=r"(cycles));
#endif
return cycles;
}
/**
* Utility function to return the size of the current stack based on the
* length of csp capability register. If used in a thread entry point this
* will return the full length of the current stack, but if used after a
* compartment call csp is restricted to the part of the stack that is not
* in use by calling compartment(s), so the length will be smaller.
*/
size_t get_stack_size()
{
register void *cspRegister asm("csp");
asm("" : "=C"(cspRegister));
CHERI::Capability stack{cspRegister};
return stack.length();
}
void use_stack(size_t s)
{
volatile uint8_t stack_array[s];
stack_array[0] = 1;
}
void check_stack_zeroed()
{
register void **cspRegister asm("csp");
asm("" : "=C"(cspRegister));
CHERI::Capability stack{cspRegister};
CHERI::Capability<void*> stackP{stack};
stackP.address() = stack.base();
while(stackP.address() < stack.address())
{
CHERI::Capability<void> value{*stackP};
if (value != NULL)
{
__builtin_trap();
}
stackP += 1;
}
}
} // namespace