svn commit: r221226 - projects/altix/sys/ia64/ia64
Marcel Moolenaar
marcel at FreeBSD.org
Fri Apr 29 21:09:03 UTC 2011
Author: marcel
Date: Fri Apr 29 21:09:03 2011
New Revision: 221226
URL: http://svn.freebsd.org/changeset/base/221226
Log:
Complete the AP wake-up revamp.
Modified:
projects/altix/sys/ia64/ia64/mp_locore.S
projects/altix/sys/ia64/ia64/mp_machdep.c
Modified: projects/altix/sys/ia64/ia64/mp_locore.S
==============================================================================
--- projects/altix/sys/ia64/ia64/mp_locore.S Fri Apr 29 21:02:47 2011 (r221225)
+++ projects/altix/sys/ia64/ia64/mp_locore.S Fri Apr 29 21:09:03 2011 (r221226)
@@ -43,62 +43,81 @@
.align 32
ENTRY_NOPROFILE(os_boot_rendez,0)
{ .mmi
+ st8 [gp] = gp // trace = 0x00
mov r8 = cr.ivr // clear IRR bit
+ add r2 = 8, gp
;;
- srlz.d
- mov r16 = (IA64_PBVM_RR << 8) | (IA64_PBVM_PAGE_SHIFT << 2)
}
{ .mmi
+ srlz.d
mov cr.eoi = r0 // ACK the wake-up
+ add r3 = 16, gp
;;
+}
+{ .mmi
srlz.d
- dep.z r17 = IA64_PBVM_RR, 61, 3
+ rsm IA64_PSR_IC | IA64_PSR_I
+ mov r16 = (IA64_PBVM_RR << 8) | (IA64_PBVM_PAGE_SHIFT << 2)
;;
}
{ .mmi
- rsm IA64_PSR_IC | IA64_PSR_I
- mov rr[r17] = r16
- add r2 = 8, r1
+ srlz.d
+ st8 [gp] = r2 // trace = 0x08
+ dep.z r17 = IA64_PBVM_RR, 61, 3
;;
}
{ .mlx
+ mov rr[r17] = r16
+ movl r18 = IA64_PBVM_PGTBL
+ ;;
+}
+{ .mmi
srlz.i
- movl r16 = IA64_PBVM_PGTBL
+ ;;
+ st8 [gp] = r3 // trace = 0x10
+ nop 0
;;
}
{ .mmi
- ld8 r17 = [r1], 16 // as_pgtbl_pte
- ld8 r18 = [r2], 16 // as_pgtbl_itir
- mov r8 = r0
+ ld8 r16 = [r2], 16 // as_pgtbl_pte
+ ld8 r17 = [r3], 16 // as_pgtbl_itir
+ nop 0
;;
}
{ .mmi
- mov cr.ifa = r16
- mov cr.itir = r18
- mov r9 = r0
+ mov cr.itir = r17
+ mov cr.ifa = r18
+ nop 0
;;
}
{ .mmi
srlz.d
- ptr.d r16, r18
+ ptr.d r18, r17
nop 0
;;
}
{ .mmi
srlz.d
- itr.d dtr[r8] = r17
- nop 0
+ st8 [gp] = r2 // trace = 0x18
+ mov r8 = r0
;;
}
{ .mmi
+ itr.d dtr[r8] = r16
+ ;;
srlz.d
- ld8 r16 = [r1], 16 // as_text_va
+ mov r9 = r0
+ ;;
+}
+{ .mmi
+ ld8 r16 = [r2], 16 // as_text_va
+ st8 [gp] = r3 // trace = 0x20
add r8 = 1, r8
;;
}
{ .mmi
- ld8 r17 = [r2], 16 // as_text_pte
- ld8 r18 = [r1], 16 // as_text_itir
+ ld8 r17 = [r3], 16 // as_text_pte
+ ld8 r18 = [r2], 16 // as_text_itir
nop 0
;;
}
@@ -116,12 +135,18 @@ ENTRY_NOPROFILE(os_boot_rendez,0)
}
{ .mmi
srlz.d
- itr.d dtr[r8] = r17
+ st8 [gp] = r3 // trace = 0x30
nop 0
;;
}
{ .mmi
+ itr.d dtr[r8] = r17
+ ;;
srlz.d
+ nop 0
+}
+{ .mmi
+ st8 [gp] = r2 // trace = 0x38
ptr.i r16, r18
add r8 = 1, r8
;;
@@ -136,42 +161,51 @@ ENTRY_NOPROFILE(os_boot_rendez,0)
{ .mmi
srlz.i
;;
- ld8 r16 = [r2], 16 // as_data_va
+ ld8 r16 = [r3], 16 // as_data_va
add r9 = 1, r9
;;
}
{ .mmi
- ld8 r17 = [r1], 16 // as_data_pte
- ld8 r18 = [r2], 16 // as_data_itir
+ st8 [gp] = r3 // trace = 0x40
+ ld8 r17 = [r2], 16 // as_data_pte
nop 0
;;
}
{ .mmi
mov cr.ifa = r16
- mov cr.itir = r18
+ ld8 r18 = [r3], 16 // as_data_itir
nop 0
;;
}
{ .mmi
+ mov cr.itir = r18
+ ;;
srlz.d
- ptr.d r16, r18
nop 0
;;
}
{ .mmi
+ ptr.d r16, r18
+ ;;
srlz.d
- itr.d dtr[r8] = r17
mov r19 = IA64_DCR_DEFAULT
;;
}
{ .mmi
+ itr.d dtr[r8] = r17
+ ;;
srlz.d
- ld8 r16 = [r1], 16 // as_kstack
add r8 = 1, r8
;;
}
{ .mmi
- ld8 r17 = [r2], 16 // as_kstack_top
+ st8 [gp] = r2 // trace = 0x48
+ ;;
+ ld8 r16 = [r2], 16 // as_kstack
+ nop 0
+}
+{ .mmi
+ ld8 r17 = [r3], 16 // as_kstack_top
mov cr.dcr = r19
nop 0
;;
@@ -182,52 +216,50 @@ ENTRY_NOPROFILE(os_boot_rendez,0)
IA64_PSR_RT | IA64_PSR_DFH
;;
}
-1:
-{ .mii
+{ .mlx
mov cr.ipsr = r18
- mov r19 = ip
+ movl r19 = ia64_vector_table // set up IVT early
;;
- add r19 = 2f-1b, r19
+}
+{ .mlx
+ mov cr.iva = r19
+ movl r18 = 1f
;;
}
{ .mmi
+ mov cr.iip = r18
mov cr.ifs = r0
- mov cr.iip = r19
nop 0
;;
}
-
+{ .mmb
+ srlz.d
+ st8 [gp] = r2 // trace = 0x58
rfi
;;
+}
.align 32
-2:
+1:
{ .mlx
- mov ar.rsc = 0
- movl r18 = ia64_vector_table // set up IVT early
+ mov ar.bspstore = r16
+ movl gp = __gp
;;
}
{ .mmi
- mov cr.iva = r18
- ;;
- srlz.i
+ loadrs
+ add sp = -16, r17
nop 0
;;
}
-{ .mlx
- mov ar.bspstore = r16
- movl gp = __gp
- ;;
-}
{ .mmi
- loadrs
+ mov ar.rsc = 3
;;
alloc r18 = ar.pfs, 0, 0, 0, 0
- add sp = -16, r17
;;
}
{ .mib
- mov ar.rsc = 3
+ nop 0
nop 0
br.call.sptk.few rp = ia64_ap_startup
;;
Modified: projects/altix/sys/ia64/ia64/mp_machdep.c
==============================================================================
--- projects/altix/sys/ia64/ia64/mp_machdep.c Fri Apr 29 21:02:47 2011 (r221225)
+++ projects/altix/sys/ia64/ia64/mp_machdep.c Fri Apr 29 21:09:03 2011 (r221226)
@@ -47,6 +47,7 @@ __FBSDID("$FreeBSD$");
#include <sys/uuid.h>
#include <machine/atomic.h>
+#include <machine/bootinfo.h>
#include <machine/cpu.h>
#include <machine/fpu.h>
#include <machine/intr.h>
@@ -62,6 +63,8 @@ __FBSDID("$FreeBSD$");
#include <vm/vm_extern.h>
#include <vm/vm_kern.h>
+extern uint64_t bdata[];
+
MALLOC_DEFINE(M_SMP, "SMP", "SMP related allocations");
void ia64_ap_startup(void);
@@ -81,6 +84,21 @@ int ia64_ipi_rndzvs;
int ia64_ipi_stop;
static u_int
+sz2shft(uint64_t sz)
+{
+ uint64_t s;
+ u_int shft;
+
+ shft = 12; /* Start with 4K */
+ s = 1 << shft;
+ while (s < sz) {
+ shft++;
+ s <<= 1;
+ }
+ return (shft);
+}
+
+static u_int
ia64_ih_ast(struct thread *td, u_int xiv, struct trapframe *tf)
{
@@ -174,14 +192,25 @@ ia64_ap_startup(void)
{
uint64_t vhpt;
+ ia64_ap_state.as_trace = 0x100;
+
+ ia64_set_rr(IA64_RR_BASE(5), (5 << 8) | (PAGE_SHIFT << 2) | 1);
+ ia64_set_rr(IA64_RR_BASE(6), (6 << 8) | (PAGE_SHIFT << 2));
+ ia64_set_rr(IA64_RR_BASE(7), (7 << 8) | (PAGE_SHIFT << 2));
+ ia64_srlz_d();
+
pcpup = ia64_ap_state.as_pcpu;
ia64_set_k4((intptr_t)pcpup);
+ ia64_ap_state.as_trace = 0x108;
+
vhpt = PCPU_GET(md.vhpt);
map_vhpt(vhpt);
ia64_set_pta(vhpt + (1 << 8) + (pmap_vhpt_log2size << 2) + 1);
ia64_srlz_i();
+ ia64_ap_state.as_trace = 0x110;
+
ia64_ap_state.as_awake = 1;
ia64_ap_state.as_delay = 0;
@@ -301,48 +330,73 @@ cpu_mp_start()
struct ia64_sal_result result;
struct ia64_fdesc *fd;
struct pcpu *pc;
+ uintptr_t state;
u_char *stp;
- ia64_ap_state.as_spin = 1;
-
+ state = ia64_tpa((uintptr_t)&ia64_ap_state);
fd = (struct ia64_fdesc *) os_boot_rendez;
result = ia64_sal_entry(SAL_SET_VECTORS, SAL_OS_BOOT_RENDEZ,
- ia64_tpa(fd->func), ia64_tpa((uintptr_t)&ia64_ap_state),
- 0, 0, 0, 0);
+ ia64_tpa(fd->func), state, 0, 0, 0, 0);
+
+ ia64_ap_state.as_pgtbl_pte = PTE_PRESENT | PTE_MA_WB |
+ PTE_ACCESSED | PTE_DIRTY | PTE_PL_KERN | PTE_AR_RW |
+ (bootinfo->bi_pbvm_pgtbl & PTE_PPN_MASK);
+ ia64_ap_state.as_pgtbl_itir = sz2shft(bootinfo->bi_pbvm_pgtblsz) << 2;
+ ia64_ap_state.as_text_va = IA64_PBVM_BASE;
+ ia64_ap_state.as_text_pte = PTE_PRESENT | PTE_MA_WB |
+ PTE_ACCESSED | PTE_DIRTY | PTE_PL_KERN | PTE_AR_RX |
+ (ia64_tpa(IA64_PBVM_BASE) & PTE_PPN_MASK);
+ ia64_ap_state.as_text_itir = bootinfo->bi_text_mapped << 2;
+ ia64_ap_state.as_data_va = (uintptr_t)bdata;
+ ia64_ap_state.as_data_pte = PTE_PRESENT | PTE_MA_WB |
+ PTE_ACCESSED | PTE_DIRTY | PTE_PL_KERN | PTE_AR_RW |
+ (ia64_tpa((uintptr_t)bdata) & PTE_PPN_MASK);
+ ia64_ap_state.as_data_itir = bootinfo->bi_data_mapped << 2;
+
+ /* Keep 'em spinning until we unleash them... */
+ ia64_ap_state.as_spin = 1;
SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
pc->pc_md.current_pmap = kernel_pmap;
pc->pc_other_cpus = all_cpus & ~pc->pc_cpumask;
- if (pc->pc_cpuid > 0) {
- ia64_ap_state.as_pcpu = pc;
- pc->pc_md.vhpt = pmap_alloc_vhpt();
- if (pc->pc_md.vhpt == 0) {
- printf("SMP: WARNING: unable to allocate VHPT"
- " for cpu%d", pc->pc_cpuid);
- continue;
- }
- stp = malloc(KSTACK_PAGES * PAGE_SIZE, M_SMP, M_WAITOK);
- ia64_ap_state.as_kstack = stp;
- ia64_ap_state.as_kstack_top = stp + KSTACK_PAGES *
- PAGE_SIZE - 16;
- ia64_ap_state.as_delay = 2000;
- ia64_ap_state.as_awake = 0;
-
- if (bootverbose)
- printf("SMP: waking up cpu%d\n", pc->pc_cpuid);
-
- ipi_send(pc, ia64_ipi_wakeup);
-
- do {
- DELAY(1000);
- } while (--ia64_ap_state.as_delay > 0);
- pc->pc_md.awake = ia64_ap_state.as_awake;
-
- if (!ia64_ap_state.as_awake)
- printf("SMP: WARNING: cpu%d did not wake up\n",
- pc->pc_cpuid);
- } else
+ /* The BSP is obviously running already. */
+ if (pc->pc_cpuid == 0) {
pc->pc_md.awake = 1;
+ continue;
+ }
+
+ ia64_ap_state.as_pcpu = pc;
+ pc->pc_md.vhpt = pmap_alloc_vhpt();
+ if (pc->pc_md.vhpt == 0) {
+ printf("SMP: WARNING: unable to allocate VHPT"
+ " for cpu%d", pc->pc_cpuid);
+ continue;
+ }
+
+ stp = malloc(KSTACK_PAGES * PAGE_SIZE, M_SMP, M_WAITOK);
+ ia64_ap_state.as_kstack = stp;
+ ia64_ap_state.as_kstack_top = stp + KSTACK_PAGES * PAGE_SIZE;
+
+ ia64_ap_state.as_trace = 0;
+ ia64_ap_state.as_delay = 2000;
+ ia64_ap_state.as_awake = 0;
+
+ if (bootverbose)
+ printf("SMP: waking up cpu%d\n", pc->pc_cpuid);
+
+ /* Here she goes... */
+ ipi_send(pc, ia64_ipi_wakeup);
+ do {
+ DELAY(1000);
+ } while (--ia64_ap_state.as_delay > 0);
+
+ pc->pc_md.awake = ia64_ap_state.as_awake;
+
+ if (!ia64_ap_state.as_awake) {
+ printf("SMP: WARNING: cpu%d did not wake up (code "
+ "%#lx)\n", pc->pc_cpuid,
+ ia64_ap_state.as_trace - state);
+ }
}
}
More information about the svn-src-projects
mailing list