Changeset View
Changeset View
Standalone View
Standalone View
sys/amd64/include/vmparam.h
Show First 20 Lines • Show All 238 Lines • ▼ Show 20 Lines | |||||||||
/* | /* | ||||||||
* XXX Allowing dmaplimit == 0 is a temporary workaround for vt(4) efifb's | * XXX Allowing dmaplimit == 0 is a temporary workaround for vt(4) efifb's | ||||||||
* early use of PHYS_TO_DMAP before the mapping is actually setup. This works | * early use of PHYS_TO_DMAP before the mapping is actually setup. This works | ||||||||
* because the result is not actually accessed until later, but the early | * because the result is not actually accessed until later, but the early | ||||||||
* vt fb startup needs to be reworked. | * vt fb startup needs to be reworked. | ||||||||
*/ | */ | ||||||||
#define PHYS_IN_DMAP(pa) (dmaplimit == 0 || (pa) < dmaplimit) | #define PHYS_IN_DMAP(pa) (dmaplimit == 0 || (pa) < dmaplimit) | ||||||||
#define PHYS_SZ_IN_DMAP(pa, sz) PHYS_IN_DMAP((pa) + (sz)) | |||||||||
kib: No, this is not what I mean. PHYS_SZ_IN_DMAP(pa, sz) should verify that [pa, ps+sz) is mapped… | |||||||||
Not Done Inline ActionsFYI, downstream in CheriBSD we have found uses for this on RISC-V as well, so I had suggested to Alfredo to move this to <vm/vm_param.h>. While PHYS_IN_DMAP is inherently MD, this new macro is not. jhb: FYI, downstream in CheriBSD we have found uses for this on RISC-V as well, so I had suggested… | |||||||||
#define VIRT_IN_DMAP(va) ((va) >= DMAP_MIN_ADDRESS && \ | #define VIRT_IN_DMAP(va) ((va) >= DMAP_MIN_ADDRESS && \ | ||||||||
Done Inline Actions
Should the check verify pa+sz-1 instead of pa+sz? Consider the last page in the DMAP, at the address x. If you want to check if the whole page belongs to DMAP-mapped region, you would check the x+PAGE_SIZE address, which lives in the next page not covered by DMAP. kib: Should the check verify pa+sz-1 instead of pa+sz? Consider the last page in the DMAP, at the… | |||||||||
Done Inline ActionsUh, yes I think it should, the check in PHYS_IN_DMAP uses strict inequality for (pa) < dmaplimit. alfredo.mazzinghi_cl.cam.ac.uk: Uh, yes I think it should, the check in PHYS_IN_DMAP uses strict inequality for `(pa) <… | |||||||||
(va) < (DMAP_MIN_ADDRESS + dmaplimit)) | (va) < (DMAP_MIN_ADDRESS + dmaplimit)) | ||||||||
#define PMAP_HAS_DMAP 1 | #define PMAP_HAS_DMAP 1 | ||||||||
#define PHYS_TO_DMAP(x) ({ \ | #define PHYS_TO_DMAP(x) ({ \ | ||||||||
KASSERT(PHYS_IN_DMAP(x), \ | KASSERT(PHYS_IN_DMAP(x), \ | ||||||||
("physical address %#jx not covered by the DMAP", \ | ("physical address %#jx not covered by the DMAP", \ | ||||||||
(uintmax_t)x)); \ | (uintmax_t)x)); \ | ||||||||
(x) | DMAP_MIN_ADDRESS; }) | (x) | DMAP_MIN_ADDRESS; }) | ||||||||
▲ Show 20 Lines • Show All 49 Lines • Show Last 20 Lines |
No, this is not what I mean. PHYS_SZ_IN_DMAP(pa, sz) should verify that [pa, ps+sz) is mapped by DMAP.