summaryrefslogtreecommitdiffstatsabout
path: root/SylixOS
diff options
context:
space:
mode:
authorHanhui <hanhui@acoinfo.com>2020-11-28 11:36:56 (GMT)
committer Hanhui <hanhui@acoinfo.com>2020-11-28 11:36:56 (GMT)
commitab5a514c1e59b91cc7ab312b3900a38d34a6152e (patch)
tree74aacfc746aaea8c9814d9a3d6f3c6740fce6640 /SylixOS
parentb03c5f108949d508caeddc6305be397930e4d4fb (diff)
downloadlibsylixos-ab5a514c1e59b91cc7ab312b3900a38d34a6152e.zip
libsylixos-ab5a514c1e59b91cc7ab312b3900a38d34a6152e.tar.gz
libsylixos-ab5a514c1e59b91cc7ab312b3900a38d34a6152e.tar.bz2
Support CSKY 860 SMP Core and support x64 fast context, AF_UNIX support EdgerOS simple pipeline mode.
Diffstat (limited to 'SylixOS')
-rw-r--r--SylixOS/arch/csky/common/cskyContext.c14
-rw-r--r--SylixOS/arch/csky/common/cskyContextAsm.h6
-rw-r--r--SylixOS/arch/csky/common/cskyExcAsm.S4
-rw-r--r--SylixOS/arch/csky/csky_support.h6
-rw-r--r--SylixOS/arch/csky/dbg/cskyGdb.c6
-rw-r--r--SylixOS/arch/csky/fpu/fpu/cskyVfpAsm.S125
-rw-r--r--SylixOS/arch/csky/mm/cache/cskyCache.c109
-rw-r--r--SylixOS/arch/csky/mm/cache/cskyCacheAsm.S33
-rw-r--r--SylixOS/arch/csky/mm/cache/l2/cskyL2.c288
-rw-r--r--SylixOS/arch/csky/mm/cache/l2/cskyL2.h74
-rw-r--r--SylixOS/arch/csky/mm/cache/l2/cskyL2CK860.c345
-rw-r--r--SylixOS/arch/csky/mm/mmu/cskyMmu.c4
-rw-r--r--SylixOS/arch/csky/mm/mmu/cskyMmuAsm.S7
-rw-r--r--SylixOS/arch/csky/mpcore/cskyMpCoreAsm.S5
-rw-r--r--SylixOS/arch/csky/mpcore/cskySpinlock.c88
-rw-r--r--SylixOS/arch/csky/param/cskyParam.c13
-rw-r--r--SylixOS/arch/csky/param/cskyParam.h1
-rw-r--r--SylixOS/arch/x86/common/x64/x64ContextAsm.S25
-rw-r--r--SylixOS/arch/x86/pentium/x86Pentium.h1
-rw-r--r--SylixOS/config/cpu/cpu_cfg_csky.h17
-rw-r--r--SylixOS/config/cpu/cpu_cfg_x86.h5
-rw-r--r--SylixOS/include/arch/csky/arch_def.h134
-rw-r--r--SylixOS/include/arch/csky/arch_float.h4
-rw-r--r--SylixOS/include/arch/csky/arch_regs.h11
-rw-r--r--SylixOS/include/arch/csky/asm/archprob.h4
-rw-r--r--SylixOS/include/arch/csky/inc/cskyregs.h89
-rw-r--r--SylixOS/include/sys/un.h92
-rw-r--r--SylixOS/kernel/include/k_api.h3
-rw-r--r--SylixOS/kernel/include/k_kernel.h4
-rw-r--r--SylixOS/kernel/interface/ThreadGetNotePad.c16
-rw-r--r--SylixOS/kernel/interface/ThreadIdSelf.c27
-rw-r--r--SylixOS/loader/elf/elf_loader.c35
-rw-r--r--SylixOS/loader/elf/elf_type.h3
-rw-r--r--SylixOS/net/lwip/netdev/netdev_mip.c2
-rw-r--r--SylixOS/net/lwip/unix/af_unix.c263
-rw-r--r--SylixOS/net/lwip/unix/af_unix.h9
-rw-r--r--SylixOS/shell/ttinyShell/ttinyShellSysCmd.c3
37 files changed, 1667 insertions, 208 deletions
diff --git a/SylixOS/arch/csky/common/cskyContext.c b/SylixOS/arch/csky/common/cskyContext.c
index efff6bf..d1c92d5 100644
--- a/SylixOS/arch/csky/common/cskyContext.c
+++ b/SylixOS/arch/csky/common/cskyContext.c
@@ -64,13 +64,16 @@ PLW_STACK archTaskCtxCreate (ARCH_REG_CTX *pregctx,
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_ulReg[REG_FP] = (ARCH_REG_T)pstkTop;
ulPsr = archGetPSR(); /* 获得当前的 PSR 寄存器 */
ulPsr |= bspIntInitEnableStatus() | M_PSR_IE | M_PSR_EE; /* 使能中断和异常 */
pregctx->REG_ulPsr = (ARCH_REG_T)ulPsr;
pregctx->REG_ulPc = (ARCH_REG_T)pfuncTask;
+#if !defined(__SYLIXOS_CSKY_ARCH_CK860__)
pregctx->REG_ulLo = (ARCH_REG_T)0x0;
pregctx->REG_ulHi = (ARCH_REG_T)0x0;
+#endif
pregctx->REG_ulMeh = (ARCH_REG_T)0x0;
return ((PLW_STACK)pfpctx);
@@ -154,12 +157,13 @@ VOID archTaskRegsSet (ARCH_REG_CTX *pregctxDest, const ARCH_REG_CTX *pregctxS
pregctxDest->REG_ulReg[29] = pregctxSrc->REG_ulReg[29];
pregctxDest->REG_ulReg[30] = pregctxSrc->REG_ulReg[30];
pregctxDest->REG_ulReg[31] = pregctxSrc->REG_ulReg[31];
-
+#if !defined(__SYLIXOS_CSKY_ARCH_CK860__)
pregctxDest->REG_ulLo = pregctxSrc->REG_ulLo; /* 除数低位寄存器 */
pregctxDest->REG_ulHi = pregctxSrc->REG_ulHi; /* 除数高位寄存器 */
+#endif
+ pregctxDest->REG_ulMeh = pregctxSrc->REG_ulMeh; /* 错误地址寄存器 */
pregctxDest->REG_ulPsr = pregctxSrc->REG_ulPsr; /* PSR 寄存器 */
pregctxDest->REG_ulPc = pregctxSrc->REG_ulPc; /* 程序计数器寄存器 */
- pregctxDest->REG_ulMeh = pregctxSrc->REG_ulMeh; /* 错误地址寄存器 */
}
/*********************************************************************************************************
** 函数名称: archTaskCtxShow
@@ -182,8 +186,10 @@ VOID archTaskCtxShow (INT iFd, const ARCH_REG_CTX *pregctx)
fdprintf(iFd, "\n");
fdprintf(iFd, "PC = "LX_FMT"\n", pregctx->REG_ulPc);
+#if !defined(__SYLIXOS_CSKY_ARCH_CK860__)
fdprintf(iFd, "LO = "LX_FMT"\n", pregctx->REG_ulLo);
fdprintf(iFd, "HI = "LX_FMT"\n", pregctx->REG_ulHi);
+#endif
fdprintf(iFd, "MEH = "LX_FMT"\n", pregctx->REG_ulMeh);
#ifdef __CSKYABIV2__
@@ -278,8 +284,10 @@ VOID archTaskCtxPrint (PVOID pvBuffer, size_t stSize, const ARCH_REG_CTX *pr
size_t stOft = 0;
stOft = bnprintf(pvBuffer, stSize, stOft, "PC = "LX_FMT"\n", pregctx->REG_ulPc);
+#if !defined(__SYLIXOS_CSKY_ARCH_CK860__)
stOft = bnprintf(pvBuffer, stSize, stOft, "LO = "LX_FMT"\n", pregctx->REG_ulLo);
stOft = bnprintf(pvBuffer, stSize, stOft, "HI = "LX_FMT"\n", pregctx->REG_ulHi);
+#endif
stOft = bnprintf(pvBuffer, stSize, stOft, "MEH = "LX_FMT"\n", pregctx->REG_ulMeh);
#ifdef __CSKYABIV2__
@@ -352,8 +360,10 @@ VOID archTaskCtxPrint (PVOID pvBuffer, size_t stSize, const ARCH_REG_CTX *pr
_PrintFormat("\r\n");
_PrintFormat("PC = "LX_FMT"\r\n", pregctx->REG_ulPc);
+#if !defined(__SYLIXOS_CSKY_ARCH_CK860__)
_PrintFormat("LO = "LX_FMT"\r\n", pregctx->REG_ulLo);
_PrintFormat("HI = "LX_FMT"\r\n", pregctx->REG_ulHi);
+#endif
_PrintFormat("MEH = "LX_FMT"\r\n", pregctx->REG_ulMeh);
#ifdef __CSKYABIV2__
diff --git a/SylixOS/arch/csky/common/cskyContextAsm.h b/SylixOS/arch/csky/common/cskyContextAsm.h
index b59a1ce..2b4109e 100644
--- a/SylixOS/arch/csky/common/cskyContextAsm.h
+++ b/SylixOS/arch/csky/common/cskyContextAsm.h
@@ -35,12 +35,13 @@ MACRO_DEF(SAVE_KERN_REGS)
MFCR A2 , PSR ;/* 保存 PSR 寄存器 */
ST.W A2 , (A1 , XPSR)
-
+#if !defined(__SYLIXOS_CSKY_ARCH_CK860__)
MFLO A2 ;/* 保存 LO 寄存器 */
ST.W A2 , (A1 , XLO)
MFHI A2 ;/* 保存 HI 寄存器 */
ST.W A2 , (A1 , XHI)
+#endif
MACRO_END()
;/*********************************************************************************************************
@@ -49,12 +50,13 @@ MACRO_DEF(SAVE_KERN_REGS)
;*********************************************************************************************************/
MACRO_DEF(RESTORE_KERN_REGS)
+#if !defined(__SYLIXOS_CSKY_ARCH_CK860__)
LD.W A0 , (A1 , XLO) ;/* 恢复 LO 寄存器 */
MTLO A0
LD.W A0 , (A1 , XHI) ;/* 恢复 HI 寄存器 */
MTHI A0
-
+#endif
LD.W A0 , (A1 , XPSR) ;/* 恢复 PSR 寄存器 */
MTCR A0 , EPSR
diff --git a/SylixOS/arch/csky/common/cskyExcAsm.S b/SylixOS/arch/csky/common/cskyExcAsm.S
index 52714aa..c49377f 100644
--- a/SylixOS/arch/csky/common/cskyExcAsm.S
+++ b/SylixOS/arch/csky/common/cskyExcAsm.S
@@ -119,13 +119,13 @@ MACRO_DEF(IRQ_ENTRY irq handle)
MFCR R18 , EPSR ;/* EPSR 代替 PSR 保存 */
ST.W R18 , (SP , XPSR)
-
+#if !defined(__SYLIXOS_CSKY_ARCH_CK860__)
MFLO R18 ;/* 保存 LO 寄存器 */
ST.W R18 , (SP , XLO)
MFHI R18 ;/* 保存 HI 寄存器 */
ST.W R18 , (SP , XHI)
-
+#endif
MFCR R18 , CR<4, 15> ;/* 保存 MEH 寄存器 */
ST.W R18 , (SP , XMEH)
diff --git a/SylixOS/arch/csky/csky_support.h b/SylixOS/arch/csky/csky_support.h
index ff92f1a..0212b9f 100644
--- a/SylixOS/arch/csky/csky_support.h
+++ b/SylixOS/arch/csky/csky_support.h
@@ -191,6 +191,12 @@ VOID archMpuInit(CPCHAR pcMachineName, const CSKY_MPU_REGION mpuregion[]);
*********************************************************************************************************/
#if LW_CFG_SMP_EN > 0
+VOID archSpinBypass(VOID);
+VOID archSpinWork(VOID);
+
+#define __ARCH_SPIN_BYPASS archSpinBypass
+#define __ARCH_SPIN_WORK archSpinWork
+
VOID archSpinInit(spinlock_t *psl);
VOID archSpinDelay(VOID);
VOID archSpinNotify(VOID);
diff --git a/SylixOS/arch/csky/dbg/cskyGdb.c b/SylixOS/arch/csky/dbg/cskyGdb.c
index 2ba7aca..11315fd 100644
--- a/SylixOS/arch/csky/dbg/cskyGdb.c
+++ b/SylixOS/arch/csky/dbg/cskyGdb.c
@@ -128,8 +128,10 @@ static const CHAR cTargetSystem[] = \
*********************************************************************************************************/
#define GDB_REG_INDEX_GREG(n) (n) /* 32 个通用目的寄存器 */
#define GDB_REG_INDEX_PSR 89 /* 处理器状态寄存器 */
+#if !defined(__SYLIXOS_CSKY_ARCH_CK860__)
#define GDB_REG_INDEX_LO 37 /* 除数低位寄存器 */
#define GDB_REG_INDEX_HI 36 /* 除数高位寄存器 */
+#endif
#define GDB_REG_INDEX_PC 72 /* 程序计数器寄存器 */
#define GDB_REG_INDEX_FP(n) (40 + (n)) /* 32 个浮点数据寄存器 */
#define GDB_REG_INDEX_FPCR (121) /* 浮点控制寄存器 */
@@ -213,8 +215,10 @@ INT archGdbRegsGet (PVOID pvDtrace, LW_OBJECT_HANDLE ulThread, GDB_REG_SET *
pregset->regArr[GDB_REG_INDEX_GREG(30)].GDBRA_ulValue = regctx.REG_ulReg[30];
pregset->regArr[GDB_REG_INDEX_GREG(31)].GDBRA_ulValue = regctx.REG_ulReg[31];
pregset->regArr[GDB_REG_INDEX_PSR].GDBRA_ulValue = regctx.REG_ulPsr;
+#if !defined(__SYLIXOS_CSKY_ARCH_CK860__)
pregset->regArr[GDB_REG_INDEX_LO].GDBRA_ulValue = regctx.REG_ulLo;
pregset->regArr[GDB_REG_INDEX_HI].GDBRA_ulValue = regctx.REG_ulHi;
+#endif
pregset->regArr[GDB_REG_INDEX_PC].GDBRA_ulValue = regctx.REG_ulPc;
pregset->regArr[GDB_REG_INDEX_FP( 0)].GDBRA_ulValue = fpuctx.FPUCTX_uiDreg[ 0].val32[0];
@@ -306,8 +310,10 @@ INT archGdbRegsSet (PVOID pvDtrace, LW_OBJECT_HANDLE ulThread, GDB_REG_SET *
regctx.REG_ulReg[30] = pregset->regArr[GDB_REG_INDEX_GREG(30)].GDBRA_ulValue;
regctx.REG_ulReg[31] = pregset->regArr[GDB_REG_INDEX_GREG(31)].GDBRA_ulValue;
regctx.REG_ulPsr = pregset->regArr[GDB_REG_INDEX_PSR].GDBRA_ulValue;
+#if !defined(__SYLIXOS_CSKY_ARCH_CK860__)
regctx.REG_ulLo = pregset->regArr[GDB_REG_INDEX_LO].GDBRA_ulValue;
regctx.REG_ulHi = pregset->regArr[GDB_REG_INDEX_HI].GDBRA_ulValue;
+#endif
regctx.REG_ulPc = pregset->regArr[GDB_REG_INDEX_PC].GDBRA_ulValue;
API_DtraceSetRegs(pvDtrace, ulThread, &regctx);
diff --git a/SylixOS/arch/csky/fpu/fpu/cskyVfpAsm.S b/SylixOS/arch/csky/fpu/fpu/cskyVfpAsm.S
index 5d9567e..eae1d03 100644
--- a/SylixOS/arch/csky/fpu/fpu/cskyVfpAsm.S
+++ b/SylixOS/arch/csky/fpu/fpu/cskyVfpAsm.S
@@ -80,7 +80,7 @@
#define FCR_IOE 0
#endif
-#define FCR_CONFIG (FCR_FM | FCR_RM |FCR_IDE | FCR_IXE | FCR_UFE | FCR_OFE | FCR_DZE | FCR_IOE)
+#define FCR_CONFIG (FCR_FM | FCR_RM | FCR_IDE | FCR_IXE | FCR_UFE | FCR_OFE | FCR_DZE | FCR_IOE)
;/*********************************************************************************************************
; 宏定义
@@ -98,6 +98,20 @@ MACRO_DEF(FPU_REG_SAVE fr, tmp, base, offset)
ST.W \tmp , (\base , \offset)
MACRO_END()
+#elif defined(__SYLIXOS_CSKY_ARCH_CK860__)
+
+MACRO_DEF(FPU_REG_RESTORE fr, tmpl, tmph, base, offsetl, offseth)
+ LD.W \tmpl , (\base , \offsetl)
+ LD.W \tmph , (\base , \offseth)
+ FMTVR.64 \fr , \tmpl , \tmph
+ MACRO_END()
+
+MACRO_DEF(FPU_REG_SAVE fr, tmpl, tmph, base, offsetl, offseth)
+ FMFVR.64 \tmpl , \tmph , \fr
+ ST.W \tmpl , (\base , \offsetl)
+ ST.W \tmph , (\base , \offseth)
+ MACRO_END()
+
#else
MACRO_DEF(FPU_REG_RESTORE fr, tmp, base, offsetl, offseth)
@@ -126,7 +140,43 @@ FUNC_DEF(cskyVfpInit)
MOVI A0 , 0
- FMTVRL FR0 , A0 ;/* 清零 FPU 寄存器 */
+#if defined(__SYLIXOS_CSKY_ARCH_CK860__)
+ MOVI A1 , 0 ;/* 清零 FPU 寄存器 */
+ FMTVR.64 FR1, A0, A1
+ FMTVR.64 FR2, A0, A1
+ FMTVR.64 FR3, A0, A1
+ FMTVR.64 FR4, A0, A1
+ FMTVR.64 FR5, A0, A1
+ FMTVR.64 FR6, A0, A1
+ FMTVR.64 FR7, A0, A1
+ FMTVR.64 FR8, A0, A1
+ FMTVR.64 FR9, A0, A1
+ FMTVR.64 FR10, A0, A1
+ FMTVR.64 FR11, A0, A1
+ FMTVR.64 FR12, A0, A1
+ FMTVR.64 FR13, A0, A1
+ FMTVR.64 FR14, A0, A1
+ FMTVR.64 FR15, A0, A1
+ FMTVR.64 FR16, A0, A1
+ FMTVR.64 FR17, A0, A1
+ FMTVR.64 FR18, A0, A1
+ FMTVR.64 FR19, A0, A1
+ FMTVR.64 FR20, A0, A1
+ FMTVR.64 FR21, A0, A1
+ FMTVR.64 FR22, A0, A1
+ FMTVR.64 FR23, A0, A1
+ FMTVR.64 FR24, A0, A1
+ FMTVR.64 FR25, A0, A1
+ FMTVR.64 FR26, A0, A1
+ FMTVR.64 FR27, A0, A1
+ FMTVR.64 FR28, A0, A1
+ FMTVR.64 FR29, A0, A1
+ FMTVR.64 FR30, A0, A1
+ FMTVR.64 FR31, A0, A1
+
+#else
+
+ FMTVRL FR0 , A0
FMTVRL FR1 , A0
FMTVRL FR2 , A0
FMTVRL FR3 , A0
@@ -163,6 +213,7 @@ FUNC_DEF(cskyVfpInit)
FMTVRH FR15, A0
#endif
+#endif
RTS
FUNC_END(cskyVfpInit)
@@ -192,6 +243,41 @@ FUNC_DEF(cskyVfpSave)
FPU_REG_SAVE FR14, A1, A0, FPU_OFFSET_REG(14)
FPU_REG_SAVE FR15, A1, A0, FPU_OFFSET_REG(15)
+#elif defined(__SYLIXOS_CSKY_ARCH_CK860__)
+
+ FPU_REG_SAVE FR0 , A2, A1, A0, FPU_OFFSET_REG_LO(0), FPU_OFFSET_REG_HI(0)
+ FPU_REG_SAVE FR1 , A2, A1, A0, FPU_OFFSET_REG_LO(1), FPU_OFFSET_REG_HI(1)
+ FPU_REG_SAVE FR2 , A2, A1, A0, FPU_OFFSET_REG_LO(2), FPU_OFFSET_REG_HI(2)
+ FPU_REG_SAVE FR3 , A2, A1, A0, FPU_OFFSET_REG_LO(3), FPU_OFFSET_REG_HI(3)
+ FPU_REG_SAVE FR4 , A2, A1, A0, FPU_OFFSET_REG_LO(4), FPU_OFFSET_REG_HI(4)
+ FPU_REG_SAVE FR5 , A2, A1, A0, FPU_OFFSET_REG_LO(5), FPU_OFFSET_REG_HI(5)
+ FPU_REG_SAVE FR6 , A2, A1, A0, FPU_OFFSET_REG_LO(6), FPU_OFFSET_REG_HI(6)
+ FPU_REG_SAVE FR7 , A2, A1, A0, FPU_OFFSET_REG_LO(7), FPU_OFFSET_REG_HI(7)
+ FPU_REG_SAVE FR8 , A2, A1, A0, FPU_OFFSET_REG_LO(8), FPU_OFFSET_REG_HI(8)
+ FPU_REG_SAVE FR9 , A2, A1, A0, FPU_OFFSET_REG_LO(9), FPU_OFFSET_REG_HI(9)
+ FPU_REG_SAVE FR10 , A2, A1, A0, FPU_OFFSET_REG_LO(10), FPU_OFFSET_REG_HI(10)
+ FPU_REG_SAVE FR11 , A2, A1, A0, FPU_OFFSET_REG_LO(11), FPU_OFFSET_REG_HI(11)
+ FPU_REG_SAVE FR12 , A2, A1, A0, FPU_OFFSET_REG_LO(12), FPU_OFFSET_REG_HI(12)
+ FPU_REG_SAVE FR13 , A2, A1, A0, FPU_OFFSET_REG_LO(13), FPU_OFFSET_REG_HI(13)
+ FPU_REG_SAVE FR14 , A2, A1, A0, FPU_OFFSET_REG_LO(14), FPU_OFFSET_REG_HI(14)
+ FPU_REG_SAVE FR15 , A2, A1, A0, FPU_OFFSET_REG_LO(15), FPU_OFFSET_REG_HI(15)
+ FPU_REG_SAVE FR16 , A2, A1, A0, FPU_OFFSET_REG_LO(16), FPU_OFFSET_REG_HI(16)
+ FPU_REG_SAVE FR17 , A2, A1, A0, FPU_OFFSET_REG_LO(17), FPU_OFFSET_REG_HI(17)
+ FPU_REG_SAVE FR18 , A2, A1, A0, FPU_OFFSET_REG_LO(18), FPU_OFFSET_REG_HI(18)
+ FPU_REG_SAVE FR19 , A2, A1, A0, FPU_OFFSET_REG_LO(19), FPU_OFFSET_REG_HI(19)
+ FPU_REG_SAVE FR20 , A2, A1, A0, FPU_OFFSET_REG_LO(20), FPU_OFFSET_REG_HI(20)
+ FPU_REG_SAVE FR21 , A2, A1, A0, FPU_OFFSET_REG_LO(21), FPU_OFFSET_REG_HI(21)
+ FPU_REG_SAVE FR22 , A2, A1, A0, FPU_OFFSET_REG_LO(22), FPU_OFFSET_REG_HI(22)
+ FPU_REG_SAVE FR23 , A2, A1, A0, FPU_OFFSET_REG_LO(23), FPU_OFFSET_REG_HI(23)
+ FPU_REG_SAVE FR24 , A2, A1, A0, FPU_OFFSET_REG_LO(24), FPU_OFFSET_REG_HI(24)
+ FPU_REG_SAVE FR25 , A2, A1, A0, FPU_OFFSET_REG_LO(25), FPU_OFFSET_REG_HI(25)
+ FPU_REG_SAVE FR26 , A2, A1, A0, FPU_OFFSET_REG_LO(26), FPU_OFFSET_REG_HI(26)
+ FPU_REG_SAVE FR27 , A2, A1, A0, FPU_OFFSET_REG_LO(27), FPU_OFFSET_REG_HI(27)
+ FPU_REG_SAVE FR28 , A2, A1, A0, FPU_OFFSET_REG_LO(28), FPU_OFFSET_REG_HI(28)
+ FPU_REG_SAVE FR29 , A2, A1, A0, FPU_OFFSET_REG_LO(29), FPU_OFFSET_REG_HI(29)
+ FPU_REG_SAVE FR30 , A2, A1, A0, FPU_OFFSET_REG_LO(30), FPU_OFFSET_REG_HI(30)
+ FPU_REG_SAVE FR31 , A2, A1, A0, FPU_OFFSET_REG_LO(31), FPU_OFFSET_REG_HI(31)
+
#else
FPU_REG_SAVE FR0 , A1, A0, FPU_OFFSET_REG_LO(0), FPU_OFFSET_REG_HI(0)
@@ -249,6 +335,41 @@ FUNC_DEF(cskyVfpRestore)
FPU_REG_RESTORE FR14, A1, A0, FPU_OFFSET_REG(14)
FPU_REG_RESTORE FR15, A1, A0, FPU_OFFSET_REG(15)
+#elif defined(__SYLIXOS_CSKY_ARCH_CK860__)
+
+ FPU_REG_RESTORE FR0 , A2, A1, A0, FPU_OFFSET_REG_LO(0), FPU_OFFSET_REG_HI(0)
+ FPU_REG_RESTORE FR1 , A2, A1, A0, FPU_OFFSET_REG_LO(1), FPU_OFFSET_REG_HI(1)
+ FPU_REG_RESTORE FR2 , A2, A1, A0, FPU_OFFSET_REG_LO(2), FPU_OFFSET_REG_HI(2)
+ FPU_REG_RESTORE FR3 , A2, A1, A0, FPU_OFFSET_REG_LO(3), FPU_OFFSET_REG_HI(3)
+ FPU_REG_RESTORE FR4 , A2, A1, A0, FPU_OFFSET_REG_LO(4), FPU_OFFSET_REG_HI(4)
+ FPU_REG_RESTORE FR5 , A2, A1, A0, FPU_OFFSET_REG_LO(5), FPU_OFFSET_REG_HI(5)
+ FPU_REG_RESTORE FR6 , A2, A1, A0, FPU_OFFSET_REG_LO(6), FPU_OFFSET_REG_HI(6)
+ FPU_REG_RESTORE FR7 , A2, A1, A0, FPU_OFFSET_REG_LO(7), FPU_OFFSET_REG_HI(7)
+ FPU_REG_RESTORE FR8 , A2, A1, A0, FPU_OFFSET_REG_LO(8), FPU_OFFSET_REG_HI(8)
+ FPU_REG_RESTORE FR9 , A2, A1, A0, FPU_OFFSET_REG_LO(9), FPU_OFFSET_REG_HI(9)
+ FPU_REG_RESTORE FR10 , A2, A1, A0, FPU_OFFSET_REG_LO(10), FPU_OFFSET_REG_HI(10)
+ FPU_REG_RESTORE FR11 , A2, A1, A0, FPU_OFFSET_REG_LO(11), FPU_OFFSET_REG_HI(11)
+ FPU_REG_RESTORE FR12 , A2, A1, A0, FPU_OFFSET_REG_LO(12), FPU_OFFSET_REG_HI(12)
+ FPU_REG_RESTORE FR13 , A2, A1, A0, FPU_OFFSET_REG_LO(13), FPU_OFFSET_REG_HI(13)
+ FPU_REG_RESTORE FR14 , A2, A1, A0, FPU_OFFSET_REG_LO(14), FPU_OFFSET_REG_HI(14)
+ FPU_REG_RESTORE FR15 , A2, A1, A0, FPU_OFFSET_REG_LO(15), FPU_OFFSET_REG_HI(15)
+ FPU_REG_RESTORE FR16 , A2, A1, A0, FPU_OFFSET_REG_LO(16), FPU_OFFSET_REG_HI(16)
+ FPU_REG_RESTORE FR17 , A2, A1, A0, FPU_OFFSET_REG_LO(17), FPU_OFFSET_REG_HI(17)
+ FPU_REG_RESTORE FR18 , A2, A1, A0, FPU_OFFSET_REG_LO(18), FPU_OFFSET_REG_HI(18)
+ FPU_REG_RESTORE FR19 , A2, A1, A0, FPU_OFFSET_REG_LO(19), FPU_OFFSET_REG_HI(19)
+ FPU_REG_RESTORE FR20 , A2, A1, A0, FPU_OFFSET_REG_LO(20), FPU_OFFSET_REG_HI(20)
+ FPU_REG_RESTORE FR21 , A2, A1, A0, FPU_OFFSET_REG_LO(21), FPU_OFFSET_REG_HI(21)
+ FPU_REG_RESTORE FR22 , A2, A1, A0, FPU_OFFSET_REG_LO(22), FPU_OFFSET_REG_HI(22)
+ FPU_REG_RESTORE FR23 , A2, A1, A0, FPU_OFFSET_REG_LO(23), FPU_OFFSET_REG_HI(23)
+ FPU_REG_RESTORE FR24 , A2, A1, A0, FPU_OFFSET_REG_LO(24), FPU_OFFSET_REG_HI(24)
+ FPU_REG_RESTORE FR25 , A2, A1, A0, FPU_OFFSET_REG_LO(25), FPU_OFFSET_REG_HI(25)
+ FPU_REG_RESTORE FR26 , A2, A1, A0, FPU_OFFSET_REG_LO(26), FPU_OFFSET_REG_HI(26)
+ FPU_REG_RESTORE FR27 , A2, A1, A0, FPU_OFFSET_REG_LO(27), FPU_OFFSET_REG_HI(27)
+ FPU_REG_RESTORE FR28 , A2, A1, A0, FPU_OFFSET_REG_LO(28), FPU_OFFSET_REG_HI(28)
+ FPU_REG_RESTORE FR29 , A2, A1, A0, FPU_OFFSET_REG_LO(29), FPU_OFFSET_REG_HI(29)
+ FPU_REG_RESTORE FR30 , A2, A1, A0, FPU_OFFSET_REG_LO(30), FPU_OFFSET_REG_HI(30)
+ FPU_REG_RESTORE FR31 , A2, A1, A0, FPU_OFFSET_REG_LO(31), FPU_OFFSET_REG_HI(31)
+
#else
FPU_REG_RESTORE FR0 , A1, A0, FPU_OFFSET_REG_LO(0), FPU_OFFSET_REG_HI(0)
diff --git a/SylixOS/arch/csky/mm/cache/cskyCache.c b/SylixOS/arch/csky/mm/cache/cskyCache.c
index 38749c1..e456b0e 100644
--- a/SylixOS/arch/csky/mm/cache/cskyCache.c
+++ b/SylixOS/arch/csky/mm/cache/cskyCache.c
@@ -35,7 +35,7 @@
L2 CACHE 支持
*********************************************************************************************************/
#if LW_CFG_CSKY_CACHE_L2 > 0
-#include "../l2/cskyL2.h"
+#include "l2/cskyL2.h"
/*********************************************************************************************************
L1 CACHE 状态
*********************************************************************************************************/
@@ -75,6 +75,19 @@ typedef struct {
UINT32 CACHE_uiWaySize; /* 路大小 */
} CSKY_CACHE;
+#if defined(__SYLIXOS_CSKY_ARCH_CK860__)
+static CSKY_CACHE _G_ICacheInfo = {
+ 32 * LW_CFG_KB_SIZE, /* 32KB 的两路组相联 ICACHE */
+ 64,
+ 16 * LW_CFG_KB_SIZE
+};
+
+static CSKY_CACHE _G_DCacheInfo = {
+ 64 * LW_CFG_KB_SIZE, /* 64KB 的两路组相联 DCACHE */
+ 64,
+ 32 * LW_CFG_KB_SIZE
+};
+#else
static CSKY_CACHE _G_ICacheInfo = {
8 * LW_CFG_KB_SIZE, /* 8KB 的四路组相联 ICACHE */
32,
@@ -86,6 +99,7 @@ static CSKY_CACHE _G_DCacheInfo = {
32,
2 * LW_CFG_KB_SIZE
};
+#endif
#define CSKY_ICACHE_SIZE _G_ICacheInfo.CACHE_uiSize
#define CSKY_DCACHE_SIZE _G_DCacheInfo.CACHE_uiSize
@@ -281,7 +295,7 @@ static VOID cskyDCacheClear (PVOID pvStart, PVOID pvEnd, size_t uiStep)
** 调用模块:
*********************************************************************************************************/
static VOID cskyDCacheInvalidate (PVOID pvStart, PVOID pvEnd, size_t uiStep)
-{
+{
cskyCacheOp(pvStart,
pvEnd,
uiStep,
@@ -315,13 +329,16 @@ static LW_INLINE VOID cskyICacheInvalidate (PVOID pvStart, PVOID pvEnd, size_
** 输 出 : ERROR or OK
** 全局变量:
** 调用模块:
-** 注 意 : 由于 L2 为物理地址 tag 所以这里暂时使用 L2 全部回写指令.
+** 注 意 : 由于 L2 CACHE 的操作指令会同时操作 L1 CACHE, 所以调用 L2 CACHE 的函数后返回
*********************************************************************************************************/
INT cskyCacheFlush (LW_CACHE_TYPE cachetype, PVOID pvAdrs, size_t stBytes)
{
addr_t ulEnd;
if (cachetype == DATA_CACHE) {
+#if LW_CFG_CSKY_CACHE_L2 > 0
+ return (cskyL2Flush(pvAdrs, stBytes)); /* L2 包含了 L1 */
+#endif /* LW_CFG_CSKY_CACHE_L2 > 0 */
if (stBytes >= CSKY_L1_CACHE_LOOP_OP_MAX_SIZE) {
cskyDCacheFlushAll(); /* 全部回写 */
@@ -330,10 +347,6 @@ INT cskyCacheFlush (LW_CACHE_TYPE cachetype, PVOID pvAdrs, size_t stBytes)
cskyDCacheFlush(pvAdrs, (PVOID)ulEnd,
CSKY_DCACHE_LINE_SIZE); /* 部分回写 */
}
-
-#if LW_CFG_CSKY_CACHE_L2 > 0
- cskyL2FlushAll();
-#endif /* LW_CFG_CSKY_CACHE_L2 > 0 */
}
return (ERROR_NONE);
@@ -348,12 +361,16 @@ INT cskyCacheFlush (LW_CACHE_TYPE cachetype, PVOID pvAdrs, size_t stBytes)
** 输 出 : ERROR or OK
** 全局变量:
** 调用模块:
+** 注 意 : L2 CACHE 的操作指令使用的是虚拟地址
*********************************************************************************************************/
static INT cskyCacheFlushPage (LW_CACHE_TYPE cachetype, PVOID pvAdrs, PVOID pvPdrs, size_t stBytes)
{
addr_t ulEnd;
if (cachetype == DATA_CACHE) {
+#if LW_CFG_CSKY_CACHE_L2 > 0
+ return (cskyL2Flush(pvAdrs, stBytes)); /* L2 包含了 L1 */
+#endif
if (stBytes >= CSKY_L1_CACHE_LOOP_OP_MAX_SIZE) {
cskyDCacheFlushAll(); /* 全部回写 */
@@ -362,10 +379,6 @@ static INT cskyCacheFlushPage (LW_CACHE_TYPE cachetype, PVOID pvAdrs, PVOID
cskyDCacheFlush(pvAdrs, (PVOID)ulEnd,
CSKY_DCACHE_LINE_SIZE); /* 部分回写 */
}
-
-#if LW_CFG_CSKY_CACHE_L2 > 0
- cskyL2Flush(pvPdrs, stBytes);
-#endif /* LW_CFG_CSKY_CACHE_L2 > 0 */
}
return (ERROR_NONE);
@@ -396,6 +409,9 @@ static INT cskyCacheInvalidate (LW_CACHE_TYPE cachetype, PVOID pvAdrs, size_t
} else {
if (stBytes > 0) { /* 必须 > 0 */
+#if LW_CFG_CSKY_CACHE_L2 > 0
+ return (cskyL2Invalidate(pvAdrs, stBytes)); /* 虚拟与物理地址必须相同 */
+#endif /* LW_CFG_CSKY_CACHE_L2 > 0 */
addr_t ulStart = (addr_t)pvAdrs;
ulEnd = ulStart + stBytes;
@@ -414,14 +430,11 @@ static INT cskyCacheInvalidate (LW_CACHE_TYPE cachetype, PVOID pvAdrs, size_t
cskyDCacheInvalidate((PVOID)ulStart, (PVOID)ulEnd, CSKY_DCACHE_LINE_SIZE);
}
-#if LW_CFG_CSKY_CACHE_L2 > 0
- cskyL2Invalidate(pvAdrs, stBytes); /* 虚拟与物理地址必须相同 */
-#endif /* LW_CFG_CSKY_CACHE_L2 > 0 */
} else {
_DebugHandle(__ERRORMESSAGE_LEVEL, "stBytes == 0.\r\n");
}
}
-
+
return (ERROR_NONE);
}
/*********************************************************************************************************
@@ -450,6 +463,9 @@ static INT cskyCacheInvalidatePage (LW_CACHE_TYPE cachetype, PVOID pvAdrs, PVOI
} else {
if (stBytes > 0) { /* 必须 > 0 */
+#if LW_CFG_CSKY_CACHE_L2 > 0
+ return (cskyL2Invalidate(pvAdrs, stBytes)); /* 虚拟与物理地址必须相同 */
+#endif /* LW_CFG_CSKY_CACHE_L2 > 0 */
addr_t ulStart = (addr_t)pvAdrs;
ulEnd = ulStart + stBytes;
@@ -468,9 +484,6 @@ static INT cskyCacheInvalidatePage (LW_CACHE_TYPE cachetype, PVOID pvAdrs, PVOI
cskyDCacheInvalidate((PVOID)ulStart, (PVOID)ulEnd, CSKY_DCACHE_LINE_SIZE);
}
-#if LW_CFG_CSKY_CACHE_L2 > 0
- cskyL2Invalidate(pvPdrs, stBytes); /* 虚拟与物理地址必须相同 */
-#endif /* LW_CFG_CSKY_CACHE_L2 > 0 */
} else {
_DebugHandle(__ERRORMESSAGE_LEVEL, "stBytes == 0.\r\n");
}
@@ -487,7 +500,7 @@ static INT cskyCacheInvalidatePage (LW_CACHE_TYPE cachetype, PVOID pvAdrs, PVOI
** 输 出 : ERROR or OK
** 全局变量:
** 调用模块:
-** 注 意 : 由于 L2 为物理地址 tag 所以这里暂时使用 L2 全部回写并无效指令.
+** 注 意 : 由于 L2 CACHE 的操作指令会同时操作 L1 CACHE, 所以调用 L2 CACHE 的函数后返回
*********************************************************************************************************/
static INT cskyCacheClear (LW_CACHE_TYPE cachetype, PVOID pvAdrs, size_t stBytes)
{
@@ -503,6 +516,9 @@ static INT cskyCacheClear (LW_CACHE_TYPE cachetype, PVOID pvAdrs, size_t stB
}
} else {
+#if LW_CFG_CSKY_CACHE_L2 > 0
+ return (cskyL2Clear(pvAdrs, stBytes));
+#endif /* LW_CFG_CSKY_CACHE_L2 > 0 */
if (stBytes >= CSKY_L1_CACHE_LOOP_OP_MAX_SIZE) {
cskyDCacheClearAll(); /* 全部回写并无效 */
@@ -511,12 +527,8 @@ static INT cskyCacheClear (LW_CACHE_TYPE cachetype, PVOID pvAdrs, size_t stB
cskyDCacheClear(pvAdrs, (PVOID)ulEnd,
CSKY_DCACHE_LINE_SIZE); /* 部分回写并无效 */
}
-
-#if LW_CFG_CSKY_CACHE_L2 > 0
- cskyL2ClearAll();
-#endif /* LW_CFG_CSKY_CACHE_L2 > 0 */
}
-
+
return (ERROR_NONE);
}
/*********************************************************************************************************
@@ -544,6 +556,9 @@ static INT cskyCacheClearPage (LW_CACHE_TYPE cachetype, PVOID pvAdrs, PVOID pvP
}
} else {
+#if LW_CFG_CSKY_CACHE_L2 > 0
+ return (cskyL2Clear(pvAdrs, stBytes));
+#endif /* LW_CFG_CSKY_CACHE_L2 > 0 */
if (stBytes >= CSKY_L1_CACHE_LOOP_OP_MAX_SIZE) {
cskyDCacheClearAll(); /* 全部回写并无效 */
@@ -552,10 +567,6 @@ static INT cskyCacheClearPage (LW_CACHE_TYPE cachetype, PVOID pvAdrs, PVOID pvP
cskyDCacheClear(pvAdrs, (PVOID)ulEnd,
CSKY_DCACHE_LINE_SIZE); /* 部分回写并无效 */
}
-
-#if LW_CFG_CSKY_CACHE_L2 > 0
- cskyL2Clear(pvPdrs, stBytes);
-#endif /* LW_CFG_CSKY_CACHE_L2 > 0 */
}
return (ERROR_NONE);
@@ -659,6 +670,32 @@ static INT cskyCacheDataUpdate (PVOID pvAdrs, size_t stBytes, BOOL bInv)
return (ERROR_NONE);
}
/*********************************************************************************************************
+** 函数名称: cskyCacheCfgSet
+** 功能描述: 初始化 CACHE 寄存器 CR18 设置
+** 输 入 : NONE
+** 输 出 : 寄存器 CR18 设置
+** 全局变量:
+** 调用模块:
+** 注 意 : 不同 CK860 的芯片配置可能不同,故提供一个配置寄存器的接口
+*********************************************************************************************************/
+LW_WEAK UINT32 cskyCacheCfgSet (VOID)
+{
+ UINT32 uiCacheConfig;
+
+ uiCacheConfig = M_CACHE_CFG_IPE |
+ M_CACHE_CFG_WBR |
+ M_CACHE_CFG_WA |
+ M_CACHE_CFG_BTB |
+ M_CACHE_CFG_Z |
+ M_CACHE_CFG_RS |
+ M_CACHE_CFG_DE |
+ M_CACHE_CFG_IE |
+ B_CACHE_CFG_MP_VALID |
+ (1 << S_CACHE_CFG_SCK);
+
+ return (uiCacheConfig);
+}
+/*********************************************************************************************************
** 函数名称: cskyCacheInit
** 功能描述: 初始化 CACHE
** 输 入 : pcacheop CACHE 操作函数集
@@ -674,9 +711,14 @@ VOID cskyCacheInit (LW_CACHE_OP *pcacheop,
CACHE_MODE uiData,
CPCHAR pcMachineName)
{
+#if LW_CFG_CSKY_CACHE_L2 > 0
+ uiCacheCfg = cskyCacheCfgSet();
+ cskyL2Init(uiInstruction, uiData, pcMachineName);
+#else
if (uiData & CACHE_COPYBACK) {
uiCacheCfg |= M_CACHE_CFG_WB;
}
+#endif /* LW_CFG_ARM_CACHE_L2 > 0 */
#if LW_CFG_SMP_EN > 0
pcacheop->CACHEOP_ulOption = CACHE_TEXT_UPDATE_MP;
@@ -686,10 +728,13 @@ VOID cskyCacheInit (LW_CACHE_OP *pcacheop,
#else
pcacheop->CACHEOP_ulOption = 0ul;
#endif /* LW_CFG_SMP_EN */
-
- pcacheop->CACHEOP_iILoc = CACHE_LOCATION_PIPT;
- pcacheop->CACHEOP_iDLoc = CACHE_LOCATION_PIPT;
-
+ if (lib_strcmp(pcMachineName, CSKY_MACHINE_860) == 0) { /* CK860 处理器 L2 CACHE */
+ pcacheop->CACHEOP_iILoc = CACHE_LOCATION_VIPT;
+ pcacheop->CACHEOP_iDLoc = CACHE_LOCATION_PIPT;
+ } else {
+ 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;
diff --git a/SylixOS/arch/csky/mm/cache/cskyCacheAsm.S b/SylixOS/arch/csky/mm/cache/cskyCacheAsm.S
index ec7be93..9837212 100644
--- a/SylixOS/arch/csky/mm/cache/cskyCacheAsm.S
+++ b/SylixOS/arch/csky/mm/cache/cskyCacheAsm.S
@@ -97,7 +97,7 @@ FUNC_DEF(cskyICacheDisableHw)
MTCR A0 , CR17
MFCR A0 , CR18
- BCLRI A0 , 2
+ BCLRI A0 , S_CACHE_CFG_IE
MTCR A0 , CR18
RTS
FUNC_END(cskyICacheDisableHw)
@@ -111,7 +111,7 @@ FUNC_DEF(cskyDCacheDisableHw)
MTCR A0 , CR17
MFCR A0 , CR18
- BCLRI A0 , 3
+ BCLRI A0 , S_CACHE_CFG_DE
MTCR A0 , CR18
RTS
FUNC_END(cskyDCacheDisableHw)
@@ -125,7 +125,7 @@ FUNC_DEF(cskyICacheEnableHw)
MTCR A0 , CR17
MFCR A0 , CR18
- BSETI A0 , 2
+ BSETI A0 , S_CACHE_CFG_IE
MTCR A0 , CR18
RTS
FUNC_END(cskyICacheEnableHw)
@@ -139,12 +139,15 @@ FUNC_DEF(cskyDCacheEnableHw)
MTCR A1 , CR17
MFCR A1 , CR18
- BSETI A1 , 3 ;/* DE 数据高速缓存设置位 */
-
+ BSETI A1 , S_CACHE_CFG_DE ;/* DE 数据高速缓存设置位 */
BCLRI A1 , S_CACHE_CFG_WB ;/* WB 高速缓存写回设置位 */
BCLRI A1 , S_CACHE_CFG_WA ;/* WA 高速缓存写分配有效设置 */
OR A1 , A0
+#ifdef __CK860__
+ BCLRI A1 , S_CACHE_CFG_WB ;/* CK860 2.4 手册上此位为 0 */
+#endif
+
MTCR A1 , CR18
RTS
FUNC_END(cskyDCacheEnableHw)
@@ -155,8 +158,8 @@ FUNC_DEF(cskyDCacheEnableHw)
FUNC_DEF(cskyBranchPredictorInvalidate)
MFCR A0 , CR17
- BSETI A0 , 16
- BSETI A0 , 17
+ BSETI A0 , S_CFR_BHT_INV
+ BSETI A0 , S_CFR_BTB_INV
MTCR A0 , CR17
RTS
FUNC_END(cskyBranchPredictorInvalidate)
@@ -166,13 +169,13 @@ FUNC_DEF(cskyBranchPredictorInvalidate)
;*********************************************************************************************************/
FUNC_DEF(cskyBranchPredictionEnable)
- MOVIH A0 , 0x3 ;/* 无效分支预测缓冲 */
+ MOVIH A0 , B_CFR_CACHE_A ;/* 无效分支预测缓冲 */
MTCR A0 , CR17
MFCR A0 , CR18
- BSETI A0 , 11 ;/* BTB 分支目标缓冲器使能 */
- BSETI A0 , 6 ;/* Z 允许预测跳转设置位 */
- BSETI A0 , 5 ;/* RS 地址返回栈设置位 */
+ BSETI A0 , S_CACHE_CFG_BTB ;/* BTB 分支目标缓冲器使能 */
+ BSETI A0 , S_CACHE_CFG_Z ;/* Z 允许预测跳转设置位 */
+ BSETI A0 , S_CACHE_CFG_RS ;/* RS 地址返回栈设置位 */
MTCR A0 , CR18
RTS
FUNC_END(cskyBranchPredictionEnable)
@@ -182,15 +185,15 @@ FUNC_DEF(cskyBranchPredictionEnable)
;*********************************************************************************************************/
FUNC_DEF(cskyBranchPredictionDisable)
- MOVIH A0 , 0x3 ;/* 无效分支预测缓冲 */
+ MOVIH A0 , B_CFR_CACHE_A ;/* 无效分支预测缓冲 */
MTCR A0 , CR17
MFCR A0 , CR18
- BCLRI A0 , 11
+ BCLRI A0 , S_CACHE_CFG_BTB
#ifndef __CK807__
- BCLRI A0 , 6
+ BCLRI A0 , S_CACHE_CFG_Z
#endif
- BCLRI A0 , 5
+ BCLRI A0 , S_CACHE_CFG_RS
MTCR A0 , CR18
RTS
FUNC_END(cskyBranchPredictionDisable)
diff --git a/SylixOS/arch/csky/mm/cache/l2/cskyL2.c b/SylixOS/arch/csky/mm/cache/l2/cskyL2.c
new file mode 100644
index 0000000..feb394d
--- /dev/null
+++ b/SylixOS/arch/csky/mm/cache/l2/cskyL2.c
@@ -0,0 +1,288 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM)
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: cskyL2.c
+**
+** 创 建 人: Zhou.Zhijie (周志杰)
+**
+** 文件创建日期: 2020 年 08 月 21 日
+**
+** 描 述: C-SKY 体系构架 L2 CACHE 驱动
+*********************************************************************************************************/
+#define __SYLIXOS_IO
+#define __SYLIXOS_KERNEL
+#include "SylixOS.h"
+/*********************************************************************************************************
+ 裁减配置
+*********************************************************************************************************/
+#if LW_CFG_CACHE_EN > 0 && LW_CFG_CSKY_CACHE_L2 > 0
+#include "cskyL2.h"
+/*********************************************************************************************************
+ L2 CACHE 锁 (多核共享一个 L2 CACHE, 所以操作时需要加自旋锁, 由于外层已经关中断, 这里只需锁自旋锁即可)
+*********************************************************************************************************/
+static LW_SPINLOCK_CA_DEFINE_CACHE_ALIGN(l2slca);
+#define L2_OP_ENTER() LW_SPIN_LOCK_IGNIRQ(&l2slca.SLCA_sl)
+#define L2_OP_EXIT() LW_SPIN_UNLOCK_IGNIRQ(&l2slca.SLCA_sl)
+/*********************************************************************************************************
+ L2 CACHE 驱动
+*********************************************************************************************************/
+static L2C_DRVIER l2cdrv;
+/*********************************************************************************************************
+ L2 CACHE 控制器初始化函数
+*********************************************************************************************************/
+extern VOID cskyL2CK860Init(L2C_DRVIER *pl2cdrv,
+ CACHE_MODE uiInstruction,
+ CACHE_MODE uiData,
+ CPCHAR pcMachineName);
+/*********************************************************************************************************
+** 函数名称: cskyL2Enable
+** 功能描述: 使能 L2 CACHE
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID cskyL2Enable (VOID)
+{
+ if (l2cdrv.L2CD_pfuncEnable) {
+ L2_OP_ENTER();
+ l2cdrv.L2CD_pfuncEnable(&l2cdrv);
+ L2_OP_EXIT();
+ }
+}
+/*********************************************************************************************************
+** 函数名称: cskyL2Disable
+** 功能描述: 禁能 L2 CACHE
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID cskyL2Disable (VOID)
+{
+#if LW_CFG_SMP_EN > 0
+ if (l2cdrv.L2CD_pfuncDisable) {
+ l2cdrv.L2CD_pfuncDisable(&l2cdrv);
+ }
+
+#else
+ if (l2cdrv.L2CD_pfuncDisable) {
+ L2_OP_ENTER();
+ l2cdrv.L2CD_pfuncDisable(&l2cdrv);
+ L2_OP_EXIT();
+ }
+#endif
+}
+/*********************************************************************************************************
+** 函数名称: cskyL2IsEnable
+** 功能描述: L2 CACHE 是否打开
+** 输 入 : NONE
+** 输 出 : L2 CACHE 是否打开
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+BOOL cskyL2IsEnable (VOID)
+{
+ BOOL bIsEnable;
+
+ if (l2cdrv.L2CD_pfuncIsEnable) {
+ L2_OP_ENTER();
+ bIsEnable = l2cdrv.L2CD_pfuncIsEnable(&l2cdrv);
+ L2_OP_EXIT();
+
+ } else {
+ bIsEnable = LW_FALSE;
+ }
+
+ return (bIsEnable);
+}
+/*********************************************************************************************************
+** 函数名称: cskyL2Sync
+** 功能描述: L2 CACHE 同步
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID cskyL2Sync (VOID)
+{
+ if (l2cdrv.L2CD_pfuncSync) {
+ L2_OP_ENTER();
+ l2cdrv.L2CD_pfuncSync(&l2cdrv);
+ L2_OP_EXIT();
+ }
+}
+/*********************************************************************************************************
+** 函数名称: cskyL2FlushAll
+** 功能描述: L2 CACHE 回写所有脏数据
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID cskyL2FlushAll (VOID)
+{
+ if (l2cdrv.L2CD_pfuncFlushAll) {
+ L2_OP_ENTER();
+ l2cdrv.L2CD_pfuncFlushAll(&l2cdrv);
+ L2_OP_EXIT();
+ }
+}
+/*********************************************************************************************************
+** 函数名称: cskyL2Flush
+** 功能描述: L2 CACHE 回写部分脏数据
+** 输 入 : pvPdrs 起始虚拟地址
+** stBytes 数据块大小
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+INT cskyL2Flush (PVOID pvPdrs, size_t stBytes)
+{
+ INT iRet = ERROR_NONE;
+
+ if (l2cdrv.L2CD_pfuncFlush) {
+ L2_OP_ENTER();
+ iRet = l2cdrv.L2CD_pfuncFlush(&l2cdrv, pvPdrs, stBytes);
+ L2_OP_EXIT();
+ }
+
+ return (iRet);
+}
+/*********************************************************************************************************
+** 函数名称: cskyL2InvalidateAll
+** 功能描述: L2 CACHE 无效
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID cskyL2InvalidateAll (VOID)
+{
+ if (l2cdrv.L2CD_pfuncInvalidateAll) {
+ L2_OP_ENTER();
+ l2cdrv.L2CD_pfuncInvalidateAll(&l2cdrv);
+ L2_OP_EXIT();
+ }
+}
+/*********************************************************************************************************
+** 函数名称: cskyL2Invalidate
+** 功能描述: L2 CACHE 无效
+** 输 入 : pvPdrs 起始虚拟地址
+** stBytes 数据块大小
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+INT cskyL2Invalidate (PVOID pvPdrs, size_t stBytes)
+{
+ INT iRet = ERROR_NONE;
+
+ if (l2cdrv.L2CD_pfuncInvalidate) {
+ L2_OP_ENTER();
+ iRet = l2cdrv.L2CD_pfuncInvalidate(&l2cdrv, pvPdrs, stBytes);
+ L2_OP_EXIT();
+ }
+
+ return (iRet);
+}
+/*********************************************************************************************************
+** 函数名称: cskyL2ClearAll
+** 功能描述: L2 CACHE 回写并无效
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID cskyL2ClearAll (VOID)
+{
+ if (l2cdrv.L2CD_pfuncClearAll) {
+ L2_OP_ENTER();
+ l2cdrv.L2CD_pfuncClearAll(&l2cdrv);
+ L2_OP_EXIT();
+ }
+}
+/*********************************************************************************************************
+** 函数名称: cskyL2Clear
+** 功能描述: L2 CACHE 回写并无效
+** 输 入 : pvPdrs 起始虚拟地址
+** stBytes 数据块大小
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+INT cskyL2Clear (PVOID pvPdrs, size_t stBytes)
+{
+ INT iRet = ERROR_NONE;
+
+ if (l2cdrv.L2CD_pfuncClear) {
+ L2_OP_ENTER();
+ iRet = l2cdrv.L2CD_pfuncClear(&l2cdrv, pvPdrs, stBytes);
+ L2_OP_EXIT();
+ }
+
+ return (iRet);
+}
+/*********************************************************************************************************
+** 函数名称: cskyL2Name
+** 功能描述: 获得 L2 CACHE 控制器名称
+** 输 入 : NONE
+** 输 出 : L2 CACHE 控制器名称
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+CPCHAR cskyL2Name (VOID)
+{
+ return (l2cdrv.L2CD_pcName);
+}
+/*********************************************************************************************************
+** 函数名称: cskyL2Init
+** 功能描述: 初始化 L2 CACHE 控制器
+** 输 入 : uiInstruction 指令 CACHE 类型
+** uiData 数据 CACHE 类型
+** pcMachineName 机器名称
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID cskyL2Init (CACHE_MODE uiInstruction,
+ CACHE_MODE uiData,
+ CPCHAR pcMachineName)
+{
+ UINT32 uiWays;
+ UINT32 uiWaySize;
+
+ LW_SPIN_INIT(&l2slca.SLCA_sl);
+
+ if (lib_strcmp(pcMachineName, CSKY_MACHINE_860) == 0) { /* CK860 处理器 L2 CACHE */
+ uiWays = 8;
+ uiWaySize = 32;
+
+ l2cdrv.L2CD_pcName = CSKY_MACHINE_860;
+ l2cdrv.L2CD_stSize = uiWays * uiWaySize * LW_CFG_KB_SIZE; /* 256KB 的 8 路组相联 L2 CACHE */
+
+ _DebugFormat(__LOGMESSAGE_LEVEL, "%s %s L2 cache controller initialization.\r\n",
+ LW_CFG_CPU_ARCH_FAMILY, l2cdrv.L2CD_pcName);
+
+ cskyL2CK860Init(&l2cdrv, uiInstruction, uiData, pcMachineName);
+ } else {
+ _DebugHandle(__ERRORMESSAGE_LEVEL, "unknown machine name.\r\n");
+ }
+
+
+}
+
+#endif /* LW_CFG_CACHE_EN > 0 */
+ /* LW_CFG_CSKY_CACHE_L2 > 0 */
+/*********************************************************************************************************
+ END
+*********************************************************************************************************/
diff --git a/SylixOS/arch/csky/mm/cache/l2/cskyL2.h b/SylixOS/arch/csky/mm/cache/l2/cskyL2.h
new file mode 100644
index 0000000..5647882
--- /dev/null
+++ b/SylixOS/arch/csky/mm/cache/l2/cskyL2.h
@@ -0,0 +1,74 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM)
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: cskyL2.h
+**
+** 创 建 人: Zhou.Zhijie (周志杰)
+**
+** 文件创建日期: 2020 年 08 月 21 日
+**
+** 描 述: C-SKY 体系构架 L2 CACHE 驱动.
+*********************************************************************************************************/
+
+#ifndef __CSKYL2_H
+#define __CSKYL2_H
+
+/*********************************************************************************************************
+ 裁减配置
+*********************************************************************************************************/
+#if LW_CFG_CACHE_EN > 0 && LW_CFG_CSKY_CACHE_L2 > 0
+
+/*********************************************************************************************************
+ L2 cache driver struct
+*********************************************************************************************************/
+
+typedef struct {
+ CPCHAR L2CD_pcName; /* L2 CACHE 控制器名称 */
+ size_t L2CD_stSize; /* L2 CACHE 大小 */
+
+ VOIDFUNCPTR L2CD_pfuncEnable;
+ VOIDFUNCPTR L2CD_pfuncDisable;
+ BOOLFUNCPTR L2CD_pfuncIsEnable;
+ VOIDFUNCPTR L2CD_pfuncSync;
+ FUNCPTR L2CD_pfuncFlush;
+ VOIDFUNCPTR L2CD_pfuncFlushAll;
+ FUNCPTR L2CD_pfuncInvalidate;
+ VOIDFUNCPTR L2CD_pfuncInvalidateAll;
+ FUNCPTR L2CD_pfuncClear;
+ VOIDFUNCPTR L2CD_pfuncClearAll;
+} L2C_DRVIER;
+
+/*********************************************************************************************************
+ 初始化
+*********************************************************************************************************/
+
+VOID cskyL2Init(CACHE_MODE uiInstruction,
+ CACHE_MODE uiData,
+ CPCHAR pcMachineName);
+CPCHAR cskyL2Name(VOID);
+VOID cskyL2Enable(VOID);
+VOID cskyL2Disable(VOID);
+BOOL cskyL2IsEnable(VOID);
+VOID cskyL2Sync(VOID);
+VOID cskyL2FlushAll(VOID);
+INT cskyL2Flush(PVOID pvPdrs, size_t stBytes);
+VOID cskyL2InvalidateAll(VOID);
+INT cskyL2Invalidate(PVOID pvPdrs, size_t stBytes);
+VOID cskyL2ClearAll(VOID);
+INT cskyL2Clear(PVOID pvPdrs, size_t stBytes);
+
+#endif /* LW_CFG_CACHE_EN > 0 */
+ /* LW_CFG_CSKY_CACHE_L2 > 0 */
+#endif /* __CSKYL2_H */
+/*********************************************************************************************************
+ END
+*********************************************************************************************************/
diff --git a/SylixOS/arch/csky/mm/cache/l2/cskyL2CK860.c b/SylixOS/arch/csky/mm/cache/l2/cskyL2CK860.c
new file mode 100644
index 0000000..8f78fb6
--- /dev/null
+++ b/SylixOS/arch/csky/mm/cache/l2/cskyL2CK860.c
@@ -0,0 +1,345 @@
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM)
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: cskyL2CK860.c
+**
+** 创 建 人: Zhou.Zhijie (周志杰)
+**
+** 文件创建日期: 2020 年 08 月 21 日
+**
+** 描 述: C-SKY CK860 体系构架 L2 CACHE 控制器驱动.
+*********************************************************************************************************/
+#define __SYLIXOS_IO
+#define __SYLIXOS_KERNEL
+#include "SylixOS.h"
+/*********************************************************************************************************
+ 裁减配置
+*********************************************************************************************************/
+#if LW_CFG_CACHE_EN > 0 && LW_CFG_CSKY_CACHE_L2 > 0
+#include "cskyL2.h"
+#include "../cskyCache.h"
+#include "arch/csky/inc/cskyregs.h"
+/*********************************************************************************************************
+ 相关参数
+*********************************************************************************************************/
+#define L2C_CACHE_LINE_SIZE 64
+#define L1_CACHE_SHIFT 6
+#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
+/*********************************************************************************************************
+ 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)
+/*********************************************************************************************************
+ CACHE 获得 pvAdrs 与 pvEnd 位置
+*********************************************************************************************************/
+#define CSKY_SYNC_IS() __asm__ __volatile__ ("sync.is\nsync.is\nsync.is\n" : : : "memory")
+/*********************************************************************************************************
+ 外部函数声明
+*********************************************************************************************************/
+extern VOID cskyDCacheClearAll(VOID);
+extern VOID cskyDCacheFlushAll(VOID);
+/*********************************************************************************************************
+** 函数名称: cskyL2CacheCfgSet
+** 功能描述: 初始化 L2CACHE 寄存器 CR23 设置
+** 输 入 : uiL2Ctl CR23 默认值
+** 输 出 : 寄存器 CR23 设置
+** 全局变量:
+** 调用模块:
+** 注 意 : 不同 CK860 的芯片配置可能不同,故提供一个配置寄存器的接口
+*********************************************************************************************************/
+LW_WEAK UINT32 cskyL2CacheCfgSet (UINT32 uiL2Ctl)
+{
+ uiL2Ctl &= ~(M_L2CACHE_CFG_IPRF | M_L2CACHE_CFG_DLTNCY);
+ uiL2Ctl |= M_L2CACHE_CFG_L2EN | /* L2 CACHE 使能位 */
+ M_L2CACHE_CFG_TPRF | /* L2 CACHE TLB 预取使能位 */
+ M_L2CACHE_CFG_RFE | /* 数据访问读分配使能位 */
+ (3 << S_L2CACHE_CFG_IPRF) | /* L2 CACHE 指令预取 3 条缓存行*/
+ (1 << S_L2CACHE_CFG_DLTNCY); /* DATA RAM 访问周期 2 */
+
+ return (uiL2Ctl);
+}
+/*********************************************************************************************************
+** 函数名称: cskyL2CK860Enable
+** 功能描述: 使能 L2 CACHE 控制器
+** 输 入 : pl2cdrv 驱动结构
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static VOID cskyL2CK860Enable (L2C_DRVIER *pl2cdrv)
+{
+ UINT32 uiL2Ctl;
+
+ __asm__ __volatile__ ("L2cache.iall\n" : : : "memory"); /* 无效 L2 CACHE */
+ __asm__ __volatile__ ("sync.is\n" : : : "memory");
+
+ uiL2Ctl = cskyCCR2Read();
+
+ if (!(uiL2Ctl & M_L2CACHE_CFG_L2EN)) {
+ uiL2Ctl = cskyL2CacheCfgSet(uiL2Ctl);
+ cskyCCR2Write(uiL2Ctl);
+ }
+}
+/*********************************************************************************************************
+** 函数名称: cskyL2CK860Disable
+** 功能描述: 禁能 L2 CACHE 控制器
+** 输 入 : pl2cdrv 驱动结构
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static VOID cskyL2CK860Disable (L2C_DRVIER *pl2cdrv)
+{
+ UINT32 uiL2Ctl = cskyCCR2Read();
+
+ if (uiL2Ctl & M_L2CACHE_CFG_L2EN) {
+ uiL2Ctl &= ~M_L2CACHE_CFG_L2EN;
+ cskyCCR2Write(uiL2Ctl);
+ }
+}
+/*********************************************************************************************************
+** 函数名称: cskyL2CK860IsEnable
+** 功能描述: 检查 L2 CACHE 控制器是否使能
+** 输 入 : pl2cdrv 驱动结构
+** 输 出 : 是否使能
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static BOOL cskyL2CK860IsEnable (L2C_DRVIER *pl2cdrv)
+{
+ UINT32 uiL2Ctl = cskyCCR2Read();
+
+ return ((uiL2Ctl & M_L2CACHE_CFG_L2EN) ? LW_TRUE : LW_FALSE);
+}
+/*********************************************************************************************************
+** 函数名称: cskyL2CK860Sync
+** 功能描述: L2 CACHE 同步
+** 输 入 : pl2cdrv 驱动结构
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static VOID cskyL2CK860Sync (L2C_DRVIER *pl2cdrv)
+{
+ CSKY_SYNC_IS();
+}
+/*********************************************************************************************************
+** 函数名称: cskyL2CK860FlushAll
+** 功能描述: L2 CACHE 回写所有脏数据
+** 输 入 : pl2cdrv 驱动结构
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static VOID cskyL2CK860FlushAll (L2C_DRVIER *pl2cdrv)
+{
+ __asm__ __volatile__ ("L2cache.call\n" : : : "memory");
+ CSKY_SYNC_IS();
+}
+/*********************************************************************************************************
+** 函数名称: __cskyL2CK860Flush
+** 功能描述: L2 CACHE 回写脏数据
+** 输 入 : ulStart 起始地址
+** ulEnd 结束地址
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static VOID __cskyL2CK860Flush (addr_t ulStart, addr_t ulEnd)
+{
+ addr_t ulAddr = ulStart & ~(L1_CACHE_BYTES - 1);
+
+ for (; ulAddr < ulEnd; ulAddr += L1_CACHE_BYTES) {
+ __asm__ __volatile__ ("dcache.cva %0\n"::"r"(ulAddr):"memory");
+ }
+ CSKY_SYNC_IS();
+}
+/*********************************************************************************************************
+** 函数名称: cskyL2CK860Flush
+** 功能描述: L2 CACHE 回写部分脏数据
+** 输 入 : pl2cdrv 驱动结构
+** pvPdrs 起始地址
+** stBytes 数据块大小
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static INT cskyL2CK860Flush (L2C_DRVIER *pl2cdrv, PVOID pvPdrs, size_t stBytes)
+{
+ addr_t ulPhyEnd;
+
+ if (stBytes >= pl2cdrv->L2CD_stSize) {
+ cskyDCacheFlushAll(); /* L1 CACHE */
+ cskyL2CK860FlushAll(pl2cdrv); /* L2 CACHE */
+ } else {
+ CSKY_CACHE_GET_END(pvPdrs, stBytes, ulPhyEnd, L2C_CACHE_LINE_SIZE);
+ __cskyL2CK860Flush((addr_t)pvPdrs, ulPhyEnd);
+ }
+
+ return (ERROR_NONE);
+}
+/*********************************************************************************************************
+** 函数名称: cskyL2CK860InvalidateAll
+** 功能描述: L2 CACHE 无效
+** 输 入 : pl2cdrv 驱动结构
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static VOID cskyL2CK860InvalidateAll (L2C_DRVIER *pl2cdrv)
+{
+ __asm__ __volatile__ ("L2cache.iall\n" : : : "memory");
+ CSKY_SYNC_IS();
+}
+/*********************************************************************************************************
+** 函数名称: __cskyL2CK860Invalidate
+** 功能描述: L2 CACHE 无效
+** 输 入 : ulStart 起始地址
+** ulEnd 结束地址
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static VOID __cskyL2CK860Invalidate (addr_t ulStart, addr_t ulEnd)
+{
+ addr_t ulAddr = ulStart & ~(L1_CACHE_BYTES - 1);
+
+ for (; ulAddr < ulEnd; ulAddr += L1_CACHE_BYTES) {
+ __asm__ __volatile__ ("dcache.iva %0\n"::"r"(ulAddr):"memory");
+ }
+ CSKY_SYNC_IS();
+}
+/*********************************************************************************************************
+** 函数名称: cskyL2CK860Invalidate
+** 功能描述: L2 CACHE 无效部分脏数据
+** 输 入 : pl2cdrv 驱动结构
+** pvPdrs 起始地址
+** stBytes 数据块大小
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static INT cskyL2CK860Invalidate (L2C_DRVIER *pl2cdrv, PVOID pvPdrs, size_t stBytes)
+{
+ addr_t ulPhyStart = (addr_t)pvPdrs;
+ addr_t ulPhyEnd = ulPhyStart + stBytes;
+
+ if (ulPhyStart & (L2C_CACHE_LINE_SIZE - 1)) {
+ ulPhyStart &= ~(L2C_CACHE_LINE_SIZE - 1);
+ __asm__ __volatile__ ("dcache.civa %0\n"::"r"(ulPhyStart):"memory");
+ ulPhyStart += L2C_CACHE_LINE_SIZE;
+ }
+
+ if (ulPhyEnd & (L2C_CACHE_LINE_SIZE - 1)) {
+ ulPhyEnd &= ~(L2C_CACHE_LINE_SIZE - 1);
+ __asm__ __volatile__ ("dcache.civa %0\n"::"r"(ulPhyEnd):"memory");
+ }
+
+ while (ulPhyStart < ulPhyEnd) {
+ __cskyL2CK860Invalidate(ulPhyStart, ulPhyEnd);
+ }
+
+ return (ERROR_NONE);
+}
+/*********************************************************************************************************
+** 函数名称: cskyL2CK860ClearAll
+** 功能描述: L2 CACHE 回写并无效
+** 输 入 : pl2cdrv 驱动结构
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static VOID cskyL2CK860ClearAll (L2C_DRVIER *pl2cdrv)
+{
+ __asm__ __volatile__ ("L2cache.ciall\n" : : : "memory");
+ CSKY_SYNC_IS();
+}
+/*********************************************************************************************************
+** 函数名称: __cskyL2CK860Clear
+** 功能描述: L2 CACHE 回写并无效
+** 输 入 : ulStart 起始地址
+** ulEnd 结束地址
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static VOID __cskyL2CK860Clear (addr_t ulStart, addr_t ulEnd)
+{
+ addr_t ulAddr = ulStart & ~(L1_CACHE_BYTES - 1);
+
+ for (; ulAddr < ulEnd; ulAddr += L1_CACHE_BYTES) {
+ __asm__ __volatile__ ("dcache.civa %0\n"::"r"(ulAddr):"memory");
+ }
+ CSKY_SYNC_IS();
+}
+/*********************************************************************************************************
+** 函数名称: cskyL2CK860Clear
+** 功能描述: L2 CACHE 回写并无效
+** 输 入 : pl2cdrv 驱动结构
+** pvPdrs 起始地址
+** stBytes 数据块大小
+** 输 出 : ERROR_CODE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static INT cskyL2CK860Clear (L2C_DRVIER *pl2cdrv, PVOID pvPdrs, size_t stBytes)
+{
+ addr_t ulPhyEnd;
+
+ if (stBytes >= pl2cdrv->L2CD_stSize) {
+ cskyDCacheClearAll();
+ cskyL2CK860ClearAll(pl2cdrv);
+
+ } else {
+ CSKY_CACHE_GET_END(pvPdrs, stBytes, ulPhyEnd, L2C_CACHE_LINE_SIZE);
+ __cskyL2CK860Clear((addr_t)pvPdrs, ulPhyEnd);
+ }
+
+ return (ERROR_NONE);
+}
+/*********************************************************************************************************
+** 函数名称: cskyL2CK860Init
+** 功能描述: 初始化 L2 CACHE 控制器
+** 输 入 : pl2cdrv 驱动结构
+** uiInstruction 指令 CACHE 类型
+** uiData 数据 CACHE 类型
+** pcMachineName 机器名称
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID cskyL2CK860Init (L2C_DRVIER *pl2cdrv,
+ CACHE_MODE uiInstruction,
+ CACHE_MODE uiData,
+ CPCHAR pcMachineName)
+{
+ pl2cdrv->L2CD_pfuncEnable = cskyL2CK860Enable;
+ pl2cdrv->L2CD_pfuncDisable = cskyL2CK860Disable;
+ pl2cdrv->L2CD_pfuncIsEnable = cskyL2CK860IsEnable;
+ pl2cdrv->L2CD_pfuncSync = cskyL2CK860Sync;
+ pl2cdrv->L2CD_pfuncFlush = cskyL2CK860Flush;
+ pl2cdrv->L2CD_pfuncFlushAll = cskyL2CK860FlushAll;
+ pl2cdrv->L2CD_pfuncInvalidate = cskyL2CK860Invalidate;
+ pl2cdrv->L2CD_pfuncInvalidateAll = cskyL2CK860InvalidateAll;
+ pl2cdrv->L2CD_pfuncClear = cskyL2CK860Clear;
+ pl2cdrv->L2CD_pfuncClearAll = cskyL2CK860ClearAll;
+}
+
+#endif /* LW_CFG_CACHE_EN > 0 */
+ /* LW_CFG_ARM_CACHE_L2 > 0 */
+/*********************************************************************************************************
+ END
+*********************************************************************************************************/
diff --git a/SylixOS/arch/csky/mm/mmu/cskyMmu.c b/SylixOS/arch/csky/mm/mmu/cskyMmu.c
index 07f56f3..690fbf6 100644
--- a/SylixOS/arch/csky/mm/mmu/cskyMmu.c
+++ b/SylixOS/arch/csky/mm/mmu/cskyMmu.c
@@ -65,7 +65,11 @@
全局变量
*********************************************************************************************************/
static BOOL _G_bMmuEnByBoot = LW_TRUE; /* BOOT 是否已经启动了 MMU */
+#if defined(__SYLIXOS_CSKY_ARCH_CK860__)
+static ULONG _G_ulMmuTlbSize = 512; /* TLB 数组大小 */
+#else
static ULONG _G_ulMmuTlbSize = 128; /* TLB 数组大小 */
+#endif
static LW_OBJECT_HANDLE _G_hPGDPartition = LW_HANDLE_INVALID; /* 系统目前仅使用一个 PGD */
static LW_OBJECT_HANDLE _G_hPTEPartition = LW_HANDLE_INVALID; /* PTE 缓冲区 */
/*********************************************************************************************************
diff --git a/SylixOS/arch/csky/mm/mmu/cskyMmuAsm.S b/SylixOS/arch/csky/mm/mmu/cskyMmuAsm.S
index a96c298..8db9942 100644
--- a/SylixOS/arch/csky/mm/mmu/cskyMmuAsm.S
+++ b/SylixOS/arch/csky/mm/mmu/cskyMmuAsm.S
@@ -56,6 +56,9 @@ FUNC_DEF(cskyMmuContextSet)
#if LW_CFG_CSKY_HARD_TLB_REFILL > 0
ORI A0 , A0 , 1
#endif
+#if defined(__SYLIXOS_CSKY_ARCH_CK860__)
+ MTCR A0 , CR<28, 15>
+#endif
MTCR A0 , CR<29, 15>
RTS
FUNC_END(cskyMmuContextSet)
@@ -247,7 +250,11 @@ FUNC_DEF(cskyMmuTlbLdStExceptHandle)
BGENI A2 , 29
BTSTI A3 , 31
BF 1f
+#if defined(__SYLIXOS_CSKY_ARCH_CK860__)
+ BGENI A2 , 27
+#else
BGENI A2 , 25
+#endif
MTCR A2 , CR<8, 15>
BGENI A2 , 28
diff --git a/SylixOS/arch/csky/mpcore/cskyMpCoreAsm.S b/SylixOS/arch/csky/mpcore/cskyMpCoreAsm.S
index 1d448a9..e81248b 100644
--- a/SylixOS/arch/csky/mpcore/cskyMpCoreAsm.S
+++ b/SylixOS/arch/csky/mpcore/cskyMpCoreAsm.S
@@ -42,7 +42,12 @@
;*********************************************************************************************************/
FUNC_DEF(archMpCur)
+#if defined(__SYLIXOS_CSKY_ARCH_CK860__)
+ MFCR A0 , CR<30, 0>
+ ANDI A0 , A0 , 0xff
+#else
MOVI A0 , 0
+#endif
RTS
FUNC_END(archMpCur)
diff --git a/SylixOS/arch/csky/mpcore/cskySpinlock.c b/SylixOS/arch/csky/mpcore/cskySpinlock.c
index 285da5a..6090e7d 100644
--- a/SylixOS/arch/csky/mpcore/cskySpinlock.c
+++ b/SylixOS/arch/csky/mpcore/cskySpinlock.c
@@ -86,7 +86,7 @@ static LW_INLINE UINT32 cskySpinTryLock (SPINLOCKTYPE *psld)
UINT32 uiInc = 1 << LW_SPINLOCK_TICKET_SHIFT;
do {
- asm volatile (
+ __asm__ __volatile__ (
" ldex.w %0 , (%3) \n"
" movi %2 , 1 \n"
" rotli %1 , %0 , 16 \n"
@@ -101,7 +101,7 @@ static LW_INLINE UINT32 cskySpinTryLock (SPINLOCKTYPE *psld)
: "cc");
} while (!uiRes);
- if (!uiCont) {
+ if (uiCont) {
return (1);
}
#endif /* LW_CFG_CSKY_HAS_LDSTEX_INSTR*/
@@ -124,9 +124,79 @@ static LW_INLINE VOID cskySpinUnlock (SPINLOCKTYPE *psld)
#endif /* LW_CFG_CSKY_HAS_LDSTEX_INSTR*/
}
/*********************************************************************************************************
+** 函数名称: cskySpinLockDummy
+** 功能描述: 空操作
+** 输 入 : psl spinlock 指针
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static VOID cskySpinLockDummy (SPINLOCKTYPE *psl, VOIDFUNCPTR pfuncPoll, PVOID pvArg)
+{
+}
+/*********************************************************************************************************
+** 函数名称: cskySpinTryLockDummy
+** 功能描述: 空操作
+** 输 入 : psl spinlock 指针
+** 输 出 : 0
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static UINT32 cskySpinTryLockDummy (SPINLOCKTYPE *psl)
+{
+ return (0);
+}
+/*********************************************************************************************************
+** 函数名称: cskySpinUnlockDummy
+** 功能描述: 空操作
+** 输 入 : psl spinlock 指针
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static VOID cskySpinUnlockDummy (SPINLOCKTYPE *psl)
+{
+}
+/*********************************************************************************************************
+ spin lock cache 依赖处理
+*********************************************************************************************************/
+static VOID (*pfuncCskySpinLock)(SPINLOCKTYPE *, VOIDFUNCPTR, PVOID) = cskySpinLock;
+static UINT32 (*pfuncCskySpinTryLock)(SPINLOCKTYPE *) = cskySpinTryLock;
+static VOID (*pfuncCskySpinUnlock)(SPINLOCKTYPE *) = cskySpinUnlock;
+/*********************************************************************************************************
+** 函数名称: archSpinBypass
+** 功能描述: spinlock 函数不起效
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+VOID archSpinBypass (VOID)
+{
+ pfuncCskySpinLock = cskySpinLockDummy;
+ pfuncCskySpinTryLock = cskySpinTryLockDummy;
+ pfuncCskySpinUnlock = cskySpinUnlockDummy;
+}
+/*********************************************************************************************************
+** 函数名称: archSpinWork
+** 功能描述: spinlock 函数起效
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+** 注 意 : 主核开启 CACHE 后, BSP 应立即调用此函数, 使 spinlock 生效,
+ 从核启动到开启 CACHE 过程中, 不得操作 spinlock.
+*********************************************************************************************************/
+VOID archSpinWork (VOID)
+{
+ pfuncCskySpinLock = cskySpinLock;
+ pfuncCskySpinTryLock = cskySpinTryLock;
+ pfuncCskySpinUnlock = cskySpinUnlock;
+}
+/*********************************************************************************************************
** 函数名称: archSpinInit
** 功能描述: 初始化一个 spinlock
-** 输 入 : psl spinlock 指针
+** 输 入 : psl spinlock 指针
** 输 出 : NONE
** 全局变量:
** 调用模块:
@@ -185,7 +255,7 @@ INT archSpinLock (spinlock_t *psl, PLW_CLASS_CPU pcpuCur, VOIDFUNCPTR pfuncP
return (1); /* 重复调用 */
}
- cskySpinLock(&psl->SL_sltData, pfuncPoll, pvArg);
+ pfuncCskySpinLock(&psl->SL_sltData, pfuncPoll, pvArg);
psl->SL_pcpuOwner = pcpuCur; /* 保存当前 CPU */
@@ -209,7 +279,7 @@ INT archSpinTryLock (spinlock_t *psl, PLW_CLASS_CPU pcpuCur)
return (1); /* 重复调用 */
}
- if (cskySpinTryLock(&psl->SL_sltData)) { /* 尝试加锁 */
+ if (pfuncCskySpinTryLock(&psl->SL_sltData)) { /* 尝试加锁 */
return (0);
}
@@ -241,7 +311,7 @@ INT archSpinUnlock (spinlock_t *psl, PLW_CLASS_CPU pcpuCur)
psl->SL_pcpuOwner = LW_NULL; /* 没有 CPU 获取 */
KN_SMP_WMB();
- cskySpinUnlock(&psl->SL_sltData); /* 解锁 */
+ pfuncCskySpinUnlock(&psl->SL_sltData); /* 解锁 */
return (1);
}
@@ -256,7 +326,7 @@ INT archSpinUnlock (spinlock_t *psl, PLW_CLASS_CPU pcpuCur)
*********************************************************************************************************/
INT archSpinLockRaw (spinlock_t *psl)
{
- cskySpinLock(&psl->SL_sltData, LW_NULL, LW_NULL);
+ pfuncCskySpinLock(&psl->SL_sltData, LW_NULL, LW_NULL);
return (1); /* 加锁成功 */
}
@@ -271,7 +341,7 @@ INT archSpinLockRaw (spinlock_t *psl)
*********************************************************************************************************/
INT archSpinTryLockRaw (spinlock_t *psl)
{
- if (cskySpinTryLock(&psl->SL_sltData)) { /* 尝试加锁 */
+ if (pfuncCskySpinTryLock(&psl->SL_sltData)) { /* 尝试加锁 */
return (0);
}
@@ -288,7 +358,7 @@ INT archSpinTryLockRaw (spinlock_t *psl)
*********************************************************************************************************/
INT archSpinUnlockRaw (spinlock_t *psl)
{
- cskySpinUnlock(&psl->SL_sltData); /* 解锁 */
+ pfuncCskySpinUnlock(&psl->SL_sltData); /* 解锁 */
return (1);
}
diff --git a/SylixOS/arch/csky/param/cskyParam.c b/SylixOS/arch/csky/param/cskyParam.c
index fab88db..77734e7 100644
--- a/SylixOS/arch/csky/param/cskyParam.c
+++ b/SylixOS/arch/csky/param/cskyParam.c
@@ -24,7 +24,7 @@
/*********************************************************************************************************
启动参数
*********************************************************************************************************/
-static CSKY_PARAM cskyParam = { LW_TRUE, LW_TRUE };
+static CSKY_PARAM cskyParam = { LW_TRUE, LW_TRUE , LW_TRUE };
/*********************************************************************************************************
** 函数名称: archKernelParam
** 功能描述: C-SKY 体系架构启动参数设置.
@@ -43,12 +43,21 @@ VOID archKernelParam (CPCHAR pcParam)
cskyParam.CP_bUnalign = LW_TRUE;
}
- } else if (lib_strncmp(pcParam, "mmuenbyboot=", 12) == 0) {
+ } else if (lib_strncmp(pcParam, "mmuenbyboot=", 12) == 0) { /* BOOT 是否已经启动了 MMU */
if (pcParam[12] == 'n') {
cskyParam.CP_bMmuEnByBoot = LW_FALSE;
} else {
cskyParam.CP_bMmuEnByBoot = LW_TRUE;
}
+#if LW_CFG_SMP_EN > 0
+ } else if (lib_strncmp(pcParam, "sldepcache=", 11) == 0) { /* 自旋锁是否依赖 CACHE */
+ if (pcParam[11] == 'n') {
+ cskyParam.CP_bSLDepCache = LW_FALSE;
+ } else {
+ cskyParam.CP_bSLDepCache = LW_TRUE;
+ __ARCH_SPIN_BYPASS();
+ }
+#endif /* LW_CFG_SMP_EN > 0 */
}
}
/*********************************************************************************************************
diff --git a/SylixOS/arch/csky/param/cskyParam.h b/SylixOS/arch/csky/param/cskyParam.h
index 109536d..ad81cbc 100644
--- a/SylixOS/arch/csky/param/cskyParam.h
+++ b/SylixOS/arch/csky/param/cskyParam.h
@@ -29,6 +29,7 @@
typedef struct {
BOOL CP_bUnalign; /* 是否支持非对齐访问 */
BOOL CP_bMmuEnByBoot; /* BOOT 是否已经启动了 MMU */
+ BOOL CP_bSLDepCache; /* 自旋锁是否依赖 CACHE */
} CSKY_PARAM;
/*********************************************************************************************************
diff --git a/SylixOS/arch/x86/common/x64/x64ContextAsm.S b/SylixOS/arch/x86/common/x64/x64ContextAsm.S
index 5f5a19b..8b8aafc 100644
--- a/SylixOS/arch/x86/common/x64/x64ContextAsm.S
+++ b/SylixOS/arch/x86/common/x64/x64ContextAsm.S
@@ -27,6 +27,7 @@
#include <config/kernel/kernel_cfg.h>
#include <config/mp/mp_cfg.h>
#include "x64ContextAsm.h"
+#include "arch/x86/pentium/x86Pentium.h"
FILE_BEGIN()
@@ -60,6 +61,13 @@ FUNC_DEF(archResumePc)
;*********************************************************************************************************/
FUNC_DEF(archTaskCtxStart)
+#if LW_CFG_X64_FAST_TCB_CUR > 0
+ MOVL 0(%RDI) , %EAX ;/* Low-order 32 bits */
+ MOVL 4(%RDI) , %EDX ;/* High-order 32 bits */
+ MOV $X86_MSR_IA32_FS_BASE , %RCX ;/* Specify FS_BASE to write */
+ WRMSR ;/* Write %EDX:%EAX to the MSR */
+#endif
+
MOV 0(%RDI) , %RAX ;/* RAX = 当前TCB的 REG_CTX 地址*/
RESTORE_REGS ;/* 恢复所有寄存器 */
@@ -84,9 +92,15 @@ FUNC_DEF(archTaskCtxSwitch)
MOV %RDI , %R12 ;/* 参数 = 当前 CPU 控制块指针 */
CALL _SchedSwp ;/* _SchedSwp(); */
- MOV %R12 , %RDI
- MOV 0(%RDI) , %RAX ;/* RAX = 当前TCB的 REG_CTX 地址*/
+#if LW_CFG_X64_FAST_TCB_CUR > 0
+ MOVL 0(%R12) , %EAX ;/* Low-order 32 bits */
+ MOVL 4(%R12) , %EDX ;/* High-order 32 bits */
+ MOV $X86_MSR_IA32_FS_BASE , %RCX ;/* Specify FS_BASE to write */
+ WRMSR ;/* Write %EDX:%EAX to the MSR */
+#endif
+
+ MOV 0(%R12) , %RAX ;/* RAX = 当前TCB的 REG_CTX 地址*/
RESTORE_REGS ;/* 恢复所有寄存器 */
FUNC_END(archTaskCtxSwitch)
@@ -118,6 +132,13 @@ FUNC_DEF(archCrtCtxSwitch)
;*********************************************************************************************************/
FUNC_DEF(archIntCtxLoad)
+#if LW_CFG_X64_FAST_TCB_CUR > 0
+ MOVL 0(%RDI) , %EAX ;/* Low-order 32 bits */
+ MOVL 4(%RDI) , %EDX ;/* High-order 32 bits */
+ MOV $X86_MSR_IA32_FS_BASE , %RCX ;/* Specify FS_BASE to write */
+ WRMSR ;/* Write %EDX:%EAX to the MSR */
+#endif
+
MOV 0(%RDI) , %RAX ;/* RAX = 当前TCB的 REG_CTX 地址*/
RESTORE_REGS ;/* 恢复所有寄存器 */
diff --git a/SylixOS/arch/x86/pentium/x86Pentium.h b/SylixOS/arch/x86/pentium/x86Pentium.h
index 69e056e..3651568 100644
--- a/SylixOS/arch/x86/pentium/x86Pentium.h
+++ b/SylixOS/arch/x86/pentium/x86Pentium.h
@@ -31,6 +31,7 @@
#define X86_MSR_IA32_STAR 0xc0000081
#define X86_MSR_IA32_LSTAR 0xc0000082
#define X86_MSR_IA32_FMASK 0xc0000084
+#define X86_MSR_IA32_FS_BASE 0xc0000100
#define X86_MSR_IA32_GS_BASE 0xc0000101
#define X86_MSR_IA32_KERNEL_GS_BASE 0xc0000102
diff --git a/SylixOS/config/cpu/cpu_cfg_csky.h b/SylixOS/config/cpu/cpu_cfg_csky.h
index 1cd8566..b8f9f31 100644
--- a/SylixOS/config/cpu/cpu_cfg_csky.h
+++ b/SylixOS/config/cpu/cpu_cfg_csky.h
@@ -88,16 +88,29 @@
/*********************************************************************************************************
C-SKY CACHE 配置
*********************************************************************************************************/
-
+#if defined(__CK860__)
+#define LW_CFG_CSKY_CACHE_L2 1 /* 是否允许管理 C-SKY 二级CACHE*/
+#else
#define LW_CFG_CSKY_CACHE_L2 0 /* 是否允许管理 C-SKY 二级CACHE*/
+#endif
+
#define LW_CFG_CSKY_CACHE_L3 0 /* 是否允许管理 C-SKY 三级CACHE*/
+
+#if defined(__CK860__)
+#define LW_CFG_CSKY_CACHE_V2 1 /* 是否为 CACHEv2 */
+#else
#define LW_CFG_CSKY_CACHE_V2 0 /* 是否为 CACHEv2 */
+#endif
/*********************************************************************************************************
C-SKY 指令配置
*********************************************************************************************************/
-#define LW_CFG_CSKY_HAS_LDSTEX_INSTR 0 /* 是否支持 LDSTEX 指令 */
+#if defined(__CK860__)
+#define LW_CFG_CSKY_HAS_LDSTEX_INSTR 1 /* 是否支持 LDSTEX 指令 */
+#else
+#define LW_CFG_CSKY_HAS_LDSTEX_INSTR 0
+#endif /* __CK860__ */
/*********************************************************************************************************
浮点运算单元
diff --git a/SylixOS/config/cpu/cpu_cfg_x86.h b/SylixOS/config/cpu/cpu_cfg_x86.h
index f54f698..8e33b83 100644
--- a/SylixOS/config/cpu/cpu_cfg_x86.h
+++ b/SylixOS/config/cpu/cpu_cfg_x86.h
@@ -55,6 +55,11 @@
#define LW_CFG_CPU_X86_NO_HLT 0 /* 不支持 HLT 指令 */
#define LW_CFG_CPU_X86_APIC_BUS_INT 0 /* 使用 APIC BUS 而不是前端总线*/
/* 投递中断(老式奔腾 1, 2, 3) */
+/*********************************************************************************************************
+ 快速获取线程上下文 (使用 %FS Platform 特性, 仅特殊应用会使用默认关闭)
+*********************************************************************************************************/
+
+#define LW_CFG_X64_FAST_TCB_CUR 0 /* 快速获取任务上下文 */
/*********************************************************************************************************
CPU 字长与整型大小端定义
diff --git a/SylixOS/include/arch/csky/arch_def.h b/SylixOS/include/arch/csky/arch_def.h
index 47405ee..87ebc81 100644
--- a/SylixOS/include/arch/csky/arch_def.h
+++ b/SylixOS/include/arch/csky/arch_def.h
@@ -75,6 +75,46 @@ typedef UINT16 CSKY_INSTRUCTION;
#define M_PSR_C (1 << S_PSR_C)
#define S_PSR_C 0
+#if defined(__SYLIXOS_CSKY_ARCH_CK860__)
+
+/*********************************************************************************************************
+ CFR Cache Function Register (CR17)
+ 31 18 17 16
+ +----------------------------------------+---------+----------+
+ | Reserved | BTB_INV | BHT_INV |
+ +----------------------------------------+---------+----------+
+ 15 6 5 4 3 2 1 0
+ +-------------------------------+-----+-----+-----+-----------+
+ | Reserved | CLR | INV | 0 | CACHE_SEL |
+ +-------------------------------+-----+-----+-----+-----------+
+*********************************************************************************************************/
+
+#define M_CFR_BTB_INV (1 << S_CFR_BTB_INV)
+#define S_CFR_BTB_INV 17
+#define M_CFR_BHT_INV (1 << S_CFR_BHT_INV)
+#define S_CFR_BHT_INV 16
+#define M_CFR_CLR (1 << S_CFR_CLR)
+#define S_CFR_CLR 5
+#define M_CFR_INV (1 << S_CFR_INV)
+#define S_CFR_INV 4
+#define M_CFR_CACHE_SEL (3 << S_CFR_CACHE_SEL)
+#define B_CFR_CACHE_I (1 << S_CFR_CACHE_SEL)
+#define B_CFR_CACHE_D (2 << S_CFR_CACHE_SEL)
+#define B_CFR_CACHE_A (3 << S_CFR_CACHE_SEL)
+#define S_CFR_CACHE_SEL 0
+
+/*********************************************************************************************************
+ 以下的 bit 位在 CK860 手册上没有,但是 linux 代码中也用到了
+*********************************************************************************************************/
+
+#define M_CFR_LICF (1 << S_CFR_LICF)
+#define S_CFR_LICF 31
+#define M_CFR_ITS (1 << S_CFR_ITS)
+#define S_CFR_ITS 7
+#define M_CFR_OMS (1 << S_CFR_OMS)
+#define S_CFR_OMS 6
+#else
+
/*********************************************************************************************************
CFR Cache Function Register (CR17)
31 30 18 17 16
@@ -109,6 +149,8 @@ typedef UINT16 CSKY_INSTRUCTION;
#define B_CFR_CACHE_A (3 << S_CFR_CACHE_SEL)
#define S_CFR_CACHE_SEL 0
+#endif /* __SYLIXOS_CSKY_ARCH_CK860__ */
+
/*********************************************************************************************************
MSA0 MMU SSEG0 Config Register (cr30)
@@ -116,6 +158,13 @@ typedef UINT16 CSKY_INSTRUCTION;
+------+----------------------+---+---+---+---+---+---+---+
| BA | Reserved | B | SO|SEC| C | D | V | 0 |
+------+----------------------+---+---+---+---+---+---+---+
+
+ CK860: MSA0 MMU SSEG0 Config Register (cr<30,15>)
+
+ 31 29 28 9 8 7 6 5 4 3 2 1 0
+ +------+----------------------+---+---+---+---+---+---+---+
+ | BA | Reserved | 0 | 0 | B | SO|SEC| C | D | V | 0 |
+ +------+----------------------+---+---+---+---+---+---+---+
*********************************************************************************************************/
#define M_MSA0_BA (0x7 << S_MSA0_BA) /* BA-SSEG0 映射的物理地址 */
@@ -140,6 +189,13 @@ typedef UINT16 CSKY_INSTRUCTION;
+------+----------------------+---+---+---+---+---+---+---+
| BA | Reserved | B | SO|SEC| C | D | V | 0 |
+------+----------------------+---+---+---+---+---+---+---+
+
+ CK860: MSA1 MMU SSEG1 Config Register (cr<31,15>)
+
+ 31 29 28 9 8 7 6 5 4 3 2 1 0
+ +------+----------------------+---+---+---+---+---+---+---+
+ | BA | Reserved | 0 | 0 | B | SO|SEC| C | D | V | 0 |
+ +------+----------------------+---+---+---+---+---+---+---+
*********************************************************************************************************/
#define M_MSA1_BA (0x7 << S_MSA1_BA) /* BA-SSEG1 映射的物理地址 */
@@ -160,11 +216,81 @@ typedef UINT16 CSKY_INSTRUCTION;
/*********************************************************************************************************
C-SKY CACHE 属性
*********************************************************************************************************/
+/*********************************************************************************************************
+ CCR Cache Configuration Register (CR18)
+ 31 18 17 16
+ +----------------------------------------+---------+----------+
+ | Reserved | UCME | IPE |
+ +----------------------------------------+---------+----------+
+ 15 14 13 12 11 10 8 7 6 5 4 3 2 1 0
+ +---+-----+------+----+---+-----+--+---+----+----+----+--+----+
+ | 0 | WBR | E_V2 | WA |BTB| SCK |BE| Z | RS | WB | DE |IE| MP |
+ +---+-----+------+----+---+-----+--+---+----+----+----+--+----+
+*********************************************************************************************************/
+
+#define M_CACHE_CFG_UCME (0x1 << S_CACHE_CFG_UCME) /* 普通用户执行 CACHE 使能位 */
+#define S_CACHE_CFG_UCME 17
+#define M_CACHE_CFG_IPE (0x1 << S_CACHE_CFG_IPE) /* 间接分支跳转预测使能位 */
+#define S_CACHE_CFG_IPE 16
+#define M_CACHE_CFG_WBR (0x1 << S_CACHE_CFG_WBR) /* 写突发传输使能位 */
+ /* CK860 默认为 1, 不可设置 */
+#define S_CACHE_CFG_WBR 14
+#define M_CACHE_CFG_E_V2 (0x1 << S_CACHE_CFG_E_V2) /* 大小端版本选择位 */
+#define S_CACHE_CFG_E_V2 13
+#define M_CACHE_CFG_WA (0x1 << S_CACHE_CFG_WA) /* 高速缓存写分配有效设置 */
+#define S_CACHE_CFG_WA 12
+#define M_CACHE_CFG_BTB (0x1 << S_CACHE_CFG_BTB) /* 分支目标预测使能位 */
+#define S_CACHE_CFG_BTB 11
+#define M_CACHE_CFG_SCK (0x7 << S_CACHE_CFG_SCK) /* 系统和处理器时钟比 = SCK + 1*/
+#define S_CACHE_CFG_SCK 8
+#define M_CACHE_CFG_BE (0x1 << S_CACHE_CFG_BE) /* 大端模式 */
+#define S_CACHE_CFG_BE 7
+#define M_CACHE_CFG_Z (0x1 << S_CACHE_CFG_Z) /* 允许预测跳转设置位 */
+#define S_CACHE_CFG_Z 6
+#define M_CACHE_CFG_RS (0x1 << S_CACHE_CFG_RS) /* 地址返回栈设置位 */
+#define S_CACHE_CFG_RS 5
+#define M_CACHE_CFG_WB (0x1 << S_CACHE_CFG_WB) /* 高速缓存写回设置位 */
+ /* CK860 2.4 手册上此位为 0 */
+#define S_CACHE_CFG_WB 4
+#define M_CACHE_CFG_DE (0x1 << S_CACHE_CFG_DE) /* 数据高速缓存设置位 */
+#define S_CACHE_CFG_DE 3
+#define M_CACHE_CFG_IE (0x1 << S_CACHE_CFG_IE) /* 指令高速缓存设置位 */
+#define S_CACHE_CFG_IE 2
+#define M_CACHE_CFG_MP (0x3 << S_CACHE_CFG_MP) /* 内存保护设置位 */
+#define B_CACHE_CFG_MP_INVALID (0x0 << S_CACHE_CFG_MP) /* MMU 无效 */
+#define B_CACHE_CFG_MP_VALID (0x1 << S_CACHE_CFG_MP) /* MMU 有效 */
+#define S_CACHE_CFG_MP 0
+
+/*********************************************************************************************************
+ CCR2 Cache Configuration Register2 (CR23)
+ 31 30 29 28 26 25 24 22 21 20 19 18 16
+ +------+------+-----+--------+--------+-----+--------+--------+
+ | TPRF | IPRF | 0 | TSETUP | TPTNCY | 0 | DSETUP | DLTNCY |
+ +------+------+-----+--------+--------+-----+--------+--------+
+ 15 4 3 2 1 0
+ +------------------------------------+------+---+-------+-----+
+ | RESERVED | L2EN | 0 | ECCEN | RFE |
+ +------------------------------------+------+---+-------+-----+
+*********************************************************************************************************/
-#define M_CACHE_CFG_WB (0x1 << S_CACHE_CFG_WB)
-#define S_CACHE_CFG_WB 4
-#define M_CACHE_CFG_WA (0x1 << S_CACHE_CFG_WA)
-#define S_CACHE_CFG_WA 12
+#define M_L2CACHE_CFG_TPRF (0x1 << S_L2CACHE_CFG_TPRF) /* L2 CACHE TLB 预取使能位 */
+#define S_L2CACHE_CFG_TPRF 31
+#define M_L2CACHE_CFG_IPRF (0x3 << S_L2CACHE_CFG_IPRF) /* L2 CACHE 指令预取设置位 */
+#define S_L2CACHE_CFG_IPRF 29
+#define M_L2CACHE_CFG_TSETUP (0x1 << S_L2CACHE_CFG_TSETUP) /* TAG RAM setup 配置位 */
+#define S_L2CACHE_CFG_TSETUP 25
+#define M_L2CACHE_CFG_TPTNCY (0x7 << S_L2CACHE_CFG_TPTNCY) /* TAG RAM 访问周期配置位 */
+#define S_L2CACHE_CFG_TPTNCY 22
+#define M_L2CACHE_CFG_DSETUP (0x1 << S_L2CACHE_CFG_DSETUP) /* DATA RAM setup 配置位 */
+#define S_L2CACHE_CFG_DSETUP 19
+#define M_L2CACHE_CFG_DLTNCY (0x7 << S_L2CACHE_CFG_DLTNCY) /* DATA RAM 访问周期配置位 */
+#define S_L2CACHE_CFG_DLTNCY 16
+#define M_L2CACHE_CFG_L2EN (0x1 << S_L2CACHE_CFG_L2EN) /* L2 CACHE 使能位 */
+#define S_L2CACHE_CFG_L2EN 3
+#define M_L2CACHE_CFG_ECCEN (0x1 << S_L2CACHE_CFG_ECCEN) /* L2 CACHE ECC 使能位 */
+#define S_L2CACHE_CFG_ECCEN 1
+#define M_L2CACHE_CFG_RFE (0x1 << S_L2CACHE_CFG_RFE) /* 数据访问读分配使能位 */
+#define S_L2CACHE_CFG_RFE 0
#endif /* __SYLIXOS_KERNEL */
/* __ASSEMBLY__ */
diff --git a/SylixOS/include/arch/csky/arch_float.h b/SylixOS/include/arch/csky/arch_float.h
index dfe37f8..ac7dc45 100644
--- a/SylixOS/include/arch/csky/arch_float.h
+++ b/SylixOS/include/arch/csky/arch_float.h
@@ -29,7 +29,11 @@
*********************************************************************************************************/
#if defined(__SYLIXOS_KERNEL) || defined(__ASSEMBLY__) || defined(ASSEMBLY)
+#if defined(__SYLIXOS_CSKY_ARCH_CK860__)
+#define FPU_REG_NR 32 /* FPU 通用寄存器数量 */
+#else
#define FPU_REG_NR 16 /* FPU 通用寄存器数量 */
+#endif /* __SYLIXOS_CSKY_ARCH_CK860__ */
#if defined(__SYLIXOS_CSKY_ARCH_CK803__)
#define FPU_REG_WIDTH 32 /* 浮点数据寄存器的位宽 */
#else
diff --git a/SylixOS/include/arch/csky/arch_regs.h b/SylixOS/include/arch/csky/arch_regs.h
index 6d6f49b..bee235b 100644
--- a/SylixOS/include/arch/csky/arch_regs.h
+++ b/SylixOS/include/arch/csky/arch_regs.h
@@ -41,7 +41,11 @@
#define ARCH_GREG_NR 32 /* 通用寄存器数目 */
+#if defined(__SYLIXOS_CSKY_ARCH_CK860__)
+#define ARCH_REG_CTX_WORD_SIZE 36 /* 寄存器上下文字数 */
+#else
#define ARCH_REG_CTX_WORD_SIZE 38 /* 寄存器上下文字数 */
+#endif
#define ARCH_STK_MIN_WORD_SIZE 256 /* 堆栈最小字数 */
#define ARCH_REG_SIZE 4 /* 寄存器大小 */
@@ -58,10 +62,13 @@
#define XGREG(n) ((n) * ARCH_REG_SIZE)
#define XPC ((ARCH_GREG_NR + 0) * ARCH_REG_SIZE)
#define XPSR ((ARCH_GREG_NR + 1) * ARCH_REG_SIZE)
+#if defined(__SYLIXOS_CSKY_ARCH_CK860__)
+#define XMEH ((ARCH_GREG_NR + 2) * ARCH_REG_SIZE)
+#else
#define XLO ((ARCH_GREG_NR + 2) * ARCH_REG_SIZE)
#define XHI ((ARCH_GREG_NR + 3) * ARCH_REG_SIZE)
#define XMEH ((ARCH_GREG_NR + 4) * ARCH_REG_SIZE)
-
+#endif
/*********************************************************************************************************
寄存器表
*********************************************************************************************************/
@@ -74,8 +81,10 @@ typedef struct {
ARCH_REG_T REG_ulReg[ARCH_GREG_NR]; /* 32 个通用目的寄存器 */
ARCH_REG_T REG_ulPc; /* 程序计数器寄存器 */
ARCH_REG_T REG_ulPsr; /* 处理器状态寄存器 */
+#if !defined(__SYLIXOS_CSKY_ARCH_CK860__)
ARCH_REG_T REG_ulLo;
ARCH_REG_T REG_ulHi;
+#endif
ARCH_REG_T REG_ulMeh;
ARCH_REG_T REG_ulPad;
diff --git a/SylixOS/include/arch/csky/asm/archprob.h b/SylixOS/include/arch/csky/asm/archprob.h
index a48c868..2a42d20 100644
--- a/SylixOS/include/arch/csky/asm/archprob.h
+++ b/SylixOS/include/arch/csky/asm/archprob.h
@@ -30,6 +30,10 @@
#define __SYLIXOS_CSKY_ARCH_CK803__
#endif
+#if defined(__CK860__)
+#define __SYLIXOS_CSKY_ARCH_CK860__
+#endif
+
#endif /* __ARCHPROB_H */
/*********************************************************************************************************
END
diff --git a/SylixOS/include/arch/csky/inc/cskyregs.h b/SylixOS/include/arch/csky/inc/cskyregs.h
index 286ae9d..ffd8370 100644
--- a/SylixOS/include/arch/csky/inc/cskyregs.h
+++ b/SylixOS/include/arch/csky/inc/cskyregs.h
@@ -48,21 +48,21 @@ do { \
__asm__ __volatile__( \
"mtcr %0, cr<4, 15>" \
:: "r"(value)); \
-}while (0)
+} while (0)
#define cskyEntryLo0Write(value) \
do { \
__asm__ __volatile__( \
"mtcr %0, cr<2, 15>" \
:: "r"(value)); \
-}while (0)
+} while (0)
#define cskyEntryLo1Write(value) \
do { \
__asm__ __volatile__( \
"mtcr %0, cr<3, 15>" \
:: "r"(value)); \
-}while (0)
+} while (0)
#define cskyIndexRead() \
({ UINT32 uiRes; \
@@ -77,7 +77,7 @@ do { \
__asm__ __volatile__( \
"mtcr %0, cr<0, 15>" \
:: "r"(value)); \
-}while (0)
+} while (0)
#define cskyEntryHiRead() \
({ UINT32 uiRes; \
@@ -87,6 +87,14 @@ do { \
uiRes; \
})
+#define cskyPageMaskRead() \
+({ UINT32 uiRes; \
+ __asm__ __volatile__( \
+ "mfcr %0, cr<6, 15>" \
+ : "=r"(uiRes)); \
+ uiRes; \
+})
+
#define cskyPgdRead() \
({ UINT32 uiRes; \
__asm__ __volatile__( \
@@ -111,6 +119,44 @@ do { \
uiRes; \
})
+#define cskyMSA0Read() \
+({ UINT32 uiRes; \
+ __asm__ __volatile__( \
+ "mfcr %0, cr<30, 15>" \
+ : "=r"(uiRes)); \
+ uiRes; \
+})
+
+#define cskyMSA1Read() \
+({ UINT32 uiRes; \
+ __asm__ __volatile__( \
+ "mfcr %0, cr<31, 15>" \
+ : "=r"(uiRes)); \
+ uiRes; \
+})
+
+#define cskyCCR2Read() \
+({ UINT32 uiRes; \
+ __asm__ __volatile__( \
+ "mfcr %0, cr<23, 0>" \
+ : "=r"(uiRes)); \
+ uiRes; \
+})
+
+#define cskyCCR2Write(value) \
+do { \
+ __asm__ __volatile__( \
+ "mtcr %0, cr<23, 0>" \
+ :: "r"(value)); \
+} while (0)
+
+#define cskyCR24Write(value) \
+do { \
+ __asm__ __volatile__( \
+ "mtcr %0, cr24\n\t" \
+ :: "r"(value)); \
+} while (0)
+
#define SET_CIR(value) \
__asm__ __volatile__( \
"mtcr %0 , cr22\n\t" ::"r"(value))
@@ -134,52 +180,51 @@ do { \
:"=r"(tmp) \
:"r"(addr), "0"(tmp))
+#define CSKY_TLBP 0x80000000
+#define CSKY_TLBR 0x40000000
+#define CSKY_TLBWI 0x20000000
+#define CSKY_TLBWR 0x10000000
+#if defined(__SYLIXOS_CSKY_ARCH_CK860__)
+#define CSKY_TLBINV 0x08000000
+#else
+#define CSKY_TLBINV 0x02000000
+#endif
+#define CSKY_TLBINV_ALL 0x04000000
+
static inline void cskyTlbProbe(void)
{
- int value = 0x80000000;
-
__asm__ __volatile__("mtcr %0,cr<8, 15>\n\t"
- : :"r" (value));
+ : :"r" (CSKY_TLBP));
}
static inline void cskyTlbRead(void)
{
- int value = 0x40000000;
-
__asm__ __volatile__("mtcr %0,cr<8, 15>\n\t"
- : :"r" (value));
+ : :"r" (CSKY_TLBR));
}
static inline void cskyTlbWriteIndexed(void)
{
- int value = 0x20000000;
-
__asm__ __volatile__("mtcr %0,cr<8,15>\n\t"
- : :"r" (value));
+ : :"r" (CSKY_TLBWI));
}
static inline void cskyTlbWriteRandom(void)
{
- int value = 0x10000000;
-
__asm__ __volatile__("mtcr %0,cr<8, 15>\n\t"
- : :"r" (value));
+ : :"r" (CSKY_TLBWR));
}
static inline void cskyTlbInvalidAll(void)
{
- int value = 0x04000000;
-
__asm__ __volatile__("mtcr %0,cr<8, 15>\n\t"
- : :"r" (value));
+ : :"r" (CSKY_TLBINV_ALL));
}
static inline void cskyTlbInvalidIndexed(void)
{
- int value = 0x02000000;
-
__asm__ __volatile__("mtcr %0,cr<8, 15>\n\t"
- : :"r" (value));
+ : :"r" (CSKY_TLBINV));
}
static inline uint32_t cskyMpuGetCCR(void)
diff --git a/SylixOS/include/sys/un.h b/SylixOS/include/sys/un.h
index 7053d93..df792a9 100644
--- a/SylixOS/include/sys/un.h
+++ b/SylixOS/include/sys/un.h
@@ -1,51 +1,61 @@
-/*
- * Copyright (c) 1982, 1986, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)un.h 8.3 (Berkeley) 2/19/95
- * $FreeBSD: src/sys/sys/un.h,v 1.29 2005/04/13 00:01:46 mdodd Exp $
- */
+/*********************************************************************************************************
+**
+** 中国软件开源组织
+**
+** 嵌入式实时操作系统
+**
+** SylixOS(TM) LW : long wing
+**
+** Copyright All Rights Reserved
+**
+**--------------文件信息--------------------------------------------------------------------------------
+**
+** 文 件 名: un.h
+**
+** 创 建 人: Han.Hui (韩辉)
+**
+** 文件创建日期: 2012 年 12 月 18 日
+**
+** 描 述: AF_UNIX 协议域头文件.
+*********************************************************************************************************/
#ifndef __SYS_UN_H
#define __SYS_UN_H
#include <sys/types.h>
+#include <sys/ioctl.h>
-/*
- * Definitions for UNIX IPC domain.
- */
-struct sockaddr_un {
- uint8_t sun_len; /* sockaddr len including null */
- uint8_t sun_family; /* AF_UNIX */
- char sun_path[104]; /* path name (gag) */
+/*********************************************************************************************************
+ Definitions for UNIX IPC domain
+*********************************************************************************************************/
+
+struct sockaddr_un {
+ uint8_t sun_len; /* sockaddr len including null */
+ uint8_t sun_family; /* AF_UNIX */
+ char sun_path[104]; /* path name (gag) */
};
-/* actual length of an initialized sockaddr_un */
+/*********************************************************************************************************
+ Actual length of an initialized sockaddr_un
+*********************************************************************************************************/
+
#define SUN_LEN(su) \
- (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))
+ (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))
+
+/*********************************************************************************************************
+ Special ioctl commands (ONLY for EdgerOS!)
+*********************************************************************************************************/
+
+struct unix_temp_mode {
+ int enable;
+ pid_t peer;
+ long reserve[8];
+};
+
+#define UNIXCGTEMPMODE _IOR('u', 0, struct unix_temp_mode) /* Get DGRAM temporary link mode */
+#define UNIXCSTEMPMODE _IOW('u', 0, struct unix_temp_mode) /* Set DGRAM temporary link mode */
-#endif /* __SYS_UN_H */
+#endif /* __SYS_UN_H */
+/*********************************************************************************************************
+ END
+*********************************************************************************************************/
diff --git a/SylixOS/kernel/include/k_api.h b/SylixOS/kernel/include/k_api.h
index f1ba9f7..7a05b36 100644
--- a/SylixOS/kernel/include/k_api.h
+++ b/SylixOS/kernel/include/k_api.h
@@ -384,7 +384,8 @@ LW_API ULONG API_ThreadGetNotePad(LW_OBJECT_HANDLE ulId,
/* 获得线程记事本 */
LW_API ULONG API_ThreadCurNotePad(UINT8 ucNoteIndex); /* 获得当前任务记事本 */
-#if defined(LW_CFG_CPU_ARCH_ARM64) && (LW_CFG_ARM64_FAST_TCB_CUR > 0)
+#if ((defined(LW_CFG_CPU_ARCH_ARM64) && (LW_CFG_ARM64_FAST_TCB_CUR > 0)) || \
+ (defined(LW_CFG_CPU_ARCH_X86) && (LW_CFG_X64_FAST_TCB_CUR > 0)))
LW_API ULONG API_ThreadFastNotePad(UINT8 ucNoteIndex);
#endif
#endif
diff --git a/SylixOS/kernel/include/k_kernel.h b/SylixOS/kernel/include/k_kernel.h
index 39a79b1..bac6416 100644
--- a/SylixOS/kernel/include/k_kernel.h
+++ b/SylixOS/kernel/include/k_kernel.h
@@ -53,8 +53,8 @@
#define __SYLIXOS_MAJOR_VER 2
#define __SYLIXOS_MINOR_VER 0
-#define __SYLIXOS_PATCH_VER 3
-#define __SYLIXOS_PATCH_PAD 1
+#define __SYLIXOS_PATCH_VER 4
+#define __SYLIXOS_PATCH_PAD 0
/*********************************************************************************************************
版本格式
diff --git a/SylixOS/kernel/interface/ThreadGetNotePad.c b/SylixOS/kernel/interface/ThreadGetNotePad.c
index 3c0c9f3..42184e6 100644
--- a/SylixOS/kernel/interface/ThreadGetNotePad.c
+++ b/SylixOS/kernel/interface/ThreadGetNotePad.c
@@ -123,14 +123,28 @@ ULONG API_ThreadCurNotePad (UINT8 ucNoteIndex)
** 调用模块:
API 函数
*********************************************************************************************************/
-#if defined(LW_CFG_CPU_ARCH_ARM64) && (LW_CFG_ARM64_FAST_TCB_CUR > 0)
+#if ((defined(LW_CFG_CPU_ARCH_ARM64) && (LW_CFG_ARM64_FAST_TCB_CUR > 0)) || \
+ (defined(LW_CFG_CPU_ARCH_X86) && (LW_CFG_X64_FAST_TCB_CUR > 0)))
LW_API
ULONG API_ThreadFastNotePad (UINT8 ucNoteIndex)
{
+#if (defined(LW_CFG_CPU_ARCH_ARM64) && (LW_CFG_ARM64_FAST_TCB_CUR > 0))
REGISTER PLW_CLASS_TCB ptcbCur asm("x18"); /* x18 saved current tcb */
return (ptcbCur->TCB_notepadThreadNotePad.NOTEPAD_ulNotePad[ucNoteIndex]);
+#else
+ REGISTER PLW_CLASS_TCB ptcbCur;
+ REGISTER UINT16 usIndex;
+
+ __asm__ __volatile__("movw %%fs:%P1, %q0"
+ : "=r" (usIndex)
+ : "i" (offsetof(LW_CLASS_TCB, TCB_usIndex)));
+
+ ptcbCur = _K_ptcbTCBIdTable[usIndex];
+
+ return (ptcbCur->TCB_notepadThreadNotePad.NOTEPAD_ulNotePad[ucNoteIndex]);
+#endif
}
#endif /* LW_CFG_ARM64_FAST_TCB_CUR */
diff --git a/SylixOS/kernel/interface/ThreadIdSelf.c b/SylixOS/kernel/interface/ThreadIdSelf.c
index 1dad25e..98c4020 100644
--- a/SylixOS/kernel/interface/ThreadIdSelf.c
+++ b/SylixOS/kernel/interface/ThreadIdSelf.c
@@ -66,16 +66,25 @@ LW_OBJECT_HANDLE API_ThreadIdSelf (VOID)
LW_API
LW_OBJECT_HANDLE API_ThreadIdSelfFast (VOID)
{
-#if LW_CFG_ARM64_FAST_TCB_CUR > 0
+#if (defined(LW_CFG_CPU_ARCH_ARM64) && (LW_CFG_ARM64_FAST_TCB_CUR > 0))
REGISTER PLW_CLASS_TCB ptcbCur asm("x18"); /* x18 saved current tcb */
+ return (ptcbCur->TCB_ulId);
+
+#elif (defined(LW_CFG_CPU_ARCH_X86) && (LW_CFG_X64_FAST_TCB_CUR > 0))
+ REGISTER LW_OBJECT_HANDLE ulId;
+
+ __asm__ __volatile__("movq %%fs:%P1, %q0"
+ : "=r" (ulId)
+ : "i" (offsetof(LW_CLASS_TCB, TCB_ulId)));
+ return (ulId);
#else
REGISTER PLW_CLASS_TCB ptcbCur;
LW_TCB_GET_CUR_SAFE(ptcbCur);
-#endif
return (ptcbCur->TCB_ulId);
+#endif
}
/*********************************************************************************************************
** 函数名称: API_ThreadTcbSelf
@@ -117,16 +126,26 @@ PLW_CLASS_TCB API_ThreadTcbSelf (VOID)
LW_API
PLW_CLASS_TCB API_ThreadTcbSelfFast (VOID)
{
-#if LW_CFG_ARM64_FAST_TCB_CUR > 0
+#if (defined(LW_CFG_CPU_ARCH_ARM64) && (LW_CFG_ARM64_FAST_TCB_CUR > 0))
REGISTER PLW_CLASS_TCB ptcbCur asm("x18"); /* x18 saved current tcb */
+ return (ptcbCur);
+
+#elif (defined(LW_CFG_CPU_ARCH_X86) && (LW_CFG_X64_FAST_TCB_CUR > 0))
+ REGISTER UINT16 usIndex;
+
+ __asm__ __volatile__("movw %%fs:%P1, %q0"
+ : "=r" (usIndex)
+ : "i" (offsetof(LW_CLASS_TCB, TCB_usIndex)));
+
+ return (_K_ptcbTCBIdTable[usIndex]);
#else
REGISTER PLW_CLASS_TCB ptcbCur;
LW_TCB_GET_CUR_SAFE(ptcbCur);
-#endif
return (ptcbCur);
+#endif
}
/*********************************************************************************************************
** 函数名称: API_ThreadIdInter
diff --git a/SylixOS/loader/elf/elf_loader.c b/SylixOS/loader/elf/elf_loader.c
index 632ddf3..b54b79a 100644
--- a/SylixOS/loader/elf/elf_loader.c
+++ b/SylixOS/loader/elf/elf_loader.c
@@ -123,6 +123,12 @@ static INT elfCheck (Elf_Ehdr *pehdr, BOOL bLoad)
return (PX_ERROR);
}
+#if defined(LW_CFG_CPU_ARCH_CSKY)
+ if ((EM_CSKY_OLD == pehdr->e_machine) && (ELF_ARCH == EM_CSKY)) { /* 新老版本编译器值不一样 */
+ return (ERROR_NONE);
+ }
+#endif
+
if (ELF_ARCH != pehdr->e_machine) { /* 检查ELF体系结构是否匹配 */
if (bLoad) {
fprintf(stderr, "[ld]Architecture error: this CPU is \"%s\" but ELF file CPU is \"%s\"!\n",
@@ -1550,22 +1556,24 @@ static INT elfPhdrRead (LW_LD_EXEC_MODULE *pmodule,
/*
* 计算 RELA 重定位表项数和重定位表
*/
- pshdr = (Elf_Shdr *)pcShdrBuf;
+ if (EM_CSKY_OLD == pehdr->e_machine) {
+ pshdr = (Elf_Shdr *)pcShdrBuf;
- for (i = 0; i < pehdr->e_shnum; i++, pshdr++) {
- if ((pshdr->sh_type == SHT_RELA) ||
- (pshdr->sh_type == SHT_REL)) {
+ for (i = 0; i < pehdr->e_shnum; i++, pshdr++) {
+ if ((pshdr->sh_type == SHT_RELA) ||
+ (pshdr->sh_type == SHT_REL)) {
- if (pshdr->sh_size <= 0) {
- continue;
- }
+ if (pshdr->sh_size <= 0) {
+ continue;
+ }
- pdyndir->ulRelaSize = pshdr->sh_size;
- pdyndir->ulRelaCount += pshdr->sh_size / sizeof(Elf_Rela); /* RELA重定位表项数 */
- pdyndir->prelaTable = (Elf_Rela *)LW_LD_V2PADDR(addrMin,
- pmodule->EMOD_pvBaseAddr,
- pshdr->sh_offset);
- break;
+ pdyndir->ulRelaSize = pshdr->sh_size;
+ pdyndir->ulRelaCount += pshdr->sh_size / sizeof(Elf_Rela); /* RELA重定位表项数 */
+ pdyndir->prelaTable = (Elf_Rela *)LW_LD_V2PADDR(addrMin,
+ pmodule->EMOD_pvBaseAddr,
+ pshdr->sh_offset);
+ break;
+ }
}
}
@@ -2184,6 +2192,7 @@ static CPCHAR __elfGetMachineStr (Elf_Half ehMachine)
return ("Cell BE SPU");
case EM_CSKY:
+ case EM_CSKY_OLD:
return ("C-SKY");
case EM_ARM:
diff --git a/SylixOS/loader/elf/elf_type.h b/SylixOS/loader/elf/elf_type.h
index 2e7d5bc..6c2f8ca 100644
--- a/SylixOS/loader/elf/elf_type.h
+++ b/SylixOS/loader/elf/elf_type.h
@@ -211,7 +211,8 @@ typedef SINT64 Elf64_Sxword;
#define EM_PPC64 21 /* PowerPC64 */
#define EM_S390 22 /* IBM S/390 */
#define EM_SPU 23 /* Cell BE SPU */
-#define EM_CSKY 39 /* C-SKY */
+#define EM_CSKY_OLD 39 /* C-SKY */
+#define EM_CSKY 252 /* C-SKY */
#define EM_ARM 40 /* ARM/Thumb family */
#define EM_SH 42 /* SuperH */
#define EM_SPARCV9 43 /* SPARC v9 64-bit */
diff --git a/SylixOS/net/lwip/netdev/netdev_mip.c b/SylixOS/net/lwip/netdev/netdev_mip.c
index bd1b2d6..01bf552 100644
--- a/SylixOS/net/lwip/netdev/netdev_mip.c
+++ b/SylixOS/net/lwip/netdev/netdev_mip.c
@@ -133,6 +133,8 @@ int netdev_mipif_add (netdev_t *netdev, const ip4_addr_t *ip4,
return (-1);
}
+ mipif->ioctl = netif->ioctl;
+
return (0);
}
diff --git a/SylixOS/net/lwip/unix/af_unix.c b/SylixOS/net/lwip/unix/af_unix.c
index 10f01e9..5e76da2 100644
--- a/SylixOS/net/lwip/unix/af_unix.c
+++ b/SylixOS/net/lwip/unix/af_unix.c
@@ -47,6 +47,7 @@
AF_UNIX 支持多线程并行读写.
2017.08.31 shutdown 写后, 远程端有机会读出最后暂存的数据.
2019.01.09 修正 __unixUpdateWriter() 判断错误.
+2020.11.25 增加路径搜索 HASH 表, 提高路径搜索效率.
*********************************************************************************************************/
#define __SYLIXOS_KERNEL
#include "../SylixOS/kernel/include/k_kernel.h"
@@ -57,7 +58,6 @@
#if LW_CFG_NET_EN > 0 && LW_CFG_NET_UNIX_EN > 0
#include "limits.h"
#include "sys/socket.h"
-#include "sys/un.h"
#include "af_unix.h"
#include "lwip/mem.h"
#include "af_unix_msg.h"
@@ -66,6 +66,10 @@
*********************************************************************************************************/
extern void __socketEnotify(void *file, LW_SEL_TYPE type, INT iSoErr);
/*********************************************************************************************************
+ hash 函数声明
+*********************************************************************************************************/
+extern INT __hashHorner(CPCHAR pcKeyword, INT iTableSize);
+/*********************************************************************************************************
宏配置
*********************************************************************************************************/
#define __AF_UNIX_ADDROFFSET offsetof(struct sockaddr_un, sun_path)
@@ -84,10 +88,13 @@ extern void __socketEnotify(void *file, LW_SEL_TYPE type, INT iSoErr);
#define __AF_UNIX_PART_256 LW_CFG_AF_UNIX_256_POOLS /* 256 字节内存池数量 */
#define __AF_UNIX_PART_512 LW_CFG_AF_UNIX_512_POOLS /* 512 字节内存池数量 */
+
+#define __AF_UNIX_PATH_HASH_SIZE 71 /* PATH HASH table size */
/*********************************************************************************************************
全局变量
*********************************************************************************************************/
static LW_LIST_LINE_HEADER _G_plineAfUnix;
+static LW_LIST_LINE_HEADER _G_plineAfUnixPath[__AF_UNIX_PATH_HASH_SIZE];
static LW_OBJECT_HANDLE _G_hAfUnixMutex;
#define __AF_UNIX_LOCK() API_SemaphoreMPend(_G_hAfUnixMutex, LW_OPTION_WAIT_INFINITE)
@@ -304,6 +311,32 @@ static VOID __unixDeleteAllMsg (AF_UNIX_T *pafunix)
pafunixq->UNIQ_stTotal = 0;
}
/*********************************************************************************************************
+** 函数名称: __unixFreeBytes
+** 功能描述: 判断接收端空余数据量
+** 输 入 : pafunix 接收方
+** 输 出 : 空余数据量
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static size_t __unixFreeBytes (AF_UNIX_T *pafunix)
+{
+ size_t stFreeBuf;
+
+ if (pafunix->UNIX_iStatus == __AF_UNIX_STATUS_LISTEN) { /* CONNECT 状态下不可写 */
+ return (0);
+ }
+
+ if (pafunix->UNIX_stMaxBufSize >
+ pafunix->UNIX_unixq.UNIQ_stTotal) {
+ stFreeBuf = pafunix->UNIX_stMaxBufSize
+ - pafunix->UNIX_unixq.UNIQ_stTotal; /* 获得对方剩余缓冲大小 */
+ } else {
+ stFreeBuf = 0;
+ }
+
+ return (stFreeBuf);
+}
+/*********************************************************************************************************
** 函数名称: __unixCanWrite
** 功能描述: 判断是否可以向指定的接收节点发送数据
** 输 入 : pafunixRecver 接收方
@@ -710,6 +743,77 @@ static VOID __unixShutdownW (AF_UNIX_T *pafunix)
}
}
/*********************************************************************************************************
+** 函数名称: __unixAddPath
+** 功能描述: 将 UNIX 节点加入路径搜索表
+** 输 入 : pafunix 控制块
+** pcPath 路径
+** 输 出 :
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static VOID __unixAddPath (AF_UNIX_T *pafunix, CPCHAR pcPath)
+{
+ INT iHash;
+
+ iHash = __hashHorner(pcPath, __AF_UNIX_PATH_HASH_SIZE);
+
+ _List_Line_Add_Ahead(&pafunix->UNIX_linePath, &_G_plineAfUnixPath[iHash]);
+
+ lib_strcpy(pafunix->UNIX_cFile, pcPath);
+}
+/*********************************************************************************************************
+** 函数名称: __unixRemovePath
+** 功能描述: 将 UNIX 节点从路径搜索表移除
+** 输 入 : pafunix 控制块
+** 输 出 :
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static VOID __unixRemovePath (AF_UNIX_T *pafunix)
+{
+ INT iHash;
+
+ iHash = __hashHorner(pafunix->UNIX_cFile, __AF_UNIX_PATH_HASH_SIZE);
+
+ _List_Line_Del(&pafunix->UNIX_linePath, &_G_plineAfUnixPath[iHash]);
+
+ pafunix->UNIX_cFile[0] = '\0';
+}
+/*********************************************************************************************************
+** 函数名称: __unixFind
+** 功能描述: 查询一个节点
+** 输 入 : pcPath 查询一个节点
+** iType 类型
+** bListen 是否查询一个 listen 节点
+** 输 出 : pafunix
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+static AF_UNIX_T *__unixFind (CPCHAR pcPath, INT iType, BOOL bListen)
+{
+ INT iHash;
+ AF_UNIX_T *pafunixTemp;
+ PLW_LIST_LINE plineTemp;
+
+ iHash = __hashHorner(pcPath, __AF_UNIX_PATH_HASH_SIZE);
+
+ for (plineTemp = _G_plineAfUnixPath[iHash];
+ plineTemp != LW_NULL;
+ plineTemp = _list_line_get_next(plineTemp)) {
+
+ pafunixTemp = _LIST_ENTRY(plineTemp, AF_UNIX_T, UNIX_linePath);
+ if ((iType == SOCK_DGRAM) || !bListen ||
+ (pafunixTemp->UNIX_iStatus == __AF_UNIX_STATUS_LISTEN)) {
+ if ((__AF_UNIX_TYPE(pafunixTemp) == iType) &&
+ (lib_strcmp(pafunixTemp->UNIX_cFile, pcPath) == 0)) {
+ return (pafunixTemp);
+ }
+ }
+ }
+
+ return (LW_NULL);
+}
+/*********************************************************************************************************
** 函数名称: __unixCreate
** 功能描述: 创建一个 af_unix 控制块
** 输 入 : iType SOCK_STREAM / SOCK_DGRAM / SOCK_SEQPACKET
@@ -776,6 +880,7 @@ static VOID __unixDelete (AF_UNIX_T *pafunix)
__AF_UNIX_LOCK();
__unixDeleteAllMsg(pafunix); /* 删除所有未接收的信息 */
+
for (plineTemp = _G_plineAfUnix;
plineTemp != LW_NULL;
plineTemp = _list_line_get_next(plineTemp)) {
@@ -785,7 +890,12 @@ static VOID __unixDelete (AF_UNIX_T *pafunix)
pafunixTemp->UNIX_pafunxPeer = LW_NULL;
}
}
+
_List_Line_Del(&pafunix->UNIX_lineManage, &_G_plineAfUnix);
+
+ if (pafunix->UNIX_cFile[0]) {
+ __unixRemovePath(pafunix);
+ }
__AF_UNIX_UNLOCK();
API_SemaphoreBDelete(&pafunix->UNIX_hCanRead);
@@ -794,37 +904,6 @@ static VOID __unixDelete (AF_UNIX_T *pafunix)
__SHEAP_FREE(pafunix);
}
/*********************************************************************************************************
-** 函数名称: __unixFind
-** 功能描述: 查询一个节点
-** 输 入 : pcPath 查询一个节点
-** iType 类型
-** bListen 是否查询一个 listen 节点
-** 输 出 : pafunix
-** 全局变量:
-** 调用模块:
-*********************************************************************************************************/
-static AF_UNIX_T *__unixFind (CPCHAR pcPath, INT iType, BOOL bListen)
-{
- AF_UNIX_T *pafunixTemp;
- PLW_LIST_LINE plineTemp;
-
- for (plineTemp = _G_plineAfUnix;
- plineTemp != LW_NULL;
- plineTemp = _list_line_get_next(plineTemp)) {
-
- pafunixTemp = (AF_UNIX_T *)plineTemp;
- if ((__AF_UNIX_TYPE(pafunixTemp) == iType) &&
- (lib_strcmp(pafunixTemp->UNIX_cFile, pcPath) == 0)) {
- if ((iType == SOCK_DGRAM) || !bListen ||
- (pafunixTemp->UNIX_iStatus == __AF_UNIX_STATUS_LISTEN)) {
- return (pafunixTemp);
- }
- }
- }
-
- return (LW_NULL);
-}
-/*********************************************************************************************************
** 函数名称: __unixConnect
** 功能描述: pafunix 请求连接到 pafunixAcce
** 输 入 : pafunix 控制块
@@ -1127,7 +1206,7 @@ AF_UNIX_T *unix_socket (INT iDomain, INT iType, INT iProtocol)
INT unix_bind (AF_UNIX_T *pafunix, const struct sockaddr *name, socklen_t namelen)
{
struct sockaddr_un *paddrun = (struct sockaddr_un *)name;
- INT iFd;
+ INT iFd = -1;
INT iPathLen;
INT iSockType;
AF_UNIX_T *pafunixFind;
@@ -1151,13 +1230,18 @@ INT unix_bind (AF_UNIX_T *pafunix, const struct sockaddr *name, socklen_t name
lib_strncpy(cPath, paddrun->sun_path, iPathLen);
cPath[iPathLen] = PX_EOS;
- iFd = open(cPath, O_CREAT | O_RDWR, __AF_UNIX_DEF_FLAG | S_IFSOCK); /* 创建 socket 文件 */
- if (iFd < 0) {
- return (PX_ERROR);
+ if (!pafunix->UNIX_tempmode.enable) {
+ iFd = open(cPath, O_CREAT | O_RDWR, __AF_UNIX_DEF_FLAG | S_IFSOCK);
+ if (iFd < 0) { /* 创建 socket 文件 */
+ return (PX_ERROR);
+ }
}
__AF_UNIX_LOCK();
- API_IosFdGetName(iFd, cPath, MAX_FILENAME_LENGTH); /* 获得完整路径 */
+ if (!pafunix->UNIX_tempmode.enable) {
+ API_IosFdGetName(iFd, cPath, MAX_FILENAME_LENGTH); /* 获得完整路径 */
+ }
+
iSockType = __AF_UNIX_TYPE(pafunix);
pafunixFind = __unixFind(cPath, iSockType,
(iSockType == SOCK_DGRAM) ?
@@ -1168,10 +1252,16 @@ INT unix_bind (AF_UNIX_T *pafunix, const struct sockaddr *name, socklen_t name
_ErrorHandle(EADDRINUSE); /* 不允许重复地址绑定 */
return (PX_ERROR);
}
- lib_strcpy(pafunix->UNIX_cFile, cPath);
+
+ if (pafunix->UNIX_cFile[0]) {
+ __unixRemovePath(pafunix);
+ }
+ __unixAddPath(pafunix, cPath); /* 加入路径搜索表 */
__AF_UNIX_UNLOCK();
- close(iFd);
+ if (iFd >= 0) {
+ close(iFd);
+ }
return (ERROR_NONE);
}
@@ -1260,7 +1350,7 @@ AF_UNIX_T *unix_accept (AF_UNIX_T *pafunix, struct sockaddr *addr, socklen_t *
pafunixNew->UNIX_iStatus = __AF_UNIX_STATUS_ESTAB;
pafunixNew->UNIX_pafunxPeer = pafunixConn;
pafunixNew->UNIX_iPassCred = pafunix->UNIX_iPassCred; /* 继承 SO_PASSCRED 选项 */
- lib_strcpy(pafunixNew->UNIX_cFile, pafunix->UNIX_cFile);/* 继承 accept 地址 */
+ __unixAddPath(pafunixNew, pafunix->UNIX_cFile); /* 继承 accept 地址 */
if (paddrun && addrlen && (*addrlen > __AF_UNIX_ADDROFFSET)) {
size_t stPathLen = lib_strlen(pafunixConn->UNIX_cFile);
@@ -1319,7 +1409,7 @@ INT unix_connect (AF_UNIX_T *pafunix, const struct sockaddr *name, socklen_t n
{
struct sockaddr_un *paddrun = (struct sockaddr_un *)name;
AF_UNIX_T *pafunixAcce;
- CHAR cPath[MAX_FILENAME_LENGTH];
+ CHAR *pcPath, cPath[MAX_FILENAME_LENGTH];
if (paddrun == LW_NULL) {
_ErrorHandle(EINVAL);
@@ -1331,7 +1421,12 @@ INT unix_connect (AF_UNIX_T *pafunix, const struct sockaddr *name, socklen_t n
return (PX_ERROR);
}
- _PathGetFull(cPath, MAX_FILENAME_LENGTH, paddrun->sun_path); /* 获得完整路径 */
+ if (pafunix->UNIX_tempmode.enable) {
+ pcPath = paddrun->sun_path;
+ } else {
+ _PathGetFull(cPath, MAX_FILENAME_LENGTH, paddrun->sun_path); /* 获得完整路径 */
+ pcPath = cPath;
+ }
__AF_UNIX_LOCK();
if (pafunix->UNIX_iStatus == __AF_UNIX_STATUS_CONNECT) {
@@ -1351,7 +1446,7 @@ INT unix_connect (AF_UNIX_T *pafunix, const struct sockaddr *name, socklen_t n
return (PX_ERROR);
}
- pafunixAcce = __unixFind(cPath, __AF_UNIX_TYPE(pafunix), LW_TRUE); /* 查询连接目的 */
+ pafunixAcce = __unixFind(pcPath, __AF_UNIX_TYPE(pafunix), LW_TRUE); /* 查询连接目的 */
if (pafunixAcce == LW_NULL) {
__AF_UNIX_UNLOCK();
_ErrorHandle(ECONNRESET); /* 没有目的 ECONNRESET */
@@ -1359,6 +1454,16 @@ INT unix_connect (AF_UNIX_T *pafunix, const struct sockaddr *name, socklen_t n
}
if (__AF_UNIX_TYPE(pafunix) == SOCK_DGRAM) { /* 非面向连接类型 */
+ if (pafunixAcce->UNIX_tempmode.enable) {
+ if ((pafunixAcce->UNIX_tempmode.peer >= 0) &&
+ (pafunixAcce->UNIX_tempmode.peer != getpid())) { /* 是否允许 connect */
+ __AF_UNIX_UNLOCK();
+ _ErrorHandle(ECONNREFUSED); /* 无法连接目的 ECONNREFUSED */
+ return (PX_ERROR);
+ }
+ pafunixAcce->UNIX_bHasConn = LW_TRUE;
+ pafunixAcce->UNIX_pafunxPeer = pafunix; /* pipe connect */
+ }
pafunix->UNIX_pafunxPeer = pafunixAcce; /* 保存远程节点 */
} else { /* 面向连接类型 */
@@ -1727,7 +1832,6 @@ static ssize_t unix_sendto2 (AF_UNIX_T *pafunix, const void *data, size_t size
if (bHaveTo) { /* 是否有地址信息 */
pafunixRecver = __unixFind(cPath, __AF_UNIX_TYPE(pafunix), LW_FALSE);
-
} else {
pafunixRecver = pafunix->UNIX_pafunxPeer;
}
@@ -1741,7 +1845,7 @@ static ssize_t unix_sendto2 (AF_UNIX_T *pafunix, const void *data, size_t size
__unixSignalNotify(flags);
_ErrorHandle(ECONNRESET); /* 连接已经中断 */
}
- return (sstTotal);
+ return (sstTotal ? sstTotal : PX_ERROR);
}
__try_send:
@@ -1952,6 +2056,15 @@ INT unix_close (AF_UNIX_T *pafunix)
pafunix->UNIX_iStatus = __AF_UNIX_STATUS_NONE;
pafunix->UNIX_pafunxPeer = LW_NULL; /* 解除本地连接关系 */
__unixUpdateExcept(pafunix, ENOTCONN);
+
+ } else { /* DGRAM */
+ if (pafunix->UNIX_tempmode.enable) { /* 是对端文件异常 */
+ pafunixPeer = pafunix->UNIX_pafunxPeer;
+ if (pafunixPeer) {
+ pafunixPeer->UNIX_pafunxPeer = LW_NULL; /* 解除对方的连接关系 */
+ __unixUpdateExcept(pafunixPeer, ECONNRESET);
+ }
+ }
}
__AF_UNIX_UNLOCK();
@@ -2306,13 +2419,16 @@ INT unix_getsockopt (AF_UNIX_T *pafunix, int level, int optname, void *optval,
*********************************************************************************************************/
INT unix_ioctl (AF_UNIX_T *pafunix, INT iCmd, PVOID pvArg)
{
- INT iRet = ERROR_NONE;
+ INT iRet = ERROR_NONE;
switch (iCmd) {
case FIOGETFL:
if (pvArg) {
*(INT *)pvArg = pafunix->UNIX_iFlag;
+ } else {
+ _ErrorHandle(EINVAL);
+ iRet = PX_ERROR;
}
break;
@@ -2327,9 +2443,31 @@ INT unix_ioctl (AF_UNIX_T *pafunix, INT iCmd, PVOID pvArg)
case FIONREAD:
if (pvArg) {
*(INT *)pvArg = (INT)pafunix->UNIX_unixq.UNIQ_stTotal;
+ } else {
+ _ErrorHandle(EINVAL);
+ iRet = PX_ERROR;
}
break;
+ case FIONFREE:
+ if (pvArg) {
+ AF_UNIX_T *pafunixPeer = pafunix->UNIX_pafunxPeer;
+ if (pafunixPeer) {
+ size_t stFree = __unixFreeBytes(pafunixPeer);
+ if (stFree >= __AF_UNIX_PIPE_BUF) {
+ *(INT *)pvArg = (INT)stFree;
+ } else {
+ *(INT *)pvArg = 0;
+ }
+ } else {
+ *(INT *)pvArg = __AF_UNIX_PIPE_BUF;
+ }
+ } else {
+ _ErrorHandle(EINVAL);
+ iRet = PX_ERROR;
+ }
+ break;
+
case FIONBIO:
if (pvArg && *(INT *)pvArg) {
pafunix->UNIX_iFlag |= O_NONBLOCK;
@@ -2338,6 +2476,32 @@ INT unix_ioctl (AF_UNIX_T *pafunix, INT iCmd, PVOID pvArg)
}
break;
+ case UNIXCGTEMPMODE:
+ if (!pvArg) {
+ _ErrorHandle(EINVAL);
+ iRet = PX_ERROR;
+ } else {
+ *(struct unix_temp_mode *)pvArg = pafunix->UNIX_tempmode;
+ }
+ break;
+
+ case UNIXCSTEMPMODE:
+ if (!pvArg) {
+ _ErrorHandle(EINVAL);
+ iRet = PX_ERROR;
+ } else if (__AF_UNIX_TYPE(pafunix) != SOCK_DGRAM) {
+ _ErrorHandle(ENOTSUP);
+ iRet = PX_ERROR;
+ } else {
+ if (pafunix->UNIX_tempmode.enable) {
+ _ErrorHandle(EALREADY);
+ iRet = PX_ERROR;
+ } else {
+ pafunix->UNIX_tempmode = *(struct unix_temp_mode *)pvArg;
+ }
+ }
+ break;
+
default:
_ErrorHandle(ENOSYS);
iRet = PX_ERROR;
@@ -2423,7 +2587,12 @@ int __unix_have_event (AF_UNIX_T *pafunix, int type, int *piSoErr)
break;
}
} else {
- if (__unixCanRead(pafunix, 0, 0)) { /* 可读 */
+ if (pafunix->UNIX_tempmode.enable &&
+ pafunix->UNIX_bHasConn && !pafunix->UNIX_pafunxPeer) { /* 对方已经不存在了 */
+ *piSoErr = ECONNRESET; /* 读已经被停止了 */
+ iEvent = 1;
+
+ } else if (__unixCanRead(pafunix, 0, 0)) { /* 可读 */
*piSoErr = ERROR_NONE;
iEvent = 1;
}
diff --git a/SylixOS/net/lwip/unix/af_unix.h b/SylixOS/net/lwip/unix/af_unix.h
index 37951b9..b7d8296 100644
--- a/SylixOS/net/lwip/unix/af_unix.h
+++ b/SylixOS/net/lwip/unix/af_unix.h
@@ -22,6 +22,10 @@
#ifndef __AF_UNIX_H
#define __AF_UNIX_H
+#ifndef __SYS_UN_H
+#include "sys/un.h"
+#endif
+
/*********************************************************************************************************
AF_UNIX 接收数据节点扩展数据
*********************************************************************************************************/
@@ -63,9 +67,14 @@ typedef struct af_unix_queue {
关于 UNIX_hCanRead 表示当前 socket 读操作无数据时等待的信号量
关于 UNIX_hCanWrite 表示其他 socket 写本节点时需要等待的信号量
*********************************************************************************************************/
+typedef struct unix_temp_mode unix_temp_mode_t;
typedef struct af_unix_t {
LW_LIST_LINE UNIX_lineManage;
+ LW_LIST_LINE UNIX_linePath;
+
+ unix_temp_mode_t UNIX_tempmode; /* 无文件模式 DGRAM */
+ BOOL UNIX_bHasConn; /* DGRAM 被连接过 */
LW_LIST_RING UNIX_ringConnect; /* 连接队列 */
LW_LIST_RING_HEADER UNIX_pringConnect; /* 等待连接的队列 */
diff --git a/SylixOS/shell/ttinyShell/ttinyShellSysCmd.c b/SylixOS/shell/ttinyShell/ttinyShellSysCmd.c
index cac9403..338abfc 100644
--- a/SylixOS/shell/ttinyShell/ttinyShellSysCmd.c
+++ b/SylixOS/shell/ttinyShell/ttinyShellSysCmd.c
@@ -86,6 +86,7 @@
*********************************************************************************************************/
#include "../SylixOS/shell/ttinyVar/ttinyVarLib.h"
#include "../SylixOS/posix/include/px_resource.h"
+#include "../SylixOS/lib/libc/time/lib_local.h"
#if LW_CFG_POSIX_EN > 0
#include "pthread.h"
#include "pthread_np.h"
@@ -1083,7 +1084,7 @@ static INT __tshellSysCmdDate (INT iArgC, PCHAR ppcArgV[])
+ ((pcDate[1] - '0') * 100)
+ ((pcDate[2] - '0') * 10)
+ (pcDate[3] - '0'); /* 读取 year 信息 */
- if (tmTime.tm_year > 1900) {
+ if (tmTime.tm_year >= EPOCH_YEAR) {
tmTime.tm_year -= 1900;
} else {
goto __invalid_date;