| From | Joey Gouly <> | Subject | [RFC kvm-unit-tests 24/27] arm: realm: Add helpers to decode RSI return codes | Date | Fri, 27 Jan 2023 11:41:05 +0000 |
| |
From: Suzuki K Poulose <suzuki.poulose@arm.com>
RMM encodes error code and index in the result of an operation. Add helpers to decode this information for use with the attestation tests.
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com> Signed-off-by: Joey Gouly <joey.gouly@arm.com> --- lib/arm64/asm/rsi.h | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+)
diff --git a/lib/arm64/asm/rsi.h b/lib/arm64/asm/rsi.h index 50bab993..1d01a929 100644 --- a/lib/arm64/asm/rsi.h +++ b/lib/arm64/asm/rsi.h @@ -16,6 +16,39 @@ extern bool rsi_present; +/* + * Logical representation of return code returned by RMM commands. + * Each failure mode of a given command should return a unique return code, so + * that the caller can use it to unambiguously identify the failure mode. To + * avoid having a very large list of enumerated values, the return code is + * composed of a status which identifies the category of the error (for example, + * an address was misaligned), and an index which disambiguates between multiple + * similar failure modes (for example, a command may take multiple addresses as + * its input; the index identifies _which_ of them was misaligned.) + */ +typedef unsigned int status_t; +typedef struct { + status_t status; + unsigned int index; +} return_code_t; + +/* + * Convenience function for creating a return_code_t. + */ +static inline return_code_t make_return_code(unsigned int status, + unsigned int index) +{ + return (return_code_t) {status, index}; +} + +/* + * Unpacks a return code. + */ +static inline return_code_t unpack_return_code(unsigned long error_code) +{ + return make_return_code(error_code & 0xff, error_code >> 8); +} + void arm_rsi_init(void); int rsi_invoke(unsigned int function_id, unsigned long arg0, -- 2.17.1
|