| // Copyright Microsoft and CHERIoT Contributors. |
| // SPDX-License-Identifier: MIT |
| |
| /// Load the absolute address of a symbol. |
| .macro la_abs reg, symbol |
| lui \reg, %hi(\symbol) |
| addi \reg, \reg, %lo(\symbol) |
| .endm |
| |
| /** |
| * Helper macro for zeroing a single register. |
| * Use c.li to guarantee it's 2 bytes and in the base ISA. |
| */ |
| .macro zeroOne reg |
| c.li \reg, 0 |
| .endm |
| |
| /** |
| * Helper macro for applying a macro to each argument in a list. Calls `m` |
| * once for each subsequent argument. |
| */ |
| .macro forall m rhead rtail:vararg |
| \m \rhead |
| .ifnb \rtail |
| forall \m \rtail |
| .endif |
| .endm |
| |
| /// Zero all of the registers in a list |
| .macro zeroRegisters reg1, regs:vararg |
| forall zeroOne, \reg1, \regs |
| .endm |
| |
| /** |
| * Helper that sets a symbol based on a register name to 1. Used for macros |
| * that operate over all registers *except* a set. |
| */ |
| .macro setValueForRegName reg |
| .set __use_reg\reg, 1 |
| .endm |
| |
| /** |
| * Helper that sets a symbol based on a register name to 0. Used for macros |
| * that operate over all registers *except* a set. |
| */ |
| .macro clearValueForRegName reg |
| .set __use_reg\reg, 0 |
| .endm |
| |
| /** |
| * Zeroes a register if it is in a set that has had `setValueForRegName` called |
| * with the same counter and regname values. |
| */ |
| .macro zeroIfIncluded reg |
| .ifgt __use_reg\reg |
| zeroOne \reg |
| .endif |
| .endm |
| |
| /** |
| * Zero all registers *except* those provided as arguments. |
| * Note that this macro defines a bunch of __use_reg symbols to make it work. |
| */ |
| .macro zeroAllRegistersExcept regs:vararg |
| // XXX: There must be a way to not write the list twice in pure assembly. |
| forall setValueForRegName ra, sp, gp, tp, t0, t1, t2, s0, s1, a0, a1, a2, a3, a4, a5 |
| forall clearValueForRegName \regs |
| forall zeroIfIncluded ra, sp, gp, tp, t0, t1, t2, s0, s1, a0, a1, a2, a3, a4, a5 |
| .endm |
| |
| /** |
| * Load a capability in PCC from the specified symbol into the specified |
| * register. |
| */ |
| .macro LoadCapPCC register symbol |
| 1: |
| auipcc \register, %cheriot_compartment_hi(\symbol) |
| clc \register, %cheriot_compartment_lo_i(1b)(\register) |
| .endm |
| |
| /** |
| * Load a capability in CGP from the specified symbol into the specified |
| * register. |
| */ |
| .macro LoadCapCGP register symbol |
| 1: |
| auicgp \register, %cheriot_compartment_hi(\symbol) |
| clc \register, %cheriot_compartment_lo_i(1b)(\register) |
| .endm |