47 lines
		
	
	
		
			992 B
		
	
	
	
		
			ArmAsm
		
	
	
		
		
			
		
	
	
			47 lines
		
	
	
		
			992 B
		
	
	
	
		
			ArmAsm
		
	
	
| 
								 | 
							
								    .file "cpu-ppc.linux.S"
							 | 
						||
| 
								 | 
							
								    .section ".text"
							 | 
						||
| 
								 | 
							
								    .align 2
							 | 
						||
| 
								 | 
							
								    .globl flush_icache
							 | 
						||
| 
								 | 
							
								    .type flush_icache, @function
							 | 
						||
| 
								 | 
							
								flush_icache:
							 | 
						||
| 
								 | 
							
								    add 4,4,3     # end += ptr
							 | 
						||
| 
								 | 
							
								#ifdef _ARCH_PPC64
							 | 
						||
| 
								 | 
							
								    clrrdi 3,3,5  # ptr &= ~0x1f
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    clrrwi 3,3,5  # ptr &= ~0x1f
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    sub 4,4,3     # end -= aligned_ptr
							 | 
						||
| 
								 | 
							
								    addi 4,4,0x1f # end += 0x1f
							 | 
						||
| 
								 | 
							
								#ifdef _ARCH_PPC64
							 | 
						||
| 
								 | 
							
								    srdi. 4,4,5   # end >>= 5, set cr
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    srwi. 4,4,5   # end >>= 5, set cr
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    beqlr
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Loop over the buffer by cache line and flush the data cache.
							 | 
						||
| 
								 | 
							
								    mr 5,3
							 | 
						||
| 
								 | 
							
								    mtctr 4
							 | 
						||
| 
								 | 
							
								loop1:
							 | 
						||
| 
								 | 
							
								    dcbst 0,5
							 | 
						||
| 
								 | 
							
								    addi 5,5,0x20
							 | 
						||
| 
								 | 
							
								    bdnz loop1
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Synchronize to ensure the cache line flushes are complete.
							 | 
						||
| 
								 | 
							
								    sync
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Loop over the buffer by cache line and flush the instruction cache.
							 | 
						||
| 
								 | 
							
								    mr 5,3
							 | 
						||
| 
								 | 
							
								    mtctr 4
							 | 
						||
| 
								 | 
							
								loop2:
							 | 
						||
| 
								 | 
							
								    icbi 0,5
							 | 
						||
| 
								 | 
							
								    addi 5,5,0x20
							 | 
						||
| 
								 | 
							
								    bdnz loop2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Clear instruction pipeline to force reloading of instructions.
							 | 
						||
| 
								 | 
							
								    isync
							 | 
						||
| 
								 | 
							
								    blr
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    .size flush_icache,.-flush_icache
							 | 
						||
| 
								 | 
							
								    .section .note.GNU-stack,"",@progbits
							 |