From 1afd6e2cd7323f07575d422b9360885b0960a493 Mon Sep 17 00:00:00 2001 From: a92126 <182859762@qq.com> Date: Thu, 1 Aug 2024 17:48:00 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=8F=E8=BF=87=E4=BA=86review=EF=BC=8C?= =?UTF-8?q?=E8=BF=99=E6=89=B9=E6=AC=A1=E7=9A=84kernel=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=9C=89=E5=B0=8F=E6=94=B9=E5=8A=A8=EF=BC=8C=E4=B8=BB=E8=A6=81?= =?UTF-8?q?=E5=8C=85=E6=8B=AC=E5=86=85=E5=AD=98=E5=9D=97=E7=9A=84=E5=BC=95?= =?UTF-8?q?=E7=94=A8=E7=94=B1void*=E5=8F=98=E6=88=90=E4=BA=86u8*=EF=BC=8C?= =?UTF-8?q?=E5=8F=A6=E5=A4=96=E4=B8=A4=E7=A7=8D=E6=83=85=E5=86=B5=E6=98=AF?= =?UTF-8?q?=E6=8A=8A=E5=AD=97=E9=9D=A2=E9=87=8F=E7=9A=84=E6=8E=A9=E7=A0=81?= =?UTF-8?q?=E5=8F=98=E6=88=90inline=E5=87=BD=E6=95=B0=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=8F=AF=E8=AF=BB=E6=80=A7=EF=BC=8C=E8=BF=98=E6=9C=89=E6=8A=8A?= =?UTF-8?q?noreturn=E6=A0=87=E8=AE=B0=E7=94=B1=E5=AE=8F=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E8=A3=85=E9=A5=B0=E5=99=A8=E2=80=A6=E2=80=A6TMD=E4=BD=A0?= =?UTF-8?q?=E8=B7=9F=E6=88=91=E8=AF=B4C++23=E9=83=BD=E7=94=A8=E4=B8=8A?= =?UTF-8?q?=E8=A3=85=E9=A5=B0=E5=99=A8=E4=BA=86=EF=BC=81=EF=BC=81=EF=BC=81?= =?UTF-8?q?=E7=AE=80=E7=9B=B4=E9=9A=BE=E4=BB=A5=E6=8E=A5=E5=8F=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libn3ds/kernel/include/internal/config.h | 8 +++--- libn3ds/kernel/include/internal/list.h | 17 +++++++++---- libn3ds/kernel/source/kernel.c | 31 ++++++++++++------------ libn3ds/kernel/source/slabheap.c | 8 +++--- 4 files changed, 35 insertions(+), 29 deletions(-) diff --git a/libn3ds/kernel/include/internal/config.h b/libn3ds/kernel/include/internal/config.h index 4606aa6..83ca8b1 100644 --- a/libn3ds/kernel/include/internal/config.h +++ b/libn3ds/kernel/include/internal/config.h @@ -24,10 +24,10 @@ /* * Maximum number of objects we can create (Slabheap). */ -#define MAX_TASKS (3) // Including main and idle task. -#define MAX_EVENTS (10) -#define MAX_MUTEXES (3) -#define MAX_SEMAPHORES (0) +#define MAX_TASKS (4) // Including main and idle task. +#define MAX_EVENTS (16) +#define MAX_MUTEXES (8) +#define MAX_SEMAPHORES (2) #define MAX_TIMERS (0) #define IDLE_STACK_SIZE (0x1000) // Keep in mind this stack is used in interrupt contex! TODO: Change this. diff --git a/libn3ds/kernel/include/internal/list.h b/libn3ds/kernel/include/internal/list.h index 92c9743..6784f4d 100644 --- a/libn3ds/kernel/include/internal/list.h +++ b/libn3ds/kernel/include/internal/list.h @@ -1,17 +1,20 @@ #pragma once -// Based on https://github.com/torvalds/linux/blob/master/include/linux/list.h - -#include -#include #include +#ifdef __cplusplus +extern "C" +{ +#endif + +// Based on https://github.com/torvalds/linux/blob/master/include/linux/list.h + #define LIST_INIT_VAL(name) ((ListNode){&(name), &(name)}) #define LIST_ENTRY(ptr, type, member) \ ({ \ - void *__mptr = (void*)(ptr); \ + u8 *__mptr = (void*)(ptr); \ (type*)(__mptr - (size_t)&((type*)0)->member); \ }) @@ -101,3 +104,7 @@ static inline ListNode* listRemoveHead(ListNode *start) #define listPop(start) listRemoveTail((start)) #define listPushTail(start, node) listAddAfter((start), (node)) #define listPopHead(start) listRemoveHead((start)) + +#ifdef __cplusplus +} // extern "C" +#endif \ No newline at end of file diff --git a/libn3ds/kernel/source/kernel.c b/libn3ds/kernel/source/kernel.c index d0013d1..822de6a 100644 --- a/libn3ds/kernel/source/kernel.c +++ b/libn3ds/kernel/source/kernel.c @@ -1,6 +1,6 @@ /* - * This file is part of open_agb_firm - * Copyright (C) 2021 derrek, profi200 + * This file is part of libn3ds + * Copyright (C) 2024 derrek, profi200 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,13 +17,12 @@ */ #include -#include #include #include "types.h" #include "kernel.h" #include "internal/config.h" #include "internal/kernel_private.h" -#include "internal/kmemcpy_set.h" +#include "memory.h" #include "internal/slabheap.h" #include "internal/util.h" #include "internal/list.h" @@ -41,7 +40,7 @@ static TaskCb *g_curDeadTask = NULL; // TODO: Improve dead task handling. static KRes scheduler(TaskState curTaskState); -noreturn static void kernelIdleTask(void); +[[noreturn]] static void kernelIdleTask(void); static void initKernelState(void) { @@ -66,7 +65,7 @@ void kernelInit(uint8_t priority) initKernelState(); TaskCb *const idleT = (TaskCb*)slabAlloc(&g_taskSlab); - void *const iStack = malloc(IDLE_STACK_SIZE); + u8 *const iStack = malloc(IDLE_STACK_SIZE); TaskCb *const mainT = (TaskCb*)slabCalloc(&g_taskSlab, sizeof(TaskCb)); if(idleT == NULL || iStack == NULL || mainT == NULL) { @@ -88,7 +87,7 @@ void kernelInit(uint8_t priority) mainT->prio = priority; g_curTask = mainT; - g_readyBitmap = 1u<<1; // The idle task has priority 1 and is always ready. + g_readyBitmap = BIT(1); // The idle task has priority 1 and is always ready. listPush(&g_runQueues[1], &idleT->node); g_numTasks = 2; } @@ -102,7 +101,7 @@ KHandle createTask(size_t stackSize, uint8_t priority, TaskFunc entry, void *tas SlabHeap *const taskSlabPtr = &g_taskSlab; TaskCb *const newT = (TaskCb*)slabAlloc(taskSlabPtr); - void *const stack = malloc(stackSize); + u8 *const stack = malloc(stackSize); if(newT == NULL || stack == NULL) { slabFree(taskSlabPtr, newT); @@ -111,7 +110,7 @@ KHandle createTask(size_t stackSize, uint8_t priority, TaskFunc entry, void *tas } cpuRegs *const regs = (cpuRegs*)(stack + stackSize - sizeof(cpuRegs)); - kmemset((u32*)regs, 0, sizeof(cpuRegs)); + clear32((u32*)regs, 0, sizeof(cpuRegs)); regs->lr = (u32)entry; newT->prio = priority; newT->id = g_numTasks; // TODO: Make this more sophisticated. @@ -123,7 +122,7 @@ KHandle createTask(size_t stackSize, uint8_t priority, TaskFunc entry, void *tas kernelLock(); listPush(&g_runQueues[priority], &newT->node); - g_readyBitmap |= 1u<prio; listPushTail(&runQueues[curPrio], &curTask->node); - readyBitmap = 1u<prio; + readyBitmap |= BIT(task->prio); task->res = res; listPushTail(&runQueues[task->prio], &task->node); } while(!listEmpty(waitQueue) && --wakeCount); @@ -240,7 +239,7 @@ static KRes scheduler(TaskState curTaskState) } listPush(&runQueues[curPrio], &curTask->node); - readyBitmap |= 1u< #include #include "internal/slabheap.h" -#include "internal/kmemcpy_set.h" +#include "memory.h" @@ -29,7 +29,7 @@ void slabInit(SlabHeap *slab, size_t objSize, size_t num) listInit(slab); - void *pool = malloc(objSize * num); + u8 *pool = malloc(objSize * num); if(!pool) return; do { @@ -48,7 +48,7 @@ void* slabAlloc(SlabHeap *slab) void* slabCalloc(SlabHeap *slab, size_t clrSize) { void *const ptr = slabAlloc(slab); - if(ptr) kmemset(ptr, 0, clrSize); + if(ptr) clear32(ptr, 0, clrSize); return ptr; }