summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/lockdoc/log.c58
-rw-r--r--sys/sys/lockdebug.h41
-rw-r--r--sys/sys/lockdoc.h33
-rw-r--r--sys/sys/lockdoc_event.h8
4 files changed, 89 insertions, 51 deletions
diff --git a/sys/lockdoc/log.c b/sys/lockdoc/log.c
index 5bf1a9dbab4..25c64b9c036 100644
--- a/sys/lockdoc/log.c
+++ b/sys/lockdoc/log.c
@@ -6,49 +6,61 @@
struct log_action la_buffer;
-bool lockdoc_alloc(const char *func, size_t line, volatile void *lock, lockops_t *lo, uintptr_t initaddr){
+void lockdoc_alloc(const char *func, const char *file, size_t line, volatile void *lock, lockops_t *lo, uintptr_t initaddr){
// TODO Actually log things
- return lockdebug_alloc(func, line, lock, lo, initaddr);
}
-void lockdoc_free(bool dodebug, const char *func, size_t line, volatile void *lock){
+void lockdoc_free(const char *func, const char *file, size_t line, volatile void *lock){
// TODO Actually log things
- if (dodebug) lockdebug_free(func, line, lock);
}
-void lockdoc_wantlock(bool dodebug, const char *func, size_t line, const volatile void *lock, uintptr_t where, int shared){
+void lockdoc_wantlock(const char *func, const char *file, size_t line, const volatile void *lock, uintptr_t where, int shared){
// TODO Actually log things
- if (dodebug) lockdebug_wantlock(func, line, lock, where, shared);
}
-void lockdoc_locked(bool dodebug, const char *func, size_t line, volatile void *lock, void *cvlock, uintptr_t where, int shared){
- // TODO Actually log things
- if (dodebug) lockdebug_locked(func, line, lock, cvlock, where, shared);
+void lockdoc_locked(const char *func, const char *file, size_t line, volatile void *lock, void *cvlock, uintptr_t where, int shared){
+ // shared == 0 means exclusive (write) lock; shared > 0 means shared (read) lock
+ if(shared > 0) {
+ // TODO Check if LOCK_NONE is appropriate
+ log_lock(P_READ, lock, file, line, LOCK_NONE);
+ } else if (shared == 0){
+ log_lock(P_WRITE, lock, file, line, LOCK_NONE);
+ }
}
-void lockdoc_unlocked(bool dodebug, const char *func, size_t line, volatile void *lock, uintptr_t where, int shared){
- // TODO Actually log things
- if (dodebug) lockdebug_unlocked(func, line, lock, where, shared);
+void lockdoc_unlocked(const char *func, const char *file, size_t line, volatile void *lock, uintptr_t where, int shared){
+ // shared == 0 means exclusive (write) lock; shared > 0 means shared (read) lock
+ if(shared > 0) {
+ // TODO Check if LOCK_NONE is appropriate
+ log_lock(V_READ, lock, file, line, LOCK_NONE);
+ } else if (shared == 0){
+ log_lock(V_WRITE, lock, file, line, LOCK_NONE);
+ }
}
-void lockdoc_barrier(const char *func, size_t line, volatile void *spinlock, int slplocks){
+void lockdoc_barrier(const char *func, const char *file, size_t line, volatile void *spinlock, int slplocks){
// TODO Actually log things
- lockdebug_barrier(func, line, spinlock, slplocks);
}
-void lockdoc_mem_check(const char *func, size_t line, void *base, size_t sz){
+void lockdoc_mem_check(const char *func, const char *file, size_t line, void *base, size_t sz){
// TODO Actually log things
- lockdebug_mem_check(func, line, base, sz);
}
-void lockdoc_wakeup(bool dodebug, const char *func, size_t line, volatile void *lock, uintptr_t where){
+void lockdoc_wakeup(const char *func, const char *file, size_t line, volatile void *lock, uintptr_t where){
// TODO Actually log things
- if (dodebug) lockdebug_wakeup(func, line, lock, where);
}
void __x86_disable_intr(const char *file, int line, const char *func){
- // TODO Actually log things
+ u_long eflags;
+
+ eflags = x86_read_flags();
+ if (eflags & (1 << 9)){ // Check if interrupts were enabled in the first place
+ log_lock(P_WRITE, (void*)PSEUDOLOCK_ADDR_HARDIRQ, file, line, LOCK_NONE);
+ }
lockdoc_x86_disable_intr();
}
void __x86_enable_intr(const char *file, int line, const char *func){
- // TODO Actually log things
- lockdoc_x86_enable_intr();
+ u_long eflags;
+
+ eflags = x86_read_flags();
+ if (!(eflags & (1 << 9))){ // Check if interrupts were disabled in the first place
+ log_lock(V_WRITE, (void*)PSEUDOLOCK_ADDR_HARDIRQ, file, line, LOCK_NONE);
+ }
+ lockdoc_x86_disable_intr();
}
-
-
#endif /* LOCKDOC */ \ No newline at end of file
diff --git a/sys/sys/lockdebug.h b/sys/sys/lockdebug.h
index 28f003d84b8..9e25c2735e6 100644
--- a/sys/sys/lockdebug.h
+++ b/sys/sys/lockdebug.h
@@ -82,21 +82,29 @@ void lockdebug_mem_check(const char *, size_t, void *, size_t);
void lockdebug_wakeup(const char *, size_t, volatile void *, uintptr_t);
#define LOCKDEBUG_ALLOC(lock, ops, addr) \
- lockdoc_alloc(__func__, __LINE__, lock, ops, addr)
+ lockdebug_alloc(__func__, __LINE__, lock, ops, addr); \
+ lockdoc_alloc(__func__, __FILE__, __LINE__, lock, ops, addr)
#define LOCKDEBUG_FREE(dodebug, lock) \
- lockdoc_free(dodebug, __func__, __LINE__, lock)
+ if (dodebug) lockdebug_free(__func__, __LINE__, lock); \
+ lockdoc_free(__func__, __FILE__, __LINE__, lock)
#define LOCKDEBUG_WANTLOCK(dodebug, lock, where, s) \
- lockdoc_wantlock(dodebug, __func__, __LINE__, lock, where, s)
+ if (dodebug) lockdebug_wantlock(__func__, __LINE__, lock, where, s); \
+ lockdoc_wantlock(__func__, __FILE__, __LINE__, lock, where, s)
#define LOCKDEBUG_LOCKED(dodebug, lock, al, where, s) \
- lockdoc_locked(dodebug, __func__, __LINE__, lock, al, where, s)
+ if (dodebug) lockdebug_locked(__func__, __LINE__, lock, al, where, s); \
+ lockdoc_locked(__func__, __FILE__, __LINE__, lock, al, where, s)
#define LOCKDEBUG_UNLOCKED(dodebug, lock, where, s) \
- lockdoc_unlocked(dodebug, __func__, __LINE__, lock, where, s)
+ if (dodebug) lockdebug_unlocked(__func__, __LINE__, lock, where, s); \
+ lockdoc_unlocked(__func__, __FILE__, __LINE__, lock, where, s)
#define LOCKDEBUG_BARRIER(lock, slp) \
- lockdoc_barrier(__func__, __LINE__, lock, slp)
+ lockdebug_barrier(__func__, __LINE__, lock, slp); \
+ lockdoc_barrier(__func__, __FILE__, __LINE__, lock, slp)
#define LOCKDEBUG_MEM_CHECK(base, sz) \
- lockdoc_mem_check(__func__, __LINE__, base, sz)
+ lockdebug_mem_check(__func__, __LINE__, base, sz); \
+ lockdoc_mem_check(__func__, __FILE__, __LINE__, base, sz)
#define LOCKDEBUG_WAKEUP(dodebug, lock, where) \
- lockdoc_wakeup(dodebug, __func__, __LINE__, lock, where)
+ if (dodebug) lockdebug_wakeup(__func__, __LINE__, lock, where); \
+ lockdoc_wakeup(__func__, __FILE__, __LINE__, lock, where)
#elif defined(LOCKDEBUG) && !defined(LOCKDOC)
@@ -129,7 +137,22 @@ void lockdebug_mem_check(const char *, size_t, void *, size_t);
#elif !defined(LOCKDEBUG) && defined(LOCKDOC)
-#error "Enabling the LOCKDOC compile flag requires the LOCKDEBUG option to be set too"
+#define LOCKDEBUG_ALLOC(lock, ops, addr) \
+ lockdoc_alloc(__func__, __FILE__, __LINE__, lock, ops, addr)
+#define LOCKDEBUG_FREE(dodebug, lock) \
+ lockdoc_free(__func__, __FILE__, __LINE__, lock)
+#define LOCKDEBUG_WANTLOCK(dodebug, lock, where, s) \
+ lockdoc_wantlock(__func__, __FILE__, __LINE__, lock, where, s)
+#define LOCKDEBUG_LOCKED(dodebug, lock, al, where, s) \
+ lockdoc_locked(__func__, __FILE__, __LINE__, lock, al, where, s)
+#define LOCKDEBUG_UNLOCKED(dodebug, lock, where, s) \
+ lockdoc_unlocked(__func__, __FILE__, __LINE__, lock, where, s)
+#define LOCKDEBUG_BARRIER(lock, slp) \
+ lockdoc_barrier(__func__, __FILE__, __LINE__, lock, slp)
+#define LOCKDEBUG_MEM_CHECK(base, sz) \
+ lockdoc_mem_check(__func__, __FILE__, __LINE__, base, sz)
+#define LOCKDEBUG_WAKEUP(dodebug, lock, where) \
+ lockdoc_wakeup(__func__, __FILE__, __LINE__, lock, where)
#else /* !LOCKDEBUG && !LOCKDOC */
diff --git a/sys/sys/lockdoc.h b/sys/sys/lockdoc.h
index d350f721f93..8f90a642d56 100644
--- a/sys/sys/lockdoc.h
+++ b/sys/sys/lockdoc.h
@@ -1,6 +1,8 @@
#if !defined(__LOCKDOC_H__) && !defined(__ASSEMBLER__)
#define __LOCKDOC_H__
+#include <arch/x86/include/cpufunc.h>
+
#include <sys/types.h>
#include <sys/systm.h>
#include <sys/lockdebug.h>
@@ -19,14 +21,14 @@ extern struct log_action la_buffer;
// For DEFINEs in lockdebug.h
// Implemented in lockdoc/log.c
-bool lockdoc_alloc(const char *, size_t, volatile void *, lockops_t *, uintptr_t);
-void lockdoc_free(bool, const char *, size_t, volatile void *);
-void lockdoc_wantlock(bool, const char *, size_t, const volatile void *, uintptr_t, int);
-void lockdoc_locked(bool, const char *, size_t, volatile void *, void *, uintptr_t, int);
-void lockdoc_unlocked(bool, const char *, size_t, volatile void *, uintptr_t, int);
-void lockdoc_barrier(const char *, size_t, volatile void *, int);
-void lockdoc_mem_check(const char *, size_t, void *, size_t);
-void lockdoc_wakeup(bool, const char *, size_t, volatile void *, uintptr_t);
+void lockdoc_alloc(const char *, const char *, size_t, volatile void *, lockops_t *, uintptr_t);
+void lockdoc_free(const char *, const char *, size_t, volatile void *);
+void lockdoc_wantlock(const char *, const char *, size_t, const volatile void *, uintptr_t, int);
+void lockdoc_locked(const char *, const char *, size_t, volatile void *, void *, uintptr_t, int);
+void lockdoc_unlocked(const char *, const char *, size_t, volatile void *, uintptr_t, int);
+void lockdoc_barrier(const char *, const char *, size_t, volatile void *, int);
+void lockdoc_mem_check(const char *, const char *, size_t, void *, size_t);
+void lockdoc_wakeup(const char *, const char *, size_t, volatile void *, uintptr_t);
/* Basic port I/O */
static inline void outb_(u_int8_t v, u_int16_t port)
@@ -38,12 +40,13 @@ static inline void log_memory(int alloc, const char *datatype, const void *ptr,
}
-static inline void log_lock(int lock_op, const void* ptr, const char *file, int line, int irq_sync) {
+static inline void log_lock(int lock_op, const volatile void* ptr, const char *file, int line, int irq_sync) {
+ u_long eflags;
+ eflags = x86_read_psl();
+ lockdoc_x86_disable_intr();
memset(&la_buffer,0,sizeof(la_buffer));
- //strncpy((char *)&la_buffer, "abcdefgh", LOG_CHAR_BUFFER_LEN);
-
// action
la_buffer.action = LOCKDOC_LOCK_OP;
@@ -63,12 +66,10 @@ static inline void log_lock(int lock_op, const void* ptr, const char *file, int
strncpy(la_buffer.lock_member, "dummy", LOG_CHAR_BUFFER_LEN);
la_buffer.lock_member[LOG_CHAR_BUFFER_LEN - 1] = '\0';
-
// file
strncpy(la_buffer.file,file,LOG_CHAR_BUFFER_LEN);
la_buffer.file[LOG_CHAR_BUFFER_LEN - 1] = '\0';
-
// line
la_buffer.line = line;
@@ -77,10 +78,12 @@ static inline void log_lock(int lock_op, const void* ptr, const char *file, int
la_buffer.function[LOG_CHAR_BUFFER_LEN - 1] = '\0';
// TODO preempt_count
- // TODO irq_sync
- // TODO flags
+ // irq_sync
+ la_buffer.irq_sync = irq_sync;
outb_(PING_CHAR,IO_PORT_LOG);
+
+ x86_write_flags(eflags);
}
#else
#define log_lock(a, b, c, d, e)
diff --git a/sys/sys/lockdoc_event.h b/sys/sys/lockdoc_event.h
index e9f596f7a71..c1672345b3c 100644
--- a/sys/sys/lockdoc_event.h
+++ b/sys/sys/lockdoc_event.h
@@ -39,10 +39,10 @@ enum LOCKDOC_OP {
};
enum LOCK_OP {
- P_READ = 0,
- P_WRITE,
- V_READ,
- V_WRITE
+ P_READ = 0, // Take shared lock
+ P_WRITE, // Take excl. lock
+ V_READ, // Free shared lock
+ V_WRITE // Free excl. lock
};
enum IRQ_SYNC {