@@ -1609,15 +1609,42 @@ static ssize_t get_sigframe_size(SupportedArch arch) {
16091609 }
16101610}
16111611
1612- static remote_code_ptr get_sigframe_ip (RecordTask *t, remote_ptr<ARM64Arch::rt_sigframe> frame_ptr)
1612+ template <typename Arch>
1613+ static remote_ptr<typename Arch::unsigned_long> get_sigframe_ip_ptr (remote_ptr<typename Arch::rt_sigframe> frame_ptr);
1614+
1615+ template <>
1616+ remote_ptr<ARM64Arch::unsigned_long> get_sigframe_ip_ptr<ARM64Arch>(remote_ptr<ARM64Arch::rt_sigframe> frame_ptr) {
1617+ return REMOTE_PTR_FIELD (REMOTE_PTR_FIELD (REMOTE_PTR_FIELD (REMOTE_PTR_FIELD (frame_ptr, uc), uc_mcontext), regs), pc);
1618+ }
1619+
1620+ template <>
1621+ remote_ptr<X86Arch::unsigned_long> get_sigframe_ip_ptr<X86Arch>(remote_ptr<X86Arch::rt_sigframe> frame_ptr) {
1622+ return REMOTE_PTR_FIELD (REMOTE_PTR_FIELD (REMOTE_PTR_FIELD (frame_ptr, uc), uc_mcontext), ip);
1623+ }
1624+
1625+ template <>
1626+ remote_ptr<X64Arch::unsigned_long> get_sigframe_ip_ptr<X64Arch>(remote_ptr<X64Arch::rt_sigframe> frame_ptr) {
1627+ return REMOTE_PTR_FIELD (REMOTE_PTR_FIELD (REMOTE_PTR_FIELD (frame_ptr, uc), uc_mcontext), ip);
1628+ }
1629+
1630+ template <typename Arch>
1631+ static remote_code_ptr get_sigframe_ip_arch (RecordTask *t, remote_ptr<typename Arch::rt_sigframe> frame_ptr)
16131632{
1614- return t->read_mem (REMOTE_PTR_FIELD (REMOTE_PTR_FIELD (REMOTE_PTR_FIELD (REMOTE_PTR_FIELD (frame_ptr, uc), uc_mcontext), regs), pc));
1633+ return t->read_mem (get_sigframe_ip_ptr<Arch>(frame_ptr));
1634+ }
1635+
1636+ static remote_code_ptr get_sigframe_ip (RecordTask *t, remote_ptr<void > frame_ptr) {
1637+ RR_ARCH_FUNCTION (get_sigframe_ip_arch, t->arch (), t, frame_ptr.as_int ());
16151638}
16161639
1617- static void set_sigframe_ip (RecordTask *t, remote_ptr<ARM64Arch::rt_sigframe> frame_ptr, remote_code_ptr ip)
1640+ template <typename Arch>
1641+ static void set_sigframe_ip_arch (RecordTask *t, remote_ptr<typename Arch::rt_sigframe> frame_ptr, remote_code_ptr ip)
16181642{
1619- t->write_mem (REMOTE_PTR_FIELD (REMOTE_PTR_FIELD (REMOTE_PTR_FIELD (REMOTE_PTR_FIELD (frame_ptr, uc), uc_mcontext), regs), pc),
1620- ip.register_value ());
1643+ t->write_mem (get_sigframe_ip_ptr<Arch>(frame_ptr), (typename Arch::unsigned_long)ip.register_value ());
1644+ }
1645+
1646+ static void set_sigframe_ip (RecordTask *t, remote_ptr<void > frame_ptr, remote_code_ptr ip) {
1647+ RR_ARCH_FUNCTION (set_sigframe_ip_arch, t->arch (), t, frame_ptr.as_int (), ip);
16211648}
16221649
16231650/* *
0 commit comments