Index: sys/arch/aarch64/aarch64/aarch64_machdep.c =================================================================== RCS file: /cvsroot/src/sys/arch/aarch64/aarch64/aarch64_machdep.c,v retrieving revision 1.7 diff -u -p -r1.7 aarch64_machdep.c --- sys/arch/aarch64/aarch64/aarch64_machdep.c 17 Jul 2018 12:40:00 -0000 1.7 +++ sys/arch/aarch64/aarch64/aarch64_machdep.c 4 Aug 2018 13:31:58 -0000 @@ -34,6 +34,7 @@ __KERNEL_RCSID(1, "$NetBSD: aarch64_mach #include "opt_arm_debug.h" #include "opt_ddb.h" +#include "opt_fdt.h" #include "opt_kernhist.h" #include @@ -60,6 +61,15 @@ __KERNEL_RCSID(1, "$NetBSD: aarch64_mach #include #include +#include +//#include + +#ifdef VERBOSE_INIT_ARM +#define VPRINTF(...) printf(__VA_ARGS__) +#else +#define VPRINTF(...) do { } while (/* CONSTCOND */ 0) +#endif + char cpu_model[32]; char machine[] = MACHINE; char machine_arch[] = MACHINE_ARCH; @@ -85,6 +95,31 @@ vaddr_t physical_end; /* filled in before cleaning bss. keep in .data */ u_long kern_vtopdiff __attribute__((__section__(".data"))); +void +cpu_kernel_vm_init(uint64_t memory_start, uint64_t memory_size) +{ + + extern char __kernel_text[]; + extern char _end[]; + + vaddr_t kernstart = trunc_page((vaddr_t)__kernel_text); + vaddr_t kernend = round_page((vaddr_t)_end); + + paddr_t kernstart_phys = KERN_VTOPHYS(kernstart); + paddr_t kernend_phys = KERN_VTOPHYS(kernend); + + VPRINTF("%s: kernel phys start %lx end %lx\n", __func__, + kernstart_phys, kernend_phys); + + fdt_add_reserved_memory_range(kernstart_phys, + kernend_phys - kernstart_phys); + + /* + * XXX whole bunch of stuff to map kernel correctly + */ +} + + /* * Upper region: 0xffff_ffff_ffff_ffff Top of virtual memory @@ -143,8 +178,7 @@ initarm_common(vaddr_t kvm_base, vsize_t physical_start = bootconfig.dram[0].address; physical_end = physical_start + ptoa(bootconfig.dram[0].pages); -#ifdef VERBOSE_INIT_ARM - printf( + VPRINTF( "------------------------------------------\n" "kern_vtopdiff = 0x%016lx\n" "physical_start = 0x%016lx\n" @@ -171,7 +205,6 @@ initarm_common(vaddr_t kvm_base, vsize_t kernend, kernend_l2, VM_MAX_KERNEL_ADDRESS); -#endif /* * msgbuf is always allocated from bottom of 1st memory block. Index: sys/arch/aarch64/include/machdep.h =================================================================== RCS file: /cvsroot/src/sys/arch/aarch64/include/machdep.h,v retrieving revision 1.3 diff -u -p -r1.3 machdep.h --- sys/arch/aarch64/include/machdep.h 19 Jul 2018 18:27:26 -0000 1.3 +++ sys/arch/aarch64/include/machdep.h 4 Aug 2018 13:31:59 -0000 @@ -70,6 +70,7 @@ extern u_int arm_cpu_max; #endif vaddr_t initarm_common(vaddr_t, vsize_t, const struct boot_physmem *, size_t); +void cpu_kernel_vm_init(paddr_t, psize_t); void parse_mi_bootargs(char *); void dumpsys(void); Index: sys/arch/arm/arm32/arm32_machdep.c =================================================================== RCS file: /cvsroot/src/sys/arch/arm/arm32/arm32_machdep.c,v retrieving revision 1.116 diff -u -p -r1.116 arm32_machdep.c --- sys/arch/arm/arm32/arm32_machdep.c 31 Jul 2018 07:00:48 -0000 1.116 +++ sys/arch/arm/arm32/arm32_machdep.c 4 Aug 2018 13:32:00 -0000 @@ -45,6 +45,7 @@ __KERNEL_RCSID(0, "$NetBSD: arm32_machdep.c,v 1.116 2018/07/31 07:00:48 skrll Exp $"); #include "opt_arm_debug.h" +#include "opt_fdt.h" #include "opt_modular.h" #include "opt_md.h" #include "opt_pmap_debug.h" @@ -81,13 +82,17 @@ __KERNEL_RCSID(0, "$NetBSD: arm32_machde #include #include +#if defined(FDT) +#include +#include +#endif + #ifdef VERBOSE_INIT_ARM #define VPRINTF(...) printf(__VA_ARGS__) #else #define VPRINTF(...) do { } while (/* CONSTCOND */ 0) #endif - void (*cpu_reset_address)(void); /* Used by locore */ paddr_t cpu_reset_address_paddr; /* Used by locore */ @@ -763,3 +768,54 @@ mm_md_page_color(paddr_t pa, int *colorp return true; #endif } + +#if defined(FDT) +extern char KERNEL_BASE_phys[]; +#define KERNEL_BASE_PHYS ((paddr_t)KERNEL_BASE_phys) + +void +cpu_kernel_vm_init(paddr_t memory_start, psize_t memory_size) +{ + const struct arm_platform *plat = arm_fdt_platform(); + +#ifdef VERBOSE_INIT_ARM + extern char _end[]; + + const vaddr_t kernend = round_page((vaddr_t)_end); + + const paddr_t kernstart_phys = KERNEL_BASE_PHYS; + const paddr_t kernend_phys = KERN_VTOPHYS(kernend); +#endif + + VPRINTF("KERNEL_BASE=0x%x, " + "KERNEL_VM_BASE=0x%x, " + "KERNEL_VM_BASE - KERNEL_BASE=0x%x, " + "KERNEL_BASE_VOFFSET=0x%x\n", + KERNEL_BASE, + KERNEL_VM_BASE, + KERNEL_VM_BASE - KERNEL_BASE, + KERNEL_BASE_VOFFSET); + + VPRINTF("%s: kernel phys start %lx end %lx\n", __func__, + kernstart_phys, kernend_phys); + +#ifdef __HAVE_MM_MD_DIRECT_MAPPED_PHYS + const bool mapallmem_p = true; +#ifndef PMAP_NEED_ALLOC_POOLPAGE + if (memory_size > KERNEL_VM_BASE - KERNEL_BASE) { + VPRINTF("%s: dropping RAM size from %luMB to %uMB\n", + __func__, (unsigned long) (memory_size >> 20), + (KERNEL_VM_BASE - KERNEL_BASE) >> 20); + memory_size = KERNEL_VM_BASE - KERNEL_BASE; + } +#endif +#else + const bool mapallmem_p = false; +#endif + + arm32_bootmem_init(memory_start, memory_size, KERNEL_BASE_PHYS); + arm32_kernel_vm_init(KERNEL_VM_BASE, ARM_VECTORS_HIGH, 0, + plat->devmap(), mapallmem_p); +} +#endif + Index: sys/arch/arm/include/arm32/machdep.h =================================================================== RCS file: /cvsroot/src/sys/arch/arm/include/arm32/machdep.h,v retrieving revision 1.24 diff -u -p -r1.24 machdep.h --- sys/arch/arm/include/arm32/machdep.h 3 Aug 2018 15:46:41 -0000 1.24 +++ sys/arch/arm/include/arm32/machdep.h 4 Aug 2018 13:32:01 -0000 @@ -52,6 +52,7 @@ extern char *booted_kernel; extern volatile uint32_t arm_cpu_hatched; extern volatile uint32_t arm_cpu_mbox; extern u_int arm_cpu_max; +extern u_long kern_vtopdiff; /* misc prototypes used by the many arm machdeps */ void cortex_pmc_ccnt_init(void); @@ -74,7 +75,6 @@ struct boot_physmem; static inline paddr_t aarch32_kern_vtophys(vaddr_t va) { - extern u_long kern_vtopdiff; return va - kern_vtopdiff; } @@ -82,7 +82,6 @@ aarch32_kern_vtophys(vaddr_t va) static inline vaddr_t aarch32_kern_phystov(paddr_t pa) { - extern u_long kern_vtopdiff; return pa + kern_vtopdiff; } @@ -90,6 +89,10 @@ aarch32_kern_phystov(paddr_t pa) #define KERN_VTOPHYS(va) aarch32_kern_vtophys(va) #define KERN_PHYSTOV(pa) aarch32_kern_phystov(pa) +#if defined(FDT) +void cpu_kernel_vm_init(paddr_t, psize_t); +#endif + void arm32_bootmem_init(paddr_t memstart, psize_t memsize, paddr_t kernelstart); void arm32_kernel_vm_init(vaddr_t kvm_base, vaddr_t vectors, vaddr_t iovbase /* (can be zero) */, Index: sys/arch/evbarm/fdt/fdt_machdep.c =================================================================== RCS file: /cvsroot/src/sys/arch/evbarm/fdt/fdt_machdep.c,v retrieving revision 1.30 diff -u -p -r1.30 fdt_machdep.c --- sys/arch/evbarm/fdt/fdt_machdep.c 3 Aug 2018 13:48:24 -0000 1.30 +++ sys/arch/evbarm/fdt/fdt_machdep.c 4 Aug 2018 13:32:02 -0000 @@ -419,17 +419,6 @@ initarm(void *arg) parse_mi_bootargs(mi_bootargs); #endif -#ifndef __aarch64__ - VPRINTF("KERNEL_BASE=0x%x, " - "KERNEL_VM_BASE=0x%x, " - "KERNEL_VM_BASE - KERNEL_BASE=0x%x, " - "KERNEL_BASE_VOFFSET=0x%x\n", - KERNEL_BASE, - KERNEL_VM_BASE, - KERNEL_VM_BASE - KERNEL_BASE, - KERNEL_BASE_VOFFSET); -#endif - fdt_get_memory(&memory_start, &memory_end); #if !defined(_LP64) @@ -437,24 +426,8 @@ initarm(void *arg) if (memory_end >= 0x100000000ULL) memory_end = 0x100000000ULL - PAGE_SIZE; - uint64_t memory_size = memory_end - memory_start; -#endif - -#ifndef __aarch64__ -#ifdef __HAVE_MM_MD_DIRECT_MAPPED_PHYS - const bool mapallmem_p = true; -#ifndef PMAP_NEED_ALLOC_POOLPAGE - if (memory_size > KERNEL_VM_BASE - KERNEL_BASE) { - VPRINTF("%s: dropping RAM size from %luMB to %uMB\n", - __func__, (unsigned long) (memory_size >> 20), - (KERNEL_VM_BASE - KERNEL_BASE) >> 20); - memory_size = KERNEL_VM_BASE - KERNEL_BASE; - } -#endif -#else - const bool mapallmem_p = false; -#endif #endif + uint64_t memory_size = memory_end - memory_start; /* Parse ramdisk info */ fdt_probe_initrd(&initrd_start, &initrd_end); @@ -465,25 +438,8 @@ initarm(void *arg) */ fdt_build_bootconfig(memory_start, memory_end); -#ifdef __aarch64__ - extern char __kernel_text[]; - extern char _end[]; - - vaddr_t kernstart = trunc_page((vaddr_t)__kernel_text); - vaddr_t kernend = round_page((vaddr_t)_end); - - paddr_t kernstart_phys = KERN_VTOPHYS(kernstart); - paddr_t kernend_phys = KERN_VTOPHYS(kernend); - - VPRINTF("%s: kernel phys start %lx end %lx\n", __func__, kernstart_phys, kernend_phys); - - fdt_add_reserved_memory_range(kernstart_phys, - kernend_phys - kernstart_phys); -#else - arm32_bootmem_init(memory_start, memory_size, KERNEL_BASE_PHYS); - arm32_kernel_vm_init(KERNEL_VM_BASE, ARM_VECTORS_HIGH, 0, - plat->devmap(), mapallmem_p); -#endif + /* Perform PT build and VM init */ + cpu_kernel_vm_init(memory_start, memory_size); VPRINTF("bootargs: %s\n", bootargs);