PERFORCE change 94237 for review
Kip Macy
kmacy at FreeBSD.org
Wed Mar 29 10:00:01 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=94237
Change 94237 by kmacy at kmacy_storage:sun4v_work on 2006/03/29 09:59:01
switch to a decidedly more fail-fast approach to tracking PCB physical addresses
track down remaining issue to exec_setregs zeroing all fields in the PCB after it had been initialized in fork
Affected files ...
.. //depot/projects/kmacy_sun4v/src/sys/sparc64/sparc64/genassym.c#16 edit
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/include/asmacros.h#12 edit
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/include/pcb.h#9 edit
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/include/pcpu.h#9 edit
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/exception.S#40 edit
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/locore.S#8 edit
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/machdep.c#18 edit
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/swtch.S#15 edit
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/vm_machdep.c#7 edit
Differences ...
==== //depot/projects/kmacy_sun4v/src/sys/sparc64/sparc64/genassym.c#16 (text+ko) ====
@@ -219,9 +219,8 @@
ASSYM(PC_KWBUF_SP, offsetof(struct pcpu, pc_kwbuf_sp));
ASSYM(PC_KWBUF, offsetof(struct pcpu, pc_kwbuf));
ASSYM(PC_PMAP, offsetof(struct pcpu, pc_curpmap));
-ASSYM(PC_CURPCB_RA, offsetof(struct pcpu, pc_curpcb_ra));
-ASSYM(PCB_RA, offsetof(struct pcb, pcb_ra));
+ASSYM(PCB_KSTACK, offsetof(struct pcb, pcb_kstack));
ASSYM(INTR_REPORT_SIZE, INTR_REPORT_SIZE);
#else
ASSYM(PC_TLB_CTX, offsetof(struct pcpu, pc_tlb_ctx));
==== //depot/projects/kmacy_sun4v/src/sys/sun4v/include/asmacros.h#12 (text+ko) ====
@@ -181,9 +181,10 @@
#define GET_PCB_PHYS(tmp, reg) \
- mov PC_CURPCB_RA, reg; \
+ mov PC_CURPCB, reg; \
GET_PCPU_PHYS_SCRATCH(tmp); \
- ldxa [PCPU_REG + reg]ASI_REAL, reg;
+ ldxa [PCPU_REG + reg]ASI_REAL, reg; \
+ sub reg, tmp, reg;
#define GET_PCB(reg) \
==== //depot/projects/kmacy_sun4v/src/sys/sun4v/include/pcb.h#9 (text+ko) ====
@@ -45,7 +45,7 @@
uint64_t pcb_nsaved; /* number of windows saved in pcb_rw */
uint64_t pcb_pc;
uint64_t pcb_sp;
- uint64_t pcb_ra; /* physical address of pcb */
+ uint64_t pcb_kstack; /* pcb's kernel stack */
uint64_t pcb_pad[4];
} __aligned(64);
==== //depot/projects/kmacy_sun4v/src/sys/sun4v/include/pcpu.h#9 (text+ko) ====
@@ -74,8 +74,7 @@
struct rwindow pc_kwbuf; \
u_long pc_kwbuf_sp; \
u_int pc_kwbuf_full; \
- u_int pc_node; \
- u_long pc_curpcb_ra;
+ u_int pc_node;
/* XXX SUN4V_FIXME - as we access the *_ra and *_size fields in quick
* succession we _really_ want them to be L1 cache line size aligned
==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/exception.S#40 (text+ko) ====
@@ -929,7 +929,8 @@
mov %l7, %o0
ldx [PCPU_REG + PC_CURPCB], %g6
- sub %g6, CCFSZ + SPOFF + TF_SIZEOF, %sp
+ ldx [%g6 + PCB_KSTACK], %g6
+ sub %g6, TF_SIZEOF, %sp
add %sp, REGOFF + SPOFF, %l7
ENTRY(user_rtt)
GET_PCPU_SCRATCH
@@ -1229,7 +1230,8 @@
#endif
GET_PCB(%g6)
wrpr %g0, %g5, %cleanwin
- sub %g6, SPOFF + CCFSZ + TF_SIZEOF, %g6
+ ldx [%g6 + PCB_KSTACK], %g6
+ sub %g6, TF_SIZEOF, %g6
save %g6, 0, %sp
rdpr %canrestore, %l0
==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/locore.S#8 (text+ko) ====
@@ -80,7 +80,7 @@
/*
* Get onto thread0's kstack.
*/
- sub %g6, SPOFF + CCFSZ, %sp
+ ldx [%g6 + PCB_KSTACK], %sp
/*
* And away we go. This doesn't return.
==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/machdep.c#18 (text+ko) ====
@@ -106,7 +106,7 @@
#include <machine/tick.h>
#include <machine/tlb.h>
#include <machine/tstate.h>
-#include <machine/upa.h>
+#include <machine/asm.h>
#include <machine/ver.h>
#include <machine/hypervisor_api.h>
@@ -398,7 +398,9 @@
thread0.td_kstack = kstack0;
thread0.td_pcb = (struct pcb *)
- (thread0.td_kstack + KSTACK_PAGES * PAGE_SIZE) - 1;
+ (thread0.td_kstack + KSTACK_PAGES * PAGE_SIZE) - 1;
+ thread0.td_pcb->pcb_kstack = (uint64_t)(((char *)thread0.td_pcb) - (CCFSZ + SPOFF));
+ thread0.td_pcb = (struct pcb *)TLB_PHYS_TO_DIRECT(vtophys((vm_offset_t)thread0.td_pcb));
pc->pc_curpcb = thread0.td_pcb;
/*
@@ -766,6 +768,7 @@
struct trapframe *tf;
struct pcb *pcb;
struct proc *p;
+ uint64_t kstack;
u_long sp;
/* XXX no cpu_exec */
@@ -776,12 +779,14 @@
utrap_free(p->p_md.md_utrap);
p->p_md.md_utrap = NULL;
}
-
pcb = td->td_pcb;
+ kstack = pcb->pcb_kstack;
tf = td->td_frame;
sp = rounddown(stack, 16);
bzero(pcb, sizeof(*pcb));
bzero(tf, sizeof(*tf));
+ pcb->pcb_kstack = kstack;
+
tf->tf_out[0] = stack;
tf->tf_out[3] = p->p_sysent->sv_psstrings;
tf->tf_out[6] = sp - SPOFF - sizeof(struct frame);
==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/swtch.S#15 (text+ko) ====
@@ -48,34 +48,15 @@
ba %xcc, .Lsw1
mov %i1, %i0
END(cpu_throw)
-
-
-ENTRY(pcb_ra_miss)
- call pmap_kextract
- mov PCB_REG, %o0
- mov %o0, %l0
-#ifdef DEBUG
- ! sanity check lookup
- brnz %o0, 1f
- nop
- MAGIC_TRAP_ON
- MAGIC_EXIT
-1:
-#endif
- ba,pt %xcc, pcb_ra_uptodate
- stx %l0, [PCB_REG + PCB_RA]
-END(pcb_ra_miss)
-
-
/*
* void cpu_switch(struct thread *old, struct thread *new)
*/
ENTRY(cpu_switch)
+ save %sp, -CCFSZ, %sp
GET_PCB(PCB_REG)
- save %sp, -CCFSZ, %sp
mov %i1, %i0
-
+
/*
* If the current thread was using floating point in the kernel, save
* its context. The userland floating point context has already been
@@ -133,7 +114,7 @@
9:
#endif
ldx [%i0 + TD_PCB], %i1
-
+
stx %i0, [PCPU(CURTHREAD)]
stx %i1, [PCPU(CURPCB)]
@@ -147,18 +128,14 @@
*/
ldx [PCB_REG + PCB_SP], %fp
ldx [PCB_REG + PCB_PC], %i7
- ldx [PCB_REG + PCB_RA], %l0
sub %fp, CCFSZ, %sp
- brz %l0, pcb_ra_miss
- nop
-pcb_ra_uptodate:
+
/*
* Point to the pmaps of the new process, and of the last non-kernel
* process to run.
*/
- stx %l0, [PCPU(CURPCB_RA)]
ldx [%i0 + TD_PROC], %i2
ldx [PCPU(PMAP)], %l2
ldx [%i2 + P_VMSPACE], %i5
==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/vm_machdep.c#7 (text+ko) ====
@@ -86,6 +86,7 @@
#include <machine/tlb.h>
#include <machine/tstate.h>
#include <machine/wstate.h>
+#include <machine/asm.h>
#ifndef NSFBUFS
#define NSFBUFS (512 + maxusers * 16)
@@ -135,9 +136,11 @@
pcb = (struct pcb *)((td->td_kstack + td->td_kstack_pages * PAGE_SIZE -
sizeof(struct pcb)) & ~0x3fUL);
- pcb->pcb_ra = vtophys((vm_offset_t)pcb);
+ pcb->pcb_kstack = (uint64_t)(((char *)pcb) - (CCFSZ + SPOFF));
pcb->pcb_nsaved = 0;
td->td_frame = (struct trapframe *)pcb - 1;
+
+ pcb = (struct pcb *)TLB_PHYS_TO_DIRECT(vtophys((vm_offset_t)pcb));
td->td_pcb = pcb;
}
@@ -162,6 +165,7 @@
bcopy(td0->td_frame, td->td_frame, sizeof(struct trapframe));
pcb = td->td_pcb;
+
tf = td->td_frame;
fr = (struct frame *)tf - 1;
fr->fr_local[0] = (u_long)fork_return;
@@ -216,7 +220,7 @@
struct trapframe *tf;
struct frame *fp;
struct pcb *pcb1;
- struct pcb *pcb2;
+ struct pcb *pcb2, *pcb2orig;
vm_offset_t sp;
int error;
int i;
@@ -232,8 +236,11 @@
/* The pcb must be aligned on a 64-byte boundary. */
pcb1 = td1->td_pcb;
- pcb2 = (struct pcb *)((td2->td_kstack + td2->td_kstack_pages *
+
+ pcb2orig = (struct pcb *)((td2->td_kstack + td2->td_kstack_pages *
PAGE_SIZE - sizeof(struct pcb)) & ~0x3fUL);
+ pcb2 = (struct pcb *)TLB_PHYS_TO_DIRECT(vtophys((vm_offset_t)pcb2orig));
+
td2->td_pcb = pcb2;
/*
@@ -279,7 +286,7 @@
* Copy the trap frame for the return to user mode as if from a
* syscall. This copies most of the user mode register values.
*/
- tf = (struct trapframe *)pcb2 - 1;
+ tf = (struct trapframe *)pcb2orig - 1;
bcopy(td1->td_frame, tf, sizeof(*tf));
tf->tf_out[0] = 0; /* Child returns zero */
@@ -298,7 +305,8 @@
fp->fr_pc = fp->fr_fp = 0;
pcb2->pcb_sp = (u_long)fp - SPOFF;
pcb2->pcb_pc = (u_long)fork_trampoline - 8;
- pcb2->pcb_ra = vtophys((vm_offset_t)pcb2);
+ pcb2->pcb_kstack = (uint64_t)(((char *)pcb2orig) - (CCFSZ + SPOFF));
+
/* Setup to release sched_lock in fork_exit(). */
td2->td_md.md_spinlock_count = 1;
td2->td_md.md_saved_pil = 0;
More information about the p4-projects
mailing list