xref: /qemu/target/arm/common-semi-target.h (revision caa75cc56e36b93553e19d74ab9e887cfd0ead20)
11b3b7693SRichard Henderson /*
21b3b7693SRichard Henderson  * Target-specific parts of semihosting/arm-compat-semi.c.
31b3b7693SRichard Henderson  *
41b3b7693SRichard Henderson  * Copyright (c) 2005, 2007 CodeSourcery.
51b3b7693SRichard Henderson  * Copyright (c) 2019, 2022 Linaro
61b3b7693SRichard Henderson  *
71b3b7693SRichard Henderson  * SPDX-License-Identifier: GPL-2.0-or-later
81b3b7693SRichard Henderson  */
91b3b7693SRichard Henderson 
101b3b7693SRichard Henderson #ifndef TARGET_ARM_COMMON_SEMI_TARGET_H
111b3b7693SRichard Henderson #define TARGET_ARM_COMMON_SEMI_TARGET_H
121b3b7693SRichard Henderson 
13*30722e04SPeter Maydell #include "target/arm/cpu-qom.h"
141b3b7693SRichard Henderson 
common_semi_arg(CPUState * cs,int argno)151b3b7693SRichard Henderson static inline target_ulong common_semi_arg(CPUState *cs, int argno)
161b3b7693SRichard Henderson {
171b3b7693SRichard Henderson     ARMCPU *cpu = ARM_CPU(cs);
181b3b7693SRichard Henderson     CPUARMState *env = &cpu->env;
191b3b7693SRichard Henderson     if (is_a64(env)) {
201b3b7693SRichard Henderson         return env->xregs[argno];
211b3b7693SRichard Henderson     } else {
221b3b7693SRichard Henderson         return env->regs[argno];
231b3b7693SRichard Henderson     }
241b3b7693SRichard Henderson }
251b3b7693SRichard Henderson 
common_semi_set_ret(CPUState * cs,target_ulong ret)261b3b7693SRichard Henderson static inline void common_semi_set_ret(CPUState *cs, target_ulong ret)
271b3b7693SRichard Henderson {
281b3b7693SRichard Henderson     ARMCPU *cpu = ARM_CPU(cs);
291b3b7693SRichard Henderson     CPUARMState *env = &cpu->env;
301b3b7693SRichard Henderson     if (is_a64(env)) {
311b3b7693SRichard Henderson         env->xregs[0] = ret;
321b3b7693SRichard Henderson     } else {
331b3b7693SRichard Henderson         env->regs[0] = ret;
341b3b7693SRichard Henderson     }
351b3b7693SRichard Henderson }
361b3b7693SRichard Henderson 
common_semi_sys_exit_extended(CPUState * cs,int nr)371b3b7693SRichard Henderson static inline bool common_semi_sys_exit_extended(CPUState *cs, int nr)
381b3b7693SRichard Henderson {
39b77af26eSRichard Henderson     return nr == TARGET_SYS_EXIT_EXTENDED || is_a64(cpu_env(cs));
401b3b7693SRichard Henderson }
411b3b7693SRichard Henderson 
is_64bit_semihosting(CPUArchState * env)421b3b7693SRichard Henderson static inline bool is_64bit_semihosting(CPUArchState *env)
431b3b7693SRichard Henderson {
441b3b7693SRichard Henderson     return is_a64(env);
451b3b7693SRichard Henderson }
461b3b7693SRichard Henderson 
common_semi_stack_bottom(CPUState * cs)471b3b7693SRichard Henderson static inline target_ulong common_semi_stack_bottom(CPUState *cs)
481b3b7693SRichard Henderson {
491b3b7693SRichard Henderson     ARMCPU *cpu = ARM_CPU(cs);
501b3b7693SRichard Henderson     CPUARMState *env = &cpu->env;
511b3b7693SRichard Henderson     return is_a64(env) ? env->xregs[31] : env->regs[13];
521b3b7693SRichard Henderson }
531b3b7693SRichard Henderson 
common_semi_has_synccache(CPUArchState * env)541b3b7693SRichard Henderson static inline bool common_semi_has_synccache(CPUArchState *env)
551b3b7693SRichard Henderson {
561b3b7693SRichard Henderson     /* Ok for A64, invalid for A32/T32 */
571b3b7693SRichard Henderson     return is_a64(env);
581b3b7693SRichard Henderson }
591b3b7693SRichard Henderson 
601b3b7693SRichard Henderson #endif
61