URL
https://opencores.org/ocsvn/c0or1k/c0or1k/trunk
Subversion Repositories c0or1k
[/] [c0or1k/] [trunk/] [src/] [arch/] [arm/] [v5/] [mmu_ops.S.ARM] - Rev 6
Compare with Previous | Blame | View Log
/** low-level mmu operations** Copyright (C) 2007 Bahadir Balban*/#include INC_ARCH(asm.h)#define C15_id c0#define C15_control c1#define C15_ttb c2#define C15_dom c3#define C15_fsr c5#define C15_far c6#define C15_tlb c8#define C15_C0_M 0x0001 /* MMU */#define C15_C0_A 0x0002 /* Alignment */#define C15_C0_C 0x0004 /* (D) Cache */#define C15_C0_W 0x0008 /* Write buffer */#define C15_C0_B 0x0080 /* Endianness */#define C15_C0_S 0x0100 /* System */#define C15_C0_R 0x0200 /* ROM */#define C15_C0_Z 0x0800 /* Branch Prediction */#define C15_C0_I 0x1000 /* I cache */#define C15_C0_V 0x2000 /* High vectors *//* FIXME: Make sure the ops that need r0 dont trash r0, or if they do,* save it on stack before these operations.*//** In ARM terminology, flushing the cache means invalidating its contents.* Cleaning the cache means, writing the contents of the cache back to* main memory. In write-back caches the cache must be cleaned before* flushing otherwise in-cache data is lost.*/BEGIN_PROC(arm_set_ttb)mcr p15, 0, r0, C15_ttb, c0, 0mov pc, lrEND_PROC(arm_set_ttb)BEGIN_PROC(arm_get_domain)mrc p15, 0, r0, C15_dom, c0, 0mov pc, lrEND_PROC(arm_get_domain)BEGIN_PROC(arm_set_domain)mcr p15, 0, r0, C15_dom, c0, 0mov pc, lrEND_PROC(arm_set_domain)BEGIN_PROC(arm_enable_mmu)mrc p15, 0, r0, C15_control, c0, 0orr r0, r0, #C15_C0_Mmcr p15, 0, r0, C15_control, c0, 0mov pc, lrEND_PROC(arm_enable_mmu)BEGIN_PROC(arm_enable_icache)mrc p15, 0, r0, C15_control, c0, 0orr r0, r0, #C15_C0_Imcr p15, 0, r0, C15_control, c0, 0mov pc, lrEND_PROC(arm_enable_icache)BEGIN_PROC(arm_enable_dcache)mrc p15, 0, r0, C15_control, c0, 0orr r0, r0, #C15_C0_Cmcr p15, 0, r0, C15_control, c0, 0mov pc, lrEND_PROC(arm_enable_dcache)BEGIN_PROC(arm_enable_wbuffer)mrc p15, 0, r0, C15_control, c0, 0orr r0, r0, #C15_C0_Wmcr p15, 0, r0, C15_control, c0, 0mov pc, lrEND_PROC(arm_enable_wbuffer)BEGIN_PROC(arm_enable_high_vectors)mrc p15, 0, r0, C15_control, c0, 0orr r0, r0, #C15_C0_Vmcr p15, 0, r0, C15_control, c0, 0mov pc, lrEND_PROC(arm_enable_high_vectors)BEGIN_PROC(arm_invalidate_cache)mov r0, #0 @ FIX THISmcr p15, 0, r0, c7, c7, 0 @ Flush I cache and D cachemov pc, lrEND_PROC(arm_invalidate_cache)BEGIN_PROC(arm_invalidate_icache)mov r0, #0 @ FIX THISmcr p15, 0, r0, c7, c5, 0 @ Flush I cachemov pc, lrEND_PROC(arm_invalidate_icache)BEGIN_PROC(arm_invalidate_dcache)mov r0, #0 @ FIX THISmcr p15, 0, r0, c7, c6, 0 @ Flush D cachemov pc, lrEND_PROC(arm_invalidate_dcache)BEGIN_PROC(arm_clean_dcache)mrc p15, 0 , r15, c7, c10, 3 @ Test/clean dcache linebne arm_clean_dcachemcr p15, 0, ip, c7, c10, 4 @ Drain WBmov pc, lrEND_PROC(arm_clean_dcache)BEGIN_PROC(arm_clean_invalidate_dcache)1:mrc p15, 0, r15, c7, c14, 3 @ Test/clean/flush dcache line@ COMMENT: Why use PC?bne 1bmcr p15, 0, ip, c7, c10, 4 @ Drain WBmov pc, lrEND_PROC(arm_clean_invalidate_dcache)BEGIN_PROC(arm_clean_invalidate_cache)1:mrc p15, 0, r15, c7, c14, 3 @ Test/clean/flush dcache line@ COMMENT: Why use PC?bne 1bmcr p15, 0, ip, c7, c5, 0 @ Flush icachemcr p15, 0, ip, c7, c10, 4 @ Drain WBmov pc, lrEND_PROC(arm_clean_invalidate_cache)BEGIN_PROC(arm_drain_writebuffer)mov r0, #0 @ FIX THISmcr p15, 0, r0, c7, c10, 4mov pc, lrEND_PROC(arm_drain_writebuffer)BEGIN_PROC(arm_invalidate_tlb)mcr p15, 0, ip, c8, c7mov pc, lrEND_PROC(arm_invalidate_tlb)BEGIN_PROC(arm_invalidate_itlb)mov r0, #0 @ FIX THISmcr p15, 0, r0, c8, c5, 0mov pc, lrEND_PROC(arm_invalidate_itlb)BEGIN_PROC(arm_invalidate_dtlb)mov r0, #0 @ FIX THISmcr p15, 0, r0, c8, c6, 0mov pc, lrEND_PROC(arm_invalidate_dtlb)
