lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1359694058-24452-2-git-send-email-sasha.levin@oracle.com>
Date:	Thu, 31 Jan 2013 23:47:32 -0500
From:	Sasha Levin <sasha.levin@...cle.com>
To:	mingo@...hat.com, peterz@...radead.org
Cc:	paulus@...ba.org, acme@...stprotocols.net, penberg@...nel.org,
	linux-kernel@...r.kernel.org, Sasha Levin <sasha.levin@...cle.com>
Subject: [PATCH 1/7] liblock: wrap kernel/lockdep.c to allow usage from userspace

kernel/lockdep.c deals with validating locking scenarios for various
architectures supported by the kernel. There isn't anything kernel
specific going on in lockdep, and when we compare userspace to other
architectures that don't have to deal with irqs such as s390, they
become all too similar.

We wrap kernel/lockdep.c and include/linux/lockdep.h with several
headers which allow us to build and use lockdep from userspace. We don't
touch the kernel code itself which means that any work done on lockdep
in the kernel will automatically benefit userspace lockdep as well!

Signed-off-by: Sasha Levin <sasha.levin@...cle.com>
---
 tools/lib/liblock/Makefile                     | 247 +++++++++++++++++++++++++
 tools/lib/liblock/common.c                     |  22 +++
 tools/lib/liblock/lockdep.c                    |   2 +
 tools/lib/liblock/lockdep_internals.h          |   1 +
 tools/lib/liblock/lockdep_states.h             |   1 +
 tools/lib/liblock/uinclude/asm/hweight.h       |   0
 tools/lib/liblock/uinclude/asm/sections.h      |   0
 tools/lib/liblock/uinclude/linux/bitops.h      |   0
 tools/lib/liblock/uinclude/linux/compiler.h    |   7 +
 tools/lib/liblock/uinclude/linux/debug_locks.h |  12 ++
 tools/lib/liblock/uinclude/linux/delay.h       |   0
 tools/lib/liblock/uinclude/linux/export.h      |   7 +
 tools/lib/liblock/uinclude/linux/ftrace.h      |   0
 tools/lib/liblock/uinclude/linux/gfp.h         |   0
 tools/lib/liblock/uinclude/linux/hardirq.h     |  11 ++
 tools/lib/liblock/uinclude/linux/hash.h        |   1 +
 tools/lib/liblock/uinclude/linux/interrupt.h   |   0
 tools/lib/liblock/uinclude/linux/irqflags.h    |  38 ++++
 tools/lib/liblock/uinclude/linux/kallsyms.h    |  32 ++++
 tools/lib/liblock/uinclude/linux/kernel.h      |  34 ++++
 tools/lib/liblock/uinclude/linux/kmemcheck.h   |   8 +
 tools/lib/liblock/uinclude/linux/linkage.h     |   0
 tools/lib/liblock/uinclude/linux/list.h        |   1 +
 tools/lib/liblock/uinclude/linux/lockdep.h     |  58 ++++++
 tools/lib/liblock/uinclude/linux/mm_types.h    |   0
 tools/lib/liblock/uinclude/linux/module.h      |   6 +
 tools/lib/liblock/uinclude/linux/mutex.h       |   0
 tools/lib/liblock/uinclude/linux/poison.h      |   1 +
 tools/lib/liblock/uinclude/linux/prefetch.h    |   6 +
 tools/lib/liblock/uinclude/linux/proc_fs.h     |   0
 tools/lib/liblock/uinclude/linux/rcu.h         |  16 ++
 tools/lib/liblock/uinclude/linux/seq_file.h    |   0
 tools/lib/liblock/uinclude/linux/spinlock.h    |  25 +++
 tools/lib/liblock/uinclude/linux/stacktrace.h  |  31 ++++
 tools/lib/liblock/uinclude/linux/stringify.h   |   7 +
 tools/lib/liblock/uinclude/linux/system.h      |   0
 tools/lib/liblock/uinclude/linux/types.h       |  58 ++++++
 tools/lib/liblock/uinclude/linux/util.h        |   0
 tools/lib/liblock/uinclude/trace/events/lock.h |   0
 39 files changed, 632 insertions(+)
 create mode 100644 tools/lib/liblock/Makefile
 create mode 100644 tools/lib/liblock/common.c
 create mode 100644 tools/lib/liblock/lockdep.c
 create mode 100644 tools/lib/liblock/lockdep_internals.h
 create mode 100644 tools/lib/liblock/lockdep_states.h
 create mode 100644 tools/lib/liblock/uinclude/asm/hweight.h
 create mode 100644 tools/lib/liblock/uinclude/asm/sections.h
 create mode 100644 tools/lib/liblock/uinclude/linux/bitops.h
 create mode 100644 tools/lib/liblock/uinclude/linux/compiler.h
 create mode 100644 tools/lib/liblock/uinclude/linux/debug_locks.h
 create mode 100644 tools/lib/liblock/uinclude/linux/delay.h
 create mode 100644 tools/lib/liblock/uinclude/linux/export.h
 create mode 100644 tools/lib/liblock/uinclude/linux/ftrace.h
 create mode 100644 tools/lib/liblock/uinclude/linux/gfp.h
 create mode 100644 tools/lib/liblock/uinclude/linux/hardirq.h
 create mode 100644 tools/lib/liblock/uinclude/linux/hash.h
 create mode 100644 tools/lib/liblock/uinclude/linux/interrupt.h
 create mode 100644 tools/lib/liblock/uinclude/linux/irqflags.h
 create mode 100644 tools/lib/liblock/uinclude/linux/kallsyms.h
 create mode 100644 tools/lib/liblock/uinclude/linux/kernel.h
 create mode 100644 tools/lib/liblock/uinclude/linux/kmemcheck.h
 create mode 100644 tools/lib/liblock/uinclude/linux/linkage.h
 create mode 100644 tools/lib/liblock/uinclude/linux/list.h
 create mode 100644 tools/lib/liblock/uinclude/linux/lockdep.h
 create mode 100644 tools/lib/liblock/uinclude/linux/mm_types.h
 create mode 100644 tools/lib/liblock/uinclude/linux/module.h
 create mode 100644 tools/lib/liblock/uinclude/linux/mutex.h
 create mode 100644 tools/lib/liblock/uinclude/linux/poison.h
 create mode 100644 tools/lib/liblock/uinclude/linux/prefetch.h
 create mode 100644 tools/lib/liblock/uinclude/linux/proc_fs.h
 create mode 100644 tools/lib/liblock/uinclude/linux/rcu.h
 create mode 100644 tools/lib/liblock/uinclude/linux/seq_file.h
 create mode 100644 tools/lib/liblock/uinclude/linux/spinlock.h
 create mode 100644 tools/lib/liblock/uinclude/linux/stacktrace.h
 create mode 100644 tools/lib/liblock/uinclude/linux/stringify.h
 create mode 100644 tools/lib/liblock/uinclude/linux/system.h
 create mode 100644 tools/lib/liblock/uinclude/linux/types.h
 create mode 100644 tools/lib/liblock/uinclude/linux/util.h
 create mode 100644 tools/lib/liblock/uinclude/trace/events/lock.h

diff --git a/tools/lib/liblock/Makefile b/tools/lib/liblock/Makefile
new file mode 100644
index 0000000..0909e4d
--- /dev/null
+++ b/tools/lib/liblock/Makefile
@@ -0,0 +1,247 @@
+# liblock version
+LL_VERSION = 0
+LL_PATCHLEVEL = 0
+LL_EXTRAVERSION = 1
+
+# file format version
+FILE_VERSION = 1
+
+MAKEFLAGS += --no-print-directory
+
+
+# Makefiles suck: This macro sets a default value of $(2) for the
+# variable named by $(1), unless the variable has been set by
+# environment or command line. This is necessary for CC and AR
+# because make sets default values, so the simpler ?= approach
+# won't work as expected.
+define allow-override
+  $(if $(or $(findstring environment,$(origin $(1))),\
+            $(findstring command line,$(origin $(1)))),,\
+    $(eval $(1) = $(2)))
+endef
+
+# Allow setting CC and AR, or setting CROSS_COMPILE as a prefix.
+$(call allow-override,CC,$(CROSS_COMPILE)gcc)
+$(call allow-override,AR,$(CROSS_COMPILE)ar)
+
+INSTALL = install
+
+# Use DESTDIR for installing into a different root directory.
+# This is useful for building a package. The program will be
+# installed in this directory as if it was the root directory.
+# Then the build tool can move it later.
+DESTDIR ?=
+DESTDIR_SQ = '$(subst ','\'',$(DESTDIR))'
+
+prefix ?= /usr/local
+bindir_relative = lib
+bindir = $(prefix)/$(bindir_relative)
+
+export DESTDIR DESTDIR_SQ INSTALL
+
+# copy a bit from Linux kbuild
+
+ifeq ("$(origin V)", "command line")
+  VERBOSE = $(V)
+endif
+ifndef VERBOSE
+  VERBOSE = 0
+endif
+
+ifeq ("$(origin O)", "command line")
+  BUILD_OUTPUT := $(O)
+endif
+
+ifeq ($(BUILD_SRC),)
+ifneq ($(BUILD_OUTPUT),)
+
+define build_output
+	$(if $(VERBOSE:1=),@)$(MAKE) -C $(BUILD_OUTPUT) 	\
+	BUILD_SRC=$(CURDIR) -f $(CURDIR)/Makefile $1
+endef
+
+saved-output := $(BUILD_OUTPUT)
+BUILD_OUTPUT := $(shell cd $(BUILD_OUTPUT) && /bin/pwd)
+$(if $(BUILD_OUTPUT),, \
+     $(error output directory "$(saved-output)" does not exist))
+
+all: sub-make
+
+gui: force
+	$(call build_output, all_cmd)
+
+$(filter-out gui,$(MAKECMDGOALS)): sub-make
+
+sub-make: force
+	$(call build_output, $(MAKECMDGOALS))
+
+
+# Leave processing to above invocation of make
+skip-makefile := 1
+
+endif # BUILD_OUTPUT
+endif # BUILD_SRC
+
+# We process the rest of the Makefile if this is the final invocation of make
+ifeq ($(skip-makefile),)
+
+srctree		:= $(if $(BUILD_SRC),$(BUILD_SRC),$(CURDIR))
+objtree		:= $(CURDIR)
+src		:= $(srctree)
+obj		:= $(objtree)
+
+export prefix bindir src obj
+
+# Shell quotes
+bindir_SQ = $(subst ','\'',$(bindir))
+bindir_relative_SQ = $(subst ','\'',$(bindir_relative))
+
+LIB_FILE = liblock.a liblock.so
+
+CONFIG_INCLUDES = 
+CONFIG_LIBS	=
+CONFIG_FLAGS	=
+
+OBJ		= $@
+N		=
+
+export Q VERBOSE
+
+LIBLOCK_VERSION = $(LL_VERSION).$(LL_PATCHLEVEL).$(LL_EXTRAVERSION)
+
+INCLUDES = -I. -I/usr/local/include -I./uinclude $(CONFIG_INCLUDES)
+
+# Set compile option CFLAGS if not set elsewhere
+CFLAGS ?= -g -DCONFIG_LOCKDEP -DCONFIG_STACKTRACE -DCONFIG_PROVE_LOCKING -DBITS_PER_LONG=64 -DLIBLOCK_VERSION='"$(LIBLOCK_VERSION)"' -rdynamic
+
+override CFLAGS += $(CONFIG_FLAGS) $(INCLUDES) $(PLUGIN_DIR_SQ)
+
+ifeq ($(VERBOSE),1)
+  Q =
+  print_compile =
+  print_app_build =
+  print_fpic_compile =
+  print_shared_lib_compile =
+  print_install =
+else
+  Q = @
+  print_compile =		echo '  CC                 '$(OBJ);
+  print_app_build =		echo '  BUILD              '$(OBJ);
+  print_fpic_compile =		echo '  CC FPIC            '$(OBJ);
+  print_shared_lib_compile =	echo '  BUILD SHARED LIB   '$(OBJ);
+  print_static_lib_build =	echo '  BUILD STATIC LIB   '$(OBJ);
+  print_install =		echo '  INSTALL     '$1'	to	$(DESTDIR_SQ)$2';
+endif
+
+do_fpic_compile =					\
+	($(print_fpic_compile)				\
+	$(CC) -c $(CFLAGS) $(EXT) -fPIC $< -o $@)
+
+do_app_build =						\
+	($(print_app_build)				\
+	$(CC) $^ -rdynamic -o $@ $(CONFIG_LIBS) $(LIBS))
+
+do_compile_shared_library =			\
+	($(print_shared_lib_compile)		\
+	$(CC) --shared $^ -o $@)
+
+do_build_static_lib =				\
+	($(print_static_lib_build)		\
+	$(RM) $@;  $(AR) rcs $@ $^)
+
+
+define do_compile
+	$(print_compile)						\
+	$(CC) -c $(CFLAGS) $(EXT) $< -o $(obj)/$@;
+endef
+
+$(obj)/%.o: $(src)/%.c
+	$(Q)$(call do_compile)
+
+%.o: $(src)/%.c
+	$(Q)$(call do_compile)
+
+PEVENT_LIB_OBJS = common.o lockdep.o
+
+ALL_OBJS = $(PEVENT_LIB_OBJS)
+
+CMD_TARGETS = $(LIB_FILE)
+
+TARGETS = $(CMD_TARGETS)
+
+
+all: all_cmd
+
+all_cmd: $(CMD_TARGETS)
+
+liblock.so: $(PEVENT_LIB_OBJS)
+	$(Q)$(do_compile_shared_library)
+
+liblock.a: $(PEVENT_LIB_OBJS)
+	$(Q)$(do_build_static_lib)
+
+$(PEVENT_LIB_OBJS): %.o: $(src)/%.c
+	$(Q)$(do_fpic_compile)
+
+## make deps
+
+all_objs := $(sort $(ALL_OBJS))
+all_deps := $(all_objs:%.o=.%.d)
+
+# let .d file also depends on the source and header files
+define check_deps
+		@set -e; $(RM) $@; \
+		$(CC) -MM $(CFLAGS) $< > $@...$$; \
+		sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@...$$ > $@; \
+		$(RM) $@...$$
+endef
+
+$(all_deps): .%.d: $(src)/%.c
+	$(Q)$(call check_deps)
+
+$(all_objs) : %.o : .%.d
+
+dep_includes := $(wildcard $(all_deps))
+
+ifneq ($(dep_includes),)
+ include $(dep_includes)
+endif
+
+### Detect environment changes
+TRACK_CFLAGS = $(subst ','\'',$(CFLAGS)):$(ARCH):$(CROSS_COMPILE)
+
+tags:	force
+	$(RM) tags
+	find . -name '*.[ch]' | xargs ctags --extra=+f --c-kinds=+px \
+	--regex-c++='/_PE\(([^,)]*).*/PEVENT_ERRNO__\1/'
+
+TAGS:	force
+	$(RM) TAGS
+	find . -name '*.[ch]' | xargs etags \
+	--regex='/_PE(\([^,)]*\).*/PEVENT_ERRNO__\1/'
+
+define do_install
+	$(print_install)				\
+	if [ ! -d '$(DESTDIR_SQ)$2' ]; then		\
+		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$2';	\
+	fi;						\
+	$(INSTALL) $1 '$(DESTDIR_SQ)$2'
+endef
+
+install_lib: all_cmd
+	$(Q)$(call do_install,$(LIB_FILE),$(bindir_SQ))
+
+install: install_lib
+
+clean:
+	$(RM) *.o *~ $(TARGETS) *.a *.so $(VERSION_FILES) .*.d
+	$(RM) tags TAGS
+
+endif # skip-makefile
+
+PHONY += force
+force:
+
+# Declare the contents of the .PHONY variable as phony.  We keep that
+# information in a variable so we can use it in if_changed and friends.
+.PHONY: $(PHONY)
diff --git a/tools/lib/liblock/common.c b/tools/lib/liblock/common.c
new file mode 100644
index 0000000..8657380
--- /dev/null
+++ b/tools/lib/liblock/common.c
@@ -0,0 +1,22 @@
+#include <stddef.h>
+#include <stdbool.h>
+#include <linux/compiler.h>
+#include <linux/lockdep.h>
+#include <unistd.h>
+#include <sys/syscall.h>
+
+__thread struct task_struct current_obj;
+
+bool debug_locks = true;
+bool debug_locks_silent = false;
+
+void liblock_init(void)
+{
+	lockdep_init();
+}
+
+void liblock_set_thread(void)
+{
+	prctl(PR_GET_NAME, current->comm);
+	current->pid = syscall(__NR_gettid);
+}
diff --git a/tools/lib/liblock/lockdep.c b/tools/lib/liblock/lockdep.c
new file mode 100644
index 0000000..8ddd0ff
--- /dev/null
+++ b/tools/lib/liblock/lockdep.c
@@ -0,0 +1,2 @@
+#include <linux/lockdep.h>
+#include "../../../kernel/lockdep.c"
diff --git a/tools/lib/liblock/lockdep_internals.h b/tools/lib/liblock/lockdep_internals.h
new file mode 100644
index 0000000..109e96f
--- /dev/null
+++ b/tools/lib/liblock/lockdep_internals.h
@@ -0,0 +1 @@
+#include "../../../kernel/lockdep_internals.h"
diff --git a/tools/lib/liblock/lockdep_states.h b/tools/lib/liblock/lockdep_states.h
new file mode 100644
index 0000000..6b75423
--- /dev/null
+++ b/tools/lib/liblock/lockdep_states.h
@@ -0,0 +1 @@
+#include "../../../kernel/lockdep_states.h"
diff --git a/tools/lib/liblock/uinclude/asm/hweight.h b/tools/lib/liblock/uinclude/asm/hweight.h
new file mode 100644
index 0000000..e69de29
diff --git a/tools/lib/liblock/uinclude/asm/sections.h b/tools/lib/liblock/uinclude/asm/sections.h
new file mode 100644
index 0000000..e69de29
diff --git a/tools/lib/liblock/uinclude/linux/bitops.h b/tools/lib/liblock/uinclude/linux/bitops.h
new file mode 100644
index 0000000..e69de29
diff --git a/tools/lib/liblock/uinclude/linux/compiler.h b/tools/lib/liblock/uinclude/linux/compiler.h
new file mode 100644
index 0000000..8f44a7c
--- /dev/null
+++ b/tools/lib/liblock/uinclude/linux/compiler.h
@@ -0,0 +1,7 @@
+#ifndef _LIBLOCK_LINUX_COMPILER_H_
+#define _LIBLOCK_LINUX_COMPILER_H_
+
+#define __used		__attribute__((__unused__))
+#define unlikely
+
+#endif
diff --git a/tools/lib/liblock/uinclude/linux/debug_locks.h b/tools/lib/liblock/uinclude/linux/debug_locks.h
new file mode 100644
index 0000000..45c65bd
--- /dev/null
+++ b/tools/lib/liblock/uinclude/linux/debug_locks.h
@@ -0,0 +1,12 @@
+#ifndef _LIBLOCK_DEBUG_LOCKS_H_
+#define _LIBLOCK_DEBUG_LOCKS_H_
+
+#include <stddef.h>
+#include <linux/compiler.h>
+
+#define DEBUG_LOCKS_WARN_ON(x) (x)
+
+extern bool debug_locks;
+extern bool debug_locks_silent;
+
+#endif
diff --git a/tools/lib/liblock/uinclude/linux/delay.h b/tools/lib/liblock/uinclude/linux/delay.h
new file mode 100644
index 0000000..e69de29
diff --git a/tools/lib/liblock/uinclude/linux/export.h b/tools/lib/liblock/uinclude/linux/export.h
new file mode 100644
index 0000000..4c7ffd4
--- /dev/null
+++ b/tools/lib/liblock/uinclude/linux/export.h
@@ -0,0 +1,7 @@
+#ifndef _LIBLOCK_LINUX_EXPORT_H_
+#define _LIBLOCK_LINUX_EXPORT_H_
+
+#define EXPORT_SYMBOL(sym)
+#define EXPORT_SYMBOL_GPL(sym)
+
+#endif
diff --git a/tools/lib/liblock/uinclude/linux/ftrace.h b/tools/lib/liblock/uinclude/linux/ftrace.h
new file mode 100644
index 0000000..e69de29
diff --git a/tools/lib/liblock/uinclude/linux/gfp.h b/tools/lib/liblock/uinclude/linux/gfp.h
new file mode 100644
index 0000000..e69de29
diff --git a/tools/lib/liblock/uinclude/linux/hardirq.h b/tools/lib/liblock/uinclude/linux/hardirq.h
new file mode 100644
index 0000000..f2e91a1
--- /dev/null
+++ b/tools/lib/liblock/uinclude/linux/hardirq.h
@@ -0,0 +1,11 @@
+#ifndef _LIBLOCK_LINUX_HARDIRQ_H_
+#define _LIBLOCK_LINUX_HARDIRQ_H_
+
+#define SOFTIRQ_BITS	0UL
+#define HARDIRQ_BITS	0UL
+#define SOFTIRQ_SHIFT	0UL
+#define HARDIRQ_SHIFT	0UL
+#define hardirq_count()	0UL
+#define softirq_count()	0UL
+
+#endif
diff --git a/tools/lib/liblock/uinclude/linux/hash.h b/tools/lib/liblock/uinclude/linux/hash.h
new file mode 100644
index 0000000..0f84798
--- /dev/null
+++ b/tools/lib/liblock/uinclude/linux/hash.h
@@ -0,0 +1 @@
+#include "../../../include/linux/hash.h"
diff --git a/tools/lib/liblock/uinclude/linux/interrupt.h b/tools/lib/liblock/uinclude/linux/interrupt.h
new file mode 100644
index 0000000..e69de29
diff --git a/tools/lib/liblock/uinclude/linux/irqflags.h b/tools/lib/liblock/uinclude/linux/irqflags.h
new file mode 100644
index 0000000..c394aba
--- /dev/null
+++ b/tools/lib/liblock/uinclude/linux/irqflags.h
@@ -0,0 +1,38 @@
+#ifndef _LIBLOCK_LINUX_TRACE_IRQFLAGS_H_
+#define _LIBLOCK_LINUX_TRACE_IRQFLAGS_H_
+
+# define trace_hardirq_context(p)	0
+# define trace_softirq_context(p)	0
+# define trace_hardirqs_enabled(p)	0
+# define trace_softirqs_enabled(p)	0
+# define trace_hardirq_enter()		do { } while (0)
+# define trace_hardirq_exit()		do { } while (0)
+# define lockdep_softirq_enter()	do { } while (0)
+# define lockdep_softirq_exit()		do { } while (0)
+# define INIT_TRACE_IRQFLAGS
+
+# define stop_critical_timings() do { } while (0)
+# define start_critical_timings() do { } while (0)
+
+#define raw_local_irq_disable() do { } while (0)
+#define raw_local_irq_enable() do { } while (0)
+#define raw_local_irq_save(flags) do { flags = 0; } while (0)
+#define raw_local_irq_restore(flags) do { } while (0)
+#define raw_local_save_flags(flags) do { flags = 0; } while (0)
+#define raw_irqs_disabled_flags(flags) do { } while (0)
+#define raw_irqs_disabled() 0
+#define raw_safe_halt()
+
+#define local_irq_enable() do { } while (0)
+#define local_irq_disable() do { } while (0)
+#define local_irq_save(flags) do { flags = 0 ;} while (0)
+#define local_irq_restore(flags) do { } while (0)
+#define local_save_flags(flags)	do { flags = 0; } while (0)
+#define irqs_disabled() (1)
+#define irqs_disabled_flags(flags) (0)
+#define safe_halt() do { } while (0)
+
+#define trace_lock_release(x, y)
+#define trace_lock_acquire(a, b, c, d, e, f, g);
+
+#endif
diff --git a/tools/lib/liblock/uinclude/linux/kallsyms.h b/tools/lib/liblock/uinclude/linux/kallsyms.h
new file mode 100644
index 0000000..fda2d40
--- /dev/null
+++ b/tools/lib/liblock/uinclude/linux/kallsyms.h
@@ -0,0 +1,32 @@
+#ifndef _LIBLOCK_LINUX_KALLSYMS_H_
+#define _LIBLOCK_LINUX_KALLSYMS_H_
+
+#include <linux/kernel.h>
+#include <stdio.h>
+
+#define KSYM_NAME_LEN 128
+
+struct module;
+
+static inline const char *kallsyms_lookup(unsigned long addr,
+					  unsigned long *symbolsize,
+					  unsigned long *offset,
+					  char **modname, char *namebuf)
+{
+	return NULL;
+}
+
+#include <execinfo.h>
+#include <stdlib.h>
+static inline void print_ip_sym(unsigned long ip)
+{
+	char **name;
+
+	name = backtrace_symbols((void **)&ip, 1);
+
+	printf("%s\n", *name);
+
+	free(name);
+}
+
+#endif
diff --git a/tools/lib/liblock/uinclude/linux/kernel.h b/tools/lib/liblock/uinclude/linux/kernel.h
new file mode 100644
index 0000000..e2f19ee
--- /dev/null
+++ b/tools/lib/liblock/uinclude/linux/kernel.h
@@ -0,0 +1,34 @@
+#ifndef _LIBLOCK_LINUX_KERNEL_H_
+#define _LIBLOCK_LINUX_KERNEL_H_
+
+#include <linux/export.h>
+#include <linux/types.h>
+#include <linux/rcu.h>
+#include <linux/hardirq.h>
+
+#ifndef container_of
+#define container_of(ptr, type, member) ({			\
+	const typeof(((type *)0)->member) * __mptr = (ptr);	\
+	(type *)((char *)__mptr - offsetof(type, member)); })
+#endif
+
+#define max(x, y) ({				\
+	typeof(x) _max1 = (x);			\
+	typeof(y) _max2 = (y);			\
+	(void) (&_max1 == &_max2);		\
+	_max1 > _max2 ? _max1 : _max2; })
+
+#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
+#define WARN_ON(x) (x)
+#define WARN_ON_ONCE(x) (x)
+#define likely(x) (x)
+#define WARN(x,y,z) (x)
+#define uninitialized_var(x) x
+#define __init
+#define noinline
+#define list_add_tail_rcu list_add_tail
+
+#define _THIS_IP_ CALLER_ADDR0
+#define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0))
+
+#endif
diff --git a/tools/lib/liblock/uinclude/linux/kmemcheck.h b/tools/lib/liblock/uinclude/linux/kmemcheck.h
new file mode 100644
index 0000000..25bde2e
--- /dev/null
+++ b/tools/lib/liblock/uinclude/linux/kmemcheck.h
@@ -0,0 +1,8 @@
+#ifndef _LIBLOCK_LINUX_KMEMCHECK_H_
+#define _LIBLOCK_LINUX_KMEMCHECK_H_
+
+static inline void kmemcheck_mark_initialized(void *address, unsigned int n)
+{
+}
+
+#endif
diff --git a/tools/lib/liblock/uinclude/linux/linkage.h b/tools/lib/liblock/uinclude/linux/linkage.h
new file mode 100644
index 0000000..e69de29
diff --git a/tools/lib/liblock/uinclude/linux/list.h b/tools/lib/liblock/uinclude/linux/list.h
new file mode 100644
index 0000000..6e9ef31
--- /dev/null
+++ b/tools/lib/liblock/uinclude/linux/list.h
@@ -0,0 +1 @@
+#include "../../../include/linux/list.h"
diff --git a/tools/lib/liblock/uinclude/linux/lockdep.h b/tools/lib/liblock/uinclude/linux/lockdep.h
new file mode 100644
index 0000000..c3a693c
--- /dev/null
+++ b/tools/lib/liblock/uinclude/linux/lockdep.h
@@ -0,0 +1,58 @@
+#ifndef _LIBLOCK_LOCKDEP_H_
+#define _LIBLOCK_LOCKDEP_H_
+
+#include <sys/prctl.h>
+#include <sys/syscall.h>
+#include <string.h>
+#include <limits.h>
+#include <linux/utsname.h>
+
+
+#define MAX_LOCK_DEPTH 200UL
+
+#include "../../../include/linux/lockdep.h"
+
+struct task_struct {
+	u64 curr_chain_key;
+	int lockdep_depth;
+	unsigned int lockdep_recursion;
+	struct held_lock held_locks[MAX_LOCK_DEPTH];
+	gfp_t lockdep_reclaim_gfp;
+	int pid;
+	char comm[17];
+};
+
+extern __thread struct task_struct current_obj;
+#define current (&current_obj)
+
+void liblock_init(void);
+void liblock_set_thread(void);
+
+#define debug_locks_off() 1
+#define task_pid_nr(tsk) ((tsk)->pid)
+
+#define KSYM_NAME_LEN 128
+#define printk printf
+
+#define KERN_ERR
+#define KERN_CONT
+
+#define list_del_rcu list_del
+
+#define atomic_t unsigned long
+#define atomic_inc(x) ((*(x))++)
+
+static struct new_utsname *init_utsname(void)
+{
+	static struct new_utsname n = (struct new_utsname) {
+		.release = "liblock",
+		.version = LIBLOCK_VERSION,
+	};
+
+	return &n;
+}
+
+#define print_tainted() ""
+#define static_obj(x) 1
+
+#endif
diff --git a/tools/lib/liblock/uinclude/linux/mm_types.h b/tools/lib/liblock/uinclude/linux/mm_types.h
new file mode 100644
index 0000000..e69de29
diff --git a/tools/lib/liblock/uinclude/linux/module.h b/tools/lib/liblock/uinclude/linux/module.h
new file mode 100644
index 0000000..a86c36d
--- /dev/null
+++ b/tools/lib/liblock/uinclude/linux/module.h
@@ -0,0 +1,6 @@
+#ifndef _LIBLOCK_LINUX_MODULE_H_
+#define _LIBLOCK_LINUX_MODULE_H_
+
+#define module_param(name, type, perm)
+
+#endif
diff --git a/tools/lib/liblock/uinclude/linux/mutex.h b/tools/lib/liblock/uinclude/linux/mutex.h
new file mode 100644
index 0000000..e69de29
diff --git a/tools/lib/liblock/uinclude/linux/poison.h b/tools/lib/liblock/uinclude/linux/poison.h
new file mode 100644
index 0000000..0c27bdf
--- /dev/null
+++ b/tools/lib/liblock/uinclude/linux/poison.h
@@ -0,0 +1 @@
+#include "../../../include/linux/poison.h"
diff --git a/tools/lib/liblock/uinclude/linux/prefetch.h b/tools/lib/liblock/uinclude/linux/prefetch.h
new file mode 100644
index 0000000..9873927
--- /dev/null
+++ b/tools/lib/liblock/uinclude/linux/prefetch.h
@@ -0,0 +1,6 @@
+#ifndef _LIBLOCK_LINUX_PREFETCH_H_
+#define _LIBLOCK_LINUX_PREFETCH_H
+
+static inline void prefetch(void *a __attribute__((unused))) { }
+
+#endif
diff --git a/tools/lib/liblock/uinclude/linux/proc_fs.h b/tools/lib/liblock/uinclude/linux/proc_fs.h
new file mode 100644
index 0000000..e69de29
diff --git a/tools/lib/liblock/uinclude/linux/rcu.h b/tools/lib/liblock/uinclude/linux/rcu.h
new file mode 100644
index 0000000..f2e152b
--- /dev/null
+++ b/tools/lib/liblock/uinclude/linux/rcu.h
@@ -0,0 +1,16 @@
+#ifndef _LIBLOCK_RCU_H_
+#define _LIBLOCK_RCU_H_
+
+int rcu_scheduler_active;
+
+static inline int rcu_lockdep_current_cpu_online(void)
+{
+	return 1;
+}
+
+static inline int rcu_is_cpu_idle(void)
+{
+	return 1;
+}
+
+#endif
diff --git a/tools/lib/liblock/uinclude/linux/seq_file.h b/tools/lib/liblock/uinclude/linux/seq_file.h
new file mode 100644
index 0000000..e69de29
diff --git a/tools/lib/liblock/uinclude/linux/spinlock.h b/tools/lib/liblock/uinclude/linux/spinlock.h
new file mode 100644
index 0000000..17ba1a3
--- /dev/null
+++ b/tools/lib/liblock/uinclude/linux/spinlock.h
@@ -0,0 +1,25 @@
+#ifndef _LIBLOCK_SPINLOCK_H_
+#define _LIBLOCK_SPINLOCK_H_
+
+#include <pthread.h>
+#include <stdbool.h>
+
+#define arch_spinlock_t pthread_mutex_t
+#define __ARCH_SPIN_LOCK_UNLOCKED PTHREAD_MUTEX_INITIALIZER
+
+static inline void arch_spin_lock(arch_spinlock_t *mutex)
+{
+	pthread_mutex_lock(mutex);
+}
+
+static inline void arch_spin_unlock(arch_spinlock_t *mutex)
+{
+	pthread_mutex_unlock(mutex);
+}
+
+static inline bool arch_spin_is_locked(arch_spinlock_t *mutex)
+{
+	return true;
+}
+
+#endif
diff --git a/tools/lib/liblock/uinclude/linux/stacktrace.h b/tools/lib/liblock/uinclude/linux/stacktrace.h
new file mode 100644
index 0000000..0f279e8
--- /dev/null
+++ b/tools/lib/liblock/uinclude/linux/stacktrace.h
@@ -0,0 +1,31 @@
+#ifndef _LIBLOCK_LINUX_STACKTRACE_H_
+#define _LIBLOCK_LINUX_STACKTRACE_H_
+
+#include <execinfo.h>
+
+struct stack_trace {
+	unsigned int nr_entries, max_entries;
+	unsigned long *entries;
+	int skip;
+};
+
+static inline void print_stack_trace(struct stack_trace *trace, int spaces)
+{
+	backtrace_symbols_fd((void **)trace->entries, trace->nr_entries, 1);
+}
+
+#define save_stack_trace(trace)	\
+	trace->nr_entries = backtrace((void **)trace->entries, trace->max_entries);     
+
+static inline int dump_stack(void)
+{
+	void *array[64];
+	size_t size;
+
+	size = backtrace(array, 64);
+	backtrace_symbols_fd(array, size, 1);
+
+	return 0;
+}
+
+#endif
diff --git a/tools/lib/liblock/uinclude/linux/stringify.h b/tools/lib/liblock/uinclude/linux/stringify.h
new file mode 100644
index 0000000..984f0fd
--- /dev/null
+++ b/tools/lib/liblock/uinclude/linux/stringify.h
@@ -0,0 +1,7 @@
+#ifndef _LIBLOCK_LINUX_STRINGIFY_H_
+#define _LIBLOCK_LINUX_STRINGIFY_H_
+
+#define __stringify_1(x...)	#x
+#define __stringify(x...)	__stringify_1(x)
+
+#endif
diff --git a/tools/lib/liblock/uinclude/linux/system.h b/tools/lib/liblock/uinclude/linux/system.h
new file mode 100644
index 0000000..e69de29
diff --git a/tools/lib/liblock/uinclude/linux/types.h b/tools/lib/liblock/uinclude/linux/types.h
new file mode 100644
index 0000000..33c6884
--- /dev/null
+++ b/tools/lib/liblock/uinclude/linux/types.h
@@ -0,0 +1,58 @@
+#ifndef _LIBLOCK_LINUX_TYPES_H_
+#define _LIBLOCK_LINUX_TYPES_H_
+
+#include <stdbool.h>
+#include <stddef.h>
+
+#define __SANE_USERSPACE_TYPES__	/* For PPC64, to get LL64 types */
+#include <asm/types.h>
+
+struct page;
+struct kmem_cache;
+
+typedef unsigned gfp_t;
+
+typedef __u64 u64;
+typedef __s64 s64;
+
+typedef __u32 u32;
+typedef __s32 s32;
+
+typedef __u16 u16;
+typedef __s16 s16;
+
+typedef __u8  u8;
+typedef __s8  s8;
+
+#ifdef __CHECKER__
+#define __bitwise__ __attribute__((bitwise))
+#else
+#define __bitwise__
+#endif
+#ifdef __CHECK_ENDIAN__
+#define __bitwise __bitwise__
+#else
+#define __bitwise
+#endif
+
+
+typedef __u16 __bitwise __le16;
+typedef __u16 __bitwise __be16;
+typedef __u32 __bitwise __le32;
+typedef __u32 __bitwise __be32;
+typedef __u64 __bitwise __le64;
+typedef __u64 __bitwise __be64;
+
+struct list_head {
+	struct list_head *next, *prev;
+};
+
+struct hlist_head {
+	struct hlist_node *first;
+};
+
+struct hlist_node {
+	struct hlist_node *next, **pprev;
+};
+
+#endif
diff --git a/tools/lib/liblock/uinclude/linux/util.h b/tools/lib/liblock/uinclude/linux/util.h
new file mode 100644
index 0000000..e69de29
diff --git a/tools/lib/liblock/uinclude/trace/events/lock.h b/tools/lib/liblock/uinclude/trace/events/lock.h
new file mode 100644
index 0000000..e69de29
-- 
1.8.1.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ