sun4v: add code to enable startup of secondary cpus on both sun4u and sun4v systems - ok martin@
This commit is contained in:
parent
155fdf3987
commit
328930aec1
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: cpu.h,v 1.112 2014/09/04 18:48:29 palle Exp $ */
|
||||
/* $NetBSD: cpu.h,v 1.113 2014/09/24 18:32:10 palle Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1992, 1993
|
||||
@ -223,6 +223,7 @@ struct cpu_bootargs {
|
||||
vaddr_t cb_ekdata;
|
||||
|
||||
paddr_t cb_cpuinfo;
|
||||
int cb_cputyp;
|
||||
};
|
||||
|
||||
extern struct cpu_bootargs *cpu_args;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: hypervisor.h,v 1.4 2014/06/08 17:33:24 palle Exp $ */
|
||||
/* $NetBSD: hypervisor.h,v 1.5 2014/09/24 18:32:10 palle Exp $ */
|
||||
/* $OpenBSD: hypervisor.h,v 1.14 2011/06/26 17:23:46 kettenis Exp $ */
|
||||
|
||||
/*
|
||||
@ -24,6 +24,12 @@
|
||||
* UltraSPARC Hypervisor API.
|
||||
*/
|
||||
|
||||
/*
|
||||
* FAST_TRAP function numbers
|
||||
*/
|
||||
|
||||
#define FT_MMU_MAP_PERM_ADDR 0x25
|
||||
|
||||
/*
|
||||
* API versioning
|
||||
*/
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: cpu.c,v 1.117 2014/09/01 19:01:55 palle Exp $ */
|
||||
/* $NetBSD: cpu.c,v 1.118 2014/09/24 18:32:10 palle Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1996
|
||||
@ -52,7 +52,7 @@
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.117 2014/09/01 19:01:55 palle Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.118 2014/09/24 18:32:10 palle Exp $");
|
||||
|
||||
#include "opt_multiprocessor.h"
|
||||
|
||||
@ -551,13 +551,18 @@ cpu_boot_secondary_processors(void)
|
||||
cpu_pmap_prepare(ci, false);
|
||||
cpu_args->cb_node = ci->ci_node;
|
||||
cpu_args->cb_cpuinfo = ci->ci_paddr;
|
||||
cpu_args->cb_cputyp = cputyp;
|
||||
membar_Sync();
|
||||
|
||||
/* Disable interrupts and start another CPU. */
|
||||
pstate = getpstate();
|
||||
setpstate(PSTATE_KERN);
|
||||
|
||||
prom_startcpu(ci->ci_node, (void *)cpu_spinup_trampoline, 0);
|
||||
int rc = prom_startcpu_by_cpuid(ci->ci_cpuid,
|
||||
(void *)cpu_spinup_trampoline, 0);
|
||||
if (rc == -1)
|
||||
prom_startcpu(ci->ci_node,
|
||||
(void *)cpu_spinup_trampoline, 0);
|
||||
|
||||
for (i = 0; i < 2000; i++) {
|
||||
membar_Sync();
|
||||
|
@ -1,4 +1,4 @@
|
||||
# $NetBSD: genassym.cf,v 1.74 2014/09/04 18:48:29 palle Exp $
|
||||
# $NetBSD: genassym.cf,v 1.75 2014/09/24 18:32:10 palle Exp $
|
||||
|
||||
#
|
||||
# Copyright (c) 1997 The NetBSD Foundation, Inc.
|
||||
@ -182,6 +182,7 @@ define CBA_KDATA offsetof(struct cpu_bootargs, cb_kdata)
|
||||
define CBA_KDATAP offsetof(struct cpu_bootargs, cb_kdatap)
|
||||
define CBA_EKDATA offsetof(struct cpu_bootargs, cb_ekdata)
|
||||
define CBA_CPUINFO offsetof(struct cpu_bootargs, cb_cpuinfo)
|
||||
define CBA_CPUTYP offsetof(struct cpu_bootargs, cb_cputyp)
|
||||
|
||||
# FPU state
|
||||
define FS_REGS offsetof(struct fpstate64, fs_regs)
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: locore.s,v 1.372 2014/09/04 18:48:29 palle Exp $ */
|
||||
/* $NetBSD: locore.s,v 1.373 2014/09/24 18:32:10 palle Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2006-2010 Matthew R. Green
|
||||
@ -88,6 +88,9 @@
|
||||
#include <machine/intr.h>
|
||||
#include <machine/asm.h>
|
||||
#include <machine/locore.h>
|
||||
#ifdef SUN4V
|
||||
#include <machine/hypervisor.h>
|
||||
#endif
|
||||
#include <sys/syscall.h>
|
||||
|
||||
#define BLOCK_SIZE SPARC64_BLOCK_SIZE
|
||||
@ -120,7 +123,16 @@
|
||||
3:
|
||||
.endm
|
||||
|
||||
|
||||
.macro SET_MMU_CONTEXTID_SUN4U ctxid,ctx
|
||||
stxa \ctxid, [\ctx] ASI_DMMU;
|
||||
.endm
|
||||
|
||||
#ifdef SUN4V
|
||||
.macro SET_MMU_CONTEXTID_SUN4V ctxid,ctx
|
||||
stxa \ctxid, [\ctx] ASI_MMU;
|
||||
.endm
|
||||
#endif
|
||||
|
||||
.macro SET_MMU_CONTEXTID ctxid,ctx,scratch
|
||||
#ifdef SUN4V
|
||||
sethi %hi(cputyp), \scratch
|
||||
@ -129,15 +141,14 @@
|
||||
bne,pt %icc, 2f
|
||||
nop
|
||||
/* sun4v */
|
||||
stxa \ctxid, [\ctx] ASI_MMU;
|
||||
SET_MMU_CONTEXTID_SUN4V \ctxid,\ctx
|
||||
ba 3f
|
||||
nop
|
||||
2:
|
||||
#endif
|
||||
/* sun4u */
|
||||
stxa \ctxid, [\ctx] ASI_DMMU;
|
||||
SET_MMU_CONTEXTID_SUN4U \ctxid,\ctx
|
||||
3:
|
||||
|
||||
.endm
|
||||
|
||||
#ifdef SUN4V
|
||||
@ -4412,7 +4423,7 @@ dostart:
|
||||
|
||||
ENTRY_NOPROFILE(cpu_initialize) /* for cosmetic reasons - nicer backtrace */
|
||||
|
||||
/* Cache the cputyp in %l6 for later user below */
|
||||
/* Cache the cputyp in %l6 for later use below */
|
||||
sethi %hi(cputyp), %l6
|
||||
ld [%l6 + %lo(cputyp)], %l6
|
||||
|
||||
@ -4440,7 +4451,6 @@ ENTRY_NOPROFILE(cpu_initialize) /* for cosmetic reasons - nicer backtrace */
|
||||
*/
|
||||
mov %l1, %l7 ! save cpu_info pointer
|
||||
ldx [%l1 + CI_PADDR], %l1 ! Load the interrupt stack's PA
|
||||
|
||||
#ifdef SUN4V
|
||||
cmp %l6, CPU_SUN4V
|
||||
bne,pt %icc, 3f
|
||||
@ -4464,7 +4474,7 @@ ENTRY_NOPROFILE(cpu_initialize) /* for cosmetic reasons - nicer backtrace */
|
||||
andn %l1, %l4, %l1 ! Mask the phys page number
|
||||
|
||||
or %l2, %l1, %l1 ! Now take care of the high bits
|
||||
or %l1, SUN4U_TTE_DATABITS, %l2 ! And low bits: L=1|CP=1|CV=?|E=0|P=1|W=1|G=0
|
||||
or %l1, SUN4U_TTE_DATABITS, %l2 ! And low bits: L=1|CP=1|CV=?|E=0|P=1|W=1|G=0
|
||||
|
||||
!!
|
||||
!! Now, map in the interrupt stack as context==0
|
||||
@ -4650,10 +4660,63 @@ ENTRY(cpu_mp_startup)
|
||||
wrpr %g0, PSTATE_KERN, %pstate
|
||||
flushw
|
||||
|
||||
/* Cache the cputyp in %l6 for later use below */
|
||||
sethi %hi(cputyp), %l6
|
||||
ld [%l6 + %lo(cputyp)], %l6
|
||||
|
||||
/*
|
||||
* Get pointer to our cpu_info struct
|
||||
*/
|
||||
ldx [%g2 + CBA_CPUINFO], %l1 ! Load the interrupt stack's PA
|
||||
|
||||
|
||||
#ifdef SUN4V
|
||||
cmp %l6, CPU_SUN4V
|
||||
bne,pt %icc, 3f
|
||||
nop
|
||||
|
||||
/* sun4v */
|
||||
|
||||
sethi %hi(0x80000000), %l2 ! V=1|NFO=0|SW=0
|
||||
sllx %l2, 32, %l2 ! Shift it into place
|
||||
mov -1, %l3 ! Create a nice mask
|
||||
sllx %l3, 56, %l4 ! Mask off high 8 bits
|
||||
or %l4, 0x1fff, %l4 ! Mask off low 13 bits
|
||||
andn %l1, %l4, %l1 ! Mask the phys page number into RA
|
||||
or %l2, %l1, %l1 ! Now take care of the 8 high bits V|NFO|SW
|
||||
or %l1, 0x0141, %l2 ! And low 13 bits IE=0|E=0|CP=0|CV=0|P=1|
|
||||
! X=0|W=1|SW=00|SZ=0001
|
||||
|
||||
/*
|
||||
* Now, map in the interrupt stack & cpu_info as context==0
|
||||
*/
|
||||
|
||||
set INTSTACK, %o0 ! vaddr
|
||||
clr %o1 ! reserved
|
||||
mov %l2, %o2 ! tte
|
||||
mov MAP_DTLB, %o3 ! flags
|
||||
mov FT_MMU_MAP_PERM_ADDR, %o5 ! hv fast trap function
|
||||
ta ST_FAST_TRAP
|
||||
cmp %o0, 0
|
||||
be,pt %icc, 5f
|
||||
nop
|
||||
sir ! crash if mapping fails
|
||||
5:
|
||||
|
||||
/*
|
||||
* Set 0 as primary context XXX
|
||||
*/
|
||||
|
||||
mov CTX_PRIMARY, %o0
|
||||
SET_MMU_CONTEXTID_SUN4V %g0, %o0
|
||||
|
||||
ba 4f
|
||||
nop
|
||||
3:
|
||||
#endif
|
||||
|
||||
/* sun4u */
|
||||
|
||||
sethi %hi(0xa0000000), %l2 ! V=1|SZ=01|NFO=0|IE=0
|
||||
sllx %l2, 32, %l2 ! Shift it into place
|
||||
mov -1, %l3 ! Create a nice mask
|
||||
@ -4661,11 +4724,12 @@ ENTRY(cpu_mp_startup)
|
||||
or %l4, 0xfff, %l4 ! We can just load this in 12 (of 13) bits
|
||||
andn %l1, %l4, %l1 ! Mask the phys page number
|
||||
or %l2, %l1, %l1 ! Now take care of the high bits
|
||||
or %l1, SUN4U_TTE_DATABITS, %l2 ! And low bits: L=1|CP=1|CV=?|E=0|P=1|W=1|G=0
|
||||
or %l1, SUN4U_TTE_DATABITS, %l2 ! And low bits: L=1|CP=1|CV=?|E=0|P=1|W=1|G=0
|
||||
|
||||
/*
|
||||
* Now, map in the interrupt stack & cpu_info as context==0
|
||||
*/
|
||||
|
||||
set TLB_TAG_ACCESS, %l5
|
||||
set INTSTACK, %l0
|
||||
stxa %l0, [%l5] ASI_DMMU ! Make DMMU point to it
|
||||
@ -4674,10 +4738,13 @@ ENTRY(cpu_mp_startup)
|
||||
/*
|
||||
* Set 0 as primary context XXX
|
||||
*/
|
||||
|
||||
mov CTX_PRIMARY, %o0
|
||||
stxa %g0, [%o0] ASI_DMMU
|
||||
membar #Sync
|
||||
SET_MMU_CONTEXTID_SUN4U %g0, %o0
|
||||
|
||||
4:
|
||||
membar #Sync
|
||||
|
||||
/*
|
||||
* Temporarily use the interrupt stack
|
||||
*/
|
||||
@ -4689,9 +4756,39 @@ ENTRY(cpu_mp_startup)
|
||||
set 1, %fp
|
||||
clr %i7
|
||||
|
||||
#ifdef SUN4V
|
||||
cmp %l6, CPU_SUN4V
|
||||
bne,pt %icc, 2f
|
||||
nop
|
||||
|
||||
/* sun4v */
|
||||
|
||||
/*
|
||||
* install our TSB pointers
|
||||
*/
|
||||
|
||||
set CPUINFO_VA, %o0
|
||||
LDPTR [%o0 + CI_TSB_DESC], %o0
|
||||
call _C_LABEL(pmap_setup_tsb_sun4v)
|
||||
nop
|
||||
|
||||
/* set trap table */
|
||||
|
||||
set _C_LABEL(trapbase_sun4v), %l1
|
||||
GET_MMFSA %o1
|
||||
call _C_LABEL(prom_set_trap_table_sun4v)
|
||||
mov %l1, %o0
|
||||
! Now we should be running 100% from our handlers
|
||||
ba 3f
|
||||
nop
|
||||
2:
|
||||
#endif
|
||||
/* sun4u */
|
||||
|
||||
/*
|
||||
* install our TSB pointers
|
||||
*/
|
||||
|
||||
sethi %hi(CPUINFO_VA+CI_TSB_DMMU), %l0
|
||||
sethi %hi(CPUINFO_VA+CI_TSB_IMMU), %l1
|
||||
sethi %hi(_C_LABEL(tsbsize)), %l2
|
||||
@ -4717,9 +4814,11 @@ ENTRY(cpu_mp_startup)
|
||||
1:
|
||||
|
||||
/* set trap table */
|
||||
|
||||
set _C_LABEL(trapbase), %l1
|
||||
call _C_LABEL(prom_set_trap_table_sun4u)
|
||||
mov %l1, %o0
|
||||
3:
|
||||
wrpr %l1, 0, %tba ! Make sure the PROM didn't
|
||||
! foul up.
|
||||
/*
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: mp_subr.S,v 1.6 2014/06/08 17:33:24 palle Exp $ */
|
||||
/* $NetBSD: mp_subr.S,v 1.7 2014/09/24 18:32:10 palle Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2006-2010 Matthew R. Green
|
||||
@ -214,28 +214,48 @@ ENTRY(sparc64_ipi_flush_pte_sun4v)
|
||||
.text
|
||||
.align 32
|
||||
1: rd %pc, %l0
|
||||
LDULNG [%l0 + (4f-1b)], %l1
|
||||
add %l0, (6f-1b), %l2
|
||||
LDULNG [%l0 + (4f-1b)], %l1 ! Load tlb slot count
|
||||
LDULNG [%l0 + (7f-1b)], %g2 ! Load cpu_args address.
|
||||
add %l0, (6f-1b), %l2 ! tlb slots
|
||||
ld [%g2 + CBA_CPUTYP], %g3 ! Load cputype
|
||||
clr %l3
|
||||
2: cmp %l3, %l1
|
||||
be CCCR, 3f
|
||||
nop
|
||||
ldx [%l2 + TTE_VPN], %l4
|
||||
ldx [%l2 + TTE_DATA], %l5
|
||||
#ifdef SUN4V
|
||||
cmp %g3, CPU_SUN4V
|
||||
bne,pt %icc, 8f
|
||||
nop
|
||||
! sun4v
|
||||
mov %l4, %o0 ! vaddr
|
||||
clr %o1 ! reserved
|
||||
mov %l5, %o2 ! tte
|
||||
mov MAP_DTLB|MAP_ITLB, %o3 ! flags
|
||||
mov FT_MMU_MAP_PERM_ADDR, %o5 ! hv fast trap function
|
||||
ta ST_FAST_TRAP
|
||||
cmp %o0, 0
|
||||
be,pt %icc, 9f
|
||||
nop
|
||||
sir ! crash if mapping fails
|
||||
8:
|
||||
#endif
|
||||
! sun4u
|
||||
wr %g0, ASI_DMMU, %asi
|
||||
stxa %l4, [%g0 + TLB_TAG_ACCESS] %asi
|
||||
stxa %l5, [%g0] ASI_DMMU_DATA_IN
|
||||
wr %g0, ASI_IMMU, %asi
|
||||
stxa %l4, [%g0 + TLB_TAG_ACCESS] %asi
|
||||
stxa %l5, [%g0] ASI_IMMU_DATA_IN
|
||||
9:
|
||||
membar #Sync
|
||||
flush %l4
|
||||
add %l2, PTE_SIZE, %l2
|
||||
add %l3, 1, %l3
|
||||
ba %xcc, 2b
|
||||
nop
|
||||
3: LDULNG [%l0 + (5f-1b)], %l1
|
||||
LDULNG [%l0 + (7f-1b)], %g2 ! Load cpu_info address.
|
||||
3: LDULNG [%l0 + (5f-1b)], %l1 ! Load function
|
||||
jmpl %l1, %g0
|
||||
nop
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user