summaryrefslogtreecommitdiffstatsabout
path: root/SylixOS
diff options
context:
space:
mode:
authorHanhui <hanhui@acoinfo.com>2021-01-14 09:46:02 (GMT)
committer Hanhui <hanhui@acoinfo.com>2021-01-14 09:46:02 (GMT)
commitfedfe12013aecb3859c78e5f985346ed3867ca7e (patch)
tree84a71237c32e7d2a177ea3c72a454c7563bf26ad /SylixOS
parent2cbb8916b59d97eff7d027ae19dbea63c07f5ebd (diff)
downloadlibsylixos-fedfe12013aecb3859c78e5f985346ed3867ca7e.zip
libsylixos-fedfe12013aecb3859c78e5f985346ed3867ca7e.tar.gz
libsylixos-fedfe12013aecb3859c78e5f985346ed3867ca7e.tar.bz2
Add C-SKY fast interrupt support.
Diffstat (limited to 'SylixOS')
-rw-r--r--SylixOS/arch/csky/common/cskyContextAsm.S12
-rw-r--r--SylixOS/arch/csky/common/cskyContextAsm.h37
-rw-r--r--SylixOS/arch/csky/common/cskyExc.c15
-rw-r--r--SylixOS/arch/csky/common/cskyExcAsm.S86
-rw-r--r--SylixOS/arch/csky/csky_support.h2
-rw-r--r--SylixOS/driver/can/sja1000.c7
-rw-r--r--SylixOS/driver/pci/storage/pciStorageNvme.c2
-rw-r--r--SylixOS/include/arch/csky/arch_def.h47
-rw-r--r--SylixOS/kernel/interface/InterEnterExit.c62
-rw-r--r--SylixOS/net/lwip/lwip_ifctl.c4
-rw-r--r--SylixOS/system/device/rand/randDevLib.c9
-rw-r--r--SylixOS/vpmpdm/arch/csky/memcpy.S22
12 files changed, 282 insertions, 23 deletions
diff --git a/SylixOS/arch/csky/common/cskyContextAsm.S b/SylixOS/arch/csky/common/cskyContextAsm.S
index eb32923..9b16815 100644
--- a/SylixOS/arch/csky/common/cskyContextAsm.S
+++ b/SylixOS/arch/csky/common/cskyContextAsm.S
@@ -48,6 +48,7 @@
EXPORT_LABEL(archCrtCtxSwitch)
#endif
EXPORT_LABEL(archIntCtxLoad)
+ EXPORT_LABEL(archFastIntCtxLoad)
EXPORT_LABEL(archSigCtxLoad)
;/*********************************************************************************************************
@@ -123,6 +124,17 @@ FUNC_DEF(archIntCtxLoad)
FUNC_END(archIntCtxLoad)
;/*********************************************************************************************************
+; 快速中断返回时, 线程装载
+; 参数为当前 CPU 控制块, 即 A0 为当前 CPU 控制块指针
+;*********************************************************************************************************/
+
+FUNC_DEF(archFastIntCtxLoad)
+ LD.W A1 , (A0 , 0) ;/* 获取当前 TCB 的 REG_CTX 地址*/
+
+ RESTORE_REGS_FAST_INT ;/* 恢复任务寄存器 */
+ FUNC_END(archFastIntCtxLoad)
+
+;/*********************************************************************************************************
; 信号上下文返回
; 参数为 ARCH_REG_CTX 指针, 即 A0 为 ARCH_REG_CTX 指针
;*********************************************************************************************************/
diff --git a/SylixOS/arch/csky/common/cskyContextAsm.h b/SylixOS/arch/csky/common/cskyContextAsm.h
index 2b4109e..a5cf016 100644
--- a/SylixOS/arch/csky/common/cskyContextAsm.h
+++ b/SylixOS/arch/csky/common/cskyContextAsm.h
@@ -74,6 +74,35 @@ MACRO_DEF(RESTORE_KERN_REGS)
MACRO_END()
;/*********************************************************************************************************
+; 快速中断恢复内核态任务寄存器(参数 A1: ARCH_REG_CTX 地址)
+; 注意: 目前仅适合 ABIv2
+;*********************************************************************************************************/
+
+MACRO_DEF(RESTORE_KERN_REGS_FAST_INT)
+#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 , FPSR
+
+ LD.W A0 , (A1 , XPC) ;/* 恢复 PC 寄存器 */
+ MTCR A0 , FPC
+
+ LD.W R0 , (A1 , XGREG(0)) ;/* 恢复 R0 - R31 */
+
+ ADDI A1 , (2 * ARCH_REG_SIZE)
+ LDM R2-R31 , (A1)
+ SUBI A1 , (2 * ARCH_REG_SIZE)
+ LD.W A1 , (A1 , XGREG(1))
+
+ RFI
+ MACRO_END()
+
+;/*********************************************************************************************************
; 恢复任务寄存器(参数 A1: ARCH_REG_CTX 地址)
;*********************************************************************************************************/
@@ -81,6 +110,14 @@ MACRO_DEF(RESTORE_REGS)
RESTORE_KERN_REGS
MACRO_END()
+;/*********************************************************************************************************
+; 快速中断恢复任务寄存器(参数 A1: ARCH_REG_CTX 地址)
+;*********************************************************************************************************/
+
+MACRO_DEF(RESTORE_REGS_FAST_INT)
+ RESTORE_KERN_REGS_FAST_INT
+ MACRO_END()
+
#endif
;/*********************************************************************************************************
; END
diff --git a/SylixOS/arch/csky/common/cskyExc.c b/SylixOS/arch/csky/common/cskyExc.c
index 77950d9..82234e7 100644
--- a/SylixOS/arch/csky/common/cskyExc.c
+++ b/SylixOS/arch/csky/common/cskyExc.c
@@ -92,6 +92,17 @@ LW_WEAK VOID archIntHandle (ULONG ulVector, BOOL bPreemptive)
}
}
/*********************************************************************************************************
+** 函数名称: bspFastIntHandle
+** 功能描述: 快速中断处理
+** 输 入 : ulVector 中断向量
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+LW_WEAK VOID bspFastIntHandle (ULONG ulVector)
+{
+}
+/*********************************************************************************************************
** 函数名称: archFastAutoIntHandle
** 功能描述: 快速中断
** 输 入 : ulVector 中断向量
@@ -100,9 +111,9 @@ LW_WEAK VOID archIntHandle (ULONG ulVector, BOOL bPreemptive)
** 全局变量:
** 调用模块:
*********************************************************************************************************/
-LW_WEAK VOID archFastAutoIntHandle (ULONG ulVector, ARCH_REG_CTX *pregctx)
+VOID archFastAutoIntHandle (ULONG ulVector, ARCH_REG_CTX *pregctx)
{
- bspIntHandle(ulVector);
+ bspFastIntHandle(ulVector);
}
/*********************************************************************************************************
** 函数名称: archAutoIntHandle
diff --git a/SylixOS/arch/csky/common/cskyExcAsm.S b/SylixOS/arch/csky/common/cskyExcAsm.S
index c49377f..b072569 100644
--- a/SylixOS/arch/csky/common/cskyExcAsm.S
+++ b/SylixOS/arch/csky/common/cskyExcAsm.S
@@ -189,6 +189,89 @@ MACRO_DEF(IRQ_ENTRY irq handle)
MACRO_END()
;/*********************************************************************************************************
+; 快速中断入口宏
+;*********************************************************************************************************/
+
+MACRO_DEF(FAST_INT_ENTRY handle)
+ MTCR SP , SS1 ;/* SS1 暂存异常前 SP */
+ MFCR SP , SS0 ;/* SP = 异常临时栈 */
+
+ SUBI SP , ARCH_REG_CTX_SIZE ;/* 在临时堆栈开辟上下文保存区 */
+
+ STM R0-R31 , (SP)
+
+ MFCR R18 , FPC ;/* FPC 代替 PC 保存 */
+ ST.W R18 , (SP , XPC)
+
+ MFCR R18 , FPSR ;/* FPSR 代替 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)
+
+ MFCR R18 , SS1 ;/* 读出异常前 SP */
+#ifdef __CSKYABIV2__
+ ST.W R18 , (SP , XGREG(14)) ;/* 保存异常前 SP */
+#else
+ ST.W R18 , (SP , XGREG(0))
+#endif
+
+ ;/*
+ ; * API_InterEnter(寄存器上下文)
+ ; */
+ MOV A0 , SP
+ JSRI API_InterEnter
+
+ CMPNEI A0 , 1
+ BT 3f
+
+ ;/*
+ ; * 第一次进入中断: 获得当前 CPU 中断堆栈栈顶, 并设置 SP
+ ; */
+ JSRI API_InterStackBaseGet
+ MOV SP , A0
+
+ ;/*
+ ; * 获得当前任务 TCB 的 ARCH_REG_CTX 地址
+ ; */
+ JSRI API_ThreadTcbInter
+ MOV A1 , A0
+
+2:
+ PSRCLR FE
+ ;/*
+ ; * handle(vector, 寄存器上下文)
+ ; */
+ JSRI \handle
+ ;/*
+ ; * API_InterExitFastInt()
+ ; * 如果没有发生中断嵌套, 则 API_InterExitFastInt 会调用 archFiqCtxLoad 函数
+ ; */
+ JSRI API_InterExitFastInt
+
+ ;/*
+ ; * 来到这里, 说明发生了中断嵌套
+ ; */
+ MOV A1 , SP
+ RESTORE_REGS_FAST_INT
+
+3:
+ ;/*
+ ; * 不是第一次进入中断
+ ; */
+ MFCR SP , SS1 ;/* 异常前 SP */
+ SUBI SP , ARCH_REG_CTX_SIZE
+ MOV A1 , SP
+ BR 2b
+ MACRO_END()
+
+;/*********************************************************************************************************
; 未对齐访问异常入口函数
;*********************************************************************************************************/
@@ -273,8 +356,7 @@ FUNC_DEF(archAutoIntEntry)
;*********************************************************************************************************/
FUNC_DEF(archFastAutoIntEntry)
- JSRI archFastAutoIntHandle
- RFI
+ FAST_INT_ENTRY archFastAutoIntHandle
FUNC_END(archFastAutoIntEntry)
;/*********************************************************************************************************
diff --git a/SylixOS/arch/csky/csky_support.h b/SylixOS/arch/csky/csky_support.h
index fe13314..e0df10a 100644
--- a/SylixOS/arch/csky/csky_support.h
+++ b/SylixOS/arch/csky/csky_support.h
@@ -88,6 +88,7 @@ VOID archCrtCtxSwitch(PLW_CLASS_CPU pcpuSw);
#endif /* LW_CFG_COROUTINE_EN > 0 */
VOID archIntCtxLoad(PLW_CLASS_CPU pcpuSw);
+VOID archFastIntCtxLoad(PLW_CLASS_CPU pcpuSw);
VOID archSigCtxLoad(const ARCH_REG_CTX *pregctx);
VOID archIntCtxSaveReg(PLW_CLASS_CPU pcpu,
@@ -339,6 +340,7 @@ INT bspCpuExcHook(PLW_CLASS_TCB ptcb,
*********************************************************************************************************/
VOID bspIntInit(VOID);
+VOID bspFastIntHandle(ULONG ulVector);
VOID bspIntHandle(ULONG ulVector);
UINT32 bspIntInitEnableStatus(VOID);
diff --git a/SylixOS/driver/can/sja1000.c b/SylixOS/driver/can/sja1000.c
index 120eeaa..366e3d2 100644
--- a/SylixOS/driver/can/sja1000.c
+++ b/SylixOS/driver/can/sja1000.c
@@ -36,6 +36,7 @@
*********************************************************************************************************/
#define COMMAND_SET(pcanchan, command) SET_REG(pcanchan, CMR, command)
#define OUTPUT_MODE_SET(pcanchan, omodevalue) SET_REG(pcanchan, OCR, omodevalue)
+#define EWL_SET(pcanchan, ewlvalue) SET_REG(pcanchan, EWL, ewlvalue)
/*********************************************************************************************************
sja1000 frame
*********************************************************************************************************/
@@ -456,9 +457,10 @@ static VOID sja1000InitChip (SJA1000_CHAN *pcanchan)
sja1000SetBaud(pcanchan, pcanchan->baud);
sja1000SetDiv(pcanchan, 0, 1);
sja1000SetClock(pcanchan, 0, 0);
+ EWL_SET(pcanchan, 0x60); /* error warning threshold value*/
OUTPUT_MODE_SET(pcanchan, 0x1A);
/* enable interrupt */
- sja1000SetInt(pcanchan, (IER_RIE | IER_TIR | IER_BEIE | IER_DOIE), 1);
+ sja1000SetInt(pcanchan, (IER_RIE | IER_TIR | IER_BEIE | IER_DOIE | IER_EIR), 1);
}
/*********************************************************************************************************
** 函数名称: sja1000TxStartup
@@ -726,7 +728,8 @@ VOID sja1000Isr (SJA1000_CHAN *pcanchan)
} else { /* normal mode */
/*
* The controller will continue to record the number of errors,
- * more than 255 will generate IR_EI error.
+ * more than EWL value will generate IR_EI error,
+ * then update bus status and wait for reset.
*/
}
return;
diff --git a/SylixOS/driver/pci/storage/pciStorageNvme.c b/SylixOS/driver/pci/storage/pciStorageNvme.c
index 6072e93..ab386aa 100644
--- a/SylixOS/driver/pci/storage/pciStorageNvme.c
+++ b/SylixOS/driver/pci/storage/pciStorageNvme.c
@@ -367,7 +367,7 @@ static INT pciStorageNvmeVendorCtrlReadyWork (NVME_CTRL_HANDLE hCtrl, UINT uiI
}
/*
- * 分配MSI-X描述符
+ * 分配 MSI-X 描述符
*/
hCtrl->NVMECTRL_pvIntHandle = __SHEAP_ZALLOC(sizeof(PCI_MSI_DESC) * uiIrqNum);
if (!hCtrl->NVMECTRL_pvIntHandle) { /* 分配描述符失败 */
diff --git a/SylixOS/include/arch/csky/arch_def.h b/SylixOS/include/arch/csky/arch_def.h
index 87ebc81..af9512c 100644
--- a/SylixOS/include/arch/csky/arch_def.h
+++ b/SylixOS/include/arch/csky/arch_def.h
@@ -292,6 +292,53 @@ typedef UINT16 CSKY_INSTRUCTION;
#define M_L2CACHE_CFG_RFE (0x1 << S_L2CACHE_CFG_RFE) /* 数据访问读分配使能位 */
#define S_L2CACHE_CFG_RFE 0
+/*********************************************************************************************************
+ C-SKY 异常向量表
+*********************************************************************************************************/
+
+#define VEC_RESET 0
+#define VEC_ALIGN 1
+#define VEC_ACCESS 2
+#define VEC_ZERODIV 3
+#define VEC_ILLEGAL 4
+#define VEC_PRIV 5
+#define VEC_TRACE 6
+#define VEC_BREAKPOINT 7
+#define VEC_UNRECOVER 8
+#define VEC_SOFTRESET 9
+#define VEC_AUTOVEC 10
+#define VEC_FAUTOVEC 11
+#define VEC_HWACCEL 12
+
+#define VEC_TLBFATAL 13
+#define VEC_TLBMISS 14
+#define VEC_TLBMODIFIED 15
+
+#define VEC_SYS 16
+#define VEC_TRAP0 16
+#define VEC_TRAP1 17
+#define VEC_TRAP2 18
+#define VEC_TRAP3 19
+
+#define VEC_TLBINVALIDL 20
+#define VEC_TLBINVALIDS 21
+
+#define VEC_PRFL 29
+#define VEC_FPE 30
+
+#define VEC_USER 32
+
+#define VEC_INT1 33
+#define VEC_INT2 34
+#define VEC_INT3 35
+#define VEC_INT4 36
+#define VEC_INT5 37
+#define VEC_INT6 38
+#define VEC_INT7 39
+#define VEC_INT8 40
+
+#define VEC_MAX 255
+
#endif /* __SYLIXOS_KERNEL */
/* __ASSEMBLY__ */
#endif /* __CSKY_ARCH_DEF_H */
diff --git a/SylixOS/kernel/interface/InterEnterExit.c b/SylixOS/kernel/interface/InterEnterExit.c
index 4977c73..03e061b 100644
--- a/SylixOS/kernel/interface/InterEnterExit.c
+++ b/SylixOS/kernel/interface/InterEnterExit.c
@@ -258,6 +258,68 @@ VOID API_InterExit (VOID)
#endif
}
/*********************************************************************************************************
+** 函数名称: API_InterExitFastInt
+** 功能描述: 内核 FIQ 中断出口函数 (在关中断的情况下被调用)
+** 输 入 : NONE
+** 输 出 : NONE
+** 全局变量:
+** 调用模块:
+ API 函数
+*********************************************************************************************************/
+#if defined(LW_CFG_CPU_ARCH_CSKY)
+
+LW_API
+VOID API_InterExitFastInt (VOID)
+{
+ PLW_CLASS_CPU pcpu;
+
+ pcpu = LW_CPU_GET_CUR();
+
+#if LW_CFG_INTER_INFO > 0
+ if (pcpu->CPU_ulInterNestingMax < pcpu->CPU_ulInterNesting) {
+ pcpu->CPU_ulInterNestingMax = pcpu->CPU_ulInterNesting;
+ }
+#endif /* LW_CFG_INTER_INFO > 0 */
+
+ if (pcpu->CPU_ulInterNesting) { /* 系统中断嵌套层数-- */
+ pcpu->CPU_ulInterNesting--;
+ }
+
+ if (pcpu->CPU_ulInterNesting) { /* 查看系统是否在中断嵌套中 */
+#if (LW_CFG_CPU_FPU_EN > 0) && (LW_CFG_INTER_FPU > 0) /* 恢复上一等级中断 FPU CTX */
+ if (LW_KERN_FPU_EN_GET()) {
+ __fpuInterExit(pcpu);
+ }
+#endif /* LW_CFG_CPU_FPU_EN > 0 */
+ /* LW_CFG_INTER_FPU > 0 */
+#if (LW_CFG_CPU_DSP_EN > 0) && (LW_CFG_INTER_DSP > 0) /* 恢复上一等级中断 DSP CTX */
+ if (LW_KERN_DSP_EN_GET()) {
+ __dspInterExit(pcpu);
+ }
+#endif /* LW_CFG_CPU_DSP_EN > 0 */
+ return; /* LW_CFG_INTER_DSP > 0 */
+ }
+
+ __KERNEL_SCHED_INT(pcpu); /* 中断中的调度 */
+
+#if (LW_CFG_CPU_FPU_EN > 0) && (LW_CFG_INTER_FPU > 0)
+ if (LW_KERN_FPU_EN_GET()) {
+ __fpuInterExit(pcpu);
+ }
+#endif /* LW_CFG_CPU_FPU_EN > 0 */
+ /* LW_CFG_INTER_FPU > 0 */
+#if (LW_CFG_CPU_DSP_EN > 0) && (LW_CFG_INTER_DSP > 0)
+ if (LW_KERN_DSP_EN_GET()) {
+ __dspInterExit(pcpu);
+ }
+#endif /* LW_CFG_CPU_DSP_EN > 0 */
+ /* LW_CFG_INTER_DSP > 0 */
+
+ archFastIntCtxLoad(pcpu); /* 中断返回 (当前任务 CTX 加载)*/
+}
+
+#endif /* LW_CFG_CPU_ARCH_CSKY */
+/*********************************************************************************************************
** 函数名称: API_InterExitNoSched
** 功能描述: 内核中断出口函数 (在关中断的情况下被调用), 不进行任务调度, 供 ARMv7M 使用
** 输 入 : NONE
diff --git a/SylixOS/net/lwip/lwip_ifctl.c b/SylixOS/net/lwip/lwip_ifctl.c
index 9b8a768..31d9ec6 100644
--- a/SylixOS/net/lwip/lwip_ifctl.c
+++ b/SylixOS/net/lwip/lwip_ifctl.c
@@ -183,12 +183,12 @@ static INT __ifSubIoctlIf (INT iCmd, PVOID pvArg)
if (pifreq->ifr_flags & IFF_PROMISC) {
pnetif->flags2 |= NETIF_FLAG2_PROMISC;
} else {
- pnetif->flags2 |= ~NETIF_FLAG2_PROMISC;
+ pnetif->flags2 &= ~NETIF_FLAG2_PROMISC;
}
if (pifreq->ifr_flags & IFF_ALLMULTI) {
pnetif->flags2 |= NETIF_FLAG2_ALLMULTI;
} else {
- pnetif->flags2 |= ~NETIF_FLAG2_ALLMULTI;
+ pnetif->flags2 &= ~NETIF_FLAG2_ALLMULTI;
}
if (pifreq->ifr_flags & IFF_UP) {
netifapi_netif_set_up(pnetif);
diff --git a/SylixOS/system/device/rand/randDevLib.c b/SylixOS/system/device/rand/randDevLib.c
index 1b362e8..c6c4ac2 100644
--- a/SylixOS/system/device/rand/randDevLib.c
+++ b/SylixOS/system/device/rand/randDevLib.c
@@ -36,9 +36,6 @@
*********************************************************************************************************/
static spinlock_t _G_slRandLock; /* 中断信息自旋锁 */
static struct timespec _G_tvLastInt; /* 最后一次中断时间戳 */
-#if LW_CFG_CPU_INT_HOOK_EN > 0
-static INT64 _G_i64IntCounter; /* 中断计数器 */
-#endif /* LW_CFG_CPU_INT_HOOK_EN > 0 */
static LW_OBJECT_HANDLE _G_hRandSelMutex; /* select list mutex */
/*********************************************************************************************************
** 函数名称: __randInterHook
@@ -59,8 +56,7 @@ static VOID __randInterHook (ULONG ulVector, ULONG ulNesting)
if (LW_IVEC_GET_FLAG(ulVector) & LW_IRQ_FLAG_SAMPLE_RAND) { /* 需要更新随机数种子 */
LW_SPIN_LOCK_QUICK(&_G_slRandLock, &iregInterLevel);
- _G_tvLastInt = _K_tvTODCurrent; /* 仅仅是种子, 不需要加时间锁 */
- _G_i64IntCounter++;
+ _G_tvLastInt.tv_nsec = _K_tvTODCurrent.tv_nsec; /* 仅仅是种子, 不需要加时间锁 */
LW_SPIN_UNLOCK_QUICK(&_G_slRandLock, iregInterLevel);
}
}
@@ -116,6 +112,9 @@ LONG __randOpen (PLW_RAND_DEV pranddev, PCHAR pcName, INT iFlags, INT iMode
#if LW_CFG_CPU_INT_HOOK_EN > 0
if (LW_DEV_INC_USE_COUNT(&pranddev->RANDDEV_devhdr) == 1) {
API_SystemHookAdd(__randInterHook, LW_OPTION_CPU_INT_EXIT); /* 创建中断hook */
+ if (_G_tvLastInt.tv_sec == 0) {
+ lib_clock_gettime(CLOCK_REALTIME, &_G_tvLastInt); /* 初始值 */
+ }
}
#else
(VOID)pranddev;
diff --git a/SylixOS/vpmpdm/arch/csky/memcpy.S b/SylixOS/vpmpdm/arch/csky/memcpy.S
index cab701a..56f4be2 100644
--- a/SylixOS/vpmpdm/arch/csky/memcpy.S
+++ b/SylixOS/vpmpdm/arch/csky/memcpy.S
@@ -11,10 +11,9 @@
* memcpy implement.
*/
.text
- .align 4
- .global memcpy
- .type memcpy, @function
-memcpy:
+ .align 4
+ .type __memcpy, @function
+__memcpy:
/* Test if len less than 4 bytes. */
mov r12, r0
cmplti r2, 4
@@ -112,19 +111,22 @@ memcpy:
/* Check whether the src is aligned. */
br .L_dest_aligned
- .size memcpy,.-memcpy
+ .size __memcpy,.-__memcpy
/*
- * memmove implement.
+ * memcpy and memmove implement.
*/
.text
+ .global memcpy
.global memmove
- .type memmove,%function
+ .type memcpy, @function
+ .type memmove,@function
.align 4
+memcpy:
memmove:
subu r3, r0, r1
cmphs r3, r2
- bt memcpy
+ bt __memcpy
mov r12, r0
addu r0, r0, r2
@@ -219,4 +221,6 @@ memmove:
bt .L_copy_by_byte_m
/* Check whether the src is aligned. */
br .L_dest_aligned_m
-.size memmove,.-memmove
+
+ .size memmove,.-memmove
+ .size memcpy,.-memcpy