1*f5478dedSAntonio Nino Diaz /* 2*f5478dedSAntonio Nino Diaz * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. 3*f5478dedSAntonio Nino Diaz * 4*f5478dedSAntonio Nino Diaz * SPDX-License-Identifier: BSD-3-Clause 5*f5478dedSAntonio Nino Diaz */ 6*f5478dedSAntonio Nino Diaz 7*f5478dedSAntonio Nino Diaz #ifndef SMCCC_HELPERS_H 8*f5478dedSAntonio Nino Diaz #define SMCCC_HELPERS_H 9*f5478dedSAntonio Nino Diaz 10*f5478dedSAntonio Nino Diaz #include <smccc.h> 11*f5478dedSAntonio Nino Diaz 12*f5478dedSAntonio Nino Diaz #ifndef __ASSEMBLY__ 13*f5478dedSAntonio Nino Diaz #include <context.h> 14*f5478dedSAntonio Nino Diaz #include <stdbool.h> 15*f5478dedSAntonio Nino Diaz 16*f5478dedSAntonio Nino Diaz /* Convenience macros to return from SMC handler */ 17*f5478dedSAntonio Nino Diaz #define SMC_RET0(_h) { \ 18*f5478dedSAntonio Nino Diaz return (uint64_t) (_h); \ 19*f5478dedSAntonio Nino Diaz } 20*f5478dedSAntonio Nino Diaz #define SMC_RET1(_h, _x0) { \ 21*f5478dedSAntonio Nino Diaz write_ctx_reg((get_gpregs_ctx(_h)), (CTX_GPREG_X0), (_x0)); \ 22*f5478dedSAntonio Nino Diaz SMC_RET0(_h); \ 23*f5478dedSAntonio Nino Diaz } 24*f5478dedSAntonio Nino Diaz #define SMC_RET2(_h, _x0, _x1) { \ 25*f5478dedSAntonio Nino Diaz write_ctx_reg((get_gpregs_ctx(_h)), (CTX_GPREG_X1), (_x1)); \ 26*f5478dedSAntonio Nino Diaz SMC_RET1(_h, (_x0)); \ 27*f5478dedSAntonio Nino Diaz } 28*f5478dedSAntonio Nino Diaz #define SMC_RET3(_h, _x0, _x1, _x2) { \ 29*f5478dedSAntonio Nino Diaz write_ctx_reg((get_gpregs_ctx(_h)), (CTX_GPREG_X2), (_x2)); \ 30*f5478dedSAntonio Nino Diaz SMC_RET2(_h, (_x0), (_x1)); \ 31*f5478dedSAntonio Nino Diaz } 32*f5478dedSAntonio Nino Diaz #define SMC_RET4(_h, _x0, _x1, _x2, _x3) { \ 33*f5478dedSAntonio Nino Diaz write_ctx_reg((get_gpregs_ctx(_h)), (CTX_GPREG_X3), (_x3)); \ 34*f5478dedSAntonio Nino Diaz SMC_RET3(_h, (_x0), (_x1), (_x2)); \ 35*f5478dedSAntonio Nino Diaz } 36*f5478dedSAntonio Nino Diaz #define SMC_RET5(_h, _x0, _x1, _x2, _x3, _x4) { \ 37*f5478dedSAntonio Nino Diaz write_ctx_reg((get_gpregs_ctx(_h)), (CTX_GPREG_X4), (_x4)); \ 38*f5478dedSAntonio Nino Diaz SMC_RET4(_h, (_x0), (_x1), (_x2), (_x3)); \ 39*f5478dedSAntonio Nino Diaz } 40*f5478dedSAntonio Nino Diaz #define SMC_RET6(_h, _x0, _x1, _x2, _x3, _x4, _x5) { \ 41*f5478dedSAntonio Nino Diaz write_ctx_reg((get_gpregs_ctx(_h)), (CTX_GPREG_X5), (_x5)); \ 42*f5478dedSAntonio Nino Diaz SMC_RET5(_h, (_x0), (_x1), (_x2), (_x3), (_x4)); \ 43*f5478dedSAntonio Nino Diaz } 44*f5478dedSAntonio Nino Diaz #define SMC_RET7(_h, _x0, _x1, _x2, _x3, _x4, _x5, _x6) { \ 45*f5478dedSAntonio Nino Diaz write_ctx_reg((get_gpregs_ctx(_h)), (CTX_GPREG_X6), (_x6)); \ 46*f5478dedSAntonio Nino Diaz SMC_RET6(_h, (_x0), (_x1), (_x2), (_x3), (_x4), (_x5)); \ 47*f5478dedSAntonio Nino Diaz } 48*f5478dedSAntonio Nino Diaz #define SMC_RET8(_h, _x0, _x1, _x2, _x3, _x4, _x5, _x6, _x7) { \ 49*f5478dedSAntonio Nino Diaz write_ctx_reg((get_gpregs_ctx(_h)), (CTX_GPREG_X7), (_x7)); \ 50*f5478dedSAntonio Nino Diaz SMC_RET7(_h, (_x0), (_x1), (_x2), (_x3), (_x4), (_x5), (_x6)); \ 51*f5478dedSAntonio Nino Diaz } 52*f5478dedSAntonio Nino Diaz 53*f5478dedSAntonio Nino Diaz /* 54*f5478dedSAntonio Nino Diaz * Convenience macros to access general purpose registers using handle provided 55*f5478dedSAntonio Nino Diaz * to SMC handler. These take the offset values defined in context.h 56*f5478dedSAntonio Nino Diaz */ 57*f5478dedSAntonio Nino Diaz #define SMC_GET_GP(_h, _g) \ 58*f5478dedSAntonio Nino Diaz read_ctx_reg((get_gpregs_ctx(_h)), (_g)) 59*f5478dedSAntonio Nino Diaz #define SMC_SET_GP(_h, _g, _v) \ 60*f5478dedSAntonio Nino Diaz write_ctx_reg((get_gpregs_ctx(_h)), (_g), (_v)) 61*f5478dedSAntonio Nino Diaz 62*f5478dedSAntonio Nino Diaz /* 63*f5478dedSAntonio Nino Diaz * Convenience macros to access EL3 context registers using handle provided to 64*f5478dedSAntonio Nino Diaz * SMC handler. These take the offset values defined in context.h 65*f5478dedSAntonio Nino Diaz */ 66*f5478dedSAntonio Nino Diaz #define SMC_GET_EL3(_h, _e) \ 67*f5478dedSAntonio Nino Diaz read_ctx_reg((get_el3state_ctx(_h)), (_e)) 68*f5478dedSAntonio Nino Diaz #define SMC_SET_EL3(_h, _e, _v) \ 69*f5478dedSAntonio Nino Diaz write_ctx_reg((get_el3state_ctx(_h)), (_e), (_v)) 70*f5478dedSAntonio Nino Diaz 71*f5478dedSAntonio Nino Diaz /* 72*f5478dedSAntonio Nino Diaz * Helper macro to retrieve the SMC parameters from cpu_context_t. 73*f5478dedSAntonio Nino Diaz */ 74*f5478dedSAntonio Nino Diaz #define get_smc_params_from_ctx(_hdl, _x1, _x2, _x3, _x4) \ 75*f5478dedSAntonio Nino Diaz do { \ 76*f5478dedSAntonio Nino Diaz const gp_regs_t *regs = get_gpregs_ctx(_hdl); \ 77*f5478dedSAntonio Nino Diaz _x1 = read_ctx_reg(regs, CTX_GPREG_X1); \ 78*f5478dedSAntonio Nino Diaz _x2 = read_ctx_reg(regs, CTX_GPREG_X2); \ 79*f5478dedSAntonio Nino Diaz _x3 = read_ctx_reg(regs, CTX_GPREG_X3); \ 80*f5478dedSAntonio Nino Diaz _x4 = read_ctx_reg(regs, CTX_GPREG_X4); \ 81*f5478dedSAntonio Nino Diaz } while (false) 82*f5478dedSAntonio Nino Diaz 83*f5478dedSAntonio Nino Diaz #endif /*__ASSEMBLY__*/ 84*f5478dedSAntonio Nino Diaz 85*f5478dedSAntonio Nino Diaz #endif /* SMCCC_HELPERS_H */ 86