diff --git a/include/base/crtlib.h b/include/base/crtlib.h index 9bdd0b7..b6f6f28 100644 --- a/include/base/crtlib.h +++ b/include/base/crtlib.h @@ -183,14 +183,14 @@ unsigned long strtoul(const char *restrict, char **restrict, int); //------------------------------------------// -void *calloc(size_t, size_t) __attribute__((__malloc__)); -void *malloc(size_t) __attribute__((__malloc__)); -void free(void *); +void *calloc(size_t, size_t) __attribute__((__malloc__)); +void *malloc(size_t) __attribute__((__malloc__)); +void free(void *); //------------------------------------------// int rand(void); -void srand(unsigned int); +void srand(unsigned long); //------------------------------------------// diff --git a/include/kernel/base.h b/include/kernel/base.h index 113c711..2fe40ac 100644 --- a/include/kernel/base.h +++ b/include/kernel/base.h @@ -153,6 +153,14 @@ extern CpuCore_t _KeCPUTable[NCPUS]; //----------------------------------------------------------------------------// +#ifdef NDEBUG +#define DEBUG if(0) +#else +#define DEBUG if(1) +#endif + +//----------------------------------------------------------------------------// + error_t KernLog(const char *, ...); #ifndef _NO_DEBUG diff --git a/include/kernel/heap.h b/include/kernel/heap.h index b5de219..eccce67 100644 --- a/include/kernel/heap.h +++ b/include/kernel/heap.h @@ -31,9 +31,17 @@ //----------------------------------------------------------------------------// +// Absolute heap max +#define MM_HEAP_MAX (256 * MB) + // Address of the heap extern void *_heap_start; + +// Current end of the heap extern void *_heap_end; + +// Maximal size of the heap +// (Default: MM_HEAP_MAX) extern size_t _heap_max; void MmInitHeap(void); diff --git a/kaleid/kernel/init/table.c b/kaleid/kernel/init/table.c index aec98a7..4067e5b 100644 --- a/kaleid/kernel/init/table.c +++ b/kaleid/kernel/init/table.c @@ -25,7 +25,7 @@ #include int KeCPUCount = 1; -CpuCore_t _KeCPUTable[NCPUS] = {0}; +CpuCore_t _KeCPUTable[NCPUS] = {0}; volatile BootInfo_t BtBootTab = {0}; volatile bool KeIsPanicking = 0; diff --git a/kaleid/kernel/io/rtc.c b/kaleid/kernel/io/rtc.c index 427590d..bed3dd4 100644 --- a/kaleid/kernel/io/rtc.c +++ b/kaleid/kernel/io/rtc.c @@ -208,6 +208,40 @@ Time_t* IoGetRtcTime(void) return &IoRtcTime; } +static uint IsLeapYear(uint year) +{ + if (!(year % 4)) { + return 0; + } + + return year % 100 == 0 + ? (year % 400 == 0) + : 1; +} + +static uint DaysInMonth(uint month, uint year) +{ + return (month == 2) + ? (28 + IsLeapYear(year)) + : 31 - (month - 1) % 7 % 2; +} + +ulong IoGetTimeStamp(void) +{ + Time_t *time = IoGetRtcTime(); + + uint dpy = 365 + IsLeapYear(time->year); + uint dim = DaysInMonth(time->month, time->year + time->century * 100); + + return time->sec + + time->min * 60 + + time->hour * 60 * 60 + + time->day * 24 * 60 * 60 + + time->month * dim * 24 * 60 * 60 + + (time->year + time->century * 100) + * dpy * 24 * 60 * 60; +} + ulong IoGetRtcTicks(void) { return IoRtcTicks; @@ -251,6 +285,8 @@ void IoEnableRtc(void) GetTimeFromRtc(); KeRestoreIRQs(flags); IoEnableNMI(); + + srand(IoGetTimeStamp()); } void IoRtcWait(uint time) // time in ms diff --git a/kaleid/kernel/mm/heap.c b/kaleid/kernel/mm/heap.c index 16562d1..d29d284 100644 --- a/kaleid/kernel/mm/heap.c +++ b/kaleid/kernel/mm/heap.c @@ -54,7 +54,7 @@ void MmInitHeap(void) // Initialize the heap _heap_end = _heap_start; - _heap_max = MmGetAvailZoneSize(_heap_end); + _heap_max = lmin(MM_HEAP_MAX, MmGetAvailZoneSize(_heap_end)); KernLog("[InitHeap] Start address : %p, Max length : %u Mio\n\n", _heap_start, _heap_max / MB); diff --git a/kaleid/kernel/sh/shcmds.c b/kaleid/kernel/sh/shcmds.c index 7307b95..c02bdb8 100644 --- a/kaleid/kernel/sh/shcmds.c +++ b/kaleid/kernel/sh/shcmds.c @@ -82,6 +82,9 @@ error_t CmdMemMap(int argc, char **argv, char *cmdline) error_t CmdMemUsage(int argc, char **argv, char *cmdline) { + char var; + (void)var; + size_t stack_cur; size_t img_diff, stack_diff; size_t heap_start, heap_end; @@ -95,9 +98,15 @@ error_t CmdMemUsage(int argc, char **argv, char *cmdline) KeRestoreIRQs(flags); - img_diff = (size_t)BtLoaderInfo.kernelEndAddr - (size_t)BtLoaderInfo.kernelAddr; - stack_diff = (size_t)BtLoaderInfo.stackEndAddr - ((size_t)BtLoaderInfo.kernelEndAddr + 16); + img_diff = (size_t)BtLoaderInfo.kernelEndAddr + - (size_t)BtLoaderInfo.kernelAddr; + + stack_diff = (size_t)BtLoaderInfo.stackEndAddr + - ((size_t)BtLoaderInfo.kernelEndAddr + 16); + heap_diff = (size_t)heap_end - (size_t)heap_start; + + stack_cur = (size_t)BtLoaderInfo.stackEndAddr - (size_t)&var; KernLog("Kernel image\n"); @@ -126,20 +135,14 @@ error_t CmdMemUsage(int argc, char **argv, char *cmdline) _ADDR_TO_MB((size_t)BtLoaderInfo.stackEndAddr), _ADDR_TO_KB((size_t)BtLoaderInfo.stackEndAddr), _ADDR_TO_B((size_t)BtLoaderInfo.stackEndAddr)); - - BARRIER(); - char var; - (void)var; - - stack_cur = (size_t)BtLoaderInfo.stackEndAddr - (size_t)&var; - KernLog("\tends at:\t\t%p (%4luMB + %4luKB + %4luB)\n", + KernLog("\tcurrently at:\t%p (%4luMB + %4luKB + %4luB)\n", (size_t)&var, _ADDR_TO_MB((size_t)&var), _ADDR_TO_KB((size_t)&var), _ADDR_TO_B((size_t)&var)); - KernLog("\tmin addr:\t\t%p (%4luMB + %4luKB + %4luB)\n", + KernLog("\tmin address:\t%p (%4luMB + %4luKB + %4luB)\n", (size_t)BtLoaderInfo.kernelEndAddr+16, _ADDR_TO_MB((size_t)BtLoaderInfo.kernelEndAddr+16), _ADDR_TO_KB((size_t)BtLoaderInfo.kernelEndAddr+16), diff --git a/kaleid/kernel/sh/shell.c b/kaleid/kernel/sh/shell.c index 9da298c..4d931a9 100644 --- a/kaleid/kernel/sh/shell.c +++ b/kaleid/kernel/sh/shell.c @@ -60,7 +60,7 @@ void KeStartShell(void) uchar ch; error_t rc; - char cmdbuf[CMDBUFSIZE] = { 0 }; + char *cmdbuf = malloc(CMDBUFSIZE); char *bufptr = cmdbuf; argv0 = malloc(ARG_MAX); @@ -78,7 +78,7 @@ void KeStartShell(void) bufptr = cmdbuf; ExecuteCommand(cmdbuf); - memzero(cmdbuf, sizeof(cmdbuf)); + memzero(cmdbuf, CMDBUFSIZE); BFlushBuf(BStdIn); KernLog("shell> "); BFlushBuf(BStdOut); @@ -130,7 +130,7 @@ void KeStartShell(void) bufptr = cmdbuf; ExecuteCommand(cmdbuf); - memzero(cmdbuf, sizeof(cmdbuf)); + memzero(cmdbuf, CMDBUFSIZE); KernLog("shell> "); BFlushBuf(BStdIn); BFlushBuf(BStdOut); diff --git a/kaleid/libc/rand.c b/kaleid/libc/rand.c index 187e41c..eb87ceb 100644 --- a/kaleid/libc/rand.c +++ b/kaleid/libc/rand.c @@ -27,7 +27,7 @@ // // Seed value // -static ulong next = 7756; +static ulong next = 1; // // Returns a pseudo-random integer @@ -42,7 +42,7 @@ int rand(void) // // (Re)Set the random seed // -void srand(uint seed) +void srand(ulong seed) { next = (ulong)seed; }