Module Name: src Committed By: palle Date: Tue Jan 7 20:11:35 UTC 2014
Modified Files: src/sys/arch/sparc64/include: cpu.h sparc64.h src/sys/arch/sparc64/sparc64: cpu.c genassym.cf locore.s ofw_machdep.c pmap.c Log Message: sun4v: trap table setup - currently populated with dummy entries which will be properly implemented later - parts from OpenBSD - OK martin@ To generate a diff of this commit: cvs rdiff -u -r1.106 -r1.107 src/sys/arch/sparc64/include/cpu.h cvs rdiff -u -r1.11 -r1.12 src/sys/arch/sparc64/include/sparc64.h cvs rdiff -u -r1.106 -r1.107 src/sys/arch/sparc64/sparc64/cpu.c cvs rdiff -u -r1.68 -r1.69 src/sys/arch/sparc64/sparc64/genassym.cf cvs rdiff -u -r1.352 -r1.353 src/sys/arch/sparc64/sparc64/locore.s cvs rdiff -u -r1.40 -r1.41 src/sys/arch/sparc64/sparc64/ofw_machdep.c cvs rdiff -u -r1.284 -r1.285 src/sys/arch/sparc64/sparc64/pmap.c 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/sparc64/include/cpu.h diff -u src/sys/arch/sparc64/include/cpu.h:1.106 src/sys/arch/sparc64/include/cpu.h:1.107 --- src/sys/arch/sparc64/include/cpu.h:1.106 Mon Dec 16 20:17:35 2013 +++ src/sys/arch/sparc64/include/cpu.h Tue Jan 7 20:11:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.h,v 1.106 2013/12/16 20:17:35 palle Exp $ */ +/* $NetBSD: cpu.h,v 1.107 2014/01/07 20:11:35 palle Exp $ */ /* * Copyright (c) 1992, 1993 @@ -174,6 +174,12 @@ struct cpu_info { pte_t *ci_tsb_dmmu; pte_t *ci_tsb_immu; +#ifdef SUN4V + /* MMU Fault Status Area. Will be initialized to the physical + address of the bottom of the interrupt stack */ + paddr_t ci_mmfsa; +#endif + /* probe fault in PCI config space reads */ bool ci_pci_probe; bool ci_pci_fault; Index: src/sys/arch/sparc64/include/sparc64.h diff -u src/sys/arch/sparc64/include/sparc64.h:1.11 src/sys/arch/sparc64/include/sparc64.h:1.12 --- src/sys/arch/sparc64/include/sparc64.h:1.11 Sat Feb 20 16:46:38 2010 +++ src/sys/arch/sparc64/include/sparc64.h Tue Jan 7 20:11:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: sparc64.h,v 1.11 2010/02/20 16:46:38 martin Exp $ */ +/* $NetBSD: sparc64.h,v 1.12 2014/01/07 20:11:35 palle Exp $ */ /* * Copyright (C) 1996 Wolfgang Solfrank. @@ -38,7 +38,10 @@ struct mem_region { uint64_t size; }; -int prom_set_trap_table(vaddr_t); +int prom_set_trap_table_sun4u(vaddr_t); +#ifdef SUN4V +int prom_set_trap_table_sun4v(vaddr_t, paddr_t); +#endif paddr_t prom_vtop(vaddr_t); vaddr_t prom_claim_virt(vaddr_t, int); vaddr_t prom_alloc_virt(int, int); Index: src/sys/arch/sparc64/sparc64/cpu.c diff -u src/sys/arch/sparc64/sparc64/cpu.c:1.106 src/sys/arch/sparc64/sparc64/cpu.c:1.107 --- src/sys/arch/sparc64/sparc64/cpu.c:1.106 Mon Dec 16 20:17:35 2013 +++ src/sys/arch/sparc64/sparc64/cpu.c Tue Jan 7 20:11:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.c,v 1.106 2013/12/16 20:17:35 palle Exp $ */ +/* $NetBSD: cpu.c,v 1.107 2014/01/07 20:11:35 palle Exp $ */ /* * Copyright (c) 1996 @@ -52,7 +52,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.106 2013/12/16 20:17:35 palle Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.107 2014/01/07 20:11:35 palle Exp $"); #include "opt_multiprocessor.h" @@ -179,6 +179,10 @@ alloc_cpuinfo(u_int cpu_node) cpi->ci_spinup = NULL; cpi->ci_paddr = pa0; cpi->ci_self = cpi; +#ifdef SUN4V + if ( CPU_ISSUN4V ) + cpi->ci_mmfsa = pa0; +#endif cpi->ci_node = cpu_node; cpi->ci_idepth = -1; memset(cpi->ci_intrpending, -1, sizeof(cpi->ci_intrpending)); Index: src/sys/arch/sparc64/sparc64/genassym.cf diff -u src/sys/arch/sparc64/sparc64/genassym.cf:1.68 src/sys/arch/sparc64/sparc64/genassym.cf:1.69 --- src/sys/arch/sparc64/sparc64/genassym.cf:1.68 Sat Dec 28 11:12:09 2013 +++ src/sys/arch/sparc64/sparc64/genassym.cf Tue Jan 7 20:11:35 2014 @@ -1,4 +1,4 @@ -# $NetBSD: genassym.cf,v 1.68 2013/12/28 11:12:09 nakayama Exp $ +# $NetBSD: genassym.cf,v 1.69 2014/01/07 20:11:35 palle Exp $ # # Copyright (c) 1997 The NetBSD Foundation, Inc. @@ -163,6 +163,9 @@ define CI_TICK_IH offsetof(struct cpu_in define CI_CTXBUSY offsetof(struct cpu_info, ci_ctxbusy) define CI_TSB_DMMU offsetof(struct cpu_info, ci_tsb_dmmu) define CI_TSB_IMMU offsetof(struct cpu_info, ci_tsb_immu) +#ifdef SUN4V +define CI_MMFSA offsetof(struct cpu_info, ci_mmfsa) +#endif ifdef MULTIPROCESSOR define CI_IPIEVC offsetof(struct cpu_info, ci_ipi_evcnt[0].ev_count) endif Index: src/sys/arch/sparc64/sparc64/locore.s diff -u src/sys/arch/sparc64/sparc64/locore.s:1.352 src/sys/arch/sparc64/sparc64/locore.s:1.353 --- src/sys/arch/sparc64/sparc64/locore.s:1.352 Sun Dec 29 12:36:30 2013 +++ src/sys/arch/sparc64/sparc64/locore.s Tue Jan 7 20:11:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.s,v 1.352 2013/12/29 12:36:30 nakayama Exp $ */ +/* $NetBSD: locore.s,v 1.353 2014/01/07 20:11:35 palle Exp $ */ /* * Copyright (c) 2006-2010 Matthew R. Green @@ -864,6 +864,27 @@ TABLE(syscall): UTRAP(0x1f0); UTRAP(0x1f1); UTRAP(0x1f2); UTRAP(0x1f3); UTRAP(0x1f4); UTRAP(0x1f5); UTRAP(0x1f6); UTRAP(0x1f7) UTRAP(0x1f8); UTRAP(0x1f9); UTRAP(0x1fa); UTRAP(0x1fb); UTRAP(0x1fc); UTRAP(0x1fd); UTRAP(0x1fe); UTRAP(0x1ff) +#ifdef SUN4V + +/* Macros for sun4v traps */ + + .macro sun4v_trap_entry count + .rept \count + ba,a,pt %xcc, slowtrap + nop + .align 32 + .endr + .endm + +/* The actual trap base for sun4v */ + .align 0x8000 + .globl _C_LABEL(trapbase_sun4v) +_C_LABEL(trapbase_sun4v): + sun4v_trap_entry 512 ! trap level 0: 0x000-0x1ff + sun4v_trap_entry 512 ! trap level 1: 0x000-0x1ff + +#endif + #if 0 /* * If the cleanwin trap handler detects an overfow we come here. @@ -4179,9 +4200,26 @@ ENTRY_NOPROFILE(cpu_initialize) /* for c 1: /* set trap table */ +#ifdef SUN4V + cmp %l6, CPU_SUN4V + bne,pt %icc, 6f + nop + /* sun4v */ + set _C_LABEL(trapbase_sun4v), %o0 + sethi %hi(CPUINFO_VA + CI_MMFSA), %o1 + ldx [%o1 + %lo(CPUINFO_VA + CI_MMFSA)], %o1 + call _C_LABEL(prom_set_trap_table_sun4v) ! Now we should be running 100% from our handlers + nop + + ba 7f + nop +6: +#endif + /* sun4u */ set _C_LABEL(trapbase), %l1 - call _C_LABEL(prom_set_trap_table) ! Now we should be running 100% from our handlers + call _C_LABEL(prom_set_trap_table_sun4u) ! Now we should be running 100% from our handlers mov %l1, %o0 +7: wrpr %l1, 0, %tba ! Make sure the PROM didn't foul up. /* @@ -4324,7 +4362,7 @@ ENTRY(cpu_mp_startup) /* set trap table */ set _C_LABEL(trapbase), %l1 - call _C_LABEL(prom_set_trap_table) + call _C_LABEL(prom_set_trap_table_sun4u) mov %l1, %o0 wrpr %l1, 0, %tba ! Make sure the PROM didn't ! foul up. Index: src/sys/arch/sparc64/sparc64/ofw_machdep.c diff -u src/sys/arch/sparc64/sparc64/ofw_machdep.c:1.40 src/sys/arch/sparc64/sparc64/ofw_machdep.c:1.41 --- src/sys/arch/sparc64/sparc64/ofw_machdep.c:1.40 Tue Jul 9 20:32:11 2013 +++ src/sys/arch/sparc64/sparc64/ofw_machdep.c Tue Jan 7 20:11:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: ofw_machdep.c,v 1.40 2013/07/09 20:32:11 martin Exp $ */ +/* $NetBSD: ofw_machdep.c,v 1.41 2014/01/07 20:11:35 palle Exp $ */ /* * Copyright (C) 1996 Wolfgang Solfrank. @@ -34,7 +34,7 @@ #include "opt_multiprocessor.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ofw_machdep.c,v 1.40 2013/07/09 20:32:11 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ofw_machdep.c,v 1.41 2014/01/07 20:11:35 palle Exp $"); #include <sys/param.h> #include <sys/buf.h> @@ -95,10 +95,10 @@ get_memory_handle(void) /* - * Point prom to our trap table. This stops the prom from mapping us. + * Point prom to our sun4u trap table. This stops the prom from mapping us. */ int -prom_set_trap_table(vaddr_t tba) +prom_set_trap_table_sun4u(vaddr_t tba) { struct { cell_t name; @@ -114,6 +114,30 @@ prom_set_trap_table(vaddr_t tba) return openfirmware(&args); } +#ifdef SUN4V +/* + * Point prom to our sun4v trap table. This stops the prom from mapping us. + */ +int +prom_set_trap_table_sun4v(vaddr_t tba, paddr_t mmfsa) +{ + struct { + cell_t name; + cell_t nargs; + cell_t nreturns; + cell_t tba; + cell_t mmfsa; + } args; + + args.name = ADR2CELL("SUNW,set-trap-table"); + args.nargs = 2; + args.nreturns = 0; + args.tba = ADR2CELL(tba); + args.mmfsa = ADR2CELL(mmfsa); + return openfirmware(&args); +} +#endif + /* * Have the prom convert from virtual to physical addresses. * Index: src/sys/arch/sparc64/sparc64/pmap.c diff -u src/sys/arch/sparc64/sparc64/pmap.c:1.284 src/sys/arch/sparc64/sparc64/pmap.c:1.285 --- src/sys/arch/sparc64/sparc64/pmap.c:1.284 Sat Dec 28 11:08:56 2013 +++ src/sys/arch/sparc64/sparc64/pmap.c Tue Jan 7 20:11:35 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.284 2013/12/28 11:08:56 nakayama Exp $ */ +/* $NetBSD: pmap.c,v 1.285 2014/01/07 20:11:35 palle Exp $ */ /* * * Copyright (C) 1996-1999 Eduardo Horvath. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.284 2013/12/28 11:08:56 nakayama Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.285 2014/01/07 20:11:35 palle Exp $"); #undef NO_VCACHE /* Don't forget the locked TLB in dostart */ #define HWREF @@ -1157,6 +1157,10 @@ pmap_bootstrap(u_long kernelstart, u_lon cpus->ci_eintstack = NULL; cpus->ci_spinup = main; /* Call main when we're running. */ cpus->ci_paddr = cpu0paddr; +#ifdef SUN4V + if ( CPU_ISSUN4V ) + cpus->ci_mmfsa = cpu0paddr; +#endif cpus->ci_cpcb = (struct pcb *)u0va; cpus->ci_idepth = -1; memset(cpus->ci_intrpending, -1, sizeof(cpus->ci_intrpending)); @@ -3802,9 +3806,6 @@ pmap_setup_intstack_sun4v(paddr_t pa) panic("hv_mmu_map_perm_addr() failed - rc = %" PRId64 "\n", hv_rc); } - else { - memset((void *)INTSTACK, 0, 64 * KB); - } } void