PERFORCE change 151775 for review
Peter Wemm
peter at FreeBSD.org
Thu Oct 23 05:24:24 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=151775
Change 151775 by peter at peter_cheese on 2008/10/23 05:24:08
merge freebsd changes into new MD files before re-shuffling.
Affected files ...
.. //depot/projects/valgrind/coregrind/launcher-linux.c#2 integrate
.. //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-common.c#2 edit
.. //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-linux.c#2 integrate
Differences ...
==== //depot/projects/valgrind/coregrind/launcher-linux.c#2 (text+ko) ====
@@ -42,7 +42,7 @@
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
-#include <sys/user.h>
+/* #include <sys/user.h> */
#include <unistd.h>
#include "pub_core_debuglog.h"
@@ -241,6 +241,10 @@
mode. */
if (0==strcmp(VG_PLATFORM,"x86-linux"))
default_platform = "x86-linux";
+ else if (0==strcmp(VG_PLATFORM,"x86-freebsd"))
+ default_platform = "x86-freebsd";
+ else if (0==strcmp(VG_PLATFORM,"amd64-freebsd"))
+ default_platform = "amd64-freebsd";
else if (0==strcmp(VG_PLATFORM,"amd64-linux"))
default_platform = "amd64-linux";
else if (0==strcmp(VG_PLATFORM,"ppc32-linux"))
@@ -270,14 +274,27 @@
we can tell stage2. stage2 will use the name for recursive
invokations of valgrind on child processes. */
memset(launcher_name, 0, PATH_MAX+1);
+#if defined(VGO_linux)
r = readlink("/proc/self/exe", launcher_name, PATH_MAX);
+#elif defined(VGO_freebsd)
+ r = readlink("/proc/curproc/file", launcher_name, PATH_MAX);
+#else
+#error "unknown OS"
+#endif
if (r == -1) {
/* If /proc/self/exe can't be followed, don't give up. Instead
continue with an empty string for VALGRIND_LAUNCHER. In the
sys_execve wrapper, this is tested, and if found to be empty,
fail the execve. */
+#if defined(VGO_linux)
fprintf(stderr, "valgrind: warning (non-fatal): "
"readlink(\"/proc/self/exe\") failed.\n");
+#elif defined(VGO_freebsd)
+ fprintf(stderr, "valgrind: warning (non-fatal): "
+ "readlink(\"/proc/curproc/file\") failed.\n");
+#else
+#error "unknown OS"
+#endif
fprintf(stderr, "valgrind: continuing, however --trace-children=yes "
"will not work.\n");
}
==== //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-common.c#2 (text+ko) ====
@@ -159,6 +159,13 @@
|| defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
res = VG_(do_syscall6)(__NR_mmap, (UWord)start, length,
prot, flags, fd, offset);
+# elif defined(VGO_freebsd)
+ if (flags & VKI_MAP_ANONYMOUS && fd == 0)
+ fd = -1;
+ // AAA: fix 64 bit start
+ // QQQ: truncates to 32 bit offset!!
+ res = VG_(do_syscall7)(__NR_mmap, (UWord)start, length,
+ prot, flags, fd, 0, offset);
# else
# error Unknown platform
# endif
@@ -196,6 +203,10 @@
ML_(am_barf)("ML_(am_do_extend_mapping_NO_NOTIFY) on AIX5");
/* NOTREACHED, but gcc doesn't understand that */
return VG_(mk_SysRes_Error)(0);
+# elif defined(VGO_freebsd)
+ ML_(am_barf)("ML_(am_do_extend_mapping_NO_NOTIFY) on FreeBSD");
+ /* NOTREACHED, but gcc doesn't understand that */
+ return VG_(mk_SysRes_Error)(0);
# else
# error Unknown OS
# endif
@@ -221,6 +232,10 @@
ML_(am_barf)("ML_(am_do_relocate_nooverlap_mapping_NO_NOTIFY) on AIX5");
/* NOTREACHED, but gcc doesn't understand that */
return VG_(mk_SysRes_Error)(0);
+# elif defined(VGO_freebsd)
+ ML_(am_barf)("ML_(am_do_relocate_nooverlap_mapping_NO_NOTIFY) on FreeBSD");
+ /* NOTREACHED, but gcc doesn't understand that */
+ return VG_(mk_SysRes_Error)(0);
# else
# error Unknown OS
# endif
==== //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-linux.c#2 (text+ko) ====
@@ -352,6 +352,7 @@
/* Given a file descriptor, attempt to deduce its filename. To do
this, we use /proc/self/fd/<FD>. If this doesn't point to a file,
or if it doesn't exist, we return False. */
+#if defined(VGO_linux)
static
Bool get_name_for_fd ( Int fd, /*OUT*/HChar* buf, Int nbuf )
{
@@ -366,6 +367,49 @@
else
return False;
}
+#elif defined(VGO_freebsd)
+static
+Bool get_name_for_fd ( Int fd, HChar* buf, Int nbuf )
+{
+ static int nr_fromfd = -1;
+ SysRes res;
+ Int i;
+
+ for (i = 0; i < nbuf; i++) buf[i] = 0;
+ if (nr_fromfd == -1) {
+ int oid[2];
+ int real_oid[10];
+ vki_size_t oidlen;
+ char *name = "machdep.getpath_fromfd_num";
+ vki_size_t len;
+ int sc;
+
+ oid[0] = 0; /* magic */
+ oid[1] = 3; /* undocumented */
+ oidlen = sizeof(real_oid);
+ res = VG_(do_syscall6)(__NR___sysctl, (UWord)oid, 2, (UWord)real_oid, (UWord)&oidlen, (UWord)name, strlen(name));
+ oidlen /= sizeof(int);
+ if (!res.isError && oidlen > 0) {
+ len = sizeof(sc);
+ res = VG_(do_syscall6)(__NR___sysctl, (UWord)real_oid, oidlen, (UWord)&sc, (UWord)&len, 0, 0);
+ if (!res.isError && sc > 0)
+ nr_fromfd = sc;
+ }
+ if (nr_fromfd == -1)
+ nr_fromfd = -2;
+ }
+ if (nr_fromfd < 0)
+ return False;
+
+ res = VG_(do_syscall3)(nr_fromfd, fd, (UWord)buf, nbuf);
+ if (!res.isError && buf[0] == '/')
+ return True;
+ else
+ return False;
+}
+#else
+#error undefined os
+#endif
/*-----------------------------------------------------------------*/
@@ -963,12 +1007,15 @@
same = same
&& seg_prot == prot
+#ifndef VGO_freebsd
&& (cmp_devino
? (nsegments[i].dev == dev && nsegments[i].ino == ino)
: True)
&& (cmp_offsets
? nsegments[i].start-nsegments[i].offset == addr-offset
- : True);
+ : True)
+#endif
+ ;
if (!same) {
sync_check_ok = False;
VG_(debugLog)(
@@ -1491,8 +1538,12 @@
seg.kind = SkAnonV;
if (dev != 0 && ino != 0)
seg.kind = SkFileV;
- if (filename)
+ if (filename) {
+#if defined(VGO_freebsd)
+ seg.kind = SkFileV;
+#endif
seg.fnIdx = allocate_segname( filename );
+ }
if (0) show_nsegment( 2,0, &seg );
add_segment( &seg );
@@ -1539,7 +1590,11 @@
" sp_at_startup = 0x%010llx (supplied)\n",
(ULong)sp_at_startup );
+#ifdef VGP_x86_freebsd
+ aspacem_minAddr = (Addr) 0x00010000; // 64K
+#else
aspacem_minAddr = (Addr) 0x04000000; // 64M
+#endif
# if VG_WORDSIZE == 8
aspacem_maxAddr = (Addr)0x800000000 - 1; // 32G
@@ -1603,10 +1658,18 @@
VG_(am_show_nsegments)(2, "Initial layout");
+#ifdef VGO_freebsd
+ VG_(debugLog)(2, "aspacem", "Reading /proc/curproc/map\n");
+#else
VG_(debugLog)(2, "aspacem", "Reading /proc/self/maps\n");
+#endif
parse_procselfmaps( read_maps_callback, NULL );
+#ifdef VGO_freebsd
+ VG_(am_show_nsegments)(2, "With contents of /proc/curproc/map");
+#else
VG_(am_show_nsegments)(2, "With contents of /proc/self/maps");
+#endif
AM_SANITY_CHECK;
return suggested_clstack_top;
@@ -2159,7 +2222,7 @@
sres = VG_(am_do_mmap_NO_NOTIFY)(
start, length, prot,
VKI_MAP_FIXED|VKI_MAP_PRIVATE|VKI_MAP_ANONYMOUS,
- 0, 0
+ 0, 0
);
if (sres.isError)
return sres;
@@ -2575,6 +2638,7 @@
Addr start2 = start1;
Addr end2 = end1;
+//VG_(printf)("am_create_reservation start=%p, len=%p\n", start, length);
if (extra < 0) start2 += extra; // this moves it down :-)
if (extra > 0) end2 += extra;
@@ -2590,11 +2654,15 @@
segment, we're hosed. This does rely on the assumption that all
mergeable adjacent segments can be merged, but add_segment()
should ensure that. */
- if (startI != endI)
+ if (startI != endI) {
+//VG_(printf)("startI %p != endI %p\n", startI, endI);
return False;
+ }
- if (nsegments[startI].kind != SkFree)
+ if (nsegments[startI].kind != SkFree) {
+//VG_(printf)("nsegments[startI].kind %d != SkFree %d\n", nsegments[startI].kind, SkFree);
return False;
+ }
/* Looks good - make the reservation. */
aspacem_assert(nsegments[startI].start <= start2);
@@ -2914,6 +2982,12 @@
{
/* Read a word-sized hex number. */
Int n = 0;
+ if (*buf == '0') {
+ n++; buf++;
+ if (*buf == 'x') {
+ n++; buf++;
+ }
+ }
*val = 0;
while (hexdigit(*buf) >= 0) {
*val = (*val << 4) + hexdigit(*buf);
@@ -2956,9 +3030,9 @@
SysRes fd;
/* Read the initial memory mapping from the /proc filesystem. */
- fd = ML_(am_open)( "/proc/self/maps", VKI_O_RDONLY, 0 );
+ fd = ML_(am_open)( "/proc/curproc/map", VKI_O_RDONLY, 0 );
if (fd.isError)
- ML_(am_barf)("can't open /proc/self/maps");
+ ML_(am_barf)("can't open /proc/curproc/map");
buf_n_tot = 0;
do {
@@ -2973,7 +3047,7 @@
if (buf_n_tot >= M_PROCMAP_BUF-5)
ML_(am_barf_toolow)("M_PROCMAP_BUF");
if (buf_n_tot == 0)
- ML_(am_barf)("I/O error on /proc/self/maps");
+ ML_(am_barf)("I/O error on /proc/curproc/map");
procmap_buf[buf_n_tot] = 0;
}
@@ -3014,6 +3088,9 @@
UInt prot;
UWord maj, min;
ULong foffset, dev, ino;
+#ifdef VGO_freebsd
+ UInt junk;
+#endif
foffset = ino = 0; /* keep gcc-4.1.0 happy */
@@ -3030,6 +3107,7 @@
while (True) {
if (i >= buf_n_tot) break;
+#if defined(VGO_linux)
/* Read (without fscanf :) the pattern %16x-%16x %c%c%c%c %16x %2x:%2x %d */
j = readhex(&procmap_buf[i], &start);
if (j > 0) i += j; else goto syntaxerror;
@@ -3073,12 +3151,121 @@
j = readdec64(&procmap_buf[i], &ino);
if (j > 0) i += j; else goto syntaxerror;
+#elif defined(VGO_freebsd)
+ /* Read (without fscanf :) the pattern %8x %8x %d %d %8x %c%c%c%c %d %d %8x .* .* .* */
+ /* 0x38000000 0x38119000 281 748 0xd76df8a0 r-x 2 1 0x0 COW NC vnode */
+ j = readhex(&procmap_buf[i], &start);
+ if (j > 0) i += j; else goto syntaxerror;
+ j = readchar(&procmap_buf[i], &ch);
+ if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
+ j = readhex(&procmap_buf[i], &endPlusOne);
+ if (j > 0) i += j; else goto syntaxerror;
+
+ j = readchar(&procmap_buf[i], &ch);
+ if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
+
+ j = readdec(&procmap_buf[i], &junk);
+ if (j > 0) i += j; else goto syntaxerror;
+ j = readchar(&procmap_buf[i], &ch);
+ if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
+ j = readdec(&procmap_buf[i], &junk);
+ if (j > 0) i += j; else goto syntaxerror;
+ j = readchar(&procmap_buf[i], &ch);
+ if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
+ j = readhex(&procmap_buf[i], &junk);
+ if (j > 0) i += j; else goto syntaxerror;
+ j = readchar(&procmap_buf[i], &ch);
+ if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
+
+ j = readchar(&procmap_buf[i], &rr);
+ if (j == 1 && (rr == 'r' || rr == '-')) i += j; else goto syntaxerror;
+ j = readchar(&procmap_buf[i], &ww);
+ if (j == 1 && (ww == 'w' || ww == '-')) i += j; else goto syntaxerror;
+ j = readchar(&procmap_buf[i], &xx);
+ if (j == 1 && (xx == 'x' || xx == '-')) i += j; else goto syntaxerror;
+
+ j = readchar(&procmap_buf[i], &ch);
+ if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
+
+ j = readdec(&procmap_buf[i], &junk);
+ if (j > 0) i += j; else goto syntaxerror;
+ j = readchar(&procmap_buf[i], &ch);
+ if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
+ j = readdec(&procmap_buf[i], &junk);
+ if (j > 0) i += j; else goto syntaxerror;
+ j = readchar(&procmap_buf[i], &ch);
+ if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
+
+ j = readhex(&procmap_buf[i], &junk);
+ if (j > 0) i += j; else goto syntaxerror;
+
+ j = readchar(&procmap_buf[i], &ch);
+ if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
+
+ /* COW or NCOW */
+ j = readchar(&procmap_buf[i], &ch);
+ if (j != 1) goto syntaxerror;
+ if (ch == 'N') {
+ i += j;
+ j = readchar(&procmap_buf[i], &ch);
+ if (j == 1 && ch == 'C') i += j; else goto syntaxerror;
+ j = readchar(&procmap_buf[i], &ch);
+ if (j == 1 && ch == 'O') i += j; else goto syntaxerror;
+ j = readchar(&procmap_buf[i], &ch);
+ if (j == 1 && ch == 'W') i += j; else goto syntaxerror;
+ } else if (ch == 'C') {
+ i += j;
+ j = readchar(&procmap_buf[i], &ch);
+ if (j == 1 && ch == 'O') i += j; else goto syntaxerror;
+ j = readchar(&procmap_buf[i], &ch);
+ if (j == 1 && ch == 'W') i += j; else goto syntaxerror;
+ } else {
+ goto syntaxerror;
+ }
+ j = readchar(&procmap_buf[i], &ch);
+ if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
+
+ /* NC or NNC */
+ j = readchar(&procmap_buf[i], &ch);
+ if (j == 1 && ch == 'N') i += j; else goto syntaxerror;
+ j = readchar(&procmap_buf[i], &ch);
+ if (j == 1 && (ch == 'N' || ch == 'C')) i += j; else goto syntaxerror;
+ if (ch == 'N') {
+ j = readchar(&procmap_buf[i], &ch);
+ if (j == 1 && ch == 'C') i += j; else goto syntaxerror;
+ }
+ j = readchar(&procmap_buf[i], &ch);
+ if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
+
+ /* map type (vnode, swap, default) */
+ j = readchar(&procmap_buf[i], &ch);
+ if (j != 1) goto syntaxerror;
+ if (ch == 'v') {
+ i += j;
+ j = readchar(&procmap_buf[i], &ch);
+ if (j == 1 && ch == 'n') i += j; else goto syntaxerror;
+ j = readchar(&procmap_buf[i], &ch);
+ if (j == 1 && ch == 'o') i += j; else goto syntaxerror;
+ j = readchar(&procmap_buf[i], &ch);
+ if (j == 1 && ch == 'd') i += j; else goto syntaxerror;
+ j = readchar(&procmap_buf[i], &ch);
+ if (j == 1 && ch == 'e') i += j; else goto syntaxerror;
+ }
+ foffset = 0;
+#else
+#error "Unknown OS"
+#endif
goto read_line_ok;
syntaxerror:
+#ifdef VGO_freebsd
+ VG_(debugLog)(0, "Valgrind:",
+ "FATAL: syntax error reading /proc/curproc/map\n");
+#else
VG_(debugLog)(0, "Valgrind:",
"FATAL: syntax error reading /proc/self/maps\n");
+#endif
{ Int k, m;
HChar buf50[51];
m = 0;
@@ -3120,11 +3307,19 @@
foffset = 0;
}
+#if 0
+#ifdef VGO_freebsd
+ if (!filename)
+ filename = find_path(start);
+#endif
+#endif
+
prot = 0;
if (rr == 'r') prot |= VKI_PROT_READ;
if (ww == 'w') prot |= VKI_PROT_WRITE;
if (xx == 'x') prot |= VKI_PROT_EXEC;
+#if defined(VGO_linux)
/* Linux has two ways to encode a device number when it
is exposed to user space (via fstat etc). The old way
is the traditional unix scheme that produces a 16 bit
@@ -3145,7 +3340,9 @@
should always have a new style device number and
everything should match. */
dev = (min & 0xff) | (maj << 8) | ((min & ~0xff) << 12);
-
+#else
+ dev = 0;
+#endif
if (record_gap && gapStart < start)
(*record_gap) ( gapStart, start-gapStart );
More information about the p4-projects
mailing list