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