diff --git a/kern/libkern/endian.h b/kern/libkern/endian.h index 3f9132f..13f0f3b 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 b9ccd8b..7dc6658 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 when cpu->noff < 1"); + PANIC("pop_off"); 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("Unlocking a spinlock that is not held by the locking cpu!"); + // if (!spin_is_holding(l)) + // panic("spin_unlock"); 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,11 +110,8 @@ void spin_unlock(spinlock_t *l) { void spin_lock(spinlock_t *l) { uint32_t backoff = 1; for (;;) { - if (spin_trylock(l)) { - l->cpu = mycpu(); - push_off(); + if (spin_trylock(l)) return; - } while (__atomic_load_n(&l->v, __ATOMIC_RELAXED) != 0) { for (uint32_t i = 0; i < backoff; ++i) @@ -123,6 +120,8 @@ void spin_lock(spinlock_t *l) { backoff <<= 1; } } + + l->cpu = mycpu(); } /** diff --git a/kern/libkern/string.c b/kern/libkern/string.c index 308292f..e6c0000 100644 --- a/kern/libkern/string.c +++ b/kern/libkern/string.c @@ -114,6 +114,18 @@ 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; @@ -154,6 +166,39 @@ 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;