PERFORCE change 169620 for review
Stanislav Sedov
stas at FreeBSD.org
Tue Oct 20 17:11:04 UTC 2009
http://p4web.freebsd.org/chv.cgi?CH=169620
Change 169620 by stas at stas_yandex on 2009/10/20 17:10:59
- Use "standard" vmmap sysctls instead of compatible one. This allows to
avoid the dependency on COMPAT_6 and get rid of hand-crufted 32-bit
conversion stuff.
Reported by: Robert Jenssen <robertjenssen at ozemail.com.au>
Affected files ...
.. //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-linux.c#8 edit
.. //depot/projects/valgrind/include/vki/vki-freebsd.h#20 edit
Differences ...
==== //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-linux.c#8 (text+ko) ====
@@ -3527,67 +3527,6 @@
/* static ... to keep it out of the stack frame. */
static Char procmap_buf[M_PROCMAP_BUF];
- #if defined(VGP_x86_freebsd)
- static Bool test_is32on64(void)
- {
- Int oid[2];
- vki_size_t len;
- char machbuf[32];
- static Int is32on64 = -1;
- SysRes sres;
-
- if (is32on64 == -1) {
- oid[0] = VKI_CTL_HW;
- oid[1] = VKI_HW_MACHINE;
- len = sizeof(machbuf);
- sres = VG_(do_syscall6)(__NR___sysctl, (UWord)oid, 2, (UWord)machbuf, (UWord)&len
-, 0, 0);
- if (!sr_isError(sres)) {
- machbuf[31] = '\0';
- if (VG_(strcmp)(machbuf, "amd64") == 0)
- is32on64 = 1;
- else
- is32on64 = 0;
- } else {
- is32on64 = -2;
- }
- }
- if (is32on64 == 1) {
- return True;
- } else {
- return False;
- }
- }
-
- static void fix_32on64(vki_size_t *len)
- {
- struct vki_kinfo_vmentry_32on64 *kve64, t;
- struct vki_kinfo_vmentry *kve32;
- Int i;
-
- aspacem_assert(sizeof(struct vki_kinfo_vmentry) < sizeof(struct vki_kinfo_vmentry_32on64));
- kve64 = (struct vki_kinfo_vmentry_32on64 *)procmap_buf;
- kve32 = (struct vki_kinfo_vmentry *)procmap_buf;
- aspacem_assert(sizeof(kve32->kve_path) == sizeof(kve64->kve_path));
- for (i = 0; i < *len / sizeof(struct vki_kinfo_vmentry_32on64); i++, kve32++, kve64++
-) {
- t = *kve64;
- aspacem_assert(t.kve_start < 0x100000000ull);
- aspacem_assert(t.kve_end < 0x100000000ull);
- aspacem_assert(t.kve_structsize == sizeof(struct vki_kinfo_vmentry_32on64));
- kve32->kve_structsize = sizeof(struct vki_kinfo_vmentry);
- kve32->kve_start = (void *)(UWord)t.kve_start;
- kve32->kve_end = (void *)(UWord)t.kve_end;
- kve32->kve_protection = t.kve_protection;
- VG_(memcpy)(kve32->kve_path, t.kve_path, sizeof(t.kve_path));
- kve32->kve_offset = t.kve_offset;
- kve32->kve_fsid = t.kve_fsid;
- kve32->kve_fileid = t.kve_fileid;
- }
- *len = *len * sizeof(struct vki_kinfo_vmentry) / sizeof(struct vki_kinfo_vmentry_32on64);
- }
- #endif
-
static void parse_procselfmaps (
void (*record_mapping)( Addr addr, SizeT len, UInt prot,
ULong dev, ULong ino, Off64T offset,
@@ -3598,6 +3537,7 @@
Int i;
Addr start, endPlusOne, gapStart;
UChar* filename;
+ char *p;
UInt prot;
ULong foffset, dev, ino;
struct vki_kinfo_vmentry *kve;
@@ -3616,22 +3556,14 @@
sres = VG_(do_syscall6)(__NR___sysctl, (UWord)oid, 4, (UWord)procmap_buf,
(UWord)&len, 0, 0);
if (sr_isError(sres)) {
- VG_(debugLog)(0, "procselfmaps", "sysctl %ld\n", sr_Err(sres));
+ VG_(debugLog)(0, "procselfmaps", "sysctll %ld\n", sr_Err(sres));
ML_(am_exit)(1);
}
- #if defined(VGP_x86_freebsd)
- if (test_is32on64())
- fix_32on64(&len);
- #endif
-
gapStart = Addr_MIN;
i = 0;
- kve = (struct vki_kinfo_vmentry *)procmap_buf;
- for (i = 0; i < (len / sizeof(*kve)); i++, kve++) {
- if (kve->kve_structsize != sizeof(*kve)) {
- VG_(debugLog)(0, "procselfmaps", "sysctl out of sync\n");
- ML_(am_exit)(1);
- }
+ p = procmap_buf;
+ while (p < (char *)procmap_buf + len) {
+ kve = (struct vki_kinfo_vmentry *)p;
start = (UWord)kve->kve_start;
endPlusOne = (UWord)kve->kve_end;
foffset = kve->kve_offset;
@@ -3656,6 +3588,7 @@
prot, dev, ino,
foffset, filename );
gapStart = endPlusOne;
+ p += kve->kve_structsize;
}
if (record_gap && gapStart < Addr_MAX)
==== //depot/projects/valgrind/include/vki/vki-freebsd.h#20 (text+ko) ====
@@ -1887,20 +1887,20 @@
struct vki_kinfo_vmentry {
int kve_structsize;
int kve_type;
- void * kve_start;
- void * kve_end;
+ ULong kve_start;
+ ULong kve_end;
+ Off64T kve_offset;
+ ULong kve_fileid;
+ UInt kve_fsid;
int kve_flags;
int kve_resident;
int kve_private_resident;
int kve_protection;
int kve_ref_count;
int kve_shadow_count;
+ int _kve_pad0;
+ int kve_ispare[16];
char kve_path[VKI_PATH_MAX];
- void * kve_pspare[8];
- Off64T kve_offset;
- ULong kve_fileid;
- UInt kve_fsid;
- int kve_ispare[3];
};
struct vki_kinfo_file {
@@ -1922,28 +1922,6 @@
char kf_path[VKI_PATH_MAX]; /* Path to file, if any. */
};
-#if defined(VGP_x86_freebsd)
-/* Special case.. adapt to what the 64 bit kernel gives us */
-struct vki_kinfo_vmentry_32on64 {
- int kve_structsize;
- int kve_type;
- ULong kve_start;
- ULong kve_end;
- int kve_flags;
- int kve_resident;
- int kve_private_resident;
- int kve_protection;
- int kve_ref_count;
- int kve_shadow_count;
- char kve_path[VKI_PATH_MAX];
- ULong kve_pspare[8];
- Off64T kve_offset;
- ULong kve_fileid;
- UInt kve_fsid;
- int kve_ispare[3];
-};
-#endif
-
//----------------------------------------------------------------------
// From sys/kenv.h
//----------------------------------------------------------------------
@@ -1959,7 +1937,7 @@
#define VKI_CTL_KERN 1
#define VKI_CTL_HW 6
#define VKI_KERN_PROC 14
-#define VKI_KERN_PROC_VMMAP 13
+#define VKI_KERN_PROC_VMMAP 32
#define VKI_KERN_PROC_FILEDESC 33
#define VKI_HW_MACHINE 1
More information about the p4-projects
mailing list