1/* MN10300 MMU context allocation and management 2 * 3 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. 4 * Written by David Howells (dhowells@redhat.com) 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public Licence 8 * as published by the Free Software Foundation; either version 9 * 2 of the Licence, or (at your option) any later version. 10 */ 11#include <linux/sched.h> 12#include <linux/mm.h> 13#include <asm/mmu_context.h> 14#include <asm/tlbflush.h> 15 16#ifdef CONFIG_MN10300_TLB_USE_PIDR 17/* 18 * list of the MMU contexts last allocated on each CPU 19 */ 20unsigned long mmu_context_cache[NR_CPUS] = { 21 [0 ... NR_CPUS - 1] = 22 MMU_CONTEXT_FIRST_VERSION * 2 - (1 - MMU_CONTEXT_TLBPID_LOCK_NR), 23}; 24#endif /* CONFIG_MN10300_TLB_USE_PIDR */ 25 26/* 27 * preemptively set a TLB entry 28 */ 29void update_mmu_cache(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep) 30{ 31 unsigned long pteu, ptel, cnx, flags; 32 pte_t pte = *ptep; 33 34 addr &= PAGE_MASK; 35 ptel = pte_val(pte) & ~(xPTEL_UNUSED1 | xPTEL_UNUSED2); 36 37 /* make sure the context doesn't migrate and defend against 38 * interference from vmalloc'd regions */ 39 local_irq_save(flags); 40 41 cnx = ~MMU_NO_CONTEXT; 42#ifdef CONFIG_MN10300_TLB_USE_PIDR 43 cnx = mm_context(vma->vm_mm); 44#endif 45 46 if (cnx != MMU_NO_CONTEXT) { 47 pteu = addr; 48#ifdef CONFIG_MN10300_TLB_USE_PIDR 49 pteu |= cnx & MMU_CONTEXT_TLBPID_MASK; 50#endif 51 if (!(pte_val(pte) & _PAGE_NX)) { 52 IPTEU = pteu; 53 if (IPTEL & xPTEL_V) 54 IPTEL = ptel; 55 } 56 DPTEU = pteu; 57 if (DPTEL & xPTEL_V) 58 DPTEL = ptel; 59 } 60 61 local_irq_restore(flags); 62} 63