diff options
Diffstat (limited to 'arch/sparc/mm/vac-flush.c')
-rw-r--r-- | arch/sparc/mm/vac-flush.c | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/arch/sparc/mm/vac-flush.c b/arch/sparc/mm/vac-flush.c new file mode 100644 index 000000000..796366b53 --- /dev/null +++ b/arch/sparc/mm/vac-flush.c @@ -0,0 +1,94 @@ +/* vac.c: Routines for flushing various amount of the Sparc VAC + (virtual address cache). + + Copyright (C) 1994 David S. Miller (davem@caip.rutgers.edu) +*/ + +#include <asm/vac-ops.h> +#include <asm/page.h> + +/* Flush all VAC entries for the current context */ + +extern int vac_do_hw_vac_flushes, vac_size, vac_linesize; +extern int vac_entries_per_context, vac_entries_per_segment; +extern int vac_entries_per_page; + +void +flush_vac_context() +{ + register int entries_left, offset; + register char* address; + + entries_left = vac_entries_per_context; + address = (char *) 0; + + if(vac_do_hw_vac_flushes) + { + while(entries_left-- >=0) + { + hw_flush_vac_context_entry(address); + address += PAGE_SIZE; + } + } + else + { + offset = vac_linesize; + while(entries_left-- >=0) + { + sw_flush_vac_context_entry(address); + address += offset; + } + } +} + +void +flush_vac_segment(register unsigned int segment) +{ + register int entries_left, offset; + register char* address = (char *) 0; + + entries_left = vac_entries_per_segment; + __asm__ __volatile__("sll %0, 18, %1\n\t" + "sra %1, 0x2, %1\n\t" + : "=r" (segment) : "0" (address)); + + if(vac_do_hw_vac_flushes) + { + while(entries_left-- >=0) + { + hw_flush_vac_segment_entry(address); + address += PAGE_SIZE; + } + } + else + { + offset = vac_linesize; + while(entries_left-- >=0) + { + sw_flush_vac_segment_entry(address); + address += offset; + } + } +} + +void +flush_vac_page(register unsigned int addr) +{ + register int entries_left, offset; + + if(vac_do_hw_vac_flushes) + { + hw_flush_vac_page_entry((unsigned long *) addr); + } + else + { + entries_left = vac_entries_per_page; + offset = vac_linesize; + while(entries_left-- >=0) + { + sw_flush_vac_page_entry((unsigned long *) addr); + addr += offset; + } + } +} + |