mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
Add a new API to let platform-specific ports provide functions for big
copy/zeroing.
This commit is contained in:
parent
87351d5fd2
commit
0122bd1470
4 changed files with 159 additions and 0 deletions
|
|
@ -40,6 +40,11 @@
|
|||
|
||||
#include <machine/asm.h>
|
||||
|
||||
.L_arm_memcpy:
|
||||
.word _C_LABEL(_arm_memcpy)
|
||||
.L_min_memcpy_size:
|
||||
.word _C_LABEL(_min_memcpy_size)
|
||||
|
||||
__FBSDID("$FreeBSD$");
|
||||
#ifdef __XSCALE__
|
||||
#include <arm/arm/bcopyinout_xscale.S>
|
||||
|
|
@ -82,6 +87,27 @@ ENTRY(copyin)
|
|||
moveq r0, #0
|
||||
RETeq
|
||||
|
||||
ldr r3, .L_arm_memcpy
|
||||
ldr r3, [r3]
|
||||
cmp r3, #0
|
||||
beq .Lnormal
|
||||
ldr r3, .L_min_memcpy_size
|
||||
ldr r3, [r3]
|
||||
cmp r2, r3
|
||||
blt .Lnormal
|
||||
stmfd sp!, {r0-r2, r4, lr}
|
||||
mov r3, r0
|
||||
mov r0, r1
|
||||
mov r1, r3
|
||||
mov r3, #2 /* SRC_IS_USER */
|
||||
ldr r4, .L_arm_memcpy
|
||||
mov lr, pc
|
||||
ldr pc, [r4]
|
||||
cmp r0, #0
|
||||
ldmfd sp!, {r0-r2, r4, lr}
|
||||
moveq r0, #0
|
||||
RETeq
|
||||
|
||||
SAVE_REGS
|
||||
#ifdef MULTIPROCESSOR
|
||||
/* XXX Probably not appropriate for non-Hydra SMPs */
|
||||
|
|
@ -306,6 +332,27 @@ ENTRY(copyout)
|
|||
moveq r0, #0
|
||||
RETeq
|
||||
|
||||
ldr r3, .L_arm_memcpy
|
||||
ldr r3, [r3]
|
||||
cmp r3, #0
|
||||
beq .Lnormale
|
||||
ldr r3, .L_min_memcpy_size
|
||||
ldr r3, [r3]
|
||||
cmp r2, r3
|
||||
blt .Lnormale
|
||||
stmfd sp!, {r0-r2, r4, lr}
|
||||
mov r3, r0
|
||||
mov r0, r1
|
||||
mov r1, r3
|
||||
mov r3, #1 /* DST_IS_USER */
|
||||
ldr r4, .L_arm_memcpy
|
||||
mov lr, pc
|
||||
ldr pc, [r4]
|
||||
cmp r0, #0
|
||||
ldmfd sp!, {r0-r2, r4, lr}
|
||||
moveq r0, #0
|
||||
RETeq
|
||||
|
||||
SAVE_REGS
|
||||
#ifdef MULTIPROCESSOR
|
||||
/* XXX Probably not appropriate for non-Hydra SMPs */
|
||||
|
|
|
|||
|
|
@ -61,6 +61,28 @@ ENTRY(copyin)
|
|||
movle r0, #0x00
|
||||
movle pc, lr /* Bail early if length is <= 0 */
|
||||
|
||||
ldr r3, .L_arm_memcpy
|
||||
ldr r3, [r3]
|
||||
cmp r3, #0
|
||||
beq .Lnormal
|
||||
ldr r3, .L_min_memcpy_size
|
||||
ldr r3, [r3]
|
||||
cmp r2, r3
|
||||
blt .Lnormal
|
||||
stmfd sp!, {r0-r2, r4, lr}
|
||||
mov r3, r0
|
||||
mov r0, r1
|
||||
mov r1, r3
|
||||
mov r3, #2 /* SRC_IS_USER */
|
||||
ldr r4, .L_arm_memcpy
|
||||
mov lr, pc
|
||||
ldr pc, [r4]
|
||||
cmp r0, #0
|
||||
ldmfd sp!, {r0-r2, r4, lr}
|
||||
moveq r0, #0
|
||||
RETeq
|
||||
|
||||
.Lnormal:
|
||||
stmfd sp!, {r10-r11, lr}
|
||||
|
||||
#ifdef MULTIPROCESSOR
|
||||
|
|
@ -491,6 +513,28 @@ ENTRY(copyout)
|
|||
movle r0, #0x00
|
||||
movle pc, lr /* Bail early if length is <= 0 */
|
||||
|
||||
ldr r3, .L_arm_memcpy
|
||||
ldr r3, [r3]
|
||||
cmp r3, #0
|
||||
beq .Lnormale
|
||||
ldr r3, .L_min_memcpy_size
|
||||
ldr r3, [r3]
|
||||
cmp r2, r3
|
||||
blt .Lnormale
|
||||
stmfd sp!, {r0-r2, r4, lr}
|
||||
mov r3, r0
|
||||
mov r0, r1
|
||||
mov r1, r3
|
||||
mov r3, #1 /* DST_IS_USER */
|
||||
ldr r4, .L_arm_memcpy
|
||||
mov lr, pc
|
||||
ldr pc, [r4]
|
||||
cmp r0, #0
|
||||
ldmfd sp!, {r0-r2, r4, lr}
|
||||
moveq r0, #0
|
||||
RETeq
|
||||
|
||||
.Lnormale:
|
||||
stmfd sp!, {r10-r11, lr}
|
||||
|
||||
#ifdef MULTIPROCESSOR
|
||||
|
|
|
|||
|
|
@ -30,6 +30,14 @@ __FBSDID("$FreeBSD$");
|
|||
|
||||
#include "assym.s"
|
||||
|
||||
.L_arm_memcpy:
|
||||
.word _C_LABEL(_arm_memcpy)
|
||||
.L_arm_bzero:
|
||||
.word _C_LABEL(_arm_bzero)
|
||||
.L_min_memcpy_size:
|
||||
.word _C_LABEL(_min_memcpy_size)
|
||||
.L_min_bzero_size:
|
||||
.word _C_LABEL(_min_bzero_size)
|
||||
/*
|
||||
* memset: Sets a block of memory to the specified value
|
||||
*
|
||||
|
|
@ -43,6 +51,22 @@ __FBSDID("$FreeBSD$");
|
|||
*/
|
||||
/* LINTSTUB: Func: void bzero(void *, size_t) */
|
||||
ENTRY(bzero)
|
||||
ldr r3, .L_arm_bzero
|
||||
ldr r3, [r3]
|
||||
cmp r3, #0
|
||||
beq .Lnormal0
|
||||
ldr r2, .L_min_bzero_size
|
||||
ldr r2, [r2]
|
||||
cmp r1, r2
|
||||
blt .Lnormal0
|
||||
stmfd sp!, {r0, r1, lr}
|
||||
mov r2, #0
|
||||
mov lr, pc
|
||||
mov pc, r3
|
||||
cmp r0, #0
|
||||
ldmfd sp!, {r0, r1, lr}
|
||||
RETeq
|
||||
.Lnormal0:
|
||||
mov r3, #0x00
|
||||
b do_memset
|
||||
|
||||
|
|
@ -847,6 +871,23 @@ ENTRY(memmove)
|
|||
#if !defined(__XSCALE__)
|
||||
ENTRY(memcpy)
|
||||
/* save leaf functions having to store this away */
|
||||
ldr r3, .L_arm_memcpy
|
||||
ldr r3, [r3]
|
||||
cmp r3, #0
|
||||
beq .Lnormal
|
||||
ldr r3, .L_min_memcpy_size
|
||||
ldr r3, [r3]
|
||||
cmp r2, r3
|
||||
blt .Lnormal
|
||||
stmfd sp!, {r0-r2, r4, lr}
|
||||
mov r3, #0
|
||||
ldr r4, .L_arm_memcpy
|
||||
mov lr, pc
|
||||
ldr pc, [r4]
|
||||
cmp r0, #0
|
||||
ldmfd sp!, {r0-r2, r4, lr}
|
||||
RETeq
|
||||
|
||||
stmdb sp!, {r0, lr} /* memcpy() returns dest addr */
|
||||
|
||||
subs r2, r2, #4
|
||||
|
|
@ -1054,6 +1095,23 @@ ENTRY(memcpy)
|
|||
pld [r1]
|
||||
cmp r2, #0x0c
|
||||
ble .Lmemcpy_short /* <= 12 bytes */
|
||||
ldr r3, .L_arm_memcpy
|
||||
ldr r3, [r3]
|
||||
cmp r3, #0
|
||||
beq .Lnormal
|
||||
ldr r3, .L_min_memcpy_size
|
||||
ldr r3, [r3]
|
||||
cmp r2, r3
|
||||
blt .Lnormal
|
||||
stmfd sp!, {r0-r2, r4, lr}
|
||||
mov r3, #0
|
||||
ldr r4, .L_arm_memcpy
|
||||
mov lr, pc
|
||||
ldr pc, [r4]
|
||||
cmp r0, #0
|
||||
ldmfd sp!, {r0-r2, r4, lr}
|
||||
RETeq
|
||||
.Lnormal:
|
||||
mov r3, r0 /* We must not clobber r0 */
|
||||
|
||||
/* Word-align the destination buffer */
|
||||
|
|
|
|||
|
|
@ -36,4 +36,14 @@
|
|||
extern char sigcode[];
|
||||
extern int szsigcode;
|
||||
|
||||
extern int (*_arm_memcpy)(void *, void *, int, int);
|
||||
extern int (*_arm_bzero)(void *, int, int);
|
||||
|
||||
extern int _min_memcpy_size;
|
||||
extern int _min_bzero_size;
|
||||
|
||||
#define DST_IS_USER 0x1
|
||||
#define SRC_IS_USER 0x2
|
||||
#define IS_PHYSICAL 0x4
|
||||
|
||||
#endif /* !_MACHINE_MD_VAR_H_ */
|
||||
|
|
|
|||
Loading…
Reference in a new issue