summaryrefslogtreecommitdiffstatsabout
diff options
context:
space:
mode:
authorHanhui <sylixos@gmail.com>2019-07-15 14:36:27 (GMT)
committer Hanhui <sylixos@gmail.com>2019-07-15 14:36:27 (GMT)
commit0a2182cba1b8794a8f03e315dcd8235d36e41d16 (patch)
tree9308fd12d662c7a0c5abb524a1b6b2215466647e
parent504ba40e3b00d12d871367f9514a93c7b8adde1c (diff)
downloadAIC-OS-0a2182cba1b8794a8f03e315dcd8235d36e41d16.zip
Add C-SKY 803 support.
-rw-r--r--SylixOS/arch/csky/backtrace/cskyBacktrace.c26
-rw-r--r--SylixOS/arch/csky/common/ck803/cskyContextCK803.c324
-rw-r--r--SylixOS/arch/csky/common/ck803/cskyContextCK803Asm.S189
-rw-r--r--SylixOS/arch/csky/common/ck803/cskyContextCK803Asm.h68
-rw-r--r--SylixOS/arch/csky/common/ck803/cskyExcCK803.c479
-rw-r--r--SylixOS/arch/csky/common/ck803/cskyExcCK803Asm.S419
-rw-r--r--SylixOS/arch/csky/common/cskyContext.c6
-rw-r--r--SylixOS/arch/csky/common/cskyContextAsm.S4
-rw-r--r--SylixOS/arch/csky/common/cskyExc.c6
-rw-r--r--SylixOS/arch/csky/common/cskyExcAsm.S6
-rw-r--r--SylixOS/arch/csky/common/cskyLibAsm.S8
-rw-r--r--SylixOS/arch/csky/csky_support.h8
-rw-r--r--SylixOS/arch/csky/fpu/fpu/cskyVfp.c5
-rw-r--r--SylixOS/arch/csky/fpu/fpu/cskyVfpAsm.S103
-rw-r--r--SylixOS/arch/csky/mm/cache/ck803/cskyCacheCK803.c992
-rw-r--r--SylixOS/arch/csky/mm/cache/ck803/cskyCacheCK803.h61
-rw-r--r--SylixOS/arch/csky/mm/cache/cskyCache.c5
-rw-r--r--SylixOS/arch/csky/mm/cache/cskyCacheAsm.S3
-rw-r--r--SylixOS/arch/csky/mm/cskyMpu.c45
-rw-r--r--SylixOS/arch/csky/mm/mmu/cskyMmu.c5
-rw-r--r--SylixOS/arch/csky/mm/mmu/cskyMmuAsm.S3
-rw-r--r--SylixOS/arch/csky/mm/mpu/cskyMpu.c210
-rw-r--r--SylixOS/arch/csky/mm/mpu/cskyMpu.h33
-rw-r--r--SylixOS/config/cpu/cpu_cfg_csky.h11
-rw-r--r--SylixOS/fs/diskPartition/diskPartition.c2
-rw-r--r--SylixOS/fs/tpsFs/tpsfs_sylixos.c4
-rw-r--r--SylixOS/include/arch/arch_inc.h1
-rw-r--r--SylixOS/include/arch/csky/arch_def.h2
-rw-r--r--SylixOS/include/arch/csky/arch_float.h21
-rw-r--r--SylixOS/include/arch/csky/arch_mpu.h89
-rw-r--r--SylixOS/include/arch/csky/arch_regs.h14
-rw-r--r--SylixOS/include/arch/csky/asm/archprob.h36
-rw-r--r--SylixOS/include/arch/csky/asm/assembler.h1
-rw-r--r--SylixOS/include/arch/csky/ck803/arch_regs.h92
-rw-r--r--SylixOS/include/arch/csky/inc/cskyregs.h64
-rw-r--r--SylixOS/include/net/if.h28
-rw-r--r--SylixOS/net/lwip/lwip_ifctl.c72
-rw-r--r--SylixOS/net/lwip/lwip_socket.c2
-rw-r--r--SylixOS/net/lwip/route/af_route.c31
-rw-r--r--SylixOS/vpmpdm/dlmalloc/dl_malloc.c13
-rw-r--r--libsylixos.mk7
41 files changed, 3443 insertions, 55 deletions
diff --git a/SylixOS/arch/csky/backtrace/cskyBacktrace.c b/SylixOS/arch/csky/backtrace/cskyBacktrace.c
index 9f862b7..c0b7e4c 100644
--- a/SylixOS/arch/csky/backtrace/cskyBacktrace.c
+++ b/SylixOS/arch/csky/backtrace/cskyBacktrace.c
@@ -63,19 +63,19 @@ static int csky_get_insn (unsigned long addr, unsigned int *insn)
return (2);
}
}
- /********************************************************************************************************
- ** 函数名称: csky_analyze_prologue
- ** 功能描述: 分析堆栈
- ** 输 入 : start_pc 起始地址
- ** limit_pc 结束地址
- ** r15_offset r15 偏移
- ** r8_offset r8 偏移
- ** subi_len sp 移动大小
- ** subi2_len sp 第二次移动大小
- ** 输 出 : NONE
- ** 全局变量:
- ** 调用模块:
- ********************************************************************************************************/
+/*********************************************************************************************************
+** 函数名称: csky_analyze_prologue
+** 功能描述: 分析堆栈
+** 输 入 : start_pc 起始地址
+** limit_pc 结束地址
+** r15_offset r15 偏移
+** r8_offset r8 偏移
+** subi_len sp 移动大小
+** subi2_len sp 第二次移动大小
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
static void csky_analyze_prologue (unsigned long start_pc, unsigned long limit_pc,
unsigned long *r15_offset, unsigned long *r8_offset,
unsigned long *subi_len, unsigned long *subi2_len)
diff --git a/SylixOS/arch/csky/common/ck803/cskyContextCK803.c b/SylixOS/arch/csky/common/ck803/cskyContextCK803.c
new file mode 100644
index 0000000..e030e46
--- /dev/null
+++ b/SylixOS/arch/csky/common/ck803/cskyContextCK803.c
@@ -0,0 +1,324 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM) LW : long wing
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: cskyContextCK803.c
+**
+** 创 建 人: Wang.Xuan (王翾)
+**
+** 文件创建日期: 2018 年 11 月 12 日
+**
+** 描 述: C-SKY CK803 体系架构上下文处理.
+*********************************************************************************************************/
+#define __SYLIXOS_STDIO
+#define __SYLIXOS_KERNEL
+#include "SylixOS.h"
+/*********************************************************************************************************
+ C-SKY 体系架构
+*********************************************************************************************************/
+#if defined(__SYLIXOS_CSKY_ARCH_CK803__)
+/*********************************************************************************************************
+** 函数名称: archTaskCtxCreate
+** 功能描述: 创建任务上下文
+** 输 入 : pregctx 寄存器上下文
+** pfuncTask 任务入口
+** pvArg 入口参数
+** ptcb 任务控制块
+** pstkTop 初始化堆栈起点
+** ulOpt 任务创建选项
+** 输 出 : 初始化堆栈结束点
+** 全局变量:
+** 调用模块:
+** 注 意 : 堆栈从高地址向低地址增长.
+*********************************************************************************************************/
+PLW_STACK archTaskCtxCreate (ARCH_REG_CTX *pregctx,
+ PTHREAD_START_ROUTINE pfuncTask,
+ PVOID pvArg,
+ PLW_CLASS_TCB ptcb,
+ PLW_STACK pstkTop,
+ ULONG ulOpt)
+{
+ ARCH_FP_CTX *pfpctx;
+ ARCH_REG_T ulPsr;
+ INT i;
+
+ pstkTop = (PLW_STACK)ROUND_DOWN(pstkTop, ARCH_STK_ALIGN_SIZE); /* 保证出栈后 SP 8 字节对齐 */
+
+ pfpctx = (ARCH_FP_CTX *)((PCHAR)pstkTop - sizeof(ARCH_FP_CTX));
+
+ /*
+ * 初始化寄存器上下文
+ */
+ for (i = 0; i < ARCH_GREG_NR; i++) {
+ pregctx->REG_ulReg[i] = i;
+ }
+
+ ulPsr = archGetPSR(); /* 获得当前的 PSR 寄存器 */
+ ulPsr |= bspIntInitEnableStatus() | M_PSR_IE | M_PSR_EE; /* 使能中断和异常 */
+
+ pregctx->REG_ulReg[REG_A0] = (ARCH_REG_T)pvArg;
+ pregctx->REG_ulReg[REG_RA] = (ARCH_REG_T)0x0;
+ pregctx->REG_ulReg[REG_SP] = (ARCH_REG_T)pfpctx;
+
+ pregctx->REG_ulPsr = (ARCH_REG_T)ulPsr;
+ pregctx->REG_ulPc = (ARCH_REG_T)pfuncTask;
+
+ return ((PLW_STACK)pfpctx);
+}
+/*********************************************************************************************************
+** 函数名称: archTaskCtxSetFp
+** 功能描述: 设置任务上下文栈帧 (用于 backtrace 回溯, 详情请见 backtrace 相关文件)
+** 输 入 : pstkDest 目的 stack frame
+** pregctxDest 目的寄存器上下文
+** pregctxSrc 源寄存器上下文
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID archTaskCtxSetFp (PLW_STACK pstkDest,
+ ARCH_REG_CTX *pregctxDest,
+ const ARCH_REG_CTX *pregctxSrc)
+{
+ pregctxDest->REG_ulReg[REG_FP] = (ARCH_REG_T)pregctxSrc->REG_ulReg[REG_SP];
+ pregctxDest->REG_ulReg[REG_RA] = (ARCH_REG_T)pregctxSrc->REG_ulPc;
+}
+/*********************************************************************************************************
+** 函数名称: archTaskRegsGet
+** 功能描述: 获取寄存器上下文
+** 输 入 : pregctx 寄存器上下文
+** pregSp SP 指针
+** 输 出 : 寄存器上下文
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+ARCH_REG_CTX *archTaskRegsGet (ARCH_REG_CTX *pregctx, ARCH_REG_T *pregSp)
+{
+ *pregSp = pregctx->REG_ulReg[REG_SP];
+
+ return (pregctx);
+}
+/*********************************************************************************************************
+** 函数名称: archTaskRegsSet
+** 功能描述: 设置寄存器上下文
+** 输 入 : pregctxDest 目的寄存器上下文
+** pregctxSrc 源寄存器上下文
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID archTaskRegsSet (ARCH_REG_CTX *pregctxDest, const ARCH_REG_CTX *pregctxSrc)
+{
+ pregctxDest->REG_ulReg[0] = pregctxSrc->REG_ulReg[0]; /* SP 不设置, 保持原值 */
+ pregctxDest->REG_ulReg[1] = pregctxSrc->REG_ulReg[1];
+ pregctxDest->REG_ulReg[2] = pregctxSrc->REG_ulReg[2];
+ pregctxDest->REG_ulReg[3] = pregctxSrc->REG_ulReg[3];
+ pregctxDest->REG_ulReg[4] = pregctxSrc->REG_ulReg[4];
+ pregctxDest->REG_ulReg[5] = pregctxSrc->REG_ulReg[5];
+ pregctxDest->REG_ulReg[6] = pregctxSrc->REG_ulReg[6];
+ pregctxDest->REG_ulReg[7] = pregctxSrc->REG_ulReg[7];
+ pregctxDest->REG_ulReg[8] = pregctxSrc->REG_ulReg[8];
+ pregctxDest->REG_ulReg[9] = pregctxSrc->REG_ulReg[9];
+ pregctxDest->REG_ulReg[10] = pregctxSrc->REG_ulReg[10];
+ pregctxDest->REG_ulReg[11] = pregctxSrc->REG_ulReg[11];
+ pregctxDest->REG_ulReg[12] = pregctxSrc->REG_ulReg[12];
+ pregctxDest->REG_ulReg[13] = pregctxSrc->REG_ulReg[13];
+ pregctxDest->REG_ulReg[14] = pregctxSrc->REG_ulReg[14];
+ pregctxDest->REG_ulReg[15] = pregctxSrc->REG_ulReg[15];
+ pregctxDest->REG_ulReg[16] = pregctxSrc->REG_ulReg[16]; /* R28 通用目的寄存器 */
+
+ pregctxDest->REG_ulPsr = pregctxSrc->REG_ulPsr; /* SPR 寄存器 */
+ pregctxDest->REG_ulPc = pregctxSrc->REG_ulPc; /* 程序计数器寄存器 */
+}
+/*********************************************************************************************************
+** 函数名称: archTaskCtxShow
+** 功能描述: 打印任务上下文
+** 输 入 : iFd 文件描述符
+ pregctx 寄存器上下文
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+#if LW_CFG_DEVICE_EN > 0
+
+VOID archTaskCtxShow (INT iFd, const ARCH_REG_CTX *pregctx)
+{
+ ARCH_REG_T ulPsr = pregctx->REG_ulPsr;
+
+ if (iFd >= 0) {
+#define LX_FMT "0x%08x"
+
+ fdprintf(iFd, "\n");
+
+ fdprintf(iFd, "PC = "LX_FMT"\n", pregctx->REG_ulPc);
+
+ fdprintf(iFd, "R0(A0) = "LX_FMT"\n", pregctx->REG_ulReg[0]);
+ fdprintf(iFd, "R1(A1) = "LX_FMT"\n", pregctx->REG_ulReg[1]);
+ fdprintf(iFd, "R2(A2) = "LX_FMT"\n", pregctx->REG_ulReg[2]);
+ fdprintf(iFd, "R3(A3) = "LX_FMT"\n", pregctx->REG_ulReg[3]);
+ fdprintf(iFd, "R4 = "LX_FMT"\n", pregctx->REG_ulReg[4]);
+ fdprintf(iFd, "R5 = "LX_FMT"\n", pregctx->REG_ulReg[5]);
+ fdprintf(iFd, "R6 = "LX_FMT"\n", pregctx->REG_ulReg[6]);
+ fdprintf(iFd, "R7 = "LX_FMT"\n", pregctx->REG_ulReg[7]);
+ fdprintf(iFd, "R8 = "LX_FMT"\n", pregctx->REG_ulReg[8]);
+ fdprintf(iFd, "R9 = "LX_FMT"\n", pregctx->REG_ulReg[9]);
+ fdprintf(iFd, "R10 = "LX_FMT"\n", pregctx->REG_ulReg[10]);
+ fdprintf(iFd, "R11 = "LX_FMT"\n", pregctx->REG_ulReg[11]);
+ fdprintf(iFd, "R12 = "LX_FMT"\n", pregctx->REG_ulReg[12]);
+ fdprintf(iFd, "R13 = "LX_FMT"\n", pregctx->REG_ulReg[13]);
+ fdprintf(iFd, "R14(SP) = "LX_FMT"\n", pregctx->REG_ulReg[14]);
+ fdprintf(iFd, "R15 = "LX_FMT"\n", pregctx->REG_ulReg[15]);
+ fdprintf(iFd, "R28 = "LX_FMT"\n", pregctx->REG_ulReg[16]);
+
+ fdprintf(iFd, "PSR Status Register:\n");
+ fdprintf(iFd, "S = %d ", (ulPsr & M_PSR_S) >> S_PSR_S);
+ fdprintf(iFd, "MM = %d ", (ulPsr & M_PSR_MM) >> S_PSR_MM);
+ fdprintf(iFd, "EE = %d\n", (ulPsr & M_PSR_EE) >> S_PSR_EE);
+ fdprintf(iFd, "IC = %d ", (ulPsr & M_PSR_IC) >> S_PSR_IC);
+ fdprintf(iFd, "IE = %d\n", (ulPsr & M_PSR_IE) >> S_PSR_IE);
+ fdprintf(iFd, "C = %d\n", (ulPsr & M_PSR_C) >> S_PSR_C);
+
+#undef LX_FMT
+ } else {
+ archTaskCtxPrint(LW_NULL, 0, pregctx);
+ }
+}
+
+#endif /* LW_CFG_DEVICE_EN > 0 */
+/*********************************************************************************************************
+** 函数名称: archTaskCtxPrint
+** 功能描述: 直接打印任务上下文
+** 输 入 : pvBuffer 内存缓冲区 (NULL, 表示直接打印)
+** stSize 缓冲大小
+** pregctx 寄存器上下文
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID archTaskCtxPrint (PVOID pvBuffer, size_t stSize, const ARCH_REG_CTX *pregctx)
+{
+ ARCH_REG_T ulPsr = pregctx->REG_ulPsr;
+
+ if (pvBuffer && stSize) {
+#define LX_FMT "0x%08x"
+
+ size_t stOft = 0;
+
+ stOft = bnprintf(pvBuffer, stSize, stOft, "PC = "LX_FMT"\n", pregctx->REG_ulPc);
+
+ stOft = bnprintf(pvBuffer, stSize, stOft, "R0(A0) = "LX_FMT"\n", pregctx->REG_ulReg[0]);
+ stOft = bnprintf(pvBuffer, stSize, stOft, "R1(A1) = "LX_FMT"\n", pregctx->REG_ulReg[1]);
+ stOft = bnprintf(pvBuffer, stSize, stOft, "R2(A2) = "LX_FMT"\n", pregctx->REG_ulReg[2]);
+ stOft = bnprintf(pvBuffer, stSize, stOft, "R3(A3) = "LX_FMT"\n", pregctx->REG_ulReg[3]);
+ stOft = bnprintf(pvBuffer, stSize, stOft, "R4 = "LX_FMT"\n", pregctx->REG_ulReg[4]);
+ stOft = bnprintf(pvBuffer, stSize, stOft, "R5 = "LX_FMT"\n", pregctx->REG_ulReg[5]);
+ stOft = bnprintf(pvBuffer, stSize, stOft, "R6 = "LX_FMT"\n", pregctx->REG_ulReg[6]);
+ stOft = bnprintf(pvBuffer, stSize, stOft, "R7 = "LX_FMT"\n", pregctx->REG_ulReg[7]);
+ stOft = bnprintf(pvBuffer, stSize, stOft, "R8 = "LX_FMT"\n", pregctx->REG_ulReg[8]);
+ stOft = bnprintf(pvBuffer, stSize, stOft, "R9 = "LX_FMT"\n", pregctx->REG_ulReg[9]);
+ stOft = bnprintf(pvBuffer, stSize, stOft, "R10 = "LX_FMT"\n", pregctx->REG_ulReg[10]);
+ stOft = bnprintf(pvBuffer, stSize, stOft, "R11 = "LX_FMT"\n", pregctx->REG_ulReg[11]);
+ stOft = bnprintf(pvBuffer, stSize, stOft, "R12 = "LX_FMT"\n", pregctx->REG_ulReg[12]);
+ stOft = bnprintf(pvBuffer, stSize, stOft, "R13 = "LX_FMT"\n", pregctx->REG_ulReg[13]);
+ stOft = bnprintf(pvBuffer, stSize, stOft, "R14(SP) = "LX_FMT"\n", pregctx->REG_ulReg[14]);
+ stOft = bnprintf(pvBuffer, stSize, stOft, "R15 = "LX_FMT"\n", pregctx->REG_ulReg[15]);
+ stOft = bnprintf(pvBuffer, stSize, stOft, "R28 = "LX_FMT"\n", pregctx->REG_ulReg[16]);
+
+ stOft = bnprintf(pvBuffer, stSize, stOft, "PSR Status Register:\n");
+ stOft = bnprintf(pvBuffer, stSize, stOft, "S = %d ", (ulPsr & M_PSR_S) >> S_PSR_S);
+ stOft = bnprintf(pvBuffer, stSize, stOft, "MM = %d ", (ulPsr & M_PSR_MM) >> S_PSR_MM);
+ stOft = bnprintf(pvBuffer, stSize, stOft, "EE = %d\n", (ulPsr & M_PSR_EE) >> S_PSR_EE);
+ stOft = bnprintf(pvBuffer, stSize, stOft, "IC = %d ", (ulPsr & M_PSR_IC) >> S_PSR_IC);
+ stOft = bnprintf(pvBuffer, stSize, stOft, "IE = %d\n", (ulPsr & M_PSR_IE) >> S_PSR_IE);
+ stOft = bnprintf(pvBuffer, stSize, stOft, "C = %d\n", (ulPsr & M_PSR_C) >> S_PSR_C);
+
+#undef LX_FMT
+ } else {
+#define LX_FMT "0x%08x"
+
+ _PrintFormat("\r\n");
+
+ _PrintFormat("PC = "LX_FMT"\r\n", pregctx->REG_ulPc);
+
+ _PrintFormat("R0(A0) = "LX_FMT"\r\n", pregctx->REG_ulReg[0]);
+ _PrintFormat("R1(A1) = "LX_FMT"\r\n", pregctx->REG_ulReg[1]);
+ _PrintFormat("R2(A2) = "LX_FMT"\r\n", pregctx->REG_ulReg[2]);
+ _PrintFormat("R3(A3) = "LX_FMT"\r\n", pregctx->REG_ulReg[3]);
+ _PrintFormat("R4 = "LX_FMT"\r\n", pregctx->REG_ulReg[4]);
+ _PrintFormat("R5 = "LX_FMT"\r\n", pregctx->REG_ulReg[5]);
+ _PrintFormat("R6 = "LX_FMT"\r\n", pregctx->REG_ulReg[6]);
+ _PrintFormat("R7 = "LX_FMT"\r\n", pregctx->REG_ulReg[7]);
+ _PrintFormat("R8 = "LX_FMT"\r\n", pregctx->REG_ulReg[8]);
+ _PrintFormat("R9 = "LX_FMT"\r\n", pregctx->REG_ulReg[9]);
+ _PrintFormat("R10 = "LX_FMT"\r\n", pregctx->REG_ulReg[10]);
+ _PrintFormat("R11 = "LX_FMT"\r\n", pregctx->REG_ulReg[11]);
+ _PrintFormat("R12 = "LX_FMT"\r\n", pregctx->REG_ulReg[12]);
+ _PrintFormat("R13 = "LX_FMT"\r\n", pregctx->REG_ulReg[13]);
+ _PrintFormat("R14(SP) = "LX_FMT"\r\n", pregctx->REG_ulReg[14]);
+ _PrintFormat("R15 = "LX_FMT"\r\n", pregctx->REG_ulReg[15]);
+ _PrintFormat("R28 = "LX_FMT"\r\n", pregctx->REG_ulReg[16]);
+
+ _PrintFormat("PSR Status Register:\r\n");
+ _PrintFormat("S = %d ", (ulPsr & M_PSR_S) >> S_PSR_S);
+ _PrintFormat("MM = %d ", (ulPsr & M_PSR_MM) >> S_PSR_MM);
+ _PrintFormat("EE = %d\r\n", (ulPsr & M_PSR_EE) >> S_PSR_EE);
+ _PrintFormat("IC = %d ", (ulPsr & M_PSR_IC) >> S_PSR_IC);
+ _PrintFormat("IE = %d\r\n", (ulPsr & M_PSR_IE) >> S_PSR_IE);
+ _PrintFormat("C = %d\r\n", (ulPsr & M_PSR_C) >> S_PSR_C);
+
+#undef LX_FMT
+ }
+}
+/*********************************************************************************************************
+** 函数名称: archIntCtxSaveReg
+** 功能描述: 中断保存寄存器
+** 输 入 : pcpu CPU 结构
+** reg0 寄存器 0
+** reg1 寄存器 1
+** reg2 寄存器 2
+** reg3 寄存器 3
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID archIntCtxSaveReg (PLW_CLASS_CPU pcpu,
+ ARCH_REG_T reg0,
+ ARCH_REG_T reg1,
+ ARCH_REG_T reg2,
+ ARCH_REG_T reg3)
+{
+ ARCH_REG_CTX *pregctx;
+
+ if (pcpu->CPU_ulInterNesting == 1) {
+ pregctx = &pcpu->CPU_ptcbTCBCur->TCB_archRegCtx;
+
+ } else {
+ pregctx = (ARCH_REG_CTX *)(((ARCH_REG_CTX *)reg0)->REG_ulReg[REG_SP] - ARCH_REG_CTX_SIZE);
+ }
+
+ archTaskCtxCopy(pregctx, (ARCH_REG_CTX *)reg0);
+}
+/*********************************************************************************************************
+** 函数名称: archCtxStackEnd
+** 功能描述: 根据寄存器上下文获得栈结束地址
+** 输 入 : pregctx 寄存器上下文
+** 输 出 : 栈结束地址
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+PLW_STACK archCtxStackEnd (const ARCH_REG_CTX *pregctx)
+{
+ return ((PLW_STACK)pregctx->REG_ulReg[REG_SP]);
+}
+
+#endif /* __SYLIXOS_CSKY_ARCH_CK803__ */
+/*********************************************************************************************************
+ END
+*********************************************************************************************************/
diff --git a/SylixOS/arch/csky/common/ck803/cskyContextCK803Asm.S b/SylixOS/arch/csky/common/ck803/cskyContextCK803Asm.S
new file mode 100644
index 0000000..1af3f59
--- /dev/null
+++ b/SylixOS/arch/csky/common/ck803/cskyContextCK803Asm.S
@@ -0,0 +1,189 @@
+;/*********************************************************************************************************
+;**
+;** 中国软件开源组织
+;**
+;** 嵌入式实时操作系统
+;**
+;** SylixOS(TM)
+;**
+;** Copyright All Rights Reserved
+;**
+;**--------------文件信息--------------------------------------------------------------------------------
+;**
+;** 文 件 名: cskyContextCK803Asm.S
+;**
+;** 创 建 人: Wang.Xuan (王翾)
+;**
+;** 文件创建日期: 2019 年 04 月 26 日
+;**
+;** 描 述: C-SKY CK803 体系架构上下文切换.
+;*********************************************************************************************************/
+
+#ifndef ASSEMBLY
+#define ASSEMBLY 1
+#endif
+
+#include <arch/assembler.h>
+#include <config/kernel/kernel_cfg.h>
+#include <config/mp/mp_cfg.h>
+
+#if defined(__SYLIXOS_CSKY_ARCH_CK803__)
+
+#include "cskyContextCK803Asm.h"
+
+ FILE_BEGIN()
+
+ IMPORT_LABEL(_SchedSwp)
+#if LW_CFG_SMP_EN > 0
+ IMPORT_LABEL(_SchedSafeStack)
+#endif
+#if LW_CFG_COROUTINE_EN > 0
+ IMPORT_LABEL(_SchedCrSwp)
+#endif
+
+ EXPORT_LABEL(archTaskCtxStart)
+ EXPORT_LABEL(archTaskCtxSwitch)
+ EXPORT_LABEL(archTaskCtxCopy)
+#if LW_CFG_COROUTINE_EN > 0
+ EXPORT_LABEL(archCrtCtxSwitch)
+#endif
+ EXPORT_LABEL(archIntCtxLoad)
+ EXPORT_LABEL(archSigCtxLoad)
+ EXPORT_LABEL(archExcOldStack)
+ EXPORT_LABEL(archExcIrqStack)
+
+;/*********************************************************************************************************
+; 异常栈
+;*********************************************************************************************************/
+
+ .balign ARCH_STK_ALIGN_SIZE
+LINE_LABEL(archExcOldStack)
+ .long archExcOldStack
+
+LINE_LABEL(archExcIrqStack)
+ .long archExcIrqStack
+
+;/*********************************************************************************************************
+; 当前 CPU 开始运行多任务执行
+; 参数为当前 CPU 控制块, 即 A0 为当前 CPU 控制块指针
+;*********************************************************************************************************/
+
+FUNC_DEF(archTaskCtxStart)
+ SUBI SP , 1024 ;/* 在启动栈开辟异常临时栈 */
+ ANDNI SP , SP , 0x7 ;/* SP 向下 8 字节对齐 */
+ LRW A1 , archExcIrqStack
+ ST.W SP , (A1)
+
+ LD.W A1 , (A0 , 0) ;/* 获取当前 TCB 的 REG_CTX 地址*/
+
+ RESTORE_REGS ;/* 恢复寄存器 */
+ FUNC_END(archTaskCtxStart)
+
+;/*********************************************************************************************************
+; 线程切换
+; 参数为当前 CPU 控制块, 即 A0 为当前 CPU 控制块指针
+;*********************************************************************************************************/
+
+FUNC_DEF(archTaskCtxSwitch)
+ LD.W A1 , (A0 , 0) ;/* 获取当前 TCB 的 REG_CTX 地址*/
+
+ SAVE_REGS ;/* 保存任务寄存器 */
+
+ MOV S0 , A0 ;/* S0 暂存 A0 */
+
+#if LW_CFG_SMP_EN > 0
+ JSRI _SchedSafeStack ;/* _SchedSafeStack(); */
+ MOV SP , A0
+ MOV A0 , S0 ;/* 恢复 A0 */
+#endif
+
+ JSRI _SchedSwp ;/* _SchedSwp(); */
+
+ LD.W A1 , (S0 , 0) ;/* 获取当前 TCB 的 REG_CTX 地址*/
+
+ RESTORE_REGS ;/* 恢复任务寄存器 */
+ FUNC_END(archTaskCtxSwitch)
+
+;/*********************************************************************************************************
+; 协程切换
+; 参数为当前 CPU 控制块, 即 A0 为当前 CPU 控制块指针
+;*********************************************************************************************************/
+
+#if LW_CFG_COROUTINE_EN > 0
+FUNC_DEF(archCrtCtxSwitch)
+ LD.W A1 , (A0 , (2 * PTRSIZE)) ;/* 当前 CCB 的 REG_CTX 地址 */
+
+ SAVE_REGS ;/* 保存协程寄存器 */
+
+ MOV S0 , A0 ;/* S0 暂存 A0 */
+
+ JSRI _SchedCrSwp ;/* _SchedCrSwp(); */
+
+ LD.W A1 , (S0 , (2 * PTRSIZE)) ;/* 当前 CCB 的 REG_CTX 地址 */
+
+ RESTORE_REGS ;/* 恢复协程寄存器 */
+ FUNC_END(archCrtCtxSwitch)
+#endif
+
+;/*********************************************************************************************************
+; 中断返回时, 线程装载
+; 参数为当前 CPU 控制块, 即 A0 为当前 CPU 控制块指针
+;*********************************************************************************************************/
+
+FUNC_DEF(archIntCtxLoad)
+ LD.W A1 , (A0 , 0) ;/* 获取当前 TCB 的 REG_CTX 地址*/
+
+ RESTORE_REGS ;/* 恢复任务寄存器 */
+ FUNC_END(archIntCtxLoad)
+
+;/*********************************************************************************************************
+; 信号上下文返回
+; 参数为 ARCH_REG_CTX 指针, 即 A0 为 ARCH_REG_CTX 指针
+;*********************************************************************************************************/
+
+FUNC_DEF(archSigCtxLoad)
+ MOV A1 , A0
+
+ RESTORE_REGS ;/* 恢复任务寄存器 */
+ FUNC_END(archSigCtxLoad)
+
+;/*********************************************************************************************************
+; 拷贝任务上下文
+; 参数 A0 为目的 ARCH_REG_CTX 指针, A1 为源 ARCH_REG_CTX 指针
+;*********************************************************************************************************/
+
+FUNC_DEF(archTaskCtxCopy)
+ PUSH R4-R8
+
+ LDM R4-R8 , (A1)
+ STM R4-R8 , (A0)
+ ADDI A0 , (5 * ARCH_REG_SIZE)
+ ADDI A1 , (5 * ARCH_REG_SIZE)
+
+ LDM R4-R8 , (A1)
+ STM R4-R8 , (A0)
+ ADDI A0 , (5 * ARCH_REG_SIZE)
+ ADDI A1 , (5 * ARCH_REG_SIZE)
+
+ LDM R4-R8 , (A1)
+ STM R4-R8 , (A0)
+ ADDI A0 , (5 * ARCH_REG_SIZE)
+ ADDI A1 , (5 * ARCH_REG_SIZE)
+
+ LDM R4-R8 , (A1)
+ STM R4-R8 , (A0)
+ ADDI A0 , (5 * ARCH_REG_SIZE)
+ ADDI A1 , (5 * ARCH_REG_SIZE)
+
+ LDM R4-R8 , (SP)
+ ADDI SP , (5 * ARCH_REG_SIZE)
+
+ RTS
+ FUNC_END(archTaskCtxCopy)
+
+ FILE_END()
+
+#endif
+;/*********************************************************************************************************
+; END
+;*********************************************************************************************************/
diff --git a/SylixOS/arch/csky/common/ck803/cskyContextCK803Asm.h b/SylixOS/arch/csky/common/ck803/cskyContextCK803Asm.h
new file mode 100644
index 0000000..b637bf3
--- /dev/null
+++ b/SylixOS/arch/csky/common/ck803/cskyContextCK803Asm.h
@@ -0,0 +1,68 @@
+;/*********************************************************************************************************
+;**
+;** 中国软件开源组织
+;**
+;** 嵌入式实时操作系统
+;**
+;** SylixOS(TM)
+;**
+;** Copyright All Rights Reserved
+;**
+;**--------------文件信息--------------------------------------------------------------------------------
+;**
+;** 文 件 名: cskyContextCK803Asm.h
+;**
+;** 创 建 人: Wang.Xuan (王翾)
+;**
+;** 文件创建日期: 2018 年 11 月 12 日
+;**
+;** 描 述: C-SKY CK803 体系架构上下文处理.
+;*********************************************************************************************************/
+
+#ifndef __ARCH_CSKYCONTEXTCK803ASM_H
+#define __ARCH_CSKYCONTEXTCK803ASM_H
+
+#include "arch/csky/arch_regs.h"
+
+;/*********************************************************************************************************
+; 保存寄存器(参数 A1: ARCH_REG_CTX 地址)
+;*********************************************************************************************************/
+
+MACRO_DEF(SAVE_REGS)
+ STM R0-R15 , (A1)
+
+ ST.W R28, (A1 , XGREG28)
+
+ ST.W RA , (A1 , XPC) ;/* RA 代替 PC 保存 */
+
+ MFCR A2 , PSR
+ ST.W A2 , (A1 , XPSR) ;/* 保存 PSR 寄存器 */
+ MACRO_END()
+
+;/*********************************************************************************************************
+; 恢复寄存器(参数 A1: ARCH_REG_CTX 地址)
+;*********************************************************************************************************/
+
+MACRO_DEF(RESTORE_REGS)
+ LD.W A0 , (A1 , XPSR) ;/* 恢复 PSR 寄存器 */
+ MTCR A0 , EPSR
+
+ LD.W A0 , (A1 , XPC) ;/* 恢复 PC 寄存器 */
+ MTCR A0 , EPC
+
+ LD.W R28, (A1 , XGREG28)
+
+ LD.W R0 , (A1 , XGREG(0))
+
+ ADDI A1 , (2 * ARCH_REG_SIZE)
+ LDM R2-R15 , (A1)
+ SUBI A1 , (2 * ARCH_REG_SIZE)
+ LD.W A1 , (A1 , XGREG(1))
+
+ RTE
+ MACRO_END()
+
+#endif
+;/*********************************************************************************************************
+; END
+;*********************************************************************************************************/
diff --git a/SylixOS/arch/csky/common/ck803/cskyExcCK803.c b/SylixOS/arch/csky/common/ck803/cskyExcCK803.c
new file mode 100644
index 0000000..3cd1616
--- /dev/null
+++ b/SylixOS/arch/csky/common/ck803/cskyExcCK803.c
@@ -0,0 +1,479 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM) LW : long wing
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: cskyExcCK803.c
+**
+** 创 建 人: Wang.Xuan (王翾)
+**
+** 文件创建日期: 2018 年 11 月 12 日
+**
+** 描 述: C-SKY CK803 体系架构异常处理.
+*********************************************************************************************************/
+#define __SYLIXOS_STDIO
+#define __SYLIXOS_KERNEL
+#include "SylixOS.h"
+#include "dtrace.h"
+#include "arch/csky/common/unaligned/cskyUnaligned.h"
+#if LW_CFG_CPU_FPU_EN > 0
+#include "arch/csky/fpu/fpu/cskyVfp.h"
+#endif
+#include "arch/csky/param/cskyParam.h"
+#include "arch/csky/inc/cskyregs.h"
+/*********************************************************************************************************
+ C-SKY 体系架构
+*********************************************************************************************************/
+#if defined(__SYLIXOS_CSKY_ARCH_CK803__)
+/*********************************************************************************************************
+ 向量使能与禁能锁
+*********************************************************************************************************/
+#if LW_CFG_SMP_EN > 0
+#define VECTOR_OP_LOCK() LW_SPIN_LOCK_IGNIRQ(&_K_slcaVectorTable.SLCA_sl)
+#define VECTOR_OP_UNLOCK() LW_SPIN_UNLOCK_IGNIRQ(&_K_slcaVectorTable.SLCA_sl)
+#else
+#define VECTOR_OP_LOCK()
+#define VECTOR_OP_UNLOCK()
+#endif
+/*********************************************************************************************************
+** 函数名称: archIntHandle
+** 功能描述: bspIntHandle 需要调用此函数处理中断 (关闭中断情况被调用)
+** 输 入 : ulVector 中断向量
+** bPreemptive 中断是否可抢占
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+** 注 意 : 此函数退出时必须为中断关闭状态.
+*********************************************************************************************************/
+LW_WEAK VOID archIntHandle (ULONG ulVector, BOOL bPreemptive)
+{
+ REGISTER irqreturn_t irqret;
+
+ if (_Inter_Vector_Invalid(ulVector)) {
+ return; /* 向量号不正确 */
+ }
+
+ if (LW_IVEC_GET_FLAG(ulVector) & LW_IRQ_FLAG_PREEMPTIVE) {
+ bPreemptive = LW_TRUE;
+ }
+
+ if (bPreemptive) {
+ VECTOR_OP_LOCK();
+ __ARCH_INT_VECTOR_DISABLE(ulVector); /* 屏蔽 vector 中断 */
+ VECTOR_OP_UNLOCK();
+ KN_INT_ENABLE_FORCE(); /* 允许中断 */
+ }
+
+ irqret = API_InterVectorIsr(ulVector); /* 调用中断服务程序 */
+
+ KN_INT_DISABLE(); /* 禁能中断 */
+
+ if (bPreemptive) {
+ if (irqret != LW_IRQ_HANDLED_DISV) {
+ VECTOR_OP_LOCK();
+ __ARCH_INT_VECTOR_ENABLE(ulVector); /* 允许 vector 中断 */
+ VECTOR_OP_UNLOCK();
+ }
+
+ } else if (irqret == LW_IRQ_HANDLED_DISV) {
+ VECTOR_OP_LOCK();
+ __ARCH_INT_VECTOR_DISABLE(ulVector); /* 屏蔽 vector 中断 */
+ VECTOR_OP_UNLOCK();
+ }
+}
+/*********************************************************************************************************
+** 函数名称: archAutoIntHandle
+** 功能描述: 普通中断
+** 输 入 : ulVector 中断向量
+** pregctx 上下文
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID archAutoIntHandle (ULONG ulVector, ARCH_REG_CTX *pregctx)
+{
+ bspIntHandle(ulVector);
+}
+/*********************************************************************************************************
+** 函数名称: archTrapExceptHandle
+** 功能描述: 跟踪异常
+** 输 入 : ulVector 中断向量
+** pregctx 上下文
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID archTrapExceptHandle (ULONG ulVector, ARCH_REG_CTX *pregctx)
+{
+ PLW_CLASS_TCB ptcbCur;
+ LW_VMM_ABORT abtInfo;
+
+ LW_TCB_GET_CUR(ptcbCur);
+
+ abtInfo.VMABT_uiMethod = LW_VMM_ABORT_METHOD_EXEC;
+ abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_SYS;
+
+ API_VmmAbortIsr(pregctx->REG_ulPc, pregctx->REG_ulPc, &abtInfo, ptcbCur);
+}
+/*********************************************************************************************************
+** 函数名称: archTrap0ExceptHandle
+** 功能描述: 陷阱指令异常 0
+** 输 入 : ulVector 中断向量
+** pregctx 上下文
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID archTrap0ExceptHandle (ULONG ulVector, ARCH_REG_CTX *pregctx)
+{
+ archTrapExceptHandle(ulVector, pregctx);
+}
+/*********************************************************************************************************
+** 函数名称: archTrap1ExceptHandle
+** 功能描述: 陷阱指令异常 1
+** 输 入 : ulVector 中断向量
+** pregctx 上下文
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID archTrap1ExceptHandle (ULONG ulVector, ARCH_REG_CTX *pregctx)
+{
+ archTrapExceptHandle(ulVector, pregctx);
+}
+/*********************************************************************************************************
+** 函数名称: archTrap2ExceptHandle
+** 功能描述: 陷阱指令异常 2
+** 输 入 : ulVector 中断向量
+** pregctx 上下文
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID archTrap2ExceptHandle (ULONG ulVector, ARCH_REG_CTX *pregctx)
+{
+ archTrapExceptHandle(ulVector, pregctx);
+}
+/*********************************************************************************************************
+** 函数名称: archTrap3ExceptHandle
+** 功能描述: 陷阱指令异常 3
+** 输 入 : ulVector 中断向量
+** pregctx 上下文
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID archTrap3ExceptHandle (ULONG ulVector, ARCH_REG_CTX *pregctx)
+{
+ archTrapExceptHandle(ulVector, pregctx);
+}
+/*********************************************************************************************************
+** 函数名称: archReservedExceptHandle
+** 功能描述: Reserved 中断
+** 输 入 : ulVector 中断向量
+** pregctx 上下文
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID archReservedExceptHandle (ULONG ulVector, ARCH_REG_CTX *pregctx)
+{
+ LW_VMM_ABORT abtInfo;
+ PLW_CLASS_TCB ptcbCur;
+
+ LW_TCB_GET_CUR(ptcbCur);
+
+ abtInfo.VMABT_uiMethod = 0;
+ abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_FATAL_ERROR;
+
+ API_VmmAbortIsr(pregctx->REG_ulPc, pregctx->REG_ulPc, &abtInfo, ptcbCur);
+}
+/*********************************************************************************************************
+** 函数名称: archTspendIntHandle
+** 功能描述: TSPEND 中断
+** 输 入 : ulVector 中断向量
+** pregctx 上下文
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID archTspendIntHandle (ULONG ulVector, ARCH_REG_CTX *pregctx)
+{
+ bspIntHandle(ulVector);
+}
+/*********************************************************************************************************
+** 函数名称: archFpuExceptHandle
+** 功能描述: 浮点异常
+** 输 入 : ulVector 中断向量
+** pregctx 上下文
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID archFpuExceptHandle (ULONG ulVector, ARCH_REG_CTX *pregctx)
+{
+ PLW_CLASS_TCB ptcbCur;
+ LW_VMM_ABORT abtInfo;
+#if LW_CFG_CPU_FPU_EN > 0
+ UINT32 uiFESR;
+#endif /* LW_CFG_CPU_FPU_EN > 0 */
+
+ LW_TCB_GET_CUR(ptcbCur);
+
+ abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_FPE; /* 终止类型默认为浮点异常 */
+
+#if LW_CFG_CPU_FPU_EN > 0
+ uiFESR = cskyVfpGetFESR();
+ if (uiFESR & FESR_ILLE) { /* 非法指令 */
+ abtInfo.VMABT_uiMethod = ILL_ILLOPC;
+ abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_UNDEF;
+
+ } else if (uiFESR & FESR_IDC) { /* 非规格数输入 */
+ abtInfo.VMABT_uiMethod = ILL_ILLOPN;
+ abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_UNDEF;
+
+ } else if (uiFESR & FESR_FEC) {
+ abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_FPE;
+
+ if (uiFESR & FESR_IOC) {
+ abtInfo.VMABT_uiMethod = FPE_FLTINV; /* 非法操作异常 */
+
+ } else if (uiFESR & FESR_DZC) {
+ abtInfo.VMABT_uiMethod = FPE_FLTDIV; /* 除零异常 */
+
+ } else if (uiFESR & FESR_UFC) {
+ abtInfo.VMABT_uiMethod = FPE_FLTUND; /* 下溢异常 */
+
+ } else if (uiFESR & FESR_OFC) {
+ abtInfo.VMABT_uiMethod = FPE_FLTOVF; /* 上溢异常 */
+
+ } else if (uiFESR & FESR_IXC) {
+ abtInfo.VMABT_uiMethod = FPE_FLTRES; /* 不精确异常 */
+
+ } else {
+ abtInfo.VMABT_uiMethod = 0;
+ }
+
+ } else {
+ abtInfo.VMABT_uiMethod = 0;
+ abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_FATAL_ERROR;
+ }
+#endif /* LW_CFG_CPU_FPU_EN > 0 */
+
+ if (abtInfo.VMABT_uiType) {
+ API_VmmAbortIsr(pregctx->REG_ulPc, pregctx->REG_ulPc, &abtInfo, ptcbCur);
+ }
+}
+/*********************************************************************************************************
+** 函数名称: archIdlyExceptHandle
+** 功能描述: Idly 异常
+** 输 入 : ulVector 中断向量
+** pregctx 上下文
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID archIdlyExceptHandle (ULONG ulVector, ARCH_REG_CTX *pregctx)
+{
+ PLW_CLASS_TCB ptcbCur;
+ LW_VMM_ABORT abtInfo;
+
+ LW_TCB_GET_CUR(ptcbCur);
+
+ abtInfo.VMABT_uiMethod = 0;
+ abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_FATAL_ERROR;
+
+ API_VmmAbortIsr(pregctx->REG_ulPc, pregctx->REG_ulPc, &abtInfo, ptcbCur);
+}
+/*********************************************************************************************************
+** 函数名称: archFatalErrExceptHandle
+** 功能描述: 不可恢复错误异常
+** 输 入 : ulVector 中断向量
+** pregctx 上下文
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID archFatalErrExceptHandle (ULONG ulVector, ARCH_REG_CTX *pregctx)
+{
+ PLW_CLASS_TCB ptcbCur;
+ LW_VMM_ABORT abtInfo;
+
+ LW_TCB_GET_CUR(ptcbCur);
+
+ abtInfo.VMABT_uiMethod = 0;
+ abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_FATAL_ERROR;
+
+ API_VmmAbortIsr(pregctx->REG_ulPc, pregctx->REG_ulPc, &abtInfo, ptcbCur);
+}
+/*********************************************************************************************************
+** 函数名称: archBreakPointExceptHandle
+** 功能描述: 断点异常
+** 输 入 : ulVector 中断向量
+** pregctx 上下文
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID archBreakPointExceptHandle (ULONG ulVector, ARCH_REG_CTX *pregctx)
+{
+ PLW_CLASS_TCB ptcbCur;
+ LW_VMM_ABORT abtInfo;
+#if LW_CFG_GDB_EN > 0
+ UINT uiBpType;
+#endif /* LW_CFG_GDB_EN > 0 */
+
+ LW_TCB_GET_CUR(ptcbCur);
+
+#if LW_CFG_GDB_EN > 0
+ uiBpType = archDbgTrapType(pregctx->REG_ulPc, LW_NULL); /* 断点指令探测 */
+ if (uiBpType) {
+ if (API_DtraceBreakTrap(pregctx->REG_ulPc, uiBpType) == ERROR_NONE) {
+ return; /* 进入调试接口断点处理 */
+ }
+ }
+#endif /* LW_CFG_GDB_EN > 0 */
+
+ abtInfo.VMABT_uiMethod = LW_VMM_ABORT_METHOD_EXEC;
+ abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_BREAK;
+
+ API_VmmAbortIsr(pregctx->REG_ulPc, pregctx->REG_ulPc, &abtInfo, ptcbCur);
+}
+/*********************************************************************************************************
+** 函数名称: archPrivilegeExceptHandle
+** 功能描述: 特权违反异常
+** 输 入 : ulVector 中断向量
+** pregctx 上下文
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID archPrivilegeExceptHandle (ULONG ulVector, ARCH_REG_CTX *pregctx)
+{
+ PLW_CLASS_TCB ptcbCur;
+ LW_VMM_ABORT abtInfo;
+
+ LW_TCB_GET_CUR(ptcbCur);
+
+ abtInfo.VMABT_uiMethod = LW_VMM_ABORT_METHOD_EXEC;
+ abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_PERM;
+
+ API_VmmAbortIsr(pregctx->REG_ulPc, pregctx->REG_ulPc, &abtInfo, ptcbCur);
+}
+/*********************************************************************************************************
+** 函数名称: archIllegalInstExceptHandle
+** 功能描述: 非法指令异常
+** 输 入 : ulVector 中断向量
+** pregctx 上下文
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID archIllegalInstExceptHandle (ULONG ulVector, ARCH_REG_CTX *pregctx)
+{
+ PLW_CLASS_TCB ptcbCur;
+ LW_VMM_ABORT abtInfo;
+
+ LW_TCB_GET_CUR(ptcbCur);
+
+ abtInfo.VMABT_uiMethod = LW_VMM_ABORT_METHOD_EXEC;
+ abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_UNDEF;
+
+ API_VmmAbortIsr(pregctx->REG_ulPc, pregctx->REG_ulPc, &abtInfo, ptcbCur);
+}
+/*********************************************************************************************************
+** 函数名称: archDivideZeroExceptHandle
+** 功能描述: 除以零异常
+** 输 入 : ulVector 中断向量
+** pregctx 上下文
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID archDivideZeroExceptHandle (ULONG ulVector, ARCH_REG_CTX *pregctx)
+{
+ PLW_CLASS_TCB ptcbCur;
+ LW_VMM_ABORT abtInfo;
+
+ LW_TCB_GET_CUR(ptcbCur);
+
+ abtInfo.VMABT_uiMethod = LW_VMM_ABORT_METHOD_EXEC;
+ abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_TERMINAL;
+
+ API_VmmAbortIsr(pregctx->REG_ulPc, pregctx->REG_ulPc, &abtInfo, ptcbCur);
+}
+/*********************************************************************************************************
+** 函数名称: archAccessExceptHandle
+** 功能描述: 访问错误异常
+** 输 入 : ulVector 中断向量
+** pregctx 上下文
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID archAccessExceptHandle (ULONG ulVector, ARCH_REG_CTX *pregctx)
+{
+ PLW_CLASS_TCB ptcbCur;
+ LW_VMM_ABORT abtInfo;
+
+ LW_TCB_GET_CUR(ptcbCur);
+
+ abtInfo.VMABT_uiMethod = 0;
+ abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_BUS;
+
+ API_VmmAbortIsr(pregctx->REG_ulPc, pregctx->REG_ulPc, &abtInfo, ptcbCur);
+}
+/*********************************************************************************************************
+** 函数名称: archUnalignedHandle
+** 功能描述: 非对齐内存访问异常处理
+** 输 入 : pabtctx abort 上下文
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static VOID archUnalignedHandle (PLW_VMM_ABORT_CTX pabtctx)
+{
+ cskyUnalignedHandle(&pabtctx->ABTCTX_archRegCtx,
+ &pabtctx->ABTCTX_abtInfo);
+
+ API_VmmAbortReturn(pabtctx);
+}
+/*********************************************************************************************************
+** 函数名称: archUnalignedExceptHandle
+** 功能描述: 未对齐访问异常处理
+** 输 入 : ulVector 中断向量
+** pregctx 上下文
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID archUnalignedExceptHandle (ULONG ulVector, ARCH_REG_CTX *pregctx)
+{
+ PLW_CLASS_TCB ptcbCur;
+ LW_VMM_ABORT abtInfo;
+ CSKY_PARAM *param = archKernelParamGet();
+
+ LW_TCB_GET_CUR(ptcbCur);
+
+ abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_BUS;
+ abtInfo.VMABT_uiMethod = BUS_ADRALN;
+
+ if (param->CP_bUnalign) {
+ API_VmmAbortIsrEx(pregctx->REG_ulPc, pregctx->REG_ulPc, &abtInfo, ptcbCur, archUnalignedHandle);
+
+ } else {
+ API_VmmAbortIsr(pregctx->REG_ulPc, pregctx->REG_ulPc, &abtInfo, ptcbCur);
+ }
+}
+
+#endif /* __SYLIXOS_CSKY_ARCH_CK803__ */
+/*********************************************************************************************************
+ END
+*********************************************************************************************************/
diff --git a/SylixOS/arch/csky/common/ck803/cskyExcCK803Asm.S b/SylixOS/arch/csky/common/ck803/cskyExcCK803Asm.S
new file mode 100644
index 0000000..d19a4b4
--- /dev/null
+++ b/SylixOS/arch/csky/common/ck803/cskyExcCK803Asm.S
@@ -0,0 +1,419 @@
+;/*********************************************************************************************************
+;**
+;** 中国软件开源组织
+;**
+;** 嵌入式实时操作系统
+;**
+;** SylixOS(TM)
+;**
+;** Copyright All Rights Reserved
+;**
+;**--------------文件信息--------------------------------------------------------------------------------
+;**
+;** 文 件 名: cskyExcCK803Asm.S
+;**
+;** 创 建 人: Wang.Xuan (王翾)
+;**
+;** 文件创建日期: 2018 年 11 月 12 日
+;**
+;** 描 述: C-SKY CK803 体系架构异常处理.
+;*********************************************************************************************************/
+
+#ifndef ASSEMBLY
+#define ASSEMBLY 1
+#endif
+
+#include <arch/assembler.h>
+#include <config/kernel/kernel_cfg.h>
+#include <config/mp/mp_cfg.h>
+
+#if defined(__SYLIXOS_CSKY_ARCH_CK803__)
+
+#include "cskyContextCK803Asm.h"
+
+ FILE_BEGIN()
+
+ IMPORT_LABEL(API_ThreadTcbInter)
+ IMPORT_LABEL(API_InterStackBaseGet)
+ IMPORT_LABEL(API_InterEnter)
+ IMPORT_LABEL(API_InterExit)
+ IMPORT_LABEL(bspIntHandle)
+
+ IMPORT_LABEL(archResetHandle)
+ IMPORT_LABEL(archUnalignedExceptHandle)
+ IMPORT_LABEL(archAccessExceptHandle)
+ IMPORT_LABEL(archDivideZeroExceptHandle)
+ IMPORT_LABEL(archIllegalInstExceptHandle)
+ IMPORT_LABEL(archPrivilegeExceptHandle)
+ IMPORT_LABEL(archTrapExceptHandle)
+ IMPORT_LABEL(archBreakPointExceptHandle)
+ IMPORT_LABEL(archFatalErrExceptHandle)
+ IMPORT_LABEL(archIdlyExceptHandle)
+ IMPORT_LABEL(archAutoIntHandle)
+ IMPORT_LABEL(archReservedExceptHandle)
+ IMPORT_LABEL(archTrap0ExceptHandle)
+ IMPORT_LABEL(archTrap1ExceptHandle)
+ IMPORT_LABEL(archTrap2ExceptHandle)
+ IMPORT_LABEL(archTrap3ExceptHandle)
+ IMPORT_LABEL(archTspendIntHandle)
+ IMPORT_LABEL(archFpuExceptHandle)
+ IMPORT_LABEL(archExcOldStack)
+ IMPORT_LABEL(archExcIrqStack)
+
+ EXPORT_LABEL(archUnalignedExceptEntry)
+ EXPORT_LABEL(archAccessExceptEntry)
+ EXPORT_LABEL(archDivideZeroExceptEntry)
+ EXPORT_LABEL(archIllegalInstExceptEntry)
+ EXPORT_LABEL(archPrivilegeExceptEntry)
+ EXPORT_LABEL(archTrapExceptEntry)
+ EXPORT_LABEL(archBreakPointExceptEntry)
+ EXPORT_LABEL(archFatalErrExceptEntry)
+ EXPORT_LABEL(archIdlyExceptEntry)
+ EXPORT_LABEL(archAutoIntEntry)
+ EXPORT_LABEL(archReservedExceptEntry)
+ EXPORT_LABEL(archTrap0ExceptEntry)
+ EXPORT_LABEL(archTrap1ExceptEntry)
+ EXPORT_LABEL(archTrap2ExceptEntry)
+ EXPORT_LABEL(archTrap3ExceptEntry)
+ EXPORT_LABEL(archTspendIntEntry)
+ EXPORT_LABEL(archFpuExceptEntry)
+
+ EXPORT_LABEL(vector)
+
+;/*********************************************************************************************************
+; 这里的异常向量表 vector 声明为弱符号, BSP 可以重新实现异常向量表
+;*********************************************************************************************************/
+
+ WEAK(vector)
+
+;/*********************************************************************************************************
+; 异常/中断入口宏
+;*********************************************************************************************************/
+
+ SECTION(.text)
+
+MACRO_DEF(IRQ_ENTRY irq handle)
+ ;/*
+ ; * 使用异常临时栈, 并在异常临时栈开辟临时上下文保存区, 将寄存器保存到临时上下文保存区
+ ; */
+ PUSH R4 , R5 ;/* 先将 R4, R5 入栈 */
+ LRW R4 , archExcOldStack ;/* 获取存储异常前 SP 的位置 */
+ ADDI R5 , SP , 2 * ARCH_REG_SIZE ;/* 获取异常前 SP 指针 */
+ ST.W R5 , (R4) ;/* 将异常前 SP 存入对应位置 */
+ LD.W R4 , (SP) ;/* 不能使用 POP 指令 */
+ LD.W R5 , (SP, ARCH_REG_SIZE) ;/* POP 指令会同时改变 PC */
+
+ LRW SP , archExcIrqStack ;/* 获取异常临时栈 SP 的位置 */
+ LD.W SP , (SP) ;/* 得到异常栈指针 */
+ SUBI SP , ARCH_REG_CTX_SIZE ;/* 在临时堆栈开辟上下文保存区 */
+
+ STM R0-R15 , (SP)
+ ST.W R28 , (SP , XGREG28)
+
+ MFCR R0 , EPC ;/* EPC 代替 PC 保存 */
+ STW R0 , (SP , XPC)
+
+ MFCR R0 , EPSR ;/* 保存 PSR 寄存器 */
+ ST.W R0 , (SP , XPSR)
+
+ LRW R0 , archExcOldStack ;/* 读出异常前 SP */
+ LD.W R0 , (R0)
+ ST.W R0 , (SP , XGREG(14)) ;/* 保存异常前 SP */
+
+ ;/*
+ ; * API_InterEnter(寄存器上下文)
+ ; */
+ MOV A0 , SP
+ JSRI API_InterEnter
+
+ CMPNEI A0 , 1
+ BT 3f
+
+ ;/*
+ ; * 第一次进入中断: 获得当前 CPU 中断堆栈栈顶, 并设置 SP
+ ; */
+ JSRI API_InterStackBaseGet
+ MOV SP , A0
+
+ ;/*
+ ; * 获得当前任务 TCB 的 ARCH_REG_CTX 地址
+ ; */
+ JSRI API_ThreadTcbInter
+ MOV A1 , A0
+
+2:
+ PSRSET EE
+
+ ;/*
+ ; * handle(vector, 寄存器上下文)
+ ; */
+ MOVI A0 , \irq
+
+ JSRI \handle
+
+ ;/*
+ ; * API_InterExit()
+ ; * 如果没有发生中断嵌套, 则 API_InterExit 会调用 archIntCtxLoad 函数
+ ; */
+ JSRI API_InterExit
+
+ ;/*
+ ; * 来到这里, 说明发生了中断嵌套
+ ; */
+ MOV A1 , SP
+ RESTORE_REGS
+
+3:
+ ;/*
+ ; * 不是第一次进入中断
+ ; */
+ LRW SP , archExcOldStack
+ LD.W SP , (SP) ;/* 获取异常前 SP 的位置 */
+ SUBI SP , ARCH_REG_CTX_SIZE
+ MOV A1 , SP
+ BR 2b
+ MACRO_END()
+
+;/*********************************************************************************************************
+; 未对齐访问异常入口函数
+;*********************************************************************************************************/
+
+FUNC_DEF(archUnalignedExceptEntry)
+ IRQ_ENTRY 1 archUnalignedExceptHandle
+ FUNC_END(archUnalignedExceptEntry)
+
+;/*********************************************************************************************************
+; 访问错误异常入口函数
+;*********************************************************************************************************/
+
+FUNC_DEF(archAccessExceptEntry)
+ IRQ_ENTRY 2 archAccessExceptHandle
+ FUNC_END(archAccessExceptEntry)
+
+;/*********************************************************************************************************
+; 除零异常入口函数
+;*********************************************************************************************************/
+
+FUNC_DEF(archDivideZeroExceptEntry)
+ IRQ_ENTRY 3 archDivideZeroExceptHandle
+ FUNC_END(archDivideZeroExceptEntry)
+
+;/*********************************************************************************************************
+; 非法指令异常入口函数
+;*********************************************************************************************************/
+
+FUNC_DEF(archIllegalInstExceptEntry)
+ IRQ_ENTRY 4 archIllegalInstExceptHandle
+ FUNC_END(archIllegalInstExceptEntry)
+
+;/*********************************************************************************************************
+; 特权违反异常入口函数
+;*********************************************************************************************************/
+
+FUNC_DEF(archPrivilegeExceptEntry)
+ IRQ_ENTRY 5 archPrivilegeExceptHandle
+ FUNC_END(archPrivilegeExceptEntry)
+
+;/*********************************************************************************************************
+; 跟踪异常入口函数
+;*********************************************************************************************************/
+
+FUNC_DEF(archTrapExceptEntry)
+ IRQ_ENTRY 6 archTrapExceptHandle
+ FUNC_END(archTrapExceptEntry)
+
+;/*********************************************************************************************************
+; 断点异常入口函数
+;*********************************************************************************************************/
+
+FUNC_DEF(archBreakPointExceptEntry)
+ IRQ_ENTRY 7 archBreakPointExceptHandle
+ FUNC_END(archBreakPointExceptEntry)
+
+;/*********************************************************************************************************
+; 不可恢复错误异常入口函数
+;*********************************************************************************************************/
+
+FUNC_DEF(archFatalErrExceptEntry)
+ IRQ_ENTRY 8 archFatalErrExceptHandle
+ FUNC_END(archFatalErrExceptEntry)
+
+;/*********************************************************************************************************
+; Idly 异常入口函数
+;*********************************************************************************************************/
+
+FUNC_DEF(archIdlyExceptEntry)
+ IRQ_ENTRY 9 archIdlyExceptHandle
+ FUNC_END(archIdlyExceptEntry)
+
+;/*********************************************************************************************************
+; 普通中断入口函数
+;*********************************************************************************************************/
+
+FUNC_DEF(archAutoIntEntry)
+ IRQ_ENTRY 10 archAutoIntHandle
+ FUNC_END(archAutoIntEntry)
+
+;/*********************************************************************************************************
+; Reserved 异常入口函数
+;*********************************************************************************************************/
+
+FUNC_DEF(archReservedExceptEntry)
+ IRQ_ENTRY 12 archReservedExceptHandle
+ FUNC_END(archReservedExceptEntry)
+
+;/*********************************************************************************************************
+; 陷阱指令异常 0 入口函数
+;*********************************************************************************************************/
+
+FUNC_DEF(archTrap0ExceptEntry)
+ IRQ_ENTRY 16 archTrap0ExceptHandle
+ FUNC_END(archTrap0ExceptEntry)
+
+;/*********************************************************************************************************
+; 陷阱指令异常 1 入口函数
+;*********************************************************************************************************/
+
+FUNC_DEF(archTrap1ExceptEntry)
+ IRQ_ENTRY 17 archTrap1ExceptHandle
+ FUNC_END(archTrap1ExceptEntry)
+
+;/*********************************************************************************************************
+; 陷阱指令异常 2 入口函数
+;*********************************************************************************************************/
+
+FUNC_DEF(archTrap2ExceptEntry)
+ IRQ_ENTRY 18 archTrap2ExceptHandle
+ FUNC_END(archTrap2ExceptEntry)
+
+;/*********************************************************************************************************
+; 陷阱指令异常 3 入口函数
+;*********************************************************************************************************/
+
+FUNC_DEF(archTrap3ExceptEntry)
+ IRQ_ENTRY 19 archTrap3ExceptHandle
+ FUNC_END(archTrap3ExceptEntry)
+
+;/*********************************************************************************************************
+; TSPEND 中断入口函数
+;*********************************************************************************************************/
+
+FUNC_DEF(archTspendIntEntry)
+ IRQ_ENTRY 22 archTspendIntHandle
+ FUNC_END(archTspendIntEntry)
+
+;/*********************************************************************************************************
+; 浮点运算异常入口函数
+;*********************************************************************************************************/
+
+FUNC_DEF(archFpuExceptEntry)
+ IRQ_ENTRY 30 archFpuExceptHandle
+ FUNC_END(archFpuExceptEntry)
+
+;/*********************************************************************************************************
+; 32 ~ 255 号中断入口函数
+;*********************************************************************************************************/
+
+ .irp Id, \
+ 32, 33, 34, 35, 36, 37, 38, 39, \
+ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, \
+ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, \
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, \
+ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, \
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, \
+ 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, \
+ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, \
+ 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, \
+ 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, \
+ 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, \
+ 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, \
+ 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, \
+ 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, \
+ 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, \
+ 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, \
+ 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, \
+ 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, \
+ 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, \
+ 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, \
+ 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, \
+ 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, \
+ 250, 251, 252, 253, 254, 255
+ EXPORT_LABEL(archIntEntry\Id)
+FUNC_DEF(archIntEntry\Id)
+ IRQ_ENTRY \Id bspIntHandle
+ FUNC_END(archIntEntry\Id)
+ .endr
+
+;/*********************************************************************************************************
+; 异常向量表
+;*********************************************************************************************************/
+
+ .align 10
+FUNC_DEF(vector)
+ .long archResetEntry ;/* 0 - Reset */
+ .long archUnalignedExceptEntry ;/* 1 - Unaligned */
+ .long archAccessExceptEntry ;/* 2 - Access */
+ .long archDivideZeroExceptEntry ;/* 3 - Divide By Zero */
+ .long archIllegalInstExceptEntry ;/* 4 - Illegal Instruction */
+ .long archPrivilegeExceptEntry ;/* 5 - Privilege */
+ .long archTrapExceptEntry ;/* 6 - Trap */
+ .long archBreakPointExceptEntry ;/* 7 - BreakPoint */
+ .long archFatalErrExceptEntry ;/* 8 - Fatal Err */
+ .long archIdlyExceptEntry ;/* 9 - Idly */
+ .long archAutoIntEntry ;/* 10 - Auto */
+ .long archReservedExceptEntry ;/* 11 - Reserved */
+ .long archReservedExceptEntry ;/* 12 - Reserved */
+ .long archReservedExceptEntry ;/* 13 - Reserved */
+ .long archReservedExceptEntry ;/* 14 - Reserved */
+ .long archReservedExceptEntry ;/* 15 - Reserved */
+ .long archTrap0ExceptEntry ;/* 16 - Trap0 */
+ .long archTrap1ExceptEntry ;/* 17 - Trap1 */
+ .long archTrap2ExceptEntry ;/* 18 - Trap2 */
+ .long archTrap3ExceptEntry ;/* 19 - Trap3 */
+ .long archReservedExceptEntry ;/* 20 - Reserved */
+ .long archReservedExceptEntry ;/* 21 - Reserved */
+ .long archTspendIntEntry ;/* 22 - TSPEND */
+ .long archReservedExceptEntry ;/* 23 - Reserved */
+ .long archReservedExceptEntry ;/* 24 - Reserved */
+ .long archReservedExceptEntry ;/* 25 - Reserved */
+ .long archReservedExceptEntry ;/* 26 - Reserved */
+ .long archReservedExceptEntry ;/* 27 - Reserved */
+ .long archReservedExceptEntry ;/* 28 - Reserved */
+ .long archReservedExceptEntry ;/* 29 - Reserved */
+ .long archFpuExceptEntry ;/* 30 - FPU */
+ .long archReservedExceptEntry ;/* 31 - Reserved */
+
+ .irp Id, \
+ 32, 33, 34, 35, 36, 37, 38, 39, \
+ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, \
+ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, \
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, \
+ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, \
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, \
+ 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, \
+ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, \
+ 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, \
+ 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, \
+ 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, \
+ 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, \
+ 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, \
+ 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, \
+ 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, \
+ 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, \
+ 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, \
+ 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, \
+ 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, \
+ 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, \
+ 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, \
+ 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, \
+ 250, 251, 252, 253, 254, 255
+ .long archIntEntry\Id
+ .endr
+ FUNC_END(vector)
+
+ FILE_END()
+
+#endif
+;/*********************************************************************************************************
+; END
+;*********************************************************************************************************/
diff --git a/SylixOS/arch/csky/common/cskyContext.c b/SylixOS/arch/csky/common/cskyContext.c
index 03d446a..efff6bf 100644
--- a/SylixOS/arch/csky/common/cskyContext.c
+++ b/SylixOS/arch/csky/common/cskyContext.c
@@ -22,6 +22,10 @@
#define __SYLIXOS_KERNEL
#include "SylixOS.h"
/*********************************************************************************************************
+ C-SKY 体系架构
+*********************************************************************************************************/
+#if !defined(__SYLIXOS_CSKY_ARCH_CK803__)
+/*********************************************************************************************************
** 函数名称: archTaskCtxCreate
** 功能描述: 创建任务上下文
** 输 入 : pregctx 寄存器上下文
@@ -459,6 +463,8 @@ PLW_STACK archCtxStackEnd (const ARCH_REG_CTX *pregctx)
{
return ((PLW_STACK)pregctx->REG_ulReg[REG_SP]);
}
+
+#endif /* !__SYLIXOS_CSKY_ARCH_CK803__*/
/*********************************************************************************************************
END
*********************************************************************************************************/
diff --git a/SylixOS/arch/csky/common/cskyContextAsm.S b/SylixOS/arch/csky/common/cskyContextAsm.S
index 147b1d2..eb32923 100644
--- a/SylixOS/arch/csky/common/cskyContextAsm.S
+++ b/SylixOS/arch/csky/common/cskyContextAsm.S
@@ -26,6 +26,9 @@
#include <arch/assembler.h>
#include <config/kernel/kernel_cfg.h>
#include <config/mp/mp_cfg.h>
+
+#if !defined(__SYLIXOS_CSKY_ARCH_CK803__)
+
#include "cskyContextAsm.h"
FILE_BEGIN()
@@ -163,6 +166,7 @@ FUNC_DEF(archTaskCtxCopy)
FILE_END()
+#endif
;/*********************************************************************************************************
; END
;*********************************************************************************************************/
diff --git a/SylixOS/arch/csky/common/cskyExc.c b/SylixOS/arch/csky/common/cskyExc.c
index a655eaa..9471bc2 100644
--- a/SylixOS/arch/csky/common/cskyExc.c
+++ b/SylixOS/arch/csky/common/cskyExc.c
@@ -28,6 +28,10 @@
#endif
#include "arch/csky/param/cskyParam.h"
/*********************************************************************************************************
+ C-SKY 体系架构
+*********************************************************************************************************/
+#if !defined(__SYLIXOS_CSKY_ARCH_CK803__)
+/*********************************************************************************************************
向量使能与禁能锁
*********************************************************************************************************/
#if LW_CFG_SMP_EN > 0
@@ -531,6 +535,8 @@ VOID archUnalignedExceptHandle (ULONG ulVector, ARCH_REG_CTX *pregctx)
API_VmmAbortIsr(pregctx->REG_ulPc, pregctx->REG_ulPc, &abtInfo, ptcbCur);
}
}
+
+#endif /* !__SYLIXOS_CSKY_ARCH_CK803__*/
/*********************************************************************************************************
END
*********************************************************************************************************/
diff --git a/SylixOS/arch/csky/common/cskyExcAsm.S b/SylixOS/arch/csky/common/cskyExcAsm.S
index 773aafa..beb1bb7 100644
--- a/SylixOS/arch/csky/common/cskyExcAsm.S
+++ b/SylixOS/arch/csky/common/cskyExcAsm.S
@@ -26,6 +26,9 @@
#include <arch/assembler.h>
#include <config/kernel/kernel_cfg.h>
#include <config/mp/mp_cfg.h>
+
+#if !defined(__SYLIXOS_CSKY_ARCH_CK803__)
+
#include "cskyContextAsm.h"
FILE_BEGIN()
@@ -107,7 +110,7 @@ MACRO_DEF(IRQ_ENTRY irq handle)
MTCR SP , SS1 ;/* SS1 暂存异常前 SP */
MFCR SP , SS0 ;/* SP = 异常临时栈 */
- SUBI SP , ARCH_REG_CTX_SIZE ;/* 在临时堆栈开辟上下文保存区 */
+ SUBI SP , ARCH_REG_CTX_SIZE ;/* 在临时堆栈开辟上下文保存区 */
STM R0-R31 , (SP)
@@ -464,6 +467,7 @@ FUNC_DEF(vector)
FILE_END()
+#endif
;/*********************************************************************************************************
; END
;*********************************************************************************************************/
diff --git a/SylixOS/arch/csky/common/cskyLibAsm.S b/SylixOS/arch/csky/common/cskyLibAsm.S
index 43c88a2..8f673a2 100644
--- a/SylixOS/arch/csky/common/cskyLibAsm.S
+++ b/SylixOS/arch/csky/common/cskyLibAsm.S
@@ -147,6 +147,7 @@ MACRO_DEF(SAVE_NON_VOLATILE_REG)
ST.W R11 , (A0 , XGREG(11))
ST.W R14 , (A0 , XGREG(14))
ST.W R15 , (A0 , XGREG(15))
+#if !defined(__SYLIXOS_CSKY_ARCH_CK803__)
ST.W R16 , (A0 , XGREG(16))
ST.W R17 , (A0 , XGREG(17))
ST.W R26 , (A0 , XGREG(26))
@@ -155,6 +156,9 @@ MACRO_DEF(SAVE_NON_VOLATILE_REG)
ST.W R29 , (A0 , XGREG(29))
ST.W R30 , (A0 , XGREG(30))
ST.W R31 , (A0 , XGREG(31))
+#else
+ ST.W R28 , (A0 , XGREG28)
+#endif
MACRO_END()
;/*********************************************************************************************************
@@ -173,6 +177,7 @@ MACRO_DEF(RESTORE_NON_VOLATILE_REG)
LD.W R11 , (A0 , XGREG(11))
LD.W R14 , (A0 , XGREG(14))
LD.W R15 , (A0 , XGREG(15))
+#if !defined(__SYLIXOS_CSKY_ARCH_CK803__)
LD.W R16 , (A0 , XGREG(16))
LD.W R17 , (A0 , XGREG(17))
LD.W R26 , (A0 , XGREG(26))
@@ -181,6 +186,9 @@ MACRO_DEF(RESTORE_NON_VOLATILE_REG)
LD.W R29 , (A0 , XGREG(29))
LD.W R30 , (A0 , XGREG(30))
LD.W R31 , (A0 , XGREG(31))
+#else
+ LD.W R28 , (A0 , XGREG28)
+#endif
MACRO_END()
;/*********************************************************************************************************
diff --git a/SylixOS/arch/csky/csky_support.h b/SylixOS/arch/csky/csky_support.h
index 64e9d9c..ff92f1a 100644
--- a/SylixOS/arch/csky/csky_support.h
+++ b/SylixOS/arch/csky/csky_support.h
@@ -179,6 +179,14 @@ VOID archMmuInit(CPCHAR pcMachineName);
#endif /* LW_CFG_VMM_EN > 0 */
/*********************************************************************************************************
+ C-SKY 处理器 MPU 操作 (bsp 初始化阶段直接调用下面函数初始化 MPU)
+*********************************************************************************************************/
+
+#if (LW_CFG_VMM_EN == 0) && (LW_CFG_CSKY_MPU > 0)
+VOID archMpuInit(CPCHAR pcMachineName, const CSKY_MPU_REGION mpuregion[]);
+#endif
+
+/*********************************************************************************************************
C-SKY 处理器多核自旋锁操作
*********************************************************************************************************/
diff --git a/SylixOS/arch/csky/fpu/fpu/cskyVfp.c b/SylixOS/arch/csky/fpu/fpu/cskyVfp.c
index c6687c5..235b47c 100644
--- a/SylixOS/arch/csky/fpu/fpu/cskyVfp.c
+++ b/SylixOS/arch/csky/fpu/fpu/cskyVfp.c
@@ -59,9 +59,14 @@ static VOID cskyVfpCtxShow (INT iFd, PVOID pvFpuCtx)
fdprintf(iFd, "FESR = 0x%08x\n", pcpufpuCtx->FPUCTX_uiFpesr);
for (i = 0; i < FPU_REG_NR; i++) {
+#if defined(__SYLIXOS_CSKY_ARCH_CK803__)
+ fdprintf(iFd, "FP%02d = 0x%08x\n", i,
+ pcpufpuCtx->FPUCTX_uiDreg[i].val32[0]);
+#else
fdprintf(iFd, "FP%02d = 0x%08x0x%08x\n", i,
pcpufpuCtx->FPUCTX_uiDreg[i].val32[0],
pcpufpuCtx->FPUCTX_uiDreg[i].val32[1]);
+#endif /* __SYLIXOS_CSKY_ARCH_CK803__ */
}
#endif
}
diff --git a/SylixOS/arch/csky/fpu/fpu/cskyVfpAsm.S b/SylixOS/arch/csky/fpu/fpu/cskyVfpAsm.S
index de6d1d2..b156c28 100644
--- a/SylixOS/arch/csky/fpu/fpu/cskyVfpAsm.S
+++ b/SylixOS/arch/csky/fpu/fpu/cskyVfpAsm.S
@@ -42,7 +42,19 @@
; 宏定义
;*********************************************************************************************************/
-#define FCR_ENABLE (IDE_STAT | UFE_STAT | OFE_STAT | DZE_STAT | IOE_STAT)
+#if defined(__SYLIXOS_CSKY_ARCH_CK803__)
+
+MACRO_DEF(FPU_REG_RESTORE fr, tmp, base, offset)
+ LD.W \tmp , (\base , \offset)
+ FMTVRL \fr , \tmp
+ MACRO_END()
+
+MACRO_DEF(FPU_REG_SAVE fr, tmp, base, offset)
+ FMFVRL \tmp , \fr
+ ST.W \tmp , (\base , \offset)
+ MACRO_END()
+
+#else
MACRO_DEF(FPU_REG_RESTORE fr, tmp, base, offsetl, offseth)
LD.W \tmp , (\base , \offsetl)
@@ -58,6 +70,8 @@ MACRO_DEF(FPU_REG_SAVE fr, tmp, base, offsetl, offseth)
ST.W \tmp , (\base , \offseth)
MACRO_END()
+#endif
+
;/*********************************************************************************************************
; 使能 FPU
;*********************************************************************************************************/
@@ -80,39 +94,43 @@ FUNC_DEF(cskyVfpInit)
MOVI A0 , 0
FMTVRL FR0 , A0 ;/* 清零 FPU 寄存器 */
- FMTVRH FR0 , A0
FMTVRL FR1 , A0
- FMTVRH FR1 , A0
FMTVRL FR2 , A0
- FMTVRH FR2 , A0
FMTVRL FR3 , A0
- FMTVRH FR3 , A0
FMTVRL FR4 , A0
- FMTVRH FR4 , A0
FMTVRL FR5 , A0
- FMTVRH FR5 , A0
FMTVRL FR6 , A0
- FMTVRH FR6 , A0
FMTVRL FR7 , A0
- FMTVRH FR7 , A0
FMTVRL FR8 , A0
- FMTVRH FR8 , A0
FMTVRL FR9 , A0
- FMTVRH FR9 , A0
FMTVRL FR10, A0
- FMTVRH FR10, A0
FMTVRL FR11, A0
- FMTVRH FR11, A0
FMTVRL FR12, A0
- FMTVRH FR12, A0
FMTVRL FR13, A0
- FMTVRH FR13, A0
FMTVRL FR14, A0
- FMTVRH FR14, A0
FMTVRL FR15, A0
+
+#if !defined(__SYLIXOS_CSKY_ARCH_CK803__)
+
+ FMTVRH FR0 , A0
+ FMTVRH FR1 , A0
+ FMTVRH FR2 , A0
+ FMTVRH FR3 , A0
+ FMTVRH FR4 , A0
+ FMTVRH FR5 , A0
+ FMTVRH FR6 , A0
+ FMTVRH FR7 , A0
+ FMTVRH FR8 , A0
+ FMTVRH FR9 , A0
+ FMTVRH FR10, A0
+ FMTVRH FR11, A0
+ FMTVRH FR12, A0
+ FMTVRH FR13, A0
+ FMTVRH FR14, A0
FMTVRH FR15, A0
-
- MTCR A1 , CR<1, 2> ;/* 恢复原 FPU 开关状态 */
+
+#endif
+
RTS
FUNC_END(cskyVfpInit)
@@ -156,8 +174,27 @@ FUNC_DEF(cskyVfpIsEnable)
;*********************************************************************************************************/
FUNC_DEF(cskyVfpSave)
- ENABLE_FPU ;/* 使能 FPU */
+#if defined(__SYLIXOS_CSKY_ARCH_CK803__)
+
+ FPU_REG_SAVE FR0 , A1, A0, FPU_OFFSET_REG(0)
+ FPU_REG_SAVE FR1 , A1, A0, FPU_OFFSET_REG(1)
+ FPU_REG_SAVE FR2 , A1, A0, FPU_OFFSET_REG(2)
+ FPU_REG_SAVE FR3 , A1, A0, FPU_OFFSET_REG(3)
+ FPU_REG_SAVE FR4 , A1, A0, FPU_OFFSET_REG(4)
+ FPU_REG_SAVE FR5 , A1, A0, FPU_OFFSET_REG(5)
+ FPU_REG_SAVE FR6 , A1, A0, FPU_OFFSET_REG(6)
+ FPU_REG_SAVE FR7 , A1, A0, FPU_OFFSET_REG(7)
+ FPU_REG_SAVE FR8 , A1, A0, FPU_OFFSET_REG(8)
+ FPU_REG_SAVE FR9 , A1, A0, FPU_OFFSET_REG(9)
+ FPU_REG_SAVE FR10, A1, A0, FPU_OFFSET_REG(10)
+ FPU_REG_SAVE FR11, A1, A0, FPU_OFFSET_REG(11)
+ FPU_REG_SAVE FR12, A1, A0, FPU_OFFSET_REG(12)
+ FPU_REG_SAVE FR13, A1, A0, FPU_OFFSET_REG(13)
+ FPU_REG_SAVE FR14, A1, A0, FPU_OFFSET_REG(14)
+ FPU_REG_SAVE FR15, A1, A0, FPU_OFFSET_REG(15)
+
+#else
FPU_REG_SAVE FR0 , A1, A0, FPU_OFFSET_REG_LO(0), FPU_OFFSET_REG_HI(0)
FPU_REG_SAVE FR1 , A1, A0, FPU_OFFSET_REG_LO(1), FPU_OFFSET_REG_HI(1)
FPU_REG_SAVE FR2 , A1, A0, FPU_OFFSET_REG_LO(2), FPU_OFFSET_REG_HI(2)
@@ -175,6 +212,8 @@ FUNC_DEF(cskyVfpSave)
FPU_REG_SAVE FR14, A1, A0, FPU_OFFSET_REG_LO(14), FPU_OFFSET_REG_HI(14)
FPU_REG_SAVE FR15, A1, A0, FPU_OFFSET_REG_LO(15), FPU_OFFSET_REG_HI(15)
+#endif
+
MFCR A1 , CR<1, 2>
ST.W A1 , (A0 , FPU_OFFSET_FCR) ;/* 保存 FCR 状态寄存器 */
@@ -193,7 +232,28 @@ FUNC_DEF(cskyVfpRestore)
LD.W A1 , (A0 , FPU_OFFSET_FESR) ;/* 恢复 FECR 状态寄存器 */
MTCR A1 , CR<2, 2>
-
+
+#if defined(__SYLIXOS_CSKY_ARCH_CK803__)
+
+ FPU_REG_RESTORE FR0 , A1, A0, FPU_OFFSET_REG(0)
+ FPU_REG_RESTORE FR1 , A1, A0, FPU_OFFSET_REG(1)
+ FPU_REG_RESTORE FR2 , A1, A0, FPU_OFFSET_REG(2)
+ FPU_REG_RESTORE FR3 , A1, A0, FPU_OFFSET_REG(3)
+ FPU_REG_RESTORE FR4 , A1, A0, FPU_OFFSET_REG(4)
+ FPU_REG_RESTORE FR5 , A1, A0, FPU_OFFSET_REG(5)
+ FPU_REG_RESTORE FR6 , A1, A0, FPU_OFFSET_REG(6)
+ FPU_REG_RESTORE FR7 , A1, A0, FPU_OFFSET_REG(7)
+ FPU_REG_RESTORE FR8 , A1, A0, FPU_OFFSET_REG(8)
+ FPU_REG_RESTORE FR9 , A1, A0, FPU_OFFSET_REG(9)
+ FPU_REG_RESTORE FR10, A1, A0, FPU_OFFSET_REG(10)
+ FPU_REG_RESTORE FR11, A1, A0, FPU_OFFSET_REG(11)
+ FPU_REG_RESTORE FR12, A1, A0, FPU_OFFSET_REG(12)
+ FPU_REG_RESTORE FR13, A1, A0, FPU_OFFSET_REG(13)
+ FPU_REG_RESTORE FR14, A1, A0, FPU_OFFSET_REG(14)
+ FPU_REG_RESTORE FR15, A1, A0, FPU_OFFSET_REG(15)
+
+#else
+
FPU_REG_RESTORE FR0 , A1, A0, FPU_OFFSET_REG_LO(0), FPU_OFFSET_REG_HI(0)
FPU_REG_RESTORE FR1 , A1, A0, FPU_OFFSET_REG_LO(1), FPU_OFFSET_REG_HI(1)
FPU_REG_RESTORE FR2 , A1, A0, FPU_OFFSET_REG_LO(2), FPU_OFFSET_REG_HI(2)
@@ -210,7 +270,8 @@ FUNC_DEF(cskyVfpRestore)
FPU_REG_RESTORE FR13, A1, A0, FPU_OFFSET_REG_LO(13), FPU_OFFSET_REG_HI(13)
FPU_REG_RESTORE FR14, A1, A0, FPU_OFFSET_REG_LO(14), FPU_OFFSET_REG_HI(14)
FPU_REG_RESTORE FR15, A1, A0, FPU_OFFSET_REG_LO(15), FPU_OFFSET_REG_HI(15)
-
+#endif
+
LD.W A1 , (A0 , FPU_OFFSET_FCR) ;/* 恢复 FCR 状态寄存器 */
MTCR A1 , CR<1, 2>
diff --git a/SylixOS/arch/csky/mm/cache/ck803/cskyCacheCK803.c b/SylixOS/arch/csky/mm/cache/ck803/cskyCacheCK803.c
new file mode 100644
index 0000000..1ec1941
--- /dev/null
+++ b/SylixOS/arch/csky/mm/cache/ck803/cskyCacheCK803.c
@@ -0,0 +1,992 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM)
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: cskyCacheCK803.c
+**
+** 创 建 人: Wang.Xuan (王翾)
+**
+** 文件创建日期: 2018 年 11 月 12 日
+**
+** 描 述: C-SKY CK803 体系架构 CACHE 驱动.
+*********************************************************************************************************/
+#define __SYLIXOS_KERNEL
+#include "SylixOS.h"
+/*********************************************************************************************************
+ C-SKY 体系架构
+*********************************************************************************************************/
+#if defined(__SYLIXOS_CSKY_ARCH_CK803__)
+/*********************************************************************************************************
+ 裁剪支持
+*********************************************************************************************************/
+#if LW_CFG_CACHE_EN > 0
+#include "../../mpu/cskyMpu.h"
+/*********************************************************************************************************
+ L2 CACHE 支持
+*********************************************************************************************************/
+#if LW_CFG_CSKY_CACHE_L2 > 0
+#include "../l2/cskyL2.h"
+/*********************************************************************************************************
+ L1 CACHE 状态
+*********************************************************************************************************/
+#define L1_CACHE_I_EN 0x01
+#define L1_CACHE_D_EN 0x02
+#define L1_CACHE_EN (L1_CACHE_I_EN | L1_CACHE_D_EN)
+#define L1_CACHE_DIS 0x00
+
+static INT iCacheStatus = L1_CACHE_DIS;
+#endif /* LW_CFG_CSKY_CACHE_L2 > 0 */
+/*********************************************************************************************************
+ CACHE 参数
+*********************************************************************************************************/
+typedef struct {
+ UINT32 CACHE_uiSize; /* CACHE 大小 */
+ UINT32 CACHE_uiLineSize; /* CACHE 行大小 */
+ UINT32 CACHE_uiWaySize; /* 路大小 */
+} CSKY_CACHE;
+
+static CSKY_CACHE _G_ICacheInfo = {
+ 4 * LW_CFG_KB_SIZE, /* 4KB 的四路组相联 ICACHE */
+ 16,
+ 1 * LW_CFG_KB_SIZE
+};
+
+static CSKY_CACHE _G_DCacheInfo = {
+ 4 * LW_CFG_KB_SIZE, /* 4KB 的四路组相联 DCACHE */
+ 16,
+ 1 * LW_CFG_KB_SIZE
+};
+
+#define CSKY_ICACHE_SIZE _G_ICacheInfo.CACHE_uiSize
+#define CSKY_DCACHE_SIZE _G_DCacheInfo.CACHE_uiSize
+
+#define CSKY_ICACHE_LINE_SIZE _G_ICacheInfo.CACHE_uiLineSize
+#define CSKY_DCACHE_LINE_SIZE _G_DCacheInfo.CACHE_uiLineSize
+
+#define CSKY_ICACHE_WAY_SIZE _G_ICacheInfo.CACHE_uiWaySize
+#define CSKY_DCACHE_WAY_SIZE _G_DCacheInfo.CACHE_uiWaySize
+
+#define CSKY_L1_CACHE_LOOP_OP_MAX_SIZE (CSKY_DCACHE_SIZE >> 1)
+/*********************************************************************************************************
+ CACHE 获得 pvAdrs 与 pvEnd 位置
+*********************************************************************************************************/
+#define CSKY_CACHE_GET_END(pvAdrs, stBytes, ulEnd, uiLineSize) \
+ do { \
+ ulEnd = (addr_t)((size_t)pvAdrs + stBytes); \
+ pvAdrs = (PVOID)((addr_t)pvAdrs & ~((addr_t)uiLineSize - 1)); \
+ } while (0)
+/*********************************************************************************************************
+ On chip cache structure.
+*********************************************************************************************************/
+typedef struct
+{
+ volatile UINT32 CER; /* Cache enable register */
+ volatile UINT32 CIR; /* Cache invalid register */
+ volatile UINT32 CRCR[4U]; /* Cache Configuration register */
+ volatile UINT32 RSERVED0[1015U];
+ volatile UINT32 CPFCR; /* Cache performance analisis control register */
+ volatile UINT32 CPFATR; /* Cache access times register */
+ volatile UINT32 CPFMTR; /* Cache missing times register */
+} CACHE_Type;
+/*********************************************************************************************************
+ Memory mapping of CK803 Hardware
+*********************************************************************************************************/
+#define TCIP_BASE (0xe000e000ul) /* Titly Coupled IP Base Addr */
+#define CACHE_BASE (TCIP_BASE + 0x1000ul) /* CACHE Base Address */
+
+#define CACHE ((CACHE_Type *)CACHE_BASE) /* cache configuration struct */
+/*********************************************************************************************************
+ CACHE Register Definitions
+*********************************************************************************************************/
+#define CACHE_CER_EN_Pos 0u /* CACHE CER: EN Position */
+#define CACHE_CER_EN_Msk (0x1ul << CACHE_CER_EN_Pos)
+
+#define CACHE_CER_CFIG_Pos 1u /* CACHE CER: CFIG Position */
+#define CACHE_CER_CFIG_Msk (0x1ul << CACHE_CER_CFIG_Pos)
+
+#define CACHE_CER_WB_Pos 2u /* CACHE CER: WB Position */
+#define CACHE_CER_WB_Msk (0x1ul << CACHE_CER_WB_Pos)
+
+#define CACHE_CER_WCFIG_Pos 3u /* CACHE CER: WCFIG Position */
+#define CACHE_CER_WCFIG_Msk (0x1ul << CACHE_CER_WCFIG_Pos)
+
+#define CACHE_CER_DCW_Pos 4u /* CACHE CER: DCW Position */
+#define CACHE_CER_DCW_Msk (0x1ul << CACHE_CER_DCW_Pos)
+
+#define CACHE_CER_WA_Pos 5u /* CACHE CER: WA Position */
+#define CACHE_CER_WA_Msk (0x1ul << CACHE_CER_WA_Pos)
+
+#define CACHE_CIR_INV_ALL_Pos 0u /* CACHE CIR: INV_ALL Position */
+#define CACHE_CIR_INV_ALL_Msk (0x1ul << CACHE_CIR_INV_ALL_Pos)
+
+#define CACHE_CIR_INV_ONE_Pos 1u /* CACHE CIR: INV_ONE Position */
+#define CACHE_CIR_INV_ONE_Msk (0x1ul << CACHE_CIR_INV_ONE_Pos)
+
+#define CACHE_CIR_CLR_ALL_Pos 2u /* CACHE CIR: CLR_ALL Position */
+#define CACHE_CIR_CLR_ALL_Msk (0x1ul << CACHE_CIR_CLR_ALL_Pos)
+
+#define CACHE_CIR_CLR_ONE_Pos 3u /* CACHE CIR: CLR_ONE Position */
+#define CACHE_CIR_CLR_ONE_Msk (0x1ul << CACHE_CIR_CLR_ONE_Pos)
+
+#define CACHE_CIR_INV_ADDR_Pos 4u /* CACHE CIR: INV_ADDR Position*/
+#define CACHE_CIR_INV_ADDR_Msk (0xffffffful << CACHE_CIR_INV_ADDR_Pos)
+
+#define CACHE_CRCR_EN_Pos 0u /* CACHE CRCR: EN Position */
+#define CACHE_CRCR_EN_Msk (0x1ul << CACHE_CRCR_EN_Pos)
+
+#define CACHE_CRCR_SIZE_Pos 1u /* CACHE CRCR: Size Position */
+#define CACHE_CRCR_SIZE_Msk (0x1ful << CACHE_CRCR_SIZE_Pos)
+
+#define CACHE_CRCR_BASE_ADDR_Pos 10u /* CACHE CRCR: base addr Pos */
+#define CACHE_CRCR_BASE_ADDR_Msk (0x3ffffful << CACHE_CRCR_BASE_ADDR_Pos)
+
+#define CACHE_CPFCR_PFEN_Pos 0u /* CACHE CPFCR: PFEN Position */
+#define CACHE_CPFCR_PFEN_Msk (0x1ul << CACHE_CPFCR_PFEN_Pos)
+
+#define CACHE_CPFCR_PFRST_Pos 1U /* CACHE CPFCR: PFRST Position */
+#define CACHE_CPFCR_PFRST_Msk (0x1ul << CACHE_CPFCR_PFRST_Pos)
+/*********************************************************************************************************
+ Mask and shift operation.
+*********************************************************************************************************/
+#define _VAL2FLD(field, value) ((value << field ## _Pos) & field ## _Msk)
+#define _FLD2VAL(field, value) ((value & field ## _Msk) >> field ## _Pos)
+/*********************************************************************************************************
+** 函数名称: cskyICacheCK803Enable
+** 功能描述: 使能 ICACHE
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+LW_WEAK VOID cskyICacheCK803Enable (VOID)
+{
+ CACHE->CIR = CACHE_CIR_INV_ALL_Msk; /* invalidate all Cache */
+ CACHE->CER |= (UINT32)(CACHE_CER_EN_Msk | CACHE_CER_CFIG_Msk); /* enable all Cache */
+}
+/*********************************************************************************************************
+** 函数名称: cskyDCacheCK803Enable
+** 功能描述: 使能 DCACHE
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+LW_WEAK VOID cskyDCacheCK803Enable (VOID)
+{
+ CACHE->CIR = CACHE_CIR_INV_ALL_Msk; /* invalidate all Cache */
+ CACHE->CER = (UINT32)(CACHE_CER_EN_Msk | CACHE_CER_WB_Msk | CACHE_CER_DCW_Msk);
+ /* enable all Cache */
+}
+/*********************************************************************************************************
+** 函数名称: cskyICacheCK803Disable
+** 功能描述: 禁能 ICACHE
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+LW_WEAK VOID cskyICacheCK803Disable (VOID)
+{
+ CACHE->CER &= ~(UINT32)(CACHE_CER_EN_Msk | CACHE_CER_CFIG_Msk); /* disable all Cache */
+ CACHE->CIR = CACHE_CIR_INV_ALL_Msk; /* invalidate all Cache */
+}
+/*********************************************************************************************************
+** 函数名称: cskyDCacheCK803Disable
+** 功能描述: 禁能 DCACHE
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+LW_WEAK VOID cskyDCacheCK803Disable (VOID)
+{
+ CACHE->CER &= ~(UINT32)CACHE_CER_EN_Msk; /* disable all Cache */
+ CACHE->CIR = CACHE_CIR_INV_ALL_Msk; /* invalidate all Cache */
+}
+/*********************************************************************************************************
+** 函数名称: cskyICacheCK803InvalidateAll
+** 功能描述: 无效所有 ICACHE
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+LW_WEAK VOID cskyICacheCK803InvalidateAll (VOID)
+{
+ CACHE->CIR = CACHE_CIR_INV_ALL_Msk; /* invalidate all Cache */
+}
+/*********************************************************************************************************
+** 函数名称: cskyDCacheCK803FlushAll
+** 功能描述: 回写所有 DCACHE
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+LW_WEAK VOID cskyDCacheCK803FlushAll (VOID)
+{
+ CACHE->CIR = _VAL2FLD(CACHE_CIR_CLR_ALL, 1); /* clean all Cache */
+}
+/*********************************************************************************************************
+** 函数名称: cskyDCacheCK803ClearAll
+** 功能描述: 回写并无效所有 DCACHE
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+LW_WEAK VOID cskyDCacheCK803ClearAll (VOID)
+{
+ CACHE->CIR = _VAL2FLD(CACHE_CIR_INV_ALL, 1) | _VAL2FLD(CACHE_CIR_CLR_ALL, 1);
+ /* clean and inv all Cache */
+}
+/*********************************************************************************************************
+** 函数名称: cskyICacheCK803Invalidate
+** 功能描述: 无效指定区间的 ICACHE
+** 输 入 : pvStart 起始地址
+** pvEnd 结束地址
+** uiStep 步进
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+LW_WEAK VOID cskyICacheCK803Invalidate (PVOID pvStart, PVOID pvEnd, UINT32 uiStep)
+{
+ UINT32 uiOpAddr = (UINT32)pvStart & CACHE_CIR_INV_ADDR_Msk;
+ UINT32 uiLineSize = 16;
+ INT32 iOpSize = (UINT32)pvEnd - (UINT32)pvStart;
+
+ uiOpAddr |= _VAL2FLD(CACHE_CIR_INV_ONE, 1);
+
+ while (iOpSize >= 128) {
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+
+ iOpSize -= 128;
+ }
+
+ while (iOpSize > 0) {
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ iOpSize -= uiLineSize;
+ }
+}
+/*********************************************************************************************************
+** 函数名称: cskyDCacheCK803Invalidate
+** 功能描述: 无效指定区间的 DCACHE
+** 输 入 : pvStart 起始地址
+** pvEnd 结束地址
+** uiStep 步进
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+LW_WEAK VOID cskyDCacheCK803Invalidate (PVOID pvStart, PVOID pvEnd, UINT32 uiStep)
+{
+ UINT32 uiOpAddr = (UINT32)pvStart & CACHE_CIR_INV_ADDR_Msk;
+ UINT32 uiLineSize = 16;
+ INT32 iOpSize = (UINT32)pvEnd - (UINT32)pvStart;
+
+ if (iOpSize == 0) {
+ iOpSize = uiLineSize;
+ }
+
+ uiOpAddr |= _VAL2FLD(CACHE_CIR_INV_ONE, 1);
+
+ while (iOpSize >= 128) {
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+
+ iOpSize -= 128;
+ }
+
+ while (iOpSize > 0) {
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ iOpSize -= uiLineSize;
+ }
+}
+/*********************************************************************************************************
+** 函数名称: cskyDCacheCK803Flush
+** 功能描述: 回写指定区间的 DCACHE
+** 输 入 : pvStart 起始地址
+** pvEnd 结束地址
+** uiStep 步进
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+LW_WEAK VOID cskyDCacheCK803Flush (PVOID pvStart, PVOID pvEnd, UINT32 uiStep)
+{
+ UINT32 uiOpAddr = (UINT32)pvStart & CACHE_CIR_INV_ADDR_Msk;
+ UINT32 uiLineSize = 16;
+ INT32 iOpSize = (UINT32)pvEnd - (UINT32)pvStart;
+
+ if (iOpSize == 0) {
+ iOpSize = uiLineSize;
+ }
+
+ uiOpAddr |= _VAL2FLD(CACHE_CIR_CLR_ONE, 1);
+
+ while (iOpSize >= 128) {
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+
+ iOpSize -= 128;
+ }
+
+ while (iOpSize > 0) {
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ iOpSize -= uiLineSize;
+ }
+}
+/*********************************************************************************************************
+** 函数名称: cskyDCacheCK803Clear
+** 功能描述: 回写并无效指定区间的 DCACHE
+** 输 入 : pvStart 起始地址
+** pvEnd 结束地址
+** uiStep 步进
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+LW_WEAK VOID cskyDCacheCK803Clear (PVOID pvStart, PVOID pvEnd, UINT32 uiStep)
+{
+ UINT32 uiOpAddr = (UINT32)pvStart & CACHE_CIR_INV_ADDR_Msk;
+ UINT32 uiLineSize = 16;
+ INT32 iOpSize = (UINT32)pvEnd - (UINT32)pvStart;
+
+ if (iOpSize == 0) {
+ iOpSize = uiLineSize;
+ }
+
+ uiOpAddr |= _VAL2FLD(CACHE_CIR_INV_ONE, 1) | _VAL2FLD(CACHE_CIR_CLR_ONE, 1);
+
+ while (iOpSize >= 128) {
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+
+ iOpSize -= 128;
+ }
+
+ while (iOpSize > 0) {
+ CACHE->CIR = uiOpAddr;
+ uiOpAddr += uiLineSize;
+ iOpSize -= uiLineSize;
+ }
+}
+/*********************************************************************************************************
+** 函数名称: cskyBranchPredictorCK803Invalidate
+** 功能描述: 无效分支预测
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+LW_WEAK VOID cskyBranchPredictorCK803Invalidate (VOID)
+{
+}
+/*********************************************************************************************************
+** 函数名称: cskyBranchPredictionCK803Disable
+** 功能描述: 禁能分支预测
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+LW_WEAK VOID cskyBranchPredictionCK803Disable (VOID)
+{
+}
+/*********************************************************************************************************
+** 函数名称: cskyBranchPredictionCK803Enable
+** 功能描述: 使能分支预测
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+LW_WEAK VOID cskyBranchPredictionCK803Enable (VOID)
+{
+}
+/*********************************************************************************************************
+** 函数名称: cskyCacheCK803Enable
+** 功能描述: 使能 CACHE
+** 输 入 : cachetype INSTRUCTION_CACHE / DATA_CACHE
+** 输 出 : ERROR or OK
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static INT cskyCacheCK803Enable (LW_CACHE_TYPE cachetype)
+{
+ if (cachetype == INSTRUCTION_CACHE) {
+ cskyICacheCK803Enable();
+#if LW_CFG_CSKY_CACHE_L2 > 0
+ if (LW_CPU_GET_CUR_ID() == 0) {
+ iCacheStatus |= L1_CACHE_I_EN;
+ }
+#endif /* LW_CFG_CSKY_CACHE_L2 > 0 */
+ cskyBranchPredictionCK803Enable();
+
+ } else {
+ cskyDCacheCK803Enable();
+#if LW_CFG_CSKY_CACHE_L2 > 0
+ if (LW_CPU_GET_CUR_ID() == 0) {
+ iCacheStatus |= L1_CACHE_D_EN;
+ }
+#endif /* LW_CFG_CSKY_CACHE_L2 > 0 */
+ }
+
+#if LW_CFG_CSKY_CACHE_L2 > 0
+ if ((LW_CPU_GET_CUR_ID() == 0) &&
+ (iCacheStatus == L1_CACHE_EN)) {
+ cskyL2CK803Enable();
+ }
+#endif /* LW_CFG_CSKY_CACHE_L2 > 0 */
+
+ return (ERROR_NONE);
+}
+/*********************************************************************************************************
+** 函数名称: cskyCacheCK803Disable
+** 功能描述: 禁能 CACHE
+** 输 入 : cachetype INSTRUCTION_CACHE / DATA_CACHE
+** 输 出 : ERROR or OK
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static INT cskyCacheCK803Disable (LW_CACHE_TYPE cachetype)
+{
+ if (cachetype == INSTRUCTION_CACHE) {
+ cskyICacheCK803Disable();
+#if LW_CFG_ARM_CACHE_L2 > 0
+ if (LW_CPU_GET_CUR_ID() == 0) {
+ iCacheStatus &= ~L1_CACHE_I_EN;
+ }
+#endif /* LW_CFG_ARM_CACHE_L2 > 0 */
+ cskyBranchPredictionCK803Disable();
+
+ } else {
+ cskyDCacheCK803Disable();
+#if LW_CFG_ARM_CACHE_L2 > 0
+ if (LW_CPU_GET_CUR_ID() == 0) {
+ iCacheStatus &= ~L1_CACHE_D_EN;
+ }
+#endif /* LW_CFG_ARM_CACHE_L2 > 0 */
+ }
+
+#if LW_CFG_ARM_CACHE_L2 > 0
+ if ((LW_CPU_GET_CUR_ID() == 0) &&
+ (iCacheStatus == L1_CACHE_DIS)) {
+ cskyL2CK803Disable();
+ }
+#endif /* LW_CFG_ARM_CACHE_L2 > 0 */
+
+ return (ERROR_NONE);
+}
+/*********************************************************************************************************
+** 函数名称: cskyCacheCK803Flush
+** 功能描述: CACHE 脏数据回写
+** 输 入 : cachetype CACHE 类型
+** pvAdrs 虚拟地址
+** stBytes 长度
+** 输 出 : ERROR or OK
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static INT cskyCacheCK803Flush (LW_CACHE_TYPE cachetype, PVOID pvAdrs, size_t stBytes)
+{
+ addr_t ulEnd;
+
+ if (cachetype == DATA_CACHE) {
+ if (stBytes >= CSKY_L1_CACHE_LOOP_OP_MAX_SIZE) {
+ cskyDCacheCK803FlushAll(); /* 全部回写 */
+
+ } else {
+ CSKY_CACHE_GET_END(pvAdrs, stBytes, ulEnd, CSKY_DCACHE_LINE_SIZE);
+ cskyDCacheCK803Flush(pvAdrs, (PVOID)ulEnd,
+ CSKY_DCACHE_LINE_SIZE); /* 部分回写 */
+ }
+
+#if LW_CFG_CSKY_CACHE_L2 > 0
+ cskyL2CK803FlushAll();
+#endif /* LW_CFG_CSKY_CACHE_L2 > 0 */
+ }
+
+ return (ERROR_NONE);
+}
+/*********************************************************************************************************
+** 函数名称: cskyCacheCK803FlushPage
+** 功能描述: CACHE 脏数据回写
+** 输 入 : cachetype CACHE 类型
+** pvAdrs 虚拟地址
+** pvPdrs 物理地址
+** stBytes 长度
+** 输 出 : ERROR or OK
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static INT cskyCacheCK803FlushPage (LW_CACHE_TYPE cachetype, PVOID pvAdrs, PVOID pvPdrs, size_t stBytes)
+{
+ addr_t ulEnd;
+
+ if (cachetype == DATA_CACHE) {
+ if (stBytes >= CSKY_L1_CACHE_LOOP_OP_MAX_SIZE) {
+ cskyDCacheCK803FlushAll(); /* 全部回写 */
+
+ } else {
+ CSKY_CACHE_GET_END(pvAdrs, stBytes, ulEnd, CSKY_DCACHE_LINE_SIZE);
+ cskyDCacheCK803Flush(pvAdrs, (PVOID)ulEnd,
+ CSKY_DCACHE_LINE_SIZE); /* 部分回写 */
+ }
+
+#if LW_CFG_CSKY_CACHE_L2 > 0
+ cskyL2CK803Flush(pvPdrs, stBytes);
+#endif /* LW_CFG_CSKY_CACHE_L2 > 0 */
+ }
+
+ return (ERROR_NONE);
+}
+/*********************************************************************************************************
+** 函数名称: cskyCacheCK803Invalidate
+** 功能描述: 指定类型的 CACHE 使部分无效(访问不命中)
+** 输 入 : cachetype CACHE 类型
+** pvAdrs 虚拟地址
+** stBytes 长度
+** 输 出 : ERROR or OK
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static INT cskyCacheCK803Invalidate (LW_CACHE_TYPE cachetype, PVOID pvAdrs, size_t stBytes)
+{
+ addr_t ulEnd;
+
+ if (cachetype == INSTRUCTION_CACHE) {
+ if (stBytes >= CSKY_L1_CACHE_LOOP_OP_MAX_SIZE) {
+ cskyICacheCK803InvalidateAll(); /* ICACHE 全部无效 */
+
+ } else {
+ CSKY_CACHE_GET_END(pvAdrs, stBytes, ulEnd, CSKY_ICACHE_LINE_SIZE);
+ cskyICacheCK803Invalidate(pvAdrs, (PVOID)ulEnd, CSKY_ICACHE_LINE_SIZE);
+ }
+
+ } else {
+ if (stBytes > 0) { /* 必须 > 0 */
+ addr_t ulStart = (addr_t)pvAdrs;
+ ulEnd = ulStart + stBytes;
+
+ if (ulStart & ((addr_t)CSKY_DCACHE_LINE_SIZE - 1)) { /* 起始地址非 cache line 对齐 */
+ ulStart &= ~((addr_t)CSKY_DCACHE_LINE_SIZE - 1);
+ cskyDCacheCK803Clear((PVOID)ulStart, (PVOID)ulStart, CSKY_DCACHE_LINE_SIZE);
+ ulStart += CSKY_DCACHE_LINE_SIZE;
+ }
+
+ if (ulEnd & ((addr_t)CSKY_DCACHE_LINE_SIZE - 1)) { /* 结束地址非 cache line 对齐 */
+ ulEnd &= ~((addr_t)CSKY_DCACHE_LINE_SIZE - 1);
+ cskyDCacheCK803Clear((PVOID)ulEnd, (PVOID)ulEnd, CSKY_DCACHE_LINE_SIZE);
+ }
+
+ if (ulStart < ulEnd) { /* 仅无效对齐部分 */
+ cskyDCacheCK803Invalidate((PVOID)ulStart, (PVOID)ulEnd, CSKY_DCACHE_LINE_SIZE);
+ }
+
+#if LW_CFG_CSKY_CACHE_L2 > 0
+ cskyL2CK803Invalidate(pvAdrs, stBytes); /* 虚拟与物理地址必须相同 */
+#endif /* LW_CFG_CSKY_CACHE_L2 > 0 */
+ } else {
+ _DebugHandle(__ERRORMESSAGE_LEVEL, "stBytes == 0.\r\n");
+ }
+ }
+
+ return (ERROR_NONE);
+}
+/*********************************************************************************************************
+** 函数名称: cskyCacheCK803InvalidatePage
+** 功能描述: 指定类型的 CACHE 使部分无效(访问不命中)
+** 输 入 : cachetype CACHE 类型
+** pvAdrs 虚拟地址
+** pvPdrs 物理地址
+** stBytes 长度
+** 输 出 : ERROR or OK
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static INT cskyCacheCK803InvalidatePage (LW_CACHE_TYPE cachetype, PVOID pvAdrs, PVOID pvPdrs, size_t stBytes)
+{
+ addr_t ulEnd;
+
+ if (cachetype == INSTRUCTION_CACHE) {
+ if (stBytes >= CSKY_L1_CACHE_LOOP_OP_MAX_SIZE) {
+ cskyICacheCK803InvalidateAll(); /* ICACHE 全部无效 */
+
+ } else {
+ CSKY_CACHE_GET_END(pvAdrs, stBytes, ulEnd, CSKY_ICACHE_LINE_SIZE);
+ cskyICacheCK803Invalidate(pvAdrs, (PVOID)ulEnd, CSKY_ICACHE_LINE_SIZE);
+ }
+
+ } else {
+ if (stBytes > 0) { /* 必须 > 0 */
+ addr_t ulStart = (addr_t)pvAdrs;
+ ulEnd = ulStart + stBytes;
+
+ if (ulStart & ((addr_t)CSKY_DCACHE_LINE_SIZE - 1)) { /* 起始地址非 cache line 对齐 */
+ ulStart &= ~((addr_t)CSKY_DCACHE_LINE_SIZE - 1);
+ cskyDCacheCK803Clear((PVOID)ulStart, (PVOID)ulStart, CSKY_DCACHE_LINE_SIZE);
+ ulStart += CSKY_DCACHE_LINE_SIZE;
+ }
+
+ if (ulEnd & ((addr_t)CSKY_DCACHE_LINE_SIZE - 1)) { /* 结束地址非 cache line 对齐 */
+ ulEnd &= ~((addr_t)CSKY_DCACHE_LINE_SIZE - 1);
+ cskyDCacheCK803Clear((PVOID)ulEnd, (PVOID)ulEnd, CSKY_DCACHE_LINE_SIZE);
+ }
+
+ if (ulStart < ulEnd) { /* 仅无效对齐部分 */
+ cskyDCacheCK803Invalidate((PVOID)ulStart, (PVOID)ulEnd, CSKY_DCACHE_LINE_SIZE);
+ }
+
+#if LW_CFG_CSKY_CACHE_L2 > 0
+ cskyL2CK803Invalidate(pvPdrs, stBytes); /* 虚拟与物理地址必须相同 */
+#endif /* LW_CFG_CSKY_CACHE_L2 > 0 */
+ } else {
+ _DebugHandle(__ERRORMESSAGE_LEVEL, "stBytes == 0.\r\n");
+ }
+ }
+
+ return (ERROR_NONE);
+}
+/*********************************************************************************************************
+** 函数名称: cskyCacheCK803Clear
+** 功能描述: 指定类型的 CACHE 使部分或全部清空(回写内存)并无效(访问不命中)
+** 输 入 : cachetype CACHE 类型
+** pvAdrs 虚拟地址
+** stBytes 长度
+** 输 出 : ERROR or OK
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static INT cskyCacheCK803Clear (LW_CACHE_TYPE cachetype, PVOID pvAdrs, size_t stBytes)
+{
+ addr_t ulEnd;
+
+ if (cachetype == INSTRUCTION_CACHE) {
+ if (stBytes >= CSKY_L1_CACHE_LOOP_OP_MAX_SIZE) {
+ cskyICacheCK803InvalidateAll(); /* ICACHE 全部无效 */
+
+ } else {
+ CSKY_CACHE_GET_END(pvAdrs, stBytes, ulEnd, CSKY_ICACHE_LINE_SIZE);
+ cskyICacheCK803Invalidate(pvAdrs, (PVOID)ulEnd, CSKY_ICACHE_LINE_SIZE);
+ }
+
+ } else {
+ if (stBytes >= CSKY_L1_CACHE_LOOP_OP_MAX_SIZE) {
+ cskyDCacheCK803ClearAll(); /* 全部回写并无效 */
+
+ } else {
+ CSKY_CACHE_GET_END(pvAdrs, stBytes, ulEnd, CSKY_DCACHE_LINE_SIZE);
+ cskyDCacheCK803Clear(pvAdrs, (PVOID)ulEnd,
+ CSKY_DCACHE_LINE_SIZE); /* 部分回写并无效 */
+ }
+
+#if LW_CFG_CSKY_CACHE_L2 > 0
+ cskyL2CK803ClearAll();
+#endif /* LW_CFG_CSKY_CACHE_L2 > 0 */
+ }
+
+ return (ERROR_NONE);
+}
+/*********************************************************************************************************
+** 函数名称: cskyCacheCK803ClearPage
+** 功能描述: 指定类型的 CACHE 使部分或全部清空(回写内存)并无效(访问不命中)
+** 输 入 : cachetype CACHE 类型
+** pvAdrs 虚拟地址
+** pvPdrs 物理地址
+** stBytes 长度
+** 输 出 : ERROR or OK
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static INT cskyCacheCK803ClearPage (LW_CACHE_TYPE cachetype, PVOID pvAdrs, PVOID pvPdrs, size_t stBytes)
+{
+ addr_t ulEnd;
+
+ if (cachetype == INSTRUCTION_CACHE) {
+ if (stBytes >= CSKY_L1_CACHE_LOOP_OP_MAX_SIZE) {
+ cskyICacheCK803InvalidateAll(); /* ICACHE 全部无效 */
+
+ } else {
+ CSKY_CACHE_GET_END(pvAdrs, stBytes, ulEnd, CSKY_ICACHE_LINE_SIZE);
+ cskyICacheCK803Invalidate(pvAdrs, (PVOID)ulEnd, CSKY_ICACHE_LINE_SIZE);
+ }
+
+ } else {
+ if (stBytes >= CSKY_L1_CACHE_LOOP_OP_MAX_SIZE) {
+ cskyDCacheCK803ClearAll(); /* 全部回写并无效 */
+
+ } else {
+ CSKY_CACHE_GET_END(pvAdrs, stBytes, ulEnd, CSKY_DCACHE_LINE_SIZE);
+ cskyDCacheCK803Clear(pvAdrs, (PVOID)ulEnd,
+ CSKY_DCACHE_LINE_SIZE); /* 部分回写并无效 */
+ }
+
+#if LW_CFG_CSKY_CACHE_L2 > 0
+ cskyL2CK803Clear(pvPdrs, stBytes);
+#endif /* LW_CFG_CSKY_CACHE_L2 > 0 */
+ }
+
+ return (ERROR_NONE);
+}
+/*********************************************************************************************************
+** 函数名称: cskyCacheCK803Lock
+** 功能描述: 锁定指定类型的 CACHE
+** 输 入 : cachetype CACHE 类型
+** pvAdrs 虚拟地址
+** stBytes 长度
+** 输 出 : ERROR or OK
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static INT cskyCacheCK803Lock (LW_CACHE_TYPE cachetype, PVOID pvAdrs, size_t stBytes)
+{
+ _ErrorHandle(ENOSYS);
+ return (PX_ERROR);
+}
+/*********************************************************************************************************
+** 函数名称: cskyCacheCK803Unlock
+** 功能描述: 解锁指定类型的 CACHE
+** 输 入 : cachetype CACHE 类型
+** pvAdrs 虚拟地址
+** stBytes 长度
+** 输 出 : ERROR or OK
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static INT cskyCacheCK803Unlock (LW_CACHE_TYPE cachetype, PVOID pvAdrs, size_t stBytes)
+{
+ _ErrorHandle(ENOSYS);
+ return (PX_ERROR);
+}
+/*********************************************************************************************************
+** 函数名称: cskyCacheCK803TextUpdate
+** 功能描述: 清空(回写内存) D CACHE 无效(访问不命中) I CACHE
+** 输 入 : pvAdrs 虚拟地址
+** stBytes 长度
+** 输 出 : ERROR or OK
+** 全局变量:
+** 调用模块:
+** 注 意 : L2 cache 为统一 CACHE 所以 text update 不需要操作 L2 cache.
+*********************************************************************************************************/
+static INT cskyCacheCK803TextUpdate (PVOID pvAdrs, size_t stBytes)
+{
+ addr_t ulEnd;
+
+ if (stBytes >= CSKY_L1_CACHE_LOOP_OP_MAX_SIZE) {
+ cskyDCacheCK803ClearAll(); /* DCACHE 全部回写 */
+ cskyICacheCK803InvalidateAll(); /* ICACHE 全部无效 */
+
+ } else {
+ PVOID pvAdrsBak = pvAdrs;
+
+ CSKY_CACHE_GET_END(pvAdrs, stBytes, ulEnd, CSKY_DCACHE_LINE_SIZE);
+ cskyDCacheCK803Flush(pvAdrs, (PVOID)ulEnd, CSKY_DCACHE_LINE_SIZE);
+
+ CSKY_CACHE_GET_END(pvAdrsBak, stBytes, ulEnd, CSKY_ICACHE_LINE_SIZE);
+ cskyICacheCK803Invalidate(pvAdrsBak, (PVOID)ulEnd, CSKY_ICACHE_LINE_SIZE);
+ }
+
+ return (ERROR_NONE);
+}
+/*********************************************************************************************************
+** 函数名称: cskyCacheCK803DataUpdate
+** 功能描述: 回写 D CACHE (仅回写 CPU 独享级 CACHE)
+** 输 入 : pvAdrs 虚拟地址
+** stBytes 长度
+** bInv 是否为回写无效
+** 输 出 : ERROR or OK
+** 全局变量:
+** 调用模块:
+** 注 意 : L2 cache 为统一 CACHE 所以 data update 不需要操作 L2 cache.
+*********************************************************************************************************/
+static INT cskyCacheCK803DataUpdate (PVOID pvAdrs, size_t stBytes, BOOL bInv)
+{
+ addr_t ulEnd;
+
+ if (bInv == LW_FALSE) {
+ if (stBytes >= CSKY_L1_CACHE_LOOP_OP_MAX_SIZE) {
+ cskyDCacheCK803FlushAll(); /* 全部回写 */
+
+ } else {
+ CSKY_CACHE_GET_END(pvAdrs, stBytes, ulEnd, CSKY_DCACHE_LINE_SIZE);
+ cskyDCacheCK803Flush(pvAdrs, (PVOID)ulEnd,
+ CSKY_DCACHE_LINE_SIZE); /* 部分回写 */
+ }
+
+ } else {
+ if (stBytes >= CSKY_L1_CACHE_LOOP_OP_MAX_SIZE) {
+ cskyDCacheCK803ClearAll(); /* 全部回写 */
+
+ } else {
+ CSKY_CACHE_GET_END(pvAdrs, stBytes, ulEnd, CSKY_DCACHE_LINE_SIZE);
+ cskyDCacheCK803Clear(pvAdrs, (PVOID)ulEnd,
+ CSKY_DCACHE_LINE_SIZE); /* 部分回写 */
+ }
+ }
+
+ return (ERROR_NONE);
+}
+/*********************************************************************************************************
+** 函数名称: cskyCacheCK803RangeSet
+** 功能描述: CACHE 区域设置
+** 输 入 : uiIndex 存储 CACHE 配置的 CRCR 下标
+** ulBase 区域基地址
+** uiSize 区域大小
+** uiEnable 是否使能 CACHE 属性
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+LW_WEAK VOID cskyCacheCK803RangeSet (UINT32 uiIndex, ULONG ulBase, UINT32 uiSize, UINT32 uiEnable)
+{
+ CACHE->CRCR[uiIndex] = ((ulBase & CACHE_CRCR_BASE_ADDR_Msk) |
+ (_VAL2FLD(CACHE_CRCR_SIZE, uiSize)) |
+ (_VAL2FLD(CACHE_CRCR_EN, uiEnable)));
+}
+/*********************************************************************************************************
+** 函数名称: cskyCacheInit
+** 功能描述: 初始化 CACHE
+** 输 入 : pcacheop CACHE 操作函数集
+** uiInstruction 指令 CACHE 参数
+** uiData 数据 CACHE 参数
+** pcMachineName 机器名称
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+LW_WEAK VOID cskyCacheInit (LW_CACHE_OP *pcacheop,
+ CACHE_MODE uiInstruction,
+ CACHE_MODE uiData,
+ CPCHAR pcMachineName)
+{
+ if (lib_strcmp(pcMachineName, CSKY_MACHINE_803) != 0) {
+ return;
+ }
+
+ pcacheop->CACHEOP_ulOption = 0ul;
+
+ pcacheop->CACHEOP_iILoc = CACHE_LOCATION_PIPT;
+ pcacheop->CACHEOP_iDLoc = CACHE_LOCATION_PIPT;
+
+ pcacheop->CACHEOP_iICacheLine = CSKY_ICACHE_LINE_SIZE;
+ pcacheop->CACHEOP_iDCacheLine = CSKY_DCACHE_LINE_SIZE;
+
+ pcacheop->CACHEOP_iICacheWaySize = CSKY_ICACHE_WAY_SIZE;
+ pcacheop->CACHEOP_iDCacheWaySize = CSKY_ICACHE_WAY_SIZE;
+
+ pcacheop->CACHEOP_pfuncEnable = cskyCacheCK803Enable;
+ pcacheop->CACHEOP_pfuncDisable = cskyCacheCK803Disable;
+
+ pcacheop->CACHEOP_pfuncLock = cskyCacheCK803Lock; /* 暂时不支持锁定操作 */
+ pcacheop->CACHEOP_pfuncUnlock = cskyCacheCK803Unlock;
+
+ pcacheop->CACHEOP_pfuncFlush = cskyCacheCK803Flush;
+ pcacheop->CACHEOP_pfuncFlushPage = cskyCacheCK803FlushPage;
+ pcacheop->CACHEOP_pfuncInvalidate = cskyCacheCK803Invalidate;
+ pcacheop->CACHEOP_pfuncInvalidatePage = cskyCacheCK803InvalidatePage;
+ pcacheop->CACHEOP_pfuncClear = cskyCacheCK803Clear;
+ pcacheop->CACHEOP_pfuncClearPage = cskyCacheCK803ClearPage;
+ pcacheop->CACHEOP_pfuncTextUpdate = cskyCacheCK803TextUpdate;
+ pcacheop->CACHEOP_pfuncDataUpdate = cskyCacheCK803DataUpdate;
+
+#if (LW_CFG_VMM_EN == 0) && (LW_CFG_ARM_MPU > 0)
+ pcacheop->CACHEOP_pfuncDmaMalloc = cskyMpuDmaAlloc;
+ pcacheop->CACHEOP_pfuncDmaMallocAlign = cskyMpuDmaAllocAlign;
+ pcacheop->CACHEOP_pfuncDmaFree = cskyMpuDmaFree;
+#endif /* LW_CFG_ARM_MPU > 0 */
+}
+/*********************************************************************************************************
+** 函数名称: cskyCacheReset
+** 功能描述: 复位 CACHE
+** 输 入 : pcMachineName 机器名称
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+LW_WEAK VOID cskyCacheReset (CPCHAR pcMachineName)
+{
+ if (lib_strcmp(pcMachineName, CSKY_MACHINE_803) != 0) {
+ return;
+ }
+
+ cskyICacheCK803InvalidateAll();
+ cskyDCacheCK803Disable();
+ cskyICacheCK803Disable();
+ cskyBranchPredictorCK803Invalidate();
+}
+
+#endif /* LW_CFG_CACHE_EN > 0 */
+#endif /* __SYLIXOS_CSKY_ARCH_CK803__ */
+/*********************************************************************************************************
+ END
+*********************************************************************************************************/
diff --git a/SylixOS/arch/csky/mm/cache/ck803/cskyCacheCK803.h b/SylixOS/arch/csky/mm/cache/ck803/cskyCacheCK803.h
new file mode 100644
index 0000000..f7e7b0b
--- /dev/null
+++ b/SylixOS/arch/csky/mm/cache/ck803/cskyCacheCK803.h
@@ -0,0 +1,61 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM)
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: cskyCacheCK803.h
+**
+** 创 建 人: Wang.Xuan (王翾)
+**
+** 文件创建日期: 2019 年 05 月 09 日
+**
+** 描 述: C-SKY CK803 体系架构 CACHE 驱动.
+*********************************************************************************************************/
+
+#ifndef __ARCH_CSKYCACHECK803_H
+#define __ARCH_CSKYCACHECK803_H
+
+/*********************************************************************************************************
+ CK803 处理器 CACHE 区域大小
+*********************************************************************************************************/
+
+#define CACHE_CRCR_4K 0xb
+#define CACHE_CRCR_8K 0xc
+#define CACHE_CRCR_16K 0xd
+#define CACHE_CRCR_32K 0xe
+#define CACHE_CRCR_64K 0xf
+#define CACHE_CRCR_128K 0x10
+#define CACHE_CRCR_256K 0x11
+#define CACHE_CRCR_512K 0x12
+#define CACHE_CRCR_1M 0x13
+#define CACHE_CRCR_2M 0x14
+#define CACHE_CRCR_4M 0x15
+#define CACHE_CRCR_8M 0x16
+#define CACHE_CRCR_16M 0x17
+#define CACHE_CRCR_32M 0x18
+#define CACHE_CRCR_64M 0x19
+#define CACHE_CRCR_128M 0x1a
+#define CACHE_CRCR_256M 0x1b
+#define CACHE_CRCR_512M 0x1c
+#define CACHE_CRCR_1G 0x1d
+#define CACHE_CRCR_2G 0x1e
+#define CACHE_CRCR_4G 0x1f
+
+VOID cskyDCacheCK803Disable(VOID);
+VOID cskyICacheCK803Disable(VOID);
+VOID cskyICacheCK803InvalidateAll(VOID);
+VOID cskyDCacheCK803FlushAll(VOID);
+VOID cskyDCacheCK803ClearAll(VOID);
+VOID cskyCacheCK803RangeSet(UINT32 uiIndex, ULONG ulBase, UINT32 uiSize, UINT32 uiEnable);
+
+#endif /* __ARCH_CSKYCACHECK803_H */
+/*********************************************************************************************************
+ END
+*********************************************************************************************************/
diff --git a/SylixOS/arch/csky/mm/cache/cskyCache.c b/SylixOS/arch/csky/mm/cache/cskyCache.c
index 9d37170..38749c1 100644
--- a/SylixOS/arch/csky/mm/cache/cskyCache.c
+++ b/SylixOS/arch/csky/mm/cache/cskyCache.c
@@ -21,6 +21,10 @@
#define __SYLIXOS_KERNEL
#include "SylixOS.h"
/*********************************************************************************************************
+ C-SKY 体系架构
+*********************************************************************************************************/
+#if !defined(__SYLIXOS_CSKY_ARCH_CK803__)
+/*********************************************************************************************************
裁剪支持
*********************************************************************************************************/
#if LW_CFG_CACHE_EN > 0
@@ -730,6 +734,7 @@ VOID cskyCacheReset (CPCHAR pcMachineName)
}
#endif /* LW_CFG_CACHE_EN > 0 */
+#endif /* !__SYLIXOS_CSKY_ARCH_CK803__*/
/*********************************************************************************************************
END
*********************************************************************************************************/
diff --git a/SylixOS/arch/csky/mm/cache/cskyCacheAsm.S b/SylixOS/arch/csky/mm/cache/cskyCacheAsm.S
index ca0e379..ec7be93 100644
--- a/SylixOS/arch/csky/mm/cache/cskyCacheAsm.S
+++ b/SylixOS/arch/csky/mm/cache/cskyCacheAsm.S
@@ -28,6 +28,8 @@
#include <config/kernel/cache_cfg.h>
#include <config/cpu/cpu_cfg_csky.h>
+#if !defined(__SYLIXOS_CSKY_ARCH_CK803__)
+
#if LW_CFG_CACHE_EN > 0
EXPORT_LABEL(cskyICacheInvalidateAll)
@@ -196,6 +198,7 @@ FUNC_DEF(cskyBranchPredictionDisable)
FILE_END()
#endif
+#endif
;/*********************************************************************************************************
; END
;*********************************************************************************************************/
diff --git a/SylixOS/arch/csky/mm/cskyMpu.c b/SylixOS/arch/csky/mm/cskyMpu.c
new file mode 100644
index 0000000..7553dfe
--- /dev/null
+++ b/SylixOS/arch/csky/mm/cskyMpu.c
@@ -0,0 +1,45 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM)
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: cskyMpu.c
+**
+** 创 建 人: Wang.Xuan (王翾)
+**
+** 文件创建日期: 2018 年 11 月 12 日
+**
+** 描 述: C-SKY 体系架构 MPU 驱动.
+*********************************************************************************************************/
+#define __SYLIXOS_KERNEL
+#include "SylixOS.h"
+/*********************************************************************************************************
+ 裁剪支持
+*********************************************************************************************************/
+#if (LW_CFG_VMM_EN == 0) && (LW_CFG_CSKY_MPU > 0)
+#include "mpu/cskyMpu.h"
+/*********************************************************************************************************
+** 函数名称: archMpuInit
+** 功能描述: 初始化 MPU
+** 输 入 : pcMachineName 机器名称
+** pmpuregion 内存分区信息
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID archMpuInit (CPCHAR pcMachineName, const CSKY_MPU_REGION mpuregion[])
+{
+ cskyMpuInit(pcMachineName, mpuregion);
+}
+
+#endif /* LW_CFG_CSKY_MPU > 0 */
+/*********************************************************************************************************
+ END
+*********************************************************************************************************/
diff --git a/SylixOS/arch/csky/mm/mmu/cskyMmu.c b/SylixOS/arch/csky/mm/mmu/cskyMmu.c
index 1129c04..ef26de1 100644
--- a/SylixOS/arch/csky/mm/mmu/cskyMmu.c
+++ b/SylixOS/arch/csky/mm/mmu/cskyMmu.c
@@ -21,6 +21,10 @@
#define __SYLIXOS_KERNEL
#include "SylixOS.h"
/*********************************************************************************************************
+ C-SKY 体系架构
+*********************************************************************************************************/
+#if !defined(__SYLIXOS_CSKY_ARCH_CK803__)
+/*********************************************************************************************************
裁剪支持
*********************************************************************************************************/
#if LW_CFG_VMM_EN > 0
@@ -711,6 +715,7 @@ VOID cskyMmuInit (LW_MMU_OP *pmmuop, CPCHAR pcMachineName)
}
#endif /* LW_CFG_VMM_EN > 0 */
+#endif /* !__SYLIXOS_CSKY_ARCH_CK803__*/
/*********************************************************************************************************
END
*********************************************************************************************************/
diff --git a/SylixOS/arch/csky/mm/mmu/cskyMmuAsm.S b/SylixOS/arch/csky/mm/mmu/cskyMmuAsm.S
index 80fed9f..a96c298 100644
--- a/SylixOS/arch/csky/mm/mmu/cskyMmuAsm.S
+++ b/SylixOS/arch/csky/mm/mmu/cskyMmuAsm.S
@@ -27,6 +27,8 @@
#include <config/kernel/vmm_cfg.h>
#include <config/kernel/memory_cfg.h>
+#if !defined(__SYLIXOS_CSKY_ARCH_CK803__)
+
#if LW_CFG_VMM_EN > 0
#include "arch/csky/arch_mmu.h"
#include "arch/csky/inc/cskyregs.h"
@@ -269,6 +271,7 @@ LINE_LABEL(__tlbinv_handle)
FILE_END()
#endif
+#endif
;/*********************************************************************************************************
; END
;*********************************************************************************************************/
diff --git a/SylixOS/arch/csky/mm/mpu/cskyMpu.c b/SylixOS/arch/csky/mm/mpu/cskyMpu.c
new file mode 100644
index 0000000..b076b8f
--- /dev/null
+++ b/SylixOS/arch/csky/mm/mpu/cskyMpu.c
@@ -0,0 +1,210 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM)
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: cskyMpu.c
+**
+** 创 建 人: Wang.Xuan (王翾)
+**
+** 文件创建日期: 2018 年 11 月 12 日
+**
+** 描 述: C-SKY 体系架构 MPU 驱动.
+*********************************************************************************************************/
+#define __SYLIXOS_KERNEL
+#include "SylixOS.h"
+/*********************************************************************************************************
+ C-SKY 体系架构
+*********************************************************************************************************/
+#if defined(__SYLIXOS_CSKY_ARCH_CK803__)
+/*********************************************************************************************************
+ 裁剪支持
+*********************************************************************************************************/
+#if (LW_CFG_VMM_EN == 0) && (LW_CFG_CSKY_MPU > 0)
+#include "arch/csky/inc/cskyregs.h"
+/*********************************************************************************************************
+ 可高缓区配置寄存器地址
+*********************************************************************************************************/
+#define CSKY_CACHE_CRCR(n) (*(volatile UINT32 *)(0xe000f008 + 0x4 * (n)))
+/*********************************************************************************************************
+ CRCR 寄存器定义
+*********************************************************************************************************/
+#define CSKY_CACHE_CRCR_OFF_EN 0
+#define CSKY_CACHE_CRCR_MASK_EN (0x1 << CSKY_CACHE_CRCR_OFF_EN)
+
+#define CSKY_CACHE_CRCR_OFF_SIZE 1
+#define CSKY_CACHE_CRCR_MASK_SIZE (0x1f << CSKY_CACHE_CRCR_OFF_SIZE)
+
+#define CSKY_CACHE_CRCR_OFF_BASE_ADDR 10
+#define CSKY_CACHE_CRCR_MASK_BASE_ADDR (0x3fffff << CSKY_CACHE_CRCR_OFF_BASE_ADDR)
+/*********************************************************************************************************
+ CAPR 寄存器定义
+*********************************************************************************************************/
+#define CSKY_MPU_CAPR_OFF_NX 0
+#define CSKY_MPU_CAPR_OFF_AP 8
+#define CSKY_MPU_CAPR_OFF_S 24
+/*********************************************************************************************************
+ PACR 寄存器定义
+*********************************************************************************************************/
+#define CSKY_MPU_PACR_OFF_E 0
+#define CSKY_MPU_PACR_MASK_E (0x1 << CSKY_MPU_PACR_OFF_E)
+
+#define CSKY_MPU_PACR_OFF_SIZE 1
+#define CSKY_MPU_PACR_MASK_SIZE (0x1f << CSKY_MPU_PACR_OFF_SIZE)
+
+#define CSKY_MPU_PACR_OFF_BASE_ADDR 12
+#define CSKY_MPU_PACR_MASK_BASE_ADDR (0xfffff << CSKY_MPU_PACR_OFF_BASE_ADDR)
+/*********************************************************************************************************
+ PRSR 寄存器定义
+*********************************************************************************************************/
+#define CSKY_MPU_PRSR_OFF_RID 0
+#define CSKY_MPU_PRSR_MASK_RID (0x7 << CSKY_MPU_PRSR_OFF_RID)
+/*********************************************************************************************************
+ DMA Pool
+*********************************************************************************************************/
+static LW_CLASS_HEAP _G_heapDmaPool;
+/*********************************************************************************************************
+** 函数名称: cskyMpuInit
+** 功能描述: 初始化 MPU
+** 输 入 : pcMachineName 机器名称
+** mpuregion 内存属性与布局表
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID cskyMpuInit (CPCHAR pcMachineName, const CSKY_MPU_REGION mpuregion[])
+{
+ PCSKY_MPU_REGION pmpuregion;
+ UINT32 uiCAPR;
+ UINT32 uiPACR;
+ UINT32 uiCRCR;
+ size_t stSize;
+
+ if (mpuregion == LW_NULL) {
+ _DebugHandle(__ERRORMESSAGE_LEVEL, "MPU mpuregion[] invalid.\r\n");
+ return;
+ }
+
+ cskyMpuSetCCR(cskyMpuGetCCR() & ~1); /* 禁能 MPU */
+
+ for (pmpuregion = (PCSKY_MPU_REGION)mpuregion;
+ (pmpuregion->MPUD_ucSize != CSKY_MPU_REGION_SIZE_END) &&
+ (pmpuregion->MPUD_ucMpuNumber < LW_CFG_MPU_REGION_NUM);
+ pmpuregion++) {
+
+ cskyMpuSetPRSR((UINT32)pmpuregion->MPUD_ucMpuNumber); /* 选择保护区 */
+
+ if (pmpuregion->MPUD_bEnable) {
+ uiCAPR = cskyMpuGetCAPR();
+
+ uiPACR = cskyMpuGetPACR() & ~CSKY_MPU_PACR_MASK_BASE_ADDR; /* 设置基地址 */
+ uiPACR |= pmpuregion->MPUD_uiAddr & CSKY_MPU_PACR_MASK_BASE_ADDR;
+
+ if (pmpuregion->MPUD_ucSize != CSKY_MPU_REGION_SIZE_4KB) {
+ uiPACR &= ~(((1u << (pmpuregion->MPUD_ucSize - 11)) - 1) << 12);
+ }
+
+ uiPACR |= ((UINT32)(pmpuregion->MPUD_ucSize) << CSKY_MPU_PACR_OFF_SIZE) & CSKY_MPU_PACR_MASK_SIZE;
+ uiPACR |= (1 << CSKY_MPU_PACR_OFF_E);
+
+ uiCAPR &= ~((0x1 << pmpuregion->MPUD_ucMpuNumber) |
+ (0x3 << (pmpuregion->MPUD_ucMpuNumber * 2 + CSKY_MPU_CAPR_OFF_AP)) |
+ (0x1 << (pmpuregion->MPUD_ucMpuNumber + CSKY_MPU_CAPR_OFF_S)));
+ uiCAPR |= (((pmpuregion->MPUD_uiAttr & CSKY_MPU_ATTR_NX) >>
+ CSKY_MPU_ATTR_NX_POS) << pmpuregion->MPUD_ucMpuNumber) |
+ (((pmpuregion->MPUD_uiAttr & CSKY_MPU_ATTR_AP) >>
+ CSKY_MPU_ATTR_AP_POS) << (pmpuregion->MPUD_ucMpuNumber * 2 + CSKY_MPU_CAPR_OFF_AP)) |
+ (((pmpuregion->MPUD_uiAttr & CSKY_MPU_ATTR_S) >>
+ CSKY_MPU_ATTR_S_POS) << (pmpuregion->MPUD_ucMpuNumber + CSKY_MPU_CAPR_OFF_AP));
+
+ cskyMpuSetCAPR(uiCAPR);
+ cskyMpuSetPACR(uiPACR);
+
+ if (pmpuregion->MPUD_bDmaPool) {
+ stSize = ((size_t)2 << pmpuregion->MPUD_ucSize);
+ if (!_G_heapDmaPool.HEAP_stTotalByteSize) {
+ _HeapCtor(&_G_heapDmaPool,
+ (PVOID)pmpuregion->MPUD_uiAddr, stSize);
+
+ } else {
+ _HeapAddMemory(&_G_heapDmaPool, (PVOID)pmpuregion->MPUD_uiAddr, stSize);
+ }
+
+ } else {
+ uiCRCR = pmpuregion->MPUD_uiAddr & CSKY_CACHE_CRCR_MASK_BASE_ADDR;
+ uiCRCR |= (pmpuregion->MPUD_ucSize << CSKY_CACHE_CRCR_OFF_SIZE) &
+ CSKY_CACHE_CRCR_MASK_SIZE;
+ uiCRCR |= (1 << CSKY_CACHE_CRCR_OFF_EN);
+
+ CSKY_CACHE_CRCR(pmpuregion->MPUD_ucMpuNumber) = uiCRCR;
+ }
+
+ } else {
+ cskyMpuSetPACR(0);
+ }
+ }
+
+ cskyMpuSetCCR(cskyMpuGetCCR() | 1); /* 使能 MPU */
+}
+/*********************************************************************************************************
+** 函数名称: cskyMpuDmaAlloc
+** 功能描述: 从 DMA 内存池中分配内存
+** 输 入 : stSize 需要的内存大小
+** 输 出 : 内存首地址
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+PVOID cskyMpuDmaAlloc (size_t stSize)
+{
+ if (_G_heapDmaPool.HEAP_stTotalByteSize) {
+ return (_HeapAllocate(&_G_heapDmaPool, stSize, __func__));
+
+ } else {
+ return (LW_NULL);
+ }
+}
+/*********************************************************************************************************
+** 函数名称: cskyMpuDmaAllocAlign
+** 功能描述: 从 DMA 内存池中分配内存
+** 输 入 : stSize 需要的内存大小
+** stAlign 对齐要求
+** 输 出 : 内存首地址
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+PVOID cskyMpuDmaAllocAlign (size_t stSize, size_t stAlign)
+{
+ if (_G_heapDmaPool.HEAP_stTotalByteSize) {
+ return (_HeapAllocateAlign(&_G_heapDmaPool, stSize, stAlign, __func__));
+
+ } else {
+ return (LW_NULL);
+ }
+}
+/*********************************************************************************************************
+** 函数名称: cskyMpuDmaFree
+** 功能描述: 释放从 DMA 内存池中分配的内存
+** 输 入 : pvDmaMem 内存首地址
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID cskyMpuDmaFree (PVOID pvDmaMem)
+{
+ if (_G_heapDmaPool.HEAP_stTotalByteSize) {
+ _HeapFree(&_G_heapDmaPool, pvDmaMem, LW_FALSE, __func__);
+ }
+}
+
+#endif /* LW_CFG_CSKY_MPU > 0 */
+#endif /* __SYLIXOS_CSKY_ARCH_CK803__ */
+/*********************************************************************************************************
+ END
+*********************************************************************************************************/
diff --git a/SylixOS/arch/csky/mm/mpu/cskyMpu.h b/SylixOS/arch/csky/mm/mpu/cskyMpu.h
new file mode 100644
index 0000000..0ab47e7
--- /dev/null
+++ b/SylixOS/arch/csky/mm/mpu/cskyMpu.h
@@ -0,0 +1,33 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM)
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: cskyMpu.h
+**
+** 创 建 人: Wang.Xuan (王翾)
+**
+** 文件创建日期: 2018 年 11 月 12 日
+**
+** 描 述: C-SKY 体系架构 MPU 驱动.
+*********************************************************************************************************/
+
+#ifndef __CSKYMPU_H
+#define __CSKYMPU_H
+
+VOID cskyMpuInit(CPCHAR pcMachineName, const CSKY_MPU_REGION mpuregion[]);
+PVOID cskyMpuDmaAlloc(size_t stSize);
+PVOID cskyMpuDmaAllocAlign(size_t stSize, size_t stAlign);
+VOID cskyMpuDmaFree(PVOID pvDmaMem);
+
+#endif /* __CSKYMPU_H */
+/*********************************************************************************************************
+ END
+*********************************************************************************************************/
diff --git a/SylixOS/config/cpu/cpu_cfg_csky.h b/SylixOS/config/cpu/cpu_cfg_csky.h
index c8fb33c..4dc4611 100644
--- a/SylixOS/config/cpu/cpu_cfg_csky.h
+++ b/SylixOS/config/cpu/cpu_cfg_csky.h
@@ -59,6 +59,17 @@
#define LW_CFG_CPU_PHYS_ADDR_64BIT 0 /* 物理地址 64bit 宽度 */
/*********************************************************************************************************
+ C-SKY MPU 配置
+*********************************************************************************************************/
+
+#if defined(__CK803__) || defined(__CK803S__)
+#define LW_CFG_CSKY_MPU 1
+#define LW_CFG_MPU_REGION_NUM 8
+#else
+#define LW_CFG_CSKY_MPU 0
+#endif /* __CK803__ || __CK803S__ */
+
+/*********************************************************************************************************
C-SKY MMU 配置
LW_CFG_CSKY_PAGE_SHIFT 可配置的值有如下:
diff --git a/SylixOS/fs/diskPartition/diskPartition.c b/SylixOS/fs/diskPartition/diskPartition.c
index 244e532..28d686f 100644
--- a/SylixOS/fs/diskPartition/diskPartition.c
+++ b/SylixOS/fs/diskPartition/diskPartition.c
@@ -256,7 +256,7 @@ static INT __diskPartitionScan (PLW_BLK_DEV pblkd,
ULONG ulExtStartSector)
{
#ifndef MBR_Table
-#define MBR_Table 446 /* MBR: Partition table offset */
+#define MBR_Table 446 /* MBR: Partition table offset */
#endif
INT i;
diff --git a/SylixOS/fs/tpsFs/tpsfs_sylixos.c b/SylixOS/fs/tpsFs/tpsfs_sylixos.c
index a5605b6..48bd8f8 100644
--- a/SylixOS/fs/tpsFs/tpsfs_sylixos.c
+++ b/SylixOS/fs/tpsFs/tpsfs_sylixos.c
@@ -1164,7 +1164,7 @@ static ssize_t __tpsFsWrite (PLW_FD_ENTRY pfdentry,
break;
}
}
- __SHEAP_FREE(pucZoreBuf);
+ __SHEAP_FREE(pucZoreBuf);
pfdnode->FDNODE_oftSize = tpsFsGetSize(ptpsfile->TPSFIL_pinode);
if (pfdnode->FDNODE_oftSize < pfdentry->FDENTRY_oftPtr) {
@@ -1245,7 +1245,7 @@ static ssize_t __tpsFsPWrite (PLW_FD_ENTRY pfdentry,
break;
}
}
- __SHEAP_FREE(pucZoreBuf);
+ __SHEAP_FREE(pucZoreBuf);
pfdnode->FDNODE_oftSize = tpsFsGetSize(ptpsfile->TPSFIL_pinode);
if (pfdnode->FDNODE_oftSize < oftPos) {
diff --git a/SylixOS/include/arch/arch_inc.h b/SylixOS/include/arch/arch_inc.h
index b35d3df..7966a24 100644
--- a/SylixOS/include/arch/arch_inc.h
+++ b/SylixOS/include/arch/arch_inc.h
@@ -106,6 +106,7 @@
#include "csky/arch_limits.h"
#include "csky/arch_regs.h"
#include "csky/arch_mmu.h"
+#include "csky/arch_mpu.h"
#endif /* LW_CFG_CPU_ARCH_ARM */
#endif /* __ARCH_INC_H */
diff --git a/SylixOS/include/arch/csky/arch_def.h b/SylixOS/include/arch/csky/arch_def.h
index 7b42160..47405ee 100644
--- a/SylixOS/include/arch/csky/arch_def.h
+++ b/SylixOS/include/arch/csky/arch_def.h
@@ -22,6 +22,8 @@
#ifndef __CSKY_ARCH_DEF_H
#define __CSKY_ARCH_DEF_H
+#include "asm/archprob.h"
+
/*********************************************************************************************************
SSEG0 SSEG1 地址转换
*********************************************************************************************************/
diff --git a/SylixOS/include/arch/csky/arch_float.h b/SylixOS/include/arch/csky/arch_float.h
index 620c4a3..dfe37f8 100644
--- a/SylixOS/include/arch/csky/arch_float.h
+++ b/SylixOS/include/arch/csky/arch_float.h
@@ -22,18 +22,29 @@
#ifndef __CSKY_ARCH_FLOAT_H
#define __CSKY_ARCH_FLOAT_H
+#include "asm/archprob.h"
+
/*********************************************************************************************************
FPU 浮点数据寄存器的相关定义
*********************************************************************************************************/
#if defined(__SYLIXOS_KERNEL) || defined(__ASSEMBLY__) || defined(ASSEMBLY)
#define FPU_REG_NR 16 /* FPU 通用寄存器数量 */
+#if defined(__SYLIXOS_CSKY_ARCH_CK803__)
+#define FPU_REG_WIDTH 32 /* 浮点数据寄存器的位宽 */
+#else
#define FPU_REG_WIDTH 64 /* 浮点数据寄存器的位宽 */
+#endif /* __SYLIXOS_CSKY_ARCH_CK803__ */
#define FPU_REG_SIZE (FPU_REG_WIDTH / 8) /* 浮点数据寄存器的大小 */
+#if defined(__SYLIXOS_CSKY_ARCH_CK803__)
+#define FPU_OFFSET_REG(n) ((n) * FPU_REG_SIZE) /* 浮点数据寄存器偏移 */
+#define FPU_OFFSET_FCR (FPU_OFFSET_REG(FPU_REG_NR)) /* FCR 偏移 */
+#else
#define FPU_OFFSET_REG_HI(n) ((n) * FPU_REG_SIZE) /* 浮点数据寄存器偏移 */
#define FPU_OFFSET_REG_LO(n) ((n) * FPU_REG_SIZE + FPU_REG_SIZE >> 1)/* 浮点数据寄存器偏移 */
#define FPU_OFFSET_FCR (FPU_OFFSET_REG_HI(FPU_REG_NR)) /* FCR 偏移 */
+#endif /* __SYLIXOS_CSKY_ARCH_CK803__ */
#define FPU_OFFSET_FESR (FPU_OFFSET_FCR + 4) /* FESR 偏移 */
/*********************************************************************************************************
@@ -43,18 +54,18 @@
#if !defined(__ASSEMBLY__) && !defined(ASSEMBLY)
/*********************************************************************************************************
- FPU 访问时需要高 32 位和低 32位分开访问
+ FPU 访问时需要高 32 位和低 32 位分开访问
*********************************************************************************************************/
typedef struct fpureg { /* FPU 寄存器类型 */
UINT32 val32[FPU_REG_WIDTH / 32];
} ARCH_FPU_REG;
-#define ARCH_FPU_CTX_ALIGN 8 /* FPU CTX align size */
+#define ARCH_FPU_CTX_ALIGN 8 /* FPU CTX align size */
struct arch_fpu_ctx {
- ARCH_FPU_REG FPUCTX_uiDreg[FPU_REG_NR]; /* FPU 通用寄存器 */
- UINT32 FPUCTX_uiFpcr; /* FPU 控制寄存器 */
- UINT32 FPUCTX_uiFpesr; /* FPU 异常寄存器 */
+ ARCH_FPU_REG FPUCTX_uiDreg[FPU_REG_NR]; /* FPU 通用寄存器 */
+ UINT32 FPUCTX_uiFpcr; /* FPU 控制寄存器 */
+ UINT32 FPUCTX_uiFpesr; /* FPU 异常寄存器 */
} __attribute__ ((aligned(ARCH_FPU_CTX_ALIGN)));
diff --git a/SylixOS/include/arch/csky/arch_mpu.h b/SylixOS/include/arch/csky/arch_mpu.h
new file mode 100644
index 0000000..e7e5af6
--- /dev/null
+++ b/SylixOS/include/arch/csky/arch_mpu.h
@@ -0,0 +1,89 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM) LW : long wing
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: arch_mpu.h
+**
+** 创 建 人: Wang.Xuan (王翾)
+**
+** 文件创建日期: 2018 年 11 月 12 日
+**
+** 描 述: C-SKY MPU 管理相关.
+*********************************************************************************************************/
+
+#ifndef __CSKY_ARCH_MPU_H
+#define __CSKY_ARCH_MPU_H
+
+#if (LW_CFG_VMM_EN == 0) && (LW_CFG_CSKY_MPU > 0)
+/*********************************************************************************************************
+ 映射描述符
+*********************************************************************************************************/
+#ifdef __SYLIXOS_KERNEL
+
+typedef struct {
+ BOOL MPUD_bEnable; /* Enable */
+ BOOL MPUD_bDmaPool; /* DMA buffer pool */
+
+ UINT32 MPUD_uiAddr; /* Start address */
+ UINT8 MPUD_ucSize; /* Region size */
+#define CSKY_MPU_REGION_SIZE_END ((UINT8)0x00) /* The last one */
+#define CSKY_MPU_REGION_SIZE_4KB ((UINT8)0x0b)
+#define CSKY_MPU_REGION_SIZE_8KB ((UINT8)0x0c)
+#define CSKY_MPU_REGION_SIZE_16KB ((UINT8)0x0d)
+#define CSKY_MPU_REGION_SIZE_32KB ((UINT8)0x0e)
+#define CSKY_MPU_REGION_SIZE_64KB ((UINT8)0x0f)
+#define CSKY_MPU_REGION_SIZE_128KB ((UINT8)0x10)
+#define CSKY_MPU_REGION_SIZE_256KB ((UINT8)0x11)
+#define CSKY_MPU_REGION_SIZE_512KB ((UINT8)0x12)
+#define CSKY_MPU_REGION_SIZE_1MB ((UINT8)0x13)
+#define CSKY_MPU_REGION_SIZE_2MB ((UINT8)0x14)
+#define CSKY_MPU_REGION_SIZE_4MB ((UINT8)0x15)
+#define CSKY_MPU_REGION_SIZE_8MB ((UINT8)0x16)
+#define CSKY_MPU_REGION_SIZE_16MB ((UINT8)0x17)
+#define CSKY_MPU_REGION_SIZE_32MB ((UINT8)0x18)
+#define CSKY_MPU_REGION_SIZE_64MB ((UINT8)0x19)
+#define CSKY_MPU_REGION_SIZE_128MB ((UINT8)0x1a)
+#define CSKY_MPU_REGION_SIZE_256MB ((UINT8)0x1b)
+#define CSKY_MPU_REGION_SIZE_512MB ((UINT8)0x1c)
+#define CSKY_MPU_REGION_SIZE_1GB ((UINT8)0x1d)
+#define CSKY_MPU_REGION_SIZE_2GB ((UINT8)0x1e)
+#define CSKY_MPU_REGION_SIZE_4GB ((UINT8)0x1f)
+
+ UINT8 MPUD_ucMpuNumber; /* Mpu Region Number */
+
+ UINT32 MPUD_uiAttr; /* Access permission */
+#define CSKY_MPU_ATTR_NX_POS 0
+#define CSKY_MPU_ATTR_NX (1 << CSKY_MPU_ATTR_NX_POS)
+ /* Instruction Fetched Execution */
+
+#define CSKY_MPU_ATTR_AP_POS 1
+#define CSKY_MPU_ATTR_AP_BOTH_INACCESS (0 << CSKY_MPU_ATTR_AP_POS)
+ /* Both Inaccessible */
+#define CSKY_MPU_ATTR_AP_S_RW_U_INACCESS (1 << CSKY_MPU_ATTR_AP_POS)
+ /* Super: Read Write/User: Inaccessible*/
+#define CSKY_MPU_ATTR_AP_S_RW_U_RO (2 << CSKY_MPU_ATTR_AP_POS)
+ /* Super: Read Write/User: Read Only */
+#define CSKY_MPU_ATTR_AP_BOTH_RW (3 << CSKY_MPU_ATTR_AP_POS)
+ /* Both Read Write */
+#define CSKY_MPU_ATTR_AP (3 << CSKY_MPU_ATTR_AP_POS)
+
+#define CSKY_MPU_ATTR_S_POS 3
+#define CSKY_MPU_ATTR_S (1 << CSKY_MPU_ATTR_S_POS)
+ /* Security */
+} CSKY_MPU_REGION;
+typedef CSKY_MPU_REGION *PCSKY_MPU_REGION;
+
+#endif /* __SYLIXOS_KERNEL */
+#endif /* LW_CFG_CSKY_MPU > 0 */
+#endif /* __CSKY_ARCH_MPU_H */
+/*********************************************************************************************************
+ END
+*********************************************************************************************************/
diff --git a/SylixOS/include/arch/csky/arch_regs.h b/SylixOS/include/arch/csky/arch_regs.h
index 92c6b84..6d6f49b 100644
--- a/SylixOS/include/arch/csky/arch_regs.h
+++ b/SylixOS/include/arch/csky/arch_regs.h
@@ -22,6 +22,19 @@
#ifndef __CSKY_ARCH_REGS_H
#define __CSKY_ARCH_REGS_H
+#include "asm/archprob.h"
+
+/*********************************************************************************************************
+ C-SKY CK803 体系架构
+*********************************************************************************************************/
+#if defined(__SYLIXOS_CSKY_ARCH_CK803__)
+
+#include "./ck803/arch_regs.h"
+
+#else
+/*********************************************************************************************************
+ C-SKY 通用体系架构
+*********************************************************************************************************/
/*********************************************************************************************************
定义
*********************************************************************************************************/
@@ -121,6 +134,7 @@ typedef struct {
#define ARCH_REG_CTX_GET_PC(ctx) ((void *)(ctx).REG_ulPc)
#endif /* !defined(__ASSEMBLY__) */
+#endif /* __SYLIXOS_CSKY_ARCH_CK803__ */
#endif /* __CSKY_ARCH_REGS_H */
/*********************************************************************************************************
END
diff --git a/SylixOS/include/arch/csky/asm/archprob.h b/SylixOS/include/arch/csky/asm/archprob.h
new file mode 100644
index 0000000..a48c868
--- /dev/null
+++ b/SylixOS/include/arch/csky/asm/archprob.h
@@ -0,0 +1,36 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM) LW : long wing
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: archprob.h
+**
+** 创 建 人: Wang.Xuan (王翾)
+**
+** 文件创建日期: 2019 年 07 月 15 日
+**
+** 描 述: 平台编译探测.
+*********************************************************************************************************/
+
+#ifndef __ARCHPROB_H
+#define __ARCHPROB_H
+
+/*********************************************************************************************************
+ C-SKY architecture detect
+*********************************************************************************************************/
+
+#if defined(__CK803__) || defined(__CK803S__)
+#define __SYLIXOS_CSKY_ARCH_CK803__
+#endif
+
+#endif /* __ARCHPROB_H */
+/*********************************************************************************************************
+ END
+*********************************************************************************************************/
diff --git a/SylixOS/include/arch/csky/asm/assembler.h b/SylixOS/include/arch/csky/asm/assembler.h
index 84b5544..f631dec 100644
--- a/SylixOS/include/arch/csky/asm/assembler.h
+++ b/SylixOS/include/arch/csky/asm/assembler.h
@@ -22,6 +22,7 @@
#ifndef __ASMCSKY_ASSEMBLER_H
#define __ASMCSKY_ASSEMBLER_H
+#include "archprob.h"
#include "arch/csky/arch_def.h"
/*********************************************************************************************************
diff --git a/SylixOS/include/arch/csky/ck803/arch_regs.h b/SylixOS/include/arch/csky/ck803/arch_regs.h
new file mode 100644
index 0000000..971d439
--- /dev/null
+++ b/SylixOS/include/arch/csky/ck803/arch_regs.h
@@ -0,0 +1,92 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM) LW : long wing
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: arch_regs.h
+**
+** 创 建 人: Wang.Xuan (王翾)
+**
+** 文件创建日期: 2018 年 11 月 12 日
+**
+** 描 述: CK803 体系架构寄存器相关.
+*********************************************************************************************************/
+
+#ifndef __CSKYCK803_ARCH_REGS_H
+#define __CSKYCK803_ARCH_REGS_H
+
+/*********************************************************************************************************
+ 定义
+*********************************************************************************************************/
+
+#define ARCH_GREG_NR 17 /* 通用寄存器数目 */
+
+#define ARCH_REG_CTX_WORD_SIZE 20 /* 寄存器上下文字数 */
+#define ARCH_STK_MIN_WORD_SIZE 256 /* 堆栈最小字数 */
+
+#define ARCH_REG_SIZE 4 /* 寄存器大小 */
+#define ARCH_REG_CTX_SIZE (ARCH_REG_CTX_WORD_SIZE * ARCH_REG_SIZE)/* 寄存器上下文大小 */
+
+#define ARCH_STK_ALIGN_SIZE 8 /* 堆栈对齐要求 */
+
+#define ARCH_JMP_BUF_WORD_SIZE 20 /* 跳转缓冲字数(向后兼容) */
+
+/*********************************************************************************************************
+ 寄存器在 ARCH_REG_CTX 中的偏移量
+*********************************************************************************************************/
+
+#define XGREG(n) ((n) * ARCH_REG_SIZE)
+#define XGREG28 ((16) * ARCH_REG_SIZE)
+#define XPC ((ARCH_GREG_NR + 0) * ARCH_REG_SIZE)
+#define XPSR ((ARCH_GREG_NR + 1) * ARCH_REG_SIZE)
+
+/*********************************************************************************************************
+ 寄存器表
+*********************************************************************************************************/
+
+#if (!defined(__ASSEMBLY__)) && (!defined(ASSEMBLY))
+
+typedef UINT32 ARCH_REG_T;
+
+typedef struct {
+ ARCH_REG_T REG_ulReg[ARCH_GREG_NR]; /* 17 个通用目的寄存器 */
+ ARCH_REG_T REG_ulPc; /* 程序计数器寄存器 */
+ ARCH_REG_T REG_ulPsr; /* 处理器状态寄存器 */
+ ARCH_REG_T REG_ulPad;
+
+#define REG_A0 0 /* 第一个参数 */
+#define REG_A1 1 /* 第二个参数 */
+#define REG_A2 2 /* 第三个参数 */
+#define REG_A3 3 /* 第四个参数 */
+#define REG_SP 14 /* 堆栈指针 */
+#define REG_FP 8 /* FP */
+#define REG_RA 15 /* 链接寄存器 */
+} ARCH_REG_CTX;
+
+/*********************************************************************************************************
+ 调用回溯堆栈表
+*********************************************************************************************************/
+
+typedef struct {
+ ARCH_REG_T FP_uiFp;
+ ARCH_REG_T FP_uiLr;
+} ARCH_FP_CTX;
+
+/*********************************************************************************************************
+ 从上下文中获取信息
+*********************************************************************************************************/
+
+#define ARCH_REG_CTX_GET_PC(ctx) ((void *)(ctx).REG_ulPc)
+
+#endif /* !defined(__ASSEMBLY__) */
+#endif /* __CSKYCK803_ARCH_REGS_H */
+/*********************************************************************************************************
+ END
+*********************************************************************************************************/
diff --git a/SylixOS/include/arch/csky/inc/cskyregs.h b/SylixOS/include/arch/csky/inc/cskyregs.h
index bc1bc9c..39283e4 100644
--- a/SylixOS/include/arch/csky/inc/cskyregs.h
+++ b/SylixOS/include/arch/csky/inc/cskyregs.h
@@ -182,6 +182,70 @@ static inline void cskyTlbInvalidIndexed(void)
: :"r" (value));
}
+static inline uint32_t cskyMpuGetCCR(void)
+{
+ register uint32_t result;
+
+ __asm__ __volatile__("mfcr %0, cr<18, 0>\n"
+ : "=r"(result));
+
+ return (result);
+}
+
+static inline void cskyMpuSetCCR(uint32_t ccr)
+{
+ __asm__ __volatile__("mtcr %0, cr<18, 0>\n"
+ : : "r"(ccr));
+}
+
+static inline uint32_t cskyMpuGetCAPR(void)
+{
+ register uint32_t result;
+
+ __asm__ __volatile__("mfcr %0, cr<19, 0>\n"
+ : "=r"(result));
+
+ return (result);
+}
+
+static inline void cskyMpuSetCAPR(uint32_t capr)
+{
+ __asm__ __volatile__("mtcr %0, cr<19, 0>\n"
+ : : "r"(capr));
+}
+
+static inline void cskyMpuSetPACR(uint32_t pacr)
+{
+ __asm__ __volatile__("mtcr %0, cr<20, 0>\n"
+ : : "r"(pacr));
+}
+
+static inline uint32_t cskyMpuGetPACR(void)
+{
+ uint32_t result;
+
+ __asm__ __volatile__("mfcr %0, cr<20, 0>"
+ : "=r"(result));
+
+ return (result);
+}
+
+static inline void cskyMpuSetPRSR(uint32_t prsr)
+{
+ __asm__ __volatile__("mtcr %0, cr<21, 0>\n"
+ : : "r"(prsr));
+}
+
+static inline uint32_t cskyMpuGetPRSR(void)
+{
+ uint32_t result;
+
+ __asm__ __volatile__("mfcr %0, cr<21, 0>"
+ : "=r"(result));
+
+ return (result);
+}
+
#endif /* !__ASSEMBLY__ */
#define CSKY_FPUID_IMPLEMENT (1 << 31)
diff --git a/SylixOS/include/net/if.h b/SylixOS/include/net/if.h
index 091292f..9b43cd9 100644
--- a/SylixOS/include/net/if.h
+++ b/SylixOS/include/net/if.h
@@ -249,6 +249,34 @@ struct in6_ifreq {
#define SIOCDIFADDR6 _IOW('i', 35, struct in6_ifreq)
/*********************************************************************************************************
+ sylixos if statistics
+*********************************************************************************************************/
+
+struct ifstatreq {
+ char ifrs_name[IFNAMSIZ]; /* if name, e.g. "en1" */
+ u_long ifrs_mtu; /* maximum transmission unit */
+ u_long ifrs_collisions; /* collisions on csma interfaces */
+ uint64_t ifrs_baudrate; /* linespeed */
+ uint64_t ifrs_ipackets; /* packets received on interface */
+ uint64_t ifrs_ierrors; /* input errors on interface */
+ uint64_t ifrs_opackets; /* packets sent on interface */
+ uint64_t ifrs_oerrors; /* output errors on interface */
+ uint64_t ifrs_ibytes; /* total number of octets received */
+ uint64_t ifrs_obytes; /* total number of octets sent */
+ uint64_t ifrs_imcasts; /* packets received via multicast */
+ uint64_t ifrs_omcasts; /* packets sent via multicast */
+ uint64_t ifrs_iqdrops; /* dropped on input, this interface */
+ uint64_t ifrs_noproto; /* destined for unsupported protocol */
+ uint64_t ifrs_reserved[8];
+};
+
+/*********************************************************************************************************
+ sylixos if statistics ioctl
+*********************************************************************************************************/
+
+#define SIOCGIFSTATS _IOWR('i', 80, struct ifstatreq)
+
+/*********************************************************************************************************
6lowpan IEEE802.15.4
*********************************************************************************************************/
diff --git a/SylixOS/net/lwip/lwip_ifctl.c b/SylixOS/net/lwip/lwip_ifctl.c
index abf938b..cd09880 100644
--- a/SylixOS/net/lwip/lwip_ifctl.c
+++ b/SylixOS/net/lwip/lwip_ifctl.c
@@ -642,6 +642,66 @@ static INT __ifSubIoctl6 (INT iCmd, PVOID pvArg)
#endif /* LWIP_IPV6 */
/*********************************************************************************************************
+** 函数名称: __ifSubIoctlStats
+** 功能描述: INET 网络统计接口 ioctl 操作
+** 输 入 : iCmd 命令
+** pvArg 参数
+** 输 出 : 处理结果
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+INT __ifSubIoctlStats (INT iCmd, PVOID pvArg)
+{
+#define MIB2_NETIF(netif) (&((netif)->mib2_counters))
+
+ INT iRet = PX_ERROR;
+ struct ifstatreq *pifstat;
+ struct netif *pnetif;
+ struct netdev *pnetdev;
+
+ pifstat = (struct ifstatreq *)pvArg;
+
+ pnetif = netif_find(pifstat->ifrs_name);
+ if (pnetif == LW_NULL) {
+ _ErrorHandle(EADDRNOTAVAIL); /* 未找到指定的网络接口 */
+ return (iRet);
+ }
+
+ if (netif_is_mipif(pnetif)) {
+ pnetif = netif_get_masterif(pnetif);
+ if (pnetif == LW_NULL) {
+ _ErrorHandle(EADDRNOTAVAIL); /* 未找到指定的网络接口 */
+ return (iRet);
+ }
+ }
+
+ switch (iCmd) {
+
+ case SIOCGIFSTATS:
+ pifstat->ifrs_mtu = pnetif->mtu;
+ pifstat->ifrs_collisions = MIB2_NETIF(pnetif)->ifcollisions;
+ pifstat->ifrs_baudrate = pnetif->link_speed;
+ pifstat->ifrs_ipackets = MIB2_NETIF(pnetif)->ifinucastpkts + MIB2_NETIF(pnetif)->ifinnucastpkts;
+ pifstat->ifrs_ierrors = MIB2_NETIF(pnetif)->ifinerrors;
+ pifstat->ifrs_opackets = MIB2_NETIF(pnetif)->ifoutucastpkts + MIB2_NETIF(pnetif)->ifoutnucastpkts;
+ pifstat->ifrs_oerrors = MIB2_NETIF(pnetif)->ifouterrors;
+ pifstat->ifrs_ibytes = MIB2_NETIF(pnetif)->ifinoctets;
+ pifstat->ifrs_obytes = MIB2_NETIF(pnetif)->ifoutoctets;
+ pifstat->ifrs_imcasts = MIB2_NETIF(pnetif)->ifinnucastpkts;
+ pifstat->ifrs_omcasts = MIB2_NETIF(pnetif)->ifoutnucastpkts;
+ pifstat->ifrs_iqdrops = MIB2_NETIF(pnetif)->ifindiscards;
+ pifstat->ifrs_noproto = MIB2_NETIF(pnetif)->ifinunknownprotos;
+ pnetdev = (netdev_t *)(pnetif->state);
+ if (pnetdev && (pnetdev->magic_no == NETDEV_MAGIC)) {
+ pifstat->ifrs_baudrate = pnetdev->speed;
+ }
+ iRet = ERROR_NONE;
+ break;
+ }
+
+ return (iRet);
+}
+/*********************************************************************************************************
** 函数名称: __ifSubIoctlCommon
** 功能描述: 通用网络接口 ioctl 操作
** 输 入 : iCmd 命令
@@ -791,6 +851,12 @@ INT __ifIoctlInet (INT iCmd, PVOID pvArg)
break;
#endif /* LWIP_IPV6 */
+ case SIOCGIFSTATS: /* 网络统计 */
+ LWIP_IF_LIST_LOCK(LW_FALSE); /* 进入临界区 */
+ iRet = __ifSubIoctlStats(iCmd, pvArg);
+ LWIP_IF_LIST_UNLOCK(); /* 退出临界区 */
+ break;
+
default:
_ErrorHandle(ENOSYS);
break;
@@ -883,6 +949,12 @@ INT __ifIoctlPacket (INT iCmd, PVOID pvArg)
LWIP_IF_LIST_UNLOCK(); /* 退出临界区 */
break;
+ case SIOCGIFSTATS: /* 网络统计 */
+ LWIP_IF_LIST_LOCK(LW_FALSE); /* 进入临界区 */
+ iRet = __ifSubIoctlStats(iCmd, pvArg);
+ LWIP_IF_LIST_UNLOCK(); /* 退出临界区 */
+ break;
+
default:
_ErrorHandle(ENOSYS);
break;
diff --git a/SylixOS/net/lwip/lwip_socket.c b/SylixOS/net/lwip/lwip_socket.c
index 3151f89..4e14444 100644
--- a/SylixOS/net/lwip/lwip_socket.c
+++ b/SylixOS/net/lwip/lwip_socket.c
@@ -552,6 +552,7 @@ static INT __socketIoctl (SOCKET_T *psock, INT iCmd, PVOID pvArg)
case SIOCSIFHWADDR:
case SIOCGIFPFLAGS:
case SIOCSIFPFLAGS:
+ case SIOCGIFSTATS:
iRet = __ifIoctlPacket(iCmd, pvArg);
break;
@@ -663,6 +664,7 @@ static INT __socketIoctl (SOCKET_T *psock, INT iCmd, PVOID pvArg)
case SIOCGIFNETMASK6:
case SIOCGIFDSTADDR6:
case SIOCDIFADDR6:
+ case SIOCGIFSTATS:
iRet = __ifIoctlInet(iCmd, pvArg);
break;
diff --git a/SylixOS/net/lwip/route/af_route.c b/SylixOS/net/lwip/route/af_route.c
index 278c41a..9370c86 100644
--- a/SylixOS/net/lwip/route/af_route.c
+++ b/SylixOS/net/lwip/route/af_route.c
@@ -34,6 +34,7 @@
#include "lwip/mem.h"
#include "lwip/netif.h"
#include "lwip/tcpip.h"
+#include "netdev.h"
#include "af_route.h"
/*********************************************************************************************************
函数声明
@@ -1389,6 +1390,7 @@ VOID route_hook_netif_updown (struct netif *pnetif)
#define MIB2_NETIF(netif) (&((netif)->mib2_counters))
size_t stMsgLen;
+ struct netdev *pnetdev;
struct if_msghdr *pmsghdr;
struct sockaddr_dl *psockaddrdl;
struct if_data *pifdata;
@@ -1448,17 +1450,24 @@ VOID route_hook_netif_updown (struct netif *pnetif)
pifdata->ifi_type = IFT_OTHER;
}
- pifdata->ifi_baudrate = pnetif->link_speed;
- pifdata->ifi_ipackets = MIB2_NETIF(pnetif)->ifinucastpkts + MIB2_NETIF(pnetif)->ifinnucastpkts;
- pifdata->ifi_ierrors = MIB2_NETIF(pnetif)->ifinerrors;
- pifdata->ifi_opackets = MIB2_NETIF(pnetif)->ifoutucastpkts + MIB2_NETIF(pnetif)->ifoutnucastpkts;
- pifdata->ifi_oerrors = MIB2_NETIF(pnetif)->ifouterrors;
- pifdata->ifi_ibytes = (u_long)MIB2_NETIF(pnetif)->ifinoctets;
- pifdata->ifi_obytes = (u_long)MIB2_NETIF(pnetif)->ifoutoctets;
- pifdata->ifi_imcasts = MIB2_NETIF(pnetif)->ifinnucastpkts;
- pifdata->ifi_omcasts = MIB2_NETIF(pnetif)->ifoutnucastpkts;
- pifdata->ifi_iqdrops = MIB2_NETIF(pnetif)->ifindiscards;
- pifdata->ifi_noproto = MIB2_NETIF(pnetif)->ifinunknownprotos;
+ pnetdev = (netdev_t *)(pnetif->state);
+ if (pnetdev && (pnetdev->magic_no == NETDEV_MAGIC)) {
+ pifdata->ifi_baudrate = pnetdev->speed;
+ } else {
+ pifdata->ifi_baudrate = pnetif->link_speed;
+ }
+
+ pifdata->ifi_ipackets = MIB2_NETIF(pnetif)->ifinucastpkts + MIB2_NETIF(pnetif)->ifinnucastpkts;
+ pifdata->ifi_ierrors = MIB2_NETIF(pnetif)->ifinerrors;
+ pifdata->ifi_opackets = MIB2_NETIF(pnetif)->ifoutucastpkts + MIB2_NETIF(pnetif)->ifoutnucastpkts;
+ pifdata->ifi_oerrors = MIB2_NETIF(pnetif)->ifouterrors;
+ pifdata->ifi_collisions = MIB2_NETIF(pnetif)->ifcollisions;
+ pifdata->ifi_ibytes = (u_long)MIB2_NETIF(pnetif)->ifinoctets;
+ pifdata->ifi_obytes = (u_long)MIB2_NETIF(pnetif)->ifoutoctets;
+ pifdata->ifi_imcasts = MIB2_NETIF(pnetif)->ifinnucastpkts;
+ pifdata->ifi_omcasts = MIB2_NETIF(pnetif)->ifoutnucastpkts;
+ pifdata->ifi_iqdrops = MIB2_NETIF(pnetif)->ifindiscards;
+ pifdata->ifi_noproto = MIB2_NETIF(pnetif)->ifinunknownprotos;
lib_clock_gettime(CLOCK_REALTIME, &ts);
pifdata->ifi_lastchange.tv_sec = ts.tv_sec;
diff --git a/SylixOS/vpmpdm/dlmalloc/dl_malloc.c b/SylixOS/vpmpdm/dlmalloc/dl_malloc.c
index 696f8ed..3f8944d 100644
--- a/SylixOS/vpmpdm/dlmalloc/dl_malloc.c
+++ b/SylixOS/vpmpdm/dlmalloc/dl_malloc.c
@@ -83,10 +83,15 @@ void *dlmalloc_mmap (size_t stLen)
{
void *mem;
+#ifdef MAP_PREALLOC
+ mem = mmap(NULL, stLen, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_PREALLOC, -1, 0);
+
+#else
mem = mmap(NULL, stLen, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (mem != MAP_FAILED) {
__vp_pre_alloc_phy(mem, stLen, 1);
}
+#endif
return (mem);
}
@@ -97,7 +102,12 @@ void *dlmalloc_mmap (size_t stLen)
void *dlmalloc_mremap (void *pvAddr, size_t stOldSize, size_t stNewSize, int mv)
{
void *mem;
- int flag = 0;
+
+#ifdef MAP_PREALLOC
+ mem = MAP_FAILED;
+
+#else
+ int flag = 0;
if (mv) {
flag = MREMAP_MAYMOVE;
@@ -107,6 +117,7 @@ void *dlmalloc_mremap (void *pvAddr, size_t stOldSize, size_t stNewSize, int mv
if (mem != MAP_FAILED) {
__vp_pre_alloc_phy(mem, stNewSize, 1);
}
+#endif
return (mem);
}
diff --git a/libsylixos.mk b/libsylixos.mk
index d90540b..026c5cf 100644
--- a/libsylixos.mk
+++ b/libsylixos.mk
@@ -632,6 +632,10 @@ SylixOS/arch/csky/common/cskyExcAsm.S \
SylixOS/arch/csky/common/cskyIo.c \
SylixOS/arch/csky/common/cskyLib.c \
SylixOS/arch/csky/common/cskyLibAsm.S \
+SylixOS/arch/csky/common/ck803/cskyContextCK803.c \
+SylixOS/arch/csky/common/ck803/cskyContextCK803Asm.S \
+SylixOS/arch/csky/common/ck803/cskyExcCK803.c \
+SylixOS/arch/csky/common/ck803/cskyExcCK803Asm.S \
SylixOS/arch/csky/common/unaligned/cskyUnaligned.c \
SylixOS/arch/csky/dbg/cskyDbg.c \
SylixOS/arch/csky/dbg/cskyGdb.c \
@@ -643,9 +647,12 @@ SylixOS/arch/csky/fpu/vfpnone/cskyVfpNone.c \
SylixOS/arch/csky/mm/cskyCache.c \
SylixOS/arch/csky/mm/cache/cskyCache.c \
SylixOS/arch/csky/mm/cache/cskyCacheAsm.S \
+SylixOS/arch/csky/mm/cache/ck803/cskyCacheCK803.c \
SylixOS/arch/csky/mm/cskyMmu.c \
SylixOS/arch/csky/mm/mmu/cskyMmu.c \
SylixOS/arch/csky/mm/mmu/cskyMmuAsm.S \
+SylixOS/arch/csky/mm/cskyMpu.c \
+SylixOS/arch/csky/mm/mpu/cskyMpu.c \
SylixOS/arch/csky/mpcore/cskyMpCoreAsm.S \
SylixOS/arch/csky/mpcore/cskySpinlock.c \
SylixOS/arch/csky/param/cskyParam.c