source: rtems/bsps/powerpc/include/libcpu/mmu.h @ a2dad96

5
Last change on this file since a2dad96 was 2afb22b, checked in by Chris Johns <chrisj@…>, on 12/23/17 at 07:18:56

Remove make preinstall

A speciality of the RTEMS build system was the make preinstall step. It
copied header files from arbitrary locations into the build tree. The
header files were included via the -Bsome/build/tree/path GCC command
line option.

This has at least seven problems:

  • The make preinstall step itself needs time and disk space.
  • Errors in header files show up in the build tree copy. This makes it hard for editors to open the right file to fix the error.
  • There is no clear relationship between source and build tree header files. This makes an audit of the build process difficult.
  • The visibility of all header files in the build tree makes it difficult to enforce API barriers. For example it is discouraged to use BSP-specifics in the cpukit.
  • An introduction of a new build system is difficult.
  • Include paths specified by the -B option are system headers. This may suppress warnings.
  • The parallel build had sporadic failures on some hosts.

This patch removes the make preinstall step. All installed header
files are moved to dedicated include directories in the source tree.
Let @RTEMS_CPU@ be the target architecture, e.g. arm, powerpc, sparc,
etc. Let @RTEMS_BSP_FAMILIY@ be a BSP family base directory, e.g.
erc32, imx, qoriq, etc.

The new cpukit include directories are:

  • cpukit/include
  • cpukit/score/cpu/@RTEMS_CPU@/include
  • cpukit/libnetworking

The new BSP include directories are:

  • bsps/include
  • bsps/@RTEMS_CPU@/include
  • bsps/@RTEMS_CPU@/@RTEMS_BSP_FAMILIY@/include

There are build tree include directories for generated files.

The include directory order favours the most general header file, e.g.
it is not possible to override general header files via the include path
order.

The "bootstrap -p" option was removed. The new "bootstrap -H" option
should be used to regenerate the "headers.am" files.

Update #3254.

  • Property mode set to 100644
File size: 10.8 KB
Line 
1/*
2 * mmu.h
3 *
4 *      PowerPC memory management structures
5 *
6 * It is a stripped down version of linux ppc file...
7 *
8 * Copyright (C) 1999  Eric Valette (valette@crf.canon.fr)
9 *                     Canon Centre Recherche France.
10 *
11 *  The license and distribution terms for this file may be
12 *  found in the file LICENSE in this distribution or at
13 *  http://www.rtems.org/license/LICENSE.
14 */
15
16#ifndef _LIBCPU_MMU_H
17#define _LIBCPU_MMU_H
18
19#ifndef ASM
20/* Hardware Page Table Entry */
21typedef struct _PTE {
22        unsigned long v:1;      /* Entry is valid */
23        unsigned long vsid:24;  /* Virtual segment identifier */
24        unsigned long h:1;      /* Hash algorithm indicator */
25        unsigned long api:6;    /* Abbreviated page index */
26        unsigned long rpn:20;   /* Real (physical) page number */
27        unsigned long    :3;    /* Unused */
28        unsigned long r:1;      /* Referenced */
29        unsigned long c:1;      /* Changed */
30        unsigned long w:1;      /* Write-thru cache mode */
31        unsigned long i:1;      /* Cache inhibited */
32        unsigned long m:1;      /* Memory coherence */
33        unsigned long g:1;      /* Guarded */
34        unsigned long  :1;      /* Unused */
35        unsigned long pp:2;     /* Page protection */
36} PTE;
37
38/* Values for PP (assumes Ks=0, Kp=1) */
39#define PP_RWXX 0       /* Supervisor read/write, User none */
40#define PP_RWRX 1       /* Supervisor read/write, User read */
41#define PP_RWRW 2       /* Supervisor read/write, User read/write */
42#define PP_RXRX 3       /* Supervisor read,       User read */
43
44/* Segment Register */
45typedef struct _SEGREG {
46        unsigned long t:1;      /* Normal or I/O  type */
47        unsigned long ks:1;     /* Supervisor 'key' (normally 0) */
48        unsigned long kp:1;     /* User 'key' (normally 1) */
49        unsigned long n:1;      /* No-execute */
50        unsigned long :4;       /* Unused */
51        unsigned long vsid:24;  /* Virtual Segment Identifier */
52} SEGREG;
53
54/* Block Address Translation (BAT) Registers */
55typedef 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
66typedef struct _BATU {          /* Upper part of BAT (all except 601) */
67        unsigned long bepi:15;  /* Effective page index (virtual address) */
68        unsigned long :4;       /* Unused */
69        unsigned long bl:11;    /* Block size mask */
70        unsigned long vs:1;     /* Supervisor valid */
71        unsigned long vp:1;     /* User valid */
72} BATU;
73
74typedef struct _P601_BATL {     /* Lower part of BAT for 601 processor */
75        unsigned long brpn:15;  /* Real page index (physical address) */
76        unsigned long :10;      /* Unused */
77        unsigned long v:1;      /* Valid bit */
78        unsigned long bl:6;     /* Block size mask */
79} P601_BATL;
80
81typedef struct _BATL {          /* Lower part of BAT (all except 601) */
82        unsigned long brpn:15;  /* Real page index (physical address) */
83        unsigned long :10;      /* Unused */
84        unsigned long w:1;      /* Write-thru cache */
85        unsigned long i:1;      /* Cache inhibit */
86        unsigned long m:1;      /* Memory coherence */
87        unsigned long g:1;      /* Guarded (MBZ in IBAT) */
88        unsigned long :1;       /* Unused */
89        unsigned long pp:2;     /* Page access protections */
90} BATL;
91
92typedef struct _BAT {
93        BATU batu;              /* Upper register */
94        BATL batl;              /* Lower register */
95} BAT;
96
97typedef struct _P601_BAT {
98        P601_BATU batu;         /* Upper register */
99        P601_BATL batl;         /* Lower register */
100} P601_BAT;
101
102/* Block size masks */
103#define BL_128K 0x000
104#define BL_256K 0x001
105#define BL_512K 0x003
106#define BL_1M   0x007
107#define BL_2M   0x00F
108#define BL_4M   0x01F
109#define BL_8M   0x03F
110#define BL_16M  0x07F
111#define BL_32M  0x0FF
112#define BL_64M  0x1FF
113#define BL_128M 0x3FF
114#define BL_256M 0x7FF
115
116/* BAT Access Protection */
117#define BPP_XX  0x00            /* No access */
118#define BPP_RX  0x01            /* Read only */
119#define BPP_RW  0x02            /* Read/write */
120
121/*
122 * Simulated two-level MMU.  This structure is used by the kernel
123 * to keep track of MMU mappings and is used to update/maintain
124 * the hardware HASH table which is really a cache of mappings.
125 *
126 * The simulated structures mimic the hardware available on other
127 * platforms, notably the 80x86 and 680x0.
128 */
129
130typedef struct _pte {
131        unsigned long page_num:20;
132        unsigned long flags:12;         /* Page flags (some unused bits) */
133} pte;
134
135#define PD_SHIFT (10+12)                /* Page directory */
136#define PD_MASK  0x03FF
137#define PT_SHIFT (12)                   /* Page Table */
138#define PT_MASK  0x03FF
139#define PG_SHIFT (12)                   /* Page Entry */
140
141
142/* MMU context */
143
144typedef struct _MMU_context {
145        SEGREG  segs[16];       /* Segment registers */
146        pte     **pmap;         /* Two-level page-map structure */
147} MMU_context;
148
149/* Used to set up SDR1 register */
150#define HASH_TABLE_SIZE_64K     0x00010000
151#define HASH_TABLE_SIZE_128K    0x00020000
152#define HASH_TABLE_SIZE_256K    0x00040000
153#define HASH_TABLE_SIZE_512K    0x00080000
154#define HASH_TABLE_SIZE_1M      0x00100000
155#define HASH_TABLE_SIZE_2M      0x00200000
156#define HASH_TABLE_SIZE_4M      0x00400000
157#define HASH_TABLE_MASK_64K     0x000
158#define HASH_TABLE_MASK_128K    0x001
159#define HASH_TABLE_MASK_256K    0x003
160#define HASH_TABLE_MASK_512K    0x007
161#define HASH_TABLE_MASK_1M      0x00F
162#define HASH_TABLE_MASK_2M      0x01F
163#define HASH_TABLE_MASK_4M      0x03F
164
165/* invalidate a TLB entry */
166static inline void _tlbie(unsigned long va)
167{
168        asm volatile ("tlbie %0" : : "r"(va));
169}
170
171extern void _tlbia(void);               /* invalidate all TLB entries */
172#endif /* ASM */
173
174/* Control/status registers for the MPC8xx.
175 * A write operation to these registers causes serialized access.
176 * During software tablewalk, the registers used perform mask/shift-add
177 * operations when written/read.  A TLB entry is created when the Mx_RPN
178 * is written, and the contents of several registers are used to
179 * create the entry.
180 */
181#define MI_CTR          784     /* Instruction TLB control register */
182#define MI_GPM          0x80000000      /* Set domain manager mode */
183#define MI_PPM          0x40000000      /* Set subpage protection */
184#define MI_CIDEF        0x20000000      /* Set cache inhibit when MMU dis */
185#define MI_RSV4I        0x08000000      /* Reserve 4 TLB entries */
186#define MI_PPCS         0x02000000      /* Use MI_RPN prob/priv state */
187#define MI_IDXMASK      0x00001f00      /* TLB index to be loaded */
188#define MI_RESETVAL     0x00000000      /* Value of register at reset */
189
190/* These are the Ks and Kp from the PowerPC books.  For proper operation,
191 * Ks = 0, Kp = 1.
192 */
193#define MI_AP           786
194#define MI_Ks           0x80000000      /* Should not be set */
195#define MI_Kp           0x40000000      /* Should always be set */
196
197/* The effective page number register.  When read, contains the information
198 * about the last instruction TLB miss.  When MI_RPN is written, bits in
199 * this register are used to create the TLB entry.
200 */
201#define MI_EPN          787
202#define MI_EPNMASK      0xfffff000      /* Effective page number for entry */
203#define MI_EVALID       0x00000200      /* Entry is valid */
204#define MI_ASIDMASK     0x0000000f      /* ASID match value */
205                                        /* Reset value is undefined */
206
207/* A "level 1" or "segment" or whatever you want to call it register.
208 * For the instruction TLB, it contains bits that get loaded into the
209 * TLB entry when the MI_RPN is written.
210 */
211#define MI_TWC          789
212#define MI_APG          0x000001e0      /* Access protection group (0) */
213#define MI_GUARDED      0x00000010      /* Guarded storage */
214#define MI_PSMASK       0x0000000c      /* Mask of page size bits */
215#define MI_PS8MEG       0x0000000c      /* 8M page size */
216#define MI_PS512K       0x00000004      /* 512K page size */
217#define MI_PS4K_16K     0x00000000      /* 4K or 16K page size */
218#define MI_SVALID       0x00000001      /* Segment entry is valid */
219                                        /* Reset value is undefined */
220
221/* Real page number.  Defined by the pte.  Writing this register
222 * causes a TLB entry to be created for the instruction TLB, using
223 * additional information from the MI_EPN, and MI_TWC registers.
224 */
225#define MI_RPN          790
226
227/* Define an RPN value for mapping kernel memory to large virtual
228 * pages for boot initialization.  This has real page number of 0,
229 * large page size, shared page, cache enabled, and valid.
230 * Also mark all subpages valid and write access.
231 */
232#define MI_BOOTINIT     0x000001fd
233
234#define MD_CTR          792     /* Data TLB control register */
235#define MD_GPM          0x80000000      /* Set domain manager mode */
236#define MD_PPM          0x40000000      /* Set subpage protection */
237#define MD_CIDEF        0x20000000      /* Set cache inhibit when MMU dis */
238#define MD_WTDEF        0x10000000      /* Set writethrough when MMU dis */
239#define MD_RSV4I        0x08000000      /* Reserve 4 TLB entries */
240#define MD_TWAM         0x04000000      /* Use 4K page hardware assist */
241#define MD_PPCS         0x02000000      /* Use MI_RPN prob/priv state */
242#define MD_IDXMASK      0x00001f00      /* TLB index to be loaded */
243#define MD_RESETVAL     0x04000000      /* Value of register at reset */
244
245#define M_CASID         793     /* Address space ID (context) to match */
246#define MC_ASIDMASK     0x0000000f      /* Bits used for ASID value */
247
248
249/* These are the Ks and Kp from the PowerPC books.  For proper operation,
250 * Ks = 0, Kp = 1.
251 */
252#define MD_AP           794
253#define MD_Ks           0x80000000      /* Should not be set */
254#define MD_Kp           0x40000000      /* Should always be set */
255
256/* The effective page number register.  When read, contains the information
257 * about the last instruction TLB miss.  When MD_RPN is written, bits in
258 * this register are used to create the TLB entry.
259 */
260#define MD_EPN          795
261#define MD_EPNMASK      0xfffff000      /* Effective page number for entry */
262#define MD_EVALID       0x00000200      /* Entry is valid */
263#define MD_ASIDMASK     0x0000000f      /* ASID match value */
264                                        /* Reset value is undefined */
265
266/* The pointer to the base address of the first level page table.
267 * During a software tablewalk, reading this register provides the address
268 * of the entry associated with MD_EPN.
269 */
270#define M_TWB           796
271#define M_L1TB          0xfffff000      /* Level 1 table base address */
272#define M_L1INDX        0x00000ffc      /* Level 1 index, when read */
273                                        /* Reset value is undefined */
274
275/* A "level 1" or "segment" or whatever you want to call it register.
276 * For the data TLB, it contains bits that get loaded into the TLB entry
277 * when the MD_RPN is written.  It is also provides the hardware assist
278 * for finding the PTE address during software tablewalk.
279 */
280#define MD_TWC          797
281#define MD_L2TB         0xfffff000      /* Level 2 table base address */
282#define MD_L2INDX       0xfffffe00      /* Level 2 index (*pte), when read */
283#define MD_APG          0x000001e0      /* Access protection group (0) */
284#define MD_GUARDED      0x00000010      /* Guarded storage */
285#define MD_PSMASK       0x0000000c      /* Mask of page size bits */
286#define MD_PS8MEG       0x0000000c      /* 8M page size */
287#define MD_PS512K       0x00000004      /* 512K page size */
288#define MD_PS4K_16K     0x00000000      /* 4K or 16K page size */
289#define MD_WT           0x00000002      /* Use writethrough page attribute */
290#define MD_SVALID       0x00000001      /* Segment entry is valid */
291                                        /* Reset value is undefined */
292
293
294/* Real page number.  Defined by the pte.  Writing this register
295 * causes a TLB entry to be created for the data TLB, using
296 * additional information from the MD_EPN, and MD_TWC registers.
297 */
298#define MD_RPN          798
299
300/* This is a temporary storage register that could be used to save
301 * a processor working register during a tablewalk.
302 */
303#define M_TW            799
304#endif /* _LIBCPU_MMU_H */
Note: See TracBrowser for help on using the repository browser.