summaryrefslogtreecommitdiffstatsabout
diff options
context:
space:
mode:
authorHanhui <hanhui@acoinfo.com>2021-08-26 12:32:07 (GMT)
committer Hanhui <hanhui@acoinfo.com>2021-08-26 12:32:07 (GMT)
commit667b7bb90661740f62fd02a1c276bcd37894001b (patch)
treeda48b0396cd6001bd1aa6e20fb458f368d8998ae
parenta2e81d09d00a94cace505fab7f2e294ac698975a (diff)
downloadlibsylixos-667b7bb90661740f62fd02a1c276bcd37894001b.zip
libsylixos-667b7bb90661740f62fd02a1c276bcd37894001b.tar.gz
libsylixos-667b7bb90661740f62fd02a1c276bcd37894001b.tar.bz2
Fixed C-SKY libvpmpdm memcpy unaligned error and add T-HEAD c90x support.
-rw-r--r--SylixOS/arch/arm/mm/mmu/v4/armMmuV4.c42
-rw-r--r--SylixOS/arch/arm/mm/mmu/v7/armMmuV7.c67
-rw-r--r--SylixOS/arch/arm/mm/mmu/v7/armMmuV7Lpae.c55
-rw-r--r--SylixOS/arch/arm64/mm/mmu/arm64Mmu.h12
-rw-r--r--SylixOS/arch/arm64/mm/mmu/arm64Mmu16K.c1214
-rw-r--r--SylixOS/arch/arm64/mm/mmu/arm64Mmu4K.c10
-rw-r--r--SylixOS/arch/arm64/mm/mmu/arm64Mmu64K.c10
-rw-r--r--SylixOS/arch/mips/mm/mmu/mips64/mips64Mmu.c2
-rw-r--r--SylixOS/arch/riscv/mm/mmu/riscvSv39Mmu.c197
-rw-r--r--SylixOS/arch/riscv/riscv_support.h5
-rw-r--r--SylixOS/arch/x86/common/x64/x64AtomicAsm.S12
-rw-r--r--SylixOS/arch/x86/common/x64/x64Context.c4
-rw-r--r--SylixOS/arch/x86/common/x86Context.c2
-rw-r--r--SylixOS/arch/x86/common/x86Idt.c2
-rw-r--r--SylixOS/arch/x86/fpu/fpusse/x86FpuSse.c1
-rw-r--r--SylixOS/config/cpu/cpu_cfg_arm64.h1
-rw-r--r--SylixOS/config/cpu/cpu_cfg_mips.h4
-rw-r--r--SylixOS/fs/rootFs/rootFs.c39
-rw-r--r--SylixOS/include/arch/arm64/arch_mmu.h30
-rw-r--r--SylixOS/include/arch/x86/arch_regs32.h2
-rw-r--r--SylixOS/kernel/core/_TimeCvt.c2
-rw-r--r--SylixOS/kernel/interface/SemaphoreBPend.c8
-rw-r--r--SylixOS/kernel/interface/ThreadAttrBuild.c4
-rw-r--r--SylixOS/kernel/interface/ThreadDelete.c4
-rw-r--r--SylixOS/kernel/interface/ugid.c4
-rw-r--r--SylixOS/kernel/show/SemaphoreShow.c15
-rw-r--r--SylixOS/loader/src/loader.c2
-rw-r--r--SylixOS/loader/src/loader_symbol.c4
-rw-r--r--SylixOS/net/lwip/unix/af_unix.c2
-rw-r--r--SylixOS/system/device/sdcard/host/sdhci.h2
-rw-r--r--SylixOS/system/include/s_dirent.h4
-rw-r--r--SylixOS/vpmpdm/arch/csky/memcpy.S253
-rw-r--r--libsylixos.mk1
33 files changed, 1758 insertions, 258 deletions
diff --git a/SylixOS/arch/arm/mm/mmu/v4/armMmuV4.c b/SylixOS/arch/arm/mm/mmu/v4/armMmuV4.c
index 196a84e..8151019 100644
--- a/SylixOS/arch/arm/mm/mmu/v4/armMmuV4.c
+++ b/SylixOS/arch/arm/mm/mmu/v4/armMmuV4.c
@@ -178,7 +178,7 @@ static INT armMmuAttr2Flags (UINT8 ucAP, UINT8 ucDomain, UINT8 ucCB, ULONG *
return (ERROR_NONE);
}
/*********************************************************************************************************
-** 函数名称: armMmuBuildPgdesc
+** 函数名称: armMmuBuildPgdEntry
** 功能描述: 生成一个一级描述符 (PGD 描述符)
** 输 入 : uiBaseAddr 基地址 (段基地址、二级页表基地址)
** ucAP 访问权限
@@ -189,11 +189,11 @@ static INT armMmuAttr2Flags (UINT8 ucAP, UINT8 ucDomain, UINT8 ucCB, ULONG *
** 全局变量:
** 调用模块:
*********************************************************************************************************/
-static LW_PGD_TRANSENTRY armMmuBuildPgdesc (UINT32 uiBaseAddr,
- UINT8 ucAP,
- UINT8 ucDomain,
- UINT8 ucCB,
- UINT8 ucType)
+static LW_PGD_TRANSENTRY armMmuBuildPgdEntry (UINT32 uiBaseAddr,
+ UINT8 ucAP,
+ UINT8 ucDomain,
+ UINT8 ucCB,
+ UINT8 ucType)
{
LW_PGD_TRANSENTRY uiDescriptor;
@@ -227,7 +227,7 @@ static LW_PGD_TRANSENTRY armMmuBuildPgdesc (UINT32 uiBaseAddr,
return (uiDescriptor);
}
/*********************************************************************************************************
-** 函数名称: armMmuBuildPtentry
+** 函数名称: armMmuBuildPteEntry
** 功能描述: 生成一个二级描述符 (PTE 描述符)
** 输 入 : uiBaseAddr 基地址 (页地址)
** ucAP 访问权限
@@ -238,11 +238,11 @@ static LW_PGD_TRANSENTRY armMmuBuildPgdesc (UINT32 uiBaseAddr,
** 全局变量:
** 调用模块:
*********************************************************************************************************/
-static LW_PTE_TRANSENTRY armMmuBuildPtentry (UINT32 uiBaseAddr,
- UINT8 ucAP,
- UINT8 ucDomain,
- UINT8 ucCB,
- UINT8 ucType)
+static LW_PTE_TRANSENTRY armMmuBuildPteEntry (UINT32 uiBaseAddr,
+ UINT8 ucAP,
+ UINT8 ucDomain,
+ UINT8 ucCB,
+ UINT8 ucType)
{
LW_PTE_TRANSENTRY uiDescriptor;
@@ -532,11 +532,11 @@ static LW_PTE_TRANSENTRY *armMmuPteAlloc (PLW_MMU_CONTEXT pmmuctx,
lib_bzero(p_pteentry, PTE_BLOCK_SIZE);
- *p_pmdentry = (LW_PMD_TRANSENTRY)armMmuBuildPgdesc((UINT32)p_pteentry,
- AP_RW,
- ACCESS_AND_CHK,
- NC_NB,
- COARSE_TBASE); /* 设置二级页面基地址 */
+ *p_pmdentry = (LW_PMD_TRANSENTRY)armMmuBuildPgdEntry((UINT32)p_pteentry,
+ AP_RW,
+ ACCESS_AND_CHK,
+ NC_NB,
+ COARSE_TBASE); /* 设置二级页面基地址 */
#if LW_CFG_CACHE_EN > 0
iregInterLevel = KN_INT_DISABLE();
armDCacheFlush((PVOID)p_pmdentry, (PVOID)p_pmdentry, 32); /* 第三个参数无影响 */
@@ -664,8 +664,8 @@ static INT armMmuFlagSet (PLW_MMU_CONTEXT pmmuctx, addr_t ulAddr, ULONG ulFl
ulAddr);
if (armMmuPteIsOk(*p_pteentry)) {
addr_t ulPhysicalAddr = (addr_t)(*p_pteentry & 0xFFFFF000);
- *p_pteentry = armMmuBuildPtentry((UINT32)ulPhysicalAddr,
- ucAP, ucDomain, ucCB, ucType);
+ *p_pteentry = armMmuBuildPteEntry((UINT32)ulPhysicalAddr,
+ ucAP, ucDomain, ucCB, ucType);
#if LW_CFG_CACHE_EN > 0
armDCacheFlush((PVOID)p_pteentry, (PVOID)p_pteentry, 32); /* 第三个参数无影响 */
#endif /* LW_CFG_CACHE_EN > 0 */
@@ -710,8 +710,8 @@ static VOID armMmuMakeTrans (PLW_MMU_CONTEXT pmmuctx,
return;
}
- *p_pteentry = armMmuBuildPtentry((UINT32)paPhysicalAddr, ucAP,
- ucDomain, ucCB, ucType);
+ *p_pteentry = armMmuBuildPteEntry((UINT32)paPhysicalAddr, ucAP,
+ ucDomain, ucCB, ucType);
#if LW_CFG_CACHE_EN > 0
armDCacheFlush((PVOID)p_pteentry, (PVOID)p_pteentry, 32); /* 第三个参数无影响 */
diff --git a/SylixOS/arch/arm/mm/mmu/v7/armMmuV7.c b/SylixOS/arch/arm/mm/mmu/v7/armMmuV7.c
index c3f596a..db957ee 100644
--- a/SylixOS/arch/arm/mm/mmu/v7/armMmuV7.c
+++ b/SylixOS/arch/arm/mm/mmu/v7/armMmuV7.c
@@ -90,8 +90,11 @@ extern VOID armMmuV7SetTTBCR(UINT32 uiTTBCR);
** 功能描述: 根据 SylixOS 权限标志, 生成 ARM MMU 权限标志
** 输 入 : ulFlag 内存访问权限
** pucAP 访问权限
+** pucAP2 访问权限
** pucDomain 所属控制域
** pucCB CACHE 控制参数
+** pucTEX CACHE 控制参数
+** pucXN 可执行权限
** 输 出 : ERROR or OK
** 全局变量:
** 调用模块:
@@ -227,25 +230,28 @@ static INT armMmuAttr2Flags (UINT8 ucAP,
return (ERROR_NONE);
}
/*********************************************************************************************************
-** 函数名称: armMmuBuildPgdesc
+** 函数名称: armMmuBuildPgdEntry
** 功能描述: 生成一个一级描述符 (PGD 描述符)
** 输 入 : uiBaseAddr 基地址 (段基地址、二级页表基地址)
** ucAP 访问权限
+** ucAP2 访问权限
** ucDomain 域
** ucCB CACHE 和 WRITEBUFFER 控制
+** ucTEX CACHE 控制参数
+** ucXN 可执行权限
** ucType 一级描述符类型
** 输 出 : ERROR or OK
** 全局变量:
** 调用模块:
*********************************************************************************************************/
-static LW_PGD_TRANSENTRY armMmuBuildPgdesc (UINT32 uiBaseAddr,
- UINT8 ucAP,
- UINT8 ucAP2,
- UINT8 ucDomain,
- UINT8 ucCB,
- UINT8 ucTEX,
- UINT8 ucXN,
- UINT8 ucType)
+static LW_PGD_TRANSENTRY armMmuBuildPgdEntry (UINT32 uiBaseAddr,
+ UINT8 ucAP,
+ UINT8 ucAP2,
+ UINT8 ucDomain,
+ UINT8 ucCB,
+ UINT8 ucTEX,
+ UINT8 ucXN,
+ UINT8 ucType)
{
LW_PGD_TRANSENTRY uiDescriptor;
@@ -280,25 +286,28 @@ static LW_PGD_TRANSENTRY armMmuBuildPgdesc (UINT32 uiBaseAddr,
return (uiDescriptor);
}
/*********************************************************************************************************
-** 函数名称: armMmuBuildPtentry
+** 函数名称: armMmuBuildPteEntry
** 功能描述: 生成一个二级描述符 (PTE 描述符)
** 输 入 : uiBaseAddr 基地址 (页地址)
** ucAP 访问权限
+** ucAP2 访问权限
** ucDomain 域
** ucCB CACHE 和 WRITEBUFFER 控制
+** ucTEX CACHE 控制参数
+** ucXN 可执行权限
** ucType 二级描述符类型
** 输 出 : ERROR or OK
** 全局变量:
** 调用模块:
*********************************************************************************************************/
-static LW_PTE_TRANSENTRY armMmuBuildPtentry (UINT32 uiBaseAddr,
- UINT8 ucAP,
- UINT8 ucAP2,
- UINT8 ucDomain,
- UINT8 ucCB,
- UINT8 ucTEX,
- UINT8 ucXN,
- UINT8 ucType)
+static LW_PTE_TRANSENTRY armMmuBuildPteEntry (UINT32 uiBaseAddr,
+ UINT8 ucAP,
+ UINT8 ucAP2,
+ UINT8 ucDomain,
+ UINT8 ucCB,
+ UINT8 ucTEX,
+ UINT8 ucXN,
+ UINT8 ucType)
{
LW_PTE_TRANSENTRY uiDescriptor;
@@ -591,12 +600,12 @@ static LW_PTE_TRANSENTRY *armMmuPteAlloc (PLW_MMU_CONTEXT pmmuctx,
&ucCB, &ucTEX,
&ucXN);
- *p_pmdentry = (LW_PMD_TRANSENTRY)armMmuBuildPgdesc((UINT32)p_pteentry,
- ucAP, ucAP2,
- ucDomain,
- ucCB, ucTEX,
- ucXN,
- COARSE_TBASE); /* 设置二级页面基地址 */
+ *p_pmdentry = (LW_PMD_TRANSENTRY)armMmuBuildPgdEntry((UINT32)p_pteentry,
+ ucAP, ucAP2,
+ ucDomain,
+ ucCB, ucTEX,
+ ucXN,
+ COARSE_TBASE); /* 设置二级页面基地址 */
#if LW_CFG_CACHE_EN > 0
iregInterLevel = KN_INT_DISABLE();
armDCacheFlush((PVOID)p_pmdentry, (PVOID)p_pmdentry, 32); /* 第三个参数无影响 */
@@ -742,8 +751,8 @@ static INT armMmuFlagSet (PLW_MMU_CONTEXT pmmuctx, addr_t ulAddr, ULONG ulFl
ulAddr);
if (armMmuPteIsOk(*p_pteentry)) {
addr_t ulPhysicalAddr = (addr_t)(*p_pteentry & 0xFFFFF000);
- *p_pteentry = armMmuBuildPtentry((UINT32)ulPhysicalAddr, ucAP, ucAP2,
- ucDomain, ucCB, ucTEX, ucXN, ucType);
+ *p_pteentry = armMmuBuildPteEntry((UINT32)ulPhysicalAddr, ucAP, ucAP2,
+ ucDomain, ucCB, ucTEX, ucXN, ucType);
#if LW_CFG_CACHE_EN > 0
armDCacheFlush((PVOID)p_pteentry, (PVOID)p_pteentry, 32); /* 第三个参数无影响 */
#endif /* LW_CFG_CACHE_EN > 0 */
@@ -794,9 +803,9 @@ static VOID armMmuMakeTrans (PLW_MMU_CONTEXT pmmuctx,
return;
}
- *p_pteentry = armMmuBuildPtentry((UINT32)paPhysicalAddr,
- ucAP, ucAP2, ucDomain,
- ucCB, ucTEX, ucXN, ucType);
+ *p_pteentry = armMmuBuildPteEntry((UINT32)paPhysicalAddr,
+ ucAP, ucAP2, ucDomain,
+ ucCB, ucTEX, ucXN, ucType);
#if LW_CFG_CACHE_EN > 0
armDCacheFlush((PVOID)p_pteentry, (PVOID)p_pteentry, 32); /* 第三个参数无影响 */
diff --git a/SylixOS/arch/arm/mm/mmu/v7/armMmuV7Lpae.c b/SylixOS/arch/arm/mm/mmu/v7/armMmuV7Lpae.c
index ec2df67..6d8a3bf 100644
--- a/SylixOS/arch/arm/mm/mmu/v7/armMmuV7Lpae.c
+++ b/SylixOS/arch/arm/mm/mmu/v7/armMmuV7Lpae.c
@@ -114,9 +114,15 @@ extern VOID armMmuV7SetMAIR1(VOID);
** 函数名称: armMmuFlags2Attr
** 功能描述: 根据 SylixOS 权限标志, 生成 ARM MMU 权限标志
** 输 入 : ulFlag 内存访问权限
-** pucAP 访问权限
-** pucDomain 所属控制域
-** pucCB CACHE 控制参数
+** pucXN 可执行权限标志
+** pucPXN 特权可执行权限标志
+** pucCon Contiguous 标志
+** pucnG 非全局映射标志
+** pucAF 是否拥有访问权限标志
+** pucSH 共享权限标志
+** pucAP 是否可写权限标志
+** pucNS Non-Secure 标志
+** pucAIn Cache 和 Bufferable 权限标志
** 输 出 : ERROR or OK
** 全局变量:
** 调用模块:
@@ -173,13 +179,17 @@ static INT armMmuFlags2Attr (ULONG ulFlag,
/*********************************************************************************************************
** 函数名称: armMmuAttr2Flags
** 功能描述: 根据 ARM MMU 权限标志, 生成 SylixOS 权限标志
-** 输 入 : ucAP 访问权限
-** ucAP2 访问权限
-** ucDomain 所属控制域
-** ucCB CACHE 控制参数
-** ucTEX CACHE 控制参数
-** ucXN 可执行权限
-** pulFlag 内存访问权限
+** 输 入 : ucXN 可执行权限标志
+** ucAP2 访问权限
+** ucPXN 特权可执行权限标志
+** ucCon Contiguous 标志
+** ucnG 非全局映射标志
+** ucAF 是否拥有访问权限标志
+** ucSH 共享权限标志
+** ucAP 是否可写权限标志
+** ucNS Non-Secure 标志
+** ucAIn Cache 和 Bufferable 权限标志
+** pulFlag 内存访问权限
** 输 出 : ERROR or OK
** 全局变量:
** 调用模块:
@@ -231,11 +241,12 @@ static INT armMmuAttr2Flags (UINT8 ucXN,
** 函数名称: armMmuBuildPgdEntry
** 功能描述: 生成一个一级描述符 (PGD 描述符)
** 输 入 : ulBaseAddr 基地址 (段基地址、二级页表基地址)
+** ucNS 是否访问安全区域
** ucAP 访问权限
-** ucDomain 域
-** ucCB CACHE 和 WRITEBUFFER 控制
+** ucXN 可执行权限标志
+** ucPXN 特权可执行权限标志
** ucType 一级描述符类型
-** 输 出 : ERROR or OK
+** 输 出 : 一级描述符
** 全局变量:
** 调用模块:
*********************************************************************************************************/
@@ -301,11 +312,17 @@ static LW_PMD_TRANSENTRY armMmuBuildPmdEntry (addr_t ulBaseAddr,
** 函数名称: armMmuBuildPteEntry
** 功能描述: 生成一个三级描述符 (PTE 描述符)
** 输 入 : u64BaseAddr 基地址 (页地址)
-** ucAP 访问权限
-** ucDomain 域
-** ucCB CACHE 和 WRITEBUFFER 控制
+** ucXN 可执行权限标志
+** ucPXN 特权可执行权限标志
+** ucCon Contiguous 标志
+** ucnG 非全局映射标志
+** ucAF 访问标志
+** ucSH 共享权限标志
+** ucAP 访问权限标志
+** ucNS Non-Secure 标志
+** ucAIn Attribute Index
** ucType 三级描述符类型
-** 输 出 : ERROR or OK
+** 输 出 : 三级描述符
** 全局变量:
** 调用模块:
*********************************************************************************************************/
@@ -484,7 +501,7 @@ static LW_PMD_TRANSENTRY *armMmuPmdOffset (LW_PGD_TRANSENTRY *p_pgdentry, addr_
/*********************************************************************************************************
** 函数名称: armMmuPteOffset
** 功能描述: 通过虚拟地址计算 PTE 项
-** 输 入 : p_pgdentry pgd 入口地址
+** 输 入 : p_pmdentry pmd 入口地址
** ulAddr 虚拟地址
** 输 出 : 对应的 PTE 表项地址
** 全局变量:
@@ -976,7 +993,7 @@ VOID armMmuV7Init (LW_MMU_OP *pmmuop, CPCHAR pcMachineName)
pmmuop->MMUOP_pfuncPTEFree = armMmuPteFree;
pmmuop->MMUOP_pfuncPGDIsOk = armMmuPgdIsOk;
- pmmuop->MMUOP_pfuncPMDIsOk = armMmuPgdIsOk;
+ pmmuop->MMUOP_pfuncPMDIsOk = armMmuPmdIsOk;
pmmuop->MMUOP_pfuncPTEIsOk = armMmuPteIsOk;
pmmuop->MMUOP_pfuncPGDOffset = armMmuPgdOffset;
diff --git a/SylixOS/arch/arm64/mm/mmu/arm64Mmu.h b/SylixOS/arch/arm64/mm/mmu/arm64Mmu.h
index 2b41dbd..c5ea6b5 100644
--- a/SylixOS/arch/arm64/mm/mmu/arm64Mmu.h
+++ b/SylixOS/arch/arm64/mm/mmu/arm64Mmu.h
@@ -22,7 +22,19 @@
#ifndef __ARM64MMU_H
#define __ARM64MMU_H
+/*********************************************************************************************************
+ 页大小支持
+*********************************************************************************************************/
+
+#define ARM64_MMFR_TGRAN4_SHIFT 28
+#define ARM64_MMFR_TGRAN64_SHIFT 24
+#define ARM64_MMFR_TGRAN16_SHIFT 20
+#define ARM64_MMFR_TGRAN4_NSUPPORT 0xf
+#define ARM64_MMFR_TGRAN64_NSUPPORT 0xf
+#define ARM64_MMFR_TGRAN16_NSUPPORT 0x0
+
VOID arm64MmuInit(LW_MMU_OP *pmmuop, CPCHAR pcMachineName);
+ULONG arm64MmuGetMMFR(VOID);
ULONG arm64MmuAbtFaultAddr(VOID);
#endif /* __ARM64MMU_H */
diff --git a/SylixOS/arch/arm64/mm/mmu/arm64Mmu16K.c b/SylixOS/arch/arm64/mm/mmu/arm64Mmu16K.c
new file mode 100644
index 0000000..8234d7b
--- /dev/null
+++ b/SylixOS/arch/arm64/mm/mmu/arm64Mmu16K.c
@@ -0,0 +1,1214 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM)
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: arm64Mmu16K.c
+**
+** 创 建 人: Wang.Xuan (王翾)
+**
+** 文件创建日期: 2020 年 09 月 09 日
+**
+** 描 述: ARM64 体系构架 MMU 驱动 (16K 页大小).
+*********************************************************************************************************/
+#define __SYLIXOS_KERNEL
+#include "SylixOS.h"
+/*********************************************************************************************************
+ 裁剪支持
+*********************************************************************************************************/
+#if LW_CFG_VMM_EN > 0
+#if LW_CFG_ARM64_PAGE_SHIFT == 14
+#include "../../param/arm64Param.h"
+#include "../cache/arm64Cache.h"
+#include "arm64Mmu.h"
+/*********************************************************************************************************
+ 函数声明
+*********************************************************************************************************/
+extern VOID arm64MmuEnable(VOID);
+extern VOID arm64MmuDisable(VOID);
+extern VOID arm64MmuInvalidateTLB(VOID);
+extern VOID arm64MmuSetMAIR(VOID);
+extern VOID arm64MmuSetTCR(UINT64 ulTcr);
+extern UINT64 arm64MmuGetMAIR(VOID);
+extern VOID arm64MmuSetTTBR(PVOID pvAddr);
+extern VOID arm64MmuInvalidateTLBMVA(PVOID pvAddr);
+extern ULONG arm64MmuAbtFaultAddr(VOID);
+extern VOID arm64DCacheFlush(PVOID pvStart, PVOID pvEnd, UINT32 uiStep);
+/*********************************************************************************************************
+ PGD 中的位定义
+*********************************************************************************************************/
+#define ARM64_PGD_TYPE_MASK (0x3 << 0) /* PGD 中的类型掩码 */
+#define ARM64_PGD_TYPE_FAULT (0x0 << 0) /* PGD 类型无效 */
+#define ARM64_PGD_TYPE_TABLE (0x3 << 0) /* PGD 为 Table 类型 */
+#define ARM64_PGD_TYPE_BLOCK (0x1 << 0) /* PGD 为 Block 类型 */
+/*********************************************************************************************************
+ PMD 中的位定义
+*********************************************************************************************************/
+#define ARM64_PMD_TYPE_MASK (0x3 << 0) /* PMD 中的类型掩码 */
+#define ARM64_PMD_TYPE_FAULT (0x0 << 0) /* PMD 类型无效 */
+#define ARM64_PMD_TYPE_TABLE (0x3 << 0) /* PMD 为 Table 类型 */
+#define ARM64_PMD_TYPE_BLOCK (0x1 << 0) /* PMD 为 Block 类型 */
+/*********************************************************************************************************
+ PTS 中的位定义
+*********************************************************************************************************/
+#define ARM64_PTS_TYPE_MASK (0x3 << 0) /* PTS 中的类型掩码 */
+#define ARM64_PTS_TYPE_FAULT (0x0 << 0) /* PTS 类型无效 */
+#define ARM64_PTS_TYPE_TABLE (0x3 << 0) /* PTS 为 Table 类型 */
+#define ARM64_PTS_TYPE_BLOCK (0x1 << 0) /* PTS 为 Block 类型 */
+/*********************************************************************************************************
+ PTE 中的位定义
+*********************************************************************************************************/
+#define ARM64_PTE_TYPE_MASK (0x3 << 0) /* PTE 中的类型掩码 */
+#define ARM64_PTE_TYPE_FAULT (0x0 << 0) /* PTE 类型无效 */
+#define ARM64_PTE_TYPE_PAGE (0x3 << 0) /* PTE 类型为 PAGE */
+/*********************************************************************************************************
+ PGD、PMD、PTS、PTE中的属性定义
+
+ PGD、PMD、PTS 格式,[58:55] Reserved for software use
+ 63 62 61 60 59 58 55
+ +---------+--------------+-----------+----------+---------+
+ | NSTable | APTable | XNTable | PXNTable | Check |
+ +---------+--------------+-----------+----------+---------+
+*********************************************************************************************************/
+#define ARM64_MMU_NS_SHIFT (63) /* PGD、PMD、PTS 中的 Secure & */
+#define ARM64_MMU_NS_MASK (1UL << ARM64_MMU_NS_SHIFT) /* Non-Secure 标志 */
+#define ARM64_MMU_AP_SHIFT (61) /* PGD、PMD、PTS 中的 Access */
+#define ARM64_MMU_AP_MASK (3UL << ARM64_MMU_AP_SHIFT) /* permissions 标志 */
+#define ARM64_MMU_XN_SHIFT (60)
+#define ARM64_MMU_XN_MASK (1UL << ARM64_MMU_XN_SHIFT) /* PGD、PMD、PTS 中的 XN */
+#define ARM64_MMU_PXN_SHIFT (59)
+#define ARM64_MMU_PXN_MASK (1UL << ARM64_MMU_PXN_SHIFT) /* PGD、PMD、PTS 中的 PXN */
+
+#define ARM64_PTE_GUARD_SHIFT (55)
+#define ARM64_PTE_GUARD_MASK (1UL << ARM64_PTE_GUARD_SHIFT) /* 用于记录 GUARD 标志 */
+#define ARM64_PTE_UXN_SHIFT (54)
+#define ARM64_PTE_UXN_MASK (1UL << ARM64_PTE_UXN_SHIFT) /* User XN */
+#define ARM64_PTE_PXN_SHIFT (53)
+#define ARM64_PTE_PXN_MASK (1UL << ARM64_PTE_PXN_SHIFT) /* Privileged XN */
+#define ARM64_PTE_CONT_SHIFT (52)
+#define ARM64_PTE_CONT_MASK (1UL << ARM64_PTE_CONT_SHIFT) /* Contiguous range */
+#define ARM64_PTE_NG_SHIFT (11)
+#define ARM64_PTE_NG_MASK (1UL << ARM64_PTE_NG_SHIFT) /* PTE 中的 nG 标志 */
+#define ARM64_PTE_AF_SHIFT (10)
+#define ARM64_PTE_AF_MASK (1UL << ARM64_PTE_AF_SHIFT) /* PTE 中的访问标志 */
+#define ARM64_PTE_SH_SHIFT (8)
+#define ARM64_PTE_SH_MASK (3UL << ARM64_PTE_SH_SHIFT) /* PTE 中的共享权限掩码 */
+#define ARM64_PTE_AP_SHIFT (6)
+#define ARM64_PTE_AP_MASK (3UL << ARM64_PTE_AP_SHIFT) /* PTE 中的访问权限掩码 */
+#define ARM64_PTE_NS_SHIFT (5)
+#define ARM64_PTE_NS_MASK (1UL << ARM64_PTE_NS_SHIFT) /* PTE 中的 Non-Secure */
+#define ARM64_PTE_AIN_SHIFT (2)
+#define ARM64_PTE_AIN_MASK (7UL << ARM64_PTE_AIN_SHIFT) /* PTE 中的 AttrIndex */
+
+#define ARM64_MMU_NS_SECURE (0)
+#define ARM64_MMU_NS_NONSECURE (1)
+#define ARM64_MMU_AP_NO_EFFECT (0)
+#define ARM64_MMU_XN_NO_EFFECT (0)
+#define ARM64_MMU_PXN_NO_EFFECT (0)
+/*********************************************************************************************************
+ PGD PMD PTS PTE 中的掩码
+*********************************************************************************************************/
+#define ARM64_MMU_ADDR_MASK (0xffffffffc000ul) /* [47:14] */
+/*********************************************************************************************************
+ 2 个检查权限定义
+*********************************************************************************************************/
+#define GUARDED_CHK 0 /* 做详细权限检查 */
+#define GUARDED_NOT_CHK 1 /* 不做详细权限检查 */
+/*********************************************************************************************************
+ 全局定义
+*********************************************************************************************************/
+#define NON_SHAREABLE 0x0
+#define OUTER_SHAREABLE 0x2
+#define INNER_SHAREABLE 0x3
+#define VMSA_S _G_uiVMSAShare /* 共享位值 */
+/*********************************************************************************************************
+ 全局变量
+*********************************************************************************************************/
+static LW_OBJECT_HANDLE _G_hPGDPartition; /* 系统目前仅使用一个 PGD */
+static LW_OBJECT_HANDLE _G_hPMDPartition; /* PMD 缓冲区 */
+static LW_OBJECT_HANDLE _G_hPTSPartition; /* PTS 缓冲区 */
+static LW_OBJECT_HANDLE _G_hPTEPartition; /* PTE 缓冲区 */
+static UINT _G_uiVMSAShare = INNER_SHAREABLE; /* 共享位值 */
+/*********************************************************************************************************
+** 函数名称: arm64MmuFlags2Attr
+** 功能描述: 根据 SylixOS 权限标志, 生成 ARM64 MMU 权限标志
+** 输 入 : ulFlag 内存访问权限
+** pucGuard 进行严格的权限检查
+** pucXN 可执行权限标志
+** pucPXN 特权可执行权限标志
+** pucCon Contiguous 标志
+** pucnG nG 标志
+** pucAF 是否拥有访问权限标志
+** pucSH 共享权限标志
+** pucAP 是否可写权限标志
+** pucNS Non-Secure 标志
+** pucAIn Cache 和 Bufferable 权限标志
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static INT arm64MmuFlags2Attr (ULONG ulFlag,
+ UINT8 *pucGuard,
+ UINT8 *pucXN,
+ UINT8 *pucPXN,
+ UINT8 *pucCon,
+ UINT8 *pucnG,
+ UINT8 *pucAF,
+ UINT8 *pucSH,
+ UINT8 *pucAP,
+ UINT8 *pucNS,
+ UINT8 *pucAIn)
+{
+ if (!(ulFlag & LW_VMM_FLAG_VALID)) { /* 无效的映射关系 */
+ return (PX_ERROR);
+ }
+
+ if (ulFlag & LW_VMM_FLAG_ACCESS) { /* 是否拥有访问权限 */
+ if (ulFlag & LW_VMM_FLAG_GUARDED) {
+ *pucGuard = GUARDED_CHK;
+ } else {
+ *pucGuard = GUARDED_NOT_CHK;
+ }
+ *pucAF = 1;
+ } else {
+ *pucAF = 0; /* 访问失效 */
+ }
+
+ if (ulFlag & LW_VMM_FLAG_WRITABLE) { /* 是否可写 */
+ *pucAP = 0x0; /* 可写 */
+ } else {
+ *pucAP = 0x2;
+ }
+
+ if (ulFlag & LW_VMM_FLAG_CACHEABLE) { /* CACHE && BUFFER WRITE BACK */
+ *pucAIn = 5;
+ } else if (ulFlag & LW_VMM_FLAG_WRITETHROUGH) { /* CACHE && BUFFER WRITE THROUGH*/
+ *pucAIn = 6;
+ } else {
+ *pucAIn = 0; /* UNCACHE && UNBUFFER */
+ }
+
+ if (ulFlag & LW_VMM_FLAG_EXECABLE) {
+ *pucXN = 0x0;
+ *pucPXN = 0x0;
+ } else {
+ *pucXN = 0x1;
+ *pucPXN = 0x1;
+ }
+
+ *pucSH = VMSA_S;
+ *pucNS = 0x0;
+ *pucCon = 0x0;
+ *pucnG = 0x0;
+
+ return (ERROR_NONE);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuAttr2Flags
+** 功能描述: 根据 ARM64 MMU 权限标志, 生成 SylixOS 权限标志
+** 输 入 : ucGuard 严格的权限检查
+** ucXN 可执行权限标志
+** ucPXN 特权可执行权限标志
+** ucCon Contiguous 标志
+** ucnG nG 标志
+** ucAF 是否拥有访问权限标志
+** ucSH 共享权限标志
+** ucAP 是否可写权限标志
+** ucNS Non-Secure 标志
+** ucAIn Cache 和 Bufferable 权限标志
+** pulFlag 内存访问权限
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static INT arm64MmuAttr2Flags (UINT8 ucGuard,
+ UINT8 ucXN,
+ UINT8 ucPXN,
+ UINT8 ucCon,
+ UINT8 ucnG,
+ UINT8 ucAF,
+ UINT8 ucSH,
+ UINT8 ucAP,
+ UINT8 ucNS,
+ UINT8 ucAIn,
+ ULONG *pulFlag)
+{
+ (VOID)ucPXN;
+
+ *pulFlag = LW_VMM_FLAG_VALID;
+
+ if (ucGuard == GUARDED_CHK) {
+ *pulFlag |= LW_VMM_FLAG_GUARDED;
+ }
+
+ if (ucAF == 1) {
+ *pulFlag |= LW_VMM_FLAG_ACCESS;
+ }
+
+ if ((ucAP == 0) || (ucAP == 1)) {
+ *pulFlag |= LW_VMM_FLAG_WRITABLE;
+ }
+
+ switch (ucAIn) {
+
+ case 0x5:
+ *pulFlag |= LW_VMM_FLAG_CACHEABLE;
+ break;
+
+ case 0x6:
+ *pulFlag |= LW_VMM_FLAG_WRITETHROUGH;
+ break;
+
+ default:
+ break;
+ }
+
+ if (ucXN == 0x0) {
+ *pulFlag |= LW_VMM_FLAG_EXECABLE;
+ }
+
+ return (ERROR_NONE);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuBuildPgdEntry
+** 功能描述: 生成一个一级描述符 (PGD 描述符)
+** 输 入 : ulBaseAddr 基地址 (二级页表基地址)
+** ucNS 是否访问安全区域
+** ucAP 访问权限
+** ucXN 可执行权限标志
+** ucPXN 特权可执行权限标志
+** ucType 描述符类型
+** 输 出 : 一级描述符
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static LW_INLINE LW_PGD_TRANSENTRY arm64MmuBuildPgdEntry (addr_t ulBaseAddr,
+ UINT8 ucNS,
+ UINT8 ucAP,
+ UINT8 ucXN,
+ UINT8 ucPXN,
+ UINT8 ucType)
+{
+ LW_PGD_TRANSENTRY ulDescriptor;
+
+ ulDescriptor = (ulBaseAddr & ARM64_MMU_ADDR_MASK)
+ | ((UINT64)ucNS << ARM64_MMU_NS_SHIFT)
+ | ((UINT64)ucAP << ARM64_MMU_AP_SHIFT)
+ | ((UINT64)ucXN << ARM64_MMU_XN_SHIFT)
+ | ((UINT64)ucPXN << ARM64_MMU_PXN_SHIFT)
+ | ucType;
+
+ return (ulDescriptor);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuBuildPmdEntry
+** 功能描述: 生成一个二级描述符 (PMD 描述符)
+** 输 入 : ulBaseAddr 基地址 (三级页表基地址)
+** ucNS 是否访问安全区域
+** ucAP 访问权限
+** ucXN 可执行权限标志
+** ucPXN 特权可执行权限标志
+** ucType 描述符类型
+** 输 出 : 二级描述符
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static LW_INLINE LW_PMD_TRANSENTRY arm64MmuBuildPmdEntry (addr_t ulBaseAddr,
+ UINT8 ucNS,
+ UINT8 ucAP,
+ UINT8 ucXN,
+ UINT8 ucPXN,
+ UINT8 ucType)
+{
+ LW_PGD_TRANSENTRY ulDescriptor;
+
+ ulDescriptor = (ulBaseAddr & ARM64_MMU_ADDR_MASK)
+ | ((UINT64)ucNS << ARM64_MMU_NS_SHIFT)
+ | ((UINT64)ucAP << ARM64_MMU_AP_SHIFT)
+ | ((UINT64)ucXN << ARM64_MMU_XN_SHIFT)
+ | ((UINT64)ucPXN << ARM64_MMU_PXN_SHIFT)
+ | ucType;
+
+ return (ulDescriptor);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuBuildPtsEntry
+** 功能描述: 生成一个三级描述符 (PTS 描述符)
+** 输 入 : ulBaseAddr 基地址 (四级页表基地址)
+** ucNS 是否访问安全区域
+** ucAP 访问权限
+** ucXN 可执行权限标志
+** ucPXN 特权可执行权限标志
+** ucType 描述符类型
+** 输 出 : 三级描述符
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static LW_INLINE LW_PTS_TRANSENTRY arm64MmuBuildPtsEntry (addr_t ulBaseAddr,
+ UINT8 ucNS,
+ UINT8 ucAP,
+ UINT8 ucXN,
+ UINT8 ucPXN,
+ UINT8 ucType)
+{
+ LW_PGD_TRANSENTRY ulDescriptor;
+
+ ulDescriptor = (ulBaseAddr & ARM64_MMU_ADDR_MASK)
+ | ((UINT64)ucNS << ARM64_MMU_NS_SHIFT)
+ | ((UINT64)ucAP << ARM64_MMU_AP_SHIFT)
+ | ((UINT64)ucXN << ARM64_MMU_XN_SHIFT)
+ | ((UINT64)ucPXN << ARM64_MMU_PXN_SHIFT)
+ | ucType;
+
+ return (ulDescriptor);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuBuildPtentry
+** 功能描述: 生成一个四级描述符 (PTE 描述符)
+** 输 入 : ulBaseAddr 基地址 (页地址)
+** ucGuard 进行严格的权限检查
+** ucXN 可执行权限标志
+** ucPXN 特权可执行权限标志
+** ucCon Contiguous 标志
+** ucnG nG 标志
+** ucAF 访问标志
+** ucSH 共享权限标志
+** ucAP 访问权限标志
+** ucNS Non-Secure 标志
+** ucAIn Attribute Index
+** ucType 描述符类型
+** 输 出 : 四级描述符
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static LW_PTE_TRANSENTRY arm64MmuBuildPtentry (addr_t ulBaseAddr,
+ UINT8 ucGuard,
+ UINT8 ucXN,
+ UINT8 ucPXN,
+ UINT8 ucCon,
+ UINT8 ucnG,
+ UINT8 ucAF,
+ UINT8 ucSH,
+ UINT8 ucAP,
+ UINT8 ucNS,
+ UINT8 ucAIn,
+ UINT8 ucType)
+{
+ LW_PTE_TRANSENTRY ulDescriptor;
+
+ switch (ucType) {
+
+ case ARM64_PTE_TYPE_PAGE:
+ ulDescriptor = (ulBaseAddr & ARM64_MMU_ADDR_MASK)
+ | ((UINT64)ucGuard << ARM64_PTE_GUARD_SHIFT)
+ | ((UINT64)ucXN << ARM64_PTE_UXN_SHIFT)
+ | ((UINT64)ucPXN << ARM64_PTE_PXN_SHIFT)
+ | ((UINT64)ucCon << ARM64_PTE_CONT_SHIFT)
+ | (ucnG << ARM64_PTE_NG_SHIFT)
+ | (ucAF << ARM64_PTE_AF_SHIFT)
+ | (ucSH << ARM64_PTE_SH_SHIFT)
+ | (ucAP << ARM64_PTE_AP_SHIFT)
+ | (ucNS << ARM64_PTE_NS_SHIFT)
+ | (ucAIn << ARM64_PTE_AIN_SHIFT)
+ | ucType;
+ break;
+
+ default:
+ ulDescriptor = 0;
+ break;
+ }
+
+ return (ulDescriptor);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuMemInit
+** 功能描述: 初始化 MMU 页表内存区
+** 输 入 : pmmuctx mmu 上下文
+** 输 出 : ERROR or OK
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static INT arm64MmuMemInit (PLW_MMU_CONTEXT pmmuctx)
+{
+#define PGD_BLOCK_SIZE (16 * LW_CFG_KB_SIZE)
+#define PMD_BLOCK_SIZE (16 * LW_CFG_KB_SIZE)
+#define PTS_BLOCK_SIZE (16 * LW_CFG_KB_SIZE)
+#define PTE_BLOCK_SIZE (16 * LW_CFG_KB_SIZE)
+
+ PVOID pvPgdTable;
+ PVOID pvPmdTable;
+ PVOID pvPtsTable;
+ PVOID pvPteTable;
+
+ ULONG ulPgdNum = bspMmuPgdMaxNum();
+ ULONG ulPmdNum = bspMmuPmdMaxNum();
+ ULONG ulPtsNum = bspMmuPtsMaxNum();
+ ULONG ulPteNum = bspMmuPteMaxNum();
+
+ pvPgdTable = __KHEAP_ALLOC_ALIGN((size_t)ulPgdNum * PGD_BLOCK_SIZE, PGD_BLOCK_SIZE);
+ pvPmdTable = __KHEAP_ALLOC_ALIGN((size_t)ulPmdNum * PMD_BLOCK_SIZE, PMD_BLOCK_SIZE);
+ pvPtsTable = __KHEAP_ALLOC_ALIGN((size_t)ulPtsNum * PTS_BLOCK_SIZE, PTS_BLOCK_SIZE);
+ pvPteTable = __KHEAP_ALLOC_ALIGN((size_t)ulPteNum * PTE_BLOCK_SIZE, PTE_BLOCK_SIZE);
+
+ if (!pvPgdTable || !pvPmdTable || !pvPtsTable || !pvPteTable) {
+ _DebugHandle(__ERRORMESSAGE_LEVEL, "can not allocate page table.\r\n");
+ return (PX_ERROR);
+ }
+
+ _G_hPGDPartition = API_PartitionCreate("pgd_pool", pvPgdTable, ulPgdNum, PGD_BLOCK_SIZE,
+ LW_OPTION_OBJECT_GLOBAL, LW_NULL);
+ _G_hPMDPartition = API_PartitionCreate("pmd_pool", pvPmdTable, ulPmdNum, PMD_BLOCK_SIZE,
+ LW_OPTION_OBJECT_GLOBAL, LW_NULL);
+ _G_hPTSPartition = API_PartitionCreate("pts_pool", pvPtsTable, ulPtsNum, PTS_BLOCK_SIZE,
+ LW_OPTION_OBJECT_GLOBAL, LW_NULL);
+ _G_hPTEPartition = API_PartitionCreate("pte_pool", pvPteTable, ulPteNum, PTE_BLOCK_SIZE,
+ LW_OPTION_OBJECT_GLOBAL, LW_NULL);
+
+ if (!_G_hPGDPartition || !_G_hPMDPartition || !_G_hPTSPartition || !_G_hPTEPartition) {
+ _DebugHandle(__ERRORMESSAGE_LEVEL, "can not allocate page pool.\r\n");
+ return (PX_ERROR);
+ }
+
+ return (ERROR_NONE);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuGlobalInit
+** 功能描述: 调用 BSP 对 MMU 初始化
+** 输 入 : pcMachineName 使用的机器名称
+** 输 出 : ERROR or OK
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static INT arm64MmuGlobalInit (CPCHAR pcMachineName)
+{
+ archCacheReset(pcMachineName);
+
+ arm64MmuInvalidateTLB();
+
+ arm64MmuSetTCR(0x54082b510); /* T0SZ = 2 ^ 48 */
+
+ arm64MmuSetMAIR();
+
+ return (ERROR_NONE);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuPgdOffset
+** 功能描述: 通过虚拟地址计算 PGD 项
+** 输 入 : pmmuctx mmu 上下文
+** ulAddr 虚拟地址
+** 输 出 : 对应的 PGD 表项地址
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static LW_PGD_TRANSENTRY *arm64MmuPgdOffset (PLW_MMU_CONTEXT pmmuctx, addr_t ulAddr)
+{
+ REGISTER LW_PGD_TRANSENTRY *p_pgdentry = pmmuctx->MMUCTX_pgdEntry;
+ REGISTER ULONG ulPgdNum;
+
+ ulAddr &= LW_CFG_VMM_PGD_MASK;
+ ulPgdNum = ulAddr >> LW_CFG_VMM_PGD_SHIFT; /* 计算 PGD 号 */
+
+ p_pgdentry = (LW_PGD_TRANSENTRY *)((addr_t)p_pgdentry |
+ (ulPgdNum * sizeof(LW_PGD_TRANSENTRY))); /* 获得一级页表描述符地址 */
+
+ return (p_pgdentry);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuPmdOffset
+** 功能描述: 通过虚拟地址计算 PMD 项
+** 输 入 : p_pgdentry pgd 入口地址
+** ulAddr 虚拟地址
+** 输 出 : 对应的 PMD 表项地址
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static LW_PMD_TRANSENTRY *arm64MmuPmdOffset (LW_PGD_TRANSENTRY *p_pgdentry, addr_t ulAddr)
+{
+ REGISTER LW_PMD_TRANSENTRY *p_pmdentry;
+ REGISTER LW_PGD_TRANSENTRY ulTemp;
+ REGISTER ULONG ulPmdNum;
+
+ ulTemp = *p_pgdentry; /* 获得一级页表描述符 */
+
+ p_pmdentry = (LW_PMD_TRANSENTRY *)(ulTemp & ARM64_MMU_ADDR_MASK); /* 获得二级页表基地址 */
+
+ ulAddr &= LW_CFG_VMM_PMD_MASK;
+ ulPmdNum = ulAddr >> LW_CFG_VMM_PMD_SHIFT; /* 计算 PMD 号 */
+
+ p_pmdentry = (LW_PMD_TRANSENTRY *)((addr_t)p_pmdentry |
+ (ulPmdNum * sizeof(LW_PMD_TRANSENTRY))); /* 获得二级页表描述符地址 */
+
+ return (p_pmdentry);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuPtsOffset
+** 功能描述: 通过虚拟地址计算 PTS 项
+** 输 入 : p_pmdentry pmd 入口地址
+** ulAddr 虚拟地址
+** 输 出 : 对应的 PTS 表项地址
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static LW_PTS_TRANSENTRY *arm64MmuPtsOffset (LW_PMD_TRANSENTRY *p_pmdentry, addr_t ulAddr)
+{
+ REGISTER LW_PTS_TRANSENTRY *p_ptsentry;
+ REGISTER LW_PMD_TRANSENTRY ulTemp;
+ REGISTER ULONG ulPtsNum;
+
+ ulTemp = *p_pmdentry; /* 获得二级页表描述符 */
+
+ p_ptsentry = (LW_PTS_TRANSENTRY *)(ulTemp & ARM64_MMU_ADDR_MASK); /* 获得三级页表基地址 */
+
+ ulAddr &= LW_CFG_VMM_PTS_MASK;
+ ulPtsNum = ulAddr >> LW_CFG_VMM_PTS_SHIFT; /* 计算 PTS 号 */
+
+ p_ptsentry = (LW_PTS_TRANSENTRY *)((addr_t)p_ptsentry |
+ (ulPtsNum * sizeof(LW_PTS_TRANSENTRY))); /* 获得三级页表描述符地址 */
+
+ return (p_ptsentry);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuPteOffset
+** 功能描述: 通过虚拟地址计算 PTE 项
+** 输 入 : p_ptsentry pts 入口地址
+** ulAddr 虚拟地址
+** 输 出 : 对应的 PTE 表项地址
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static LW_PTE_TRANSENTRY *arm64MmuPteOffset (LW_PTS_TRANSENTRY *p_ptsentry, addr_t ulAddr)
+{
+ REGISTER LW_PTE_TRANSENTRY *p_pteentry;
+ REGISTER LW_PTS_TRANSENTRY ulTemp;
+ REGISTER ULONG ulPageNum;
+
+ ulTemp = *p_ptsentry; /* 获得三级页表描述符 */
+
+ p_pteentry = (LW_PTE_TRANSENTRY *)(ulTemp & ARM64_MMU_ADDR_MASK); /* 获得四级页表基地址 */
+
+ ulAddr &= LW_CFG_VMM_PTE_MASK; /* 不要使用LW_CFG_VMM_PAGE_MASK*/
+ ulPageNum = ulAddr >> LW_CFG_VMM_PAGE_SHIFT; /* 计算段内页号 */
+
+ p_pteentry = (LW_PTE_TRANSENTRY *)((addr_t)p_pteentry |
+ (ulPageNum * sizeof(LW_PTE_TRANSENTRY))); /* 获得虚拟地址页表描述符地址 */
+
+ return (p_pteentry);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuPgdIsOk
+** 功能描述: 判断 PGD 项的描述符是否正确
+** 输 入 : pgdentry PGD 项描述符
+** 输 出 : 是否正确
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static BOOL arm64MmuPgdIsOk (LW_PGD_TRANSENTRY pgdentry)
+{
+ return (((pgdentry & ARM64_PGD_TYPE_MASK) == ARM64_PGD_TYPE_TABLE) ? LW_TRUE : LW_FALSE);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuPmdIsOk
+** 功能描述: 判断 PMD 项的描述符是否正确
+** 输 入 : pmdentry PMD 项描述符
+** 输 出 : 是否正确
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static BOOL arm64MmuPmdIsOk (LW_PMD_TRANSENTRY pmdentry)
+{
+ return (((pmdentry & ARM64_PMD_TYPE_MASK) == ARM64_PMD_TYPE_TABLE) ? LW_TRUE : LW_FALSE);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuPtsIsOk
+** 功能描述: 判断 PTS 项的描述符是否正确
+** 输 入 : ptsentry PTS 项描述符
+** 输 出 : 是否正确
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static BOOL arm64MmuPtsIsOk (LW_PTS_TRANSENTRY ptsentry)
+{
+ return (((ptsentry & ARM64_PTS_TYPE_MASK) == ARM64_PTS_TYPE_TABLE) ? LW_TRUE : LW_FALSE);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuPteIsOk
+** 功能描述: 判断 PTE 项的描述符是否正确
+** 输 入 : pteentry PTE 项描述符
+** 输 出 : 是否正确
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static BOOL arm64MmuPteIsOk (LW_PTE_TRANSENTRY pteentry)
+{
+ return (((pteentry & ARM64_PTE_TYPE_MASK) == ARM64_PTE_TYPE_PAGE) ? LW_TRUE : LW_FALSE);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuPgdAlloc
+** 功能描述: 分配 PGD 项
+** 输 入 : pmmuctx mmu 上下文
+** ulAddr 虚拟地址 (参数 0 即偏移量为 0 , 需要返回页表基地址)
+** 输 出 : 分配 PGD 地址
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static LW_PGD_TRANSENTRY *arm64MmuPgdAlloc (PLW_MMU_CONTEXT pmmuctx, addr_t ulAddr)
+{
+ REGISTER LW_PGD_TRANSENTRY *p_pgdentry;
+ REGISTER ULONG ulPgdNum;
+
+ p_pgdentry = (LW_PGD_TRANSENTRY *)API_PartitionGet(_G_hPGDPartition);
+ if (!p_pgdentry) {
+ return (LW_NULL);
+ }
+
+ lib_bzero(p_pgdentry, PGD_BLOCK_SIZE); /* 新的 PGD 无有效的页表项 */
+
+ ulAddr &= LW_CFG_VMM_PGD_MASK;
+ ulPgdNum = ulAddr >> LW_CFG_VMM_PGD_SHIFT;
+
+ p_pgdentry = (LW_PGD_TRANSENTRY *)((addr_t)p_pgdentry |
+ (ulPgdNum * sizeof(LW_PGD_TRANSENTRY))); /* 获得一级页表描述符地址 */
+
+ return (p_pgdentry);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuPgdFree
+** 功能描述: 释放 PGD 项
+** 输 入 : p_pgdentry pgd 入口地址
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static VOID arm64MmuPgdFree (LW_PGD_TRANSENTRY *p_pgdentry)
+{
+ p_pgdentry = (LW_PGD_TRANSENTRY *)((addr_t)p_pgdentry & (~(PGD_BLOCK_SIZE - 1)));
+
+ API_PartitionPut(_G_hPGDPartition, (PVOID)p_pgdentry);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuPmdAlloc
+** 功能描述: 分配 PMD 项
+** 输 入 : pmmuctx mmu 上下文
+** p_pgdentry pgd 入口地址
+** ulAddr 虚拟地址
+** 输 出 : 分配 PMD 地址
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static LW_PMD_TRANSENTRY *arm64MmuPmdAlloc (PLW_MMU_CONTEXT pmmuctx,
+ LW_PGD_TRANSENTRY *p_pgdentry,
+ addr_t ulAddr)
+{
+#if LW_CFG_CACHE_EN > 0
+ INTREG iregInterLevel;
+#endif /* LW_CFG_CACHE_EN > 0 */
+
+ LW_PMD_TRANSENTRY *p_pmdentry = (LW_PMD_TRANSENTRY *)API_PartitionGet(_G_hPMDPartition);
+
+ if (!p_pmdentry) {
+ return (LW_NULL);
+ }
+
+ lib_bzero(p_pmdentry, PMD_BLOCK_SIZE);
+
+ *p_pgdentry = arm64MmuBuildPgdEntry((addr_t)p_pmdentry, /* 设置一级页表描述符 */
+ ARM64_MMU_NS_SECURE,
+ ARM64_MMU_AP_NO_EFFECT,
+ ARM64_MMU_XN_NO_EFFECT,
+ ARM64_MMU_PXN_NO_EFFECT,
+ ARM64_PGD_TYPE_TABLE);
+
+#if LW_CFG_CACHE_EN > 0
+ iregInterLevel = KN_INT_DISABLE();
+ arm64DCacheFlush((PVOID)p_pgdentry, (PVOID)p_pgdentry, 32); /* 第三个参数无影响 */
+ KN_INT_ENABLE(iregInterLevel);
+#endif /* LW_CFG_CACHE_EN > 0 */
+
+ return (arm64MmuPmdOffset(p_pgdentry, ulAddr));
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuPmdFree
+** 功能描述: 释放 PMD 项
+** 输 入 : p_pmdentry pmd 入口地址
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static VOID arm64MmuPmdFree (LW_PMD_TRANSENTRY *p_pmdentry)
+{
+ p_pmdentry = (LW_PMD_TRANSENTRY *)((addr_t)p_pmdentry & (~(PMD_BLOCK_SIZE - 1)));
+
+ API_PartitionPut(_G_hPMDPartition, (PVOID)p_pmdentry);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuPtsAlloc
+** 功能描述: 分配 PTS 项
+** 输 入 : pmmuctx mmu 上下文
+** p_pmdentry pmd 入口地址
+** ulAddr 虚拟地址
+** 输 出 : 分配 PTS 地址
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static LW_PTS_TRANSENTRY *arm64MmuPtsAlloc (PLW_MMU_CONTEXT pmmuctx,
+ LW_PMD_TRANSENTRY *p_pmdentry,
+ addr_t ulAddr)
+{
+#if LW_CFG_CACHE_EN > 0
+ INTREG iregInterLevel;
+#endif /* LW_CFG_CACHE_EN > 0 */
+
+ LW_PTS_TRANSENTRY *p_ptsentry = (LW_PTS_TRANSENTRY *)API_PartitionGet(_G_hPTSPartition);
+
+ if (!p_ptsentry) {
+ return (LW_NULL);
+ }
+
+ lib_bzero(p_ptsentry, PTS_BLOCK_SIZE);
+
+ *p_pmdentry = arm64MmuBuildPmdEntry((addr_t)p_ptsentry, /* 设置二级页表描述符 */
+ ARM64_MMU_NS_SECURE,
+ ARM64_MMU_AP_NO_EFFECT,
+ ARM64_MMU_XN_NO_EFFECT,
+ ARM64_MMU_PXN_NO_EFFECT,
+ ARM64_PMD_TYPE_TABLE);
+
+#if LW_CFG_CACHE_EN > 0
+ iregInterLevel = KN_INT_DISABLE();
+ arm64DCacheFlush((PVOID)p_pmdentry, (PVOID)p_pmdentry, 32); /* 第三个参数无影响 */
+ KN_INT_ENABLE(iregInterLevel);
+#endif /* LW_CFG_CACHE_EN > 0 */
+
+ return (arm64MmuPtsOffset(p_pmdentry, ulAddr));
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuPtsFree
+** 功能描述: 释放 PTS 项
+** 输 入 : p_ptsentry pts 入口地址
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static VOID arm64MmuPtsFree (LW_PTS_TRANSENTRY *p_ptsentry)
+{
+ p_ptsentry = (LW_PTS_TRANSENTRY *)((addr_t)p_ptsentry & (~(PTS_BLOCK_SIZE - 1)));
+
+ API_PartitionPut(_G_hPTSPartition, (PVOID)p_ptsentry);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuPteAlloc
+** 功能描述: 分配 PTE 项
+** 输 入 : pmmuctx mmu 上下文
+** p_ptsentry pts 入口地址
+** ulAddr 虚拟地址
+** 输 出 : 分配 PTE 地址
+** 全局变量:
+** 调用模块: VMM 这里没有关闭中断, 回写 CACHE 时, 需要手动关中断, SylixOS 映射完毕会自动清快表, 所以
+ 这里不用清除快表.
+*********************************************************************************************************/
+static LW_PTE_TRANSENTRY *arm64MmuPteAlloc (PLW_MMU_CONTEXT pmmuctx,
+ LW_PTS_TRANSENTRY *p_ptsentry,
+ addr_t ulAddr)
+{
+#if LW_CFG_CACHE_EN > 0
+ INTREG iregInterLevel;
+#endif /* LW_CFG_CACHE_EN > 0 */
+
+ LW_PTE_TRANSENTRY *p_pteentry = (LW_PTE_TRANSENTRY *)API_PartitionGet(_G_hPTEPartition);
+
+ if (!p_pteentry) {
+ return (LW_NULL);
+ }
+
+ lib_bzero(p_pteentry, PTE_BLOCK_SIZE);
+
+ *p_ptsentry = arm64MmuBuildPtsEntry((addr_t)p_pteentry, /* 设置三级页表描述符 */
+ ARM64_MMU_NS_SECURE,
+ ARM64_MMU_AP_NO_EFFECT,
+ ARM64_MMU_XN_NO_EFFECT,
+ ARM64_MMU_PXN_NO_EFFECT,
+ ARM64_PTS_TYPE_TABLE);
+
+#if LW_CFG_CACHE_EN > 0
+ iregInterLevel = KN_INT_DISABLE();
+ arm64DCacheFlush((PVOID)p_ptsentry, (PVOID)p_ptsentry, 32); /* 第三个参数无影响 */
+ KN_INT_ENABLE(iregInterLevel);
+#endif /* LW_CFG_CACHE_EN > 0 */
+
+ return (arm64MmuPteOffset(p_ptsentry, ulAddr));
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuPteFree
+** 功能描述: 释放 PTE 项
+** 输 入 : p_pteentry pte 入口地址
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static VOID arm64MmuPteFree (LW_PTE_TRANSENTRY *p_pteentry)
+{
+ p_pteentry = (LW_PTE_TRANSENTRY *)((addr_t)p_pteentry & (~(PTE_BLOCK_SIZE - 1)));
+
+ API_PartitionPut(_G_hPTEPartition, (PVOID)p_pteentry);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuPtePhysGet
+** 功能描述: 通过 PTE 表项, 查询物理地址
+** 输 入 : pteentry pte 表项
+** ppaPhysicalAddr 获得的物理地址
+** 输 出 : ERROR or OK
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static INT arm64MmuPtePhysGet (LW_PTE_TRANSENTRY pteentry, phys_addr_t *ppaPhysicalAddr)
+{
+ *ppaPhysicalAddr = (addr_t)(pteentry & ARM64_MMU_ADDR_MASK); /* 获得物理地址 */
+
+ return (ERROR_NONE);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuFlagGet
+** 功能描述: 获得指定虚拟地址的 SylixOS 权限标志
+** 输 入 : pmmuctx mmu 上下文
+** ulAddr 虚拟地址
+** 输 出 : SylixOS 权限标志
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static ULONG arm64MmuFlagGet (PLW_MMU_CONTEXT pmmuctx, addr_t ulAddr)
+{
+ LW_PGD_TRANSENTRY *p_pgdentry = arm64MmuPgdOffset(pmmuctx, ulAddr);/* 获取一级描述符 */
+ INT iDescType;
+ ULONG ulFlag = 0;
+
+ UINT8 ucGuard; /* 严格的权限检查 */
+ UINT8 ucXN; /* 可执行权限标志 */
+ UINT8 ucPXN; /* 特权可执行权限标志 */
+ UINT8 ucCon; /* Contiguous 标志 */
+ UINT8 ucnG; /* nG 标志 */
+ UINT8 ucAF; /* 是否拥有访问权限标志 */
+ UINT8 ucSH; /* 共享权限标志 */
+ UINT8 ucAP; /* 是否可写权限标志 */
+ UINT8 ucNS; /* Non-Secure 标志 */
+ UINT8 ucAIn;
+
+ iDescType = (*p_pgdentry) & 0x03; /* 获得一级页表类型 */
+ if (iDescType == ARM64_PGD_TYPE_BLOCK) { /* 基于段的映射 */
+ return (LW_VMM_FLAG_UNVALID);
+
+ } else if (iDescType == ARM64_PGD_TYPE_TABLE) { /* 基于四级页表映射 */
+ LW_PMD_TRANSENTRY *p_pmdentry = arm64MmuPmdOffset((LW_PMD_TRANSENTRY *)p_pgdentry,
+ ulAddr); /* 获取二级描述符 */
+ if (arm64MmuPmdIsOk(*p_pmdentry)) {
+ LW_PTS_TRANSENTRY *p_ptsentry = arm64MmuPtsOffset((LW_PTS_TRANSENTRY *)p_pmdentry,
+ ulAddr);
+ /* 获取三级描述符 */
+ if (arm64MmuPtsIsOk(*p_ptsentry)) {
+ LW_PTE_TRANSENTRY *p_pteentry = arm64MmuPteOffset((LW_PTE_TRANSENTRY *)p_ptsentry,
+ ulAddr);
+ /* 获取四级描述符 */
+ if (arm64MmuPteIsOk(*p_pteentry)) {
+ UINT64 u64Descriptor = (UINT64)(*p_pteentry);
+
+ ucGuard = (UINT8)((u64Descriptor & ARM64_PTE_GUARD_MASK) >> ARM64_PTE_GUARD_SHIFT);
+ ucXN = (UINT8)((u64Descriptor & ARM64_PTE_UXN_MASK) >> ARM64_PTE_UXN_SHIFT);
+ ucPXN = (UINT8)((u64Descriptor & ARM64_PTE_PXN_MASK) >> ARM64_PTE_PXN_SHIFT);
+ ucCon = (UINT8)((u64Descriptor & ARM64_PTE_CONT_MASK) >> ARM64_PTE_CONT_SHIFT);
+ ucnG = (UINT8)((u64Descriptor & ARM64_PTE_NG_MASK) >> ARM64_PTE_NG_SHIFT);
+ ucAF = (UINT8)((u64Descriptor & ARM64_PTE_AF_MASK) >> ARM64_PTE_AF_SHIFT);
+ ucSH = (UINT8)((u64Descriptor & ARM64_PTE_SH_MASK) >> ARM64_PTE_SH_SHIFT);
+ ucAP = (UINT8)((u64Descriptor & ARM64_PTE_AP_MASK) >> ARM64_PTE_AP_SHIFT);
+ ucNS = (UINT8)((u64Descriptor & ARM64_PTE_NS_MASK) >> ARM64_PTE_NS_SHIFT);
+ ucAIn = (UINT8)((u64Descriptor & ARM64_PTE_AIN_MASK) >> ARM64_PTE_AIN_SHIFT);
+
+ arm64MmuAttr2Flags(ucGuard, ucXN, ucPXN, ucCon, ucnG,
+ ucAF, ucSH, ucAP, ucNS, ucAIn, &ulFlag);
+
+ return (ulFlag);
+ }
+ }
+ }
+ }
+
+ return (LW_VMM_FLAG_UNVALID);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuFlagSet
+** 功能描述: 设置指定虚拟地址的 flag 标志
+** 输 入 : pmmuctx mmu 上下文
+** ulAddr 虚拟地址
+** ulFlag flag 标志
+** 输 出 : ERROR or OK
+** 全局变量:
+** 调用模块:
+** 注 意 : 这里不需要清除快表 TLB, 因为 VMM 自身会作此操作.
+*********************************************************************************************************/
+static INT arm64MmuFlagSet (PLW_MMU_CONTEXT pmmuctx, addr_t ulAddr, ULONG ulFlag)
+{
+ LW_PGD_TRANSENTRY *p_pgdentry = arm64MmuPgdOffset(pmmuctx, ulAddr);/* 获取一级描述符 */
+ INT iDescType;
+
+ UINT8 ucGuard; /* 严格的权限检查 */
+ UINT8 ucXN; /* 可执行权限标志 */
+ UINT8 ucPXN; /* 特权可执行权限标志 */
+ UINT8 ucContiguous; /* Contiguous 标志 */
+ UINT8 ucnG; /* nG 标志 */
+ UINT8 ucAF; /* 是否拥有访问权限标志 */
+ UINT8 ucSH; /* 共享权限标志 */
+ UINT8 ucAP; /* 是否可写权限标志 */
+ UINT8 ucNS; /* Non-Secure 标志 */
+ UINT8 ucAttrIndx;
+ UINT8 ucType;
+
+ if (ulFlag & LW_VMM_FLAG_ACCESS) {
+ ucType = ARM64_PTE_TYPE_PAGE;
+
+ } else {
+ ucType = ARM64_PTE_TYPE_FAULT; /* 访问将失效 */
+ }
+
+ if (arm64MmuFlags2Attr(ulFlag,
+ &ucGuard,
+ &ucXN, &ucPXN,
+ &ucContiguous,
+ &ucnG, &ucAF,
+ &ucSH, &ucAP,
+ &ucNS, &ucAttrIndx) < 0) { /* 无效的映射关系 */
+ return (PX_ERROR);
+ }
+
+ iDescType = (*p_pgdentry) & 0x03; /* 获得一级页表类型 */
+ if (iDescType == ARM64_PGD_TYPE_BLOCK) { /* 基于段的映射 */
+ return (ERROR_NONE);
+
+ } else if (iDescType == ARM64_PGD_TYPE_TABLE) { /* 基于四级页表映射 */
+ LW_PMD_TRANSENTRY *p_pmdentry = arm64MmuPmdOffset((LW_PGD_TRANSENTRY *)p_pgdentry,
+ ulAddr); /* 获取二级描述符 */
+ if (arm64MmuPmdIsOk(*p_pmdentry)) {
+ LW_PTS_TRANSENTRY *p_ptsentry = arm64MmuPtsOffset((LW_PMD_TRANSENTRY *)p_pmdentry,
+ ulAddr); /* 获取三级描述符 */
+ if (arm64MmuPtsIsOk(*p_ptsentry)) {
+ LW_PTE_TRANSENTRY *p_pteentry = arm64MmuPteOffset((LW_PTE_TRANSENTRY *)p_ptsentry,
+ ulAddr);
+ /* 获取四级描述符 */
+ if (arm64MmuPteIsOk(*p_pteentry)) {
+ addr_t ulPhysicalAddr = (addr_t)(*p_pteentry & ARM64_MMU_ADDR_MASK);
+
+ *p_pteentry = arm64MmuBuildPtentry(ulPhysicalAddr,
+ ucGuard,
+ ucXN, ucPXN,
+ ucContiguous,
+ ucnG, ucAF,
+ ucSH, ucAP,
+ ucNS, ucAttrIndx,
+ ucType);
+#if LW_CFG_CACHE_EN > 0
+ arm64DCacheFlush((PVOID)p_pteentry, (PVOID)p_pteentry, 32);
+ /* 第三个参数无影响 */
+#endif /* LW_CFG_CACHE_EN > 0 */
+ return (ERROR_NONE);
+ }
+ }
+ }
+ }
+
+ return (PX_ERROR);
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuMakeTrans
+** 功能描述: 设置页面映射关系
+** 输 入 : pmmuctx mmu 上下文
+** p_pteentry 对应的页表项
+** ulVirtualAddr 虚拟地址
+** paPhysicalAddr 物理地址
+** ulFlag 对应的类型
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+** 注 意 : 这里不需要清除快表 TLB, 因为 VMM 自身会作此操作.
+*********************************************************************************************************/
+static VOID arm64MmuMakeTrans (PLW_MMU_CONTEXT pmmuctx,
+ LW_PTE_TRANSENTRY *p_pteentry,
+ addr_t ulVirtualAddr,
+ phys_addr_t paPhysicalAddr,
+ ULONG ulFlag)
+{
+ UINT8 ucGuard; /* 严格的权限检查 */
+ UINT8 ucXN; /* 存储权限 */
+ UINT8 ucPXN; /* 域 */
+ UINT8 ucContiguous; /* CACHE 与缓冲区控制 */
+ UINT8 ucnG; /* 存储权限 */
+ UINT8 ucAF; /* CACHE 与缓冲区控制 */
+ UINT8 ucSH; /* 永不执行位 */
+ UINT8 ucAP;
+ UINT8 ucNS;
+ UINT8 ucAttrIndx;
+ UINT8 ucType;
+
+ if (ulFlag & LW_VMM_FLAG_ACCESS) {
+ ucType = ARM64_PTE_TYPE_PAGE;
+ } else {
+ ucType = ARM64_PTE_TYPE_FAULT; /* 访问将失效 */
+ }
+
+ if (arm64MmuFlags2Attr(ulFlag,
+ &ucGuard,
+ &ucXN, &ucPXN,
+ &ucContiguous,
+ &ucnG, &ucAF,
+ &ucSH, &ucAP,
+ &ucNS, &ucAttrIndx) < 0) { /* 无效的映射关系 */
+ return;
+ }
+
+ *p_pteentry = arm64MmuBuildPtentry((addr_t)paPhysicalAddr,
+ ucGuard,
+ ucXN, ucPXN,
+ ucContiguous,
+ ucnG, ucAF,
+ ucSH, ucAP,
+ ucNS, ucAttrIndx,
+ ucType);
+
+#if LW_CFG_CACHE_EN > 0
+ arm64DCacheFlush((PVOID)p_pteentry, (PVOID)p_pteentry, 32); /* 第三个参数无影响 */
+#endif /* LW_CFG_CACHE_EN > 0 */
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuMakeCurCtx
+** 功能描述: 设置 MMU 当前上下文, 这里使用 TTBR1 页表基址寄存器.
+** 输 入 : pmmuctx mmu 上下文
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static VOID arm64MmuMakeCurCtx (PLW_MMU_CONTEXT pmmuctx)
+{
+ REGISTER LW_PGD_TRANSENTRY *p_pgdentry;
+
+ p_pgdentry = (LW_PGD_TRANSENTRY *)((addr_t)pmmuctx->MMUCTX_pgdEntry);
+
+ arm64MmuSetTTBR((PVOID)p_pgdentry); /* 设置页表基地址 */
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuInvTLB
+** 功能描述: 无效当前 CPU TLB
+** 输 入 : pmmuctx mmu 上下文
+** ulPageAddr 页面虚拟地址
+** ulPageNum 页面个数
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static VOID arm64MmuInvTLB (PLW_MMU_CONTEXT pmmuctx, addr_t ulPageAddr, ULONG ulPageNum)
+{
+ ULONG i;
+
+ if (ulPageNum > 16) {
+ arm64MmuInvalidateTLB(); /* 全部清除 TLB */
+
+ } else {
+ for (i = 0; i < ulPageNum; i++) {
+ arm64MmuInvalidateTLBMVA((PVOID)ulPageAddr); /* 逐个页面清除 TLB */
+ ulPageAddr += LW_CFG_VMM_PAGE_SIZE;
+ }
+ }
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuInit
+** 功能描述: MMU 系统初始化
+** 输 入 : pmmuop MMU 操作函数集
+** pcMachineName 使用的机器名称
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID arm64MmuInit (LW_MMU_OP *pmmuop, CPCHAR pcMachineName)
+{
+ ULONG ulMMFR16 = (arm64MmuGetMMFR() >> ARM64_MMFR_TGRAN16_SHIFT) & 0xf;
+
+ _BugFormat(ARM64_MMFR_TGRAN16_NSUPPORT == ulMMFR16, LW_TRUE,
+ "This CPU can't support 16KB page size!\r\n");
+
+ pmmuop->MMUOP_ulOption = 0ul;
+
+ pmmuop->MMUOP_pfuncMemInit = arm64MmuMemInit;
+ pmmuop->MMUOP_pfuncGlobalInit = arm64MmuGlobalInit;
+
+ pmmuop->MMUOP_pfuncPGDAlloc = arm64MmuPgdAlloc;
+ pmmuop->MMUOP_pfuncPGDFree = arm64MmuPgdFree;
+ pmmuop->MMUOP_pfuncPMDAlloc = arm64MmuPmdAlloc;
+ pmmuop->MMUOP_pfuncPMDFree = arm64MmuPmdFree;
+
+ pmmuop->MMUOP_pfuncPTSAlloc = arm64MmuPtsAlloc;
+ pmmuop->MMUOP_pfuncPTSFree = arm64MmuPtsFree;
+ pmmuop->MMUOP_pfuncPTEAlloc = arm64MmuPteAlloc;
+ pmmuop->MMUOP_pfuncPTEFree = arm64MmuPteFree;
+
+ pmmuop->MMUOP_pfuncPGDIsOk = arm64MmuPgdIsOk;
+ pmmuop->MMUOP_pfuncPMDIsOk = arm64MmuPmdIsOk;
+ pmmuop->MMUOP_pfuncPTSIsOk = arm64MmuPtsIsOk;
+ pmmuop->MMUOP_pfuncPTEIsOk = arm64MmuPteIsOk;
+
+ pmmuop->MMUOP_pfuncPGDOffset = arm64MmuPgdOffset;
+ pmmuop->MMUOP_pfuncPMDOffset = arm64MmuPmdOffset;
+ pmmuop->MMUOP_pfuncPTSOffset = arm64MmuPtsOffset;
+ pmmuop->MMUOP_pfuncPTEOffset = arm64MmuPteOffset;
+
+ pmmuop->MMUOP_pfuncPTEPhysGet = arm64MmuPtePhysGet;
+
+ pmmuop->MMUOP_pfuncFlagGet = arm64MmuFlagGet;
+ pmmuop->MMUOP_pfuncFlagSet = arm64MmuFlagSet;
+
+ pmmuop->MMUOP_pfuncMakeTrans = arm64MmuMakeTrans;
+ pmmuop->MMUOP_pfuncMakeCurCtx = arm64MmuMakeCurCtx;
+ pmmuop->MMUOP_pfuncInvalidateTLB = arm64MmuInvTLB;
+
+ pmmuop->MMUOP_pfuncSetEnable = arm64MmuEnable;
+ pmmuop->MMUOP_pfuncSetDisable = arm64MmuDisable;
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuShareableSet
+** 功能描述: MMU 系统 share 模式设置 (如果 CACHE 使用 SNOOP 则提前设置为 OUTER_SHAREABLE)
+** 输 入 : bInnerOrOuter 0: INNER_SHAREABLE 1: OUTER_SHAREABLE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID arm64MmuShareableSet (INT iInnerOrOuter)
+{
+ if (iInnerOrOuter) {
+ VMSA_S = OUTER_SHAREABLE;
+ } else {
+ VMSA_S = INNER_SHAREABLE;
+ }
+}
+/*********************************************************************************************************
+** 函数名称: arm64MmuShareableGet
+** 功能描述: MMU 系统 share 模式获取
+** 输 入 : NONE
+** 输 出 : 0: INNER_SHAREABLE 1: OUTER_SHAREABLE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+INT arm64MmuShareableGet (VOID)
+{
+ if (VMSA_S == OUTER_SHAREABLE) {
+ return (1);
+ } else {
+ return (0);
+ }
+}
+
+#endif /* LW_CFG_ARM64_PAGE_SHIFT==14 */
+#endif /* LW_CFG_VMM_EN > 0 */
+/*********************************************************************************************************
+ END
+*********************************************************************************************************/
diff --git a/SylixOS/arch/arm64/mm/mmu/arm64Mmu4K.c b/SylixOS/arch/arm64/mm/mmu/arm64Mmu4K.c
index f4bb770..12b8d43 100644
--- a/SylixOS/arch/arm64/mm/mmu/arm64Mmu4K.c
+++ b/SylixOS/arch/arm64/mm/mmu/arm64Mmu4K.c
@@ -143,7 +143,7 @@ static UINT _G_uiVMSAShare = INNER_SHAREABLE; /* 共享
** 函数名称: arm64MmuFlags2Attr
** 功能描述: 根据 SylixOS 权限标志, 生成 ARM64 MMU 权限标志
** 输 入 : ulFlag 内存访问权限
-** 输 出 : pucGuard 进行严格的权限检查
+** pucGuard 进行严格的权限检查
** pucXN 可执行权限标志
** pucPXN 特权可执行权限标志
** pucCon Contiguous 标志
@@ -153,7 +153,7 @@ static UINT _G_uiVMSAShare = INNER_SHAREABLE; /* 共享
** pucAP 是否可写权限标志
** pucNS Non-Secure 标志
** pucAIn Cache 和 Bufferable 权限标志
-** ERROR_CODE
+** 输 出 : ERROR_CODE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
@@ -226,8 +226,8 @@ static INT arm64MmuFlags2Attr (ULONG ulFlag,
** ucAP 是否可写权限标志
** ucNS Non-Secure 标志
** ucAIn Cache 和 Bufferable 权限标志
-** 输 出 : ulFlag 内存访问权限
-** ERROR_CODE
+** pulFlag 内存访问权限
+** 输 出 : ERROR_CODE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
@@ -251,7 +251,7 @@ static INT arm64MmuAttr2Flags (UINT8 ucGuard,
*pulFlag |= LW_VMM_FLAG_GUARDED;
}
- if (ucAF == 1) {
+ if (ucAF == 1) {
*pulFlag |= LW_VMM_FLAG_ACCESS;
}
diff --git a/SylixOS/arch/arm64/mm/mmu/arm64Mmu64K.c b/SylixOS/arch/arm64/mm/mmu/arm64Mmu64K.c
index 75ff035..36828d8 100644
--- a/SylixOS/arch/arm64/mm/mmu/arm64Mmu64K.c
+++ b/SylixOS/arch/arm64/mm/mmu/arm64Mmu64K.c
@@ -132,7 +132,7 @@ static UINT _G_uiVMSAShare = INNER_SHAREABLE; /* 共享
** 函数名称: arm64MmuFlags2Attr
** 功能描述: 根据 SylixOS 权限标志, 生成 ARM64 MMU 权限标志
** 输 入 : ulFlag 内存访问权限
-** 输 出 : pucGuard 进行严格的权限检查
+** pucGuard 进行严格的权限检查
** pucXN 可执行权限标志
** pucPXN 特权可执行权限标志
** pucCon Contiguous 标志
@@ -142,7 +142,7 @@ static UINT _G_uiVMSAShare = INNER_SHAREABLE; /* 共享
** pucAP 是否可写权限标志
** pucNS Non-Secure 标志
** pucAIn Cache 和 Bufferable 权限标志
-** ERROR_CODE
+** 输 出 : ERROR_CODE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
@@ -215,8 +215,8 @@ static INT arm64MmuFlags2Attr (ULONG ulFlag,
** ucAP 是否可写权限标志
** ucNS Non-Secure 标志
** ucAIn Cache 和 Bufferable 权限标志
-** 输 出 : ulFlag 内存访问权限
-** ERROR_CODE
+** pulFlag 内存访问权限
+** 输 出 : ERROR_CODE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
@@ -240,7 +240,7 @@ static INT arm64MmuAttr2Flags (UINT8 ucGuard,
*pulFlag |= LW_VMM_FLAG_GUARDED;
}
- if (ucAF == 1) {
+ if (ucAF == 1) {
*pulFlag |= LW_VMM_FLAG_ACCESS;
}
diff --git a/SylixOS/arch/mips/mm/mmu/mips64/mips64Mmu.c b/SylixOS/arch/mips/mm/mmu/mips64/mips64Mmu.c
index 32405c4..70618a2 100644
--- a/SylixOS/arch/mips/mm/mmu/mips64/mips64Mmu.c
+++ b/SylixOS/arch/mips/mm/mmu/mips64/mips64Mmu.c
@@ -449,7 +449,7 @@ static VOID mips64MmuPtsFree (LW_PTS_TRANSENTRY *p_ptsentry)
** 函数名称: mips64MmuPteAlloc
** 功能描述: 分配 PTE 项
** 输 入 : pmmuctx mmu 上下文
-** p_pmdentry pmd 入口地址
+** p_ptsentry pts 入口地址
** ulAddr 虚拟地址
** 输 出 : 分配 PTE 地址
** 全局变量:
diff --git a/SylixOS/arch/riscv/mm/mmu/riscvSv39Mmu.c b/SylixOS/arch/riscv/mm/mmu/riscvSv39Mmu.c
index 122e438..327799e 100644
--- a/SylixOS/arch/riscv/mm/mmu/riscvSv39Mmu.c
+++ b/SylixOS/arch/riscv/mm/mmu/riscvSv39Mmu.c
@@ -66,6 +66,32 @@
#define SV39_MMU_PA(ulTemp) ((ulTemp & SV39_MMU_PPN_MASK) << (LW_CFG_VMM_PAGE_SHIFT - SV39_MMU_PPN_SHIFT))
#define SV39_MMU_PPN(pa) (((pa) >> (LW_CFG_VMM_PAGE_SHIFT - SV39_MMU_PPN_SHIFT)) & SV39_MMU_PPN_MASK)
/*********************************************************************************************************
+ T-HEAD C9XX 扩展
+*********************************************************************************************************/
+static BOOL _G_bC9xxVmForceShare = LW_FALSE; /* 强制为共享模式 */
+static UINT64 _G_ulC9xxVmSec = 0; /* 默认为安全模式 */
+static UINT64 _G_ulC9xxVmShare = 0; /* 共享位值 */
+
+#define C9XX_VM_FORCE_SH _G_bC9xxVmForceShare /* 强制为共享模式 */
+#define C9XX_VM_SH _G_ulC9xxVmShare /* 共享位值 */
+#define C9XX_VM_SEC _G_ulC9xxVmSec /* 非安全位值 */
+
+#define SV39_MMU_C9XX_EX_SEC (1ul)
+#define SV39_MMU_C9XX_EX_SEC_NO (0)
+#define SV39_MMU_C9XX_EX_SEC_SHIFT (59) /* t-head c9xx 扩展 sec */
+#define SV39_MMU_C9XX_EX_SHARE (1ul)
+#define SV39_MMU_C9XX_EX_SHARE_NO (0)
+#define SV39_MMU_C9XX_EX_SHARE_SHIFT (60) /* t-head c9xx 扩展 shareable */
+#define SV39_MMU_C9XX_EX_BUFFER (1ul)
+#define SV39_MMU_C9XX_EX_BUFFER_NO (0)
+#define SV39_MMU_C9XX_EX_BUFFER_SHIFT (61) /* t-head c9xx 扩展 bufferable */
+#define SV39_MMU_C9XX_EX_CACHE (1ul)
+#define SV39_MMU_C9XX_EX_CACHE_NO (0)
+#define SV39_MMU_C9XX_EX_CACHE_SHIFT (62) /* t-head c9xx 扩展 cacheable */
+#define SV39_MMU_C9XX_EX_SO (1ul)
+#define SV39_MMU_C9XX_EX_SO_NO (0)
+#define SV39_MMU_C9XX_EX_SO_SHIFT (63) /* t-head cxx 扩展 SO */
+/*********************************************************************************************************
页面数大于其 1/2 时, 全清 TLB
*********************************************************************************************************/
#define SV39_MMU_TLB_NR (32) /* TLB 数目 */
@@ -366,6 +392,64 @@ static LW_INLINE LW_PTE_TRANSENTRY sv39MmuBuildPteEntry (addr_t ulBaseAddr,
return (ulDescriptor);
}
/*********************************************************************************************************
+** 函数名称: c9xxMmuBuildPteEntry
+** 功能描述: 生成一个四级描述符 (PTE 描述符)
+** 输 入 : ulBaseAddr 基地址 (页基地址)
+** ucV 是否有效
+** ucR 是否可读
+** ucW 是否可写
+** ucX 是否执行
+** ucU 是否用户能访问
+** ucG 是否全局
+** ucRSW RSW
+** 输 出 : 四级描述符
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static LW_INLINE LW_PTE_TRANSENTRY c9xxMmuBuildPteEntry (addr_t ulBaseAddr,
+ UINT8 ucV,
+ UINT8 ucR,
+ UINT8 ucW,
+ UINT8 ucX,
+ UINT8 ucU,
+ UINT8 ucG,
+ UINT8 ucRSW)
+{
+ LW_PTE_TRANSENTRY ulDescriptor;
+
+ if (ucRSW == SV39_MMU_RSW_ZERO) {
+ ulDescriptor = (SV39_MMU_PPN(ulBaseAddr))
+ | (ucR << SV39_MMU_A_SHIFT)
+ | (ucW << SV39_MMU_D_SHIFT)
+ | (ucR << SV39_MMU_V_SHIFT)
+ | (ucR << SV39_MMU_R_SHIFT)
+ | (ucW << SV39_MMU_W_SHIFT)
+ | (ucX << SV39_MMU_X_SHIFT)
+ | (ucU << SV39_MMU_U_SHIFT)
+ | (ucG << SV39_MMU_G_SHIFT)
+ | (C9XX_VM_SEC << SV39_MMU_C9XX_EX_SEC_SHIFT)
+ | (SV39_MMU_C9XX_EX_SO << SV39_MMU_C9XX_EX_SO_SHIFT)
+ | ((ULONG)ucRSW << SV39_MMU_RSW_SHIFT);
+ } else {
+ ulDescriptor = (SV39_MMU_PPN(ulBaseAddr))
+ | (ucR << SV39_MMU_A_SHIFT)
+ | (ucW << SV39_MMU_D_SHIFT)
+ | (ucR << SV39_MMU_V_SHIFT)
+ | (ucR << SV39_MMU_R_SHIFT)
+ | (ucW << SV39_MMU_W_SHIFT)
+ | (ucX << SV39_MMU_X_SHIFT)
+ | (ucU << SV39_MMU_U_SHIFT)
+ | (ucG << SV39_MMU_G_SHIFT)
+ | (C9XX_VM_SH << SV39_MMU_C9XX_EX_SHARE_SHIFT)
+ | (C9XX_VM_SEC << SV39_MMU_C9XX_EX_SEC_SHIFT)
+ | (SV39_MMU_C9XX_EX_BUFFER << SV39_MMU_C9XX_EX_BUFFER_SHIFT)
+ | (SV39_MMU_C9XX_EX_CACHE << SV39_MMU_C9XX_EX_CACHE_SHIFT)
+ | ((ULONG)ucRSW << SV39_MMU_RSW_SHIFT);
+ }
+
+ return (ulDescriptor);
+}
+/*********************************************************************************************************
** 函数名称: sv39MmuMemInit
** 功能描述: 初始化 MMU 页表内存区
** 输 入 : pmmuctx mmu 上下文
@@ -787,6 +871,50 @@ static INT sv39MmuFlagSet (PLW_MMU_CONTEXT pmmuctx, addr_t ulAddr, ULONG ulF
return (PX_ERROR);
}
/*********************************************************************************************************
+** 函数名称: c9xxMmuFlagSet
+** 功能描述: 设置指定虚拟地址的 flag 标志
+** 输 入 : pmmuctx mmu 上下文
+** ulAddr 虚拟地址
+** ulFlag flag 标志
+** 输 出 : ERROR CODE
+** 全局变量:
+** 调用模块:
+** 注 意 : 这里不需要清除快表 TLB, 因为 VMM 自身会作此操作.
+*********************************************************************************************************/
+static INT c9xxMmuFlagSet (PLW_MMU_CONTEXT pmmuctx, addr_t ulAddr, ULONG ulFlag)
+{
+ UINT8 ucV, ucR, ucW, ucX, ucU, ucG, ucRSW;
+
+ if (sv39MmuFlags2Attr(ulFlag, &ucV, &ucR, &ucW,
+ &ucX, &ucU, &ucG, &ucRSW) != ERROR_NONE) { /* 无效的映射关系 */
+ return (PX_ERROR);
+ }
+
+ LW_PGD_TRANSENTRY *p_pgdentry = sv39MmuPgdOffset(pmmuctx, ulAddr); /* 获得一级描述符地址 */
+
+ if (p_pgdentry && sv39MmuPgdIsOk(*p_pgdentry)) { /* 一级描述符有效 */
+ LW_PMD_TRANSENTRY *p_pmdentry = sv39MmuPmdOffset(p_pgdentry,
+ ulAddr); /* 获得二级描述符地址 */
+
+ if (sv39MmuPmdIsOk(*p_pmdentry)) { /* 二级描述符有效 */
+ LW_PTE_TRANSENTRY *p_pteentry = sv39MmuPteOffset(p_pmdentry,
+ ulAddr); /* 获得三级描述符地址 */
+ LW_PTE_TRANSENTRY pteentry = *p_pteentry; /* 获得三级描述符 */
+
+ if (sv39MmuPteIsOk(pteentry)) { /* 三级描述符有效 */
+ addr_t ulPhysicalAddr = (addr_t)(SV39_MMU_PA(pteentry));
+
+ *p_pteentry = c9xxMmuBuildPteEntry(ulPhysicalAddr,
+ ucV, ucR, ucW, ucX, ucU, ucG, ucRSW);
+
+ return (ERROR_NONE);
+ }
+ }
+ }
+
+ return (PX_ERROR);
+}
+/*********************************************************************************************************
** 函数名称: sv39MmuMakeTrans
** 功能描述: 设置页面映射关系
** 输 入 : pmmuctx mmu 上下文
@@ -816,6 +944,35 @@ static VOID sv39MmuMakeTrans (PLW_MMU_CONTEXT pmmuctx,
ucV, ucR, ucW, ucX, ucU, ucG, ucRSW);
}
/*********************************************************************************************************
+** 函数名称: c9xxMmuMakeTrans
+** 功能描述: 设置页面映射关系
+** 输 入 : pmmuctx mmu 上下文
+** p_pteentry 对应的页表项
+** ulVirtualAddr 虚拟地址
+** paPhysicalAddr 物理地址
+** ulFlag 对应的类型
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+** 注 意 : 这里不需要清除快表 TLB, 因为 VMM 自身会作此操作.
+*********************************************************************************************************/
+static VOID c9xxMmuMakeTrans (PLW_MMU_CONTEXT pmmuctx,
+ LW_PTE_TRANSENTRY *p_pteentry,
+ addr_t ulVirtualAddr,
+ phys_addr_t paPhysicalAddr,
+ ULONG ulFlag)
+{
+ UINT8 ucV, ucR, ucW, ucX, ucU, ucG, ucRSW;
+
+ if (sv39MmuFlags2Attr(ulFlag, &ucV, &ucR, &ucW,
+ &ucX, &ucU, &ucG, &ucRSW) != ERROR_NONE) { /* 无效的映射关系 */
+ return;
+ }
+
+ *p_pteentry = c9xxMmuBuildPteEntry((addr_t)paPhysicalAddr,
+ ucV, ucR, ucW, ucX, ucU, ucG, ucRSW);
+}
+/*********************************************************************************************************
** 函数名称: sv39MmuMakeCurCtx
** 功能描述: 设置 MMU 当前上下文
** 输 入 : pmmuctx mmu 上下文
@@ -947,13 +1104,49 @@ VOID riscvMmuInit (LW_MMU_OP *pmmuop, CPCHAR pcMachineName)
pmmuop->MMUOP_pfuncPTEPhysGet = sv39MmuPtePhysGet;
pmmuop->MMUOP_pfuncFlagGet = sv39MmuFlagGet;
- pmmuop->MMUOP_pfuncFlagSet = sv39MmuFlagSet;
- pmmuop->MMUOP_pfuncMakeTrans = sv39MmuMakeTrans;
pmmuop->MMUOP_pfuncMakeCurCtx = sv39MmuMakeCurCtx;
pmmuop->MMUOP_pfuncInvalidateTLB = sv39MmuInvTLB;
pmmuop->MMUOP_pfuncSetEnable = sv39MmuEnable;
pmmuop->MMUOP_pfuncSetDisable = sv39MmuDisable;
+
+ if (lib_strcmp(pcMachineName, RISCV_MACHINE_T_HEAD_C9XX) == 0) {
+ pmmuop->MMUOP_pfuncFlagSet = c9xxMmuFlagSet;
+ pmmuop->MMUOP_pfuncMakeTrans = c9xxMmuMakeTrans;
+
+ if ((LW_NCPUS > 1) || C9XX_VM_FORCE_SH) {
+ C9XX_VM_SH = SV39_MMU_C9XX_EX_SHARE;
+ } else {
+ C9XX_VM_SH = SV39_MMU_C9XX_EX_SHARE_NO;
+ }
+ } else {
+ pmmuop->MMUOP_pfuncFlagSet = sv39MmuFlagSet;
+ pmmuop->MMUOP_pfuncMakeTrans = sv39MmuMakeTrans;
+ }
+}
+/*********************************************************************************************************
+** 函数名称: riscvMmuC9xxForceShare
+** 功能描述: MMU 系统强制为 share 模式
+** 输 入 : bEnOrDis 是否使能强制 share 模式, 此函数仅可在 bspKernelInitHook() 中被调用.
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID riscvMmuC9xxForceShare (BOOL bEnOrDis)
+{
+ C9XX_VM_FORCE_SH = bEnOrDis;
+}
+/*********************************************************************************************************
+** 函数名称: riscvMmuC9xxForceSecure
+** 功能描述: MMU 系统强制为 Non-Secure 模式
+** 输 入 : bEnOrDis 是否使能强制 Non-Secure 模式, 此函数仅可在 bspKernelInitHook() 中被调用.
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID riscvMmuC9xxForceSecure (BOOL bEnOrDis)
+{
+ C9XX_VM_SEC = bEnOrDis ? SV39_MMU_C9XX_EX_SEC : SV39_MMU_C9XX_EX_SEC_NO;
}
#endif /* LW_CFG_CPU_WORD_LENGHT == 64*/
diff --git a/SylixOS/arch/riscv/riscv_support.h b/SylixOS/arch/riscv/riscv_support.h
index fb1b3a3..0aadaee 100644
--- a/SylixOS/arch/riscv/riscv_support.h
+++ b/SylixOS/arch/riscv/riscv_support.h
@@ -155,7 +155,8 @@ VOID archBogoMipsLoop(ULONG ulLoop);
RISC-V 处理器 CACHE 操作
*********************************************************************************************************/
-#define RISCV_MACHINE_GENERAL "general" /* General */
+#define RISCV_MACHINE_GENERAL "general" /* General */
+#define RISCV_MACHINE_T_HEAD_C9XX "t_head_c9xx" /* T-Head C906/C910 machine */
#if LW_CFG_CACHE_EN > 0
VOID archCacheReset(CPCHAR pcMachineName);
@@ -170,6 +171,8 @@ VOID archCacheInit(CACHE_MODE uiInstruction, CACHE_MODE uiData, CPCHAR pcM
#if LW_CFG_VMM_EN > 0
VOID archMmuInit(CPCHAR pcMachineName);
+VOID riscvMmuC9xxForceShare(BOOL bEnOrDis);
+VOID riscvMmuC9xxForceSecure(BOOL bEnOrDis);
#define __ARCH_MMU_INIT archMmuInit
#endif /* LW_CFG_VMM_EN > 0 */
diff --git a/SylixOS/arch/x86/common/x64/x64AtomicAsm.S b/SylixOS/arch/x86/common/x64/x64AtomicAsm.S
index 94e3204..24d3774 100644
--- a/SylixOS/arch/x86/common/x64/x64AtomicAsm.S
+++ b/SylixOS/arch/x86/common/x64/x64AtomicAsm.S
@@ -74,7 +74,7 @@ LINE_LABEL(1)
MOVL %EDI , %ECX
ANDL %EAX , %ECX
LOCK
- CMPXCHGL %ECX, (%RSI)
+ CMPXCHGL %ECX , (%RSI)
JNZ 1b
MOVL %ECX , %EAX
RET
@@ -107,7 +107,7 @@ LINE_LABEL(1)
MOVL %EDI , %ECX
ORL %EAX , %ECX
LOCK
- CMPXCHGL %ECX, (%RSI)
+ CMPXCHGL %ECX , (%RSI)
JNZ 1b
MOVL %ECX , %EAX
RET
@@ -123,7 +123,7 @@ LINE_LABEL(1)
MOVL %EDI , %ECX
XORL %EAX , %ECX
LOCK
- CMPXCHGL %ECX, (%RSI)
+ CMPXCHGL %ECX , (%RSI)
JNZ 1b
MOVL %ECX , %EAX
RET
@@ -164,7 +164,7 @@ LINE_LABEL(1)
MOVQ %RDI , %RCX
ANDQ %RAX , %RCX
LOCK
- CMPXCHGQ %RCX, (%RSI)
+ CMPXCHGQ %RCX , (%RSI)
JNZ 1b
MOVQ %RCX , %RAX
RET
@@ -197,7 +197,7 @@ LINE_LABEL(1)
MOVQ %RDI , %RCX
ORQ %RAX , %RCX
LOCK
- CMPXCHGQ %RCX, (%RSI)
+ CMPXCHGQ %RCX , (%RSI)
JNZ 1b
MOVQ %RCX , %RAX
RET
@@ -213,7 +213,7 @@ LINE_LABEL(1)
MOVQ %RDI , %RCX
XORQ %RAX , %RCX
LOCK
- CMPXCHGQ %RCX, (%RSI)
+ CMPXCHGQ %RCX , (%RSI)
JNZ 1b
MOVQ %RCX , %RAX
RET
diff --git a/SylixOS/arch/x86/common/x64/x64Context.c b/SylixOS/arch/x86/common/x64/x64Context.c
index 00ffcf7..ff662eb 100644
--- a/SylixOS/arch/x86/common/x64/x64Context.c
+++ b/SylixOS/arch/x86/common/x64/x64Context.c
@@ -72,8 +72,8 @@ PLW_STACK archTaskCtxCreate (ARCH_REG_CTX *pregctx,
pregctx->REG_ulRBP = (ARCH_REG_T)pfpctx; /* RBP 指针寄存器 */
pregctx->REG_ulRSP = (ARCH_REG_T)pfpctx; /* RSP 指针寄存器 */
- pregctx->REG_ulRIP = 0x0000000000000000;
- pregctx->REG_ulRIP = (ARCH_REG_T)pfuncTask;
+ pregctx->REG_ulError = 0x0000000000000000; /* ERROR CODE */
+ pregctx->REG_ulRIP = (ARCH_REG_T)pfuncTask;
pregctx->REG_ulCS = X86_CS_KERNEL;
pregctx->REG_ulSS = X86_DS_KERNEL;
diff --git a/SylixOS/arch/x86/common/x86Context.c b/SylixOS/arch/x86/common/x86Context.c
index 97c0949..6d55e8d 100644
--- a/SylixOS/arch/x86/common/x86Context.c
+++ b/SylixOS/arch/x86/common/x86Context.c
@@ -67,7 +67,7 @@ PLW_STACK archTaskCtxCreate (ARCH_REG_CTX *pregctx,
pregctx->REG_uiEIP = (ARCH_REG_T)pfuncTask; /* 指令指针寄存器(EIP) */
pregctx->REG_uiCS = X86_CS_KERNEL; /* 代码段寄存器(CS) */
- pregctx->REG_uiSS = X86_DS_KERNEL; /* 代码段寄存器(SS) */
+ pregctx->REG_uiSS = X86_DS_KERNEL; /* 堆栈段寄存器(SS) */
pregctx->REG_uiEFLAGS = X86_EFLAGS_IF; /* 标志寄存器设置中断使能位 */
return ((PLW_STACK)pfpctx);
diff --git a/SylixOS/arch/x86/common/x86Idt.c b/SylixOS/arch/x86/common/x86Idt.c
index 7623410..8ebf082 100644
--- a/SylixOS/arch/x86/common/x86Idt.c
+++ b/SylixOS/arch/x86/common/x86Idt.c
@@ -152,7 +152,7 @@ INT x86IdtSecondaryInit (VOID)
}
/*********************************************************************************************************
** 函数名称: x86IdtSetHandler
-** 功能描述: 设备 IDTE 的处理函数
+** 功能描述: 设置 IDTE 的处理函数
** 输 入 : ucX86Vector x86 异常向量
** ulHandlerAddr 处理函数
** iLowestPriviledge 最低特权级 0..3
diff --git a/SylixOS/arch/x86/fpu/fpusse/x86FpuSse.c b/SylixOS/arch/x86/fpu/fpusse/x86FpuSse.c
index de57c20..6aacce8 100644
--- a/SylixOS/arch/x86/fpu/fpusse/x86FpuSse.c
+++ b/SylixOS/arch/x86/fpu/fpusse/x86FpuSse.c
@@ -468,7 +468,6 @@ VOID x86FpuSseSecondaryInit (CPCHAR pcMachineName, CPCHAR pcFpuName)
}
x86FpuSseInit(); /* 初始化寄存器 */
-
}
#endif /* LW_CFG_CPU_FPU_EN > 0 */
diff --git a/SylixOS/config/cpu/cpu_cfg_arm64.h b/SylixOS/config/cpu/cpu_cfg_arm64.h
index 9236c55..734bb3d 100644
--- a/SylixOS/config/cpu/cpu_cfg_arm64.h
+++ b/SylixOS/config/cpu/cpu_cfg_arm64.h
@@ -63,6 +63,7 @@
LW_CFG_ARM64_PAGE_SHIFT 可配置的值有如下:
12 : 4K Bytes per page.
+ 14 : 16K Bytes per page. (部分处理器支持)
16 : 64K Bytes per page.
*********************************************************************************************************/
diff --git a/SylixOS/config/cpu/cpu_cfg_mips.h b/SylixOS/config/cpu/cpu_cfg_mips.h
index 2c22105..70f8040 100644
--- a/SylixOS/config/cpu/cpu_cfg_mips.h
+++ b/SylixOS/config/cpu/cpu_cfg_mips.h
@@ -103,8 +103,8 @@
#define LW_CFG_MIPS_HAS_CLZ_INSTR 1 /* 是否支持前导零 CLZ 指令 */
#define LW_CFG_MIPS_HAS_SYNC_INSTR 1 /* 是否支持 SYNC 指令 */
#define LW_CFG_MIPS_HAS_MSA_INSTR 0 /* 是否支持 MSA(SIMD) 指令 */
-#if defined(_MIPS_ARCH_MIPS64R2) || defined(_MIPS_ARCH_HR2)
-#define LW_CFG_MIPS_HAS_RDHWR_INSTR 1 /* MIPS64R2 支持 RDHWR 指令 */
+#if defined(_MIPS_ARCH_MIPS64R2) || defined(_MIPS_ARCH_HR2) || defined(_MIPS_ARCH_MIPS32R2)
+#define LW_CFG_MIPS_HAS_RDHWR_INSTR 1 /* MIPS32/64R2 支持 RDHWR 指令 */
#else
#define LW_CFG_MIPS_HAS_RDHWR_INSTR 0 /* 是否支持 RDHWR 指令 */
#endif
diff --git a/SylixOS/fs/rootFs/rootFs.c b/SylixOS/fs/rootFs/rootFs.c
index 24d9fbd..be494e7 100644
--- a/SylixOS/fs/rootFs/rootFs.c
+++ b/SylixOS/fs/rootFs/rootFs.c
@@ -94,7 +94,7 @@ static ssize_t __rootFsReadlink(PLW_DEV_HDR pdevhdr,
/*********************************************************************************************************
** 函数名称: API_RootFsDrvInstall
** 功能描述: 安装 rootfs 文件系统驱动程序
-** 输 入 :
+** 输 入 : NONE
** 输 出 : < 0 表示失败
** 全局变量:
** 调用模块:
@@ -412,9 +412,9 @@ __re_find:
/*********************************************************************************************************
** 函数名称: __rootFsRemove
** 功能描述: root fs remove 操作
-** 输 入 : pdevhdr
+** 输 入 : pdevhdr root fs 设备
** pcName 文件名
-** 输 出 : 驱动相关
+** 输 出 : ERROR CODE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
@@ -495,8 +495,8 @@ static INT __rootFsRemove (PLW_DEV_HDR pdevhdr,
/*********************************************************************************************************
** 函数名称: __rootFsClose
** 功能描述: root fs close 操作
-** 输 入 : pdevhdr
-** 输 出 : 驱动相关
+** 输 入 : pdevhdr root fs 设备
+** 输 出 : ERROR CODE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
@@ -522,10 +522,10 @@ static INT __rootFsClose (LW_DEV_HDR *pdevhdr)
/*********************************************************************************************************
** 函数名称: __rootFsRead
** 功能描述: root fs read 操作
-** 输 入 : pdevhdr
+** 输 入 : pdevhdr root fs 设备
** pcBuffer 接收缓冲区
** stMaxBytes 接收缓冲区大小
-** 输 出 : 驱动相关
+** 输 出 : ERROR CODE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
@@ -539,10 +539,10 @@ static ssize_t __rootFsRead (LW_DEV_HDR *pdevhdr,
/*********************************************************************************************************
** 函数名称: __rootFsWrite
** 功能描述: root fs write 操作
-** 输 入 : pdevhdr
+** 输 入 : pdevhdr root fs 设备
** pcBuffer 缓冲区
** stNBytes 需要写入的数据
-** 输 出 : 驱动相关
+** 输 出 : ERROR CODE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
@@ -556,7 +556,7 @@ static ssize_t __rootFsWrite (LW_DEV_HDR *pdevhdr,
/*********************************************************************************************************
** 函数名称: __rootFsStatGet
** 功能描述: root fs 获得文件状态及属性
-** 输 入 : pdevhdr
+** 输 入 : pdevhdr root fs 设备
** pstat stat 结构
** 输 出 : < 0 表示错误
** 全局变量:
@@ -642,6 +642,7 @@ static INT __rootFsStatGet (LW_DEV_HDR *pdevhdr, struct stat *pstat)
** 函数名称: __rootFsLStatGet
** 功能描述: root fs 获得文件状态及属性 (如果是链接文件则获取连接文件的属性)
** 输 入 : pdevhdr 设备头
+** pcName 设备名称
** pstat stat 结构
** 输 出 : < 0 表示错误
** 全局变量:
@@ -728,7 +729,7 @@ static INT __rootFsLStatGet (LW_DEV_HDR *pdevhdr, PCHAR pcName, struct stat *p
/*********************************************************************************************************
** 函数名称: __rootFsStatfsGet
** 功能描述: root fs 获得文件系统状态及属性
-** 输 入 : pdevhdr
+** 输 入 : pdevhdr 设备头
** pstatfs statfs 结构
** 输 出 : < 0 表示错误
** 全局变量:
@@ -806,7 +807,7 @@ static INT __rootFsStatfsGet (LW_DEV_HDR *pdevhdr, struct statfs *pstatfs)
/*********************************************************************************************************
** 函数名称: __rootFsReadDir
** 功能描述: root fs 获得指定目录信息
-** 输 入 : pdevhdr
+** 输 入 : pdevhdr 设备头
** dir 目录结构
** 输 出 : < 0 表示错误
** 全局变量:
@@ -932,7 +933,7 @@ __scan_over:
/*********************************************************************************************************
** 函数名称: __rootFsChmod
** 功能描述: root fs chmod 操作
-** 输 入 : pdevhdr
+** 输 入 : pdevhdr 设备头
** iMode mode_t
** 输 出 : < 0 表示错误
** 全局变量:
@@ -962,16 +963,16 @@ static INT __rootFsChmod (LW_DEV_HDR *pdevhdr, INT iMode)
/*********************************************************************************************************
** 函数名称: __rootFsIoctl
** 功能描述: root fs ioctl 操作
-** 输 入 : pdevhdr
-** request, 命令
-** arg 命令参数
+** 输 入 : pdevhdr 设备头
+** iRequest 命令
+** lArg 命令参数
** 输 出 : 驱动相关
** 全局变量:
** 调用模块:
*********************************************************************************************************/
static INT __rootFsIoctl (LW_DEV_HDR *pdevhdr,
- INT iRequest,
- LONG lArg)
+ INT iRequest,
+ LONG lArg)
{
switch (iRequest) {
@@ -1020,7 +1021,7 @@ static INT __rootFsIoctl (LW_DEV_HDR *pdevhdr,
/*********************************************************************************************************
** 函数名称: __rootFsSymlink
** 功能描述: root fs symlink 操作
-** 输 入 : pdevhdr
+** 输 入 : pdevhdr 设备头
** pcName 创建的连接文件
** pcLinkDst 链接目标
** 输 出 : < 0 表示错误
diff --git a/SylixOS/include/arch/arm64/arch_mmu.h b/SylixOS/include/arch/arm64/arch_mmu.h
index 7765cfc..5bd3d95 100644
--- a/SylixOS/include/arch/arm64/arch_mmu.h
+++ b/SylixOS/include/arch/arm64/arch_mmu.h
@@ -32,12 +32,12 @@
是否需要内核超过 3 级页表支持
*********************************************************************************************************/
-#if LW_CFG_ARM64_PAGE_SHIFT == 12
+#if (LW_CFG_ARM64_PAGE_SHIFT == 12) || (LW_CFG_ARM64_PAGE_SHIFT == 14)
#define LW_CFG_VMM_PAGE_4L_EN 1 /* 需要 4 级页表支持 */
#elif LW_CFG_ARM64_PAGE_SHIFT == 16
#define LW_CFG_VMM_PAGE_4L_EN 0 /* 不需要 4 级页表支持 */
#else
-#error LW_CFG_VMM_PAGE_SIZE must be (4K, 64K)!
+#error LW_CFG_VMM_PAGE_SIZE must be (4K, 16K, 64K)!
#endif
/*********************************************************************************************************
@@ -50,7 +50,6 @@
#define LW_CFG_VMM_PTE_SHIFT LW_CFG_VMM_PAGE_SHIFT
#define LW_CFG_VMM_PTE_SIZE LW_CFG_VMM_PAGE_SIZE
-#define LW_CFG_VMM_PTE_BLKSIZE LW_CFG_VMM_PAGE_SIZE
/*********************************************************************************************************
* 4K 页大小,采用四级页表
@@ -78,6 +77,31 @@
#define LW_CFG_VMM_PGD_MASK (__CONST64(0x1ff) << LW_CFG_VMM_PGD_SHIFT)
/*********************************************************************************************************
+ * 16K 页大小,采用四级页表
+ *
+ * +------------+------------+------------+------------+------------+
+ * | 47 |46 36|35 25|24 14|13 0|
+ * +----------------------------------------------------------------+
+ * | PGD | PMD | PTS | PTE | OFFSET |
+ * +------------+------------+------------+------------+------------+
+*********************************************************************************************************/
+#elif LW_CFG_ARM64_PAGE_SHIFT == 14
+
+#define LW_CFG_VMM_PTE_MASK (__CONST64(0x7ff) << LW_CFG_VMM_PAGE_SHIFT)
+
+#define LW_CFG_VMM_PTS_SHIFT 25
+#define LW_CFG_VMM_PTS_SIZE (__CONST64(1) << LW_CFG_VMM_PTS_SHIFT)
+#define LW_CFG_VMM_PTS_MASK (__CONST64(0x7ff) << LW_CFG_VMM_PTS_SHIFT)
+
+#define LW_CFG_VMM_PMD_SHIFT 36
+#define LW_CFG_VMM_PMD_SIZE (__CONST64(1) << LW_CFG_VMM_PMD_SHIFT)
+#define LW_CFG_VMM_PMD_MASK (__CONST64(0x7ff) << LW_CFG_VMM_PMD_SHIFT)
+
+#define LW_CFG_VMM_PGD_SHIFT 47
+#define LW_CFG_VMM_PGD_SIZE (__CONST64(1) << LW_CFG_VMM_PGD_SHIFT)
+#define LW_CFG_VMM_PGD_MASK (__CONST64(0x1) << LW_CFG_VMM_PGD_SHIFT)
+
+/*********************************************************************************************************
* 64K 页大小,采用三级页表
*
* +------------+------------+------------+-------------------------+
diff --git a/SylixOS/include/arch/x86/arch_regs32.h b/SylixOS/include/arch/x86/arch_regs32.h
index 8369d93..c73921a 100644
--- a/SylixOS/include/arch/x86/arch_regs32.h
+++ b/SylixOS/include/arch/x86/arch_regs32.h
@@ -84,7 +84,7 @@ struct __ARCH_REG_CTX {
ARCH_REG_T REG_uiCS; /* 代码段寄存器(CS) */
ARCH_REG_T REG_uiEFLAGS; /* 标志寄存器(EFLAGS) */
ARCH_REG_T REG_uiESP; /* 堆栈指针寄存器 */
- ARCH_REG_T REG_uiSS; /* 代码段寄存器(CS) */
+ ARCH_REG_T REG_uiSS; /* 堆栈段寄存器(SS) */
#define REG_ERROR REG_uiError
#define REG_XIP REG_uiEIP
diff --git a/SylixOS/kernel/core/_TimeCvt.c b/SylixOS/kernel/core/_TimeCvt.c
index d30e310..a827e48 100644
--- a/SylixOS/kernel/core/_TimeCvt.c
+++ b/SylixOS/kernel/core/_TimeCvt.c
@@ -228,7 +228,7 @@ static INT64 __timespecTimeoutTick64 (BOOL bRel, const struct timespec *ptv)
return (i64Timeout);
}
/*********************************************************************************************************
-** 函数名称: __timeCvtInit
+** 函数名称: _TimeCvtInit
** 功能描述: 时间转换函数初始化
** 输 入 : NONE
** 输 出 : NONE
diff --git a/SylixOS/kernel/interface/SemaphoreBPend.c b/SylixOS/kernel/interface/SemaphoreBPend.c
index d2325c5..e5856a4 100644
--- a/SylixOS/kernel/interface/SemaphoreBPend.c
+++ b/SylixOS/kernel/interface/SemaphoreBPend.c
@@ -132,10 +132,10 @@ __wait_again:
ptcbCur->TCB_ucWaitTimeout = LW_WAIT_TIME_CLEAR; /* 清空等待时间 */
if (ulTimeout == LW_OPTION_WAIT_INFINITE) { /* 是否是无穷等待 */
- ptcbCur->TCB_ulDelay = 0ul;
- } else {
- ptcbCur->TCB_ulDelay = ulTimeout; /* 设置超时时间 */
- }
+ ptcbCur->TCB_ulDelay = 0ul;
+ } else {
+ ptcbCur->TCB_ulDelay = ulTimeout; /* 设置超时时间 */
+ }
__KERNEL_TIME_GET_IGNIRQ(ulTimeSave, ULONG); /* 记录系统时间 */
if (pevent->EVENT_ulOption & LW_OPTION_WAIT_PRIORITY) { /* 按优先级等待 */
diff --git a/SylixOS/kernel/interface/ThreadAttrBuild.c b/SylixOS/kernel/interface/ThreadAttrBuild.c
index 2d74856..5a0b436 100644
--- a/SylixOS/kernel/interface/ThreadAttrBuild.c
+++ b/SylixOS/kernel/interface/ThreadAttrBuild.c
@@ -98,7 +98,7 @@ LW_CLASS_THREADATTR API_ThreadAttrGet (LW_OBJECT_HANDLE ulId)
ptcb = _K_ptcbTCBIdTable[usIndex]; /* 获得线程控制块 */
threadattr.THREADATTR_pstkLowAddr = ptcb->TCB_pstkStackLowAddr; /* 全部堆栈区低内存起始地址 */
- threadattr.THREADATTR_stStackByteSize = (ptcb->TCB_stStackSize * sizeof(LW_STACK));
+ threadattr.THREADATTR_stStackByteSize = (ptcb->TCB_stStackSize * sizeof(LW_STACK));
/* 全部堆栈区大小(字节) */
threadattr.THREADATTR_ucPriority = ptcb->TCB_ucPriority; /* 线程优先级 */
threadattr.THREADATTR_ulOption = ptcb->TCB_ulOption; /* 任务选项 */
@@ -303,7 +303,7 @@ ULONG API_ThreadAttrSetGuardSize (PLW_CLASS_THREADATTR pthreadattr,
#endif
if (stGuardSize < (ARCH_STK_MIN_WORD_SIZE * sizeof(LW_STACK))) {
- _DebugHandle(__ERRORMESSAGE_LEVEL, "thread attribute pointer invalidate.\r\n");
+ _DebugHandle(__ERRORMESSAGE_LEVEL, "thread attribute guard size invalidate.\r\n");
_ErrorHandle(ERROR_THREAD_STACK_NULL);
return (ERROR_THREAD_STACK_NULL);
}
diff --git a/SylixOS/kernel/interface/ThreadDelete.c b/SylixOS/kernel/interface/ThreadDelete.c
index ceb4fd4..04888f7 100644
--- a/SylixOS/kernel/interface/ThreadDelete.c
+++ b/SylixOS/kernel/interface/ThreadDelete.c
@@ -171,9 +171,9 @@ ULONG __threadDelete (PLW_CLASS_TCB ptcbDel, BOOL bIsInSafe,
iregInterLevel = KN_INT_DISABLE(); /* 关闭中断 */
_K_usThreadCounter--;
- _K_ptcbTCBIdTable[usIndex] = LW_NULL; /* TCB 表清0 */
+ _K_ptcbTCBIdTable[usIndex] = LW_NULL; /* TCB 表清 0 */
- _List_Line_Del(&ptcbDel->TCB_lineManage, &_K_plineTCBHeader); /* 从管理练表中删除 */
+ _List_Line_Del(&ptcbDel->TCB_lineManage, &_K_plineTCBHeader); /* 从管理链表中删除 */
KN_INT_ENABLE(iregInterLevel); /* 打开中断 */
diff --git a/SylixOS/kernel/interface/ugid.c b/SylixOS/kernel/interface/ugid.c
index 3942d0b..8c618f7 100644
--- a/SylixOS/kernel/interface/ugid.c
+++ b/SylixOS/kernel/interface/ugid.c
@@ -191,8 +191,8 @@ uid_t getuid (void)
return (ptcbCur->TCB_uid);
}
/*********************************************************************************************************
-** 函数名称: getuid
-** 功能描述: get current uid
+** 函数名称: setuid
+** 功能描述: set current uid
** 输 入 : uid
** 输 出 : ERROR
** 全局变量:
diff --git a/SylixOS/kernel/show/SemaphoreShow.c b/SylixOS/kernel/show/SemaphoreShow.c
index dd5be4f..a076d50 100644
--- a/SylixOS/kernel/show/SemaphoreShow.c
+++ b/SylixOS/kernel/show/SemaphoreShow.c
@@ -51,7 +51,11 @@ VOID API_SemaphoreShow (LW_OBJECT_HANDLE ulId)
REGISTER UINT16 usIndex;
REGISTER PLW_CLASS_EVENT pevent;
LW_CLASS_EVENT event;
-
+
+#if LW_CFG_SEMRW_EN > 0
+ LW_OBJECT_HANDLE ulOwner = LW_OBJECT_HANDLE_INVALID;
+#endif /* LW_CFG_SEMRW_EN > 0 */
+
BOOL bValue;
ULONG ulValue;
ULONG ulMaxValue;
@@ -117,7 +121,8 @@ VOID API_SemaphoreShow (LW_OBJECT_HANDLE ulId)
&ulRWCnt,
&ulValue,
&ulWValue,
- &ulOption, LW_NULL);
+ &ulOption,
+ &ulOwner);
pcType = "RW";
ulThreadNum = ulValue + ulWValue;
break;
@@ -185,9 +190,9 @@ VOID API_SemaphoreShow (LW_OBJECT_HANDLE ulId)
} else if (ulObjectClass == _OBJECT_SEM_RW) { /* 读写信号量 */
PCHAR pcSafeMode;
- if (bValue == LW_FALSE) {
- API_ThreadGetName(((PLW_CLASS_TCB)(event.EVENT_pvTcbOwn))->TCB_ulId,
- cOwner);
+ if (ulOwner) {
+ API_ThreadGetName(ulOwner, cOwner);
+
} else {
if (ulRWCnt) {
lib_strcpy(cOwner, "READERS");
diff --git a/SylixOS/loader/src/loader.c b/SylixOS/loader/src/loader.c
index b705cfe..0adfda4 100644
--- a/SylixOS/loader/src/loader.c
+++ b/SylixOS/loader/src/loader.c
@@ -1237,7 +1237,7 @@ PVOID API_ModuleSym (PVOID pvModule, CPCHAR pcName)
{
LW_LD_EXEC_MODULE *pmodule = (LW_LD_EXEC_MODULE *)pvModule;
INT iError;
- INT iLayer = 20; /* 最大递归 20 次 */
+ INT iLayer = 20; /* 最大递归 20 次 */
addr_t ulValue = (addr_t)LW_NULL;
if (!pcName) {
diff --git a/SylixOS/loader/src/loader_symbol.c b/SylixOS/loader/src/loader_symbol.c
index 3ee76e8..f2ff7c3 100644
--- a/SylixOS/loader/src/loader_symbol.c
+++ b/SylixOS/loader/src/loader_symbol.c
@@ -95,13 +95,13 @@ INT __moduleVerifyVersion (CPCHAR pcModuleName, CPCHAR pcVersion, ULONG ulTyp
ulModuleOsVersion = __SYLIXOS_MAKEVER(ulMajor, ulMinor, ulRevision);
if (ulType == LW_LD_MOD_TYPE_SO) {
- if (ulModuleOsVersion < ulSoComOldest) { /* SO 不再兼容范围内 */
+ if (ulModuleOsVersion < ulSoComOldest) { /* SO 不在兼容范围内 */
goto __bad_version;
}
} else {
if (ulModuleOsVersion > ulKoComNewest ||
- ulModuleOsVersion < ulKoComOldest) { /* KO 不再兼容范围内 */
+ ulModuleOsVersion < ulKoComOldest) { /* KO 不在兼容范围内 */
goto __bad_version;
}
}
diff --git a/SylixOS/net/lwip/unix/af_unix.c b/SylixOS/net/lwip/unix/af_unix.c
index 5e76da2..643f188 100644
--- a/SylixOS/net/lwip/unix/af_unix.c
+++ b/SylixOS/net/lwip/unix/af_unix.c
@@ -1239,7 +1239,7 @@ INT unix_bind (AF_UNIX_T *pafunix, const struct sockaddr *name, socklen_t name
__AF_UNIX_LOCK();
if (!pafunix->UNIX_tempmode.enable) {
- API_IosFdGetName(iFd, cPath, MAX_FILENAME_LENGTH); /* 获得完整路径 */
+ API_IosFdGetName(iFd, cPath, MAX_FILENAME_LENGTH); /* 获得完整路径 */
}
iSockType = __AF_UNIX_TYPE(pafunix);
diff --git a/SylixOS/system/device/sdcard/host/sdhci.h b/SylixOS/system/device/sdcard/host/sdhci.h
index 6b43cc6..ac192a0 100644
--- a/SylixOS/system/device/sdcard/host/sdhci.h
+++ b/SylixOS/system/device/sdcard/host/sdhci.h
@@ -716,7 +716,7 @@ struct _sdhci_quirk_op {
VOID (*SDHCIQOP_pfuncPioXferHook) /* 平台相关 PIO 传输 HOOK */
(
PLW_SDHCI_HOST_ATTR psdhcihostattr,
- BOOL bIsRead
+ BOOL bIsRead
);
INT (*SDHCIQOP_pfuncCustomIoCtl) /* 自定义总线控制操作 */
( /* 如果返回值为-ENOSYS */
diff --git a/SylixOS/system/include/s_dirent.h b/SylixOS/system/include/s_dirent.h
index 4ceaf47..3eab474 100644
--- a/SylixOS/system/include/s_dirent.h
+++ b/SylixOS/system/include/s_dirent.h
@@ -30,14 +30,14 @@
*********************************************************************************************************/
struct dirent {
- char d_name[NAME_MAX + 1]; /* 文件名 */
+ char d_name[NAME_MAX + 1]; /* 文件名 */
unsigned char d_type; /* 文件类型 (可能为 DT_UNKNOWN)*/
char d_shortname[13]; /* fat 短文件名 (可能不存在) */
PVOID *d_resv; /* 保留 */
};
struct dirent64 { /* same as `struct dirent' */
- char d_name[NAME_MAX + 1]; /* 文件名 */
+ char d_name[NAME_MAX + 1]; /* 文件名 */
unsigned char d_type; /* 文件类型 (可能为 DT_UNKNOWN)*/
char d_shortname[13]; /* fat 短文件名 (可能不存在) */
PVOID *d_resv; /* 保留 */
diff --git a/SylixOS/vpmpdm/arch/csky/memcpy.S b/SylixOS/vpmpdm/arch/csky/memcpy.S
index 56f4be2..367e24d 100644
--- a/SylixOS/vpmpdm/arch/csky/memcpy.S
+++ b/SylixOS/vpmpdm/arch/csky/memcpy.S
@@ -4,9 +4,7 @@
* Licensed under the LGPL v2.1 or later, see the file COPYING.LIB
* in this tarball.
*/
-
#include "macro.S"
-
/*
* memcpy implement.
*/
@@ -14,41 +12,59 @@
.align 4
.type __memcpy, @function
__memcpy:
+ mov r9, r0
+ /* Copy from front to back. */
+ /* Test if dest or src is not 4 bytes aligned. */
+ or r4, r0, r1
+ andi r4, r4, 3
+ cmpnei r4, 0
+ movi r5, 0
+ bf .L_dest_aligned
/* Test if len less than 4 bytes. */
- mov r12, r0
cmplti r2, 4
+ mov r5, r2
+ /* copy all by byte. */
bt .L_copy_by_byte
-
- andi r13, r0, 3
- movi r19, 4
- /* Test if dest is not 4 bytes aligned. */
- bnez r13, .L_dest_not_aligned
- /* Hardware can handle unaligned access directly. */
+ /* Test if dest and src both are not 4 bytes aligned. */
+ xor r4, r0, r1
+ andi r4, r4, 3
+ cmpnei r4, 0
+ mov r5, r2
+ /* copy all by byte. */
+ bt .L_copy_by_byte
+ /* copy unaligned part by byte. */
+ andi r5, r0, 3
+ movi r4, 4
+ subu r5, r4, r5
+ bf .L_copy_by_byte
+ /* 4 bytes aligned. */
.L_dest_aligned:
+ subu r2, r5
+ bez r2, .L_return
/* If dest is aligned, then copy. */
- zext r18, r2, 31, 4
+ zext r7, r2, 31, 4
/* Test if len less than 16 bytes. */
- bez r18, .L_len_less_16bytes
- movi r19, 0
+ bez r7, .L_len_less_16bytes
+ movi r8, 0
LABLE_ALIGN
.L_len_larger_16bytes:
#if defined(__CSKY_VDSPV2__)
- vldx.8 vr0, (r1), r19
- PRE_BNEZAD (r18)
+ vldx.8 vr0, (r1), r8
+ PRE_BNEZAD (r7)
addi r1, 16
- vstx.8 vr0, (r0), r19
+ vstx.8 vr0, (r0), r8
addi r0, 16
#elif defined(__CK860__)
- ldw r3, (r1, 0)
- stw r3, (r0, 0)
- ldw r3, (r1, 4)
- stw r3, (r0, 4)
- ldw r3, (r1, 8)
- stw r3, (r0, 8)
- ldw r3, (r1, 12)
+ ldw r6, (r1, 0)
+ stw r6, (r0, 0)
+ ldw r6, (r1, 4)
+ stw r6, (r0, 4)
+ ldw r6, (r1, 8)
+ stw r6, (r0, 8)
+ ldw r6, (r1, 12)
addi r1, 16
- stw r3, (r0, 12)
+ stw r6, (r0, 12)
addi r0, 16
#else
ldw r20, (r1, 0)
@@ -59,58 +75,46 @@ __memcpy:
stw r21, (r0, 4)
stw r22, (r0, 8)
stw r23, (r0, 12)
- PRE_BNEZAD (r18)
+ PRE_BNEZAD (r7)
addi r1, 16
addi r0, 16
#endif
- BNEZAD (r18, .L_len_larger_16bytes)
+ BNEZAD (r7, .L_len_larger_16bytes)
.L_len_less_16bytes:
- zext r18, r2, 3, 2
- bez r18, .L_copy_by_byte
+ zext r7, r2, 3, 2
+ zext r5, r2, 1, 0
+ bez r7, .L_copy_by_byte_to_end
.L_len_less_16bytes_loop:
- ldw r3, (r1, 0)
- PRE_BNEZAD (r18)
+ ldw r6, (r1, 0)
+ PRE_BNEZAD (r7)
addi r1, 4
- stw r3, (r0, 0)
+ stw r6, (r0, 0)
addi r0, 4
- BNEZAD (r18, .L_len_less_16bytes_loop)
-
- /* Test if len less than 4 bytes. */
+ BNEZAD (r7, .L_len_less_16bytes_loop)
+
+.L_copy_by_byte_to_end:
+ mov r7, r5
+ cmpnei r7, 0
+ bt .L_copy_by_byte_loop
+ bf .L_return
+ /* copy all by byte. */
+ /* copy unaligned part by byte. */
.L_copy_by_byte:
- zext r18, r2, 1, 0
- bez r18, .L_return
+ mov r7, r5
+ bez r7, .L_dest_aligned
.L_copy_by_byte_loop:
- ldb r3, (r1, 0)
- PRE_BNEZAD (r18)
+ ldb r6, (r1, 0)
+ PRE_BNEZAD (r7)
addi r1, 1
- stb r3, (r0, 0)
+ stb r6, (r0, 0)
addi r0, 1
- BNEZAD (r18, .L_copy_by_byte_loop)
-
+ BNEZAD (r7, .L_copy_by_byte_loop)
.L_return:
- mov r0, r12
+ mov r0, r9
+ pop r4-r11
rts
- /* If dest is not aligned, just copying some bytes makes the dest
- align. */
-
-.L_dest_not_aligned:
- sub r13, r19, r13
- sub r2, r13
-.L_dest_not_aligned_loop:
- /* Makes the dest align. */
- ldb r3, (r1, 0)
- PRE_BNEZAD (r13)
- addi r1, 1
- stb r3, (r0, 0)
- addi r0, 1
- BNEZAD (r13, .L_dest_not_aligned_loop)
- cmplti r2, 4
- bt .L_copy_by_byte
- /* Check whether the src is aligned. */
- br .L_dest_aligned
-
.size __memcpy,.-__memcpy
/*
@@ -124,28 +128,55 @@ __memcpy:
.align 4
memcpy:
memmove:
- subu r3, r0, r1
- cmphs r3, r2
+ push r4-r11
+ mov r9, r0
+ /* Test if len equal to 0. */
+ cmpnei r2, 0
+ bf .L_return_m
+ /* Test if dest equal to src. */
+ cmpne r0, r1
+ bf .L_return_m
+ /* Select cpoy direction. */
+ cmphs r1, r0
bt __memcpy
- mov r12, r0
+ /* Copy from back to front. */
addu r0, r0, r2
addu r1, r1, r2
+ /* Test if dest or src is not 4 bytes aligned. */
+ or r4, r0, r1
+ andi r4, r4, 3
+ cmpnei r4, 0
+ movi r5, 0
+ bf .L_dest_aligned_m
/* Test if len less than 4 bytes. */
cmplti r2, 4
+ mov r5, r2
+ /* copy all by byte. */
+ bt .L_copy_by_byte_m
+ /* Test if dest and src both are not 4 bytes aligned. */
+ xor r4, r0, r1
+ andi r4, r4, 3
+ cmpnei r4, 0
+ mov r5, r2
+ /* copy all by byte. */
bt .L_copy_by_byte_m
+ /* copy unaligned part by byte. */
+ andi r5, r0, 3
+ movi r4, 4
+ subu r5, r4, r5
+ bf .L_copy_by_byte_m
- andi r13, r0, 3
- /* Test if dest is not 4 bytes aligned. */
- bnez r13, .L_dest_not_aligned_m
- /* Hardware can handle unaligned access directly. */
+ /* 4 bytes aligned. */
.L_dest_aligned_m:
+ subu r2, r5
+ bez r2, .L_return_m
/* If dest is aligned, then copy. */
- zext r18, r2, 31, 4
+ zext r7, r2, 31, 4
/* Test if len less than 16 bytes. */
- bez r18, .L_len_less_16bytes_m
- movi r19, 0
+ bez r7, .L_len_less_16bytes_m
+ movi r8, 0
/* len > 16 bytes */
LABLE_ALIGN
@@ -153,18 +184,18 @@ memmove:
subi r1, 16
subi r0, 16
#if defined(__CSKY_VDSPV2__)
- vldx.8 vr0, (r1), r19
- PRE_BNEZAD (r18)
- vstx.8 vr0, (r0), r19
+ vldx.8 vr0, (r1), r8
+ PRE_BNEZAD (r7)
+ vstx.8 vr0, (r0), r8
#elif defined(__CK860__)
- ldw r3, (r1, 12)
- stw r3, (r0, 12)
- ldw r3, (r1, 8)
- stw r3, (r0, 8)
- ldw r3, (r1, 4)
- stw r3, (r0, 4)
- ldw r3, (r1, 0)
- stw r3, (r0, 0)
+ ldw r6, (r1, 12)
+ stw r6, (r0, 12)
+ ldw r6, (r1, 8)
+ stw r6, (r0, 8)
+ ldw r6, (r1, 4)
+ stw r6, (r0, 4)
+ ldw r6, (r1, 0)
+ stw r6, (r0, 0)
#else
ldw r20, (r1, 0)
ldw r21, (r1, 4)
@@ -174,53 +205,43 @@ memmove:
stw r21, (r0, 4)
stw r22, (r0, 8)
stw r23, (r0, 12)
- PRE_BNEZAD (r18)
+ PRE_BNEZAD (r7)
#endif
- BNEZAD (r18, .L_len_larger_16bytes_m)
+ BNEZAD (r7, .L_len_larger_16bytes_m)
.L_len_less_16bytes_m:
- zext r18, r2, 3, 2
- bez r18, .L_copy_by_byte_m
+ zext r7, r2, 3, 2
+ zext r5, r2, 1, 0
+ bez r7, .L_copy_by_byte_to_end_m
.L_len_less_16bytes_loop_m:
subi r1, 4
subi r0, 4
- ldw r3, (r1, 0)
- PRE_BNEZAD (r18)
- stw r3, (r0, 0)
- BNEZAD (r18, .L_len_less_16bytes_loop_m)
-
- /* Test if len less than 4 bytes. */
+ ldw r6, (r1, 0)
+ PRE_BNEZAD (r7)
+ stw r6, (r0, 0)
+ BNEZAD (r7, .L_len_less_16bytes_loop_m)
+
+.L_copy_by_byte_to_end_m:
+ mov r7, r5
+ cmpnei r7, 0
+ bt .L_copy_by_byte_loop_m
+ bf .L_return_m
+ /* copy all by byte. */
+ /* copy unaligned part by byte. */
.L_copy_by_byte_m:
- zext r18, r2, 1, 0
- bez r18, .L_return_m
+ mov r7, r5
+ bez r7, .L_dest_aligned
.L_copy_by_byte_loop_m:
subi r1, 1
subi r0, 1
- ldb r3, (r1, 0)
- PRE_BNEZAD (r18)
- stb r3, (r0, 0)
- BNEZAD (r18, .L_copy_by_byte_loop_m)
+ ldb r6, (r1, 0)
+ PRE_BNEZAD (r7)
+ stb r6, (r0, 0)
+ BNEZAD (r7, .L_copy_by_byte_loop_m)
.L_return_m:
- mov r0, r12
+ mov r0, r9
+ pop r4-r11
rts
-
- /* If dest is not aligned, just copy some bytes makes the dest
- align. */
-.L_dest_not_aligned_m:
- sub r2, r13
-.L_dest_not_aligned_loop_m:
- subi r1, 1
- subi r0, 1
- /* Makes the dest align. */
- ldb r3, (r1, 0)
- PRE_BNEZAD (r13)
- stb r3, (r0, 0)
- BNEZAD (r13, .L_dest_not_aligned_loop_m)
- cmplti r2, 4
- bt .L_copy_by_byte_m
- /* Check whether the src is aligned. */
- br .L_dest_aligned_m
-
.size memmove,.-memmove
.size memcpy,.-memcpy
diff --git a/libsylixos.mk b/libsylixos.mk
index 19bdd43..9ba9d52 100644
--- a/libsylixos.mk
+++ b/libsylixos.mk
@@ -127,6 +127,7 @@ SylixOS/arch/arm64/fpu/arm64Fpu.c \
SylixOS/arch/arm64/mm/cache/arm64Cache.c \
SylixOS/arch/arm64/mm/cache/arm64CacheAsm.S \
SylixOS/arch/arm64/mm/mmu/arm64Mmu4K.c \
+SylixOS/arch/arm64/mm/mmu/arm64Mmu16K.c \
SylixOS/arch/arm64/mm/mmu/arm64Mmu64K.c \
SylixOS/arch/arm64/mm/mmu/arm64MmuAsm.S \
SylixOS/arch/arm64/mm/arm64Cache.c \