diff options
| -rw-r--r-- | sys/lockdoc/log.c | 58 | ||||
| -rw-r--r-- | sys/sys/lockdebug.h | 41 | ||||
| -rw-r--r-- | sys/sys/lockdoc.h | 33 | ||||
| -rw-r--r-- | sys/sys/lockdoc_event.h | 8 |
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 { |
