From c93208d300e4400070873d6820b03ff9b59a51c7 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 27 Aug 2021 14:26:01 +0800 Subject: [PATCH 001/221] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E6=9E=B6?= =?UTF-8?q?=E6=9E=84=E6=A8=A1=E5=9D=97=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APILib/APILib.c | 0 Hal/Psi/HalBoot.c | 0 Hal/Psi/HalCPU.c | 0 Hal/Psi/HalCache.c | 0 Hal/Psi/HalFirmware.c | 0 Hal/Psi/HalIPC.c | 0 Hal/Psi/HalInterface.c | 0 Hal/Psi/HalInterrupt.c | 0 Hal/Psi/HalMMU.c | 0 Hal/Psi/HalSync.c | 0 Hal/Psi/HalVirtual.c | 0 Hal/X86_64/HalBoot.c | 0 Hal/X86_64/HalCPU.c | 0 Hal/X86_64/HalCache.c | 0 Hal/X86_64/HalFirmware.c | 0 Hal/X86_64/HalIPC.c | 0 Hal/X86_64/HalInterface.c | 0 Hal/X86_64/HalInterrupt.c | 0 Hal/X86_64/HalMMU.c | 0 Hal/X86_64/HalSync.c | 0 Hal/X86_64/HalVirtual.c | 0 Include/APILibInc/APILib.h | 0 Include/BaseInc/BaseType.h | 0 Include/HalInc/PsiInc/HalBoot.h | 0 Include/HalInc/PsiInc/HalCPU.h | 0 Include/HalInc/PsiInc/HalCache.h | 0 Include/HalInc/PsiInc/HalFirmware.h | 0 Include/HalInc/PsiInc/HalIPC.h | 0 Include/HalInc/PsiInc/HalInterface.h | 0 Include/HalInc/PsiInc/HalInterrupt.h | 0 Include/HalInc/PsiInc/HalMMU.h | 0 Include/HalInc/PsiInc/HalSync.h | 0 Include/HalInc/PsiInc/HalVirtual.h | 0 Include/HalInc/X86_64Inc/HalBoot.h | 0 Include/HalInc/X86_64Inc/HalCPU.h | 0 Include/HalInc/X86_64Inc/HalCache.h | 0 Include/HalInc/X86_64Inc/HalFirmware.h | 0 Include/HalInc/X86_64Inc/HalIPC.h | 0 Include/HalInc/X86_64Inc/HalInterface.h | 0 Include/HalInc/X86_64Inc/HalInterrupt.h | 0 Include/HalInc/X86_64Inc/HalMMU.h | 0 Include/HalInc/X86_64Inc/HalSync.h | 0 Include/HalInc/X86_64Inc/HalVirtual.h | 0 Include/KernelInc/ExecutorInc/KrlExecutor.c | 0 Include/KernelInc/ExecutorInc/KrlExecutorCom.c | 0 Include/KernelInc/ExecutorInc/KrlExecutorInterface.c | 0 Include/KernelInc/ExecutorInc/KrlExecutorManage.c | 0 Include/KernelInc/ExecutorInc/KrlExecutorRes.c | 0 Include/KernelInc/ExecutorInc/KrlExecutorSync.c | 0 Include/KernelInc/ExecutorInc/KrlThread.c | 0 Include/KernelInc/ExecutorInc/KrlTransfer.c | 0 Include/KernelInc/MemoryInc/KrlMmAlloc.h | 0 Include/KernelInc/MemoryInc/KrlMmCache.h | 0 Include/KernelInc/MemoryInc/KrlMmInterface.h | 0 Include/KernelInc/MemoryInc/KrlMmManage.h | 0 Include/KernelInc/MemoryInc/KrlMmPool.h | 0 Include/KernelInc/MemoryInc/KrlMmReclaim.h | 0 Include/KernelInc/MemoryInc/KrlMmVmem.h | 0 Include/KernelInc/ObjectInc/KrlObjAsyncIPC.h | 0 Include/KernelInc/ObjectInc/KrlObjExecutor.h | 0 Include/KernelInc/ObjectInc/KrlObjInterface.h | 0 Include/KernelInc/ObjectInc/KrlObjManage.h | 0 Include/KernelInc/ObjectInc/KrlObjMem.h | 0 Include/KernelInc/ObjectInc/KrlObjSecurity.h | 0 Include/KernelInc/ObjectInc/KrlObjSyncIPC.h | 0 Include/KernelInc/ObjectInc/KrlObjThread.h | 0 Include/KernelInc/ObjectInc/KrlObjUniversal.h | 0 Kernel/Executor/KrlExecutor.c | 0 Kernel/Executor/KrlExecutorCom.c | 0 Kernel/Executor/KrlExecutorInterface.c | 0 Kernel/Executor/KrlExecutorManage.c | 0 Kernel/Executor/KrlExecutorRes.c | 0 Kernel/Executor/KrlExecutorSync.c | 0 Kernel/Executor/KrlThread.c | 0 Kernel/Executor/KrlTransfer.c | 0 Kernel/Memory/KrlMmAlloc.c | 0 Kernel/Memory/KrlMmCache.c | 0 Kernel/Memory/KrlMmInterface.c | 0 Kernel/Memory/KrlMmManage.c | 0 Kernel/Memory/KrlMmPool.c | 0 Kernel/Memory/KrlMmReclaim.c | 0 Kernel/Memory/KrlMmVmem.c | 0 Kernel/Object/KrlObjAsyncIPC.c | 0 Kernel/Object/KrlObjExecutor.c | 0 Kernel/Object/KrlObjInterface.c | 0 Kernel/Object/KrlObjManage.c | 0 Kernel/Object/KrlObjMem.c | 0 Kernel/Object/KrlObjSecurity.c | 0 Kernel/Object/KrlObjSyncIPC.c | 0 Kernel/Object/KrlObjThread.c | 0 Kernel/Object/KrlObjUniversal.c | 0 91 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 APILib/APILib.c create mode 100644 Hal/Psi/HalBoot.c create mode 100644 Hal/Psi/HalCPU.c create mode 100644 Hal/Psi/HalCache.c create mode 100644 Hal/Psi/HalFirmware.c create mode 100644 Hal/Psi/HalIPC.c create mode 100644 Hal/Psi/HalInterface.c create mode 100644 Hal/Psi/HalInterrupt.c create mode 100644 Hal/Psi/HalMMU.c create mode 100644 Hal/Psi/HalSync.c create mode 100644 Hal/Psi/HalVirtual.c create mode 100644 Hal/X86_64/HalBoot.c create mode 100644 Hal/X86_64/HalCPU.c create mode 100644 Hal/X86_64/HalCache.c create mode 100644 Hal/X86_64/HalFirmware.c create mode 100644 Hal/X86_64/HalIPC.c create mode 100644 Hal/X86_64/HalInterface.c create mode 100644 Hal/X86_64/HalInterrupt.c create mode 100644 Hal/X86_64/HalMMU.c create mode 100644 Hal/X86_64/HalSync.c create mode 100644 Hal/X86_64/HalVirtual.c create mode 100644 Include/APILibInc/APILib.h create mode 100644 Include/BaseInc/BaseType.h create mode 100644 Include/HalInc/PsiInc/HalBoot.h create mode 100644 Include/HalInc/PsiInc/HalCPU.h create mode 100644 Include/HalInc/PsiInc/HalCache.h create mode 100644 Include/HalInc/PsiInc/HalFirmware.h create mode 100644 Include/HalInc/PsiInc/HalIPC.h create mode 100644 Include/HalInc/PsiInc/HalInterface.h create mode 100644 Include/HalInc/PsiInc/HalInterrupt.h create mode 100644 Include/HalInc/PsiInc/HalMMU.h create mode 100644 Include/HalInc/PsiInc/HalSync.h create mode 100644 Include/HalInc/PsiInc/HalVirtual.h create mode 100644 Include/HalInc/X86_64Inc/HalBoot.h create mode 100644 Include/HalInc/X86_64Inc/HalCPU.h create mode 100644 Include/HalInc/X86_64Inc/HalCache.h create mode 100644 Include/HalInc/X86_64Inc/HalFirmware.h create mode 100644 Include/HalInc/X86_64Inc/HalIPC.h create mode 100644 Include/HalInc/X86_64Inc/HalInterface.h create mode 100644 Include/HalInc/X86_64Inc/HalInterrupt.h create mode 100644 Include/HalInc/X86_64Inc/HalMMU.h create mode 100644 Include/HalInc/X86_64Inc/HalSync.h create mode 100644 Include/HalInc/X86_64Inc/HalVirtual.h create mode 100644 Include/KernelInc/ExecutorInc/KrlExecutor.c create mode 100644 Include/KernelInc/ExecutorInc/KrlExecutorCom.c create mode 100644 Include/KernelInc/ExecutorInc/KrlExecutorInterface.c create mode 100644 Include/KernelInc/ExecutorInc/KrlExecutorManage.c create mode 100644 Include/KernelInc/ExecutorInc/KrlExecutorRes.c create mode 100644 Include/KernelInc/ExecutorInc/KrlExecutorSync.c create mode 100644 Include/KernelInc/ExecutorInc/KrlThread.c create mode 100644 Include/KernelInc/ExecutorInc/KrlTransfer.c create mode 100644 Include/KernelInc/MemoryInc/KrlMmAlloc.h create mode 100644 Include/KernelInc/MemoryInc/KrlMmCache.h create mode 100644 Include/KernelInc/MemoryInc/KrlMmInterface.h create mode 100644 Include/KernelInc/MemoryInc/KrlMmManage.h create mode 100644 Include/KernelInc/MemoryInc/KrlMmPool.h create mode 100644 Include/KernelInc/MemoryInc/KrlMmReclaim.h create mode 100644 Include/KernelInc/MemoryInc/KrlMmVmem.h create mode 100644 Include/KernelInc/ObjectInc/KrlObjAsyncIPC.h create mode 100644 Include/KernelInc/ObjectInc/KrlObjExecutor.h create mode 100644 Include/KernelInc/ObjectInc/KrlObjInterface.h create mode 100644 Include/KernelInc/ObjectInc/KrlObjManage.h create mode 100644 Include/KernelInc/ObjectInc/KrlObjMem.h create mode 100644 Include/KernelInc/ObjectInc/KrlObjSecurity.h create mode 100644 Include/KernelInc/ObjectInc/KrlObjSyncIPC.h create mode 100644 Include/KernelInc/ObjectInc/KrlObjThread.h create mode 100644 Include/KernelInc/ObjectInc/KrlObjUniversal.h create mode 100644 Kernel/Executor/KrlExecutor.c create mode 100644 Kernel/Executor/KrlExecutorCom.c create mode 100644 Kernel/Executor/KrlExecutorInterface.c create mode 100644 Kernel/Executor/KrlExecutorManage.c create mode 100644 Kernel/Executor/KrlExecutorRes.c create mode 100644 Kernel/Executor/KrlExecutorSync.c create mode 100644 Kernel/Executor/KrlThread.c create mode 100644 Kernel/Executor/KrlTransfer.c create mode 100644 Kernel/Memory/KrlMmAlloc.c create mode 100644 Kernel/Memory/KrlMmCache.c create mode 100644 Kernel/Memory/KrlMmInterface.c create mode 100644 Kernel/Memory/KrlMmManage.c create mode 100644 Kernel/Memory/KrlMmPool.c create mode 100644 Kernel/Memory/KrlMmReclaim.c create mode 100644 Kernel/Memory/KrlMmVmem.c create mode 100644 Kernel/Object/KrlObjAsyncIPC.c create mode 100644 Kernel/Object/KrlObjExecutor.c create mode 100644 Kernel/Object/KrlObjInterface.c create mode 100644 Kernel/Object/KrlObjManage.c create mode 100644 Kernel/Object/KrlObjMem.c create mode 100644 Kernel/Object/KrlObjSecurity.c create mode 100644 Kernel/Object/KrlObjSyncIPC.c create mode 100644 Kernel/Object/KrlObjThread.c create mode 100644 Kernel/Object/KrlObjUniversal.c diff --git a/APILib/APILib.c b/APILib/APILib.c new file mode 100644 index 0000000..e69de29 diff --git a/Hal/Psi/HalBoot.c b/Hal/Psi/HalBoot.c new file mode 100644 index 0000000..e69de29 diff --git a/Hal/Psi/HalCPU.c b/Hal/Psi/HalCPU.c new file mode 100644 index 0000000..e69de29 diff --git a/Hal/Psi/HalCache.c b/Hal/Psi/HalCache.c new file mode 100644 index 0000000..e69de29 diff --git a/Hal/Psi/HalFirmware.c b/Hal/Psi/HalFirmware.c new file mode 100644 index 0000000..e69de29 diff --git a/Hal/Psi/HalIPC.c b/Hal/Psi/HalIPC.c new file mode 100644 index 0000000..e69de29 diff --git a/Hal/Psi/HalInterface.c b/Hal/Psi/HalInterface.c new file mode 100644 index 0000000..e69de29 diff --git a/Hal/Psi/HalInterrupt.c b/Hal/Psi/HalInterrupt.c new file mode 100644 index 0000000..e69de29 diff --git a/Hal/Psi/HalMMU.c b/Hal/Psi/HalMMU.c new file mode 100644 index 0000000..e69de29 diff --git a/Hal/Psi/HalSync.c b/Hal/Psi/HalSync.c new file mode 100644 index 0000000..e69de29 diff --git a/Hal/Psi/HalVirtual.c b/Hal/Psi/HalVirtual.c new file mode 100644 index 0000000..e69de29 diff --git a/Hal/X86_64/HalBoot.c b/Hal/X86_64/HalBoot.c new file mode 100644 index 0000000..e69de29 diff --git a/Hal/X86_64/HalCPU.c b/Hal/X86_64/HalCPU.c new file mode 100644 index 0000000..e69de29 diff --git a/Hal/X86_64/HalCache.c b/Hal/X86_64/HalCache.c new file mode 100644 index 0000000..e69de29 diff --git a/Hal/X86_64/HalFirmware.c b/Hal/X86_64/HalFirmware.c new file mode 100644 index 0000000..e69de29 diff --git a/Hal/X86_64/HalIPC.c b/Hal/X86_64/HalIPC.c new file mode 100644 index 0000000..e69de29 diff --git a/Hal/X86_64/HalInterface.c b/Hal/X86_64/HalInterface.c new file mode 100644 index 0000000..e69de29 diff --git a/Hal/X86_64/HalInterrupt.c b/Hal/X86_64/HalInterrupt.c new file mode 100644 index 0000000..e69de29 diff --git a/Hal/X86_64/HalMMU.c b/Hal/X86_64/HalMMU.c new file mode 100644 index 0000000..e69de29 diff --git a/Hal/X86_64/HalSync.c b/Hal/X86_64/HalSync.c new file mode 100644 index 0000000..e69de29 diff --git a/Hal/X86_64/HalVirtual.c b/Hal/X86_64/HalVirtual.c new file mode 100644 index 0000000..e69de29 diff --git a/Include/APILibInc/APILib.h b/Include/APILibInc/APILib.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/BaseInc/BaseType.h b/Include/BaseInc/BaseType.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/HalInc/PsiInc/HalBoot.h b/Include/HalInc/PsiInc/HalBoot.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/HalInc/PsiInc/HalCPU.h b/Include/HalInc/PsiInc/HalCPU.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/HalInc/PsiInc/HalCache.h b/Include/HalInc/PsiInc/HalCache.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/HalInc/PsiInc/HalFirmware.h b/Include/HalInc/PsiInc/HalFirmware.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/HalInc/PsiInc/HalIPC.h b/Include/HalInc/PsiInc/HalIPC.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/HalInc/PsiInc/HalInterface.h b/Include/HalInc/PsiInc/HalInterface.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/HalInc/PsiInc/HalInterrupt.h b/Include/HalInc/PsiInc/HalInterrupt.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/HalInc/PsiInc/HalMMU.h b/Include/HalInc/PsiInc/HalMMU.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/HalInc/PsiInc/HalSync.h b/Include/HalInc/PsiInc/HalSync.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/HalInc/PsiInc/HalVirtual.h b/Include/HalInc/PsiInc/HalVirtual.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/HalInc/X86_64Inc/HalBoot.h b/Include/HalInc/X86_64Inc/HalBoot.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/HalInc/X86_64Inc/HalCPU.h b/Include/HalInc/X86_64Inc/HalCPU.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/HalInc/X86_64Inc/HalCache.h b/Include/HalInc/X86_64Inc/HalCache.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/HalInc/X86_64Inc/HalFirmware.h b/Include/HalInc/X86_64Inc/HalFirmware.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/HalInc/X86_64Inc/HalIPC.h b/Include/HalInc/X86_64Inc/HalIPC.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/HalInc/X86_64Inc/HalInterface.h b/Include/HalInc/X86_64Inc/HalInterface.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/HalInc/X86_64Inc/HalInterrupt.h b/Include/HalInc/X86_64Inc/HalInterrupt.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/HalInc/X86_64Inc/HalMMU.h b/Include/HalInc/X86_64Inc/HalMMU.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/HalInc/X86_64Inc/HalSync.h b/Include/HalInc/X86_64Inc/HalSync.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/HalInc/X86_64Inc/HalVirtual.h b/Include/HalInc/X86_64Inc/HalVirtual.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/ExecutorInc/KrlExecutor.c b/Include/KernelInc/ExecutorInc/KrlExecutor.c new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/ExecutorInc/KrlExecutorCom.c b/Include/KernelInc/ExecutorInc/KrlExecutorCom.c new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/ExecutorInc/KrlExecutorInterface.c b/Include/KernelInc/ExecutorInc/KrlExecutorInterface.c new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/ExecutorInc/KrlExecutorManage.c b/Include/KernelInc/ExecutorInc/KrlExecutorManage.c new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/ExecutorInc/KrlExecutorRes.c b/Include/KernelInc/ExecutorInc/KrlExecutorRes.c new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/ExecutorInc/KrlExecutorSync.c b/Include/KernelInc/ExecutorInc/KrlExecutorSync.c new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/ExecutorInc/KrlThread.c b/Include/KernelInc/ExecutorInc/KrlThread.c new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/ExecutorInc/KrlTransfer.c b/Include/KernelInc/ExecutorInc/KrlTransfer.c new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/MemoryInc/KrlMmCache.h b/Include/KernelInc/MemoryInc/KrlMmCache.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/MemoryInc/KrlMmInterface.h b/Include/KernelInc/MemoryInc/KrlMmInterface.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/MemoryInc/KrlMmReclaim.h b/Include/KernelInc/MemoryInc/KrlMmReclaim.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/MemoryInc/KrlMmVmem.h b/Include/KernelInc/MemoryInc/KrlMmVmem.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/ObjectInc/KrlObjAsyncIPC.h b/Include/KernelInc/ObjectInc/KrlObjAsyncIPC.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/ObjectInc/KrlObjExecutor.h b/Include/KernelInc/ObjectInc/KrlObjExecutor.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/ObjectInc/KrlObjInterface.h b/Include/KernelInc/ObjectInc/KrlObjInterface.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/ObjectInc/KrlObjManage.h b/Include/KernelInc/ObjectInc/KrlObjManage.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/ObjectInc/KrlObjMem.h b/Include/KernelInc/ObjectInc/KrlObjMem.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/ObjectInc/KrlObjSecurity.h b/Include/KernelInc/ObjectInc/KrlObjSecurity.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/ObjectInc/KrlObjSyncIPC.h b/Include/KernelInc/ObjectInc/KrlObjSyncIPC.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/ObjectInc/KrlObjThread.h b/Include/KernelInc/ObjectInc/KrlObjThread.h new file mode 100644 index 0000000..e69de29 diff --git a/Include/KernelInc/ObjectInc/KrlObjUniversal.h b/Include/KernelInc/ObjectInc/KrlObjUniversal.h new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Executor/KrlExecutor.c b/Kernel/Executor/KrlExecutor.c new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Executor/KrlExecutorCom.c b/Kernel/Executor/KrlExecutorCom.c new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Executor/KrlExecutorInterface.c b/Kernel/Executor/KrlExecutorInterface.c new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Executor/KrlExecutorManage.c b/Kernel/Executor/KrlExecutorManage.c new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Executor/KrlExecutorRes.c b/Kernel/Executor/KrlExecutorRes.c new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Executor/KrlExecutorSync.c b/Kernel/Executor/KrlExecutorSync.c new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Executor/KrlThread.c b/Kernel/Executor/KrlThread.c new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Executor/KrlTransfer.c b/Kernel/Executor/KrlTransfer.c new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Memory/KrlMmCache.c b/Kernel/Memory/KrlMmCache.c new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Memory/KrlMmInterface.c b/Kernel/Memory/KrlMmInterface.c new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Memory/KrlMmReclaim.c b/Kernel/Memory/KrlMmReclaim.c new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Memory/KrlMmVmem.c b/Kernel/Memory/KrlMmVmem.c new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Object/KrlObjAsyncIPC.c b/Kernel/Object/KrlObjAsyncIPC.c new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Object/KrlObjExecutor.c b/Kernel/Object/KrlObjExecutor.c new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Object/KrlObjInterface.c b/Kernel/Object/KrlObjInterface.c new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Object/KrlObjManage.c b/Kernel/Object/KrlObjManage.c new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Object/KrlObjMem.c b/Kernel/Object/KrlObjMem.c new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Object/KrlObjSecurity.c b/Kernel/Object/KrlObjSecurity.c new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Object/KrlObjSyncIPC.c b/Kernel/Object/KrlObjSyncIPC.c new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Object/KrlObjThread.c b/Kernel/Object/KrlObjThread.c new file mode 100644 index 0000000..e69de29 diff --git a/Kernel/Object/KrlObjUniversal.c b/Kernel/Object/KrlObjUniversal.c new file mode 100644 index 0000000..e69de29 From 664665486a8b5a529897a420753095a864ab2fc1 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 30 Aug 2021 16:20:18 +0800 Subject: [PATCH 002/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/BaseInc/BaseType.h | 49 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/Include/BaseInc/BaseType.h b/Include/BaseInc/BaseType.h index e69de29..b001630 100644 --- a/Include/BaseInc/BaseType.h +++ b/Include/BaseInc/BaseType.h @@ -0,0 +1,49 @@ +/********************************************************** + 基本数据类型文件BaseType.h +*********************************************************** + 彭东 +**********************************************************/ +#ifndef _BASETYPEHEAD +#define _BASETYPEHEAD +//无符号整数类型 +typedef unsigned char U8; +typedef unsigned short U16; +typedef unsigned int U32; +typedef unsigned long U64; +//有符号整数类型 +typedef char S8; +typedef short S16; +typedef int S32; +typedef long S64; +//通用有/无符号整数类型 +typedef long SInt; +typedef unsigned long UInt; +//CPU标志寄存器类型 +typedef U64 CPUFlg; +//地址类型 +typedef unsigned long Adrr; +//布尔类型 +typedef SInt Bool; +//字符串类型 +typedef const char* String; +//字符类型 +typedef char Char; +//句柄类型 +typedef SInt Hand; +//缓冲区地址类型 +typedef void* Buff; +//大小类型 +typedef unsigned long Size; + +#define KLINE static inline +#define PUBLIC +#define private static +#define EXTERN extern +#define KEXTERN extern +#define NULL (0UL) +#define TRUE (1UL) +#define FALSE (0UL) + +#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) + +#endif \ No newline at end of file From 9137ebc4898e8182fdac856b473ad71212c8f612 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 30 Aug 2021 16:20:45 +0800 Subject: [PATCH 003/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8E=9F=E5=AD=90?= =?UTF-8?q?=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/BaseInc/Atomic.h | 117 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100755 Include/BaseInc/Atomic.h diff --git a/Include/BaseInc/Atomic.h b/Include/BaseInc/Atomic.h new file mode 100755 index 0000000..0cec3db --- /dev/null +++ b/Include/BaseInc/Atomic.h @@ -0,0 +1,117 @@ +/********************************************************** + 原子操作头文件Atomic.h +*********************************************************** + 彭东 +**********************************************************/ +#ifndef _ATOMICHEAD +#define _ATOMICHEAD + +typedef struct ATOMIC{ + volatile S32 Count; +}Atomic; + +typedef struct REFCOUNT +{ + Atomic ARef; +}RefCount; + + +KLINE S32 AtomicRead(const Atomic *A) +{ + return (*(volatile U32 *)&(A)->Count); +} + +KLINE void AtomicSet(Atomic *A, S32 Val) +{ + A->Count = Val; +} + +KLINE void AtomicAdd(S32 Val, Atomic *A) +{ + __asm__ __volatile__("lock;" + "addl %1,%0" + : "+m"(A->Count) + : "ir"(I)); +} + +KLINE void AtomicSub(S32 Val, Atomic *A) +{ + __asm__ __volatile__("lock;" + "subl %1,%0" + : "+m"(A->Count) + : "ir"(Val)); +} + +KLINE S32 AtomicSubAndTest(S32 Val, Atomic *A) +{ + unsigned char c; + + __asm__ __volatile__("lock;" + "subl %2,%0; sete %1" + : "+m"(A->Count), "=qm"(c) + : "ir"(Val) + : "memory"); + return c; +} + +KLINE void AtomicInc(Atomic *A) +{ + __asm__ __volatile__("lock;" + "incl %0" + : "+m"(A->Count)); +} + +KLINE void AtomicDec(Atomic *A) +{ + __asm__ __volatile__("lock;" + "decl %0" + : "+m"(A->Count)); +} + +KLINE S32 AtomicDecAndTest(Atomic *A) +{ + unsigned char c; + + __asm__ __volatile__("lock;" + "decl %0; sete %1" + : "+m"(A->Count), "=qm"(c) + : + : "memory"); + return c != 0; +} + +KLINE S32 AtomicIncAndTest(Atomic *A) +{ + unsigned char c; + + __asm__ __volatile__("lock;" + "incl %0; sete %1" + : "+m"(A->Count), "=qm"(c) + : + : "memory"); + return c != 0; +} + +KLINE void RefCountInit(RefCount *init) +{ + AtomicSet(&init->ARef, 0); + return; +} + +KLINE void RefCountInc(RefCount *Ref) +{ + AtomicInc(&Ref->ARef); + return; +} + +KLINE void RefCountDec(RefCount *Ref) +{ + AtomicDec(&Ref->ARef); +} + +KLINE S32 RefCountRead(RefCount *Ref) +{ + return AtomicRead(&Ref->ARef); +} + +#endif From 60c197b0e37e24bb60d1eff932e3bb81f65d4785 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 30 Aug 2021 16:21:05 +0800 Subject: [PATCH 004/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=93=BE=E8=A1=A8?= =?UTF-8?q?=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/BaseInc/List.h | 129 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100755 Include/BaseInc/List.h diff --git a/Include/BaseInc/List.h b/Include/BaseInc/List.h new file mode 100755 index 0000000..1a14806 --- /dev/null +++ b/Include/BaseInc/List.h @@ -0,0 +1,129 @@ +/********************************************************** + 链表头文件list.h +*********************************************************** + 彭东 +**********************************************************/ +#ifndef _LISTHEAD +#define _LISTHEAD + +typedef struct LIST { + struct LIST *Prev; + struct LIST *Next; +}List; + +KLINE void ListInit(List *list) +{ + list->Prev = list; + list->Next = list; + return; +} + +KLINE void ListDelRealize(List *prev, List *next) +{ + next->Prev = prev; + prev->Next = next; + return; +} + +KLINE void ListAddRealize(List *new, List *prev, List *next) +{ + next->Prev = new; + new->Next = next; + new->Prev = prev; + prev->Next = new; + return; +} + +KLINE void ListAdd(List *new, List *head) +{ + ListAddRealize(new, head, head->Next); + return; +} + +KLINE void ListAddTail(List *new, List *head) +{ + ListAddRealize(new, head->Prev, head); + return; +} + +KLINE void ListDelEntryRealize(List *entry) +{ + ListDelRealize(entry->Prev, entry->Next); + return; +} + +KLINE void ListDel(List *entry) +{ + ListDelRealize(entry->Prev, entry->Next); + ListInit(entry); + return; +} + +KLINE void ListMove(List *list, List *head) +{ + ListDel(list); + ListAdd(list, head); + return; +} +KLINE void ListMoveTail(List *list, List *head) +{ + ListDel(list); + ListAddTail(list, head); + return; +} + +KLINE Bool ListIsEmpty(const List *head) +{ + if (head->Next == head) + { + return TRUE; + } + return FALSE; +} + +KLINE Bool ListIsFirst(const List* list, const List* head) +{ + if(list->Prev == head) + { + return TRUE; + } + return FALSE; +} + +KLINE Bool ListIsLast(const List* list, const List* head) +{ + if(list->Next == head) + { + return TRUE; + } + return FALSE; +} + +KLINE Bool ListIsEmptyCareful(const List *head) +{ + List *Next = head->Next; + if (Next == head && Next == head->Prev) + { + return TRUE; + } + return FALSE; +} + +#define ListForEach(pos, head) for (pos = (head)->Next; pos != (head); pos = pos->Next) + +#define ListForEachHeadDell(pos, head) for (pos = (head)->Next; pos != (head); pos = (head)->Next) + +#define ListEntry(ptr, type, member) \ + ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member))) + +#define ListFirstOne(head, o_type, o_member) ListEntry((head)->Next, o_type, o_member) + +#define ListNextEntry(pos, type, member) \ + ListEntry((pos)->member.Next, type, member) + + +#define ListPrevEntry(pos, type, member) \ + ListEntry((pos)->member.Prev, type, member) + + +#endif From 965ace5ece41995b8af8dbad4b499aeef9bc8fc2 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 30 Aug 2021 16:21:27 +0800 Subject: [PATCH 005/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=98=9F=E5=88=97?= =?UTF-8?q?=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/BaseInc/Queue.h | 141 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 Include/BaseInc/Queue.h diff --git a/Include/BaseInc/Queue.h b/Include/BaseInc/Queue.h new file mode 100644 index 0000000..d96cfce --- /dev/null +++ b/Include/BaseInc/Queue.h @@ -0,0 +1,141 @@ +/********************************************************** + 队列头文件Queue.h +*********************************************************** + 彭东 +**********************************************************/ +#ifndef _QUEUEHEAD +#define _QUEUEHEAD +typedef struct QNODE +{ + List Node; + void* Obj; + void* Ext; +}QNode; + +typedef struct QUEUE +{ + List QHead; + QNode* QCurr; +}Queue; + +KLINE void QnodeInit(QNode* init) +{ + if(NULL == init) + { + return; + } + ListInit(&init->Node); + init->Obj = NULL; + init->Ext = NULL; + return; +} + +KLINE void QueueInit(Queue* init) +{ + if(NULL == init) + { + return; + } + ListInit(&init->QHead); + init->QCurr = NULL; + return; +} + +KLINE Bool QueueIsEmpty(Queue* q) +{ + if(NULL == q) + { + return TRUE; + } + if(ListIsEmptyCareful(&q->QHead) == TRUE) + { + return TRUE; + } + return FALSE; +} + +KLINE QNode* QueuePop(Queue* q) +{ + List* prev; + QNode* qn; + if(NULL == q) + { + return NULL; + } + if(NULL == q->QCurr || ListIsEmptyCareful(&q->QHead) == TRUE) + { + return NULL; + } + + qn = q->QCurr; + prev = qn->Node.Prev; + + ListDel(&qn->Node); + if(ListIsEmptyCareful(&q->QHead) == TRUE) + { + q->QCurr = NULL; + return qn; + } + q->QCurr = ListEntry(prev, QNode, Node); + return qn; +} + +KLINE QNode* QueuePush(Queue* q, QNode* qn) +{ + if(NULL == q || NULL == qn) + { + return NULL; + } + ListAddTail(&qn->Node, &q->QHead); + q->QCurr = qn; + return qn; +} + +KLINE QNode* QueueAdd(Queue* q, QNode* qn) +{ + if(NULL == q || NULL == qn) + { + return NULL; + } + ListAddTail(&qn->Node, &q->QHead); + return qn; +} + +KLINE QNode* QueuePoll(Queue* q) +{ + QNode* qn; + if(NULL == q) + { + return NULL; + } + if(ListIsEmptyCareful(&q->QHead) == TRUE) + { + return NULL; + } + qn = ListFirstOneObj(&q->QHead, QNode, Node); + ListDel(&qn->Node); + return qn; +} + +KLINE QNode* NewQNode(void* obj) +{ + QNode* qn = (QNode*)kmsob_new(sizeof(QNode)); + if(NULL == qn) + { + return NULL; + } + QNodeInit(qn); + qn->qn_obj = obj; + return qn; +} + +KLINE Bool DelQonde(QNode* qn) +{ + if(NULL == qn) + { + return FALSE; + } + return kmsob_delete((void*)qn, sizeof(QNode)); +} + +#endif From 0e5fe025b6e523d48c66d835ad6b0895acb88a2b Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 30 Aug 2021 16:21:47 +0800 Subject: [PATCH 006/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BA=A2=E9=BB=91?= =?UTF-8?q?=E6=A0=91=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/BaseInc/RBTree.h | 1034 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 1034 insertions(+) create mode 100644 Include/BaseInc/RBTree.h diff --git a/Include/BaseInc/RBTree.h b/Include/BaseInc/RBTree.h new file mode 100644 index 0000000..48bd7a4 --- /dev/null +++ b/Include/BaseInc/RBTree.h @@ -0,0 +1,1034 @@ +/********************************************************** + 红黑树头文件RBTree.h +*********************************************************** + 彭东 +**********************************************************/ +#ifndef _RBTREEHEAD +#define _RBTREEHEAD + +#define RBRED (0) +#define RBBLACK (1) + + +#define RBERR (0) +#define RBLEFT (1) +#define RBRIGHT (2) + +typedef struct RBTFLAGS +{ + U16 Type; + U16 Color; + U32 Hight; +}__attribute__((packed)) RBTFlags; + + +typedef struct RBTREE +{ + RBTFlags Flags; + struct RBTREE* Left; + struct RBTREE* Right; + struct RBTREE* Parent; +}RBTree; + +typedef struct RBROOT +{ + UInt Count; + RBTree* MostLeft; + RBTree* Node; + RBTree* MostRight; +}RBRoot; + +typedef UInt (*RBPathCMP)(RBTree* srcrb, RBTree* cmprb); +typedef UInt (*RBRePlace)(RBTree* srcrb, RBTree* reprb); +typedef UInt (*RBDelAfter)(RBTree* delrb); + +KLINE void RBTreeInit(RBTree* init) +{ + if(NULL == init) + { + return; + } + init->Flags.Color = RBRED; + init->Flags.Type = 0; + init->Flags.Hight = 0; + init->Left = NULL; + init->Right = NULL; + init->Parent = NULL; + return; +} + +KLINE void RBRootInit(RBRoot* init) +{ + if(NULL == init) + { + return; + } + init->Count = 0; + init->MostLeft = NULL; + init->Node = NULL; + init->MostRight = NULL; + return; +} + +KLINE void RBTreeSetColor(RBTree* rbtree, U16 color) +{ + if(NULL == rbtree) + { + return; + } + rbtree->Flags.Color = color; + return; +} + +KLINE Bool RBTreeColorIsRed(RBTree* rbtree) +{ + if(NULL == rbtree) + { + return FALSE; + } + if(RBRED == rbtree->Flags.Color) + { + return TRUE; + } + return FALSE; +} + +KLINE Bool RBTreeColorIsBlack(RBTree* rbtree) +{ + if(NULL == rbtree) + { + return TRUE; + } + if(RBBLACK == rbtree->Flags.Color) + { + return TRUE; + } + return FALSE; +} + +KLINE RBTree* RBTreeSibling(RBTree* rbtree) +{ + RBTree* parent; + if(NULL == rbtree) + { + return NULL; + } + parent = rbtree->Parent; + if(NULL == parent) + { + return NULL; + } + if(parent->Left == rbtree) + { + return parent->Right; + } + else + { + return parent->Left; + } +} + +KLINE RBTree* RBTreeUncle(RBTree* rbtree) +{ + if(NULL == rbtree) + { + return NULL; + } + if(NULL == rbtree->Parent) + { + return NULL; + } + return RBTreeSibling(rbtree->Parent); +} + +KLINE RBTree* RBTreeParent(RBTree* rbtree) +{ + if(NULL == rbtree) + { + return NULL; + } + return rbtree->Parent; +} + +KLINE Bool RBTreeIsRight(RBTree* rbtree) +{ + RBTree* parent; + if(NULL == rbtree) + { + return FALSE; + } + parent = rbtree->Parent; + if(NULL == parent) + { + return FALSE; + } + if(parent->Right == rbtree) + { + return TRUE; + } + else + { + return FALSE; + } +} + + +KLINE bool_t RBTreeIsLeft(RBTree* rbtree) +{ + RBTree* parent; + if(NULL == rbtree) + { + return FALSE; + } + parent = rbtree->Parent; + if(NULL == parent) + { + return FALSE; + } + if(parent->Left == rbtree) + { + return TRUE; + } + else + { + return FALSE; + } +} + +KLINE Bool RBTreeIsRoot(RBTree* rbtree) +{ + if(NULL == rbtree) + { + return FALSE; + } + if(NULL == rbtree->Parent) + { + return TRUE; + } + return FALSE; +} + +KLINE Bool RBTreeIsLeaf(RBTree* rbtree) +{ + if(NULL == rbtree) + { + return FALSE; + } + if((NULL == rbtree->Left) && (NULL == rbtree->Right)) + { + return TRUE; + } + return FALSE; +} + + +KLINE RBTree* RBTreeGrand(RBTree* rbtree) +{ + if(NULL == rbtree) + { + return NULL; + } + if(NULL == rbtree->Parent) + { + return NULL; + } + return rbtree->Parent->Parent; +} + +/* +查找前驱节点 +即 查找小于当前节点的最大节点 +*/ + +KLINE RBTree* RBTreeFindPrecursor(RBTree* rbtree) +{ + RBTree* rbt; + RBTree* p; + if(NULL == rbtree) + { + return NULL; + } + else if(NULL != rbtree->Left) + { + rbt = rbtree->Left; + while(NULL != rbt->Right) + { + rbt = rbt->Right; + } + return rbt; + } + else + { + rbt = rbtree; + p = rbt->Parent; + while (NULL != p && rbt == p->Left) + { + rbt = p; + p = p->Parent; + } + return p; + } + return NULL; +} + +/* +查找后继节点 +即 查找大于当前节点的最小节点 +*/ +KLINE RBTree* RBTreeFindSuccessor(RBTree* rbtree) +{ + RBTree* rbt; + RBTree* p; + if(NULL == rbtree) + { + return NULL; + } + else if(NULL != rbtree->Right) + { + rbt = rbtree->Right; + while(NULL != rbt->Left) + { + rbt = rbt->Left; + } + return rbt; + } + else + { + rbt = rbtree; + p = rbt->Parent; + while (NULL != p && rbt == p->Right) + { + rbt = p; + p = p->Parent; + } + return p; + } + return NULL; +} + + +/* + P 12 + / / + PLA 8 + / \ / \ + ALB ARC 7 10 + / \ / \ + CLE CRF 9 11 + + P 12 + / / + ARC 10 + / \ / \ + PLA CRF 8 11 + / \ / \ + ALB CLE 7 9 + +第1:变色 +条件: + (1)当前节点是红色 + (2)当前节点的父亲节点是红色 + (3)当前节点的叔叔节点是红色 +操作: + (1)当前节点的父亲节点变黑色 + (2)当前节点的叔叔节点变黑色 + (3)当前节点的爷爷节点变红色 + (4)当前节点的爷爷节点设为当前节点 + + +第2:左旋 +条件: + (1)当前节点的父亲节点是红色 + (2)当前节点的叔叔节点是黑色 + (3)当前节点是父亲节点的右子树 +操作: + (1)当前节点的父亲节点为基础进行左旋 + +第3:右旋 +条件: + (1)当前节点的父亲节点是红色 + (2)当前节点的叔叔节点是黑色 + (3)当前节点是父亲节点的左子树 +操作: + (1)当前节点的父亲节点变成黑色 + (2)当前节点的爷爷节点变成红色 + (3)当前节点的爷爷节点为基础进行右旋 +*/ + + + +KLINE RBTree* RBTreeRightRotate(RBRoot* rbroot, RBTree* rbtree) +{ + RBTree* P; + RBTree* R; + RBTree* RLN; + RBTree* TR; + if(NULL == rbtree || NULL == rbroot) + { + return NULL; + } + + R = rbtree; + P = R->Parent; + RLN = R->Left; + TR = RLN->Right; + if(NULL == RLN) + { + return NULL; + } + if(NULL != TR) + { + TR->Parent = R; + } + R->Left = TR; + RLN->Right = R; + R->Parent = RLN; + RLN->Parent = P; + + if(NULL == P) + { + rbroot->Node = RLN; + return R; + } + else + { + if(R == P->Left) + { + P->Left = RLN; + } + else + { + P->Right = RLN; + } + return R; + } + return NULL; +} + +KLINE RBTree* RBTreeLeftRotate(RBRoot* rbroot, RBTree* rbtree) +{ + RBTree* P; + RBTree* R; + RBTree* RRN; + RBTree* TL; + if(NULL == rbtree || NULL == rbroot) + { + return NULL; + } + + R = rbtree; + P = R->Parent; + RRN = R->Right; + TL = RRN->Left; + + if(NULL == RRN) + { + return NULL; + } + + if(NULL != TL) + { + TL->Parent = R; + } + + R->Right = TL; + RRN->Left = R; + R->Parent = RRN; + RRN->Parent = P; + + if(NULL == P) + { + rbroot->Node = RRN; + return R; + } + else + { + if(R == P->Left) + { + P->Left = RRN; + } + else + { + P->Right = RRN; + } + return R; + } + return NULL; +} + + + +KLINE RBTree* RBTreeFixColorReal(RBRoot* rbroot, RBTree* rbtree) +{ + RBTree* rbt; + if(NULL == rbtree || NULL == rbroot) + { + return NULL; + } + rbt = rbtree; + while(rbt) + { + if(RBTreeIsRoot(rbt) == TRUE) + { + RBTreeSetColor(rbt, RBBLACK); + return rbt; + } + + if(RBTreeColorIsBlack(RBTreeParent(rbt)) == TRUE) + { + return rbt; + } + + if((RBTreeColorIsRed(rbt) == TRUE) && + (RBTreeColorIsRed(RBTreeParent(rbt)) == TRUE) && + (RBTreeColorIsRed(RBTreeUncle(rbt)) == TRUE)) + { + RBTreeSetColor(RBTreeParent(rbt), RBBLACK); + RBTreeSetColor(RBTreeUncle(rbt), RBBLACK); + RBTreeSetColor(RBTreeGrand(rbt), RBRED); + rbt = RBTreeGrand(rbt); + } + else + { + return rbt; + } + } + return NULL; +} + + + +/* +(LL) + 4B + / + 2R + / + 1R +父节点变成黑色,爷爷节点变成红色 + 4R + / + 2B + / + 1R +爷爷节点右旋 + 2B + / \ + 1R 4R + +(RR) + 2B + \ + 3R + \ + 4R +父节点变成黑色,爷爷节点变成红色 + 2R + \ + 3B + \ + 4R +爷爷节点左旋 + 3B + / \ + 2R 4R + +(LR) + 4B + / + 2R + \ + 3R +当前节点变成黑色,爷爷节点变成红色 + 4R + / + 2R + \ + 3B +父节点左旋 + 4R + / + 3B + / + 2R +爷爷节点右旋 + 3B + / \ + 2R 4R + +(RL) + 2B + \ + 4R + / + 3R +当前节点变成黑色,爷爷节点变成红色 + 2R + \ + 4R + / + 3B +父节点右旋 + 2R + \ + 3B + \ + 4R +爷爷节点左旋 + 3B + / \ + 2R 4B +*/ + +KLINE RBTree* RBTreeFixRotate(RBRoot* rbroot, RBTree* rbtree) +{ + if(NULL == rbtree || NULL == rbroot) + { + return NULL; + } + + if(RBTreeColorIsRed(RBTreeParent(rbtree)) == FALSE || + RBTreeColorIsBlack(RBTreeUncle(rbtree)) == FALSE) + { + return NULL; + } + + if(RBTreeIsLeft(RBTreeParent(rbtree)) == TRUE)//L + { + + if(RBTreeIsLeft(rbtree) == TRUE)//LL父节点变成黑色,爷爷节点变成红色,爷爷节点右旋 + { + RBTreeSetColor(RBTreeParent(rbtree), RBBLACK); + RBTreeSetColor(RBTreeGrand(rbtree), RBRED); + RBTreeRightRotate(rbroot, RBTreeGrand(rbtree)); + return rbtree; + } + else //LR 当前节点变成黑色,爷爷节点变成红色,父节点左旋,爷爷节点右旋 + { + RBTreeSetColor(rbtree, RBBLACK); + RBTreeSetColor(RBTreeGrand(rbtree), RBRED); + RBTreeLeftRotate(rbroot, RBTreeParent(rbtree)); + RBTreeRightRotate(rbroot, RBTreeGrand(rbtree)); + return rbtree; + } + } + else//R + { + if(RBTreeIsLeft(rbtree) == TRUE)//RL当前节点变成黑色,爷爷节点变成红色,父节点右旋,爷爷节点左旋 + { + RBTreeSetColor(rbtree, RBBLACK); + RBTreeSetColor(RBTreeGrand(rbtree), RBRED); + RBTreeRightRotate(rbroot, RBTreeParent(rbtree)); + RBTreeLeftRotate(rbroot, RBTreeGrand(rbtree)); + return rbtree; + } + else//RR 父节点变成黑色,爷爷节点变成红色,爷爷节点左旋 + { + RBTreeSetColor(RBTreeParent(rbtree), RBBLACK); + RBTreeSetColor(RBTreeGrand(rbtree), RBRED); + RBTreeLeftRotate(rbroot, RBTreeGrand(rbtree)); + return rbtree; + } + } + return NULL; +} + + + +KLINE RBTree* RBTreeAdd(RBRoot* root, RBTree* rbtree, RBPathCMP cmper) +{ + RBTree* srcrb; + uint_t rets; + if(NULL == root || NULL == rbtree || NULL == cmper) + { + return NULL; + } + if(NULL == root->Node) + { + root->Node = rbtree; + rbtree->Parent = NULL; + RBTreeSetColor(rbtree, RBBLACK); + return rbtree; + } + srcrb = root->Node; + while(NULL != srcrb) + { + rets = cmper(srcrb, rbtree); + if(RBLEFT == rets) + { + if(NULL == srcrb->Left) + { + srcrb->Left = rbtree; + rbtree->Parent = srcrb; + break; + } + srcrb = srcrb->Left; + } + else if(RBRIGHT == rets) + { + if(NULL == srcrb->Right) + { + srcrb->Right = rbtree; + rbtree->Parent = srcrb; + break; + } + srcrb = srcrb->Right; + } + else + { + return NULL; + } + } + return rbtree; +} + +KLINE RBTree* RBTreeSerch(RBRoot* root, u32_t key) +{ + RBTree* srcrb; + // uint_t rets; + if(NULL == root) + { + return NULL; + } + if(NULL == root->Node) + { + + return NULL; + } + srcrb = root->Node; + while(NULL != srcrb) + { + // rets = cmper(srcrb, rbtree); + if(key == srcrb->Flags.Hight) + { + return srcrb; + } + if(key < srcrb->Flags.Hight) + { + srcrb = srcrb->Left; + } + else + { + srcrb = srcrb->Right; + } + } + return NULL; +} + +KLINE RBTree* RBTreeAddAfterFix(RBRoot* rbroot, RBTree* rbtree) +{ + RBTree* node; + RBTree* uncle; + if(NULL == rbroot || NULL == rbtree) + { + return NULL; + } + node = rbtree; + while((NULL != node) && (rbroot->Node != node) && (RBTreeColorIsRed(RBTreeParent(node)) == TRUE)) + { + if(RBTreeIsLeft(RBTreeParent(node)) == TRUE) + { + uncle = RBTreeGrand(node)->Right; + if(RBTreeColorIsRed(uncle) == TRUE) + { + RBTreeSetColor(RBTreeParent(node), RBBLACK); + RBTreeSetColor(uncle, RBBLACK); + RBTreeSetColor(RBTreeGrand(node), RBRED); + node = RBTreeGrand(node); + } + else + { + if(RBTreeIsRight(node) == TRUE) + { + node = RBTreeParent(node); + RBTreeLeftRotate(rbroot, node); + } + RBTreeSetColor(RBTreeParent(node), RBBLACK); + RBTreeSetColor(RBTreeGrand(node), RBRED); + RBTreeRightRotate(rbroot, RBTreeGrand(node)); + } + } + else + { + uncle = RBTreeGrand(node)->Left; + if(RBTreeColorIsRed(uncle) == TRUE) + { + RBTreeSetColor(RBTreeParent(node), RBBLACK); + RBTreeSetColor(uncle, RBBLACK); + RBTreeSetColor(RBTreeGrand(node), RBRED); + node = RBTreeGrand(node); + } + else + { + if(RBTreeIsLeft(node) == TRUE) + { + node = RBTreeParent(node); + RBTreeRightRotate(rbroot, node); + } + RBTreeSetColor(RBTreeParent(node), RBBLACK); + RBTreeSetColor(RBTreeGrand(node), RBRED); + RBTreeLeftRotate(rbroot, RBTreeGrand(node)); + } + } + } + RBTreeSetColor(rbroot->Node, RBBLACK); + return rbtree; +} + +KLINE RBTree* RBTreeAddAfter(RBRoot* rbroot, RBTree* rbtree) +{ + RBTree* rbt; + if(NULL == rbtree) + { + return NULL; + } + rbt = rbtree; + while(NULL != rbt) + { + rbt = RBTreeFixColorReal(rbroot, rbt); + + rbt = RBTreeFixRotate(rbroot, rbt); + } + return rbtree; +} + +KLINE RBTree* RBTreeInsert(RBRoot* root, RBTree* rbtree, RBPathCMP cmper) +{ + RBTree* rbt; + rbt = RBTreeAdd(root, rbtree, cmper); + return RBTreeAddAfterFix(root, rbtree); +} + +KLINE RBTree* RBTreeRemoveAfterFix(RBRoot* root, RBTree* rbtree) +{ + RBTree* rsib; + RBTree* rbnode; + if(NULL == rbtree || NULL == root) + { + return NULL; + } + rbnode = rbtree; + while((rbnode != root->Node) && (RBTreeColorIsBlack(rbnode) == TRUE)) + { + if(RBTreeIsLeft(rbnode) == TRUE) + { + rsib = rbnode->Parent->Right; + if((RBTreeColorIsRed(rsib) == TRUE)) + { + RBTreeSetColor(rsib, RBBLACK); + RBTreeSetColor(rbnode->Parent, RBRED); + RBTreeLeftRotate(root, rbnode->Parent); + rsib = rbnode->Parent->Right; + } + + if((RBTreeColorIsBlack(rsib->Left) == TRUE)&& + (RBTreeColorIsBlack(rsib->Right) == TRUE)) + { + RBTreeSetColor(rsib, RBRED); + rbnode = rbnode->Parent; + } + else + { + if((RBTreeColorIsBlack(rsib->Right) == TRUE)) + { + RBTreeSetColor(rsib->Left, RBBLACK); + RBTreeSetColor(rsib, RBRED); + RBTreeRightRotate(root, rsib); + rsib = rbnode->Parent->Right; + } + RBTreeSetColor(rsib, rbnode->Parent->Flags.Color); + RBTreeSetColor(rbnode->Parent, RBBLACK); + RBTreeSetColor(rsib->Right, RBBLACK); + RBTreeLeftRotate(root, rbnode->Parent); + rbnode = root->Node; + } + } + else + { + rsib = rbnode->Parent->Left; + if((RBTreeColorIsRed(rsib) == TRUE)) + { + RBTreeSetColor(rsib, RBBLACK); + RBTreeSetColor(rbnode->Parent, RBRED); + RBTreeRightRotate(root, rbnode->Parent); + rsib = rbnode->Parent->Left; + } + + if((RBTreeColorIsBlack(rsib->Right) == TRUE)&& + (RBTreeColorIsBlack(rsib->Left) == TRUE)) + { + RBTreeSetColor(rsib, RBRED); + rbnode = rbnode->Parent; + } + else + { + if((RBTreeColorIsBlack(rsib->Left) == TRUE)) + { + RBTreeSetColor(rsib->Right, RBBLACK); + RBTreeSetColor(rsib, RBRED); + RBTreeLeftRotate(root, rsib); + rsib = rbnode->Parent->Left; + } + RBTreeSetColor(rsib, rbnode->Parent->Flags.Color); + RBTreeSetColor(rbnode->Parent, RBBLACK); + RBTreeSetColor(rsib->Left, RBBLACK); + RBTreeRightRotate(root, rbnode->Parent); + rbnode = root->Node; + } + } + } + RBTreeSetColor(rbnode, RBBLACK); + return rbnode; +} + +KLINE RBTree* RBTreeRemove(RBRoot* root, RBTree* rbtree, RBRePlace reper, RBDelAfter deler) +{ + RBTree* p; + RBTree* after; + RBTree* rbtnode; + RBTree* rbtrepl; + if(NULL == rbtree || NULL == root || NULL == reper || NULL == deler) + { + return NULL; + } + rbtnode = rbtree; + p = rbtnode->Parent; + + if((NULL != rbtnode->Left) && (NULL != rbtnode->Right)) + { + after = RBTreeFindSuccessor(rbtnode); + if(NULL == after) + { + return NULL; + } + reper(rbtnode, after); + rbtnode = after; + } + + rbtrepl = rbtnode->Left != NULL ? rbtnode->Left : rbtnode->Right; + + if(NULL != rbtrepl) + { + rbtrepl->Parent = rbtnode->Parent; + if(NULL == rbtrepl->Parent) + { + root->Node = rbtrepl; + } + else if(RBTreeIsLeft(rbtnode) == TRUE) + { + rbtnode->Parent->Left = rbtrepl; + } + else + { + rbtnode->Parent->Right = rbtrepl; + } + + rbtnode->Right = rbtnode->Left = rbtnode->Parent = NULL; + + if(RBTreeColorIsBlack(rbtnode) == TRUE) + { + RBTreeRemoveAfterFix(root, rbtrepl); + } + deler(rbtnode); + } + else if(NULL == rbtnode->Parent) + { + root->Node = NULL; + deler(rbtnode); + } + else + { + if(RBTreeColorIsBlack(rbtnode) == TRUE) + { + RBTreeRemoveAfterFix(root, rbtnode); + } + if(NULL != rbtnode->Parent) + { + if(RBTreeIsLeft(rbtnode) == TRUE) + { + rbtnode->Parent->Left = NULL; + } + else if(RBTreeIsRight(rbtnode) == TRUE) + { + rbtnode->Parent->Right = NULL; + } + rbtnode->Parent = NULL; + deler(rbtnode); + } + } + return NULL; +} + +KLINE RBTree* RBTreeDelete(RBRoot* root, RBTree* rbtree, RBRePlace reper, RBDelAfter deler) +{ + RBTree* rbt; + rbt = RBTreeRemove(root, rbtree, reper, deler); + return rbt; +} + +KLINE RBTree* RBTreeMostLeft(RBRoot* root) +{ + RBTree* rbtree; + if(NULL == root) + { + return NULL; + } + rbtree = root->Node; + if(NULL == rbtree) + { + return NULL; + } + while(NULL != rbtree) + { + if(NULL != rbtree->Left) + { + rbtree = rbtree->Left; + } + else if(NULL != rbtree->Right) + { + rbtree = rbtree->Right; + } + else + { + return rbtree; + } + } + return NULL; +} + +KLINE RBTree* RBTreeMostRight(RBRoot* root) +{ + RBTree* rbtree; + if(NULL == root) + { + return NULL; + } + rbtree = root->Node; + if(NULL == rbtree) + { + return NULL; + } + while(NULL != rbtree) + { + if(NULL != rbtree->Right) + { + rbtree = rbtree->Right; + } + else if(NULL != rbtree->Left) + { + rbtree = rbtree->Left; + } + else + { + return rbtree; + } + } + return NULL; +} + + +#define RBTreeEntry(ptr, type, member) \ + ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member))) + + +#endif From 0aca78c4c1f71ba4fbd3bdb9bd5475a3f1e5e00f Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 30 Aug 2021 16:22:32 +0800 Subject: [PATCH 007/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0CPU=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/HalInc/X86_64Inc/HalCPU.h | 325 ++++++++++++++++++++++++++++++ 1 file changed, 325 insertions(+) diff --git a/Include/HalInc/X86_64Inc/HalCPU.h b/Include/HalInc/X86_64Inc/HalCPU.h index e69de29..04f7369 100644 --- a/Include/HalInc/X86_64Inc/HalCPU.h +++ b/Include/HalInc/X86_64Inc/HalCPU.h @@ -0,0 +1,325 @@ +/********************************************************** + CPU头文件HalCPU.h +*********************************************************** + 彭东 +**********************************************************/ +#ifndef _HALCPUHEAD +#define _HALCPUHEAD + + +#define NORETURN __attribute__((noreturn)) +#define SYSRCALL __attribute__((regparm(3))) +#define HINTCALL __attribute__((regparm(2))) +#define FAUTCALL __attribute__((regparm(2))) + +#define REGCALL __attribute__((regparm(3))) //让GCC使用(EAX, EDX, ECX)寄存器传递参数 + +#define SAVECPUFLAGS(x) __asm__ __volatile__("pushfl ; popl %0" : "=g"(x) : "memory") +#define RESTORECPUFLAGS(x) __asm__ __volatile__("pushl %0 ; popfl" : "g"(x) : "memory") +#define CLI() __asm__ __volatile__("cli" : : : "memory") +#define STI() __asm__ __volatile__("sti" : : : "memory") + +#define HALT() __asm__ __volatile__("hlt": : : "memory") +#define STIHALT() __asm__ __volatile__("sti; hlt": : : "memory") +#define CLIHALT() __asm__ __volatile__("cli; hlt": : : "memory") + +KLINE void HalOutU8(const U16 port, const U8 val) +{ + + __asm__ __volatile__("outb %1, %0\n" + : + : "dN"(port), "a"(val)); +} + +KLINE void HalOutU8NOP(const U16 port, const U8 val) +{ + + __asm__ __volatile__("outb %1, %0\n\t" + "nop \n\t" + "nop \n\t" + "nop \n\t" + "nop \n\t" + : + : "dN"(port), "a"(val)); +} + +KLINE U8 HalInU8(const U16 port) +{ + U8 tmp; + /* GCC can optimize here if constant */ + __asm__ __volatile__("inb %1, %0\n" + : "=a"(tmp) + : "dN"(port)); + return tmp; +} + +KLINE void HalOutU16(const U16 port, const U16 val) +{ + + __asm__ __volatile__("outw %1, %0\n" + : + : "dN"(port), "a"(val)); +} + +KLINE U16 HalInU16(const U16 port) +{ + U16 tmp; + + __asm__ __volatile__("inw %1, %0\n" + : "=a"(tmp) + : "dN"(port)); + return tmp; +}; + +KLINE void HalOutU32(const U16 port, const U32 val) +{ + + __asm__ __volatile__("outl %1, %0\n" + : + : "dN"(port), "a"(val)); +} + +KLINE U32 HalInU32(const U16 port) +{ + U32 tmp; + + __asm__ __volatile__("inl %1, %0\n" + : "=a"(tmp) + : "dN"(port)); + return tmp; +} + +KLINE U64 HalReadMsr(const U32 reg) +{ + U32 eax, edx; + + __asm__ __volatile__( + "rdmsr" + : "=a"(eax), "=d"(edx) + : "c"(reg)); + + return (((U64)edx) << 32) | (U64)eax; +} + +KLINE void HalWriteMsr(const U32 reg, const U64 val) +{ + __asm__ __volatile__( + "wrmsr" + : + : "a"((U32)val), "d"((U32)(val >> 32)), "c"(reg)); +} + +KLINE void HalMemCopy(void *src, void *dest, UInt count) +{ + + U8 *ss = src, *sd = dest; + for (UInt i = 0; i < count; i++) + { + sd[i] = ss[i]; + } + return; +} + +KLINE SInt HalM2MCopy(void *sadr, void *dadr, SInt len) +{ + if (NULL == sadr || NULL == dadr || 1 > len) + { + return 0; + } + U8 *s = (U8 *)sadr, *d = (U8 *)dadr; + if (s < d) + { + for (SInt i = (len - 1); i >= 0; i--) + { + d[i] = s[i]; + } + return len; + } + if (s > d) + { + for (SInt j = 0; j < len; j++) + { + d[j] = s[j]; + } + return len; + } + if (s == d) + { + return len; + } + return 0; +} + +KLINE void HalMemSet(void *s, U8 c, UInt count) +{ + U8 *st = s; + for (UInt i = 0; i < count; i++) + { + st[i] = c; + } + return; +} + +KLINE void HalSaveFlagsCli(CPUFlg *flags) +{ + __asm__ __volatile__( + "pushfq \t\n" + "cli \t\n" + "popq %0 \t\n" + + : "=m"(*flags) + : + : "memory"); + return; +} + +KLINE void HalRestoreFlagsSti(CPUFlg *flagsres) +{ + __asm__ __volatile__( + "pushq %0 \t\n" + "popfq \t\n" + : + : "m"(*flagsres) + : "memory"); + return; +} + +KLINE void HalRestoreFlagsCli(CPUFlg *flags) +{ + __asm__ __volatile__( + "pushq %0 \t\n" + "popfq \t\n" + : "=m"(*flags) + : + : "memory"); + return; +} + +KLINE void HalSaveFlagsSti(CPUFlg *flags) +{ + __asm__ __volatile__( + "pushfq \t\n" + "popq %0\t\n" + "sti\t\n" + : + : "m"(*flags) + : "memory"); + return; +} + +KLINE U64 HalReadX86RDPMC(const int ctrsel) +{ + U32 eax, edx; + + __asm__ __volatile__( + "rdpmc" + : "=a"(eax), "=d"(edx) + : "c"(ctrsel)); + + return (((U64)edx) << 32) | (U64)eax; +} + +KLINE U64 HalReadX86RDTSC(void) +{ + U32 leax, ledx; + + __asm__ __volatile__( + "rdtsc" + : "=a"(leax), "=d"(ledx)); + + return (((U64)ledx) << 32) | (U64)leax; +} + +KLINE SInt HalSearch64RLBits(U64 val) +{ + SInt retbitnr = -1; + __asm__ __volatile__( + "bsrq %1,%q0 \t\n" + : "+r"(retbitnr) + : "rm"(val)); + return retbitnr + 1; +} + +KLINE SInt HalSearch32RLBits(U32 val) +{ + SInt retbitnr = -1; + __asm__ __volatile__( + "bsrl %1,%0 \t\n" + : "+r"(retbitnr) + : "rm"(val)); + return retbitnr + 1; +} + +KLINE U32 HalReadKESP() +{ + U32 esp; + + __asm__ __volatile__( + "movl %%esp,%0" + : "=g"(esp) + : + : "memory"); + + return esp; +} + +KLINE U64 HalReadRSP() +{ + U64 rsp; + + __asm__ __volatile__( + "movq %%rsp,%0" + : "=g"(rsp) + : + : "memory"); + + return rsp; +} + + +KLINE void HalSetCR3(U64 val) +{ + __asm__ __volatile__( + + "movq %0,%%cr3 \n\t" + : + : "r"(val) + : "memory" + ); + return; +} + +KLINE UInt HalReadCR2() +{ + UInt regtmp = 0; + __asm__ __volatile__( + "movq %%cr2,%0\n\t" + : "=r"(regtmp) + : + : "memory"); + return regtmp; +} + +KLINE UInt HalReadCR3() +{ + UInt regtmp = 0; + __asm__ __volatile__( + "movq %%cr3,%0\n\t" + : "=r"(regtmp) + : + : "memory"); + return regtmp; +} + +KLINE void HalWriteCR3(UInt val) +{ + __asm__ __volatile__( + "movq %0,%%cr3 \n\t" + : + : "r"(val) + : "memory" //, "edx" + ); + return; +} + +#endif From ac65ea1f287d67edd61eb95c520299c0b3650357 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 2 Sep 2021 17:39:26 +0800 Subject: [PATCH 008/221] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9F=BA=E6=9C=AC?= =?UTF-8?q?=E7=9A=84=E5=9C=B0=E5=9D=80=E7=B1=BB=E5=9E=8BAdrr->Addr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/BaseInc/BaseType.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/BaseInc/BaseType.h b/Include/BaseInc/BaseType.h index b001630..0f41d11 100644 --- a/Include/BaseInc/BaseType.h +++ b/Include/BaseInc/BaseType.h @@ -21,7 +21,7 @@ typedef unsigned long UInt; //CPU标志寄存器类型 typedef U64 CPUFlg; //地址类型 -typedef unsigned long Adrr; +typedef unsigned long Addr; //布尔类型 typedef SInt Bool; //字符串类型 From 1b48b4abc3ebcd474863d7f6d8f36fe2f5150aee Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 2 Sep 2021 17:45:25 +0800 Subject: [PATCH 009/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Hal=E5=B1=82=E7=9A=84?= =?UTF-8?q?=E8=87=AA=E6=97=8B=E9=94=81=E3=80=81=E4=B8=AD=E6=96=AD=E7=AD=89?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalSync.c | 124 +++++++++++++++++++++++++++++ Include/HalInc/X86_64Inc/HalSync.h | 15 ++++ 2 files changed, 139 insertions(+) diff --git a/Hal/X86_64/HalSync.c b/Hal/X86_64/HalSync.c index e69de29..3b9113c 100644 --- a/Hal/X86_64/HalSync.c +++ b/Hal/X86_64/HalSync.c @@ -0,0 +1,124 @@ +/********************************************************** + 同步文件HalSync.c +*********************************************************** + 彭东 +**********************************************************/ +#include "BaseType.h" +#include "HalCPU.h" +#include "HalSync.h" + +void HalHalt() +{ + HALT(); +} + +void HalCliHalt() +{ + CLIHALT(); +} + +void HalStiHalt() +{ + STIHALT(); +} + +void HalSti() +{ + STI(); +} + +void HalCli() +{ + CLI(); +} + + +void HalStiFlags(CPUFlg* cpuflg) +{ + HalRestoreFlagsSti(cpuflg); +} + +void HalCliFlags(CPUFlg* cpuflg) +{ + HalSaveFlagsCli(cpuflg); +} + +void HalFlagsSti(CPUFlg* cpuflg) +{ + HalSaveFlagsSti(cpuflg); +} + +void HalFlagsCli(CPUFlg* cpuflg) +{ + HalRestoreFlagsCli(cpuflg); +} + +void HalSPinLockInit(SPinLock *init) +{ + init->Lock = 0; + return; +} + +void HalSPinLock(SPinLock *lock) +{ + __asm__ __volatile__( + "1: \n" + "lock; xchg %0, %1 \n" + "cmpl $0, %0 \n" + "jnz 2f \n" + ".section .spinlock.text," + "\"ax\"" + "\n" // 重新定义一个代码段所以jnz 2f下面并不是 + "2: \n" //cmpl $0,%1 事实上下面的代码不会常常执行, + "cmpl $0, %1 \n" //这是为了不在cpu指令高速缓存中填充无用代码 + "jne 2b \n" //要知道那可是用每位6颗晶体管做的双极性静态 + "jmp 1b \n" //储存器,比内存条快几千个数量级 + ".previous \n" + : + : "r"(1), "m"(*lock)); + return; +} + +void HalUnSPinLock(SPinLock *lock) +{ + __asm__ __volatile__( + "movl $0, %0\n" + : + : "m"(*lock)); + return; +} + +void HalSPinLockSaveFlagsCli(SPinLock *lock, CPUFlg *cpuflg) +{ + __asm__ __volatile__( + "pushfq \n\t" + "cli \n\t" + "popq %0 \n\t" + + "1: \n\t" + "lock; xchg %1, %2 \n\t" + "cmpl $0,%1 \n\t" + "jnz 2f \n\t" + ".section .spinlock.text," + "\"ax\"" + "\n\t" //重新定义一个代码段所以jnz 2f下面并不是 + "2: \n\t" //cmpl $0,%1 事实上下面的代码不会常常执行, + "cmpl $0,%2 \n\t" //这是为了不在cpu指令高速缓存中填充无用代码 + "jne 2b \n\t" + "jmp 1b \n\t" + ".previous \n\t" + : "=m"(*cpuflg) + : "r"(1), "m"(*lock)); + return; +} + +void HalUnSPinLockRestoreFlagsSti(SPinLock *lock, CPUFlg *cpuflg) +{ + __asm__ __volatile__( + "movl $0, %0\n\t" + "pushq %1 \n\t" + "popfq \n\t" + : + : "m"(*lock), "m"(*cpuflg)); + return; +} \ No newline at end of file diff --git a/Include/HalInc/X86_64Inc/HalSync.h b/Include/HalInc/X86_64Inc/HalSync.h index e69de29..afd8f24 100644 --- a/Include/HalInc/X86_64Inc/HalSync.h +++ b/Include/HalInc/X86_64Inc/HalSync.h @@ -0,0 +1,15 @@ +/********************************************************** + 同步头文件HalSync.h +*********************************************************** + 彭东 +**********************************************************/ +#ifndef _HALSYNCHEAD +#define _HALSYNCHEAD + + +typedef struct SPINLOCK +{ + volatile U32 Lock; +}SPinLock; + +#endif \ No newline at end of file From 7980d9be93201dc8d812f17a293dd425c846dac9 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 3 Sep 2021 10:38:34 +0800 Subject: [PATCH 010/221] =?UTF-8?q?=E4=BF=AE=E6=94=B9Hal=E5=B1=82=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E5=A4=B4=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalSync.c | 2 +- Include/HalInc/X86_64Inc/HalSync.h | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Hal/X86_64/HalSync.c b/Hal/X86_64/HalSync.c index 3b9113c..3352817 100644 --- a/Hal/X86_64/HalSync.c +++ b/Hal/X86_64/HalSync.c @@ -53,7 +53,7 @@ void HalFlagsCli(CPUFlg* cpuflg) HalRestoreFlagsCli(cpuflg); } -void HalSPinLockInit(SPinLock *init) +void SPinLockInit(SPinLock *init) { init->Lock = 0; return; diff --git a/Include/HalInc/X86_64Inc/HalSync.h b/Include/HalInc/X86_64Inc/HalSync.h index afd8f24..8a31b9e 100644 --- a/Include/HalInc/X86_64Inc/HalSync.h +++ b/Include/HalInc/X86_64Inc/HalSync.h @@ -12,4 +12,18 @@ typedef struct SPINLOCK volatile U32 Lock; }SPinLock; +void HalHalt(); +void HalCliHalt(); +void HalStiHalt(); +void HalSti(); +void HalCli(); +void HalStiFlags(CPUFlg* cpuflg); +void HalCliFlags(CPUFlg* cpuflg); +void HalFlagsSti(CPUFlg* cpuflg); +void HalFlagsCli(CPUFlg* cpuflg); +void SPinLockInit(SPinLock *init); +void HalSPinLock(SPinLock *lock); +void HalUnSPinLock(SPinLock *lock); +void HalSPinLockSaveFlagsCli(SPinLock *lock, CPUFlg *cpuflg); +void HalUnSPinLockRestoreFlagsSti(SPinLock *lock, CPUFlg *cpuflg); #endif \ No newline at end of file From 124aa097244386d630bafb55f4a93e52627babeb Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 7 Sep 2021 11:45:57 +0800 Subject: [PATCH 011/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0public=E5=92=8Cprivat?= =?UTF-8?q?e=E6=A0=87=E8=AE=B0=E5=AE=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalCPU.c | 27 + Hal/X86_64/HalInterface.c | 18 + Hal/X86_64/HalMMU.c | 899 ++++++++++++++++++++++ Hal/X86_64/HalSync.c | 28 +- Include/BaseInc/BaseType.h | 2 +- Include/HalInc/X86_64Inc/HalCPU.h | 14 + Include/HalInc/X86_64Inc/HalInterface.h | 11 + Include/HalInc/X86_64Inc/HalMMU.h | 236 ++++++ Include/HalInc/X86_64Inc/HalSync.h | 28 +- Include/KernelInc/MemoryInc/KrlMmManage.h | 98 +++ 10 files changed, 1332 insertions(+), 29 deletions(-) diff --git a/Hal/X86_64/HalCPU.c b/Hal/X86_64/HalCPU.c index e69de29..3414120 100644 --- a/Hal/X86_64/HalCPU.c +++ b/Hal/X86_64/HalCPU.c @@ -0,0 +1,27 @@ +/********************************************************** + CPU相关的文件HalCPU.c +*********************************************************** + 彭东 +**********************************************************/ +#include "BaseType.h" +#include "HalCPU.h" + +public Addr HalVAddrToPAddr(Addr kvaddr) +{ + if (kvaddr < KRNL_MAP_VIRTADDRESS_START || kvaddr > KRNL_MAP_VIRTADDRESS_END) + { + // system_error("virAddro_phyadr err\n"); + return KRNL_ADDR_ERROR; + } + return kvaddr - KRNL_MAP_VIRTADDRESS_START; +} + +public Addr HalPAddrToVAddr(Addr kpaddr) +{ + if (kpaddr >= KRNL_MAP_PHYADDRESS_END) + { + // system_error("phyAddro_viradr err\n"); + return KRNL_ADDR_ERROR; + } + return kpaddr + KRNL_MAP_VIRTADDRESS_START; +} \ No newline at end of file diff --git a/Hal/X86_64/HalInterface.c b/Hal/X86_64/HalInterface.c index e69de29..0eeb0e5 100644 --- a/Hal/X86_64/HalInterface.c +++ b/Hal/X86_64/HalInterface.c @@ -0,0 +1,18 @@ + +/********************************************************** + 硬件抽象层接口文件HalInterface.c +*********************************************************** + 彭东 +**********************************************************/ +#include "BaseType.h" +#include "KrlMmManage.h" + +public PMSAD* HalExPGetKrlOnePMSAD() +{ + return NULL; +} + +public Bool HalExPPutKrlOnePMSAD(PMSAD* msad) +{ + return FALSE; +} \ No newline at end of file diff --git a/Hal/X86_64/HalMMU.c b/Hal/X86_64/HalMMU.c index e69de29..2fe628e 100644 --- a/Hal/X86_64/HalMMU.c +++ b/Hal/X86_64/HalMMU.c @@ -0,0 +1,899 @@ +/********************************************************** + 内存mmu文件halmmu.c +*********************************************************** + 彭东 +**********************************************************/ +#include "BaseType.h" +#include "List.h" +#include "HalSync.h" +#include "HalCPU.h" +#include "HalMMU.h" +#include "HalInterface.h" +#include "KrlMmManage.h" + +private void CR3Init(CR3* init) +{ + if(NULL == init) + { + return; + } + init->Entry = 0; + return; +} + +void MMUInit(MMU* init) +{ + if(NULL == init) + { + return; + } + + SPinlockInit(&init->Lock); + init->Status = 0; + init->Flags = 0; + init->TDireArrPtr = NULL; + CR3Init(&init->Cr3); + ListInit(&init->TDirHead); + ListInit(&init->SDirHead); + ListInit(&init->IDirHead); + ListInit(&init->MDirHead); + init->TDirMsaNR = 0; + init->SDirMsaNR = 0; + init->IDirMsaNR = 0; + init->MDirMsaNR = 0; + return; +} + +private UInt TDireIndex(Addr vaddr) +{ + return (UInt)((vaddr >> TDIRE_IV_RSHTBIT) & TDIRE_IV_BITMASK); +} + +private UInt SDireIndex(Addr vaddr) +{ + return (UInt)((vaddr >> SDIRE_IV_RSHTBIT) & SDIRE_IV_BITMASK); +} + +private UInt IDireIndex(Addr vaddr) +{ + return (UInt)((vaddr >> IDIRE_IV_RSHTBIT) & IDIRE_IV_BITMASK); +} + +private UInt MDireIndex(Addr vaddr) +{ + return (UInt)((vaddr >> MDIRE_IV_RSHTBIT) & MDIRE_IV_BITMASK); +} + + +private void TDireArrInit(TDireArr* init) +{ + if(NULL == init) + { + return; + } + HalMemSet((void*)init, 0, sizeof(TDireArr)); + return; +} + +private void SDireArrInit(SDireArr* init) +{ + if(NULL == init) + { + return; + } + HalMemSet((void*)init, 0, sizeof(SDireArr)); + return; +} + +private void IDireArrInit(IDireArr* init) +{ + if(NULL == init) + { + return; + } + HalMemSet((void*)init, 0, sizeof(IDireArr)); + return; +} + +private void MDireArrInit(MDireArr* init) +{ + if(NULL == init) + { + return; + } + HalMemSet((void*)init, 0, sizeof(MDireArr)); + return; +} + +private Bool SDireArrIsAllZero(SDireArr* sdirearr) +{ + for(UInt i = 0; i < SDIRE_MAX; i++) + { + if(0 != sdirearr->SDEArr[i].SEntry) + { + return FALSE; + } + } + return TRUE; +} + +private Bool SDireIsHave(TDire* tdire) +{ + if(0 < tdire->TFlags.TSDIRBit) + { + return TRUE; + } + return FALSE; +} + +private Bool SDireIsPresence(TDire* tdire) +{ + if(1 == tdire->TFlags.TPBit) + { + return TRUE; + } + return FALSE; +} + +private Addr SDireRetPAddr(TDire* tdire) +{ + return (Addr)(tdire->TFlags.TSDIRBit << SDIRE_PADR_LSHTBIT); +} + +private Addr SDireRetVAddr(TDire* tdire) +{ + return HalPAddrToVAddr(SDireRetPAddr(tdire)); +} + +private SDireArr* TDireRetSDireArr(TDire* tdire) +{ + return (SDireArr*)(SDireRetVAddr(tdire)); +} + +private Bool IDireArrIsAllZero(IDireArr* idirearr) +{ + for(UInt i = 0; i < IDIRE_MAX; i++) + { + if(0 != idirearr->IDEArr[i].IEntry) + { + return FALSE; + } + } + return TRUE; +} + +private Bool IDireIsHave(SDire* sdire) +{ + if(0 < sdire->SFlags.SIDIRBit) + { + return TRUE; + } + return FALSE; +} + +private Bool IDireIsPresence(SDire* sdire) +{ + if(1 == sdire->SFlags.SPBit) + { + return TRUE; + } + return FALSE; +} + +private Addr IDireRetPAddr(SDire* sdire) +{ + return (Addr)(sdire->SFlags.SIDIRBit << IDIRE_PADR_LSHTBIT); +} + +private Addr IDireRetVAddr(SDire* sdire) +{ + return HalPAddrToVAddr(IDireRetPAddr(sdire)); +} + +private IDireArr* SDireRetIDireArr(SDire* sdire) +{ + return (IDireArr*)(IDireRetVAddr(sdire)); +} + +private Bool MDireArrIsAllZero(MDireArr* mdirearr) +{ + for(UInt i = 0; i < MDIRE_MAX; i++) + { + if(0 != mdirearr->MDEArr[i].MEntry) + { + return FALSE; + } + } + return TRUE; +} + +private Bool MDireIsHave(IDire* idire) +{ + if(0 < idire->IFlags.IMDIRBit) + { + return TRUE; + } + return FALSE; +} + +private Bool MDireIsPresence(IDire* idire) +{ + if(1 == idire->IFlags.IPBit) + { + return TRUE; + } + return FALSE; +} + +private Addr MDireRetPAddr(IDire* idire) +{ + return (Addr)(idire->IFlags.IMDIRBit << MDIRE_PADR_LSHTBIT); +} + +private Addr MDireRetVAddr(IDire* idire) +{ + return HalPAddrToVAddr(MDireRetPAddr(idire)); +} + +private MDireArr* IDireRetMDireArr(IDire* idire) +{ + return (MDireArr*)(MDireRetVAddr(idire)); +} + +private Bool MMUPMSADIsHave(MDire* mdire) +{ + if(0 < mdire->MFlags.MMSABit) + { + return TRUE; + } + return FALSE; +} + +private Bool MMUPMSADIsPresence(MDire* mdire) +{ + if(1 == mdire->MFlags.MPBit) + { + return TRUE; + } + return FALSE; +} + +private Addr MMUPMSADRetPAddr(MDire* mdire) +{ + return (Addr)(mdire->MFlags.MMSABit << MSA_PADR_LSHTBIT); +} + +private PMSAD* MMUNewTDireArr(MMU* mmulocked) +{ + TDireArr* tdirearr = NULL; + PMSAD* msad = NULL; + if(NULL == mmulocked) + { + return NULL; + } + + msad = HalExPGetKrlOnePMSAD(); + if(NULL == msad) + { + return NULL; + } + + tdirearr = (TDireArr*)PMSADRetVaddr(msa); + + TDireArrInit(tdirearr); + + ListAdd(&msad->Lists, &mmulocked->TDirHead); + mmulocked->TDirMsaNR++; + mmulocked->TDireArrPtr = tdirearr; + + return msad; +} + +private Bool MMUDelTDireArr(MMU* mmulocked, TDireArr* tdirearr, PMSAD* msad) +{ + List* pos; + PMSAD* tmpmsad; + Addr tblphyadr; + if(NULL == mmulocked || NULL == tdirearr) + { + return FALSE; + } + + tblphyadr = HalVAddrToPAddr((Addr)tdirearr); + + if(NULL != msad) + { + if(PMSADRetPAddr(msad) == tblphyadr) + { + ListDel(&msad->Lists); + if(HalExPPutKrlOnePMSAD(msad) == FALSE) + { + system_error("mmu_del_tdirearr err\n"); + return FALSE; + } + mmulocked->TDirMsaNR--; + return TRUE; + } + } + ListForEach(pos, &mmulocked->TDirHead) + { + tmpmsad = ListEntry(pos, PMSAD, Lists); + if(PMSADRetPAddr(tmpmsad) == tblphyadr) + { + ListDel(&tmpmsad->Lists); + if(HalExPPutKrlOnePMSAD(tmpmsad) == FALSE) + { + system_error("mmu_del_tdirearr err\n"); + return FALSE; + } + mmulocked->TDirMsaNR--; + return TRUE; + } + } + return FALSE; +} + +private PMSAD* MMUNewSDireArr(MMU* mmulocked) +{ + SDireArr* sdirearr = NULL; + PMSAD* msad = NULL; + if(NULL == mmulocked) + { + return NULL; + } + + msad = HalExPGetKrlOnePMSAD(); + if(NULL == msad) + { + return NULL; + } + + sdirearr = (SDireArr*)PMSADRetVAddr(msad); + + SDireArrInit(sdirearr); + + ListAdd(&msad->Lists, &mmulocked->SDirHead); + mmulocked->SDirMsaNR++; + return msad; +} + +private Bool MMUDelSDireArr(MMU* mmulocked, SDireArr* sdirearr, PMSAD* msad) +{ + List* pos; + PMSAD* tmpmsad; + Addr tblphyadr; + if(NULL == mmulocked || NULL == sdirearr) + { + return FALSE; + } + + tblphyadr = HalVAddrToPAddr((Addr)sdirearr); + + if(NULL != msad) + { + if(PMSADRetPAddr(msad) == tblphyadr) + { + ListDel(&msad->Lists); + if(HalExPPutKrlOnePMSAD(msad) == FALSE) + { + system_error("mmu_del_tdirearr err\n"); + return FALSE; + } + mmulocked->SDirMsaNR--; + return TRUE; + } + } + ListForEach(pos, &mmulocked->mud_sdirhead) + { + tmpmsad = ListEntry(pos, PMSAD, Lists); + if(PMSADRetPAddr(tmpmsa) == tblphyadr) + { + list_del(&tmpmsad->Lists); + if(HalExPPutKrlOnePMSAD(tmpmsad) == FALSE) + { + system_error("mmu_del_tdirearr err\n"); + return FALSE; + } + mmulocked->SDirMsaNR--; + return TRUE; + } + } + return FALSE; +} + +private PMSAD* MMUNewIDireArr(MMU* mmulocked) +{ + IDireArr* idirearr = NULL; + PMSAD* msad = NULL; + + if(NULL == mmulocked) + { + return NULL; + } + + msad = HalExPGetKrlOnePMSAD(); + if(NULL == msad) + { + return NULL; + } + + idirearr = (IDireArr*)PMSADRetVAddr(msad); + + IDireArrInit(idirearr); + + ListAdd(&msad->Lists, &mmulocked->IDirHead); + mmulocked->IDirMsaNR++; + + return msad; +} + +private Bool MMUDelIDireArr(MMU* mmulocked, IDireArr* idirearr, PMSAD* msad) +{ + List* pos; + PMSAD* tmpmsad; + Addr tblphyadr; + + if(NULL == mmulocked || NULL == idirearr) + { + return FALSE; + } + + tblphyadr = HalVAddrToPAddr((Addr)idirearr); + + if(NULL != msad) + { + if(PMSADRetPAddr(msad) == tblphyadr) + { + ListDel(&msad->Lists); + if(HalExPPutKrlOnePMSAD(msad) == FALSE) + { + system_error("mmu_del_tdirearr err\n"); + return FALSE; + } + mmulocked->IDirMsaNR--; + return TRUE; + } + } + ListForEach(pos, &mmulocked->IDirHead) + { + tmpmsad = ListEntry(pos, PMSAD, Lists); + if(PMSADRetPAddr(tmpmsad) == tblphyadr) + { + ListDel(&tmpmsad->Lists); + if(HalExPPutKrlOnePMSAD(tmpmsad) == FALSE) + { + system_error("mmu_del_tdirearr err\n"); + return FALSE; + } + mmulocked->IDirMsaNR--; + return TRUE; + } + } + return FALSE; +} + +private PMSAD* MMUNewMDireArr(MMU* mmulocked) +{ + MDireArr* mdirearr = NULL; + PMSAD* msad = NULL; + + if(NULL == mmulocked) + { + return NULL; + } + + msad = HalExPGetKrlOnePMSAD(); + if(NULL == msad) + { + return NULL; + } + + mdirearr = (MDireArr*)PMSADRetVAddr(msad); + MDireArrInit(mdirearr); + + ListAdd(&msad->Lists, &mmulocked->MDirHead); + mmulocked->MDirMsaNR++; + + return msad; +} + +private Bool MMUDelMDireArr(MMU* mmulocked, MDireArr* mdirearr, PMSAD* msad) +{ + List* pos; + PMSAD* tmpmsad; + Addr tblphyadr; + + if(NULL == mmulocked || NULL == mdirearr) + { + return FALSE; + } + + tblphyadr = HalVAddrToPAddr((Addr)mdirearr); + + if(NULL != msad) + { + if(PMSADRetPAddr(msad) == tblphyadr) + { + ListDel(&msad->Lists); + if(HalExPPutKrlOnePMSAD(msad) == FALSE) + { + system_error("mmu_del_tdirearr err\n"); + return FALSE; + } + mmulocked->MDirMsaNR--; + return TRUE; + } + } + ListForEach(pos, &mmulocked->MDirHead) + { + tmpmsad = ListEntry(pos, PMSAD, Lists); + if(PMSADRetPAddr(tmpmsad) == tblphyadr) + { + ListDel(&tmpmsad->Lists); + if(HalExPPutKrlOnePMSAD(tmpmsad) == FALSE) + { + system_error("mmu_del_tdirearr err\n"); + return FALSE; + } + mmulocked->MDirMsaNR--; + return TRUE; + } + } + return FALSE; +} + +private Addr MMUUnTranslationPMSAD(MMU* mmulocked, MDireArr* mdirearr, Addr vaddr) +{ + UInt mindex; + MDire mdire; + Addr retadr; + if(NULL == mmulocked || NULL == mdirearr) + { + return NULL; + } + + mindex = MDireIndex(vaddr); + + mdire = mdirearr->MDEArr[mindex]; + if(MMUPMSADIsHave(&mdire) == FALSE) + { + return NULL; + } + + retadr = MMUPMSADRetPAddr(&mdire); + + mdirearr->MDEArr[mindex].MEntry = 0; + return retadr; +} + +private Bool MMUTranslationPMSAD(MMU* mmulocked, MDireArr* mdirearr, Addr vaddr, Addr paddr, U64 flags) +{ + UInt mindex; + if(NULL == mmulocked || NULL == mdirearr) + { + return FALSE; + } + + mindex = MDireIndex(vaddr); + mdirearr->MDEArr[mindex].MEntry = (((U64)paddr) | flags); + + return TRUE; +} + +private Bool MMUUnTranslationMDire(MMU* mmulocked, IDireArr* idirearr, PMSAD* msad, Addr vaddr) +{ + UInt iindex; + IDire idire; + MDireArr* mdirearr = NULL; + if(NULL == mmulocked || NULL == idirearr) + { + return FALSE; + } + + iindex = IDireIndex(vaddr); + + idire = idirearr->IDEArr[iindex]; + if(MDireIsHave(&idire) == FALSE) + { + return TRUE; + } + + mdirearr = IDireRetMDireArr(&idire); + if(MDireArrIsAllZero(mdirearr) == FALSE) + { + return TRUE; + } + + if(MMUDelMDireArr(mmulocked, mdirearr, msad) == FALSE) + { + return FALSE; + } + + idirearr->IDEArr[iindex].IEntry = 0; + + return TRUE; +} + +private MDireArr* MMUTranslationMDire(MMU* mmulocked, IDireArr* idirearr, Addr vaddr, U64 flags, PMSAD** outmsad) +{ + UInt iindex; + IDire idire; + Addr dire; + PMSAD* msad = NULL; + MDireArr* mdirearr = NULL; + if(NULL == mmulocked || NULL == idirearr || NULL == outmsad) + { + return NULL; + } + + iindex = IDireIndex(vaddr); + + idire = idirearr->IDEArr[iindex]; + if(MDireIsHave(&idire) == TRUE) + { + mdirearr = IDireRetMDireArr(&idire); + *outmsad = NULL; + return mdirearr; + } + + msa = MMUNewMDireArr(mmulocked); + if(NULL == msad) + { + *outmsad = NULL; + return NULL; + } + + dire = PMSADRetPAddr(msad); + mdirearr = (MDireArr*)(HalPAddrToVAddr(dire)); + idirearr->IDEArr[iindex].IEntry = (((U64)dire) | flags); + + *outmsad = msad; + + return mdirearr; +} + +private Bool MMUUnTranslationIDire(MMU* mmulocked, SDireArr* sdirearr, PMSAD* msad, Addr vaddr) +{ + UInt sindex; + SDire sdire; + IDireArr* idirearr = NULL; + if(NULL == mmulocked || NULL == sdirearr) + { + return FALSE; + } + + sindex = SDireIndex(vaddr); + + sdire = sdirearr->SDEArr[sindex]; + if(IDireIsHave(&sdire) == FALSE) + { + return TRUE; + } + + idirearr = SDireRetIDireArr(&sdire); + if(IDireArrIsAllZero(idirearr) == FALSE) + { + return TRUE; + } + + if(MMUDelIDireArr(mmulocked, idirearr, msad) == FALSE) + { + return FALSE; + } + + sdirearr->SDEArr[sindex].SEntry = 0; + + return TRUE; +} + +private IDireArr* MMUTranslationIDire(MMU* mmulocked, SDireArr* sdirearr, Addr vaddr, U64 flags, PMSAD** outmsad) +{ + UInt sindex; + SDire sdire; + Addr dire; + PMSAD* msad = NULL; + IDireArr* idirearr = NULL; + if(NULL == mmulocked || NULL == sdirearr || NULL == outmsad) + { + return NULL; + } + + sindex = SDireIndex(vaddr); + + sdire = sdirearr->SDEArr[sindex]; + if(IDireIsHave(&sdire) == TRUE) + { + idirearr = SDireRetIDireArr(&sdire); + *outmsad = NULL; + return idirearr; + } + + msad = MMUNewIDireArr(mmulocked); + if(NULL == msad) + { + *outmsad = NULL; + return NULL; + } + + dire = PMSADRetPAddr(msad); + idirearr = (IDireArr*)(HalPAddrToVAddr(dire)); + sdirearr->SDEArr[sindex].SEntry = (((U64)dire) | flags); + + *outmsad = msad; + + return idirearr; +} + +private Bool MMUUnTranslationSDire(MMU* mmulocked, TDireArr* tdirearr, PMSAD* msad, Addr vaddr) +{ + UInt tindex; + TDire tdire; + SDireArr* sdirearr = NULL; + + if(NULL == mmulocked || NULL == tdirearr) + { + return FALSE; + } + + tindex = TDireIndex(vaddr); + + tdire = tdirearr->tde_arr[tindex]; + if(SDireIsHave(&tdire) == FALSE) + { + return TRUE; + } + + sdirearr = TDireRetSDireArr(&tdire); + if(SDireArrIsAllZero(sdirearr) == FALSE) + { + return TRUE; + } + + if(MMUDelSDireArr(mmulocked, sdirearr, msad) == FALSE) + { + return FALSE; + } + + tdirearr->TDEArr[tindex].TEntry = 0; + + return TRUE; +} + +private SDireArr* MMUTranslationSDire(MMU* mmulocked, TDireArr* tdirearr, Addr vaddr, U64 flags, PMSAD** outmsad) +{ + UInt tindex; + TDire tdire; + Addr dire; + SDireArr* sdirearr = NULL; + PMSAD* msad = NULL; + if(NULL == mmulocked || NULL == tdirearr || NULL == outmsad) + { + return NULL; + } + + tindex = TDireIndex(vaddr); + + tdire = tdirearr->TDEArr[tindex]; + if(SDireIsHave(&tdire) == TRUE) + { + sdirearr = TDireRetSDireArr(&tdire); + *outmsad = NULL; + return sdirearr; + } + + msad = MMUNewSDireArr(mmulocked); + if(NULL == msad) + { + *outmsad = NULL; + return NULL; + } + + dire = PMSADRetPAddr(msad); + sdirearr = (SDireArr*)(HalPAddrToVAddr(dire)); + tdirearr->TDEArr[tindex].TEntry = (((U64)dire) | flags); + + *outmsad = msad; + + return sdirearr; +} + +public void HalMMULoad(MMU* mmu) +{ + if(NULL == mmu) + { + return; + } + + HalSPinLock(&mmu->Lock); + if(NULL == mmu->TDireArrPtr || 0 != (((U64)(mmu->TDireArrPtr)) & 0xfff)) + { + goto out; + } + + mmu->CR3.Entry = HalVAddrToPAddr((Addr)mmu->TDireArrPtr); + HalWriteCR3((UInt)(mmu->CR3.Entry)); + +out: + HalUnSPinLock(&mmu->Lock); + return; +} + +public void HalMMURefresh() +{ + CR3 cr3; + cr3.Entry = (U64)HalReadCR3(); + HalWriteCR3(cr3.Entry); + return; +} + +private Bool HalMMUTranslationCore(MMU* mmu, Addr vaddr, Addr paddr, U64 flags) +{ + Bool rets = FALSE; + TDireArr* tdirearr = NULL; + SDireArr* sdirearr = NULL; + IDireArr* idirearr = NULL; + MDireArr* mdirearr = NULL; + PMSAD* smsad = NULL; + PMSAD* imsad = NULL; + PMSAD* mmsad = NULL; + + HalSPinLock(&mmu->Lock); + + tdirearr = mmu->TDireArrPtr; + if(NULL == tdirearr) + { + rets = FALSE; + goto OUTLabel; + } + + sdirearr = MMUTranslationSDire(mmu, tdirearr, vaddr, flags, &smsad); + if(NULL == sdirearr) + { + rets = FALSE; + goto ERRLabelSDire; + } + + idirearr = MMUTranslationIDire(mmu, sdirearr, vaddr, flags, &imsad); + if(NULL == idirearr) + { + rets = FALSE; + goto ERRLabelIDire; + } + + mdirearr = MMUTranslationMDire(mmu, idirearr, vaddr, flags, &mmsad); + if(NULL == mdirearr) + { + rets = FALSE; + goto ERRLabelMDire; + } + + rets = MMUTranslationPMSAD(mmu, mdirearr, vaddr, paddr, flags); + if(TRUE == rets) + { + rets = TRUE; + HalMMURefresh(); + goto out; + } + + rets = FALSE; + + MMUUnTranslationPMSAD(mmu, mdirearr, vaddr); +ERRLabelMDire: + MMUUnTranslationMDire(mmu, idirearr, mmsad, vaddr); +ERRLabelIDire: + MMUUnTranslationIDire(mmu, sdirearr, imsad, vaddr); +ERRLabelSDire: + MMUUnTranslationSDire(mmu, tdirearr, smsad, vaddr); +OUTLabel: + HalUnSPinLock(&mmu->Lock); + return rets; +} + +public Bool HalMMUTranslation(MMU* mmu, Addr vaddr, Addr paddr, U64 flags) +{ + if(NULL == mmu) + { + return NULL; + } + return HalMMUTranslationCore(mmu, vaddr, paddr, flags); +} diff --git a/Hal/X86_64/HalSync.c b/Hal/X86_64/HalSync.c index 3352817..76f4aef 100644 --- a/Hal/X86_64/HalSync.c +++ b/Hal/X86_64/HalSync.c @@ -7,59 +7,59 @@ #include "HalCPU.h" #include "HalSync.h" -void HalHalt() +public void HalHalt() { HALT(); } -void HalCliHalt() +public void HalCliHalt() { CLIHALT(); } -void HalStiHalt() +public void HalStiHalt() { STIHALT(); } -void HalSti() +public void HalSti() { STI(); } -void HalCli() +public void HalCli() { CLI(); } -void HalStiFlags(CPUFlg* cpuflg) +public void HalStiFlags(CPUFlg* cpuflg) { HalRestoreFlagsSti(cpuflg); } -void HalCliFlags(CPUFlg* cpuflg) +public void HalCliFlags(CPUFlg* cpuflg) { HalSaveFlagsCli(cpuflg); } -void HalFlagsSti(CPUFlg* cpuflg) +public void HalFlagsSti(CPUFlg* cpuflg) { HalSaveFlagsSti(cpuflg); } -void HalFlagsCli(CPUFlg* cpuflg) +public void HalFlagsCli(CPUFlg* cpuflg) { HalRestoreFlagsCli(cpuflg); } -void SPinLockInit(SPinLock *init) +public void SPinLockInit(SPinLock *init) { init->Lock = 0; return; } -void HalSPinLock(SPinLock *lock) +public void HalSPinLock(SPinLock *lock) { __asm__ __volatile__( "1: \n" @@ -79,7 +79,7 @@ void HalSPinLock(SPinLock *lock) return; } -void HalUnSPinLock(SPinLock *lock) +public void HalUnSPinLock(SPinLock *lock) { __asm__ __volatile__( "movl $0, %0\n" @@ -88,7 +88,7 @@ void HalUnSPinLock(SPinLock *lock) return; } -void HalSPinLockSaveFlagsCli(SPinLock *lock, CPUFlg *cpuflg) +public void HalSPinLockSaveFlagsCli(SPinLock *lock, CPUFlg *cpuflg) { __asm__ __volatile__( "pushfq \n\t" @@ -112,7 +112,7 @@ void HalSPinLockSaveFlagsCli(SPinLock *lock, CPUFlg *cpuflg) return; } -void HalUnSPinLockRestoreFlagsSti(SPinLock *lock, CPUFlg *cpuflg) +public void HalUnSPinLockRestoreFlagsSti(SPinLock *lock, CPUFlg *cpuflg) { __asm__ __volatile__( "movl $0, %0\n\t" diff --git a/Include/BaseInc/BaseType.h b/Include/BaseInc/BaseType.h index 0f41d11..2784d89 100644 --- a/Include/BaseInc/BaseType.h +++ b/Include/BaseInc/BaseType.h @@ -36,7 +36,7 @@ typedef void* Buff; typedef unsigned long Size; #define KLINE static inline -#define PUBLIC +#define public #define private static #define EXTERN extern #define KEXTERN extern diff --git a/Include/HalInc/X86_64Inc/HalCPU.h b/Include/HalInc/X86_64Inc/HalCPU.h index 04f7369..6a0bb8f 100644 --- a/Include/HalInc/X86_64Inc/HalCPU.h +++ b/Include/HalInc/X86_64Inc/HalCPU.h @@ -6,6 +6,17 @@ #ifndef _HALCPUHEAD #define _HALCPUHEAD +#define KRNL_MAP_VIRTADDRESS_SIZE 0x400000000 +#define KRNL_VIRTUAL_ADDRESS_START 0xffff800000000000 +#define KRNL_VIRTUAL_ADDRESS_END 0xffffffffffffffff +#define USER_VIRTUAL_ADDRESS_START 0 +#define USER_VIRTUAL_ADDRESS_END 0x00007fffffffffff +#define KRNL_MAP_PHYADDRESS_START 0 +#define KRNL_MAP_PHYADDRESS_END 0x400000000 +#define KRNL_MAP_PHYADDRESS_SIZE 0x400000000 +#define KRNL_MAP_VIRTADDRESS_START KRNL_VIRTUAL_ADDRESS_START +#define KRNL_MAP_VIRTADDRESS_END (KRNL_MAP_VIRTADDRESS_START+KRNL_MAP_VIRTADDRESS_SIZE) +#define KRNL_ADDR_ERROR 0xf800000000000 #define NORETURN __attribute__((noreturn)) #define SYSRCALL __attribute__((regparm(3))) @@ -322,4 +333,7 @@ KLINE void HalWriteCR3(UInt val) return; } +public Addr HalVAddrToPAddr(Addr kvaddr); +public Addr HalPAddrToVAddr(Addr kpaddr); + #endif diff --git a/Include/HalInc/X86_64Inc/HalInterface.h b/Include/HalInc/X86_64Inc/HalInterface.h index e69de29..97131cb 100644 --- a/Include/HalInc/X86_64Inc/HalInterface.h +++ b/Include/HalInc/X86_64Inc/HalInterface.h @@ -0,0 +1,11 @@ +/********************************************************** + 硬件抽象层接口头文件HalInterface.h +*********************************************************** + 彭东 +**********************************************************/ +#ifndef _HALINTERFACEHEAD +#define _HALINTERFACEHEAD +PMSAD* HalExPGetKrlOnePMSAD(); +Bool HalExPPutKrlOnePMSAD(PMSAD* msad); + +#endif \ No newline at end of file diff --git a/Include/HalInc/X86_64Inc/HalMMU.h b/Include/HalInc/X86_64Inc/HalMMU.h index e69de29..be299eb 100644 --- a/Include/HalInc/X86_64Inc/HalMMU.h +++ b/Include/HalInc/X86_64Inc/HalMMU.h @@ -0,0 +1,236 @@ +/********************************************************** + MMU头文件halmmu.h +*********************************************************** + 彭东 +**********************************************************/ +#ifndef _HALMMUHEAD +#define _HALMMUHEAD + +#define TDIRE_MAX (512) +#define SDIRE_MAX (512) +#define IDIRE_MAX (512) +#define MDIRE_MAX (512) + +#define MDIRE_IV_RSHTBIT (12) +#define MDIRE_IV_BITMASK (0x1ffUL) +#define MSA_PADR_LSHTBIT (12) +#define MDIRE_PADR_LSHTBIT (12) +#define IDIRE_IV_RSHTBIT (21) +#define IDIRE_IV_BITMASK (0x1ffUL) +#define IDIRE_PADR_LSHTBIT (12) +#define SDIRE_IV_RSHTBIT (30) +#define SDIRE_IV_BITMASK (0x1ffUL) +#define SDIRE_PADR_LSHTBIT (12) +#define TDIRE_IV_RSHTBIT (39) +#define TDIRE_IV_BITMASK (0x1ffUL) + +#define PML4E_P (1 << 0) +#define PML4E_RW (1 << 1) +#define PML4E_US (1 << 2) +#define PML4E_PWT (1 << 3) +#define PML4E_PCD (1 << 4) + +#define PDPTE_P (1 << 0) +#define PDPTE_RW (1 << 1) +#define PDPTE_US (1 << 2) +#define PDPTE_PWT (1 << 3) +#define PDPTE_PCD (1 << 4) +#define PDPTE_PS (1 << 7) + +#define PDTE_P (1 << 0) +#define PDTE_RW (1 << 1) +#define PDTE_US (1 << 2) +#define PDTE_PWT (1 << 3) +#define PDTE_PCD (1 << 4) +#define PDTE_PS (1 << 7) + +#define PTE_P (1 << 0) +#define PTE_RW (1 << 1) +#define PTE_US (1 << 2) +#define PTE_PWT (1 << 3) +#define PTE_PCD (1 << 4) +#define PTE_PAT (1 << 7) +#define PDPTEPHYADR_IP_LSHTBIT (12) +#define PDTEPHYADR_IP_LSHTBIT (12) +#define PTEPHYADR_IP_LSHTBIT (12) +#define PFMPHYADR_IP_LSHTBIT (12) +#define PTE_HAVE_MASK (~0xfff) +#define PDE_HAVE_MASK (~0xfff) +#define PDPTE_HAVE_MASK (~0xfff) +#define PML4E_HAVE_MASK (~0xfff) + +//MSA目录项标志位 +typedef struct MDIREFLAGS +{ + U64 MPBit : 1; //0 + U64 MRWBit : 1; //1 + U64 MUSBit : 1; //2 + U64 MPWTBit : 1; //3 + U64 MPCDBit : 1; //4 + U64 MABit : 1; //5 + U64 MDBit : 1; //6 + U64 MPATBit : 1; //7 + U64 MGBit : 1; //8 + U64 MIG1Bit : 3; //9\10\11 + U64 MMSABit : 40; //12 + U64 MIG2Bit : 11; //52 + U64 MXDBit : 1; //63 +} __attribute__((packed)) MDireFlags; + +//MSA目录项 +typedef struct MDIRE +{ + union + { + MDireFlags MFlags; + U64 MEntry; + } __attribute__((packed)); + +} __attribute__((packed)) MDire; + +//中级目录项标志位 +typedef struct IDIREFLAGS +{ + U64 IPBit : 1; //0 + U64 IRWBit : 1; //1 + U64 IUSBit : 1; //2 + U64 IPWTBit : 1; //3 + U64 IPCDBit : 1; //4 + U64 IABit : 1; //5 + U64 IIG1Bit : 1; //6 + U64 IPSBit : 1; //74kb==0 + U64 IIG2Bit : 4; //8\9\10\11 + U64 IMDIRBit : 40; //12 + U64 IIG3Bit : 11; //52 + U64 IXDBit : 1; //63 +} __attribute__((packed)) IDireFlags; + +//中级目录项 +typedef struct IDIRE +{ + union + { + IDireFlags IFlags; + U64 IEntry; + } __attribute__((packed)); + +} __attribute__((packed)) IDire; + +//次级目录项标志位 +typedef struct SDIREFLAGS +{ + U64 SPBit : 1; //0 + U64 SRWBit : 1; //1 + U64 SUSBit : 1; //2 + U64 SPWTBit : 1; //3 + U64 SPCDBit : 1; //4 + U64 SABit : 1; //5 + U64 SIG1Bit : 1; //6 + U64 SPSBit : 1; //74kb==0 + U64 SIG2Bit : 4; //8\9\10\11 + U64 SIDIRBit : 40; //12 + U64 SIG3Bit : 11; //52 + U64 SXDBit : 1; //63 +} __attribute__((packed)) SDireFlags; + +//次级目录项 +typedef struct SDIRE +{ + union + { + SDireFlags SFlags; + U64 SEntry; + } __attribute__((packed)); + +} __attribute__((packed)) SDire; + +//顶级目录项标志位 +typedef struct TDIREFLAGS +{ + U64 TPBit : 1; //0 + U64 TRWBit : 1; //1 + U64 TUSBit : 1; //2 + U64 TPWTBit : 1; //3 + U64 TPCDBit : 1; //4 + U64 TABit : 1; //5 + U64 TIG1Bit : 1; //6 + U64 TRV1Bit : 1; //74kb==0 + U64 TIG2Bit : 4; //8\9\10\11 + U64 TSDIRBit : 40; //12 + U64 TIG3Bit : 11; //52 + U64 TXDBit : 1; //63 +} __attribute__((packed)) TDireFlags; + +//顶级目录项 +typedef struct TDIRE +{ + union + { + TDireFlags TFlags; + U64 TEntry; + } __attribute__((packed)); + +} __attribute__((packed)) TDire; + +//MSA目录 +typedef struct MDIREARR +{ + MDire MDEArr[MDIRE_MAX]; +} __attribute__((packed)) MDireArr; + +//中级目录 +typedef struct IDIREARR +{ + IDire IDEArr[IDIRE_MAX]; +} __attribute__((packed)) IDireArr; + +//次级目录 +typedef struct SDIREARR +{ + SDire SDEArr[SDIRE_MAX]; +} __attribute__((packed)) SDireArr; + +//顶级目录 +typedef struct TDIREARR +{ + TDire TDEArr[TDIRE_MAX]; +} __attribute__((packed)) TDireArr; + +//CR3寄存器标志位 +typedef struct CR3FLAGS +{ + U64 Pcid : 12; //0 + U64 Plm4a : 40; //12 + U64 Rv : 11; //52 + U64 Tbc : 1; //63 +} __attribute__((packed)) CR3Flags; + +//CR3寄存器 +typedef struct CR3 +{ + union + { + CR3Flags Flags; + U64 Entry; + } __attribute__((packed)); + +} __attribute__((packed)) CR3; + +typedef struct MMU +{ + SPinLock Lock; + U64 Status; + U64 Flags; + TDireArr *TDireArrPtr; + CR3 Cr3; + List TDirHead; + List SDirHead; + List IDirHead; + List MDirHead; + UInt TDirMsaNR; + UInt SDirMsaNR; + UInt IDirMsaNR; + UInt MDirMsaNR; +} MMU; + +#endif diff --git a/Include/HalInc/X86_64Inc/HalSync.h b/Include/HalInc/X86_64Inc/HalSync.h index 8a31b9e..60be885 100644 --- a/Include/HalInc/X86_64Inc/HalSync.h +++ b/Include/HalInc/X86_64Inc/HalSync.h @@ -12,18 +12,18 @@ typedef struct SPINLOCK volatile U32 Lock; }SPinLock; -void HalHalt(); -void HalCliHalt(); -void HalStiHalt(); -void HalSti(); -void HalCli(); -void HalStiFlags(CPUFlg* cpuflg); -void HalCliFlags(CPUFlg* cpuflg); -void HalFlagsSti(CPUFlg* cpuflg); -void HalFlagsCli(CPUFlg* cpuflg); -void SPinLockInit(SPinLock *init); -void HalSPinLock(SPinLock *lock); -void HalUnSPinLock(SPinLock *lock); -void HalSPinLockSaveFlagsCli(SPinLock *lock, CPUFlg *cpuflg); -void HalUnSPinLockRestoreFlagsSti(SPinLock *lock, CPUFlg *cpuflg); +public void HalHalt(); +public void HalCliHalt(); +public void HalStiHalt(); +public void HalSti(); +public void HalCli(); +public void HalStiFlags(CPUFlg* cpuflg); +public void HalCliFlags(CPUFlg* cpuflg); +public void HalFlagsSti(CPUFlg* cpuflg); +public void HalFlagsCli(CPUFlg* cpuflg); +public void SPinLockInit(SPinLock *init); +public void HalSPinLock(SPinLock *lock); +public void HalUnSPinLock(SPinLock *lock); +public void HalSPinLockSaveFlagsCli(SPinLock *lock, CPUFlg *cpuflg); +public void HalUnSPinLockRestoreFlagsSti(SPinLock *lock, CPUFlg *cpuflg); #endif \ No newline at end of file diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index e69de29..c14069f 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -0,0 +1,98 @@ +/********************************************************** + 物理内存管理文件KrlMmManage.h +*********************************************************** + 彭东 +**********************************************************/ +#ifndef _KRLMMMANAGEHEAD +#define _KRLMMMANAGEHEAD + +#define PAGPHYADR_SZLSHBIT (12) +#define MSAD_PAGE_MAX (8) +#define MSA_SIZE (1 << PAGPHYADR_SZLSHBIT) + +#define MF_OLKTY_INIT (0) +#define MF_OLKTY_ODER (1) +#define MF_OLKTY_BAFH (2) +#define MF_OLKTY_TOBJ (3) + +#define MF_LSTTY_LIST (0) +#define MF_MOCTY_FREE (0) +#define MF_MOCTY_KRNL (1) +#define MF_MOCTY_USER (2) +#define MF_MRV1_VAL (0) +#define MF_UINDX_INIT (0) +#define MF_UINDX_MAX (0xffffff) +#define MF_MARTY_INIT (0) +#define MF_MARTY_HWD (1) +#define MF_MARTY_KRL (2) +#define MF_MARTY_PRC (3) +#define MF_MARTY_SHD (4) + +#define PAF_NO_ALLOC (0) +#define PAF_ALLOC (1) +#define PAF_NO_SHARED (0) +#define PAF_NO_SWAP (0) +#define PAF_NO_CACHE (0) +#define PAF_NO_KMAP (0) +#define PAF_NO_LOCK (0) +#define PAF_NO_DIRTY (0) +#define PAF_NO_BUSY (0) +#define PAF_RV2_VAL (0) +#define PAF_INIT_PADRS (0) + +//PMSAD标志 +typedef struct PMSADFLAGS +{ + U32 OLTypeBit:2; + U32 InListBit:1; + U32 OccupancyTypeBit:2; + U32 AreaTypeBit:3; + U32 RefCountBit:24; +}__attribute__((packed)) PMSADFlags; + +//物理地址及其标志 +typedef struct PHYADDRFLAGS +{ + U64 AllocBit:1; + U64 SharedBit:1; + U64 SwapBit:1; + U64 CacheBit:1; + U64 KMapBit:1; + U64 LockBit:1; + U64 DirtyBit:1; + U64 BusyBit:1; + U64 ReservedBit:4; + U64 PAddrBit:52; +}__attribute__((packed)) PhyAddrFlags; + +//物理内存空间地址描述述 +//Physical memory space address descriptor +typedef struct PMSAD +{ + List Lists;//16 + SPinLock Lock; //4 + PMSADFlags CountFlags;//4 + PhyAddrFlags PhyAddr;//8 + void* BlockLink;//8 +}__attribute__((packed)) PMSAD;//16+24 + +KLINE Addr PMSADRetPAddr(PMSAD* msad) +{ + if(NULL == msad) + { + return NULL; + } + return (msad->PhyAddr.PAddrBit << PAGPHYADR_SZLSHBIT); +} + +KLINE Addr PMSADRetVAddr(PMSAD* msad) +{ + if(NULL == msad) + { + return NULL; + } + return HalPAddrToVAddr(PMSADRetPAddr(msad)); +} + + +#endif \ No newline at end of file From 98e4e7d1dab7214e884e9e9443ea3b6d991eb5b9 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 7 Sep 2021 15:35:49 +0800 Subject: [PATCH 012/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B9=B6=E4=BF=AE?= =?UTF-8?q?=E6=94=B9MMU=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalMMU.c | 174 ++++++++++++++++++++++++++++-- Include/HalInc/X86_64Inc/HalMMU.h | 60 +++++++++++ 2 files changed, 228 insertions(+), 6 deletions(-) diff --git a/Hal/X86_64/HalMMU.c b/Hal/X86_64/HalMMU.c index 2fe628e..d5894a7 100644 --- a/Hal/X86_64/HalMMU.c +++ b/Hal/X86_64/HalMMU.c @@ -11,7 +11,7 @@ #include "HalInterface.h" #include "KrlMmManage.h" -private void CR3Init(CR3* init) +public void CR3Init(CR3* init) { if(NULL == init) { @@ -21,7 +21,7 @@ private void CR3Init(CR3* init) return; } -void MMUInit(MMU* init) +public void MMUInit(MMU* init) { if(NULL == init) { @@ -797,6 +797,92 @@ private SDireArr* MMUTranslationSDire(MMU* mmulocked, TDireArr* tdirearr, Addr v return sdirearr; } +private Addr MMUFindPMSADAddress(MDireArr* mdirearr, Addr vaddr) +{ + UInt mindex; + MDire dire; + if(NULL == mdirearr) + { + return NULL; + } + + mindex = MDireIndex(vaddr); + + dire = mdirearr->MDEArr[mindex]; + + if(MMUPMSADIsHave(&dire) == FALSE) + { + return NULL; + } + + return MMUPMSADRetPAddr(&dire); +} + + +private MDireArr* MMUFindMDireArr(IDireArr* idirearr, Addr vaddr) +{ + UInt iindex; + IDire dire; + if(NULL == idirearr) + { + return NULL; + } + + iindex = IDireIndex(vaddr); + + dire = idirearr->IDEArr[iindex]; + + if(MDireIsHave(&dire) == FALSE) + { + return NULL; + } + + return IDireRetMDireArr(&dire); +} + + +private IDireArr* MMUFindIDireArr(SDireArr* sdirearr, Addr vaddr) +{ + UInt sindex; + SDire dire; + if(NULL == sdirearr) + { + return NULL; + } + + sindex = SDireIndex(vaddr); + + dire = sdirearr->SDEArr[sindex]; + + if(IDireIsHave(&dire) == FALSE) + { + return NULL; + } + + return SDireRetIDireArr(&dire); +} + +private SDireArr* MMUFindSDireArr(TDireArr* tdirearr, Addr vaddr) +{ + UInt tindex; + TDire dire; + if(NULL == tdirearr) + { + return NULL; + } + + tindex = TDireIndex(vaddr); + + dire = tdirearr->TDEArr[tindex]; + + if(SDireIsHave(&dire) == FALSE) + { + return NULL; + } + + return TDireRetSDireArr(&dire); +} + public void HalMMULoad(MMU* mmu) { if(NULL == mmu) @@ -818,14 +904,90 @@ public void HalMMULoad(MMU* mmu) return; } -public void HalMMURefresh() +private void HalMMUInnerRefresh(MMU* mmulocked) { CR3 cr3; - cr3.Entry = (U64)HalReadCR3(); - HalWriteCR3(cr3.Entry); + if(NULL == mmulocked) + { + cr3.Entry = (U64)HalReadCR3(); + HalWriteCR3(cr3.Entry); + return; + } + if(NULL == mmulocked->TDireArrPtr || 0 != (((U64)(mmulocked->TDireArrPtr)) & 0xfff)) + { + return; + } + + mmulocked->CR3.Entry = HalVAddrToPAddr((Addr)mmulocked->TDireArrPtr); + HalWriteCR3((UInt)(mmulocked->CR3.Entry)); + return; +} + + + +public void HalMMURefresh(MMU* mmu) +{ + CR3 cr3; + if(NULL == mmu) + { + cr3.Entry = (U64)HalReadCR3(); + HalWriteCR3(cr3.Entry); + return; + } + HalMMULoad(mmu); return; } +private Addr HalUnMMUTranslationCore(MMU* mmu, Addr vaddr) +{ + Addr retadr; + SDireArr* sdirearr; + IDireArr* idirearr; + MDireArr* mdirearr; + HalSPinLock(&mmu->Lock); + sdirearr = MMUFindSDireArr(mmu->TDireArrPtr, vaddr); + if(NULL == sdirearr) + { + retadr = NULL; + goto outLabel; + } + + idirearr = MMUFindIDireArr(sdirearr, vaddr); + if(NULL == idirearr) + { + retadr = NULL; + goto ERRLabelSDireArr; + } + + mdirearr = MMUFindMDireArr(idirearr, vaddr); + if(NULL == mdirearr) + { + retadr = NULL; + goto ERRLabelIDireArr; + } + + retadr = MMUUnTranslationPMSAD(mmu, mdirearr, vaddr); + + MMUUnTranslationMDire(mmu, idirearr, NULL, vaddr); +ERRLabelIDireArr: + MMUUnTranslationIDire(mmu, sdirearr, NULL, vaddr); +ERRLabelSDireArr: + MMUUnTranslationSDire(mmu, mmu->TDireArrPtr, NULL, vaddr); +outLabel: + HalMMUInnerRefresh(mmu); + HalUnSPinLock(&mmu->Lock); + return retadr; +} + +public Addr HalUnMMUTranslation(MMU* mmu, Addr vaddr) +{ + if(NULL == mmu) + { + return EPARAM; + } + return HalUnMMUTranslationCore(mmu, vaddr); +} + private Bool HalMMUTranslationCore(MMU* mmu, Addr vaddr, Addr paddr, U64 flags) { Bool rets = FALSE; @@ -871,7 +1033,7 @@ private Bool HalMMUTranslationCore(MMU* mmu, Addr vaddr, Addr paddr, U64 flags) if(TRUE == rets) { rets = TRUE; - HalMMURefresh(); + HalMMUInnerRefresh(mmu); goto out; } diff --git a/Include/HalInc/X86_64Inc/HalMMU.h b/Include/HalInc/X86_64Inc/HalMMU.h index be299eb..e01a4e4 100644 --- a/Include/HalInc/X86_64Inc/HalMMU.h +++ b/Include/HalInc/X86_64Inc/HalMMU.h @@ -233,4 +233,64 @@ typedef struct MMU UInt MDirMsaNR; } MMU; + +public void CR3Init(CR3* init); +public void MMUInit(MMU* init); +private UInt TDireIndex(Addr vaddr); +private UInt SDireIndex(Addr vaddr); +private UInt IDireIndex(Addr vaddr); +private UInt MDireIndex(Addr vaddr); +private void TDireArrInit(TDireArr* init); +private void SDireArrInit(SDireArr* init); +private void IDireArrInit(IDireArr* init); +private void MDireArrInit(MDireArr* init); +private Bool SDireArrIsAllZero(SDireArr* sdirearr); +private Bool SDireIsHave(TDire* tdire); +private Bool SDireIsPresence(TDire* tdire); +private Addr SDireRetPAddr(TDire* tdire); +private Addr SDireRetVAddr(TDire* tdire); +private SDireArr* TDireRetSDireArr(TDire* tdire); +private Bool IDireArrIsAllZero(IDireArr* idirearr); +private Bool IDireIsHave(SDire* sdire); +private Bool IDireIsPresence(SDire* sdire); +private Addr IDireRetPAddr(SDire* sdire); +private Addr IDireRetVAddr(SDire* sdire); +private IDireArr* SDireRetIDireArr(SDire* sdire); +private Bool MDireArrIsAllZero(MDireArr* mdirearr); +private Bool MDireIsHave(IDire* idire); +private Bool MDireIsPresence(IDire* idire); +private Addr MDireRetPAddr(IDire* idire); +private Addr MDireRetVAddr(IDire* idire); +private MDireArr* IDireRetMDireArr(IDire* idire); +private Bool MMUPMSADIsHave(MDire* mdire); +private Bool MMUPMSADIsPresence(MDire* mdire); +private Addr MMUPMSADRetPAddr(MDire* mdire); +private PMSAD* MMUNewTDireArr(MMU* mmulocked); +private Bool MMUDelTDireArr(MMU* mmulocked, TDireArr* tdirearr, PMSAD* msad); +private PMSAD* MMUNewSDireArr(MMU* mmulocked); +private Bool MMUDelSDireArr(MMU* mmulocked, SDireArr* sdirearr, PMSAD* msad); +private PMSAD* MMUNewIDireArr(MMU* mmulocked); +private Bool MMUDelIDireArr(MMU* mmulocked, IDireArr* idirearr, PMSAD* msad); +private PMSAD* MMUNewMDireArr(MMU* mmulocked); +private Bool MMUDelMDireArr(MMU* mmulocked, MDireArr* mdirearr, PMSAD* msad); +private Addr MMUUnTranslationPMSAD(MMU* mmulocked, MDireArr* mdirearr, Addr vaddr); +private Bool MMUTranslationPMSAD(MMU* mmulocked, MDireArr* mdirearr, Addr vaddr, Addr paddr, U64 flags); +private Bool MMUUnTranslationMDire(MMU* mmulocked, IDireArr* idirearr, PMSAD* msad, Addr vaddr); +private MDireArr* MMUTranslationMDire(MMU* mmulocked, IDireArr* idirearr, Addr vaddr, U64 flags, PMSAD** outmsad); +private Bool MMUUnTranslationIDire(MMU* mmulocked, SDireArr* sdirearr, PMSAD* msad, Addr vaddr); +private IDireArr* MMUTranslationIDire(MMU* mmulocked, SDireArr* sdirearr, Addr vaddr, U64 flags, PMSAD** outmsad); +private Bool MMUUnTranslationSDire(MMU* mmulocked, TDireArr* tdirearr, PMSAD* msad, Addr vaddr); +private SDireArr* MMUTranslationSDire(MMU* mmulocked, TDireArr* tdirearr, Addr vaddr, U64 flags, PMSAD** outmsad); +private Addr MMUFindPMSADAddress(MDireArr* mdirearr, Addr vaddr); +private MDireArr* MMUFindMDireArr(IDireArr* idirearr, Addr vaddr); +private IDireArr* MMUFindIDireArr(SDireArr* sdirearr, Addr vaddr); +private SDireArr* MMUFindSDireArr(TDireArr* tdirearr, Addr vaddr); +public void HalMMULoad(MMU* mmu); +private void HalMMUInnerRefresh(MMU* mmulocked); +public void HalMMURefresh(MMU* mmu); +private Addr HalUnMMUTranslationCore(MMU* mmu, Addr vaddr); +public Addr HalUnMMUTranslation(MMU* mmu, Addr vaddr); +private Bool HalMMUTranslationCore(MMU* mmu, Addr vaddr, Addr paddr, U64 flags); +public Bool HalMMUTranslation(MMU* mmu, Addr vaddr, Addr paddr, U64 flags); + #endif From 7807c806f5d3e646ac1b42934c4ac68b6a15e6e9 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 7 Sep 2021 17:44:54 +0800 Subject: [PATCH 013/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0HAL=E5=B1=82Cache?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalCache.c | 94 +++++++++++++++++++++++++++++ Include/HalInc/X86_64Inc/HalCache.h | 20 ++++++ 2 files changed, 114 insertions(+) diff --git a/Hal/X86_64/HalCache.c b/Hal/X86_64/HalCache.c index e69de29..6fd2fab 100644 --- a/Hal/X86_64/HalCache.c +++ b/Hal/X86_64/HalCache.c @@ -0,0 +1,94 @@ +/********************************************************** + Cache控制文件HalCache.c +*********************************************************** + 彭东 +**********************************************************/ +#include "BaseType.h" +#include "HalCache.h" +private void CacheWbinvd() +{ + __asm__ __volatile__("wbinvd": : :"memory"); + return; +} + +private void CacheInvd() +{ + __asm__ __volatile__("invd": : :"memory"); + return; +} + +private void CacheCLFlush(void* addr) +{ + __asm__ __volatile__("clflush %0" : "+m" (*(volatile char*)addr)); + return; +} + +private void CacheEnable() +{ + __asm__ __volatile__( + "movl %%cr0, %%eax \n\t" + "btrl $29, %%eax \n\t" //CR0.NW=0 + "btrl $30, %%eax \n\t" //CR0.CD=0 CACHE + "movl %%eax, %%cr0 \n\t" + : + : + :"eax", "memory" + ) + return; +} + +private void CacheDisable() +{ + __asm__ __volatile__( + "movl %%cr0, %%eax \n\t" + "btsl $29, %%eax \n\t" //CR0.NW=0 + "btsl $30, %%eax \n\t" //CR0.CD=0 CACHE + "movl %%eax, %%cr0 \n\t" + : + : + :"eax", "memory" + ) + return; +} + + +public Bool HalCacheEnable() +{ + CacheEnable(); + return TRUE; +} + +public Bool HalCacheDisable() +{ + CacheWbinvd(); + CacheDisable(); + return TRUE; +} + +public Bool HalCacheRefresh() +{ + CacheWbinvd(); + return TRUE; +} + +public Bool HalCacheRefreshLine(Addr vaddr) +{ + CacheCLFlush((void*)vaddr); + return TRUE; +} + +public Bool HalCacheInvalid() +{ + CacheInvd(); + return TRUE; +} + +public Bool HalCacheInvalidLine(Addr vaddr) +{ + return HalCacheRefreshLine(vaddr); +} + +public Bool HalCacheInit() +{ + return HalCacheEnable(); +} \ No newline at end of file diff --git a/Include/HalInc/X86_64Inc/HalCache.h b/Include/HalInc/X86_64Inc/HalCache.h index e69de29..da7c7e9 100644 --- a/Include/HalInc/X86_64Inc/HalCache.h +++ b/Include/HalInc/X86_64Inc/HalCache.h @@ -0,0 +1,20 @@ +/********************************************************** + Cache控制头文件HalCache.h +*********************************************************** + 彭东 +**********************************************************/ +#ifndef _HALCACHEHEAD +#define _HALCACHEHEAD +private void CacheWbinvd(); +private void CacheInvd(); +private void CacheCLFlush(void* addr); +private void CacheEnable(); +private void CacheDisable(); +public Bool HalCacheEnable(); +public Bool HalCacheDisable(); +public Bool HalCacheRefresh(); +public Bool HalCacheRefreshLine(Addr vaddr); +public Bool HalCacheInvalid(); +public Bool HalCacheInvalidLine(Addr vaddr); +public Bool HalCacheInit(); +#endif \ No newline at end of file From 4789bdaa8c88b6af06c97294307ac9c08c3f1254 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 7 Sep 2021 22:18:26 +0800 Subject: [PATCH 014/221] =?UTF-8?q?=E4=BF=AE=E6=94=B9ListForEachDeleteOneL?= =?UTF-8?q?ist=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/BaseInc/List.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/BaseInc/List.h b/Include/BaseInc/List.h index 1a14806..b030418 100755 --- a/Include/BaseInc/List.h +++ b/Include/BaseInc/List.h @@ -111,7 +111,7 @@ KLINE Bool ListIsEmptyCareful(const List *head) #define ListForEach(pos, head) for (pos = (head)->Next; pos != (head); pos = pos->Next) -#define ListForEachHeadDell(pos, head) for (pos = (head)->Next; pos != (head); pos = (head)->Next) +#define ListForEachDeleteOneList(pos, head) for (pos = (head)->Next; pos != (head); pos = (head)->Next) #define ListEntry(ptr, type, member) \ ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member))) From d6bc8bed2d0226a203a086eadef5354b3feba841 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 7 Sep 2021 22:29:46 +0800 Subject: [PATCH 015/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0MMU=E6=B8=85=E7=90=86?= =?UTF-8?q?=E3=80=81=E5=BC=80=E5=85=B3=EF=BC=8C=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalMMU.c | 164 +++++++++++++++++++++++++++++- Include/HalInc/X86_64Inc/HalMMU.h | 9 +- 2 files changed, 170 insertions(+), 3 deletions(-) diff --git a/Hal/X86_64/HalMMU.c b/Hal/X86_64/HalMMU.c index d5894a7..60ba8b3 100644 --- a/Hal/X86_64/HalMMU.c +++ b/Hal/X86_64/HalMMU.c @@ -949,7 +949,7 @@ private Addr HalUnMMUTranslationCore(MMU* mmu, Addr vaddr) if(NULL == sdirearr) { retadr = NULL; - goto outLabel; + goto OUTLabel; } idirearr = MMUFindIDireArr(sdirearr, vaddr); @@ -973,7 +973,7 @@ private Addr HalUnMMUTranslationCore(MMU* mmu, Addr vaddr) MMUUnTranslationIDire(mmu, sdirearr, NULL, vaddr); ERRLabelSDireArr: MMUUnTranslationSDire(mmu, mmu->TDireArrPtr, NULL, vaddr); -outLabel: +OUtLabel: HalMMUInnerRefresh(mmu); HalUnSPinLock(&mmu->Lock); return retadr; @@ -1059,3 +1059,163 @@ public Bool HalMMUTranslation(MMU* mmu, Addr vaddr, Addr paddr, U64 flags) } return HalMMUTranslationCore(mmu, vaddr, paddr, flags); } + + +private Bool MMUCleanMDireArrAllPMSAD(MMU* mmulocked) +{ + List* pos; + PMSAD* msad = NULL; + if(NULL == mmulocked) + { + return FALSE; + } + ListForEachDeleteOneList(pos, &mmulocked->MDirHead) + { + msad = ListEntry(pos, PMSAD, md_list); + ListDel(&msad->Lists); + if(HalExPPutKrlOnePMSAD(msad) == FALSE) + { + system_error("mmu_clean_mdirearrmsas"); + return FALSE; + } + mmulocked->MDirMsaNR--; + } + return TRUE; +} + +private Bool MMUCleanIDireArrAllPMSAD(MMU* mmulocked) +{ + List* pos; + PMSAD* msad = NULL; + if(NULL == mmulocked) + { + return FALSE; + } + ListForEachDeleteOneList(pos, &mmulocked->IDirHead) + { + msad = ListEntry(pos, PMSAD, Lists); + ListDel(&msad->Lists); + if(HalExPPutKrlOnePMSAD(msad) == FALSE) + { + system_error("mmu_clean_idirearrmsas"); + return FALSE; + } + mmulocked->IDirMsaNR--; + } + return TRUE; +} + +private Bool MMUCleanSDireArrAllPMSAD(MMU* mmulocked) +{ + List* pos; + PMSAD* msad = NULL; + if(NULL == mmulocked) + { + return FALSE; + } + ListForEachDeleteOneList(pos, &mmulocked->SDirHead) + { + msad = ListEntry(pos, PMSAD, Lists); + ListDel(&msad->Lists); + if(HalExPPutKrlOnePMSAD(msad) == FALSE) + { + system_error("MMUCleanSDireArrAllPMSAD"); + return FALSE; + } + mmulocked->SDirMsaNR--; + } + return TRUE; +} + +private Bool MMUCleanTDireArrAllPMSAD(MMU* mmulocked) +{ + List* pos; + PMSAD* msad = NULL; + if(NULL == mmulocked) + { + return FALSE; + } + ListForEachDeleteOneList(pos, &mmulocked->TDirHead) + { + msad = ListEntry(pos, PMSAD, Lists); + ListDel(&msad->Lists); + if(HalExPPutKrlOnePMSAD(msad) == FALSE) + { + system_error("MMUCleanTDireArrAllPMSAD"); + return FALSE; + } + mmulocked->TDirMsaNR--; + } + return TRUE; +} + +public Bool HalMMUClean() +{ + Bool rets = FALSE; + Addr pcr3 = NULL, vcr3 = NULL; + CR3 cr3; + if(NULL == mmu) + { + return FALSE; + } + + HalSPinlock(&mmu->Lock); + + cr3.Entry = (U64)HalReadCR3(); + + pcr3 = (Addr)(cr3.Flags.Plm4a << 12); + vcr3 = HalPAddrToVAddr(pcr3); + + if(vcr3 == (Addr)(mmu->TDireArrPtr)) + { + rets = FALSE; + goto OUTLabel; + } + + if(MMUCleanMDireArrAllPMSAD(mmu) == FALSE) + { + rets = FALSE; + goto OUTLabel; + } + + if(MMUCleanIDireArrAllPMSAD(mmu) == FALSE) + { + rets = FALSE; + goto OUTLabel; + } + + if(MMUCleanSDireArrAllPMSAD(mmu) == FALSE) + { + rets = FALSE; + goto OUTLabel; + } + + if(MMUCleanTDireArrAllPMSAD(mmu) == FALSE) + { + rets = FALSE; + goto OUTLabel; + } + + rets = TRUE; + +OUTLabel: + HalUnSPinLock(&mmu->Lock); + return rets; +} + +public Bool HalMMUEnable() +{ + //x86_64下没法单纯的开启MMU + return TRUE; +} + +public Bool HalMMUDisable() +{ + //x86_64下没法单纯的关闭MMU + return FALSE; +} + +public Bool HalMMUInit() +{ + return HalMMUEnable(); +} \ No newline at end of file diff --git a/Include/HalInc/X86_64Inc/HalMMU.h b/Include/HalInc/X86_64Inc/HalMMU.h index e01a4e4..603a897 100644 --- a/Include/HalInc/X86_64Inc/HalMMU.h +++ b/Include/HalInc/X86_64Inc/HalMMU.h @@ -292,5 +292,12 @@ private Addr HalUnMMUTranslationCore(MMU* mmu, Addr vaddr); public Addr HalUnMMUTranslation(MMU* mmu, Addr vaddr); private Bool HalMMUTranslationCore(MMU* mmu, Addr vaddr, Addr paddr, U64 flags); public Bool HalMMUTranslation(MMU* mmu, Addr vaddr, Addr paddr, U64 flags); - +private Bool MMUCleanMDireArrAllPMSAD(MMU* mmulocked); +private Bool MMUCleanIDireArrAllPMSAD(MMU* mmulocked); +private Bool MMUCleanSDireArrAllPMSAD(MMU* mmulocked); +private Bool MMUCleanTDireArrAllPMSAD(MMU* mmulocked); +public Bool HalMMUClean(); +public Bool HalMMUEnable(); +public Bool HalMMUDisable(); +public Bool HalMMUInit(); #endif From 198579d94704088212b92fb33ce20d3d516729a8 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 8 Sep 2021 09:56:54 +0800 Subject: [PATCH 016/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0MMU=E7=9A=84HalMMUIni?= =?UTF-8?q?tExecutorTDireArr()=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalMMU.c | 32 ++++++++++++++++++++++++++++++- Include/HalInc/X86_64Inc/HalMMU.h | 3 ++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/Hal/X86_64/HalMMU.c b/Hal/X86_64/HalMMU.c index 60ba8b3..cf8092c 100644 --- a/Hal/X86_64/HalMMU.c +++ b/Hal/X86_64/HalMMU.c @@ -1,5 +1,5 @@ /********************************************************** - 内存mmu文件halmmu.c + 内存mmu文件HalMMU.c *********************************************************** 彭东 **********************************************************/ @@ -1203,6 +1203,36 @@ public Bool HalMMUClean() return rets; } +public Bool HalMMUInitExecutorTDireArr(MMU* mmu) +{ + Bool rets = FALSE; + Addr vcr3 = NULL; + if(NULL == mmu) + { + return FALSE; + } + HalSPinLock(&mmu->Lock); + + if(MMUNewTDireArr(mmu) == NULL) + { + rets = FALSE; + goto OUTLable; + } + + vcr3 = HalPAddrToVAddr(kmachbsp.mb_pml4padr); + + HalMemCopy((void*)vcr3, (void*)mmu->TDireArrPtr, sizeof(TDireArr)); + + mmu->Cr3.Entry = (U64)HalVAddrToPAddr((Addr)mmu->TDireArrPtr); + mmu->TDireArrPtr->TDEArr[0].TEntry = 0; + + rets = TRUE; + +OUTLable: + HalUnSPinLock(&mmu->Lock); + return rets; +} + public Bool HalMMUEnable() { //x86_64下没法单纯的开启MMU diff --git a/Include/HalInc/X86_64Inc/HalMMU.h b/Include/HalInc/X86_64Inc/HalMMU.h index 603a897..6442c11 100644 --- a/Include/HalInc/X86_64Inc/HalMMU.h +++ b/Include/HalInc/X86_64Inc/HalMMU.h @@ -1,5 +1,5 @@ /********************************************************** - MMU头文件halmmu.h + MMU头文件HalMMU.h *********************************************************** 彭东 **********************************************************/ @@ -297,6 +297,7 @@ private Bool MMUCleanIDireArrAllPMSAD(MMU* mmulocked); private Bool MMUCleanSDireArrAllPMSAD(MMU* mmulocked); private Bool MMUCleanTDireArrAllPMSAD(MMU* mmulocked); public Bool HalMMUClean(); +public Bool HalMMUInitExecutorTDireArr(MMU* mmu); public Bool HalMMUEnable(); public Bool HalMMUDisable(); public Bool HalMMUInit(); From 7a68c22d6fb86a60d71a5b9340e93bd5b8adb207 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 8 Sep 2021 09:58:47 +0800 Subject: [PATCH 017/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0CPU=E7=9A=84HalCPUIni?= =?UTF-8?q?t()=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalCPU.c | 5 +++++ Include/HalInc/X86_64Inc/HalCPU.h | 7 +++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Hal/X86_64/HalCPU.c b/Hal/X86_64/HalCPU.c index 3414120..f1d5bca 100644 --- a/Hal/X86_64/HalCPU.c +++ b/Hal/X86_64/HalCPU.c @@ -24,4 +24,9 @@ public Addr HalPAddrToVAddr(Addr kpaddr) return KRNL_ADDR_ERROR; } return kpaddr + KRNL_MAP_VIRTADDRESS_START; +} + +public Bool HalCPUInit() +{ + return TRUE; } \ No newline at end of file diff --git a/Include/HalInc/X86_64Inc/HalCPU.h b/Include/HalInc/X86_64Inc/HalCPU.h index 6a0bb8f..3571928 100644 --- a/Include/HalInc/X86_64Inc/HalCPU.h +++ b/Include/HalInc/X86_64Inc/HalCPU.h @@ -57,7 +57,6 @@ KLINE void HalOutU8NOP(const U16 port, const U8 val) KLINE U8 HalInU8(const U16 port) { U8 tmp; - /* GCC can optimize here if constant */ __asm__ __volatile__("inb %1, %0\n" : "=a"(tmp) : "dN"(port)); @@ -120,7 +119,7 @@ KLINE void HalWriteMsr(const U32 reg, const U64 val) : "a"((U32)val), "d"((U32)(val >> 32)), "c"(reg)); } -KLINE void HalMemCopy(void *src, void *dest, UInt count) +KLINE void HalMemCopy(void* src, void* dest, UInt count) { U8 *ss = src, *sd = dest; @@ -131,7 +130,7 @@ KLINE void HalMemCopy(void *src, void *dest, UInt count) return; } -KLINE SInt HalM2MCopy(void *sadr, void *dadr, SInt len) +KLINE SInt HalM2MCopy(void* sadr, void* dadr, SInt len) { if (NULL == sadr || NULL == dadr || 1 > len) { @@ -335,5 +334,5 @@ KLINE void HalWriteCR3(UInt val) public Addr HalVAddrToPAddr(Addr kvaddr); public Addr HalPAddrToVAddr(Addr kpaddr); - +public Bool HalCPUInit(); #endif From 62e10206e58b847b55af451f8a2d0342e6966a12 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 8 Sep 2021 10:13:13 +0800 Subject: [PATCH 018/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0IPC=E9=80=9A=E4=BF=A1?= =?UTF-8?q?=E7=9A=84HalIPCInit()=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalIPC.c | 12 ++++++++++++ Include/HalInc/X86_64Inc/HalIPC.h | 9 +++++++++ 2 files changed, 21 insertions(+) diff --git a/Hal/X86_64/HalIPC.c b/Hal/X86_64/HalIPC.c index e69de29..aa71e44 100644 --- a/Hal/X86_64/HalIPC.c +++ b/Hal/X86_64/HalIPC.c @@ -0,0 +1,12 @@ +/********************************************************** + 底层IPC通信文件HalIPC.c +*********************************************************** + 彭东 +**********************************************************/ +#include "BaseType.h" +#include "HalIPC.h" + +public Bool HalIPCInit() +{ + return TRUE; +} diff --git a/Include/HalInc/X86_64Inc/HalIPC.h b/Include/HalInc/X86_64Inc/HalIPC.h index e69de29..7ab142d 100644 --- a/Include/HalInc/X86_64Inc/HalIPC.h +++ b/Include/HalInc/X86_64Inc/HalIPC.h @@ -0,0 +1,9 @@ +/********************************************************** + 底层IPC通信头文件HalIPC.h +*********************************************************** + 彭东 +**********************************************************/ +#ifndef _HALIPCHEAD +#define _HALIPCHEAD +public Bool HalIPCInit(); +#endif \ No newline at end of file From f01e740766cb04ba0403d43de9620fdb28f036b4 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 8 Sep 2021 17:28:32 +0800 Subject: [PATCH 019/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E6=A0=B8?= =?UTF-8?q?=E6=A0=B8=E5=BF=83=E5=B1=82=E5=88=9D=E5=A7=8B=E5=8C=96KrlCoreIn?= =?UTF-8?q?it()=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/KrlInit.h | 9 +++++++++ Kernel/KrlInit.c | 12 ++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 Include/KernelInc/KrlInit.h create mode 100644 Kernel/KrlInit.c diff --git a/Include/KernelInc/KrlInit.h b/Include/KernelInc/KrlInit.h new file mode 100644 index 0000000..4a8d652 --- /dev/null +++ b/Include/KernelInc/KrlInit.h @@ -0,0 +1,9 @@ +/**************************************************************** + Kernel层初始化头文件KrlInit.h +***************************************************************** + 彭东 +****************************************************************/ +#ifndef _KRLINITHEAD +#define _KRLINITHEAD +public void KrlCoreInit(); +#endif diff --git a/Kernel/KrlInit.c b/Kernel/KrlInit.c new file mode 100644 index 0000000..018f769 --- /dev/null +++ b/Kernel/KrlInit.c @@ -0,0 +1,12 @@ +/**************************************************************** + Kernel层初始化头文件KrlInit.h +***************************************************************** + 彭东 +****************************************************************/ +#include "BaseType.h" +#include "KrlInit.h" + +public void KrlCoreInit() +{ + return; +} \ No newline at end of file From 7b875345c10bdde45d3e995d628a3d0ffe289df7 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 8 Sep 2021 17:30:13 +0800 Subject: [PATCH 020/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E5=BC=95=E5=AF=BCHalBootStart()=E7=9B=B8=E5=85=B3=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalBoot.c | 28 ++++++++++++++++++++++++++++ Include/HalInc/X86_64Inc/HalBoot.h | 11 +++++++++++ 2 files changed, 39 insertions(+) diff --git a/Hal/X86_64/HalBoot.c b/Hal/X86_64/HalBoot.c index e69de29..2fb0a38 100644 --- a/Hal/X86_64/HalBoot.c +++ b/Hal/X86_64/HalBoot.c @@ -0,0 +1,28 @@ +/********************************************************** + 底层引导初始化文件HalBoot.c +*********************************************************** + 彭东 +**********************************************************/ +#include "BaseType.h" +#include "HalBoot.h" +#include "HalCPU.h" +#include "HalMMU.h" +#include "HalCache.h" +#include "HalIPC.h" +#include "KrlInit.h" + +private Bool HalBootInit() +{ + HalCPUInit(); + HalMMUInit(); + HalCacheInit(); + HalIPCInit(); + return TRUE; +} + +public void HalBootStart() +{ + HalBootInit(); + KrlCoreInit(); + return; +} \ No newline at end of file diff --git a/Include/HalInc/X86_64Inc/HalBoot.h b/Include/HalInc/X86_64Inc/HalBoot.h index e69de29..4ba6f2d 100644 --- a/Include/HalInc/X86_64Inc/HalBoot.h +++ b/Include/HalInc/X86_64Inc/HalBoot.h @@ -0,0 +1,11 @@ +/********************************************************** + 底层引导初始化头文件HalBoot.h +*********************************************************** + 彭东 +**********************************************************/ + +#ifndef _HALBOOTHEAD +#define _HALBOOTHEAD +private Bool HalBootInit(); +public void HalBootStart(); +#endif From 4191356d6502df74d6b0b8c055fc4cb327d04de6 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 9 Sep 2021 16:19:17 +0800 Subject: [PATCH 021/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96CPU=E7=9A=84GDT=E4=B8=8EIDT=E7=9A=84=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalCPU.c | 234 ++++++++++++++++++++++++ Hal/X86_64/HalInterrupt.c | 7 + Include/HalInc/X86_64Inc/HalCPU.h | 174 ++++++++++++++++++ Include/HalInc/X86_64Inc/HalInterrupt.h | 64 +++++++ 4 files changed, 479 insertions(+) diff --git a/Hal/X86_64/HalCPU.c b/Hal/X86_64/HalCPU.c index f1d5bca..6b96bad 100644 --- a/Hal/X86_64/HalCPU.c +++ b/Hal/X86_64/HalCPU.c @@ -5,6 +5,13 @@ **********************************************************/ #include "BaseType.h" #include "HalCPU.h" +#include "HalInterrupt.h" + +DefinedCPUArchData(GDT, GDTable); +DefinedCPUArchData(IDT, IDTable); +DefinedCPUArchData(TSS, TSSTable); +DefinedCPUArchData(GDTPTR, GDTablePtr); +DefinedCPUArchData(IDTPTR, IDTablePtr); public Addr HalVAddrToPAddr(Addr kvaddr) { @@ -26,7 +33,234 @@ public Addr HalPAddrToVAddr(Addr kpaddr) return kpaddr + KRNL_MAP_VIRTADDRESS_START; } +//gate = &IDTable.GateDescArr[vector]; +private Bool SetOneGateDesc(GateDesc* gate, U8 type, IDTHandler handler, U8 privilege) +{ + U64 base = (U64)handler; + gate->OffsetLow = base & 0xFFFF; + gate->Selector = SELECTOR_KERNEL_CS; + gate->DCount = 0; + gate->Attr = (U8)(type | (privilege << 5)); + gate->OffsetHigh = (U16)((base >> 16) & 0xFFFF); + gate->OffsetHighH = (U32)((base >> 32) & 0xffffffff); + gate->OffsetResv = 0; + return TRUE; +} + +private Bool SetOneSegmentDesc(SegmentDesc* desc, U32 base, U32 limit, U16 attribute) +{ + desc->LimitLow = limit & 0x0FFFF; // 段界限 1(2 字节) + desc->BaseLow = base & 0x0FFFF; // 段基址 1(2 字节) + desc->BaseMiddle = (base >> 16) & 0x0FF; // 段基址 2(1 字节) + desc->Attr1 = (U8)(attribute & 0xFF); // 属性 1 + desc->LimitHighAttr2 = (U8)(((limit >> 16) & 0x0F) | ((attribute >> 8) & 0xF0)); // 段界限 2 + 属性 2 + desc->BaseHigh = (U8)((base >> 24) & 0x0FF); // 段基址 3\(1 字节) + return; +} + +private Bool SetOneX64TSSAttrInSegmentDesc(SegmentDesc* desc, U64 base, U32 limit, U16 attribute) +{ + U32* x64tssbasehight = (U32*)(desc + 1); + + desc->LimitLow = limit & 0x0FFFF; // 段界限 1(2 字节) + desc->BaseLow = base & 0x0FFFF; // 段基址 1(2 字节) + desc->BaseMiddle = (base >> 16) & 0x0FF; // 段基址 2(1 字节) + desc->Attr1 = (U8)(attribute & 0xFF); // 属性 1 + desc->LimitHighAttr2 = (U8)(((limit >> 16) & 0x0F) | ((attribute >> 8) & 0xF0)); // 段界限 2 + 属性 2 + desc->BaseHigh = (U8)((base >> 24) & 0x0FF); + + *x64tssbasehight = (U32)((base >> 32) & 0xffffffff); + *(x64tssbasehight + 1) = 0; + return TRUE; +} + +private void CPULoadGDT(GDTPTR* gdtptr) +{ + + __asm__ __volatile__( + + "cli \n\t" + "pushq %%rax \n\t" + //"movq %0,%%rax \n\t" + "lgdt (%0) \n\t" + + "movabsq $1f,%%rax \n\t" + //"pushq $0 \n\t" $x64_igdt_reg//# fake return address to stop unwinder + "pushq $8 \n\t" + "pushq %%rax \n\t" + "lretq \n\t" + "1:\n\t" + "movw $0x10,%%ax\n\t" + "movw %%ax,%%ds\n\t" + "movw %%ax,%%es\n\t" + "movw %%ax,%%ss\n\t" + "movw %%ax,%%fs\n\t" + "movw %%ax,%%gs\n\t" + "popq %%rax \n\t" + : + : "r"(gdtptr) + : "rax", "memory"); + return; +} + +private void CPULoadIDT(IDTPTR* idtptr) +{ + __asm__ __volatile__( + "lidt (%0) \n\t" + + : + : "r"(idtptr) + : "memory"); + return; +} + +private void CPULoadTr(U16 trindx) +{ + __asm__ __volatile__( + "ltr %0 \n\t" + : + : "r"(trindx) + : "memory"); +} + + +private Bool CPUInitIDT() +{ + for(UInt i = 0; i < IDTMAX; i++) + { + SetOneGateDesc(&IDTable.GateDescArr[i], DA_386IGate, NULL, PRIVILEGE_KRNL) + } + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_DIVIDE, DA_386IGate, exc_divide_error, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_DEBUG, DA_386IGate, exc_single_step_exception, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_NMI, DA_386IGate, exc_nmi, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_BREAKPOINT, DA_386IGate, exc_breakpoint_exception, PRIVILEGE_USER); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_OVERFLOW, DA_386IGate, exc_overflow, PRIVILEGE_USER); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_BOUNDS, DA_386IGate, exc_bounds_check, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_INVAL_OP, DA_386IGate, exc_inval_opcode, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_COPROC_NOT, DA_386IGate, exc_copr_not_available, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_DOUBLE_FAULT, DA_386IGate, exc_double_fault, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_COPROC_SEG, DA_386IGate, exc_copr_seg_overrun, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_INVAL_TSS, DA_386IGate, exc_inval_tss, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_SEG_NOT, DA_386IGate, exc_segment_not_present, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_STACK_FAULT, DA_386IGate, exc_stack_exception, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_PROTECTION, DA_386IGate, exc_general_protection, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_PAGE_FAULT, DA_386IGate, exc_page_fault, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_COPROC_ERR, DA_386IGate, exc_copr_error, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_ALIGN_CHEK, DA_386IGate, exc_alignment_check, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_MACHI_CHEK, DA_386IGate, exc_machine_check, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_SIMD_FAULT, DA_386IGate, exc_simd_fault, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ0 + 0], DA_386IGate, HalExIHWINT00, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ0 + 1], DA_386IGate, HalExIHWINT01, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ0 + 2], DA_386IGate, HalExIHWINT02, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ0 + 3], DA_386IGate, HalExIHWINT03, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ0 + 4], DA_386IGate, HalExIHWINT04, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ0 + 5], DA_386IGate, HalExIHWINT05, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ0 + 6], DA_386IGate, HalExIHWINT06, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ0 + 7], DA_386IGate, HalExIHWINT07, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ8 + 0], DA_386IGate, HalExIHWINT08, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ8 + 1], DA_386IGate, HalExIHWINT09, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ8 + 2], DA_386IGate, HalExIHWINT10, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ8 + 3], DA_386IGate, HalExIHWINT11, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ8 + 4], DA_386IGate, HalExIHWINT12, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ8 + 5], DA_386IGate, HalExIHWINT13, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ8 + 6], DA_386IGate, HalExIHWINT14, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ8 + 7], DA_386IGate, HalExIHWINT15, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ8 + 8], DA_386IGate, HalExIHWINT16, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ8 + 9], DA_386IGate, HalExIHWINT17, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ8 + 10], DA_386IGate, HalExIHWINT18, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ8 + 11], DA_386IGate, HalExIHWINT19, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ8 + 12], DA_386IGate, HalExIHWINT20, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ8 + 13], DA_386IGate, HalExIHWINT21, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ8 + 14], DA_386IGate, HalExIHWINT22, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ8 + 15], DA_386IGate, HalExIHWINT23, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_APIC_IPI_SCHEDUL], DA_386IGate, HalExIApicIPISchedul, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_APIC_SVR], DA_386IGate, HalExIApicSVR, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_APIC_TIMER], DA_386IGate, HalExIApicTimer, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_APIC_THERMAL], DA_386IGate, HalExIApicThermal, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_APIC_PERFORM], DA_386IGate, HalExIApicPerformonitor, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_APIC_LINTO], DA_386IGate, HalExIApicLint0, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_APIC_LINTI], DA_386IGate, HalExIApicLint1, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_APIC_ERROR], DA_386IGate, HalExIApicError, PRIVILEGE_KRNL); + + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_SYSCALL], DA_386IGate, HalExSAPICall, PRIVILEGE_USER); + + IDTablePtr.IDTBass = (U64)(&IDTable.GateDescArr[0]); + IDTablePtr.IDTLen = sizeof(IDTable.GateDescArr) - 1; + CPULoadIDT(&IDTablePtr); + return TRUE; +} + +private Bool CPUInitGDT() +{ + SetOneSegmentDesc(&GDTable.SegmentDescArr[0], 0, 0, 0); + SetOneSegmentDesc(&GDTable.SegmentDescArr[1], 0, 0, DA_CR | DA_64 | 0); + SetOneSegmentDesc(&GDTable.SegmentDescArr[2], 0, 0, DA_DRW | DA_64 | 0); + SetOneSegmentDesc(&GDTable.SegmentDescArr[3], 0, 0, DA_CR | DA_64 | DA_DPL3 | 0); + SetOneSegmentDesc(&GDTable.SegmentDescArr[4], 0, 0, DA_DRW | DA_64 | DA_DPL3 | 0); + SetOneX64TSSAttrInSegmentDesc(&GDTable.SegmentDescArr[6], (U64)(&TSSTable.TSSArr[0]), sizeof(TSSTable.TSSArr[0]) - 1, DA_386TSS); + + GDTablePtr.GDTBass = (U64)(GDTable.SegmentDescArr); + GDTablePtr.GDTLen = sizeof(GDTable.SegmentDescArr) - 1; + + CPULoadGDT(&GDTablePtr); + CPULoadTr(X64TSS_INDEX); + return TRUE; +} + public Bool HalCPUInit() { + CPUInitGDT(); + CPUInitIDT(); return TRUE; } \ No newline at end of file diff --git a/Hal/X86_64/HalInterrupt.c b/Hal/X86_64/HalInterrupt.c index e69de29..4906de2 100644 --- a/Hal/X86_64/HalInterrupt.c +++ b/Hal/X86_64/HalInterrupt.c @@ -0,0 +1,7 @@ +/********************************************************** + hal层中断处理文件halInterrupt.c +*********************************************************** + 彭东 +**********************************************************/ +#include "BaseType.h" +#include "HalInterrupt.h" diff --git a/Include/HalInc/X86_64Inc/HalCPU.h b/Include/HalInc/X86_64Inc/HalCPU.h index 3571928..a9a6c7f 100644 --- a/Include/HalInc/X86_64Inc/HalCPU.h +++ b/Include/HalInc/X86_64Inc/HalCPU.h @@ -34,6 +34,172 @@ #define STIHALT() __asm__ __volatile__("sti; hlt": : : "memory") #define CLIHALT() __asm__ __volatile__("cli; hlt": : : "memory") +#define DefinedCPUArchData(vartype,varname) __attribute__((section(".cpu.core.arch.data"))) vartype varname + +#define DEVCLASSMAX 256 +#define GDTMAX 10 +#define IDTMAX 256 +#define STACKMAX 0x400 + + +#define K_CS_IDX 0x08 +#define K_DS_IDX 0x10 +#define U_CS_IDX 0x1b +#define U_DS_IDX 0x23 +#define K_TAR_IDX 0x28 +#define UMOD_EFLAGS 0x1202 + + + +/* GDT */ +/* 描述符索引 */ +#define PRIVILEGE_KRNL 0 +#define PRIVILEGE_TASK 1 +#define PRIVILEGE_USER 3 + +#define INDEX_DUMMY 0 +#define INDEX_FLAT_C 1 +#define INDEX_FLAT_RW 2 +/* 选择子 */ +#define SELECTOR_DUMMY 0 +#define SELECTOR_FLAT_C 0x08 +#define SELECTOR_FLAT_RW 0x10 + + +#define SELECTOR_KERNEL_CS SELECTOR_FLAT_C +#define SELECTOR_KERNEL_DS SELECTOR_FLAT_RW + +//TR寄存器的数据,X64TSS必须设置在GDTable中第6个段描述符的位置 +#define X64TSS_INDEX (0x30) + +/* 描述符类型值说明 */ +#define DA_64 0x2000 +#define DA_32 0x4000 /* 32 位段 */ +#define DA_LIMIT_4K 0x8000 /* 段界限粒度为 4K 字节 */ +#define DA_DPL0 0x00 /* DPL = 0 */ +#define DA_DPL1 0x20 /* DPL = 1 */ +#define DA_DPL2 0x40 /* DPL = 2 */ +#define DA_DPL3 0x60 /* DPL = 3 */ +/* 存储段描述符类型值说明 */ +#define DA_DR 0x90 /* 存在的只读数据段类型值 */ +#define DA_DRW 0x92 /* 存在的可读写数据段属性值 */ +#define DA_DRWA 0x93 /* 存在的已访问可读写数据段类型值 */ +#define DA_C 0x98 /* 存在的只执行代码段属性值 */ +#define DA_CR 0x9A /* 存在的可执行可读代码段属性值 */ +#define DA_CCO 0x9C /* 存在的只执行一致代码段属性值 */ +#define DA_CCOR 0x9E /* 存在的可执行可读一致代码段属性值 */ +/* 系统段描述符类型值说明 */ +#define DA_LDT 0x82 /* 局部描述符表段类型值 */ +#define DA_TaskGate 0x85 /* 任务门类型值 */ +#define DA_386TSS 0x89 /* 可用 386 任务状态段类型值 */ +#define DA_386CGate 0x8C /* 386 调用门类型值 */ +#define DA_386IGate 0x8E /* 386 中断门类型值 */ +#define DA_386TGate 0x8F /* 386 陷阱门类型值 */ + +/* 中断向量 */ +#define INT_VECTOR_DIVIDE 0x0 +#define INT_VECTOR_DEBUG 0x1 +#define INT_VECTOR_NMI 0x2 +#define INT_VECTOR_BREAKPOINT 0x3 +#define INT_VECTOR_OVERFLOW 0x4 +#define INT_VECTOR_BOUNDS 0x5 +#define INT_VECTOR_INVAL_OP 0x6 +#define INT_VECTOR_COPROC_NOT 0x7 +#define INT_VECTOR_DOUBLE_FAULT 0x8 +#define INT_VECTOR_COPROC_SEG 0x9 +#define INT_VECTOR_INVAL_TSS 0xA +#define INT_VECTOR_SEG_NOT 0xB +#define INT_VECTOR_STACK_FAULT 0xC +#define INT_VECTOR_PROTECTION 0xD +#define INT_VECTOR_PAGE_FAULT 0xE +#define INT_VECTOR_COPROC_ERR 0x10 +#define INT_VECTOR_ALIGN_CHEK 0x11 +#define INT_VECTOR_MACHI_CHEK 0x12 +#define INT_VECTOR_SIMD_FAULT 0x13 + +/* 中断向量 */ +#define INT_VECTOR_IRQ0 0x20 +#define INT_VECTOR_IRQ8 0x28 + +#define INT_VECTOR_APIC_IPI_SCHEDUL 0xe0 +#define INT_VECTOR_APIC_SVR 0xef +#define INT_VECTOR_APIC_TIMER 0xf0 +#define INT_VECTOR_APIC_THERMAL 0xf1 +#define INT_VECTOR_APIC_PERFORM 0xf2 +#define INT_VECTOR_APIC_LINTO 0xf3 +#define INT_VECTOR_APIC_LINTI 0xf4 +#define INT_VECTOR_APIC_ERROR 0xf5 + +#define INT_VECTOR_SYSCALL 0xFF + +typedef struct SEGMENTDESC /* 共 8 个字节 */ +{ + U16 LimitLow; /* Limit */ + U16 BaseLow; /* Base */ + U8 BaseMiddle; /* Base */ + U8 Attr1; /* P(1) DPL(2) DT(1) TYPE(4) */ + U8 LimitHighAttr2; /* G(1) D(1) 0(1) AVL(1) LimitHigh(4) */ + U8 BaseHigh; /* Base */ +}__attribute__((packed)) SegmentDesc; +/* 门描述符 */ +typedef struct GATEDESC +{ + U16 OffsetLow; /* Offset Low */ + U16 Selector; /* Selector */ + U8 DCount; /* 该字段只在调用门描述符中有效。如果在利用 + 调用门调用子程序时引起特权级的转换和堆栈 + 的改变,需要将外层堆栈中的参数复制到内层 + 堆栈。该双字计数字段就是用于说明这种情况 + 发生时,要复制的双字参数的数量。*/ + U8 Attr; /* P(1) DPL(2) DT(1) TYPE(4) */ + U16 OffsetHigh; /* Offset High */ + U32 OffsetHighH; + U32 OffsetResv; +}__attribute__((packed)) GateDesc; + +typedef struct GDTPTR +{ + U16 GDTLen; + U64 GDTBass; +}__attribute__((packed)) GDTPTR; + +typedef struct IDTPTR +{ + U16 IDTLen; + U64 IDTBass; +}__attribute__((packed)) IDTPTR; + +typedef struct X64TSS +{ + U32 Reserv0; + U64 RSP0; + U64 RSP1; + U64 RSP2; + U64 Reserv28; + U64 IST[7]; + U64 Reserv92; + U16 Reserv100; + U16 IOBase; +}__attribute__((packed)) X64TSS; + +typedef struct TSS +{ + X64TSS TSSArr[1]; +}TSS; + +typedef struct GDT +{ + SegmentDesc SegmentDescArr[GDTMAX]; +}__attribute__((packed)) GDT; + +typedef struct IDT +{ + GateDesc GateDescArr[IDTMAX]; +}__attribute__((packed)) IDT; + +typedef void (*IDTHandler)(); + + KLINE void HalOutU8(const U16 port, const U8 val) { @@ -334,5 +500,13 @@ KLINE void HalWriteCR3(UInt val) public Addr HalVAddrToPAddr(Addr kvaddr); public Addr HalPAddrToVAddr(Addr kpaddr); +private Bool SetOneGateDesc(GateDesc* gate, U8 type, IDTHandler handler, U8 privilege); +private Bool SetOneSegmentDesc(SegmentDesc* desc, U32 base, U32 limit, U16 attribute); +private Bool SetOneX64TSSAttrInSegmentDesc(SegmentDesc* desc, U64 base, U32 limit, U16 attribute); +private void CPULoadGDT(GDTPTR* gdtptr); +private void CPULoadIDT(IDTPTR* idtptr); +private void CPULoadTr(U16 trindx); +private Bool CPUInitIDT(); +private Bool CPUInitGDT(); public Bool HalCPUInit(); #endif diff --git a/Include/HalInc/X86_64Inc/HalInterrupt.h b/Include/HalInc/X86_64Inc/HalInterrupt.h index e69de29..07d45ee 100644 --- a/Include/HalInc/X86_64Inc/HalInterrupt.h +++ b/Include/HalInc/X86_64Inc/HalInterrupt.h @@ -0,0 +1,64 @@ +/********************************************************** + hal层中断处理头文件halInterrupt.h +*********************************************************** + 彭东 +**********************************************************/ +#ifndef _HALINTERRUPTHEAD +#define _HALINTERRUPTHEAD + +void HalExCDivideError(); +void HalExCSingleStepException(); +void HalExCNMI(); +void HalExCBreakpointException(); +void HalExCOverflow(); +void HalExCBoundsCheck(); +void HalExCInvalOpcode(); +void HalExCCoprNotAvailable(); +void HalExCDoubleFault(); +void HalExCCoprSegOverrun(); +void HalExCInvalTSS(); +void HalExCSegmentNotPresent(); +void HalExCStackException(); +void HalExCGeneralProtection(); +void HalExCPageFault(); +void HalExCcoprError(); +void HalExCAlignmentCheck(); +void HalExCMachineCheck(); +void HalExCSimdFault(); +void HalExCGeneralFault(); +void HalExIHWINT00(); +void HalExIHWINT01(); +void HalExIHWINT02(); +void HalExIHWINT03(); +void HalExIHWINT04(); +void HalExIHWINT05(); +void HalExIHWINT06(); +void HalExIHWINT07(); +void HalExIHWINT08(); +void HalExIHWINT09(); +void HalExIHWINT10(); +void HalExIHWINT11(); +void HalExIHWINT12(); +void HalExIHWINT13(); +void HalExIHWINT14(); +void HalExIHWINT15(); +void HalExIHWINT16(); +void HalExIHWINT17(); +void HalExIHWINT18(); +void HalExIHWINT19(); +void HalExIHWINT20(); +void HalExIHWINT21(); +void HalExIHWINT22(); +void HalExIHWINT23(); +void HalExIApicSVR(); +void HalExIApicIPISchedul(); +void HalExIApicTimer(); +void HalExIApicThermal(); +void HalExIApicPerformonitor(); +void HalExIApicLint0(); +void HalExIApicLint1(); +void HalExIApicError(); +void HalExSAPICall(); +void HalASMRetFromUserMode(); + +#endif \ No newline at end of file From 4e5d748e2220459c5e9493e4de05ccb44be7d989 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 9 Sep 2021 17:23:44 +0800 Subject: [PATCH 022/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3CPUInitIDT()=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalCPU.c | 40 ++++++++++++------------- Include/HalInc/X86_64Inc/HalInterrupt.h | 6 ++-- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/Hal/X86_64/HalCPU.c b/Hal/X86_64/HalCPU.c index 6b96bad..59054e2 100644 --- a/Hal/X86_64/HalCPU.c +++ b/Hal/X86_64/HalCPU.c @@ -128,46 +128,46 @@ private Bool CPUInitIDT() { for(UInt i = 0; i < IDTMAX; i++) { - SetOneGateDesc(&IDTable.GateDescArr[i], DA_386IGate, NULL, PRIVILEGE_KRNL) + SetOneGateDesc(&IDTable.GateDescArr[i], DA_386IGate, HalExCOSDefaultFaultHandle, PRIVILEGE_KRNL) } - SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_DIVIDE, DA_386IGate, exc_divide_error, PRIVILEGE_KRNL); + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_DIVIDE, DA_386IGate, HalExCDivideError, PRIVILEGE_KRNL); - SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_DEBUG, DA_386IGate, exc_single_step_exception, PRIVILEGE_KRNL); + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_DEBUG, DA_386IGate, HalExCSingleStepException, PRIVILEGE_KRNL); - SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_NMI, DA_386IGate, exc_nmi, PRIVILEGE_KRNL); + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_NMI, DA_386IGate, HalExCNMI, PRIVILEGE_KRNL); - SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_BREAKPOINT, DA_386IGate, exc_breakpoint_exception, PRIVILEGE_USER); + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_BREAKPOINT, DA_386IGate, HalExCBreakpointException, PRIVILEGE_USER); - SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_OVERFLOW, DA_386IGate, exc_overflow, PRIVILEGE_USER); + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_OVERFLOW, DA_386IGate, HalExCOverflow, PRIVILEGE_USER); - SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_BOUNDS, DA_386IGate, exc_bounds_check, PRIVILEGE_KRNL); + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_BOUNDS, DA_386IGate, HalExCBoundsCheck, PRIVILEGE_KRNL); - SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_INVAL_OP, DA_386IGate, exc_inval_opcode, PRIVILEGE_KRNL); + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_INVAL_OP, DA_386IGate, HalExCInvalOPCode, PRIVILEGE_KRNL); - SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_COPROC_NOT, DA_386IGate, exc_copr_not_available, PRIVILEGE_KRNL); + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_COPROC_NOT, DA_386IGate, HalExCCoprNotAvailable, PRIVILEGE_KRNL); - SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_DOUBLE_FAULT, DA_386IGate, exc_double_fault, PRIVILEGE_KRNL); + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_DOUBLE_FAULT, DA_386IGate, HalExCDoubleFault, PRIVILEGE_KRNL); - SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_COPROC_SEG, DA_386IGate, exc_copr_seg_overrun, PRIVILEGE_KRNL); + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_COPROC_SEG, DA_386IGate, HalExCCoprSegOverrun, PRIVILEGE_KRNL); - SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_INVAL_TSS, DA_386IGate, exc_inval_tss, PRIVILEGE_KRNL); + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_INVAL_TSS, DA_386IGate, HalExCInvalTSS, PRIVILEGE_KRNL); - SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_SEG_NOT, DA_386IGate, exc_segment_not_present, PRIVILEGE_KRNL); + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_SEG_NOT, DA_386IGate, HalExCSegmentNotPresent, PRIVILEGE_KRNL); - SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_STACK_FAULT, DA_386IGate, exc_stack_exception, PRIVILEGE_KRNL); + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_STACK_FAULT, DA_386IGate, HalExCStackException, PRIVILEGE_KRNL); - SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_PROTECTION, DA_386IGate, exc_general_protection, PRIVILEGE_KRNL); + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_PROTECTION, DA_386IGate, HalExCGeneralProtection, PRIVILEGE_KRNL); - SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_PAGE_FAULT, DA_386IGate, exc_page_fault, PRIVILEGE_KRNL); + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_PAGE_FAULT, DA_386IGate, HalExCPageFault, PRIVILEGE_KRNL); - SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_COPROC_ERR, DA_386IGate, exc_copr_error, PRIVILEGE_KRNL); + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_COPROC_ERR, DA_386IGate, HalExCCoprError, PRIVILEGE_KRNL); - SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_ALIGN_CHEK, DA_386IGate, exc_alignment_check, PRIVILEGE_KRNL); + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_ALIGN_CHEK, DA_386IGate, HalExCAlignmentCheck, PRIVILEGE_KRNL); - SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_MACHI_CHEK, DA_386IGate, exc_machine_check, PRIVILEGE_KRNL); + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_MACHI_CHEK, DA_386IGate, HalExCMachineCheck, PRIVILEGE_KRNL); - SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_SIMD_FAULT, DA_386IGate, exc_simd_fault, PRIVILEGE_KRNL); + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_SIMD_FAULT, DA_386IGate, HalExCSimdFault, PRIVILEGE_KRNL); SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_IRQ0 + 0], DA_386IGate, HalExIHWINT00, PRIVILEGE_KRNL); diff --git a/Include/HalInc/X86_64Inc/HalInterrupt.h b/Include/HalInc/X86_64Inc/HalInterrupt.h index 07d45ee..421c581 100644 --- a/Include/HalInc/X86_64Inc/HalInterrupt.h +++ b/Include/HalInc/X86_64Inc/HalInterrupt.h @@ -12,7 +12,7 @@ void HalExCNMI(); void HalExCBreakpointException(); void HalExCOverflow(); void HalExCBoundsCheck(); -void HalExCInvalOpcode(); +void HalExCInvalOPCode(); void HalExCCoprNotAvailable(); void HalExCDoubleFault(); void HalExCCoprSegOverrun(); @@ -21,11 +21,11 @@ void HalExCSegmentNotPresent(); void HalExCStackException(); void HalExCGeneralProtection(); void HalExCPageFault(); -void HalExCcoprError(); +void HalExCCoprError(); void HalExCAlignmentCheck(); void HalExCMachineCheck(); void HalExCSimdFault(); -void HalExCGeneralFault(); +void HalExCOSDefaultFaultHandle(); void HalExIHWINT00(); void HalExIHWINT01(); void HalExIHWINT02(); From 2e4117c6ed4eef59a829acffb8e9b1411e00aa3b Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 9 Sep 2021 18:03:24 +0800 Subject: [PATCH 023/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3CPULoadTr()=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalCPU.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Hal/X86_64/HalCPU.c b/Hal/X86_64/HalCPU.c index 59054e2..8ceae8d 100644 --- a/Hal/X86_64/HalCPU.c +++ b/Hal/X86_64/HalCPU.c @@ -121,6 +121,7 @@ private void CPULoadTr(U16 trindx) : : "r"(trindx) : "memory"); + return; } From 56b57876a4897c670b3700e8e279212ebce42188 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 9 Sep 2021 22:45:44 +0800 Subject: [PATCH 024/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3HalExCBreakPointExcep?= =?UTF-8?q?tion()=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalCPU.c | 2 +- Include/HalInc/X86_64Inc/HalInterrupt.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Hal/X86_64/HalCPU.c b/Hal/X86_64/HalCPU.c index 8ceae8d..45ee62c 100644 --- a/Hal/X86_64/HalCPU.c +++ b/Hal/X86_64/HalCPU.c @@ -138,7 +138,7 @@ private Bool CPUInitIDT() SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_NMI, DA_386IGate, HalExCNMI, PRIVILEGE_KRNL); - SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_BREAKPOINT, DA_386IGate, HalExCBreakpointException, PRIVILEGE_USER); + SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_BREAKPOINT, DA_386IGate, HalExCBreakPointException, PRIVILEGE_USER); SetOneGateDesc(&IDTable.GateDescArr[INT_VECTOR_OVERFLOW, DA_386IGate, HalExCOverflow, PRIVILEGE_USER); diff --git a/Include/HalInc/X86_64Inc/HalInterrupt.h b/Include/HalInc/X86_64Inc/HalInterrupt.h index 421c581..c2c40c5 100644 --- a/Include/HalInc/X86_64Inc/HalInterrupt.h +++ b/Include/HalInc/X86_64Inc/HalInterrupt.h @@ -9,7 +9,7 @@ void HalExCDivideError(); void HalExCSingleStepException(); void HalExCNMI(); -void HalExCBreakpointException(); +void HalExCBreakPointException(); void HalExCOverflow(); void HalExCBoundsCheck(); void HalExCInvalOPCode(); From a57f93ae88451cd3efc2ef9a515da524e1b4f8e2 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 9 Sep 2021 22:47:30 +0800 Subject: [PATCH 025/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0CPU=E7=9A=84=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E4=B8=AD=E6=96=AD=E5=85=A5=E5=8F=A3=E7=82=B9=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalEIIntoPoint.asm | 181 +++++++++++++ Include/HalInc/X86_64Inc/HalEIIntoPoint.h | 308 ++++++++++++++++++++++ 2 files changed, 489 insertions(+) create mode 100644 Hal/X86_64/HalEIIntoPoint.asm create mode 100644 Include/HalInc/X86_64Inc/HalEIIntoPoint.h diff --git a/Hal/X86_64/HalEIIntoPoint.asm b/Hal/X86_64/HalEIIntoPoint.asm new file mode 100644 index 0000000..f9a5451 --- /dev/null +++ b/Hal/X86_64/HalEIIntoPoint.asm @@ -0,0 +1,181 @@ +;***************************************************************************** +;* 底层核心文件Kernel.asm * +;* 彭东 +;***************************************************************************** + +%include "HalEIIntoPoint.h" +[section .hwint.text] +[BITS 64] + +ALIGN 16 +HalExCDivideError: + SRFTFAULT 0 +ALIGN 16 +HalExCSingleStepException: + SRFTFAULT 1 +ALIGN 16 +HalExCnmi: + SRFTFAULT 2 +ALIGN 16 +HalExCBreakPointException: + SRFTFAULT 3 +ALIGN 16 +HalExCOverflow: + SRFTFAULT 4 +ALIGN 16 +HalExCBoundsCheck: + SRFTFAULT 5 +ALIGN 16 +HalExCInvalOPCode: + SRFTFAULT 6 +ALIGN 16 +HalExCCoprNotAvailable: + SRFTFAULT 7 +ALIGN 16 +HalExCDoubleFault: + SRFTFAULT_ECODE 8 +ALIGN 16 +HalExCCoprSegOverrun: + SRFTFAULT 9 +ALIGN 16 +HalExCInvalTSS: + SRFTFAULT_ECODE 10 +ALIGN 16 +HalExCSegmentNotPresent: + SRFTFAULT_ECODE 11 +ALIGN 16 +HalExCStackException: + SRFTFAULT_ECODE 12 +ALIGN 16 +HalExCGeneralProtection: + SRFTFAULT_ECODE 13 +ALIGN 16 +HalExCPageFault: + SRFTFAULT_ECODE 14 +ALIGN 16 +HalExCCoprError: + SRFTFAULT 16 +ALIGN 16 +HalExCAlignmentCheck: + SRFTFAULT_ECODE 17 +ALIGN 16 +HalExCMachineCheck: + SRFTFAULT 18 +ALIGN 16 +HalExCSimdFault: + SRFTFAULT 19 +ALIGN 16 +HalExCOSDefaultFaultHandle: + SRFTFAULT 256 + + +ALIGN 16 +HalExIHWINT00: + HARWINT (INT_VECTOR_IRQ0+0) +ALIGN 16 +HalExIHWINT01: + HARWINT (INT_VECTOR_IRQ0+1) +ALIGN 16 +HalExIHWINT02: + HARWINT (INT_VECTOR_IRQ0+2) +ALIGN 16 +HalExIHWINT03: + HARWINT (INT_VECTOR_IRQ0+3) +ALIGN 16 +HalExIHWINT04: + HARWINT (INT_VECTOR_IRQ0+4) +ALIGN 16 +HalExIHWINT05: + HARWINT (INT_VECTOR_IRQ0+5) +ALIGN 16 +HalExIHWINT06: + HARWINT (INT_VECTOR_IRQ0+6) +ALIGN 16 +HalExIHWINT07: + HARWINT (INT_VECTOR_IRQ0+7) +ALIGN 16 +HalExIHWINT08: + HARWINT (INT_VECTOR_IRQ0+8) +ALIGN 16 +HalExIHWINT09: + HARWINT (INT_VECTOR_IRQ0+9) +ALIGN 16 +HalExIHWINT10: + HARWINT (INT_VECTOR_IRQ0+10) +ALIGN 16 +HalExIHWINT11: + HARWINT (INT_VECTOR_IRQ0+11) +ALIGN 16 +HalExIHWINT12: + HARWINT (INT_VECTOR_IRQ0+12) + +ALIGN 16 +HalExIHWINT13: + HARWINT (INT_VECTOR_IRQ0+13) +ALIGN 16 +HalExIHWINT14: + HARWINT (INT_VECTOR_IRQ0+14) +ALIGN 16 +HalExIHWINT15: + HARWINT (INT_VECTOR_IRQ0+15) +ALIGN 16 +HalExIHWINT16: + HARWINT (INT_VECTOR_IRQ0+16) +ALIGN 16 +HalExIHWINT17: + HARWINT (INT_VECTOR_IRQ0+17) + +ALIGN 16 +HalExIHWINT18: + HARWINT (INT_VECTOR_IRQ0+18) + +ALIGN 16 +HalExIHWINT19: + HARWINT (INT_VECTOR_IRQ0+19) + +ALIGN 16 +HalExIHWINT20: + HARWINT (INT_VECTOR_IRQ0+20) + +ALIGN 16 +HalExIHWINT21: + HARWINT (INT_VECTOR_IRQ0+21) + +ALIGN 16 +HalExIHWINT22: + HARWINT (INT_VECTOR_IRQ0+22) +ALIGN 16 +HalExIHWINT23: + HARWINT (INT_VECTOR_IRQ0+23) + +ALIGN 16 +HalExIApicIPISchedul: + HARWINT INT_VECTOR_APIC_IPI_SCHEDUL +ALIGN 16 +HalExIApicSVR: + HARWINT INT_VECTOR_APIC_SVR +ALIGN 16 +HalExIApicTimer: + HARWINT INT_VECTOR_APIC_TIMER +ALIGN 16 +HalExIApicThermal: + HARWINT INT_VECTOR_APIC_THERMAL +ALIGN 16 +HalExIApicPerformonitor: + HARWINT INT_VECTOR_APIC_PERFORM +ALIGN 16 +HalExIApicLint0: + HARWINT INT_VECTOR_APIC_LINTO +ALIGN 16 +HalExIApicLint1: + HARWINT INT_VECTOR_APIC_LINTI +ALIGN 16 +HalExIApicError: + HARWINT INT_VECTOR_APIC_ERROR + +ALIGN 16 +HalExSAPICall: + EXI_SCALL +ALIGN 16 +HalASMRetFromUserMode: + RESTOREALL diff --git a/Include/HalInc/X86_64Inc/HalEIIntoPoint.h b/Include/HalInc/X86_64Inc/HalEIIntoPoint.h new file mode 100644 index 0000000..11e9d19 --- /dev/null +++ b/Include/HalInc/X86_64Inc/HalEIIntoPoint.h @@ -0,0 +1,308 @@ +extern syscalls_table +extern hal_hwint_allocator +extern hal_fault_allocator +extern hal_syscl_allocator + +global HalExCDivideError +global HalExCSingleStepException +global HalExCNMI +global HalExCBreakPointException +global HalExCOverflow +global HalExCBoundsCheck +global HalExCInvalOPCode +global HalExCCoprNotAvailable +global HalExCDoubleFault +global HalExCCoprSegOverrun +global HalExCInvalTSS +global HalExCSegmentNotPresent +global HalExCStackException +global HalExCGeneralProtection +global HalExCPageFault +global HalExCCoprError +global HalExCAlignmentCheck +global HalExCMachineCheck +global HalExCSimdFault +global HalExCOSDefaultFaultHandle +global HalExIHWINT00 +global HalExIHWINT01 +global HalExIHWINT02 +global HalExIHWINT03 +global HalExIHWINT04 +global HalExIHWINT05 +global HalExIHWINT06 +global HalExIHWINT07 +global HalExIHWINT08 +global HalExIHWINT09 +global HalExIHWINT10 +global HalExIHWINT11 +global HalExIHWINT12 +global HalExIHWINT13 +global HalExIHWINT14 +global HalExIHWINT15 +global HalExIHWINT16 +global HalExIHWINT17 +global HalExIHWINT18 +global HalExIHWINT19 +global HalExIHWINT20 +global HalExIHWINT21 +global HalExIHWINT22 +global HalExIHWINT23 +global HalExIApicSVR +global HalExIApicIPISchedul +global HalExIApicTimer +global HalExIApicThermal +global HalExIApicPerformonitor +global HalExIApicLint0 +global HalExIApicLint1 +global HalExIApicError +global HalExSAPICall +global HalASMRetFromUserMode +%define INT_VECTOR_IRQ0 0x20 +%define INT_VECTOR_IRQ8 0x28 +%define INT_VECTOR_APIC_IPI_SCHEDUL 0xe0 +%define INT_VECTOR_APIC_SVR 0xef +%define INT_VECTOR_APIC_TIMER 0xf0 +%define INT_VECTOR_APIC_THERMAL 0xf1 +%define INT_VECTOR_APIC_PERFORM 0xf2 +%define INT_VECTOR_APIC_LINTO 0xf3 +%define INT_VECTOR_APIC_LINTI 0xf4 +%define INT_VECTOR_APIC_ERROR 0xf5 + +%define _KERNEL_DS 0x10 +%define _NOERRO_CODE 0xffffffffffffffff + + +%macro SAVEALL 0 + + push rax + push rbx + push rcx + push rdx + push rbp + push rsi + push rdi + + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + + xor r14,r14 + + mov r14w,ds + push r14 + mov r14w,es + push r14 + mov r14w,fs + push r14 + mov r14w,gs + push r14 +%endmacro + +%macro RESTOREALL 0 + pop r14 + mov gs,r14w + pop r14 + mov fs,r14w + pop r14 + mov es,r14w + pop r14 + mov ds,r14w + + + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + + pop rdi + pop rsi + pop rbp + pop rdx + pop rcx + pop rbx + pop rax + + iretq +%endmacro + +%macro SAVEALLFAULT 0 + push rax + push rbx + push rcx + push rdx + push rbp + push rsi + push rdi + + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + xor r14,r14 + mov r14w,ds + push r14 + mov r14w,es + push r14 + mov r14w,fs + push r14 + mov r14w,gs + push r14 + +%endmacro + +%macro RESTOREALLFAULT 0 + + pop r14 + mov gs,r14w + pop r14 + mov fs,r14w + pop r14 + mov es,r14w + pop r14 + mov ds,r14w + + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + + pop rdi + pop rsi + pop rbp + pop rdx + pop rcx + pop rbx + pop rax + + add rsp,8 + iretq +%endmacro + +%macro SRFTFAULT 1 + push _NOERRO_CODE + SAVEALLFAULT + mov r14w,0x10 + mov ds,r14w + mov es,r14w + mov fs,r14w + mov gs,r14w + + mov rdi,%1 ;rdi, rsi + mov rsi,rsp + call hal_fault_allocator + RESTOREALLFAULT +%endmacro + +%macro SRFTFAULT_ECODE 1 + SAVEALLFAULT + mov r14w,0x10 + mov ds,r14w + mov es,r14w + mov fs,r14w + mov gs,r14w + + mov rdi,%1 + mov rsi,rsp + call hal_fault_allocator + RESTOREALLFAULT +%endmacro + + +%macro HARWINT 1 + SAVEALL + + mov r14w,0x10 + mov ds,r14w + mov es,r14w + mov fs,r14w + mov gs,r14w + + mov rdi, %1 + mov rsi,rsp + call hal_hwint_allocator + + RESTOREALL +%endmacro + + + +%macro EXI_SCALL 0 + + push rbx + push rcx + push rdx + push rbp + push rsi + push rdi + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + + xor r14,r14 + + mov r14w,ds + push r14 + mov r14w,es + push r14 + mov r14w,fs + push r14 + mov r14w,gs + push r14 + + mov r14w,0x10 + mov ds,r14w + mov es,r14w + mov fs,r14w + mov gs,r14w + + mov rdi, rax + mov rsi, rsp + call hal_syscl_allocator + + pop r14 + mov gs,r14w + pop r14 + mov fs,r14w + pop r14 + mov es,r14w + pop r14 + mov ds,r14w + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + + pop rdi + pop rsi + pop rbp + pop rdx + pop rcx + pop rbx + iretq +%endmacro From 8c70eebc850e21b24eec0a9b9dc7b9fe3bf35651 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 9 Sep 2021 22:55:48 +0800 Subject: [PATCH 026/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3EXSAPICALL=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalEIIntoPoint.asm | 2 +- Include/HalInc/X86_64Inc/HalEIIntoPoint.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Hal/X86_64/HalEIIntoPoint.asm b/Hal/X86_64/HalEIIntoPoint.asm index f9a5451..4c9d45b 100644 --- a/Hal/X86_64/HalEIIntoPoint.asm +++ b/Hal/X86_64/HalEIIntoPoint.asm @@ -175,7 +175,7 @@ HalExIApicError: ALIGN 16 HalExSAPICall: - EXI_SCALL + EXSAPICALL ALIGN 16 HalASMRetFromUserMode: RESTOREALL diff --git a/Include/HalInc/X86_64Inc/HalEIIntoPoint.h b/Include/HalInc/X86_64Inc/HalEIIntoPoint.h index 11e9d19..b72e828 100644 --- a/Include/HalInc/X86_64Inc/HalEIIntoPoint.h +++ b/Include/HalInc/X86_64Inc/HalEIIntoPoint.h @@ -243,7 +243,7 @@ global HalASMRetFromUserMode -%macro EXI_SCALL 0 +%macro EXSAPICALL 0 push rbx push rcx From 42f626c7f1f5310726376191d5bf3ffe4bf3916d Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 10 Sep 2021 15:07:16 +0800 Subject: [PATCH 027/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=AD=E6=96=AD?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E8=AF=B7=E6=B1=82=E6=9C=8D=E5=8A=A1=E6=8F=8F?= =?UTF-8?q?=E8=BF=B0=E7=AC=A6=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalBoot.c | 2 + Hal/X86_64/HalInterrupt.c | 74 +++++++++++++++++++++++++ Include/BaseInc/BaseType.h | 1 + Include/HalInc/X86_64Inc/HalInterrupt.h | 53 +++++++++++++++++- 4 files changed, 129 insertions(+), 1 deletion(-) diff --git a/Hal/X86_64/HalBoot.c b/Hal/X86_64/HalBoot.c index 2fb0a38..96d0f1a 100644 --- a/Hal/X86_64/HalBoot.c +++ b/Hal/X86_64/HalBoot.c @@ -9,6 +9,7 @@ #include "HalMMU.h" #include "HalCache.h" #include "HalIPC.h" +#include "HalInterrupt.h" #include "KrlInit.h" private Bool HalBootInit() @@ -16,6 +17,7 @@ private Bool HalBootInit() HalCPUInit(); HalMMUInit(); HalCacheInit(); + HalInterruptInit(); HalIPCInit(); return TRUE; } diff --git a/Hal/X86_64/HalInterrupt.c b/Hal/X86_64/HalInterrupt.c index 4906de2..6901ca0 100644 --- a/Hal/X86_64/HalInterrupt.c +++ b/Hal/X86_64/HalInterrupt.c @@ -5,3 +5,77 @@ **********************************************************/ #include "BaseType.h" #include "HalInterrupt.h" + +DefinedCPUInterData(IERSDT, IERSDTable); + +private Bool IERSDInit(IERSD* init, U32 flags, U32 status, UInt prity, UInt internr) +{ + if(NULL == init) + { + return FALSE; + } + HalSPinLockInit(&init->Lock); + init->Flags = flags; + init->Status = status; + init->Prity = prity; + init->InterNR = internr; + init->Deep = 0; + init->Count = 0; + ListInit(&init->IODLists); + init->IODNR = 0; + ListInit(&init->IODThreadLists); + init->IODThreadNR = 0; + init->OneIODThread = NULL; + init->RBTreeRoot = NULL; + init->MSGMPool = NULL; + init->Priv = NULL; + init->Ext = NULL; + return TRUE; +} + +private Bool IERSDTInit() +{ + for(UInt i = 0; i < IERSD_MAX; i++) + { + IERSDInit(&IERSDTable.IERSDArr[i], 0, 0, 0, 0); + } + return TRUE; +} + +private Bool IODInit(IOD* init, U32 flags, IERSD* parent, void* device, IODCallBack callbackfunc) +{ + if(NULL == init) + { + return; + } + ListInit(&init->Lists); + ListInit(&init->InDeviceLists); + init->Flags = flags; + init->Parent = parent; + init->Device = device; + init->Count = 0; + init->CallBackFunc = callbackfunc; + return TRUE; +} + + +public void HalInterDistributor(UInt internr, void* kistacktop) +{ + return; +} + +public void HalFaultDistributor(UInt faultnr, void* kfstacktop) +{ + return; +} + +public void HalOSAPIDistributor(UInt apinr, void* kistacktop) +{ + return; +} + +public Bool HalInterruptInit() +{ + IERSDTInit(); + return TRUE; +} \ No newline at end of file diff --git a/Include/BaseInc/BaseType.h b/Include/BaseInc/BaseType.h index 2784d89..b737ea2 100644 --- a/Include/BaseInc/BaseType.h +++ b/Include/BaseInc/BaseType.h @@ -35,6 +35,7 @@ typedef void* Buff; //大小类型 typedef unsigned long Size; +typedef SInt DrvStus; #define KLINE static inline #define public #define private static diff --git a/Include/HalInc/X86_64Inc/HalInterrupt.h b/Include/HalInc/X86_64Inc/HalInterrupt.h index c2c40c5..b02a5c0 100644 --- a/Include/HalInc/X86_64Inc/HalInterrupt.h +++ b/Include/HalInc/X86_64Inc/HalInterrupt.h @@ -6,6 +6,50 @@ #ifndef _HALINTERRUPTHEAD #define _HALINTERRUPTHEAD +#define IERSD_MAX (256) +#define DefinedCPUInterData(vartype,varname) __attribute__((section(".cpu.core.interrupt.data"))) vartype varname + +typedef DrvStus (*IODCallBack)(UInt inr, void* device, void* kistacktop); + +//Interrupt exception request service descriptor +typedef struct IERSD +{ + SPinLock lock; + U32 Flags; + U32 Status; + UInt Prity; //中断优先级 + UInt InterNR; //中断号 + UInt Deep; //中断嵌套深度 + U64 Count; //中断计数 + List IODLists; + UInt IODNR; + List IODThreadLists; //中断线程链表头 + UInt IODThreadNR; //中断线程个数 + void* OneIODThread; //只有一个中断线程时直接用指针 + void* RBTreeRoot; //如果中断线程太多则按优先级组成红黑树 + void* MSGMPool; //可能的中断消息池 + void* Priv; + void* Ext; +}IERSD; + +//Interrupt object descriptor +typedef struct IOD +{ + List Lists; + List InDeviceLists; + U32 Flags; + IERSD* Parent; + void* Device; + UInt Count; + IODCallBack CallBackFunc; +}IOD; + +typedef struct IERSDT +{ + IERSD IERSDArr[IERSD_MAX]; +}IERSDT; + + void HalExCDivideError(); void HalExCSingleStepException(); void HalExCNMI(); @@ -61,4 +105,11 @@ void HalExIApicError(); void HalExSAPICall(); void HalASMRetFromUserMode(); -#endif \ No newline at end of file +private Bool IERSDInit(IERSD* init, U32 flags, U32 status, UInt prity, UInt internr); +private Bool IERSDTInit(); +private Bool IODInit(IOD* init, U32 flags, IERSD* parent, void* device, IODCallBack callbackfunc); +public void HalInterDistributor(UInt internr, void* kistacktop); +public void HalFaultDistributor(UInt faultnr, void* kfstacktop); +public void HalOSAPIDistributor(UInt apinr, void* kistacktop); +public Bool HalInterruptInit(); +#endif From 81756ca16cb577b940ec3e66ab90865f88e74d36 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 10 Sep 2021 21:52:13 +0800 Subject: [PATCH 028/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E6=A0=B8?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=85=A5=E5=8F=A3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalInitEntry.asm | 107 ++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100755 Hal/X86_64/HalInitEntry.asm diff --git a/Hal/X86_64/HalInitEntry.asm b/Hal/X86_64/HalInitEntry.asm new file mode 100755 index 0000000..35724bb --- /dev/null +++ b/Hal/X86_64/HalInitEntry.asm @@ -0,0 +1,107 @@ +;***************************************************************************** +;* 内核初始化入口文件HalInitEntry.asm * +;* 彭东 * +;***************************************************************************** +%define MBSP_ADR 0x100000 +%define IA32_EFER 0C0000080H +%define MSR_IA32_MISC_ENABLE 0x000001a0 +%define PML4T_BADR 0x1000000 +%define KRLVIRADR 0xffff800000000000 +%define KINITSTACK_OFF 16 +global InitEntryStart +extern HalBootStart + +[section .start.text] +[BITS 32] +InitEntryStart: + cli + mov ax, 0x10 + mov ds, ax + mov es, ax + mov ss, ax + mov fs, ax + mov gs, ax + lgdt [EGDTPTR] +;开启 PAE + mov eax, cr4 + bts eax, 5 ; CR4.PAE = 1 + mov cr4, eax + mov eax, PML4T_BADR + mov cr3, eax +;开启SSE + mov eax, cr4 + bts eax, 9 ; CR4.OSFXSR = 1 + bts eax, 10 ; CR4.OSXMMEXCPT = 1 + mov cr4, eax +;开启 64bits long-mode + mov ecx, IA32_EFER + rdmsr + bts eax, 8 ; IA32_EFER.LME =1 + wrmsr + + mov ecx, MSR_IA32_MISC_ENABLE + rdmsr + btr eax, 6 ; L3Cache =1 + wrmsr + +;开启 PE 和 paging + mov eax, cr0 + bts eax, 0 ; CR0.PE =1 + bts eax, 31 + +;开启 CACHE + btr eax, 29 ;CR0.NW=0 + btr eax, 30 ;CR0.CD=0 CACHE + + mov cr0, eax ; IA32_EFER.LMA = 1 + jmp 08:Entry64 +[BITS 64] +Entry64: + mov ax, 0x10 + mov ds, ax + mov es, ax + mov ss, ax + mov fs, ax + mov gs, ax + xor rax, rax + xor rbx, rbx + xor rbp, rbp + xor rcx, rcx + xor rdx, rdx + xor rdi, rdi + xor rsi, rsi + xor r8, r8 + xor r9, r9 + xor r10, r10 + xor r11, r11 + xor r12, r12 + xor r13, r13 + xor r14, r14 + xor r15, r15 + mov rbx, MBSP_ADR + mov rax, KRLVIRADR + mov rcx, [rbx+KINITSTACK_OFF] + add rax, rcx + xor rcx, rcx + xor rbx, rbx + mov rsp, rax + push 0 + push 0x8 + mov rax, HalBootStart ;调用内核主函数 + push rax + dw 0xcb48 + jmp $ + + +[section .start.data] +[BITS 32] +EX64GDT: +ENULLX64DSC: dq 0 +EKRNLC64DSC: dq 0x0020980000000000 ; 64-bit 内核代码段 +EKRNLD64DSC: dq 0x0000920000000000 ; 64-bit 内核数据段 + +EUSERC64DSC: dq 0x0020f80000000000 ; 64-bit 用户代码段 +EUSERD64DSC: dq 0x0000f20000000000 ; 64-bit 用户数据段 +EGDTLEN equ $ - ENULLX64DSC ; GDT长度 +EGDTPTR: dw EGDTLEN - 1 ; GDT界限 + dq EX64GDT \ No newline at end of file From 218a4b9559600eedea43a16c4c2e13a190015be8 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 13 Sep 2021 09:57:51 +0800 Subject: [PATCH 029/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E6=A0=B8?= =?UTF-8?q?=E9=93=BE=E6=8E=A5=E8=84=9A=E6=9C=AC=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/OSLinker.S | 97 +++++++++++++++++++++++++++++ Include/HalInc/X86_64Inc/OSLinker.h | 14 +++++ 2 files changed, 111 insertions(+) create mode 100644 Hal/X86_64/OSLinker.S create mode 100644 Include/HalInc/X86_64Inc/OSLinker.h diff --git a/Hal/X86_64/OSLinker.S b/Hal/X86_64/OSLinker.S new file mode 100644 index 0000000..030f830 --- /dev/null +++ b/Hal/X86_64/OSLinker.S @@ -0,0 +1,97 @@ +/****************************************************************** +* ld自动化链接脚本文件OSLinker.S * +* 彭东 * +******************************************************************/ + +#include "OSLinker.h" +OUTPUT_ARCH(OSONARCH) +OUTPUT_FORMAT(OSONFORMAT) +ENTRY(OSSTARTPOINT) + +SECTIONS +{ + + . = LINEAR_ADDRESS; + StartKernel = . + VIRTUAL_ADDRESS; + BeginStartText = .; + .start.text : ALIGN(4) { *(.start.text) } + EndStartText = .; + + BeginStartData = .; + .start.data : ALIGN(0x4) { *(.start.data) } + EndStartData = .; + + . +=VIRTUAL_ADDRESS; + BeginEntry64Text = .; + .entry64.text ALIGN(4) : AT(ADDR(.entry64.text)-VIRTUAL_ADDRESS){ *(.entry64.text) } + EndEntry64Text = .; + + BeginCPUCoreArchData = .; + .cpu.core.arch.data ALIGN(4) : AT(ADDR(.cpu.core.arch.data)-VIRTUAL_ADDRESS){ *(.cpu.core.arch.data) } + EndCPUCoreArchData = .; + + BeginCPUCoreInterruptData = .; + .cpu.core.interrupt.data ALIGN(4) : AT(ADDR(.cpu.core.interrupt.data)-VIRTUAL_ADDRESS){ *(.cpu.core.interrupt.data) } + EndCPUCoreInterruptData = .; + + BeginHWINTText = .; + .hwint.text ALIGN(4) : AT(ADDR(.hwint.text)-VIRTUAL_ADDRESS){ *(.hwint.text) } + EndHWINTText = .; + + BeginEIRSText = .; + .eirs.text ALIGN(4) : AT(ADDR(.eirs.text)-VIRTUAL_ADDRESS) { *(.eirs.text) } + EndEIRSText = .; + + BeginSYSCallText = .; + .syscall.text ALIGN(4) : AT(ADDR(.syscall.text)-VIRTUAL_ADDRESS) {*(.syscall.text) } + EndSYSCallText = .; + + BeginSchedText = .; + .sched.text ALIGN(4) : AT(ADDR(.sched.text)-VIRTUAL_ADDRESS) { *(.sched.text) } + EndSchedText = .; + + BeginFsText = .; + .fs.text ALIGN(4) : AT(ADDR(.fs.text)-VIRTUAL_ADDRESS) { *(.fs.text) } + EndFsText = .; + + BeginDriverText = .; + .driver.text ALIGN(4) : AT(ADDR(.driver.text)-VIRTUAL_ADDRESS) { *(.driver.text)} + EndDriverText = .; + + BeginText = .; + .text ALIGN(4) : AT(ADDR(.text)-VIRTUAL_ADDRESS) { *(.text) } + EndText = .; + + BeginSPinLockText = .; + .spinlock.text ALIGN(4) : AT(ADDR(.spinlock.text)-VIRTUAL_ADDRESS) { *(.spinlock.text) } + EndSPinLockText = .; + + BeginDriverEntryText = .; + .drventry.text ALIGN(4) : AT(ADDR(.drventry.text)-VIRTUAL_ADDRESS) { *(.drventry.text)} + EndDriverEntryText = .; + + BeginData = .; + .data ALIGN(4) : AT(ADDR(.data)-VIRTUAL_ADDRESS) { *(.data) *(.bss) } + EndData = .; + + BeginRoData = .; + .rodata ALIGN(4) : AT(ADDR(.rodata)-VIRTUAL_ADDRESS) { *(.rodata) *(.rodata.*) } + EndRRoData = .; + + BeginKStrTab = .; + .kstrtab ALIGN(4) : AT(ADDR(.kstrtab)-VIRTUAL_ADDRESS) { *(.kstrtab) } + EndKStrTab = .; + + BeginAPBootText = .; + .apboot.text ALIGN(4) : AT(ADDR(.apboot.text)-VIRTUAL_ADDRESS) { *(.apboot.text) } + EndAPBootText = .; + + BeginAPBootData = .; + .apboot.data ALIGN(4) : AT(ADDR(.apboot.data)-VIRTUAL_ADDRESS) { *(.apboot.data) } + EndAPBootData = .; + + BeginBss = .; + .bss ALIGN(4) : AT(ADDR(.bss)-VIRTUAL_ADDRESS) { *(.bss) } + EndBss = .; + EndKernel = .; +} \ No newline at end of file diff --git a/Include/HalInc/X86_64Inc/OSLinker.h b/Include/HalInc/X86_64Inc/OSLinker.h new file mode 100644 index 0000000..78bfbf6 --- /dev/null +++ b/Include/HalInc/X86_64Inc/OSLinker.h @@ -0,0 +1,14 @@ +/****************************************************************** +* ld自动化链接脚本头文件OSLinker.h * +* 彭东 * +******************************************************************/ +#ifndef _OSLINKERHEAD +#define _OSLINKERHEAD + +#define LINEAR_ADDRESS 0x2000000 +#define VIRTUAL_ADDRESS 0xffff800000000000 +#define OSONARCH i386:x86-64 +#define OSONFORMAT elf64-x86-64 +#define OSSTARTPOINT InitEntryStart + +#endif From f9c85f0cadcc2759f786478aec008e6046fc7e88 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 13 Sep 2021 16:20:32 +0800 Subject: [PATCH 030/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E6=A0=B8?= =?UTF-8?q?=E5=9B=BA=E4=BB=B6=E6=98=BE=E7=A4=BA=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalFirmware.c | 841 +++++++++++++++++++++++++ Include/HalInc/X86_64Inc/HalFirmware.h | 320 ++++++++++ 2 files changed, 1161 insertions(+) diff --git a/Hal/X86_64/HalFirmware.c b/Hal/X86_64/HalFirmware.c index e69de29..c0e6be5 100644 --- a/Hal/X86_64/HalFirmware.c +++ b/Hal/X86_64/HalFirmware.c @@ -0,0 +1,841 @@ +/********************************************************** + 固件文件HalFirmware.c +*********************************************************** + 彭东 +**********************************************************/ +#include "BaseType.h" +#include "HalFirmware.h" +#include "HalSync.h" +#include "HalCPU.h" + + + +const char* CosmosVersion = "Cosmos\n内核版本:00.01\n彭东 @ 构建于 "__DATE__ + " "__TIME__ + "\n"; + +private void DefGraphInit() +{ + DefGraph* kghp = &kdftgh; + machbstart_t* kmbsp = &kmachbsp; + HalMemset(kghp, 0, sizeof(DefGraph)); + SPinLockInit(&kghp->Lock); + kghp->Mode = kmbsp->mb_ghparm.mode; + kghp->X = kmbsp->mb_ghparm.X; + kghp->Y = kmbsp->mb_ghparm.Y; + kghp->FramPhyAddr = HalPAddrToVAddr((Addr)kmbsp->mb_ghparm.FramPhyAddr); + kghp->FvrmPhyAddr = HalPAddrToVAddr((Addr)kmbsp->mb_fvrmphyadr); + kghp->FvrmSZ = kmbsp->mb_fvrmsz; + kghp->OnePixBits = kmbsp->mb_ghparm.gh_onepixbits; + kghp->OnePixByte = kmbsp->mb_ghparm.gh_onepixbits / 8; + kghp->VBEModeNR = kmbsp->mb_ghparm.gh_vbemodenr; + kghp->Bank = kmbsp->mb_ghparm.Bank; + kghp->CurrDispBank = kmbsp->mb_ghparm.gh_curdipbnk; + kghp->NextBank = kmbsp->mb_ghparm.FvrmPhyAddr; + kghp->BankSZ = kmbsp->mb_ghparm.Banksz; + kghp->FontAddr = HalPAddrToVAddr((Addr)kmbsp->mb_bfontpadr); + kghp->FontSZ = kmbsp->mb_bfontsz; + kghp->FontHigh = 16; + kghp->LineSZ = 16 + 4; + kghp->DefFontPX = BGRA(0xff, 0xff, 0xff); + return; +} + +private Pixl SetDefFontPx(Pixl px) +{ + DefGraph* kghp = &kdftgh; + Pixl bkpx = kghp->DefFontPX; + kghp->DefFontPX = px; + return bkpx; +} + +private void SetNextCharsXY(U64 x, U64 y) +{ + DefGraph* kghp = &kdftgh; + kghp->NextCharsX = x; + kghp->NextCharsY = y; + return; +} + +private void SetCharsDXWFlush(U64 chardxw, U64 flush) +{ + kdftgh.CharDefXW = chardxw; + kdftgh.Flush = flush; + return; +} + +public void HalShowVersion() +{ + Pixl bkpx = SetDefFontPx(BGRA(0xff, 0, 0)); + KrlPrint(CosmosVersion); + KrlPrint("系统存在进程:%d个 系统空闲内存大小:%dMB\n", (UInt)osschedcls.scls_threadnr, (UInt)((memmgrob.mo_freepages << 12) >> 20)); + KrlPrint("系统处理器工作模式:%d位 系统物理内存大小:%dMB\n", (UInt)kmachbsp.mb_cpumode, (UInt)(kmachbsp.mb_memsz >> 20)); + SetDefFontPx(bkpx); + return; +} + +private void FillRect(Pixl pix, UInt x, UInt y, UInt tx, UInt ty) +{ + for (UInt i = y; i < y + ty; i++) + { + for (UInt j = x; j < x + tx; j++) + { + WritePixColor(&kdftgh, (U32)j, (U32)i, pix); + } + } + return; +} + +private void FillBitMAPFile(Char* bmfname) +{ + DefGraph* kghp = &kdftgh; + machbstart_t* kmbsp = &kmachbsp; + U64 fadr = 0, fsz = 0; + get_file_rvadrandsz(bmfname, kmbsp, &fadr, &fsz); + if (0 == fadr || 0 == fsz) + { + system_error("not bitmap file err\n"); + } + BMDBGR* bmdp; + U64 img = fadr + sizeof(BMFHead) + sizeof(BitMInfo); + bmdp = (BMDBGR* )((UInt)img); + Pixl pix; + int k = 0, l = 0; + for (int j = 768; j >= 0; j--, l++) + { + for (int i = 0; i < 1024; i++) + { + pix = BGRA(bmdp[k].bmd_r, bmdp[k].bmd_g, bmdp[k].bmd_b); + WritePixColor(kghp, i, j, pix); + k++; + } + } + FlushVideoRam(kghp); + return; +} + +private void SlouSreen(UInt hy) +{ + UInt x, y, ofx, ofy; + DefGraph* kghp = &kdftgh; + BGAGetXYOffset(kghp, &x, &y); + BGAGetVWH(kghp, &ofx, &ofy); + y += hy; + ofy += hy; + BGASetVWH(kghp, ofx, ofy); + BGASetXYOffset(kghp, x, y); + return; +} + +private void HalBackGround() +{ + DefGraph* kghp = &kdftgh; + machbstart_t* kmbsp = &kmachbsp; + U64 fadr = 0, fsz = 0; + get_file_rvadrandsz("desktop1.bmp", kmbsp, &fadr, &fsz); + if (0 == fadr || 0 == fsz) + { + system_error("Cosmos background fail"); + } + BMDBGR* bmdp; + U64 img = fadr + sizeof(BMFHead) + sizeof(BitMInfo); + bmdp = (BMDBGR*)((UInt)img); + Pixl pix; + int k = 0, l = 0; + for (int j = 768; j >= 0; j--, l++) + { + for (int i = 0; i < 1024; i++) + { + pix = BGRA(bmdp[k].bmd_r, bmdp[k].bmd_g, bmdp[k].bmd_b); + DRXWPixColor(kghp, i, j, pix); + k++; + } + } + HalShowVersion(); + return; +} + +public void HalLogo() +{ + DefGraph* kghp = &kdftgh; + machbstart_t* kmbsp = &kmachbsp; + U64 fadr = 0, fsz = 0; + get_file_rvadrandsz("logo.bmp", kmbsp, &fadr, &fsz); + if (0 == fadr || 0 == fsz) + { + system_error("logoerr"); + } + BMDBGR* bmdp; + U64 img = fadr + sizeof(BMFHead) + sizeof(BitMInfo); + bmdp = (BMDBGR* )((UInt)img); + Pixl pix; + int k = 0, l = 0; + for (int j = 617; j >= 153; j--, l++) + { + for (int i = 402; i < 622; i++) + { + pix = BGRA(bmdp[k].bmd_r, bmdp[k].bmd_g, bmdp[k].bmd_b); + DRXWPixColor(kghp, i, j, pix); + k++; + } + if (l > 205) + { + die(0x80); + } + } + return; +} + +public void BootVideoDeviceInit() +{ + DefGraph* kghp = &kdftgh; + + DefGraphInit(); + BGAInit(); + VBEInit(); + FillGraph(kghp, BGRA(0, 0, 0)); + SetCharsDXWFlush(0, 0); + HalBackGround(); + KrlLog(0, "图形显示初始化成功\n"); + // die(0x400); + return; +} + +private void BGAInit() +{ + DefGraph* kghp = &kdftgh; + if (kghp->gh_mode != BGAMODE) + { + return; + } + kghp->OpFunc.GOpRead = BGARead; + kghp->OpFunc.GOpWrite = BGAWrite; + kghp->OpFunc.GOpIoCtrl = BGAIoCtrl; + kghp->OpFunc.GOpFlush = BGAFlush; + kghp->OpFunc.GOpSetBank = BGASetBank; + kghp->OpFunc.GOpReadPix = BGAReadPix; + kghp->OpFunc.GOpWritePix = BGAWritePix; + kghp->OpFunc.GOpDXReadPix = BGADXReadPix; + kghp->OpFunc.GOpDXWritePix = BGADXWritePix; + kghp->OpFunc.GOpSetXY = BGASetXY; + kghp->OpFunc.GOpSetVWH = BGASetVWH; + kghp->OpFunc.GOpSetXYOffset = BGASetXYOffset; + kghp->OpFunc.GOpGetXY = BGAGetXY; + kghp->OpFunc.GOpGetVWH = BGAGetVWH; + kghp->OpFunc.GOpGetXYOffset = BGAGetXYOffset; + return; +} + +private void VBEInit() +{ + DefGraph* kghp = &kdftgh; + if (kghp->gh_mode != VBEMODE) + { + return; + } + kghp->OpFunc.GOpRead = VBERead; + kghp->OpFunc.GOpWrite = VBEWrite; + kghp->OpFunc.GOpIoCtrl = VBEIoCtrl; + kghp->OpFunc.GOpFlush = VBEFlush; + kghp->OpFunc.GOpSetBank = VBESetBank; + kghp->OpFunc.GOpReadpix = VBEReadPix; + kghp->OpFunc.GOpWritePix = VBEWritePix; + kghp->OpFunc.GOpDXReadPix = VBDXReadPix; + kghp->OpFunc.GOpDXWritePix = VBEDXWritePix; + kghp->OpFunc.GOpSetXY = VBESetXY; + kghp->OpFunc.GOpSetVWH = VBESetVWH; + kghp->OpFunc.GOpSetXYOffset = VBESetXYOffset; + kghp->OpFunc.GOpGetXY = VBEGetXY; + kghp->OpFunc.GOpGetVWH = VBEGetVWH; + kghp->OpFunc.GOpGetXYOffSet = VBEGetXYOffset; + return; +} + +private void FillGraph(DefGraph* kghp, Pixl pix) +{ + for (U64 y = 0; y < kghp->Y; y++) + { + for (U64 x = 0; x < kghp->X; x++) + { + WritePixColor(kghp, (U32)x, (U32)y, pix); + } + } + FlushVideoRam(kghp); + return; +} + +private void WritePixColor(DefGraph* kghp, U32 x, U32 y, Pixl pix) +{ + kghp->OpFunc.GOpWritePix(kghp, pix, x, y); + return; +} + +private void DRXWPixColor(DefGraph* kghp, U32 x, U32 y, Pixl pix) +{ + + kghp->OpFunc.GOpDXWritePix(kghp, pix, x, y); + return; +} + +private void FlushVideoRam(DefGraph* kghp) +{ + kghp->OpFunc.GOpFlush(kghp); + return; +} + +private U32 Utf8ToUnicode(UTF8* utf, int* retuib) +{ + U8 uhd = utf->UByte1, ubyt = 0; + U32 ucode = 0, tmpuc = 0; + if (0x80 > uhd) //0xbf&&uhd<=0xbf + { + ucode = utf->UByte1 & 0x7f; + *retuib = 1; + return ucode; + } + if (0xc0 <= uhd && uhd <= 0xdf) //0xdf + { + ubyt = utf->UByte1 & 0x1f; + tmpuc |= ubyt; + ubyt = utf->UByte2 & 0x3f; + ucode = (tmpuc << 6) | ubyt; + *retuib = 2; + return ucode; + } + if (0xe0 <= uhd && uhd <= 0xef) //0xef + { + ubyt = utf->UByte1 & 0x0f; + tmpuc |= ubyt; + ubyt = utf->UByte2 & 0x3f; + tmpuc <<= 6; + tmpuc |= ubyt; + ubyt = utf->UByte3 & 0x3f; + ucode = (tmpuc << 6) | ubyt; + *retuib = 3; + return ucode; + } + if (0xf0 <= uhd && uhd <= 0xf7) //0xf7 + { + ubyt = utf->UByte1 & 0x7; + tmpuc |= ubyt; + ubyt = utf->UByte2 & 0x3f; + tmpuc <<= 6; + tmpuc |= ubyt; + ubyt = utf->UByte3 & 0x3f; + tmpuc <<= 6; + tmpuc |= ubyt; + ubyt = utf->UByte4 & 0x3f; + ucode = (tmpuc << 6) | ubyt; + *retuib = 4; + return ucode; + } + if (0xf8 <= uhd && uhd <= 0xfb) //0xfb + { + ubyt = utf->UByte1 & 0x3; + tmpuc |= ubyt; + ubyt = utf->UByte2 & 0x3f; + tmpuc <<= 6; + tmpuc |= ubyt; + ubyt = utf->UByte3 & 0x3f; + tmpuc <<= 6; + tmpuc |= ubyt; + ubyt = utf->UByte4 & 0x3f; + tmpuc <<= 6; + tmpuc |= ubyt; + ubyt = utf->UByte5 & 0x3f; + ucode = (tmpuc << 6) | ubyt; + *retuib = 5; + return ucode; + } + if (0xfc <= uhd && uhd <= 0xfd) //0xfd + { + ubyt = utf->UByte1 & 0x1; + tmpuc |= ubyt; + ubyt = utf->UByte2 & 0x3f; + tmpuc <<= 6; + tmpuc |= ubyt; + ubyt = utf->UByte3 & 0x3f; + tmpuc <<= 6; + tmpuc |= ubyt; + ubyt = utf->UByte4 & 0x3f; + tmpuc <<= 6; + tmpuc |= ubyt; + ubyt = utf->UByte5 & 0x3f; + tmpuc <<= 6; + tmpuc |= ubyt; + ubyt = utf->UByte6 & 0x3f; + ucode = (tmpuc << 6) | ubyt; + *retuib = 6; + return ucode; + } + *retuib = 0; + return 0; +} + +private U8* GetCharsInfo(DefGraph* kghp, U32 unicode, int* retchwx, int* retchhx, int* retlinb) +{ + FontData* fntp = (FontData* )((UInt)kghp->FontAddr); + *retchwx = fntp[unicode].FontWidth; + *retchhx = fntp[unicode].FontHigh; + *retlinb = fntp[unicode].FontByteSZ; + + return (U8*)(&(fntp[unicode].FontCharMap[0])); +} + +public void PutPixOneChar(DefGraph* kghp, U32 unicode, Pixl pix) +{ + int y = 0, chwx = 0, chhx = 0, linb = 0; + U8* charyp = NULL; + if (unicode == 10) + { + kghp->NextCharsX = 0; + if ((kghp->NextCharsY + kghp->LineSZ) > (kghp->Y - kghp->FontHigh)) + { + kghp->NextCharsY = 0; + HalBackGround(); + goto ret; + } + kghp->NextCharsY += kghp->LineSZ; + goto ret; + } + charyp = GetCharsInfo(kghp, unicode, &chwx, &chhx, &linb); + if (charyp == NULL) + { + goto ret; + } + if ((kghp->NextCharsX + chwx) > (kghp->X - chwx)) + { + kghp->NextCharsX = 0; + if ((kghp->NextCharsY + kghp->LineSZ) > (kghp->Y - kghp->FontHigh)) + { + kghp->NextCharsY = 0; + } + else + { + kghp->NextCharsY += kghp->LineSZ; + } + } + U32 wpx = (U32)kghp->NextCharsX, wpy = (U32)kghp->NextCharsY; + + for (int hx = 0; hx < chhx; hx++) + { + for (int btyi = 0, x = 0; btyi < linb; btyi++) + { + U8 bitmap = charyp[hx * linb + btyi]; + if (bitmap == 0) + { + x += 8; + continue; + } + for (int bi = 7; bi >= 0; bi--) + { + if (x >= chwx) + { + break; + } + if (((bitmap >> bi) & 1) == 1) + { + WritePixColor(kghp, wpx + x, wpy + y, pix); + } + x++; + } + } + y++; + } + kghp->NextCharsX += (U64)chwx; + return; +} + +public void DRXPutPixOneChar(DefGraph* kghp, U32 unicode, Pixl pix) +{ + int y = 0, chwx = 0, chhx = 0, linb = 0; + U8* charyp = NULL; + if (unicode == 10) + { + kghp->NextCharsX = 0; + if ((kghp->NextCharsY + kghp->LineSZ) > (kghp->Y - kghp->FontHigh)) + { + kghp->NextCharsY = 0; + HalBackGround(); + goto ret; + } + kghp->NextCharsY += kghp->LineSZ; + goto ret; + } + charyp = GetCharsInfo(kghp, unicode, &chwx, &chhx, &linb); + if (charyp == NULL) + { + goto ret; + } + if ((kghp->NextCharsX + chwx) > (kghp->X - chwx)) + { + kghp->NextCharsX = 0; + if ((kghp->NextCharsY + kghp->LineSZ) > (kghp->Y - kghp->FontHigh)) + { + kghp->NextCharsY = 0; + } + else + { + kghp->NextCharsY += kghp->LineSZ; + } + } + U32 wpx = (U32)kghp->NextCharsX, wpy = (U32)kghp->NextCharsY; + + for (int hx = 0; hx < chhx; hx++) + { + for (int btyi = 0, x = 0; btyi < linb; btyi++) + { + U8 bitmap = charyp[hx * linb + btyi]; + if (bitmap == 0) + { + x += 8; + continue; + } + for (int bi = 7; bi >= 0; bi--) + { + if (x >= chwx) + { + break; + } + if (((bitmap >> bi) & 1) == 1) + { + DRXWPixColor(kghp, wpx + x, wpy + y, pix); + } + x++; + } + } + y++; + } + kghp->NextCharsX += (U64)chwx; + + return; +} + +public void StringWrite(DefGraph* kghp, Char* buf) +{ + int chinx = 0; + int chretnext = 0; + U32 uc = 0; + Pixl pix = kghp->DefFontPX; + while (buf[chinx] != 0) + { + uc = Utf8ToUnicode((UTF8* )(&buf[chinx]), &chretnext); + chinx += chretnext; + if (kghp->gh_chardxw == 1) + { + PutPixOneChar(kghp, uc, pix); + } + else + { + DRXPutPixOneChar(kghp, uc, pix); + } + } + if (kghp->gh_flush == 1) + { + FlushVideoRam(kghp); + } + return; +} + +private void BGAWriteReg(U16 index, U16 data) +{ + out_u16(VBE_DISPI_IOPORT_INDEX, index); + out_u16(VBE_DISPI_IOPORT_DATA, data); + return; +} + +private U16 BGAReadReg(U16 index) +{ + out_u16(VBE_DISPI_IOPORT_INDEX, index); + return in_u16(VBE_DISPI_IOPORT_DATA); +} + +private size_t BGARead(void* ghpdev, void* outp, size_t rdsz) +{ + //DefGraph* kghp=(DefGraph*)ghpdev; + return rdsz; +} + +private size_t BGAWrite(void* ghpdev, void* inp, size_t wesz) +{ + //DefGraph* kghp=(DefGraph*)ghpdev; + return wesz; +} + +private SInt BGAIoCtrl(void* ghpdev, void* outp, UInt iocode) +{ + return -1; +} + +private U64* GetVRamAddrInBank(void* ghpdev) +{ + DefGraph* kghp = (DefGraph* )ghpdev; + U64* d = (U64* )((UInt)(kghp->FramPhyAddr + (kghp->X * kghp->Y * kghp->FvrmPhyAddr * kghp->FvrmPhyAddr))); + + return d; +} + +private void BGADispNextBank(void* ghpdev) +{ + DefGraph* kghp = (DefGraph* )ghpdev; + U16 h = (U16)(kghp->Y * kghp->NextBank + 1); + U16 ofy = (U16)(kghp->Y * (kghp->FvrmPhyAddr)); + BGAWriteReg(VBE_DISPI_INDEX_VIRT_HEIGHT, h); + BGAWriteReg(VBE_DISPI_INDEX_Y_OFFSET, ofy); + kghp->gh_curdipbnk = kghp->FvrmPhyAddr; + kghp->FvrmPhyAddr++; + if (kghp->FvrmPhyAddr > kghp->Bank) + { + kghp->FvrmPhyAddr = 0; + } + return; +} + +private void BGAFlush(void* ghpdev) +{ + DefGraph* kghp = (DefGraph* )ghpdev; + + U64* s = (U64* )((UInt)kghp->FvrmPhyAddr); + U64* d = GetVRamAddrInBank(kghp); //(U64*)kghp->FramPhyAddr; + U64 i = 0, j = 0; + U64 e = kghp->X * kghp->Y * kghp->OnePixByte; + //U64 k=e/8; + for (; i < e; i += 8) + { + d[j] = s[j]; + j++; + } + BGADispNextBank(kghp); + return; +} + +private SInt BGASetBank(void* ghpdev, SInt bnr) +{ + return -1; +} + +private Pixl BGAReadPix(void* ghpdev, UInt x, UInt y) +{ + return 0; +} + +private void BGAWritePix(void* ghpdev, Pixl pix, UInt x, UInt y) +{ + DefGraph* kghp = (DefGraph* )ghpdev; + U8* p24bas; + if (kghp->gh_onepixbits == 24) + { + U64 p24adr = (x + (y * kghp->X)) * 3; + p24bas = (U8* )((UInt)(p24adr + kghp->FvrmPhyAddr)); + p24bas[0] = (U8)(pix); + p24bas[1] = (U8)(pix >> 8); + p24bas[2] = (U8)(pix >> 16); + return; + } + U32* phybas = (U32* )((UInt)kghp->FvrmPhyAddr); + phybas[x + (y * kghp->X)] = pix; + return; +} + +private Pixl BGADXReadPix(void* ghpdev, UInt x, UInt y) +{ + return 0; +} + +private void BGADXWritePix(void* ghpdev, Pixl pix, UInt x, UInt y) +{ + DefGraph* kghp = (DefGraph* )ghpdev; + U8* p24bas; + if (kghp->gh_onepixbits == 24) + { + U64 p24adr = (x + (y * kghp->X)) * 3 * kghp->gh_curdipbnk; + p24bas = (U8* )((UInt)(p24adr + kghp->FramPhyAddr)); + p24bas[0] = (U8)(pix); + p24bas[1] = (U8)(pix >> 8); + p24bas[2] = (U8)(pix >> 16); + return; + } + U32* phybas = (U32* )((UInt)(kghp->FramPhyAddr + (kghp->X * kghp->Y * kghp->FvrmPhyAddr * kghp->gh_curdipbnk))); + phybas[x + (y * kghp->X)] = pix; + return; +} + +private SInt BGASetXY(void* ghpdev, UInt x, UInt y) +{ + + BGAWriteReg(VBE_DISPI_INDEX_XRES, (U16)(x)); + BGAWriteReg(VBE_DISPI_INDEX_YRES, (U16)(y)); + + return 0; +} + +private SInt BGASetVWH(void* ghpdev, UInt vwt, UInt vhi) +{ + + BGAWriteReg(VBE_DISPI_INDEX_VIRT_WIDTH, (U16)vwt); + BGAWriteReg(VBE_DISPI_INDEX_VIRT_HEIGHT, (U16)vhi); + return 0; +} + +private SInt BGASetXYOffset(void* ghpdev, UInt xoff, UInt yoff) +{ + BGAWriteReg(VBE_DISPI_INDEX_X_OFFSET, (U16)(xoff)); + BGAWriteReg(VBE_DISPI_INDEX_Y_OFFSET, (U16)(yoff)); + return 0; +} + +private SInt BGAGetXY(void* ghpdev, UInt* rx, UInt* ry) +{ + if (rx == NULL || ry == NULL) + { + return -1; + } + U16 retx, rety; + retx = BGAReadReg(VBE_DISPI_INDEX_XRES); + rety = BGAReadReg(VBE_DISPI_INDEX_YRES); + *rx = (UInt)retx; + *ry = (UInt)rety; + return 0; +} + +private SInt BGAGetVWH(void* ghpdev, UInt* rvwt, UInt* rvhi) +{ + if (rvwt == NULL || rvhi == NULL) + { + return -1; + } + U16 retwt, rethi; + retwt = BGAReadReg(VBE_DISPI_INDEX_VIRT_WIDTH); + rethi = BGAReadReg(VBE_DISPI_INDEX_VIRT_HEIGHT); + *rvwt = (UInt)retwt; + *rvhi = (UInt)rethi; + return 0; +} + +private SInt BGAGetXYOffset(void* ghpdev, UInt* rxoff, UInt* ryoff) +{ + if (rxoff == NULL || ryoff == NULL) + { + return -1; + } + U16 retxoff, retyoff; + retxoff = BGAReadReg(VBE_DISPI_INDEX_X_OFFSET); + retyoff = BGAReadReg(VBE_DISPI_INDEX_Y_OFFSET); + *rxoff = (UInt)retxoff; + *ryoff = (UInt)retyoff; + return 0; +} + +private size_t VBERead(void* ghpdev, void* outp, size_t rdsz) +{ + return rdsz; +} + +private size_t VBEWrite(void* ghpdev, void* inp, size_t wesz) +{ + return wesz; +} + +private SInt VBEIoCtrl(void* ghpdev, void* outp, UInt iocode) +{ + return -1; +} + +private void VBEFlush(void* ghpdev) +{ + DefGraph* kghp = (DefGraph* )ghpdev; + + U64* s = (U64* )((UInt)kghp->FvrmPhyAddr); + U64* d = (U64* )((UInt)kghp->FramPhyAddr); + U64 i = 0, j = 0; + U64 e = kghp->X * kghp->Y * kghp->FvrmPhyAddr; + for (; i < e; i += 8) + { + d[j] = s[j]; + j++; + } + return; +} + +private SInt VBESetBank(void* ghpdev, SInt bnr) +{ + return -1; +} + +private Pixl VBEReadPix(void* ghpdev, UInt x, UInt y) +{ + return 0; +} + +private void VBEWritePix(void* ghpdev, Pixl pix, UInt x, UInt y) +{ + DefGraph* kghp = (DefGraph* )ghpdev; + U8* p24bas; + if (kghp->gh_onepixbits == 24) + { + U64 p24adr = (x + (y * kghp->X)) * 3; + p24bas = (U8* )((UInt)(p24adr + kghp->FvrmPhyAddr)); + p24bas[0] = (U8)(pix); + p24bas[1] = (U8)(pix >> 8); + p24bas[2] = (U8)(pix >> 16); + return; + } + U32* phybas = (U32* )((UInt)kghp->FvrmPhyAddr); + phybas[x + (y * kghp->X)] = pix; + return; +} + +private Pixl VBDXReadPix(void* ghpdev, UInt x, UInt y) +{ + + return 0; +} + +private void VBEDXWritePix(void* ghpdev, Pixl pix, UInt x, UInt y) +{ + DefGraph* kghp = (DefGraph* )ghpdev; + U8* p24bas; + if (kghp->gh_onepixbits == 24) + { + U64 p24adr = (x + (y* kghp->X))* 3; + p24bas = (U8* )((UInt)(p24adr + kghp->FramPhyAddr)); + p24bas[0] = (U8)(pix); + p24bas[1] = (U8)(pix >> 8); + p24bas[2] = (U8)(pix >> 16); + return; + } + U32* phybas = (U32* )((UInt)kghp->FramPhyAddr); + phybas[x + (y* kghp->X)] = pix; + return; +} + +private SInt VBESetXY(void* ghpdev, UInt x, UInt y) +{ + return -1; +} + +private SInt VBESetVWH(void* ghpdev, UInt vwt, UInt vhi) +{ + return -1; +} + +private SInt VBESetXYOffset(void* ghpdev, UInt xoff, UInt yoff) +{ + return -1; +} + +private SInt VBEGetXY(void* ghpdev, UInt* rx, UInt* ry) +{ + return -1; +} + +private SInt VBEGetVWH(void* ghpdev, UInt* rvwt, UInt* rvhi) +{ + return -1; +} + +private SInt VBEGetXYOffset(void* ghpdev, UInt* rxoff, UInt* ryoff) +{ + + return -1; +} diff --git a/Include/HalInc/X86_64Inc/HalFirmware.h b/Include/HalInc/X86_64Inc/HalFirmware.h index e69de29..585e82f 100644 --- a/Include/HalInc/X86_64Inc/HalFirmware.h +++ b/Include/HalInc/X86_64Inc/HalFirmware.h @@ -0,0 +1,320 @@ +/********************************************************** + 固件头文件HalFirmware.h +*********************************************************** + 彭东 +**********************************************************/ + +#ifndef _HALFIRMWAREHEAD +#define _HALFIRMWAREHEAD + +typedef struct VBEINFO +{ + char VBESignature[4]; + U16 VBEVersion; + U32 OEMStringPtr; + U32 Capabilities; + U32 VideoModePtr; + U16 TotalMemory; + U16 OEMSoftWareRev; + U32 OEMVendorNamePtr; + U32 OEMProductnamePtr; + U32 OEMProductRevPtr; + U8 Reserved[222]; + U8 OEMData[256]; +}__attribute__((packed)) VBEInfo; + +typedef struct VBEOMINFO +{ + U16 ModeAttributes; + U8 WinAAttributes; + U8 WinBAttributes; + U16 WinGranularity; + U16 WinSize; + U16 WinASegment; + U16 WinBSegment; + U32 WinFuncPtr; + U16 BytesPerScanLine; + U16 XResolution; + U16 YResolution; + U8 XCharSize; + U8 YCharSize; + U8 NumberOfPlanes; + U8 BitsPerPixel; + U8 NumberOfBanks; + U8 MemoryModel; + U8 BankSize; + U8 NumberOfImagePages; + U8 Reserved; + U8 RedMaskSize; + U8 RedFieldPosition; + U8 GreenMaskSize; + U8 GreenFieldPosition; + U8 BlueMaskSize; + U8 BlueFieldPosition; + U8 RsvdMaskSize; + U8 RsvdFieldPosition; + U8 DirectColorModeInfo; + U32 PhysBasePtr; + U32 Reserved1; + U16 Reserved2; + U16 LinBytesPerScanLine; + U8 BnkNumberOfImagePages; + U8 LinNumberOfImagePages; + U8 LinRedMaskSize; + U8 LinRedFieldPosition; + U8 LinGreenMaskSize; + U8 LinGreenFieldPosition; + U8 LinBlueMaskSize; + U8 LinBlueFieldPosition; + U8 LinRsvdMaskSize; + U8 LinRsvdFieldPosition; + U32 MaxPixelClock; + U8 Reserved3[189]; +}__attribute__((packed)) VBEOMInfo; + + +#define BGRA(r,g,b) ((0|(r<<16)|(g<<8)|b)) +typedef U32 Pixl; + +#define VBEMODE 1 +#define GPUMODE 2 +#define BGAMODE 3 +typedef struct GRAPH +{ + U32 Mode; + U32 X; + U32 y; + U32 FramPHYAddr; + U32 OnePixBits; + U32 VBEModeNR; + U32 VIFPHYAddr; + U32 VMIFPHYAdrr; + U32 Bank; + U32 CurrDispBank; + U32 NextBank; + U32 BankSZ; + U32 LogoPHYAddrStart; + U32 LogoPHYAddrEnd; + U32 FontAddr; + U32 FontSectAddr; + U32 FontSectNR; + U32 FontHigh; + U32 NextCharsX; + U32 NextCharsY; + U32 LineSZ; + vbeinfo_t vbeinfo; + vbeominfo_t vminfo; +}__attribute__((packed)) Graph; + +typedef struct BMFHEAD +{ + U16 BFTag; //0x4d42 + U32 BFSize; + U16 BFResd1; + U16 BFResd2; + U32 BFOff; +}__attribute__((packed)) BMFHead; + +typedef struct BITMINFO +{ + U32 BISize; + s32_t BIWidth; + s32_t BIHigh; + U16 BIPlanes; + U16 BIBCount; + U32 BIComp; + U32 BISZImg; + s32_t BIXPelsper; + s32_t BIYPelsper; + U32 BIClrUserd; + U32 BIClrImport; +}__attribute__((packed)) BitMInfo; + +typedef struct BMDBGR +{ + U8 Blue; + U8 Green; + U8 Red; +}__attribute__((packed)) BMDBGR; + +typedef struct UTF8 +{ + U8 UByte1; + U8 UByte2; + U8 UByte3; + U8 UByte4; + U8 UByte5; + U8 UByte6; +}__attribute__((packed)) UTF8; + +typedef struct FONTFHEAD +{ + U8 fh_mgic[4]; + U32 fh_fsize; + U8 fh_sectnr; + U8 fh_fhght; + U16 fh_wcpflg; + U16 fh_nchars; + U8 fh_rev[2]; +}__attribute__((packed)) FontFHead; + +typedef struct FTSECTIF +{ + U16 Fistuc; + U16 Lastuc; + U32 Off; +}__attribute__((packed)) FTSectIF; + +typedef struct UFTINDX +{ + U32 UICharOff:26; + U32 UICharWidth:6; +}__attribute__((packed)) UTFIndx; + +#define MAX_CHARBITBY 32 + +typedef struct FONTDATA +{ + U8 FontByteSZ; + U8 FontHigh; + U8 FontWidth; + U8 FontCharMap[MAX_CHARBITBY]; +}__attribute__((packed)) FontData; + +//typedef drvstus_t (*dftghp_ops_t)(void* ghpdevp,void* inp,void* outp,UInt x,UInt y,UInt iocode); + +typedef struct GRAPHOPS +{ + Size (*GOpRead)(void* dev,void* out,Size rdsz); + Size (*GOpWrite)(void* dev,void* in,Size wesz); + SInt (*GOpIoCtrl)(void* dev,void* out,UInt iocode); + void (*GOpFlush)(void* dev); + SInt (*GOpSetBank)(void* dev, SInt bnr); + Pixl (*GOpReadpix)(void* dev,UInt x,UInt y); + void (*GOpWritePix)(void* dev,Pixl pix,UInt x,UInt y); + Pixl (*GOpDXReadPix)(void* dev,UInt x,UInt y); + void (*GOpDXWritePix)(void* dev,Pixl pix,UInt x,UInt y); + SInt (*GOpSetXY)(void* dev,UInt x,UInt y); + SInt (*GOpSetVWH)(void* dev,UInt vwt,UInt vhi); + SInt (*GOpSetXYOffset)(void* dev,UInt xoff,UInt yoff); + SInt (*GOpGetXY)(void* dev,UInt* rx,UInt* ry); + SInt (*GOpGetVWH)(void* dev,UInt* rvwt,UInt* rvhi); + SInt (*GOpGetXYOffset)(void* dev,UInt* rxoff,UInt* ryoff); +}GraphOPS; + +typedef struct DEFGRAPH +{ + SPinLock Lock; + U64 Mode; + U64 X; + U64 Y; + U64 FramPhyAddr; + U64 FvrmPhyAddr; + U64 FvrmSZ; + U64 OnePixBits; + U64 OnePixByte; + U64 VBEModeNR; + U64 Bank; + U64 CurrDispBank; + U64 NextBank; + U64 BankSZ; + U64 FontAddr; + U64 FontSZ; + U64 FontHigh; + U64 NextCharsX; + U64 NextCharsY; + U64 LineSZ; + Pixl DefFontPX; + U64 CharDefXW; + U64 Flush; + U64 FramNR; + U64 FSHData; + GraphOPS OpFunc; +}DefGraph; + +#define VBE_DISPI_IOPORT_INDEX (0x01CE) +#define VBE_DISPI_IOPORT_DATA (0x01CF) +#define VBE_DISPI_INDEX_ID (0) +#define VBE_DISPI_INDEX_XRES (1) +#define VBE_DISPI_INDEX_YRES (2) +#define VBE_DISPI_INDEX_BPP (3) +#define VBE_DISPI_INDEX_ENABLE (4) +#define VBE_DISPI_INDEX_BANK (5) +#define VBE_DISPI_INDEX_VIRT_WIDTH (6) +#define VBE_DISPI_INDEX_VIRT_HEIGHT (7) +#define VBE_DISPI_INDEX_X_OFFSET (8) +#define VBE_DISPI_INDEX_Y_OFFSET (9) +#define BGA_DEV_ID0 (0xB0C0) //- setting X and Y resolution and bit depth (8 BPP only), banked mode +#define BGA_DEV_ID1 (0xB0C1) //- virtual width and height, X and Y offset0 +#define BGA_DEV_ID2 (0xB0C2) //- 15, 16, 24 and 32 BPP modes, support for linear frame buffer, support for retaining memory contents on mode switching +#define BGA_DEV_ID3 (0xB0C3) //- support for getting capabilities, support for using 8 bit DAC +#define BGA_DEV_ID4 (0xB0C4) //- VRAM increased to 8 MB +#define BGA_DEV_ID5 (0xB0C5) //- VRAM increased to 16 MB? [TODO: verify and check for other changes] +#define VBE_DISPI_BPP_4 (0x04) +#define VBE_DISPI_BPP_8 (0x08) +#define VBE_DISPI_BPP_15 (0x0F) +#define VBE_DISPI_BPP_16 (0x10) +#define VBE_DISPI_BPP_24 (0x18) +#define VBE_DISPI_BPP_32 (0x20) +#define VBE_DISPI_DISABLED (0x00) +#define VBE_DISPI_ENABLED (0x01) +#define VBE_DISPI_LFB_ENABLED (0x40) + +private void DefGraphInit(); +private Pixl SetDefFontPx(Pixl px); +private void SetNextCharsXY(U64 x, U64 y); +private void SetCharsDXWFlush(U64 chardxw, U64 flush); +public void HalShowVersion(); +private void FillRect(Pixl pix, UInt x, UInt y, UInt tx, UInt ty); +private void FillBitMAPFile(Char* bmfname); +private void SlouSreen(UInt hy); +private void HalBackGround(); +public void HalLogo(); +public void BootVideoDeviceInit(); +private void BGAInit(); +private void VBEInit(); +private void FillGraph(DefGraph* kghp, Pixl pix); +private void WritePixColor(DefGraph* kghp, U32 x, U32 y, Pixl pix); +private void DRXWPixColor(DefGraph* kghp, U32 x, U32 y, Pixl pix); +private void FlushVideoRam(DefGraph* kghp); +private U32 Utf8ToUnicode(UTF8* utf, int* retuib); +private U8* GetCharsInfo(DefGraph* kghp, U32 unicode, int* retchwx, int* retchhx, int* retlinb); +public void PutPixOneChar(DefGraph* kghp, U32 unicode, Pixl pix); +public void DRXPutPixOneChar(DefGraph* kghp, U32 unicode, Pixl pix); +public void StringWrite(DefGraph* kghp, Char* buf); +private void BGAWriteReg(U16 index, U16 data); +private U16 BGAReadReg(U16 index); +private Size BGARead(void* ghpdev, void* outp, Size rdsz); +private Size BGAWrite(void* ghpdev, void* inp, Size wesz); +private SInt BGAIoCtrl(void* ghpdev, void* outp, UInt iocode); +private U64* GetVRamAddrInBank(void* ghpdev); +private void BGADispNextBank(void* ghpdev); +private void BGAFlush(void* ghpdev); +private SInt BGASetBank(void* ghpdev, SInt bnr); +private Pixl BGAReadPix(void* ghpdev, UInt x, UInt y); +private void BGAWritePix(void* ghpdev, Pixl pix, UInt x, UInt y); +private Pixl BGADXReadPix(void* ghpdev, UInt x, UInt y); +private void BGADXWritePix(void* ghpdev, Pixl pix, UInt x, UInt y); +private SInt BGASetXY(void* ghpdev, UInt x, UInt y); +private SInt BGASetVWH(void* ghpdev, UInt vwt, UInt vhi); +private SInt BGASetXYOffset(void* ghpdev, UInt xoff, UInt yoff); +private SInt BGAGetXY(void* ghpdev, UInt* rx, UInt* ry); +private SInt BGAGetVWH(void* ghpdev, UInt* rvwt, UInt* rvhi); +private SInt BGAGetXYOffset(void* ghpdev, UInt* rxoff, UInt* ryoff); +private Size VBERead(void* ghpdev, void* outp, Size rdsz); +private Size VBEWrite(void* ghpdev, void* inp, Size wesz); +private SInt VBEIoCtrl(void* ghpdev, void* outp, UInt iocode); +private void VBEFlush(void* ghpdev); +private SInt VBESetBank(void* ghpdev, SInt bnr); +private Pixl VBEReadPix(void* ghpdev, UInt x, UInt y); +private void VBEWritePix(void* ghpdev, Pixl pix, UInt x, UInt y); +private Pixl VBDXReadPix(void* ghpdev, UInt x, UInt y); +private void VBEDXWritePix(void* ghpdev, Pixl pix, UInt x, UInt y); +private SInt VBESetXY(void* ghpdev, UInt x, UInt y); +private SInt VBESetVWH(void* ghpdev, UInt vwt, UInt vhi); +private SInt VBESetXYOffset(void* ghpdev, UInt xoff, UInt yoff); +private SInt VBEGetXY(void* ghpdev, UInt* rx, UInt* ry); +private SInt VBEGetVWH(void* ghpdev, UInt* rvwt, UInt* rvhi); +private SInt VBEGetXYOffset(void* ghpdev, UInt* rxoff, UInt* ryoff); + +#endif From c19ed4db835def14a36a3b275ca99e1e273a6675 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 13 Sep 2021 16:25:44 +0800 Subject: [PATCH 031/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E6=A0=B8?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/KrlLog.h | 22 +++++++ Kernel/KrlLog.c | 114 +++++++++++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 Include/KernelInc/KrlLog.h create mode 100644 Kernel/KrlLog.c diff --git a/Include/KernelInc/KrlLog.h b/Include/KernelInc/KrlLog.h new file mode 100644 index 0000000..a66a3e8 --- /dev/null +++ b/Include/KernelInc/KrlLog.h @@ -0,0 +1,22 @@ +/**************************************************************** + Kernel层日志头文件KrlLog.h +***************************************************************** + 彭东 +****************************************************************/ + +#ifndef _KRLLOGHEAD +#define _KRLLOGHEAD + +typedef __builtin_va_list VAList; +#define VA_START(ap,np) __builtin_va_start(ap,np) +#define VA_END(ap) __builtin_va_end(ap) +#define VA_ARG(ap,ty) __builtin_va_arg(ap,ty) + +private Char* FmtNumber(Char* str, UInt n, SInt base); +private Char* FmtStrCopy(Char* buf, Char* str); +private void FmtCore(Char* buf, const Char* fmt, VAList args); +public void KrlPrint(const Char* fmt, ...); +public void KrlLog(UInt level, const Char* fmt, ...); +public Bool KrlLogInit(); + +#endif \ No newline at end of file diff --git a/Kernel/KrlLog.c b/Kernel/KrlLog.c new file mode 100644 index 0000000..1b5c0f2 --- /dev/null +++ b/Kernel/KrlLog.c @@ -0,0 +1,114 @@ +/**************************************************************** + Kernel层日志文件KrlLog.c +***************************************************************** + 彭东 +****************************************************************/ +#include "BaseType.h" +#include "HalSync.h" +#include "HalFirmware.h" +#include "KrlLog.h" + +private Char* FmtNumber(Char* str, UInt n, SInt base) +{ + register Char* p; + Char strbuf[36]; + p = &strbuf[36]; + *--p = 0; + if (n == 0) + { + *--p = '0'; + } + else + { + do + { + *--p = "0123456789abcdef"[n % base]; + } while (n /= base); + } + while (*p != 0) + { + *str++ = *p++; + } + return str; +} + +private Char* FmtStrCopy(Char* buf, Char* str) +{ + while(*str) + { + *buf = *str; + buf++; + str++; + } + return buf; +} + +private void FmtCore(Char* buf, const Char* fmt, VAList args) +{ + Char* p = buf; + while(*fmt) + { + if(*fmt != '%') + { + *p++ = *fmt++; + continue; + } + fmt++; + switch(*fmt) + { + case 'x': + p = FmtNumber(p, VA_ARG(args, UInt), 16); + fmt++; + break; + case 'd': + p = FmtNumber(p, VA_ARG(args, UInt), 10); + fmt++; + break; + case 's': + p = FmtStrCopy(p, (Char*)VA_ARG(args, UInt)); + fmt++; + break; + default: + break; + } + } + *p = 0; + return; +} + +public void KrlPrint(const Char* fmt, ...) +{ + CPUFlg cpuflg; + Char buf[512]; + VAList ap; + HalCliFlags(&cpuflg); + VA_START(ap, fmt); + FmtCore(buf, fmt, ap); + StringWrite(&kdftgh, buf); + VA_END(ap); + HalStiFlags(&cpuflg); + return; +} + +public void KrlLog(UInt level, const Char* fmt, ...) +{ + CPUFlg cpuflg; + Char buf[512]; + VAList ap; + if(0 != level) + { + return; + } + HalCliFlags(&cpuflg); + VA_START(ap, fmt); + FmtCore(buf, fmt, ap); + StringWrite(&kdftgh, buf); + VA_END(ap); + HalStiFlags(&cpuflg); + return; +} + +public Bool KrlLogInit() +{ + return TRUE; +} \ No newline at end of file From 9194833e2b6f4c4876304b85b4e73e025a0f3586 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 13 Sep 2021 16:44:37 +0800 Subject: [PATCH 032/221] =?UTF-8?q?=E4=BF=AE=E6=94=B9HalBootInit()?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalBoot.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Hal/X86_64/HalBoot.c b/Hal/X86_64/HalBoot.c index 96d0f1a..369ef98 100644 --- a/Hal/X86_64/HalBoot.c +++ b/Hal/X86_64/HalBoot.c @@ -5,6 +5,7 @@ **********************************************************/ #include "BaseType.h" #include "HalBoot.h" +#include "HalFirmware.h" #include "HalCPU.h" #include "HalMMU.h" #include "HalCache.h" @@ -14,6 +15,7 @@ private Bool HalBootInit() { + HalFirmwareInit(); HalCPUInit(); HalMMUInit(); HalCacheInit(); From 5d6c44bc60a44b7056998872d0680599e57d5052 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 13 Sep 2021 16:45:46 +0800 Subject: [PATCH 033/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0HalFirmwareInit()?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalFirmware.c | 8 +++++++- Include/HalInc/X86_64Inc/HalFirmware.h | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Hal/X86_64/HalFirmware.c b/Hal/X86_64/HalFirmware.c index c0e6be5..0c0d9cc 100644 --- a/Hal/X86_64/HalFirmware.c +++ b/Hal/X86_64/HalFirmware.c @@ -7,7 +7,7 @@ #include "HalFirmware.h" #include "HalSync.h" #include "HalCPU.h" - +#include "KrlLog.h" const char* CosmosVersion = "Cosmos\n内核版本:00.01\n彭东 @ 构建于 "__DATE__ @@ -839,3 +839,9 @@ private SInt VBEGetXYOffset(void* ghpdev, UInt* rxoff, UInt* ryoff) return -1; } + +public Bool HalFirmwareInit() +{ + BootVideoDeviceInit(); + return; +} diff --git a/Include/HalInc/X86_64Inc/HalFirmware.h b/Include/HalInc/X86_64Inc/HalFirmware.h index 585e82f..9f73de7 100644 --- a/Include/HalInc/X86_64Inc/HalFirmware.h +++ b/Include/HalInc/X86_64Inc/HalFirmware.h @@ -316,5 +316,5 @@ private SInt VBESetXYOffset(void* ghpdev, UInt xoff, UInt yoff); private SInt VBEGetXY(void* ghpdev, UInt* rx, UInt* ry); private SInt VBEGetVWH(void* ghpdev, UInt* rvwt, UInt* rvhi); private SInt VBEGetXYOffset(void* ghpdev, UInt* rxoff, UInt* ryoff); - +public Bool HalFirmwareInit(); #endif From af62ef0211fa87066a4bc093094fcafd96b45c29 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 14 Sep 2021 14:51:54 +0800 Subject: [PATCH 034/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0HalDead()=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalCPU.c | 28 ++++++++++++++++++++++++++++ Include/HalInc/X86_64Inc/HalCPU.h | 1 + 2 files changed, 29 insertions(+) diff --git a/Hal/X86_64/HalCPU.c b/Hal/X86_64/HalCPU.c index 45ee62c..b994aa6 100644 --- a/Hal/X86_64/HalCPU.c +++ b/Hal/X86_64/HalCPU.c @@ -13,6 +13,34 @@ DefinedCPUArchData(TSS, TSSTable); DefinedCPUArchData(GDTPTR, GDTablePtr); DefinedCPUArchData(IDTPTR, IDTablePtr); +public void __attribute__((optnone)) HalDead(UInt count) +{ + if(0 == count) + { + HALT(); + } + + for(UInt i = 0; i < count; i++) + { + for(UInt j = 0; j < count; j++) + { + for(UInt k = 0; k < count; k++) + { + for(UInt l = 0; l < count; l++) + { + for(UInt m = 0; m < count; m++) + { + for(UInt n = 0; n < count; n++) + { + ; + } + } + } + } + } + } + return; +} public Addr HalVAddrToPAddr(Addr kvaddr) { if (kvaddr < KRNL_MAP_VIRTADDRESS_START || kvaddr > KRNL_MAP_VIRTADDRESS_END) diff --git a/Include/HalInc/X86_64Inc/HalCPU.h b/Include/HalInc/X86_64Inc/HalCPU.h index a9a6c7f..09826ca 100644 --- a/Include/HalInc/X86_64Inc/HalCPU.h +++ b/Include/HalInc/X86_64Inc/HalCPU.h @@ -498,6 +498,7 @@ KLINE void HalWriteCR3(UInt val) return; } +public void __attribute__((optnone)) HalDead(UInt count); public Addr HalVAddrToPAddr(Addr kvaddr); public Addr HalPAddrToVAddr(Addr kpaddr); private Bool SetOneGateDesc(GateDesc* gate, U8 type, IDTHandler handler, U8 privilege); From 579f9ea910b3eb6a26ba16122a9dd1d62cadd0da Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 14 Sep 2021 14:53:29 +0800 Subject: [PATCH 035/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0IF=5FNULL=5FRETURN?= =?UTF-8?q?=E3=80=81INIT=5FOBJOFPTR=5FZERO=E5=AE=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/BaseInc/BaseType.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Include/BaseInc/BaseType.h b/Include/BaseInc/BaseType.h index b737ea2..a3efc52 100644 --- a/Include/BaseInc/BaseType.h +++ b/Include/BaseInc/BaseType.h @@ -47,4 +47,7 @@ typedef SInt DrvStus; #define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) +#define IF_NULL_RETURN(ptr) if(NULL == ptr){return;} +#define INIT_OBJOFPTR_ZERO(ptr) HalMemSet((void*)ptr, 0, sizeof(typeof(*ptr))) + #endif \ No newline at end of file From 4c8f02edf0b15a049cdd48af9c93a20693216703 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 14 Sep 2021 15:05:40 +0800 Subject: [PATCH 036/221] =?UTF-8?q?=E4=BF=AE=E6=94=B9HalDefStringWrite?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalFirmware.c | 4 +++- Include/HalInc/X86_64Inc/HalFirmware.h | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Hal/X86_64/HalFirmware.c b/Hal/X86_64/HalFirmware.c index 0c0d9cc..18f629f 100644 --- a/Hal/X86_64/HalFirmware.c +++ b/Hal/X86_64/HalFirmware.c @@ -511,12 +511,14 @@ public void DRXPutPixOneChar(DefGraph* kghp, U32 unicode, Pixl pix) return; } -public void StringWrite(DefGraph* kghp, Char* buf) +public void HalDefStringWrite(Char* buf) { int chinx = 0; int chretnext = 0; U32 uc = 0; + DefGraph* kghp = &kdftgh; Pixl pix = kghp->DefFontPX; + IF_NULL_RETURN(buf); while (buf[chinx] != 0) { uc = Utf8ToUnicode((UTF8* )(&buf[chinx]), &chretnext); diff --git a/Include/HalInc/X86_64Inc/HalFirmware.h b/Include/HalInc/X86_64Inc/HalFirmware.h index 9f73de7..e6feb0c 100644 --- a/Include/HalInc/X86_64Inc/HalFirmware.h +++ b/Include/HalInc/X86_64Inc/HalFirmware.h @@ -281,7 +281,7 @@ private U32 Utf8ToUnicode(UTF8* utf, int* retuib); private U8* GetCharsInfo(DefGraph* kghp, U32 unicode, int* retchwx, int* retchhx, int* retlinb); public void PutPixOneChar(DefGraph* kghp, U32 unicode, Pixl pix); public void DRXPutPixOneChar(DefGraph* kghp, U32 unicode, Pixl pix); -public void StringWrite(DefGraph* kghp, Char* buf); +public void HalDefStringWrite(Char* buf); private void BGAWriteReg(U16 index, U16 data); private U16 BGAReadReg(U16 index); private Size BGARead(void* ghpdev, void* outp, Size rdsz); From db09b19fc1e2e552197492ab308d955465257fea Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 14 Sep 2021 15:10:20 +0800 Subject: [PATCH 037/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlErrorCrashDead()?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/KrlLog.h | 1 + Kernel/KrlLog.c | 20 ++++++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Include/KernelInc/KrlLog.h b/Include/KernelInc/KrlLog.h index a66a3e8..403d3b3 100644 --- a/Include/KernelInc/KrlLog.h +++ b/Include/KernelInc/KrlLog.h @@ -17,6 +17,7 @@ private Char* FmtStrCopy(Char* buf, Char* str); private void FmtCore(Char* buf, const Char* fmt, VAList args); public void KrlPrint(const Char* fmt, ...); public void KrlLog(UInt level, const Char* fmt, ...); +public void KrlErrorCrashDead(const Char* fmt, ...); public Bool KrlLogInit(); #endif \ No newline at end of file diff --git a/Kernel/KrlLog.c b/Kernel/KrlLog.c index 1b5c0f2..97bf527 100644 --- a/Kernel/KrlLog.c +++ b/Kernel/KrlLog.c @@ -4,6 +4,7 @@ 彭东 ****************************************************************/ #include "BaseType.h" +#include "HalCPU.h" #include "HalSync.h" #include "HalFirmware.h" #include "KrlLog.h" @@ -84,7 +85,7 @@ public void KrlPrint(const Char* fmt, ...) HalCliFlags(&cpuflg); VA_START(ap, fmt); FmtCore(buf, fmt, ap); - StringWrite(&kdftgh, buf); + HalDefStringWrite(buf); VA_END(ap); HalStiFlags(&cpuflg); return; @@ -102,12 +103,27 @@ public void KrlLog(UInt level, const Char* fmt, ...) HalCliFlags(&cpuflg); VA_START(ap, fmt); FmtCore(buf, fmt, ap); - StringWrite(&kdftgh, buf); + HalDefStringWrite(buf); VA_END(ap); HalStiFlags(&cpuflg); return; } +public void KrlErrorCrashDead(const Char* fmt, ...) +{ + CPUFlg cpuflg; + Char buf[512]; + VAList ap; + HalCliFlags(&cpuflg); + VA_START(ap, fmt); + FmtCore(buf, fmt, ap); + HalDefStringWrite(buf); + VA_END(ap); + HalStiFlags(&cpuflg); + HalDead(0); + return; +} + public Bool KrlLogInit() { return TRUE; From ba408e1afc29f21bfd53e292ee086c29f1e57c83 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 14 Sep 2021 16:43:35 +0800 Subject: [PATCH 038/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0IF=5FNULL=5FDEAD?= =?UTF-8?q?=E5=AE=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/BaseInc/BaseType.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Include/BaseInc/BaseType.h b/Include/BaseInc/BaseType.h index a3efc52..43d7eb3 100644 --- a/Include/BaseInc/BaseType.h +++ b/Include/BaseInc/BaseType.h @@ -48,6 +48,8 @@ typedef SInt DrvStus; #define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) #define IF_NULL_RETURN(ptr) if(NULL == ptr){return;} +#define IF_NULL_DEAD(ptr) if(NULL == ptr){KrlErrorCrashDead("OBJ PTR IS NULL!!");} + #define INIT_OBJOFPTR_ZERO(ptr) HalMemSet((void*)ptr, 0, sizeof(typeof(*ptr))) #endif \ No newline at end of file From 201ba0d99edee139fb599f1650cb477fcdfbd896 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 14 Sep 2021 16:46:11 +0800 Subject: [PATCH 039/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E7=9B=B8=E5=85=B3=E7=9A=84=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E4=BB=A5=E5=8F=8A=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 176 +++++++++++++++++++++- Kernel/Memory/KrlMmManage.c | 100 ++++++++++++ 2 files changed, 273 insertions(+), 3 deletions(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index c14069f..16e329b 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -1,5 +1,5 @@ /********************************************************** - 物理内存管理文件KrlMmManage.h + 物理内存管理头文件KrlMmManage.h *********************************************************** 彭东 **********************************************************/ @@ -40,6 +40,31 @@ #define PAF_RV2_VAL (0) #define PAF_INIT_PADRS (0) +#define MA_TYPE_INIT 0 +#define MA_TYPE_HWAD 1 +#define MA_TYPE_KRNL 2 +#define MA_TYPE_PROC 3 +#define MA_TYPE_SHAR 4 +#define MEMAREA_MAX 4 +#define MA_HWAD_LSTART 0 +#define MA_HWAD_LSZ 0x2000000 +#define MA_HWAD_LEND (MA_HWAD_LSTART+MA_HWAD_LSZ-1) +#define MA_KRNL_LSTART 0x2000000 +#define MA_KRNL_LSZ (0x400000000-0x2000000) +#define MA_KRNL_LEND (MA_KRNL_LSTART+MA_KRNL_LSZ-1) +#define MA_PROC_LSTART 0x400000000 +#define MA_PROC_LSZ (0xffffffffffffffff-0x400000000) +#define MA_PROC_LEND (MA_PROC_LSTART+MA_PROC_LSZ) + +#define PABH_STUS_INIT 0 +#define PABH_STUS_ONEM 1 +#define PABH_STUS_DIVP 2 +#define PABH_STUS_DIVM 3 + +#define MSPLMER_ARR_LMAX 52 +#define MSPLMER_ARR_BMAX 11 +#define MSPLMER_ARR_OMAX 9 + //PMSAD标志 typedef struct PMSADFLAGS { @@ -76,6 +101,142 @@ typedef struct PMSAD void* BlockLink;//8 }__attribute__((packed)) PMSAD;//16+24 +typedef struct MLOCK +{ + SPinLock Locks; + //SEM +}MLock; + +//Physical memory space area +typedef struct PHYMSPACEAREA +{ + U32 Type; + U32 SubType; + U32 DevType; + U32 Flags; + U32 Status; + U64 Start; + U64 Size; + U64 End; + U64 ResvMemStart; + U64 ResvMemEnd; + void* Pri; + void* Ext; +}PHYMSPaceArea; + +//Physical Address Block Head List +typedef struct PABHLIST +{ + MLock Lock; + U32 Status; + UInt Order; + UInt InOrderPmsadNR; + UInt FreePmsadNR; + UInt PmsadNR; + UInt AllocCount; + UInt FreeCount; + List FreeLists; + List AllocLists; + List OveLists; +}PABHList; + +//Memory Splitting and Merging + +typedef struct MSPLITMER +{ + MLock Lock; + U32 Status; + UInt MaxSMNR; + UInt PhySMNR; + UInt PreSMNR; + UInt SPlitNR; + UInt MerNR; + PABHList PAddrBlockArr[MSPLMER_ARR_LMAX]; + PABHList OnePAddrBlock; +}MSPlitMer; + + +//0x400000000 0x40000000 +//Memory Area +typedef struct MAREA +{ + List Lists; + MLock Lock; + UInt Status; + UInt Flags; + UInt Type; + UInt MaxPMSAD; + UInt AllocPMSAD; + UInt FreePMSAD; + UInt ResvPMSAD; + UInt HorizLine; + Addr LogicStart; + Addr LogicEnd; + UInt LogicSZ; + Addr EffectStart; + Addr EffectEnd; + UInt EffectSZ; + List AllPMSADLists; + UInt AllPMSADNR; + MSPlitMer MSPLMerData; + void* Priv; + void* Ext; + /* + *这个结构至少占用一个页面,当然 + *也可以是多个连续的的页面,但是 + *该结构从第一个页面的首地址开始 + *存放,后面的空间用于存放实现分 + *配算法的数据结构,这样每个区可 + *方便的实现不同的分配策略,或者 + *有天你觉得我的分配算法是渣渣, + *完全可以替换mafuncobjs_t结构 + *中的指针,指向你的函数。 + */ +}MArea; + + + +/* +Memory Node +内存节点 +*/ +typedef struct MNode +{ + List Lists; + MLock Lock; + UInt Status; + UInt Flags; + UInt NodeID; + UInt CPUID; + Addr NodeMemAddrStart; + Addr NodeMemAddrEnd; + U64 NodeMemSize; + Addr NodeMemResvAddrStart; + Addr NodeMemResvAddrEnd; + U64 NodeMemResvSize; + MArea MAreaArr[MEMAREA_MAX]; +}MNode; + +typedef struct GMEMMANAGE +{ + MLock Lock; + U64 Status; + U64 Flags; + U64 MemroySZ; + U64 MaxPMSAD; + U64 FreePMSAD; + U64 AllocPMSAD; + U64 ResvPMSAD; + PHYMSPaceArea* PAreaStart; + U64 PAreaNR; + MNode* MNodeStart; + U64 MNodeNR; + void* privp; + void* extp; +}GMemManage; + + + KLINE Addr PMSADRetPAddr(PMSAD* msad) { if(NULL == msad) @@ -94,5 +255,14 @@ KLINE Addr PMSADRetVAddr(PMSAD* msad) return HalPAddrToVAddr(PMSADRetPAddr(msad)); } - -#endif \ No newline at end of file +private void MLockInit(MLock* init); +private void PHYMSPaceAreaInit(PHYMSPaceArea* init); +private void PABHListInit(PABHList* init); +private void MSPlitMerInit(MSPlitMer* init); +private void MAreaInit(MArea* init); +private void MNodeInit(MNode* init); +private void GMemManageInit(GMemManage* init); +public void KrlMmLocked(MLock* lock); +public void KrlMmUnLock(MLock* lock); +public Bool KrlMmManageInit(); +#endif diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index e69de29..e6015b3 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -0,0 +1,100 @@ +/********************************************************** + 物理内存管理头文件KrlMmManage.h +*********************************************************** + 彭东 +**********************************************************/ +#include "BaseType.h" +#include "HalSync.h" +#include "HalCPU.h" +#include "KrlMmManage.h" + +private void MLockInit(MLock* init) +{ + IF_NULL_RETURN(init); + SPinLockInit(&init->Lock.Locks); + return; +} + +private void PHYMSPaceAreaInit(PHYMSPaceArea* init) +{ + IF_NULL_RETURN(init); + INIT_OBJOFPTR_ZERO(init); + return; +} + +private void PABHListInit(PABHList* init) +{ + IF_NULL_RETURN(init); + INIT_OBJOFPTR_ZERO(init); + + MLockInit(&init->Lock); + ListInit(&init->FreeLists); + ListInit(&init->AllocLists); + ListInit(&init->OveLists); + return; +} + +private void MSPlitMerInit(MSPlitMer* init) +{ + IF_NULL_RETURN(init); + INIT_OBJOFPTR_ZERO(init); + + MLockInit(&init->Lock); + for(UInt i = 0; i < MSPLMER_ARR_LMAX; i++) + { + PABHListInit(&init->PAddrBlockArr[i]); + } + PABHListInit(&init->OnePAddrBlock); + return; +} + +private void MAreaInit(MArea* init) +{ + IF_NULL_RETURN(init); + INIT_OBJOFPTR_ZERO(init); + ListInit(&init->Lists); + MLockInit(&init->Lock); + ListInit(&init->AllocPMSADLists); + MSPlitMerInit(&init->MSPLMerData); + return; +} + +private void MNodeInit(MNode* init) +{ + IF_NULL_RETURN(init); + INIT_OBJOFPTR_ZERO(init); + ListInit(&init->Lists); + MLockInit(&init->Lock); + for(UInt i = 0; i < MEMAREA_MAX; i++) + { + MAreaInit(&init->MAreaArr[i]); + } + return; +} + +private void GMemManageInit(GMemManage* init) +{ + IF_NULL_RETURN(init); + INIT_OBJOFPTR_ZERO(init); + MLockInit(&init->Lock); + return; +} + +public void KrlMmLocked(MLock* lock) +{ + IF_NULL_DEAD(lock); + HalSPinLock(&lock->Locks); + return; +} + +public void KrlMmUnLock(MLock* lock) +{ + IF_NULL_DEAD(lock); + HalUnSPinLock(&lock->Locks); + return; +} + +public Bool KrlMmManageInit() +{ + return TRUE; +} \ No newline at end of file From 2dfd2eb60621748f2a38cf5c1dcfcd35c71c905e Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 14 Sep 2021 17:03:54 +0800 Subject: [PATCH 040/221] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=86=85=E5=AD=98?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E4=BB=A3=E7=A0=81=E6=96=87=E4=BB=B6=E5=A4=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmManage.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index e6015b3..d5d34eb 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -1,5 +1,5 @@ /********************************************************** - 物理内存管理头文件KrlMmManage.h + 物理内存管理文件KrlMmManage.c *********************************************************** 彭东 **********************************************************/ From 89e5aeb40ef123af284436df8d05eec4fdadcbbc Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 15 Sep 2021 08:34:37 +0800 Subject: [PATCH 041/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84=E7=9A=84?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 16e329b..befb0e0 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -108,6 +108,7 @@ typedef struct MLOCK }MLock; //Physical memory space area +//物理内存空间区域 typedef struct PHYMSPACEAREA { U32 Type; @@ -125,6 +126,7 @@ typedef struct PHYMSPACEAREA }PHYMSPaceArea; //Physical Address Block Head List +//物理地址块头链 typedef struct PABHLIST { MLock Lock; @@ -141,7 +143,7 @@ typedef struct PABHLIST }PABHList; //Memory Splitting and Merging - +//内存拆分合并结构 typedef struct MSPLITMER { MLock Lock; @@ -158,6 +160,7 @@ typedef struct MSPLITMER //0x400000000 0x40000000 //Memory Area +//物理内存区 typedef struct MAREA { List Lists; @@ -216,7 +219,8 @@ typedef struct MNode U64 NodeMemResvSize; MArea MAreaArr[MEMAREA_MAX]; }MNode; - +//Global Memory Manage +//全局内存管理 typedef struct GMEMMANAGE { MLock Lock; From d57d4d1fffca78d7051a346a4a66ef40080af9a3 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 15 Sep 2021 17:26:12 +0800 Subject: [PATCH 042/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E6=A0=B8?= =?UTF-8?q?=E6=98=A0=E5=83=8F=E4=BF=A1=E6=81=AF=E5=92=8C=E6=9C=BA=E5=99=A8?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E4=BF=A1=E6=81=AF=E7=9A=84=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/HalInc/X86_64Inc/HalBoot.h | 144 +++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) diff --git a/Include/HalInc/X86_64Inc/HalBoot.h b/Include/HalInc/X86_64Inc/HalBoot.h index 4ba6f2d..7f01d42 100644 --- a/Include/HalInc/X86_64Inc/HalBoot.h +++ b/Include/HalInc/X86_64Inc/HalBoot.h @@ -6,6 +6,150 @@ #ifndef _HALBOOTHEAD #define _HALBOOTHEAD + +#define KRNL_INRAM_START 0x30000000 +#define LINK_VIRT_ADDR 0x30008000 +#define LINK_LINE_ADDR 0x30008000 +#define KERNEL_VIRT_ADDR 0x30008000 +#define KERNEL_PHYI_ADDR 0x30008000 +#define PAGE_TLB_DIR 0x30004000 +#define PAGE_TLB_SIZE 4096 +#define INIT_HEAD_STACK_ADDR 0x34000000 + +#define CPU_VECTOR_PHYADR 0x30000000 +#define CPU_VECTOR_VIRADR 0 + + +#define PTE_SECT_AP (3<<10) +#define PTE_SECT_DOMAIN (0<<5) +#define PTE_SECT_NOCW (0<<2) +#define PTE_SECT_BIT (2) + +#define PLFM_ADRSPCE_NR 29 + +#define INTSRC_MAX 32 + +#define KRNL_MAP_VIRTADDRESS_SIZE 0x400000000 +#define KRNL_VIRTUAL_ADDRESS_START 0xffff800000000000 +#define KRNL_VIRTUAL_ADDRESS_END 0xffffffffffffffff +#define USER_VIRTUAL_ADDRESS_START 0 +#define USER_VIRTUAL_ADDRESS_END 0x00007fffffffffff +#define KRNL_MAP_PHYADDRESS_START 0 +#define KRNL_MAP_PHYADDRESS_END 0x400000000 +#define KRNL_MAP_PHYADDRESS_SIZE 0x400000000 +#define KRNL_MAP_VIRTADDRESS_START KRNL_VIRTUAL_ADDRESS_START +#define KRNL_MAP_VIRTADDRESS_END (KRNL_MAP_VIRTADDRESS_START+KRNL_MAP_VIRTADDRESS_SIZE) +#define KRNL_ADDR_ERROR 0xf800000000000 + +#define MSI_PADR ((MachStartInfio*)(0x100000)) + +#define BFH_RW_R 1 +#define BFH_RW_W 2 + +#define BFH_BUF_SZ 0x1000 +#define BFH_ONERW_SZ 0x1000 +#define BFH_RWONE_OK 1 +#define BFH_RWONE_ER 2 +#define BFH_RWALL_OK 3 + +#define FDSC_NMAX 192 +#define FDSC_SZMAX 256 +#define KIMAGE_ENDMAGIC 0xaaffaaffaaffaaff +#define KIMAGE_RVMAGIC 0xffaaffaaffaaffaa + +#define KIMAGEINFO_OFF (0x1000) +#define RAM_USABLE 1 +#define RAM_RESERV 2 +#define RAM_ACPIREC 3 +#define RAM_ACPINVS 4 +#define RAM_AREACON 5 + +#define MSI_MAGIC (U64)((((U64)'C')<<56)|(((U64)'o')<<48)|(((U64)'s')<<40)|(((U64)'m')<<32)|(((U64)'o')<<24)|(((U64)'s')<<16)|(((U64)'O')<<8)|((U64)'S')) + +//Machine start-up information +typedef struct MACHSTARTINFO +{ + U64 Magic; //CosmosOS//0 + U64 CheckSum;//8 + U64 KrlInitStack;//16 + U64 KrkInitStackSZ;//24 + U64 KrlImgFilePAddr; + U64 KrlImgFileSZ; + U64 krlCoreFilePAddr; + U64 krlCoreFileSZ; + U64 krlCoreFileVec; + U64 krlCoreFileRunMode; + U64 FontPAddr; + U64 FontSZ; + U64 FramVRamPAddr; + U64 FramVRamSZ; + U64 CPUMode; + U64 MemSZ; + U64 E820PAddr; + U64 E820NR; + U64 E820SZ; + U64 PMSPaceAreaPAddr; + U64 PMSPaceAreaNR; + U64 PMSPaceAreaSZ; + U64 MNodePAddr; + U64 MNodeNR; + U64 MNodeSZ; + U64 TDireArrPAddr; + U64 SubDireLen; + U64 MAPPhyMemSZ; + U64 EndPhyAddr; + U64 BrkStartAddr; + U64 BrkCurrAddr; + U64 BrkEndAddr; + Graph GraphParm; +}__attribute__((packed)) MachStartInfo; + +typedef struct E820{ + U64 Addr; /* start of memory segment8 */ + U64 Size; /* size of memory segment8 */ + U32 Type; /* type of memory segment 4*/ +}__attribute__((packed)) E820Map; + +typedef struct FILEDESC +{ + U64 Type; + U64 SubType; + U64 Status; + U64 ID; + U64 Offset; + U64 End; + U64 RealSZ; + U64 Sum; + char Name[FDSC_NMAX]; +}FileDESC; + +//Kernel Image Information +typedef struct KIMAGEINFO +{ + U64 Magic; + U64 SelfSum; + U64 SelfStart; + U64 SelfEnd; + U64 SelfSZ; + U64 LDRBlockStart; + U64 LDRBlockEnd; + U64 LDRBlockSZ; + U64 LDRBlockSum; + U64 FileDescBlockStart; + U64 FileDescBlockEnd; + U64 FileDescBlockSZ; + U64 FileDescBlockSum; + U64 FileBlockStart; + U64 FileBlockEnd; + U64 FileBlockSZ; + U64 FileBlockSum; + U64 LDRCodeNR; + U64 FileDescNR; + U64 FileNR; + U64 EndMagic; + U64 Rescv; +}KImageInfo; + private Bool HalBootInit(); public void HalBootStart(); #endif From c2f34078a8d834d0211918db2b8c662eff0ebfe7 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 15 Sep 2021 17:31:12 +0800 Subject: [PATCH 043/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E7=9A=84=E5=86=85=E5=AD=98=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E3=80=81=E5=86=85=E5=AD=98=E5=8C=BA=E7=9B=B8=E5=85=B3=E7=9A=84?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmManage.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index d5d34eb..8da1348 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -4,6 +4,7 @@ 彭东 **********************************************************/ #include "BaseType.h" +#include "List.h" #include "HalSync.h" #include "HalCPU.h" #include "KrlMmManage.h" @@ -22,6 +23,15 @@ private void PHYMSPaceAreaInit(PHYMSPaceArea* init) return; } +private void PMSADInit(PMSAD* init) +{ + IF_NULL_RETURN(init); + INIT_OBJOFPTR_ZERO(init); + ListInit(&init->Lists); + SPinLockInit(&init->Lock); + return; +} + private void PABHListInit(PABHList* init) { IF_NULL_RETURN(init); @@ -94,6 +104,22 @@ public void KrlMmUnLock(MLock* lock) return; } +public Bool KrlMmPHYMSPaceAreaInit() +{ + return TRUE; +} + +public Bool KrlMmMAreaInit() +{ + return TRUE; +} + +public Bool KrlMmMNodeInit() +{ + return TRUE; +} + + public Bool KrlMmManageInit() { return TRUE; From 5647df89eeb754d4151e6f9d68f057b9046dc8f3 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 16 Sep 2021 10:04:53 +0800 Subject: [PATCH 044/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0HalGetMachStartInfoAd?= =?UTF-8?q?dr=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalBoot.c | 5 +++++ Include/HalInc/X86_64Inc/HalBoot.h | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Hal/X86_64/HalBoot.c b/Hal/X86_64/HalBoot.c index 369ef98..ad44480 100644 --- a/Hal/X86_64/HalBoot.c +++ b/Hal/X86_64/HalBoot.c @@ -13,6 +13,11 @@ #include "HalInterrupt.h" #include "KrlInit.h" +public MachStartInfo* HalGetMachStartInfoAddr() +{ + return (MachStartInfo*)HalPAddrToVAddr((Addr)MSI_PADR); +} + private Bool HalBootInit() { HalFirmwareInit(); diff --git a/Include/HalInc/X86_64Inc/HalBoot.h b/Include/HalInc/X86_64Inc/HalBoot.h index 7f01d42..3bd5e58 100644 --- a/Include/HalInc/X86_64Inc/HalBoot.h +++ b/Include/HalInc/X86_64Inc/HalBoot.h @@ -149,7 +149,7 @@ typedef struct KIMAGEINFO U64 EndMagic; U64 Rescv; }KImageInfo; - +public MachStartInfo* HalGetMachStartInfoAddr(); private Bool HalBootInit(); public void HalBootStart(); #endif From b3d004bca6a85331ef9aa51a9dc8a1f3e1044771 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 16 Sep 2021 10:05:33 +0800 Subject: [PATCH 045/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0HalExPGetMachStartInf?= =?UTF-8?q?oAddr=E6=8E=A5=E5=8F=A3=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalInterface.c | 10 ++++++++-- Include/HalInc/X86_64Inc/HalInterface.h | 6 +++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Hal/X86_64/HalInterface.c b/Hal/X86_64/HalInterface.c index 0eeb0e5..ed726a3 100644 --- a/Hal/X86_64/HalInterface.c +++ b/Hal/X86_64/HalInterface.c @@ -6,7 +6,8 @@ **********************************************************/ #include "BaseType.h" #include "KrlMmManage.h" - +#include "HalBoot.h" +#include "HalInterface.h" public PMSAD* HalExPGetKrlOnePMSAD() { return NULL; @@ -15,4 +16,9 @@ public PMSAD* HalExPGetKrlOnePMSAD() public Bool HalExPPutKrlOnePMSAD(PMSAD* msad) { return FALSE; -} \ No newline at end of file +} + +public MachStartInfo* HalExPGetMachStartInfoAddr() +{ + return HalGetMachStartInfoAddr() +} diff --git a/Include/HalInc/X86_64Inc/HalInterface.h b/Include/HalInc/X86_64Inc/HalInterface.h index 97131cb..2df1e43 100644 --- a/Include/HalInc/X86_64Inc/HalInterface.h +++ b/Include/HalInc/X86_64Inc/HalInterface.h @@ -5,7 +5,7 @@ **********************************************************/ #ifndef _HALINTERFACEHEAD #define _HALINTERFACEHEAD -PMSAD* HalExPGetKrlOnePMSAD(); -Bool HalExPPutKrlOnePMSAD(PMSAD* msad); - +public PMSAD* HalExPGetKrlOnePMSAD(); +public Bool HalExPPutKrlOnePMSAD(PMSAD* msad); +public MachStartInfo* HalExPGetMachStartInfoAddr(); #endif \ No newline at end of file From 7586924e0d174246940562ee55ea89a7c6827317 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 16 Sep 2021 10:07:13 +0800 Subject: [PATCH 046/221] =?UTF-8?q?=E4=BF=AE=E6=94=B9HalExPGetMachStartInf?= =?UTF-8?q?oAddr=E6=8E=A5=E5=8F=A3=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalInterface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Hal/X86_64/HalInterface.c b/Hal/X86_64/HalInterface.c index ed726a3..059017c 100644 --- a/Hal/X86_64/HalInterface.c +++ b/Hal/X86_64/HalInterface.c @@ -20,5 +20,5 @@ public Bool HalExPPutKrlOnePMSAD(PMSAD* msad) public MachStartInfo* HalExPGetMachStartInfoAddr() { - return HalGetMachStartInfoAddr() + return HalGetMachStartInfoAddr(); } From 4a349a934037487d4953d11e867fa0a357289379 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 16 Sep 2021 10:40:39 +0800 Subject: [PATCH 047/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0HalBootAllocMem?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalBoot.c | 21 +++++++++++++++++++++ Include/HalInc/X86_64Inc/HalBoot.h | 1 + 2 files changed, 22 insertions(+) diff --git a/Hal/X86_64/HalBoot.c b/Hal/X86_64/HalBoot.c index ad44480..3e8e92d 100644 --- a/Hal/X86_64/HalBoot.c +++ b/Hal/X86_64/HalBoot.c @@ -11,6 +11,7 @@ #include "HalCache.h" #include "HalIPC.h" #include "HalInterrupt.h" +#include "HalInterface.h" #include "KrlInit.h" public MachStartInfo* HalGetMachStartInfoAddr() @@ -18,6 +19,26 @@ public MachStartInfo* HalGetMachStartInfoAddr() return (MachStartInfo*)HalPAddrToVAddr((Addr)MSI_PADR); } +public Addr HalBootAllocMem(Size size) +{ + MachStartInfo* msinfo = NULL; + Addr ret = NULL; + if(0 == size) + { + return NULL; + } + msinfo = HalExPGetMachStartInfoAddr(); + IF_NULL_DEAD(msinfo); + + ret = (Addr)msinfo->BrkCurrAddr; + if(((U64)(ret + (Addr)size)) >= msinfo->BrkEndAddr) + { + return NULL; + } + msinfo->BrkCurrAddr += (U64)size; + return HalPAddrToVAddr(ret); +} + private Bool HalBootInit() { HalFirmwareInit(); diff --git a/Include/HalInc/X86_64Inc/HalBoot.h b/Include/HalInc/X86_64Inc/HalBoot.h index 3bd5e58..d2af67d 100644 --- a/Include/HalInc/X86_64Inc/HalBoot.h +++ b/Include/HalInc/X86_64Inc/HalBoot.h @@ -150,6 +150,7 @@ typedef struct KIMAGEINFO U64 Rescv; }KImageInfo; public MachStartInfo* HalGetMachStartInfoAddr(); +public Addr HalBootAllocMem(Size size); private Bool HalBootInit(); public void HalBootStart(); #endif From 5f1d1ee079650078e9d1819fcd43a17ff058ef28 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 16 Sep 2021 10:47:53 +0800 Subject: [PATCH 048/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0HalExPBootAllocMem?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalInterface.c | 5 +++++ Include/HalInc/X86_64Inc/HalInterface.h | 1 + 2 files changed, 6 insertions(+) diff --git a/Hal/X86_64/HalInterface.c b/Hal/X86_64/HalInterface.c index 059017c..ef80193 100644 --- a/Hal/X86_64/HalInterface.c +++ b/Hal/X86_64/HalInterface.c @@ -22,3 +22,8 @@ public MachStartInfo* HalExPGetMachStartInfoAddr() { return HalGetMachStartInfoAddr(); } + +public Addr HalExPBootAllocMem(Size size) +{ + return HalBootAllocMem(size); +} \ No newline at end of file diff --git a/Include/HalInc/X86_64Inc/HalInterface.h b/Include/HalInc/X86_64Inc/HalInterface.h index 2df1e43..d52b3e8 100644 --- a/Include/HalInc/X86_64Inc/HalInterface.h +++ b/Include/HalInc/X86_64Inc/HalInterface.h @@ -8,4 +8,5 @@ public PMSAD* HalExPGetKrlOnePMSAD(); public Bool HalExPPutKrlOnePMSAD(PMSAD* msad); public MachStartInfo* HalExPGetMachStartInfoAddr(); +public Addr HalExPBootAllocMem(Size size); #endif \ No newline at end of file From 93eeb14285aa1301d4801c894400ee39046d25e6 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 16 Sep 2021 11:10:02 +0800 Subject: [PATCH 049/221] =?UTF-8?q?=E4=BF=AE=E6=94=B9MachStartInfo?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/HalInc/X86_64Inc/HalBoot.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Include/HalInc/X86_64Inc/HalBoot.h b/Include/HalInc/X86_64Inc/HalBoot.h index d2af67d..2ce1d63 100644 --- a/Include/HalInc/X86_64Inc/HalBoot.h +++ b/Include/HalInc/X86_64Inc/HalBoot.h @@ -88,12 +88,15 @@ typedef struct MACHSTARTINFO U64 E820PAddr; U64 E820NR; U64 E820SZ; + U64 E820Curr; U64 PMSPaceAreaPAddr; U64 PMSPaceAreaNR; U64 PMSPaceAreaSZ; + U64 PMSPaceAreaCurr; U64 MNodePAddr; U64 MNodeNR; U64 MNodeSZ; + U64 MNodeCurr; U64 TDireArrPAddr; U64 SubDireLen; U64 MAPPhyMemSZ; From 1a1466fd54fc4d5b5fba3cabe0bd6259f4afa332 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 16 Sep 2021 11:14:48 +0800 Subject: [PATCH 050/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0HalBootGetNextE820?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalBoot.c | 20 ++++++++++++++++++++ Include/HalInc/X86_64Inc/HalBoot.h | 1 + 2 files changed, 21 insertions(+) diff --git a/Hal/X86_64/HalBoot.c b/Hal/X86_64/HalBoot.c index 3e8e92d..1db755e 100644 --- a/Hal/X86_64/HalBoot.c +++ b/Hal/X86_64/HalBoot.c @@ -39,6 +39,26 @@ public Addr HalBootAllocMem(Size size) return HalPAddrToVAddr(ret); } +public E820Map* HalBootGetNextE820() +{ + MachStartInfo* msinfo = NULL; + E820Map* ret = NULL; + E820Map* start = NULL; + + msinfo = HalExPGetMachStartInfoAddr(); + IF_NULL_DEAD(msinfo); + + start = (E820Map*)HalPAddrToVAddr((Addr)msinfo->E820PAddr); + if(NULL == start || msinfo->E820Curr >= msinfo->E820NR) + { + return NULL; + } + + ret = &start[msinfo->E820Curr]; + msinfo->E820Curr++; + return ret; +} + private Bool HalBootInit() { HalFirmwareInit(); diff --git a/Include/HalInc/X86_64Inc/HalBoot.h b/Include/HalInc/X86_64Inc/HalBoot.h index 2ce1d63..d16d571 100644 --- a/Include/HalInc/X86_64Inc/HalBoot.h +++ b/Include/HalInc/X86_64Inc/HalBoot.h @@ -154,6 +154,7 @@ typedef struct KIMAGEINFO }KImageInfo; public MachStartInfo* HalGetMachStartInfoAddr(); public Addr HalBootAllocMem(Size size); +public E820Map* HalBootGetNextE820(); private Bool HalBootInit(); public void HalBootStart(); #endif From 7fa5c6c646da8923dfe6003b4e0d1e3fe7f7f08f Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 16 Sep 2021 11:21:24 +0800 Subject: [PATCH 051/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0HalExPBootGetNextE820?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/HalInterface.c | 5 +++++ Include/HalInc/X86_64Inc/HalInterface.h | 1 + 2 files changed, 6 insertions(+) diff --git a/Hal/X86_64/HalInterface.c b/Hal/X86_64/HalInterface.c index ef80193..c9f0cef 100644 --- a/Hal/X86_64/HalInterface.c +++ b/Hal/X86_64/HalInterface.c @@ -26,4 +26,9 @@ public MachStartInfo* HalExPGetMachStartInfoAddr() public Addr HalExPBootAllocMem(Size size) { return HalBootAllocMem(size); +} + +public E820Map* HalExPBootGetNextE820() +{ + return HalBootGetNextE820(); } \ No newline at end of file diff --git a/Include/HalInc/X86_64Inc/HalInterface.h b/Include/HalInc/X86_64Inc/HalInterface.h index d52b3e8..2bb155b 100644 --- a/Include/HalInc/X86_64Inc/HalInterface.h +++ b/Include/HalInc/X86_64Inc/HalInterface.h @@ -9,4 +9,5 @@ public PMSAD* HalExPGetKrlOnePMSAD(); public Bool HalExPPutKrlOnePMSAD(PMSAD* msad); public MachStartInfo* HalExPGetMachStartInfoAddr(); public Addr HalExPBootAllocMem(Size size); +public E820Map* HalExPBootGetNextE820(); #endif \ No newline at end of file From 5bbbcce35ce257bb66cd072fe1d3b6c39c7123fe Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 16 Sep 2021 16:44:44 +0800 Subject: [PATCH 052/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0IF=5FNULL=5FRETURN=5F?= =?UTF-8?q?FALSE=E5=AE=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/BaseInc/BaseType.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Include/BaseInc/BaseType.h b/Include/BaseInc/BaseType.h index 43d7eb3..bf8416d 100644 --- a/Include/BaseInc/BaseType.h +++ b/Include/BaseInc/BaseType.h @@ -48,6 +48,7 @@ typedef SInt DrvStus; #define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) #define IF_NULL_RETURN(ptr) if(NULL == ptr){return;} +#define IF_NULL_RETURN_FALSE(ptr) if(NULL == ptr){return FALSE;} #define IF_NULL_DEAD(ptr) if(NULL == ptr){KrlErrorCrashDead("OBJ PTR IS NULL!!");} #define INIT_OBJOFPTR_ZERO(ptr) HalMemSet((void*)ptr, 0, sizeof(typeof(*ptr))) From 15cdf8cee8424298cffc72ccaf4fa389f75444e8 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 16 Sep 2021 16:51:20 +0800 Subject: [PATCH 053/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E7=89=A9=E7=90=86=E5=86=85=E5=AD=98=E7=A9=BA=E9=97=B4?= =?UTF-8?q?=E5=8C=BA=E5=9F=9F=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 16 ++++ Kernel/Memory/KrlMmManage.c | 94 +++++++++++++++++++++++ 2 files changed, 110 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index befb0e0..56b27fc 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -65,6 +65,16 @@ #define MSPLMER_ARR_BMAX 11 #define MSPLMER_ARR_OMAX 9 +#define PMSA_T_OSAPUSERRAM 1 +#define PMSA_T_RESERVRAM 2 +#define PMSA_T_HWUSERRAM 8 +#define PMSA_T_ARACONRAM 0xf +#define PMSA_T_BUGRAM 0xff +#define PMSA_F_X86_32 (1<<0) +#define PMSA_F_X86_64 (1<<1) +#define PMSA_F_ARM_32 (1<<2) +#define PMSA_F_ARM_64 (1<<3) +#define PMSA_F_HAL_MASK 0xff //PMSAD标志 typedef struct PMSADFLAGS { @@ -268,5 +278,11 @@ private void MNodeInit(MNode* init); private void GMemManageInit(GMemManage* init); public void KrlMmLocked(MLock* lock); public void KrlMmUnLock(MLock* lock); +private Bool NewOnePHYMSPaceArea(E820Map* e820, PHYMSPaceArea* area); +private void PHYMSPaceAreaSwap(PHYMSPaceArea *s, PHYMSPaceArea *d); +private void PHYMSPaceAreaSort(PHYMSPaceArea* area, U64 nr); +public Bool KrlMmPHYMSPaceAreaInit(); +public Bool KrlMmMAreaInit(); +public Bool KrlMmMNodeInit(); public Bool KrlMmManageInit(); #endif diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index 8da1348..cbb7b48 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -7,6 +7,8 @@ #include "List.h" #include "HalSync.h" #include "HalCPU.h" +#include "HalBoot.h" +#include "HalInterface.h" #include "KrlMmManage.h" private void MLockInit(MLock* init) @@ -104,8 +106,99 @@ public void KrlMmUnLock(MLock* lock) return; } +private Bool NewOnePHYMSPaceArea(E820Map* e820, PHYMSPaceArea* area) +{ + U32 type = 0, subtype = 0; + IF_NULL_RETURN_FALSE(e820); + IF_NULL_RETURN_FALSE(area); + + PHYMSPaceAreaInit(area); + + switch (e820->Type) + { + case RAM_USABLE: + type = PMSA_T_OSAPUSERRAM; + subtype = RAM_USABLE; + break; + case RAM_RESERV: + type = PMSA_T_RESERVRAM; + subtype = RAM_RESERV; + break; + case RAM_ACPIREC: + type = PMSA_T_HWUSERRAM; + subtype = RAM_ACPIREC; + break; + case RAM_ACPINVS: + type = PMSA_T_HWUSERRAM; + subtype = RAM_ACPINVS; + break; + case RAM_AREACON: + type = PMSA_T_BUGRAM; + subtype = RAM_AREACON; + break; + default: + break; + } + if (0 == type) + { + return FALSE; + } + + area->Type = type; + area->SubType = subtype; + area->Flags = PMSA_F_X86_64; + area->Start = e820->Addr; + area->Size = e820->Size; + area->End = e820->Addr + e820->Size - 1; + return TRUE; +} + +private void PHYMSPaceAreaSwap(PHYMSPaceArea *s, PHYMSPaceArea *d) +{ + PHYMSPaceArea tmp; + PHYMSPaceAreaInit(&tmp); + HalMemCopy(s, &tmp, sizeof(PHYMSPaceArea)); + HalMemCopy(d, s, sizeof(PHYMSPaceArea)); + HalMemCopy(&tmp, d, sizeof(PHYMSPaceArea)); + return; +} + +private void PHYMSPaceAreaSort(PHYMSPaceArea* area, U64 nr) +{ + U64 i, j, k = nr - 1; + for(j = 0; j < k; j++) + { + for(i = 0; i < k - j; i++) + { + if(area[i].Start > area[i + 1].Start) + { + PHYMSPaceAreaSwap(&area[i], &area[i + 1]); + } + } + } + return; +} + public Bool KrlMmPHYMSPaceAreaInit() { + PHYMSPaceArea* area = NULL; + E820Map* e820 = NULL; + MachStartInfo* msinfo = NULL; + U64 areanr= 0; + msinfo = HalExPGetMachStartInfoAddr(); + IF_NULL_DEAD(msinfo); + area = HalExPBootAllocMem((Size)(msinfo->E820NR * sizeof(PHYMSPaceArea))); + IF_NULL_RETURN_FALSE(area); + for ( ;e820 != NULL; areanr++) + { + e820 = HalExPBootGetNextE820(); + NewOnePHYMSPaceArea(e820, &area[areanr]); + } + PHYMSPaceAreaSort(area, areanr); + msinfo->PMSPaceAreaPAddr = HalVAddrToPAddr((Addr)area); + msinfo->PMSPaceAreaNR = areanr; + msinfo->PMSPaceAreaCurr = 0; + msinfo->PMSPaceAreaSZ = areanr * (U64)(sizeof(PHYMSPaceArea)); return TRUE; } @@ -122,5 +215,6 @@ public Bool KrlMmMNodeInit() public Bool KrlMmManageInit() { + KrlMmPHYMSPaceAreaInit(); return TRUE; } \ No newline at end of file From 6a5c25cd4fb9f30f691717fea23f159c6dec0397 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 17 Sep 2021 11:20:57 +0800 Subject: [PATCH 054/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0DefaultMNodeInit?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 3 ++- Kernel/Memory/KrlMmManage.c | 33 +++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 56b27fc..c869a3f 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -45,7 +45,7 @@ #define MA_TYPE_KRNL 2 #define MA_TYPE_PROC 3 #define MA_TYPE_SHAR 4 -#define MEMAREA_MAX 4 +#define MEMAREA_MAX 5 #define MA_HWAD_LSTART 0 #define MA_HWAD_LSZ 0x2000000 #define MA_HWAD_LEND (MA_HWAD_LSTART+MA_HWAD_LSZ-1) @@ -283,6 +283,7 @@ private void PHYMSPaceAreaSwap(PHYMSPaceArea *s, PHYMSPaceArea *d); private void PHYMSPaceAreaSort(PHYMSPaceArea* area, U64 nr); public Bool KrlMmPHYMSPaceAreaInit(); public Bool KrlMmMAreaInit(); +private Bool DefaultMNodeInit(); public Bool KrlMmMNodeInit(); public Bool KrlMmManageInit(); #endif diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index cbb7b48..525fa59 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -207,8 +207,40 @@ public Bool KrlMmMAreaInit() return TRUE; } +private Bool DefaultMNodeInit() +{ + MNode* node = NULL; + MachStartInfo* msinfo = NULL; + + msinfo = HalExPGetMachStartInfoAddr(); + IF_NULL_DEAD(msinfo); + + node = (MNode*)HalExPBootAllocMem((Size)(sizeof(MNode))); + IF_NULL_DEAD(node); + + MNodeInit(node); + node->MAreaArr[MA_TYPE_HWAD].Type = MA_TYPE_HWAD; + node->MAreaArr[MA_TYPE_HWAD].LogicStart = MA_HWAD_LSTART; + node->MAreaArr[MA_TYPE_HWAD].LogicEnd = MA_HWAD_LEND; + node->MAreaArr[MA_TYPE_HWAD].LogicSZ = MA_HWAD_LSZ; + + node->MAreaArr[MA_TYPE_KRNL].Type = MA_TYPE_KRNL; + node->MAreaArr[MA_TYPE_KRNL].LogicStart = MA_KRNL_LSTART; + node->MAreaArr[MA_TYPE_KRNL].LogicEnd = MA_KRNL_LEND; + node->MAreaArr[MA_TYPE_KRNL].LogicSZ = MA_KRNL_LSZ; + + node->MAreaArr[MA_TYPE_PROC].Type = MA_TYPE_PROC; + node->MAreaArr[MA_TYPE_PROC].LogicStart = MA_PROC_LSTART; + node->MAreaArr[MA_TYPE_PROC].LogicEnd = MA_PROC_LEND; + node->MAreaArr[MA_TYPE_PROC].LogicSZ = MA_PROC_LSZ; + + node->MAreaArr[MA_TYPE_SHAR].Type = MA_TYPE_SHAR; + return TRUE; +} + public Bool KrlMmMNodeInit() { + DefaultMNodeInit(); return TRUE; } @@ -216,5 +248,6 @@ public Bool KrlMmMNodeInit() public Bool KrlMmManageInit() { KrlMmPHYMSPaceAreaInit(); + KrlMmMNodeInit(); return TRUE; } \ No newline at end of file From a3a104b204a0ff106000aacdef967963fe26e051 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 17 Sep 2021 16:13:17 +0800 Subject: [PATCH 055/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0IF=5FNULL=5FRETURN=5F?= =?UTF-8?q?NULL=E5=AE=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/BaseInc/BaseType.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Include/BaseInc/BaseType.h b/Include/BaseInc/BaseType.h index bf8416d..c788d39 100644 --- a/Include/BaseInc/BaseType.h +++ b/Include/BaseInc/BaseType.h @@ -49,6 +49,7 @@ typedef SInt DrvStus; #define IF_NULL_RETURN(ptr) if(NULL == ptr){return;} #define IF_NULL_RETURN_FALSE(ptr) if(NULL == ptr){return FALSE;} +#define IF_NULL_RETURN_NULL(ptr) if(NULL == ptr){return NULL;} #define IF_NULL_DEAD(ptr) if(NULL == ptr){KrlErrorCrashDead("OBJ PTR IS NULL!!");} #define INIT_OBJOFPTR_ZERO(ptr) HalMemSet((void*)ptr, 0, sizeof(typeof(*ptr))) From 0ec9cda41eded11caa4018113060b489469f1047 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 17 Sep 2021 16:15:02 +0800 Subject: [PATCH 056/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0PMSAD=20=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E6=95=B0=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 59 +++++++++++++++++++++++ Kernel/Memory/KrlMmManage.c | 3 ++ 2 files changed, 62 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index c869a3f..3915b7b 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -75,6 +75,11 @@ #define PMSA_F_ARM_32 (1<<2) #define PMSA_F_ARM_64 (1<<3) #define PMSA_F_HAL_MASK 0xff + +#define DefinedMEMData(vartype,varname) __attribute__((section(".mem.data"))) vartype varname + +#define PMSADDIRE_MAX (1 << 18) +#define PMSADDIRE_INDEX_BITS (30) //PMSAD标志 typedef struct PMSADFLAGS { @@ -207,6 +212,21 @@ typedef struct MAREA */ }MArea; +//PMSAD 目录项 +typedef struct PMSADDIRE +{ + union + { + PMSAD* DireStart; + U64 Entry; + }__attribute__((packed)); +}__attribute__((packed)) PMSADDire; + +//PMSAD 目录数组 +typedef struct PMSADDIREARR +{ + PMSADDire PMSADEArr[PMSADDIRE_MAX]; +}PMSADDireArr; /* @@ -228,6 +248,7 @@ typedef struct MNode Addr NodeMemResvAddrEnd; U64 NodeMemResvSize; MArea MAreaArr[MEMAREA_MAX]; + PMSADDireArr PMSADDir; }MNode; //Global Memory Manage //全局内存管理 @@ -269,6 +290,44 @@ KLINE Addr PMSADRetVAddr(PMSAD* msad) return HalPAddrToVAddr(PMSADRetPAddr(msad)); } + +KLINE GMemManage* KrlMmGetGMemManageAddr() +{ + return &GMemManageData; +} + +KLINE UInt PMASDDireIndex(U64 phyaddr) +{ + return (UInt)(phyaddr >> PMSADDIRE_INDEX_BITS); +} + +KLINE MNode* PHYAddrRetMNode(U64 phyaddr) +{ + GMemManage* gmm = NULL; + MNode* node = NULL; + gmm = KrlMmGetGMemManageAddr(); + for(U64 i = 0; i < gmm->MNodeNR; i++) + { + node = &gmm->MNodeStart[i]; + if(phyaddr < node->NodeMemAddrEnd && phyaddr > node->NodeMemAddrStart) + { + return node; + } + } + return NULL; +} + +KLINE PMSADDire* PHYAddrRetPMSADDire(U64 phyaddr) +{ + PMSADDire* dire = NULL; + MNode* node = NULL; + UInt index = PMSADDIRE_MAX; + node = PHYAddrRetMNode(phyaddr); + IF_NULL_RETURN_NULL(node); + index = PMASDDireIndex(phyaddr); + return &(node->PMSADDir.PMSADEArr[index]); +} + private void MLockInit(MLock* init); private void PHYMSPaceAreaInit(PHYMSPaceArea* init); private void PABHListInit(PABHList* init); diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index 525fa59..0b5cd4c 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -11,6 +11,8 @@ #include "HalInterface.h" #include "KrlMmManage.h" +DefinedMEMData(GMemManage, GMemManageData); + private void MLockInit(MLock* init) { IF_NULL_RETURN(init); @@ -247,6 +249,7 @@ public Bool KrlMmMNodeInit() public Bool KrlMmManageInit() { + GMemManageInit(&GMemManageData); KrlMmPHYMSPaceAreaInit(); KrlMmMNodeInit(); return TRUE; From e83a78a8641cc06ad5389a9e5d622a800de69aa8 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 17 Sep 2021 16:42:17 +0800 Subject: [PATCH 057/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0IF=5FNULL=5FRETURN=5F?= =?UTF-8?q?ZERO=E5=AE=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/BaseInc/BaseType.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Include/BaseInc/BaseType.h b/Include/BaseInc/BaseType.h index c788d39..f9b68f4 100644 --- a/Include/BaseInc/BaseType.h +++ b/Include/BaseInc/BaseType.h @@ -50,6 +50,7 @@ typedef SInt DrvStus; #define IF_NULL_RETURN(ptr) if(NULL == ptr){return;} #define IF_NULL_RETURN_FALSE(ptr) if(NULL == ptr){return FALSE;} #define IF_NULL_RETURN_NULL(ptr) if(NULL == ptr){return NULL;} +#define IF_NULL_RETURN_ZERO(ptr) if(NULL == ptr){return 0;} #define IF_NULL_DEAD(ptr) if(NULL == ptr){KrlErrorCrashDead("OBJ PTR IS NULL!!");} #define INIT_OBJOFPTR_ZERO(ptr) HalMemSet((void*)ptr, 0, sizeof(typeof(*ptr))) From 306004cef41e82f25234cd67d824cb6bcfc06f4c Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 17 Sep 2021 17:53:16 +0800 Subject: [PATCH 058/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0PMSADDireIsHave?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 3915b7b..9e563f8 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -296,7 +296,7 @@ KLINE GMemManage* KrlMmGetGMemManageAddr() return &GMemManageData; } -KLINE UInt PMASDDireIndex(U64 phyaddr) +KLINE UInt PMSADDireIndex(U64 phyaddr) { return (UInt)(phyaddr >> PMSADDIRE_INDEX_BITS); } @@ -324,10 +324,20 @@ KLINE PMSADDire* PHYAddrRetPMSADDire(U64 phyaddr) UInt index = PMSADDIRE_MAX; node = PHYAddrRetMNode(phyaddr); IF_NULL_RETURN_NULL(node); - index = PMASDDireIndex(phyaddr); + index = PMSADDireIndex(phyaddr); return &(node->PMSADDir.PMSADEArr[index]); } +KLINE Bool PMSADDireIsHave(PMSADDire* dire) +{ + IF_NULL_DEAD(dire); + if(0 < dire->Entry) + { + return TRUE; + } + return FALSE; +} + private void MLockInit(MLock* init); private void PHYMSPaceAreaInit(PHYMSPaceArea* init); private void PABHListInit(PABHList* init); From e3b8a6cb0fdcf8ce7eb3548e0bd62c0cb36eeb91 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sat, 18 Sep 2021 16:31:37 +0800 Subject: [PATCH 059/221] =?UTF-8?q?=E5=AE=8C=E5=96=84KrlMmPMSADInit?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 8 + Kernel/Memory/KrlMmManage.c | 191 +++++++++++++++++++++- 2 files changed, 198 insertions(+), 1 deletion(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 9e563f8..4b4469f 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -80,6 +80,7 @@ #define PMSADDIRE_MAX (1 << 18) #define PMSADDIRE_INDEX_BITS (30) +#define PMSADDIRE_SIZE (1 << PMSADDIRE_INDEX_BITS) //PMSAD标志 typedef struct PMSADFLAGS { @@ -243,6 +244,8 @@ typedef struct MNode UInt CPUID; Addr NodeMemAddrStart; Addr NodeMemAddrEnd; + PHYMSPaceArea* PMSAreaPtr; + U64 PMSAreaNR; U64 NodeMemSize; Addr NodeMemResvAddrStart; Addr NodeMemResvAddrEnd; @@ -301,6 +304,11 @@ KLINE UInt PMSADDireIndex(U64 phyaddr) return (UInt)(phyaddr >> PMSADDIRE_INDEX_BITS); } +KLINE UInt PMSADIndex(U64 phyaddr) +{ + return (UInt)((phyaddr & (PMSADDIRE_SIZE -1)) >> PAGPHYADR_SZLSHBIT); +} + KLINE MNode* PHYAddrRetMNode(U64 phyaddr) { GMemManage* gmm = NULL; diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index 0b5cd4c..8940e16 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -181,14 +181,189 @@ private void PHYMSPaceAreaSort(PHYMSPaceArea* area, U64 nr) return; } +private Bool SetPMSADInMNodeMAreaInfo(MNode* node, PMSAD* msad) +{ + Addr paddr = 0; + IF_NULL_RETURN_FALSE(node); + IF_NULL_RETURN_FALSE(msad); + + paddr = PMSADRetPAddr(msad); + + for(U64 i = 0; i < MEMAREA_MAX; i++) + { + if((node->MAreaArr[i].LogicStart <= paddr) && (paddr < node->MAreaArr[i].LogicEnd)) + { + switch (node->MAreaArr[i].Type) + { + case MA_TYPE_HWAD: + { + msad->CountFlags.AreaTypeBit = MF_MARTY_HWD; + return TRUE; + } + case MA_TYPE_KRNL: + { + msad->CountFlags.AreaTypeBit = MF_MARTY_KRL; + return TRUE; + } + case MA_TYPE_PROC: + { + msad->CountFlags.AreaTypeBit = MF_MARTY_PRC; + return TRUE; + } + case MA_TYPE_SHAR: + { + msad->CountFlags.AreaTypeBit = MF_MARTY_SHD; + return TRUE; + } + default: + { + return FALSE; + } + } + } + } + return FALSE; +} + +private PMSAD* NewOnePMSAD(MNode* node, PHYMSPaceArea* area, PMSADDire* dire, U64 paddr) +{ + PhyAddrFlags* tmp = NULL; + PMSAD* msadstart = NULL; + UInt index = 0; + IF_NULL_RETURN_NULL(node); + IF_NULL_RETURN_NULL(area); + IF_NULL_RETURN_NULL(dire); + + msadstart = dire->DireStart; + IF_NULL_RETURN_NULL(msadstart); + + index = PMSADIndex(paddr); + + PMSADInit(&msadstart[index]); + PhyAddrFlags* tmp = (PhyAddrFlags*)(&paddr); + msadstart[index].PhyAddr.PAddrBit = tmp->PAddrBit; + + SetPMSADInMNodeMAreaInfo(node, &msadstart[index]); + return &msadstart[index]; +} + +private UInt PMSADInitOnPHYMSPaceArea(MNode* node, PMSADDire* dire, PHYMSPaceArea* area, U64 start, U64 end) +{ + UInt count = 0; + PMSAD* pstart = NULL; + IF_NULL_RETURN_ZERO(node); + IF_NULL_RETURN_ZERO(dire); + IF_NULL_RETURN_ZERO(area); + for(U64 paddr = area->Start; (paddr + (MSA_SIZE - 1)) < area->End; paddr += MSA_SIZE) + { + if((start <= paddr) && (paddr < end)) + { + NewOnePMSAD(node, area, dire, paddr); + count++; + } + + } + return count; +} + +private PMSAD* PMSADDireIsNeedAllocMemory(U64 start, U64 end) +{ + PHYMSPaceArea* pmsarea = NULL; + GMemManage* gmm = NULL; + + gmm = KrlMmGetGMemManageAddr(); + IF_NULL_RETURN_NULL(gmm); + + pmsarea = gmm->PAreaStart; + for(U64 i = 0; i < gmm->PAreaNR; i++) + { + if(PMSA_T_OSAPUSERRAM == pmsarea[i].Type) + { + for(U64 paddr = pmsarea[i]->Start; (paddr + (MSA_SIZE - 1)) < pmsarea[i]->End; paddr += MSA_SIZE) + { + if((start <= paddr) && (paddr < end)) + { + return HalExPBootAllocMem((Size)((PMSADDIRE_SIZE >> PAGPHYADR_SZLSHBIT) * sizeof(PMSAD))); + } + } + } + } + return NULL; +} + +private Bool PMSADInitOnMNode(MNode* node) +{ + PHYMSPaceArea* pmsarea = NULL; + GMemManage* gmm = NULL; + PMSADDire* dire = NULL; + PMSAD* msad = NULL; + U64 addrstart = 0; + U64 addrend = 0; + UInt msadnr = 0; + + IF_NULL_RETURN_FALSE(node); + gmm = KrlMmGetGMemManageAddr(); + IF_NULL_DEAD(gmm); + + pmsarea = gmm->PAreaStart; + for(U64 d = 0; d < PMSADDIRE_MAX; d++) + { + dire = &node->PMSADDir.PMSADEArr[d]; + addrstart = d * PMSADDIRE_SIZE; + addrend = addrstart + PMSADDIRE_SIZE; + + msad = PMSADDireIsNeedAllocMemory(addrstart, addrend); + if(NULL == msad) + { + continue; + } + + dire->DireStart = msad; + + for(U64 i = 0; i < gmm->PAreaNR; i++) + { + if(PMSA_T_OSAPUSERRAM == pmsarea[i].Type) + { + msadnr += PMSADInitOnPHYMSPaceArea(node, dire, &pmsarea[i], addrstart, addrend); + } + } + } + return TRUE; +} + +public Bool KrlMmPMSADInit() +{ + PHYMSPaceArea* pmsarea = NULL; + GMemManage* gmm = NULL; + MNode* node = NULL; + UInt msadnr = 0; + + gmm = KrlMmGetGMemManageAddr(); + IF_NULL_DEAD(gmm); + + node = gmm->MNodeStart; + for(U64 i = 0; i < gmm->MNodeNR; i++) + { + PMSADInitOnMNode(&node[i]); + } + + return TRUE; +} + public Bool KrlMmPHYMSPaceAreaInit() { PHYMSPaceArea* area = NULL; E820Map* e820 = NULL; + GMemManage* gmm = NULL; MachStartInfo* msinfo = NULL; U64 areanr= 0; + msinfo = HalExPGetMachStartInfoAddr(); IF_NULL_DEAD(msinfo); + + gmm = KrlMmGetGMemManageAddr(); + IF_NULL_DEAD(gmm); + area = HalExPBootAllocMem((Size)(msinfo->E820NR * sizeof(PHYMSPaceArea))); IF_NULL_RETURN_FALSE(area); for ( ;e820 != NULL; areanr++) @@ -201,6 +376,8 @@ public Bool KrlMmPHYMSPaceAreaInit() msinfo->PMSPaceAreaNR = areanr; msinfo->PMSPaceAreaCurr = 0; msinfo->PMSPaceAreaSZ = areanr * (U64)(sizeof(PHYMSPaceArea)); + gmm->PAreaStart = area; + gmm->PAreaNR = areanr; return TRUE; } @@ -213,10 +390,14 @@ private Bool DefaultMNodeInit() { MNode* node = NULL; MachStartInfo* msinfo = NULL; - + GMemManage* gmm = NULL; + msinfo = HalExPGetMachStartInfoAddr(); IF_NULL_DEAD(msinfo); + gmm = KrlMmGetGMemManageAddr(); + IF_NULL_DEAD(gmm); + node = (MNode*)HalExPBootAllocMem((Size)(sizeof(MNode))); IF_NULL_DEAD(node); @@ -237,6 +418,13 @@ private Bool DefaultMNodeInit() node->MAreaArr[MA_TYPE_PROC].LogicSZ = MA_PROC_LSZ; node->MAreaArr[MA_TYPE_SHAR].Type = MA_TYPE_SHAR; + + node->PMSAreaPtr = gmm->PAreaStart; + node->PMSAreaNR = gmm->PAreaNR; + + gmm->MNodeStart = node; + gmm->MNodeNR = 1; + return TRUE; } @@ -252,5 +440,6 @@ public Bool KrlMmManageInit() GMemManageInit(&GMemManageData); KrlMmPHYMSPaceAreaInit(); KrlMmMNodeInit(); + KrlMmPMSADInit(); return TRUE; } \ No newline at end of file From 83d9903bf7486b0132525c379b133ea708c780d6 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sat, 18 Sep 2021 17:21:21 +0800 Subject: [PATCH 060/221] =?UTF-8?q?=E4=BF=AE=E6=94=B9PMSADInitOnPHYMSPaceA?= =?UTF-8?q?rea=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 7 +++++++ Kernel/Memory/KrlMmManage.c | 8 +++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 4b4469f..c8a1b25 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -348,6 +348,7 @@ KLINE Bool PMSADDireIsHave(PMSADDire* dire) private void MLockInit(MLock* init); private void PHYMSPaceAreaInit(PHYMSPaceArea* init); +private void PMSADInit(PMSAD* init); private void PABHListInit(PABHList* init); private void MSPlitMerInit(MSPlitMer* init); private void MAreaInit(MArea* init); @@ -358,6 +359,12 @@ public void KrlMmUnLock(MLock* lock); private Bool NewOnePHYMSPaceArea(E820Map* e820, PHYMSPaceArea* area); private void PHYMSPaceAreaSwap(PHYMSPaceArea *s, PHYMSPaceArea *d); private void PHYMSPaceAreaSort(PHYMSPaceArea* area, U64 nr); +private Bool SetPMSADInMNodeMAreaInfo(MNode* node, PMSAD* msad); +private PMSAD* NewOnePMSAD(MNode* node, PHYMSPaceArea* area, PMSADDire* dire, U64 paddr); +private UInt PMSADInitOnPHYMSPaceArea(MNode* node, PMSADDire* dire, PHYMSPaceArea* area, U64 start, U64 end); +private PMSAD* PMSADDireIsNeedAllocMemory(U64 start, U64 end); +private Bool PMSADInitOnMNode(MNode* node); +public Bool KrlMmPMSADInit(); public Bool KrlMmPHYMSPaceAreaInit(); public Bool KrlMmMAreaInit(); private Bool DefaultMNodeInit(); diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index 8940e16..1be96d1 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -258,10 +258,12 @@ private UInt PMSADInitOnPHYMSPaceArea(MNode* node, PMSADDire* dire, PHYMSPaceAre { if((start <= paddr) && (paddr < end)) { - NewOnePMSAD(node, area, dire, paddr); - count++; + pstart = NewOnePMSAD(node, area, dire, paddr); + if(NULL != pstart) + { + count++; + } } - } return count; } From e562f942141f21dfbc3864c5b7ba32024938b105 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 22 Sep 2021 14:48:06 +0800 Subject: [PATCH 061/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E6=93=8D=E4=BD=9CPMSAD=E7=9A=84=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 75 +++++++++++++++++++++-- 1 file changed, 71 insertions(+), 4 deletions(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index c8a1b25..6b59c24 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -6,9 +6,11 @@ #ifndef _KRLMMMANAGEHEAD #define _KRLMMMANAGEHEAD -#define PAGPHYADR_SZLSHBIT (12) +#define MSAD_PADR_SLBITS (12) #define MSAD_PAGE_MAX (8) -#define MSA_SIZE (1 << PAGPHYADR_SZLSHBIT) +#define MSAD_SIZE (1 << MSAD_PADR_SLBITS) +#define MSAD_ALIGN(n) ALIGN(n, MSAD_SIZE) +#define MSAD_MASK (~(MSAD_SIZE-1)) #define MF_OLKTY_INIT (0) #define MF_OLKTY_ODER (1) @@ -281,7 +283,7 @@ KLINE Addr PMSADRetPAddr(PMSAD* msad) { return NULL; } - return (msad->PhyAddr.PAddrBit << PAGPHYADR_SZLSHBIT); + return (msad->PhyAddr.PAddrBit << MSAD_PADR_SLBITS); } KLINE Addr PMSADRetVAddr(PMSAD* msad) @@ -293,6 +295,63 @@ KLINE Addr PMSADRetVAddr(PMSAD* msad) return HalPAddrToVAddr(PMSADRetPAddr(msad)); } +KLINE Bool PMSADIsFree(PMSAD* msad) +{ + IF_NULL_DEAD(msad); + if(MF_MOCTY_FREE != msad->CountFlags.OccupancyTypeBit || + 0 != msad->CountFlags.RefCountBit || PAF_NO_ALLOC != msad->PhyAddr.AllocBit) + { + return FALSE; + } + return TRUE; +} + +KLINE void SetPMSADOccupancyType(PMSAD* msad, U32 occupancytype) +{ + IF_NULL_DEAD(msad); + if(MF_MOCTY_USER < occupancytype) + { + return; + } + msad->CountFlags.OccupancyTypeBit = occupancytype; + return; +} + +KLINE void SetPMSADAllocBit(PMSAD* msad) +{ + IF_NULL_DEAD(msad); + msad->PhyAddr.AllocBit = PAF_ALLOC; + return; +} + +KLINE void ClearPMSADAllocBit(PMSAD* msad) +{ + IF_NULL_DEAD(msad); + msad->PhyAddr.AllocBit = 0; + return; +} + +KLINE void GetPMSAD(PMSAD* msad) +{ + IF_NULL_DEAD(msad); + if(MF_UINDX_MAX <= msad->CountFlags.RefCountBit) + { + return; + } + msad->CountFlags.RefCountBit++; + return; +} + +KLINE void PutPMSAD(PMSAD* msad) +{ + IF_NULL_DEAD(msad); + if(1 > msad->CountFlags.RefCountBit) + { + return; + } + msad->CountFlags.RefCountBit--; + return; +} KLINE GMemManage* KrlMmGetGMemManageAddr() { @@ -306,7 +365,7 @@ KLINE UInt PMSADDireIndex(U64 phyaddr) KLINE UInt PMSADIndex(U64 phyaddr) { - return (UInt)((phyaddr & (PMSADDIRE_SIZE -1)) >> PAGPHYADR_SZLSHBIT); + return (UInt)((phyaddr & (PMSADDIRE_SIZE -1)) >> MSAD_PADR_SLBITS); } KLINE MNode* PHYAddrRetMNode(U64 phyaddr) @@ -336,6 +395,14 @@ KLINE PMSADDire* PHYAddrRetPMSADDire(U64 phyaddr) return &(node->PMSADDir.PMSADEArr[index]); } +KLINE PMSAD* PHYAddrRetPMSAD(U64 phyaddr) +{ + PMSADDire* dire = NULL; + dire = PHYAddrRetPMSADDire(phyaddr); + IF_NULL_RETURN_NULL(dire); + return &dire->DireStart[PMSADIndex(phyaddr)]; +} + KLINE Bool PMSADDireIsHave(PMSADDire* dire) { IF_NULL_DEAD(dire); From fef7b064413276baaba33ef0f5edfe20e7978e27 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 22 Sep 2021 14:49:26 +0800 Subject: [PATCH 062/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=89=AB=E6=8F=8FPMS?= =?UTF-8?q?AD=E5=B7=B2=E7=BB=8F=E5=8D=A0=E7=94=A8=E7=9A=84=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmManage.c | 47 ++++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index 1be96d1..2d8bf60 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -254,7 +254,7 @@ private UInt PMSADInitOnPHYMSPaceArea(MNode* node, PMSADDire* dire, PHYMSPaceAre IF_NULL_RETURN_ZERO(node); IF_NULL_RETURN_ZERO(dire); IF_NULL_RETURN_ZERO(area); - for(U64 paddr = area->Start; (paddr + (MSA_SIZE - 1)) < area->End; paddr += MSA_SIZE) + for(U64 paddr = area->Start; (paddr + (MSAD_SIZE - 1)) < area->End; paddr += MSAD_SIZE) { if((start <= paddr) && (paddr < end)) { @@ -281,11 +281,11 @@ private PMSAD* PMSADDireIsNeedAllocMemory(U64 start, U64 end) { if(PMSA_T_OSAPUSERRAM == pmsarea[i].Type) { - for(U64 paddr = pmsarea[i]->Start; (paddr + (MSA_SIZE - 1)) < pmsarea[i]->End; paddr += MSA_SIZE) + for(U64 paddr = pmsarea[i]->Start; (paddr + (MSAD_SIZE - 1)) < pmsarea[i]->End; paddr += MSAD_SIZE) { if((start <= paddr) && (paddr < end)) { - return HalExPBootAllocMem((Size)((PMSADDIRE_SIZE >> PAGPHYADR_SZLSHBIT) * sizeof(PMSAD))); + return HalExPBootAllocMem((Size)((PMSADDIRE_SIZE >> MSAD_PADR_SLBITS) * sizeof(PMSAD))); } } } @@ -333,6 +333,46 @@ private Bool PMSADInitOnMNode(MNode* node) return TRUE; } +private Bool ScanOccupancyPMSADOnAddr(Addr start, Addr end) +{ + Addr tmpstart = 0; + Addr tmpend = 0; + MNode* node = NULL; + PMSADDire* dire = NULL; + PMSAD* msad = NULL; + + tmpstart = (start & MSAD_MASK); + tmpend = MSAD_ALIGN(end); + + for(Addr paddr = tmpstart; paddr < tmpend; paddr += MSAD_SIZE) + { + msad = PHYAddrRetPMSAD(paddr); + IF_NULL_RETURN_FALSE(msad); + if(PMSADIsFree(msad) == TRUE) + { + SetPMSADOccupancyType(msad, MF_MOCTY_KRNL); + GetPMSAD(msad); + SetPMSADAllocBit(msad); + } + + } + return TRUE; +} + +public Bool KrlMmScanOccupancyPMSAD() +{ + MachStartInfo* msinfo = NULL; + msinfo = HalExPGetMachStartInfoAddr(); + IF_NULL_RETURN_FALSE(msinfo); + + ScanOccupancyPMSADOnAddr(0, 0x1000 - 1); + ScanOccupancyPMSADOnAddr((Addr)(msinfo->KrlInitStack & MSAD_MASK), (Addr)msinfo->KrlInitStack); + ScanOccupancyPMSADOnAddr((Addr)(msinfo->krlCoreFilePAddr), (Addr)(msinfo->krlCoreFilePAddr + msinfo->krlCoreFileSZ)); + // ScanOccupancyPMSADOnAddr((Addr)(msinfo->KrlImgFilePAddr), (Addr)(msinfo->KrlImgFilePAddr + msinfo->KrlImgFileSZ)); + ScanOccupancyPMSADOnAddr((Addr)msinfo->BrkCurrAddr, (Addr)msinfo->BrkCurrAddr); + return TRUE; +} + public Bool KrlMmPMSADInit() { PHYMSPaceArea* pmsarea = NULL; @@ -443,5 +483,6 @@ public Bool KrlMmManageInit() KrlMmPHYMSPaceAreaInit(); KrlMmMNodeInit(); KrlMmPMSADInit(); + KrlMmScanOccupancyPMSAD(); return TRUE; } \ No newline at end of file From e747314c2ecfb8e07fae58c886bb4e84bfadab63 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 22 Sep 2021 16:15:27 +0800 Subject: [PATCH 063/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=89=AB=E6=8F=8FPMS?= =?UTF-8?q?AD=E5=B7=B2=E7=BB=8F=E5=8D=A0=E7=94=A8=E7=9A=84=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E7=9A=84=E7=94=B3=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 6b59c24..d7a60db 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -431,6 +431,8 @@ private PMSAD* NewOnePMSAD(MNode* node, PHYMSPaceArea* area, PMSADDire* dire, U6 private UInt PMSADInitOnPHYMSPaceArea(MNode* node, PMSADDire* dire, PHYMSPaceArea* area, U64 start, U64 end); private PMSAD* PMSADDireIsNeedAllocMemory(U64 start, U64 end); private Bool PMSADInitOnMNode(MNode* node); +private Bool ScanOccupancyPMSADOnAddr(Addr start, Addr end); +public Bool KrlMmScanOccupancyPMSAD(); public Bool KrlMmPMSADInit(); public Bool KrlMmPHYMSPaceAreaInit(); public Bool KrlMmMAreaInit(); From c0c29f42a3ec05574d33d7ff6a0f5676d9645506 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 22 Sep 2021 17:33:44 +0800 Subject: [PATCH 064/221] =?UTF-8?q?=E4=BF=AE=E6=94=B9SetPMSADInMNodeMAreaI?= =?UTF-8?q?nfo=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmManage.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index 2d8bf60..4462130 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -191,7 +191,7 @@ private Bool SetPMSADInMNodeMAreaInfo(MNode* node, PMSAD* msad) for(U64 i = 0; i < MEMAREA_MAX; i++) { - if((node->MAreaArr[i].LogicStart <= paddr) && (paddr < node->MAreaArr[i].LogicEnd)) + if((node->MAreaArr[i].LogicStart <= paddr) && ((paddr + MSAD_SIZE) < node->MAreaArr[i].LogicEnd)) { switch (node->MAreaArr[i].Type) { @@ -423,8 +423,40 @@ public Bool KrlMmPHYMSPaceAreaInit() return TRUE; } +private Bool OneMAreaInitOnMNode(MNode* node, MArea* area) +{ + IF_NULL_RETURN_FALSE(node); + IF_NULL_RETURN_FALSE(area); + +} + +private Bool MAreaInitOnMNode(MNode* node) +{ + MArea* area = NULL; + IF_NULL_RETURN_FALSE(node); + area = node->MAreaArr; + for(UInt i = 0; i < MEMAREA_MAX; i++) + { + OneMAreaInitOnMNode(node, &area[i]); + } + return TRUE; +} + public Bool KrlMmMAreaInit() { + MNode* node = NULL; + MachStartInfo* msinfo = NULL; + GMemManage* gmm = NULL; + gmm = KrlMmGetGMemManageAddr(); + IF_NULL_DEAD(gmm); + + node = gmm->MNodeStart; + IF_NULL_RETURN_FALSE(node); + + for(UInt i = 0; i < gmm->MNodeNR; i++) + { + MAreaInitOnMNode(&node[i]); + } return TRUE; } From ab68a75c7722dee2ac1e2cf3c799f14012b64b46 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 22 Sep 2021 18:01:31 +0800 Subject: [PATCH 065/221] =?UTF-8?q?=E4=BF=AE=E6=94=B9NewOnePMSAD=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmManage.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index 4462130..bd66c2a 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -240,7 +240,7 @@ private PMSAD* NewOnePMSAD(MNode* node, PHYMSPaceArea* area, PMSADDire* dire, U6 index = PMSADIndex(paddr); PMSADInit(&msadstart[index]); - PhyAddrFlags* tmp = (PhyAddrFlags*)(&paddr); + tmp = (PhyAddrFlags*)(&paddr); msadstart[index].PhyAddr.PAddrBit = tmp->PAddrBit; SetPMSADInMNodeMAreaInfo(node, &msadstart[index]); From 5d0d9b96a0711854dede314e9670702ff010a223 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 24 Sep 2021 16:41:44 +0800 Subject: [PATCH 066/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0PMSADIsAdjacent?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index d7a60db..8896b21 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -83,6 +83,7 @@ #define PMSADDIRE_MAX (1 << 18) #define PMSADDIRE_INDEX_BITS (30) #define PMSADDIRE_SIZE (1 << PMSADDIRE_INDEX_BITS) +#define PMSADDIRE_PMSAD_NR (PMSADDIRE_SIZE >> MSAD_PADR_SLBITS) //PMSAD标志 typedef struct PMSADFLAGS { @@ -295,6 +296,24 @@ KLINE Addr PMSADRetVAddr(PMSAD* msad) return HalPAddrToVAddr(PMSADRetPAddr(msad)); } +KLINE Bool PMSADIsAdjacent(PMSAD* curr, PMSAD* next) +{ + Addr curraddr = 0; + Addr nextaddr = 0; + + if((curr + 1) != next) + { + return FALSE; + } + curraddr = PMSADRetPAddr(curr); + nextaddr = PMSADRetPAddr(next); + if((nextaddr - curraddr) != MSAD_SIZE) + { + return FALSE; + } + return TRUE; +} + KLINE Bool PMSADIsFree(PMSAD* msad) { IF_NULL_DEAD(msad); From b47e586789754be3709ed77201fabf0305d97555 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 24 Sep 2021 16:42:57 +0800 Subject: [PATCH 067/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0PMSADIsFreeAlsoAdjace?= =?UTF-8?q?nt=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 8896b21..34ae27b 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -325,6 +325,18 @@ KLINE Bool PMSADIsFree(PMSAD* msad) return TRUE; } +KLINE Bool PMSADIsFreeAlsoAdjacent(PMSAD* curr, PMSAD* next) +{ + if((PMSADIsFree(curr) == TRUE) && (PMSADIsFree(next) == TRUE)) + { + if(PMSADIsAdjacent(curr, next) == TRUE) + { + return TRUE; + } + } + return FALSE; +} + KLINE void SetPMSADOccupancyType(PMSAD* msad, U32 occupancytype) { IF_NULL_DEAD(msad); From 4bdb93c9af83a270e993c1466ca5537ca370ae46 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 24 Sep 2021 16:50:01 +0800 Subject: [PATCH 068/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0PMSADIsEQAreaType?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 34ae27b..1008a61 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -337,6 +337,18 @@ KLINE Bool PMSADIsFreeAlsoAdjacent(PMSAD* curr, PMSAD* next) return FALSE; } +KLINE Bool PMSADIsEQAreaType(PMSAD* msad, UInt areatype) +{ + UInt type = 0; + IF_NULL_DEAD(msad); + type = (UInt)(msad->CountFlags.AreaTypeBit); + if(type == areatype) + { + return TRUE; + } + return FALSE; +} + KLINE void SetPMSADOccupancyType(PMSAD* msad, U32 occupancytype) { IF_NULL_DEAD(msad); From ce0ff00a8eb856082e38c31da23c8ff576afe0d0 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 24 Sep 2021 16:59:41 +0800 Subject: [PATCH 069/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=89=AB=E6=8F=8F?= =?UTF-8?q?=E5=90=8C=E4=B8=80=E5=86=85=E5=AD=98=E5=8C=BA=E7=9A=84=E7=A9=BA?= =?UTF-8?q?=E9=97=B2=E4=B8=94=E5=9C=B0=E5=9D=80=E8=BF=9E=E7=BB=AD=E7=9A=84?= =?UTF-8?q?PMSAD=E7=9A=84=E5=90=84=E4=B8=AA=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 9 ++ Kernel/Memory/KrlMmManage.c | 154 ++++++++++++++++++++++ 2 files changed, 163 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 1008a61..2e966d2 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -478,6 +478,15 @@ private Bool ScanOccupancyPMSADOnAddr(Addr start, Addr end); public Bool KrlMmScanOccupancyPMSAD(); public Bool KrlMmPMSADInit(); public Bool KrlMmPHYMSPaceAreaInit(); +private UInt ScanContinuousAddrPMSADsLen(PMSAD* start, PMSAD* end); +private UInt ScanContinuousAddrPMSADs(MNode* node, MArea* area, PMSAD* start, PMSAD* end); +private UInt ScanContinuousFreePMSADsLen(PMSAD* start, PMSAD* end); +private UInt ScanContinuousFreePMSADs(MNode* node, MArea* area, PMSAD* start, PMSAD* end); +private UInt ScanSameAreaTypePMSADsLen(PMSAD* start, PMSAD* end, UInt areatype); +private UInt ScanSameAreaTypePMSADs(MNode* node, MArea* area, PMSAD* start, PMSAD* end); +private UInt PMSADBlockInitOnPMSADDire(MNode* node, MArea* area, PMSADDire* dire); +private Bool OneMAreaInitOnMNode(MNode* node, MArea* area); +private Bool MAreaInitOnMNode(MNode* node); public Bool KrlMmMAreaInit(); private Bool DefaultMNodeInit(); public Bool KrlMmMNodeInit(); diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index bd66c2a..5d0d272 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -423,11 +423,165 @@ public Bool KrlMmPHYMSPaceAreaInit() return TRUE; } +private UInt ScanContinuousAddrPMSADsLen(PMSAD* start, PMSAD* end) +{ + PMSAD* msad = NULL; + UInt count = 1; + if(start == end) + { + return 1; + } + msad = start + 1; + while(msad <= end) + { + if(PMSADIsAdjacent(msad - 1, msad) == FALSE) + { + return count; + } + count++; + msad++; + } + return count; +} + +private UInt ScanContinuousAddrPMSADs(MNode* node, MArea* area, PMSAD* start, PMSAD* end) +{ + PMSAD* msad = NULL; + UInt count = 0; + UInt sum = 0; + msad = start; + while(msad <= end) + { + count = ScanContinuousAddrPMSADsLen(msad, end); + if(0 < count) + { + // + msad += count; + } + else + { + msad++; + } + } + return sum; +} + +private UInt ScanContinuousFreePMSADsLen(PMSAD* start, PMSAD* end) +{ + PMSAD* msad = NULL; + UInt count = 0; + msad = start; + while(msad <= end) + { + if(PMSADIsFree(msad) == FALSE) + { + return count; + } + count++; + msad++; + } + return count; +} + +private UInt ScanContinuousFreePMSADs(MNode* node, MArea* area, PMSAD* start, PMSAD* end) +{ + PMSAD* msad = NULL; + UInt count = 0; + UInt sum = 0; + msad = start; + while(msad <= end) + { + count = ScanContinuousFreePMSADsLen(msad, end); + if(0 < count) + { + sum += ScanContinuousAddrPMSADs(node, area, msad, &msad[count - 1]); + msad += count; + } + else + { + msad++; + } + } + return sum; +} + +private UInt ScanSameAreaTypePMSADsLen(PMSAD* start, PMSAD* end, UInt areatype) +{ + PMSAD* msad = NULL; + UInt count = 0; + msad = start; + while(msad <= end) + { + if(PMSADIsEQAreaType(msad, areatype) == FALSE) + { + return count; + } + count++; + msad++; + } + return count; +} + +private UInt ScanSameAreaTypePMSADs(MNode* node, MArea* area, PMSAD* start, PMSAD* end) +{ + PMSAD* msad = NULL; + UInt count = 0; + UInt sum = 0; + UInt typecount = 0; + UInt areatype = 0; + + areatype = area->Type; + + msad = start; + + while(msad <= end) + { + count = ScanSameAreaTypePMSADsLen(msad, end, areatype); + if(0 < count) + { + sum += ScanContinuousFreePMSADs(node, area, msad, &msad[count - 1]); + msad += count; + } + else + { + msad++; + } + } + + return sum; +} + +private UInt PMSADBlockInitOnPMSADDire(MNode* node, MArea* area, PMSADDire* dire) +{ + SInt count = 0; + SInt maxcount = 0; + PMSAD* scanend = NULL; + PMSAD* next = NULL; + PMSAD* start = NULL; + PMSAD* end = NULL; + + IF_NULL_RETURN_ZERO(node); + IF_NULL_RETURN_ZERO(area); + IF_NULL_RETURN_ZERO(dire); + IF_NULL_RETURN_ZERO(dire->DireStart); + + start = dire->DireStart; + end = &start[(PMSADDIRE_PMSAD_NR - 1)]; + return ScanSameAreaTypePMSADs(node, area, start, end); +} + private Bool OneMAreaInitOnMNode(MNode* node, MArea* area) { + PMSADDire* dire = NULL; IF_NULL_RETURN_FALSE(node); IF_NULL_RETURN_FALSE(area); + dire = node->PMSADDir.PMSADEArr; + for(UInt i = 0; i < PMSADDIRE_MAX; i++) + { + PMSADBlockInitOnPMSADDire(node, area, &dire[i]); + } + return TRUE; } private Bool MAreaInitOnMNode(MNode* node) From 6c57bfe85434ceff06c4754704eb03a8891c5d8b Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sun, 26 Sep 2021 10:49:57 +0800 Subject: [PATCH 070/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0SetPMSADBlockLink?= =?UTF-8?q?=E3=80=81ClearPMSADBlockLink=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 2e966d2..99ae3fc 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -374,6 +374,20 @@ KLINE void ClearPMSADAllocBit(PMSAD* msad) return; } +KLINE void SetPMSADBlockLink(PMSAD* msad, void* link) +{ + IF_NULL_DEAD(msad); + msad->BlockLink = link; + return; +} + +KLINE void ClearPMSADBlockLink(PMSAD* msad) +{ + IF_NULL_DEAD(msad); + msad->BlockLink = NULL; + return; +} + KLINE void GetPMSAD(PMSAD* msad) { IF_NULL_DEAD(msad); From 6931d5cab879a6be7b1e992f73c84191a9dfeb61 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sun, 26 Sep 2021 11:20:04 +0800 Subject: [PATCH 071/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0SetPMSADOLType?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 99ae3fc..9cddcbc 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -349,6 +349,17 @@ KLINE Bool PMSADIsEQAreaType(PMSAD* msad, UInt areatype) return FALSE; } +KLINE void SetPMSADOLType(PMSAD* msad, U32 oltype) +{ + IF_NULL_DEAD(msad); + if(MF_OLKTY_TOBJ < oltype) + { + return; + } + msad->CountFlags.OLTypeBit = oltype; + return; +} + KLINE void SetPMSADOccupancyType(PMSAD* msad, U32 occupancytype) { IF_NULL_DEAD(msad); From cf0be47477de81c015cfb39068d2b345c5fc3dc5 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sun, 26 Sep 2021 11:22:18 +0800 Subject: [PATCH 072/221] =?UTF-8?q?=E4=BF=AE=E6=94=B9SetPMSADAlloc?= =?UTF-8?q?=E3=80=81ClearPMSADAlloc=E5=87=BD=E6=95=B0=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 9cddcbc..9f5657a 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -371,14 +371,14 @@ KLINE void SetPMSADOccupancyType(PMSAD* msad, U32 occupancytype) return; } -KLINE void SetPMSADAllocBit(PMSAD* msad) +KLINE void SetPMSADAlloc(PMSAD* msad) { IF_NULL_DEAD(msad); msad->PhyAddr.AllocBit = PAF_ALLOC; return; } -KLINE void ClearPMSADAllocBit(PMSAD* msad) +KLINE void ClearPMSADAlloc(PMSAD* msad) { IF_NULL_DEAD(msad); msad->PhyAddr.AllocBit = 0; From 15065a176381f4095dccf3af463bcca5d1c1d38c Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sun, 26 Sep 2021 11:37:00 +0800 Subject: [PATCH 073/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0RetOrderInPMSADsNR?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 1 + Kernel/Memory/KrlMmManage.c | 34 ++++++++++++++++++----- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 9f5657a..0b0174b 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -503,6 +503,7 @@ private Bool ScanOccupancyPMSADOnAddr(Addr start, Addr end); public Bool KrlMmScanOccupancyPMSAD(); public Bool KrlMmPMSADInit(); public Bool KrlMmPHYMSPaceAreaInit(); +private SInt RetOrderInPMSADsNR(PMSAD* start, PMSAD* end); private UInt ScanContinuousAddrPMSADsLen(PMSAD* start, PMSAD* end); private UInt ScanContinuousAddrPMSADs(MNode* node, MArea* area, PMSAD* start, PMSAD* end); private UInt ScanContinuousFreePMSADsLen(PMSAD* start, PMSAD* end); diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index 5d0d272..c27b910 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -9,6 +9,7 @@ #include "HalCPU.h" #include "HalBoot.h" #include "HalInterface.h" +#include "KrlLog.h" #include "KrlMmManage.h" DefinedMEMData(GMemManage, GMemManageData); @@ -423,6 +424,31 @@ public Bool KrlMmPHYMSPaceAreaInit() return TRUE; } +private SInt RetOrderInPMSADsNR(PMSAD* start, PMSAD* end) +{ + UInt msadnr = 0; + SInt order = -1; + if(NULL == start || NULL == end) + { + return -1; + } + if(start > end) + { + return -1; + } + + msadnr = (end - start) + 1; + + for(UInt i = 0; i < MSPLMER_ARR_LMAX; i++) + { + if((1 << i) <= msadnr) + { + order++; + } + } + return order; +} + private UInt ScanContinuousAddrPMSADsLen(PMSAD* start, PMSAD* end) { PMSAD* msad = NULL; @@ -455,7 +481,7 @@ private UInt ScanContinuousAddrPMSADs(MNode* node, MArea* area, PMSAD* start, PM count = ScanContinuousAddrPMSADsLen(msad, end); if(0 < count) { - // + sum += ScanOrderPMSADsAddInPABHList(node, area, msad, end); msad += count; } else @@ -527,11 +553,9 @@ private UInt ScanSameAreaTypePMSADs(MNode* node, MArea* area, PMSAD* start, PMSA PMSAD* msad = NULL; UInt count = 0; UInt sum = 0; - UInt typecount = 0; UInt areatype = 0; areatype = area->Type; - msad = start; while(msad <= end) @@ -553,10 +577,6 @@ private UInt ScanSameAreaTypePMSADs(MNode* node, MArea* area, PMSAD* start, PMSA private UInt PMSADBlockInitOnPMSADDire(MNode* node, MArea* area, PMSADDire* dire) { - SInt count = 0; - SInt maxcount = 0; - PMSAD* scanend = NULL; - PMSAD* next = NULL; PMSAD* start = NULL; PMSAD* end = NULL; From 736f8912ac4f3886d2066b122cb84c8cf8b45ca9 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sun, 26 Sep 2021 11:40:06 +0800 Subject: [PATCH 074/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0PMSADAddInPABHList?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 1 + Kernel/Memory/KrlMmManage.c | 29 +++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 0b0174b..474537d 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -503,6 +503,7 @@ private Bool ScanOccupancyPMSADOnAddr(Addr start, Addr end); public Bool KrlMmScanOccupancyPMSAD(); public Bool KrlMmPMSADInit(); public Bool KrlMmPHYMSPaceAreaInit(); +public Bool PMSADAddInPABHList(PABHList* pabhl, PMSAD* msad, UInt order); private SInt RetOrderInPMSADsNR(PMSAD* start, PMSAD* end); private UInt ScanContinuousAddrPMSADsLen(PMSAD* start, PMSAD* end); private UInt ScanContinuousAddrPMSADs(MNode* node, MArea* area, PMSAD* start, PMSAD* end); diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index c27b910..105b988 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -424,6 +424,35 @@ public Bool KrlMmPHYMSPaceAreaInit() return TRUE; } +public Bool PMSADAddInPABHList(PABHList* pabhl, PMSAD* msad, UInt order) +{ + PMSAD* msadend = NULL; + IF_NULL_RETURN_FALSE(pabhl); + IF_NULL_RETURN_FALSE(msad); + + if(PMSADIsFree(msad) == FALSE) + { + return FALSE; + } + if(pabhl->Order != order) + { + return FALSE; + } + + KrlMmLocked(&pabhl->Lock); + + msadend = &msad[(1 << order) - 1]; + ListAdd(&msad->Lists, &pabhl->FreeLists); + SetPMSADOLType(msad, MF_OLKTY_ODER); + SetPMSADBlockLink(msad, (void*)msadend); + SetPMSADOLType(msadend, MF_OLKTY_BAFH); + SetPMSADBlockLink(msad, (void*)pabhl); + pabhl->FreePmsadNR += (1 << order); + pabhl->PmsadNR += (1 << order); + KrlMmUnLock(&pabhl->Lock); + return TRUE; +} + private SInt RetOrderInPMSADsNR(PMSAD* start, PMSAD* end) { UInt msadnr = 0; From 267946c09229cab6e39875b031433db9a5586021 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sun, 26 Sep 2021 11:43:48 +0800 Subject: [PATCH 075/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0NextOrderPMSADsAddInP?= =?UTF-8?q?ABHList=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 1 + Kernel/Memory/KrlMmManage.c | 27 +++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 474537d..287905d 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -505,6 +505,7 @@ public Bool KrlMmPMSADInit(); public Bool KrlMmPHYMSPaceAreaInit(); public Bool PMSADAddInPABHList(PABHList* pabhl, PMSAD* msad, UInt order); private SInt RetOrderInPMSADsNR(PMSAD* start, PMSAD* end); +private PMSAD* NextOrderPMSADsAddInPABHList(MNode* node, MArea* area, PMSAD* start, PMSAD* end, UInt* summsad); private UInt ScanContinuousAddrPMSADsLen(PMSAD* start, PMSAD* end); private UInt ScanContinuousAddrPMSADs(MNode* node, MArea* area, PMSAD* start, PMSAD* end); private UInt ScanContinuousFreePMSADsLen(PMSAD* start, PMSAD* end); diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index 105b988..6f7950e 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -478,6 +478,33 @@ private SInt RetOrderInPMSADsNR(PMSAD* start, PMSAD* end) return order; } +private PMSAD* NextOrderPMSADsAddInPABHList(MNode* node, MArea* area, PMSAD* start, PMSAD* end, UInt* summsad) +{ + SInt msadnr = 0; + SInt order = -1; + PABHList* pabhlist = NULL; + PMSAD* nextmsad = NULL; + + pabhlist = area->MSPLMerData.PAddrBlockArr; + msadnr = (end - start) + 1; + + order = RetOrderInPMSADsNR(start, end); + if(0 > order) + { + KrlErrorCrashDead("RetOrderInPMSADsNR is Fail\n"); + return NULL; + } + + if(PMSADAddInPABHList(&pabhlist[order], start, (UInt)order) == FALSE) + { + KrlErrorCrashDead("PMSADAddInPABHList is Fail\n"); + return NULL; + } + *summsad = 1 << order; + nextmsad = &start[(msadnr - (1 << order)) + 1]; + return nextmsad; +} + private UInt ScanContinuousAddrPMSADsLen(PMSAD* start, PMSAD* end) { PMSAD* msad = NULL; From b01023e1de76e8a3dafd1a9e3bd9c16ed4a1f1ba Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sun, 26 Sep 2021 11:45:37 +0800 Subject: [PATCH 076/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ScanOrderPMSADsAddInP?= =?UTF-8?q?ABHList=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 1 + Kernel/Memory/KrlMmManage.c | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 287905d..34cdc3c 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -506,6 +506,7 @@ public Bool KrlMmPHYMSPaceAreaInit(); public Bool PMSADAddInPABHList(PABHList* pabhl, PMSAD* msad, UInt order); private SInt RetOrderInPMSADsNR(PMSAD* start, PMSAD* end); private PMSAD* NextOrderPMSADsAddInPABHList(MNode* node, MArea* area, PMSAD* start, PMSAD* end, UInt* summsad); +private UInt ScanOrderPMSADsAddInPABHList(MNode* node, MArea* area, PMSAD* start, PMSAD* end); private UInt ScanContinuousAddrPMSADsLen(PMSAD* start, PMSAD* end); private UInt ScanContinuousAddrPMSADs(MNode* node, MArea* area, PMSAD* start, PMSAD* end); private UInt ScanContinuousFreePMSADsLen(PMSAD* start, PMSAD* end); diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index 6f7950e..15e6a7a 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -505,6 +505,24 @@ private PMSAD* NextOrderPMSADsAddInPABHList(MNode* node, MArea* area, PMSAD* sta return nextmsad; } +private UInt ScanOrderPMSADsAddInPABHList(MNode* node, MArea* area, PMSAD* start, PMSAD* end) +{ + PMSAD* msad = NULL; + UInt count = 0; + UInt sum = 0; + msad = start; + while(msad <= end) + { + msad = NextOrderPMSADsAddInPABHList(node, area, msad, end, &count) + if(NULL == msad) + { + KrlErrorCrashDead("NextOrderPMSADsAddInPABHList is Fail\n"); + } + sum += count; + } + return sum; +} + private UInt ScanContinuousAddrPMSADsLen(PMSAD* start, PMSAD* end) { PMSAD* msad = NULL; From c313021d6fe2fa67700b2afcb16dd0f7f6a70deb Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sun, 26 Sep 2021 14:24:49 +0800 Subject: [PATCH 077/221] =?UTF-8?q?=E5=AE=8C=E5=96=84ScanContinuousAddrPMS?= =?UTF-8?q?ADs=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmManage.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index 15e6a7a..a94a207 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -552,15 +552,23 @@ private UInt ScanContinuousAddrPMSADs(MNode* node, MArea* area, PMSAD* start, PM msad = start; while(msad <= end) { - count = ScanContinuousAddrPMSADsLen(msad, end); - if(0 < count) + if(MA_TYPE_PROC == area->Type) { - sum += ScanOrderPMSADsAddInPABHList(node, area, msad, end); - msad += count; + sum += ScanOrderPMSADsAddInPABHList(node, area, msad, msad); + msad++; } else { - msad++; + count = ScanContinuousAddrPMSADsLen(msad, end); + if(0 < count) + { + sum += ScanOrderPMSADsAddInPABHList(node, area, msad, end); + msad += count; + } + else + { + msad++; + } } } return sum; @@ -764,5 +772,6 @@ public Bool KrlMmManageInit() KrlMmMNodeInit(); KrlMmPMSADInit(); KrlMmScanOccupancyPMSAD(); + KrlMmMAreaInit(); return TRUE; } \ No newline at end of file From 3b9c38cf737bb19da2065d56eafdfffc82198f43 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sun, 26 Sep 2021 14:33:13 +0800 Subject: [PATCH 078/221] =?UTF-8?q?=E5=AE=8C=E5=96=84ScanOrderPMSADsAddInP?= =?UTF-8?q?ABHList=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmManage.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index a94a207..be987ce 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -520,6 +520,11 @@ private UInt ScanOrderPMSADsAddInPABHList(MNode* node, MArea* area, PMSAD* start } sum += count; } + + area->AllPMSADNR += sum; + area->MaxPMSAD += sum; + node->NodeMemSize += (sum << MSAD_PADR_SLBITS); + return sum; } From d8942648554d9de47db6fa9ea8321757c5530907 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sun, 26 Sep 2021 14:46:32 +0800 Subject: [PATCH 079/221] =?UTF-8?q?=E5=AE=8C=E5=96=84NextOrderPMSADsAddInP?= =?UTF-8?q?ABHList=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmManage.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index be987ce..fb28473 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -502,6 +502,9 @@ private PMSAD* NextOrderPMSADsAddInPABHList(MNode* node, MArea* area, PMSAD* sta } *summsad = 1 << order; nextmsad = &start[(msadnr - (1 << order)) + 1]; + + area->FreePMSAD += (1 << order); + return nextmsad; } @@ -521,10 +524,6 @@ private UInt ScanOrderPMSADsAddInPABHList(MNode* node, MArea* area, PMSAD* start sum += count; } - area->AllPMSADNR += sum; - area->MaxPMSAD += sum; - node->NodeMemSize += (sum << MSAD_PADR_SLBITS); - return sum; } From 40db0081d3a8e35016671ad3d207d167663156f4 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sun, 26 Sep 2021 15:17:55 +0800 Subject: [PATCH 080/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0PMSADRetItsMNode?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 34cdc3c..b50f89c 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -471,6 +471,16 @@ KLINE PMSAD* PHYAddrRetPMSAD(U64 phyaddr) return &dire->DireStart[PMSADIndex(phyaddr)]; } +KLINE MNode* PMSADRetItsMNode(PMSAD* msad) +{ + U64 phyaddr = 0; + MNode* node = NULL; + IF_NULL_RETURN_NULL(msad); + phyaddr = PMSADRetPAddr(msad); + node = PHYAddrRetMNode(phyaddr); + return node; +} + KLINE Bool PMSADDireIsHave(PMSADDire* dire) { IF_NULL_DEAD(dire); From e357faf301f3a99a48874be29e07ab90a59a8089 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sun, 26 Sep 2021 15:31:28 +0800 Subject: [PATCH 081/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0PMSADIsMArea=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index b50f89c..3775fbd 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -349,6 +349,24 @@ KLINE Bool PMSADIsEQAreaType(PMSAD* msad, UInt areatype) return FALSE; } +KLINE Bool PMSADIsMArea(PMSAD* msad, MArea* area) +{ + Addr phyaddr = 0; + IF_NULL_RETURN_FALSE(msad); + IF_NULL_RETURN_FALSE(area); + if(PMSADIsEQAreaType(msad, area->Type) == FALSE) + { + return FALSE; + } + + phyaddr = PMSADRetPAddr(msad); + if(area->LogicStart <= phyaddr && phyaddr < area->LogicEnd) + { + return TRUE; + } + return FALSE; +} + KLINE void SetPMSADOLType(PMSAD* msad, U32 oltype) { IF_NULL_DEAD(msad); From 5e30b2091fcb5e539e5e349506408c56985fbb6c Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sun, 26 Sep 2021 15:33:08 +0800 Subject: [PATCH 082/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0PMSADRetItsMArea?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 3775fbd..c631abb 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -499,6 +499,24 @@ KLINE MNode* PMSADRetItsMNode(PMSAD* msad) return node; } +KLINE MArea* PMSADRetItsMArea(PMSAD* msad) +{ + MNode* node = NULL; + MArea* area = NULL; + IF_NULL_RETURN_NULL(msad); + node = PMSADRetMNode(msad); + IF_NULL_RETURN_NULL(node); + area = node->MAreaArr; + for(UInt i = 0; i < MEMAREA_MAX; i++) + { + if(PMSADIsMArea(msad, &area[i]) == TRUE) + { + return &area[i]; + } + } + return NULL; +} + KLINE Bool PMSADDireIsHave(PMSADDire* dire) { IF_NULL_DEAD(dire); From cd0312e3bfb49daefc8173cdbd4836b7eeae5344 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sun, 26 Sep 2021 15:41:22 +0800 Subject: [PATCH 083/221] =?UTF-8?q?=E5=AE=8C=E5=96=84NewOnePMSAD=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmManage.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index fb28473..a90fd4e 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -230,7 +230,8 @@ private PMSAD* NewOnePMSAD(MNode* node, PHYMSPaceArea* area, PMSADDire* dire, U6 { PhyAddrFlags* tmp = NULL; PMSAD* msadstart = NULL; - UInt index = 0; + MArea* marea = NULL; + UInt index = 0; IF_NULL_RETURN_NULL(node); IF_NULL_RETURN_NULL(area); IF_NULL_RETURN_NULL(dire); @@ -245,6 +246,12 @@ private PMSAD* NewOnePMSAD(MNode* node, PHYMSPaceArea* area, PMSADDire* dire, U6 msadstart[index].PhyAddr.PAddrBit = tmp->PAddrBit; SetPMSADInMNodeMAreaInfo(node, &msadstart[index]); + + marea = PMSADRetItsMArea(&msadstart[index]); + IF_NULL_DEAD(marea); + marea->AllPMSADNR++; + marea->MaxPMSAD++; + node->NodeMemSize += MSAD_SIZE; return &msadstart[index]; } From 870b1bef4dc6397b7f05083cd346ab86c1b44f0b Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sun, 26 Sep 2021 17:09:09 +0800 Subject: [PATCH 084/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmUPAddGMMAllocMax?= =?UTF-8?q?FreeNR=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 1 + Kernel/Memory/KrlMmManage.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index c631abb..a3b87e8 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -535,6 +535,7 @@ private void MSPlitMerInit(MSPlitMer* init); private void MAreaInit(MArea* init); private void MNodeInit(MNode* init); private void GMemManageInit(GMemManage* init); +public Bool KrlMmUPAddGMMAllocMaxFreeNR(UInt allocnr, UInt maxnr, UInt freenr); public void KrlMmLocked(MLock* lock); public void KrlMmUnLock(MLock* lock); private Bool NewOnePHYMSPaceArea(E820Map* e820, PHYMSPaceArea* area); diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index a90fd4e..1cface1 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -95,6 +95,21 @@ private void GMemManageInit(GMemManage* init) return; } +public Bool KrlMmUPAddGMMAllocMaxFreeNR(UInt allocnr, UInt maxnr, UInt freenr) +{ + GMemManage* gmm = NULL; + gmm = KrlMmGetGMemManageAddr(); + IF_NULL_RETURN_FALSE(gmm); + + KrlMmLocked(&gmm->Lock); + gmm->AllocPMSAD += (U64)allocnr; + gmm->MaxPMSAD += (U64)maxnr; + gmm->FreePMSAD += (U64)freenr; + gmm->MemroySZ = (U64)(gmm->MaxPMSAD << MSAD_PADR_SLBITS); + KrlMmUnLock(&gmm->Lock); + return TRUE; +} + public void KrlMmLocked(MLock* lock) { IF_NULL_DEAD(lock); From 6f2208510a5d3cd6424ea0c8116b0855ff5985b6 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sun, 26 Sep 2021 17:22:15 +0800 Subject: [PATCH 085/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmUPSubGMMAllocMax?= =?UTF-8?q?FreeNR=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 1 + Kernel/Memory/KrlMmManage.c | 24 +++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index a3b87e8..d941fc7 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -536,6 +536,7 @@ private void MAreaInit(MArea* init); private void MNodeInit(MNode* init); private void GMemManageInit(GMemManage* init); public Bool KrlMmUPAddGMMAllocMaxFreeNR(UInt allocnr, UInt maxnr, UInt freenr); +public Bool KrlMmUPSubGMMAllocMaxFreeNR(UInt allocnr, UInt maxnr, UInt freenr); public void KrlMmLocked(MLock* lock); public void KrlMmUnLock(MLock* lock); private Bool NewOnePHYMSPaceArea(E820Map* e820, PHYMSPaceArea* area); diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index 1cface1..11a4727 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -110,6 +110,30 @@ public Bool KrlMmUPAddGMMAllocMaxFreeNR(UInt allocnr, UInt maxnr, UInt freenr) return TRUE; } +public Bool KrlMmUPSubGMMAllocMaxFreeNR(UInt allocnr, UInt maxnr, UInt freenr) +{ + GMemManage* gmm = NULL; + gmm = KrlMmGetGMemManageAddr(); + IF_NULL_RETURN_FALSE(gmm); + + KrlMmLocked(&gmm->Lock); + if((U64)allocnr <= gmm->AllocPMSAD) + { + gmm->AllocPMSAD -= allocnr; + } + if((U64)maxnr <= gmm->MaxPMSAD) + { + gmm->MaxPMSAD -= (U64)maxnr; + } + if((U64)freenr <= gmm->FreePMSAD) + { + gmm->FreePMSAD -= (U64)freenr + } + gmm->MemroySZ = (U64)(gmm->MaxPMSAD << MSAD_PADR_SLBITS); + KrlMmUnLock(&gmm->Lock); + return TRUE; +} + public void KrlMmLocked(MLock* lock) { IF_NULL_DEAD(lock); From e159e494b4831f933874e31db1c9bb5b7f67a013 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sun, 26 Sep 2021 17:26:24 +0800 Subject: [PATCH 086/221] =?UTF-8?q?=E5=AE=8C=E5=96=84NewOnePMSAD-01?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmManage.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index 11a4727..6bff5ba 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -291,6 +291,7 @@ private PMSAD* NewOnePMSAD(MNode* node, PHYMSPaceArea* area, PMSADDire* dire, U6 marea->AllPMSADNR++; marea->MaxPMSAD++; node->NodeMemSize += MSAD_SIZE; + KrlMmUPAddGMMAllocMaxFreeNR(0, 1, 0); return &msadstart[index]; } From d9448a5b97c6e223522e7dda243dfae6cd63bc61 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sun, 26 Sep 2021 17:29:18 +0800 Subject: [PATCH 087/221] =?UTF-8?q?=E5=AE=8C=E5=96=84NextOrderPMSADsAddInP?= =?UTF-8?q?ABHList-01=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmManage.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index 6bff5ba..7be9889 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -550,8 +550,8 @@ private PMSAD* NextOrderPMSADsAddInPABHList(MNode* node, MArea* area, PMSAD* sta *summsad = 1 << order; nextmsad = &start[(msadnr - (1 << order)) + 1]; - area->FreePMSAD += (1 << order); - + area->FreePMSAD += (UInt)(1 << order); + KrlMmUPAddGMMAllocMaxFreeNR(0, 0, (UInt)(1 << order)); return nextmsad; } From 9351bb78e3d8d44b30f7e219ecf561dc228ded32 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 27 Sep 2021 09:37:37 +0800 Subject: [PATCH 088/221] =?UTF-8?q?=E4=BF=AE=E6=94=B9OSLinker.S=E6=96=87?= =?UTF-8?q?=E4=BB=B6=EF=BC=8C=E5=A2=9E=E5=8A=A0.mem.data=E5=86=85=E5=AD=98?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Hal/X86_64/OSLinker.S | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Hal/X86_64/OSLinker.S b/Hal/X86_64/OSLinker.S index 030f830..40a8233 100644 --- a/Hal/X86_64/OSLinker.S +++ b/Hal/X86_64/OSLinker.S @@ -70,6 +70,10 @@ SECTIONS .drventry.text ALIGN(4) : AT(ADDR(.drventry.text)-VIRTUAL_ADDRESS) { *(.drventry.text)} EndDriverEntryText = .; + BeginMEMData = .; + .mem.data ALIGN(4) : AT(ADDR(.mem.data)-VIRTUAL_ADDRESS) { *(.mem.data) } + EndMEMData = .; + BeginData = .; .data ALIGN(4) : AT(ADDR(.data)-VIRTUAL_ADDRESS) { *(.data) *(.bss) } EndData = .; From ad764a27c9d780c892f8f351309656fb5977c39e Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 27 Sep 2021 11:20:57 +0800 Subject: [PATCH 089/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0IF=5FXXX=5FDEAD?= =?UTF-8?q?=E7=B3=BB=E5=88=97=E6=B5=8B=E8=AF=95=E5=AE=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/BaseInc/BaseType.h | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/Include/BaseInc/BaseType.h b/Include/BaseInc/BaseType.h index f9b68f4..5528922 100644 --- a/Include/BaseInc/BaseType.h +++ b/Include/BaseInc/BaseType.h @@ -47,12 +47,22 @@ typedef SInt DrvStus; #define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) -#define IF_NULL_RETURN(ptr) if(NULL == ptr){return;} -#define IF_NULL_RETURN_FALSE(ptr) if(NULL == ptr){return FALSE;} -#define IF_NULL_RETURN_NULL(ptr) if(NULL == ptr){return NULL;} -#define IF_NULL_RETURN_ZERO(ptr) if(NULL == ptr){return 0;} -#define IF_NULL_DEAD(ptr) if(NULL == ptr){KrlErrorCrashDead("OBJ PTR IS NULL!!");} +#define IF_NULL_RETURN(ptr) do{if(NULL == ptr){return;}}while(0); +#define IF_NULL_RETURN_FALSE(ptr) do{if(NULL == ptr){return FALSE;}}while(0) +#define IF_NULL_RETURN_NULL(ptr) do{if(NULL == ptr){return NULL;}}while(0) +#define IF_NULL_RETURN_ZERO(ptr) do{if(NULL == ptr){return 0;}}while(0) +#define IF_NULL_DEAD(ptr) do{if(NULL == ptr){KrlErrorCrashDead("OBJ PTR IS NULL!!");}}while(0) -#define INIT_OBJOFPTR_ZERO(ptr) HalMemSet((void*)ptr, 0, sizeof(typeof(*ptr))) +#define INIT_OBJOFPTR_ZERO(ptr) do{HalMemSet((void*)ptr, 0, sizeof(typeof(*ptr)));}while(0) + +#define TEST_FAIL_STRING(str) __FILE__##__LINE__##__FUNCTION__##str +#define TEST_FAIL_DEAD_ESTMFUNC(str) KrlErrorCrashDead(TEST_FAIL_STRING(str)) + +#define IF_TEST_OP(cmpsrc, tester, op, excstmfunc) do{if(cmpsrc op tester) {excstmfunc;}}while(0) + +#define IF_LTN_DEAD(cmp, test, str) IF_TEST_OP(cmp, test, <, TEST_FAIL_DEAD_ESTMFUNC(str)) +#define IF_GTN_DEAD(cmp, test, str) IF_TEST_OP(cmp, test, >, TEST_FAIL_DEAD_ESTMFUNC(str)) +#define IF_EQT_DEAD(cmp, test, str) IF_TEST_OP(cmp, test, ==, TEST_FAIL_DEAD_ESTMFUNC(str)) +#define IF_NEQ_DEAD(cmp, test, str) IF_TEST_OP(cmp, test, ==, TEST_FAIL_DEAD_ESTMFUNC(str)) #endif \ No newline at end of file From fad7ac8dab6b0a216e69db506353a9f830eb84e1 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 27 Sep 2021 11:55:32 +0800 Subject: [PATCH 090/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0MemGMemManageTest?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MemoryInc/MEMTestUnitInc/MemTestUnit.h | 12 +++++++ Kernel/Memory/MEMTestUnit/MemTestUnit.c | 35 +++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h create mode 100644 Kernel/Memory/MEMTestUnit/MemTestUnit.c diff --git a/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h b/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h new file mode 100644 index 0000000..5e8066d --- /dev/null +++ b/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h @@ -0,0 +1,12 @@ +/********************************************************** + 内存测试单元头文件MemTestUnit.h +*********************************************************** + 彭东 +**********************************************************/ +#ifndef _MEMTESTUNITHEAD +#define _MEMTESTUNITHEAD + +public Bool MemGMemManageTest(); +public Bool MemTestUnit(); + +#endif \ No newline at end of file diff --git a/Kernel/Memory/MEMTestUnit/MemTestUnit.c b/Kernel/Memory/MEMTestUnit/MemTestUnit.c new file mode 100644 index 0000000..2f0b195 --- /dev/null +++ b/Kernel/Memory/MEMTestUnit/MemTestUnit.c @@ -0,0 +1,35 @@ +/********************************************************** + 内存测试单元文件MemTestUnit.c +*********************************************************** + 彭东 +**********************************************************/ +#include "BaseType.h" +#include "List.h" +#include "HalSync.h" +#include "HalCPU.h" +#include "HalBoot.h" +#include "HalInterface.h" +#include "KrlLog.h" +#include "KrlMmManage.h" +#include "MemTestUnit.h" + + +public Bool MemGMemManageTest() +{ + GMemManage* gmm = NULL; + gmm = KrlMmGetGMemManageAddr(); + IF_NULL_DEAD(gmm); + IF_GTN_DEAD(1, gmm->FreePMSAD, "GMemManage:FreePMSAD < 1\n"); + IF_GTN_DEAD(1, gmm->MaxPMSAD, "GMemManage:MaxPMSAD < 1\n"); + IF_NEQ_DEAD(gmm->MemroySZ, (gmm->MaxPMSAD << MSAD_PADR_SLBITS), "GMemManage:MemorySZ data error\n"); + IF_GTN_DEAD(1, gmm->PAreaNR,"GMemManage:PAreaNR < 1\n"); + IF_EQT_DEAD(NULL, gmm->PAreaStart, "GMemManage:PAreaStart = NULL\n"); + IF_GTN_DEAD(1, gmm->MNodeNR,"GMemManage:MNodeNR < 1\n"); + IF_EQT_DEAD(NULL, gmm->MNodeStart, "GMemManage:MNodeStart = NULL\n"); + return TRUE; +} + +public Bool MemTestUnit() +{ + return TRUE; +} \ No newline at end of file From 8b746b00f03e819eb58b622a211e9c11ae5fab6a Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 27 Sep 2021 14:42:56 +0800 Subject: [PATCH 091/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0MemPHYMSPaceAreaTest?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MemoryInc/MEMTestUnitInc/MemTestUnit.h | 5 ++- Kernel/Memory/MEMTestUnit/MemTestUnit.c | 38 +++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h b/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h index 5e8066d..9593b96 100644 --- a/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h +++ b/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h @@ -6,7 +6,8 @@ #ifndef _MEMTESTUNITHEAD #define _MEMTESTUNITHEAD -public Bool MemGMemManageTest(); -public Bool MemTestUnit(); +public Bool MemGMemManageTest(); +public Bool MemPHYMSPaceAreaTest(); +public Bool MemTestUnit(); #endif \ No newline at end of file diff --git a/Kernel/Memory/MEMTestUnit/MemTestUnit.c b/Kernel/Memory/MEMTestUnit/MemTestUnit.c index 2f0b195..c911b2d 100644 --- a/Kernel/Memory/MEMTestUnit/MemTestUnit.c +++ b/Kernel/Memory/MEMTestUnit/MemTestUnit.c @@ -29,6 +29,44 @@ public Bool MemGMemManageTest() return TRUE; } +public Bool MemPHYMSPaceAreaTest() +{ + MachStartInfo* msinfo = NULL; + GMemManage* gmm = NULL; + PHYMSPaceArea* parea = NULL; + E820Map* e820 = NULL; + UInt status = 0; + msinfo = HalExPGetMachStartInfoAddr(); + gmm = KrlMmGetGMemManageAddr(); + IF_NULL_DEAD(msinfo); + IF_NULL_DEAD(gmm); + + e820 = (E820Map*)HalPAddrToVAddr((Addr)msinfo->E820PAddr); + IF_EQT_DEAD(NULL, e820, "MachStartInfo:E820PAddr = NULL\n"); + IF_GTN_DEAD(1, msinfo->E820NR, "MachStartInfo:E820NR < 1\n"); + + parea = gmm->PAreaStart; + IF_GTN_DEAD(1, gmm->PAreaNR,"GMemManage:PAreaNR < 1\n"); + IF_EQT_DEAD(NULL, parea, "GMemManage:PAreaStart = NULL\n"); + for(U64 i = 0; i < gmm->PAreaNR; i++) + { + status = 0; + for(U64 e = 0; e < msinfo->E820NR; e++) + { + if((parea[i].SubType == e820[e].Type) && (parea[i].Start == e820[e].Addr) && + (parea[i].End == (e820[e].Size + e820[e].Addr - 1)) && + (parea[i].Size == e820[e].Size)) + { + status++; + } + } + IF_NEQ_DEAD(1, status, "No have E820Map EQ\n"); + IF_NEQ_DEAD(PMSA_F_X86_64, parea[i].Flags, "PHYMSPaceArea:Flags != PMSA_F_X86_64\n"); + } + + return TRUE; +} + public Bool MemTestUnit() { return TRUE; From 6fb6ad32d4552c193092f3a90d511c45a28c2d2b Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 27 Sep 2021 15:38:34 +0800 Subject: [PATCH 092/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0MemMNodeTest=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MemoryInc/MEMTestUnitInc/MemTestUnit.h | 1 + Kernel/Memory/MEMTestUnit/MemTestUnit.c | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h b/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h index 9593b96..b629356 100644 --- a/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h +++ b/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h @@ -8,6 +8,7 @@ public Bool MemGMemManageTest(); public Bool MemPHYMSPaceAreaTest(); +public Bool MemMNodeTest(); public Bool MemTestUnit(); #endif \ No newline at end of file diff --git a/Kernel/Memory/MEMTestUnit/MemTestUnit.c b/Kernel/Memory/MEMTestUnit/MemTestUnit.c index c911b2d..f66a313 100644 --- a/Kernel/Memory/MEMTestUnit/MemTestUnit.c +++ b/Kernel/Memory/MEMTestUnit/MemTestUnit.c @@ -67,6 +67,25 @@ public Bool MemPHYMSPaceAreaTest() return TRUE; } +public Bool MemMNodeTest() +{ + GMemManage* gmm = NULL; + MNode* node = NULL; + + gmm = KrlMmGetGMemManageAddr(); + IF_NULL_DEAD(gmm); + + node = gmm->MNodeStart; + IF_EQT_DEAD(NULL, node, "GMemManage:MNodeStart = NULL\n"); + IF_GTN_DEAD(1, gmm->MNodeNR, "GMemManage:MNodeNR < 1\n"); + + for(U64 i = 0; i < gmm->MNodeNR; i++) + { + IF_EQT_DEAD(0, node[i].NodeMemAddrEnd, "MNode: NodeMemAddrEnd = 0"); + } + return TRUE; +} + public Bool MemTestUnit() { return TRUE; From fa9fdcb00f402f1eb0dcae9b0637dc6c33b867a1 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 27 Sep 2021 16:44:51 +0800 Subject: [PATCH 093/221] =?UTF-8?q?=E4=BF=AE=E6=94=B9PMSADFlags=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index d941fc7..6305da9 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -12,6 +12,10 @@ #define MSAD_ALIGN(n) ALIGN(n, MSAD_SIZE) #define MSAD_MASK (~(MSAD_SIZE-1)) +#define MF_P_INIT (0) +#define MF_P_PRESENT (1) + + #define MF_OLKTY_INIT (0) #define MF_OLKTY_ODER (1) #define MF_OLKTY_BAFH (2) @@ -91,7 +95,8 @@ typedef struct PMSADFLAGS U32 InListBit:1; U32 OccupancyTypeBit:2; U32 AreaTypeBit:3; - U32 RefCountBit:24; + U32 PresentBit:2; + U32 RefCountBit:22; }__attribute__((packed)) PMSADFlags; //物理地址及其标志 From 02f7c58edd8848119fad4e8a0f0aeee06eca5d57 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 27 Sep 2021 16:49:17 +0800 Subject: [PATCH 094/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0SetPMSADPresent?= =?UTF-8?q?=E3=80=81ClearPMSADPresent=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 6305da9..9d85018 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -372,6 +372,20 @@ KLINE Bool PMSADIsMArea(PMSAD* msad, MArea* area) return FALSE; } +KLINE void SetPMSADPresent(PMSAD* msad) +{ + IF_NULL_DEAD(msad); + msad->CountFlags.PresentBit = MF_P_PRESENT; + return; +} + +KLINE void ClearPMSADPresent(PMSAD* msad) +{ + IF_NULL_DEAD(msad); + msad->CountFlags.PresentBit = MF_P_INIT; + return; +} + KLINE void SetPMSADOLType(PMSAD* msad, U32 oltype) { IF_NULL_DEAD(msad); From 527cddc3187cb5145392ded0747f97421d5380c2 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 27 Sep 2021 16:58:22 +0800 Subject: [PATCH 095/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0SetPMSADPAddr?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 9d85018..cbe82da 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -408,6 +408,18 @@ KLINE void SetPMSADOccupancyType(PMSAD* msad, U32 occupancytype) return; } +KLINE void SetPMSADPAddr(PMSAD* msad, U64 paddr) +{ + U64 phyaddr = 0; + PhyAddrFlags* pf = NULL; + IF_NULL_DEAD(msad); + + phyaddr = paddr; + pf = (PhyAddrFlags*)(&phyaddr); + msad->PhyAddr.PAddrBit = pf->PAddrBit; + return; +} + KLINE void SetPMSADAlloc(PMSAD* msad) { IF_NULL_DEAD(msad); From 633b1d847e9e3278c48dbbaec42608324db70744 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 27 Sep 2021 17:05:03 +0800 Subject: [PATCH 096/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0PMSADIsPresent?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index cbe82da..2cb6648 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -372,6 +372,16 @@ KLINE Bool PMSADIsMArea(PMSAD* msad, MArea* area) return FALSE; } +KLINE Bool PMSADIsPresent(PMSAD* msad) +{ + IF_NULL_RETURN_FALSE(msad); + if(MF_P_PRESENT == msad->CountFlags.PresentBit) + { + return TRUE; + } + return FALSE; +} + KLINE void SetPMSADPresent(PMSAD* msad) { IF_NULL_DEAD(msad); From ca1122ce3aab3f088f5ad77e7d94f721655c1b08 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 27 Sep 2021 17:06:47 +0800 Subject: [PATCH 097/221] =?UTF-8?q?=E5=AE=8C=E5=96=84NewOnePMSAD-02?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmManage.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index 7be9889..bdef577 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -267,7 +267,6 @@ private Bool SetPMSADInMNodeMAreaInfo(MNode* node, PMSAD* msad) private PMSAD* NewOnePMSAD(MNode* node, PHYMSPaceArea* area, PMSADDire* dire, U64 paddr) { - PhyAddrFlags* tmp = NULL; PMSAD* msadstart = NULL; MArea* marea = NULL; UInt index = 0; @@ -281,8 +280,9 @@ private PMSAD* NewOnePMSAD(MNode* node, PHYMSPaceArea* area, PMSADDire* dire, U6 index = PMSADIndex(paddr); PMSADInit(&msadstart[index]); - tmp = (PhyAddrFlags*)(&paddr); - msadstart[index].PhyAddr.PAddrBit = tmp->PAddrBit; + + SetPMSADPAddr(&msadstart[index], paddr); + SetPMSADPresent(&msadstart[index]); SetPMSADInMNodeMAreaInfo(node, &msadstart[index]); From 09065faa3feca001326b1bbd84cbcbad23b1a369 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 27 Sep 2021 18:18:08 +0800 Subject: [PATCH 098/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B5=8B=E8=AF=95PMS?= =?UTF-8?q?AD=E7=9A=84=E7=9B=B8=E5=85=B3=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MemoryInc/MEMTestUnitInc/MemTestUnit.h | 3 + Kernel/Memory/MEMTestUnit/MemTestUnit.c | 61 ++++++++++++++++++- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h b/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h index b629356..5221297 100644 --- a/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h +++ b/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h @@ -9,6 +9,9 @@ public Bool MemGMemManageTest(); public Bool MemPHYMSPaceAreaTest(); public Bool MemMNodeTest(); +public Bool MemPMSADOnPMSADDireTest(MNode* node, PMSADDire* dire, U64 start, U64 end); +public Bool MemPMSADOnMNodeTest(MNode* node); +public Bool MemPMSADTest(); public Bool MemTestUnit(); #endif \ No newline at end of file diff --git a/Kernel/Memory/MEMTestUnit/MemTestUnit.c b/Kernel/Memory/MEMTestUnit/MemTestUnit.c index f66a313..28d67f6 100644 --- a/Kernel/Memory/MEMTestUnit/MemTestUnit.c +++ b/Kernel/Memory/MEMTestUnit/MemTestUnit.c @@ -71,7 +71,7 @@ public Bool MemMNodeTest() { GMemManage* gmm = NULL; MNode* node = NULL; - + gmm = KrlMmGetGMemManageAddr(); IF_NULL_DEAD(gmm); @@ -86,6 +86,65 @@ public Bool MemMNodeTest() return TRUE; } +public Bool MemPMSADOnPMSADDireTest(MNode* node, PMSADDire* dire, U64 start, U64 end) +{ + PMSAD* msad = NULL; + MNode* cnode = NULL; + U64 paddr = 0; + IF_EQT_DEAD(NULL, node, "PRAM node = NULL\n"); + IF_EQT_DEAD(NULL, dire, "PRAM dire = NULL\n"); + msad = dire->DireStart; + IF_NULL_RETURN_FALSE(msad); + for(UInt i = 0; i < PMSADDIRE_PMSAD_NR; i++) + { + + if(PMSADIsPresent(&msad[i]) == TRUE) + { + paddr = PMSADRetPAddr(&msad[i]); + cnode = PMSADRetItsMNode(&msad[i]); + IF_NEQ_DEAD(cnode, node, "PMSAD doesn't node\n"); + IF_GTN_DEAD(paddr, end, "PMSAD addr Greater than PMSADDire end\n"); + IF_LTN_DEAD(paddr, start, "PMSAD addr Less than PMSADDire start\n"); + } + } + return TRUE; +} + + +public Bool MemPMSADOnMNodeTest(MNode* node) +{ + U64 addrstart = 0; + U64 addrend = 0; + PMSADDire* dire = NULL; + IF_EQT_DEAD(NULL, node, "PRAM node = NULL\n"); + dire = node->PMSADDir.PMSADEArr; + for(UInt i = 0; i < PMSADDIRE_MAX; i++) + { + addrstart = i * PMSADDIRE_SIZE; + addrend = addrstart + PMSADDIRE_SIZE; + MemPMSADOnPMSADDireTest(node, &dire[i], addrstart, addrend); + } + return TRUE; +} + +public Bool MemPMSADTest() +{ + GMemManage* gmm = NULL; + MNode* node = NULL; + + gmm = KrlMmGetGMemManageAddr(); + IF_NULL_DEAD(gmm); + + node = gmm->MNodeStart; + IF_EQT_DEAD(NULL, node, "GMemManage:MNodeStart = NULL\n"); + IF_GTN_DEAD(1, gmm->MNodeNR, "GMemManage:MNodeNR < 1\n"); + for(U64 i = 0; i < gmm->MNodeNR; i++) + { + MemPMSADOnMNodeTest(&node[i]); + } + return TRUE; +} + public Bool MemTestUnit() { return TRUE; From 8cdaf75994f9d49f7f00e15f4a18daf270fdd3ab Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 29 Sep 2021 09:16:29 +0800 Subject: [PATCH 099/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=9A=84=E7=9B=B8=E5=85=B3=E5=87=BD=E6=95=B0?= =?UTF-8?q?PMSADBlockIsContinuousAddr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MemoryInc/MEMTestUnitInc/MemTestUnit.h | 1 + Kernel/Memory/MEMTestUnit/MemTestUnit.c | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h b/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h index 5221297..c756a5a 100644 --- a/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h +++ b/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h @@ -12,6 +12,7 @@ public Bool MemMNodeTest(); public Bool MemPMSADOnPMSADDireTest(MNode* node, PMSADDire* dire, U64 start, U64 end); public Bool MemPMSADOnMNodeTest(MNode* node); public Bool MemPMSADTest(); +private UInt PMSADBlockIsContinuousAddr(PMSAD* start, PMSAD* end); public Bool MemTestUnit(); #endif \ No newline at end of file diff --git a/Kernel/Memory/MEMTestUnit/MemTestUnit.c b/Kernel/Memory/MEMTestUnit/MemTestUnit.c index 28d67f6..965b84f 100644 --- a/Kernel/Memory/MEMTestUnit/MemTestUnit.c +++ b/Kernel/Memory/MEMTestUnit/MemTestUnit.c @@ -145,6 +145,31 @@ public Bool MemPMSADTest() return TRUE; } + +private UInt PMSADBlockIsContinuousAddr(PMSAD* start, PMSAD* end) +{ + PMSAD* msad = NULL; + UInt count = 1; + if(start == end) + { + return 1; + } + msad = start + 1; + while(msad <= end) + { + if(PMSADIsAdjacent(msad - 1, msad) == FALSE) + { + return count; + } + count++; + msad++; + } + return count; +} + + + + public Bool MemTestUnit() { return TRUE; From a9901bb6c457a4522e93bb989da16f291c6977e8 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 29 Sep 2021 09:18:10 +0800 Subject: [PATCH 100/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=9A=84=E7=9B=B8=E5=85=B3=E5=87=BD=E6=95=B0?= =?UTF-8?q?MemMSPlitMerOnPerPMSADBlockTest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MemoryInc/MEMTestUnitInc/MemTestUnit.h | 1 + Kernel/Memory/MEMTestUnit/MemTestUnit.c | 33 ++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h b/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h index c756a5a..fb01150 100644 --- a/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h +++ b/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h @@ -13,6 +13,7 @@ public Bool MemPMSADOnPMSADDireTest(MNode* node, PMSADDire* dire, U64 start, U64 public Bool MemPMSADOnMNodeTest(MNode* node); public Bool MemPMSADTest(); private UInt PMSADBlockIsContinuousAddr(PMSAD* start, PMSAD* end); +public Bool MemMSPlitMerOnPerPMSADBlockTest(MNode* node, MArea* area, PABHList* pabhl, PMSAD* start); public Bool MemTestUnit(); #endif \ No newline at end of file diff --git a/Kernel/Memory/MEMTestUnit/MemTestUnit.c b/Kernel/Memory/MEMTestUnit/MemTestUnit.c index 965b84f..68ac3e7 100644 --- a/Kernel/Memory/MEMTestUnit/MemTestUnit.c +++ b/Kernel/Memory/MEMTestUnit/MemTestUnit.c @@ -167,8 +167,39 @@ private UInt PMSADBlockIsContinuousAddr(PMSAD* start, PMSAD* end) return count; } +public Bool MemMSPlitMerOnPerPMSADBlockTest(MNode* node, MArea* area, PABHList* pabhl, PMSAD* start) +{ + PMSAD* end = NULL; + PMSAD* msad = NULL; + Addr paddr = 0; + UInt ordernr = 0; + UInt msadnr = 0; + IF_EQT_DEAD(NULL, node, "PRAM node = NULL\n"); + IF_EQT_DEAD(NULL, area, "PRAM area = NULL\n"); + IF_EQT_DEAD(NULL, pabhl, "PRAM pabhl = NULL\n"); + IF_EQT_DEAD(NULL, start, "PRAM splitmer = NULL\n"); + IF_NEQ_DEAD(MF_OLKTY_ODER, start->CountFlags.OLTypeBit, "PMSAD:CountFlags.OLTypeBit != MF_OLKTY_ODER\n"); + + end = (PMSAD*)start->BlockLink; + msad = start; + ordernr = (end - start) + 1; + + msadnr = PMSADBlockIsContinuousAddr(start, end); + IF_NEQ_DEAD(msadnr, pabhl->InOrderPmsadNR, "PMSADBlock is not continuous\n"); - + while(msad <= end) + { + paddr = PMSADRetPAddr(msad); + IF_GTN_DEAD(paddr, area->LogicEnd, "PMSAD PAddr doesn't area\n"); + IF_LTN_DEAD(paddr, area->LogicStart, "PMSAD PAddr doesn't area\n"); + IF_NEQ_DEAD(TRUE, PMSADIsPresent(msad), "PMSAD Not Present\n"); + IF_NEQ_DEAD(TRUE, PMSADIsFree(msad), "PMSAD Not Free\n"); + IF_NEQ_DEAD(node, PMSADRetItsMNode(msad), "PMSAD doesn't node\n"); + IF_NEQ_DEAD(area, PMSADRetItsMArea(msad), "PMSAD doesn't area\n"); + IF_NEQ_DEAD(ordernr, pabhl->InOrderPmsadNR, "PMSAD number NEQ\n"); + } + return TRUE; +} public Bool MemTestUnit() { From 8d708dcbb2e0a520ffeea2b267974ec8e216c88d Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 29 Sep 2021 09:20:03 +0800 Subject: [PATCH 101/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=9A=84=E7=9B=B8=E5=85=B3=E5=87=BD=E6=95=B0?= =?UTF-8?q?MemMSPlitMerOnPerPABHListTest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MemoryInc/MEMTestUnitInc/MemTestUnit.h | 1 + Kernel/Memory/MEMTestUnit/MemTestUnit.c | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h b/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h index fb01150..d934a7f 100644 --- a/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h +++ b/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h @@ -14,6 +14,7 @@ public Bool MemPMSADOnMNodeTest(MNode* node); public Bool MemPMSADTest(); private UInt PMSADBlockIsContinuousAddr(PMSAD* start, PMSAD* end); public Bool MemMSPlitMerOnPerPMSADBlockTest(MNode* node, MArea* area, PABHList* pabhl, PMSAD* start); +public Bool MemMSPlitMerOnPerPABHListTest(MNode* node, MArea* area, MSPlitMer* splitmer, PABHList* pabhl); public Bool MemTestUnit(); #endif \ No newline at end of file diff --git a/Kernel/Memory/MEMTestUnit/MemTestUnit.c b/Kernel/Memory/MEMTestUnit/MemTestUnit.c index 68ac3e7..c464bc6 100644 --- a/Kernel/Memory/MEMTestUnit/MemTestUnit.c +++ b/Kernel/Memory/MEMTestUnit/MemTestUnit.c @@ -201,6 +201,27 @@ public Bool MemMSPlitMerOnPerPMSADBlockTest(MNode* node, MArea* area, PABHList* return TRUE; } +public Bool MemMSPlitMerOnPerPABHListTest(MNode* node, MArea* area, MSPlitMer* splitmer, PABHList* pabhl) +{ + Bool rets = FALSE; + List* pos = NULL; + PMSAD* msad = NULL; + IF_EQT_DEAD(NULL, node, "PRAM node = NULL\n"); + IF_EQT_DEAD(NULL, area, "PRAM area = NULL\n"); + IF_EQT_DEAD(NULL, splitmer, "PRAM splitmer = NULL\n"); + IF_EQT_DEAD(NULL, pabhl, "PRAM pabhl = NULL\n"); + if(0 < pabhl->PmsadNR) + { + rets = ListIsEmptyCareful(&pabhl->FreeLists); + IF_EQT_DEAD(TRUE, rets, "PABHList:FreeLists == Empty\n"); + ListForEach(pos, &pabhl->FreeLists) + { + msad = ListEntry(pos, PMSAD, Lists); + MemMSPlitMerOnPerPMSADBlockTest(node, area, pabhl, msad); + } + } +} + public Bool MemTestUnit() { return TRUE; From 0b648b80068566e058a4a990cdc6046e61a2387d Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 29 Sep 2021 09:21:40 +0800 Subject: [PATCH 102/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=9A=84=E7=9B=B8=E5=85=B3=E5=87=BD=E6=95=B0?= =?UTF-8?q?MemMSPlitMerTest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MemoryInc/MEMTestUnitInc/MemTestUnit.h | 1 + Kernel/Memory/MEMTestUnit/MemTestUnit.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h b/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h index d934a7f..e8a135d 100644 --- a/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h +++ b/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h @@ -15,6 +15,7 @@ public Bool MemPMSADTest(); private UInt PMSADBlockIsContinuousAddr(PMSAD* start, PMSAD* end); public Bool MemMSPlitMerOnPerPMSADBlockTest(MNode* node, MArea* area, PABHList* pabhl, PMSAD* start); public Bool MemMSPlitMerOnPerPABHListTest(MNode* node, MArea* area, MSPlitMer* splitmer, PABHList* pabhl); +public Bool MemMSPlitMerTest(MNode* node, MArea* area, MSPlitMer* splitmer); public Bool MemTestUnit(); #endif \ No newline at end of file diff --git a/Kernel/Memory/MEMTestUnit/MemTestUnit.c b/Kernel/Memory/MEMTestUnit/MemTestUnit.c index c464bc6..50defd5 100644 --- a/Kernel/Memory/MEMTestUnit/MemTestUnit.c +++ b/Kernel/Memory/MEMTestUnit/MemTestUnit.c @@ -222,6 +222,20 @@ public Bool MemMSPlitMerOnPerPABHListTest(MNode* node, MArea* area, MSPlitMer* s } } +public Bool MemMSPlitMerTest(MNode* node, MArea* area, MSPlitMer* splitmer) +{ + PABHList* pabhl = NULL; + IF_EQT_DEAD(NULL, node, "PRAM node = NULL\n"); + IF_EQT_DEAD(NULL, area, "PRAM area = NULL\n"); + IF_EQT_DEAD(NULL, splitmer, "PRAM splitmer = NULL\n"); + pabhl = splitmer->PAddrBlockArr; + for(UInt i = 0; i < MSPLMER_ARR_LMAX; i++) + { + MemMSPlitMerOnPerPABHListTest(node, area, splitmer, &pabhl[i]); + } + return TRUE; +} + public Bool MemTestUnit() { return TRUE; From 1250bd87668f7c0dd69aa923df72a7788f4d1d86 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 29 Sep 2021 09:24:29 +0800 Subject: [PATCH 103/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=9A=84=E7=9B=B8=E5=85=B3=E5=87=BD=E6=95=B0?= =?UTF-8?q?MemMAreaOnPerMAreaTest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h | 1 + Kernel/Memory/MEMTestUnit/MemTestUnit.c | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h b/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h index e8a135d..9a5a052 100644 --- a/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h +++ b/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h @@ -16,6 +16,7 @@ private UInt PMSADBlockIsContinuousAddr(PMSAD* start, PMSAD* end); public Bool MemMSPlitMerOnPerPMSADBlockTest(MNode* node, MArea* area, PABHList* pabhl, PMSAD* start); public Bool MemMSPlitMerOnPerPABHListTest(MNode* node, MArea* area, MSPlitMer* splitmer, PABHList* pabhl); public Bool MemMSPlitMerTest(MNode* node, MArea* area, MSPlitMer* splitmer); +public Bool MemMAreaOnPerMAreaTest(MNode* node, MArea* area); public Bool MemTestUnit(); #endif \ No newline at end of file diff --git a/Kernel/Memory/MEMTestUnit/MemTestUnit.c b/Kernel/Memory/MEMTestUnit/MemTestUnit.c index 50defd5..586621f 100644 --- a/Kernel/Memory/MEMTestUnit/MemTestUnit.c +++ b/Kernel/Memory/MEMTestUnit/MemTestUnit.c @@ -236,6 +236,17 @@ public Bool MemMSPlitMerTest(MNode* node, MArea* area, MSPlitMer* splitmer) return TRUE; } +public Bool MemMAreaOnPerMAreaTest(MNode* node, MArea* area) +{ + IF_EQT_DEAD(NULL, node, "PRAM node = NULL\n"); + IF_EQT_DEAD(NULL, area, "PRAM area = NULL\n"); + if(0 < area->MaxPMSAD) + { + MemMSPlitMerTest(node, area, &area->MSPLMerData); + } + return; +} + public Bool MemTestUnit() { return TRUE; From 7a84465170a38880baae51ab20afa606f710eeee Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 29 Sep 2021 09:25:58 +0800 Subject: [PATCH 104/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=9A=84=E7=9B=B8=E5=85=B3=E5=87=BD=E6=95=B0?= =?UTF-8?q?MemMAreaOnMNodeTest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MemoryInc/MEMTestUnitInc/MemTestUnit.h | 1 + Kernel/Memory/MEMTestUnit/MemTestUnit.c | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h b/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h index 9a5a052..35bf04c 100644 --- a/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h +++ b/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h @@ -17,6 +17,7 @@ public Bool MemMSPlitMerOnPerPMSADBlockTest(MNode* node, MArea* area, PABHList* public Bool MemMSPlitMerOnPerPABHListTest(MNode* node, MArea* area, MSPlitMer* splitmer, PABHList* pabhl); public Bool MemMSPlitMerTest(MNode* node, MArea* area, MSPlitMer* splitmer); public Bool MemMAreaOnPerMAreaTest(MNode* node, MArea* area); +public Bool MemMAreaOnMNodeTest(MNode* node); public Bool MemTestUnit(); #endif \ No newline at end of file diff --git a/Kernel/Memory/MEMTestUnit/MemTestUnit.c b/Kernel/Memory/MEMTestUnit/MemTestUnit.c index 586621f..ec6fcc4 100644 --- a/Kernel/Memory/MEMTestUnit/MemTestUnit.c +++ b/Kernel/Memory/MEMTestUnit/MemTestUnit.c @@ -247,6 +247,19 @@ public Bool MemMAreaOnPerMAreaTest(MNode* node, MArea* area) return; } +public Bool MemMAreaOnMNodeTest(MNode* node) +{ + MArea* area = NULL; + IF_EQT_DEAD(NULL, node, "PRAM node = NULL\n"); + area = &node->MAreaArr; + for(UInt i = 0; i < MEMAREA_MAX; i++) + { + MemMAreaOnPerMAreaTest(node, &area[i]); + } + return TRUE; +} + + public Bool MemTestUnit() { return TRUE; From 99b2909a25c5143b9b27003fbb11d39e076ee181 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 29 Sep 2021 09:27:50 +0800 Subject: [PATCH 105/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=9A=84=E7=9B=B8=E5=85=B3=E5=87=BD=E6=95=B0?= =?UTF-8?q?MemMAreaTest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MemoryInc/MEMTestUnitInc/MemTestUnit.h | 1 + Kernel/Memory/MEMTestUnit/MemTestUnit.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h b/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h index 35bf04c..adec5c1 100644 --- a/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h +++ b/Include/KernelInc/MemoryInc/MEMTestUnitInc/MemTestUnit.h @@ -18,6 +18,7 @@ public Bool MemMSPlitMerOnPerPABHListTest(MNode* node, MArea* area, MSPlitMer* s public Bool MemMSPlitMerTest(MNode* node, MArea* area, MSPlitMer* splitmer); public Bool MemMAreaOnPerMAreaTest(MNode* node, MArea* area); public Bool MemMAreaOnMNodeTest(MNode* node); +public Bool MemMAreaTest(); public Bool MemTestUnit(); #endif \ No newline at end of file diff --git a/Kernel/Memory/MEMTestUnit/MemTestUnit.c b/Kernel/Memory/MEMTestUnit/MemTestUnit.c index ec6fcc4..c966092 100644 --- a/Kernel/Memory/MEMTestUnit/MemTestUnit.c +++ b/Kernel/Memory/MEMTestUnit/MemTestUnit.c @@ -259,6 +259,23 @@ public Bool MemMAreaOnMNodeTest(MNode* node) return TRUE; } +public Bool MemMAreaTest() +{ + GMemManage* gmm = NULL; + MNode* node = NULL; + + gmm = KrlMmGetGMemManageAddr(); + IF_NULL_DEAD(gmm); + + node = gmm->MNodeStart; + IF_EQT_DEAD(NULL, node, "GMemManage:MNodeStart = NULL\n"); + IF_GTN_DEAD(1, gmm->MNodeNR, "GMemManage:MNodeNR < 1\n"); + for(U64 i = 0; i < gmm->MNodeNR; i++) + { + MemMAreaOnMNodeTest(&node[i]); + } + return TRUE; +} public Bool MemTestUnit() { From 564cb91d0e5be805c2eeee098b459dbe21fae407 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 29 Sep 2021 15:41:15 +0800 Subject: [PATCH 106/221] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=86=85=E5=AD=98?= =?UTF-8?q?=E6=B5=8B=E8=AF=95MemTestUnit=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/MEMTestUnit/MemTestUnit.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Kernel/Memory/MEMTestUnit/MemTestUnit.c b/Kernel/Memory/MEMTestUnit/MemTestUnit.c index c966092..2981089 100644 --- a/Kernel/Memory/MEMTestUnit/MemTestUnit.c +++ b/Kernel/Memory/MEMTestUnit/MemTestUnit.c @@ -279,5 +279,10 @@ public Bool MemMAreaTest() public Bool MemTestUnit() { + MemGMemManageTest(); + MemPHYMSPaceAreaTest(); + MemMNodeTest(); + MemPMSADTest(); + MemMAreaTest(); return TRUE; } \ No newline at end of file From d02c3674b4a67a3569656042967b8e5b889a6c25 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 30 Sep 2021 09:26:11 +0800 Subject: [PATCH 107/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0IF=5FLTNnn=5FXXX?= =?UTF-8?q?=E3=80=81IF=5FGTNnn=5FXXX=E3=80=81IF=5FNEQnn=5FXXX=E7=B3=BB?= =?UTF-8?q?=E5=88=97=E5=AE=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/BaseInc/BaseType.h | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/Include/BaseInc/BaseType.h b/Include/BaseInc/BaseType.h index 5528922..429781f 100644 --- a/Include/BaseInc/BaseType.h +++ b/Include/BaseInc/BaseType.h @@ -50,6 +50,8 @@ typedef SInt DrvStus; #define IF_NULL_RETURN(ptr) do{if(NULL == ptr){return;}}while(0); #define IF_NULL_RETURN_FALSE(ptr) do{if(NULL == ptr){return FALSE;}}while(0) #define IF_NULL_RETURN_NULL(ptr) do{if(NULL == ptr){return NULL;}}while(0) +#define IF_ZERO_RETURN_NULL(x) do{if(0 == x){return NULL;}}while(0) +#define IF_ZERO_RETURN_FALSE(x) do{if(0 == x){return FALSE;}}while(0) #define IF_NULL_RETURN_ZERO(ptr) do{if(NULL == ptr){return 0;}}while(0) #define IF_NULL_DEAD(ptr) do{if(NULL == ptr){KrlErrorCrashDead("OBJ PTR IS NULL!!");}}while(0) @@ -60,9 +62,30 @@ typedef SInt DrvStus; #define IF_TEST_OP(cmpsrc, tester, op, excstmfunc) do{if(cmpsrc op tester) {excstmfunc;}}while(0) +#define IF_RET_OP(cmpsrc, tester, op, rets) do{if(cmpsrc op tester) {return rets;}}while(0) + #define IF_LTN_DEAD(cmp, test, str) IF_TEST_OP(cmp, test, <, TEST_FAIL_DEAD_ESTMFUNC(str)) #define IF_GTN_DEAD(cmp, test, str) IF_TEST_OP(cmp, test, >, TEST_FAIL_DEAD_ESTMFUNC(str)) #define IF_EQT_DEAD(cmp, test, str) IF_TEST_OP(cmp, test, ==, TEST_FAIL_DEAD_ESTMFUNC(str)) -#define IF_NEQ_DEAD(cmp, test, str) IF_TEST_OP(cmp, test, ==, TEST_FAIL_DEAD_ESTMFUNC(str)) +#define IF_NEQ_DEAD(cmp, test, str) IF_TEST_OP(cmp, test, !=, TEST_FAIL_DEAD_ESTMFUNC(str)) + +#define IF_LTN_RETURN(cmp, test, rets) IF_RET_OP(cmp, test, <, rets) +#define IF_GTN_RETURN(cmp, test, rets) IF_RET_OP(cmp, test, >, rets) +#define IF_EQT_RETURN(cmp, test, rets) IF_RET_OP(cmp, test, ==, rets) +#define IF_NEQ_RETURN(cmp, test, rets) IF_RET_OP(cmp, test, !=, rets) + +#define IF_LTNZERO_RETRUN_NULL(test) IF_LTN_RETURN(test, 0, NULL) +#define IF_LTNONE_RETRUN_NULL(test) IF_LTN_RETURN(test, 1, NULL) +#define IF_GTNZERO_RETRUN_NULL(test) IF_GTN_RETURN(test, 0, NULL) +#define IF_GTNONE_RETRUN_NULL(test) IF_GTN_RETURN(test, 1, NULL) +#define IF_NEQZERO_RETRUN_NULL(test) IF_NEQ_RETURN(test, 0, NULL) +#define IF_NEQONE_RETRUN_NULL(test) IF_NEQ_RETURN(test, 1, NULL) + +#define IF_LTNZERO_RETRUN_FALSE(test) IF_LTN_RETURN(test, 0, FALSE) +#define IF_LTNONE_RETRUN_FALSE(test) IF_LTN_RETURN(test, 1, FALSE) +#define IF_GTNZERO_RETRUN_FALSE(test) IF_GTN_RETURN(test, 0, FALSE) +#define IF_GTNONE_RETRUN_FALSE(test) IF_GTN_RETURN(test, 1, FALSE) +#define IF_NEQZERO_RETRUN_FALSE(test) IF_NEQ_RETURN(test, 0, FALSE) +#define IF_NEQONE_RETRUN_FALSE(test) IF_NEQ_RETURN(test, 1, FALSE) #endif \ No newline at end of file From 22e2ba28af8cd6bd6a31e33d75ebb61946252f02 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 30 Sep 2021 14:13:15 +0800 Subject: [PATCH 108/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0RetPMSADOLType?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 2cb6648..e332f58 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -407,6 +407,12 @@ KLINE void SetPMSADOLType(PMSAD* msad, U32 oltype) return; } +KLINE U32 RetPMSADOLType(PMSAD* msad) +{ + IF_NULL_DEAD(msad); + return (U32)(msad->CountFlags.OLTypeBit); +} + KLINE void SetPMSADOccupancyType(PMSAD* msad, U32 occupancytype) { IF_NULL_DEAD(msad); From 245e34e71cee7bcb074efbb7dd0473857497c017 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 30 Sep 2021 14:15:15 +0800 Subject: [PATCH 109/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0RetPMSADBlockLink?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index e332f58..e45b0da 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -464,6 +464,12 @@ KLINE void ClearPMSADBlockLink(PMSAD* msad) return; } +KLINE void* RetPMSADBlockLink(PMSAD* msad) +{ + IF_NULL_DEAD(msad); + return msad->BlockLink; +} + KLINE void GetPMSAD(PMSAD* msad) { IF_NULL_DEAD(msad); From 7da37e658fa34f378446239ba0399b3cc236eb12 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 8 Oct 2021 15:16:14 +0800 Subject: [PATCH 110/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E5=88=86=E9=85=8D=EF=BC=9AForPmsadNrRetPABListOnMArea=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 10 +++++++++ Kernel/Memory/KrlMmAlloc.c | 26 ++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index e69de29..cccc09d 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -0,0 +1,10 @@ +/********************************************************** + 物理内存分配文件KrlMmAlloc.c +*********************************************************** + 彭东 +**********************************************************/ + +#ifndef _KRLMMALLOCHEAD +#define _KRLMMALLOCHEAD +private PABHList* ForPmsadNrRetPABListOnMArea(MNode* node, MArea* area, UInt msadnr); +#endif \ No newline at end of file diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index e69de29..cb92259 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -0,0 +1,26 @@ +/********************************************************** + 物理内存分配文件KrlMmAlloc.c +*********************************************************** + 彭东 +**********************************************************/ +#include "BaseType.h" +#include "List.h" +#include "KrlMmManage.h" +#include "KrlMmAlloc.h" + +private PABHList* ForPmsadNrRetPABListOnMArea(MNode* node, MArea* area, UInt msadnr) +{ + PABHList* abhlist = NULL; + IF_NULL_RETURN_NULL(node); + IF_NULL_RETURN_NULL(area); + abhlist = area->MSPLMerData.PAddrBlockAr; + for(UInt i = 0; i < MSPLMER_ARR_LMAX; i++) + { + if(abhlist->InOrderPmsadNR >= msadnr) + { + return abhlist; + } + } + return NULL; +} + From c09ba9efb12df041baa15660ab0887f0683839ee Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 8 Oct 2021 15:17:29 +0800 Subject: [PATCH 111/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E5=88=86=E9=85=8D=EF=BC=9AForPmsadNrRetAllocPABListOnMArea?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 2 ++ Kernel/Memory/KrlMmAlloc.c | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index cccc09d..bb631da 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -7,4 +7,6 @@ #ifndef _KRLMMALLOCHEAD #define _KRLMMALLOCHEAD private PABHList* ForPmsadNrRetPABListOnMArea(MNode* node, MArea* area, UInt msadnr); +private PABHList* ForPmsadNrRetAllocPABListOnMArea(MNode* node, MArea* area, UInt msadnr); + #endif \ No newline at end of file diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index cb92259..cb33ae8 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -24,3 +24,19 @@ private PABHList* ForPmsadNrRetPABListOnMArea(MNode* node, MArea* area, UInt msa return NULL; } +private PABHList* ForPmsadNrRetAllocPABListOnMArea(MNode* node, MArea* area, UInt msadnr) +{ + PABHList* abhlist = NULL; + IF_NULL_RETURN_NULL(node); + IF_NULL_RETURN_NULL(area); + abhlist = area->MSPLMerData.PAddrBlockAr; + for(UInt i = 0; i < MSPLMER_ARR_LMAX; i++) + { + if((abhlist->InOrderPmsadNR >= msadnr) && (abhlist->FreePmsadNR >= msadnr) && + (ListIsEmptyCareful(&abhlist->FreeLists) == FALSE)) + { + return abhlist; + } + } + return NULL; +} \ No newline at end of file From 235b148f880547b2a4a174fbff3681c802296177 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 8 Oct 2021 15:18:52 +0800 Subject: [PATCH 112/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E5=88=86=E9=85=8D=EF=BC=9APickPMSADsOnPABHList=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 1 + Kernel/Memory/KrlMmAlloc.c | 38 +++++++++++++++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index bb631da..273d2c3 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -8,5 +8,6 @@ #define _KRLMMALLOCHEAD private PABHList* ForPmsadNrRetPABListOnMArea(MNode* node, MArea* area, UInt msadnr); private PABHList* ForPmsadNrRetAllocPABListOnMArea(MNode* node, MArea* area, UInt msadnr); +private PMSAD* PickPMSADsOnPABHList(PABHList* abhlist); #endif \ No newline at end of file diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index cb33ae8..1f174d3 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -39,4 +39,40 @@ private PABHList* ForPmsadNrRetAllocPABListOnMArea(MNode* node, MArea* area, UIn } } return NULL; -} \ No newline at end of file +} + +private PMSAD* PickPMSADsOnPABHList(PABHList* abhlist) +{ + PMSAD* msad = NULL; + PMSAD* end = NULL; + + IF_NULL_RETURN_NULL(abhlist); + IF_LTN_RETURN(abhlist->FreePmsadNR, abhlist->InOrderPmsadNR, NULL); + KrlMmLocked(&abhlist->Lock); + + if(ListIsEmptyCareful(&abhlist->FreeLists) == TRUE) + { + KrlMmUnLock(&abhlist->Lock); + return NULL; + } + + msad = ListFirstOne(&abhlist->FreeLists, PMSAD, Lists); + if(1 == abhlist->InOrderPmsadNR) + { + IF_NEQ_DEAD(MF_OLKTY_BAFH, RetPMSADOLType(msad), "PMSAD OLTYPE NOT MF_OLKTY_BAFH"); + ListDel(&msad->Lists); + abhlist->FreePmsadNR -= 1; + KrlMmUnLock(&abhlist->Lock); + return msad; + } + + IF_NEQ_DEAD(MF_OLKTY_ODER, RetPMSADOLType(msad), "PMSAD OLTYPE NOT MF_OLKTY_ODER"); + + end = (PMSAD*)RetPMSADBlockLink(msad); + IF_NEQ_DEAD(MF_OLKTY_BAFH, RetPMSADOLType(end), "PMSAD OLTYPE NOT MF_OLKTY_BAFH"); + + ListDel(&msad->Lists); + abhlist->FreePmsadNR -= abhlist->InOrderPmsadNR; + KrlMmUnLock(&abhlist->Lock); + return msad; +} From a3e797af9a726e27fcea1753e98dce7f2d8dc352 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 8 Oct 2021 15:23:44 +0800 Subject: [PATCH 113/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E5=88=86=E9=85=8D=EF=BC=9APutsPMSADsOnPABHList=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 1 + Kernel/Memory/KrlMmAlloc.c | 29 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index 273d2c3..1a75cf2 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -9,5 +9,6 @@ private PABHList* ForPmsadNrRetPABListOnMArea(MNode* node, MArea* area, UInt msadnr); private PABHList* ForPmsadNrRetAllocPABListOnMArea(MNode* node, MArea* area, UInt msadnr); private PMSAD* PickPMSADsOnPABHList(PABHList* abhlist); +private Bool PutsPMSADsOnPABHList(PABHList* abhlist, PMSAD* msad, UInt order); #endif \ No newline at end of file diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 1f174d3..9da35f0 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -76,3 +76,32 @@ private PMSAD* PickPMSADsOnPABHList(PABHList* abhlist) KrlMmUnLock(&abhlist->Lock); return msad; } + +private Bool PutsPMSADsOnPABHList(PABHList* abhlist, PMSAD* msad, UInt order) +{ + PMSAD* msadend = NULL; + IF_NULL_RETURN_FALSE(abhlist); + IF_NULL_RETURN_FALSE(msad); + + if(PMSADIsFree(msad) == FALSE) + { + return FALSE; + } + if(abhlist->Order != order) + { + return FALSE; + } + + KrlMmLocked(&abhlist->Lock); + + msadend = &msad[(1 << order) - 1]; + ListAdd(&msad->Lists, &abhlist->FreeLists); + SetPMSADOLType(msad, MF_OLKTY_ODER); + SetPMSADBlockLink(msad, (void*)msadend); + SetPMSADOLType(msadend, MF_OLKTY_BAFH); + SetPMSADBlockLink(msad, (void*)abhlist); + abhlist->FreePmsadNR += (1 << order); + abhlist->PmsadNR += (1 << order); + KrlMmUnLock(&abhlist->Lock); + return TRUE; +} From ef668f121fe42c54d46eda49b0dcfe5933480050 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 8 Oct 2021 15:25:02 +0800 Subject: [PATCH 114/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E5=88=86=E9=85=8D=EF=BC=9AOperationAfterAllocPMSADs=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 1 + Kernel/Memory/KrlMmAlloc.c | 33 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index 1a75cf2..42fe866 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -10,5 +10,6 @@ private PABHList* ForPmsadNrRetPABListOnMArea(MNode* node, MArea* area, UInt msa private PABHList* ForPmsadNrRetAllocPABListOnMArea(MNode* node, MArea* area, UInt msadnr); private PMSAD* PickPMSADsOnPABHList(PABHList* abhlist); private Bool PutsPMSADsOnPABHList(PABHList* abhlist, PMSAD* msad, UInt order); +private PMSAD* OperationAfterAllocPMSADs(PABHList* abhlist, PMSAD* start, PMSAD* end); #endif \ No newline at end of file diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 9da35f0..91d3d6c 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -105,3 +105,36 @@ private Bool PutsPMSADsOnPABHList(PABHList* abhlist, PMSAD* msad, UInt order) KrlMmUnLock(&abhlist->Lock); return TRUE; } + +private PMSAD* OperationAfterAllocPMSADs(PABHList* abhlist, PMSAD* start, PMSAD* end) +{ + UInt msadnr = 0; + IF_EQT_DEAD(NULL, abhlist, "PARM:abhlist == NULL\n"); + IF_EQT_DEAD(NULL, start, "PARM: start == NULL\n"); + IF_EQT_DEAD(NULL, end, "PARM:end == NULL\n"); + IF_EQT_DEAD(FALSE, PMSADIsFree(start), "PMSAD:start is Not Free\n"); + IF_EQT_DEAD(FALSE, PMSADIsFree(end), "PMSAD:end is Not Free\n"); + + msadnr = (end - start) + 1; + IF_NEQ_DEAD(msadnr, abhlist->InOrderPmsadNR, "abhlist->InOrderPmsadNR != msadnr\n"); + + if(start == end) + { + IF_NEQ_DEAD(1, abhlist->InOrderPmsadNR, "abhlist->InOrderPmsadNR != 1\n"); + GetPMSAD(start); + SetPMSADAlloc(start); + SetPMSADOLType(start, MF_OLKTY_ODER); + SetPMSADBlockLink(start, (void*)end); + return start; + } + GetPMSAD(start); + SetPMSADAlloc(start); + + GetPMSAD(end); + SetPMSADAlloc(end); + + SetPMSADOLType(start, MF_OLKTY_ODER); + SetPMSADBlockLink(start, (void*)end); + + return start; +} \ No newline at end of file From 553ca59aed20a906ae6c02da21fec9d2f5887eac Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 8 Oct 2021 15:26:38 +0800 Subject: [PATCH 115/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E5=88=86=E9=85=8D=EF=BC=9AAllocPMSADsOnPABHList=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 3 +- Kernel/Memory/KrlMmAlloc.c | 43 ++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index 42fe866..8ef34f1 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -10,6 +10,7 @@ private PABHList* ForPmsadNrRetPABListOnMArea(MNode* node, MArea* area, UInt msa private PABHList* ForPmsadNrRetAllocPABListOnMArea(MNode* node, MArea* area, UInt msadnr); private PMSAD* PickPMSADsOnPABHList(PABHList* abhlist); private Bool PutsPMSADsOnPABHList(PABHList* abhlist, PMSAD* msad, UInt order); -private PMSAD* OperationAfterAllocPMSADs(PABHList* abhlist, PMSAD* start, PMSAD* end); +private PMSAD* OperationAfterAllocPMSADs(PABHList* abhlist, PMSAD* start, PMSAD* end); +private PMSAD* AllocPMSADsOnPABHList(MNode* node, MArea* area, PABHList* abhlist, PABHList* allocbhlist, UInt msadnr); #endif \ No newline at end of file diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 91d3d6c..d75c0ca 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -137,4 +137,47 @@ private PMSAD* OperationAfterAllocPMSADs(PABHList* abhlist, PMSAD* start, PMSAD* SetPMSADBlockLink(start, (void*)end); return start; +} + +private PMSAD* AllocPMSADsOnPABHList(MNode* node, MArea* area, PABHList* abhlist, PABHList* allocbhlist, UInt msadnr) +{ + PABHList* start = NULL; + PABHList* end = NULL; + PABHList* tmp = NULL; + PMSAD* msad = NULL; + Bool rets = FALSE; + + IF_NULL_RETURN_NULL(node); + IF_NULL_RETURN_NULL(area); + IF_NULL_RETURN_NULL(abhlist); + IF_NULL_RETURN_NULL(allocbhlist); + + IF_LTN_RETURN(msadnr, abhlist->InOrderPmsadNR, NULL); + IF_GTN_RETURN(msadnr, allocbhlist->InOrderPmsadNR, NULL); + + IF_GTN_RETURN(abhlist, allocbhlist, NULL); + start = abhlist; + end = allocbhlist; + + if(start == end) + { + msad = PickPMSADsOnPABHList(allocbhlist); + IF_NULL_RETURN_NULL(msad); + SetPMSADAlloc(msad); + GetPMSAD(msad); + return msad; + } + + msad = PickPMSADsOnPABHList(allocbhlist); + IF_NULL_RETURN_NULL(msad); + + tmp = end - 1; + while(tmp >= start) + { + rets = PutsPMSADsOnPABHList(tmp, &msad[tmp->InOrderPmsadNR], tmp->Order); + IF_NEQ_DEAD(FALSE, rets, "PMSADAddInPABHList rets FALSE\n"); + tmp--; + } + OperationAfterAllocPMSADs(abhlist, msad, &msad[abhlist->InOrderPmsadNR]) + return msad; } \ No newline at end of file From 3616827a025085c30aa34741abe591675d906b95 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 8 Oct 2021 15:28:19 +0800 Subject: [PATCH 116/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E5=88=86=E9=85=8D=EF=BC=9AKrlMmAllocPMSADsRealizeCore=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 1 + Kernel/Memory/KrlMmAlloc.c | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index 8ef34f1..341cc5b 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -12,5 +12,6 @@ private PMSAD* PickPMSADsOnPABHList(PABHList* abhlist); private Bool PutsPMSADsOnPABHList(PABHList* abhlist, PMSAD* msad, UInt order); private PMSAD* OperationAfterAllocPMSADs(PABHList* abhlist, PMSAD* start, PMSAD* end); private PMSAD* AllocPMSADsOnPABHList(MNode* node, MArea* area, PABHList* abhlist, PABHList* allocbhlist, UInt msadnr); +private PMSAD* KrlMmAllocPMSADsRealizeCore(GMemManage* gmm, MNode* node, MArea* area, UInt msadnr, U64 flags); #endif \ No newline at end of file diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index d75c0ca..e0a50a8 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -180,4 +180,28 @@ private PMSAD* AllocPMSADsOnPABHList(MNode* node, MArea* area, PABHList* abhlist } OperationAfterAllocPMSADs(abhlist, msad, &msad[abhlist->InOrderPmsadNR]) return msad; +} + +private PMSAD* KrlMmAllocPMSADsRealizeCore(GMemManage* gmm, MNode* node, MArea* area, UInt msadnr, U64 flags) +{ + PABHList* abhlist = NULL; + PABHList* allocbhlist = NULL; + PMSAD* msad = NULL; + IF_NULL_RETURN_NULL(gmm); + IF_NULL_RETURN_NULL(node); + IF_NULL_RETURN_NULL(area); + IF_ZERO_RETURN_NULL(msadnr); + + IF_LTN_RETURN(gmm->FreePMSAD, msadnr, NULL); + IF_LTN_RETURN(area->FreePMSAD, msadnr, NULL); + + abhlist = ForPmsadNrRetPABListOnMArea(node, area, msadnr); + IF_NULL_RETURN_NULL(abhlist); + + allocbhlist = ForPmsadNrRetAllocPABListOnMArea(node, area, msadnr); + IF_NULL_RETURN_NULL(allocbhlist); + + msad = AllocPMSADsOnPABHList(node, area, abhlist, msadnr); + IF_NULL_RETURN_NULL(msad); + return msad; } \ No newline at end of file From 0d8a079579d996855f88b1dbfd493afa2531f6bb Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 8 Oct 2021 16:14:47 +0800 Subject: [PATCH 117/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmGetMNode?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 1 + Kernel/Memory/KrlMmManage.c | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index e45b0da..80c98fd 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -617,6 +617,7 @@ private UInt ScanSameAreaTypePMSADs(MNode* node, MArea* area, PMSAD* start, PMSA private UInt PMSADBlockInitOnPMSADDire(MNode* node, MArea* area, PMSADDire* dire); private Bool OneMAreaInitOnMNode(MNode* node, MArea* area); private Bool MAreaInitOnMNode(MNode* node); +public MNode* KrlMmGetMNode(UInt nodeid); public Bool KrlMmMAreaInit(); private Bool DefaultMNodeInit(); public Bool KrlMmMNodeInit(); diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index bdef577..a871254 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -749,6 +749,26 @@ private Bool MAreaInitOnMNode(MNode* node) return TRUE; } +public MNode* KrlMmGetMNode(UInt nodeid) +{ + GMemManage* gmm = NULL; + MNode* node + gmm = KrlMmGetGMemManageAddr(); + IF_NULL_RETURN_NULL(gmm); + + node = gmm->MNodeStart; + IF_NULL_RETURN_NULL(node); + + for(UInt i = 0; i < gmm->MNodeNR; i++) + { + if(i == nodeid) + { + return &node[i]; + } + } + return NULL; +} + public Bool KrlMmMAreaInit() { MNode* node = NULL; From 645bd116b3d0ec75390525f2362bb3dacd911fd8 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 8 Oct 2021 16:29:12 +0800 Subject: [PATCH 118/221] =?UTF-8?q?=E4=BF=AE=E6=94=B9MArea=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=BB=93=E6=9E=84=EF=BC=8C=E5=85=B6=E4=B8=AD=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0AreaId=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 1 + Kernel/Memory/KrlMmManage.c | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 80c98fd..d209e2d 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -189,6 +189,7 @@ typedef struct MAREA { List Lists; MLock Lock; + U64 AreaId; UInt Status; UInt Flags; UInt Type; diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index a871254..9465bc2 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -83,6 +83,7 @@ private void MNodeInit(MNode* init) for(UInt i = 0; i < MEMAREA_MAX; i++) { MAreaInit(&init->MAreaArr[i]); + init->MAreaArr[i].AreaId = (U64)i; } return; } @@ -761,7 +762,7 @@ public MNode* KrlMmGetMNode(UInt nodeid) for(UInt i = 0; i < gmm->MNodeNR; i++) { - if(i == nodeid) + if(node[i].NodeID == nodeid) { return &node[i]; } @@ -769,6 +770,8 @@ public MNode* KrlMmGetMNode(UInt nodeid) return NULL; } + + public Bool KrlMmMAreaInit() { MNode* node = NULL; From d81a0a4f3b98fc17f523045f07cb3b937cb9e9e3 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 8 Oct 2021 16:31:53 +0800 Subject: [PATCH 119/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmGetMArea?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 1 + Kernel/Memory/KrlMmManage.c | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index d209e2d..51c484d 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -619,6 +619,7 @@ private UInt PMSADBlockInitOnPMSADDire(MNode* node, MArea* area, PMSADDire* dire private Bool OneMAreaInitOnMNode(MNode* node, MArea* area); private Bool MAreaInitOnMNode(MNode* node); public MNode* KrlMmGetMNode(UInt nodeid); +public MArea* KrlMmGetMArea(MNode* node, UInt areaid); public Bool KrlMmMAreaInit(); private Bool DefaultMNodeInit(); public Bool KrlMmMNodeInit(); diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index 9465bc2..0d20435 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -770,7 +770,19 @@ public MNode* KrlMmGetMNode(UInt nodeid) return NULL; } - +public MArea* KrlMmGetMArea(MNode* node, UInt areaid) +{ + IF_NULL_RETURN_NULL(node); + + for(UInt i = 0; i < MEMAREA_MAX; i++) + { + if(node->MAreaArr[i].AreaId == (U64)areaid) + { + return &node->MAreaArr[i]; + } + } + return NULL; +} public Bool KrlMmMAreaInit() { From 15df963e355385d3eb800cbd64aa7b435a803154 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 8 Oct 2021 16:43:32 +0800 Subject: [PATCH 120/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E5=88=86=E9=85=8D=EF=BC=9AKrlMmAllocPMSADsRealize=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 1 + Kernel/Memory/KrlMmAlloc.c | 28 ++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index 341cc5b..8929d26 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -13,5 +13,6 @@ private Bool PutsPMSADsOnPABHList(PABHList* abhlist, PMSAD* msad, UInt order); private PMSAD* OperationAfterAllocPMSADs(PABHList* abhlist, PMSAD* start, PMSAD* end); private PMSAD* AllocPMSADsOnPABHList(MNode* node, MArea* area, PABHList* abhlist, PABHList* allocbhlist, UInt msadnr); private PMSAD* KrlMmAllocPMSADsRealizeCore(GMemManage* gmm, MNode* node, MArea* area, UInt msadnr, U64 flags); +private PMSAD* KrlMmAllocPMSADsRealize(UInt nodeid, UInt areaid, UInt msadnr, U64 flags); #endif \ No newline at end of file diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index e0a50a8..906caba 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -178,7 +178,7 @@ private PMSAD* AllocPMSADsOnPABHList(MNode* node, MArea* area, PABHList* abhlist IF_NEQ_DEAD(FALSE, rets, "PMSADAddInPABHList rets FALSE\n"); tmp--; } - OperationAfterAllocPMSADs(abhlist, msad, &msad[abhlist->InOrderPmsadNR]) + OperationAfterAllocPMSADs(abhlist, msad, &msad[abhlist->InOrderPmsadNR]); return msad; } @@ -204,4 +204,28 @@ private PMSAD* KrlMmAllocPMSADsRealizeCore(GMemManage* gmm, MNode* node, MArea* msad = AllocPMSADsOnPABHList(node, area, abhlist, msadnr); IF_NULL_RETURN_NULL(msad); return msad; -} \ No newline at end of file +} + +private PMSAD* KrlMmAllocPMSADsRealize(UInt nodeid, UInt areaid, UInt msadnr, U64 flags) +{ + GMemManage* gmm = NULL; + MNode* node = NULL; + MArea* area = NULL; + PMSAD* msad = NULL; + + gmm = KrlMmGetGMemManageAddr(); + IF_NULL_RETURN_NULL(gmm); + + node = KrlMmGetMNode(nodeid); + IF_NULL_RETURN_NULL(node); + + area = KrlMmGetMArea(node, areaid); + IF_NULL_RETURN_NULL(area); + + KrlMmLocked(&node->Lock); + KrlMmLocked(&area->Lock); + msad = KrlMmAllocPMSADsRealizeCore(gmm, node, area, msadnr, flags); + KrlMmUnLock(&area->Lock); + KrlMmUnLock(&node->Lock); + return NULL; +} From 2fc589cc5115f6861997fac102a1b363f475eac9 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 8 Oct 2021 16:48:50 +0800 Subject: [PATCH 121/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E5=88=86=E9=85=8D=EF=BC=9AKrlMmAllocPMSADs=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 5 ++++- Kernel/Memory/KrlMmAlloc.c | 7 ++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index 8929d26..a628de9 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -6,6 +6,8 @@ #ifndef _KRLMMALLOCHEAD #define _KRLMMALLOCHEAD + +#define KMAF_DEFAULT (0) private PABHList* ForPmsadNrRetPABListOnMArea(MNode* node, MArea* area, UInt msadnr); private PABHList* ForPmsadNrRetAllocPABListOnMArea(MNode* node, MArea* area, UInt msadnr); private PMSAD* PickPMSADsOnPABHList(PABHList* abhlist); @@ -14,5 +16,6 @@ private PMSAD* OperationAfterAllocPMSADs(PABHList* abhlist, PMSAD* start, PMSAD* private PMSAD* AllocPMSADsOnPABHList(MNode* node, MArea* area, PABHList* abhlist, PABHList* allocbhlist, UInt msadnr); private PMSAD* KrlMmAllocPMSADsRealizeCore(GMemManage* gmm, MNode* node, MArea* area, UInt msadnr, U64 flags); private PMSAD* KrlMmAllocPMSADsRealize(UInt nodeid, UInt areaid, UInt msadnr, U64 flags); +public PMSAD* KrlMmAllocPMSADs(UInt nodeid, UInt areaid, UInt msadnr); -#endif \ No newline at end of file +#endif diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 906caba..0b1d204 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -221,7 +221,7 @@ private PMSAD* KrlMmAllocPMSADsRealize(UInt nodeid, UInt areaid, UInt msadnr, U6 area = KrlMmGetMArea(node, areaid); IF_NULL_RETURN_NULL(area); - + KrlMmLocked(&node->Lock); KrlMmLocked(&area->Lock); msad = KrlMmAllocPMSADsRealizeCore(gmm, node, area, msadnr, flags); @@ -229,3 +229,8 @@ private PMSAD* KrlMmAllocPMSADsRealize(UInt nodeid, UInt areaid, UInt msadnr, U6 KrlMmUnLock(&node->Lock); return NULL; } + +public PMSAD* KrlMmAllocPMSADs(UInt nodeid, UInt areaid, UInt msadnr) +{ + return KrlMmAllocPMSADsRealize(nodeid, areaid, msadnr, KMAF_DEFAULT); +} \ No newline at end of file From df3cbd0e30afe0b2160d31a2182ca93e83f1f72d Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 8 Oct 2021 17:56:38 +0800 Subject: [PATCH 122/221] =?UTF-8?q?=E4=BF=AE=E6=94=B9KrlMmAllocPMSADs?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 3 ++- Kernel/Memory/KrlMmAlloc.c | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index a628de9..21e9ad1 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -8,6 +8,7 @@ #define _KRLMMALLOCHEAD #define KMAF_DEFAULT (0) + private PABHList* ForPmsadNrRetPABListOnMArea(MNode* node, MArea* area, UInt msadnr); private PABHList* ForPmsadNrRetAllocPABListOnMArea(MNode* node, MArea* area, UInt msadnr); private PMSAD* PickPMSADsOnPABHList(PABHList* abhlist); @@ -16,6 +17,6 @@ private PMSAD* OperationAfterAllocPMSADs(PABHList* abhlist, PMSAD* start, PMSAD* private PMSAD* AllocPMSADsOnPABHList(MNode* node, MArea* area, PABHList* abhlist, PABHList* allocbhlist, UInt msadnr); private PMSAD* KrlMmAllocPMSADsRealizeCore(GMemManage* gmm, MNode* node, MArea* area, UInt msadnr, U64 flags); private PMSAD* KrlMmAllocPMSADsRealize(UInt nodeid, UInt areaid, UInt msadnr, U64 flags); -public PMSAD* KrlMmAllocPMSADs(UInt nodeid, UInt areaid, UInt msadnr); +public PMSAD* KrlMmAllocPMSADs(UInt nodeid, UInt areaid, UInt msadnr, U64 flags); #endif diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 0b1d204..95e3c61 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -230,7 +230,8 @@ private PMSAD* KrlMmAllocPMSADsRealize(UInt nodeid, UInt areaid, UInt msadnr, U6 return NULL; } -public PMSAD* KrlMmAllocPMSADs(UInt nodeid, UInt areaid, UInt msadnr) +public PMSAD* KrlMmAllocPMSADs(UInt nodeid, UInt areaid, UInt msadnr, U64 flags) { - return KrlMmAllocPMSADsRealize(nodeid, areaid, msadnr, KMAF_DEFAULT); -} \ No newline at end of file + return KrlMmAllocPMSADsRealize(nodeid, areaid, msadnr, flags); +} + From 06b177d10d857b5ef78235e0ab6241129dc84070 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 8 Oct 2021 17:59:39 +0800 Subject: [PATCH 123/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E5=88=86=E9=85=8D=EF=BC=9AKrlMmAllocKernPMSADs=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 8 +++++++- Kernel/Memory/KrlMmAlloc.c | 5 +++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index 21e9ad1..a8c1113 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -8,6 +8,12 @@ #define _KRLMMALLOCHEAD #define KMAF_DEFAULT (0) +#define DEFAULT_NODE_ID (0) +#define INIT_AREA_ID (MA_TYPE_INIT) +#define HWAD_AREA_ID (MA_TYPE_HWAD) +#define KERN_AREA_ID (MA_TYPE_KRNL) +#define USER_AREA_ID (MA_TYPE_PROC) +#define SHAR_AREA_ID (MA_TYPE_SHAR) private PABHList* ForPmsadNrRetPABListOnMArea(MNode* node, MArea* area, UInt msadnr); private PABHList* ForPmsadNrRetAllocPABListOnMArea(MNode* node, MArea* area, UInt msadnr); @@ -18,5 +24,5 @@ private PMSAD* AllocPMSADsOnPABHList(MNode* node, MArea* area, PABHList* abhlist private PMSAD* KrlMmAllocPMSADsRealizeCore(GMemManage* gmm, MNode* node, MArea* area, UInt msadnr, U64 flags); private PMSAD* KrlMmAllocPMSADsRealize(UInt nodeid, UInt areaid, UInt msadnr, U64 flags); public PMSAD* KrlMmAllocPMSADs(UInt nodeid, UInt areaid, UInt msadnr, U64 flags); - +public PMSAD* KrlMmAllocKernPMSADs(UInt msadnr); #endif diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 95e3c61..5c1ccf6 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -235,3 +235,8 @@ public PMSAD* KrlMmAllocPMSADs(UInt nodeid, UInt areaid, UInt msadnr, U64 flags) return KrlMmAllocPMSADsRealize(nodeid, areaid, msadnr, flags); } + +public PMSAD* KrlMmAllocKernPMSADs(UInt msadnr) +{ + return KrlMmAllocPMSADs(DEFAULT_NODE_ID, KERN_AREA_ID, msadnr, KMAF_DEFAULT); +} \ No newline at end of file From 160ce985c65e1a3c066ef0ba19b46b851e5524a7 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 8 Oct 2021 18:01:46 +0800 Subject: [PATCH 124/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E5=88=86=E9=85=8D=EF=BC=9AKrlMmAllocUserPMSADs=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 2 ++ Kernel/Memory/KrlMmAlloc.c | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index a8c1113..db2c110 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -25,4 +25,6 @@ private PMSAD* KrlMmAllocPMSADsRealizeCore(GMemManage* gmm, MNode* node, MArea* private PMSAD* KrlMmAllocPMSADsRealize(UInt nodeid, UInt areaid, UInt msadnr, U64 flags); public PMSAD* KrlMmAllocPMSADs(UInt nodeid, UInt areaid, UInt msadnr, U64 flags); public PMSAD* KrlMmAllocKernPMSADs(UInt msadnr); +public PMSAD* KrlMmAllocUserPMSADs(UInt msadnr); + #endif diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 5c1ccf6..5b559bf 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -239,4 +239,9 @@ public PMSAD* KrlMmAllocPMSADs(UInt nodeid, UInt areaid, UInt msadnr, U64 flags) public PMSAD* KrlMmAllocKernPMSADs(UInt msadnr) { return KrlMmAllocPMSADs(DEFAULT_NODE_ID, KERN_AREA_ID, msadnr, KMAF_DEFAULT); +} + +public PMSAD* KrlMmAllocUserPMSADs(UInt msadnr) +{ + return KrlMmAllocPMSADs(DEFAULT_NODE_ID, USER_AREA_ID, msadnr, KMAF_DEFAULT); } \ No newline at end of file From 7f9974c9ab37f29d39a6f40477a1ef0b39c4af36 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sat, 9 Oct 2021 10:58:22 +0800 Subject: [PATCH 125/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E5=88=86=E9=85=8D=EF=BC=9AKrlMmGetPMSADLen=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 1 + Kernel/Memory/KrlMmAlloc.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index db2c110..d4a66e4 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -23,6 +23,7 @@ private PMSAD* OperationAfterAllocPMSADs(PABHList* abhlist, PMSAD* start, PMSAD* private PMSAD* AllocPMSADsOnPABHList(MNode* node, MArea* area, PABHList* abhlist, PABHList* allocbhlist, UInt msadnr); private PMSAD* KrlMmAllocPMSADsRealizeCore(GMemManage* gmm, MNode* node, MArea* area, UInt msadnr, U64 flags); private PMSAD* KrlMmAllocPMSADsRealize(UInt nodeid, UInt areaid, UInt msadnr, U64 flags); +public U64 KrlMmGetPMSADLen(PMSAD* msad); public PMSAD* KrlMmAllocPMSADs(UInt nodeid, UInt areaid, UInt msadnr, U64 flags); public PMSAD* KrlMmAllocKernPMSADs(UInt msadnr); public PMSAD* KrlMmAllocUserPMSADs(UInt msadnr); diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 5b559bf..a78ed70 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -230,6 +230,19 @@ private PMSAD* KrlMmAllocPMSADsRealize(UInt nodeid, UInt areaid, UInt msadnr, U6 return NULL; } +public U64 KrlMmGetPMSADLen(PMSAD* msad) +{ + PMSAD* end = NULL; + IF_NULL_RETURN_ZERO(msad); + IF_NEQ_RETURN(TRUE, PMSADIsFree(msad), 0); + IF_NULL_RETURN_ZERO(RetPMSADBlockLink(msad)); + + end = (PMSAD*)RetPMSADBlockLink(msad); + IF_LTN_RETURN(end, msad, 0); + + return ((U64)(end - msad) + 1); +} + public PMSAD* KrlMmAllocPMSADs(UInt nodeid, UInt areaid, UInt msadnr, U64 flags) { return KrlMmAllocPMSADsRealize(nodeid, areaid, msadnr, flags); @@ -243,5 +256,6 @@ public PMSAD* KrlMmAllocKernPMSADs(UInt msadnr) public PMSAD* KrlMmAllocUserPMSADs(UInt msadnr) { + IF_NEQONE_RETRUN_NULL(msadnr); return KrlMmAllocPMSADs(DEFAULT_NODE_ID, USER_AREA_ID, msadnr, KMAF_DEFAULT); } \ No newline at end of file From 6c7443b8e77024be581514668c1acf5e16d0b0b8 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sat, 9 Oct 2021 11:06:47 +0800 Subject: [PATCH 126/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E5=88=86=E9=85=8D=EF=BC=9AKrlMmGetPMSADsSize=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 3 ++- Kernel/Memory/KrlMmAlloc.c | 11 ++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index d4a66e4..629fabc 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -23,7 +23,8 @@ private PMSAD* OperationAfterAllocPMSADs(PABHList* abhlist, PMSAD* start, PMSAD* private PMSAD* AllocPMSADsOnPABHList(MNode* node, MArea* area, PABHList* abhlist, PABHList* allocbhlist, UInt msadnr); private PMSAD* KrlMmAllocPMSADsRealizeCore(GMemManage* gmm, MNode* node, MArea* area, UInt msadnr, U64 flags); private PMSAD* KrlMmAllocPMSADsRealize(UInt nodeid, UInt areaid, UInt msadnr, U64 flags); -public U64 KrlMmGetPMSADLen(PMSAD* msad); +public U64 KrlMmGetPMSADsLen(PMSAD* msad); +public U64 KrlMmGetPMSADsSize(PMSAD* msad); public PMSAD* KrlMmAllocPMSADs(UInt nodeid, UInt areaid, UInt msadnr, U64 flags); public PMSAD* KrlMmAllocKernPMSADs(UInt msadnr); public PMSAD* KrlMmAllocUserPMSADs(UInt msadnr); diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index a78ed70..50f081d 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -230,7 +230,7 @@ private PMSAD* KrlMmAllocPMSADsRealize(UInt nodeid, UInt areaid, UInt msadnr, U6 return NULL; } -public U64 KrlMmGetPMSADLen(PMSAD* msad) +public U64 KrlMmGetPMSADsLen(PMSAD* msad) { PMSAD* end = NULL; IF_NULL_RETURN_ZERO(msad); @@ -243,6 +243,15 @@ public U64 KrlMmGetPMSADLen(PMSAD* msad) return ((U64)(end - msad) + 1); } +public U64 KrlMmGetPMSADsSize(PMSAD* msad) +{ + U64 msadlen = 0; + IF_NULL_RETURN_ZERO(msad); + IF_NEQ_RETURN(TRUE, PMSADIsFree(msad), 0); + msadlen = KrlMmGetPMSADLen(msad); + return (msadlen << MSAD_PADR_SLBITS); +} + public PMSAD* KrlMmAllocPMSADs(UInt nodeid, UInt areaid, UInt msadnr, U64 flags) { return KrlMmAllocPMSADsRealize(nodeid, areaid, msadnr, flags); From b5bcef08ea8c88c05a57a884af95127d2d599ef5 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sat, 9 Oct 2021 15:10:47 +0800 Subject: [PATCH 127/221] =?UTF-8?q?=E4=BF=AE=E6=94=B9AllocPMSADsOnPABHList?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmAlloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 50f081d..3bb8f48 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -178,7 +178,7 @@ private PMSAD* AllocPMSADsOnPABHList(MNode* node, MArea* area, PABHList* abhlist IF_NEQ_DEAD(FALSE, rets, "PMSADAddInPABHList rets FALSE\n"); tmp--; } - OperationAfterAllocPMSADs(abhlist, msad, &msad[abhlist->InOrderPmsadNR]); + OperationAfterAllocPMSADs(abhlist, msad, &msad[abhlist->InOrderPmsadNR]); return msad; } From bc53b6d619e91d15f7d3291920bcc17e367886fa Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sat, 9 Oct 2021 15:19:45 +0800 Subject: [PATCH 128/221] =?UTF-8?q?=E4=BF=AE=E6=94=B9KrlMmAllocPMSADsReali?= =?UTF-8?q?ze=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmAlloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 3bb8f48..e0d494b 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -227,7 +227,7 @@ private PMSAD* KrlMmAllocPMSADsRealize(UInt nodeid, UInt areaid, UInt msadnr, U6 msad = KrlMmAllocPMSADsRealizeCore(gmm, node, area, msadnr, flags); KrlMmUnLock(&area->Lock); KrlMmUnLock(&node->Lock); - return NULL; + return msad; } public U64 KrlMmGetPMSADsLen(PMSAD* msad) From e5d3b719c41289edd5cdbfed15ef455fa789a731 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Sat, 9 Oct 2021 17:36:04 +0800 Subject: [PATCH 129/221] =?UTF-8?q?=E4=BF=AE=E6=94=B9ForPmsadNrRetPABListO?= =?UTF-8?q?nMArea=E3=80=81ForPmsadNrRetAllocPABListOnMArea=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmAlloc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index e0d494b..b9affa1 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -13,7 +13,7 @@ private PABHList* ForPmsadNrRetPABListOnMArea(MNode* node, MArea* area, UInt msa PABHList* abhlist = NULL; IF_NULL_RETURN_NULL(node); IF_NULL_RETURN_NULL(area); - abhlist = area->MSPLMerData.PAddrBlockAr; + abhlist = area->MSPLMerData.PAddrBlockArr; for(UInt i = 0; i < MSPLMER_ARR_LMAX; i++) { if(abhlist->InOrderPmsadNR >= msadnr) @@ -29,7 +29,7 @@ private PABHList* ForPmsadNrRetAllocPABListOnMArea(MNode* node, MArea* area, UIn PABHList* abhlist = NULL; IF_NULL_RETURN_NULL(node); IF_NULL_RETURN_NULL(area); - abhlist = area->MSPLMerData.PAddrBlockAr; + abhlist = area->MSPLMerData.PAddrBlockArr; for(UInt i = 0; i < MSPLMER_ARR_LMAX; i++) { if((abhlist->InOrderPmsadNR >= msadnr) && (abhlist->FreePmsadNR >= msadnr) && From 5a5b0b594bf1305ee5a25305b66478a194b5fea6 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 12 Oct 2021 10:10:16 +0800 Subject: [PATCH 130/221] =?UTF-8?q?=E4=BF=AE=E6=94=B9HalSearch32RLBits?= =?UTF-8?q?=E3=80=81HalSearch64RLBits=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/HalInc/X86_64Inc/HalCPU.h | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/Include/HalInc/X86_64Inc/HalCPU.h b/Include/HalInc/X86_64Inc/HalCPU.h index 09826ca..8c47b0e 100644 --- a/Include/HalInc/X86_64Inc/HalCPU.h +++ b/Include/HalInc/X86_64Inc/HalCPU.h @@ -408,22 +408,28 @@ KLINE U64 HalReadX86RDTSC(void) KLINE SInt HalSearch64RLBits(U64 val) { - SInt retbitnr = -1; + SInt count = -1; __asm__ __volatile__( "bsrq %1,%q0 \t\n" - : "+r"(retbitnr) - : "rm"(val)); - return retbitnr + 1; + "jnz 1f \t\n" + "movq $-1,%q0 \t\n" + "1:" + : "=q"(count) + : "q"(val)); + return count; } KLINE SInt HalSearch32RLBits(U32 val) { - SInt retbitnr = -1; + SInt count = -1; __asm__ __volatile__( "bsrl %1,%0 \t\n" - : "+r"(retbitnr) - : "rm"(val)); - return retbitnr + 1; + "jnz 1f \t\n" + "movl $-1,%0 \t\n" + "1:" + : "=r"(count) + : "r"(val)); + return count; } KLINE U32 HalReadKESP() From 5d822efece990112b6d90da75dd117c9de61c73b Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 12 Oct 2021 10:25:15 +0800 Subject: [PATCH 131/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ForPmsadNrRetOrder?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 2 +- Kernel/Memory/KrlMmAlloc.c | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index 629fabc..be235ed 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -14,7 +14,7 @@ #define KERN_AREA_ID (MA_TYPE_KRNL) #define USER_AREA_ID (MA_TYPE_PROC) #define SHAR_AREA_ID (MA_TYPE_SHAR) - +private SInt ForPmsadNrRetOrder(UInt msadnr); private PABHList* ForPmsadNrRetPABListOnMArea(MNode* node, MArea* area, UInt msadnr); private PABHList* ForPmsadNrRetAllocPABListOnMArea(MNode* node, MArea* area, UInt msadnr); private PMSAD* PickPMSADsOnPABHList(PABHList* abhlist); diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index b9affa1..de32be7 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -5,9 +5,23 @@ **********************************************************/ #include "BaseType.h" #include "List.h" +#include "HalCPU.h" #include "KrlMmManage.h" #include "KrlMmAlloc.h" +private SInt ForPmsadNrRetOrder(UInt msadnr) +{ + SInt mbits = HalSearch64RLBits((U64)msadnr); + IF_LTN_RETURN(mbits, 0, -1); + + if(msadnr & (msadnr - 1)) + { + mbits++;//有问题不要使用 + } + return mbits; +} + + private PABHList* ForPmsadNrRetPABListOnMArea(MNode* node, MArea* area, UInt msadnr) { PABHList* abhlist = NULL; @@ -267,4 +281,5 @@ public PMSAD* KrlMmAllocUserPMSADs(UInt msadnr) { IF_NEQONE_RETRUN_NULL(msadnr); return KrlMmAllocPMSADs(DEFAULT_NODE_ID, USER_AREA_ID, msadnr, KMAF_DEFAULT); -} \ No newline at end of file +} + From a3d3c1dba63bf45b1081efc0762562214eb0aeee Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 12 Oct 2021 15:18:28 +0800 Subject: [PATCH 132/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0RetPMSADRefCount?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 51c484d..0cd6b24 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -493,6 +493,13 @@ KLINE void PutPMSAD(PMSAD* msad) return; } +KLINE UInt RetPMSADRefCount(PMSAD* msad) +{ + IF_NULL_DEAD(msad); + return (UInt)msad->CountFlags.RefCountBit; +} + + KLINE GMemManage* KrlMmGetGMemManageAddr() { return &GMemManageData; From 6625fecfc3bfcf6d3d8ec3accaf54917bc5c25c7 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 13 Oct 2021 15:59:07 +0800 Subject: [PATCH 133/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3PickPMSADsOnPABHList?= =?UTF-8?q?=E3=80=81PutsPMSADsOnPABHList=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 2 +- Kernel/Memory/KrlMmAlloc.c | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index be235ed..af9fb1b 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -18,7 +18,7 @@ private SInt ForPmsadNrRetOrder(UInt msadnr); private PABHList* ForPmsadNrRetPABListOnMArea(MNode* node, MArea* area, UInt msadnr); private PABHList* ForPmsadNrRetAllocPABListOnMArea(MNode* node, MArea* area, UInt msadnr); private PMSAD* PickPMSADsOnPABHList(PABHList* abhlist); -private Bool PutsPMSADsOnPABHList(PABHList* abhlist, PMSAD* msad, UInt order); +private Bool PutsPMSADsOnPABHList(PABHList* abhlist, PMSAD* msad, PMSAD* msadend, UInt order); private PMSAD* OperationAfterAllocPMSADs(PABHList* abhlist, PMSAD* start, PMSAD* end); private PMSAD* AllocPMSADsOnPABHList(MNode* node, MArea* area, PABHList* abhlist, PABHList* allocbhlist, UInt msadnr); private PMSAD* KrlMmAllocPMSADsRealizeCore(GMemManage* gmm, MNode* node, MArea* area, UInt msadnr, U64 flags); diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index de32be7..73b8641 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -76,6 +76,7 @@ private PMSAD* PickPMSADsOnPABHList(PABHList* abhlist) IF_NEQ_DEAD(MF_OLKTY_BAFH, RetPMSADOLType(msad), "PMSAD OLTYPE NOT MF_OLKTY_BAFH"); ListDel(&msad->Lists); abhlist->FreePmsadNR -= 1; + abhlist->PmsadNR -= 1; KrlMmUnLock(&abhlist->Lock); return msad; } @@ -87,15 +88,17 @@ private PMSAD* PickPMSADsOnPABHList(PABHList* abhlist) ListDel(&msad->Lists); abhlist->FreePmsadNR -= abhlist->InOrderPmsadNR; + abhlist->PmsadNR -= abhlist->InOrderPmsadNR; KrlMmUnLock(&abhlist->Lock); return msad; } -private Bool PutsPMSADsOnPABHList(PABHList* abhlist, PMSAD* msad, UInt order) +private Bool PutsPMSADsOnPABHList(PABHList* abhlist, PMSAD* msad, PMSAD* msadend, UInt order) { - PMSAD* msadend = NULL; + PMSAD* end = NULL; IF_NULL_RETURN_FALSE(abhlist); IF_NULL_RETURN_FALSE(msad); + IF_NULL_RETURN_FALSE(msadend); if(PMSADIsFree(msad) == FALSE) { @@ -106,9 +109,10 @@ private Bool PutsPMSADsOnPABHList(PABHList* abhlist, PMSAD* msad, UInt order) return FALSE; } + end = &msad[(1 << order) - 1]; + IF_NEQ_RETURN(end, msadend, FALSE); + KrlMmLocked(&abhlist->Lock); - - msadend = &msad[(1 << order) - 1]; ListAdd(&msad->Lists, &abhlist->FreeLists); SetPMSADOLType(msad, MF_OLKTY_ODER); SetPMSADBlockLink(msad, (void*)msadend); @@ -188,7 +192,7 @@ private PMSAD* AllocPMSADsOnPABHList(MNode* node, MArea* area, PABHList* abhlist tmp = end - 1; while(tmp >= start) { - rets = PutsPMSADsOnPABHList(tmp, &msad[tmp->InOrderPmsadNR], tmp->Order); + rets = PutsPMSADsOnPABHList(tmp, &msad[tmp->InOrderPmsadNR], &msad[tmp->InOrderPmsadNR + tmp->InOrderPmsadNR - 1], tmp->Order); IF_NEQ_DEAD(FALSE, rets, "PMSADAddInPABHList rets FALSE\n"); tmp--; } @@ -215,7 +219,7 @@ private PMSAD* KrlMmAllocPMSADsRealizeCore(GMemManage* gmm, MNode* node, MArea* allocbhlist = ForPmsadNrRetAllocPABListOnMArea(node, area, msadnr); IF_NULL_RETURN_NULL(allocbhlist); - msad = AllocPMSADsOnPABHList(node, area, abhlist, msadnr); + msad = AllocPMSADsOnPABHList(node, area, abhlist, allocbhlist, msadnr); IF_NULL_RETURN_NULL(msad); return msad; } @@ -283,3 +287,5 @@ public PMSAD* KrlMmAllocUserPMSADs(UInt msadnr) return KrlMmAllocPMSADs(DEFAULT_NODE_ID, USER_AREA_ID, msadnr, KMAF_DEFAULT); } + + From 8fd80ac9b57a606596e70f9c7dfcd3ef0e16c1a2 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 13 Oct 2021 16:00:58 +0800 Subject: [PATCH 134/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmGetPMSADsEnd?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 1 + Kernel/Memory/KrlMmAlloc.c | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index af9fb1b..6188869 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -25,6 +25,7 @@ private PMSAD* KrlMmAllocPMSADsRealizeCore(GMemManage* gmm, MNode* node, MArea* private PMSAD* KrlMmAllocPMSADsRealize(UInt nodeid, UInt areaid, UInt msadnr, U64 flags); public U64 KrlMmGetPMSADsLen(PMSAD* msad); public U64 KrlMmGetPMSADsSize(PMSAD* msad); +public PMSAD* KrlMmGetPMSADsEnd(PMSAD* msad); public PMSAD* KrlMmAllocPMSADs(UInt nodeid, UInt areaid, UInt msadnr, U64 flags); public PMSAD* KrlMmAllocKernPMSADs(UInt msadnr); public PMSAD* KrlMmAllocUserPMSADs(UInt msadnr); diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 73b8641..f14d851 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -270,6 +270,19 @@ public U64 KrlMmGetPMSADsSize(PMSAD* msad) return (msadlen << MSAD_PADR_SLBITS); } +public PMSAD* KrlMmGetPMSADsEnd(PMSAD* msad) +{ + PMSAD* end = NULL; + IF_NULL_RETURN_NULL(msad); + IF_NEQ_RETURN(TRUE, PMSADIsFree(msad), NULL); + IF_NEQ_RETURN(MF_OLKTY_ODER, RetPMSADOLType(msad), NULL); + IF_NULL_RETURN_NULL(RetPMSADBlockLink(msad)); + + end = (PMSAD*)RetPMSADBlockLink(msad); + IF_LTN_RETURN(end, msad, NULL); + return end; +} + public PMSAD* KrlMmAllocPMSADs(UInt nodeid, UInt areaid, UInt msadnr, U64 flags) { return KrlMmAllocPMSADsRealize(nodeid, areaid, msadnr, flags); From d5583e06d776f751f9f689ecc105d281f4994ac4 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 13 Oct 2021 16:02:51 +0800 Subject: [PATCH 135/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0OperationBeforeFreePM?= =?UTF-8?q?SADs=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 1 + Kernel/Memory/KrlMmAlloc.c | 41 ++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index 6188869..37660c7 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -29,5 +29,6 @@ public PMSAD* KrlMmGetPMSADsEnd(PMSAD* msad); public PMSAD* KrlMmAllocPMSADs(UInt nodeid, UInt areaid, UInt msadnr, U64 flags); public PMSAD* KrlMmAllocKernPMSADs(UInt msadnr); public PMSAD* KrlMmAllocUserPMSADs(UInt msadnr); +private UInt OperationBeforeFreePMSADs(PABHList* abhlist, PMSAD* start, PMSAD* end); #endif diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index f14d851..cb022f4 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -300,5 +300,46 @@ public PMSAD* KrlMmAllocUserPMSADs(UInt msadnr) return KrlMmAllocPMSADs(DEFAULT_NODE_ID, USER_AREA_ID, msadnr, KMAF_DEFAULT); } +private UInt OperationBeforeFreePMSADs(PABHList* abhlist, PMSAD* start, PMSAD* end) +{ + UInt msadnr = 0; + IF_EQT_DEAD(NULL, abhlist, "PARM:abhlist == NULL\n"); + IF_EQT_DEAD(NULL, start, "PARM: start == NULL\n"); + IF_EQT_DEAD(NULL, end, "PARM:end == NULL\n"); + IF_EQT_DEAD(TRUE, PMSADIsFree(start), "PMSAD:start is Not Alloc\n"); + IF_EQT_DEAD(TRUE, PMSADIsFree(end), "PMSAD:end is Not Alloc\n"); + + msadnr = (end - start) + 1; + IF_NEQ_DEAD(msadnr, abhlist->InOrderPmsadNR, "abhlist->InOrderPmsadNR != msadnr\n"); + + if(start == end) + { + IF_NEQ_DEAD(1, abhlist->InOrderPmsadNR, "abhlist->InOrderPmsadNR != 1\n"); + PutPMSAD(start); + if(RetPMSADRefCount(start) > 0) + { + return 1; + } + ClearPMSADAlloc(start); + SetPMSADOLType(start, MF_OLKTY_BAFH); + SetPMSADBlockLink(start, (void*)abhlist); + return 2; + } + PutPMSAD(start); + PutPMSAD(end); + if(RetPMSADRefCount(start) > 0) + { + return 1; + } + + ClearPMSADAlloc(start); + ClearPMSADAlloc(end); + + SetPMSADOLType(start, MF_OLKTY_ODER); + SetPMSADBlockLink(start, (void*)end); + SetPMSADOLType(end, MF_OLKTY_BAFH); + SetPMSADBlockLink(end, (void*)abhlist); + return 2; +} From 88b9bd3eb8d7dea5c3fb5cfee4d2a2b62d128e3a Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 13 Oct 2021 16:04:32 +0800 Subject: [PATCH 136/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0CheckOnePMSADBlock?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 1 + Kernel/Memory/KrlMmAlloc.c | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index 37660c7..4f823ba 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -30,5 +30,6 @@ public PMSAD* KrlMmAllocPMSADs(UInt nodeid, UInt areaid, UInt msadnr, U64 flags) public PMSAD* KrlMmAllocKernPMSADs(UInt msadnr); public PMSAD* KrlMmAllocUserPMSADs(UInt msadnr); private UInt OperationBeforeFreePMSADs(PABHList* abhlist, PMSAD* start, PMSAD* end); +private Bool CheckOnePMSADBlock(PABHList* abhlist, PMSAD* mblockstart, PMSAD* mblockend); #endif diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index cb022f4..5cb7041 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -343,3 +343,15 @@ private UInt OperationBeforeFreePMSADs(PABHList* abhlist, PMSAD* start, PMSAD* e SetPMSADBlockLink(end, (void*)abhlist); return 2; } + +private Bool CheckOnePMSADBlock(PABHList* abhlist, PMSAD* mblockstart, PMSAD* mblockend) +{ + IF_NULL_RETURN_FALSE(abhlist); + IF_NULL_RETURN_FALSE(mblockstart); + IF_NULL_RETURN_FALSE(mblockend); + IF_LTN_RETURN(mblockend, mblockstart, FALSE); + IF_NEQ_RETURN(abhlist->InOrderPmsadNR, ((mblockend - mblockstart) + 1), FALSE); + IF_NEQ_RETURN(TRUE, PMSADIsFree(mblockstart), FALSE); + IF_NEQ_RETURN(TRUE, PMSADIsFree(mblockend), FALSE); + return TRUE; +} \ No newline at end of file From e25c388bd82ff5032b904e7a62f74a740a1a210f Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 13 Oct 2021 16:05:55 +0800 Subject: [PATCH 137/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ClearPMSADTowBlockFla?= =?UTF-8?q?gs=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 1 + Kernel/Memory/KrlMmAlloc.c | 20 +++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index 4f823ba..236fde2 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -31,5 +31,6 @@ public PMSAD* KrlMmAllocKernPMSADs(UInt msadnr); public PMSAD* KrlMmAllocUserPMSADs(UInt msadnr); private UInt OperationBeforeFreePMSADs(PABHList* abhlist, PMSAD* start, PMSAD* end); private Bool CheckOnePMSADBlock(PABHList* abhlist, PMSAD* mblockstart, PMSAD* mblockend); +private Bool ClearPMSADTowBlockFlags(PABHList* abhlist, PMSAD* _1mblocks, PMSAD* _1mblocke, PMSAD* _2mblocks, PMSAD* _2mblocke); #endif diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 5cb7041..6183465 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -354,4 +354,22 @@ private Bool CheckOnePMSADBlock(PABHList* abhlist, PMSAD* mblockstart, PMSAD* mb IF_NEQ_RETURN(TRUE, PMSADIsFree(mblockstart), FALSE); IF_NEQ_RETURN(TRUE, PMSADIsFree(mblockend), FALSE); return TRUE; -} \ No newline at end of file +} + +private Bool ClearPMSADTowBlockFlags(PABHList* abhlist, PMSAD* _1mblocks, PMSAD* _1mblocke, PMSAD* _2mblocks, PMSAD* _2mblocke) +{ + if(_1mblocks == _2mblocks || _1mblocke == _2mblocke) + { + return FALSE; + } + SetPMSADOLType(_1mblocke, MF_OLKTY_INIT); + SetPMSADBlockLink(_1mblocke, NULL); + SetPMSADOLType(_2mblocks, MF_OLKTY_INIT); + SetPMSADBlockLink(_2mblocks, NULL); + + SetPMSADOLType(_1mblocks, MF_OLKTY_ODER); + SetPMSADBlockLink(_1mblocks, (void*)_2mblocke); + SetPMSADOLType(_2mblocke, MF_OLKTY_BAFH); + SetPMSADBlockLink(_2mblocke, (void*)abhlist); + return TRUE; +} From 9c72aa320d6af1851e89085f9e497905b4f126ac Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 13 Oct 2021 16:07:16 +0800 Subject: [PATCH 138/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0PMSADTowBlockIsOk?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 1 + Kernel/Memory/KrlMmAlloc.c | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index 236fde2..a80b3fc 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -32,5 +32,6 @@ public PMSAD* KrlMmAllocUserPMSADs(UInt msadnr); private UInt OperationBeforeFreePMSADs(PABHList* abhlist, PMSAD* start, PMSAD* end); private Bool CheckOnePMSADBlock(PABHList* abhlist, PMSAD* mblockstart, PMSAD* mblockend); private Bool ClearPMSADTowBlockFlags(PABHList* abhlist, PMSAD* _1mblocks, PMSAD* _1mblocke, PMSAD* _2mblocks, PMSAD* _2mblocke); +private UInt PMSADTowBlockIsOk(PABHList* abhlist, PMSAD* _1mblocks, PMSAD* _1mblocke, PMSAD* _2mblocks, PMSAD* _2mblocke); #endif diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 6183465..1a38557 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -373,3 +373,12 @@ private Bool ClearPMSADTowBlockFlags(PABHList* abhlist, PMSAD* _1mblocks, PMSAD* SetPMSADBlockLink(_2mblocke, (void*)abhlist); return TRUE; } + +private UInt PMSADTowBlockIsOk(PABHList* abhlist, PMSAD* _1mblocks, PMSAD* _1mblocke, PMSAD* _2mblocks, PMSAD* _2mblocke) +{ + IF_NEQ_RETURN(TRUE, CheckOnePMSADBlock(abhlist, _1mblocks, _1mblocke), 1); + IF_NEQ_RETURN(TRUE, CheckOnePMSADBlock(abhlist, _2mblocks, _2mblocke), 1); + IF_EQT_RETURN(TRUE, PMSADIsAdjacent(_1mblocke, _2mblocks), 2); + IF_EQT_RETURN(TRUE, PMSADIsAdjacent(_2mblocke, _1mblocks), 4); + return 0; +} \ No newline at end of file From 2a717f8bdfcd749f3d5ac63935ec074ea9dce8bc Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 13 Oct 2021 16:14:24 +0800 Subject: [PATCH 139/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0FindContinuousPMSADsB?= =?UTF-8?q?lock=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 1 + Kernel/Memory/KrlMmAlloc.c | 72 ++++++++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index a80b3fc..a4ca8fd 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -33,5 +33,6 @@ private UInt OperationBeforeFreePMSADs(PABHList* abhlist, PMSAD* start, PMSAD* e private Bool CheckOnePMSADBlock(PABHList* abhlist, PMSAD* mblockstart, PMSAD* mblockend); private Bool ClearPMSADTowBlockFlags(PABHList* abhlist, PMSAD* _1mblocks, PMSAD* _1mblocke, PMSAD* _2mblocks, PMSAD* _2mblocke); private UInt PMSADTowBlockIsOk(PABHList* abhlist, PMSAD* _1mblocks, PMSAD* _1mblocke, PMSAD* _2mblocks, PMSAD* _2mblocke); +private UInt FindContinuousPMSADsBlock(PABHList* abhlist, PMSAD** msadstart, PMSAD** msadend); #endif diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 1a38557..0963ab2 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -381,4 +381,76 @@ private UInt PMSADTowBlockIsOk(PABHList* abhlist, PMSAD* _1mblocks, PMSAD* _1mbl IF_EQT_RETURN(TRUE, PMSADIsAdjacent(_1mblocke, _2mblocks), 2); IF_EQT_RETURN(TRUE, PMSADIsAdjacent(_2mblocke, _1mblocks), 4); return 0; +} + +private UInt FindContinuousPMSADsBlock(PABHList* abhlist, PMSAD** msadstart, PMSAD** msadend) +{ + PMSAD* start = NULL; + PMSAD* end = NULL; + UInt msadnr = 0; + List* tmplst = NULL; + PMSAD* tmpmsa = NULL; + PMSAD* blkms = NULL; + PMSAD* blkme = NULL; + UInt rets = 0; + + start = *msadstart; + end = *msadend; + msadnr = (UInt)KrlMmGetPMSADsLen(start); + + KrlMmLocked(&abhlist->Lock); + if(1 > abhlist->FreePmsadNR) + { + KrlMmUnLock(&abhlist->Lock); + return 1; + } + + IF_EQT_DEAD(abhlist->InOrderPmsadNR, msadnr, "PMSAD len NEQ area order NR\n"); + + ListForEach(tmplst, &abhlist->FreeLists) + { + tmpmsa = ListEntry(tmplst, PMSAD, Lists); + rets = PMSADTowBlockIsOk(abhlist, start, end, tmpmsa, &tmpmsa[abhlist->InOrderPmsadNR - 1]); + if (2 == rets || 4 == rets) + { + blkms = tmpmsa; + blkme = &tmpmsa[abhlist->InOrderPmsadNR - 1]; + ListDel(&tmpmsa->Lists); + abhlist->FreePmsadNR -= abhlist->InOrderPmsadNR; + abhlist->PmsadNR -= abhlist->InOrderPmsadNR; + KrlMmUnLock(&abhlist->Lock); + goto step1; + } + } + + KrlMmUnLock(&abhlist->Lock); + +step1: + if(0 == rets || 1 == rets) + { + return 1; + } + + if(2 == rets) + { + if(ClearPMSADTowBlockFlags(abhlist + 1, start,end, blkms, blkme) == TRUE) + { + *msadstart = start; + *msadend = blkme; + return 2; + } + return 0; + } + + if(4 == rets) + { + if(ClearPMSADTowBlockFlags(abhlist + 1, blkms, blkme, start, end) == TRUE) + { + *msadstart = blkms; + *msadend = end; + return 2; + } + return 0; + } + return 0; } \ No newline at end of file From b42330b40cafd33315f0cb3fc91378eabf3844d1 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 13 Oct 2021 16:18:09 +0800 Subject: [PATCH 140/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0FreePMSADsOnPABHList?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 1 + Kernel/Memory/KrlMmAlloc.c | 36 +++++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index a4ca8fd..47b5021 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -34,5 +34,6 @@ private Bool CheckOnePMSADBlock(PABHList* abhlist, PMSAD* mblockstart, PMSAD* mb private Bool ClearPMSADTowBlockFlags(PABHList* abhlist, PMSAD* _1mblocks, PMSAD* _1mblocke, PMSAD* _2mblocks, PMSAD* _2mblocke); private UInt PMSADTowBlockIsOk(PABHList* abhlist, PMSAD* _1mblocks, PMSAD* _1mblocke, PMSAD* _2mblocks, PMSAD* _2mblocke); private UInt FindContinuousPMSADsBlock(PABHList* abhlist, PMSAD** msadstart, PMSAD** msadend); +private Bool FreePMSADsOnPABHList(MNode* node, MArea* area, PABHList* abhlist, PABHList* freebhlist, PMSAD* msad, UInt msadnr); #endif diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 0963ab2..d42768f 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -422,7 +422,7 @@ private UInt FindContinuousPMSADsBlock(PABHList* abhlist, PMSAD** msadstart, PMS goto step1; } } - + KrlMmUnLock(&abhlist->Lock); step1: @@ -453,4 +453,38 @@ private UInt FindContinuousPMSADsBlock(PABHList* abhlist, PMSAD** msadstart, PMS return 0; } return 0; +} + +private Bool FreePMSADsOnPABHList(MNode* node, MArea* area, PABHList* abhlist, PABHList* freebhlist, PMSAD* msad, UInt msadnr) +{ + PABHList* start = NULL; + PABHList* end = NULL; + PABHList* tmp = NULL; + PMSAD* mblockstart = NULL; + PMSAD* mblockend = NULL; + Bool rets = FALSE; + UInt oks = 0; + + IF_NULL_RETURN_FALSE(node); + IF_NULL_RETURN_FALSE(area); + IF_NULL_RETURN_FALSE(abhlist); + IF_NULL_RETURN_FALSE(freebhlist); + + IF_GTN_RETURN(abhlist, freebhlist, FALSE); + start = abhlist; + end = freebhlist; + + mblockstart = msad; + mblockend = &msad[msadnr - 1]; + for(tmp = start; tmp < end; tmp++) + { + oks = FindContinuousPMSADsBlock(tmp, &mblockstart, &mblockend); + if(1 == oks) + { + break; + } + IF_EQT_DEAD(0, oks, "oks is zero\n"); + } + IF_NEQ_DEAD(tmp->InOrderPmsadNR, KrlMmGetPMSADsLen(mblockstart), "tmp->InOrderPmsadNR != mblockstart len\n"); + return PutsPMSADsOnPABHList(tmp, mblockstart, mblockend, tmp->Order); } \ No newline at end of file From 878cf0ea7c70d0b4676d0863f1f129ceb2ca319f Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 13 Oct 2021 16:25:55 +0800 Subject: [PATCH 141/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmFreePMSADsRealiz?= =?UTF-8?q?eCore=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 1 + Kernel/Memory/KrlMmAlloc.c | 39 +++++++++++++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index 47b5021..b89d3c5 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -35,5 +35,6 @@ private Bool ClearPMSADTowBlockFlags(PABHList* abhlist, PMSAD* _1mblocks, PMSAD* private UInt PMSADTowBlockIsOk(PABHList* abhlist, PMSAD* _1mblocks, PMSAD* _1mblocke, PMSAD* _2mblocks, PMSAD* _2mblocke); private UInt FindContinuousPMSADsBlock(PABHList* abhlist, PMSAD** msadstart, PMSAD** msadend); private Bool FreePMSADsOnPABHList(MNode* node, MArea* area, PABHList* abhlist, PABHList* freebhlist, PMSAD* msad, UInt msadnr); +private Bool KrlMmFreePMSADsRealizeCore(GMemManage* gmm, MNode* node, MArea* area, PMSAD* msad, U64 flags); #endif diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index d42768f..8da009b 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -487,4 +487,41 @@ private Bool FreePMSADsOnPABHList(MNode* node, MArea* area, PABHList* abhlist, P } IF_NEQ_DEAD(tmp->InOrderPmsadNR, KrlMmGetPMSADsLen(mblockstart), "tmp->InOrderPmsadNR != mblockstart len\n"); return PutsPMSADsOnPABHList(tmp, mblockstart, mblockend, tmp->Order); -} \ No newline at end of file +} + +private Bool KrlMmFreePMSADsRealizeCore(GMemManage* gmm, MNode* node, MArea* area, PMSAD* msad, U64 flags) +{ + Bool rets = FALSE; + PABHList* abhlist = NULL; + PABHList* freebhlist = NULL; + UInt msadnr = 0; + UInt opt = 0; + IF_NULL_RETURN_FALSE(gmm); + IF_NULL_RETURN_FALSE(node); + IF_NULL_RETURN_FALSE(area); + IF_NULL_RETURN_FALSE(msad); + + msadnr = (UInt)KrlMmGetPMSADsLen(msad); + freebhlist = &area->MSPLMerData.PAddrBlockArr[MSPLMER_ARR_LMAX - 1]; + abhlist = ForPmsadNrRetPABListOnMArea(node, area, msadnr); + IF_NULL_RETURN_FALSE(abhlist); + opt = OperationBeforeFreePMSADs(abhlist, msad, KrlMmGetPMSADsEnd(msad)); + if(2 == opt) + { + rets = FreePMSADsOnPABHList(node, area,abhlist, freebhlist, msad, msadnr); + if(TRUE == rets) + { + return rets; + } + return FALSE; + } + if(1 == opt) + { + return TRUE; + } + if(0 == opt) + { + return FALSE; + } + return FALSE; +} From f7be1bd740cef95a0c81e2eec5388c1b09169f33 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 13 Oct 2021 16:29:16 +0800 Subject: [PATCH 142/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmFreePMSADsRealiz?= =?UTF-8?q?e=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 1 + Kernel/Memory/KrlMmAlloc.c | 26 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index b89d3c5..5b7c1b1 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -36,5 +36,6 @@ private UInt PMSADTowBlockIsOk(PABHList* abhlist, PMSAD* _1mblocks, PMSAD* _1mbl private UInt FindContinuousPMSADsBlock(PABHList* abhlist, PMSAD** msadstart, PMSAD** msadend); private Bool FreePMSADsOnPABHList(MNode* node, MArea* area, PABHList* abhlist, PABHList* freebhlist, PMSAD* msad, UInt msadnr); private Bool KrlMmFreePMSADsRealizeCore(GMemManage* gmm, MNode* node, MArea* area, PMSAD* msad, U64 flags); +private Bool KrlMmFreePMSADsRealize(PMSAD* msad, U64 flags); #endif diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 8da009b..867692e 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -525,3 +525,29 @@ private Bool KrlMmFreePMSADsRealizeCore(GMemManage* gmm, MNode* node, MArea* are } return FALSE; } + +private Bool KrlMmFreePMSADsRealize(PMSAD* msad, U64 flags) +{ + Bool rets = FALSE; + UInt msadnr = 0; + GMemManage* gmm = NULL; + MNode* node = NULL; + MArea* area = NULL; + IF_NULL_RETURN_FALSE(msad); + + gmm = KrlMmGetGMemManageAddr(); + IF_NULL_RETURN_FALSE(gmm); + + node = PMSADRetItsMNode(msad); + IF_NULL_RETURN_FALSE(node); + + area = PMSADRetItsMArea(msad); + IF_NULL_RETURN_FALSE(area); + + KrlMmLocked(&node->Lock); + KrlMmLocked(&area->Lock); + rets = KrlMmFreePMSADsRealizeCore(gmm, node, area, msad, flags); + KrlMmUnLock(&area->Lock); + KrlMmUnLock(&node->Lock); + return rets; +} \ No newline at end of file From 1ecd3883c7161293513566f8ee88b49c30d00bba Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 13 Oct 2021 16:30:38 +0800 Subject: [PATCH 143/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmFreePMSADs?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 1 + Kernel/Memory/KrlMmAlloc.c | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index 5b7c1b1..4b1868e 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -37,5 +37,6 @@ private UInt FindContinuousPMSADsBlock(PABHList* abhlist, PMSAD** msadstart, PMS private Bool FreePMSADsOnPABHList(MNode* node, MArea* area, PABHList* abhlist, PABHList* freebhlist, PMSAD* msad, UInt msadnr); private Bool KrlMmFreePMSADsRealizeCore(GMemManage* gmm, MNode* node, MArea* area, PMSAD* msad, U64 flags); private Bool KrlMmFreePMSADsRealize(PMSAD* msad, U64 flags); +public Bool KrlMmFreePMSADs(PMSAD* msad, U64 flags); #endif diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 867692e..74cc18f 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -550,4 +550,9 @@ private Bool KrlMmFreePMSADsRealize(PMSAD* msad, U64 flags) KrlMmUnLock(&area->Lock); KrlMmUnLock(&node->Lock); return rets; -} \ No newline at end of file +} + +public Bool KrlMmFreePMSADs(PMSAD* msad, U64 flags) +{ + return KrlMmFreePMSADsRealize(msad, flags); +} From 2ede778ddcc7d06e04b663c40863d9f8b6266c6b Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 13 Oct 2021 16:32:04 +0800 Subject: [PATCH 144/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmFreeKernPMSADs?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 1 + Kernel/Memory/KrlMmAlloc.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index 4b1868e..4f05997 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -38,5 +38,6 @@ private Bool FreePMSADsOnPABHList(MNode* node, MArea* area, PABHList* abhlist, P private Bool KrlMmFreePMSADsRealizeCore(GMemManage* gmm, MNode* node, MArea* area, PMSAD* msad, U64 flags); private Bool KrlMmFreePMSADsRealize(PMSAD* msad, U64 flags); public Bool KrlMmFreePMSADs(PMSAD* msad, U64 flags); +public Bool KrlMmFreeKernPMSADs(PMSAD* msad); #endif diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 74cc18f..115e0ee 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -556,3 +556,8 @@ public Bool KrlMmFreePMSADs(PMSAD* msad, U64 flags) { return KrlMmFreePMSADsRealize(msad, flags); } + +public Bool KrlMmFreeKernPMSADs(PMSAD* msad) +{ + return KrlMmFreePMSADs(msad, KMAF_DEFAULT); +} From 1f2d4db2c7fb17e37a385725deb026003cac1a24 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 13 Oct 2021 16:33:27 +0800 Subject: [PATCH 145/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmFreeUserPMSADs?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 1 + Kernel/Memory/KrlMmAlloc.c | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index 4f05997..fa0e7e3 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -39,5 +39,6 @@ private Bool KrlMmFreePMSADsRealizeCore(GMemManage* gmm, MNode* node, MArea* are private Bool KrlMmFreePMSADsRealize(PMSAD* msad, U64 flags); public Bool KrlMmFreePMSADs(PMSAD* msad, U64 flags); public Bool KrlMmFreeKernPMSADs(PMSAD* msad); +public Bool KrlMmFreeUserPMSADs(PMSAD* msad); #endif diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 115e0ee..a96f5eb 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -561,3 +561,9 @@ public Bool KrlMmFreeKernPMSADs(PMSAD* msad) { return KrlMmFreePMSADs(msad, KMAF_DEFAULT); } + +public Bool KrlMmFreeUserPMSADs(PMSAD* msad) +{ + IF_NULL_RETURN_FALSE(msad); + return KrlMmFreePMSADs(msad, KMAF_DEFAULT); +} \ No newline at end of file From 31839d4709a0a70d6a36c748c33ee3ed7c5e299b Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 14 Oct 2021 08:37:24 +0800 Subject: [PATCH 146/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3KrlMmFreePMSADsRealiz?= =?UTF-8?q?e=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmAlloc.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index a96f5eb..2454afb 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -543,12 +543,16 @@ private Bool KrlMmFreePMSADsRealize(PMSAD* msad, U64 flags) area = PMSADRetItsMArea(msad); IF_NULL_RETURN_FALSE(area); + + msadnr = KrlMmGetPMSADsLen(msad); KrlMmLocked(&node->Lock); KrlMmLocked(&area->Lock); rets = KrlMmFreePMSADsRealizeCore(gmm, node, area, msad, flags); KrlMmUnLock(&area->Lock); KrlMmUnLock(&node->Lock); + KrlMmUPAddGMMAllocMaxFreeNR(0, 0, msadnr); + KrlMmUPSubGMMAllocMaxFreeNR(msadnr, 0, 0); return rets; } From b9d558072d63d8be07265a9f0318b5e741e1fb87 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 14 Oct 2021 08:44:46 +0800 Subject: [PATCH 147/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3KrlMmAllocPMSADsReali?= =?UTF-8?q?ze=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmAlloc.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 2454afb..bcc2d4a 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -230,7 +230,7 @@ private PMSAD* KrlMmAllocPMSADsRealize(UInt nodeid, UInt areaid, UInt msadnr, U6 MNode* node = NULL; MArea* area = NULL; PMSAD* msad = NULL; - + UInt msadnr = 0; gmm = KrlMmGetGMemManageAddr(); IF_NULL_RETURN_NULL(gmm); @@ -245,6 +245,9 @@ private PMSAD* KrlMmAllocPMSADsRealize(UInt nodeid, UInt areaid, UInt msadnr, U6 msad = KrlMmAllocPMSADsRealizeCore(gmm, node, area, msadnr, flags); KrlMmUnLock(&area->Lock); KrlMmUnLock(&node->Lock); + msadnr = (UInt)KrlMmGetPMSADsLen(msad); + KrlMmUPAddGMMAllocMaxFreeNR(msadnr, 0, 0); + KrlMmUPSubGMMAllocMaxFreeNR(0, 0, msadnr); return msad; } @@ -544,7 +547,7 @@ private Bool KrlMmFreePMSADsRealize(PMSAD* msad, U64 flags) area = PMSADRetItsMArea(msad); IF_NULL_RETURN_FALSE(area); - msadnr = KrlMmGetPMSADsLen(msad); + msadnr = (UInt)KrlMmGetPMSADsLen(msad); KrlMmLocked(&node->Lock); KrlMmLocked(&area->Lock); From cecfad68ad6e7ad918ffe493a1a0a5699d8c33d4 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 14 Oct 2021 09:56:52 +0800 Subject: [PATCH 148/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmUPAddMNodeAreaAl?= =?UTF-8?q?locMaxFreeNR=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 1 + Kernel/Memory/KrlMmManage.c | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 0cd6b24..2a5703b 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -597,6 +597,7 @@ private void MAreaInit(MArea* init); private void MNodeInit(MNode* init); private void GMemManageInit(GMemManage* init); public Bool KrlMmUPAddGMMAllocMaxFreeNR(UInt allocnr, UInt maxnr, UInt freenr); +public Bool KrlMmUPAddMNodeAreaAllocMaxFreeNR(MNode* node, MArea* area, UInt allocnr, UInt maxnr, UInt freenr); public Bool KrlMmUPSubGMMAllocMaxFreeNR(UInt allocnr, UInt maxnr, UInt freenr); public void KrlMmLocked(MLock* lock); public void KrlMmUnLock(MLock* lock); diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index 0d20435..3801dde 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -111,6 +111,18 @@ public Bool KrlMmUPAddGMMAllocMaxFreeNR(UInt allocnr, UInt maxnr, UInt freenr) return TRUE; } +public Bool KrlMmUPAddMNodeAreaAllocMaxFreeNR(MNode* node, MArea* area, UInt allocnr, UInt maxnr, UInt freenr) +{ + IF_NULL_RETURN_FALSE(node); + IF_NULL_RETURN_FALSE(area); + KrlMmLocked(&area->Lock); + area->AllocPMSAD += allocnr; + area->MaxPMSAD += maxnr; + area->FreePMSAD += freenr; + KrlMmUnLock(&area->Lock); + return TRUE; +} + public Bool KrlMmUPSubGMMAllocMaxFreeNR(UInt allocnr, UInt maxnr, UInt freenr) { GMemManage* gmm = NULL; From 6f186ec672cd374d1f7f6e836ae97d9ff5cbcbbe Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 14 Oct 2021 10:02:16 +0800 Subject: [PATCH 149/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmUPSubMNodeAreaAl?= =?UTF-8?q?locMaxFreeNR=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 1 + Kernel/Memory/KrlMmManage.c | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 2a5703b..cad654e 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -599,6 +599,7 @@ private void GMemManageInit(GMemManage* init); public Bool KrlMmUPAddGMMAllocMaxFreeNR(UInt allocnr, UInt maxnr, UInt freenr); public Bool KrlMmUPAddMNodeAreaAllocMaxFreeNR(MNode* node, MArea* area, UInt allocnr, UInt maxnr, UInt freenr); public Bool KrlMmUPSubGMMAllocMaxFreeNR(UInt allocnr, UInt maxnr, UInt freenr); +public Bool KrlMmUPSubMNodeAreaAllocMaxFreeNR(MNode* node, MArea* area, UInt allocnr, UInt maxnr, UInt freenr); public void KrlMmLocked(MLock* lock); public void KrlMmUnLock(MLock* lock); private Bool NewOnePHYMSPaceArea(E820Map* e820, PHYMSPaceArea* area); diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index 3801dde..2f8141c 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -147,6 +147,27 @@ public Bool KrlMmUPSubGMMAllocMaxFreeNR(UInt allocnr, UInt maxnr, UInt freenr) return TRUE; } +public Bool KrlMmUPSubMNodeAreaAllocMaxFreeNR(MNode* node, MArea* area, UInt allocnr, UInt maxnr, UInt freenr) +{ + IF_NULL_RETURN_FALSE(node); + IF_NULL_RETURN_FALSE(area); + KrlMmLocked(&area->Lock); + if(allocnr <= area->AllocPMSAD) + { + area->AllocPMSAD -= allocnr; + } + if(maxnr <= area->MaxPMSAD) + { + area->MaxPMSAD -= maxnr; + } + if(freenr <= area->FreePMSAD) + { + area->FreePMSAD -= freenr; + } + KrlMmUnLock(&area->Lock); + return TRUE; +} + public void KrlMmLocked(MLock* lock) { IF_NULL_DEAD(lock); From 1c6fad528471958f905ad100d5b00ec2335f6f2a Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 14 Oct 2021 10:05:25 +0800 Subject: [PATCH 150/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3KrlMmAllocPMSADsReali?= =?UTF-8?q?ze=E5=87=BD=E6=95=B0-1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmAlloc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index bcc2d4a..542b3ab 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -246,6 +246,8 @@ private PMSAD* KrlMmAllocPMSADsRealize(UInt nodeid, UInt areaid, UInt msadnr, U6 KrlMmUnLock(&area->Lock); KrlMmUnLock(&node->Lock); msadnr = (UInt)KrlMmGetPMSADsLen(msad); + KrlMmUPAddMNodeAreaAllocMaxFreeNR(node, area, msadnr, 0, 0); + KrlMmUPSubMNodeAreaAllocMaxFreeNR(node, area, 0, 0, msadnr); KrlMmUPAddGMMAllocMaxFreeNR(msadnr, 0, 0); KrlMmUPSubGMMAllocMaxFreeNR(0, 0, msadnr); return msad; From 81e441ee402e8810b6337971d05f9b517b19bb68 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 14 Oct 2021 10:07:43 +0800 Subject: [PATCH 151/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3KrlMmFreePMSADsRealiz?= =?UTF-8?q?e=E5=87=BD=E6=95=B0-1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmAlloc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 542b3ab..7431866 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -556,6 +556,8 @@ private Bool KrlMmFreePMSADsRealize(PMSAD* msad, U64 flags) rets = KrlMmFreePMSADsRealizeCore(gmm, node, area, msad, flags); KrlMmUnLock(&area->Lock); KrlMmUnLock(&node->Lock); + KrlMmUPAddMNodeAreaAllocMaxFreeNR(node, area, 0, 0, msadnr); + KrlMmUPSubMNodeAreaAllocMaxFreeNR(node, area, msadnr, 0, 0); KrlMmUPAddGMMAllocMaxFreeNR(0, 0, msadnr); KrlMmUPSubGMMAllocMaxFreeNR(msadnr, 0, 0); return rets; From f047f5a7339f14e0fd0e7c22266acb08fb4e0771 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 14 Oct 2021 14:22:53 +0800 Subject: [PATCH 152/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3FindContinuousPMSADsB?= =?UTF-8?q?lock=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmAlloc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 7431866..329ec10 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -428,9 +428,9 @@ private UInt FindContinuousPMSADsBlock(PABHList* abhlist, PMSAD** msadstart, PMS } } - KrlMmUnLock(&abhlist->Lock); - step1: + + KrlMmUnLock(&abhlist->Lock); if(0 == rets || 1 == rets) { return 1; From 496a679a0171cd1ec18462b1a9dbe5550c29c353 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Thu, 14 Oct 2021 15:47:39 +0800 Subject: [PATCH 153/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3KrlMmAlloc.h=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=A4=B4=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index fa0e7e3..3b34852 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -1,5 +1,5 @@ /********************************************************** - 物理内存分配文件KrlMmAlloc.c + 物理内存分配头文件KrlMmAlloc.h *********************************************************** 彭东 **********************************************************/ From 96cedcdb1fed7eb88c2d420b70cc1f5c06736845 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 15 Oct 2021 09:37:11 +0800 Subject: [PATCH 154/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3GMemManage=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index cad654e..6a64c29 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -278,8 +278,8 @@ typedef struct GMEMMANAGE U64 PAreaNR; MNode* MNodeStart; U64 MNodeNR; - void* privp; - void* extp; + void* Priv; + void* Ext; }GMemManage; From fe10a956ff2bc123677ffb9125a7b6d351283e29 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 15 Oct 2021 11:49:31 +0800 Subject: [PATCH 155/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E6=B1=A0=E7=9B=B8=E5=85=B3=E7=9A=84=E6=95=B0=E6=8D=AE=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 52 +++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index e69de29..580bd4f 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -0,0 +1,52 @@ +/********************************************************** + 内存池头文件KrlMmPool.h +*********************************************************** + 彭东 +**********************************************************/ + +#ifndef _KRLMMPOOLHEAD +#define _KRLMMPOOLHEAD +#define MSCLST_MAX (5) +#define KMPOOL_MAX (64) +#define KUC_NEWFLG (1) +#define KUC_DELFLG (2) +#define KUC_DSYFLG (3) + +typedef struct POENTITIES +{ + List Lists; + UInt Status; + void* Start; +}POEntities; + +typedef struct KMEMPOOL +{ + List Lists; + MLock Lock; + UInt Status; + UInt Flags; + UInt Size; + UInt ObjNR; + UInt FreeObjNR; + Addr VAddrStart; + Addr VAddrEnd; + List ObjLists; + List PMSADsLists; + void* Priv; + void* Ext; +}KMemPool; + +typedef struct GMEMPOOLMANAGE +{ + List Lists; + MLock Lock; + UInt Status; + UInt Flags; + UInt KMemPoolNR; + KMemPool KMemPoolMain; + KMemPool* KMemPoolCache; + KMemPool* KMemPoolArr[KMPOOL_MAX]; +}GMemPoolManage; + + +#endif \ No newline at end of file From 611b7a4d9d278bcf30a08970a8f836d899659e5a Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 15 Oct 2021 11:50:05 +0800 Subject: [PATCH 156/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AD=98?= =?UTF-8?q?=E6=B1=A0=E7=9B=B8=E5=85=B3=E7=9A=84=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmPool.c | 47 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index e69de29..aca94af 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -0,0 +1,47 @@ +/********************************************************** + 内存池文件KrlMmPool.c +*********************************************************** + 彭东 +**********************************************************/ +#include "BaseType.h" +#include "List.h" +#include "KrlMmManage.h" +#include "KrlMmPool.h" +#include "KrlMmAlloc.h" + +DefinedMEMData(GMemPoolManage, GMemPoolData); + +private void POEntitiesInit(POEntities* init) +{ + IF_NULL_RETURN_NULL(init); + INIT_OBJOFPTR_ZERO(init); + ListInit(&init->Lists); + return; +} + +private void KMemPoolInit(KMemPool* init) +{ + IF_NULL_RETURN(init); + INIT_OBJOFPTR_ZERO(init); + ListInit(&init->Lists); + ListInit(&init->ObjLists); + ListInit(&init->PMSADsLists); + MLockInit(&init->Lock); + return; +} + +private void GMemPoolManageInit(GMemPoolManage* init) +{ + IF_NULL_RETURN(init); + INIT_OBJOFPTR_ZERO(init); + ListInit(&init->Lists); + MLockInit(&init->Lock); + KMemPoolInit(&init->KMemPoolMain); + return; +} + +public Bool KrlMmPoolInit() +{ + GMemPoolManageInit(&GMemPoolData); + return TRUE; +} \ No newline at end of file From 29f5e078f50befa12d96d0a77936c1f48b05014d Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 15 Oct 2021 13:59:08 +0800 Subject: [PATCH 157/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmGetGMemPoolAddr?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index 580bd4f..8160bd7 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -48,5 +48,13 @@ typedef struct GMEMPOOLMANAGE KMemPool* KMemPoolArr[KMPOOL_MAX]; }GMemPoolManage; +KLINE GMemPoolManage* KrlMmGetGMemPoolAddr() +{ + return &GMemPoolData; +} +private void POEntitiesInit(POEntities* init); +private void KMemPoolInit(KMemPool* init); +private void GMemPoolManageInit(GMemPoolManage* init); +public Bool KrlMmPoolInit(); #endif \ No newline at end of file From 77283a2b954b47b5a37f91ebb45349dd5e42cbec Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 15 Oct 2021 16:44:25 +0800 Subject: [PATCH 158/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3KMemPool=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index 8160bd7..ab9a116 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -8,6 +8,7 @@ #define _KRLMMPOOLHEAD #define MSCLST_MAX (5) #define KMPOOL_MAX (64) +#define PER_POE_INCSIZE (32) #define KUC_NEWFLG (1) #define KUC_DELFLG (2) #define KUC_DSYFLG (3) @@ -28,6 +29,7 @@ typedef struct KMEMPOOL UInt Size; UInt ObjNR; UInt FreeObjNR; + UInt AllocPMSADNR; Addr VAddrStart; Addr VAddrEnd; List ObjLists; From 3a68d0c0cf86128cd3613c7843d3a6e1b8e7b31f Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 15 Oct 2021 17:32:48 +0800 Subject: [PATCH 159/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ForSizeRetKMemPoolOnG?= =?UTF-8?q?MemPoolManage=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 1 + Kernel/Memory/KrlMmPool.c | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index ab9a116..59a8601 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -58,5 +58,6 @@ KLINE GMemPoolManage* KrlMmGetGMemPoolAddr() private void POEntitiesInit(POEntities* init); private void KMemPoolInit(KMemPool* init); private void GMemPoolManageInit(GMemPoolManage* init); +private KMemPool* ForSizeRetKMemPoolOnGMemPoolManage(GMemPoolManage* gmpm, Size size); public Bool KrlMmPoolInit(); #endif \ No newline at end of file diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index aca94af..f5eeb52 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -40,6 +40,31 @@ private void GMemPoolManageInit(GMemPoolManage* init) return; } +private KMemPool* ForSizeRetKMemPoolOnGMemPoolManage(GMemPoolManage* gmpm, Size size) +{ + IF_NULL_RETURN_NULL(gmpm); + if(NULL != gmpm->KMemPoolCache) + { + if((gmpm->KMemPoolCache->Size > size) && (gmpm->KMemPoolCache->Size < (size + PER_POE_INCSIZE))) + { + return gmpm->KMemPoolCache; + } + } + for(UInt i = 0; i < KMPOOL_MAX; i++) + { + if(NULL != gmpm->KMemPoolArr[i]) + { + if((gmpm->KMemPoolArr[i]->Size > size) && (gmpm->KMemPoolCache->Size < (size + PER_POE_INCSIZE))) + { + gmpm->KMemPoolCache = &gmpm->KMemPoolArr[i]; + return &gmpm->KMemPoolArr[i]; + } + } + } + return NULL; +} + + public Bool KrlMmPoolInit() { GMemPoolManageInit(&GMemPoolData); From 850873a9cf456e359485eba59a1d1121c3805d25 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 15 Oct 2021 17:34:05 +0800 Subject: [PATCH 160/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0PickPOEntitiesOnKMemP?= =?UTF-8?q?ool=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 2 ++ Kernel/Memory/KrlMmPool.c | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index 59a8601..81d968c 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -59,5 +59,7 @@ private void POEntitiesInit(POEntities* init); private void KMemPoolInit(KMemPool* init); private void GMemPoolManageInit(GMemPoolManage* init); private KMemPool* ForSizeRetKMemPoolOnGMemPoolManage(GMemPoolManage* gmpm, Size size); +private POEntities* PickPOEntitiesOnKMemPool(KMemPool* pool); + public Bool KrlMmPoolInit(); #endif \ No newline at end of file diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index f5eeb52..885d795 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -64,6 +64,18 @@ private KMemPool* ForSizeRetKMemPoolOnGMemPoolManage(GMemPoolManage* gmpm, Size return NULL; } +private POEntities* PickPOEntitiesOnKMemPool(KMemPool* pool) +{ + POEntities* entities = NULL; + IF_NULL_RETURN_NULL(pool); + IF_LTNONE_RETRUN_NULL(pool->FreeObjNR); + IF_LTNONE_RETRUN_NULL(pool->ObjNR); + IF_EQT_RETURN(TRUE, ListIsEmptyCareful(&pool->ObjLists), NULL); + entities = ListFirstOne(&pool->ObjLists, POEntities, Lists); + ListDel(&entities->Lists); + pool->FreeObjNR--; + return entities; +} public Bool KrlMmPoolInit() { From 64819310c82422efe7ddd658097b0fdc9901abef Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 15 Oct 2021 17:35:36 +0800 Subject: [PATCH 161/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0POEntitiesArrInitOnMe?= =?UTF-8?q?mSPace=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 1 + Kernel/Memory/KrlMmPool.c | 26 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index 81d968c..0cbe196 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -60,6 +60,7 @@ private void KMemPoolInit(KMemPool* init); private void GMemPoolManageInit(GMemPoolManage* init); private KMemPool* ForSizeRetKMemPoolOnGMemPoolManage(GMemPoolManage* gmpm, Size size); private POEntities* PickPOEntitiesOnKMemPool(KMemPool* pool); +private UInt POEntitiesArrInitOnMemSPace(KMemPool* pool, Addr start, Addr end); public Bool KrlMmPoolInit(); #endif \ No newline at end of file diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index 885d795..ff5ee89 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -77,6 +77,32 @@ private POEntities* PickPOEntitiesOnKMemPool(KMemPool* pool) return entities; } +private UInt POEntitiesArrInitOnMemSPace(KMemPool* pool, Addr start, Addr end) +{ + POEntities* entstart = NULL; + POEntities* entend = NULL; + entstart = (POEntities*)start; + entend = (POEntities*)end; + UInt i = 0; + for(; entstart < entend; entstart++, i++) + { + POEntitiesInit(entstart); + ListAdd(&entstart->Lists, &pool->ObjLists); + pool->ObjNR++; + pool->FreeObjNR++; + } + IF_EQT_RETURN(0, i, 0); + if(start < pool->VAddrStart) + { + pool->VAddrStart = start; + } + if(end > pool->VAddrEnd) + { + pool->VAddrEnd = end; + } + return i; +} + public Bool KrlMmPoolInit() { GMemPoolManageInit(&GMemPoolData); From 13c0bc9240a8504af1e59d0add365e19391b9032 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 15 Oct 2021 17:36:48 +0800 Subject: [PATCH 162/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ExtendKMemPoolCapacit?= =?UTF-8?q?y=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 1 + Kernel/Memory/KrlMmPool.c | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index 0cbe196..7ea82d3 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -61,6 +61,7 @@ private void GMemPoolManageInit(GMemPoolManage* init); private KMemPool* ForSizeRetKMemPoolOnGMemPoolManage(GMemPoolManage* gmpm, Size size); private POEntities* PickPOEntitiesOnKMemPool(KMemPool* pool); private UInt POEntitiesArrInitOnMemSPace(KMemPool* pool, Addr start, Addr end); +private Bool ExtendKMemPoolCapacity(GMemPoolManage* gmpm, KMemPool* pool); public Bool KrlMmPoolInit(); #endif \ No newline at end of file diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index ff5ee89..8d89442 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -103,6 +103,25 @@ private UInt POEntitiesArrInitOnMemSPace(KMemPool* pool, Addr start, Addr end) return i; } +private Bool ExtendKMemPoolCapacity(GMemPoolManage* gmpm, KMemPool* pool) +{ + PMSAD* msad = NULL; + Addr start = NULL; + Addr end = NULL; + UInt nr = 0; + IF_NULL_RETURN_FALSE(gmpm); + IF_NULL_RETURN_FALSE(pool); + msad = KrlMmAllocKernPMSADs(pool->AllocPMSADNR); + IF_NULL_RETURN_FALSE(msad); + + start = PMSADRetVAddr(msad); + end = start + (Addr)(KrlMmGetPMSADsSize(msad) - 1); + + nr = POEntitiesArrInitOnMemSPace(poolm start, end); + IF_LTNONE_RETRUN_FALSE(nr); + return TRUE; +} + public Bool KrlMmPoolInit() { GMemPoolManageInit(&GMemPoolData); From c0255028bdfe5899fe86f74d44d419fdf48482c2 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 15 Oct 2021 17:37:55 +0800 Subject: [PATCH 163/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0NewPOEntitiesOnKMemPo?= =?UTF-8?q?ol=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 1 + Kernel/Memory/KrlMmPool.c | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index 7ea82d3..f137e28 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -62,6 +62,7 @@ private KMemPool* ForSizeRetKMemPoolOnGMemPoolManage(GMemPoolManage* gmpm, Size private POEntities* PickPOEntitiesOnKMemPool(KMemPool* pool); private UInt POEntitiesArrInitOnMemSPace(KMemPool* pool, Addr start, Addr end); private Bool ExtendKMemPoolCapacity(GMemPoolManage* gmpm, KMemPool* pool); +private void* NewPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, Size size); public Bool KrlMmPoolInit(); #endif \ No newline at end of file diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index 8d89442..829e471 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -122,6 +122,25 @@ private Bool ExtendKMemPoolCapacity(GMemPoolManage* gmpm, KMemPool* pool) return TRUE; } +private void* NewPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, Size size) +{ + POEntities* entities = NULL; + Bool rets = FALSE; + IF_NULL_RETURN_NULL(gmpm); + IF_NULL_RETURN_NULL(pool); + IF_LTN_RETURN(pool->Size, size, NULL); + IF_GTN_RETURN(pool->Size, (size + PER_POE_INCSIZE), NULL); + entities = PickPOEntitiesOnKMemPool(pool); + if(NULL != entities) + { + INIT_OBJOFPTR_ZERO(entities); + return (void*)entities; + } + rets = ExtendKMemPoolCapacity(gmpm, pool); + IF_NEQ_RETURN(TRUE, rets, NULL); + return (void*)PickPOEntitiesOnKMemPool(pool); +} + public Bool KrlMmPoolInit() { GMemPoolManageInit(&GMemPoolData); From 67fa7a9aac079a0b7f36f5b3e22ffeb1f6c8977e Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 15 Oct 2021 17:39:15 +0800 Subject: [PATCH 164/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmNewPOEntitiesRea?= =?UTF-8?q?lizeCore=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 1 + Kernel/Memory/KrlMmPool.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index f137e28..43a9fb6 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -63,6 +63,7 @@ private POEntities* PickPOEntitiesOnKMemPool(KMemPool* pool); private UInt POEntitiesArrInitOnMemSPace(KMemPool* pool, Addr start, Addr end); private Bool ExtendKMemPoolCapacity(GMemPoolManage* gmpm, KMemPool* pool); private void* NewPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, Size size); +private void* KrlMmNewPOEntitiesRealizeCore(GMemPoolManage* gmpm, Size size); public Bool KrlMmPoolInit(); #endif \ No newline at end of file diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index 829e471..e440297 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -141,6 +141,21 @@ private void* NewPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, Size return (void*)PickPOEntitiesOnKMemPool(pool); } +private void* KrlMmNewPOEntitiesRealizeCore(GMemPoolManage* gmpm, Size size) +{ + void* addr = NULL; + KMemPool* pool = NULL; + IF_NULL_RETURN_NULL(gmpm); + + pool = ForSizeRetKMemPoolOnGMemPoolManage(gmpm, size); + IF_NULL_RETURN_NULL(pool); + + KrlMmLocked(&pool->Lock); + addr = NewPOEntitiesOnKMemPool(gmpm, pool, size); + KrlMmUnLock(&pool->Lock); + return addr; +} + public Bool KrlMmPoolInit() { GMemPoolManageInit(&GMemPoolData); From 9ff7a3423f40b286dd9963df432d4c06513027ec Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 15 Oct 2021 17:40:34 +0800 Subject: [PATCH 165/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmNewPOEntitiesRea?= =?UTF-8?q?lize=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 1 + Kernel/Memory/KrlMmPool.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index 43a9fb6..d6cce1f 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -64,6 +64,7 @@ private UInt POEntitiesArrInitOnMemSPace(KMemPool* pool, Addr start, Addr end); private Bool ExtendKMemPoolCapacity(GMemPoolManage* gmpm, KMemPool* pool); private void* NewPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, Size size); private void* KrlMmNewPOEntitiesRealizeCore(GMemPoolManage* gmpm, Size size); +private void* KrlMmNewPOEntitiesRealize(Size size); public Bool KrlMmPoolInit(); #endif \ No newline at end of file diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index e440297..9945665 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -156,6 +156,20 @@ private void* KrlMmNewPOEntitiesRealizeCore(GMemPoolManage* gmpm, Size size) return addr; } +private void* KrlMmNewPOEntitiesRealize(Size size) +{ + void* addr = NULL; + GMemPoolManage* gmpm = NULL; + + gmpm = KrlMmGetGMemPoolAddr(); + IF_NULL_RETURN_NULL(gmpm); + + KrlMmLocked(&gmpm->Lock); + addr = KrlMmNewPOEntitiesRealizeCore(gmpm, size); + KrlMmUnLock(&gmpm->Lock); + return addr; +} + public Bool KrlMmPoolInit() { GMemPoolManageInit(&GMemPoolData); From 344dec6ffbc7687f453319f5d097e7ffd3257176 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 15 Oct 2021 17:42:01 +0800 Subject: [PATCH 166/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmNewPOEntities?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 2 +- Kernel/Memory/KrlMmPool.c | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index d6cce1f..e1be79a 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -65,6 +65,6 @@ private Bool ExtendKMemPoolCapacity(GMemPoolManage* gmpm, KMemPool* pool); private void* NewPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, Size size); private void* KrlMmNewPOEntitiesRealizeCore(GMemPoolManage* gmpm, Size size); private void* KrlMmNewPOEntitiesRealize(Size size); - +public void* KrlMmNewPOEntities(Size size); public Bool KrlMmPoolInit(); #endif \ No newline at end of file diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index 9945665..171d209 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -170,6 +170,12 @@ private void* KrlMmNewPOEntitiesRealize(Size size) return addr; } +public void* KrlMmNewPOEntities(Size size) +{ + IF_LTNONE_RETRUN_NULL(size); + return KrlMmNewPOEntitiesRealize(size); +} + public Bool KrlMmPoolInit() { GMemPoolManageInit(&GMemPoolData); From 7ce67cc32e36e2dc085e5070d55593ff19047172 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 18 Oct 2021 11:05:33 +0800 Subject: [PATCH 167/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3ExtendKMemPoolCapacit?= =?UTF-8?q?y=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmPool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index 171d209..5070d94 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -117,7 +117,7 @@ private Bool ExtendKMemPoolCapacity(GMemPoolManage* gmpm, KMemPool* pool) start = PMSADRetVAddr(msad); end = start + (Addr)(KrlMmGetPMSADsSize(msad) - 1); - nr = POEntitiesArrInitOnMemSPace(poolm start, end); + nr = POEntitiesArrInitOnMemSPace(pool, start, end); IF_LTNONE_RETRUN_FALSE(nr); return TRUE; } From 67360a3b2ba6b2030de7d43b4b92bdb58e30bb8c Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 18 Oct 2021 14:45:01 +0800 Subject: [PATCH 168/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3POEntitiesArrInitOnMe?= =?UTF-8?q?mSPace=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmPool.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index 5070d94..83754f4 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -81,15 +81,17 @@ private UInt POEntitiesArrInitOnMemSPace(KMemPool* pool, Addr start, Addr end) { POEntities* entstart = NULL; POEntities* entend = NULL; + UInt i = 0; + entstart = (POEntities*)start; entend = (POEntities*)end; - UInt i = 0; - for(; entstart < entend; entstart++, i++) + for(; entstart < entend; i++) { POEntitiesInit(entstart); ListAdd(&entstart->Lists, &pool->ObjLists); pool->ObjNR++; pool->FreeObjNR++; + entstart = (POEntities*)(((UInt)entstart) + ((UInt)pool->Size)); } IF_EQT_RETURN(0, i, 0); if(start < pool->VAddrStart) From 6d82839fab2f97d81d6f756ccb8a2737b5ba1ef9 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 18 Oct 2021 16:14:32 +0800 Subject: [PATCH 169/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0PoolParam=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E5=8F=8A=E5=85=B6=E6=95=B0=E7=BB=84=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 7 +++++++ Kernel/Memory/KrlMmPool.c | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index e1be79a..8c0498b 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -13,6 +13,13 @@ #define KUC_DELFLG (2) #define KUC_DSYFLG (3) +typedef struct POOLPARM +{ + UInt AllocPMSADs; + UInt POESize; +}PoolParam; + + typedef struct POENTITIES { List Lists; diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index 83754f4..e69fb42 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -10,6 +10,24 @@ #include "KrlMmAlloc.h" DefinedMEMData(GMemPoolManage, GMemPoolData); +PoolParam PoolParamArr[] = { + {2, 32}, {2, 64}, {2, 96}, {2, 128}, + {2, 160}, {2, 192}, {2, 224}, {2, 256}, + {2, 288}, {2, 320}, {2, 352}, {2, 384}, + {4, 416}, {4, 448}, {4, 480}, {4, 512}, + {4, 544}, {4, 576}, {4, 608}, {4, 640}, + {4, 672}, {4, 704}, {4, 736}, {4, 768}, + {4, 800}, {4, 832}, {4, 864}, {4, 896}, + {8, 928}, {8, 960}, {8, 992}, {8, 1024}, + {8, 1056}, {8, 1088}, {8, 1120}, {8, 1152}, + {8, 1184}, {8, 1216}, {8, 1248}, {8, 1280}, + {8, 1312}, {8, 1344}, {8, 1376}, {8, 1408}, + {8, 1440}, {8, 1472}, {8, 1504}, {8, 1536}, + {8, 1568}, {8, 1600}, {8, 1632}, {8, 1664}, + {8, 1696}, {8, 1728}, {8, 1760}, {8, 1796}, + {16, 1824}, {16, 1856}, {16, 1888}, {16, 1920}, + {16, 1952}, {16, 1984}, {16, 2016}, {16, 2048}, +}; private void POEntitiesInit(POEntities* init) { From 3ebf5ea100a88576fc279ea2fe19f617b831d0ac Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 18 Oct 2021 16:17:55 +0800 Subject: [PATCH 170/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0CreateNewKMemPoolInit?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 2 ++ Kernel/Memory/KrlMmPool.c | 26 +++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index 8c0498b..b668cbc 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -72,6 +72,8 @@ private Bool ExtendKMemPoolCapacity(GMemPoolManage* gmpm, KMemPool* pool); private void* NewPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, Size size); private void* KrlMmNewPOEntitiesRealizeCore(GMemPoolManage* gmpm, Size size); private void* KrlMmNewPOEntitiesRealize(Size size); +private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, Addr start, Addr end, Size size); + public void* KrlMmNewPOEntities(Size size); public Bool KrlMmPoolInit(); #endif \ No newline at end of file diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index e69fb42..1933964 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -190,6 +190,32 @@ private void* KrlMmNewPOEntitiesRealize(Size size) return addr; } +private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, Addr start, Addr end, Size size) +{ + POEntities* entstart = NULL; + POEntities* entend = NULL; + KMemPool* tmp = 0; + UInt i = 0; + tmp = pool + 1; + entstart = (POEntities*)tmp; + entend = (POEntities*)end; + + pool->Size = size; + pool->VAddrStart = start; + pool->VAddrEnd = end; + ListAdd(&msad->Lists, &pool->PMSADsLists); + for(; entstart < entend; i++) + { + POEntitiesInit(entstart); + ListAdd(&entstart->Lists, &pool->ObjLists); + pool->ObjNR++; + pool->FreeObjNR++; + entstart = (POEntities*)(((UInt)entstart) + ((UInt)pool->Size)); + } + IF_EQT_RETURN(0, i, 0); + return i; +} + public void* KrlMmNewPOEntities(Size size) { IF_LTNONE_RETRUN_NULL(size); From 86f11164e8990c81bf843e2fbe209b426f41d5fa Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 18 Oct 2021 16:29:25 +0800 Subject: [PATCH 171/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmCreateKMemPoolRe?= =?UTF-8?q?alize=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 1 + Kernel/Memory/KrlMmPool.c | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index b668cbc..e5d5af1 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -73,6 +73,7 @@ private void* NewPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, Size private void* KrlMmNewPOEntitiesRealizeCore(GMemPoolManage* gmpm, Size size); private void* KrlMmNewPOEntitiesRealize(Size size); private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, Addr start, Addr end, Size size); +private KMemPool* KrlMmCreateKMemPoolRealize(GMemPoolManage* gmpm, Size size); public void* KrlMmNewPOEntities(Size size); public Bool KrlMmPoolInit(); diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index 1933964..66e6cf1 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -216,6 +216,27 @@ private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, Addr start, Addr return i; } +private KMemPool* KrlMmCreateKMemPoolRealize(GMemPoolManage* gmpm, Size size) +{ + KMemPool* pool = NULL; + PMSAD* msad = NULL; + Bool rets = FALSE; + IF_NULL_RETURN_NULL(gmpm); + msad = KrlMmAllocKernPMSADs(4); + IF_NULL_RETURN_NULL(msad); + pool = (KMemPool*)PMSADRetVAddr(msad); + IF_NULL_RETURN_NULL(pool); + KMemPoolInit(pool); + if(1 > CreateNewKMemPoolInit(pool, msad, (Addr)pool, ((Addr)pool + (Addr)KrlMmGetPMSADsSize(msad) - 1), size)) + { + rets = KrlMmFreeKernPMSADs(msad); + IF_EQT_DEAD(FALSE, rets, "KrlMmFreeKernPMSADs is Fail\n"); + return NULL; + } + return pool; +} + + public void* KrlMmNewPOEntities(Size size) { IF_LTNONE_RETRUN_NULL(size); From 930a53f6c1860a4e9d86ad6d3d9debcf20ea589f Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Mon, 18 Oct 2021 16:31:06 +0800 Subject: [PATCH 172/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmCreateKMemPool?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 2 +- Kernel/Memory/KrlMmPool.c | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index e5d5af1..0224a4d 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -74,7 +74,7 @@ private void* KrlMmNewPOEntitiesRealizeCore(GMemPoolManage* gmpm, Size size); private void* KrlMmNewPOEntitiesRealize(Size size); private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, Addr start, Addr end, Size size); private KMemPool* KrlMmCreateKMemPoolRealize(GMemPoolManage* gmpm, Size size); - +public KMemPool* KrlMmCreateKMemPool(Size size); public void* KrlMmNewPOEntities(Size size); public Bool KrlMmPoolInit(); #endif \ No newline at end of file diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index 66e6cf1..c440f75 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -236,6 +236,16 @@ private KMemPool* KrlMmCreateKMemPoolRealize(GMemPoolManage* gmpm, Size size) return pool; } +public KMemPool* KrlMmCreateKMemPool(Size size) +{ + GMemPoolManage* gmpm; + IF_LTNONE_RETRUN_NULL(size); + IF_GTN_RETURN(size, 2024, NULL); + gmpm = KrlMmGetGMemPoolAddr(); + IF_NULL_RETURN_NULL(gmpm); + return KrlMmCreateKMemPoolRealize(gmpm, size); +} + public void* KrlMmNewPOEntities(Size size) { From ad866bfa49a61c7972ec12575b2d84c58ae5ec60 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 19 Oct 2021 09:33:22 +0800 Subject: [PATCH 173/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3TEST=5FFAIL=5FSTRING?= =?UTF-8?q?=E3=80=81TEST=5FFAIL=5FDEAD=5FESTMFUNC=E5=AE=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/BaseInc/BaseType.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Include/BaseInc/BaseType.h b/Include/BaseInc/BaseType.h index 429781f..0ad778a 100644 --- a/Include/BaseInc/BaseType.h +++ b/Include/BaseInc/BaseType.h @@ -57,8 +57,8 @@ typedef SInt DrvStus; #define INIT_OBJOFPTR_ZERO(ptr) do{HalMemSet((void*)ptr, 0, sizeof(typeof(*ptr)));}while(0) -#define TEST_FAIL_STRING(str) __FILE__##__LINE__##__FUNCTION__##str -#define TEST_FAIL_DEAD_ESTMFUNC(str) KrlErrorCrashDead(TEST_FAIL_STRING(str)) +#define TEST_FAIL_STRING(fmt, ...) fmt,##__VA_ARGS__ +#define TEST_FAIL_DEAD_ESTMFUNC(str) KrlErrorCrashDead(TEST_FAIL_STRING("%s,%d,%s,%s",__FILE__,__LINE__,__FUNCTION__,str)) #define IF_TEST_OP(cmpsrc, tester, op, excstmfunc) do{if(cmpsrc op tester) {excstmfunc;}}while(0) From fcf48d0703654a61131042a07e56580f3dd30c31 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 19 Oct 2021 09:43:29 +0800 Subject: [PATCH 174/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3MLockInit=E3=80=81MAr?= =?UTF-8?q?eaInit=E3=80=81KrlMmUPSubGMMAllocMaxFreeNR=E3=80=81PMSADDireIsN?= =?UTF-8?q?eedAllocMemory=E3=80=81KrlMmGetMNode=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmManage.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index 2f8141c..33b69b0 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -17,7 +17,7 @@ DefinedMEMData(GMemManage, GMemManageData); private void MLockInit(MLock* init) { IF_NULL_RETURN(init); - SPinLockInit(&init->Lock.Locks); + SPinLockInit(&init->Locks); return; } @@ -69,7 +69,7 @@ private void MAreaInit(MArea* init) INIT_OBJOFPTR_ZERO(init); ListInit(&init->Lists); MLockInit(&init->Lock); - ListInit(&init->AllocPMSADLists); + ListInit(&init->AllPMSADLists); MSPlitMerInit(&init->MSPLMerData); return; } @@ -140,7 +140,7 @@ public Bool KrlMmUPSubGMMAllocMaxFreeNR(UInt allocnr, UInt maxnr, UInt freenr) } if((U64)freenr <= gmm->FreePMSAD) { - gmm->FreePMSAD -= (U64)freenr + gmm->FreePMSAD -= (U64)freenr; } gmm->MemroySZ = (U64)(gmm->MaxPMSAD << MSAD_PADR_SLBITS); KrlMmUnLock(&gmm->Lock); @@ -363,7 +363,7 @@ private PMSAD* PMSADDireIsNeedAllocMemory(U64 start, U64 end) { if(PMSA_T_OSAPUSERRAM == pmsarea[i].Type) { - for(U64 paddr = pmsarea[i]->Start; (paddr + (MSAD_SIZE - 1)) < pmsarea[i]->End; paddr += MSAD_SIZE) + for(U64 paddr = pmsarea[i].Start; (paddr + (MSAD_SIZE - 1)) < pmsarea[i].End; paddr += MSAD_SIZE) { if((start <= paddr) && (paddr < end)) { @@ -597,7 +597,7 @@ private UInt ScanOrderPMSADsAddInPABHList(MNode* node, MArea* area, PMSAD* start msad = start; while(msad <= end) { - msad = NextOrderPMSADsAddInPABHList(node, area, msad, end, &count) + msad = NextOrderPMSADsAddInPABHList(node, area, msad, end, &count); if(NULL == msad) { KrlErrorCrashDead("NextOrderPMSADsAddInPABHList is Fail\n"); @@ -786,7 +786,7 @@ private Bool MAreaInitOnMNode(MNode* node) public MNode* KrlMmGetMNode(UInt nodeid) { GMemManage* gmm = NULL; - MNode* node + MNode* node = NULL; gmm = KrlMmGetGMemManageAddr(); IF_NULL_RETURN_NULL(gmm); From 637001c099e3520577555eb05f9cf428f5982d15 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 19 Oct 2021 10:01:50 +0800 Subject: [PATCH 175/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0MEMDATA=5FSECTION?= =?UTF-8?q?=E5=AE=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 6a64c29..5df9cf0 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -6,6 +6,9 @@ #ifndef _KRLMMMANAGEHEAD #define _KRLMMMANAGEHEAD +#include "HalSync.h" +#include "HalBoot.h" + #define MSAD_PADR_SLBITS (12) #define MSAD_PAGE_MAX (8) #define MSAD_SIZE (1 << MSAD_PADR_SLBITS) @@ -82,7 +85,8 @@ #define PMSA_F_ARM_64 (1<<3) #define PMSA_F_HAL_MASK 0xff -#define DefinedMEMData(vartype,varname) __attribute__((section(".mem.data"))) vartype varname +#define MEMDATA_SECTION __attribute__((section(".mem.data"))) +#define DefinedMEMData(vartype,varname) MEMDATA_SECTION vartype varname #define PMSADDIRE_MAX (1 << 18) #define PMSADDIRE_INDEX_BITS (30) @@ -282,6 +286,7 @@ typedef struct GMEMMANAGE void* Ext; }GMemManage; +DefinedMEMData(GMemManage, GMemManageData); KLINE Addr PMSADRetPAddr(PMSAD* msad) From 555bd767a8519e9a15f66cec9965cc9679e15176 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 19 Oct 2021 15:42:55 +0800 Subject: [PATCH 176/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3CreateNewKMemPoolInit?= =?UTF-8?q?=E3=80=81KrlMmCreateKMemPoolRealize=E3=80=81KrlMmCreateKMemPool?= =?UTF-8?q?=E3=80=81KrlMmPoolInit=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 6 ++--- Kernel/Memory/KrlMmPool.c | 35 ++++++++++++++++++------- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index 0224a4d..13c3da1 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -72,9 +72,9 @@ private Bool ExtendKMemPoolCapacity(GMemPoolManage* gmpm, KMemPool* pool); private void* NewPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, Size size); private void* KrlMmNewPOEntitiesRealizeCore(GMemPoolManage* gmpm, Size size); private void* KrlMmNewPOEntitiesRealize(Size size); -private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, Addr start, Addr end, Size size); -private KMemPool* KrlMmCreateKMemPoolRealize(GMemPoolManage* gmpm, Size size); -public KMemPool* KrlMmCreateKMemPool(Size size); +private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, UInt msadnr, Addr start, Addr end, Size size); +private KMemPool* KrlMmCreateKMemPoolRealize(GMemPoolManage* gmpm, UInt msadnr, Size size); +public KMemPool* KrlMmCreateKMemPool(UInt msadnr, Size size); public void* KrlMmNewPOEntities(Size size); public Bool KrlMmPoolInit(); #endif \ No newline at end of file diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index c440f75..8244c8d 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -6,11 +6,11 @@ #include "BaseType.h" #include "List.h" #include "KrlMmManage.h" -#include "KrlMmPool.h" #include "KrlMmAlloc.h" +#include "KrlMmPool.h" DefinedMEMData(GMemPoolManage, GMemPoolData); -PoolParam PoolParamArr[] = { +MEMDATA_SECTION PoolParam PoolParamArr[KMPOOL_MAX] = { {2, 32}, {2, 64}, {2, 96}, {2, 128}, {2, 160}, {2, 192}, {2, 224}, {2, 256}, {2, 288}, {2, 320}, {2, 352}, {2, 384}, @@ -190,7 +190,7 @@ private void* KrlMmNewPOEntitiesRealize(Size size) return addr; } -private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, Addr start, Addr end, Size size) +private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, UInt msadnr, Addr start, Addr end, Size size) { POEntities* entstart = NULL; POEntities* entend = NULL; @@ -201,6 +201,7 @@ private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, Addr start, Addr entend = (POEntities*)end; pool->Size = size; + pool->AllocPMSADNR = msadnr; pool->VAddrStart = start; pool->VAddrEnd = end; ListAdd(&msad->Lists, &pool->PMSADsLists); @@ -216,18 +217,18 @@ private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, Addr start, Addr return i; } -private KMemPool* KrlMmCreateKMemPoolRealize(GMemPoolManage* gmpm, Size size) +private KMemPool* KrlMmCreateKMemPoolRealize(GMemPoolManage* gmpm, UInt msadnr, Size size) { KMemPool* pool = NULL; PMSAD* msad = NULL; Bool rets = FALSE; IF_NULL_RETURN_NULL(gmpm); - msad = KrlMmAllocKernPMSADs(4); + msad = KrlMmAllocKernPMSADs(msadnr); IF_NULL_RETURN_NULL(msad); pool = (KMemPool*)PMSADRetVAddr(msad); IF_NULL_RETURN_NULL(pool); KMemPoolInit(pool); - if(1 > CreateNewKMemPoolInit(pool, msad, (Addr)pool, ((Addr)pool + (Addr)KrlMmGetPMSADsSize(msad) - 1), size)) + if(1 > CreateNewKMemPoolInit(pool, msad, msadnr, (Addr)pool, ((Addr)pool + (Addr)KrlMmGetPMSADsSize(msad) - 1), size)) { rets = KrlMmFreeKernPMSADs(msad); IF_EQT_DEAD(FALSE, rets, "KrlMmFreeKernPMSADs is Fail\n"); @@ -236,14 +237,15 @@ private KMemPool* KrlMmCreateKMemPoolRealize(GMemPoolManage* gmpm, Size size) return pool; } -public KMemPool* KrlMmCreateKMemPool(Size size) +public KMemPool* KrlMmCreateKMemPool(UInt msadnr, Size size) { GMemPoolManage* gmpm; + IF_LTNONE_RETRUN_NULL(msadnr); IF_LTNONE_RETRUN_NULL(size); - IF_GTN_RETURN(size, 2024, NULL); + IF_GTN_RETURN(size, 2048, NULL); gmpm = KrlMmGetGMemPoolAddr(); IF_NULL_RETURN_NULL(gmpm); - return KrlMmCreateKMemPoolRealize(gmpm, size); + return KrlMmCreateKMemPoolRealize(gmpm, msadnr, size); } @@ -255,6 +257,19 @@ public void* KrlMmNewPOEntities(Size size) public Bool KrlMmPoolInit() { - GMemPoolManageInit(&GMemPoolData); + GMemPoolManage* gmpm = NULL; + KMemPool* pool = NULL; + gmpm = KrlMmGetGMemPoolAddr(); + IF_NULL_RETURN_FALSE(gmpm); + GMemPoolManageInit(gmpm); + for(UInt i = 0; i < KMPOOL_MAX; i++) + { + pool = KrlMmCreateKMemPool(PoolParamArr[i].AllocPMSADs, PoolParamArr[i].POESize); + if(NULL != pool) + { + gmpm->KMemPoolArr[i] = pool; + gmpm->KMemPoolNR++; + } + } return TRUE; } \ No newline at end of file From cdf9ff706a3671f8ff9651c14cc3581fda316d6d Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 19 Oct 2021 16:34:04 +0800 Subject: [PATCH 177/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmNew=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 1 + Kernel/Memory/KrlMmPool.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index 13c3da1..4a8d0c7 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -76,5 +76,6 @@ private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, UInt msadnr, Add private KMemPool* KrlMmCreateKMemPoolRealize(GMemPoolManage* gmpm, UInt msadnr, Size size); public KMemPool* KrlMmCreateKMemPool(UInt msadnr, Size size); public void* KrlMmNewPOEntities(Size size); +public void* KrlMmNew(Size size); public Bool KrlMmPoolInit(); #endif \ No newline at end of file diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index 8244c8d..5a1366c 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -255,6 +255,11 @@ public void* KrlMmNewPOEntities(Size size) return KrlMmNewPOEntitiesRealize(size); } +public void* KrlMmNew(Size size) +{ + return KrlMmNewPOEntities(size); +} + public Bool KrlMmPoolInit() { GMemPoolManage* gmpm = NULL; From ed2cb28a70d5738df415606f45b7dc4d495e9bc4 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 19 Oct 2021 17:01:34 +0800 Subject: [PATCH 178/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmGetPMSADsRangeVS?= =?UTF-8?q?tart=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 1 + Kernel/Memory/KrlMmAlloc.c | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index 3b34852..6a44ecb 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -26,6 +26,7 @@ private PMSAD* KrlMmAllocPMSADsRealize(UInt nodeid, UInt areaid, UInt msadnr, U6 public U64 KrlMmGetPMSADsLen(PMSAD* msad); public U64 KrlMmGetPMSADsSize(PMSAD* msad); public PMSAD* KrlMmGetPMSADsEnd(PMSAD* msad); +public Addr KrlMmGetPMSADsRangeVStart(PMSAD* msad); public PMSAD* KrlMmAllocPMSADs(UInt nodeid, UInt areaid, UInt msadnr, U64 flags); public PMSAD* KrlMmAllocKernPMSADs(UInt msadnr); public PMSAD* KrlMmAllocUserPMSADs(UInt msadnr); diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 329ec10..355d997 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -288,6 +288,13 @@ public PMSAD* KrlMmGetPMSADsEnd(PMSAD* msad) return end; } +public Addr KrlMmGetPMSADsRangeVStart(PMSAD* msad) +{ + IF_NULL_DEAD(msad); + IF_NEQ_DEAD(TRUE, PMSADIsFree(msad), "PMSAD Is Not Free\n"); + return PMSADRetVAddr(msad); +} + public PMSAD* KrlMmAllocPMSADs(UInt nodeid, UInt areaid, UInt msadnr, U64 flags) { return KrlMmAllocPMSADsRealize(nodeid, areaid, msadnr, flags); From 7dc609b368d5c2fad9928d96b4f6cf3fd3d1e0b9 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 19 Oct 2021 17:05:56 +0800 Subject: [PATCH 179/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmGetPMSADsRangeVE?= =?UTF-8?q?nd=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmAlloc.h | 1 + Kernel/Memory/KrlMmAlloc.c | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmAlloc.h b/Include/KernelInc/MemoryInc/KrlMmAlloc.h index 6a44ecb..b177bde 100644 --- a/Include/KernelInc/MemoryInc/KrlMmAlloc.h +++ b/Include/KernelInc/MemoryInc/KrlMmAlloc.h @@ -27,6 +27,7 @@ public U64 KrlMmGetPMSADsLen(PMSAD* msad); public U64 KrlMmGetPMSADsSize(PMSAD* msad); public PMSAD* KrlMmGetPMSADsEnd(PMSAD* msad); public Addr KrlMmGetPMSADsRangeVStart(PMSAD* msad); +public Addr KrlMmGetPMSADsRangeVEnd(PMSAD* msad); public PMSAD* KrlMmAllocPMSADs(UInt nodeid, UInt areaid, UInt msadnr, U64 flags); public PMSAD* KrlMmAllocKernPMSADs(UInt msadnr); public PMSAD* KrlMmAllocUserPMSADs(UInt msadnr); diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index 355d997..d09d995 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -295,6 +295,16 @@ public Addr KrlMmGetPMSADsRangeVStart(PMSAD* msad) return PMSADRetVAddr(msad); } +public Addr KrlMmGetPMSADsRangeVEnd(PMSAD* msad) +{ + PMSAD* end = NULL; + IF_NULL_DEAD(msad); + IF_NEQ_DEAD(TRUE, PMSADIsFree(msad), "PMSAD Is Not Free\n"); + end = KrlMmGetPMSADsEnd(msad); + IF_NULL_DEAD(end); + return (Addr)((PMSADRetVAddr(end) + MSAD_SIZE) - 1); +} + public PMSAD* KrlMmAllocPMSADs(UInt nodeid, UInt areaid, UInt msadnr, U64 flags) { return KrlMmAllocPMSADsRealize(nodeid, areaid, msadnr, flags); From cabae779f84897975ad280817f5956bc7dc8d1a4 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 19 Oct 2021 17:20:53 +0800 Subject: [PATCH 180/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ForAddrRetKMemPoolOnG?= =?UTF-8?q?MemPoolManage=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 1 + Kernel/Memory/KrlMmPool.c | 50 +++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index 4a8d0c7..c2de82c 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -66,6 +66,7 @@ private void POEntitiesInit(POEntities* init); private void KMemPoolInit(KMemPool* init); private void GMemPoolManageInit(GMemPoolManage* init); private KMemPool* ForSizeRetKMemPoolOnGMemPoolManage(GMemPoolManage* gmpm, Size size); +private KMemPool* ForAddrRetKMemPoolOnGMemPoolManage(GMemPoolManage* gmpm, void* addr); private POEntities* PickPOEntitiesOnKMemPool(KMemPool* pool); private UInt POEntitiesArrInitOnMemSPace(KMemPool* pool, Addr start, Addr end); private Bool ExtendKMemPoolCapacity(GMemPoolManage* gmpm, KMemPool* pool); diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index 5a1366c..ff8a5f9 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -82,6 +82,56 @@ private KMemPool* ForSizeRetKMemPoolOnGMemPoolManage(GMemPoolManage* gmpm, Size return NULL; } +private KMemPool* ForAddrRetKMemPoolOnGMemPoolManage(GMemPoolManage* gmpm, void* addr) +{ + List* lists = NULL; + PMSAD* msad = NULL; + KMemPool* pool = NULL; + Addr rangestart = NULL; + Addr rangeend = NULL; + IF_NULL_RETURN_NULL(gmpm); + if(NULL != gmpm->KMemPoolCache) + { + pool = gmpm->KMemPoolCache; + if((pool->VAddrStart <= (Addr)addr) && ((Addr)addr < pool->VAddrEnd)) + { + ListForEach(lists, &pool->PMSADsLists) + { + msad = ListEntry(lists, PMSAD, Lists); + rangestart = KrlMmGetPMSADsRangeVStart(msad); + rangeend = KrlMmGetPMSADsRangeVEnd(msad); + if((rangestart <= (Addr)addr) && ((Addr)addr < rangeend)) + { + return pool; + } + } + } + + } + for(UInt i = 0; i < KMPOOL_MAX; i++) + { + if(NULL != gmpm->KMemPoolArr[i]) + { + pool = gmpm->KMemPoolArr[i]; + if ((pool->VAddrStart <= (Addr)addr) && ((Addr)addr < pool->VAddrEnd)) + { + ListForEach(lists, &pool->PMSADsLists) + { + msad = ListEntry(lists, PMSAD, Lists); + rangestart = KrlMmGetPMSADsRangeVStart(msad); + rangeend = KrlMmGetPMSADsRangeVEnd(msad); + if((rangestart <= (Addr)addr) && ((Addr)addr < rangeend)) + { + return pool; + } + } + } + } + } + return NULL; +} + + private POEntities* PickPOEntitiesOnKMemPool(KMemPool* pool) { POEntities* entities = NULL; From d04ef7fcfdedc983d4a72a0eef4e2d191acf0a52 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 19 Oct 2021 17:40:02 +0800 Subject: [PATCH 181/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0PutsPOEntitiesOnKMemP?= =?UTF-8?q?ool=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 1 + Kernel/Memory/KrlMmPool.c | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index c2de82c..9b73c22 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -68,6 +68,7 @@ private void GMemPoolManageInit(GMemPoolManage* init); private KMemPool* ForSizeRetKMemPoolOnGMemPoolManage(GMemPoolManage* gmpm, Size size); private KMemPool* ForAddrRetKMemPoolOnGMemPoolManage(GMemPoolManage* gmpm, void* addr); private POEntities* PickPOEntitiesOnKMemPool(KMemPool* pool); +private Bool PutsPOEntitiesOnKMemPool(KMemPool* pool, POEntities* entities); private UInt POEntitiesArrInitOnMemSPace(KMemPool* pool, Addr start, Addr end); private Bool ExtendKMemPoolCapacity(GMemPoolManage* gmpm, KMemPool* pool); private void* NewPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, Size size); diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index ff8a5f9..0e16670 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -145,6 +145,16 @@ private POEntities* PickPOEntitiesOnKMemPool(KMemPool* pool) return entities; } +private Bool PutsPOEntitiesOnKMemPool(KMemPool* pool, POEntities* entities) +{ + IF_NULL_RETURN_FALSE(pool); + IF_NULL_RETURN_FALSE(entities); + POEntitiesInit(entities); + ListAdd(&entities->Lists, &pool->ObjLists); + pool->FreeObjNR++; + return TRUE; +} + private UInt POEntitiesArrInitOnMemSPace(KMemPool* pool, Addr start, Addr end) { POEntities* entstart = NULL; From ae8b49a02cbcbbab3401315d4f9386c488d6797c Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 19 Oct 2021 17:42:06 +0800 Subject: [PATCH 182/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0DelPOEntitiesOnKMemPo?= =?UTF-8?q?ol=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 1 + Kernel/Memory/KrlMmPool.c | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index 9b73c22..382f535 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -74,6 +74,7 @@ private Bool ExtendKMemPoolCapacity(GMemPoolManage* gmpm, KMemPool* pool); private void* NewPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, Size size); private void* KrlMmNewPOEntitiesRealizeCore(GMemPoolManage* gmpm, Size size); private void* KrlMmNewPOEntitiesRealize(Size size); +private Bool DelPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, void* addr); private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, UInt msadnr, Addr start, Addr end, Size size); private KMemPool* KrlMmCreateKMemPoolRealize(GMemPoolManage* gmpm, UInt msadnr, Size size); public KMemPool* KrlMmCreateKMemPool(UInt msadnr, Size size); diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index 0e16670..a7a1f4f 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -250,6 +250,17 @@ private void* KrlMmNewPOEntitiesRealize(Size size) return addr; } +private Bool DelPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, void* addr) +{ + Bool rets = FALSE; + IF_NULL_RETURN_FALSE(gmpm); + IF_NULL_RETURN_FALSE(pool); + IF_NULL_RETURN_FALSE(addr); + + rets = PutsPOEntitiesOnKMemPool(pool, (POEntities*)addr); + return rets; +} + private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, UInt msadnr, Addr start, Addr end, Size size) { POEntities* entstart = NULL; From 87bacd162a32a03b0693196526b7e93280fcb703 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 19 Oct 2021 17:43:38 +0800 Subject: [PATCH 183/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmDelPOEntitiesRea?= =?UTF-8?q?lizeCore=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 3 ++- Kernel/Memory/KrlMmPool.c | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index 382f535..b9e897a 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -74,7 +74,8 @@ private Bool ExtendKMemPoolCapacity(GMemPoolManage* gmpm, KMemPool* pool); private void* NewPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, Size size); private void* KrlMmNewPOEntitiesRealizeCore(GMemPoolManage* gmpm, Size size); private void* KrlMmNewPOEntitiesRealize(Size size); -private Bool DelPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, void* addr); +private Bool DelPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, void* addr); +private Bool KrlMmDelPOEntitiesRealizeCore(GMemPoolManage* gmpm, void* addr); private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, UInt msadnr, Addr start, Addr end, Size size); private KMemPool* KrlMmCreateKMemPoolRealize(GMemPoolManage* gmpm, UInt msadnr, Size size); public KMemPool* KrlMmCreateKMemPool(UInt msadnr, Size size); diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index a7a1f4f..846ba92 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -261,6 +261,21 @@ private Bool DelPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, void* return rets; } +private Bool KrlMmDelPOEntitiesRealizeCore(GMemPoolManage* gmpm, void* addr) +{ + Bool rets = FALSE; + KMemPool* pool = NULL; + IF_NULL_RETURN_FALSE(gmpm); + + pool = ForAddrRetKMemPoolOnGMemPoolManage(gmpm, addr); + IF_NULL_RETURN_FALSE(pool); + + KrlMmLocked(&pool->Lock); + rets = DelPOEntitiesOnKMemPool(gmpm, pool, addr); + KrlMmUnLock(&pool->Lock); + return rets; +} + private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, UInt msadnr, Addr start, Addr end, Size size) { POEntities* entstart = NULL; From 145f7f72192b4cf66c4038495ba4e3a37113f8ed Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 19 Oct 2021 17:44:37 +0800 Subject: [PATCH 184/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmDelPOEntitiesRea?= =?UTF-8?q?lize=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 1 + Kernel/Memory/KrlMmPool.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index b9e897a..1984407 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -76,6 +76,7 @@ private void* KrlMmNewPOEntitiesRealizeCore(GMemPoolManage* gmpm, Size size); private void* KrlMmNewPOEntitiesRealize(Size size); private Bool DelPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, void* addr); private Bool KrlMmDelPOEntitiesRealizeCore(GMemPoolManage* gmpm, void* addr); +private Bool KrlMmDelPOEntitiesRealize(void* addr); private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, UInt msadnr, Addr start, Addr end, Size size); private KMemPool* KrlMmCreateKMemPoolRealize(GMemPoolManage* gmpm, UInt msadnr, Size size); public KMemPool* KrlMmCreateKMemPool(UInt msadnr, Size size); diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index 846ba92..b7c1351 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -276,6 +276,20 @@ private Bool KrlMmDelPOEntitiesRealizeCore(GMemPoolManage* gmpm, void* addr) return rets; } +private Bool KrlMmDelPOEntitiesRealize(void* addr) +{ + Bool rets = FALSE; + GMemPoolManage* gmpm = NULL; + + gmpm = KrlMmGetGMemPoolAddr(); + IF_NULL_RETURN_FALSE(gmpm); + + KrlMmLocked(&gmpm->Lock); + rets = KrlMmDelPOEntitiesRealizeCore(gmpm, addr); + KrlMmUnLock(&gmpm->Lock); + return rets; +} + private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, UInt msadnr, Addr start, Addr end, Size size) { POEntities* entstart = NULL; From 2cff4fc0cc5109e31c3f3e6717aa7e9932c10e03 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 19 Oct 2021 17:47:00 +0800 Subject: [PATCH 185/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmDelPOEntities?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 1 + Kernel/Memory/KrlMmPool.c | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index 1984407..a5a8b3a 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -80,6 +80,7 @@ private Bool KrlMmDelPOEntitiesRealize(void* addr); private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, UInt msadnr, Addr start, Addr end, Size size); private KMemPool* KrlMmCreateKMemPoolRealize(GMemPoolManage* gmpm, UInt msadnr, Size size); public KMemPool* KrlMmCreateKMemPool(UInt msadnr, Size size); +public Bool KrlMmDelPOEntities(void* addr); public void* KrlMmNewPOEntities(Size size); public void* KrlMmNew(Size size); public Bool KrlMmPoolInit(); diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index b7c1351..39b538b 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -348,6 +348,12 @@ public KMemPool* KrlMmCreateKMemPool(UInt msadnr, Size size) return KrlMmCreateKMemPoolRealize(gmpm, msadnr, size); } +public Bool KrlMmDelPOEntities(void* addr) +{ + IF_NULL_RETURN_FALSE(addr); + return KrlMmNewPOEntitiesRealize(addr); +} + public void* KrlMmNewPOEntities(Size size) { From d31ccfd6661afd622e8a987b059a50b909b36db8 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Tue, 19 Oct 2021 17:49:36 +0800 Subject: [PATCH 186/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmDel=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 1 + Kernel/Memory/KrlMmPool.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index a5a8b3a..13a4c4a 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -81,6 +81,7 @@ private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, UInt msadnr, Add private KMemPool* KrlMmCreateKMemPoolRealize(GMemPoolManage* gmpm, UInt msadnr, Size size); public KMemPool* KrlMmCreateKMemPool(UInt msadnr, Size size); public Bool KrlMmDelPOEntities(void* addr); +public Bool KrlMmDel(void* addr); public void* KrlMmNewPOEntities(Size size); public void* KrlMmNew(Size size); public Bool KrlMmPoolInit(); diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index 39b538b..12f3b18 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -354,6 +354,10 @@ public Bool KrlMmDelPOEntities(void* addr) return KrlMmNewPOEntitiesRealize(addr); } +public Bool KrlMmDel(void* addr) +{ + return KrlMmDelPOEntities(addr); +} public void* KrlMmNewPOEntities(Size size) { From 8e340a727aac6e63c16101549965ab01f471e068 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 20 Oct 2021 09:37:21 +0800 Subject: [PATCH 187/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KPMSADsPool=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index 13a4c4a..eb0ad21 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -8,6 +8,7 @@ #define _KRLMMPOOLHEAD #define MSCLST_MAX (5) #define KMPOOL_MAX (64) +#define PMLH_MAX (32) #define PER_POE_INCSIZE (32) #define KUC_NEWFLG (1) #define KUC_DELFLG (2) @@ -19,6 +20,13 @@ typedef struct POOLPARM UInt POESize; }PoolParam; +typedef struct PMLHEAD +{ + UInt PmsadNR; + UInt AllocPMSADNR; + List Lists; +}PMLHead; + typedef struct POENTITIES { @@ -45,6 +53,16 @@ typedef struct KMEMPOOL void* Ext; }KMemPool; +typedef struct KPMSADSPOOL +{ + List Lists; + MLock Lock; + UInt Status; + UInt Flags; + UInt PmsadsNR; + PMLHead PMLHeadArr[PMLH_MAX]; +}KPMSADsPool; + typedef struct GMEMPOOLMANAGE { List Lists; @@ -52,7 +70,7 @@ typedef struct GMEMPOOLMANAGE UInt Status; UInt Flags; UInt KMemPoolNR; - KMemPool KMemPoolMain; + KPMSADsPool PMSADsPool; KMemPool* KMemPoolCache; KMemPool* KMemPoolArr[KMPOOL_MAX]; }GMemPoolManage; From ff99c4e0b93daf66e7aae72d153bbfc313625cd0 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 20 Oct 2021 09:51:13 +0800 Subject: [PATCH 188/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KPMSADsPoolInit?= =?UTF-8?q?=E3=80=81PMLHeadInit=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 2 ++ Kernel/Memory/KrlMmPool.c | 24 +++++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index eb0ad21..9f6bb51 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -80,6 +80,8 @@ KLINE GMemPoolManage* KrlMmGetGMemPoolAddr() return &GMemPoolData; } +private void PMLHeadInit(PMLHead* init, UInt msadnr); +private void KPMSADsPoolInit(KPMSADsPool* init); private void POEntitiesInit(POEntities* init); private void KMemPoolInit(KMemPool* init); private void GMemPoolManageInit(GMemPoolManage* init); diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index 12f3b18..9e74ccb 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -29,6 +29,28 @@ MEMDATA_SECTION PoolParam PoolParamArr[KMPOOL_MAX] = { {16, 1952}, {16, 1984}, {16, 2016}, {16, 2048}, }; +private void PMLHeadInit(PMLHead* init, UInt msadnr) +{ + IF_NULL_RETURN(init); + INIT_OBJOFPTR_ZERO(init); + init->AllocPMSADNR = msadnr; + ListInit(&init->Lists); + return; +} + +private void KPMSADsPoolInit(KPMSADsPool* init) +{ + IF_NULL_RETURN(init); + INIT_OBJOFPTR_ZERO(init); + ListInit(&init->Lists); + MLockInit(&init->Lock); + for(UInt i = 0; i < PMLH_MAX; i++) + { + PMLHeadInit(&init->PMLHeadArr[i], (1 << i)); + } + return; +} + private void POEntitiesInit(POEntities* init) { IF_NULL_RETURN_NULL(init); @@ -54,7 +76,7 @@ private void GMemPoolManageInit(GMemPoolManage* init) INIT_OBJOFPTR_ZERO(init); ListInit(&init->Lists); MLockInit(&init->Lock); - KMemPoolInit(&init->KMemPoolMain); + KPMSADsPoolInit(&init->PMSADsPool); return; } From 2a73286647f7c2af68de3c1b93bee8e8c7802800 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 20 Oct 2021 09:53:26 +0800 Subject: [PATCH 189/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3KPMSADsPool=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index 9f6bb51..9e06fee 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -60,6 +60,7 @@ typedef struct KPMSADSPOOL UInt Status; UInt Flags; UInt PmsadsNR; + PMLHead* PMLHeadCache; PMLHead PMLHeadArr[PMLH_MAX]; }KPMSADsPool; From 9300d8900ff39b2fce57911da94217a106c68f28 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 20 Oct 2021 10:06:46 +0800 Subject: [PATCH 190/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3KrlMmDelPOEntities?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmPool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index 9e74ccb..aac391d 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -373,7 +373,7 @@ public KMemPool* KrlMmCreateKMemPool(UInt msadnr, Size size) public Bool KrlMmDelPOEntities(void* addr) { IF_NULL_RETURN_FALSE(addr); - return KrlMmNewPOEntitiesRealize(addr); + return KrlMmDelPOEntitiesRealize(addr); } public Bool KrlMmDel(void* addr) From 832d27a736393745568e912a41cba137b8a6899b Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 20 Oct 2021 13:23:49 +0800 Subject: [PATCH 191/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ForMsadNrRetPMLHeadOn?= =?UTF-8?q?GMemPoolManage=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 4 +++- Kernel/Memory/KrlMmPool.c | 21 +++++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index 9e06fee..b4488b9 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -24,6 +24,7 @@ typedef struct PMLHEAD { UInt PmsadNR; UInt AllocPMSADNR; + UInt EndMaxPMSADNR; List Lists; }PMLHead; @@ -81,13 +82,14 @@ KLINE GMemPoolManage* KrlMmGetGMemPoolAddr() return &GMemPoolData; } -private void PMLHeadInit(PMLHead* init, UInt msadnr); +private void PMLHeadInit(PMLHead* init, UInt msadnr, UInt endmsadnr); private void KPMSADsPoolInit(KPMSADsPool* init); private void POEntitiesInit(POEntities* init); private void KMemPoolInit(KMemPool* init); private void GMemPoolManageInit(GMemPoolManage* init); private KMemPool* ForSizeRetKMemPoolOnGMemPoolManage(GMemPoolManage* gmpm, Size size); private KMemPool* ForAddrRetKMemPoolOnGMemPoolManage(GMemPoolManage* gmpm, void* addr); +private PMLHead* ForMsadNrRetPMLHeadOnGMemPoolManage(GMemPoolManage* gmpm, UInt msadnr); private POEntities* PickPOEntitiesOnKMemPool(KMemPool* pool); private Bool PutsPOEntitiesOnKMemPool(KMemPool* pool, POEntities* entities); private UInt POEntitiesArrInitOnMemSPace(KMemPool* pool, Addr start, Addr end); diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index aac391d..f352ac6 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -29,11 +29,12 @@ MEMDATA_SECTION PoolParam PoolParamArr[KMPOOL_MAX] = { {16, 1952}, {16, 1984}, {16, 2016}, {16, 2048}, }; -private void PMLHeadInit(PMLHead* init, UInt msadnr) +private void PMLHeadInit(PMLHead* init, UInt msadnr, UInt endmsadnr) { IF_NULL_RETURN(init); INIT_OBJOFPTR_ZERO(init); init->AllocPMSADNR = msadnr; + init->EndMaxPMSADNR = endmsadnr; ListInit(&init->Lists); return; } @@ -46,7 +47,7 @@ private void KPMSADsPoolInit(KPMSADsPool* init) MLockInit(&init->Lock); for(UInt i = 0; i < PMLH_MAX; i++) { - PMLHeadInit(&init->PMLHeadArr[i], (1 << i)); + PMLHeadInit(&init->PMLHeadArr[i], (1 << i), ((1 << (i + 1)) - 1)); } return; } @@ -153,6 +154,22 @@ private KMemPool* ForAddrRetKMemPoolOnGMemPoolManage(GMemPoolManage* gmpm, void* return NULL; } +private PMLHead* ForMsadNrRetPMLHeadOnGMemPoolManage(GMemPoolManage* gmpm, UInt msadnr) +{ + PMLHead* head = NULL; + KPMSADsPool* pool = NULL; + IF_NULL_RETURN_NULL(gmpm); + pool = &gmpm->PMSADsPool; + for(UInt i = 0; i < PMLH_MAX; i++) + { + head = &pool->PMLHeadArr[i]; + if((msadnr <= head->AllocPMSADNR)) + { + return head; + } + } + return NULL; +} private POEntities* PickPOEntitiesOnKMemPool(KMemPool* pool) { From 3788f3f9ef1848667845825149040db588de1a2c Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 20 Oct 2021 13:25:38 +0800 Subject: [PATCH 192/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0NewPMSADsOnKPMSADsPoo?= =?UTF-8?q?l=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 1 + Kernel/Memory/KrlMmPool.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index b4488b9..703c809 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -95,6 +95,7 @@ private Bool PutsPOEntitiesOnKMemPool(KMemPool* pool, POEntities* entities); private UInt POEntitiesArrInitOnMemSPace(KMemPool* pool, Addr start, Addr end); private Bool ExtendKMemPoolCapacity(GMemPoolManage* gmpm, KMemPool* pool); private void* NewPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, Size size); +private void* NewPMSADsOnKPMSADsPool(GMemPoolManage* gmpm, KPMSADsPool* pool, PMLHead* head, UInt msadnr); private void* KrlMmNewPOEntitiesRealizeCore(GMemPoolManage* gmpm, Size size); private void* KrlMmNewPOEntitiesRealize(Size size); private Bool DelPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, void* addr); diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index f352ac6..e9ef4e9 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -260,6 +260,21 @@ private void* NewPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, Size return (void*)PickPOEntitiesOnKMemPool(pool); } +private void* NewPMSADsOnKPMSADsPool(GMemPoolManage* gmpm, KPMSADsPool* pool, PMLHead* head, UInt msadnr) +{ + PMSAD* msad = NULL; + IF_NULL_RETURN_NULL(gmpm); + IF_NULL_RETURN_NULL(pool); + IF_NULL_RETURN_NULL(head); + IF_ZERO_RETURN_NULL(msadnr); + msad = KrlMmAllocKernPMSADs(msadnr); + IF_NULL_RETURN_NULL(msad); + ListAdd(&msad->Lists, &head->Lists); + head->PmsadNR++; + pool->PmsadsNR++; + return (void*)PMSADRetVAddr(msad); +} + private void* KrlMmNewPOEntitiesRealizeCore(GMemPoolManage* gmpm, Size size) { void* addr = NULL; From 5240ade735ef7e28829e8942f95ff09aabf48bc5 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 20 Oct 2021 13:26:45 +0800 Subject: [PATCH 193/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmNewPMSADsRealize?= =?UTF-8?q?Core=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 1 + Kernel/Memory/KrlMmPool.c | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index 703c809..ad84d83 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -96,6 +96,7 @@ private UInt POEntitiesArrInitOnMemSPace(KMemPool* pool, Addr start, Addr end); private Bool ExtendKMemPoolCapacity(GMemPoolManage* gmpm, KMemPool* pool); private void* NewPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, Size size); private void* NewPMSADsOnKPMSADsPool(GMemPoolManage* gmpm, KPMSADsPool* pool, PMLHead* head, UInt msadnr); +private void* KrlMmNewPMSADsRealizeCore(GMemPoolManage* gmpm, Size size); private void* KrlMmNewPOEntitiesRealizeCore(GMemPoolManage* gmpm, Size size); private void* KrlMmNewPOEntitiesRealize(Size size); private Bool DelPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, void* addr); diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index e9ef4e9..85fc8c8 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -275,6 +275,24 @@ private void* NewPMSADsOnKPMSADsPool(GMemPoolManage* gmpm, KPMSADsPool* pool, PM return (void*)PMSADRetVAddr(msad); } +private void* KrlMmNewPMSADsRealizeCore(GMemPoolManage* gmpm, Size size) +{ + void* addr = NULL; + KPMSADsPool* pool = NULL; + PMLHead* head = NULL; + UInt msadnr = 0; + IF_NULL_RETURN_NULL(gmpm); + msadnr = (MSAD_ALIGN(size) >> MSAD_PADR_SLBITS); + pool = &gmpm->PMSADsPool; + head = ForMsadNrRetPMLHeadOnGMemPoolManage(gmpm, msadnr); + IF_NULL_RETURN_NULL(head); + + KrlMmLocked(&pool->Lock); + addr = NewPMSADsOnKPMSADsPool(gmpm, pool, head, msadnr); + KrlMmUnLock(&pool->Lock); + return addr; +} + private void* KrlMmNewPOEntitiesRealizeCore(GMemPoolManage* gmpm, Size size) { void* addr = NULL; From bdb6095f978e4f0240632a7f963b8b07da0391fc Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 20 Oct 2021 13:28:41 +0800 Subject: [PATCH 194/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmNewPMSADsRealize?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 1 + Kernel/Memory/KrlMmPool.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index ad84d83..91abc4e 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -98,6 +98,7 @@ private void* NewPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, Size private void* NewPMSADsOnKPMSADsPool(GMemPoolManage* gmpm, KPMSADsPool* pool, PMLHead* head, UInt msadnr); private void* KrlMmNewPMSADsRealizeCore(GMemPoolManage* gmpm, Size size); private void* KrlMmNewPOEntitiesRealizeCore(GMemPoolManage* gmpm, Size size); +private void* KrlMmNewPMSADsRealize(Size size); private void* KrlMmNewPOEntitiesRealize(Size size); private Bool DelPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, void* addr); private Bool KrlMmDelPOEntitiesRealizeCore(GMemPoolManage* gmpm, void* addr); diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index 85fc8c8..556d726 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -308,6 +308,20 @@ private void* KrlMmNewPOEntitiesRealizeCore(GMemPoolManage* gmpm, Size size) return addr; } +private void* KrlMmNewPMSADsRealize(Size size) +{ + void* addr = NULL; + GMemPoolManage* gmpm = NULL; + + gmpm = KrlMmGetGMemPoolAddr(); + IF_NULL_RETURN_NULL(gmpm); + + KrlMmLocked(&gmpm->Lock); + addr = KrlMmNewPMSADsRealizeCore(gmpm, size); + KrlMmUnLock(&gmpm->Lock); + return addr; +} + private void* KrlMmNewPOEntitiesRealize(Size size) { void* addr = NULL; From cb19367135e017a4ffec83979c9deb67099ff7aa Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 20 Oct 2021 13:32:57 +0800 Subject: [PATCH 195/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3KrlMmNewPOEntities?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmPool.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index 556d726..603e6b8 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -448,6 +448,10 @@ public Bool KrlMmDel(void* addr) public void* KrlMmNewPOEntities(Size size) { IF_LTNONE_RETRUN_NULL(size); + if(size > 2048); + { + return KrlMmNewPMSADsRealize(size); + } return KrlMmNewPOEntitiesRealize(size); } From d7791194699d42c33e794f2a25980e705a964ed4 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 20 Oct 2021 16:43:44 +0800 Subject: [PATCH 196/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ForAddrDelAndRetPMSAD?= =?UTF-8?q?OnKPMSADsPool=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 1 + Kernel/Memory/KrlMmPool.c | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index 91abc4e..27ae1c9 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -88,6 +88,7 @@ private void POEntitiesInit(POEntities* init); private void KMemPoolInit(KMemPool* init); private void GMemPoolManageInit(GMemPoolManage* init); private KMemPool* ForSizeRetKMemPoolOnGMemPoolManage(GMemPoolManage* gmpm, Size size); +private PMSAD* ForAddrDelAndRetPMSADOnKPMSADsPool(KPMSADsPool* pool, void* addr); private KMemPool* ForAddrRetKMemPoolOnGMemPoolManage(GMemPoolManage* gmpm, void* addr); private PMLHead* ForMsadNrRetPMLHeadOnGMemPoolManage(GMemPoolManage* gmpm, UInt msadnr); private POEntities* PickPOEntitiesOnKMemPool(KMemPool* pool); diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index 603e6b8..65a4a42 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -105,6 +105,31 @@ private KMemPool* ForSizeRetKMemPoolOnGMemPoolManage(GMemPoolManage* gmpm, Size return NULL; } +private PMSAD* ForAddrDelAndRetPMSADOnKPMSADsPool(KPMSADsPool* pool, void* addr) +{ + PMLHead* head = NULL; + List* lists = NULL; + PMSAD* msad = NULL; + + IF_NULL_RETURN_NULL(pool); + IF_NULL_RETURN_NULL(addr); + for(UInt i = 0; i < PMLH_MAX; i++) + { + head = &pool->PMLHeadArr[i]; + ListForEach(lists, &head->Lists) + { + msad = ListEntry(lists, PMSAD, Lists); + if(addr == (void*)PMSADRetVAddr(msad)) + { + ListDel(&msad->Lists); + head->PmsadNR--; + return msad; + } + } + } + return NULL; +} + private KMemPool* ForAddrRetKMemPoolOnGMemPoolManage(GMemPoolManage* gmpm, void* addr) { List* lists = NULL; From dce56878491e3f36ded041a94b787e70f8cad237 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 20 Oct 2021 16:58:30 +0800 Subject: [PATCH 197/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmDelPMSADsRealize?= =?UTF-8?q?Core=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 1 + Kernel/Memory/KrlMmPool.c | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index 27ae1c9..17c0e64 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -102,6 +102,7 @@ private void* KrlMmNewPOEntitiesRealizeCore(GMemPoolManage* gmpm, Size size); private void* KrlMmNewPMSADsRealize(Size size); private void* KrlMmNewPOEntitiesRealize(Size size); private Bool DelPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, void* addr); +private Bool KrlMmDelPMSADsRealizeCore(GMemPoolManage* gmpm, void* addr); private Bool KrlMmDelPOEntitiesRealizeCore(GMemPoolManage* gmpm, void* addr); private Bool KrlMmDelPOEntitiesRealize(void* addr); private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, UInt msadnr, Addr start, Addr end, Size size); diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index 65a4a42..fbbfa94 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -372,6 +372,26 @@ private Bool DelPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, void* return rets; } +private Bool KrlMmDelPMSADsRealizeCore(GMemPoolManage* gmpm, void* addr) +{ + Bool rets = FALSE; + PMSAD* msad = NULL; + IF_NULL_RETURN_FALSE(gmpm); + + msad = ForAddrDelAndRetPMSADOnKPMSADsPool(&gmpm->PMSADsPool, addr); + IF_NULL_RETURN_FALSE(msad); + IF_NEQ_DEAD(addr, (void*)PMSADRetVAddr(msad), "addr is not EQ PMSAD Addr\n"); + rets = KrlMmFreeKernPMSADs(msad); + IF_NEQ_DEAD(TRUE, rets, "KrlMmFreeKernPMSADs Called Fail\n"); + KrlMmLocked(&gmpm->PMSADsPool.Lock); + if(gmpm->PMSADsPool.PmsadsNR > 0) + { + gmpm->PMSADsPool.PmsadsNR--; + } + KrlMmUnLock(&gmpm->PMSADsPool.Lock); + return rets; +} + private Bool KrlMmDelPOEntitiesRealizeCore(GMemPoolManage* gmpm, void* addr) { Bool rets = FALSE; From f00013d74af8525718a12ef7fc0fa2f8b3573c3e Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Wed, 20 Oct 2021 17:03:02 +0800 Subject: [PATCH 198/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3KrlMmDelPOEntitiesRea?= =?UTF-8?q?lize=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmPool.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index fbbfa94..84bc70b 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -417,6 +417,12 @@ private Bool KrlMmDelPOEntitiesRealize(void* addr) KrlMmLocked(&gmpm->Lock); rets = KrlMmDelPOEntitiesRealizeCore(gmpm, addr); + if(TRUE == rets) + { + KrlMmUnLock(&gmpm->Lock); + return rets; + } + rets = KrlMmDelPMSADsRealizeCore(gmpm, addr); KrlMmUnLock(&gmpm->Lock); return rets; } From b0e08dcc85624dbdf7786fb01945f7f3bdc9c986 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 22 Oct 2021 09:28:04 +0800 Subject: [PATCH 199/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3PhyAddrFlags=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 5df9cf0..3c60de3 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -110,11 +110,9 @@ typedef struct PHYADDRFLAGS U64 SharedBit:1; U64 SwapBit:1; U64 CacheBit:1; - U64 KMapBit:1; U64 LockBit:1; - U64 DirtyBit:1; - U64 BusyBit:1; - U64 ReservedBit:4; + U64 KMPoolBit:1; + U64 ReservedBit:6; U64 PAddrBit:52; }__attribute__((packed)) PhyAddrFlags; From c2f0ea18e398170f3905ffbc4d49719cb27f7aae Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 22 Oct 2021 09:32:56 +0800 Subject: [PATCH 200/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0SetPMSADKMPool?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 3c60de3..5d5cfab 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -42,10 +42,9 @@ #define PAF_NO_SHARED (0) #define PAF_NO_SWAP (0) #define PAF_NO_CACHE (0) -#define PAF_NO_KMAP (0) +#define PAF_KMPOOL (1) +#define PAF_NO_KMPOOL (0) #define PAF_NO_LOCK (0) -#define PAF_NO_DIRTY (0) -#define PAF_NO_BUSY (0) #define PAF_RV2_VAL (0) #define PAF_INIT_PADRS (0) @@ -454,6 +453,13 @@ KLINE void ClearPMSADAlloc(PMSAD* msad) return; } +KLINE void SetPMSADKMPool(PMSAD* msad) +{ + IF_NULL_DEAD(msad); + msad->PhyAddr.KMPoolBit = PAF_KMPOOL; + return; +} + KLINE void SetPMSADBlockLink(PMSAD* msad, void* link) { IF_NULL_DEAD(msad); From 2c64e0aeca424be4e661b5685d93adf35059fadb Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 22 Oct 2021 09:33:30 +0800 Subject: [PATCH 201/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ClearPMSADKMPool?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 5d5cfab..b00ba68 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -460,6 +460,13 @@ KLINE void SetPMSADKMPool(PMSAD* msad) return; } +KLINE void ClearPMSADKMPool(PMSAD* msad) +{ + IF_NULL_DEAD(msad); + msad->PhyAddr.KMPoolBit = PAF_NO_KMPOOL; + return; +} + KLINE void SetPMSADBlockLink(PMSAD* msad, void* link) { IF_NULL_DEAD(msad); From 3b8fddc07fc4970bcf7b015fe085b066ca0ba72f Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 22 Oct 2021 09:36:43 +0800 Subject: [PATCH 202/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0PMSADIsKMPool?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index b00ba68..2fc5c70 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -467,6 +467,16 @@ KLINE void ClearPMSADKMPool(PMSAD* msad) return; } +KLINE Bool PMSADIsKMPool(PMSAD* msad) +{ + IF_NULL_RETURN_FALSE(msad); + if(PAF_KMPOOL == msad->PhyAddr.KMPoolBit) + { + return TRUE; + } + return FALSE; +} + KLINE void SetPMSADBlockLink(PMSAD* msad, void* link) { IF_NULL_DEAD(msad); From a82b46d2a030904321dd7f34993b78318590c01c Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 22 Oct 2021 09:45:15 +0800 Subject: [PATCH 203/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3CreateNewKMemPoolInit?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmPool.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index 84bc70b..eeb9a84 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -437,11 +437,6 @@ private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, UInt msadnr, Add entstart = (POEntities*)tmp; entend = (POEntities*)end; - pool->Size = size; - pool->AllocPMSADNR = msadnr; - pool->VAddrStart = start; - pool->VAddrEnd = end; - ListAdd(&msad->Lists, &pool->PMSADsLists); for(; entstart < entend; i++) { POEntitiesInit(entstart); @@ -450,7 +445,15 @@ private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, UInt msadnr, Add pool->FreeObjNR++; entstart = (POEntities*)(((UInt)entstart) + ((UInt)pool->Size)); } + IF_EQT_RETURN(0, i, 0); + + pool->Size = size; + pool->AllocPMSADNR = msadnr; + pool->VAddrStart = start; + pool->VAddrEnd = end; + SetPMSADKMPool(msad); + ListAdd(&msad->Lists, &pool->PMSADsLists); return i; } From af49e17bc6190774ffd4a178d5c6b45a313fc2f6 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 22 Oct 2021 09:51:56 +0800 Subject: [PATCH 204/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3ExtendKMemPoolCapacit?= =?UTF-8?q?y=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmPool.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index eeb9a84..da0cbde 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -252,6 +252,7 @@ private Bool ExtendKMemPoolCapacity(GMemPoolManage* gmpm, KMemPool* pool) PMSAD* msad = NULL; Addr start = NULL; Addr end = NULL; + Bool rets = FALSE; UInt nr = 0; IF_NULL_RETURN_FALSE(gmpm); IF_NULL_RETURN_FALSE(pool); @@ -260,9 +261,15 @@ private Bool ExtendKMemPoolCapacity(GMemPoolManage* gmpm, KMemPool* pool) start = PMSADRetVAddr(msad); end = start + (Addr)(KrlMmGetPMSADsSize(msad) - 1); - + SetPMSADKMPool(msad); + nr = POEntitiesArrInitOnMemSPace(pool, start, end); - IF_LTNONE_RETRUN_FALSE(nr); + if(1 > nr) + { + rets = KrlMmFreeKernPMSADs(msad); + IF_EQT_DEAD(FALSE, rets, "KrlMmFreeKernPMSADs is Fail\n"); + return FALSE; + } return TRUE; } @@ -447,7 +454,7 @@ private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, UInt msadnr, Add } IF_EQT_RETURN(0, i, 0); - + pool->Size = size; pool->AllocPMSADNR = msadnr; pool->VAddrStart = start; From 2466ced47b6e2fb941ce4b347463ce59778f1872 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 22 Oct 2021 10:08:44 +0800 Subject: [PATCH 205/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0SetPMSADShare?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 2fc5c70..0a84b09 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -37,13 +37,17 @@ #define MF_MARTY_PRC (3) #define MF_MARTY_SHD (4) -#define PAF_NO_ALLOC (0) #define PAF_ALLOC (1) +#define PAF_NO_ALLOC (0) +#define PAF_SHARED (1) #define PAF_NO_SHARED (0) +#define PAF_SWAP (1) #define PAF_NO_SWAP (0) +#define PAF_CACHE (1) #define PAF_NO_CACHE (0) #define PAF_KMPOOL (1) #define PAF_NO_KMPOOL (0) +#define PAF_LOCK (1) #define PAF_NO_LOCK (0) #define PAF_RV2_VAL (0) #define PAF_INIT_PADRS (0) @@ -453,6 +457,13 @@ KLINE void ClearPMSADAlloc(PMSAD* msad) return; } +KLINE void SetPMSADShare(PMSAD* msad) +{ + IF_NULL_DEAD(msad); + msad->PhyAddr.SharedBit = PAF_SHARED; + return; +} + KLINE void SetPMSADKMPool(PMSAD* msad) { IF_NULL_DEAD(msad); From cb8216dbf5a9372008ae6a5a5f4bfc4b44187fdb Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 22 Oct 2021 10:10:20 +0800 Subject: [PATCH 206/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ClearPMSADShare?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 0a84b09..a1f0c54 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -464,6 +464,13 @@ KLINE void SetPMSADShare(PMSAD* msad) return; } +KLINE void ClearPMSADShare(PMSAD* msad) +{ + IF_NULL_DEAD(msad); + msad->PhyAddr.SharedBit = PAF_NO_SHARED; + return; +} + KLINE void SetPMSADKMPool(PMSAD* msad) { IF_NULL_DEAD(msad); From c0c533c84458f53b3847ec7a2ed53e1c8e28dcc2 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 22 Oct 2021 10:12:42 +0800 Subject: [PATCH 207/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0PMSADIsShare=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index a1f0c54..a469f2c 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -471,6 +471,16 @@ KLINE void ClearPMSADShare(PMSAD* msad) return; } +KLINE Bool PMSADIsShare(PMSAD* msad) +{ + IF_NULL_RETURN_FALSE(msad); + if(PAF_SHARED == msad->PhyAddr.SharedBit) + { + return TRUE; + } + return FALSE; +} + KLINE void SetPMSADKMPool(PMSAD* msad) { IF_NULL_DEAD(msad); From 72c60d4af2238159e6d2faf48bd2111194b63483 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 22 Oct 2021 10:14:31 +0800 Subject: [PATCH 208/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0SetPMSADSwap=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index a469f2c..6586ed5 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -481,6 +481,13 @@ KLINE Bool PMSADIsShare(PMSAD* msad) return FALSE; } +KLINE void SetPMSADSwap(PMSAD* msad) +{ + IF_NULL_DEAD(msad); + msad->PhyAddr.SwapBit = PAF_SWAP; + return; +} + KLINE void SetPMSADKMPool(PMSAD* msad) { IF_NULL_DEAD(msad); From f5453583874ce9fd05348fbde0d61f800fa3f04a Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 22 Oct 2021 10:15:44 +0800 Subject: [PATCH 209/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ClearPMSADSwap?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 6586ed5..46ceca1 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -488,6 +488,13 @@ KLINE void SetPMSADSwap(PMSAD* msad) return; } +KLINE void ClearPMSADSwap(PMSAD* msad) +{ + IF_NULL_DEAD(msad); + msad->PhyAddr.SwapBit = PAF_NO_SWAP; + return; +} + KLINE void SetPMSADKMPool(PMSAD* msad) { IF_NULL_DEAD(msad); From 0b6298c222d2de565d50bba936c2358de3293877 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 22 Oct 2021 10:17:41 +0800 Subject: [PATCH 210/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0PMSADIsSwap=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 46ceca1..eb7cd15 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -495,6 +495,16 @@ KLINE void ClearPMSADSwap(PMSAD* msad) return; } +KLINE Bool PMSADIsSwap(PMSAD* msad) +{ + IF_NULL_RETURN_FALSE(msad); + if(PAF_SWAP == msad->PhyAddr.SwapBit) + { + return TRUE; + } + return FALSE; +} + KLINE void SetPMSADKMPool(PMSAD* msad) { IF_NULL_DEAD(msad); From 486d0326e40eb293897c80ce10cfa6aaffb7af72 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 22 Oct 2021 10:33:39 +0800 Subject: [PATCH 211/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0SetPMSADCache?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index eb7cd15..59dc31e 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -505,6 +505,13 @@ KLINE Bool PMSADIsSwap(PMSAD* msad) return FALSE; } +KLINE void SetPMSADCache(PMSAD* msad) +{ + IF_NULL_DEAD(msad); + msad->PhyAddr.CacheBit = PAF_CACHE; + return; +} + KLINE void SetPMSADKMPool(PMSAD* msad) { IF_NULL_DEAD(msad); From f4655567a4a6f3e017920d4e6b02d168eae2e21e Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 22 Oct 2021 10:34:19 +0800 Subject: [PATCH 212/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ClearPMSADCache?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 59dc31e..d159433 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -512,6 +512,13 @@ KLINE void SetPMSADCache(PMSAD* msad) return; } +KLINE void ClearPMSADCache(PMSAD* msad) +{ + IF_NULL_DEAD(msad); + msad->PhyAddr.CacheBit = PAF_NO_CACHE; + return; +} + KLINE void SetPMSADKMPool(PMSAD* msad) { IF_NULL_DEAD(msad); From 8ff12944616e7b4751ce1d25acb6033951e5ab8a Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 22 Oct 2021 10:34:51 +0800 Subject: [PATCH 213/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0PMSADIsCache=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index d159433..89ccd0d 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -519,6 +519,16 @@ KLINE void ClearPMSADCache(PMSAD* msad) return; } +KLINE Bool PMSADIsCache(PMSAD* msad) +{ + IF_NULL_RETURN_FALSE(msad); + if(PAF_CACHE == msad->PhyAddr.CacheBit) + { + return TRUE; + } + return FALSE; +} + KLINE void SetPMSADKMPool(PMSAD* msad) { IF_NULL_DEAD(msad); From 8e293eaa52c41a9451578a961effe9d6537ad03a Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 22 Oct 2021 10:38:02 +0800 Subject: [PATCH 214/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0SetPMSADLock=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 89ccd0d..1fe67f0 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -529,6 +529,13 @@ KLINE Bool PMSADIsCache(PMSAD* msad) return FALSE; } +KLINE void SetPMSADLock(PMSAD* msad) +{ + IF_NULL_DEAD(msad); + msad->PhyAddr.LockBit = PAF_LOCK; + return; +} + KLINE void SetPMSADKMPool(PMSAD* msad) { IF_NULL_DEAD(msad); From 488a47eb4b8f5f4a8b3b741c039943b065fa0d7e Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 22 Oct 2021 10:38:46 +0800 Subject: [PATCH 215/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ClearPMSADLock?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 1fe67f0..5f3d4aa 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -536,6 +536,13 @@ KLINE void SetPMSADLock(PMSAD* msad) return; } +KLINE void ClearPMSADLock(PMSAD* msad) +{ + IF_NULL_DEAD(msad); + msad->PhyAddr.LockBit = PAF_NO_LOCK; + return; +} + KLINE void SetPMSADKMPool(PMSAD* msad) { IF_NULL_DEAD(msad); From 133da78468f0c34e9295233893be6a496c9491a9 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 22 Oct 2021 10:39:20 +0800 Subject: [PATCH 216/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0PMSADIsLock=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 5f3d4aa..35a8dba 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -543,6 +543,16 @@ KLINE void ClearPMSADLock(PMSAD* msad) return; } +KLINE Bool PMSADIsLock(PMSAD* msad) +{ + IF_NULL_RETURN_FALSE(msad); + if(PAF_LOCK == msad->PhyAddr.LockBit) + { + return TRUE; + } + return FALSE; +} + KLINE void SetPMSADKMPool(PMSAD* msad) { IF_NULL_DEAD(msad); From 5b6cf8be5dd7ed34e1531f57fc25587e63096f7c Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 22 Oct 2021 11:32:51 +0800 Subject: [PATCH 217/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmClearPMSADUseSta?= =?UTF-8?q?tus=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 1 + Kernel/Memory/KrlMmManage.c | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 35a8dba..3b769dc 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -753,6 +753,7 @@ private UInt ScanSameAreaTypePMSADs(MNode* node, MArea* area, PMSAD* start, PMSA private UInt PMSADBlockInitOnPMSADDire(MNode* node, MArea* area, PMSADDire* dire); private Bool OneMAreaInitOnMNode(MNode* node, MArea* area); private Bool MAreaInitOnMNode(MNode* node); +public Bool KrlMmClearPMSADUseStatus(PMSAD* msad); public MNode* KrlMmGetMNode(UInt nodeid); public MArea* KrlMmGetMArea(MNode* node, UInt areaid); public Bool KrlMmMAreaInit(); diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index 33b69b0..593e502 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -783,6 +783,17 @@ private Bool MAreaInitOnMNode(MNode* node) return TRUE; } +public Bool KrlMmClearPMSADUseStatus(PMSAD* msad) +{ + IF_NULL_RETURN_FALSE(msad); + ClearPMSADAlloc(msad); + ClearPMSADShare(msad); + ClearPMSADSwap(msad); + ClearPMSADLock(msad); + ClearPMSADKMPool(msad); + return TRUE; +} + public MNode* KrlMmGetMNode(UInt nodeid) { GMemManage* gmm = NULL; From 5560acede99baf5afcfa70bd71d8e3bd78eeb97c Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 22 Oct 2021 11:42:52 +0800 Subject: [PATCH 218/221] =?UTF-8?q?=E4=BF=AE=E6=AD=A3OperationBeforeFreePM?= =?UTF-8?q?SADs=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Kernel/Memory/KrlMmAlloc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Kernel/Memory/KrlMmAlloc.c b/Kernel/Memory/KrlMmAlloc.c index d09d995..3cf2035 100644 --- a/Kernel/Memory/KrlMmAlloc.c +++ b/Kernel/Memory/KrlMmAlloc.c @@ -343,7 +343,7 @@ private UInt OperationBeforeFreePMSADs(PABHList* abhlist, PMSAD* start, PMSAD* e return 1; } - ClearPMSADAlloc(start); + KrlMmClearPMSADUseStatus(start); SetPMSADOLType(start, MF_OLKTY_BAFH); SetPMSADBlockLink(start, (void*)abhlist); return 2; @@ -356,8 +356,8 @@ private UInt OperationBeforeFreePMSADs(PABHList* abhlist, PMSAD* start, PMSAD* e return 1; } - ClearPMSADAlloc(start); - ClearPMSADAlloc(end); + KrlMmClearPMSADUseStatus(start); + KrlMmClearPMSADUseStatus(end); SetPMSADOLType(start, MF_OLKTY_ODER); SetPMSADBlockLink(start, (void*)end); @@ -455,7 +455,7 @@ private UInt FindContinuousPMSADsBlock(PABHList* abhlist, PMSAD** msadstart, PMS if(2 == rets) { - if(ClearPMSADTowBlockFlags(abhlist + 1, start,end, blkms, blkme) == TRUE) + if(ClearPMSADTowBlockFlags(abhlist + 1, start, end, blkms, blkme) == TRUE) { *msadstart = start; *msadend = blkme; From 6b83b91474a75b35a19a69a2cdd83a1e97b96ccd Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 22 Oct 2021 14:24:08 +0800 Subject: [PATCH 219/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0KrlMmGetPMSADOnVaddr?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmManage.h | 1 + Kernel/Memory/KrlMmManage.c | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/Include/KernelInc/MemoryInc/KrlMmManage.h b/Include/KernelInc/MemoryInc/KrlMmManage.h index 3b769dc..2d32914 100644 --- a/Include/KernelInc/MemoryInc/KrlMmManage.h +++ b/Include/KernelInc/MemoryInc/KrlMmManage.h @@ -754,6 +754,7 @@ private UInt PMSADBlockInitOnPMSADDire(MNode* node, MArea* area, PMSADDire* dire private Bool OneMAreaInitOnMNode(MNode* node, MArea* area); private Bool MAreaInitOnMNode(MNode* node); public Bool KrlMmClearPMSADUseStatus(PMSAD* msad); +public PMSAD* KrlMmGetPMSADOnVaddr(Addr vaddr); public MNode* KrlMmGetMNode(UInt nodeid); public MArea* KrlMmGetMArea(MNode* node, UInt areaid); public Bool KrlMmMAreaInit(); diff --git a/Kernel/Memory/KrlMmManage.c b/Kernel/Memory/KrlMmManage.c index 593e502..f073ec3 100644 --- a/Kernel/Memory/KrlMmManage.c +++ b/Kernel/Memory/KrlMmManage.c @@ -794,6 +794,18 @@ public Bool KrlMmClearPMSADUseStatus(PMSAD* msad) return TRUE; } +public PMSAD* KrlMmGetPMSADOnVaddr(Addr vaddr) +{ + Addr paddr = NULL; + if((vaddr & (MSAD_SIZE - 1)) != 0) + { + return NULL; + } + paddr = HalVAddrToPAddr(vaddr); + IF_NULL_RETURN_NULL(paddr); + return PHYAddrRetPMSAD((U64)paddr); +} + public MNode* KrlMmGetMNode(UInt nodeid) { GMemManage* gmm = NULL; From c6e33f9f7358f00ce51842ee2437293e70793102 Mon Sep 17 00:00:00 2001 From: LMOS <609379965@qq.com> Date: Fri, 22 Oct 2021 16:25:30 +0800 Subject: [PATCH 220/221] =?UTF-8?q?=E5=A2=9E=E5=8A=A0DelPMSADsOnKPMSADsPoo?= =?UTF-8?q?l=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Include/KernelInc/MemoryInc/KrlMmPool.h | 3 +- Kernel/Memory/KrlMmPool.c | 79 +++++++++++++++++++------ 2 files changed, 62 insertions(+), 20 deletions(-) diff --git a/Include/KernelInc/MemoryInc/KrlMmPool.h b/Include/KernelInc/MemoryInc/KrlMmPool.h index 17c0e64..c3d9f06 100644 --- a/Include/KernelInc/MemoryInc/KrlMmPool.h +++ b/Include/KernelInc/MemoryInc/KrlMmPool.h @@ -102,7 +102,8 @@ private void* KrlMmNewPOEntitiesRealizeCore(GMemPoolManage* gmpm, Size size); private void* KrlMmNewPMSADsRealize(Size size); private void* KrlMmNewPOEntitiesRealize(Size size); private Bool DelPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, void* addr); -private Bool KrlMmDelPMSADsRealizeCore(GMemPoolManage* gmpm, void* addr); +private Bool DelPMSADsOnKPMSADsPool(KPMSADsPool* pool, PMLHead* head, PMSAD* msad); +private Bool KrlMmDelPMSADsRealizeCore(GMemPoolManage* gmpm, PMSAD* msad, void* addr); private Bool KrlMmDelPOEntitiesRealizeCore(GMemPoolManage* gmpm, void* addr); private Bool KrlMmDelPOEntitiesRealize(void* addr); private UInt CreateNewKMemPoolInit(KMemPool* pool, PMSAD* msad, UInt msadnr, Addr start, Addr end, Size size); diff --git a/Kernel/Memory/KrlMmPool.c b/Kernel/Memory/KrlMmPool.c index da0cbde..a9310c3 100644 --- a/Kernel/Memory/KrlMmPool.c +++ b/Kernel/Memory/KrlMmPool.c @@ -262,7 +262,7 @@ private Bool ExtendKMemPoolCapacity(GMemPoolManage* gmpm, KMemPool* pool) start = PMSADRetVAddr(msad); end = start + (Addr)(KrlMmGetPMSADsSize(msad) - 1); SetPMSADKMPool(msad); - + nr = POEntitiesArrInitOnMemSPace(pool, start, end); if(1 > nr) { @@ -379,24 +379,52 @@ private Bool DelPOEntitiesOnKMemPool(GMemPoolManage* gmpm, KMemPool* pool, void* return rets; } -private Bool KrlMmDelPMSADsRealizeCore(GMemPoolManage* gmpm, void* addr) +private Bool DelPMSADsOnKPMSADsPool(KPMSADsPool* pool, PMLHead* head, PMSAD* msad) { Bool rets = FALSE; - PMSAD* msad = NULL; - IF_NULL_RETURN_FALSE(gmpm); + List* lists = NULL; + PMSAD* tmpmsad = NULL; - msad = ForAddrDelAndRetPMSADOnKPMSADsPool(&gmpm->PMSADsPool, addr); + IF_NULL_RETURN_FALSE(pool); + IF_NULL_RETURN_FALSE(head); IF_NULL_RETURN_FALSE(msad); - IF_NEQ_DEAD(addr, (void*)PMSADRetVAddr(msad), "addr is not EQ PMSAD Addr\n"); - rets = KrlMmFreeKernPMSADs(msad); - IF_NEQ_DEAD(TRUE, rets, "KrlMmFreeKernPMSADs Called Fail\n"); - KrlMmLocked(&gmpm->PMSADsPool.Lock); - if(gmpm->PMSADsPool.PmsadsNR > 0) + KrlMmLocked(&pool->Lock); + ListForEach(lists, &head->Lists) { - gmpm->PMSADsPool.PmsadsNR--; + tmpmsad = ListEntry(lists, PMSAD, Lists); + if(tmpmsad == msad) + { + ListDel(&msad->Lists); + head->PmsadNR--; + rets = KrlMmFreeKernPMSADs(msad); + IF_NEQ_DEAD(TRUE, rets, "KrlMmFreeKernPMSADs Called Fail\n"); + if(pool->PmsadsNR > 0) + { + pool->PmsadsNR--; + } + KrlMmUnLock(&pool->Lock); + return rets; + } } - KrlMmUnLock(&gmpm->PMSADsPool.Lock); - return rets; + KrlMmUnLock(&pool->Lock); + return FALSE; +} + +private Bool KrlMmDelPMSADsRealizeCore(GMemPoolManage* gmpm, PMSAD* msad, void* addr) +{ + Bool rets = FALSE; + UInt msadnr = 0; + PMLHead* head = NULL; + IF_NULL_RETURN_FALSE(gmpm); + IF_NULL_RETURN_FALSE(msad); + + msadnr = (UInt)KrlMmGetPMSADsLen(msad); + IF_ZERO_RETURN_FALSE(msadnr); + IF_NEQ_RETURN(FALSE, PMSADIsKMPool(msad), FALSE); + IF_NEQ_DEAD(addr, (void*)PMSADRetVAddr(msad), "addr is not EQ PMSAD Addr\n"); + head = ForMsadNrRetPMLHeadOnGMemPoolManage(gmpm, msadnr); + IF_NULL_RETURN_FALSE(head); + return DelPMSADsOnKPMSADsPool(&gmpm->PMSADsPool, head, msad); } private Bool KrlMmDelPOEntitiesRealizeCore(GMemPoolManage* gmpm, void* addr) @@ -418,18 +446,31 @@ private Bool KrlMmDelPOEntitiesRealize(void* addr) { Bool rets = FALSE; GMemPoolManage* gmpm = NULL; - + PMSAD* msad = NULL; + gmpm = KrlMmGetGMemPoolAddr(); IF_NULL_RETURN_FALSE(gmpm); KrlMmLocked(&gmpm->Lock); - rets = KrlMmDelPOEntitiesRealizeCore(gmpm, addr); - if(TRUE == rets) + + msad = KrlMmGetPMSADOnVaddr((Addr)addr); + if(msad != NULL) { - KrlMmUnLock(&gmpm->Lock); - return rets; + if(PMSADIsKMPool(msad) != TRUE) + { + rets = KrlMmDelPMSADsRealizeCore(gmpm, msad, addr); + KrlMmUnLock(&gmpm->Lock); + return rets; + } + else + { + rets = KrlMmDelPOEntitiesRealizeCore(gmpm, addr); + KrlMmUnLock(&gmpm->Lock); + return rets; + } } - rets = KrlMmDelPMSADsRealizeCore(gmpm, addr); + + rets = KrlMmDelPOEntitiesRealizeCore(gmpm, addr); KrlMmUnLock(&gmpm->Lock); return rets; } From 6bca4b67ac5132f5d33f582fc0740602f499fd7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=87=AA=E5=BA=A6=E5=90=9B?= Date: Sun, 22 May 2022 21:18:17 +0800 Subject: [PATCH 221/221] Added Untitled Diagram.drawio --- Docs/Untitled Diagram.drawio | 1 + 1 file changed, 1 insertion(+) create mode 100644 Docs/Untitled Diagram.drawio diff --git a/Docs/Untitled Diagram.drawio b/Docs/Untitled Diagram.drawio new file mode 100644 index 0000000..6b6159c --- /dev/null +++ b/Docs/Untitled Diagram.drawio @@ -0,0 +1 @@ +UzV2zq1wL0osyPDNT0nNUTV2VTV2LsrPL4GwciucU3NyVI0MMlNUjV1UjYwMgFjVyA2HrCFY1qAgsSg1rwSLBiADYTaQg2Y1AA== \ No newline at end of file