• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6/arch/sh/include/asm/
1#ifndef __ASM_SH_MMU_CONTEXT_64_H
2#define __ASM_SH_MMU_CONTEXT_64_H
3
4/*
5 * sh64-specific mmu_context interface.
6 *
7 * Copyright (C) 2000, 2001  Paolo Alberelli
8 * Copyright (C) 2003 - 2007  Paul Mundt
9 *
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
12 * for more details.
13 */
14#include <cpu/registers.h>
15#include <asm/cacheflush.h>
16
17#define SR_ASID_MASK		0xffffffffff00ffffULL
18#define SR_ASID_SHIFT		16
19
20/*
21 * Destroy context related info for an mm_struct that is about
22 * to be put to rest.
23 */
24static inline void destroy_context(struct mm_struct *mm)
25{
26	/* Well, at least free TLB entries */
27	flush_tlb_mm(mm);
28}
29
30static inline unsigned long get_asid(void)
31{
32	unsigned long long sr;
33
34	asm volatile ("getcon   " __SR ", %0\n\t"
35		      : "=r" (sr));
36
37	sr = (sr >> SR_ASID_SHIFT) & MMU_CONTEXT_ASID_MASK;
38	return (unsigned long) sr;
39}
40
41/* Set ASID into SR */
42static inline void set_asid(unsigned long asid)
43{
44	unsigned long long sr, pc;
45
46	asm volatile ("getcon	" __SR ", %0" : "=r" (sr));
47
48	sr = (sr & SR_ASID_MASK) | (asid << SR_ASID_SHIFT);
49
50	/*
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
54	 * reference.
55	 */
56	asm volatile ("movi	1, %1\n\t"
57		      "shlli	%1, 28, %1\n\t"
58		      "or	%0, %1, %1\n\t"
59		      "putcon	%1, " __SR "\n\t"
60		      "putcon	%0, " __SSR "\n\t"
61		      "movi	1f, %1\n\t"
62		      "ori	%1, 1 , %1\n\t"
63		      "putcon	%1, " __SPC "\n\t"
64		      "rte\n"
65		      "1:\n\t"
66		      : "=r" (sr), "=r" (pc) : "0" (sr));
67}
68
69/* arch/sh/kernel/cpu/sh5/entry.S */
70extern unsigned long switch_and_save_asid(unsigned long new_asid);
71
72/* No spare register to twiddle, so use a software cache */
73extern pgd_t *mmu_pdtp_cache;
74
75#define set_TTB(pgd)	(mmu_pdtp_cache = (pgd))
76#define get_TTB()	(mmu_pdtp_cache)
77
78#endif /* __ASM_SH_MMU_CONTEXT_64_H */
79