Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/sparc64 a) make the hunt through the cpus list more...
details: https://anonhg.NetBSD.org/src/rev/07f3fe0cc8b4
branches: trunk
changeset: 792263:07f3fe0cc8b4
user: palle <palle%NetBSD.org@localhost>
date: Fri Dec 27 21:11:19 2013 +0000
description:
a) make the hunt through the cpus list more generic b) sun4v: ensure that the interrupt stack is mapped permanently and the TSB is setup properly - parts from OpenBSD. OK martin@
diffstat:
sys/arch/sparc64/include/pmap.h | 8 ++++-
sys/arch/sparc64/sparc64/genassym.cf | 3 +-
sys/arch/sparc64/sparc64/locore.s | 51 ++++++++++++++++++++++++++-------
sys/arch/sparc64/sparc64/pmap.c | 54 ++++++++++++++++++++++++++++++++++-
4 files changed, 101 insertions(+), 15 deletions(-)
diffs (215 lines):
diff -r 7c77870b487b -r 07f3fe0cc8b4 sys/arch/sparc64/include/pmap.h
--- a/sys/arch/sparc64/include/pmap.h Fri Dec 27 20:55:59 2013 +0000
+++ b/sys/arch/sparc64/include/pmap.h Fri Dec 27 21:11:19 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.h,v 1.56 2013/09/11 18:27:44 martin Exp $ */
+/* $NetBSD: pmap.h,v 1.57 2013/12/27 21:11:19 palle Exp $ */
/*-
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -212,6 +212,12 @@
void pmap_copy_page_phys(paddr_t, paddr_t);
void pmap_zero_page_phys(paddr_t);
+#ifdef SUN4V
+/* sun4v specific */
+void pmap_setup_intstack_sun4v(paddr_t);
+void pmap_setup_tsb_sun4v(void);
+#endif
+
/* Installed physical memory, as discovered during bootstrap. */
extern int phys_installed_size;
extern struct mem_region *phys_installed;
diff -r 7c77870b487b -r 07f3fe0cc8b4 sys/arch/sparc64/sparc64/genassym.cf
--- a/sys/arch/sparc64/sparc64/genassym.cf Fri Dec 27 20:55:59 2013 +0000
+++ b/sys/arch/sparc64/sparc64/genassym.cf Fri Dec 27 21:11:19 2013 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: genassym.cf,v 1.66 2011/07/20 12:06:00 macallan Exp $
+# $NetBSD: genassym.cf,v 1.67 2013/12/27 21:11:19 palle Exp $
#
# Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -150,6 +150,7 @@
define CI_MTX_COUNT offsetof(struct cpu_info, ci_mtx_count)
define CI_SPINUP offsetof(struct cpu_info, ci_spinup)
define CI_PADDR offsetof(struct cpu_info, ci_paddr)
+define CI_CPUID offsetof(struct cpu_info, ci_cpuid)
define CI_WANT_AST offsetof(struct cpu_info, ci_want_ast)
define CI_WANT_RESCHED offsetof(struct cpu_info, ci_want_resched)
define CI_EINTSTACK offsetof(struct cpu_info, ci_eintstack)
diff -r 7c77870b487b -r 07f3fe0cc8b4 sys/arch/sparc64/sparc64/locore.s
--- a/sys/arch/sparc64/sparc64/locore.s Fri Dec 27 20:55:59 2013 +0000
+++ b/sys/arch/sparc64/sparc64/locore.s Fri Dec 27 21:11:19 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.s,v 1.350 2013/12/06 21:11:06 nakayama Exp $ */
+/* $NetBSD: locore.s,v 1.351 2013/12/27 21:11:19 palle Exp $ */
/*
* Copyright (c) 2006-2010 Matthew R. Green
@@ -4041,32 +4041,41 @@
ENTRY_NOPROFILE(cpu_initialize) /* for cosmetic reasons - nicer backtrace */
+
+ /* Cache the cputyp in %l6 for later user below */
+ sethi %hi(_C_LABEL(cputyp)), %l6
+ ld [%l6 + %lo(_C_LABEL(cputyp))], %l6
+
/*
* Step 5: is no more.
*/
/*
- * Step 6: hunt through cpus list and find the one that
- * matches our UPAID.
+ * Step 6: hunt through cpus list and find the one that matches our cpuid
*/
+
+ call _C_LABEL(cpu_myid) ! Retrieve cpuid in %o0
+ mov %g0, %o0
+
sethi %hi(_C_LABEL(cpus)), %l1
- ldxa [%g0] ASI_MID_REG, %l2
LDPTR [%l1 + %lo(_C_LABEL(cpus))], %l1
- srax %l2, 17, %l2 ! Isolate UPAID from CPU reg
- and %l2, 0x1f, %l2
0:
- ld [%l1 + CI_UPAID], %l3 ! Load UPAID
- cmp %l3, %l2 ! Does it match?
+ ld [%l1 + CI_CPUID], %l3 ! Load CPUID
+ cmp %l3, %o0 ! Does it match?
bne,a,pt %icc, 0b ! no
LDPTR [%l1 + CI_NEXT], %l1 ! Load next cpu_info pointer
-
/*
* Get pointer to our cpu_info struct
*/
mov %l1, %l7 ! save cpu_info pointer
ldx [%l1 + CI_PADDR], %l1 ! Load the interrupt stack's PA
+ cmp %l6, CPU_SUN4V
+ be,pn %icc, 3f
+ nop
+
+ /* sun4u */
sethi %hi(0xa0000000), %l2 ! V=1|SZ=01|NFO=0|IE=0
sllx %l2, 32, %l2 ! Shift it into place
@@ -4087,7 +4096,14 @@
stxa %l0, [%l5] ASI_DMMU ! Make DMMU point to it
stxa %l2, [%g0] ASI_DMMU_DATA_IN ! Store it
membar #Sync
-
+
+ ba 4f
+ nop
+3:
+ /* sun4v */
+ call _C_LABEL(pmap_setup_intstack_sun4v) ! Call nice C function for mapping INTSTACK
+ mov %l1, %o0
+4:
!! Setup kernel stack (we rely on curlwp on this cpu
!! being lwp0 here and it's uarea is mapped special
!! and already accessible here)
@@ -4125,6 +4141,12 @@
/*
* install our TSB pointers
*/
+
+ cmp %l6, CPU_SUN4V
+ be,pn %icc, 5f
+ nop
+
+ /* sun4u */
sethi %hi(_C_LABEL(tsbsize)), %l2
sethi %hi(0x1fff), %l3
sethi %hi(TSB), %l4
@@ -4145,7 +4167,14 @@
set 1f, %l1
flush %l1
1:
-
+ ba 6f
+ nop
+
+5: /* sun4v */
+ call _C_LABEL(pmap_setup_tsb_sun4v)
+ nop
+
+6:
/* set trap table */
set _C_LABEL(trapbase), %l1
call _C_LABEL(prom_set_trap_table) ! Now we should be running 100% from our handlers
diff -r 7c77870b487b -r 07f3fe0cc8b4 sys/arch/sparc64/sparc64/pmap.c
--- a/sys/arch/sparc64/sparc64/pmap.c Fri Dec 27 20:55:59 2013 +0000
+++ b/sys/arch/sparc64/sparc64/pmap.c Fri Dec 27 21:11:19 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.282 2013/12/16 20:17:35 palle Exp $ */
+/* $NetBSD: pmap.c,v 1.283 2013/12/27 21:11:20 palle Exp $ */
/*
*
* Copyright (C) 1996-1999 Eduardo Horvath.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.282 2013/12/16 20:17:35 palle Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.283 2013/12/27 21:11:20 palle Exp $");
#undef NO_VCACHE /* Don't forget the locked TLB in dostart */
#define HWREF
@@ -3780,3 +3780,53 @@
return EINVAL;
}
#endif
+
+#ifdef SUN4V
+void
+pmap_setup_intstack_sun4v(paddr_t pa)
+{
+ int64_t hv_rc;
+ int64_t data;
+ data = SUN4V_TSB_DATA(
+ 0 /* global */,
+ PGSZ_64K,
+ pa,
+ 1 /* priv */,
+ 1 /* Write */,
+ 1 /* Cacheable */,
+ FORCE_ALIAS /* ALIAS -- Disable D$ */,
+ 1 /* valid */,
+ 0 /* IE */);
+ hv_rc = hv_mmu_map_perm_addr(INTSTACK, data, MAP_DTLB);
+ if ( hv_rc != H_EOK ) {
+ panic("hv_mmu_map_perm_addr() failed - rc = %ld\n", hv_rc);
+ }
+ else {
+ memset((void *)INTSTACK, 0, 64 * KB);
+ }
+}
+
+void
+pmap_setup_tsb_sun4v(void)
+{
+ int err;
+ extern struct tsb_desc *tsb_desc;
+ extern paddr_t pmap_kextract(vaddr_t va);
+ paddr_t tsb_desc_p;
+ tsb_desc_p = pmap_kextract((vaddr_t)tsb_desc);
+ if ( !tsb_desc_p ) {
+ panic("pmap_setup_tsb_sun4v() pmap_kextract() failed");
+ }
+ err = hv_mmu_tsb_ctx0(1, tsb_desc_p);
+ if (err != H_EOK) {
+ prom_printf("hv_mmu_tsb_ctx0() err: %d\n", err);
+ panic("pmap_setup_tsb_sun4v() hv_mmu_tsb_ctx0() failed");
+ }
+ err = hv_mmu_tsb_ctxnon0(1, tsb_desc_p);
+ if (err != H_EOK) {
+ prom_printf("hv_mmu_tsb_ctxnon0() err: %d\n", err);
+ panic("pmap_setup_tsb_sun4v() hv_mmu_tsb_ctxnon0() failed");
+ }
+}
+
+#endif
Home |
Main Index |
Thread Index |
Old Index