Index: sys/arch/cats/cats/cats_machdep.c =================================================================== RCS file: /cvsroot/src/sys/arch/cats/cats/cats_machdep.c,v retrieving revision 1.83.6.1 diff -u -p -r1.83.6.1 cats_machdep.c --- sys/arch/cats/cats/cats_machdep.c 5 Jul 2017 15:48:01 -0000 1.83.6.1 +++ sys/arch/cats/cats/cats_machdep.c 28 Apr 2019 08:29:29 -0000 @@ -232,6 +232,9 @@ void footbridge_pci_bs_tag_init(void); * Relocating the kernel to the bottom of physical memory */ +#define KERN_PHYSTOV(bmi, pa) \ + ((vaddr_t)((paddr_t)(pa) - (bmi)->bmi_start + KERNEL_BASE)) + u_int initarm(void *arm_bootargs) { @@ -334,6 +337,24 @@ initarm(void *arm_bootargs) arm32_bootmem_init(ebsabootinfo.bt_memstart, ram_size, ebsabootinfo.bt_memstart); + /* + * The free blocks after the kernel from arm32_bootmem_init doesn't + * account for bt_memavail. Adjust for this. + */ + extern struct bootmem_info bootmem_info; + struct bootmem_info * const bmi = &bootmem_info; + + pv_addr_t *pv0 = &bmi->bmi_freeblocks[0]; + KASSERTMSG(pv0->pv_pa == bmi->bmi_kernelend, + "pv_pa %#lx kernelend %#lx", pv0->pv_pa, bmi->bmi_kernelend); + + pv0->pv_pa = ebsabootinfo.bt_memavail; + pv0->pv_va = KERN_PHYSTOV(bmi, pv0->pv_pa); + pv0->pv_size = bmi->bmi_end - pv0->pv_pa; + + printf("First freeblock adjusted to: %lx -> %lx\n", pv0->pv_pa, + pv0->pv_pa + pv0->pv_size - 1); + arm32_kernel_vm_init(KERNEL_VM_BASE, ARM_VECTORS_LOW, 0, cats_devmap, mapallmem_p); @@ -365,9 +386,6 @@ initarm(void *arm_bootargs) ebsabootinfo.bt_pargp, VM_PROT_READ, PTE_CACHE); } - extern struct bootmem_info bootmem_info; - struct bootmem_info * const bmi = &bootmem_info; - printf("Doing freeblocks: %d\n", bmi->bmi_nfreeblocks); for (size_t i = 0; i < bmi->bmi_nfreeblocks; i++) {