git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			89 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| //++
 | |
| // Copyright (c) 2006, Intel Corporation                                                         
 | |
| // All rights reserved. This program and the accompanying materials                          
 | |
| // are licensed and made available under the terms and conditions of the BSD License         
 | |
| // which accompanies this distribution.  The full text of the license may be found at        
 | |
| // http://opensource.org/licenses/bsd-license.php                                            
 | |
| //                                                                                           
 | |
| // THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
 | |
| // WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
 | |
| // 
 | |
| //  Module Name:
 | |
| //
 | |
| //    IpfCpuCache.s
 | |
| //
 | |
| //  Abstract:
 | |
| //
 | |
| //    Contains Misc assembly procedures to support IPF CPU AP.
 | |
| //
 | |
| // Revision History:
 | |
| //
 | |
| //--
 | |
| 
 | |
| .file  "IpfCpuCache.s"
 | |
| 
 | |
| #include  "IpfMacro.i"
 | |
| #include  "IpfDefines.h"
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| //++
 | |
| // Flush Cache
 | |
| //
 | |
| // Arguments : 
 | |
| 
 | |
| // Input = in0 = Starting Address to Flush.
 | |
| // Input = in1 = Length in bytes.
 | |
| // Input = b0 = return branch register.
 | |
| // On Entry :
 | |
| //
 | |
| // Return Value: 
 | |
| //
 | |
| //  VOID
 | |
| //  SalFlushCache (
 | |
| //    IN UINT64   BaseToFlush,
 | |
| //    IN UINT64   LengthToFlush
 | |
| //    );
 | |
| //
 | |
| //--
 | |
| //---------------------------------------------------------------------------
 | |
| PROCEDURE_ENTRY (SalFlushCache)
 | |
| 
 | |
|       NESTED_SETUP (5,8,0,0)
 | |
|             
 | |
|       mov         loc2 = ar.lc
 | |
|       
 | |
|       mov         loc3 = in0                  // Start address.
 | |
|       mov         loc4 = in1;;                // Length in bytes.
 | |
|       
 | |
|       cmp.eq  p6,p7 = loc4, r0;;               // If Length is zero then don't flush any cache
 | |
|       (p6)  br.spnt.many DoneFlushingC;;         
 | |
|       
 | |
|       add         loc4 = loc4,loc3 
 | |
|       mov         loc5 = 1;;
 | |
|       sub         loc4 = loc4, loc5 ;; // the End address to flush
 | |
|                                          
 | |
|       dep         loc3 = r0,loc3,0,5          
 | |
|       dep         loc4 = r0,loc4,0,5;;         
 | |
|       shr         loc3 = loc3,5             
 | |
|       shr         loc4 = loc4,5;;    // 32 byte cache line
 | |
|       
 | |
|       sub         loc4 = loc4,loc3;; // total flush count, It should be add 1 but 
 | |
|                                      // the br.cloop will first execute one time 
 | |
|       mov         loc3 = in0                  
 | |
|       mov         loc5 = 32      
 | |
|       mov         ar.lc = loc4;;
 | |
| 
 | |
| StillFlushingC:
 | |
|       fc          loc3;; 
 | |
|       sync.i;;
 | |
|       srlz.i;;
 | |
|       add         loc3 = loc5,loc3;;
 | |
|       br.cloop.sptk.few StillFlushingC;;
 | |
| 
 | |
| DoneFlushingC:      
 | |
|       mov         ar.lc = loc2     
 | |
|       NESTED_RETURN
 | |
| 
 | |
| PROCEDURE_EXIT (SalFlushCache)
 | |
| 
 |