Index: sys/arch/sparc64/include/cpu.h =================================================================== RCS file: /cvsroot/src/sys/arch/sparc64/include/cpu.h,v retrieving revision 1.106 diff -u -r1.106 cpu.h --- sys/arch/sparc64/include/cpu.h 16 Dec 2013 20:17:35 -0000 1.106 +++ sys/arch/sparc64/include/cpu.h 5 Jan 2014 19:31:14 -0000 @@ -174,6 +174,12 @@ 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: sys/arch/sparc64/include/sparc64.h =================================================================== RCS file: /cvsroot/src/sys/arch/sparc64/include/sparc64.h,v retrieving revision 1.11 diff -u -r1.11 sparc64.h --- sys/arch/sparc64/include/sparc64.h 20 Feb 2010 16:46:38 -0000 1.11 +++ sys/arch/sparc64/include/sparc64.h 5 Jan 2014 19:31:14 -0000 @@ -38,7 +38,10 @@ 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: sys/arch/sparc64/sparc64/cpu.c =================================================================== RCS file: /cvsroot/src/sys/arch/sparc64/sparc64/cpu.c,v retrieving revision 1.106 diff -u -r1.106 cpu.c --- sys/arch/sparc64/sparc64/cpu.c 16 Dec 2013 20:17:35 -0000 1.106 +++ sys/arch/sparc64/sparc64/cpu.c 5 Jan 2014 19:31:15 -0000 @@ -179,6 +179,10 @@ 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: sys/arch/sparc64/sparc64/genassym.cf =================================================================== RCS file: /cvsroot/src/sys/arch/sparc64/sparc64/genassym.cf,v retrieving revision 1.68 diff -u -r1.68 genassym.cf --- sys/arch/sparc64/sparc64/genassym.cf 28 Dec 2013 11:12:09 -0000 1.68 +++ sys/arch/sparc64/sparc64/genassym.cf 5 Jan 2014 19:31:15 -0000 @@ -163,6 +163,9 @@ 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: sys/arch/sparc64/sparc64/locore.s =================================================================== RCS file: /cvsroot/src/sys/arch/sparc64/sparc64/locore.s,v retrieving revision 1.352 diff -u -r1.352 locore.s --- sys/arch/sparc64/sparc64/locore.s 29 Dec 2013 12:36:30 -0000 1.352 +++ sys/arch/sparc64/sparc64/locore.s 5 Jan 2014 19:31:15 -0000 @@ -864,6 +864,27 @@ 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 @@ 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 @@ /* 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: sys/arch/sparc64/sparc64/ofw_machdep.c =================================================================== RCS file: /cvsroot/src/sys/arch/sparc64/sparc64/ofw_machdep.c,v retrieving revision 1.40 diff -u -r1.40 ofw_machdep.c --- sys/arch/sparc64/sparc64/ofw_machdep.c 9 Jul 2013 20:32:11 -0000 1.40 +++ sys/arch/sparc64/sparc64/ofw_machdep.c 5 Jan 2014 19:31:15 -0000 @@ -95,10 +95,10 @@ /* - * 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 @@ 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: sys/arch/sparc64/sparc64/pmap.c =================================================================== RCS file: /cvsroot/src/sys/arch/sparc64/sparc64/pmap.c,v retrieving revision 1.284 diff -u -r1.284 pmap.c --- sys/arch/sparc64/sparc64/pmap.c 28 Dec 2013 11:08:56 -0000 1.284 +++ sys/arch/sparc64/sparc64/pmap.c 5 Jan 2014 19:31:15 -0000 @@ -1157,6 +1157,10 @@ 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 @@ panic("hv_mmu_map_perm_addr() failed - rc = %" PRId64 "\n", hv_rc); } - else { - memset((void *)INTSTACK, 0, 64 * KB); - } } void