Module Name:    src
Committed By:   msaitoh
Date:           Mon Dec 22 01:59:14 UTC 2014

Modified Files:
        src/usr.bin/shmif_dumpbus [netbsd-7]: shmif_dumpbus.c

Log Message:
Pull up following revision(s) (requested by gson in ticket #343):
        usr.bin/shmif_dumpbus/shmif_dumpbus.c: revision 1.12-1.17
- support endian-independent operation on all platforms.
- fix tyop in error message.
- make name more descriptive: SWAPME -> FIXENDIAN.
- Add compat for bus version 2.
- Fixes tests, but, XXX, should add tests for bus version 3.
- quasi-cosmetic nit to previous: limit variable scope.
- Might as well byteswap when we assign to local variables instead of when
  we use said variables.


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.11.4.1 src/usr.bin/shmif_dumpbus/shmif_dumpbus.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/shmif_dumpbus/shmif_dumpbus.c
diff -u src/usr.bin/shmif_dumpbus/shmif_dumpbus.c:1.11 src/usr.bin/shmif_dumpbus/shmif_dumpbus.c:1.11.4.1
--- src/usr.bin/shmif_dumpbus/shmif_dumpbus.c:1.11	Fri Dec 20 10:04:33 2013
+++ src/usr.bin/shmif_dumpbus/shmif_dumpbus.c	Mon Dec 22 01:59:14 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: shmif_dumpbus.c,v 1.11 2013/12/20 10:04:33 pooka Exp $	*/
+/*	$NetBSD: shmif_dumpbus.c,v 1.11.4.1 2014/12/22 01:59:14 msaitoh Exp $	*/
 
 /*-
  * Copyright (c) 2010 Antti Kantee.  All Rights Reserved.
@@ -33,7 +33,7 @@
 #include <rump/rumpuser_port.h>
 
 #ifndef lint
-__RCSID("$NetBSD: shmif_dumpbus.c,v 1.11 2013/12/20 10:04:33 pooka Exp $");
+__RCSID("$NetBSD: shmif_dumpbus.c,v 1.11.4.1 2014/12/22 01:59:14 msaitoh Exp $");
 #endif /* !lint */
 
 #include <sys/types.h>
@@ -69,15 +69,49 @@ usage(void)
 }
 
 #define BUFSIZE 64*1024
-#ifdef __NetBSD__
-#define SWAPME(a) (doswap ? bswap32(a) : (a))
-#define SWAPME64(a) (doswap ? bswap64(a) : (a))
-#else
-/* lazy, but let's assume everyone uses shmif_dumpbus only locally */
-#define SWAPME(a) (a)
-#define SWAPME64(a) (a)
-#define bswap32(a) (a)
-#endif
+
+/*
+ * byte swapdom
+ */
+static uint32_t
+swp32(uint32_t x)
+{
+	uint32_t v;
+
+	v = (((x) & 0xff000000) >> 24) |
+	    (((x) & 0x00ff0000) >>  8) |
+	    (((x) & 0x0000ff00) <<  8) |
+	    (((x) & 0x000000ff) << 24);
+	return v;
+}
+
+static uint64_t
+swp64(uint64_t x)
+{
+	uint64_t v;
+
+	v = (((x) & 0xff00000000000000ull) >> 56) |
+	    (((x) & 0x00ff000000000000ull) >> 40) |
+	    (((x) & 0x0000ff0000000000ull) >> 24) |
+	    (((x) & 0x000000ff00000000ull) >>  8) |
+	    (((x) & 0x00000000ff000000ull) <<  8) |
+	    (((x) & 0x0000000000ff0000ull) << 24) |
+	    (((x) & 0x000000000000ff00ull) << 40) |
+	    (((x) & 0x00000000000000ffull) << 56);
+	return v;
+}
+
+#define FIXENDIAN32(x) (doswap ? swp32(x) : (x))
+#define FIXENDIAN64(x) (doswap ? swp64(x) : (x))
+
+/* compat for bus version 2 */
+struct shmif_pkthdr2 {
+	uint32_t sp_len;
+
+	uint32_t sp_sec;
+	uint32_t sp_usec;
+};
+
 int
 main(int argc, char *argv[])
 {
@@ -92,6 +126,7 @@ main(int argc, char *argv[])
 	bool hflag = false, doswap = false;
 	pcap_dumper_t *pdump;
 	FILE *dumploc = stdout;
+	int useversion;
 
 #ifdef PLATFORM_HAS_SETGETPROGNAME
 	setprogname(argv[0]);
@@ -133,22 +168,28 @@ main(int argc, char *argv[])
 	bmem = busmem;
 
 	if (bmem->shm_magic != SHMIF_MAGIC) {
-		if (bmem->shm_magic != bswap32(SHMIF_MAGIC))
+		if (bmem->shm_magic != swp32(SHMIF_MAGIC))
 			errx(1, "%s not a shmif bus", argv[0]);
-		doswap = 1;
+		doswap = true;
+	}
+	if (FIXENDIAN32(bmem->shm_version) != SHMIF_VERSION) {
+		if (FIXENDIAN32(bmem->shm_version) != 2) {
+			errx(1, "bus version %d, program %d",
+			    FIXENDIAN32(bmem->shm_version), SHMIF_VERSION);
+		}
+		useversion = 2;
+	} else {
+		useversion = 3;
 	}
-	if (SWAPME(bmem->shm_version) != SHMIF_VERSION)
-		errx(1, "bus vesrsion %d, program %d",
-		    SWAPME(bmem->shm_version), SHMIF_VERSION);
 
 	if (pcapfile && strcmp(pcapfile, "-") == 0)
 		dumploc = stderr;
 
 	fprintf(dumploc, "bus version %d, lock: %d, generation: %" PRIu64
 	    ", firstoff: 0x%04x, lastoff: 0x%04x\n",
-	    SWAPME(bmem->shm_version), SWAPME(bmem->shm_lock),
-	    SWAPME64(bmem->shm_gen),
-	    SWAPME(bmem->shm_first), SWAPME(bmem->shm_last));
+	    FIXENDIAN32(bmem->shm_version), FIXENDIAN32(bmem->shm_lock),
+	    FIXENDIAN64(bmem->shm_gen),
+	    FIXENDIAN32(bmem->shm_first), FIXENDIAN32(bmem->shm_last));
 
 	if (hflag)
 		exit(0);
@@ -163,8 +204,8 @@ main(int argc, char *argv[])
 		pdump = NULL;
 	}
 
-	curbus = SWAPME(bmem->shm_first);
-	buslast = SWAPME(bmem->shm_last);
+	curbus = FIXENDIAN32(bmem->shm_first);
+	buslast = FIXENDIAN32(bmem->shm_last);
 	if (curbus == BUSMEM_DATASIZE)
 		curbus = 0;
 
@@ -173,31 +214,49 @@ main(int argc, char *argv[])
 		bonus = 1;
 
 	i = 0;
+
 	while (curbus <= buslast || bonus) {
 		struct pcap_pkthdr packhdr;
-		struct shmif_pkthdr sp;
 		uint32_t oldoff;
 		uint32_t curlen;
+		uint32_t sp_sec, sp_usec, sp_len;
 		bool wrap;
 
 		assert(curbus < sb.st_size);
 
 		wrap = false;
 		oldoff = curbus;
-		curbus = shmif_busread(bmem, &sp, oldoff, sizeof(sp), &wrap);
+
+		if (useversion == 3) {
+			struct shmif_pkthdr sp;
+
+			curbus = shmif_busread(bmem,
+			    &sp, oldoff, sizeof(sp), &wrap);
+			sp_len = FIXENDIAN32(sp.sp_len);
+			sp_sec = FIXENDIAN32(sp.sp_sec);
+			sp_usec = FIXENDIAN32(sp.sp_usec);
+		} else {
+			struct shmif_pkthdr2 sp2;
+
+			curbus = shmif_busread(bmem,
+			    &sp2, oldoff, sizeof(sp2), &wrap);
+			sp_len = FIXENDIAN32(sp2.sp_len);
+			sp_sec = FIXENDIAN32(sp2.sp_sec);
+			sp_usec = FIXENDIAN32(sp2.sp_usec);
+		}
 		if (wrap)
 			bonus = 0;
 
 		assert(curbus < sb.st_size);
-		curlen = SWAPME(sp.sp_len);
+		curlen = sp_len;
 
 		if (curlen == 0) {
 			continue;
 		}
 
 		fprintf(dumploc, "packet %d, offset 0x%04x, length 0x%04x, "
-			    "ts %d/%06d\n", i++, curbus,
-			    curlen, SWAPME(sp.sp_sec), SWAPME(sp.sp_usec));
+			    "ts %d/%06d\n", i++, curbus, curlen,
+			    sp_sec, sp_usec);
 
 		if (!pcapfile) {
 			curbus = shmif_busread(bmem,
@@ -209,8 +268,8 @@ main(int argc, char *argv[])
 
 		memset(&packhdr, 0, sizeof(packhdr));
 		packhdr.caplen = packhdr.len = curlen;
-		packhdr.ts.tv_sec = SWAPME(sp.sp_sec);
-		packhdr.ts.tv_usec = SWAPME(sp.sp_usec);
+		packhdr.ts.tv_sec = sp_sec;
+		packhdr.ts.tv_usec = sp_usec;
 		assert(curlen <= BUFSIZE);
 
 		curbus = shmif_busread(bmem, buf, curbus, curlen, &wrap);

Reply via email to