diff --git a/src/arch/arm/reg_abi.hh b/src/arch/arm/reg_abi.hh index 6bdc8b36c1..ca349283e2 100644 --- a/src/arch/arm/reg_abi.hh +++ b/src/arch/arm/reg_abi.hh @@ -61,7 +61,7 @@ template struct Argument && - (std::is_integral_v || std::is_same::value) && + std::is_integral_v && ABI::template IsWideV>> { static Arg @@ -74,8 +74,22 @@ struct Argument(&merge); + return (Arg) ABI::mergeRegs(tc, low, high); + } +}; + +template <> +struct Argument +{ + using ABI = ArmISA::RegABI32; + + static GuestAddr + get(ThreadContext *tc, typename ABI::State &state) + { + panic_if(state + 1 >= ABI::ArgumentRegs.size(), + "Ran out of syscall argument registers."); + auto arg = bits(tc->getReg(ABI::ArgumentRegs[state++]), 31, 0); + return *reinterpret_cast(&arg); } };