d465c6e8a954f4e6726a458b5015911757f88bfb
[barrelfish] / include / target / arm / barrelfish_kpi / paging_arm_v7m.h
1 /**
2  * \file
3  * \brief Paging definitions for arm_v7m.
4  * this reflects the page table entry format on the cortex-M3 on the pandaboard, which
5  * may not be the same as that of other armv7-m implementations (as the pure armv7-m
6  * specification does not define any kind of address translation mechanism)
7  * Alignment and size of tables is the same as for other armv7 architectures,
8  * but it lacks all permission bits, providing endianness control instead
9  */
10
11 /*
12  * Copyright (c) 2012, ETH Zurich.
13  * All rights reserved.
14  *
15  * This file is distributed under the terms in the attached LICENSE file.
16  * If you do not find this file, copies can be found by writing to:
17  * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
18  */
19 //TODO: heteropanda: maybe use the ignored bits in each entry to store metadata
20 //  at least put a bit for cacheability in there
21 #ifndef TARGET_ARM_BARRELFISH_KPI_PAGING_ARM_V7M_H
22 #define TARGET_ARM_BARRELFISH_KPI_PAGING_ARM_V7M_H
23
24
25 /* Default page size is 4K */
26 #define BASE_PAGE_BITS          12
27 #define BASE_PAGE_SIZE          (1u << BASE_PAGE_BITS)
28 #define BASE_PAGE_MASK          (BASE_PAGE_SIZE - 1)
29 #define BASE_PAGE_OFFSET(a)     ((a) & BASE_PAGE_MASK)
30
31 #define LARGE_PAGE_MASK                 0x0000FFFF  //64KB large page
32
33 #define ARM_L1_OFFSET(addr)       (((uintptr_t)addr) >> 20)
34 #define ARM_L2_OFFSET(addr)       ((((uintptr_t)addr) >> 12) & 0xff)
35 #define ARM_PAGE_OFFSET(addr)     ((uintptr_t)addr & 0xfff)
36
37 #define ARM_L1_ALIGN                    16384u
38
39 #define ARM_L1_MAX_ENTRIES              4096u
40 #define ARM_L1_BYTES_PER_ENTRY          4u
41 #define ARM_L1_SECTION_BYTES            (1024u * 1024u)
42 #define ARM_L1_SECTION_MASK             0x000FFFFF
43
44 #define ARM_L1_SUPERSECTION_MASK        0x00FFFFFF
45
46 #define ARM_L2_ALIGN                    1024u
47 #define ARM_L2_MAX_ENTRIES              256u
48 #define ARM_L2_BYTES_PER_ENTRY          4u
49 #define ARM_L2_TABLE_BYTES              ARM_L2_ALIGN
50
51 //#define ARM_L2_SMALL_CACHEABLE          0x008
52 //#define ARM_L2_SMALL_BUFFERABLE         0x004
53 //#define ARM_L2_SMALL_USR_RO             0x20
54 //#define ARM_L2_SMALL_USR_RW             0x30
55 //#define ARM_L2_SMALL_USR_NONE            0x10
56
57 /* Page type independent page options */
58 #define KPI_PAGING_FLAGS_READ    0x01
59 #define KPI_PAGING_FLAGS_WRITE   0x02
60 #define KPI_PAGING_FLAGS_EXECUTE 0x04
61 #define KPI_PAGING_FLAGS_NOCACHE 0x08
62 #define KPI_PAGING_FLAGS_MASK    0x0f
63
64 union arm_l1_entry {
65     uint32_t raw;
66
67     /// Invalid L1 entry
68     struct {
69         uint32_t        type            :2;     // == 0
70     } invalid;
71
72     /// L1 entry for 256 4K L2 entries
73     struct {
74         uint32_t        type            :2;     // == 1
75         uint32_t        ignored3        :8;     //XXX: we currently use this byte to keep version numbers for the table
76         uint32_t        base_address    :22;
77     } page_table;
78
79     /// L1 entry for 1MB mapped section
80     struct {
81         uint32_t        type            :2;     // == 2
82         uint32_t        ignored3        :8;
83         uint32_t        element_size    :2;        // for endianness conversion (should be irrelevant) - use "3" if in doubt
84         uint32_t        ignored2        :3;        // type extension
85         uint32_t        endianness      :1;        // locked on "0", little endian
86         uint32_t        ignored1        :1;
87         uint32_t        mixed_region    :1;
88         uint32_t        mbz0            :1;        //must be zero
89         uint32_t        ignored0        :1;
90         uint32_t        base_address    :12;
91     } section;
92
93     /// L1 entry for 16MB mapped super section
94     struct {
95         uint32_t        type            :2;     // == 3
96         uint32_t        ignored3        :8;
97         uint32_t        element_size    :2;        // for endianness conversion (should be irrelevant)
98         uint32_t        ignored2        :3;        // type extension
99         uint32_t        endianness      :1;        // locked on "0", little endian
100         uint32_t        ignored1        :1;
101         uint32_t        mixed_region    :1;
102         uint32_t        mbo0            :1;        //must be one
103         uint32_t        ignored0        :5;
104         uint32_t        base_address    :8;
105     } super_section;
106
107 };
108
109 #define L1_TYPE_INVALID_ENTRY           0
110 #define L1_TYPE_PAGE_TABLE_ENTRY        1
111 #define L1_TYPE_SECTION_ENTRY           2
112 #define L1_TYPE_SUPER_SECTION_ENTRY     3
113 #define L1_TYPE(x)              ((x) & 3)
114
115 union arm_l2_entry {
116     uint32_t raw;
117
118     /// Invalid L2 entry
119     struct {
120         uint32_t        type            :2;     // == 0
121     } invalid;
122
123     /// Descriptior for a 64K page
124     struct {
125         uint32_t        type            :2;     // == 1
126         uint32_t        ignored3        :2;
127         uint32_t        element_size    :2;        // for endianness conversion (should be irrelevant)
128         uint32_t        ignored2        :3;        // type extension
129         uint32_t        endianness      :1;        // locked on "0", little endian
130         uint32_t        ignored1        :1;
131         uint32_t        mixed_region    :1;
132         uint32_t        ignored0        :4;
133         uint32_t        base_address    :16;
134     } large_page;
135
136     /// Descriptor for a 4K page
137     struct {
138         uint32_t        type            :2;        // == 2 or 3
139         uint32_t        ignored3        :2;
140         uint32_t        element_size    :2;        // for endianness conversion (should be irrelevant)
141         uint32_t        ignored2        :3;        // type extension
142         uint32_t        endianness      :1;        // locked on "0", little endian
143         uint32_t        ignored1        :1;
144         uint32_t        mixed_region    :1;
145         uint32_t        base_address    :20;
146     } small_page;
147
148 };
149
150
151 #define L2_TYPE_INVALID_PAGE    0
152 #define L2_TYPE_LARGE_PAGE      1
153 #define L2_TYPE_SMALL_PAGE      2
154 #define L2_TYPE_SMALL_PAGE_XN   3
155 #define L2_TYPE(x)              ((x) & 3)
156
157 #define BYTES_PER_SECTION       0x100000
158 #define BYTES_PER_LARGE_PAGE    0x10000
159 #define BYTES_PER_PAGE          0x1000
160 #define BYTES_PER_SMALL_PAGE    0x400
161
162
163
164 #endif // TARGET_ARM_BARRELFISH_KPI_PAGING_ARM_V7M_H