Hi, spotted this while looking at how deep the hole suggested by mpi@ is. memhook is used by mmrw minor case 0, and the diff below fixes that. rest of it should be logically solid improvement, but given the state of arm64 internals w/all the "// XXXshit", and how sacred these arch-md bootstraps are to be above all cleanup, i guess i'll come up w/minimal diff later.
-Artturi diff --git a/sys/arch/arm64/arm64/machdep.c b/sys/arch/arm64/arm64/machdep.c index d1d5a673849..505fa4e1510 100644 --- a/sys/arch/arm64/arm64/machdep.c +++ b/sys/arch/arm64/arm64/machdep.c @@ -833,13 +833,6 @@ initarm(struct arm64_bootparams *abp) msgbufphys = pmap_steal_avail(round_page(MSGBUFSIZE), PAGE_SIZE, NULL); vstart += round_page(MSGBUFSIZE); - zero_page = vstart; - vstart += PAGE_SIZE; - copy_src_page = vstart; - vstart += PAGE_SIZE; - copy_dst_page = vstart; - vstart += PAGE_SIZE; - /* Relocate the FDT to safe memory. */ if (fdt_get_size(config) != 0) { uint32_t csize, size = round_page(fdt_get_size(config)); diff --git a/sys/arch/arm64/arm64/pmap.c b/sys/arch/arm64/arm64/pmap.c index 067b1ea2a53..61cfc279a74 100644 --- a/sys/arch/arm64/arm64/pmap.c +++ b/sys/arch/arm64/arm64/pmap.c @@ -155,6 +155,11 @@ struct mem_region *pmap_allocated = &pmap_allocated_regions[0]; int pmap_cnt_avail, pmap_cnt_allocated; uint64_t pmap_avail_kvo; +/* static free VAs setup during bootstrap */ +char *memhook; +vaddr_t zero_page; +vaddr_t copy_src_page; +vaddr_t copy_dst_page; /* virtual to physical helpers */ static inline int @@ -1201,6 +1206,16 @@ pmap_bootstrap(long kvo, paddr_t lpt1, long kernelstart, long kernelend, printf("all mapped\n"); + /* claim some static KVAs used by mmrw/pmap_zero_page/pmap_copy_page */ + memhook = (char *)vstart; + vstart += PAGE_SIZE; + zero_page = vstart; + vstart += PAGE_SIZE; + copy_src_page = vstart; + vstart += PAGE_SIZE; + copy_dst_page = vstart; + vstart += PAGE_SIZE; + return vstart; } @@ -1650,11 +1665,6 @@ pmap_update(pmap_t pm) { } -char *memhook; -vaddr_t zero_page; -vaddr_t copy_src_page; -vaddr_t copy_dst_page; - int pmap_is_referenced(struct vm_page *pg) {