|
From: <sv...@va...> - 2014-02-11 09:23:24
|
Author: florian
Date: Tue Feb 11 09:23:01 2014
New Revision: 2817
Log:
s390: Fix s390_amode_for_guest_state. In general the offset relative
to the guest state pointer may be more than the B12 addressing mode can
handle. Fall back and use a B20 addressing mode in those cases.
Modified:
trunk/priv/host_s390_defs.c
Modified: trunk/priv/host_s390_defs.c
==============================================================================
--- trunk/priv/host_s390_defs.c (original)
+++ trunk/priv/host_s390_defs.c Tue Feb 11 09:23:01 2014
@@ -273,13 +273,20 @@
}
-/* Construct an AMODE for accessing the guest state at OFFSET */
+/* Construct an AMODE for accessing the guest state at OFFSET.
+ OFFSET can be at most 3 * sizeof(VexGuestS390XState) + LibVEX_N_SPILL_BYTES
+ which may be too large for a B12 addressing mode.
+ Use a B20 amode as a fallback which will be safe for any offset.
+*/
s390_amode *
s390_amode_for_guest_state(Int offset)
{
if (fits_unsigned_12bit(offset))
return s390_amode_b12(offset, s390_hreg_guest_state_pointer());
+ if (fits_signed_20bit(offset))
+ return s390_amode_b20(offset, s390_hreg_guest_state_pointer());
+
vpanic("invalid guest state offset");
}
@@ -458,7 +465,6 @@
s390_amode *am;
vassert(offsetB >= 0);
- vassert(offsetB <= (1 << 12)); /* because we use b12 amode */
vassert(!hregIsVirtual(rreg));
*i1 = *i2 = NULL;
@@ -485,7 +491,6 @@
s390_amode *am;
vassert(offsetB >= 0);
- vassert(offsetB <= (1 << 12)); /* because we use b12 amode */
vassert(!hregIsVirtual(rreg));
*i1 = *i2 = NULL;
|