| /* | 
 |  * vDSO provided cache flush routines | 
 |  * | 
 |  * Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org), | 
 |  *                    IBM Corp. | 
 |  * | 
 |  * This program is free software; you can redistribute it and/or | 
 |  * modify it under the terms of the GNU General Public License | 
 |  * as published by the Free Software Foundation; either version | 
 |  * 2 of the License, or (at your option) any later version. | 
 |  */ | 
 | #include <asm/processor.h> | 
 | #include <asm/ppc_asm.h> | 
 | #include <asm/vdso.h> | 
 | #include <asm/asm-offsets.h> | 
 |  | 
 | 	.text | 
 |  | 
 | /* | 
 |  * Default "generic" version of __kernel_sync_dicache. | 
 |  * | 
 |  * void __kernel_sync_dicache(unsigned long start, unsigned long end) | 
 |  * | 
 |  * Flushes the data cache & invalidate the instruction cache for the | 
 |  * provided range [start, end[ | 
 |  */ | 
 | V_FUNCTION_BEGIN(__kernel_sync_dicache) | 
 |   .cfi_startproc | 
 | 	mflr	r12 | 
 |   .cfi_register lr,r12 | 
 | 	mr	r11,r3 | 
 | 	bl	V_LOCAL_FUNC(__get_datapage) | 
 | 	mtlr	r12 | 
 | 	mr	r10,r3 | 
 |  | 
 | 	lwz	r7,CFG_DCACHE_BLOCKSZ(r10) | 
 | 	addi	r5,r7,-1 | 
 | 	andc	r6,r11,r5		/* round low to line bdy */ | 
 | 	subf	r8,r6,r4		/* compute length */ | 
 | 	add	r8,r8,r5		/* ensure we get enough */ | 
 | 	lwz	r9,CFG_DCACHE_LOGBLOCKSZ(r10) | 
 | 	srw.	r8,r8,r9		/* compute line count */ | 
 | 	crclr	cr0*4+so | 
 | 	beqlr				/* nothing to do? */ | 
 | 	mtctr	r8 | 
 | 1:	dcbst	0,r6 | 
 | 	add	r6,r6,r7 | 
 | 	bdnz	1b | 
 | 	sync | 
 |  | 
 | /* Now invalidate the instruction cache */ | 
 |  | 
 | 	lwz	r7,CFG_ICACHE_BLOCKSZ(r10) | 
 | 	addi	r5,r7,-1 | 
 | 	andc	r6,r11,r5		/* round low to line bdy */ | 
 | 	subf	r8,r6,r4		/* compute length */ | 
 | 	add	r8,r8,r5 | 
 | 	lwz	r9,CFG_ICACHE_LOGBLOCKSZ(r10) | 
 | 	srw.	r8,r8,r9		/* compute line count */ | 
 | 	crclr	cr0*4+so | 
 | 	beqlr				/* nothing to do? */ | 
 | 	mtctr	r8 | 
 | 2:	icbi	0,r6 | 
 | 	add	r6,r6,r7 | 
 | 	bdnz	2b | 
 | 	isync | 
 | 	li	r3,0 | 
 | 	blr | 
 |   .cfi_endproc | 
 | V_FUNCTION_END(__kernel_sync_dicache) | 
 |  | 
 |  | 
 | /* | 
 |  * POWER5 version of __kernel_sync_dicache | 
 |  */ | 
 | V_FUNCTION_BEGIN(__kernel_sync_dicache_p5) | 
 |   .cfi_startproc | 
 | 	crclr	cr0*4+so | 
 | 	sync | 
 | 	isync | 
 | 	li	r3,0 | 
 | 	blr | 
 |   .cfi_endproc | 
 | V_FUNCTION_END(__kernel_sync_dicache_p5) |