diff --git a/kern/libkern/limits.h b/kern/libkern/limits.h new file mode 100644 index 0000000..de21df2 --- /dev/null +++ b/kern/libkern/limits.h @@ -0,0 +1,26 @@ +/* Support signed or unsigned plain-char */ + +#if '\xff' > 0 +#define CHAR_MIN 0 +#define CHAR_MAX 255 +#else +#define CHAR_MIN (-128) +#define CHAR_MAX 127 +#endif + +#define CHAR_BIT 8 +#define SCHAR_MIN (-128) +#define SCHAR_MAX 127 +#define UCHAR_MAX 255 +#define SHRT_MIN (-1 - 0x7fff) +#define SHRT_MAX 0x7fff +#define USHRT_MAX 0xffff +#define INT_MIN (-1 - 0x7fffffff) +#define INT_MAX 0x7fffffff +#define UINT_MAX 0xffffffffU +#define LONG_MIN (-LONG_MAX - 1) +#define LONG_MAX __LONG_MAX +#define ULONG_MAX (2UL * LONG_MAX + 1) +#define LLONG_MIN (-LLONG_MAX - 1) +#define LLONG_MAX 0x7fffffffffffffffLL +#define ULLONG_MAX (2ULL * LLONG_MAX + 1) diff --git a/kern/libkern/string.c b/kern/libkern/string.c index 0d37792..90d852f 100644 --- a/kern/libkern/string.c +++ b/kern/libkern/string.c @@ -154,15 +154,10 @@ char *itoa(int value, char *str, int base) { return str; } -int memcmp(const void *s1, const void *s2, size_t len) { - const u8 *a = (const u8 *)s1; - const u8 *b = (const u8 *)s2; - for (size_t i = 0; i < len; i++) { - if (a[i] != b[i]) { - return (int)a[i] - (int)b[i]; - } - } - return 0; +int memcmp(const void *vl, const void *vr, size_t n) { + const unsigned char *l = vl, *r = vr; + for (; n && *l == *r; n--, l++, r++); + return n ? *l - *r : 0; } size_t strlen(const char *s) { diff --git a/kern/start.c b/kern/start.c index c892765..7d0e855 100644 --- a/kern/start.c +++ b/kern/start.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -11,6 +12,7 @@ #include #include #include +#include /** * Allocate one stack per CPU (hart). @@ -39,7 +41,7 @@ void start() { // cpu (struct Cpu). write_tp(id); - if (id == 0) { + if (unlikely(id == 0)) { /* Here we will do a bunch of initialization steps */ memory_sweep(heap_start, heap_end); buddy_init(heap_start, heap_end); @@ -60,6 +62,23 @@ void start() { else PANIC("Some cores seem to have been enumerated incorrectly!\n"); + { + FreeList fl; + void *mem = buddy_alloc(4096); + fl_init(&fl, (uintptr_t)mem, 4096, sizeof(int)); + + uint32_t *hello = fl_alloc(&fl); + + *hello = UINT32_MAX; + + int a = fl_available(&fl); + assert_msg(fl_check(&fl) > 0, "FreeList checking failed, might be corrupt."); + kprintf("Available: %d\n", a); + kprintf("Size: %d\n", fl.size); + + buddy_free(mem); + } + kprintf("To exit qemu, press CTRL+a followed by x\n"); spin_unlock(&sl); }