diff options
Diffstat (limited to 'arch/sh/mm/tlb-urb.c')
| -rw-r--r-- | arch/sh/mm/tlb-urb.c | 22 | 
1 files changed, 17 insertions, 5 deletions
diff --git a/arch/sh/mm/tlb-urb.c b/arch/sh/mm/tlb-urb.c index bb5b9098956..c92ce20db39 100644 --- a/arch/sh/mm/tlb-urb.c +++ b/arch/sh/mm/tlb-urb.c @@ -24,13 +24,9 @@ void tlb_wire_entry(struct vm_area_struct *vma, unsigned long addr, pte_t pte)  	local_irq_save(flags); -	/* Load the entry into the TLB */ -	__update_tlb(vma, addr, pte); - -	/* ... and wire it up. */  	status = __raw_readl(MMUCR);  	urb = (status & MMUCR_URB) >> MMUCR_URB_SHIFT; -	status &= ~MMUCR_URB; +	status &= ~MMUCR_URC;  	/*  	 * Make sure we're not trying to wire the last TLB entry slot. @@ -39,7 +35,23 @@ void tlb_wire_entry(struct vm_area_struct *vma, unsigned long addr, pte_t pte)  	urb = urb % MMUCR_URB_NENTRIES; +	/* +	 * Insert this entry into the highest non-wired TLB slot (via +	 * the URC field). +	 */ +	status |= (urb << MMUCR_URC_SHIFT); +	__raw_writel(status, MMUCR); +	ctrl_barrier(); + +	/* Load the entry into the TLB */ +	__update_tlb(vma, addr, pte); + +	/* ... and wire it up. */ +	status = __raw_readl(MMUCR); + +	status &= ~MMUCR_URB;  	status |= (urb << MMUCR_URB_SHIFT); +  	__raw_writel(status, MMUCR);  	ctrl_barrier();  |