mmu.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:12k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.mmu.h 1.10 06/28/01 15:50:17 paulus
  3.  */
  4. /*
  5.  * PowerPC memory management structures
  6.  */
  7. #ifdef __KERNEL__
  8. #ifndef _PPC_MMU_H_
  9. #define _PPC_MMU_H_
  10. #include <linux/config.h>
  11. #ifndef __ASSEMBLY__
  12. /* Default "unsigned long" context */
  13. typedef unsigned long mm_context_t;
  14. /* Hardware Page Table Entry */
  15. typedef struct _PTE {
  16. #ifdef CONFIG_PPC64BRIDGE
  17. unsigned long long vsid:52;
  18. unsigned long api:5;
  19. unsigned long :5;
  20. unsigned long h:1;
  21. unsigned long v:1;
  22. unsigned long long rpn:52;
  23. #else /* CONFIG_PPC64BRIDGE */
  24. unsigned long v:1; /* Entry is valid */
  25. unsigned long vsid:24; /* Virtual segment identifier */
  26. unsigned long h:1; /* Hash algorithm indicator */
  27. unsigned long api:6; /* Abbreviated page index */
  28. unsigned long rpn:20; /* Real (physical) page number */
  29. #endif /* CONFIG_PPC64BRIDGE */
  30. unsigned long    :3; /* Unused */
  31. unsigned long r:1; /* Referenced */
  32. unsigned long c:1; /* Changed */
  33. unsigned long w:1; /* Write-thru cache mode */
  34. unsigned long i:1; /* Cache inhibited */
  35. unsigned long m:1; /* Memory coherence */
  36. unsigned long g:1; /* Guarded */
  37. unsigned long  :1; /* Unused */
  38. unsigned long pp:2; /* Page protection */
  39. } PTE; 
  40. /* Values for PP (assumes Ks=0, Kp=1) */
  41. #define PP_RWXX 0 /* Supervisor read/write, User none */
  42. #define PP_RWRX 1 /* Supervisor read/write, User read */
  43. #define PP_RWRW 2 /* Supervisor read/write, User read/write */
  44. #define PP_RXRX 3 /* Supervisor read,       User read */
  45. /* Segment Register */
  46. typedef struct _SEGREG {
  47. unsigned long t:1; /* Normal or I/O  type */
  48. unsigned long ks:1; /* Supervisor 'key' (normally 0) */
  49. unsigned long kp:1; /* User 'key' (normally 1) */
  50. unsigned long n:1; /* No-execute */
  51. unsigned long :4; /* Unused */
  52. unsigned long vsid:24; /* Virtual Segment Identifier */
  53. } SEGREG;
  54. /* Block Address Translation (BAT) Registers */
  55. typedef struct _P601_BATU { /* Upper part of BAT for 601 processor */
  56. unsigned long bepi:15; /* Effective page index (virtual address) */
  57. unsigned long :8; /* unused */
  58. unsigned long w:1;
  59. unsigned long i:1; /* Cache inhibit */
  60. unsigned long m:1; /* Memory coherence */
  61. unsigned long ks:1; /* Supervisor key (normally 0) */
  62. unsigned long kp:1; /* User key (normally 1) */
  63. unsigned long pp:2; /* Page access protections */
  64. } P601_BATU;
  65. typedef struct _BATU { /* Upper part of BAT (all except 601) */
  66. #ifdef CONFIG_PPC64BRIDGE
  67. unsigned long long bepi:47;
  68. #else /* CONFIG_PPC64BRIDGE */
  69. unsigned long bepi:15; /* Effective page index (virtual address) */
  70. #endif /* CONFIG_PPC64BRIDGE */
  71. unsigned long :4; /* Unused */
  72. unsigned long bl:11; /* Block size mask */
  73. unsigned long vs:1; /* Supervisor valid */
  74. unsigned long vp:1; /* User valid */
  75. } BATU;   
  76. typedef struct _P601_BATL { /* Lower part of BAT for 601 processor */
  77. unsigned long brpn:15; /* Real page index (physical address) */
  78. unsigned long :10; /* Unused */
  79. unsigned long v:1; /* Valid bit */
  80. unsigned long bl:6; /* Block size mask */
  81. } P601_BATL;
  82. typedef struct _BATL { /* Lower part of BAT (all except 601) */
  83. #ifdef CONFIG_PPC64BRIDGE
  84. unsigned long long brpn:47;
  85. #else /* CONFIG_PPC64BRIDGE */
  86. unsigned long brpn:15; /* Real page index (physical address) */
  87. #endif /* CONFIG_PPC64BRIDGE */
  88. unsigned long :10; /* Unused */
  89. unsigned long w:1; /* Write-thru cache */
  90. unsigned long i:1; /* Cache inhibit */
  91. unsigned long m:1; /* Memory coherence */
  92. unsigned long g:1; /* Guarded (MBZ in IBAT) */
  93. unsigned long :1; /* Unused */
  94. unsigned long pp:2; /* Page access protections */
  95. } BATL;
  96. typedef struct _BAT {
  97. BATU batu; /* Upper register */
  98. BATL batl; /* Lower register */
  99. } BAT;
  100. typedef struct _P601_BAT {
  101. P601_BATU batu; /* Upper register */
  102. P601_BATL batl; /* Lower register */
  103. } P601_BAT;
  104. extern void _tlbie(unsigned long va); /* invalidate a TLB entry */
  105. extern void _tlbia(void); /* invalidate all TLB entries */
  106. #endif /* __ASSEMBLY__ */
  107. /* Block size masks */
  108. #define BL_128K 0x000
  109. #define BL_256K 0x001
  110. #define BL_512K 0x003
  111. #define BL_1M   0x007
  112. #define BL_2M   0x00F
  113. #define BL_4M   0x01F
  114. #define BL_8M   0x03F
  115. #define BL_16M  0x07F
  116. #define BL_32M  0x0FF
  117. #define BL_64M  0x1FF
  118. #define BL_128M 0x3FF
  119. #define BL_256M 0x7FF
  120. /* BAT Access Protection */
  121. #define BPP_XX 0x00 /* No access */
  122. #define BPP_RX 0x01 /* Read only */
  123. #define BPP_RW 0x02 /* Read/write */
  124. /* Control/status registers for the MPC8xx.
  125.  * A write operation to these registers causes serialized access.
  126.  * During software tablewalk, the registers used perform mask/shift-add
  127.  * operations when written/read.  A TLB entry is created when the Mx_RPN
  128.  * is written, and the contents of several registers are used to
  129.  * create the entry.
  130.  */
  131. #define MI_CTR 784 /* Instruction TLB control register */
  132. #define MI_GPM 0x80000000 /* Set domain manager mode */
  133. #define MI_PPM 0x40000000 /* Set subpage protection */
  134. #define MI_CIDEF 0x20000000 /* Set cache inhibit when MMU dis */
  135. #define MI_RSV4I 0x08000000 /* Reserve 4 TLB entries */
  136. #define MI_PPCS 0x02000000 /* Use MI_RPN prob/priv state */
  137. #define MI_IDXMASK 0x00001f00 /* TLB index to be loaded */
  138. #define MI_RESETVAL 0x00000000 /* Value of register at reset */
  139. /* These are the Ks and Kp from the PowerPC books.  For proper operation,
  140.  * Ks = 0, Kp = 1.
  141.  */
  142. #define MI_AP 786
  143. #define MI_Ks 0x80000000 /* Should not be set */
  144. #define MI_Kp 0x40000000 /* Should always be set */
  145. /* The effective page number register.  When read, contains the information
  146.  * about the last instruction TLB miss.  When MI_RPN is written, bits in
  147.  * this register are used to create the TLB entry.
  148.  */
  149. #define MI_EPN 787
  150. #define MI_EPNMASK 0xfffff000 /* Effective page number for entry */
  151. #define MI_EVALID 0x00000200 /* Entry is valid */
  152. #define MI_ASIDMASK 0x0000000f /* ASID match value */
  153. /* Reset value is undefined */
  154. /* A "level 1" or "segment" or whatever you want to call it register.
  155.  * For the instruction TLB, it contains bits that get loaded into the
  156.  * TLB entry when the MI_RPN is written.
  157.  */
  158. #define MI_TWC 789
  159. #define MI_APG 0x000001e0 /* Access protection group (0) */
  160. #define MI_GUARDED 0x00000010 /* Guarded storage */
  161. #define MI_PSMASK 0x0000000c /* Mask of page size bits */
  162. #define MI_PS8MEG 0x0000000c /* 8M page size */
  163. #define MI_PS512K 0x00000004 /* 512K page size */
  164. #define MI_PS4K_16K 0x00000000 /* 4K or 16K page size */
  165. #define MI_SVALID 0x00000001 /* Segment entry is valid */
  166. /* Reset value is undefined */
  167. /* Real page number.  Defined by the pte.  Writing this register
  168.  * causes a TLB entry to be created for the instruction TLB, using
  169.  * additional information from the MI_EPN, and MI_TWC registers.
  170.  */
  171. #define MI_RPN 790
  172. /* Define an RPN value for mapping kernel memory to large virtual
  173.  * pages for boot initialization.  This has real page number of 0,
  174.  * large page size, shared page, cache enabled, and valid.
  175.  * Also mark all subpages valid and write access.
  176.  */
  177. #define MI_BOOTINIT 0x000001fd
  178. #define MD_CTR 792 /* Data TLB control register */
  179. #define MD_GPM 0x80000000 /* Set domain manager mode */
  180. #define MD_PPM 0x40000000 /* Set subpage protection */
  181. #define MD_CIDEF 0x20000000 /* Set cache inhibit when MMU dis */
  182. #define MD_WTDEF 0x10000000 /* Set writethrough when MMU dis */
  183. #define MD_RSV4I 0x08000000 /* Reserve 4 TLB entries */
  184. #define MD_TWAM 0x04000000 /* Use 4K page hardware assist */
  185. #define MD_PPCS 0x02000000 /* Use MI_RPN prob/priv state */
  186. #define MD_IDXMASK 0x00001f00 /* TLB index to be loaded */
  187. #define MD_RESETVAL 0x04000000 /* Value of register at reset */
  188. #define M_CASID 793 /* Address space ID (context) to match */
  189. #define MC_ASIDMASK 0x0000000f /* Bits used for ASID value */
  190. /* These are the Ks and Kp from the PowerPC books.  For proper operation,
  191.  * Ks = 0, Kp = 1.
  192.  */
  193. #define MD_AP 794
  194. #define MD_Ks 0x80000000 /* Should not be set */
  195. #define MD_Kp 0x40000000 /* Should always be set */
  196. /* The effective page number register.  When read, contains the information
  197.  * about the last instruction TLB miss.  When MD_RPN is written, bits in
  198.  * this register are used to create the TLB entry.
  199.  */
  200. #define MD_EPN 795
  201. #define MD_EPNMASK 0xfffff000 /* Effective page number for entry */
  202. #define MD_EVALID 0x00000200 /* Entry is valid */
  203. #define MD_ASIDMASK 0x0000000f /* ASID match value */
  204. /* Reset value is undefined */
  205. /* The pointer to the base address of the first level page table.
  206.  * During a software tablewalk, reading this register provides the address
  207.  * of the entry associated with MD_EPN.
  208.  */
  209. #define M_TWB 796
  210. #define M_L1TB 0xfffff000 /* Level 1 table base address */
  211. #define M_L1INDX 0x00000ffc /* Level 1 index, when read */
  212. /* Reset value is undefined */
  213. /* A "level 1" or "segment" or whatever you want to call it register.
  214.  * For the data TLB, it contains bits that get loaded into the TLB entry
  215.  * when the MD_RPN is written.  It is also provides the hardware assist
  216.  * for finding the PTE address during software tablewalk.
  217.  */
  218. #define MD_TWC 797
  219. #define MD_L2TB 0xfffff000 /* Level 2 table base address */
  220. #define MD_L2INDX 0xfffffe00 /* Level 2 index (*pte), when read */
  221. #define MD_APG 0x000001e0 /* Access protection group (0) */
  222. #define MD_GUARDED 0x00000010 /* Guarded storage */
  223. #define MD_PSMASK 0x0000000c /* Mask of page size bits */
  224. #define MD_PS8MEG 0x0000000c /* 8M page size */
  225. #define MD_PS512K 0x00000004 /* 512K page size */
  226. #define MD_PS4K_16K 0x00000000 /* 4K or 16K page size */
  227. #define MD_WT 0x00000002 /* Use writethrough page attribute */
  228. #define MD_SVALID 0x00000001 /* Segment entry is valid */
  229. /* Reset value is undefined */
  230. /* Real page number.  Defined by the pte.  Writing this register
  231.  * causes a TLB entry to be created for the data TLB, using
  232.  * additional information from the MD_EPN, and MD_TWC registers.
  233.  */
  234. #define MD_RPN 798
  235. /* This is a temporary storage register that could be used to save
  236.  * a processor working register during a tablewalk.
  237.  */
  238. #define M_TW 799
  239. /*
  240.  * At present, all PowerPC 400-class processors share a similar TLB
  241.  * architecture. The instruction and data sides share a unified,
  242.  * 64-entry, fully-associative TLB which is maintained totally under
  243.  * software control. In addition, the instruction side has a
  244.  * hardware-managed, 4-entry, fully- associative TLB which serves as a
  245.  * first level to the shared TLB. These two TLBs are known as the UTLB
  246.  * and ITLB, respectively.
  247.  */
  248. #define        PPC4XX_TLB_SIZE 64
  249. /*
  250.  * TLB entries are defined by a "high" tag portion and a "low" data
  251.  * portion.  On all architectures, the data portion is 32-bits.
  252.  *
  253.  * TLB entries are managed entirely under software control by reading,
  254.  * writing, and searchoing using the 4xx-specific tlbre, tlbwr, and tlbsx
  255.  * instructions.
  256.  */
  257. #define TLB_LO          1
  258. #define TLB_HI          0
  259.        
  260. #define TLB_DATA        TLB_LO
  261. #define TLB_TAG         TLB_HI
  262. /* Tag portion */
  263. #define TLB_EPN_MASK    0xFFFFFC00      /* Effective Page Number */
  264. #define TLB_PAGESZ_MASK 0x00000380
  265. #define TLB_PAGESZ(x)   (((x) & 0x7) << 7)
  266. #define   PAGESZ_1K 0
  267. #define   PAGESZ_4K             1
  268. #define   PAGESZ_16K            2
  269. #define   PAGESZ_64K            3
  270. #define   PAGESZ_256K           4
  271. #define   PAGESZ_1M             5
  272. #define   PAGESZ_4M             6
  273. #define   PAGESZ_16M            7
  274. #define TLB_VALID       0x00000040      /* Entry is valid */
  275. /* Data portion */
  276.                  
  277. #define TLB_RPN_MASK    0xFFFFFC00      /* Real Page Number */
  278. #define TLB_PERM_MASK   0x00000300
  279. #define TLB_EX          0x00000200      /* Instruction execution allowed */
  280. #define TLB_WR          0x00000100      /* Writes permitted */
  281. #define TLB_ZSEL_MASK   0x000000F0
  282. #define TLB_ZSEL(x)     (((x) & 0xF) << 4)
  283. #define TLB_ATTR_MASK   0x0000000F
  284. #define TLB_W           0x00000008      /* Caching is write-through */
  285. #define TLB_I           0x00000004      /* Caching is inhibited */
  286. #define TLB_M           0x00000002      /* Memory is coherent */
  287. #define TLB_G           0x00000001      /* Memory is guarded from prefetch */
  288. #endif /* _PPC_MMU_H_ */
  289. #endif /* __KERNEL__ */