summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2001-01-24 10:07:42 +0000
committerjhb <jhb@FreeBSD.org>2001-01-24 10:07:42 +0000
commita1ce5e9db8ddc7349eb2ff1d39d0be8345bcd059 (patch)
tree0b14ce7c9375abf825f42d95843ef3045a380859
parent8168399f03d5695ddacfb6319a39285672983bb0 (diff)
downloadFreeBSD-src-a1ce5e9db8ddc7349eb2ff1d39d0be8345bcd059.zip
FreeBSD-src-a1ce5e9db8ddc7349eb2ff1d39d0be8345bcd059.tar.gz
- Initialize curproc, proc0.p_heldmtx, and proc0.p_contested earlier so
that mutex operations work. - Enter Giant earlier so we hold it during boot. - Proc locking. - Move globaldata_init() into here from mp_machdep.c so that UP kernels don't depend on mp_machdep.c. Use a callout in the SMP case to register the boot processor's globaldata in the cpuid_to_globaldata array.
-rw-r--r--sys/alpha/alpha/machdep.c50
1 files changed, 48 insertions, 2 deletions
diff --git a/sys/alpha/alpha/machdep.c b/sys/alpha/alpha/machdep.c
index ecbc9fa..701b891 100644
--- a/sys/alpha/alpha/machdep.c
+++ b/sys/alpha/alpha/machdep.c
@@ -1000,11 +1000,18 @@ alpha_init(pfn, ptb, bim, bip, biv)
SLIST_INIT(&cpuhead);
SLIST_INSERT_HEAD(&cpuhead, GLOBALP, gd_allcpu);
+ /* Setup curproc so that mutexes work */
+ PCPU_SET(curproc, &proc0);
+
+ LIST_INIT(&proc0.p_heldmtx);
+ LIST_INIT(&proc0.p_contested);
+
/*
* Initialise mutexes.
*/
mtx_init(&Giant, "Giant", MTX_DEF | MTX_RECURSE);
mtx_init(&sched_lock, "sched lock", MTX_SPIN | MTX_RECURSE);
+ mtx_enter(&Giant, MTX_DEF);
/*
* Look at arguments passed to us and compute boothowto.
@@ -1230,13 +1237,15 @@ osendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
struct proc *p = curproc;
osiginfo_t *sip, ksi;
struct trapframe *frame;
- struct sigacts *psp = p->p_sigacts;
+ struct sigacts *psp;
int oonstack, fsize, rndfsize;
frame = p->p_md.md_tf;
oonstack = sigonstack(alpha_pal_rdusp());
fsize = sizeof ksi;
rndfsize = ((fsize + 15) / 16) * 16;
+ PROC_LOCK(p);
+ psp = p->p_sigacts;
/*
* Allocate and validate space for the signal handler
@@ -1254,6 +1263,7 @@ osendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
#endif
} else
sip = (osiginfo_t *)(alpha_pal_rdusp() - rndfsize);
+ PROC_UNLOCK(p);
(void)grow_stack(p, (u_long)sip);
if (!useracc((caddr_t)sip, fsize, VM_PROT_WRITE)) {
@@ -1261,10 +1271,12 @@ osendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
* Process has trashed its stack; give it an illegal
* instruction to halt it in its tracks.
*/
+ PROC_LOCK(p);
SIGACTION(p, SIGILL) = SIG_DFL;
SIGDELSET(p->p_sigignore, SIGILL);
SIGDELSET(p->p_sigcatch, SIGILL);
SIGDELSET(p->p_sigmask, SIGILL);
+ PROC_UNLOCK(p);
psignal(p, SIGILL);
return;
}
@@ -1312,10 +1324,12 @@ osendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
*/
frame->tf_regs[FRAME_PC] = PS_STRINGS - (esigcode - sigcode);
frame->tf_regs[FRAME_A0] = sig;
+ PROC_LOCK(p);
if (SIGISMEMBER(p->p_sigacts->ps_siginfo, sig))
frame->tf_regs[FRAME_A1] = (u_int64_t)sip;
else
frame->tf_regs[FRAME_A1] = code;
+ PROC_UNLOCK(p);
frame->tf_regs[FRAME_A2] = (u_int64_t)&sip->si_sc;
frame->tf_regs[FRAME_T12] = (u_int64_t)catcher; /* t12 is pv */
alpha_pal_wrusp((unsigned long)sip);
@@ -1326,11 +1340,14 @@ sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
{
struct proc *p = curproc;
struct trapframe *frame;
- struct sigacts *psp = p->p_sigacts;
+ struct sigacts *psp;
struct sigframe sf, *sfp;
int oonstack, rndfsize;
+ PROC_LOCK(p);
+ psp = p->p_sigacts;
if (SIGISMEMBER(psp->ps_osigset, sig)) {
+ PROC_UNLOCK(p);
osendsig(catcher, sig, mask, code);
return;
}
@@ -1375,6 +1392,7 @@ sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
#endif
} else
sfp = (struct sigframe *)(alpha_pal_rdusp() - rndfsize);
+ PROC_UNLOCK(p);
(void)grow_stack(p, (u_long)sfp);
#ifdef DEBUG
@@ -1392,10 +1410,12 @@ sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
* Process has trashed its stack; give it an illegal
* instruction to halt it in its tracks.
*/
+ PROC_LOCK(p);
SIGACTION(p, SIGILL) = SIG_DFL;
SIGDELSET(p->p_sigignore, SIGILL);
SIGDELSET(p->p_sigcatch, SIGILL);
SIGDELSET(p->p_sigmask, SIGILL);
+ PROC_UNLOCK(p);
psignal(p, SIGILL);
return;
}
@@ -1429,6 +1449,7 @@ sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
*/
frame->tf_regs[FRAME_PC] = PS_STRINGS - (esigcode - sigcode);
frame->tf_regs[FRAME_A0] = sig;
+ PROC_LOCK(p);
if (SIGISMEMBER(p->p_sigacts->ps_siginfo, sig)) {
frame->tf_regs[FRAME_A1] = (u_int64_t)&(sfp->sf_si);
@@ -1439,6 +1460,7 @@ sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
}
else
frame->tf_regs[FRAME_A1] = code;
+ PROC_UNLOCK(p);
frame->tf_regs[FRAME_A2] = (u_int64_t)&(sfp->sf_uc);
frame->tf_regs[FRAME_T12] = (u_int64_t)catcher; /* t12 is pv */
@@ -1486,6 +1508,7 @@ osigreturn(struct proc *p,
if (ksc.sc_regs[R_ZERO] != 0xACEDBADE) /* magic number */
return (EINVAL);
+ PROC_LOCK(p);
#if defined(COMPAT_43) || defined(COMPAT_SUNOS)
/*
* Restore the user-supplied information
@@ -1503,6 +1526,7 @@ osigreturn(struct proc *p,
*/
SIGSETOLD(p->p_sigmask, ksc.sc_mask);
SIG_CANTMASK(p->p_sigmask);
+ PROC_UNLOCK(p);
set_regs(p, (struct reg *)ksc.sc_regs);
p->p_md.md_tf->tf_regs[FRAME_PC] = ksc.sc_pc;
@@ -1556,6 +1580,7 @@ sigreturn(struct proc *p,
p->p_md.md_tf->tf_regs[FRAME_PC] = uc.uc_mcontext.mc_regs[R_PC];
alpha_pal_wrusp(uc.uc_mcontext.mc_regs[R_SP]);
+ PROC_LOCK(p);
#if defined(COMPAT_43) || defined(COMPAT_SUNOS)
if (uc.uc_mcontext.mc_onstack & 1)
p->p_sigstk.ss_flags |= SS_ONSTACK;
@@ -1565,6 +1590,7 @@ sigreturn(struct proc *p,
p->p_sigmask = uc.uc_sigmask;
SIG_CANTMASK(p->p_sigmask);
+ PROC_UNLOCK(p);
/* XXX ksc.sc_ownedfp ? */
alpha_fpstate_drop(p);
@@ -2187,3 +2213,23 @@ alpha_fpstate_switch(struct proc *p)
p->p_md.md_flags |= MDP_FPUSED;
}
+
+/*
+ * Initialise a struct globaldata.
+ */
+void
+globaldata_init(struct globaldata *globaldata, int cpuid, size_t sz)
+{
+ bzero(globaldata, sz);
+ globaldata->gd_idlepcbphys = vtophys((vm_offset_t) &globaldata->gd_idlepcb);
+ globaldata->gd_idlepcb.apcb_ksp = (u_int64_t)
+ ((caddr_t) globaldata + sz - sizeof(struct trapframe));
+ globaldata->gd_idlepcb.apcb_ptbr = proc0.p_addr->u_pcb.pcb_hw.apcb_ptbr;
+ globaldata->gd_cpuid = cpuid;
+ globaldata->gd_next_asn = 0;
+ globaldata->gd_current_asngen = 1;
+#ifdef SMP
+ globaldata->gd_other_cpus = all_cpus & ~(1 << cpuid);
+ globaldata_register(globaldata);
+#endif
+}
OpenPOWER on IntegriCloud