mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-22 04:44:46 +00:00
arm64: memset-arm64: Use simple memset when cache is disabled
The optimized memset uses the dc opcode, which causes problems when the cache is disabled. This patch adds a check if the cache is disabled and uses a very simple memset implementation in this case. Otherwise the optimized version is used. Signed-off-by: Stefan Roese <sr@denx.de>
This commit is contained in:
parent
dbf6b14e0a
commit
1e43bb6732
1 changed files with 32 additions and 0 deletions
|
@ -11,6 +11,7 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include <asm/macro.h>
|
||||
#include "asmdefs.h"
|
||||
|
||||
#define dstin x0
|
||||
|
@ -25,6 +26,37 @@ ENTRY (memset)
|
|||
PTR_ARG (0)
|
||||
SIZE_ARG (2)
|
||||
|
||||
/*
|
||||
* The optimized memset uses the dc opcode, which causes problems
|
||||
* when the cache is disabled. Let's check if the cache is disabled
|
||||
* and use a very simple memset implementation in this case. Otherwise
|
||||
* jump to the optimized version.
|
||||
*/
|
||||
switch_el x6, 3f, 2f, 1f
|
||||
3: mrs x6, sctlr_el3
|
||||
b 0f
|
||||
2: mrs x6, sctlr_el2
|
||||
b 0f
|
||||
1: mrs x6, sctlr_el1
|
||||
0:
|
||||
tst x6, #CR_C
|
||||
bne 9f
|
||||
|
||||
/*
|
||||
* A very "simple" memset implementation without the use of the
|
||||
* dc opcode. Can be run with caches disabled.
|
||||
*/
|
||||
mov x3, #0x0
|
||||
cmp count, x3 /* check for zero length */
|
||||
beq 8f
|
||||
4: strb valw, [dstin, x3]
|
||||
add x3, x3, #0x1
|
||||
cmp count, x3
|
||||
bne 4b
|
||||
8: ret
|
||||
9:
|
||||
|
||||
/* Here the optimized memset version starts */
|
||||
dup v0.16B, valw
|
||||
add dstend, dstin, count
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue