Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 36015
b: refs/heads/master
c: f650279
h: refs/heads/master
i:
  36013: fd2520a
  36011: 57a6599
  36007: 8ca215b
  35999: 31dd17c
v: v3
  • Loading branch information
Atsushi Nemoto authored and Ralf Baechle committed Sep 27, 2006
1 parent c648eeb commit aa0f799
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 28 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a94d702049569401c65b579d0751ce282f962b41
refs/heads/master: f6502791d780b22fc147150137704a07a05ba361
4 changes: 2 additions & 2 deletions trunk/arch/mips/mm/c-r4k.c
Original file line number Diff line number Diff line change
Expand Up @@ -475,7 +475,7 @@ static inline void local_r4k_flush_cache_page(void *args)
}
}
if (exec) {
if (cpu_has_vtag_icache) {
if (cpu_has_vtag_icache && mm == current->active_mm) {
int cpu = smp_processor_id();

if (cpu_context(cpu, mm) != 0)
Expand Down Expand Up @@ -599,7 +599,7 @@ static inline void local_r4k_flush_icache_page(void *args)
* We're not sure of the virtual address(es) involved here, so
* we have to flush the entire I-cache.
*/
if (cpu_has_vtag_icache) {
if (cpu_has_vtag_icache && vma->vm_mm == current->active_mm) {
int cpu = smp_processor_id();

if (cpu_context(cpu, vma->vm_mm) != 0)
Expand Down
56 changes: 31 additions & 25 deletions trunk/arch/mips/mm/c-sb1.c
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,26 @@ static inline void __sb1_flush_icache_all(void)
}
}

/*
* Invalidate a range of the icache. The addresses are virtual, and
* the cache is virtually indexed and tagged. However, we don't
* necessarily have the right ASID context, so use index ops instead
* of hit ops.
*/
static inline void __sb1_flush_icache_range(unsigned long start,
unsigned long end)
{
start &= ~(icache_line_size - 1);
end = (end + icache_line_size - 1) & ~(icache_line_size - 1);

while (start != end) {
cache_set_op(Index_Invalidate_I, start & icache_index_mask);
start += icache_line_size;
}
mispredict();
sync();
}

/*
* Flush the icache for a given physical page. Need to writeback the
* dcache first, then invalidate the icache. If the page isn't
Expand All @@ -173,8 +193,11 @@ static void local_sb1_flush_cache_page(struct vm_area_struct *vma, unsigned long
/*
* Bumping the ASID is probably cheaper than the flush ...
*/
if (cpu_context(cpu, vma->vm_mm) != 0)
drop_mmu_context(vma->vm_mm, cpu);
if (vma->vm_mm == current->active_mm) {
if (cpu_context(cpu, vma->vm_mm) != 0)
drop_mmu_context(vma->vm_mm, cpu);
} else
__sb1_flush_icache_range(addr, addr + PAGE_SIZE);
}

#ifdef CONFIG_SMP
Expand Down Expand Up @@ -210,26 +233,6 @@ void sb1_flush_cache_page(struct vm_area_struct *vma, unsigned long addr, unsign
__attribute__((alias("local_sb1_flush_cache_page")));
#endif

/*
* Invalidate a range of the icache. The addresses are virtual, and
* the cache is virtually indexed and tagged. However, we don't
* necessarily have the right ASID context, so use index ops instead
* of hit ops.
*/
static inline void __sb1_flush_icache_range(unsigned long start,
unsigned long end)
{
start &= ~(icache_line_size - 1);
end = (end + icache_line_size - 1) & ~(icache_line_size - 1);

while (start != end) {
cache_set_op(Index_Invalidate_I, start & icache_index_mask);
start += icache_line_size;
}
mispredict();
sync();
}


/*
* Invalidate all caches on this CPU
Expand Down Expand Up @@ -326,9 +329,12 @@ static void local_sb1_flush_icache_page(struct vm_area_struct *vma,
* If there's a context, bump the ASID (cheaper than a flush,
* since we don't know VAs!)
*/
if (cpu_context(cpu, vma->vm_mm) != 0) {
drop_mmu_context(vma->vm_mm, cpu);
}
if (vma->vm_mm == current->active_mm) {
if (cpu_context(cpu, vma->vm_mm) != 0)
drop_mmu_context(vma->vm_mm, cpu);
} else
__sb1_flush_icache_range(start, start + PAGE_SIZE);

}

#ifdef CONFIG_SMP
Expand Down

0 comments on commit aa0f799

Please sign in to comment.