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
					
				|  | @ -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…
	
		Reference in New Issue