1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * This file contains the routines for handling the MMU. 4 * 5 * Copyright (C) 2007 Xilinx, Inc. All rights reserved. 6 * 7 * Derived from arch/ppc/mm/4xx_mmu.c: 8 * -- paulus 9 * 10 * Derived from arch/ppc/mm/init.c: 11 * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) 12 * 13 * Modifications by Paul Mackerras (PowerMac) (paulus@cs.anu.edu.au) 14 * and Cort Dougan (PReP) (cort@cs.nmt.edu) 15 * Copyright (C) 1996 Paul Mackerras 16 * Amiga/APUS changes by Jesper Skov (jskov@cygnus.co.uk). 17 * 18 * Derived from "arch/i386/mm/init.c" 19 * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds 20 */ 21 22 #include <linux/mm.h> 23 #include <linux/init.h> 24 25 #include <asm/tlbflush.h> 26 #include <asm/mmu_context.h> 27 28 mm_context_t next_mmu_context; 29 unsigned long context_map[LAST_CONTEXT / BITS_PER_LONG + 1]; 30 atomic_t nr_free_contexts; 31 struct mm_struct *context_mm[LAST_CONTEXT+1]; 32 33 /* 34 * Initialize the context management stuff. 35 */ 36 void __init mmu_context_init(void) 37 { 38 /* 39 * The use of context zero is reserved for the kernel. 40 * This code assumes FIRST_CONTEXT < 32. 41 */ 42 context_map[0] = (1 << FIRST_CONTEXT) - 1; 43 next_mmu_context = FIRST_CONTEXT; 44 atomic_set(&nr_free_contexts, LAST_CONTEXT - FIRST_CONTEXT + 1); 45 } 46 47 /* 48 * Steal a context from a task that has one at the moment. 49 * 50 * This isn't an LRU system, it just frees up each context in 51 * turn (sort-of pseudo-random replacement :). This would be the 52 * place to implement an LRU scheme if anyone were motivated to do it. 53 */ 54 void steal_context(void) 55 { 56 struct mm_struct *mm; 57 58 /* free up context `next_mmu_context' */ 59 /* if we shouldn't free context 0, don't... */ 60 if (next_mmu_context < FIRST_CONTEXT) 61 next_mmu_context = FIRST_CONTEXT; 62 mm = context_mm[next_mmu_context]; 63 flush_tlb_mm(mm); 64 destroy_context(mm); 65 } 66