summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMerlin Scholz <merlin@scholz.ruhr>2022-10-24 17:30:32 +0200
committerMerlin Scholz <merlin@scholz.ruhr>2023-07-10 00:19:20 +0200
commit29d27983ec1fa79322615792d7b443c0c25d712f (patch)
treedd0f0dd557b6d9ed77ee0586d00e2bbf05592361
parentdb1dac8367d3aaa42d1e95d429f745319c0f67f6 (diff)
First proper lockdoc hooks
-rw-r--r--TODO1
-rw-r--r--sys/Makefile2
-rw-r--r--sys/arch/i386/conf/LOCKDOC2
-rw-r--r--sys/arch/i386/conf/files.i3862
-rw-r--r--sys/arch/x86/include/cpufunc.h25
-rw-r--r--sys/lockdoc/log.c19
-rw-r--r--sys/sys/lockdoc.h1
7 files changed, 49 insertions, 3 deletions
diff --git a/TODO b/TODO
index a0ab1197c06..8c1498ada03 100644
--- a/TODO
+++ b/TODO
@@ -1,3 +1,4 @@
+- Separate LOCKDEBUG from LOCKDOC kernel opt
- SMP
- IRQ
- Implement all lock types
diff --git a/sys/Makefile b/sys/Makefile
index e6ffd9d0b32..fdaf70194d7 100644
--- a/sys/Makefile
+++ b/sys/Makefile
@@ -2,7 +2,7 @@
.include <bsd.own.mk>
-SUBDIR= altq arch compat dev fs miscfs \
+SUBDIR= altq arch compat dev fs lockdoc miscfs \
net net80211 netatalk netbt netcan netipsec netinet netinet6 \
netmpls \
nfs opencrypto sys ufs uvm
diff --git a/sys/arch/i386/conf/LOCKDOC b/sys/arch/i386/conf/LOCKDOC
index 955fa29fec2..d7d2d0f7efe 100644
--- a/sys/arch/i386/conf/LOCKDOC
+++ b/sys/arch/i386/conf/LOCKDOC
@@ -22,7 +22,7 @@ include "arch/i386/conf/std.i386"
options INCLUDE_CONFIG_FILE # embed config file in kernel binary
-#ident "GENERIC-$Revision: 1.1208.2.5 $"
+#ident "LOCKDOC-$Revision: 1.1208.2.5 $"
maxusers 64 # estimated number of users
diff --git a/sys/arch/i386/conf/files.i386 b/sys/arch/i386/conf/files.i386
index 062d0873d76..9bc8094f250 100644
--- a/sys/arch/i386/conf/files.i386
+++ b/sys/arch/i386/conf/files.i386
@@ -46,7 +46,7 @@ defparam opt_beep.h BEEP_ONHALT_PITCH=1500
defparam opt_beep.h BEEP_ONHALT_PERIOD=250
-file lockdoc/log.c lockdebug
+file lockdoc/log.c lockdebug
# Multiboot support
defflag opt_multiboot.h MULTIBOOT
diff --git a/sys/arch/x86/include/cpufunc.h b/sys/arch/x86/include/cpufunc.h
index 524b8db6d86..8b216c21fcf 100644
--- a/sys/arch/x86/include/cpufunc.h
+++ b/sys/arch/x86/include/cpufunc.h
@@ -45,6 +45,7 @@
#ifdef _KERNEL
#if defined(_KERNEL_OPT)
#include "opt_xen.h"
+#include "opt_lockdebug.h"
#endif
static inline void
@@ -567,17 +568,41 @@ xrstor64(const void *addr, uint64_t mask)
void x86_disable_intr(void);
void x86_enable_intr(void);
#else
+
+#ifdef LOCKDEBUG
+#define x86_disable_intr() __x86_disable_intr(__FILE__, __LINE__, __func__)
+void __x86_disable_intr(const char *file, int line, const char *func);
+
+static __inline void lockdoc_x86_disable_intr(void)
+{
+ __asm volatile ("cli" ::: "memory");
+}
+
+#else
static inline void
x86_disable_intr(void)
{
__asm volatile ("cli" ::: "memory");
}
+#endif /* LOCKDEBUG */
+#ifdef LOCKDEBUG
+#define x86_enable_intr() __x86_enable_intr(__FILE__, __LINE__, __func__)
+void __x86_enable_intr(const char *file, int line, const char *func);
+
+static __inline void lockdoc_x86_enable_intr(void)
+{
+ __asm volatile ("sti" ::: "memory");
+}
+
+#else
static inline void
x86_enable_intr(void)
{
__asm volatile ("sti" ::: "memory");
}
+#endif /* LOCKDEBUG */
+
#endif /* XENPV */
/* Use read_psl, write_psl when saving and restoring interrupt state. */
diff --git a/sys/lockdoc/log.c b/sys/lockdoc/log.c
index e2d49c76090..91d2a8d02cb 100644
--- a/sys/lockdoc/log.c
+++ b/sys/lockdoc/log.c
@@ -1,3 +1,22 @@
+#include <arch/x86/include/cpufunc.h>
#include <sys/lockdoc.h>
+#include "opt_lockdebug.h"
+
+#ifdef LOCKDEBUG
+
struct log_action la_buffer;
+
+void __x86_disable_intr(const char *file, int line, const char *func){
+ // TODO Actually log things
+ lockdoc_x86_disable_intr();
+ __asm __volatile("cli" : : : "memory");
+}
+
+void __x86_enable_intr(const char *file, int line, const char *func){
+ // TODO Actually log things
+ lockdoc_x86_enable_intr();
+ __asm __volatile ("sti" ::: "memory");
+}
+
+#endif /* LOCKDEBUG */ \ No newline at end of file
diff --git a/sys/sys/lockdoc.h b/sys/sys/lockdoc.h
index 45c1aa7faeb..e6b666540d5 100644
--- a/sys/sys/lockdoc.h
+++ b/sys/sys/lockdoc.h
@@ -2,6 +2,7 @@
#define __LOCKDOC_H__
#include <sys/types.h>
+#include <sys/systm.h>
#include <sys/lockdoc_event.h>
#define DELIMITER "#"