Commit 59615ecd authored by Paul Mundt's avatar Paul Mundt

sh: Provide a global TLB flush for U/I-TLB clear.

This provides a sledgehammer approach for clearing the TLBs, only to be
used in cases where we know we will never want to use the mappings again
and have no interest in preserving state. This also destroys wired
entries.

The primary use for this is when we are either entering or exiting the
kernel completely, in the latter case as a precursor for CPU reset by
MMU.
Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent ae9b12c7
...@@ -21,6 +21,8 @@ extern void local_flush_tlb_kernel_range(unsigned long start, ...@@ -21,6 +21,8 @@ extern void local_flush_tlb_kernel_range(unsigned long start,
unsigned long end); unsigned long end);
extern void local_flush_tlb_one(unsigned long asid, unsigned long page); extern void local_flush_tlb_one(unsigned long asid, unsigned long page);
extern void __flush_tlb_global(void);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
extern void flush_tlb_all(void); extern void flush_tlb_all(void);
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <asm/addrspace.h> #include <asm/addrspace.h>
#include <asm/reboot.h> #include <asm/reboot.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/tlbflush.h>
void (*pm_power_off)(void); void (*pm_power_off)(void);
EXPORT_SYMBOL(pm_power_off); EXPORT_SYMBOL(pm_power_off);
...@@ -25,6 +26,9 @@ static void native_machine_restart(char * __unused) ...@@ -25,6 +26,9 @@ static void native_machine_restart(char * __unused)
{ {
local_irq_disable(); local_irq_disable();
/* Destroy all of the TLBs in preparation for reset by MMU */
__flush_tlb_global();
/* Address error with SR.BL=1 first. */ /* Address error with SR.BL=1 first. */
trigger_address_error(); trigger_address_error();
......
...@@ -119,3 +119,19 @@ void local_flush_tlb_mm(struct mm_struct *mm) ...@@ -119,3 +119,19 @@ void local_flush_tlb_mm(struct mm_struct *mm)
local_irq_restore(flags); local_irq_restore(flags);
} }
} }
void __flush_tlb_global(void)
{
unsigned long flags;
local_irq_save(flags);
/*
* This is the most destructive of the TLB flushing options,
* and will tear down all of the UTLB/ITLB mappings, including
* wired entries.
*/
__raw_writel(__raw_readl(MMUCR) | MMUCR_TI, MMUCR);
local_irq_restore(flags);
}
...@@ -455,6 +455,11 @@ void local_flush_tlb_kernel_range(unsigned long start, unsigned long end) ...@@ -455,6 +455,11 @@ void local_flush_tlb_kernel_range(unsigned long start, unsigned long end)
flush_tlb_all(); flush_tlb_all();
} }
void __flush_tlb_global(void)
{
flush_tlb_all();
}
void __update_tlb(struct vm_area_struct *vma, unsigned long address, pte_t pte) void __update_tlb(struct vm_area_struct *vma, unsigned long address, pte_t pte)
{ {
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment