blob: 542934137d818456be099fb403bf89be1b5b8b4b [file] [log] [blame]
// Copyright Microsoft and CHERIoT Contributors.
// SPDX-License-Identifier: MIT
#pragma once
#include <stdint.h>
#define GR_READ(name) \
({ \
size_t val; \
__asm __volatile("mv %0, " #name : "=r"(val)); \
val; \
})
#define GR_WRITE(name, val) \
({ __asm __volatile("mv " #name ", %0" ::"r"(val)); })
#define CSR_READ64(csr) \
({ \
uint64_t val; \
uint32_t high, low; \
__asm __volatile("1: " \
"csrr t0, " #csr "h\n" \
"csrr %0, " #csr "\n" \
"csrr %1, " #csr "h\n" \
"bne t0, %1, 1b" \
: "=r"(low), "=r"(high) \
: \
: "t0"); \
val = (low | ((uint64_t)high << 32)); \
val; \
})
// This hack reads the absolute integer address of a symbol.
#define LA_ABS(symbol) \
({ \
size_t val; \
__asm __volatile("lui %0, %%hi(" #symbol ")\n" \
"addi %0, %0, %%lo(" #symbol ")" \
: "=r"(val)); \
val; \
})
#define BARRIER() __asm volatile("" : : : "memory")
/**
* Read the cycle counter. Returns the number of cycles since boot as a 64-bit
* value.
*/
static inline uint64_t rdcycle64()
{
return CSR_READ64(mcycle);
}