CACHE & TLB (三)

source code

ARM926EJS为例分析,

主要的代码位于arch/arm/mm/cache-arm926.sarch/arm/mm/proc-arm926.s

1. cache和tlb的定义

 

#ifdef MULTI_CACHE

 

ENTRY(\name\()_cache_fns)

            .long    \name\()_flush_icache_all

            .long    \name\()_flush_kern_cache_all

            .long    \name\()_flush_user_cache_all

            .long    \name\()_flush_user_cache_range

            .long    \name\()_coherent_kern_range

            .long    \name\()_coherent_user_range

            .long    \name\()_flush_kern_dcache_area

            .long    \name\()_dma_map_area

            .long    \name\()_dma_unmap_area

            .long    \name\()_dma_inv_range

            .long    \name\()_dma_clean_range

            .long    \name\()_dma_flush_range

            .size     \name\()_cache_fns, . - \name\()_cache_fns

.endm

 

 

/*

 * thecache line size of the I and D cache

 */

#define CACHE_DLINESIZE          32

 

/*

 *         MM Cache Management

 *         ===================

 *

 *         The arch/arm/mm/cache-*.S andarch/arm/mm/proc-*.S files

 *         implement these methods.

 *

 *         Start addresses are inclusive and endaddresses are exclusive;

 *         start addresses should be rounded down,end addresses up.

 *

 *         See Documentation/cachetlb.txt for moreinformation.

 *         Please note that the implementation ofthese, and the required

 *         effects are cache-type (VIVT/VIPT/PIPT)specific.

 *

 *         flush_icache_all()

 *

 *                     Unconditionally clean andinvalidate the entire icache.

 *                     Currently only needed forcache-v6.S and cache-v7.S, see

 *                     __flush_icache_all for thegeneric implementation.

 *

 *         flush_kern_all()

 *

 *                     Unconditionally clean andinvalidate the entire cache.

 *

 *         flush_user_all()

 *

 *                     Clean and invalidate all userspace cache entries

 *                     before a change of pagetables.

 *

 *         flush_user_range(start, end, flags)

 *

 *                     Clean and invalidate arange of cache entries in the

 *                     specified address spacebefore a change of page tables.

 *                     - start - user startaddress (inclusive, page aligned)

 *                     - end   - user end address   (exclusive, page aligned)

 *                     - flags - vma->vm_flagsfield

 *

 *         coherent_kern_range(start, end)

 *

 *                     Ensure coherency betweenthe Icache and the Dcache in the

 *                     region described by start, end.  If you have non-snooping

 *                     Harvard caches, you need toimplement this function.

 *                     - start  - virtual start address

 *                     - end    - virtual end address

 *

 *         coherent_user_range(start, end)

 *

 *                     Ensure coherency betweenthe Icache and the Dcache in the

 *                     region described by start,end.  If you have non-snooping

 *                     Harvard caches, you need toimplement this function.

 *                     - start  - virtual start address

 *                     - end    - virtual end address

 *

 *         flush_kern_dcache_area(kaddr, size)

 *

 *                     Ensure that the data heldin page is written back.

 *                     - kaddr  - page address

 *                     - size   - region size

 *

 *         DMA Cache Coherency

 *         ===================

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ARM实验 仅供参考;//===================================================================== ;// File Name : 2410slib.s ;// Function : S3C2410 (Assembly) ;// Program : Shin, On Pil (SOP) ;// Date : March 20, 2002 ;// Version : 0.0 ;// History ;// 0.0 : Programming start (February 26,2002) -> SOP ;//===================================================================== ;//Interrupt, FIQ/IRQ disable NOINT EQU 0xc0 ;//1100 0000 ;//Check if tasm.exe(armasm -16 ...@ADS 1.0) is used. GBLL THUMBCODE [ {CONFIG} = 16 THUMBCODE SETL {TRUE} CODE32 | THUMBCODE SETL {FALSE} ] MACRO MOV_PC_LR [ THUMBCODE bx lr | mov pc,lr ] MEND AREA |C$$code|, CODE, READONLY ;//============== ;// CPSR I,F bit ;//============== ;//int SET_IF(void); ;//The return value is current CPSR. EXPORT SET_IF SET_IF ;//This function works only if the processor is in previliged mode. mrs r0,cpsr mov r1,r0 orr r1,r1,#NOINT msr cpsr_cxsf,r1 MOV_PC_LR ;//void WR_IF(int cpsrValue); EXPORT WR_IF WR_IF ;//This function works only if the processor is in previliged mode. msr cpsr_cxsf,r0 MOV_PC_LR ;//void CLR_IF(void); EXPORT CLR_IF CLR_IF ;//This function works only if the processor is in previliged mode. mrs r0,cpsr bic r0,r0,#NOINT msr cpsr_cxsf,r0 MOV_PC_LR ;//==================================== ;// MMU Cache/TLB/etc on/off functions ;//==================================== R1_I EQU (1<<12) R1_C EQU (1<<2) R1_A EQU (1<<1) R1_M EQU (1) R1_iA EQU (1<<31) R1_nF EQU (1<<30) ;//void MMU_EnableICache(void) EXPORT MMU_EnableICache MMU_EnableICache mrc p15,0,r0,c1,c0,0 orr r0,r0,#R1_I mcr p15,0,r0,c1,c0,0 MOV_PC_LR ;//void MMU_DisableICache(void) EXPORT MMU_DisableICache MMU_DisableICache mrc p15,0,r0,c1,c0,0 bic r0,r0,#R1_I mcr p15,0,r0,c1,c0,0 MOV_PC_LR ;//void MMU_EnableDCache(void) EXPORT MMU_EnableDCache MMU_EnableDCache mrc p15,0,r0,c1,c0,0 orr r0,r0,#R1_C mcr p15,0,r0,c1,c0,0 MOV_PC_LR ;//void MMU_DisableDCache(void) EXPORT MMU_DisableDCache MMU_DisableDCache mrc p15,0,r0,c1,c0,0 bic r0,r0,#R1_C mcr p15,0,r0,c1,c0,0 MOV_PC_LR ;//void MMU_EnableAlignFault(void) EXPORT MMU_EnableAlignFault MMU_EnableAlignFault mrc p15,0,r0,c1,c0,0 orr r0,r0,#R1_A mcr p15,0,r0,c1,c0,0 MOV_PC_LR ;//void MMU_DisableAlignFault(void) EXPORT MMU_DisableAlignFault MMU_DisableAlignFault mrc p15,0,r0,c1,c0,0 bic r0,r0,#R1_A mcr p15,0,r0,c1,c0,0 MOV_PC_LR ;//void MMU_EnableMMU(void) EXPORT MMU_EnableMMU MMU_EnableMMU mrc p15,0,r0,c1,c0,0 orr r0,r0,#R1_M mcr p15,0,r0,c1,c0,0 MOV_PC_LR ;//void MMU_DisableMMU(void) EXPORT MMU_DisableMMU MMU_DisableMMU mrc p15,0,r0,c1,c0,0 bic r0,r0,#R1_M mcr p15,0,r0,c1,c0,0 MOV_PC_LR ;//void MMU_SetFastBusMode(void) ;// FCLK:HCLK= 1:1 EXPORT MMU_SetFastBusMode MMU_SetFastBusMode mrc p15,0,r0,c1,c0,0 bic r0,r0,#R1_iA:OR:R1_nF mcr p15,0,r0,c1,c0,0 MOV_PC_LR ;//void MMU_SetAsyncBusMode(void) ;// FCLK:HCLK= 1:2 EXPORT MMU_SetAsyncBusMode MMU_SetAsyncBusMode mrc p15,0,r0,c1,c0,0 orr r0,r0,#R1_nF:OR:R1_iA mcr p15,0,r0,c1,c0,0 MOV_PC_LR ;//========================= ;// Set TTBase ;//========================= ;//void MMU_SetTTBase(int base) EXPORT MMU_SetTTBase MMU_SetTTBase ;//ro=TTBase mcr p15,0,r0,c2,c0,0 MOV_PC_LR ;//========================= ;// Set Domain ;//========================= ;//void MMU_SetDomain(int domain) EXPORT MMU_SetDomain MMU_SetDomain ;//ro=domain mcr p15,0,r0,c3,c0,0 MOV_PC_LR ;//========================= ;// ICache/DCache functions ;//========================= ;//void MMU_InvalidateIDCache(void) EXPORT MMU_InvalidateIDCache MMU_InvalidateIDCache mcr p15,0,r0,c7,c7,0 MOV_PC_LR ;//void MMU_InvalidateICache(void) EXPORT MMU_InvalidateICache MMU_InvalidateICache mcr p15,0,r0,c7,c5,0 MOV_PC_LR ;//void MMU_InvalidateICacheMVA(U32 mva) EXPORT MMU_InvalidateICacheMVA MMU_InvalidateICacheMVA ;//r0=mva mcr p15,0,r0,c7,c5,1 MOV_PC_LR ;//void MMU_PrefetchICacheMVA(U32 mva) EXPORT MMU_PrefetchICacheMVA MMU_PrefetchICacheMVA ;//r0=mva mcr p15,0,r0,c7,c13,1 MOV_PC_LR ;//void MMU_InvalidateDCache(void) EXPORT MMU_InvalidateDCache MMU_InvalidateDCache mcr p15,0,r0,c7,c6,0 MOV_PC_LR ;//void MMU_InvalidateDCacheMVA(U32 mva) EXPORT MMU_InvalidateDCacheMVA MMU_InvalidateDCacheMVA ;//r0=mva mcr p15,0,r0,c7,c6,1 MOV_PC_LR ;//void MMU_CleanDCacheMVA(U32 mva) EXPORT MMU_CleanDCacheMVA MMU_CleanDCacheMVA ;r0=mva mcr p15,0,r0,c7,c10,1 MOV_PC_LR ;//void MMU_CleanInvalidateDCacheMVA(U32 mva) EXPORT MMU_CleanInvalidateDCacheMVA MMU_CleanInvalidateDCacheMVA ;r0=mva mcr p15,0,r0,c7,c14,1 MOV_PC_LR ;//void MMU_CleanDCacheIndex(U32 index) EXPORT MMU_CleanDCacheIndex MMU_CleanDCacheIndex ;r0=index mcr p15,0,r0,c7,c10,2 MOV_PC_LR ;//void MMU_CleanInvalidateDCacheIndex(U32 index) EXPORT MMU_CleanInvalidateDCacheIndex MMU_CleanInvalidateDCacheIndex ;r0=index mcr p15,0,r0,c7,c14,2 MOV_PC_LR ;//void MMU_WaitForInterrupt(void) EXPORT MMU_WaitForInterrupt MMU_WaitForInterrupt mcr p15,0,r0,c7,c0,4 MOV_PC_LR ;//=============== ;// TLB functions ;//=============== ;//voic MMU_InvalidateTLB(void) EXPORT MMU_InvalidateTLB MMU_InvalidateTLB mcr p15,0,r0,c8,c7,0 MOV_PC_LR ;//void MMU_InvalidateITLB(void) EXPORT MMU_InvalidateITLB MMU_InvalidateITLB mcr p15,0,r0,c8,c5,0 MOV_PC_LR ;//void MMU_InvalidateITLBMVA(U32 mva) EXPORT MMU_InvalidateITLBMVA MMU_InvalidateITLBMVA ;//ro=mva mcr p15,0,r0,c8,c5,1 MOV_PC_LR ;//void MMU_InvalidateDTLB(void) EXPORT MMU_InvalidateDTLB MMU_InvalidateDTLB mcr p15,0,r0,c8,c6,0 MOV_PC_LR ;//void MMU_InvalidateDTLBMVA(U32 mva) EXPORT MMU_InvalidateDTLBMVA MMU_InvalidateDTLBMVA ;//r0=mva mcr p15,0,r0,c8,c6,1 MOV_PC_LR ;//================= ;// Cache lock down ;//================= ;//void MMU_SetDCacheLockdownBase(U32 base) EXPORT MMU_SetDCacheLockdownBase MMU_SetDCacheLockdownBase ;//r0= victim & lockdown base mcr p15,0,r0,c9,c0,0 MOV_PC_LR ;//void MMU_SetICacheLockdownBase(U32 base) EXPORT MMU_SetICacheLockdownBase MMU_SetICacheLockdownBase ;//r0= victim & lockdown base mcr p15,0,r0,c9,c0,1 MOV_PC_LR ;//================= ;// TLB lock down ;//================= ;//void MMU_SetDTLBLockdown(U32 baseVictim) EXPORT MMU_SetDTLBLockdown MMU_SetDTLBLockdown ;//r0= baseVictim mcr p15,0,r0,c10,c0,0 MOV_PC_LR ;//void MMU_SetITLBLockdown(U32 baseVictim) EXPORT MMU_SetITLBLockdown MMU_SetITLBLockdown ;//r0= baseVictim mcr p15,0,r0,c10,c0,1 MOV_PC_LR ;//============ ;// Process ID ;//============ ;//void MMU_SetProcessId(U32 pid) EXPORT MMU_SetProcessId MMU_SetProcessId ;//r0= pid mcr p15,0,r0,c13,c0,0 MOV_PC_LR END

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值