pgtable.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:21k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * This file is subject to the terms and conditions of the GNU General Public
  3.  * License.  See the file "COPYING" in the main directory of this archive
  4.  * for more details.
  5.  *
  6.  * Copyright (C) 1994, 95, 96, 97, 98, 99, 2000 by Ralf Baechle at alii
  7.  * Copyright (C) 1999 Silicon Graphics, Inc.
  8.  */
  9. #ifndef _ASM_PGTABLE_H
  10. #define _ASM_PGTABLE_H
  11. #include <asm/addrspace.h>
  12. #include <asm/page.h>
  13. #ifndef _LANGUAGE_ASSEMBLY
  14. #include <linux/linkage.h>
  15. #include <asm/cachectl.h>
  16. #include <linux/config.h>
  17. /* Cache flushing:
  18.  *
  19.  *  - flush_cache_all() flushes entire cache
  20.  *  - flush_cache_mm(mm) flushes the specified mm context's cache lines
  21.  *  - flush_cache_page(mm, vmaddr) flushes a single page
  22.  *  - flush_cache_range(mm, start, end) flushes a range of pages
  23.  *  - flush_page_to_ram(page) write back kernel page to ram
  24.  *  - flush_icache_range(start, end) flush a range of instructions
  25.  */
  26. extern void (*_flush_cache_all)(void);
  27. extern void (*___flush_cache_all)(void);
  28. extern void (*_flush_cache_mm)(struct mm_struct *mm);
  29. extern void (*_flush_cache_range)(struct mm_struct *mm, unsigned long start,
  30.  unsigned long end);
  31. extern void (*_flush_cache_page)(struct vm_area_struct *vma, unsigned long page);
  32. extern void (*_flush_cache_sigtramp)(unsigned long addr);
  33. extern void (*_flush_page_to_ram)(struct page * page);
  34. extern void (*_flush_icache_range)(unsigned long start, unsigned long end);
  35. extern void (*_flush_icache_page)(struct vm_area_struct *vma,
  36.                                   struct page *page);
  37. #define flush_dcache_page(page) do { } while (0)
  38. #define flush_cache_all() _flush_cache_all()
  39. #define __flush_cache_all() ___flush_cache_all()
  40. #define flush_cache_mm(mm) _flush_cache_mm(mm)
  41. #define flush_cache_range(mm,start,end) _flush_cache_range(mm,start,end)
  42. #define flush_cache_page(vma,page) _flush_cache_page(vma, page)
  43. #define flush_cache_sigtramp(addr) _flush_cache_sigtramp(addr)
  44. #define flush_page_to_ram(page) _flush_page_to_ram(page)
  45. #define flush_icache_range(start, end) _flush_icache_range(start,end)
  46. #define flush_icache_page(vma, page)  _flush_icache_page(vma, page)
  47. /*
  48.  * - add_wired_entry() add a fixed TLB entry, and move wired register
  49.  */
  50. extern void add_wired_entry(unsigned long entrylo0, unsigned long entrylo1,
  51.        unsigned long entryhi, unsigned long pagemask);
  52. /*
  53.  * - add_temporary_entry() add a temporary TLB entry. We use TLB entries
  54.  * starting at the top and working down. This is for populating the
  55.  * TLB before trap_init() puts the TLB miss handler in place. It 
  56.  * should be used only for entries matching the actual page tables,
  57.  * to prevent inconsistencies.
  58.  */
  59. extern int add_temporary_entry(unsigned long entrylo0, unsigned long entrylo1,
  60.        unsigned long entryhi, unsigned long pagemask);
  61. /* Basically we have the same two-level (which is the logical three level
  62.  * Linux page table layout folded) page tables as the i386.  Some day
  63.  * when we have proper page coloring support we can have a 1% quicker
  64.  * tlb refill handling mechanism, but for now it is a bit slower but
  65.  * works even with the cache aliasing problem the R4k and above have.
  66.  */
  67. #endif /* !defined (_LANGUAGE_ASSEMBLY) */
  68. /* PMD_SHIFT determines the size of the area a second-level page table can map */
  69. #define PMD_SHIFT 22
  70. #define PMD_SIZE (1UL << PMD_SHIFT)
  71. #define PMD_MASK (~(PMD_SIZE-1))
  72. /* PGDIR_SHIFT determines what a third-level page table entry can map */
  73. #define PGDIR_SHIFT 22
  74. #define PGDIR_SIZE (1UL << PGDIR_SHIFT)
  75. #define PGDIR_MASK (~(PGDIR_SIZE-1))
  76. /* Entries per page directory level: we use two-level, so
  77.  * we don't really have any PMD directory physically.
  78.  */
  79. #define PTRS_PER_PTE 1024
  80. #define PTRS_PER_PMD 1
  81. #define PTRS_PER_PGD 1024
  82. #define USER_PTRS_PER_PGD (TASK_SIZE/PGDIR_SIZE)
  83. #define FIRST_USER_PGD_NR 0
  84. #define VMALLOC_START     KSEG2
  85. #define VMALLOC_VMADDR(x) ((unsigned long)(x))
  86. #define VMALLOC_END       KSEG3
  87. /* Note that we shift the lower 32bits of each EntryLo[01] entry
  88.  * 6 bits to the left. That way we can convert the PFN into the
  89.  * physical address by a single 'and' operation and gain 6 additional
  90.  * bits for storing information which isn't present in a normal
  91.  * MIPS page table.
  92.  *
  93.  * Similar to the Alpha port, we need to keep track of the ref
  94.  * and mod bits in software.  We have a software "yeah you can read
  95.  * from this page" bit, and a hardware one which actually lets the
  96.  * process read from the page.  On the same token we have a software
  97.  * writable bit and the real hardware one which actually lets the
  98.  * process write to the page, this keeps a mod bit via the hardware
  99.  * dirty bit.
  100.  *
  101.  * Certain revisions of the R4000 and R5000 have a bug where if a
  102.  * certain sequence occurs in the last 3 instructions of an executable
  103.  * page, and the following page is not mapped, the cpu can do
  104.  * unpredictable things.  The code (when it is written) to deal with
  105.  * this problem will be in the update_mmu_cache() code for the r4k.
  106.  */
  107. #define _PAGE_PRESENT               (1<<0)  /* implemented in software */
  108. #define _PAGE_READ                  (1<<1)  /* implemented in software */
  109. #define _PAGE_WRITE                 (1<<2)  /* implemented in software */
  110. #define _PAGE_ACCESSED              (1<<3)  /* implemented in software */
  111. #define _PAGE_MODIFIED              (1<<4)  /* implemented in software */
  112. #if defined(CONFIG_CPU_R3000)
  113. #define _PAGE_GLOBAL                (1<<8)
  114. #define _PAGE_VALID                 (1<<9)
  115. #define _PAGE_SILENT_READ           (1<<9)  /* synonym                 */
  116. #define _PAGE_DIRTY                 (1<<10) /* The MIPS dirty bit      */
  117. #define _PAGE_SILENT_WRITE          (1<<10)
  118. #define _CACHE_UNCACHED             (1<<11) /* R4[0246]00              */
  119. #define _CACHE_MASK                 (1<<11)
  120. #define _CACHE_CACHABLE_NONCOHERENT 0
  121. #else
  122. #define _PAGE_R4KBUG                (1<<5)  /* workaround for r4k bug  */
  123. #define _PAGE_GLOBAL                (1<<6)
  124. #define _PAGE_VALID                 (1<<7)
  125. #define _PAGE_SILENT_READ           (1<<7)  /* synonym                 */
  126. #define _PAGE_DIRTY                 (1<<8)  /* The MIPS dirty bit      */
  127. #define _PAGE_SILENT_WRITE          (1<<8)
  128. #define _CACHE_MASK                 (7<<9)
  129. #if defined(CONFIG_CPU_SB1)
  130. /* No penalty for being coherent on the SB1, so just
  131.    use it for "noncoherent" spaces, too.  Shouldn't hurt. */
  132. #define _CACHE_UNCACHED             (2<<9)  
  133. #define _CACHE_CACHABLE_COW         (5<<9)  
  134. #define _CACHE_CACHABLE_NONCOHERENT (5<<9)  
  135. #else
  136. #define _CACHE_CACHABLE_NO_WA       (0<<9)  /* R4600 only              */
  137. #define _CACHE_CACHABLE_WA          (1<<9)  /* R4600 only              */
  138. #define _CACHE_UNCACHED             (2<<9)  /* R4[0246]00              */
  139. #define _CACHE_CACHABLE_NONCOHERENT (3<<9)  /* R4[0246]00              */
  140. #define _CACHE_CACHABLE_CE          (4<<9)  /* R4[04]00 only           */
  141. #define _CACHE_CACHABLE_COW         (5<<9)  /* R4[04]00 only           */
  142. #define _CACHE_CACHABLE_CUW         (6<<9)  /* R4[04]00 only           */
  143. #define _CACHE_CACHABLE_ACCELERATED (7<<9)  /* R10000 only             */
  144. #endif
  145. #endif
  146. #define __READABLE (_PAGE_READ | _PAGE_SILENT_READ | _PAGE_ACCESSED)
  147. #define __WRITEABLE (_PAGE_WRITE | _PAGE_SILENT_WRITE | _PAGE_MODIFIED)
  148. #define _PAGE_CHG_MASK  (PAGE_MASK | _PAGE_ACCESSED | _PAGE_MODIFIED | _CACHE_MASK)
  149. #ifdef CONFIG_MIPS_UNCACHED
  150. #define PAGE_CACHABLE_DEFAULT _CACHE_UNCACHED
  151. #else
  152. #ifdef CONFIG_CPU_SB1
  153. #define PAGE_CACHABLE_DEFAULT _CACHE_CACHABLE_COW
  154. #else
  155. #define PAGE_CACHABLE_DEFAULT _CACHE_CACHABLE_NONCOHERENT
  156. #endif
  157. #endif
  158. #define PAGE_NONE __pgprot(_PAGE_PRESENT | _CACHE_CACHABLE_NONCOHERENT)
  159. #define PAGE_SHARED     __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | 
  160. PAGE_CACHABLE_DEFAULT)
  161. #define PAGE_COPY       __pgprot(_PAGE_PRESENT | _PAGE_READ | 
  162. PAGE_CACHABLE_DEFAULT)
  163. #define PAGE_READONLY   __pgprot(_PAGE_PRESENT | _PAGE_READ | 
  164. PAGE_CACHABLE_DEFAULT)
  165. #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | 
  166. PAGE_CACHABLE_DEFAULT)
  167. #define PAGE_USERIO     __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | 
  168. PAGE_CACHABLE_DEFAULT)
  169. #define PAGE_KERNEL_UNCACHED __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE | 
  170. _CACHE_UNCACHED)
  171. /*
  172.  * MIPS can't do page protection for execute, and considers that the same like
  173.  * read. Also, write permissions imply read permissions. This is the closest
  174.  * we can get by reasonable means..
  175.  */
  176. #define __P000 PAGE_NONE
  177. #define __P001 PAGE_READONLY
  178. #define __P010 PAGE_COPY
  179. #define __P011 PAGE_COPY
  180. #define __P100 PAGE_READONLY
  181. #define __P101 PAGE_READONLY
  182. #define __P110 PAGE_COPY
  183. #define __P111 PAGE_COPY
  184. #define __S000 PAGE_NONE
  185. #define __S001 PAGE_READONLY
  186. #define __S010 PAGE_SHARED
  187. #define __S011 PAGE_SHARED
  188. #define __S100 PAGE_READONLY
  189. #define __S101 PAGE_READONLY
  190. #define __S110 PAGE_SHARED
  191. #define __S111 PAGE_SHARED
  192. #if !defined (_LANGUAGE_ASSEMBLY)
  193. #define pte_ERROR(e) 
  194. printk("%s:%d: bad pte %016lx.n", __FILE__, __LINE__, pte_val(e))
  195. #define pmd_ERROR(e) 
  196. printk("%s:%d: bad pmd %016lx.n", __FILE__, __LINE__, pmd_val(e))
  197. #define pgd_ERROR(e) 
  198. printk("%s:%d: bad pgd %016lx.n", __FILE__, __LINE__, pgd_val(e))
  199. extern unsigned long empty_zero_page;
  200. extern unsigned long zero_page_mask;
  201. #define ZERO_PAGE(vaddr) 
  202. (virt_to_page(empty_zero_page + (((unsigned long)(vaddr)) & zero_page_mask)))
  203. /* number of bits that fit into a memory pointer */
  204. #define BITS_PER_PTR (8*sizeof(unsigned long))
  205. /* to align the pointer to a pointer address */
  206. #define PTR_MASK (~(sizeof(void*)-1))
  207. /*
  208.  * sizeof(void*) == (1 << SIZEOF_PTR_LOG2)
  209.  */
  210. #define SIZEOF_PTR_LOG2 2
  211. /* to find an entry in a page-table */
  212. #define PAGE_PTR(address) 
  213. ((unsigned long)(address)>>(PAGE_SHIFT-SIZEOF_PTR_LOG2)&PTR_MASK&~PAGE_MASK)
  214. extern void load_pgd(unsigned long pg_dir);
  215. extern pmd_t invalid_pte_table[PAGE_SIZE/sizeof(pmd_t)];
  216. /*
  217.  * Conversion functions: convert a page and protection to a page entry,
  218.  * and a page entry and page directory to the page they refer to.
  219.  */
  220. extern inline unsigned long pmd_page(pmd_t pmd)
  221. {
  222. return pmd_val(pmd);
  223. }
  224. extern inline void pmd_set(pmd_t * pmdp, pte_t * ptep)
  225. {
  226. pmd_val(*pmdp) = (((unsigned long) ptep) & PAGE_MASK);
  227. }
  228. extern inline int pte_none(pte_t pte)    { return !pte_val(pte); }
  229. extern inline int pte_present(pte_t pte) { return pte_val(pte) & _PAGE_PRESENT; }
  230. /* Certain architectures need to do special things when pte's
  231.  * within a page table are directly modified.  Thus, the following
  232.  * hook is made available.
  233.  */
  234. extern inline void set_pte(pte_t *ptep, pte_t pteval)
  235. {
  236. *ptep = pteval;
  237. }
  238. extern inline void pte_clear(pte_t *ptep)
  239. {
  240. set_pte(ptep, __pte(0));
  241. }
  242. /*
  243.  * (pmds are folded into pgds so this doesnt get actually called,
  244.  * but the define is needed for a generic inline function.)
  245.  */
  246. #define set_pmd(pmdptr, pmdval) (*(pmdptr) = pmdval)
  247. #define set_pgd(pgdptr, pgdval) (*(pgdptr) = pgdval)
  248. /*
  249.  * Empty pgd/pmd entries point to the invalid_pte_table.
  250.  */
  251. extern inline int pmd_none(pmd_t pmd)
  252. {
  253. return pmd_val(pmd) == (unsigned long) invalid_pte_table;
  254. }
  255. extern inline int pmd_bad(pmd_t pmd)
  256. {
  257. return ((pmd_page(pmd) > (unsigned long) high_memory) ||
  258.         (pmd_page(pmd) < PAGE_OFFSET));
  259. }
  260. extern inline int pmd_present(pmd_t pmd)
  261. {
  262. return (pmd_val(pmd) != (unsigned long) invalid_pte_table);
  263. }
  264. extern inline void pmd_clear(pmd_t *pmdp)
  265. {
  266. pmd_val(*pmdp) = ((unsigned long) invalid_pte_table);
  267. }
  268. /*
  269.  * The "pgd_xxx()" functions here are trivial for a folded two-level
  270.  * setup: the pgd is never bad, and a pmd always exists (as it's folded
  271.  * into the pgd entry)
  272.  */
  273. extern inline int pgd_none(pgd_t pgd) { return 0; }
  274. extern inline int pgd_bad(pgd_t pgd) { return 0; }
  275. extern inline int pgd_present(pgd_t pgd) { return 1; }
  276. extern inline void pgd_clear(pgd_t *pgdp) { }
  277. /*
  278.  * Permanent address of a page.  On MIPS we never have highmem, so this
  279.  * is simple.
  280.  */
  281. #define page_address(page) ((page)->virtual)
  282. #ifdef CONFIG_CPU_VR41XX
  283. #define pte_page(x)             (mem_map+(unsigned long)((pte_val(x) >> (PAGE_SHIFT + 2))))
  284. #else
  285. #define pte_page(x) (mem_map+(unsigned long)((pte_val(x) >> PAGE_SHIFT)))
  286. #endif
  287. /*
  288.  * The following only work if pte_present() is true.
  289.  * Undefined behaviour if not..
  290.  */
  291. extern inline int pte_read(pte_t pte) { return pte_val(pte) & _PAGE_READ; }
  292. extern inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_WRITE; }
  293. extern inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_MODIFIED; }
  294. extern inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; }
  295. extern inline pte_t pte_wrprotect(pte_t pte)
  296. {
  297. pte_val(pte) &= ~(_PAGE_WRITE | _PAGE_SILENT_WRITE);
  298. return pte;
  299. }
  300. extern inline pte_t pte_rdprotect(pte_t pte)
  301. {
  302. pte_val(pte) &= ~(_PAGE_READ | _PAGE_SILENT_READ);
  303. return pte;
  304. }
  305. extern inline pte_t pte_mkclean(pte_t pte)
  306. {
  307. pte_val(pte) &= ~(_PAGE_MODIFIED|_PAGE_SILENT_WRITE);
  308. return pte;
  309. }
  310. extern inline pte_t pte_mkold(pte_t pte)
  311. {
  312. pte_val(pte) &= ~(_PAGE_ACCESSED|_PAGE_SILENT_READ);
  313. return pte;
  314. }
  315. extern inline pte_t pte_mkwrite(pte_t pte)
  316. {
  317. pte_val(pte) |= _PAGE_WRITE;
  318. if (pte_val(pte) & _PAGE_MODIFIED)
  319. pte_val(pte) |= _PAGE_SILENT_WRITE;
  320. return pte;
  321. }
  322. extern inline pte_t pte_mkread(pte_t pte)
  323. {
  324. pte_val(pte) |= _PAGE_READ;
  325. if (pte_val(pte) & _PAGE_ACCESSED)
  326. pte_val(pte) |= _PAGE_SILENT_READ;
  327. return pte;
  328. }
  329. extern inline pte_t pte_mkdirty(pte_t pte)
  330. {
  331. pte_val(pte) |= _PAGE_MODIFIED;
  332. if (pte_val(pte) & _PAGE_WRITE)
  333. pte_val(pte) |= _PAGE_SILENT_WRITE;
  334. return pte;
  335. }
  336. /*
  337.  * Macro to make mark a page protection value as "uncacheable".  Note
  338.  * that "protection" is really a misnomer here as the protection value
  339.  * contains the memory attribute bits, dirty bits, and various other
  340.  * bits as well.
  341.  */
  342. #define pgprot_noncached pgprot_noncached
  343. static inline pgprot_t pgprot_noncached(pgprot_t _prot)
  344. {
  345. unsigned long prot = pgprot_val(_prot);
  346. prot = (prot & ~_CACHE_MASK) | _CACHE_UNCACHED;
  347. return __pgprot(prot);
  348. }
  349. extern inline pte_t pte_mkyoung(pte_t pte)
  350. {
  351. pte_val(pte) |= _PAGE_ACCESSED;
  352. if (pte_val(pte) & _PAGE_READ)
  353. pte_val(pte) |= _PAGE_SILENT_READ;
  354. return pte;
  355. }
  356. /*
  357.  * Conversion functions: convert a page and protection to a page entry,
  358.  * and a page entry and page directory to the page they refer to.
  359.  */
  360. #ifdef CONFIG_CPU_VR41XX
  361. #define mk_pte(page, pgprot)                                            
  362. ({                                                                      
  363.         pte_t   __pte;                                                  
  364.                                                                         
  365.         pte_val(__pte) = ((unsigned long)(page - mem_map) << (PAGE_SHIFT + 2)) | 
  366.                          pgprot_val(pgprot);                            
  367.                                                                         
  368.         __pte;                                                          
  369. })
  370. #else
  371. #define mk_pte(page, pgprot)
  372. ({
  373. pte_t   __pte;
  374. pte_val(__pte) = ((unsigned long)(page - mem_map) << PAGE_SHIFT) | 
  375.                  pgprot_val(pgprot);
  376. __pte;
  377. })
  378. #endif
  379. extern inline pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot)
  380. {
  381. #ifdef CONFIG_CPU_VR41XX
  382.         return __pte((physpage << 2) | pgprot_val(pgprot));
  383. #else
  384. return __pte(physpage | pgprot_val(pgprot));
  385. #endif
  386. }
  387. extern inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
  388. {
  389. return __pte((pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot));
  390. }
  391. #define page_pte(page) page_pte_prot(page, __pgprot(0))
  392. /* to find an entry in a kernel page-table-directory */
  393. #define pgd_offset_k(address) pgd_offset(&init_mm, address)
  394. #define pgd_index(address) ((address) >> PGDIR_SHIFT)
  395. /* to find an entry in a page-table-directory */
  396. extern inline pgd_t *pgd_offset(struct mm_struct *mm, unsigned long address)
  397. {
  398. return mm->pgd + pgd_index(address);
  399. }
  400. /* Find an entry in the second-level page table.. */
  401. extern inline pmd_t *pmd_offset(pgd_t *dir, unsigned long address)
  402. {
  403. return (pmd_t *) dir;
  404. }
  405. /* Find an entry in the third-level page table.. */ 
  406. extern inline pte_t *pte_offset(pmd_t * dir, unsigned long address)
  407. {
  408. return (pte_t *) (pmd_page(*dir)) +
  409.        ((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1));
  410. }
  411. extern int do_check_pgt_cache(int, int);
  412. extern pgd_t swapper_pg_dir[1024];
  413. extern void paging_init(void);
  414. extern void update_mmu_cache(struct vm_area_struct *vma,
  415. unsigned long address, pte_t pte);
  416. #define SWP_TYPE(x) (((x).val >> 1) & 0x3f)
  417. #define SWP_OFFSET(x) ((x).val >> 8)
  418. #define SWP_ENTRY(type,offset) ((swp_entry_t) { ((type) << 1) | ((offset) << 8) })
  419. #define pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
  420. #define swp_entry_to_pte(x) ((pte_t) { (x).val })
  421. /* Needs to be defined here and not in linux/mm.h, as it is arch dependent */
  422. #define PageSkip(page) (0)
  423. #define kern_addr_valid(addr) (1)
  424. /* TLB operations. */
  425. extern inline void tlb_probe(void)
  426. {
  427. __asm__ __volatile__(
  428. ".set pushnt"
  429. ".set reordernt"
  430. "tlbpnt"
  431. ".set pop");
  432. }
  433. extern inline void tlb_read(void)
  434. {
  435. __asm__ __volatile__(
  436. ".set pushnt"
  437. ".set reordernt"
  438. "tlbrnt"
  439. ".set pop");
  440. }
  441. extern inline void tlb_write_indexed(void)
  442. {
  443. __asm__ __volatile__(
  444. ".set pushnt"
  445. ".set reordernt"
  446. "tlbwint"
  447. ".set pop");
  448. }
  449. extern inline void tlb_write_random(void)
  450. {
  451. __asm__ __volatile__(
  452. ".set pushnt"
  453. ".set reordernt"
  454. "tlbwrnt"
  455. ".set pop");
  456. }
  457. /* Dealing with various CP0 mmu/cache related registers. */
  458. /* CP0_PAGEMASK register */
  459. extern inline unsigned long get_pagemask(void)
  460. {
  461. unsigned long val;
  462. __asm__ __volatile__(
  463. ".set pushnt"
  464. ".set reordernt"
  465. "mfc0 %0, $5nt"
  466. ".set pop"
  467. : "=r" (val));
  468. return val;
  469. }
  470. extern inline void set_pagemask(unsigned long val)
  471. {
  472. __asm__ __volatile__(
  473. ".set pushnt"
  474. ".set reordernt"
  475. "mtc0 %z0, $5nt"
  476. ".set pop"
  477. : : "Jr" (val));
  478. }
  479. /* CP0_ENTRYLO0 and CP0_ENTRYLO1 registers */
  480. extern inline unsigned long get_entrylo0(void)
  481. {
  482. unsigned long val;
  483. __asm__ __volatile__(
  484. ".set pushnt"
  485. ".set reordernt"
  486. "mfc0 %0, $2nt"
  487. ".set pop"
  488. : "=r" (val));
  489. return val;
  490. }
  491. extern inline void set_entrylo0(unsigned long val)
  492. {
  493. __asm__ __volatile__(
  494. ".set pushnt"
  495. ".set reordernt"
  496. "mtc0 %z0, $2nt"
  497. ".set pop"
  498. : : "Jr" (val));
  499. }
  500. extern inline unsigned long get_entrylo1(void)
  501. {
  502. unsigned long val;
  503. __asm__ __volatile__(
  504. ".set pushnt"
  505. ".set reordernt"
  506. "mfc0 %0, $3nt"
  507. ".set pop" : "=r" (val));
  508. return val;
  509. }
  510. extern inline void set_entrylo1(unsigned long val)
  511. {
  512. __asm__ __volatile__(
  513. ".set pushnt"
  514. ".set reordernt"
  515. "mtc0 %z0, $3nt"
  516. ".set pop"
  517. : : "Jr" (val));
  518. }
  519. /* CP0_ENTRYHI register */
  520. extern inline unsigned long get_entryhi(void)
  521. {
  522. unsigned long val;
  523. __asm__ __volatile__(
  524. ".set pushnt"
  525. ".set reordernt"
  526. "mfc0 %0, $10nt"
  527. ".set pop"
  528. : "=r" (val));
  529. return val;
  530. }
  531. extern inline void set_entryhi(unsigned long val)
  532. {
  533. __asm__ __volatile__(
  534. ".set pushnt"
  535. ".set reordernt"
  536. "mtc0 %z0, $10nt"
  537. ".set pop"
  538. : : "Jr" (val));
  539. }
  540. /* CP0_INDEX register */
  541. extern inline unsigned long get_index(void)
  542. {
  543. unsigned long val;
  544. __asm__ __volatile__(
  545. ".set pushnt"
  546. ".set reordernt"
  547. "mfc0 %0, $0nt"
  548. ".set pop"
  549. : "=r" (val));
  550. return val;
  551. }
  552. extern inline void set_index(unsigned long val)
  553. {
  554. __asm__ __volatile__(
  555. ".set pushnt"
  556. ".set reordernt"
  557. "mtc0 %z0, $0nt"
  558. ".set pop"
  559. : : "Jr" (val));
  560. }
  561. /* CP0_WIRED register */
  562. extern inline unsigned long get_wired(void)
  563. {
  564. unsigned long val;
  565. __asm__ __volatile__(
  566. ".set pushnt"
  567. ".set reordernt"
  568. "mfc0 %0, $6nt"
  569. ".set pop"
  570. : "=r" (val));
  571. return val;
  572. }
  573. extern inline void set_wired(unsigned long val)
  574. {
  575. __asm__ __volatile__(
  576. ".set pushnt"
  577. ".set reordernt"
  578. "mtc0 %z0, $6nt"
  579. ".set pop"
  580. : : "Jr" (val));
  581. }
  582. extern inline unsigned long get_info(void)
  583. {
  584. unsigned long val;
  585. __asm__(
  586. ".set pushnt"
  587. ".set reordernt"
  588. "mfc0 %0, $7nt"
  589. ".set pop"
  590. : "=r" (val));
  591. return val;
  592. }
  593. /* CP0_TAGLO and CP0_TAGHI registers */
  594. extern inline unsigned long get_taglo(void)
  595. {
  596. unsigned long val;
  597. __asm__ __volatile__(
  598. ".set pushnt"
  599. ".set reordernt"
  600. "mfc0 %0, $28nt"
  601. ".set pop"
  602. : "=r" (val));
  603. return val;
  604. }
  605. extern inline void set_taglo(unsigned long val)
  606. {
  607. __asm__ __volatile__(
  608. ".set pushnt"
  609. ".set reordernt"
  610. "mtc0 %z0, $28nt"
  611. ".set pop"
  612. : : "Jr" (val));
  613. }
  614. extern inline unsigned long get_taghi(void)
  615. {
  616. unsigned long val;
  617. __asm__ __volatile__(
  618. ".set pushnt"
  619. ".set reordernt"
  620. "mfc0 %0, $29nt"
  621. ".set pop"
  622. : "=r" (val));
  623. return val;
  624. }
  625. extern inline void set_taghi(unsigned long val)
  626. {
  627. __asm__ __volatile__(
  628. ".set pushnt"
  629. ".set reordernt"
  630. "mtc0 %z0, $29nt"
  631. ".set pop"
  632. : : "Jr" (val));
  633. }
  634. /* CP0_CONTEXT register */
  635. extern inline unsigned long get_context(void)
  636. {
  637. unsigned long val;
  638. __asm__ __volatile__(
  639. ".set pushnt"
  640. ".set reordernt"
  641. "mfc0 %0, $4nt"
  642. ".set pop"
  643. : "=r" (val));
  644. return val;
  645. }
  646. extern inline void set_context(unsigned long val)
  647. {
  648. __asm__ __volatile__(
  649. ".set pushnt"
  650. ".set reordernt"
  651. "mtc0 %z0, $4nt"
  652. ".set pop"
  653. : : "Jr" (val));
  654. }
  655. #include <asm-generic/pgtable.h>
  656. #endif /* !defined (_LANGUAGE_ASSEMBLY) */
  657. #define io_remap_page_range remap_page_range
  658. /*
  659.  * No page table caches to initialise
  660.  */
  661. #define pgtable_cache_init() do { } while (0)
  662. #endif /* _ASM_PGTABLE_H */