arch-arm,sim: fix argument handling for GuestAddr

Change-Id: If7bc759ee752333b717b61a6c577cf2d5846f4db
This commit is contained in:
Robert Hauser
2024-03-16 09:04:51 +00:00
parent bf63ec953a
commit e3fd3d7775

View File

@@ -61,7 +61,7 @@ template <typename ABI, typename Arg>
struct Argument<ABI, Arg,
typename std::enable_if_t<
std::is_base_of_v<ArmISA::RegABI32, ABI> &&
(std::is_integral_v<Arg> || std::is_same<Arg,GuestAddr>::value) &&
std::is_integral_v<Arg> &&
ABI::template IsWideV<Arg>>>
{
static Arg
@@ -74,8 +74,22 @@ struct Argument<ABI, Arg,
"Ran out of syscall argument registers.");
auto low = ABI::ArgumentRegs[state++];
auto high = ABI::ArgumentRegs[state++];
auto merge = ABI::mergeRegs(tc, low, high);
return *reinterpret_cast<Arg*>(&merge);
return (Arg) ABI::mergeRegs(tc, low, high);
}
};
template <>
struct Argument<ArmISA::RegABI32, GuestAddr>
{
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<GuestAddr*>(&arg);
}
};