Module Name: src Committed By: skrll Date: Fri Aug 3 15:46:41 UTC 2018
Modified Files: src/sys/arch/arm/arm32: arm32_kvminit.c src/sys/arch/arm/broadcom: bcm283x_platform.c src/sys/arch/arm/include/arm32: machdep.h src/sys/arch/evbarm/rpi: rpi2_start.S rpi_start.S Log Message: Provide and use kern_vtopdiff in KERN_{VTOPHYS,PHYSTOV}. A step towards generic arm. To generate a diff of this commit: cvs rdiff -u -r1.43 -r1.44 src/sys/arch/arm/arm32/arm32_kvminit.c cvs rdiff -u -r1.9 -r1.10 src/sys/arch/arm/broadcom/bcm283x_platform.c cvs rdiff -u -r1.23 -r1.24 src/sys/arch/arm/include/arm32/machdep.h cvs rdiff -u -r1.7 -r1.8 src/sys/arch/evbarm/rpi/rpi2_start.S cvs rdiff -u -r1.19 -r1.20 src/sys/arch/evbarm/rpi/rpi_start.S Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/arm32/arm32_kvminit.c diff -u src/sys/arch/arm/arm32/arm32_kvminit.c:1.43 src/sys/arch/arm/arm32/arm32_kvminit.c:1.44 --- src/sys/arch/arm/arm32/arm32_kvminit.c:1.43 Tue Jul 31 10:31:02 2018 +++ src/sys/arch/arm/arm32/arm32_kvminit.c Fri Aug 3 15:46:41 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: arm32_kvminit.c,v 1.43 2018/07/31 10:31:02 martin Exp $ */ +/* $NetBSD: arm32_kvminit.c,v 1.44 2018/08/03 15:46:41 skrll Exp $ */ /* * Copyright (c) 2002, 2003, 2005 Genetec Corporation. All rights reserved. @@ -126,7 +126,7 @@ #include "opt_multiprocessor.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: arm32_kvminit.c,v 1.43 2018/07/31 10:31:02 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: arm32_kvminit.c,v 1.44 2018/08/03 15:46:41 skrll Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -175,21 +175,7 @@ extern char _end[]; /* Page tables for mapping kernel VM */ #define KERNEL_L2PT_VMDATA_NUM 8 /* start with 32MB of KVM */ -/* - * Macros to translate between physical and virtual for a subset of the - * kernel address space. *Not* for general use. - */ -#if defined(KERNEL_BASE_VOFFSET) -#define KERN_VTOPHYS(bmi, va) \ - ((paddr_t)((vaddr_t)(va) - KERNEL_BASE_VOFFSET)) -#define KERN_PHYSTOV(bmi, pa) \ - ((vaddr_t)((paddr_t)(pa) + KERNEL_BASE_VOFFSET)) -#else -#define KERN_VTOPHYS(bmi, va) \ - ((paddr_t)((vaddr_t)(va) - KERNEL_BASE + (bmi)->bmi_start)) -#define KERN_PHYSTOV(bmi, pa) \ - ((vaddr_t)((paddr_t)(pa) - (bmi)->bmi_start + KERNEL_BASE)) -#endif +u_long kern_vtopdiff __attribute__((__section__(".data"))); void arm32_bootmem_init(paddr_t memstart, psize_t memsize, vsize_t kernelstart) @@ -197,6 +183,16 @@ arm32_bootmem_init(paddr_t memstart, psi struct bootmem_info * const bmi = &bootmem_info; pv_addr_t *pv = bmi->bmi_freeblocks; + /* + * FDT/generic boot fills in kern_vtopdiff early + */ +#if defined(KERNEL_BASE_VOFFSET) + kern_vtopdiff = KERNEL_BASE_VOFFSET; +#else + KASSERT(memstart == kernelstart); + kern_vtopdiff = KERNEL_BASE + memstart; +#endif + VPRINTF("%s: memstart=%#lx, memsize=%#lx, kernelstart=%#lx\n", __func__, memstart, memsize, kernelstart); @@ -217,7 +213,7 @@ arm32_bootmem_init(paddr_t memstart, psi * Let's record where the kernel lives. */ bmi->bmi_kernelstart = kernelstart; - bmi->bmi_kernelend = KERN_VTOPHYS(bmi, round_page((vaddr_t)_end)); + bmi->bmi_kernelend = KERN_VTOPHYS(round_page((vaddr_t)_end)); #if defined(FDT) fdt_add_reserved_memory_range(bmi->bmi_kernelstart, @@ -230,7 +226,7 @@ arm32_bootmem_init(paddr_t memstart, psi * Now the rest of the free memory must be after the kernel. */ pv->pv_pa = bmi->bmi_kernelend; - pv->pv_va = KERN_PHYSTOV(bmi, pv->pv_pa); + pv->pv_va = KERN_PHYSTOV(pv->pv_pa); pv->pv_size = bmi->bmi_end - bmi->bmi_kernelend; bmi->bmi_freepages += pv->pv_size / PAGE_SIZE; VPRINTF("%s: adding %lu free pages: [%#lx..%#lx] (VA %#lx)\n", @@ -244,7 +240,7 @@ arm32_bootmem_init(paddr_t memstart, psi */ if (bmi->bmi_start < bmi->bmi_kernelstart) { pv->pv_pa = bmi->bmi_start; - pv->pv_va = KERN_PHYSTOV(bmi, pv->pv_pa); + pv->pv_va = KERN_PHYSTOV(pv->pv_pa); pv->pv_size = bmi->bmi_kernelstart - pv->pv_pa; bmi->bmi_freepages += pv->pv_size / PAGE_SIZE; VPRINTF("%s: adding %lu free pages: [%#lx..%#lx] (VA %#lx)\n", @@ -627,7 +623,7 @@ arm32_kernel_vm_init(vaddr_t kernel_vm_b } const vaddr_t kernel_base = - KERN_PHYSTOV(bmi, bmi->bmi_kernelstart & -L2_S_SEGSIZE); + KERN_PHYSTOV(bmi->bmi_kernelstart & -L2_S_SEGSIZE); for (size_t idx = 0; idx < KERNEL_L2PT_KERNEL_NUM; idx++) { pmap_link_l2pt(l1pt_va, kernel_base + idx * L2_S_SEGSIZE, &kernel_l2pt[idx]); @@ -656,16 +652,16 @@ arm32_kernel_vm_init(vaddr_t kernel_vm_b VPRINTF("Mapping kernel\n"); - extern char etext[], _end[]; + extern char etext[]; size_t totalsize = bmi->bmi_kernelend - bmi->bmi_kernelstart; - size_t textsize = KERN_VTOPHYS(bmi, (uintptr_t)etext) - bmi->bmi_kernelstart; + size_t textsize = KERN_VTOPHYS((uintptr_t)etext) - bmi->bmi_kernelstart; textsize = (textsize + PGOFSET) & ~PGOFSET; /* start at offset of kernel in RAM */ text.pv_pa = bmi->bmi_kernelstart; - text.pv_va = KERN_PHYSTOV(bmi, bmi->bmi_kernelstart); + text.pv_va = KERN_PHYSTOV(bmi->bmi_kernelstart); text.pv_size = textsize; text.pv_prot = VM_PROT_READ | VM_PROT_EXECUTE; text.pv_cache = PTE_CACHE; @@ -705,7 +701,7 @@ arm32_kernel_vm_init(vaddr_t kernel_vm_b pv = SLIST_NEXT(pv, pv_list); } else { cur_pv.pv_va = KERNEL_BASE; - cur_pv.pv_pa = KERN_VTOPHYS(bmi, cur_pv.pv_va); + cur_pv.pv_pa = KERN_VTOPHYS(cur_pv.pv_va); cur_pv.pv_size = pv->pv_pa - cur_pv.pv_pa; cur_pv.pv_prot = VM_PROT_READ | VM_PROT_WRITE; cur_pv.pv_cache = PTE_CACHE; @@ -842,19 +838,19 @@ arm32_kernel_vm_init(vaddr_t kernel_vm_b #endif VPRINTF(mem_fmt, "SDRAM", bmi->bmi_start, bmi->bmi_end - 1, - KERN_PHYSTOV(bmi, bmi->bmi_start), KERN_PHYSTOV(bmi, bmi->bmi_end - 1), + KERN_PHYSTOV(bmi->bmi_start), KERN_PHYSTOV(bmi->bmi_end - 1), (int)physmem); VPRINTF(mem_fmt, "text section", text.pv_pa, text.pv_pa + text.pv_size - 1, text.pv_va, text.pv_va + text.pv_size - 1, (int)(text.pv_size / PAGE_SIZE)); VPRINTF(mem_fmt, "data section", - KERN_VTOPHYS(bmi, __data_start), KERN_VTOPHYS(bmi, _edata), + KERN_VTOPHYS((vaddr_t)__data_start), KERN_VTOPHYS((vaddr_t)_edata), (vaddr_t)__data_start, (vaddr_t)_edata, (int)((round_page((vaddr_t)_edata) - trunc_page((vaddr_t)__data_start)) / PAGE_SIZE)); VPRINTF(mem_fmt, "bss section", - KERN_VTOPHYS(bmi, __bss_start), KERN_VTOPHYS(bmi, __bss_end__), + KERN_VTOPHYS((vaddr_t)__bss_start), KERN_VTOPHYS((vaddr_t)__bss_end__), (vaddr_t)__bss_start, (vaddr_t)__bss_end__, (int)((round_page((vaddr_t)__bss_end__) - trunc_page((vaddr_t)__bss_start)) / PAGE_SIZE)); Index: src/sys/arch/arm/broadcom/bcm283x_platform.c diff -u src/sys/arch/arm/broadcom/bcm283x_platform.c:1.9 src/sys/arch/arm/broadcom/bcm283x_platform.c:1.10 --- src/sys/arch/arm/broadcom/bcm283x_platform.c:1.9 Fri Aug 3 13:48:24 2018 +++ src/sys/arch/arm/broadcom/bcm283x_platform.c Fri Aug 3 15:46:41 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: bcm283x_platform.c,v 1.9 2018/08/03 13:48:24 skrll Exp $ */ +/* $NetBSD: bcm283x_platform.c,v 1.10 2018/08/03 15:46:41 skrll Exp $ */ /*- * Copyright (c) 2017 Jared D. McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: bcm283x_platform.c,v 1.9 2018/08/03 13:48:24 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bcm283x_platform.c,v 1.10 2018/08/03 15:46:41 skrll Exp $"); #include "opt_arm_debug.h" #include "opt_bcm283x.h" @@ -307,15 +307,6 @@ bcm2836_platform_devmap(void) * kernel address space. *Not* for general use. */ -/* - * AARCH64 defines its own - */ -#if !(defined(KERN_VTOPHYS) && defined(KERN_PHYSTOV)) -#define KERN_VTOPDIFF KERNEL_BASE_VOFFSET -#define KERN_VTOPHYS(va) ((paddr_t)((vaddr_t)va - KERN_VTOPDIFF)) -#define KERN_PHYSTOV(pa) ((vaddr_t)((paddr_t)pa + KERN_VTOPDIFF)) -#endif - #ifndef RPI_FB_WIDTH #define RPI_FB_WIDTH 1280 #endif Index: src/sys/arch/arm/include/arm32/machdep.h diff -u src/sys/arch/arm/include/arm32/machdep.h:1.23 src/sys/arch/arm/include/arm32/machdep.h:1.24 --- src/sys/arch/arm/include/arm32/machdep.h:1.23 Wed Aug 1 13:48:00 2018 +++ src/sys/arch/arm/include/arm32/machdep.h Fri Aug 3 15:46:41 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.h,v 1.23 2018/08/01 13:48:00 skrll Exp $ */ +/* $NetBSD: machdep.h,v 1.24 2018/08/03 15:46:41 skrll Exp $ */ #ifndef _ARM32_MACHDEP_H_ #define _ARM32_MACHDEP_H_ @@ -17,7 +17,6 @@ #define FIQ_STACK_SIZE 1 #endif - extern void (*cpu_reset_address)(void); extern paddr_t cpu_reset_address_paddr; @@ -71,6 +70,26 @@ void dumpsys(void); u_int initarm(void *); struct pmap_devmap; struct boot_physmem; + +static inline paddr_t +aarch32_kern_vtophys(vaddr_t va) +{ + extern u_long kern_vtopdiff; + + return va - kern_vtopdiff; +} + +static inline vaddr_t +aarch32_kern_phystov(paddr_t pa) +{ + extern u_long kern_vtopdiff; + + return pa + kern_vtopdiff; +} + +#define KERN_VTOPHYS(va) aarch32_kern_vtophys(va) +#define KERN_PHYSTOV(pa) aarch32_kern_phystov(pa) + 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: src/sys/arch/evbarm/rpi/rpi2_start.S diff -u src/sys/arch/evbarm/rpi/rpi2_start.S:1.7 src/sys/arch/evbarm/rpi/rpi2_start.S:1.8 --- src/sys/arch/evbarm/rpi/rpi2_start.S:1.7 Wed Jun 27 11:12:15 2018 +++ src/sys/arch/evbarm/rpi/rpi2_start.S Fri Aug 3 15:46:41 2018 @@ -40,7 +40,7 @@ #include "assym.h" -RCSID("$NetBSD: rpi2_start.S,v 1.7 2018/06/27 11:12:15 ryo Exp $") +RCSID("$NetBSD: rpi2_start.S,v 1.8 2018/08/03 15:46:41 skrll Exp $") #if defined(KERNEL_BASES_EQUAL) #define CALL(f) bl _C_LABEL(f) @@ -122,6 +122,12 @@ _C_LABEL(rpi_start): str r2, [r4] #endif + mov r2, #KERNEL_BASE_VOFFSET + movw r4, #:lower16:kern_vtopdiff + movt r4, #:upper16:kern_vtopdiff + sub r4, r4, #KERNEL_BASE_VOFFSET + str r2, [r4] + /* * Setup the CPU */ Index: src/sys/arch/evbarm/rpi/rpi_start.S diff -u src/sys/arch/evbarm/rpi/rpi_start.S:1.19 src/sys/arch/evbarm/rpi/rpi_start.S:1.20 --- src/sys/arch/evbarm/rpi/rpi_start.S:1.19 Fri Aug 3 15:38:16 2018 +++ src/sys/arch/evbarm/rpi/rpi_start.S Fri Aug 3 15:46:41 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: rpi_start.S,v 1.19 2018/08/03 15:38:16 skrll Exp $ */ +/* $NetBSD: rpi_start.S,v 1.20 2018/08/03 15:46:41 skrll Exp $ */ /* * Copyright (c) 2002, 2003 Genetec Corporation. All rights reserved. @@ -96,7 +96,7 @@ #include <arm/armreg.h> #include "assym.h" -RCSID("$NetBSD: rpi_start.S,v 1.19 2018/08/03 15:38:16 skrll Exp $") +RCSID("$NetBSD: rpi_start.S,v 1.20 2018/08/03 15:46:41 skrll Exp $") #if defined(VERBOSE_INIT_ARM) @@ -153,6 +153,12 @@ _C_LABEL(rpi_start): sub r8, r8, #KERNEL_BASE_VOFFSET str r2, [r8] #endif + + ldr r8, =kern_vtopdiff + sub r8, r8, #KERNEL_BASE_VOFFSET + mov r2, #KERNEL_BASE_VOFFSET + str r2, [r8] + mrs r0, cpsr bic r0, r0, #PSR_MODE orr r0, r0, #(I32_bit | F32_bit | PSR_SVC32_MODE)