CHERIoT RTOS
A compartmentalised RTOS for CHERIoT hardware
Loading...
Searching...
No Matches
riscvreg.h
1// Copyright Microsoft and CHERIoT Contributors.
2// SPDX-License-Identifier: MIT
3
4#pragma once
5
6#include <stdint.h>
7
8#define GR_READ(name) \
9 ({ \
10 size_t val; \
11 __asm __volatile("mv %0, " #name : "=r"(val)); \
12 val; \
13 })
14
15#define GR_WRITE(name, val) \
16 ({ __asm __volatile("mv " #name ", %0" ::"r"(val)); })
17
18#define CSR_READ64(csr) \
19 ({ \
20 uint64_t val; \
21 uint32_t high, low; \
22 __asm __volatile("1: " \
23 "csrr t0, " #csr "h\n" \
24 "csrr %0, " #csr "\n" \
25 "csrr %1, " #csr "h\n" \
26 "bne t0, %1, 1b" \
27 : "=r"(low), "=r"(high) \
28 : \
29 : "t0"); \
30 val = (low | ((uint64_t)high << 32)); \
31 val; \
32 })
33
34// This hack reads the absolute integer address of a symbol.
35#define LA_ABS(symbol) \
36 ({ \
37 size_t val; \
38 __asm __volatile("lui %0, %%hi(" #symbol ")\n" \
39 "addi %0, %0, %%lo(" #symbol ")" \
40 : "=r"(val)); \
41 val; \
42 })
43
44#define BARRIER() __asm volatile("" : : : "memory")
45
46/**
47 * Read the cycle counter. Returns the number of cycles since boot as a 64-bit
48 * value.
49 */
50static inline uint64_t rdcycle64()
51{
52 return CSR_READ64(mcycle);
53}