Added some functions for skins to access shadow registers:
VG_(get_shadow_archreg), VG_(set_shadow_archreg), VG_(shadow_archreg_address).
Curiously, the only way skins could previously access them was with
VG_(shadow_reg_offset), which wasn't very flexible.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@1412 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/vg_from_ucode.c b/coregrind/vg_from_ucode.c
index 4ec5703..c9c7f9f 100644
--- a/coregrind/vg_from_ucode.c
+++ b/coregrind/vg_from_ucode.c
@@ -2704,22 +2704,27 @@
}
}
+/* Return the baseBlock index for the specified shadow register */
+Int shadow_reg_index ( Int arch )
+{
+ switch (arch) {
+ case R_EAX: return VGOFF_(sh_eax);
+ case R_ECX: return VGOFF_(sh_ecx);
+ case R_EDX: return VGOFF_(sh_edx);
+ case R_EBX: return VGOFF_(sh_ebx);
+ case R_ESP: return VGOFF_(sh_esp);
+ case R_EBP: return VGOFF_(sh_ebp);
+ case R_ESI: return VGOFF_(sh_esi);
+ case R_EDI: return VGOFF_(sh_edi);
+ default: VG_(core_panic)( "shadow_reg_index");
+ }
+}
/* Return the byte offset from %ebp (ie, into baseBlock)
for the specified shadow register */
Int VG_(shadow_reg_offset) ( Int arch )
{
- switch (arch) {
- case R_EAX: return 4 * VGOFF_(sh_eax);
- case R_ECX: return 4 * VGOFF_(sh_ecx);
- case R_EDX: return 4 * VGOFF_(sh_edx);
- case R_EBX: return 4 * VGOFF_(sh_ebx);
- case R_ESP: return 4 * VGOFF_(sh_esp);
- case R_EBP: return 4 * VGOFF_(sh_ebp);
- case R_ESI: return 4 * VGOFF_(sh_esi);
- case R_EDI: return 4 * VGOFF_(sh_edi);
- default: VG_(core_panic)( "shadowOffset");
- }
+ return 4 * shadow_reg_index ( arch );
}
Int VG_(shadow_flags_offset) ( void )
@@ -2727,6 +2732,21 @@
return 4 * VGOFF_(sh_eflags);
}
+/* Accessing shadow arch. registers */
+UInt VG_(get_shadow_archreg) ( UInt archreg )
+{
+ return VG_(baseBlock)[ shadow_reg_index(archreg) ];
+}
+
+void VG_(set_shadow_archreg) ( UInt archreg, UInt val )
+{
+ VG_(baseBlock)[ shadow_reg_index(archreg) ] = val;
+}
+
+Addr VG_(shadow_archreg_address) ( UInt archreg )
+{
+ return (Addr) & VG_(baseBlock)[ shadow_reg_index(archreg) ];
+}
static void synth_WIDEN_signed ( Int sz_src, Int sz_dst, Int reg )