|  | // 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); | 
|  | } |