2005-04-17 02:20:36 +04:00
/*
2005-11-04 02:20:27 +03:00
* TLB shootdown specifics for powerpc
2005-04-17 02:20:36 +04:00
*
2005-11-04 02:20:27 +03:00
* Copyright ( C ) 2002 Anton Blanchard , IBM Corp .
2005-04-17 02:20:36 +04:00
* Copyright ( C ) 2002 Paul Mackerras , IBM Corp .
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version
* 2 of the License , or ( at your option ) any later version .
*/
2005-11-04 02:20:27 +03:00
# ifndef _ASM_POWERPC_TLB_H
# define _ASM_POWERPC_TLB_H
2005-12-17 00:43:46 +03:00
# ifdef __KERNEL__
2005-04-17 02:20:36 +04:00
2005-11-04 02:20:27 +03:00
# ifndef __powerpc64__
2005-04-17 02:20:36 +04:00
# include <asm/pgtable.h>
2005-11-04 02:20:27 +03:00
# endif
2005-04-17 02:20:36 +04:00
# include <asm/pgalloc.h>
# include <asm/tlbflush.h>
2005-11-04 02:20:27 +03:00
# ifndef __powerpc64__
2005-04-17 02:20:36 +04:00
# include <asm/page.h>
# include <asm/mmu.h>
2005-11-04 02:20:27 +03:00
# endif
2005-04-17 02:20:36 +04:00
2007-10-03 00:30:04 +04:00
# include <linux/pagemap.h>
2005-04-17 02:20:36 +04:00
struct mmu_gather ;
2005-11-04 02:20:27 +03:00
# define tlb_start_vma(tlb, vma) do { } while (0)
# define tlb_end_vma(tlb, vma) do { } while (0)
# if !defined(CONFIG_PPC_STD_MMU)
# define tlb_flush(tlb) flush_tlb_mm((tlb)->mm)
# elif defined(__powerpc64__)
extern void pte_free_finish ( void ) ;
static inline void tlb_flush ( struct mmu_gather * tlb )
{
2007-05-27 09:18:22 +04:00
struct ppc64_tlb_batch * tlbbatch = & __get_cpu_var ( ppc64_tlb_batch ) ;
/* If there's a TLB batch pending, then we must flush it because the
* pages are going to be freed and we really don ' t want to have a CPU
* access a freed page because it has a stale TLB
*/
if ( tlbbatch - > index )
__flush_tlb_pending ( tlbbatch ) ;
2005-11-04 02:20:27 +03:00
pte_free_finish ( ) ;
}
# else
2005-04-17 02:20:36 +04:00
extern void tlb_flush ( struct mmu_gather * tlb ) ;
2005-11-04 02:20:27 +03:00
# endif
2005-04-17 02:20:36 +04:00
/* Get the generic bits... */
# include <asm-generic/tlb.h>
2005-11-04 02:20:27 +03:00
# if !defined(CONFIG_PPC_STD_MMU) || defined(__powerpc64__)
# define __tlb_remove_tlb_entry(tlb, pte, address) do { } while (0)
2005-04-17 02:20:36 +04:00
2005-11-04 02:20:27 +03:00
# else
2005-04-17 02:20:36 +04:00
extern void flush_hash_entry ( struct mm_struct * mm , pte_t * ptep ,
unsigned long address ) ;
static inline void __tlb_remove_tlb_entry ( struct mmu_gather * tlb , pte_t * ptep ,
unsigned long address )
{
if ( pte_val ( * ptep ) & _PAGE_HASHPTE )
flush_hash_entry ( tlb - > mm , ptep , address ) ;
}
2005-11-04 02:20:27 +03:00
# endif
2005-12-17 00:43:46 +03:00
# endif /* __KERNEL__ */
2005-11-04 02:20:27 +03:00
# endif /* __ASM_POWERPC_TLB_H */