diff --git a/kern/libkern/endian.h b/kern/libkern/endian.h index 13f0f3b..3f9132f 100644 --- a/kern/libkern/endian.h +++ b/kern/libkern/endian.h @@ -1,7 +1,7 @@ #ifndef ENDIAN_KERNEL_H #define ENDIAN_KERNEL_H -#include +#include /** Swap byte order of 16-bit value */ static inline u16 swap16(u16 x) { diff --git a/kern/libkern/spinlock.c b/kern/libkern/spinlock.c index 7dc6658..b9ccd8b 100644 --- a/kern/libkern/spinlock.c +++ b/kern/libkern/spinlock.c @@ -67,7 +67,7 @@ uint32_t pop_off(void) { PANIC("pop_off - interruptible"); if (cpu->noff < 1) - PANIC("pop_off"); + PANIC("pop_off when cpu->noff < 1"); cpu->noff -= 1; @@ -89,8 +89,8 @@ __attribute__((warn_unused_result)) bool spin_trylock(spinlock_t *l) { } void spin_unlock(spinlock_t *l) { - // if (!spin_is_holding(l)) - // panic("spin_unlock"); + if (!spin_is_holding(l)) + PANIC("Unlocking a spinlock that is not held by the locking cpu!"); l->cpu = 0; @@ -98,10 +98,10 @@ void spin_unlock(spinlock_t *l) { uint32_t dummy; __asm__ volatile("amoswap.w.rl %0, %2, (%1)\n" : "=&r"(dummy) : "r"(&l->v), "r"(0u) : "memory"); - // __sync_synchronize(); // No loads/stores after this point + __sync_synchronize(); // No loads/stores after this point // __sync_lock_release(&lk->locked); // Essentially lk->locked = 0 - // pop_off(); + pop_off(); } /** @@ -110,8 +110,11 @@ void spin_unlock(spinlock_t *l) { void spin_lock(spinlock_t *l) { uint32_t backoff = 1; for (;;) { - if (spin_trylock(l)) + if (spin_trylock(l)) { + l->cpu = mycpu(); + push_off(); return; + } while (__atomic_load_n(&l->v, __ATOMIC_RELAXED) != 0) { for (uint32_t i = 0; i < backoff; ++i) @@ -120,8 +123,6 @@ void spin_lock(spinlock_t *l) { backoff <<= 1; } } - - l->cpu = mycpu(); } /** diff --git a/kern/libkern/string.c b/kern/libkern/string.c index e6c0000..308292f 100644 --- a/kern/libkern/string.c +++ b/kern/libkern/string.c @@ -114,18 +114,6 @@ void *memset(void *dest, int c, size_t n) { return dest; } -// int memcmp(const void *s1, const void *s2, size_t n) { -// if (n != 0) { -// const unsigned char *p1 = s1, *p2 = s2; -// -// do { -// if (*p1++ != *p2++) -// return (*--p1 - *--p2); -// } while (--n != 0); -// } -// return (0); -// } - char *itoa(int value, char *str, int base) { char *p = str; char *p1, *p2; @@ -166,39 +154,6 @@ char *itoa(int value, char *str, int base) { return str; } -// void *memset(void *dst, int c, size_t length) { -// u8 *ptr = (u8 *)dst; -// const u8 value = (u8)c; -// -// while (length--) *(ptr++) = value; -// -// return dst; -// } - -// void *memcpy(void *dst, const void *src, size_t len) { -// u8 *d = (u8 *)dst; -// const u8 *s = (const u8 *)src; -// for (size_t i = 0; i < len; i++) { -// d[i] = s[i]; -// } -// return dst; -// } - -// void *memmove(void *dst, const void *src, size_t len) { -// u8 *d = (u8 *)dst; -// const u8 *s = (const u8 *)src; -// if (d < s) { -// for (size_t i = 0; i < len; i++) { -// d[i] = s[i]; -// } -// } else if (d > s) { -// for (size_t i = len; i > 0; i--) { -// d[i - 1] = s[i - 1]; -// } -// } -// return dst; -// } - int memcmp(const void *s1, const void *s2, size_t len) { const u8 *a = (const u8 *)s1; const u8 *b = (const u8 *)s2;