TESTED: As per previous commit --- i386/i386/cswitch.S | 2 +- i386/i386/i386asm.sym | 1 + i386/i386/locore.S | 2 +- i386/i386/pcb.c | 2 +- i386/i386/percpu.h | 2 +- kern/ipc_sched.c | 2 +- kern/machine.c | 2 +- kern/sched_prim.c | 2 +- kern/startup.c | 2 +- kern/thread.c | 3 +-- kern/thread.h | 3 +-- kern/timer.c | 4 ++-- 12 files changed, 13 insertions(+), 14 deletions(-)
diff --git a/i386/i386/cswitch.S b/i386/i386/cswitch.S index d97093ff..598e32cf 100644 --- a/i386/i386/cswitch.S +++ b/i386/i386/cswitch.S @@ -79,7 +79,7 @@ ENTRY(Switch_context) lea KERNEL_STACK_SIZE-IKS_SIZE-IEL_SIZE(%ecx),%ebx /* point to stack top */ - movl %esi,CX(EXT(active_threads),%edx) /* new thread is active */ + movl %esi,MY(ACTIVE_THREAD) /* new thread is active */ movl %ecx,CX(EXT(active_stacks),%edx) /* set current stack */ movl %ebx,CX(EXT(kernel_stack),%edx) /* set stack top */ diff --git a/i386/i386/i386asm.sym b/i386/i386/i386asm.sym index d96b8be8..d4b05fa8 100644 --- a/i386/i386/i386asm.sym +++ b/i386/i386/i386asm.sym @@ -54,6 +54,7 @@ expr CALL_PMAP_UPDATE offset ApicLocalUnit lu apic_id APIC_ID offset percpu pc cpu_id PERCPU_CPU_ID +offset percpu pc active_thread PERCPU_ACTIVE_THREAD offset pcb pcb iss diff --git a/i386/i386/locore.S b/i386/i386/locore.S index 870db785..0e3dc1b3 100644 --- a/i386/i386/locore.S +++ b/i386/i386/locore.S @@ -1082,7 +1082,7 @@ syscall_entry_2: * Check for MACH or emulated system call */ syscall_entry_3: - movl CX(EXT(active_threads),%edx),%edx + movl MY(ACTIVE_THREAD),%edx /* point to current thread */ movl TH_TASK(%edx),%edx /* point to task */ movl TASK_EMUL(%edx),%edx /* get emulation vector */ diff --git a/i386/i386/pcb.c b/i386/i386/pcb.c index e0f4f57a..9576c147 100644 --- a/i386/i386/pcb.c +++ b/i386/i386/pcb.c @@ -316,7 +316,7 @@ void stack_handoff( stack = current_stack(); old->kernel_stack = 0; new->kernel_stack = stack; - active_threads[mycpu] = new; + percpu_assign(active_thread, new); /* * Switch exception link to point to new diff --git a/i386/i386/percpu.h b/i386/i386/percpu.h index fb42f9fb..cf9b96bd 100644 --- a/i386/i386/percpu.h +++ b/i386/i386/percpu.h @@ -63,10 +63,10 @@ struct percpu { int apic_id; int cpu_id; struct processor processor; + thread_t active_thread; /* struct machine_slot machine_slot; struct mp_desc_table mp_desc_table; - thread_t active_thread; vm_offset_t active_stack; vm_offset_t int_stack_top; vm_offset_t int_stack_base; diff --git a/kern/ipc_sched.c b/kern/ipc_sched.c index be82971b..4519c654 100644 --- a/kern/ipc_sched.c +++ b/kern/ipc_sched.c @@ -233,7 +233,7 @@ thread_handoff( /* * stack_handoff is machine-dependent. It does the * machine-dependent components of a context-switch, like - * changing address spaces. It updates active_threads. + * changing address spaces. It updates active_thread. */ stack_handoff(old, new); diff --git a/kern/machine.c b/kern/machine.c index 0aa0f3c6..87fbc4d1 100644 --- a/kern/machine.c +++ b/kern/machine.c @@ -635,7 +635,7 @@ void processor_doshutdown(processor_t processor) */ PMAP_DEACTIVATE_KERNEL(cpu); #ifndef MIGRATING_THREADS - active_threads[cpu] = THREAD_NULL; + percpu_array[cpu].active_thread = THREAD_NULL; #endif cpu_down(cpu); thread_wakeup((event_t)processor); diff --git a/kern/sched_prim.c b/kern/sched_prim.c index 6617db7c..5ee0521a 100644 --- a/kern/sched_prim.c +++ b/kern/sched_prim.c @@ -806,7 +806,7 @@ boolean_t thread_invoke( /* * switch_context is machine-dependent. It does the * machine-dependent components of a context-switch, like - * changing address spaces. It updates active_threads. + * changing address spaces. It updates active_thread. * It returns only if a continuation is not supplied. */ counter(c_thread_invoke_csw++); diff --git a/kern/startup.c b/kern/startup.c index 88608c7d..13acb850 100644 --- a/kern/startup.c +++ b/kern/startup.c @@ -300,7 +300,7 @@ void cpu_launch_first_thread(thread_t th) PMAP_ACTIVATE_KERNEL(mycpu); - active_threads[mycpu] = th; + percpu_assign(active_thread, th); active_stacks[mycpu] = th->kernel_stack; thread_lock(th); th->state &= ~TH_UNINT; diff --git a/kern/thread.c b/kern/thread.c index 9bbe8342..c397de84 100644 --- a/kern/thread.c +++ b/kern/thread.c @@ -69,7 +69,6 @@ #include <machine/pcb.h> #include <machine/thread.h> /* for MACHINE_STACK */ -thread_t active_threads[NCPUS]; vm_offset_t active_stacks[NCPUS]; struct kmem_cache thread_cache; @@ -2572,7 +2571,7 @@ kern_return_t processor_set_stack_usage( stack = thread->kernel_stack; for (cpu = 0; cpu < smp_get_numcpus(); cpu++) - if (active_threads[cpu] == thread) { + if (percpu_array[cpu].active_thread == thread) { stack = active_stacks[cpu]; break; } diff --git a/kern/thread.h b/kern/thread.h index 8547464d..ff91fddb 100644 --- a/kern/thread.h +++ b/kern/thread.h @@ -268,7 +268,6 @@ typedef mach_port_t *thread_array_t; #endif /* _KERN_KERN_TYPES_H_ */ -extern thread_t active_threads[NCPUS]; /* active threads */ extern vm_offset_t active_stacks[NCPUS]; /* active kernel stacks */ #ifdef KERNEL @@ -414,7 +413,7 @@ extern void thread_unfreeze( * designate this by defining CURRENT_THREAD. */ #ifndef CURRENT_THREAD -#define current_thread() (active_threads[cpu_number()]) +#define current_thread() (percpu_get(thread_t, active_thread)) #endif /* CURRENT_THREAD */ #define current_stack() (active_stacks[cpu_number()]) diff --git a/kern/timer.c b/kern/timer.c index 7d029b7c..13dfc207 100644 --- a/kern/timer.c +++ b/kern/timer.c @@ -132,7 +132,7 @@ time_trap_uentry(unsigned ts) /* * Record new timer. */ - mytimer = &(active_threads[mycpu]->system_timer); + mytimer = &(current_thread()->system_timer); current_timer[mycpu] = mytimer; mytimer->tstamp = ts; } @@ -170,7 +170,7 @@ time_trap_uexit(int ts) timer_normalize(mytimer); /* SYSTEMMODE */ } - mytimer = &(active_threads[mycpu]->user_timer); + mytimer = &(current_thread()->user_timer); /* * Record new timer. -- 2.40.1