|
From: <sv...@va...> - 2006-03-08 13:20:15
|
Author: sewardj
Date: 2006-03-08 13:20:09 +0000 (Wed, 08 Mar 2006)
New Revision: 5723
Log:
Reinstate the SET/GET_VBITS client requests.
Modified:
trunk/memcheck/mc_main.c
Modified: trunk/memcheck/mc_main.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/memcheck/mc_main.c 2006-03-08 03:54:37 UTC (rev 5722)
+++ trunk/memcheck/mc_main.c 2006-03-08 13:20:09 UTC (rev 5723)
@@ -1294,6 +1294,7 @@
isUnaddr, s );
break;
=20
+ case Vg_CoreClientReq: /* KLUDGE */
case Vg_CorePThread:
MAC_(record_core_mem_error)( tid, isUnaddr, s );
break;
@@ -2019,79 +2020,80 @@
}
=20
=20
-//zz /*------------------------------------------------------------*/
-//zz /*--- Metadata get/set functions, for client requests. ---*/
-//zz /*------------------------------------------------------------*/
-//zz=20
-//zz /* Copy Vbits for src into vbits. Returns: 1 =3D=3D OK, 2 =3D=3D al=
ignment
-//zz error, 3 =3D=3D addressing error. */
-//zz static Int mc_get_or_set_vbits_for_client (=20
-//zz ThreadId tid,
-//zz Addr dataV,=20
-//zz Addr vbitsV,=20
-//zz SizeT size,=20
-//zz Bool setting /* True <=3D> set vbits, False <=3D> get vbits */=20
-//zz )
-//zz {
-//zz Bool addressibleD =3D True;
-//zz Bool addressibleV =3D True;
-//zz UInt* data =3D (UInt*)dataV;
-//zz UInt* vbits =3D (UInt*)vbitsV;
-//zz SizeT szW =3D size / 4; /* sigh */
-//zz SizeT i;
-//zz UInt* dataP =3D NULL; /* bogus init to keep gcc happy */
-//zz UInt* vbitsP =3D NULL; /* ditto */
-//zz=20
-//zz /* Check alignment of args. */
-//zz if (!(VG_IS_4_ALIGNED(data) && VG_IS_4_ALIGNED(vbits)))
-//zz return 2;
-//zz if ((size & 3) !=3D 0)
-//zz return 2;
-//zz =20
-//zz /* Check that arrays are addressible. */
-//zz for (i =3D 0; i < szW; i++) {
-//zz dataP =3D &data[i];
-//zz vbitsP =3D &vbits[i];
-//zz if (get_abits4_ALIGNED((Addr)dataP) !=3D VGM_NIBBLE_VALID) {
-//zz addressibleD =3D False;
-//zz break;
-//zz }
-//zz if (get_abits4_ALIGNED((Addr)vbitsP) !=3D VGM_NIBBLE_VALID) {
-//zz addressibleV =3D False;
-//zz break;
-//zz }
-//zz }
-//zz if (!addressibleD) {
-//zz MAC_(record_address_error)( tid, (Addr)dataP, 4,=20
-//zz setting ? True : False );
-//zz return 3;
-//zz }
-//zz if (!addressibleV) {
-//zz MAC_(record_address_error)( tid, (Addr)vbitsP, 4,=20
-//zz setting ? False : True );
-//zz return 3;
-//zz }
-//zz =20
-//zz /* Do the copy */
-//zz if (setting) {
-//zz /* setting */
-//zz for (i =3D 0; i < szW; i++) {
-//zz if (get_vbytes4_ALIGNED( (Addr)&vbits[i] ) !=3D VGM_WORD_V=
ALID)
-//zz mc_record_value_error(tid, 4);
-//zz set_vbytes4_ALIGNED( (Addr)&data[i], vbits[i] );
-//zz }
-//zz } else {
-//zz /* getting */
-//zz for (i =3D 0; i < szW; i++) {
-//zz vbits[i] =3D get_vbytes4_ALIGNED( (Addr)&data[i] );
-//zz set_vbytes4_ALIGNED( (Addr)&vbits[i], VGM_WORD_VALID );
-//zz }
-//zz }
-//zz=20
-//zz return 1;
-//zz }
+/*------------------------------------------------------------*/
+/*--- Metadata get/set functions, for client requests. ---*/
+/*------------------------------------------------------------*/
=20
+/* Copy Vbits for src into vbits. Returns: 1 =3D=3D OK, 2 =3D=3D alignme=
nt
+ error [no longer used], 3 =3D=3D addressing error. */
+static Int mc_get_or_set_vbits_for_client (=20
+ ThreadId tid,
+ Addr dataV,=20
+ Addr vbitsV,=20
+ SizeT size,=20
+ Bool setting /* True <=3D> set vbits, False <=3D> get vbits */=20
+)
+{
+ Bool addressibleD =3D True;
+ Bool addressibleV =3D True;
+ UChar* data =3D (UChar*)dataV;
+ UChar* vbits =3D (UChar*)vbitsV;
+ UChar* dataP =3D NULL; /* bogus init to keep gcc happy */
+ UChar* vbitsP =3D NULL; /* ditto */
+ SizeT i;
=20
+ if (size < 0)
+ return 2;
+ =20
+ /* Check that arrays are addressible. */
+ for (i =3D 0; i < size; i++) {
+ dataP =3D &data[i];
+ vbitsP =3D &vbits[i];
+ if (get_abit((Addr)dataP) !=3D VGM_BIT_VALID) {
+ addressibleD =3D False;
+ break;
+ }
+ if (get_abit((Addr)vbitsP) !=3D VGM_BIT_VALID) {
+ addressibleV =3D False;
+ break;
+ }
+ }
+ if (!addressibleD) {
+ MAC_(record_address_error)( tid, (Addr)dataP, 1,=20
+ setting ? True : False );
+ return 3;
+ }
+ if (!addressibleV) {
+ MAC_(record_address_error)( tid, (Addr)vbitsP, 1,=20
+ setting ? False : True );
+ return 3;
+ }
+=20
+ /* Do the copy */
+ if (setting) {
+ /* setting */
+ mc_check_is_readable(Vg_CoreClientReq, tid, "SET_VBITS(vbits)",
+ (Addr)vbits, size);
+ for (i =3D 0; i < size; i++) {
+ set_vbyte( (Addr)&data[i], vbits[i] );
+ }
+ } else {
+ /* getting */
+ for (i =3D 0; i < size; i++) {
+ UWord abit, vbyte;
+ get_abit_and_vbyte(&abit, &vbyte, (Addr)&data[i]);
+ /* above checks should ensure this */
+ tl_assert(abit =3D=3D VGM_BIT_VALID);
+ vbits[i] =3D (UChar)vbyte;
+ }
+ // The bytes in vbits[] have now been set, so mark them as such.
+ mc_make_readable((Addr)vbits, size);
+ }
+
+ return 1;
+}
+
+
/*------------------------------------------------------------*/
/*--- Detecting leaked (unreachable) malloc'd blocks. ---*/
/*------------------------------------------------------------*/
@@ -2545,22 +2547,22 @@
}
break;
=20
-//zz case VG_USERREQ__GET_VBITS:
-//zz /* Returns: 1 =3D=3D OK, 2 =3D=3D alignment error, 3 =3D=3D=
addressing
-//zz error. */
-//zz /* VG_(printf)("get_vbits %p %p %d\n", arg[1], arg[2], arg=
[3] ); */
-//zz *ret =3D mc_get_or_set_vbits_for_client
-//zz ( tid, arg[1], arg[2], arg[3], False /* get them=
*/ );
-//zz break;
-//zz=20
-//zz case VG_USERREQ__SET_VBITS:
-//zz /* Returns: 1 =3D=3D OK, 2 =3D=3D alignment error, 3 =3D=3D=
addressing
-//zz error. */
-//zz /* VG_(printf)("set_vbits %p %p %d\n", arg[1], arg[2], arg=
[3] ); */
-//zz *ret =3D mc_get_or_set_vbits_for_client
-//zz ( tid, arg[1], arg[2], arg[3], True /* set them =
*/ );
-//zz break;
+ case VG_USERREQ__GET_VBITS:
+ /* Returns: 1 =3D=3D OK, 2 =3D=3D alignment error, 3 =3D=3D add=
ressing
+ error. */
+ /* VG_(printf)("get_vbits %p %p %d\n", arg[1], arg[2], arg[3] )=
; */
+ *ret =3D mc_get_or_set_vbits_for_client
+ ( tid, arg[1], arg[2], arg[3], False /* get them */ )=
;
+ break;
=20
+ case VG_USERREQ__SET_VBITS:
+ /* Returns: 1 =3D=3D OK, 2 =3D=3D alignment error, 3 =3D=3D add=
ressing
+ error. */
+ /* VG_(printf)("set_vbits %p %p %d\n", arg[1], arg[2], arg[3] )=
; */
+ *ret =3D mc_get_or_set_vbits_for_client
+ ( tid, arg[1], arg[2], arg[3], True /* set them */ );
+ break;
+
default:
if (MAC_(handle_common_client_requests)(tid, arg, ret )) {
return True;
|