Rev 756 | Rev 818 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 756 | Rev 792 | ||
---|---|---|---|
Line 43... | Line 43... | ||
43 | #define KA2PA(x) ((__address) (x)) |
43 | #define KA2PA(x) ((__address) (x)) |
44 | #define PA2KA(x) ((__address) (x)) |
44 | #define PA2KA(x) ((__address) (x)) |
45 | 45 | ||
46 | #define SET_PTL0_ADDRESS_ARCH(x) /**< To be removed as situation permits. */ |
46 | #define SET_PTL0_ADDRESS_ARCH(x) /**< To be removed as situation permits. */ |
47 | 47 | ||
48 | /** Implementation of page hash table interface. */ |
- | |
49 | #define HT_WIDTH_ARCH 20 /* 1M */ |
- | |
50 | #define HT_HASH_ARCH(page, asid) vhpt_hash((page), (asid)) |
- | |
51 | #define HT_COMPARE_ARCH(page, asid, t) vhpt_compare((page), (asid), (t)) |
- | |
52 | #define HT_SLOT_EMPTY_ARCH(t) ((t)->present.tag.tag_info.ti) |
- | |
53 | #define HT_INVALIDATE_SLOT_ARCH(t) (t)->present.tag.tag_info.ti = true |
- | |
54 | #define HT_GET_NEXT_ARCH(t) (t)->present.next |
- | |
55 | #define HT_SET_NEXT_ARCH(t, s) (t)->present.next = (s) |
- | |
56 | #define HT_SET_RECORD_ARCH(t, page, asid, frame, flags) vhpt_set_record(t, page, asid, frame, flags) |
- | |
57 | - | ||
58 | #define PPN_SHIFT 12 |
48 | #define PPN_SHIFT 12 |
59 | 49 | ||
60 | #define VRN_SHIFT 61 |
50 | #define VRN_SHIFT 61 |
61 | #define VRN_MASK (7LL << VRN_SHIFT) |
51 | #define VRN_MASK (7LL << VRN_SHIFT) |
62 | #define VRN_KERNEL 0 |
52 | #define VRN_KERNEL 0 |
63 | #define REGION_REGISTERS 8 |
53 | #define REGION_REGISTERS 8 |
64 | 54 | ||
65 | #define VHPT_WIDTH 20 /* 1M */ |
55 | #define VHPT_WIDTH 20 /* 1M */ |
66 | #define VHPT_SIZE (1<<VHPT_WIDTH) |
56 | #define VHPT_SIZE (1 << VHPT_WIDTH) |
67 | #define VHPT_BASE page_ht /* Must be aligned to VHPT_SIZE */ |
57 | #define VHPT_BASE 0 /* Must be aligned to VHPT_SIZE */ |
68 | 58 | ||
69 | #define PTA_BASE_SHIFT 15 |
59 | #define PTA_BASE_SHIFT 15 |
70 | 60 | ||
71 | /** Memory Attributes. */ |
61 | /** Memory Attributes. */ |
72 | #define MA_WRITEBACK 0x0 |
62 | #define MA_WRITEBACK 0x0 |
Line 113... | Line 103... | ||
113 | 103 | ||
114 | /* Word 2 */ |
104 | /* Word 2 */ |
115 | union vhpt_tag tag; |
105 | union vhpt_tag tag; |
116 | 106 | ||
117 | /* Word 3 */ |
107 | /* Word 3 */ |
118 | pte_t *next; /**< Collision chain next pointer. */ |
108 | __u64 ig3 : 64; |
119 | } __attribute__ ((packed)); |
109 | } __attribute__ ((packed)); |
120 | 110 | ||
121 | struct vhpt_entry_not_present { |
111 | struct vhpt_entry_not_present { |
122 | /* Word 0 */ |
112 | /* Word 0 */ |
123 | unsigned p : 1; |
113 | unsigned p : 1; |
Line 131... | Line 121... | ||
131 | 121 | ||
132 | /* Word 2 */ |
122 | /* Word 2 */ |
133 | union vhpt_tag tag; |
123 | union vhpt_tag tag; |
134 | 124 | ||
135 | /* Word 3 */ |
125 | /* Word 3 */ |
136 | pte_t *next; /**< Collision chain next pointer. */ |
126 | __u64 ig3 : 64; |
137 | - | ||
138 | } __attribute__ ((packed)); |
127 | } __attribute__ ((packed)); |
139 | 128 | ||
140 | typedef union vhpt_entry { |
129 | typedef union vhpt_entry { |
141 | struct vhpt_entry_present present; |
130 | struct vhpt_entry_present present; |
142 | struct vhpt_entry_not_present not_present; |
131 | struct vhpt_entry_not_present not_present; |
143 | __u64 word[4]; |
132 | __u64 word[4]; |
144 | } vhpt_entry; |
133 | } vhpt_entry_t; |
145 | 134 | ||
146 | struct region_register_map { |
135 | struct region_register_map { |
147 | unsigned ve : 1; |
136 | unsigned ve : 1; |
148 | unsigned : 1; |
137 | unsigned : 1; |
149 | unsigned ps : 6; |
138 | unsigned ps : 6; |
Line 255... | Line 244... | ||
255 | { |
244 | { |
256 | __asm__ volatile ("mov cr.pta = %0\n" : : "r" (v)); |
245 | __asm__ volatile ("mov cr.pta = %0\n" : : "r" (v)); |
257 | } |
246 | } |
258 | 247 | ||
259 | extern void page_arch_init(void); |
248 | extern void page_arch_init(void); |
- | 249 | ||
260 | extern pte_t *vhpt_hash(__address page, asid_t asid); |
250 | extern vhpt_entry_t *vhpt_hash(__address page, asid_t asid); |
261 | extern bool vhpt_compare(__address page, asid_t asid, pte_t *t); |
251 | extern bool vhpt_compare(__address page, asid_t asid, vhpt_entry_t *v); |
262 | extern void vhpt_set_record(pte_t *t, __address page, asid_t asid, __address frame, int flags); |
252 | extern void vhpt_set_record(vhpt_entry_t *v, __address page, asid_t asid, __address frame, int flags); |
263 | 253 | ||
264 | #endif |
254 | #endif |