summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2001-12-11 23:33:44 +0000
committerjhb <jhb@FreeBSD.org>2001-12-11 23:33:44 +0000
commit21b6b26912b00bb37f9f16080ba7d49241814935 (patch)
treec785835e70070309148a72c55669ff0bf043a20a /sys
parent279222ba62c185d7d7ec09017bb3e7760fd333f0 (diff)
downloadFreeBSD-src-21b6b26912b00bb37f9f16080ba7d49241814935.zip
FreeBSD-src-21b6b26912b00bb37f9f16080ba7d49241814935.tar.gz
Overhaul the per-CPU support a bit:
- The MI portions of struct globaldata have been consolidated into a MI struct pcpu. The MD per-CPU data are specified via a macro defined in machine/pcpu.h. A macro was chosen over a struct mdpcpu so that the interface would be cleaner (PCPU_GET(my_md_field) vs. PCPU_GET(md.md_my_md_field)). - All references to globaldata are changed to pcpu instead. In a UP kernel, this data was stored as global variables which is where the original name came from. In an SMP world this data is per-CPU and ideally private to each CPU outside of the context of debuggers. This also included combining machine/globaldata.h and machine/globals.h into machine/pcpu.h. - The pointer to the thread using the FPU on i386 was renamed from npxthread to fpcurthread to be identical with other architectures. - Make the show pcpu ddb command MI with a MD callout to display MD fields. - The globaldata_register() function was renamed to pcpu_init() and now init's MI fields of a struct pcpu in addition to registering it with the internal array and list. - A pcpu_destroy() function was added to remove a struct pcpu from the internal array and list. Tested on: alpha, i386 Reviewed by: peter, jake
Diffstat (limited to 'sys')
-rw-r--r--sys/alpha/alpha/db_interface.c52
-rw-r--r--sys/alpha/alpha/exception.s6
-rw-r--r--sys/alpha/alpha/genassym.c13
-rw-r--r--sys/alpha/alpha/interrupt.c2
-rw-r--r--sys/alpha/alpha/locore.s12
-rw-r--r--sys/alpha/alpha/machdep.c33
-rw-r--r--sys/alpha/alpha/mp_machdep.c43
-rw-r--r--sys/alpha/alpha/support.s28
-rw-r--r--sys/alpha/alpha/swtch.s6
-rw-r--r--sys/alpha/alpha/trap.c4
-rw-r--r--sys/alpha/include/asm.h2
-rw-r--r--sys/alpha/include/globaldata.h74
-rw-r--r--sys/alpha/include/globals.h51
-rw-r--r--sys/alpha/include/mutex.h2
-rw-r--r--sys/alpha/include/pcb.h1
-rw-r--r--sys/alpha/include/pcpu.h50
-rw-r--r--sys/alpha/include/proc.h3
-rw-r--r--sys/amd64/amd64/bios.c2
-rw-r--r--sys/amd64/amd64/cpu_switch.S10
-rw-r--r--sys/amd64/amd64/db_interface.c47
-rw-r--r--sys/amd64/amd64/fpu.c34
-rw-r--r--sys/amd64/amd64/genassym.c39
-rw-r--r--sys/amd64/amd64/machdep.c29
-rw-r--r--sys/amd64/amd64/mp_machdep.c16
-rw-r--r--sys/amd64/amd64/mptable.c16
-rw-r--r--sys/amd64/amd64/pmap.c1
-rw-r--r--sys/amd64/amd64/support.S30
-rw-r--r--sys/amd64/amd64/support.s30
-rw-r--r--sys/amd64/amd64/swtch.s10
-rw-r--r--sys/amd64/amd64/vm_machdep.c2
-rw-r--r--sys/amd64/include/asmacros.h6
-rw-r--r--sys/amd64/include/cpu.h1
-rw-r--r--sys/amd64/include/mptable.h16
-rw-r--r--sys/amd64/include/pcpu.h138
-rw-r--r--sys/amd64/include/proc.h1
-rw-r--r--sys/amd64/isa/npx.c34
-rw-r--r--sys/i386/i386/bios.c2
-rw-r--r--sys/i386/i386/db_interface.c47
-rw-r--r--sys/i386/i386/genassym.c39
-rw-r--r--sys/i386/i386/machdep.c29
-rw-r--r--sys/i386/i386/mp_machdep.c16
-rw-r--r--sys/i386/i386/mpapic.c1
-rw-r--r--sys/i386/i386/mptable.c16
-rw-r--r--sys/i386/i386/pmap.c1
-rw-r--r--sys/i386/i386/support.s30
-rw-r--r--sys/i386/i386/swtch.s10
-rw-r--r--sys/i386/i386/vm86bios.s2
-rw-r--r--sys/i386/i386/vm_machdep.c2
-rw-r--r--sys/i386/include/asmacros.h6
-rw-r--r--sys/i386/include/cpu.h1
-rw-r--r--sys/i386/include/globaldata.h79
-rw-r--r--sys/i386/include/globals.h141
-rw-r--r--sys/i386/include/mptable.h16
-rw-r--r--sys/i386/include/pcpu.h138
-rw-r--r--sys/i386/include/privatespace.h4
-rw-r--r--sys/i386/include/proc.h1
-rw-r--r--sys/i386/isa/npx.c34
-rw-r--r--sys/ia64/ia64/db_interface.c5
-rw-r--r--sys/ia64/ia64/exception.S2
-rw-r--r--sys/ia64/ia64/exception.s2
-rw-r--r--sys/ia64/ia64/genassym.c10
-rw-r--r--sys/ia64/ia64/machdep.c23
-rw-r--r--sys/ia64/ia64/mp_machdep.c1
-rw-r--r--sys/ia64/ia64/support.S18
-rw-r--r--sys/ia64/ia64/support.s18
-rw-r--r--sys/ia64/ia64/swtch.s6
-rw-r--r--sys/ia64/include/globaldata.h73
-rw-r--r--sys/ia64/include/globals.h51
-rw-r--r--sys/ia64/include/mutex.h2
-rw-r--r--sys/ia64/include/pcpu.h48
-rw-r--r--sys/ia64/include/proc.h3
-rw-r--r--sys/kern/init_main.c1
-rw-r--r--sys/kern/kern_idle.c12
-rw-r--r--sys/kern/kern_ktr.c2
-rw-r--r--sys/kern/subr_pcpu.c90
-rw-r--r--sys/kern/subr_smp.c10
-rw-r--r--sys/pc98/i386/machdep.c17
-rw-r--r--sys/pc98/pc98/machdep.c17
-rw-r--r--sys/powerpc/aim/locore.S12
-rw-r--r--sys/powerpc/aim/machdep.c24
-rw-r--r--sys/powerpc/aim/swtch.S8
-rw-r--r--sys/powerpc/include/cpufunc.h6
-rw-r--r--sys/powerpc/include/globaldata.h72
-rw-r--r--sys/powerpc/include/globals.h50
-rw-r--r--sys/powerpc/include/mutex.h2
-rw-r--r--sys/powerpc/include/pcpu.h47
-rw-r--r--sys/powerpc/include/proc.h2
-rw-r--r--sys/powerpc/powerpc/genassym.c6
-rw-r--r--sys/powerpc/powerpc/locore.S12
-rw-r--r--sys/powerpc/powerpc/locore.s12
-rw-r--r--sys/powerpc/powerpc/machdep.c24
-rw-r--r--sys/powerpc/powerpc/swtch.S8
-rw-r--r--sys/powerpc/powerpc/swtch.s8
-rw-r--r--sys/sparc64/include/asmacros.h4
-rw-r--r--sys/sparc64/include/globaldata.h78
-rw-r--r--sys/sparc64/include/globals.h51
-rw-r--r--sys/sparc64/include/pcpu.h48
-rw-r--r--sys/sparc64/include/proc.h1
-rw-r--r--sys/sparc64/sparc64/db_interface.c5
-rw-r--r--sys/sparc64/sparc64/exception.S4
-rw-r--r--sys/sparc64/sparc64/exception.s4
-rw-r--r--sys/sparc64/sparc64/genassym.c7
-rw-r--r--sys/sparc64/sparc64/intr_machdep.c1
-rw-r--r--sys/sparc64/sparc64/machdep.c25
-rw-r--r--sys/sys/mutex.h2
-rw-r--r--sys/sys/pcpu.h51
-rw-r--r--sys/sys/proc.h2
107 files changed, 850 insertions, 1596 deletions
diff --git a/sys/alpha/alpha/db_interface.c b/sys/alpha/alpha/db_interface.c
index 49463c7..fea763d 100644
--- a/sys/alpha/alpha/db_interface.c
+++ b/sys/alpha/alpha/db_interface.c
@@ -571,52 +571,10 @@ db_branch_taken(ins, pc, regs)
return (newpc);
}
-DB_SHOW_COMMAND(pcpu, db_show_pcpu)
+void
+db_show_mdpcpu(struct pcpu *pc)
{
- struct globaldata *gd;
-#ifdef SMP
- int id;
-
- if (have_addr)
- id = ((addr >> 4) % 16) * 10 + (addr % 16);
- else
- id = PCPU_GET(cpuid);
- gd = globaldata_find(id);
- if (gd == NULL) {
- db_printf("CPU %d not found\n", id);
- return;
- }
-#else
- gd = GLOBALP;
-#endif
- db_printf("cpuid = %d\n", gd->gd_cpuid);
- db_printf("ipis = %lx\n", gd->gd_pending_ipis);
- db_printf("next ASN = %d\n", gd->gd_next_asn);
- db_printf("curthread = ");
- if (gd->gd_curthread != NULL)
- db_printf("%p: pid %d \"%s\"\n", gd->gd_curthread,
- gd->gd_curthread->td_proc->p_pid,
- gd->gd_curthread->td_proc->p_comm);
- else
- db_printf("none\n");
- db_printf("curpcb = %p\n", gd->gd_curpcb);
- db_printf("fpcurthread = ");
- if (gd->gd_fpcurthread != NULL)
- db_printf("%p: pid %d \"%s\"\n", gd->gd_fpcurthread,
- gd->gd_fpcurthread->td_proc->p_pid,
- gd->gd_fpcurthread->td_proc->p_comm);
- else
- db_printf("none\n");
- db_printf("idlethread = ");
- if (gd->gd_idlethread != NULL)
- db_printf("%p: pid %d \"%s\"\n", gd->gd_idlethread,
- gd->gd_idlethread->td_proc->p_pid,
- gd->gd_idlethread->td_proc->p_comm);
- else
- db_printf("none\n");
-
-#ifdef WITNESS
- db_printf("spin locks held:\n");
- witness_list_locks(&gd->gd_spinlocks);
-#endif
+
+ db_printf("ipis = 0x%lx\n", pc->pc_pending_ipis);
+ db_printf("next ASN = %d\n", pc->pc_next_asn);
}
diff --git a/sys/alpha/alpha/exception.s b/sys/alpha/alpha/exception.s
index 31637b4..4e4fc9e 100644
--- a/sys/alpha/alpha/exception.s
+++ b/sys/alpha/alpha/exception.s
@@ -139,7 +139,7 @@
beq t1, exception_return
/* set the hae register if this process has specified a value */
- ldq s0, GD_CURTHREAD(globalp)
+ ldq s0, PC_CURTHREAD(pcpup)
ldq t1, TD_MD_FLAGS(s0)
and t1, MDP_HAEUSED
beq t1, 3f
@@ -255,7 +255,7 @@ LEAF(exception_return, 1) /* XXX should be NESTED */
br pv, Ler1
Ler1: LDGP(pv)
- ldq s0, GD_CURTHREAD(globalp) /* save curthread in s0 */
+ ldq s0, PC_CURTHREAD(pcpup) /* save curthread in s0 */
#ifdef SMP
ldl s1, TD_MD_KERNNEST(s0)
subl s1, 1, s1 /* decrement nesting level */
@@ -275,7 +275,7 @@ Ler1: LDGP(pv)
Lkernelret:
#ifdef SMP
beq s1, Lrestoreregs
- stq globalp, (FRAME_T7*8)(sp) /* fixup globalp */
+ stq pcpup, (FRAME_T7*8)(sp) /* fixup pcpup */
#endif
Lrestoreregs:
diff --git a/sys/alpha/alpha/genassym.c b/sys/alpha/alpha/genassym.c
index 54e1009..8d68d73 100644
--- a/sys/alpha/alpha/genassym.c
+++ b/sys/alpha/alpha/genassym.c
@@ -54,7 +54,6 @@
#include <sys/ktr.h>
#include <machine/frame.h>
#include <machine/chipset.h>
-#include <machine/globaldata.h>
#include <sys/vmmeter.h>
#include <vm/vm.h>
#include <vm/vm_param.h>
@@ -68,12 +67,12 @@
#include <nfsclient/nfs.h>
#include <nfsclient/nfsdiskless.h>
-ASSYM(GD_CURTHREAD, offsetof(struct globaldata, gd_curthread));
-ASSYM(GD_FPCURTHREAD, offsetof(struct globaldata, gd_fpcurthread));
-ASSYM(GD_CURPCB, offsetof(struct globaldata, gd_curpcb));
-ASSYM(GD_SWITCHTIME, offsetof(struct globaldata, gd_switchtime));
-ASSYM(GD_CPUID, offsetof(struct globaldata, gd_cpuid));
-ASSYM(GD_IDLEPCBPHYS, offsetof(struct globaldata, gd_idlepcbphys));
+ASSYM(PC_CURTHREAD, offsetof(struct pcpu, pc_curthread));
+ASSYM(PC_FPCURTHREAD, offsetof(struct pcpu, pc_fpcurthread));
+ASSYM(PC_CURPCB, offsetof(struct pcpu, pc_curpcb));
+ASSYM(PC_SWITCHTIME, offsetof(struct pcpu, pc_switchtime));
+ASSYM(PC_CPUID, offsetof(struct pcpu, pc_cpuid));
+ASSYM(PC_IDLEPCBPHYS, offsetof(struct pcpu, pc_idlepcbphys));
ASSYM(MTX_LOCK, offsetof(struct mtx, mtx_lock));
ASSYM(MTX_RECURSE, offsetof(struct mtx, mtx_recurse));
diff --git a/sys/alpha/alpha/interrupt.c b/sys/alpha/alpha/interrupt.c
index 63e628e..29bb74f 100644
--- a/sys/alpha/alpha/interrupt.c
+++ b/sys/alpha/alpha/interrupt.c
@@ -101,7 +101,7 @@ interrupt(a0, a1, a2, framep)
#ifdef SMP
s = critical_enter();
#endif
- globalp = (struct globaldata *) alpha_pal_rdval();
+ pcpup = (struct pcpu *) alpha_pal_rdval();
td = curthread;
#ifdef SMP
td->td_md.md_kernnest++;
diff --git a/sys/alpha/alpha/locore.s b/sys/alpha/alpha/locore.s
index 8f3106f..e560d84 100644
--- a/sys/alpha/alpha/locore.s
+++ b/sys/alpha/alpha/locore.s
@@ -81,7 +81,7 @@
*/
#define SWITCH_CONTEXT \
/* Make a note of the context we're running on. */ \
- stq a0, GD_CURPCB(globalp); \
+ stq a0, PC_CURPCB(pcpup); \
\
/* Swap in the new context. */ \
call_pal PAL_OSF1_swpctx
@@ -111,10 +111,10 @@
call_pal PAL_OSF1_wrvptptr /* clobbers a0, t0, t8-t11 */
/*
- * Initialise globalp.
+ * Initialise pcpup.
*/
call_pal PAL_OSF1_rdval /* clobbers t0, t8-t11 */
- mov v0, globalp
+ mov v0, pcpup
/*
* Switch to proc0's PCB.
@@ -148,10 +148,10 @@
br pv, 1f
1: LDGP(pv)
- call_pal PAL_rdunique /* initialise globalp */
- mov v0, globalp
+ call_pal PAL_rdunique /* initialise pcpup */
+ mov v0, pcpup
- ldq a0, GD_IDLEPCBPHYS(globalp) /* switch to idle ctx */
+ ldq a0, PC_IDLEPCBPHYS(pcpup) /* switch to idle ctx */
call_pal PAL_OSF1_swpctx
/* Load KGP with current GP. */
diff --git a/sys/alpha/alpha/machdep.c b/sys/alpha/alpha/machdep.c
index fc94dd6..ef763a9 100644
--- a/sys/alpha/alpha/machdep.c
+++ b/sys/alpha/alpha/machdep.c
@@ -905,14 +905,14 @@ alpha_init(pfn, ptb, bim, bip, biv)
(thread0->td_kstack + KSTACK_PAGES * PAGE_SIZE) - 1;
/*
- * Setup the global data for the bootstrap cpu.
+ * Setup the per-CPU data for the bootstrap cpu.
*/
{
/* This is not a 'struct user' */
size_t sz = round_page(KSTACK_PAGES * PAGE_SIZE);
- globalp = (struct globaldata *) pmap_steal_memory(sz);
- globaldata_init(globalp, alpha_pal_whami(), sz);
- alpha_pal_wrval((u_int64_t) globalp);
+ pcpup = (struct pcpu *) pmap_steal_memory(sz);
+ pcpu_init(pcpup, alpha_pal_whami(), sz);
+ alpha_pal_wrval((u_int64_t) pcpup);
PCPU_GET(next_asn) = 1; /* 0 used for proc0 pmap */
#ifdef SMP
thread0->td_md.md_kernnest = 1;
@@ -943,14 +943,8 @@ alpha_init(pfn, ptb, bim, bip, biv)
thread0->td_frame = (struct trapframe *)thread0->td_pcb - 1;
thread0->td_pcb->pcb_hw.apcb_ksp = (u_int64_t)thread0->td_frame;
- /*
- * Get the right value for the boot cpu's idle ptbr.
- */
- globalp->gd_idlepcb.apcb_ptbr = thread0->td_pcb->pcb_hw.apcb_ptbr;
-
/* Setup curthread so that mutexes work */
PCPU_SET(curthread, thread0);
- PCPU_SET(spinlocks, NULL);
LIST_INIT(&thread0->td_contested);
@@ -2149,18 +2143,15 @@ alpha_fpstate_switch(struct thread *td)
}
/*
- * Initialise a struct globaldata.
+ * Initialise a struct pcpu.
*/
void
-globaldata_init(struct globaldata *globaldata, int cpuid, size_t sz)
+cpu_pcpu_init(struct pcpu *pcpu, 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 = thread0->td_pcb->pcb_hw.apcb_ptbr;
- globaldata->gd_cpuid = cpuid;
- globaldata->gd_next_asn = 0;
- globaldata->gd_current_asngen = 1;
- globaldata_register(globaldata);
+
+ pcpu->pc_idlepcbphys = vtophys((vm_offset_t) &pcpu->pc_idlepcb);
+ pcpu->pc_idlepcb.apcb_ksp = (u_int64_t)
+ ((caddr_t) pcpu + sz - sizeof(struct trapframe));
+ pcpu->pc_idlepcb.apcb_ptbr = thread0->td_pcb->pcb_hw.apcb_ptbr;
+ pcpu->pc_current_asngen = 1;
}
diff --git a/sys/alpha/alpha/mp_machdep.c b/sys/alpha/alpha/mp_machdep.c
index d1324e7..40257c1 100644
--- a/sys/alpha/alpha/mp_machdep.c
+++ b/sys/alpha/alpha/mp_machdep.c
@@ -46,7 +46,6 @@
#include <sys/dkstat.h>
#include <machine/atomic.h>
-#include <machine/globaldata.h>
#include <machine/pmap.h>
#include <machine/rpb.h>
#include <machine/clock.h>
@@ -132,9 +131,9 @@ smp_init_secondary(void)
/*spin*/ ;
/*
- * Record the globaldata pointer in the per-cpu system value.
+ * Record the pcpu pointer in the per-cpu system value.
*/
- alpha_pal_wrval((u_int64_t) globalp);
+ alpha_pal_wrval((u_int64_t) pcpup);
/*
* Point interrupt/exception vectors to our own.
@@ -157,9 +156,10 @@ smp_init_secondary(void)
/*
* Set curproc to our per-cpu idleproc so that mutexes have
* something unique to lock with.
+ *
+ * XXX: shouldn't this already be set for us?
*/
PCPU_SET(curthread, PCPU_GET(idlethread));
- PCPU_SET(spinlocks, NULL);
/*
* Set flags in our per-CPU slot in the HWRPB.
@@ -181,7 +181,7 @@ smp_init_secondary(void)
* stack pointer for sanity.
*/
curthread->td_frame =
- (struct trapframe *)globalp->gd_idlepcb.apcb_ksp;
+ (struct trapframe *)PCPU_PTR(idlepcb)->apcb_ksp;
mtx_lock_spin(&ap_boot_mtx);
@@ -220,7 +220,7 @@ smp_start_secondary(int cpuid)
struct pcs *cpu = LOCATE_PCS(hwrpb, cpuid);
struct pcs *bootcpu = LOCATE_PCS(hwrpb, boot_cpu_id);
struct alpha_pcb *pcb = (struct alpha_pcb *) cpu->pcs_hwpcb;
- struct globaldata *globaldata;
+ struct pcpu *pcpu;
int i;
size_t sz;
@@ -233,21 +233,21 @@ smp_start_secondary(int cpuid)
printf("smp_start_secondary: starting cpu %d\n", cpuid);
sz = round_page((UAREA_PAGES + KSTACK_PAGES) * PAGE_SIZE);
- globaldata = malloc(sz, M_TEMP, M_NOWAIT);
- if (!globaldata) {
+ pcpu = malloc(sz, M_TEMP, M_NOWAIT);
+ if (!pcpu) {
printf("smp_start_secondary: can't allocate memory\n");
return 0;
}
- globaldata_init(globaldata, cpuid, sz);
+ pcpu_init(pcpu, cpuid, sz);
/*
* Copy the idle pcb and setup the address to start executing.
- * Use the pcb unique value to point the secondary at its globaldata
+ * Use the pcb unique value to point the secondary at its pcpu
* structure.
*/
- *pcb = globaldata->gd_idlepcb;
- pcb->apcb_unique = (u_int64_t)globaldata;
+ *pcb = pcpu->pc_idlepcb;
+ pcb->apcb_unique = (u_int64_t)pcpu;
hwrpb->rpb_restart = (u_int64_t) smp_init_secondary_glue;
hwrpb->rpb_restart_val = (u_int64_t) smp_init_secondary_glue;
hwrpb->rpb_checksum = hwrpb_checksum();
@@ -271,10 +271,11 @@ smp_start_secondary(int cpuid)
*/
if (!smp_send_secondary_command("START\r\n", cpuid)) {
printf("smp_start_secondary: can't send START command\n");
- free(globaldata, M_TEMP);
+ pcpu_destroy(pcpu);
+ free(pcpu, M_TEMP);
return 0;
}
-
+
/*
* Wait for the secondary to set the BIP flag in its structure.
*/
@@ -285,9 +286,11 @@ smp_start_secondary(int cpuid)
}
if (!(cpu->pcs_flags & PCS_BIP)) {
printf("smp_start_secondary: secondary did not respond\n");
- free(globaldata, M_TEMP);
+ pcpu_destroy(pcpu);
+ free(pcpu, M_TEMP);
+ return 0;
}
-
+
/*
* It worked (I think).
*/
@@ -410,7 +413,7 @@ cpu_mp_announce(void)
void
ipi_selected(u_int32_t cpus, u_int64_t ipi)
{
- struct globaldata *globaldata;
+ struct pcpu *pcpu;
CTR2(KTR_SMP, "ipi_selected: cpus: %x ipi: %lx", cpus, ipi);
alpha_mb();
@@ -418,9 +421,9 @@ ipi_selected(u_int32_t cpus, u_int64_t ipi)
int cpuid = ffs(cpus) - 1;
cpus &= ~(1 << cpuid);
- globaldata = globaldata_find(cpuid);
- if (globaldata) {
- atomic_set_64(&globaldata->gd_pending_ipis, ipi);
+ pcpu = pcpu_find(cpuid);
+ if (pcpu) {
+ atomic_set_64(&pcpu->pc_pending_ipis, ipi);
alpha_mb();
CTR1(KTR_SMP, "calling alpha_pal_wripir(%d)", cpuid);
alpha_pal_wripir(cpuid);
diff --git a/sys/alpha/alpha/support.s b/sys/alpha/alpha/support.s
index 61c692e..497412d 100644
--- a/sys/alpha/alpha/support.s
+++ b/sys/alpha/alpha/support.s
@@ -72,7 +72,7 @@
beq t1, fusufault
lda t0, fusufault /* trap faults */
- ldq t2, GD_CURTHREAD(globalp)
+ ldq t2, PC_CURTHREAD(pcpup)
ldq t2, TD_PCB(t2)
stq t0, PCB_ONFAULT(t2)
@@ -92,7 +92,7 @@
beq t1, fusufault
lda t0, fusufault /* trap faults */
- ldq t2, GD_CURTHREAD(globalp)
+ ldq t2, PC_CURTHREAD(pcpup)
ldq t2, TD_PCB(t2)
stq t0, PCB_ONFAULT(t2)
@@ -117,7 +117,7 @@
beq t1, fusufault
lda t0, fusufault /* trap faults */
- ldq t2, GD_CURTHREAD(globalp)
+ ldq t2, PC_CURTHREAD(pcpup)
ldq t2, TD_PCB(t2)
stq t0, PCB_ONFAULT(t2)
@@ -136,7 +136,7 @@
beq t1, fusufault
lda t0, fusufault /* trap faults */
- ldq t2, GD_CURTHREAD(globalp)
+ ldq t2, PC_CURTHREAD(pcpup)
ldq t2, TD_PCB(t2)
stq t0, PCB_ONFAULT(t2)
@@ -154,7 +154,7 @@
END(suibyte)
LEAF(fusufault, 0)
- ldq t0, GD_CURTHREAD(globalp)
+ ldq t0, PC_CURTHREAD(pcpup)
ldq t0, TD_PCB(t0)
stq zero, PCB_ONFAULT(t0)
ldiq v0, -1
@@ -222,13 +222,13 @@ NESTED(copyinstr, 4, 16, ra, 0, 0)
beq t1, copyerr /* if it's not, error out. */
lda v0, copyerr /* set up fault handler. */
.set noat
- ldq at_reg, GD_CURTHREAD(globalp)
+ ldq at_reg, PC_CURTHREAD(pcpup)
ldq at_reg, TD_PCB(at_reg)
stq v0, PCB_ONFAULT(at_reg)
.set at
CALL(copystr) /* do the copy. */
.set noat
- ldq at_reg, GD_CURTHREAD(globalp) /* kill the fault handler. */
+ ldq at_reg, PC_CURTHREAD(pcpup) /* kill the fault handler. */
ldq at_reg, TD_PCB(at_reg)
stq zero, PCB_ONFAULT(at_reg)
.set at
@@ -246,13 +246,13 @@ NESTED(copyoutstr, 4, 16, ra, 0, 0)
beq t1, copyerr /* if it's not, error out. */
lda v0, copyerr /* set up fault handler. */
.set noat
- ldq at_reg, GD_CURTHREAD(globalp)
+ ldq at_reg, PC_CURTHREAD(pcpup)
ldq at_reg, TD_PCB(at_reg)
stq v0, PCB_ONFAULT(at_reg)
.set at
CALL(copystr) /* do the copy. */
.set noat
- ldq at_reg, GD_CURTHREAD(globalp) /* kill the fault handler. */
+ ldq at_reg, PC_CURTHREAD(pcpup) /* kill the fault handler. */
ldq at_reg, TD_PCB(at_reg)
stq zero, PCB_ONFAULT(at_reg)
.set at
@@ -514,13 +514,13 @@ NESTED(copyin, 3, 16, ra, 0, 0)
beq t1, copyerr /* if it's not, error out. */
lda v0, copyerr /* set up fault handler. */
.set noat
- ldq at_reg, GD_CURTHREAD(globalp)
+ ldq at_reg, PC_CURTHREAD(pcpup)
ldq at_reg, TD_PCB(at_reg)
stq v0, PCB_ONFAULT(at_reg)
.set at
CALL(bcopy) /* do the copy. */
.set noat
- ldq at_reg, GD_CURTHREAD(globalp) /* kill the fault handler. */
+ ldq at_reg, PC_CURTHREAD(pcpup) /* kill the fault handler. */
ldq at_reg, TD_PCB(at_reg)
stq zero, PCB_ONFAULT(at_reg)
.set at
@@ -539,13 +539,13 @@ NESTED(copyout, 3, 16, ra, 0, 0)
beq t1, copyerr /* if it's not, error out. */
lda v0, copyerr /* set up fault handler. */
.set noat
- ldq at_reg, GD_CURTHREAD(globalp)
+ ldq at_reg, PC_CURTHREAD(pcpup)
ldq at_reg, TD_PCB(at_reg)
stq v0, PCB_ONFAULT(at_reg)
.set at
CALL(bcopy) /* do the copy. */
.set noat
- ldq at_reg, GD_CURTHREAD(globalp) /* kill the fault handler. */
+ ldq at_reg, PC_CURTHREAD(pcpup) /* kill the fault handler. */
ldq at_reg, TD_PCB(at_reg)
stq zero, PCB_ONFAULT(at_reg)
.set at
@@ -556,7 +556,7 @@ NESTED(copyout, 3, 16, ra, 0, 0)
END(copyout)
LEAF(copyerr, 0)
- ldq t0, GD_CURTHREAD(globalp)
+ ldq t0, PC_CURTHREAD(pcpup)
ldq t0, TD_PCB(t0)
stq zero, PCB_ONFAULT(t0) /* reset fault handler. */
ldq ra, (16-8)(sp) /* restore ra. */
diff --git a/sys/alpha/alpha/swtch.s b/sys/alpha/alpha/swtch.s
index 79454c5..34f3453 100644
--- a/sys/alpha/alpha/swtch.s
+++ b/sys/alpha/alpha/swtch.s
@@ -41,7 +41,7 @@
*/
#define SWITCH_CONTEXT \
/* Make a note of the context we're running on. */ \
- stq a0, GD_CURPCB(globalp); \
+ stq a0, PC_CURPCB(pcpup); \
\
/* Swap in the new context. */ \
call_pal PAL_OSF1_swpctx
@@ -103,7 +103,7 @@ LEAF(cpu_throw, 0)
LEAF(cpu_switch, 1)
LDGP(pv)
/* do an inline savectx(), to save old context */
- ldq a0, GD_CURTHREAD(globalp)
+ ldq a0, PC_CURTHREAD(pcpup)
ldq a1, TD_PCB(a0)
/* NOTE: ksp is stored by the swpctx */
stq s0, PCB_CONTEXT+(0 * 8)(a1) /* store s0 - s6 */
@@ -188,7 +188,7 @@ Lcs7:
* because we might have re-entered cpu_switch() from idle(),
* in which case curthread would be NULL.
*/
- stq s2, GD_CURTHREAD(globalp) /* curthread = p */
+ stq s2, PC_CURTHREAD(pcpup) /* curthread = p */
/*
* Now running on the new u struct.
diff --git a/sys/alpha/alpha/trap.c b/sys/alpha/alpha/trap.c
index 459146d..4c7694d 100644
--- a/sys/alpha/alpha/trap.c
+++ b/sys/alpha/alpha/trap.c
@@ -272,7 +272,7 @@ trap(a0, a1, a2, entry, framep)
#ifdef SMP
s = critical_enter();
#endif
- globalp = (struct globaldata *) alpha_pal_rdval();
+ pcpup = (struct pcpu *) alpha_pal_rdval();
td = curthread;
#ifdef SMP
td->td_md.md_kernnest++;
@@ -674,7 +674,7 @@ syscall(code, framep)
#ifdef SMP
s = critical_enter();
#endif
- globalp = (struct globaldata *) alpha_pal_rdval();
+ pcpup = (struct pcpu *) alpha_pal_rdval();
td = curthread;
#ifdef SMP
td->td_md.md_kernnest++;
diff --git a/sys/alpha/include/asm.h b/sys/alpha/include/asm.h
index 4a9963c..782505c 100644
--- a/sys/alpha/include/asm.h
+++ b/sys/alpha/include/asm.h
@@ -91,7 +91,7 @@
/* In the kernel, we use t7 to point at the per-cpu globals. */
#ifdef _KERNEL
-#define globalp $8
+#define pcpup $8
#endif
/* Floating point registers (XXXX VERIFY THIS) */
diff --git a/sys/alpha/include/globaldata.h b/sys/alpha/include/globaldata.h
deleted file mode 100644
index d0ba706..0000000
--- a/sys/alpha/include/globaldata.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*-
- * Copyright (c) 1999 Luoqi Chen <luoqi@freebsd.org>
- * Copyright (c) Peter Wemm <peter@netplex.com.au>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef _MACHINE_GLOBALDATA_H_
-#define _MACHINE_GLOBALDATA_H_
-
-#ifdef _KERNEL
-
-#include <sys/queue.h>
-
-/*
- * This structure maps out the global data that needs to be kept on a
- * per-cpu basis. genassym uses this to generate offsets for the assembler
- * code, which also provides external symbols so that C can get at them as
- * though they were really globals. This structure is pointed to by
- * the per-cpu system value (see alpha_pal_rdval() and alpha_pal_wrval()).
- * Inside the kernel, the globally reserved register t7 is used to
- * point at the globaldata structure.
- */
-struct globaldata {
- struct alpha_pcb gd_idlepcb; /* pcb for idling */
- struct thread *gd_curthread; /* current thread */
- struct thread *gd_idlethread; /* idle thread */
- struct thread *gd_fpcurthread; /* fp state owner */
- struct pcb *gd_curpcb; /* current pcb */
- struct timeval gd_switchtime;
- int gd_switchticks;
- u_int gd_cpuid; /* this cpu number */
- u_int gd_other_cpus; /* all other cpus */
- u_int64_t gd_idlepcbphys; /* pa of gd_idlepcb */
- u_int64_t gd_pending_ipis; /* pending IPI events */
- u_int32_t gd_next_asn; /* next ASN to allocate */
- u_int32_t gd_current_asngen; /* ASN rollover check */
-
- SLIST_ENTRY(globaldata) gd_allcpu;
- struct lock_list_entry *gd_spinlocks;
-#ifdef KTR_PERCPU
- int gd_ktr_idx; /* Index into trace table */
- char *gd_ktr_buf;
- char gd_ktr_buf_data[0];
-#endif
-};
-
-void globaldata_init(struct globaldata *pcpu, int cpuid, size_t sz);
-
-#endif /* _KERNEL */
-
-#endif /* !_MACHINE_GLOBALDATA_H_ */
diff --git a/sys/alpha/include/globals.h b/sys/alpha/include/globals.h
deleted file mode 100644
index a6a87f2..0000000
--- a/sys/alpha/include/globals.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*-
- * Copyright (c) 1999 Luoqi Chen <luoqi@freebsd.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef _MACHINE_GLOBALS_H_
-#define _MACHINE_GLOBALS_H_
-
-#ifdef _KERNEL
-#include <machine/globaldata.h>
-
-register struct globaldata *globalp __asm__("$8");
-
-#define GLOBALP globalp
-
-#define PCPU_GET(member) (GLOBALP->gd_ ## member)
-#define PCPU_PTR(member) (&GLOBALP->gd_ ## member)
-#define PCPU_SET(member,value) (GLOBALP->gd_ ## member = (value))
-
-#define curthread PCPU_GET(curthread)
-#define CURPROC (curthread->td_proc)
-#define curproc (curthread->td_proc)
-#define curksegrp (curthread->td_ksegrp)
-#define curkse (curthread->td_kse)
-
-#endif /* _KERNEL */
-
-#endif /* !_MACHINE_GLOBALS_H_ */
diff --git a/sys/alpha/include/mutex.h b/sys/alpha/include/mutex.h
index 9192bb2..970049b 100644
--- a/sys/alpha/include/mutex.h
+++ b/sys/alpha/include/mutex.h
@@ -58,7 +58,7 @@ extern struct mtx clock_lock;
1: ldq_l a0, lck+MTX_LOCK; \
cmpeq a0, MTX_UNOWNED, a1; \
beq a1, 1b; \
- ldq a0, PC_CURTHREAD(globalp); \
+ ldq a0, PC_CURTHREAD(pcpup); \
stq_c a0, lck+MTX_LOCK; \
beq a0, 1b; \
mb; \
diff --git a/sys/alpha/include/pcb.h b/sys/alpha/include/pcb.h
index 18c4c13..cfbdfdf 100644
--- a/sys/alpha/include/pcb.h
+++ b/sys/alpha/include/pcb.h
@@ -33,7 +33,6 @@
#include <machine/frame.h>
#include <machine/reg.h>
-#include <machine/globaldata.h>
#include <machine/alpha_cpu.h>
/*
diff --git a/sys/alpha/include/pcpu.h b/sys/alpha/include/pcpu.h
index d0ba706..807f259 100644
--- a/sys/alpha/include/pcpu.h
+++ b/sys/alpha/include/pcpu.h
@@ -27,48 +27,26 @@
* $FreeBSD$
*/
-#ifndef _MACHINE_GLOBALDATA_H_
-#define _MACHINE_GLOBALDATA_H_
+#ifndef _MACHINE_PCPU_H_
+#define _MACHINE_PCPU_H_
#ifdef _KERNEL
-#include <sys/queue.h>
+#define PCPU_MD_FIELDS \
+ struct alpha_pcb pc_idlepcb; /* pcb for idling */ \
+ u_int64_t pc_idlepcbphys; /* pa of pc_idlepcb */ \
+ u_int64_t pc_pending_ipis; /* pending IPI's */ \
+ u_int32_t pc_next_asn; /* next ASN to alloc */ \
+ u_int32_t pc_current_asngen /* ASN rollover check */
-/*
- * This structure maps out the global data that needs to be kept on a
- * per-cpu basis. genassym uses this to generate offsets for the assembler
- * code, which also provides external symbols so that C can get at them as
- * though they were really globals. This structure is pointed to by
- * the per-cpu system value (see alpha_pal_rdval() and alpha_pal_wrval()).
- * Inside the kernel, the globally reserved register t7 is used to
- * point at the globaldata structure.
- */
-struct globaldata {
- struct alpha_pcb gd_idlepcb; /* pcb for idling */
- struct thread *gd_curthread; /* current thread */
- struct thread *gd_idlethread; /* idle thread */
- struct thread *gd_fpcurthread; /* fp state owner */
- struct pcb *gd_curpcb; /* current pcb */
- struct timeval gd_switchtime;
- int gd_switchticks;
- u_int gd_cpuid; /* this cpu number */
- u_int gd_other_cpus; /* all other cpus */
- u_int64_t gd_idlepcbphys; /* pa of gd_idlepcb */
- u_int64_t gd_pending_ipis; /* pending IPI events */
- u_int32_t gd_next_asn; /* next ASN to allocate */
- u_int32_t gd_current_asngen; /* ASN rollover check */
+struct pcpu;
- SLIST_ENTRY(globaldata) gd_allcpu;
- struct lock_list_entry *gd_spinlocks;
-#ifdef KTR_PERCPU
- int gd_ktr_idx; /* Index into trace table */
- char *gd_ktr_buf;
- char gd_ktr_buf_data[0];
-#endif
-};
+register struct pcpu *pcpup __asm__("$8");
-void globaldata_init(struct globaldata *pcpu, int cpuid, size_t sz);
+#define PCPU_GET(member) (pcpup->pc_ ## member)
+#define PCPU_PTR(member) (&pcpup->pc_ ## member)
+#define PCPU_SET(member,value) (pcpup->pc_ ## member = (value))
#endif /* _KERNEL */
-#endif /* !_MACHINE_GLOBALDATA_H_ */
+#endif /* !_MACHINE_PCPU_H_ */
diff --git a/sys/alpha/include/proc.h b/sys/alpha/include/proc.h
index 16cf1d5..eb1772a 100644
--- a/sys/alpha/include/proc.h
+++ b/sys/alpha/include/proc.h
@@ -31,9 +31,6 @@
#ifndef _MACHINE_PROC_H_
#define _MACHINE_PROC_H_
-#include <machine/globaldata.h>
-#include <machine/globals.h>
-
/*
* Machine-dependent part of the proc struct for the Alpha.
*/
diff --git a/sys/amd64/amd64/bios.c b/sys/amd64/amd64/bios.c
index cc887e7..6eb90b2 100644
--- a/sys/amd64/amd64/bios.c
+++ b/sys/amd64/amd64/bios.c
@@ -36,9 +36,9 @@
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <sys/bus.h>
+#include <sys/pcpu.h>
#include <vm/vm.h>
#include <vm/pmap.h>
-#include <machine/globals.h>
#include <machine/md_var.h>
#include <machine/segments.h>
#include <machine/stdarg.h>
diff --git a/sys/amd64/amd64/cpu_switch.S b/sys/amd64/amd64/cpu_switch.S
index 14e4495..ae967c4 100644
--- a/sys/amd64/amd64/cpu_switch.S
+++ b/sys/amd64/amd64/cpu_switch.S
@@ -123,7 +123,7 @@ ENTRY(cpu_switch)
#ifdef DEV_NPX
/* have we used fp, and need a save? */
- cmpl %ecx,PCPU(NPXTHREAD)
+ cmpl %ecx,PCPU(FPCURTHREAD)
jne 1f
addl $PCB_SAVEFPU,%edx /* h/w bugs make saving complicated */
pushl %edx
@@ -337,20 +337,20 @@ ENTRY(savectx)
#ifdef DEV_NPX
/*
- * If npxthread == NULL, then the npx h/w state is irrelevant and the
+ * If fpcurthread == NULL, then the npx h/w state is irrelevant and the
* state had better already be in the pcb. This is true for forks
* but not for dumps (the old book-keeping with FP flags in the pcb
* always lost for dumps because the dump pcb has 0 flags).
*
- * If npxthread != NULL, then we have to save the npx h/w state to
- * npxthread's pcb and copy it to the requested pcb, or save to the
+ * If fpcurthread != NULL, then we have to save the npx h/w state to
+ * fpcurthread's pcb and copy it to the requested pcb, or save to the
* requested pcb and reload. Copying is easier because we would
* have to handle h/w bugs for reloading. We used to lose the
* parent's npx state for forks by forgetting to reload.
*/
pushfl
cli
- movl PCPU(NPXTHREAD),%eax
+ movl PCPU(FPCURTHREAD),%eax
testl %eax,%eax
je 1f
diff --git a/sys/amd64/amd64/db_interface.c b/sys/amd64/amd64/db_interface.c
index 7e78088..9708cad 100644
--- a/sys/amd64/amd64/db_interface.c
+++ b/sys/amd64/amd64/db_interface.c
@@ -332,48 +332,9 @@ Debugger(msg)
}
}
-DB_SHOW_COMMAND(pcpu, db_show_pcpu)
+void
+db_show_mdpcpu(struct pcpu *pc)
{
- struct globaldata *gd;
-#ifdef SMP
- int id;
-
- if (have_addr)
- id = ((addr >> 4) % 16) * 10 + (addr % 16);
- else
- id = PCPU_GET(cpuid);
- gd = globaldata_find(id);
- if (gd == NULL) {
- db_printf("CPU %d not found\n", id);
- return;
- }
-#else
- gd = GLOBALDATA;
-#endif
- db_printf("cpuid = %d\n", gd->gd_cpuid);
- db_printf("curthread = ");
- if (gd->gd_curthread != NULL)
- db_printf("%p: pid %d \"%s\"\n", gd->gd_curthread,
- gd->gd_curthread->td_proc->p_pid, gd->gd_curthread->td_proc->p_comm);
- else
- db_printf("none\n");
- db_printf("curpcb = %p\n", gd->gd_curpcb);
- db_printf("npxthread = ");
- if (gd->gd_npxthread != NULL)
- db_printf("%p: pid %d \"%s\"\n", gd->gd_npxthread,
- gd->gd_npxthread->td_proc->p_pid, gd->gd_npxthread->td_proc->p_comm);
- else
- db_printf("none\n");
- db_printf("idlethread = ");
- if (gd->gd_idlethread != NULL)
- db_printf("%p: pid %d \"%s\"\n", gd->gd_idlethread,
- gd->gd_idlethread->td_proc->p_pid,
- gd->gd_idlethread->td_proc->p_comm);
- else
- db_printf("none\n");
-
-#ifdef WITNESS
- db_printf("spin locks held:\n");
- witness_list_locks(&gd->gd_spinlocks);
-#endif
+
+ db_printf("currentldt = 0x%x\n", pc->pc_currentldt);
}
diff --git a/sys/amd64/amd64/fpu.c b/sys/amd64/amd64/fpu.c
index 1238d67..ff8c4cf 100644
--- a/sys/amd64/amd64/fpu.c
+++ b/sys/amd64/amd64/fpu.c
@@ -237,7 +237,7 @@ npx_intr(dummy)
#endif
/*
- * npxthread is normally non-null here. In that case, schedule an
+ * fpcurthread is normally non-null here. In that case, schedule an
* AST to finish the exception handling in the correct context
* (this interrupt may occur after the thread has entered the
* kernel via a syscall or an interrupt). Otherwise, the npx
@@ -248,7 +248,7 @@ npx_intr(dummy)
* that caused it and it will repeat. We will eventually (usually
* soon) win the race to handle the interrupt properly.
*/
- td = PCPU_GET(npxthread);
+ td = PCPU_GET(fpcurthread);
if (td != NULL) {
td->td_pcb->pcb_flags |= PCB_NPXTRAP;
mtx_lock_spin(&sched_lock);
@@ -513,7 +513,7 @@ npxinit(control)
/*
* fninit has the same h/w bugs as fnsave. Use the detoxified
* fnsave to throw away any junk in the fpu. npxsave() initializes
- * the fpu and sets npxthread = NULL as important side effects.
+ * the fpu and sets fpcurthread = NULL as important side effects.
*/
savecrit = critical_enter();
npxsave(&dummy);
@@ -540,7 +540,7 @@ npxexit(td)
critical_t savecrit;
savecrit = critical_enter();
- if (td == PCPU_GET(npxthread))
+ if (td == PCPU_GET(fpcurthread))
npxsave(&PCPU_GET(curpcb)->pcb_save);
critical_exit(savecrit);
#ifdef NPX_DEBUG
@@ -758,8 +758,8 @@ npxtrap()
u_long *exstat;
if (!npx_exists) {
- printf("npxtrap: npxthread = %p, curthread = %p, npx_exists = %d\n",
- PCPU_GET(npxthread), curthread, npx_exists);
+ printf("npxtrap: fpcurthread = %p, curthread = %p, npx_exists = %d\n",
+ PCPU_GET(fpcurthread), curthread, npx_exists);
panic("npxtrap from nowhere");
}
savecrit = critical_enter();
@@ -769,7 +769,7 @@ npxtrap()
* state to memory. Fetch the relevant parts of the state from
* wherever they are.
*/
- if (PCPU_GET(npxthread) != curthread) {
+ if (PCPU_GET(fpcurthread) != curthread) {
control = GET_FPU_CW(curthread);
status = GET_FPU_SW(curthread);
} else {
@@ -779,7 +779,7 @@ npxtrap()
exstat = GET_FPU_EXSW_PTR(curthread->td_pcb);
*exstat = status;
- if (PCPU_GET(npxthread) != curthread)
+ if (PCPU_GET(fpcurthread) != curthread)
GET_FPU_SW(curthread) &= ~0x80bf;
else
fnclex();
@@ -790,7 +790,7 @@ npxtrap()
/*
* Implement device not available (DNA) exception
*
- * It would be better to switch FP context here (if curthread != npxthread)
+ * It would be better to switch FP context here (if curthread != fpcurthread)
* and not necessarily for every context switch, but it is too hard to
* access foreign pcb's.
*/
@@ -802,9 +802,9 @@ npxdna()
if (!npx_exists)
return (0);
- if (PCPU_GET(npxthread) != NULL) {
- printf("npxdna: npxthread = %p, curthread = %p\n",
- PCPU_GET(npxthread), curthread);
+ if (PCPU_GET(fpcurthread) != NULL) {
+ printf("npxdna: fpcurthread = %p, curthread = %p\n",
+ PCPU_GET(fpcurthread), curthread);
panic("npxdna");
}
s = critical_enter();
@@ -812,7 +812,7 @@ npxdna()
/*
* Record new context early in case frstor causes an IRQ13.
*/
- PCPU_SET(npxthread, curthread);
+ PCPU_SET(fpcurthread, curthread);
exstat = GET_FPU_EXSW_PTR(PCPU_GET(curpcb));
*exstat = 0;
@@ -844,13 +844,13 @@ npxdna()
* after the process has entered the kernel. It may even be delivered after
* the fnsave here completes. A spurious IRQ13 for the fnsave is handled in
* the same way as a very-late-arriving non-spurious IRQ13 from user mode:
- * it is normally ignored at first because we set npxthread to NULL; it is
+ * it is normally ignored at first because we set fpcurthread to NULL; it is
* normally retriggered in npxdna() after return to user mode.
*
* npxsave() must be called with interrupts disabled, so that it clears
- * npxthread atomically with saving the state. We require callers to do the
+ * fpcurthread atomically with saving the state. We require callers to do the
* disabling, since most callers need to disable interrupts anyway to call
- * npxsave() atomically with checking npxthread.
+ * npxsave() atomically with checking fpcurthread.
*
* A previous version of npxsave() went to great lengths to excecute fnsave
* with interrupts enabled in case executing it froze the CPU. This case
@@ -866,7 +866,7 @@ npxsave(addr)
fpusave(addr);
start_emulating();
- PCPU_SET(npxthread, NULL);
+ PCPU_SET(fpcurthread, NULL);
}
static void
diff --git a/sys/amd64/amd64/genassym.c b/sys/amd64/amd64/genassym.c
index 9f41665..59f3147 100644
--- a/sys/amd64/amd64/genassym.c
+++ b/sys/amd64/amd64/genassym.c
@@ -51,10 +51,6 @@
#include <sys/socket.h>
#include <sys/resourcevar.h>
#include <sys/user.h>
-/* XXX */
-#ifdef KTR_PERCPU
-#include <sys/ktr.h>
-#endif
#include <machine/bootinfo.h>
#include <machine/tss.h>
#include <sys/vmmeter.h>
@@ -75,7 +71,6 @@
#endif
#include <machine/cpu.h>
#include <machine/sigframe.h>
-#include <machine/globaldata.h>
#include <machine/vm86.h>
#include <machine/proc.h>
@@ -177,27 +172,19 @@ ASSYM(BI_SIZE, offsetof(struct bootinfo, bi_size));
ASSYM(BI_SYMTAB, offsetof(struct bootinfo, bi_symtab));
ASSYM(BI_ESYMTAB, offsetof(struct bootinfo, bi_esymtab));
ASSYM(BI_KERNEND, offsetof(struct bootinfo, bi_kernend));
-ASSYM(GD_SIZEOF, sizeof(struct globaldata));
-ASSYM(GD_PRVSPACE, offsetof(struct globaldata, gd_prvspace));
-ASSYM(GD_CURTHREAD, offsetof(struct globaldata, gd_curthread));
-ASSYM(GD_NPXTHREAD, offsetof(struct globaldata, gd_npxthread));
-ASSYM(GD_IDLETHREAD, offsetof(struct globaldata, gd_idlethread));
-ASSYM(GD_CURPCB, offsetof(struct globaldata, gd_curpcb));
-ASSYM(GD_COMMON_TSS, offsetof(struct globaldata, gd_common_tss));
-ASSYM(GD_SWITCHTIME, offsetof(struct globaldata, gd_switchtime));
-ASSYM(GD_SWITCHTICKS, offsetof(struct globaldata, gd_switchticks));
-ASSYM(GD_COMMON_TSSD, offsetof(struct globaldata, gd_common_tssd));
-ASSYM(GD_TSS_GDT, offsetof(struct globaldata, gd_tss_gdt));
-ASSYM(GD_CURRENTLDT, offsetof(struct globaldata, gd_currentldt));
-
-/* XXX */
-#ifdef KTR_PERCPU
-ASSYM(GD_KTR_IDX, offsetof(struct globaldata, gd_ktr_idx));
-ASSYM(GD_KTR_BUF, offsetof(struct globaldata, gd_ktr_buf));
-ASSYM(GD_KTR_BUF_DATA, offsetof(struct globaldata, gd_ktr_buf_data));
-#endif
-
-ASSYM(GD_CPUID, offsetof(struct globaldata, gd_cpuid));
+ASSYM(PC_SIZEOF, sizeof(struct pcpu));
+ASSYM(PC_PRVSPACE, offsetof(struct pcpu, pc_prvspace));
+ASSYM(PC_CURTHREAD, offsetof(struct pcpu, pc_curthread));
+ASSYM(PC_FPCURTHREAD, offsetof(struct pcpu, pc_fpcurthread));
+ASSYM(PC_IDLETHREAD, offsetof(struct pcpu, pc_idlethread));
+ASSYM(PC_CURPCB, offsetof(struct pcpu, pc_curpcb));
+ASSYM(PC_COMMON_TSS, offsetof(struct pcpu, pc_common_tss));
+ASSYM(PC_SWITCHTIME, offsetof(struct pcpu, pc_switchtime));
+ASSYM(PC_SWITCHTICKS, offsetof(struct pcpu, pc_switchticks));
+ASSYM(PC_COMMON_TSSD, offsetof(struct pcpu, pc_common_tssd));
+ASSYM(PC_TSS_GDT, offsetof(struct pcpu, pc_tss_gdt));
+ASSYM(PC_CURRENTLDT, offsetof(struct pcpu, pc_currentldt));
+ASSYM(PC_CPUID, offsetof(struct pcpu, pc_cpuid));
#ifdef SMP
ASSYM(LA_VER, offsetof(struct LAPIC, version));
diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index bdc0980..c2ef5dc 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -104,7 +104,6 @@
#include <machine/pc/bios.h>
#include <machine/pcb_ext.h> /* pcb.h included via sys/user.h */
#include <machine/proc.h>
-#include <machine/globals.h>
#ifdef PERFMON
#include <machine/perfmon.h>
#endif
@@ -207,7 +206,7 @@ struct kva_md_info kmi;
static struct trapframe proc0_tf;
#ifndef SMP
-static struct globaldata __globaldata;
+static struct pcpu __pcpu;
#endif
struct mtx sched_lock;
@@ -262,7 +261,6 @@ cpu_startup(dummy)
bufinit();
vm_pager_bufferinit();
- globaldata_register(GLOBALDATA);
#ifndef SMP
/* For SMP, we delay the cpu_setregs() until after SMP startup. */
cpu_setregs();
@@ -1670,6 +1668,7 @@ init386(first)
/* table descriptors - used to load tables by microp */
struct region_descriptor r_gdt, r_idt;
#endif
+ struct pcpu *pc;
proc_linkup(&proc0);
proc0.p_uarea = proc0uarea;
@@ -1706,20 +1705,16 @@ init386(first)
gdt_segs[GCODE_SEL].ssd_limit = atop(0 - 1);
gdt_segs[GDATA_SEL].ssd_limit = atop(0 - 1);
#ifdef SMP
+ pc = &SMP_prvspace[0];
gdt_segs[GPRIV_SEL].ssd_limit =
atop(sizeof(struct privatespace) - 1);
- gdt_segs[GPRIV_SEL].ssd_base = (int) &SMP_prvspace[0];
- gdt_segs[GPROC0_SEL].ssd_base =
- (int) &SMP_prvspace[0].globaldata.gd_common_tss;
- SMP_prvspace[0].globaldata.gd_prvspace = &SMP_prvspace[0].globaldata;
#else
+ pc = &__pcpu;
gdt_segs[GPRIV_SEL].ssd_limit =
- atop(sizeof(struct globaldata) - 1);
- gdt_segs[GPRIV_SEL].ssd_base = (int) &__globaldata;
- gdt_segs[GPROC0_SEL].ssd_base =
- (int) &__globaldata.gd_common_tss;
- __globaldata.gd_prvspace = &__globaldata;
+ atop(sizeof(struct pcpu) - 1);
#endif
+ gdt_segs[GPRIV_SEL].ssd_base = (int) pc;
+ gdt_segs[GPROC0_SEL].ssd_base = (int) &pc->pc_common_tss;
for (x = 0; x < NGDT; x++) {
#ifdef BDE_DEBUGGER
@@ -1734,10 +1729,11 @@ init386(first)
r_gdt.rd_base = (int) gdt;
lgdt(&r_gdt);
- /* setup curproc so that mutexes work */
+ pcpu_init(pc, 0, sizeof(struct pcpu));
+ PCPU_SET(prvspace, pc);
+ /* setup curproc so that mutexes work */
PCPU_SET(curthread, thread0);
- PCPU_SET(spinlocks, NULL);
LIST_INIT(&thread0->td_contested);
@@ -1907,6 +1903,11 @@ init386(first)
thread0->td_frame = &proc0_tf;
}
+void
+cpu_pcpu_init(struct pcpu *pcpu, int cpuid, size_t size)
+{
+}
+
#if defined(I586_CPU) && !defined(NO_F00F_HACK)
static void f00f_hack(void *unused);
SYSINIT(f00f_hack, SI_SUB_INTRINSIC, SI_ORDER_FIRST, f00f_hack, NULL);
diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c
index 13144b9..9d86dae 100644
--- a/sys/amd64/amd64/mp_machdep.c
+++ b/sys/amd64/amd64/mp_machdep.c
@@ -71,7 +71,6 @@
#include <machine/smptests.h> /** TEST_DEFAULT_CONFIG, TEST_TEST1 */
#include <machine/tss.h>
#include <machine/specialreg.h>
-#include <machine/globaldata.h>
#include <machine/privatespace.h>
#if defined(APIC_IO)
@@ -477,9 +476,9 @@ init_secondary(void)
gdt_segs[GPRIV_SEL].ssd_base = (int) &SMP_prvspace[myid];
gdt_segs[GPROC0_SEL].ssd_base =
- (int) &SMP_prvspace[myid].globaldata.gd_common_tss;
- SMP_prvspace[myid].globaldata.gd_prvspace =
- &SMP_prvspace[myid].globaldata;
+ (int) &SMP_prvspace[myid].pcpu.pc_common_tss;
+ SMP_prvspace[myid].pcpu.pc_prvspace =
+ &SMP_prvspace[myid].pcpu;
for (x = 0; x < NGDT; x++) {
ssdtosd(&gdt_segs[x], &gdt[myid * NGDT + x].sd);
@@ -1915,7 +1914,7 @@ start_all_aps(u_int boot_addr)
int x, i, pg;
u_char mpbiosreason;
u_long mpbioswarmvec;
- struct globaldata *gd;
+ struct pcpu *pc;
char *stack;
uintptr_t kptbase;
@@ -1955,10 +1954,10 @@ start_all_aps(u_int boot_addr)
pg = x * i386_btop(sizeof(struct privatespace));
/* allocate a new private data page */
- gd = (struct globaldata *)kmem_alloc(kernel_map, PAGE_SIZE);
+ pc = (struct pcpu *)kmem_alloc(kernel_map, PAGE_SIZE);
/* wire it into the private page table page */
- SMPpt[pg] = (pt_entry_t)(PG_V | PG_RW | vtophys(gd));
+ SMPpt[pg] = (pt_entry_t)(PG_V | PG_RW | vtophys(pc));
/* allocate and set up an idle stack data page */
stack = (char *)kmem_alloc(kernel_map, KSTACK_PAGES * PAGE_SIZE); /* XXXKSE */
@@ -1967,8 +1966,7 @@ start_all_aps(u_int boot_addr)
(PG_V | PG_RW | vtophys(PAGE_SIZE * i + stack));
/* prime data page for it to use */
- gd->gd_cpuid = x;
- globaldata_register(gd);
+ pcpu_init(pc, x, sizeof(struct pcpu));
/* setup a vector to our boot code */
*((volatile u_short *) WARMBOOT_OFF) = WARMBOOT_TARGET;
diff --git a/sys/amd64/amd64/mptable.c b/sys/amd64/amd64/mptable.c
index 13144b9..9d86dae 100644
--- a/sys/amd64/amd64/mptable.c
+++ b/sys/amd64/amd64/mptable.c
@@ -71,7 +71,6 @@
#include <machine/smptests.h> /** TEST_DEFAULT_CONFIG, TEST_TEST1 */
#include <machine/tss.h>
#include <machine/specialreg.h>
-#include <machine/globaldata.h>
#include <machine/privatespace.h>
#if defined(APIC_IO)
@@ -477,9 +476,9 @@ init_secondary(void)
gdt_segs[GPRIV_SEL].ssd_base = (int) &SMP_prvspace[myid];
gdt_segs[GPROC0_SEL].ssd_base =
- (int) &SMP_prvspace[myid].globaldata.gd_common_tss;
- SMP_prvspace[myid].globaldata.gd_prvspace =
- &SMP_prvspace[myid].globaldata;
+ (int) &SMP_prvspace[myid].pcpu.pc_common_tss;
+ SMP_prvspace[myid].pcpu.pc_prvspace =
+ &SMP_prvspace[myid].pcpu;
for (x = 0; x < NGDT; x++) {
ssdtosd(&gdt_segs[x], &gdt[myid * NGDT + x].sd);
@@ -1915,7 +1914,7 @@ start_all_aps(u_int boot_addr)
int x, i, pg;
u_char mpbiosreason;
u_long mpbioswarmvec;
- struct globaldata *gd;
+ struct pcpu *pc;
char *stack;
uintptr_t kptbase;
@@ -1955,10 +1954,10 @@ start_all_aps(u_int boot_addr)
pg = x * i386_btop(sizeof(struct privatespace));
/* allocate a new private data page */
- gd = (struct globaldata *)kmem_alloc(kernel_map, PAGE_SIZE);
+ pc = (struct pcpu *)kmem_alloc(kernel_map, PAGE_SIZE);
/* wire it into the private page table page */
- SMPpt[pg] = (pt_entry_t)(PG_V | PG_RW | vtophys(gd));
+ SMPpt[pg] = (pt_entry_t)(PG_V | PG_RW | vtophys(pc));
/* allocate and set up an idle stack data page */
stack = (char *)kmem_alloc(kernel_map, KSTACK_PAGES * PAGE_SIZE); /* XXXKSE */
@@ -1967,8 +1966,7 @@ start_all_aps(u_int boot_addr)
(PG_V | PG_RW | vtophys(PAGE_SIZE * i + stack));
/* prime data page for it to use */
- gd->gd_cpuid = x;
- globaldata_register(gd);
+ pcpu_init(pc, x, sizeof(struct pcpu));
/* setup a vector to our boot code */
*((volatile u_short *) WARMBOOT_OFF) = WARMBOOT_TARGET;
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index 789c491..d7a95a4 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -105,7 +105,6 @@
#include <machine/apic.h>
#include <machine/segments.h>
#include <machine/tss.h>
-#include <machine/globaldata.h>
#endif /* SMP || APIC_IO */
#define PMAP_KEEP_PDIRS
diff --git a/sys/amd64/amd64/support.S b/sys/amd64/amd64/support.S
index 81181cc..bc58672 100644
--- a/sys/amd64/amd64/support.S
+++ b/sys/amd64/amd64/support.S
@@ -216,8 +216,8 @@ ENTRY(i586_bzero)
* complicated since we avoid it if possible at all levels. We
* want to localize the complications even when that increases them.
* Here the extra work involves preserving CR0_TS in TS.
- * `npxthread != NULL' is supposed to be the condition that all the
- * FPU resources belong to an application, but npxthread and CR0_TS
+ * `fpcurthread != NULL' is supposed to be the condition that all the
+ * FPU resources belong to an application, but fpcurthread and CR0_TS
* aren't set atomically enough for this condition to work in
* interrupt handlers.
*
@@ -241,7 +241,7 @@ ENTRY(i586_bzero)
* method. CR0_TS must be preserved although it is very likely to
* always end up as clear.
*/
- cmpl $0,PCPU(NPXTHREAD)
+ cmpl $0,PCPU(FPCURTHREAD)
je i586_bz1
/*
@@ -303,7 +303,7 @@ fpureg_i586_bzero_loop:
cmpl $8,%ecx
jae fpureg_i586_bzero_loop
- cmpl $0,PCPU(NPXTHREAD)
+ cmpl $0,PCPU(FPCURTHREAD)
je i586_bz3
/* XXX check that the condition for cases 1-2 stayed false. */
@@ -517,7 +517,7 @@ ENTRY(i586_bcopy)
sarb $1,kernel_fpu_lock
jc small_i586_bcopy
- cmpl $0,PCPU(NPXTHREAD)
+ cmpl $0,PCPU(FPCURTHREAD)
je i586_bc1
/* XXX turn off handling of cases 1-2, as above. */
@@ -593,7 +593,7 @@ large_i586_bcopy_loop:
cmpl $64,%ecx
jae 4b
- cmpl $0,PCPU(NPXTHREAD)
+ cmpl $0,PCPU(FPCURTHREAD)
je i586_bc2
/* XXX check that the condition for cases 1-2 stayed false. */
@@ -991,14 +991,14 @@ ENTRY(fastmove)
/* XXX grab FPU context atomically. */
cli
-/* if (npxthread != NULL) { */
- cmpl $0,PCPU(NPXTHREAD)
+/* if (fpcurthread != NULL) { */
+ cmpl $0,PCPU(FPCURTHREAD)
je 6f
/* fnsave(&curpcb->pcb_savefpu); */
movl PCPU(CURPCB),%eax
fnsave PCB_SAVEFPU(%eax)
-/* NPXTHREAD = NULL; */
- movl $0,PCPU(NPXTHREAD)
+/* FPCURTHREAD = NULL; */
+ movl $0,PCPU(FPCURTHREAD)
/* } */
6:
/* now we own the FPU. */
@@ -1026,9 +1026,9 @@ ENTRY(fastmove)
movl -4(%ebp),%edi
/* stop_emulating(); */
clts
-/* npxthread = curthread; */
+/* fpcurthread = curthread; */
movl PCPU(CURTHREAD),%eax
- movl %eax,PCPU(NPXTHREAD)
+ movl %eax,PCPU(FPCURTHREAD)
movl PCPU(CURPCB),%eax
/* XXX end of atomic FPU context grab. */
@@ -1113,8 +1113,8 @@ fastmove_loop:
smsw %ax
orb $CR0_TS,%al
lmsw %ax
-/* npxthread = NULL; */
- movl $0,PCPU(NPXTHREAD)
+/* fpcurthread = NULL; */
+ movl $0,PCPU(FPCURTHREAD)
/* XXX end of atomic FPU context ungrab. */
sti
@@ -1154,7 +1154,7 @@ fastmove_fault:
smsw %ax
orb $CR0_TS,%al
lmsw %ax
- movl $0,PCPU(NPXTHREAD)
+ movl $0,PCPU(FPCURTHREAD)
/* XXX end of atomic FPU context ungrab. */
sti
diff --git a/sys/amd64/amd64/support.s b/sys/amd64/amd64/support.s
index 81181cc..bc58672 100644
--- a/sys/amd64/amd64/support.s
+++ b/sys/amd64/amd64/support.s
@@ -216,8 +216,8 @@ ENTRY(i586_bzero)
* complicated since we avoid it if possible at all levels. We
* want to localize the complications even when that increases them.
* Here the extra work involves preserving CR0_TS in TS.
- * `npxthread != NULL' is supposed to be the condition that all the
- * FPU resources belong to an application, but npxthread and CR0_TS
+ * `fpcurthread != NULL' is supposed to be the condition that all the
+ * FPU resources belong to an application, but fpcurthread and CR0_TS
* aren't set atomically enough for this condition to work in
* interrupt handlers.
*
@@ -241,7 +241,7 @@ ENTRY(i586_bzero)
* method. CR0_TS must be preserved although it is very likely to
* always end up as clear.
*/
- cmpl $0,PCPU(NPXTHREAD)
+ cmpl $0,PCPU(FPCURTHREAD)
je i586_bz1
/*
@@ -303,7 +303,7 @@ fpureg_i586_bzero_loop:
cmpl $8,%ecx
jae fpureg_i586_bzero_loop
- cmpl $0,PCPU(NPXTHREAD)
+ cmpl $0,PCPU(FPCURTHREAD)
je i586_bz3
/* XXX check that the condition for cases 1-2 stayed false. */
@@ -517,7 +517,7 @@ ENTRY(i586_bcopy)
sarb $1,kernel_fpu_lock
jc small_i586_bcopy
- cmpl $0,PCPU(NPXTHREAD)
+ cmpl $0,PCPU(FPCURTHREAD)
je i586_bc1
/* XXX turn off handling of cases 1-2, as above. */
@@ -593,7 +593,7 @@ large_i586_bcopy_loop:
cmpl $64,%ecx
jae 4b
- cmpl $0,PCPU(NPXTHREAD)
+ cmpl $0,PCPU(FPCURTHREAD)
je i586_bc2
/* XXX check that the condition for cases 1-2 stayed false. */
@@ -991,14 +991,14 @@ ENTRY(fastmove)
/* XXX grab FPU context atomically. */
cli
-/* if (npxthread != NULL) { */
- cmpl $0,PCPU(NPXTHREAD)
+/* if (fpcurthread != NULL) { */
+ cmpl $0,PCPU(FPCURTHREAD)
je 6f
/* fnsave(&curpcb->pcb_savefpu); */
movl PCPU(CURPCB),%eax
fnsave PCB_SAVEFPU(%eax)
-/* NPXTHREAD = NULL; */
- movl $0,PCPU(NPXTHREAD)
+/* FPCURTHREAD = NULL; */
+ movl $0,PCPU(FPCURTHREAD)
/* } */
6:
/* now we own the FPU. */
@@ -1026,9 +1026,9 @@ ENTRY(fastmove)
movl -4(%ebp),%edi
/* stop_emulating(); */
clts
-/* npxthread = curthread; */
+/* fpcurthread = curthread; */
movl PCPU(CURTHREAD),%eax
- movl %eax,PCPU(NPXTHREAD)
+ movl %eax,PCPU(FPCURTHREAD)
movl PCPU(CURPCB),%eax
/* XXX end of atomic FPU context grab. */
@@ -1113,8 +1113,8 @@ fastmove_loop:
smsw %ax
orb $CR0_TS,%al
lmsw %ax
-/* npxthread = NULL; */
- movl $0,PCPU(NPXTHREAD)
+/* fpcurthread = NULL; */
+ movl $0,PCPU(FPCURTHREAD)
/* XXX end of atomic FPU context ungrab. */
sti
@@ -1154,7 +1154,7 @@ fastmove_fault:
smsw %ax
orb $CR0_TS,%al
lmsw %ax
- movl $0,PCPU(NPXTHREAD)
+ movl $0,PCPU(FPCURTHREAD)
/* XXX end of atomic FPU context ungrab. */
sti
diff --git a/sys/amd64/amd64/swtch.s b/sys/amd64/amd64/swtch.s
index 14e4495..ae967c4 100644
--- a/sys/amd64/amd64/swtch.s
+++ b/sys/amd64/amd64/swtch.s
@@ -123,7 +123,7 @@ ENTRY(cpu_switch)
#ifdef DEV_NPX
/* have we used fp, and need a save? */
- cmpl %ecx,PCPU(NPXTHREAD)
+ cmpl %ecx,PCPU(FPCURTHREAD)
jne 1f
addl $PCB_SAVEFPU,%edx /* h/w bugs make saving complicated */
pushl %edx
@@ -337,20 +337,20 @@ ENTRY(savectx)
#ifdef DEV_NPX
/*
- * If npxthread == NULL, then the npx h/w state is irrelevant and the
+ * If fpcurthread == NULL, then the npx h/w state is irrelevant and the
* state had better already be in the pcb. This is true for forks
* but not for dumps (the old book-keeping with FP flags in the pcb
* always lost for dumps because the dump pcb has 0 flags).
*
- * If npxthread != NULL, then we have to save the npx h/w state to
- * npxthread's pcb and copy it to the requested pcb, or save to the
+ * If fpcurthread != NULL, then we have to save the npx h/w state to
+ * fpcurthread's pcb and copy it to the requested pcb, or save to the
* requested pcb and reload. Copying is easier because we would
* have to handle h/w bugs for reloading. We used to lose the
* parent's npx state for forks by forgetting to reload.
*/
pushfl
cli
- movl PCPU(NPXTHREAD),%eax
+ movl PCPU(FPCURTHREAD),%eax
testl %eax,%eax
je 1f
diff --git a/sys/amd64/amd64/vm_machdep.c b/sys/amd64/amd64/vm_machdep.c
index 59898e3..322b5e7 100644
--- a/sys/amd64/amd64/vm_machdep.c
+++ b/sys/amd64/amd64/vm_machdep.c
@@ -154,7 +154,7 @@ cpu_fork(td1, p2, flags)
if (td1 == curthread)
td1->td_pcb->pcb_gs = rgs();
savecrit = critical_enter();
- if (PCPU_GET(npxthread) == td1)
+ if (PCPU_GET(fpcurthread) == td1)
npxsave(&td1->td_pcb->pcb_save);
critical_exit(savecrit);
#endif
diff --git a/sys/amd64/include/asmacros.h b/sys/amd64/include/asmacros.h
index ec43cda..325e3d6 100644
--- a/sys/amd64/include/asmacros.h
+++ b/sys/amd64/include/asmacros.h
@@ -64,9 +64,9 @@
#define NON_GPROF_RET .byte 0xc3 /* opcode for `ret' */
#ifdef LOCORE
-#define PCPU(member) %fs:GD_ ## member
-#define PCPU_ADDR(member, reg) movl %fs:GD_PRVSPACE,reg; \
- addl $GD_ ## member,reg
+#define PCPU(member) %fs:PC_ ## member
+#define PCPU_ADDR(member, reg) movl %fs:PC_PRVSPACE,reg; \
+ addl $PC_ ## member,reg
#endif
#ifdef GPROF
diff --git a/sys/amd64/include/cpu.h b/sys/amd64/include/cpu.h
index a7783a0..10b9499 100644
--- a/sys/amd64/include/cpu.h
+++ b/sys/amd64/include/cpu.h
@@ -46,7 +46,6 @@
#include <machine/psl.h>
#include <machine/frame.h>
#include <machine/segments.h>
-#include <machine/globals.h>
/*
* definitions of cpu-dependent requirements
diff --git a/sys/amd64/include/mptable.h b/sys/amd64/include/mptable.h
index 13144b9..9d86dae 100644
--- a/sys/amd64/include/mptable.h
+++ b/sys/amd64/include/mptable.h
@@ -71,7 +71,6 @@
#include <machine/smptests.h> /** TEST_DEFAULT_CONFIG, TEST_TEST1 */
#include <machine/tss.h>
#include <machine/specialreg.h>
-#include <machine/globaldata.h>
#include <machine/privatespace.h>
#if defined(APIC_IO)
@@ -477,9 +476,9 @@ init_secondary(void)
gdt_segs[GPRIV_SEL].ssd_base = (int) &SMP_prvspace[myid];
gdt_segs[GPROC0_SEL].ssd_base =
- (int) &SMP_prvspace[myid].globaldata.gd_common_tss;
- SMP_prvspace[myid].globaldata.gd_prvspace =
- &SMP_prvspace[myid].globaldata;
+ (int) &SMP_prvspace[myid].pcpu.pc_common_tss;
+ SMP_prvspace[myid].pcpu.pc_prvspace =
+ &SMP_prvspace[myid].pcpu;
for (x = 0; x < NGDT; x++) {
ssdtosd(&gdt_segs[x], &gdt[myid * NGDT + x].sd);
@@ -1915,7 +1914,7 @@ start_all_aps(u_int boot_addr)
int x, i, pg;
u_char mpbiosreason;
u_long mpbioswarmvec;
- struct globaldata *gd;
+ struct pcpu *pc;
char *stack;
uintptr_t kptbase;
@@ -1955,10 +1954,10 @@ start_all_aps(u_int boot_addr)
pg = x * i386_btop(sizeof(struct privatespace));
/* allocate a new private data page */
- gd = (struct globaldata *)kmem_alloc(kernel_map, PAGE_SIZE);
+ pc = (struct pcpu *)kmem_alloc(kernel_map, PAGE_SIZE);
/* wire it into the private page table page */
- SMPpt[pg] = (pt_entry_t)(PG_V | PG_RW | vtophys(gd));
+ SMPpt[pg] = (pt_entry_t)(PG_V | PG_RW | vtophys(pc));
/* allocate and set up an idle stack data page */
stack = (char *)kmem_alloc(kernel_map, KSTACK_PAGES * PAGE_SIZE); /* XXXKSE */
@@ -1967,8 +1966,7 @@ start_all_aps(u_int boot_addr)
(PG_V | PG_RW | vtophys(PAGE_SIZE * i + stack));
/* prime data page for it to use */
- gd->gd_cpuid = x;
- globaldata_register(gd);
+ pcpu_init(pc, x, sizeof(struct pcpu));
/* setup a vector to our boot code */
*((volatile u_short *) WARMBOOT_OFF) = WARMBOOT_TARGET;
diff --git a/sys/amd64/include/pcpu.h b/sys/amd64/include/pcpu.h
index 46c26c4..5fecb98 100644
--- a/sys/amd64/include/pcpu.h
+++ b/sys/amd64/include/pcpu.h
@@ -26,54 +26,122 @@
* $FreeBSD$
*/
-#ifndef _MACHINE_GLOBALDATA_H_
-#define _MACHINE_GLOBALDATA_H_
+#ifndef _MACHINE_PCPU_H_
+#define _MACHINE_PCPU_H_
#ifdef _KERNEL
+#ifndef __GNUC__
+#error gcc is required to use this file
+#endif
+
#include <machine/segments.h>
#include <machine/tss.h>
-/* XXX */
-#ifdef KTR_PERCPU
-#include <sys/ktr.h>
-#endif
-
/*
- * This structure maps out the global data that needs to be kept on a
- * per-cpu basis. genassym uses this to generate offsets for the assembler
- * code, which also provides external symbols so that C can get at them as
- * though they were really globals.
- *
* The SMP parts are setup in pmap.c and locore.s for the BSP, and
* mp_machdep.c sets up the data for the AP's to "see" when they awake.
* The reason for doing it via a struct is so that an array of pointers
* to each CPU's data can be set up for things like "check curproc on all
* other processors"
*/
-struct globaldata {
- struct globaldata *gd_prvspace; /* Self-reference */
- struct thread *gd_curthread;
- struct thread *gd_npxthread;
- struct pcb *gd_curpcb;
- struct thread *gd_idlethread;
- struct timeval gd_switchtime;
- struct i386tss gd_common_tss;
- int gd_switchticks;
- struct segment_descriptor gd_common_tssd;
- struct segment_descriptor *gd_tss_gdt;
- int gd_currentldt;
- u_int gd_cpuid;
- u_int gd_other_cpus;
- SLIST_ENTRY(globaldata) gd_allcpu;
- struct lock_list_entry *gd_spinlocks;
-#ifdef KTR_PERCPU
- int gd_ktr_idx; /* Index into trace table */
- char *gd_ktr_buf;
- char gd_ktr_buf_data[KTR_SIZE];
-#endif
-};
+#define PCPU_MD_FIELDS \
+ struct pcpu *pc_prvspace; /* Self-reference */ \
+ struct i386tss pc_common_tss; \
+ struct segment_descriptor pc_common_tssd; \
+ struct segment_descriptor *pc_tss_gdt; \
+ int pc_currentldt
+
+/*
+ * Evaluates to the byte offset of the per-cpu variable name.
+ */
+#define __pcpu_offset(name) \
+ __offsetof(struct pcpu, name)
+
+/*
+ * Evaluates to the type of the per-cpu variable name.
+ */
+#define __pcpu_type(name) \
+ __typeof(((struct pcpu *)0)->name)
+
+/*
+ * Evaluates to the address of the per-cpu variable name.
+ */
+#define __PCPU_PTR(name) ({ \
+ __pcpu_type(name) *__p; \
+ \
+ __asm __volatile("movl %%fs:%1,%0; addl %2,%0" \
+ : "=r" (__p) \
+ : "m" (*(struct pcpu *)(__pcpu_offset(pc_prvspace))), \
+ "i" (__pcpu_offset(name))); \
+ \
+ __p; \
+})
+
+/*
+ * Evaluates to the value of the per-cpu variable name.
+ */
+#define __PCPU_GET(name) ({ \
+ __pcpu_type(name) __result; \
+ \
+ if (sizeof(__result) == 1) { \
+ u_char __b; \
+ __asm __volatile("movb %%fs:%1,%0" \
+ : "=r" (__b) \
+ : "m" (*(u_char *)(__pcpu_offset(name)))); \
+ __result = *(__pcpu_type(name) *)&__b; \
+ } else if (sizeof(__result) == 2) { \
+ u_short __w; \
+ __asm __volatile("movw %%fs:%1,%0" \
+ : "=r" (__w) \
+ : "m" (*(u_short *)(__pcpu_offset(name)))); \
+ __result = *(__pcpu_type(name) *)&__w; \
+ } else if (sizeof(__result) == 4) { \
+ u_int __i; \
+ __asm __volatile("movl %%fs:%1,%0" \
+ : "=r" (__i) \
+ : "m" (*(u_int *)(__pcpu_offset(name)))); \
+ __result = *(__pcpu_type(name) *)&__i; \
+ } else { \
+ __result = *__PCPU_PTR(name); \
+ } \
+ \
+ __result; \
+})
+
+/*
+ * Sets the value of the per-cpu variable name to value val.
+ */
+#define __PCPU_SET(name, val) ({ \
+ __pcpu_type(name) __val = (val); \
+ \
+ if (sizeof(__val) == 1) { \
+ u_char __b; \
+ __b = *(u_char *)&__val; \
+ __asm __volatile("movb %1,%%fs:%0" \
+ : "=m" (*(u_char *)(__pcpu_offset(name))) \
+ : "r" (__b)); \
+ } else if (sizeof(__val) == 2) { \
+ u_short __w; \
+ __w = *(u_short *)&__val; \
+ __asm __volatile("movw %1,%%fs:%0" \
+ : "=m" (*(u_short *)(__pcpu_offset(name))) \
+ : "r" (__w)); \
+ } else if (sizeof(__val) == 4) { \
+ u_int __i; \
+ __i = *(u_int *)&__val; \
+ __asm __volatile("movl %1,%%fs:%0" \
+ : "=m" (*(u_int *)(__pcpu_offset(name))) \
+ : "r" (__i)); \
+ } else { \
+ *__PCPU_PTR(name) = __val; \
+ } \
+})
+
+#define PCPU_GET(member) __PCPU_GET(pc_ ## member)
+#define PCPU_PTR(member) __PCPU_PTR(pc_ ## member)
+#define PCPU_SET(member, val) __PCPU_SET(pc_ ## member, val)
#endif /* _KERNEL */
-#endif /* ! _MACHINE_GLOBALDATA_H_ */
+#endif /* ! _MACHINE_PCPU_H_ */
diff --git a/sys/amd64/include/proc.h b/sys/amd64/include/proc.h
index 911f6b8..5b50824 100644
--- a/sys/amd64/include/proc.h
+++ b/sys/amd64/include/proc.h
@@ -37,7 +37,6 @@
#ifndef _MACHINE_PROC_H_
#define _MACHINE_PROC_H_
-#include <machine/globals.h>
#include <machine/segments.h>
struct proc_ldt {
diff --git a/sys/amd64/isa/npx.c b/sys/amd64/isa/npx.c
index 1238d67..ff8c4cf 100644
--- a/sys/amd64/isa/npx.c
+++ b/sys/amd64/isa/npx.c
@@ -237,7 +237,7 @@ npx_intr(dummy)
#endif
/*
- * npxthread is normally non-null here. In that case, schedule an
+ * fpcurthread is normally non-null here. In that case, schedule an
* AST to finish the exception handling in the correct context
* (this interrupt may occur after the thread has entered the
* kernel via a syscall or an interrupt). Otherwise, the npx
@@ -248,7 +248,7 @@ npx_intr(dummy)
* that caused it and it will repeat. We will eventually (usually
* soon) win the race to handle the interrupt properly.
*/
- td = PCPU_GET(npxthread);
+ td = PCPU_GET(fpcurthread);
if (td != NULL) {
td->td_pcb->pcb_flags |= PCB_NPXTRAP;
mtx_lock_spin(&sched_lock);
@@ -513,7 +513,7 @@ npxinit(control)
/*
* fninit has the same h/w bugs as fnsave. Use the detoxified
* fnsave to throw away any junk in the fpu. npxsave() initializes
- * the fpu and sets npxthread = NULL as important side effects.
+ * the fpu and sets fpcurthread = NULL as important side effects.
*/
savecrit = critical_enter();
npxsave(&dummy);
@@ -540,7 +540,7 @@ npxexit(td)
critical_t savecrit;
savecrit = critical_enter();
- if (td == PCPU_GET(npxthread))
+ if (td == PCPU_GET(fpcurthread))
npxsave(&PCPU_GET(curpcb)->pcb_save);
critical_exit(savecrit);
#ifdef NPX_DEBUG
@@ -758,8 +758,8 @@ npxtrap()
u_long *exstat;
if (!npx_exists) {
- printf("npxtrap: npxthread = %p, curthread = %p, npx_exists = %d\n",
- PCPU_GET(npxthread), curthread, npx_exists);
+ printf("npxtrap: fpcurthread = %p, curthread = %p, npx_exists = %d\n",
+ PCPU_GET(fpcurthread), curthread, npx_exists);
panic("npxtrap from nowhere");
}
savecrit = critical_enter();
@@ -769,7 +769,7 @@ npxtrap()
* state to memory. Fetch the relevant parts of the state from
* wherever they are.
*/
- if (PCPU_GET(npxthread) != curthread) {
+ if (PCPU_GET(fpcurthread) != curthread) {
control = GET_FPU_CW(curthread);
status = GET_FPU_SW(curthread);
} else {
@@ -779,7 +779,7 @@ npxtrap()
exstat = GET_FPU_EXSW_PTR(curthread->td_pcb);
*exstat = status;
- if (PCPU_GET(npxthread) != curthread)
+ if (PCPU_GET(fpcurthread) != curthread)
GET_FPU_SW(curthread) &= ~0x80bf;
else
fnclex();
@@ -790,7 +790,7 @@ npxtrap()
/*
* Implement device not available (DNA) exception
*
- * It would be better to switch FP context here (if curthread != npxthread)
+ * It would be better to switch FP context here (if curthread != fpcurthread)
* and not necessarily for every context switch, but it is too hard to
* access foreign pcb's.
*/
@@ -802,9 +802,9 @@ npxdna()
if (!npx_exists)
return (0);
- if (PCPU_GET(npxthread) != NULL) {
- printf("npxdna: npxthread = %p, curthread = %p\n",
- PCPU_GET(npxthread), curthread);
+ if (PCPU_GET(fpcurthread) != NULL) {
+ printf("npxdna: fpcurthread = %p, curthread = %p\n",
+ PCPU_GET(fpcurthread), curthread);
panic("npxdna");
}
s = critical_enter();
@@ -812,7 +812,7 @@ npxdna()
/*
* Record new context early in case frstor causes an IRQ13.
*/
- PCPU_SET(npxthread, curthread);
+ PCPU_SET(fpcurthread, curthread);
exstat = GET_FPU_EXSW_PTR(PCPU_GET(curpcb));
*exstat = 0;
@@ -844,13 +844,13 @@ npxdna()
* after the process has entered the kernel. It may even be delivered after
* the fnsave here completes. A spurious IRQ13 for the fnsave is handled in
* the same way as a very-late-arriving non-spurious IRQ13 from user mode:
- * it is normally ignored at first because we set npxthread to NULL; it is
+ * it is normally ignored at first because we set fpcurthread to NULL; it is
* normally retriggered in npxdna() after return to user mode.
*
* npxsave() must be called with interrupts disabled, so that it clears
- * npxthread atomically with saving the state. We require callers to do the
+ * fpcurthread atomically with saving the state. We require callers to do the
* disabling, since most callers need to disable interrupts anyway to call
- * npxsave() atomically with checking npxthread.
+ * npxsave() atomically with checking fpcurthread.
*
* A previous version of npxsave() went to great lengths to excecute fnsave
* with interrupts enabled in case executing it froze the CPU. This case
@@ -866,7 +866,7 @@ npxsave(addr)
fpusave(addr);
start_emulating();
- PCPU_SET(npxthread, NULL);
+ PCPU_SET(fpcurthread, NULL);
}
static void
diff --git a/sys/i386/i386/bios.c b/sys/i386/i386/bios.c
index cc887e7..6eb90b2 100644
--- a/sys/i386/i386/bios.c
+++ b/sys/i386/i386/bios.c
@@ -36,9 +36,9 @@
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <sys/bus.h>
+#include <sys/pcpu.h>
#include <vm/vm.h>
#include <vm/pmap.h>
-#include <machine/globals.h>
#include <machine/md_var.h>
#include <machine/segments.h>
#include <machine/stdarg.h>
diff --git a/sys/i386/i386/db_interface.c b/sys/i386/i386/db_interface.c
index 7e78088..9708cad 100644
--- a/sys/i386/i386/db_interface.c
+++ b/sys/i386/i386/db_interface.c
@@ -332,48 +332,9 @@ Debugger(msg)
}
}
-DB_SHOW_COMMAND(pcpu, db_show_pcpu)
+void
+db_show_mdpcpu(struct pcpu *pc)
{
- struct globaldata *gd;
-#ifdef SMP
- int id;
-
- if (have_addr)
- id = ((addr >> 4) % 16) * 10 + (addr % 16);
- else
- id = PCPU_GET(cpuid);
- gd = globaldata_find(id);
- if (gd == NULL) {
- db_printf("CPU %d not found\n", id);
- return;
- }
-#else
- gd = GLOBALDATA;
-#endif
- db_printf("cpuid = %d\n", gd->gd_cpuid);
- db_printf("curthread = ");
- if (gd->gd_curthread != NULL)
- db_printf("%p: pid %d \"%s\"\n", gd->gd_curthread,
- gd->gd_curthread->td_proc->p_pid, gd->gd_curthread->td_proc->p_comm);
- else
- db_printf("none\n");
- db_printf("curpcb = %p\n", gd->gd_curpcb);
- db_printf("npxthread = ");
- if (gd->gd_npxthread != NULL)
- db_printf("%p: pid %d \"%s\"\n", gd->gd_npxthread,
- gd->gd_npxthread->td_proc->p_pid, gd->gd_npxthread->td_proc->p_comm);
- else
- db_printf("none\n");
- db_printf("idlethread = ");
- if (gd->gd_idlethread != NULL)
- db_printf("%p: pid %d \"%s\"\n", gd->gd_idlethread,
- gd->gd_idlethread->td_proc->p_pid,
- gd->gd_idlethread->td_proc->p_comm);
- else
- db_printf("none\n");
-
-#ifdef WITNESS
- db_printf("spin locks held:\n");
- witness_list_locks(&gd->gd_spinlocks);
-#endif
+
+ db_printf("currentldt = 0x%x\n", pc->pc_currentldt);
}
diff --git a/sys/i386/i386/genassym.c b/sys/i386/i386/genassym.c
index 9f41665..59f3147 100644
--- a/sys/i386/i386/genassym.c
+++ b/sys/i386/i386/genassym.c
@@ -51,10 +51,6 @@
#include <sys/socket.h>
#include <sys/resourcevar.h>
#include <sys/user.h>
-/* XXX */
-#ifdef KTR_PERCPU
-#include <sys/ktr.h>
-#endif
#include <machine/bootinfo.h>
#include <machine/tss.h>
#include <sys/vmmeter.h>
@@ -75,7 +71,6 @@
#endif
#include <machine/cpu.h>
#include <machine/sigframe.h>
-#include <machine/globaldata.h>
#include <machine/vm86.h>
#include <machine/proc.h>
@@ -177,27 +172,19 @@ ASSYM(BI_SIZE, offsetof(struct bootinfo, bi_size));
ASSYM(BI_SYMTAB, offsetof(struct bootinfo, bi_symtab));
ASSYM(BI_ESYMTAB, offsetof(struct bootinfo, bi_esymtab));
ASSYM(BI_KERNEND, offsetof(struct bootinfo, bi_kernend));
-ASSYM(GD_SIZEOF, sizeof(struct globaldata));
-ASSYM(GD_PRVSPACE, offsetof(struct globaldata, gd_prvspace));
-ASSYM(GD_CURTHREAD, offsetof(struct globaldata, gd_curthread));
-ASSYM(GD_NPXTHREAD, offsetof(struct globaldata, gd_npxthread));
-ASSYM(GD_IDLETHREAD, offsetof(struct globaldata, gd_idlethread));
-ASSYM(GD_CURPCB, offsetof(struct globaldata, gd_curpcb));
-ASSYM(GD_COMMON_TSS, offsetof(struct globaldata, gd_common_tss));
-ASSYM(GD_SWITCHTIME, offsetof(struct globaldata, gd_switchtime));
-ASSYM(GD_SWITCHTICKS, offsetof(struct globaldata, gd_switchticks));
-ASSYM(GD_COMMON_TSSD, offsetof(struct globaldata, gd_common_tssd));
-ASSYM(GD_TSS_GDT, offsetof(struct globaldata, gd_tss_gdt));
-ASSYM(GD_CURRENTLDT, offsetof(struct globaldata, gd_currentldt));
-
-/* XXX */
-#ifdef KTR_PERCPU
-ASSYM(GD_KTR_IDX, offsetof(struct globaldata, gd_ktr_idx));
-ASSYM(GD_KTR_BUF, offsetof(struct globaldata, gd_ktr_buf));
-ASSYM(GD_KTR_BUF_DATA, offsetof(struct globaldata, gd_ktr_buf_data));
-#endif
-
-ASSYM(GD_CPUID, offsetof(struct globaldata, gd_cpuid));
+ASSYM(PC_SIZEOF, sizeof(struct pcpu));
+ASSYM(PC_PRVSPACE, offsetof(struct pcpu, pc_prvspace));
+ASSYM(PC_CURTHREAD, offsetof(struct pcpu, pc_curthread));
+ASSYM(PC_FPCURTHREAD, offsetof(struct pcpu, pc_fpcurthread));
+ASSYM(PC_IDLETHREAD, offsetof(struct pcpu, pc_idlethread));
+ASSYM(PC_CURPCB, offsetof(struct pcpu, pc_curpcb));
+ASSYM(PC_COMMON_TSS, offsetof(struct pcpu, pc_common_tss));
+ASSYM(PC_SWITCHTIME, offsetof(struct pcpu, pc_switchtime));
+ASSYM(PC_SWITCHTICKS, offsetof(struct pcpu, pc_switchticks));
+ASSYM(PC_COMMON_TSSD, offsetof(struct pcpu, pc_common_tssd));
+ASSYM(PC_TSS_GDT, offsetof(struct pcpu, pc_tss_gdt));
+ASSYM(PC_CURRENTLDT, offsetof(struct pcpu, pc_currentldt));
+ASSYM(PC_CPUID, offsetof(struct pcpu, pc_cpuid));
#ifdef SMP
ASSYM(LA_VER, offsetof(struct LAPIC, version));
diff --git a/sys/i386/i386/machdep.c b/sys/i386/i386/machdep.c
index bdc0980..c2ef5dc 100644
--- a/sys/i386/i386/machdep.c
+++ b/sys/i386/i386/machdep.c
@@ -104,7 +104,6 @@
#include <machine/pc/bios.h>
#include <machine/pcb_ext.h> /* pcb.h included via sys/user.h */
#include <machine/proc.h>
-#include <machine/globals.h>
#ifdef PERFMON
#include <machine/perfmon.h>
#endif
@@ -207,7 +206,7 @@ struct kva_md_info kmi;
static struct trapframe proc0_tf;
#ifndef SMP
-static struct globaldata __globaldata;
+static struct pcpu __pcpu;
#endif
struct mtx sched_lock;
@@ -262,7 +261,6 @@ cpu_startup(dummy)
bufinit();
vm_pager_bufferinit();
- globaldata_register(GLOBALDATA);
#ifndef SMP
/* For SMP, we delay the cpu_setregs() until after SMP startup. */
cpu_setregs();
@@ -1670,6 +1668,7 @@ init386(first)
/* table descriptors - used to load tables by microp */
struct region_descriptor r_gdt, r_idt;
#endif
+ struct pcpu *pc;
proc_linkup(&proc0);
proc0.p_uarea = proc0uarea;
@@ -1706,20 +1705,16 @@ init386(first)
gdt_segs[GCODE_SEL].ssd_limit = atop(0 - 1);
gdt_segs[GDATA_SEL].ssd_limit = atop(0 - 1);
#ifdef SMP
+ pc = &SMP_prvspace[0];
gdt_segs[GPRIV_SEL].ssd_limit =
atop(sizeof(struct privatespace) - 1);
- gdt_segs[GPRIV_SEL].ssd_base = (int) &SMP_prvspace[0];
- gdt_segs[GPROC0_SEL].ssd_base =
- (int) &SMP_prvspace[0].globaldata.gd_common_tss;
- SMP_prvspace[0].globaldata.gd_prvspace = &SMP_prvspace[0].globaldata;
#else
+ pc = &__pcpu;
gdt_segs[GPRIV_SEL].ssd_limit =
- atop(sizeof(struct globaldata) - 1);
- gdt_segs[GPRIV_SEL].ssd_base = (int) &__globaldata;
- gdt_segs[GPROC0_SEL].ssd_base =
- (int) &__globaldata.gd_common_tss;
- __globaldata.gd_prvspace = &__globaldata;
+ atop(sizeof(struct pcpu) - 1);
#endif
+ gdt_segs[GPRIV_SEL].ssd_base = (int) pc;
+ gdt_segs[GPROC0_SEL].ssd_base = (int) &pc->pc_common_tss;
for (x = 0; x < NGDT; x++) {
#ifdef BDE_DEBUGGER
@@ -1734,10 +1729,11 @@ init386(first)
r_gdt.rd_base = (int) gdt;
lgdt(&r_gdt);
- /* setup curproc so that mutexes work */
+ pcpu_init(pc, 0, sizeof(struct pcpu));
+ PCPU_SET(prvspace, pc);
+ /* setup curproc so that mutexes work */
PCPU_SET(curthread, thread0);
- PCPU_SET(spinlocks, NULL);
LIST_INIT(&thread0->td_contested);
@@ -1907,6 +1903,11 @@ init386(first)
thread0->td_frame = &proc0_tf;
}
+void
+cpu_pcpu_init(struct pcpu *pcpu, int cpuid, size_t size)
+{
+}
+
#if defined(I586_CPU) && !defined(NO_F00F_HACK)
static void f00f_hack(void *unused);
SYSINIT(f00f_hack, SI_SUB_INTRINSIC, SI_ORDER_FIRST, f00f_hack, NULL);
diff --git a/sys/i386/i386/mp_machdep.c b/sys/i386/i386/mp_machdep.c
index 13144b9..9d86dae 100644
--- a/sys/i386/i386/mp_machdep.c
+++ b/sys/i386/i386/mp_machdep.c
@@ -71,7 +71,6 @@
#include <machine/smptests.h> /** TEST_DEFAULT_CONFIG, TEST_TEST1 */
#include <machine/tss.h>
#include <machine/specialreg.h>
-#include <machine/globaldata.h>
#include <machine/privatespace.h>
#if defined(APIC_IO)
@@ -477,9 +476,9 @@ init_secondary(void)
gdt_segs[GPRIV_SEL].ssd_base = (int) &SMP_prvspace[myid];
gdt_segs[GPROC0_SEL].ssd_base =
- (int) &SMP_prvspace[myid].globaldata.gd_common_tss;
- SMP_prvspace[myid].globaldata.gd_prvspace =
- &SMP_prvspace[myid].globaldata;
+ (int) &SMP_prvspace[myid].pcpu.pc_common_tss;
+ SMP_prvspace[myid].pcpu.pc_prvspace =
+ &SMP_prvspace[myid].pcpu;
for (x = 0; x < NGDT; x++) {
ssdtosd(&gdt_segs[x], &gdt[myid * NGDT + x].sd);
@@ -1915,7 +1914,7 @@ start_all_aps(u_int boot_addr)
int x, i, pg;
u_char mpbiosreason;
u_long mpbioswarmvec;
- struct globaldata *gd;
+ struct pcpu *pc;
char *stack;
uintptr_t kptbase;
@@ -1955,10 +1954,10 @@ start_all_aps(u_int boot_addr)
pg = x * i386_btop(sizeof(struct privatespace));
/* allocate a new private data page */
- gd = (struct globaldata *)kmem_alloc(kernel_map, PAGE_SIZE);
+ pc = (struct pcpu *)kmem_alloc(kernel_map, PAGE_SIZE);
/* wire it into the private page table page */
- SMPpt[pg] = (pt_entry_t)(PG_V | PG_RW | vtophys(gd));
+ SMPpt[pg] = (pt_entry_t)(PG_V | PG_RW | vtophys(pc));
/* allocate and set up an idle stack data page */
stack = (char *)kmem_alloc(kernel_map, KSTACK_PAGES * PAGE_SIZE); /* XXXKSE */
@@ -1967,8 +1966,7 @@ start_all_aps(u_int boot_addr)
(PG_V | PG_RW | vtophys(PAGE_SIZE * i + stack));
/* prime data page for it to use */
- gd->gd_cpuid = x;
- globaldata_register(gd);
+ pcpu_init(pc, x, sizeof(struct pcpu));
/* setup a vector to our boot code */
*((volatile u_short *) WARMBOOT_OFF) = WARMBOOT_TARGET;
diff --git a/sys/i386/i386/mpapic.c b/sys/i386/i386/mpapic.c
index 2542995..7e3478a 100644
--- a/sys/i386/i386/mpapic.c
+++ b/sys/i386/i386/mpapic.c
@@ -35,7 +35,6 @@
#include <machine/smptests.h> /** TEST_TEST1 */
#include <machine/smp.h>
#include <machine/mpapic.h>
-#include <machine/globaldata.h>
#include <machine/segments.h>
#include <i386/isa/intr_machdep.h> /* Xspuriousint() */
diff --git a/sys/i386/i386/mptable.c b/sys/i386/i386/mptable.c
index 13144b9..9d86dae 100644
--- a/sys/i386/i386/mptable.c
+++ b/sys/i386/i386/mptable.c
@@ -71,7 +71,6 @@
#include <machine/smptests.h> /** TEST_DEFAULT_CONFIG, TEST_TEST1 */
#include <machine/tss.h>
#include <machine/specialreg.h>
-#include <machine/globaldata.h>
#include <machine/privatespace.h>
#if defined(APIC_IO)
@@ -477,9 +476,9 @@ init_secondary(void)
gdt_segs[GPRIV_SEL].ssd_base = (int) &SMP_prvspace[myid];
gdt_segs[GPROC0_SEL].ssd_base =
- (int) &SMP_prvspace[myid].globaldata.gd_common_tss;
- SMP_prvspace[myid].globaldata.gd_prvspace =
- &SMP_prvspace[myid].globaldata;
+ (int) &SMP_prvspace[myid].pcpu.pc_common_tss;
+ SMP_prvspace[myid].pcpu.pc_prvspace =
+ &SMP_prvspace[myid].pcpu;
for (x = 0; x < NGDT; x++) {
ssdtosd(&gdt_segs[x], &gdt[myid * NGDT + x].sd);
@@ -1915,7 +1914,7 @@ start_all_aps(u_int boot_addr)
int x, i, pg;
u_char mpbiosreason;
u_long mpbioswarmvec;
- struct globaldata *gd;
+ struct pcpu *pc;
char *stack;
uintptr_t kptbase;
@@ -1955,10 +1954,10 @@ start_all_aps(u_int boot_addr)
pg = x * i386_btop(sizeof(struct privatespace));
/* allocate a new private data page */
- gd = (struct globaldata *)kmem_alloc(kernel_map, PAGE_SIZE);
+ pc = (struct pcpu *)kmem_alloc(kernel_map, PAGE_SIZE);
/* wire it into the private page table page */
- SMPpt[pg] = (pt_entry_t)(PG_V | PG_RW | vtophys(gd));
+ SMPpt[pg] = (pt_entry_t)(PG_V | PG_RW | vtophys(pc));
/* allocate and set up an idle stack data page */
stack = (char *)kmem_alloc(kernel_map, KSTACK_PAGES * PAGE_SIZE); /* XXXKSE */
@@ -1967,8 +1966,7 @@ start_all_aps(u_int boot_addr)
(PG_V | PG_RW | vtophys(PAGE_SIZE * i + stack));
/* prime data page for it to use */
- gd->gd_cpuid = x;
- globaldata_register(gd);
+ pcpu_init(pc, x, sizeof(struct pcpu));
/* setup a vector to our boot code */
*((volatile u_short *) WARMBOOT_OFF) = WARMBOOT_TARGET;
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c
index 789c491..d7a95a4 100644
--- a/sys/i386/i386/pmap.c
+++ b/sys/i386/i386/pmap.c
@@ -105,7 +105,6 @@
#include <machine/apic.h>
#include <machine/segments.h>
#include <machine/tss.h>
-#include <machine/globaldata.h>
#endif /* SMP || APIC_IO */
#define PMAP_KEEP_PDIRS
diff --git a/sys/i386/i386/support.s b/sys/i386/i386/support.s
index 81181cc..bc58672 100644
--- a/sys/i386/i386/support.s
+++ b/sys/i386/i386/support.s
@@ -216,8 +216,8 @@ ENTRY(i586_bzero)
* complicated since we avoid it if possible at all levels. We
* want to localize the complications even when that increases them.
* Here the extra work involves preserving CR0_TS in TS.
- * `npxthread != NULL' is supposed to be the condition that all the
- * FPU resources belong to an application, but npxthread and CR0_TS
+ * `fpcurthread != NULL' is supposed to be the condition that all the
+ * FPU resources belong to an application, but fpcurthread and CR0_TS
* aren't set atomically enough for this condition to work in
* interrupt handlers.
*
@@ -241,7 +241,7 @@ ENTRY(i586_bzero)
* method. CR0_TS must be preserved although it is very likely to
* always end up as clear.
*/
- cmpl $0,PCPU(NPXTHREAD)
+ cmpl $0,PCPU(FPCURTHREAD)
je i586_bz1
/*
@@ -303,7 +303,7 @@ fpureg_i586_bzero_loop:
cmpl $8,%ecx
jae fpureg_i586_bzero_loop
- cmpl $0,PCPU(NPXTHREAD)
+ cmpl $0,PCPU(FPCURTHREAD)
je i586_bz3
/* XXX check that the condition for cases 1-2 stayed false. */
@@ -517,7 +517,7 @@ ENTRY(i586_bcopy)
sarb $1,kernel_fpu_lock
jc small_i586_bcopy
- cmpl $0,PCPU(NPXTHREAD)
+ cmpl $0,PCPU(FPCURTHREAD)
je i586_bc1
/* XXX turn off handling of cases 1-2, as above. */
@@ -593,7 +593,7 @@ large_i586_bcopy_loop:
cmpl $64,%ecx
jae 4b
- cmpl $0,PCPU(NPXTHREAD)
+ cmpl $0,PCPU(FPCURTHREAD)
je i586_bc2
/* XXX check that the condition for cases 1-2 stayed false. */
@@ -991,14 +991,14 @@ ENTRY(fastmove)
/* XXX grab FPU context atomically. */
cli
-/* if (npxthread != NULL) { */
- cmpl $0,PCPU(NPXTHREAD)
+/* if (fpcurthread != NULL) { */
+ cmpl $0,PCPU(FPCURTHREAD)
je 6f
/* fnsave(&curpcb->pcb_savefpu); */
movl PCPU(CURPCB),%eax
fnsave PCB_SAVEFPU(%eax)
-/* NPXTHREAD = NULL; */
- movl $0,PCPU(NPXTHREAD)
+/* FPCURTHREAD = NULL; */
+ movl $0,PCPU(FPCURTHREAD)
/* } */
6:
/* now we own the FPU. */
@@ -1026,9 +1026,9 @@ ENTRY(fastmove)
movl -4(%ebp),%edi
/* stop_emulating(); */
clts
-/* npxthread = curthread; */
+/* fpcurthread = curthread; */
movl PCPU(CURTHREAD),%eax
- movl %eax,PCPU(NPXTHREAD)
+ movl %eax,PCPU(FPCURTHREAD)
movl PCPU(CURPCB),%eax
/* XXX end of atomic FPU context grab. */
@@ -1113,8 +1113,8 @@ fastmove_loop:
smsw %ax
orb $CR0_TS,%al
lmsw %ax
-/* npxthread = NULL; */
- movl $0,PCPU(NPXTHREAD)
+/* fpcurthread = NULL; */
+ movl $0,PCPU(FPCURTHREAD)
/* XXX end of atomic FPU context ungrab. */
sti
@@ -1154,7 +1154,7 @@ fastmove_fault:
smsw %ax
orb $CR0_TS,%al
lmsw %ax
- movl $0,PCPU(NPXTHREAD)
+ movl $0,PCPU(FPCURTHREAD)
/* XXX end of atomic FPU context ungrab. */
sti
diff --git a/sys/i386/i386/swtch.s b/sys/i386/i386/swtch.s
index 14e4495..ae967c4 100644
--- a/sys/i386/i386/swtch.s
+++ b/sys/i386/i386/swtch.s
@@ -123,7 +123,7 @@ ENTRY(cpu_switch)
#ifdef DEV_NPX
/* have we used fp, and need a save? */
- cmpl %ecx,PCPU(NPXTHREAD)
+ cmpl %ecx,PCPU(FPCURTHREAD)
jne 1f
addl $PCB_SAVEFPU,%edx /* h/w bugs make saving complicated */
pushl %edx
@@ -337,20 +337,20 @@ ENTRY(savectx)
#ifdef DEV_NPX
/*
- * If npxthread == NULL, then the npx h/w state is irrelevant and the
+ * If fpcurthread == NULL, then the npx h/w state is irrelevant and the
* state had better already be in the pcb. This is true for forks
* but not for dumps (the old book-keeping with FP flags in the pcb
* always lost for dumps because the dump pcb has 0 flags).
*
- * If npxthread != NULL, then we have to save the npx h/w state to
- * npxthread's pcb and copy it to the requested pcb, or save to the
+ * If fpcurthread != NULL, then we have to save the npx h/w state to
+ * fpcurthread's pcb and copy it to the requested pcb, or save to the
* requested pcb and reload. Copying is easier because we would
* have to handle h/w bugs for reloading. We used to lose the
* parent's npx state for forks by forgetting to reload.
*/
pushfl
cli
- movl PCPU(NPXTHREAD),%eax
+ movl PCPU(FPCURTHREAD),%eax
testl %eax,%eax
je 1f
diff --git a/sys/i386/i386/vm86bios.s b/sys/i386/i386/vm86bios.s
index 4cc0645..db79295 100644
--- a/sys/i386/i386/vm86bios.s
+++ b/sys/i386/i386/vm86bios.s
@@ -68,7 +68,7 @@ ENTRY(vm86_bioscall)
pushfl
cli
movl PCPU(CURTHREAD),%ecx
- cmpl %ecx,PCPU(NPXTHREAD) /* do we need to save fp? */
+ cmpl %ecx,PCPU(FPCURTHREAD) /* do we need to save fp? */
jne 1f
testl %ecx,%ecx
je 1f /* no curproc/npxproc */
diff --git a/sys/i386/i386/vm_machdep.c b/sys/i386/i386/vm_machdep.c
index 59898e3..322b5e7 100644
--- a/sys/i386/i386/vm_machdep.c
+++ b/sys/i386/i386/vm_machdep.c
@@ -154,7 +154,7 @@ cpu_fork(td1, p2, flags)
if (td1 == curthread)
td1->td_pcb->pcb_gs = rgs();
savecrit = critical_enter();
- if (PCPU_GET(npxthread) == td1)
+ if (PCPU_GET(fpcurthread) == td1)
npxsave(&td1->td_pcb->pcb_save);
critical_exit(savecrit);
#endif
diff --git a/sys/i386/include/asmacros.h b/sys/i386/include/asmacros.h
index ec43cda..325e3d6 100644
--- a/sys/i386/include/asmacros.h
+++ b/sys/i386/include/asmacros.h
@@ -64,9 +64,9 @@
#define NON_GPROF_RET .byte 0xc3 /* opcode for `ret' */
#ifdef LOCORE
-#define PCPU(member) %fs:GD_ ## member
-#define PCPU_ADDR(member, reg) movl %fs:GD_PRVSPACE,reg; \
- addl $GD_ ## member,reg
+#define PCPU(member) %fs:PC_ ## member
+#define PCPU_ADDR(member, reg) movl %fs:PC_PRVSPACE,reg; \
+ addl $PC_ ## member,reg
#endif
#ifdef GPROF
diff --git a/sys/i386/include/cpu.h b/sys/i386/include/cpu.h
index a7783a0..10b9499 100644
--- a/sys/i386/include/cpu.h
+++ b/sys/i386/include/cpu.h
@@ -46,7 +46,6 @@
#include <machine/psl.h>
#include <machine/frame.h>
#include <machine/segments.h>
-#include <machine/globals.h>
/*
* definitions of cpu-dependent requirements
diff --git a/sys/i386/include/globaldata.h b/sys/i386/include/globaldata.h
deleted file mode 100644
index 46c26c4..0000000
--- a/sys/i386/include/globaldata.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*-
- * Copyright (c) Peter Wemm <peter@netplex.com.au>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef _MACHINE_GLOBALDATA_H_
-#define _MACHINE_GLOBALDATA_H_
-
-#ifdef _KERNEL
-
-#include <machine/segments.h>
-#include <machine/tss.h>
-
-/* XXX */
-#ifdef KTR_PERCPU
-#include <sys/ktr.h>
-#endif
-
-/*
- * This structure maps out the global data that needs to be kept on a
- * per-cpu basis. genassym uses this to generate offsets for the assembler
- * code, which also provides external symbols so that C can get at them as
- * though they were really globals.
- *
- * The SMP parts are setup in pmap.c and locore.s for the BSP, and
- * mp_machdep.c sets up the data for the AP's to "see" when they awake.
- * The reason for doing it via a struct is so that an array of pointers
- * to each CPU's data can be set up for things like "check curproc on all
- * other processors"
- */
-struct globaldata {
- struct globaldata *gd_prvspace; /* Self-reference */
- struct thread *gd_curthread;
- struct thread *gd_npxthread;
- struct pcb *gd_curpcb;
- struct thread *gd_idlethread;
- struct timeval gd_switchtime;
- struct i386tss gd_common_tss;
- int gd_switchticks;
- struct segment_descriptor gd_common_tssd;
- struct segment_descriptor *gd_tss_gdt;
- int gd_currentldt;
- u_int gd_cpuid;
- u_int gd_other_cpus;
- SLIST_ENTRY(globaldata) gd_allcpu;
- struct lock_list_entry *gd_spinlocks;
-#ifdef KTR_PERCPU
- int gd_ktr_idx; /* Index into trace table */
- char *gd_ktr_buf;
- char gd_ktr_buf_data[KTR_SIZE];
-#endif
-};
-
-#endif /* _KERNEL */
-
-#endif /* ! _MACHINE_GLOBALDATA_H_ */
diff --git a/sys/i386/include/globals.h b/sys/i386/include/globals.h
deleted file mode 100644
index f0d6a65..0000000
--- a/sys/i386/include/globals.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/*-
- * Copyright (c) 1999 Luoqi Chen <luoqi@freebsd.org>
- * All rights reserved.
- * Copyright (c) 2000 Jake Burkholder <jake@freebsd.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef _MACHINE_GLOBALS_H_
-#define _MACHINE_GLOBALS_H_
-
-#ifdef _KERNEL
-
-#include <machine/globaldata.h>
-
-#ifndef __GNUC__
-#error gcc is required to use this file
-#endif
-
-/*
- * Evaluates to the byte offset of the per-cpu variable name.
- */
-#define __pcpu_offset(name) \
- __offsetof(struct globaldata, name)
-
-/*
- * Evaluates to the type of the per-cpu variable name.
- */
-#define __pcpu_type(name) \
- __typeof(((struct globaldata *)0)->name)
-
-/*
- * Evaluates to the address of the per-cpu variable name.
- */
-#define __PCPU_PTR(name) ({ \
- __pcpu_type(name) *__p; \
- \
- __asm __volatile("movl %%fs:%1,%0; addl %2,%0" \
- : "=r" (__p) \
- : "m" (*(struct globaldata *)(__pcpu_offset(gd_prvspace))), \
- "i" (__pcpu_offset(name))); \
- \
- __p; \
-})
-
-/*
- * Evaluates to the value of the per-cpu variable name.
- */
-#define __PCPU_GET(name) ({ \
- __pcpu_type(name) __result; \
- \
- if (sizeof(__result) == 1) { \
- u_char __b; \
- __asm __volatile("movb %%fs:%1,%0" \
- : "=r" (__b) \
- : "m" (*(u_char *)(__pcpu_offset(name)))); \
- __result = *(__pcpu_type(name) *)&__b; \
- } else if (sizeof(__result) == 2) { \
- u_short __w; \
- __asm __volatile("movw %%fs:%1,%0" \
- : "=r" (__w) \
- : "m" (*(u_short *)(__pcpu_offset(name)))); \
- __result = *(__pcpu_type(name) *)&__w; \
- } else if (sizeof(__result) == 4) { \
- u_int __i; \
- __asm __volatile("movl %%fs:%1,%0" \
- : "=r" (__i) \
- : "m" (*(u_int *)(__pcpu_offset(name)))); \
- __result = *(__pcpu_type(name) *)&__i; \
- } else { \
- __result = *__PCPU_PTR(name); \
- } \
- \
- __result; \
-})
-
-/*
- * Sets the value of the per-cpu variable name to value val.
- */
-#define __PCPU_SET(name, val) ({ \
- __pcpu_type(name) __val = (val); \
- \
- if (sizeof(__val) == 1) { \
- u_char __b; \
- __b = *(u_char *)&__val; \
- __asm __volatile("movb %1,%%fs:%0" \
- : "=m" (*(u_char *)(__pcpu_offset(name))) \
- : "r" (__b)); \
- } else if (sizeof(__val) == 2) { \
- u_short __w; \
- __w = *(u_short *)&__val; \
- __asm __volatile("movw %1,%%fs:%0" \
- : "=m" (*(u_short *)(__pcpu_offset(name))) \
- : "r" (__w)); \
- } else if (sizeof(__val) == 4) { \
- u_int __i; \
- __i = *(u_int *)&__val; \
- __asm __volatile("movl %1,%%fs:%0" \
- : "=m" (*(u_int *)(__pcpu_offset(name))) \
- : "r" (__i)); \
- } else { \
- *__PCPU_PTR(name) = __val; \
- } \
-})
-
-#define PCPU_GET(member) __PCPU_GET(gd_ ## member)
-#define PCPU_PTR(member) __PCPU_PTR(gd_ ## member)
-#define PCPU_SET(member, val) __PCPU_SET(gd_ ## member, val)
-
-#define GLOBALDATA PCPU_GET(prvspace)
-#define curthread PCPU_GET(curthread)
-#define CURPROC (curthread->td_proc)
-#define curproc (curthread->td_proc)
-#define curksegrp (curthread->td_ksegrp)
-#define curkse (curthread->td_kse)
-
-#endif /* _KERNEL */
-
-#endif /* !_MACHINE_GLOBALS_H_ */
diff --git a/sys/i386/include/mptable.h b/sys/i386/include/mptable.h
index 13144b9..9d86dae 100644
--- a/sys/i386/include/mptable.h
+++ b/sys/i386/include/mptable.h
@@ -71,7 +71,6 @@
#include <machine/smptests.h> /** TEST_DEFAULT_CONFIG, TEST_TEST1 */
#include <machine/tss.h>
#include <machine/specialreg.h>
-#include <machine/globaldata.h>
#include <machine/privatespace.h>
#if defined(APIC_IO)
@@ -477,9 +476,9 @@ init_secondary(void)
gdt_segs[GPRIV_SEL].ssd_base = (int) &SMP_prvspace[myid];
gdt_segs[GPROC0_SEL].ssd_base =
- (int) &SMP_prvspace[myid].globaldata.gd_common_tss;
- SMP_prvspace[myid].globaldata.gd_prvspace =
- &SMP_prvspace[myid].globaldata;
+ (int) &SMP_prvspace[myid].pcpu.pc_common_tss;
+ SMP_prvspace[myid].pcpu.pc_prvspace =
+ &SMP_prvspace[myid].pcpu;
for (x = 0; x < NGDT; x++) {
ssdtosd(&gdt_segs[x], &gdt[myid * NGDT + x].sd);
@@ -1915,7 +1914,7 @@ start_all_aps(u_int boot_addr)
int x, i, pg;
u_char mpbiosreason;
u_long mpbioswarmvec;
- struct globaldata *gd;
+ struct pcpu *pc;
char *stack;
uintptr_t kptbase;
@@ -1955,10 +1954,10 @@ start_all_aps(u_int boot_addr)
pg = x * i386_btop(sizeof(struct privatespace));
/* allocate a new private data page */
- gd = (struct globaldata *)kmem_alloc(kernel_map, PAGE_SIZE);
+ pc = (struct pcpu *)kmem_alloc(kernel_map, PAGE_SIZE);
/* wire it into the private page table page */
- SMPpt[pg] = (pt_entry_t)(PG_V | PG_RW | vtophys(gd));
+ SMPpt[pg] = (pt_entry_t)(PG_V | PG_RW | vtophys(pc));
/* allocate and set up an idle stack data page */
stack = (char *)kmem_alloc(kernel_map, KSTACK_PAGES * PAGE_SIZE); /* XXXKSE */
@@ -1967,8 +1966,7 @@ start_all_aps(u_int boot_addr)
(PG_V | PG_RW | vtophys(PAGE_SIZE * i + stack));
/* prime data page for it to use */
- gd->gd_cpuid = x;
- globaldata_register(gd);
+ pcpu_init(pc, x, sizeof(struct pcpu));
/* setup a vector to our boot code */
*((volatile u_short *) WARMBOOT_OFF) = WARMBOOT_TARGET;
diff --git a/sys/i386/include/pcpu.h b/sys/i386/include/pcpu.h
index 46c26c4..5fecb98 100644
--- a/sys/i386/include/pcpu.h
+++ b/sys/i386/include/pcpu.h
@@ -26,54 +26,122 @@
* $FreeBSD$
*/
-#ifndef _MACHINE_GLOBALDATA_H_
-#define _MACHINE_GLOBALDATA_H_
+#ifndef _MACHINE_PCPU_H_
+#define _MACHINE_PCPU_H_
#ifdef _KERNEL
+#ifndef __GNUC__
+#error gcc is required to use this file
+#endif
+
#include <machine/segments.h>
#include <machine/tss.h>
-/* XXX */
-#ifdef KTR_PERCPU
-#include <sys/ktr.h>
-#endif
-
/*
- * This structure maps out the global data that needs to be kept on a
- * per-cpu basis. genassym uses this to generate offsets for the assembler
- * code, which also provides external symbols so that C can get at them as
- * though they were really globals.
- *
* The SMP parts are setup in pmap.c and locore.s for the BSP, and
* mp_machdep.c sets up the data for the AP's to "see" when they awake.
* The reason for doing it via a struct is so that an array of pointers
* to each CPU's data can be set up for things like "check curproc on all
* other processors"
*/
-struct globaldata {
- struct globaldata *gd_prvspace; /* Self-reference */
- struct thread *gd_curthread;
- struct thread *gd_npxthread;
- struct pcb *gd_curpcb;
- struct thread *gd_idlethread;
- struct timeval gd_switchtime;
- struct i386tss gd_common_tss;
- int gd_switchticks;
- struct segment_descriptor gd_common_tssd;
- struct segment_descriptor *gd_tss_gdt;
- int gd_currentldt;
- u_int gd_cpuid;
- u_int gd_other_cpus;
- SLIST_ENTRY(globaldata) gd_allcpu;
- struct lock_list_entry *gd_spinlocks;
-#ifdef KTR_PERCPU
- int gd_ktr_idx; /* Index into trace table */
- char *gd_ktr_buf;
- char gd_ktr_buf_data[KTR_SIZE];
-#endif
-};
+#define PCPU_MD_FIELDS \
+ struct pcpu *pc_prvspace; /* Self-reference */ \
+ struct i386tss pc_common_tss; \
+ struct segment_descriptor pc_common_tssd; \
+ struct segment_descriptor *pc_tss_gdt; \
+ int pc_currentldt
+
+/*
+ * Evaluates to the byte offset of the per-cpu variable name.
+ */
+#define __pcpu_offset(name) \
+ __offsetof(struct pcpu, name)
+
+/*
+ * Evaluates to the type of the per-cpu variable name.
+ */
+#define __pcpu_type(name) \
+ __typeof(((struct pcpu *)0)->name)
+
+/*
+ * Evaluates to the address of the per-cpu variable name.
+ */
+#define __PCPU_PTR(name) ({ \
+ __pcpu_type(name) *__p; \
+ \
+ __asm __volatile("movl %%fs:%1,%0; addl %2,%0" \
+ : "=r" (__p) \
+ : "m" (*(struct pcpu *)(__pcpu_offset(pc_prvspace))), \
+ "i" (__pcpu_offset(name))); \
+ \
+ __p; \
+})
+
+/*
+ * Evaluates to the value of the per-cpu variable name.
+ */
+#define __PCPU_GET(name) ({ \
+ __pcpu_type(name) __result; \
+ \
+ if (sizeof(__result) == 1) { \
+ u_char __b; \
+ __asm __volatile("movb %%fs:%1,%0" \
+ : "=r" (__b) \
+ : "m" (*(u_char *)(__pcpu_offset(name)))); \
+ __result = *(__pcpu_type(name) *)&__b; \
+ } else if (sizeof(__result) == 2) { \
+ u_short __w; \
+ __asm __volatile("movw %%fs:%1,%0" \
+ : "=r" (__w) \
+ : "m" (*(u_short *)(__pcpu_offset(name)))); \
+ __result = *(__pcpu_type(name) *)&__w; \
+ } else if (sizeof(__result) == 4) { \
+ u_int __i; \
+ __asm __volatile("movl %%fs:%1,%0" \
+ : "=r" (__i) \
+ : "m" (*(u_int *)(__pcpu_offset(name)))); \
+ __result = *(__pcpu_type(name) *)&__i; \
+ } else { \
+ __result = *__PCPU_PTR(name); \
+ } \
+ \
+ __result; \
+})
+
+/*
+ * Sets the value of the per-cpu variable name to value val.
+ */
+#define __PCPU_SET(name, val) ({ \
+ __pcpu_type(name) __val = (val); \
+ \
+ if (sizeof(__val) == 1) { \
+ u_char __b; \
+ __b = *(u_char *)&__val; \
+ __asm __volatile("movb %1,%%fs:%0" \
+ : "=m" (*(u_char *)(__pcpu_offset(name))) \
+ : "r" (__b)); \
+ } else if (sizeof(__val) == 2) { \
+ u_short __w; \
+ __w = *(u_short *)&__val; \
+ __asm __volatile("movw %1,%%fs:%0" \
+ : "=m" (*(u_short *)(__pcpu_offset(name))) \
+ : "r" (__w)); \
+ } else if (sizeof(__val) == 4) { \
+ u_int __i; \
+ __i = *(u_int *)&__val; \
+ __asm __volatile("movl %1,%%fs:%0" \
+ : "=m" (*(u_int *)(__pcpu_offset(name))) \
+ : "r" (__i)); \
+ } else { \
+ *__PCPU_PTR(name) = __val; \
+ } \
+})
+
+#define PCPU_GET(member) __PCPU_GET(pc_ ## member)
+#define PCPU_PTR(member) __PCPU_PTR(pc_ ## member)
+#define PCPU_SET(member, val) __PCPU_SET(pc_ ## member, val)
#endif /* _KERNEL */
-#endif /* ! _MACHINE_GLOBALDATA_H_ */
+#endif /* ! _MACHINE_PCPU_H_ */
diff --git a/sys/i386/include/privatespace.h b/sys/i386/include/privatespace.h
index 83320cf..d5f2bcf 100644
--- a/sys/i386/include/privatespace.h
+++ b/sys/i386/include/privatespace.h
@@ -36,8 +36,8 @@
*/
struct privatespace {
/* page 0 - data page */
- struct globaldata globaldata;
- char __filler0[PAGE_SIZE - sizeof(struct globaldata)];
+ struct pcpu pcpu;
+ char __filler0[PAGE_SIZE - sizeof(struct pcpu)];
/* page 1 - idle stack (KSTACK_PAGES pages) */
char idlekstack[KSTACK_PAGES * PAGE_SIZE];
diff --git a/sys/i386/include/proc.h b/sys/i386/include/proc.h
index 911f6b8..5b50824 100644
--- a/sys/i386/include/proc.h
+++ b/sys/i386/include/proc.h
@@ -37,7 +37,6 @@
#ifndef _MACHINE_PROC_H_
#define _MACHINE_PROC_H_
-#include <machine/globals.h>
#include <machine/segments.h>
struct proc_ldt {
diff --git a/sys/i386/isa/npx.c b/sys/i386/isa/npx.c
index 1238d67..ff8c4cf 100644
--- a/sys/i386/isa/npx.c
+++ b/sys/i386/isa/npx.c
@@ -237,7 +237,7 @@ npx_intr(dummy)
#endif
/*
- * npxthread is normally non-null here. In that case, schedule an
+ * fpcurthread is normally non-null here. In that case, schedule an
* AST to finish the exception handling in the correct context
* (this interrupt may occur after the thread has entered the
* kernel via a syscall or an interrupt). Otherwise, the npx
@@ -248,7 +248,7 @@ npx_intr(dummy)
* that caused it and it will repeat. We will eventually (usually
* soon) win the race to handle the interrupt properly.
*/
- td = PCPU_GET(npxthread);
+ td = PCPU_GET(fpcurthread);
if (td != NULL) {
td->td_pcb->pcb_flags |= PCB_NPXTRAP;
mtx_lock_spin(&sched_lock);
@@ -513,7 +513,7 @@ npxinit(control)
/*
* fninit has the same h/w bugs as fnsave. Use the detoxified
* fnsave to throw away any junk in the fpu. npxsave() initializes
- * the fpu and sets npxthread = NULL as important side effects.
+ * the fpu and sets fpcurthread = NULL as important side effects.
*/
savecrit = critical_enter();
npxsave(&dummy);
@@ -540,7 +540,7 @@ npxexit(td)
critical_t savecrit;
savecrit = critical_enter();
- if (td == PCPU_GET(npxthread))
+ if (td == PCPU_GET(fpcurthread))
npxsave(&PCPU_GET(curpcb)->pcb_save);
critical_exit(savecrit);
#ifdef NPX_DEBUG
@@ -758,8 +758,8 @@ npxtrap()
u_long *exstat;
if (!npx_exists) {
- printf("npxtrap: npxthread = %p, curthread = %p, npx_exists = %d\n",
- PCPU_GET(npxthread), curthread, npx_exists);
+ printf("npxtrap: fpcurthread = %p, curthread = %p, npx_exists = %d\n",
+ PCPU_GET(fpcurthread), curthread, npx_exists);
panic("npxtrap from nowhere");
}
savecrit = critical_enter();
@@ -769,7 +769,7 @@ npxtrap()
* state to memory. Fetch the relevant parts of the state from
* wherever they are.
*/
- if (PCPU_GET(npxthread) != curthread) {
+ if (PCPU_GET(fpcurthread) != curthread) {
control = GET_FPU_CW(curthread);
status = GET_FPU_SW(curthread);
} else {
@@ -779,7 +779,7 @@ npxtrap()
exstat = GET_FPU_EXSW_PTR(curthread->td_pcb);
*exstat = status;
- if (PCPU_GET(npxthread) != curthread)
+ if (PCPU_GET(fpcurthread) != curthread)
GET_FPU_SW(curthread) &= ~0x80bf;
else
fnclex();
@@ -790,7 +790,7 @@ npxtrap()
/*
* Implement device not available (DNA) exception
*
- * It would be better to switch FP context here (if curthread != npxthread)
+ * It would be better to switch FP context here (if curthread != fpcurthread)
* and not necessarily for every context switch, but it is too hard to
* access foreign pcb's.
*/
@@ -802,9 +802,9 @@ npxdna()
if (!npx_exists)
return (0);
- if (PCPU_GET(npxthread) != NULL) {
- printf("npxdna: npxthread = %p, curthread = %p\n",
- PCPU_GET(npxthread), curthread);
+ if (PCPU_GET(fpcurthread) != NULL) {
+ printf("npxdna: fpcurthread = %p, curthread = %p\n",
+ PCPU_GET(fpcurthread), curthread);
panic("npxdna");
}
s = critical_enter();
@@ -812,7 +812,7 @@ npxdna()
/*
* Record new context early in case frstor causes an IRQ13.
*/
- PCPU_SET(npxthread, curthread);
+ PCPU_SET(fpcurthread, curthread);
exstat = GET_FPU_EXSW_PTR(PCPU_GET(curpcb));
*exstat = 0;
@@ -844,13 +844,13 @@ npxdna()
* after the process has entered the kernel. It may even be delivered after
* the fnsave here completes. A spurious IRQ13 for the fnsave is handled in
* the same way as a very-late-arriving non-spurious IRQ13 from user mode:
- * it is normally ignored at first because we set npxthread to NULL; it is
+ * it is normally ignored at first because we set fpcurthread to NULL; it is
* normally retriggered in npxdna() after return to user mode.
*
* npxsave() must be called with interrupts disabled, so that it clears
- * npxthread atomically with saving the state. We require callers to do the
+ * fpcurthread atomically with saving the state. We require callers to do the
* disabling, since most callers need to disable interrupts anyway to call
- * npxsave() atomically with checking npxthread.
+ * npxsave() atomically with checking fpcurthread.
*
* A previous version of npxsave() went to great lengths to excecute fnsave
* with interrupts enabled in case executing it froze the CPU. This case
@@ -866,7 +866,7 @@ npxsave(addr)
fpusave(addr);
start_emulating();
- PCPU_SET(npxthread, NULL);
+ PCPU_SET(fpcurthread, NULL);
}
static void
diff --git a/sys/ia64/ia64/db_interface.c b/sys/ia64/ia64/db_interface.c
index c1cb99a..9a254da 100644
--- a/sys/ia64/ia64/db_interface.c
+++ b/sys/ia64/ia64/db_interface.c
@@ -510,3 +510,8 @@ db_skip_breakpoint(void)
ddb_regs.tf_cr_iip += 16;
}
}
+
+void
+db_show_mdpcpu(struct pcpu *pc)
+{
+}
diff --git a/sys/ia64/ia64/exception.S b/sys/ia64/ia64/exception.S
index faac9d5..c8a86b8 100644
--- a/sys/ia64/ia64/exception.S
+++ b/sys/ia64/ia64/exception.S
@@ -34,7 +34,7 @@
* ar.k7 = curthread
* ar.k6 = ksp
* ar.k5 = kbsp
- * ar.k4 = globalp
+ * ar.k4 = pcpup
*/
/*
diff --git a/sys/ia64/ia64/exception.s b/sys/ia64/ia64/exception.s
index faac9d5..c8a86b8 100644
--- a/sys/ia64/ia64/exception.s
+++ b/sys/ia64/ia64/exception.s
@@ -34,7 +34,7 @@
* ar.k7 = curthread
* ar.k6 = ksp
* ar.k5 = kbsp
- * ar.k4 = globalp
+ * ar.k4 = pcpup
*/
/*
diff --git a/sys/ia64/ia64/genassym.c b/sys/ia64/ia64/genassym.c
index 91319b5..fbe60e5 100644
--- a/sys/ia64/ia64/genassym.c
+++ b/sys/ia64/ia64/genassym.c
@@ -63,11 +63,11 @@
#include <net/if.h>
#include <netinet/in.h>
-ASSYM(GD_CURTHREAD, offsetof(struct globaldata, gd_curthread));
-ASSYM(GD_FPCURTHREAD, offsetof(struct globaldata, gd_fpcurthread));
-ASSYM(GD_CURPCB, offsetof(struct globaldata, gd_curpcb));
-ASSYM(GD_SWITCHTIME, offsetof(struct globaldata, gd_switchtime));
-ASSYM(GD_CPUID, offsetof(struct globaldata, gd_cpuid));
+ASSYM(PC_CURTHREAD, offsetof(struct pcpu, pc_curthread));
+ASSYM(PC_FPCURTHREAD, offsetof(struct pcpu, pc_fpcurthread));
+ASSYM(PC_CURPCB, offsetof(struct pcpu, pc_curpcb));
+ASSYM(PC_SWITCHTIME, offsetof(struct pcpu, pc_switchtime));
+ASSYM(PC_CPUID, offsetof(struct pcpu, pc_cpuid));
ASSYM(MTX_LOCK, offsetof(struct mtx, mtx_lock));
ASSYM(MTX_RECURSE, offsetof(struct mtx, mtx_recurse));
diff --git a/sys/ia64/ia64/machdep.c b/sys/ia64/ia64/machdep.c
index 54660ed..8bf5bfd 100644
--- a/sys/ia64/ia64/machdep.c
+++ b/sys/ia64/ia64/machdep.c
@@ -246,6 +246,11 @@ cpu_startup(dummy)
ia64_probe_sapics();
}
+void
+cpu_pcpu_init(struct pcpu *pcpu, int cpuid, size_t size)
+{
+}
+
static void
identifycpu(void)
{
@@ -671,9 +676,9 @@ ia64_init(u_int64_t arg1, u_int64_t arg2)
{
/* This is not a 'struct user' */
size_t sz = round_page(KSTACK_PAGES * PAGE_SIZE);
- globalp = (struct globaldata *) pmap_steal_memory(sz);
- globaldata_init(globalp, 0, sz);
- ia64_set_k4((u_int64_t) globalp);
+ pcpup = (struct pcpu *) pmap_steal_memory(sz);
+ pcpu_init(pcpup, 0, sz);
+ ia64_set_k4((u_int64_t) pcpup);
PCPU_GET(next_asn) = 1; /* 0 used for proc0 pmap */
}
@@ -697,7 +702,6 @@ ia64_init(u_int64_t arg1, u_int64_t arg2)
/* Setup curproc so that mutexes work */
PCPU_SET(curthread, thread0);
- PCPU_SET(spinlocks, NULL);
LIST_INIT(&thread0->td_contested);
@@ -1383,17 +1387,6 @@ ia64_fpstate_switch(struct thread *td)
}
/*
- * Initialise a struct globaldata.
- */
-void
-globaldata_init(struct globaldata *globaldata, int cpuid, size_t sz)
-{
- bzero(globaldata, sz);
- globaldata->gd_cpuid = cpuid;
- globaldata_register(globaldata);
-}
-
-/*
* Utility functions for manipulating instruction bundles.
*/
void
diff --git a/sys/ia64/ia64/mp_machdep.c b/sys/ia64/ia64/mp_machdep.c
index aadbd7d..3fa8b2b 100644
--- a/sys/ia64/ia64/mp_machdep.c
+++ b/sys/ia64/ia64/mp_machdep.c
@@ -42,7 +42,6 @@
#include <vm/pmap.h>
#include <machine/atomic.h>
-#include <machine/globaldata.h>
#include <machine/pal.h>
#include <machine/pmap.h>
#include <machine/clock.h>
diff --git a/sys/ia64/ia64/support.S b/sys/ia64/ia64/support.S
index f14cfd8..3bd5d62 100644
--- a/sys/ia64/ia64/support.S
+++ b/sys/ia64/ia64/support.S
@@ -199,7 +199,7 @@ ENTRY(suword, 2)
(p6) br.dpnt.few fusufault
movl r14=fusufault // set up fault handler.
- add r15=GD_CURTHREAD,r13 // find curthread
+ add r15=PC_CURTHREAD,r13 // find curthread
;;
ld8 r15=[r15]
;;
@@ -227,7 +227,7 @@ ENTRY(subyte, 2)
(p6) br.dpnt.few fusufault
movl r14=fusufault // set up fault handler.
- add r15=GD_CURTHREAD,r13 // find curthread
+ add r15=PC_CURTHREAD,r13 // find curthread
;;
ld8 r15=[r15]
;;
@@ -255,7 +255,7 @@ ENTRY(fuword, 1)
(p6) br.dpnt.few fusufault
movl r14=fusufault // set up fault handler.
- add r15=GD_CURTHREAD,r13 // find curthread
+ add r15=PC_CURTHREAD,r13 // find curthread
;;
ld8 r15=[r15]
;;
@@ -282,7 +282,7 @@ ENTRY(fubyte, 1)
(p6) br.dpnt.few fusufault
movl r14=fusufault // set up fault handler.
- add r15=GD_CURTHREAD,r13 // find curthread
+ add r15=PC_CURTHREAD,r13 // find curthread
;;
ld8 r15=[r15]
;;
@@ -376,7 +376,7 @@ ENTRY(copyinstr, 4)
;;
(p6) br.cond.spnt.few copyerr // if it's not, error out.
movl r14=copyerr // set up fault handler.
- add r15=GD_CURTHREAD,r13 // find curthread
+ add r15=PC_CURTHREAD,r13 // find curthread
;;
ld8 r15=[r15]
;;
@@ -416,7 +416,7 @@ ENTRY(copyoutstr, 4)
;;
(p6) br.cond.spnt.few copyerr // if it's not, error out.
movl r14=copyerr // set up fault handler.
- add r15=GD_CURTHREAD,r13 // find curthread
+ add r15=PC_CURTHREAD,r13 // find curthread
;;
ld8 r15=[r15]
;;
@@ -536,7 +536,7 @@ ENTRY(copyin, 3)
;;
(p6) br.cond.spnt.few copyerr // if it's not, error out.
movl r14=copyerr // set up fault handler.
- add r15=GD_CURTHREAD,r13 // find curthread
+ add r15=PC_CURTHREAD,r13 // find curthread
;;
ld8 r15=[r15]
;;
@@ -576,7 +576,7 @@ ENTRY(copyout, 3)
;;
(p6) br.cond.spnt.few copyerr // if it's not, error out.
movl r14=copyerr // set up fault handler.
- add r15=GD_CURTHREAD,r13 // find curthread
+ add r15=PC_CURTHREAD,r13 // find curthread
;;
ld8 r15=[r15]
;;
@@ -602,7 +602,7 @@ END(copyout)
ENTRY(copyerr, 0)
- add r14=GD_CURTHREAD,r13 ;; // find curthread
+ add r14=PC_CURTHREAD,r13 ;; // find curthread
ld8 r14=[r14] ;;
add r14=TD_PCB,r14 ;; // curthread->td_addr
ld8 r14=[r14] ;;
diff --git a/sys/ia64/ia64/support.s b/sys/ia64/ia64/support.s
index f14cfd8..3bd5d62 100644
--- a/sys/ia64/ia64/support.s
+++ b/sys/ia64/ia64/support.s
@@ -199,7 +199,7 @@ ENTRY(suword, 2)
(p6) br.dpnt.few fusufault
movl r14=fusufault // set up fault handler.
- add r15=GD_CURTHREAD,r13 // find curthread
+ add r15=PC_CURTHREAD,r13 // find curthread
;;
ld8 r15=[r15]
;;
@@ -227,7 +227,7 @@ ENTRY(subyte, 2)
(p6) br.dpnt.few fusufault
movl r14=fusufault // set up fault handler.
- add r15=GD_CURTHREAD,r13 // find curthread
+ add r15=PC_CURTHREAD,r13 // find curthread
;;
ld8 r15=[r15]
;;
@@ -255,7 +255,7 @@ ENTRY(fuword, 1)
(p6) br.dpnt.few fusufault
movl r14=fusufault // set up fault handler.
- add r15=GD_CURTHREAD,r13 // find curthread
+ add r15=PC_CURTHREAD,r13 // find curthread
;;
ld8 r15=[r15]
;;
@@ -282,7 +282,7 @@ ENTRY(fubyte, 1)
(p6) br.dpnt.few fusufault
movl r14=fusufault // set up fault handler.
- add r15=GD_CURTHREAD,r13 // find curthread
+ add r15=PC_CURTHREAD,r13 // find curthread
;;
ld8 r15=[r15]
;;
@@ -376,7 +376,7 @@ ENTRY(copyinstr, 4)
;;
(p6) br.cond.spnt.few copyerr // if it's not, error out.
movl r14=copyerr // set up fault handler.
- add r15=GD_CURTHREAD,r13 // find curthread
+ add r15=PC_CURTHREAD,r13 // find curthread
;;
ld8 r15=[r15]
;;
@@ -416,7 +416,7 @@ ENTRY(copyoutstr, 4)
;;
(p6) br.cond.spnt.few copyerr // if it's not, error out.
movl r14=copyerr // set up fault handler.
- add r15=GD_CURTHREAD,r13 // find curthread
+ add r15=PC_CURTHREAD,r13 // find curthread
;;
ld8 r15=[r15]
;;
@@ -536,7 +536,7 @@ ENTRY(copyin, 3)
;;
(p6) br.cond.spnt.few copyerr // if it's not, error out.
movl r14=copyerr // set up fault handler.
- add r15=GD_CURTHREAD,r13 // find curthread
+ add r15=PC_CURTHREAD,r13 // find curthread
;;
ld8 r15=[r15]
;;
@@ -576,7 +576,7 @@ ENTRY(copyout, 3)
;;
(p6) br.cond.spnt.few copyerr // if it's not, error out.
movl r14=copyerr // set up fault handler.
- add r15=GD_CURTHREAD,r13 // find curthread
+ add r15=PC_CURTHREAD,r13 // find curthread
;;
ld8 r15=[r15]
;;
@@ -602,7 +602,7 @@ END(copyout)
ENTRY(copyerr, 0)
- add r14=GD_CURTHREAD,r13 ;; // find curthread
+ add r14=PC_CURTHREAD,r13 ;; // find curthread
ld8 r14=[r14] ;;
add r14=TD_PCB,r14 ;; // curthread->td_addr
ld8 r14=[r14] ;;
diff --git a/sys/ia64/ia64/swtch.s b/sys/ia64/ia64/swtch.s
index d00baca..fcbe786 100644
--- a/sys/ia64/ia64/swtch.s
+++ b/sys/ia64/ia64/swtch.s
@@ -158,7 +158,7 @@ ENTRY(restorectx, 1)
ENTRY(cpu_switch, 0)
- add r16=GD_CURTHREAD,r13 ;;
+ add r16=PC_CURTHREAD,r13 ;;
ld8 r17=[r16] ;;
add r17=TD_PCB,r17 ;;
ld8 r17=[r17]
@@ -211,7 +211,7 @@ ENTRY(cpu_switch, 0)
br.call.sptk.few rp=choosethread
- add r14=GD_CURTHREAD,r13 ;;
+ add r14=PC_CURTHREAD,r13 ;;
ld8 r15=[r14] ;;
#if 0
@@ -228,7 +228,7 @@ ENTRY(cpu_switch, 0)
#endif
1:
- st8 [r14]=ret0 // set r13->gd_curthread
+ st8 [r14]=ret0 // set r13->pc_curthread
mov ar.k7=ret0
mov r4=ret0 // save from call
;;
diff --git a/sys/ia64/include/globaldata.h b/sys/ia64/include/globaldata.h
deleted file mode 100644
index 4190c00..0000000
--- a/sys/ia64/include/globaldata.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*-
- * Copyright (c) 1999 Luoqi Chen <luoqi@freebsd.org>
- * Copyright (c) Peter Wemm <peter@netplex.com.au>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef _MACHINE_GLOBALDATA_H_
-#define _MACHINE_GLOBALDATA_H_
-
-#ifdef _KERNEL
-
-#include <sys/queue.h>
-
-/*
- * This structure maps out the global data that needs to be kept on a
- * per-cpu basis. genassym uses this to generate offsets for the assembler
- * code, which also provides external symbols so that C can get at them as
- * though they were really globals. This structure is pointed to by
- * the per-cpu system value (see alpha_pal_rdval() and alpha_pal_wrval()).
- * Inside the kernel, the globally reserved register t7 is used to
- * point at the globaldata structure.
- */
-struct globaldata {
- struct thread *gd_curthread; /* current thread */
- struct thread *gd_idlethread; /* idle thread */
- struct thread *gd_fpcurthread; /* fp state owner */
- struct pcb *gd_curpcb; /* current pcb */
- struct timeval gd_switchtime;
- int gd_switchticks;
- u_int gd_cpuid; /* this cpu number */
- u_int gd_other_cpus; /* all other cpus */
- u_int64_t gd_pending_ipis; /* pending IPI events */
- struct pmap *gd_current_pmap; /* which pmap is active */
- u_int32_t gd_next_asn; /* next ASN to allocate */
- u_int32_t gd_current_asngen; /* ASN rollover check */
-
- SLIST_ENTRY(globaldata) gd_allcpu;
- struct lock_list_entry *gd_spinlocks;
-#ifdef KTR_PERCPU
- int gd_ktr_idx; /* Index into trace table */
- char *gd_ktr_buf;
- char gd_ktr_buf_data[0];
-#endif
-};
-
-void globaldata_init(struct globaldata *pcpu, int cpuid, size_t sz);
-
-#endif /* _KERNEL */
-
-#endif /* !_MACHINE_GLOBALDATA_H_ */
diff --git a/sys/ia64/include/globals.h b/sys/ia64/include/globals.h
deleted file mode 100644
index 366d89b..0000000
--- a/sys/ia64/include/globals.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*-
- * Copyright (c) 1999 Luoqi Chen <luoqi@freebsd.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef _MACHINE_GLOBALS_H_
-#define _MACHINE_GLOBALS_H_
-
-#ifdef _KERNEL
-#include <machine/globaldata.h>
-
-register struct globaldata *globalp __asm__("r13");
-
-#define GLOBALP globalp
-
-#define PCPU_GET(member) (GLOBALP->gd_ ## member)
-#define PCPU_PTR(member) (&GLOBALP->gd_ ## member)
-#define PCPU_SET(member,value) (GLOBALP->gd_ ## member = (value))
-
-#define curthread PCPU_GET(curthread)
-#define CURPROC (curthread->td_proc)
-#define curproc (curthread->td_proc)
-#define curksegrp (curthread->td_ksegrp)
-#define curkse (curthread->td_kse)
-
-#endif /* _KERNEL */
-
-#endif /* !_MACHINE_GLOBALS_H_ */
diff --git a/sys/ia64/include/mutex.h b/sys/ia64/include/mutex.h
index 6581d70..b14d7ae 100644
--- a/sys/ia64/include/mutex.h
+++ b/sys/ia64/include/mutex.h
@@ -49,7 +49,7 @@
*/
#define MTX_ENTER(lck, rPSR, rOLD, rNEW, rLCK) \
mov rPSR=psr ; \
- mov rNEW=globalp ; \
+ mov rNEW=pcpup ; \
addl rLCK=@ltoff(lck),gp ;; \
ld8 rLCK=[rLCK] ;; \
add rLCK=MTX_LOCK,rLCK ;; \
diff --git a/sys/ia64/include/pcpu.h b/sys/ia64/include/pcpu.h
index 4190c00..0c6111d 100644
--- a/sys/ia64/include/pcpu.h
+++ b/sys/ia64/include/pcpu.h
@@ -27,47 +27,25 @@
* $FreeBSD$
*/
-#ifndef _MACHINE_GLOBALDATA_H_
-#define _MACHINE_GLOBALDATA_H_
+#ifndef _MACHINE_PCPU_H_
+#define _MACHINE_PCPU_H_
#ifdef _KERNEL
-#include <sys/queue.h>
+#define PCPU_MD_FIELDS \
+ u_int64_t pc_pending_ipis; /* pending IPIs */ \
+ struct pmap *pc_current_pmap; /* active pmap */ \
+ u_int32_t pc_next_asn; /* next ASN to alloc */ \
+ u_int32_t pc_current_asngen /* ASN rollover check */
-/*
- * This structure maps out the global data that needs to be kept on a
- * per-cpu basis. genassym uses this to generate offsets for the assembler
- * code, which also provides external symbols so that C can get at them as
- * though they were really globals. This structure is pointed to by
- * the per-cpu system value (see alpha_pal_rdval() and alpha_pal_wrval()).
- * Inside the kernel, the globally reserved register t7 is used to
- * point at the globaldata structure.
- */
-struct globaldata {
- struct thread *gd_curthread; /* current thread */
- struct thread *gd_idlethread; /* idle thread */
- struct thread *gd_fpcurthread; /* fp state owner */
- struct pcb *gd_curpcb; /* current pcb */
- struct timeval gd_switchtime;
- int gd_switchticks;
- u_int gd_cpuid; /* this cpu number */
- u_int gd_other_cpus; /* all other cpus */
- u_int64_t gd_pending_ipis; /* pending IPI events */
- struct pmap *gd_current_pmap; /* which pmap is active */
- u_int32_t gd_next_asn; /* next ASN to allocate */
- u_int32_t gd_current_asngen; /* ASN rollover check */
+struct pcpu;
- SLIST_ENTRY(globaldata) gd_allcpu;
- struct lock_list_entry *gd_spinlocks;
-#ifdef KTR_PERCPU
- int gd_ktr_idx; /* Index into trace table */
- char *gd_ktr_buf;
- char gd_ktr_buf_data[0];
-#endif
-};
+register struct pcpu *pcpup __asm__("r13");
-void globaldata_init(struct globaldata *pcpu, int cpuid, size_t sz);
+#define PCPU_GET(member) (pcpup->pc_ ## member)
+#define PCPU_PTR(member) (&pcpup->pc_ ## member)
+#define PCPU_SET(member,value) (pcpup->pc_ ## member = (value))
#endif /* _KERNEL */
-#endif /* !_MACHINE_GLOBALDATA_H_ */
+#endif /* !_MACHINE_PCPU_H_ */
diff --git a/sys/ia64/include/proc.h b/sys/ia64/include/proc.h
index a9b6bfe..c9ae251 100644
--- a/sys/ia64/include/proc.h
+++ b/sys/ia64/include/proc.h
@@ -31,9 +31,6 @@
#ifndef _MACHINE_PROC_H_
#define _MACHINE_PROC_H_
-#include <machine/globaldata.h>
-#include <machine/globals.h>
-
/*
* Machine-dependent part of the proc struct for the Alpha.
*/
diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c
index 438f2f9..39ab3a0 100644
--- a/sys/kern/init_main.c
+++ b/sys/kern/init_main.c
@@ -68,7 +68,6 @@
#include <sys/conf.h>
#include <machine/cpu.h>
-#include <machine/globals.h>
#include <vm/vm.h>
#include <vm/vm_param.h>
diff --git a/sys/kern/kern_idle.c b/sys/kern/kern_idle.c
index b37e27a..92e5cb3 100644
--- a/sys/kern/kern_idle.c
+++ b/sys/kern/kern_idle.c
@@ -37,18 +37,18 @@ static void
idle_setup(void *dummy)
{
#ifdef SMP
- struct globaldata *gd;
+ struct pcpu *pc;
#endif
struct proc *p;
int error;
#ifdef SMP
- SLIST_FOREACH(gd, &cpuhead, gd_allcpu) {
+ SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
error = kthread_create(idle_proc, NULL, &p,
- RFSTOPPED | RFHIGHPID, "idle: cpu%d", gd->gd_cpuid);
- gd->gd_idlethread = &p->p_thread;
- if (gd->gd_curthread == NULL)
- gd->gd_curthread = gd->gd_idlethread;
+ RFSTOPPED | RFHIGHPID, "idle: cpu%d", pc->pc_cpuid);
+ pc->pc_idlethread = &p->p_thread;
+ if (pc->pc_curthread == NULL)
+ pc->pc_curthread = pc->pc_idlethread;
#else
error = kthread_create(idle_proc, NULL, &p,
RFSTOPPED | RFHIGHPID, "idle");
diff --git a/sys/kern/kern_ktr.c b/sys/kern/kern_ktr.c
index 5c8407c..6badb3d 100644
--- a/sys/kern/kern_ktr.c
+++ b/sys/kern/kern_ktr.c
@@ -42,10 +42,10 @@
#include <sys/kernel.h>
#include <sys/ktr.h>
#include <sys/libkern.h>
+#include <sys/pcpu.h>
#include <sys/sysctl.h>
#include <sys/systm.h>
#include <sys/time.h>
-#include <machine/globals.h>
#include <machine/stdarg.h>
#include <ddb/ddb.h>
diff --git a/sys/kern/subr_pcpu.c b/sys/kern/subr_pcpu.c
index 10a0d98..8db9e1f 100644
--- a/sys/kern/subr_pcpu.c
+++ b/sys/kern/subr_pcpu.c
@@ -44,32 +44,100 @@
* sole CPU as 0.
*/
+#include "opt_ddb.h"
+
#include <sys/param.h>
#include <sys/systm.h>
+#include <sys/linker_set.h>
+#include <sys/lock.h>
#include <sys/pcpu.h>
+#include <sys/proc.h>
+#include <ddb/ddb.h>
-static struct globaldata *cpuid_to_globaldata[MAXCPU];
+static struct pcpu *cpuid_to_pcpu[MAXCPU];
struct cpuhead cpuhead = SLIST_HEAD_INITIALIZER(cpuhead);
/*
- * Register a struct globaldata.
+ * Initialize the MI portions of a struct pcpu.
+ */
+void
+pcpu_init(struct pcpu *pcpu, int cpuid, size_t size)
+{
+
+ bzero(pcpu, size);
+ KASSERT(cpuid >= 0 && cpuid < MAXCPU,
+ ("pcpu_init: invalid cpuid %d", cpuid));
+ pcpu->pc_cpuid = cpuid;
+ cpuid_to_pcpu[cpuid] = pcpu;
+ SLIST_INSERT_HEAD(&cpuhead, pcpu, pc_allcpu);
+ cpu_pcpu_init(pcpu, cpuid, size);
+}
+
+/*
+ * Destroy a struct pcpu.
*/
void
-globaldata_register(struct globaldata *globaldata)
+pcpu_destroy(struct pcpu *pcpu)
{
- KASSERT(globaldata->gd_cpuid >= 0 && globaldata->gd_cpuid < MAXCPU,
- ("globaldata_register: invalid cpuid"));
- cpuid_to_globaldata[globaldata->gd_cpuid] = globaldata;
- SLIST_INSERT_HEAD(&cpuhead, globaldata, gd_allcpu);
+ SLIST_REMOVE(&cpuhead, pcpu, pcpu, pc_allcpu);
+ cpuid_to_pcpu[pcpu->pc_cpuid] = NULL;
}
/*
- * Locate a struct globaldata by cpu id.
+ * Locate a struct pcpu by cpu id.
*/
-struct globaldata *
-globaldata_find(u_int cpuid)
+struct pcpu *
+pcpu_find(u_int cpuid)
+{
+
+ return (cpuid_to_pcpu[cpuid]);
+}
+
+#ifdef DDB
+DB_SHOW_COMMAND(pcpu, db_show_pcpu)
{
+ struct pcpu *pc;
+ struct thread *td;
+ int id;
- return (cpuid_to_globaldata[cpuid]);
+ if (have_addr)
+ id = ((addr >> 4) % 16) * 10 + (addr % 16);
+ else
+ id = PCPU_GET(cpuid);
+ pc = pcpu_find(id);
+ if (pc == NULL) {
+ db_printf("CPU %d not found\n", id);
+ return;
+ }
+ db_printf("cpuid = %d\n", pc->pc_cpuid);
+ db_printf("curthread = ");
+ td = pc->pc_curthread;
+ if (td != NULL)
+ db_printf("%p: pid %d \"%s\"\n", td, td->td_proc->p_pid,
+ td->td_proc->p_comm);
+ else
+ db_printf("none\n");
+ db_printf("curpcb = %p\n", pc->pc_curpcb);
+ db_printf("fpcurthread = ");
+ td = pc->pc_fpcurthread;
+ if (td != NULL)
+ db_printf("%p: pid %d \"%s\"\n", td, td->td_proc->p_pid,
+ td->td_proc->p_comm);
+ else
+ db_printf("none\n");
+ db_printf("idlethread = ");
+ td = pc->pc_idlethread;
+ if (td != NULL)
+ db_printf("%p: pid %d \"%s\"\n", td, td->td_proc->p_pid,
+ td->td_proc->p_comm);
+ else
+ db_printf("none\n");
+ db_show_mdpcpu(pc);
+
+#ifdef WITNESS
+ db_printf("spin locks held:\n");
+ witness_list_locks(&pc->pc_spinlocks);
+#endif
}
+#endif
diff --git a/sys/kern/subr_smp.c b/sys/kern/subr_smp.c
index 03c6612..6b55133 100644
--- a/sys/kern/subr_smp.c
+++ b/sys/kern/subr_smp.c
@@ -132,7 +132,7 @@ forward_signal(struct thread *td)
void
forward_roundrobin(void)
{
- struct globaldata *gd;
+ struct pcpu *pc;
struct thread *td;
u_int id, map;
@@ -145,11 +145,11 @@ forward_roundrobin(void)
if (!forward_roundrobin_enabled)
return;
map = 0;
- SLIST_FOREACH(gd, &cpuhead, gd_allcpu) {
- td = gd->gd_curthread;
- id = gd->gd_cpuid;
+ SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
+ td = pc->pc_curthread;
+ id = pc->pc_cpuid;
if (id != PCPU_GET(cpuid) && (id & stopped_cpus) == 0 &&
- td != gd->gd_idlethread) {
+ td != pc->pc_idlethread) {
td->td_kse->ke_flags |= KEF_NEEDRESCHED;
map |= id;
}
diff --git a/sys/pc98/i386/machdep.c b/sys/pc98/i386/machdep.c
index 6c05881..f1775ad 100644
--- a/sys/pc98/i386/machdep.c
+++ b/sys/pc98/i386/machdep.c
@@ -104,7 +104,6 @@
#include <machine/pc/bios.h>
#include <machine/pcb_ext.h> /* pcb.h included via sys/user.h */
#include <machine/proc.h>
-#include <machine/globals.h>
#ifdef PERFMON
#include <machine/perfmon.h>
#endif
@@ -220,7 +219,7 @@ struct kva_md_info kmi;
static struct trapframe proc0_tf;
#ifndef SMP
-static struct globaldata __globaldata;
+static struct pcpu __pcpu;
#endif
struct mtx sched_lock;
@@ -275,7 +274,7 @@ cpu_startup(dummy)
bufinit();
vm_pager_bufferinit();
- globaldata_register(GLOBALDATA);
+ pcpu_init(GLOBALDATA, 0, sizeof(struct pcpu));
#ifndef SMP
/* For SMP, we delay the cpu_setregs() until after SMP startup. */
cpu_setregs();
@@ -1774,15 +1773,15 @@ init386(first)
atop(sizeof(struct privatespace) - 1);
gdt_segs[GPRIV_SEL].ssd_base = (int) &SMP_prvspace[0];
gdt_segs[GPROC0_SEL].ssd_base =
- (int) &SMP_prvspace[0].globaldata.gd_common_tss;
- SMP_prvspace[0].globaldata.gd_prvspace = &SMP_prvspace[0].globaldata;
+ (int) &SMP_prvspace[0].pcpu.pc_common_tss;
+ SMP_prvspace[0].pcpu.pc_prvspace = &SMP_prvspace[0].pcpu;
#else
gdt_segs[GPRIV_SEL].ssd_limit =
- atop(sizeof(struct globaldata) - 1);
- gdt_segs[GPRIV_SEL].ssd_base = (int) &__globaldata;
+ atop(sizeof(struct pcpu) - 1);
+ gdt_segs[GPRIV_SEL].ssd_base = (int) &__pcpu;
gdt_segs[GPROC0_SEL].ssd_base =
- (int) &__globaldata.gd_common_tss;
- __globaldata.gd_prvspace = &__globaldata;
+ (int) &__pcpu.pc_common_tss;
+ __pcpu.pc_prvspace = &__pcpu;
#endif
for (x = 0; x < NGDT; x++) {
diff --git a/sys/pc98/pc98/machdep.c b/sys/pc98/pc98/machdep.c
index 6c05881..f1775ad 100644
--- a/sys/pc98/pc98/machdep.c
+++ b/sys/pc98/pc98/machdep.c
@@ -104,7 +104,6 @@
#include <machine/pc/bios.h>
#include <machine/pcb_ext.h> /* pcb.h included via sys/user.h */
#include <machine/proc.h>
-#include <machine/globals.h>
#ifdef PERFMON
#include <machine/perfmon.h>
#endif
@@ -220,7 +219,7 @@ struct kva_md_info kmi;
static struct trapframe proc0_tf;
#ifndef SMP
-static struct globaldata __globaldata;
+static struct pcpu __pcpu;
#endif
struct mtx sched_lock;
@@ -275,7 +274,7 @@ cpu_startup(dummy)
bufinit();
vm_pager_bufferinit();
- globaldata_register(GLOBALDATA);
+ pcpu_init(GLOBALDATA, 0, sizeof(struct pcpu));
#ifndef SMP
/* For SMP, we delay the cpu_setregs() until after SMP startup. */
cpu_setregs();
@@ -1774,15 +1773,15 @@ init386(first)
atop(sizeof(struct privatespace) - 1);
gdt_segs[GPRIV_SEL].ssd_base = (int) &SMP_prvspace[0];
gdt_segs[GPROC0_SEL].ssd_base =
- (int) &SMP_prvspace[0].globaldata.gd_common_tss;
- SMP_prvspace[0].globaldata.gd_prvspace = &SMP_prvspace[0].globaldata;
+ (int) &SMP_prvspace[0].pcpu.pc_common_tss;
+ SMP_prvspace[0].pcpu.pc_prvspace = &SMP_prvspace[0].pcpu;
#else
gdt_segs[GPRIV_SEL].ssd_limit =
- atop(sizeof(struct globaldata) - 1);
- gdt_segs[GPRIV_SEL].ssd_base = (int) &__globaldata;
+ atop(sizeof(struct pcpu) - 1);
+ gdt_segs[GPRIV_SEL].ssd_base = (int) &__pcpu;
gdt_segs[GPROC0_SEL].ssd_base =
- (int) &__globaldata.gd_common_tss;
- __globaldata.gd_prvspace = &__globaldata;
+ (int) &__pcpu.pc_common_tss;
+ __pcpu.pc_prvspace = &__pcpu;
#endif
for (x = 0; x < NGDT; x++) {
diff --git a/sys/powerpc/aim/locore.S b/sys/powerpc/aim/locore.S
index 24571b6..43e5e79 100644
--- a/sys/powerpc/aim/locore.S
+++ b/sys/powerpc/aim/locore.S
@@ -424,7 +424,7 @@ trapcode:
mtcr 31
bc 4,17,1f /* branch if PSL_PR is clear */
mfsprg 1,0
- lwz 1,GD_CURPCB(1)
+ lwz 1,PC_CURPCB(1)
addi 1,1,USPACE /* stack is top of user struct */
1:
bla s_trap
@@ -447,7 +447,7 @@ alitrap:
mtcr 31
bc 4,17,1f /* branch if PSL_PR is clear */
mfsprg 1,0
- lwz 1,GD_CURPCB(1)
+ lwz 1,PC_CURPCB(1)
addi 1,1,USPACE /* stack is top of user struct */
1:
bla s_trap
@@ -913,7 +913,7 @@ realtrap:
overwritten) */
bc 4,17,s_trap /* branch if PSL_PR is false */
mfsprg 1,0
- lwz 1,GD_CURPCB(1)
+ lwz 1,PC_CURPCB(1)
addi 1,1,USPACE /* stack is top of user struct */
/*
@@ -1109,8 +1109,8 @@ intr_exit:
/* Returning to user mode? */
mtcr 6 /* saved SRR1 */
bc 4,17,1f /* branch if PSL_PR is false */
- mfsprg 3,0 /* get globaldata */
- lwz 3,GD_CURPCB(3) /* get curpcb from globaldata */
+ mfsprg 3,0 /* get pcpu */
+ lwz 3,PC_CURPCB(3) /* get curpcb from pcpu */
lwz 3,PCB_PMR(3) /* get pmap real address from curpcb */
mtsr KERNEL_SR,3
/* Setup for entry to realtrap: */
@@ -1330,7 +1330,7 @@ setfault:
mflr 0
mfcr 12
mfsprg 4,0
- lwz 4,GD_CURPCB(4)
+ lwz 4,PC_CURPCB(4)
stw 3,PCB_ONFAULT(4)
stw 0,0(3)
stw 1,4(3)
diff --git a/sys/powerpc/aim/machdep.c b/sys/powerpc/aim/machdep.c
index b564f0e..f185cc5 100644
--- a/sys/powerpc/aim/machdep.c
+++ b/sys/powerpc/aim/machdep.c
@@ -101,7 +101,6 @@ static const char rcsid[] =
#include <machine/md_var.h>
#include <machine/reg.h>
#include <machine/fpu.h>
-#include <machine/globaldata.h>
#include <machine/vmparam.h>
#include <machine/elf.h>
#include <machine/trap.h>
@@ -352,7 +351,7 @@ powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, char *args)
{
unsigned int exc, scratch;
struct mem_region *allmem, *availmem, *mp;
- struct globaldata *globalp;
+ struct pcpu *pcpup;
/*
* Set up BAT0 to only map the lowest 256 MB area
@@ -426,14 +425,14 @@ powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, char *args)
thread0->td_pcb = (struct pcb *)
(thread0->td_kstack + KSTACK_PAGES * PAGE_SIZE) - 1;
- globalp = pmap_steal_memory(round_page(sizeof(struct globaldata)));
+ pcpup = pmap_steal_memory(round_page(sizeof(struct pcpu)));
/*
* XXX: Pass 0 as CPU id. This is bad. We need to work out
* XXX: which CPU we are somehow.
*/
- globaldata_init(globalp, 0, sizeof(struct globaldata));
- __asm ("mtsprg 0, %0" :: "r"(globalp));
+ pcpu_init(pcpup, 0, sizeof(struct pcpu));
+ __asm ("mtsprg 0, %0" :: "r"(pcpup));
/* Init basic tunables, hz etc */
init_param1();
@@ -442,7 +441,6 @@ powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, char *args)
/* setup curproc so the mutexes work */
PCPU_SET(curthread, thread0);
- PCPU_SET(spinlocks, NULL);
LIST_INIT(&thread0->td_contested);
@@ -457,14 +455,13 @@ powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, char *args)
mtx_init(&Giant, "Giant", MTX_DEF | MTX_RECURSE);
mtx_init(&sched_lock, "sched lock", MTX_SPIN | MTX_RECURSE);
mtx_init(&proc0.p_mtx, "process lock", MTX_DEF);
+ mtx_lock(&Giant);
/*
* Initialise console.
*/
cninit();
- mtx_lock(&Giant);
-
#ifdef __notyet__ /* Needs some rethinking regarding real/virtual OFW */
OF_set_callback(callback);
#endif
@@ -908,16 +905,13 @@ ptrace_clear_single_step(struct thread *td)
}
/*
- * Initialise a struct globaldata.
+ * Initialise a struct pcpu.
*/
void
-globaldata_init(struct globaldata *globaldata, int cpuid, size_t sz)
-{
+cpu_pcpu_init(struct pcpu *pcpu, int cpuid, size_t sz)
+{
- bzero(globaldata, sz);
- globaldata->gd_cpuid = cpuid;
- globaldata->gd_next_asn = 0;
- globaldata->gd_current_asngen = 1;
+ pcpu->pc_current_asngen = 1;
}
void
diff --git a/sys/powerpc/aim/swtch.S b/sys/powerpc/aim/swtch.S
index c800264..3b5b1cd 100644
--- a/sys/powerpc/aim/swtch.S
+++ b/sys/powerpc/aim/swtch.S
@@ -72,8 +72,8 @@
*/
ENTRY(cpu_switch)
mflr %r30
- mfsprg %r3,%r0 /* Get the globaldata pointer */
- lwz %r4,GD_CURTHREAD(%r3) /* Get the current thread */
+ mfsprg %r3,%r0 /* Get the pcpu pointer */
+ lwz %r4,PC_CURTHREAD(%r3) /* Get the current thread */
lwz %r3,TD_PCB(%r4) /* Get a pointer to the PCB */
stmw %r14,PCB_CONTEXT(%r3) /* Save the non-volatile GP regs */
@@ -95,8 +95,8 @@ ENTRY(cpu_switch)
bl pmap_activate /* Activate the new address space */
mtlr %r30
- mfsprg %r4,%r0 /* Get the globaldata pointer */
- stw %r14,GD_CURTHREAD(%r4) /* Store new current thread */
+ mfsprg %r4,%r0 /* Get the pcpu pointer */
+ stw %r14,PC_CURTHREAD(%r4) /* Store new current thread */
lwz %r4,TD_PCB(%r14) /* Grab the new PCB */
lwz %r29, PCB_FLAGS(%r4) /* Restore FPU regs if needed */
diff --git a/sys/powerpc/include/cpufunc.h b/sys/powerpc/include/cpufunc.h
index c2f9332..0fd0dd0 100644
--- a/sys/powerpc/include/cpufunc.h
+++ b/sys/powerpc/include/cpufunc.h
@@ -141,10 +141,10 @@ powerpc_mb(void)
__asm __volatile("eieio; sync" : : : "memory");
}
-static __inline struct globaldata *
-powerpc_get_globalp(void)
+static __inline struct pcpu *
+powerpc_get_pcpup(void)
{
- struct globaldata *ret;
+ struct pcpu *ret;
__asm ("mfsprg %0, 0" : "=r"(ret));
diff --git a/sys/powerpc/include/globaldata.h b/sys/powerpc/include/globaldata.h
deleted file mode 100644
index aa00cc3..0000000
--- a/sys/powerpc/include/globaldata.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*-
- * Copyright (c) 1999 Luoqi Chen <luoqi@freebsd.org>
- * Copyright (c) Peter Wemm <peter@netplex.com.au>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef _MACHINE_GLOBALDATA_H_
-#define _MACHINE_GLOBALDATA_H_
-
-#ifdef _KERNEL
-
-#include <sys/queue.h>
-
-/*
- * This structure maps out the global data that needs to be kept on a
- * per-cpu basis. genassym uses this to generate offsets for the assembler
- * code, which also provides external symbols so that C can get at them as
- * though they were really globals. This structure is pointed to by
- * the per-cpu system value (see alpha_pal_rdval() and alpha_pal_wrval()).
- * Inside the kernel, the globally reserved register t7 is used to
- * point at the globaldata structure.
- */
-struct globaldata {
- struct thread *gd_curthread; /* current thread */
- struct thread *gd_idlethread; /* idle thread */
- struct thread *gd_fpcurthread; /* fp state owner */
- struct pcb *gd_curpcb; /* current pcb */
- struct timeval gd_switchtime;
- int gd_switchticks;
- u_int gd_cpuid; /* this cpu number */
- u_int gd_other_cpus; /* all other cpus */
- int gd_inside_intr;
- u_int32_t gd_next_asn; /* next ASN to allocate */
- u_int32_t gd_current_asngen; /* ASN rollover check */
-
- SLIST_ENTRY(globaldata) gd_allcpu;
- struct lock_list_entry *gd_spinlocks;
-#ifdef KTR_PERCPU
- int gd_ktr_idx; /* Index into trace table */
- char *gd_ktr_buf;
- char gd_ktr_buf_data[KTR_SIZE];
-#endif
-};
-
-void globaldata_init(struct globaldata *pcpu, int cpuid, size_t sz);
-
-#endif /* _KERNEL */
-
-#endif /* !_MACHINE_GLOBALDATA_H_ */
diff --git a/sys/powerpc/include/globals.h b/sys/powerpc/include/globals.h
deleted file mode 100644
index 4dfefd9..0000000
--- a/sys/powerpc/include/globals.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*-
- * Copyright (c) 1999 Luoqi Chen <luoqi@freebsd.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef _MACHINE_GLOBALS_H_
-#define _MACHINE_GLOBALS_H_
-
-#ifdef _KERNEL
-#include <machine/cpufunc.h>
-#include <machine/globaldata.h>
-
-#define GLOBALP ((struct globaldata *) powerpc_get_globalp())
-
-#define PCPU_GET(member) (GLOBALP->gd_ ## member)
-#define PCPU_PTR(member) (&GLOBALP->gd_ ## member)
-#define PCPU_SET(member,value) (GLOBALP->gd_ ## member = (value))
-
-#define curthread PCPU_GET(curthread)
-#define CURPROC (curthread->td_proc)
-#define curproc (curthread->td_proc)
-#define curksegrp (curthread->td_ksegrp)
-#define curkse (curthread->td_kse)
-
-#endif /* _KERNEL */
-
-#endif /* !_MACHINE_GLOBALS_H_ */
diff --git a/sys/powerpc/include/mutex.h b/sys/powerpc/include/mutex.h
index 5038f42..0aeaa74 100644
--- a/sys/powerpc/include/mutex.h
+++ b/sys/powerpc/include/mutex.h
@@ -60,7 +60,7 @@
lwarx r0, r11, lck; \ /* load current lock value */
cmplwi r0, r1, MTX_UNOWNED; \ /* compare with unowned */
beq 1; \ /* if owned, loop */
- lwz r0, PC_CURPROC(globalp); \ /* load curproc */
+ lwz r0, PC_CURPROC(pcpup); \ /* load curproc */
stwcx. r0, r11, lck; \ /* attempt to store */
beq 1; \ /* loop if failed */
sync; \ /* sync */
diff --git a/sys/powerpc/include/pcpu.h b/sys/powerpc/include/pcpu.h
index aa00cc3..4d37de4 100644
--- a/sys/powerpc/include/pcpu.h
+++ b/sys/powerpc/include/pcpu.h
@@ -27,46 +27,23 @@
* $FreeBSD$
*/
-#ifndef _MACHINE_GLOBALDATA_H_
-#define _MACHINE_GLOBALDATA_H_
+#ifndef _MACHINE_PCPU_H_
+#define _MACHINE_PCPU_H_
#ifdef _KERNEL
+#include <machine/cpufunc.h>
-#include <sys/queue.h>
+#define PCPU_MD_FIELDS \
+ int pc_inside_intr; \
+ u_int32_t pc_next_asn; /* next ASN to alloc */ \
+ u_int32_t pc_current_asngen /* ASN rollover check */
-/*
- * This structure maps out the global data that needs to be kept on a
- * per-cpu basis. genassym uses this to generate offsets for the assembler
- * code, which also provides external symbols so that C can get at them as
- * though they were really globals. This structure is pointed to by
- * the per-cpu system value (see alpha_pal_rdval() and alpha_pal_wrval()).
- * Inside the kernel, the globally reserved register t7 is used to
- * point at the globaldata structure.
- */
-struct globaldata {
- struct thread *gd_curthread; /* current thread */
- struct thread *gd_idlethread; /* idle thread */
- struct thread *gd_fpcurthread; /* fp state owner */
- struct pcb *gd_curpcb; /* current pcb */
- struct timeval gd_switchtime;
- int gd_switchticks;
- u_int gd_cpuid; /* this cpu number */
- u_int gd_other_cpus; /* all other cpus */
- int gd_inside_intr;
- u_int32_t gd_next_asn; /* next ASN to allocate */
- u_int32_t gd_current_asngen; /* ASN rollover check */
-
- SLIST_ENTRY(globaldata) gd_allcpu;
- struct lock_list_entry *gd_spinlocks;
-#ifdef KTR_PERCPU
- int gd_ktr_idx; /* Index into trace table */
- char *gd_ktr_buf;
- char gd_ktr_buf_data[KTR_SIZE];
-#endif
-};
+#define PCPUP ((struct pcpu *) powerpc_get_pcpup())
-void globaldata_init(struct globaldata *pcpu, int cpuid, size_t sz);
+#define PCPU_GET(member) (PCPUP->pc_ ## member)
+#define PCPU_PTR(member) (&PCPUP->pc_ ## member)
+#define PCPU_SET(member,value) (PCPUP->pc_ ## member = (value))
#endif /* _KERNEL */
-#endif /* !_MACHINE_GLOBALDATA_H_ */
+#endif /* !_MACHINE_PCPU_H_ */
diff --git a/sys/powerpc/include/proc.h b/sys/powerpc/include/proc.h
index eb2e255..82aa068 100644
--- a/sys/powerpc/include/proc.h
+++ b/sys/powerpc/include/proc.h
@@ -35,8 +35,6 @@
#ifndef _MACHINE_PROC_H_
#define _MACHINE_PROC_H_
-#include <machine/globals.h>
-
/*
* Machine-dependent part of the proc structure
*/
diff --git a/sys/powerpc/powerpc/genassym.c b/sys/powerpc/powerpc/genassym.c
index 0b031c1..7ab6e77 100644
--- a/sys/powerpc/powerpc/genassym.c
+++ b/sys/powerpc/powerpc/genassym.c
@@ -60,9 +60,9 @@
#include <machine/pcb.h>
#include <machine/pmap.h>
-ASSYM(GD_CURTHREAD, offsetof(struct globaldata, gd_curthread));
-ASSYM(GD_CURPCB, offsetof(struct globaldata, gd_curpcb));
-ASSYM(GD_SWITCHTIME, offsetof(struct globaldata, gd_switchtime));
+ASSYM(PC_CURTHREAD, offsetof(struct pcpu, pc_curthread));
+ASSYM(PC_CURPCB, offsetof(struct pcpu, pc_curpcb));
+ASSYM(PC_SWITCHTIME, offsetof(struct pcpu, pc_switchtime));
ASSYM(MTX_LOCK, offsetof(struct mtx, mtx_lock));
ASSYM(MTX_RECURSECNT, offsetof(struct mtx, mtx_recurse));
diff --git a/sys/powerpc/powerpc/locore.S b/sys/powerpc/powerpc/locore.S
index 24571b6..43e5e79 100644
--- a/sys/powerpc/powerpc/locore.S
+++ b/sys/powerpc/powerpc/locore.S
@@ -424,7 +424,7 @@ trapcode:
mtcr 31
bc 4,17,1f /* branch if PSL_PR is clear */
mfsprg 1,0
- lwz 1,GD_CURPCB(1)
+ lwz 1,PC_CURPCB(1)
addi 1,1,USPACE /* stack is top of user struct */
1:
bla s_trap
@@ -447,7 +447,7 @@ alitrap:
mtcr 31
bc 4,17,1f /* branch if PSL_PR is clear */
mfsprg 1,0
- lwz 1,GD_CURPCB(1)
+ lwz 1,PC_CURPCB(1)
addi 1,1,USPACE /* stack is top of user struct */
1:
bla s_trap
@@ -913,7 +913,7 @@ realtrap:
overwritten) */
bc 4,17,s_trap /* branch if PSL_PR is false */
mfsprg 1,0
- lwz 1,GD_CURPCB(1)
+ lwz 1,PC_CURPCB(1)
addi 1,1,USPACE /* stack is top of user struct */
/*
@@ -1109,8 +1109,8 @@ intr_exit:
/* Returning to user mode? */
mtcr 6 /* saved SRR1 */
bc 4,17,1f /* branch if PSL_PR is false */
- mfsprg 3,0 /* get globaldata */
- lwz 3,GD_CURPCB(3) /* get curpcb from globaldata */
+ mfsprg 3,0 /* get pcpu */
+ lwz 3,PC_CURPCB(3) /* get curpcb from pcpu */
lwz 3,PCB_PMR(3) /* get pmap real address from curpcb */
mtsr KERNEL_SR,3
/* Setup for entry to realtrap: */
@@ -1330,7 +1330,7 @@ setfault:
mflr 0
mfcr 12
mfsprg 4,0
- lwz 4,GD_CURPCB(4)
+ lwz 4,PC_CURPCB(4)
stw 3,PCB_ONFAULT(4)
stw 0,0(3)
stw 1,4(3)
diff --git a/sys/powerpc/powerpc/locore.s b/sys/powerpc/powerpc/locore.s
index 24571b6..43e5e79 100644
--- a/sys/powerpc/powerpc/locore.s
+++ b/sys/powerpc/powerpc/locore.s
@@ -424,7 +424,7 @@ trapcode:
mtcr 31
bc 4,17,1f /* branch if PSL_PR is clear */
mfsprg 1,0
- lwz 1,GD_CURPCB(1)
+ lwz 1,PC_CURPCB(1)
addi 1,1,USPACE /* stack is top of user struct */
1:
bla s_trap
@@ -447,7 +447,7 @@ alitrap:
mtcr 31
bc 4,17,1f /* branch if PSL_PR is clear */
mfsprg 1,0
- lwz 1,GD_CURPCB(1)
+ lwz 1,PC_CURPCB(1)
addi 1,1,USPACE /* stack is top of user struct */
1:
bla s_trap
@@ -913,7 +913,7 @@ realtrap:
overwritten) */
bc 4,17,s_trap /* branch if PSL_PR is false */
mfsprg 1,0
- lwz 1,GD_CURPCB(1)
+ lwz 1,PC_CURPCB(1)
addi 1,1,USPACE /* stack is top of user struct */
/*
@@ -1109,8 +1109,8 @@ intr_exit:
/* Returning to user mode? */
mtcr 6 /* saved SRR1 */
bc 4,17,1f /* branch if PSL_PR is false */
- mfsprg 3,0 /* get globaldata */
- lwz 3,GD_CURPCB(3) /* get curpcb from globaldata */
+ mfsprg 3,0 /* get pcpu */
+ lwz 3,PC_CURPCB(3) /* get curpcb from pcpu */
lwz 3,PCB_PMR(3) /* get pmap real address from curpcb */
mtsr KERNEL_SR,3
/* Setup for entry to realtrap: */
@@ -1330,7 +1330,7 @@ setfault:
mflr 0
mfcr 12
mfsprg 4,0
- lwz 4,GD_CURPCB(4)
+ lwz 4,PC_CURPCB(4)
stw 3,PCB_ONFAULT(4)
stw 0,0(3)
stw 1,4(3)
diff --git a/sys/powerpc/powerpc/machdep.c b/sys/powerpc/powerpc/machdep.c
index b564f0e..f185cc5 100644
--- a/sys/powerpc/powerpc/machdep.c
+++ b/sys/powerpc/powerpc/machdep.c
@@ -101,7 +101,6 @@ static const char rcsid[] =
#include <machine/md_var.h>
#include <machine/reg.h>
#include <machine/fpu.h>
-#include <machine/globaldata.h>
#include <machine/vmparam.h>
#include <machine/elf.h>
#include <machine/trap.h>
@@ -352,7 +351,7 @@ powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, char *args)
{
unsigned int exc, scratch;
struct mem_region *allmem, *availmem, *mp;
- struct globaldata *globalp;
+ struct pcpu *pcpup;
/*
* Set up BAT0 to only map the lowest 256 MB area
@@ -426,14 +425,14 @@ powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, char *args)
thread0->td_pcb = (struct pcb *)
(thread0->td_kstack + KSTACK_PAGES * PAGE_SIZE) - 1;
- globalp = pmap_steal_memory(round_page(sizeof(struct globaldata)));
+ pcpup = pmap_steal_memory(round_page(sizeof(struct pcpu)));
/*
* XXX: Pass 0 as CPU id. This is bad. We need to work out
* XXX: which CPU we are somehow.
*/
- globaldata_init(globalp, 0, sizeof(struct globaldata));
- __asm ("mtsprg 0, %0" :: "r"(globalp));
+ pcpu_init(pcpup, 0, sizeof(struct pcpu));
+ __asm ("mtsprg 0, %0" :: "r"(pcpup));
/* Init basic tunables, hz etc */
init_param1();
@@ -442,7 +441,6 @@ powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, char *args)
/* setup curproc so the mutexes work */
PCPU_SET(curthread, thread0);
- PCPU_SET(spinlocks, NULL);
LIST_INIT(&thread0->td_contested);
@@ -457,14 +455,13 @@ powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, char *args)
mtx_init(&Giant, "Giant", MTX_DEF | MTX_RECURSE);
mtx_init(&sched_lock, "sched lock", MTX_SPIN | MTX_RECURSE);
mtx_init(&proc0.p_mtx, "process lock", MTX_DEF);
+ mtx_lock(&Giant);
/*
* Initialise console.
*/
cninit();
- mtx_lock(&Giant);
-
#ifdef __notyet__ /* Needs some rethinking regarding real/virtual OFW */
OF_set_callback(callback);
#endif
@@ -908,16 +905,13 @@ ptrace_clear_single_step(struct thread *td)
}
/*
- * Initialise a struct globaldata.
+ * Initialise a struct pcpu.
*/
void
-globaldata_init(struct globaldata *globaldata, int cpuid, size_t sz)
-{
+cpu_pcpu_init(struct pcpu *pcpu, int cpuid, size_t sz)
+{
- bzero(globaldata, sz);
- globaldata->gd_cpuid = cpuid;
- globaldata->gd_next_asn = 0;
- globaldata->gd_current_asngen = 1;
+ pcpu->pc_current_asngen = 1;
}
void
diff --git a/sys/powerpc/powerpc/swtch.S b/sys/powerpc/powerpc/swtch.S
index c800264..3b5b1cd 100644
--- a/sys/powerpc/powerpc/swtch.S
+++ b/sys/powerpc/powerpc/swtch.S
@@ -72,8 +72,8 @@
*/
ENTRY(cpu_switch)
mflr %r30
- mfsprg %r3,%r0 /* Get the globaldata pointer */
- lwz %r4,GD_CURTHREAD(%r3) /* Get the current thread */
+ mfsprg %r3,%r0 /* Get the pcpu pointer */
+ lwz %r4,PC_CURTHREAD(%r3) /* Get the current thread */
lwz %r3,TD_PCB(%r4) /* Get a pointer to the PCB */
stmw %r14,PCB_CONTEXT(%r3) /* Save the non-volatile GP regs */
@@ -95,8 +95,8 @@ ENTRY(cpu_switch)
bl pmap_activate /* Activate the new address space */
mtlr %r30
- mfsprg %r4,%r0 /* Get the globaldata pointer */
- stw %r14,GD_CURTHREAD(%r4) /* Store new current thread */
+ mfsprg %r4,%r0 /* Get the pcpu pointer */
+ stw %r14,PC_CURTHREAD(%r4) /* Store new current thread */
lwz %r4,TD_PCB(%r14) /* Grab the new PCB */
lwz %r29, PCB_FLAGS(%r4) /* Restore FPU regs if needed */
diff --git a/sys/powerpc/powerpc/swtch.s b/sys/powerpc/powerpc/swtch.s
index c800264..3b5b1cd 100644
--- a/sys/powerpc/powerpc/swtch.s
+++ b/sys/powerpc/powerpc/swtch.s
@@ -72,8 +72,8 @@
*/
ENTRY(cpu_switch)
mflr %r30
- mfsprg %r3,%r0 /* Get the globaldata pointer */
- lwz %r4,GD_CURTHREAD(%r3) /* Get the current thread */
+ mfsprg %r3,%r0 /* Get the pcpu pointer */
+ lwz %r4,PC_CURTHREAD(%r3) /* Get the current thread */
lwz %r3,TD_PCB(%r4) /* Get a pointer to the PCB */
stmw %r14,PCB_CONTEXT(%r3) /* Save the non-volatile GP regs */
@@ -95,8 +95,8 @@ ENTRY(cpu_switch)
bl pmap_activate /* Activate the new address space */
mtlr %r30
- mfsprg %r4,%r0 /* Get the globaldata pointer */
- stw %r14,GD_CURTHREAD(%r4) /* Store new current thread */
+ mfsprg %r4,%r0 /* Get the pcpu pointer */
+ stw %r14,PC_CURTHREAD(%r4) /* Store new current thread */
lwz %r4,TD_PCB(%r14) /* Grab the new PCB */
lwz %r29, PCB_FLAGS(%r4) /* Restore FPU regs if needed */
diff --git a/sys/sparc64/include/asmacros.h b/sys/sparc64/include/asmacros.h
index 5deabf7..98459e7 100644
--- a/sys/sparc64/include/asmacros.h
+++ b/sys/sparc64/include/asmacros.h
@@ -36,8 +36,8 @@
.register %g6,#ignore
.register %g7,#ignore
-#define PCPU(member) %g7 + GD_ ## member
-#define PCPU_ADDR(member, reg) add %g7, GD_ ## member, reg
+#define PCPU(member) %g7 + PC_ ## member
+#define PCPU_ADDR(member, reg) add %g7, PC_ ## member, reg
#define DEBUGGER() ta %xcc, 1
diff --git a/sys/sparc64/include/globaldata.h b/sys/sparc64/include/globaldata.h
deleted file mode 100644
index 4871502..0000000
--- a/sys/sparc64/include/globaldata.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*-
- * Copyright (c) 1999 Luoqi Chen <luoqi@freebsd.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * from: FreeBSD: src/sys/i386/include/globaldata.h,v 1.27 2001/04/27
- * $FreeBSD$
- */
-
-#ifndef _MACHINE_GLOBALDATA_H_
-#define _MACHINE_GLOBALDATA_H_
-
-#ifdef _KERNEL
-
-#include <sys/queue.h>
-
-#include <machine/frame.h>
-#include <machine/intr_machdep.h>
-
-#define ALT_STACK_SIZE 128
-
-/*
- * This structure maps out the global data that needs to be kept on a
- * per-cpu basis. genassym uses this to generate offsets for the assembler
- * code, which also provides external symbols so that C can get at them as
- * though they were really globals. This structure is pointed to by
- * the per-cpu system value.
- * Inside the kernel, the globally reserved register g7 is used to
- * point at the globaldata structure.
- */
-struct globaldata {
- struct thread *gd_curthread; /* current thread */
- struct thread *gd_idlethread; /* idle thread */
- struct pcb *gd_curpcb; /* current pcb */
- struct timeval gd_switchtime;
- int gd_switchticks;
- u_int gd_cpuid; /* this cpu number */
- u_int gd_other_cpus; /* all other cpus */
- SLIST_ENTRY(globaldata) gd_allcpu;
- struct lock_list_entry *gd_spinlocks;
-
- struct intr_queue gd_iq; /* interrupt queuq */
- u_long gd_alt_stack[ALT_STACK_SIZE]; /* alternate global stack */
- u_int gd_wp_insn; /* watch point support */
- u_long gd_wp_pstate;
- u_long gd_wp_va;
- int gd_wp_mask;
-
-#ifdef KTR_PERCPU
- int gd_ktr_idx; /* index into trace table */
- char *gd_ktr_buf;
- char gd_ktr_buf_data[0];
-#endif
-};
-
-#endif /* _KERNEL */
-
-#endif /* !_MACHINE_GLOBALDATA_H_ */
diff --git a/sys/sparc64/include/globals.h b/sys/sparc64/include/globals.h
deleted file mode 100644
index 951d1e2..0000000
--- a/sys/sparc64/include/globals.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*-
- * Copyright (c) 1999 Luoqi Chen <luoqi@freebsd.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef _MACHINE_GLOBALS_H_
-#define _MACHINE_GLOBALS_H_
-
-#ifdef _KERNEL
-#include <machine/globaldata.h>
-
-register struct globaldata *globalp __asm__("%g7");
-
-#define GLOBALP globalp
-
-#define PCPU_GET(member) (GLOBALP->gd_ ## member)
-#define PCPU_PTR(member) (&GLOBALP->gd_ ## member)
-#define PCPU_SET(member,value) (GLOBALP->gd_ ## member = (value))
-
-#define curthread PCPU_GET(curthread)
-#define CURPROC (curthread->td_proc)
-#define curproc (curthread->td_proc)
-#define curksegrp (curthread->td_ksegrp)
-#define curkse (curthread->td_kse)
-
-#endif /* _KERNEL */
-
-#endif /* !_MACHINE_GLOBALS_H_ */
diff --git a/sys/sparc64/include/pcpu.h b/sys/sparc64/include/pcpu.h
index 4871502..6024fe0 100644
--- a/sys/sparc64/include/pcpu.h
+++ b/sys/sparc64/include/pcpu.h
@@ -27,52 +27,36 @@
* $FreeBSD$
*/
-#ifndef _MACHINE_GLOBALDATA_H_
-#define _MACHINE_GLOBALDATA_H_
+#ifndef _MACHINE_PCPU_H_
+#define _MACHINE_PCPU_H_
#ifdef _KERNEL
-#include <sys/queue.h>
-
#include <machine/frame.h>
#include <machine/intr_machdep.h>
#define ALT_STACK_SIZE 128
/*
- * This structure maps out the global data that needs to be kept on a
- * per-cpu basis. genassym uses this to generate offsets for the assembler
- * code, which also provides external symbols so that C can get at them as
- * though they were really globals. This structure is pointed to by
- * the per-cpu system value.
* Inside the kernel, the globally reserved register g7 is used to
* point at the globaldata structure.
*/
-struct globaldata {
- struct thread *gd_curthread; /* current thread */
- struct thread *gd_idlethread; /* idle thread */
- struct pcb *gd_curpcb; /* current pcb */
- struct timeval gd_switchtime;
- int gd_switchticks;
- u_int gd_cpuid; /* this cpu number */
- u_int gd_other_cpus; /* all other cpus */
- SLIST_ENTRY(globaldata) gd_allcpu;
- struct lock_list_entry *gd_spinlocks;
+#define PCPU_MD_FIELDS \
+ struct intr_queue pc_iq; /* interrupt queuq */ \
+ u_long pc_alt_stack[ALT_STACK_SIZE]; /* alt global stack */ \
+ u_int pc_wp_insn; /* watch point support */ \
+ u_long pc_wp_pstate; \
+ u_long pc_wp_va; \
+ int pc_wp_mask
+
+struct pcpu;
- struct intr_queue gd_iq; /* interrupt queuq */
- u_long gd_alt_stack[ALT_STACK_SIZE]; /* alternate global stack */
- u_int gd_wp_insn; /* watch point support */
- u_long gd_wp_pstate;
- u_long gd_wp_va;
- int gd_wp_mask;
+register struct pcpu *pcpup __asm__("%g7");
-#ifdef KTR_PERCPU
- int gd_ktr_idx; /* index into trace table */
- char *gd_ktr_buf;
- char gd_ktr_buf_data[0];
-#endif
-};
+#define PCPU_GET(member) (pcpup->pc_ ## member)
+#define PCPU_PTR(member) (&pcpup->pc_ ## member)
+#define PCPU_SET(member,value) (pcpup->pc_ ## member = (value))
#endif /* _KERNEL */
-#endif /* !_MACHINE_GLOBALDATA_H_ */
+#endif /* !_MACHINE_PCPU_H_ */
diff --git a/sys/sparc64/include/proc.h b/sys/sparc64/include/proc.h
index 84ada25..e40f9e8 100644
--- a/sys/sparc64/include/proc.h
+++ b/sys/sparc64/include/proc.h
@@ -38,7 +38,6 @@
#ifndef _MACHINE_PROC_H_
#define _MACHINE_PROC_H_
-#include <machine/globals.h>
#include <machine/tte.h>
struct mdthread {
diff --git a/sys/sparc64/sparc64/db_interface.c b/sys/sparc64/sparc64/db_interface.c
index 7d7344b..d031f99 100644
--- a/sys/sparc64/sparc64/db_interface.c
+++ b/sys/sparc64/sparc64/db_interface.c
@@ -103,6 +103,11 @@ db_write_bytes(vm_offset_t addr, size_t size, char *data)
db_nofault = NULL;
}
+void
+db_show_mdpcpu(struct pcpu *pc)
+{
+}
+
DB_COMMAND(reboot, db_reboot)
{
cpu_reset();
diff --git a/sys/sparc64/sparc64/exception.S b/sys/sparc64/sparc64/exception.S
index 00749a3..7ec4082 100644
--- a/sys/sparc64/sparc64/exception.S
+++ b/sys/sparc64/sparc64/exception.S
@@ -1754,7 +1754,7 @@ tl1_breakpoint:
* NOTE: We must be very careful setting up the per-cpu pointer. We know that
* it has been pre-set in alternate globals, so we read it from there and setup
* the normal %g7 *before* enabling interrupts. This avoids any possibility
- * of cpu migration and using the wrong globalp.
+ * of cpu migration and using the wrong pcpup.
*/
ENTRY(tl0_trap)
/*
@@ -2097,7 +2097,7 @@ END(tl0_ret)
* the outs don't need to be saved.
*
* NOTE: See comments above tl0_trap for song and dance about chip bugs and
- * setting up globalp.
+ * setting up pcpup.
*/
ENTRY(tl1_trap)
sub %sp, TF_SIZEOF, %sp
diff --git a/sys/sparc64/sparc64/exception.s b/sys/sparc64/sparc64/exception.s
index 00749a3..7ec4082 100644
--- a/sys/sparc64/sparc64/exception.s
+++ b/sys/sparc64/sparc64/exception.s
@@ -1754,7 +1754,7 @@ tl1_breakpoint:
* NOTE: We must be very careful setting up the per-cpu pointer. We know that
* it has been pre-set in alternate globals, so we read it from there and setup
* the normal %g7 *before* enabling interrupts. This avoids any possibility
- * of cpu migration and using the wrong globalp.
+ * of cpu migration and using the wrong pcpup.
*/
ENTRY(tl0_trap)
/*
@@ -2097,7 +2097,7 @@ END(tl0_ret)
* the outs don't need to be saved.
*
* NOTE: See comments above tl0_trap for song and dance about chip bugs and
- * setting up globalp.
+ * setting up pcpup.
*/
ENTRY(tl1_trap)
sub %sp, TF_SIZEOF, %sp
diff --git a/sys/sparc64/sparc64/genassym.c b/sys/sparc64/sparc64/genassym.c
index 6e94da9..d7872c3 100644
--- a/sys/sparc64/sparc64/genassym.c
+++ b/sys/sparc64/sparc64/genassym.c
@@ -49,7 +49,6 @@
#include <machine/fp.h>
#include <machine/frame.h>
#include <machine/fsr.h>
-#include <machine/globals.h>
#include <machine/intr_machdep.h>
#include <machine/pcb.h>
#include <machine/pstate.h>
@@ -129,9 +128,9 @@ ASSYM(TT_CTX_SHIFT, TT_CTX_SHIFT);
ASSYM(V_INTR, offsetof(struct vmmeter, v_intr));
-ASSYM(GD_CURTHREAD, offsetof(struct globaldata, gd_curthread));
-ASSYM(GD_CURPCB, offsetof(struct globaldata, gd_curpcb));
-ASSYM(GD_CPUID, offsetof(struct globaldata, gd_cpuid));
+ASSYM(PC_CURTHREAD, offsetof(struct pcpu, pc_curthread));
+ASSYM(PC_CURPCB, offsetof(struct pcpu, pc_curpcb));
+ASSYM(PC_CPUID, offsetof(struct pcpu, pc_cpuid));
ASSYM(IH_SHIFT, IH_SHIFT);
ASSYM(IH_FUNC, offsetof(struct intr_handler, ih_func));
diff --git a/sys/sparc64/sparc64/intr_machdep.c b/sys/sparc64/sparc64/intr_machdep.c
index 8f2c07c..3b39f9a 100644
--- a/sys/sparc64/sparc64/intr_machdep.c
+++ b/sys/sparc64/sparc64/intr_machdep.c
@@ -75,7 +75,6 @@
#include <sys/vmmeter.h>
#include <machine/frame.h>
-#include <machine/globals.h>
#include <machine/intr_machdep.h>
#define MAX_STRAY_LOG 5
diff --git a/sys/sparc64/sparc64/machdep.c b/sys/sparc64/sparc64/machdep.c
index 88ce9a0..8b26b7f 100644
--- a/sys/sparc64/sparc64/machdep.c
+++ b/sys/sparc64/sparc64/machdep.c
@@ -118,7 +118,7 @@ u_long debug_mask;
struct mtx Giant;
struct mtx sched_lock;
-static struct globaldata __globaldata;
+static struct pcpu __pcpu;
/*
* This needs not be aligned as the other user areas, provided that process 0
* does not have an fp state (which it doesn't normally).
@@ -177,8 +177,6 @@ cpu_startup(void *arg)
bufinit();
vm_pager_bufferinit();
- globaldata_register(globalp);
-
intr_init();
tick_start(clock, tick_hardclock);
@@ -186,6 +184,11 @@ cpu_startup(void *arg)
SHUTDOWN_PRI_LAST);
}
+void
+cpu_pcpu_init(struct pcpu *pcpu, int cpuid, size_t size)
+{
+}
+
unsigned
tick_get_timecount(struct timecounter *tc)
{
@@ -305,12 +308,12 @@ sparc64_init(caddr_t mdp, ofw_vec_t *vec)
/*
* Initialize the per-cpu pointer so we can set curproc.
*/
- globalp = &__globaldata;
+ pcpup = &__pcpu;
/*
- * Put the globaldata pointer in the alternate and interrupt %g7 also.
- * globaldata is tied to %g7. We could therefore also use assignments to
- * globaldata here.
+ * Put the pcpu pointer in the alternate and interrupt %g7 also.
+ * pcpu is tied to %g7. We could therefore also use assignments to
+ * pcpu here.
* The alternate %g6 additionally points to a small per-cpu stack that
* is used to temporarily store global registers in special spill
* handlers.
@@ -318,19 +321,19 @@ sparc64_init(caddr_t mdp, ofw_vec_t *vec)
ps = rdpr(pstate);
wrpr(pstate, ps, PSTATE_AG);
__asm __volatile("mov %0, %%g6" : : "r"
- (&__globaldata.gd_alt_stack[ALT_STACK_SIZE - 1]));
- __asm __volatile("mov %0, %%g7" : : "r" (&__globaldata));
+ (&__pcpu.pc_alt_stack[ALT_STACK_SIZE - 1]));
+ __asm __volatile("mov %0, %%g7" : : "r" (&__pcpu));
wrpr(pstate, ps, PSTATE_IG);
- __asm __volatile("mov %0, %%g6" : : "r" (&__globaldata.gd_iq));
+ __asm __volatile("mov %0, %%g6" : : "r" (&__pcpu.pc_iq));
__asm __volatile("mov %0, %%g7" : : "r" (&intr_vectors));
wrpr(pstate, ps, 0);
/*
* Initialize curproc so that mutexes work.
*/
+ pcpu_init(pcpup, 0, sizeof(struct pcpu));
PCPU_SET(curthread, thread0);
PCPU_SET(curpcb, thread0->td_pcb);
- PCPU_SET(spinlocks, NULL);
/*
* Initialize mutexes.
diff --git a/sys/sys/mutex.h b/sys/sys/mutex.h
index f7b873d..d581973 100644
--- a/sys/sys/mutex.h
+++ b/sys/sys/mutex.h
@@ -38,9 +38,9 @@
#include <sys/_mutex.h>
#ifdef _KERNEL
+#include <sys/pcpu.h>
#include <machine/atomic.h>
#include <machine/cpufunc.h>
-#include <machine/globals.h>
#endif /* _KERNEL_ */
#endif /* !LOCORE */
diff --git a/sys/sys/pcpu.h b/sys/sys/pcpu.h
index 5f56e01..a4f9f43 100644
--- a/sys/sys/pcpu.h
+++ b/sys/sys/pcpu.h
@@ -34,16 +34,59 @@
#define _SYS_PCPU_H_
#ifdef _KERNEL
-#include <machine/globaldata.h>
+#include <sys/queue.h>
+#include <machine/pcpu.h>
#ifndef LOCORE
-SLIST_HEAD(cpuhead, globaldata);
+struct pcb;
+struct thread;
+
+/*
+ * This structure maps out the global data that needs to be kept on a
+ * per-cpu basis. The members are accessed via the PCPU_GET/SET/PTR
+ * macros defined in <machine/pcpu.h>.
+ */
+struct pcpu {
+ struct thread *pc_curthread; /* Current thread */
+ struct thread *pc_idlethread; /* Idle thread */
+ struct thread *pc_fpcurthread; /* Fp state owner */
+ struct pcb *pc_curpcb; /* Current pcb */
+ struct timeval pc_switchtime;
+ int pc_switchticks;
+ u_int pc_cpuid; /* This cpu number */
+ u_int pc_other_cpus; /* All other cpus */
+ SLIST_ENTRY(pcpu) pc_allcpu;
+ struct lock_list_entry *pc_spinlocks;
+#ifdef KTR_PERCPU
+ int pc_ktr_idx; /* Index into trace table */
+ char *pc_ktr_buf;
+#endif
+ PCPU_MD_FIELDS;
+};
+
+SLIST_HEAD(cpuhead, pcpu);
extern struct cpuhead cpuhead;
-void globaldata_register(struct globaldata *gd);
-struct globaldata *globaldata_find(u_int cpuid);
+#define curthread PCPU_GET(curthread)
+#define CURPROC (curthread->td_proc)
+#define curproc (curthread->td_proc)
+#define curksegrp (curthread->td_ksegrp)
+#define curkse (curthread->td_kse)
+
+/*
+ * Machine dependent callouts. cpu_pcpu_init() is responsible for
+ * initializing machine dependent fields of struct pcpu, and
+ * db_show_mdpcpu() is responsible for handling machine dependent
+ * fields for the DDB 'show pcpu' command.
+ */
+void cpu_pcpu_init(struct pcpu *pcpu, int cpuid, size_t size);
+void db_show_mdpcpu(struct pcpu *pcpu);
+
+void pcpu_destroy(struct pcpu *pcpu);
+struct pcpu *pcpu_find(u_int cpuid);
+void pcpu_init(struct pcpu *pcpu, int cpuid, size_t size);
#endif /* !LOCORE */
#endif /* _KERNEL */
diff --git a/sys/sys/proc.h b/sys/sys/proc.h
index b8c3a59..48ba369 100644
--- a/sys/sys/proc.h
+++ b/sys/sys/proc.h
@@ -52,6 +52,8 @@
#include <sys/signal.h>
#ifndef _KERNEL
#include <sys/time.h> /* For structs itimerval, timeval. */
+#else
+#include <sys/pcpu.h>
#endif
#include <sys/ucred.h>
#include <machine/proc.h> /* Machine-dependent proc substruct. */
OpenPOWER on IntegriCloud