2019-05-27 08:55:01 +02:00
// SPDX-License-Identifier: GPL-2.0-or-later
2009-05-26 16:30:14 +02:00
/*
* This file contains the routines for handling the MMU .
*
* Copyright ( C ) 2007 Xilinx , Inc . All rights reserved .
*
* Derived from arch / ppc / mm / 4 xx_mmu . c :
* - - paulus
*
* Derived from arch / ppc / mm / init . c :
* Copyright ( C ) 1995 - 1996 Gary Thomas ( gdt @ linuxppc . org )
*
* Modifications by Paul Mackerras ( PowerMac ) ( paulus @ cs . anu . edu . au )
* and Cort Dougan ( PReP ) ( cort @ cs . nmt . edu )
* Copyright ( C ) 1996 Paul Mackerras
* Amiga / APUS changes by Jesper Skov ( jskov @ cygnus . co . uk ) .
*
* Derived from " arch/i386/mm/init.c "
* Copyright ( C ) 1991 , 1992 , 1993 , 1994 Linus Torvalds
*/
# include <linux/mm.h>
# include <linux/init.h>
# include <asm/tlbflush.h>
# include <asm/mmu_context.h>
mm_context_t next_mmu_context ;
unsigned long context_map [ LAST_CONTEXT / BITS_PER_LONG + 1 ] ;
atomic_t nr_free_contexts ;
struct mm_struct * context_mm [ LAST_CONTEXT + 1 ] ;
/*
* Initialize the context management stuff .
*/
void __init mmu_context_init ( void )
{
/*
* The use of context zero is reserved for the kernel .
* This code assumes FIRST_CONTEXT < 32.
*/
context_map [ 0 ] = ( 1 < < FIRST_CONTEXT ) - 1 ;
next_mmu_context = FIRST_CONTEXT ;
atomic_set ( & nr_free_contexts , LAST_CONTEXT - FIRST_CONTEXT + 1 ) ;
}
/*
* Steal a context from a task that has one at the moment .
*
* This isn ' t an LRU system , it just frees up each context in
* turn ( sort - of pseudo - random replacement : ) . This would be the
* place to implement an LRU scheme if anyone were motivated to do it .
*/
void steal_context ( void )
{
struct mm_struct * mm ;
/* free up context `next_mmu_context' */
/* if we shouldn't free context 0, don't... */
if ( next_mmu_context < FIRST_CONTEXT )
next_mmu_context = FIRST_CONTEXT ;
mm = context_mm [ next_mmu_context ] ;
flush_tlb_mm ( mm ) ;
destroy_context ( mm ) ;
}