Rev 1702 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1702 | Rev 1780 | ||
---|---|---|---|
Line 25... | Line 25... | ||
25 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
25 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
26 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
26 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
27 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
28 | */ |
28 | */ |
29 | 29 | ||
30 | /** @addtogroup ia64mm |
30 | /** @addtogroup ia64mm |
31 | * @{ |
31 | * @{ |
32 | */ |
32 | */ |
33 | /** @file |
33 | /** @file |
34 | */ |
34 | */ |
35 | 35 | ||
Line 59... | Line 59... | ||
59 | #define VRN_KERNEL 7LL |
59 | #define VRN_KERNEL 7LL |
60 | #endif |
60 | #endif |
61 | 61 | ||
62 | #define REGION_REGISTERS 8 |
62 | #define REGION_REGISTERS 8 |
63 | 63 | ||
64 | #define KA2PA(x) ((__address) (x-(VRN_KERNEL<<VRN_SHIFT))) |
64 | #define KA2PA(x) ((uintptr_t) (x-(VRN_KERNEL<<VRN_SHIFT))) |
65 | #define PA2KA(x) ((__address) (x+(VRN_KERNEL<<VRN_SHIFT))) |
65 | #define PA2KA(x) ((uintptr_t) (x+(VRN_KERNEL<<VRN_SHIFT))) |
66 | 66 | ||
67 | #define VHPT_WIDTH 20 /* 1M */ |
67 | #define VHPT_WIDTH 20 /* 1M */ |
68 | #define VHPT_SIZE (1 << VHPT_WIDTH) |
68 | #define VHPT_SIZE (1 << VHPT_WIDTH) |
69 | 69 | ||
70 | #define PTA_BASE_SHIFT 15 |
70 | #define PTA_BASE_SHIFT 15 |
Line 124... | Line 124... | ||
124 | 124 | ||
125 | /* Word 2 */ |
125 | /* Word 2 */ |
126 | union vhpt_tag tag; |
126 | union vhpt_tag tag; |
127 | 127 | ||
128 | /* Word 3 */ |
128 | /* Word 3 */ |
129 | __u64 ig3 : 64; |
129 | uint64_t ig3 : 64; |
130 | } __attribute__ ((packed)); |
130 | } __attribute__ ((packed)); |
131 | 131 | ||
132 | struct vhpt_entry_not_present { |
132 | struct vhpt_entry_not_present { |
133 | /* Word 0 */ |
133 | /* Word 0 */ |
134 | unsigned p : 1; |
134 | unsigned p : 1; |
Line 142... | Line 142... | ||
142 | 142 | ||
143 | /* Word 2 */ |
143 | /* Word 2 */ |
144 | union vhpt_tag tag; |
144 | union vhpt_tag tag; |
145 | 145 | ||
146 | /* Word 3 */ |
146 | /* Word 3 */ |
147 | __u64 ig3 : 64; |
147 | uint64_t ig3 : 64; |
148 | } __attribute__ ((packed)); |
148 | } __attribute__ ((packed)); |
149 | 149 | ||
150 | typedef union vhpt_entry { |
150 | typedef union vhpt_entry { |
151 | struct vhpt_entry_present present; |
151 | struct vhpt_entry_present present; |
152 | struct vhpt_entry_not_present not_present; |
152 | struct vhpt_entry_not_present not_present; |
153 | __u64 word[4]; |
153 | uint64_t word[4]; |
154 | } vhpt_entry_t; |
154 | } vhpt_entry_t; |
155 | 155 | ||
156 | struct region_register_map { |
156 | struct region_register_map { |
157 | unsigned ve : 1; |
157 | unsigned ve : 1; |
158 | unsigned : 1; |
158 | unsigned : 1; |
Line 175... | Line 175... | ||
175 | unsigned long long base : 49; |
175 | unsigned long long base : 49; |
176 | } __attribute__ ((packed)); |
176 | } __attribute__ ((packed)); |
177 | 177 | ||
178 | typedef union pta_register { |
178 | typedef union pta_register { |
179 | struct pta_register_map map; |
179 | struct pta_register_map map; |
180 | __u64 word; |
180 | uint64_t word; |
181 | } pta_register; |
181 | } pta_register; |
182 | 182 | ||
183 | /** Return Translation Hashed Entry Address. |
183 | /** Return Translation Hashed Entry Address. |
184 | * |
184 | * |
185 | * VRN bits are used to read RID (ASID) from one |
185 | * VRN bits are used to read RID (ASID) from one |
Line 187... | Line 187... | ||
187 | * |
187 | * |
188 | * @param va Virtual address including VRN bits. |
188 | * @param va Virtual address including VRN bits. |
189 | * |
189 | * |
190 | * @return Address of the head of VHPT collision chain. |
190 | * @return Address of the head of VHPT collision chain. |
191 | */ |
191 | */ |
192 | static inline __u64 thash(__u64 va) |
192 | static inline uint64_t thash(uint64_t va) |
193 | { |
193 | { |
194 | __u64 ret; |
194 | uint64_t ret; |
195 | 195 | ||
196 | __asm__ volatile ("thash %0 = %1\n" : "=r" (ret) : "r" (va)); |
196 | __asm__ volatile ("thash %0 = %1\n" : "=r" (ret) : "r" (va)); |
197 | 197 | ||
198 | return ret; |
198 | return ret; |
199 | } |
199 | } |
Line 205... | Line 205... | ||
205 | * |
205 | * |
206 | * @param va Virtual address including VRN bits. |
206 | * @param va Virtual address including VRN bits. |
207 | * |
207 | * |
208 | * @return The unique tag for VPN and RID in the collision chain returned by thash(). |
208 | * @return The unique tag for VPN and RID in the collision chain returned by thash(). |
209 | */ |
209 | */ |
210 | static inline __u64 ttag(__u64 va) |
210 | static inline uint64_t ttag(uint64_t va) |
211 | { |
211 | { |
212 | __u64 ret; |
212 | uint64_t ret; |
213 | 213 | ||
214 | __asm__ volatile ("ttag %0 = %1\n" : "=r" (ret) : "r" (va)); |
214 | __asm__ volatile ("ttag %0 = %1\n" : "=r" (ret) : "r" (va)); |
215 | 215 | ||
216 | return ret; |
216 | return ret; |
217 | } |
217 | } |
Line 220... | Line 220... | ||
220 | * |
220 | * |
221 | * @param i Region register index. |
221 | * @param i Region register index. |
222 | * |
222 | * |
223 | * @return Current contents of rr[i]. |
223 | * @return Current contents of rr[i]. |
224 | */ |
224 | */ |
225 | static inline __u64 rr_read(index_t i) |
225 | static inline uint64_t rr_read(index_t i) |
226 | { |
226 | { |
227 | __u64 ret; |
227 | uint64_t ret; |
228 | ASSERT(i < REGION_REGISTERS); |
228 | ASSERT(i < REGION_REGISTERS); |
229 | __asm__ volatile ("mov %0 = rr[%1]\n" : "=r" (ret) : "r" (i << VRN_SHIFT)); |
229 | __asm__ volatile ("mov %0 = rr[%1]\n" : "=r" (ret) : "r" (i << VRN_SHIFT)); |
230 | return ret; |
230 | return ret; |
231 | } |
231 | } |
232 | 232 | ||
233 | /** Write Region Register. |
233 | /** Write Region Register. |
234 | * |
234 | * |
235 | * @param i Region register index. |
235 | * @param i Region register index. |
236 | * @param v Value to be written to rr[i]. |
236 | * @param v Value to be written to rr[i]. |
237 | */ |
237 | */ |
238 | static inline void rr_write(index_t i, __u64 v) |
238 | static inline void rr_write(index_t i, uint64_t v) |
239 | { |
239 | { |
240 | ASSERT(i < REGION_REGISTERS); |
240 | ASSERT(i < REGION_REGISTERS); |
241 | __asm__ volatile ( |
241 | __asm__ volatile ( |
242 | "mov rr[%0] = %1\n" |
242 | "mov rr[%0] = %1\n" |
243 | : |
243 | : |
Line 247... | Line 247... | ||
247 | 247 | ||
248 | /** Read Page Table Register. |
248 | /** Read Page Table Register. |
249 | * |
249 | * |
250 | * @return Current value stored in PTA. |
250 | * @return Current value stored in PTA. |
251 | */ |
251 | */ |
252 | static inline __u64 pta_read(void) |
252 | static inline uint64_t pta_read(void) |
253 | { |
253 | { |
254 | __u64 ret; |
254 | uint64_t ret; |
255 | 255 | ||
256 | __asm__ volatile ("mov %0 = cr.pta\n" : "=r" (ret)); |
256 | __asm__ volatile ("mov %0 = cr.pta\n" : "=r" (ret)); |
257 | 257 | ||
258 | return ret; |
258 | return ret; |
259 | } |
259 | } |
260 | 260 | ||
261 | /** Write Page Table Register. |
261 | /** Write Page Table Register. |
262 | * |
262 | * |
263 | * @param v New value to be stored in PTA. |
263 | * @param v New value to be stored in PTA. |
264 | */ |
264 | */ |
265 | static inline void pta_write(__u64 v) |
265 | static inline void pta_write(uint64_t v) |
266 | { |
266 | { |
267 | __asm__ volatile ("mov cr.pta = %0\n" : : "r" (v)); |
267 | __asm__ volatile ("mov cr.pta = %0\n" : : "r" (v)); |
268 | } |
268 | } |
269 | 269 | ||
270 | extern void page_arch_init(void); |
270 | extern void page_arch_init(void); |
271 | 271 | ||
272 | extern vhpt_entry_t *vhpt_hash(__address page, asid_t asid); |
272 | extern vhpt_entry_t *vhpt_hash(uintptr_t page, asid_t asid); |
273 | extern bool vhpt_compare(__address page, asid_t asid, vhpt_entry_t *v); |
273 | extern bool vhpt_compare(uintptr_t page, asid_t asid, vhpt_entry_t *v); |
274 | extern void vhpt_set_record(vhpt_entry_t *v, __address page, asid_t asid, __address frame, int flags); |
274 | extern void vhpt_set_record(vhpt_entry_t *v, uintptr_t page, asid_t asid, uintptr_t frame, int flags); |
275 | 275 | ||
276 | #endif /* __ASM__ */ |
276 | #endif /* __ASM__ */ |
277 | 277 | ||
278 | #endif /* KERNEL */ |
278 | #endif /* KERNEL */ |
279 | 279 | ||
280 | #endif |
280 | #endif |
281 | 281 | ||
282 | /** @} |
282 | /** @} |
283 | */ |
283 | */ |
284 | - |