View | Details | Raw Unified | Return to bug 278233
Collapse All | Expand All

(-)b/sys/arm64/arm64/pmap.c (+8 lines)
Lines 342-347 struct pv_chunks_list __exclusive_cache_line pv_chunks[PMAP_MEMDOM]; Link Here
342
vm_paddr_t dmap_phys_base;     /* The start of the dmap region */
342
vm_paddr_t dmap_phys_base;     /* The start of the dmap region */
343
vm_paddr_t dmap_phys_max;      /* The limit of the dmap region */
343
vm_paddr_t dmap_phys_max;      /* The limit of the dmap region */
344
vm_offset_t dmap_max_addr;     /* The virtual address limit of the dmap */
344
vm_offset_t dmap_max_addr;     /* The virtual address limit of the dmap */
345
struct direct_map_desc dmap_desc[MAX_DMAP_ENTRIES];
345
346
346
extern pt_entry_t pagetable_l0_ttbr1[];
347
extern pt_entry_t pagetable_l0_ttbr1[];
347
348
Lines 1156-1161 pmap_bootstrap_l3_page(struct pmap_bootstrap_state *state, int i) Link Here
1156
static void
1157
static void
1157
pmap_bootstrap_dmap(vm_paddr_t min_pa)
1158
pmap_bootstrap_dmap(vm_paddr_t min_pa)
1158
{
1159
{
1160
       int dmap_desc_idx;
1159
       int i;
1161
       int i;
1160
1162
1161
       dmap_phys_base = min_pa & ~L1_OFFSET;
1163
       dmap_phys_base = min_pa & ~L1_OFFSET;
Lines 1166-1171 pmap_bootstrap_dmap(vm_paddr_t min_pa) Link Here
1166
               bs_state.pa = physmap[i] & ~L3_OFFSET;
1168
               bs_state.pa = physmap[i] & ~L3_OFFSET;
1167
               bs_state.va = bs_state.pa - dmap_phys_base + DMAP_MIN_ADDRESS;
1169
               bs_state.va = bs_state.pa - dmap_phys_base + DMAP_MIN_ADDRESS;
1168
1170
1171
               dmap_desc_idx = i / 2;
1172
               dmap_desc[dmap_desc_idx].pa_start = bs_state.pa;
1173
               dmap_desc[dmap_desc_idx].va_start = bs_state.va;
1174
               dmap_desc[dmap_desc_idx].size = physmap[i + 1] - dmap_desc[dmap_desc_idx].pa_start;
1175
               dmap_desc[dmap_desc_idx].flags = DMAP_FLAG_VALID;
1176
1169
               /* Create L3 mappings at the start of the region */
1177
               /* Create L3 mappings at the start of the region */
1170
               if ((bs_state.pa & L2_OFFSET) != 0)
1178
               if ((bs_state.pa & L2_OFFSET) != 0)
1171
                       pmap_bootstrap_l3_page(&bs_state, i);
1179
                       pmap_bootstrap_l3_page(&bs_state, i);
(-)b/sys/arm64/include/vmparam.h (-6 / +50 lines)
Lines 178-183 Link Here
178
 * VM_MIN_USER_ADDRESS and VM_MAX_USER_ADDRESS define the start and end of the
178
 * VM_MIN_USER_ADDRESS and VM_MAX_USER_ADDRESS define the start and end of the
179
 * user address space.
179
 * user address space.
180
 */
180
 */
181
182
#ifndef LOCORE
183
#define        DMAP_FLAG_VALID         (0x1)
184
185
#define        MAX_DMAP_ENTRIES        64
186
struct direct_map_desc {
187
       uint64_t        pa_start;
188
       uint64_t        va_start;
189
       uint64_t        size;
190
       uint64_t        flags;
191
};
192
193
extern struct direct_map_desc dmap_desc[];
194
#endif
195
181
#define        VM_MIN_ADDRESS          (0x0000000000000000UL)
196
#define        VM_MIN_ADDRESS          (0x0000000000000000UL)
182
#define        VM_MAX_ADDRESS          (0xffffffffffffffffUL)
197
#define        VM_MAX_ADDRESS          (0xffffffffffffffffUL)
183
198
Lines 223-234 Link Here
223
#define        DMAP_MIN_PHYSADDR       (dmap_phys_base)
238
#define        DMAP_MIN_PHYSADDR       (dmap_phys_base)
224
#define        DMAP_MAX_PHYSADDR       (dmap_phys_max)
239
#define        DMAP_MAX_PHYSADDR       (dmap_phys_max)
225
240
226
/* True if pa is in the dmap range */
241
#ifndef LOCORE
227
#define        PHYS_IN_DMAP(pa)        ((pa) >= DMAP_MIN_PHYSADDR && \
242
static inline int
228
    (pa) < DMAP_MAX_PHYSADDR)
243
PHYS_IN_DMAP(uint64_t pa)
229
/* True if va is in the dmap range */
244
{
230
#define        VIRT_IN_DMAP(va)        ((va) >= DMAP_MIN_ADDRESS && \
245
       struct direct_map_desc *desc;
231
    (va) < (dmap_max_addr))
246
       int a;
247
248
       for (a = 0; a < MAX_DMAP_ENTRIES; a++) {
249
               desc = &dmap_desc[a];
250
               if (desc->flags == DMAP_FLAG_VALID) {
251
                       if (pa >= desc->pa_start && pa <= desc->pa_start + desc->size)
252
                               return (1);
253
               }
254
       }
255
256
       return (0);
257
}
258
259
static inline int
260
VIRT_IN_DMAP(uint64_t va)
261
{
262
       struct direct_map_desc *desc;
263
       int a;
264
265
       for (a = 0; a < MAX_DMAP_ENTRIES; a++) {
266
               desc = &dmap_desc[a];
267
               if (desc->flags == DMAP_FLAG_VALID) {
268
                       if (va >= desc->va_start && va <= desc->va_start + desc->size)
269
                               return (1);
270
               }
271
       }
272
273
       return (0);
274
}
275
#endif
232
276
233
#define        PMAP_HAS_DMAP   1
277
#define        PMAP_HAS_DMAP   1
234
#define        PHYS_TO_DMAP(pa)                                                \
278
#define        PHYS_TO_DMAP(pa)                                                \

Return to bug 278233