1 #ifndef __ASM_SH_MMU_CONTEXT_64_H
2 #define __ASM_SH_MMU_CONTEXT_64_H
5 * sh64-specific mmu_context interface.
7 * Copyright (C) 2000, 2001 Paolo Alberelli
8 * Copyright (C) 2003 - 2007 Paul Mundt
10 * This file is subject to the terms and conditions of the GNU General Public
11 * License. See the file "COPYING" in the main directory of this archive
14 #include <cpu/registers.h>
15 #include <asm/cacheflush.h>
17 #define SR_ASID_MASK 0xffffffffff00ffffULL
18 #define SR_ASID_SHIFT 16
21 * Destroy context related info for an mm_struct that is about
24 static inline void destroy_context(struct mm_struct
*mm
)
26 /* Well, at least free TLB entries */
30 static inline unsigned long get_asid(void)
32 unsigned long long sr
;
34 asm volatile ("getcon " __SR
", %0\n\t"
37 sr
= (sr
>> SR_ASID_SHIFT
) & MMU_CONTEXT_ASID_MASK
;
38 return (unsigned long) sr
;
41 /* Set ASID into SR */
42 static inline void set_asid(unsigned long asid
)
44 unsigned long long sr
, pc
;
46 asm volatile ("getcon " __SR
", %0" : "=r" (sr
));
48 sr
= (sr
& SR_ASID_MASK
) | (asid
<< SR_ASID_SHIFT
);
51 * It is possible that this function may be inlined and so to avoid
52 * the assembler reporting duplicate symbols we make use of the
53 * gas trick of generating symbols using numerics and forward
56 asm volatile ("movi 1, %1\n\t"
57 "shlli %1, 28, %1\n\t"
59 "putcon %1, " __SR
"\n\t"
60 "putcon %0, " __SSR
"\n\t"
63 "putcon %1, " __SPC
"\n\t"
66 : "=r" (sr
), "=r" (pc
) : "0" (sr
));
69 /* arch/sh/kernel/cpu/sh5/entry.S */
70 extern unsigned long switch_and_save_asid(unsigned long new_asid
);
72 /* No spare register to twiddle, so use a software cache */
73 extern pgd_t
*mmu_pdtp_cache
;
75 #define set_TTB(pgd) (mmu_pdtp_cache = (pgd))
76 #define get_TTB() (mmu_pdtp_cache)
78 #endif /* __ASM_SH_MMU_CONTEXT_64_H */