svn commit: r319341 - head/sys/compat/linuxkpi/common/include/linux

Hans Petter Selasky hselasky at FreeBSD.org
Wed May 31 16:24:03 UTC 2017


Author: hselasky
Date: Wed May 31 16:24:02 2017
New Revision: 319341
URL: https://svnweb.freebsd.org/changeset/base/319341

Log:
  Implement print_hex_dump(), print_hex_dump_bytes() and
  printk_ratelimited() in the LinuxKPI.
  
  While at it fix the inclusion guard of printk.h to be similar to the
  rest of the LinuxKPI header files.
  
  MFC after:		1 week
  Sponsored by:		Mellanox Technologies

Modified:
  head/sys/compat/linuxkpi/common/include/linux/printk.h

Modified: head/sys/compat/linuxkpi/common/include/linux/printk.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/printk.h	Wed May 31 16:08:30 2017	(r319340)
+++ head/sys/compat/linuxkpi/common/include/linux/printk.h	Wed May 31 16:24:02 2017	(r319341)
@@ -2,7 +2,7 @@
  * Copyright (c) 2010 Isilon Systems, Inc.
  * Copyright (c) 2010 iX Systems, Inc.
  * Copyright (c) 2010 Panasas, Inc.
- * Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
+ * Copyright (c) 2013-2017 Mellanox Technologies, Ltd.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -28,9 +28,11 @@
  *
  * $FreeBSD$
  */
-#ifndef _FBSD_PRINTK_H_
-#define	_FBSD_PRINTK_H_
+#ifndef _LINUX_PRINTK_H_
+#define	_LINUX_PRINTK_H_
 
+#include <linux/kernel.h>
+
 /* GID printing macros */
 #define	GID_PRINT_FMT			"%.4x:%.4x:%.4x:%.4x:%.4x:%.4x:%.4x:%.4x"
 #define	GID_PRINT_ARGS(gid_raw)		htons(((u16 *)gid_raw)[0]), htons(((u16 *)gid_raw)[1]),\
@@ -38,4 +40,76 @@
 					htons(((u16 *)gid_raw)[4]), htons(((u16 *)gid_raw)[5]),\
 					htons(((u16 *)gid_raw)[6]), htons(((u16 *)gid_raw)[7])
 
-#endif					/* _FBSD_PRINTK_H */
+enum {
+	DUMP_PREFIX_NONE,
+	DUMP_PREFIX_ADDRESS,
+	DUMP_PREFIX_OFFSET
+};
+
+static inline void
+print_hex_dump(const char *level, const char *prefix_str,
+    const int prefix_type, const int rowsize, const int groupsize,
+    const void *buf, size_t len, const bool ascii)
+{
+	typedef const struct { long long value; } __packed *print_64p_t;
+	typedef const struct { uint32_t value; } __packed *print_32p_t;
+	typedef const struct { uint16_t value; } __packed *print_16p_t;
+	const void *buf_old = buf;
+	int row;
+
+	while (len > 0) {
+		if (level != NULL)
+			printf("%s", level);
+		if (prefix_str != NULL)
+			printf("%s ", prefix_str);
+
+		switch (prefix_type) {
+		case DUMP_PREFIX_ADDRESS:
+			printf("[%p] ", buf);
+			break;
+		case DUMP_PREFIX_OFFSET:
+			printf("[%p] ", (const char *)((const char *)buf -
+			    (const char *)buf_old));
+			break;
+		default:
+			break;
+		}
+		for (row = 0; row != rowsize; row++) {
+			if (groupsize == 8 && len > 7) {
+				printf("%016llx ", ((print_64p_t)buf)->value);
+				buf = (const uint8_t *)buf + 8;
+				len -= 8;
+			} else if (groupsize == 4 && len > 3) {
+				printf("%08x ", ((print_32p_t)buf)->value);
+				buf = (const uint8_t *)buf + 4;
+				len -= 4;
+			} else if (groupsize == 2 && len > 1) {
+				printf("%04x ", ((print_16p_t)buf)->value);
+				buf = (const uint8_t *)buf + 2;
+				len -= 2;
+			} else if (len > 0) {
+				printf("%02x ", *(const uint8_t *)buf);
+				buf = (const uint8_t *)buf + 1;
+				len--;
+			} else {
+				break;
+			}
+		}
+		printf("\n");
+	}
+}
+
+static inline void
+print_hex_dump_bytes(const char *prefix_str, const int prefix_type,
+    const void *buf, size_t len)
+{
+	print_hex_dump(NULL, prefix_str, prefix_type, 16, 1, buf, len, 0);
+}
+
+#define	printk_ratelimited(...) do {		\
+	static linux_ratelimit_t __ratelimited;	\
+	if (linux_ratelimited(&__ratelimited))	\
+		printk(__VA_ARGS__);		\
+} while (0)
+
+#endif					/* _LINUX_PRINTK_H_ */


More information about the svn-src-head mailing list