aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2023-09-25 00:24:25 +0000
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2023-09-25 10:21:29 +0200
commitb3921098e2807d6225d277986bc8063b6a271e88 (patch)
tree93aa20fdb9f5ef3055069dd913afd0ad09d4ca23
parentbe0abe4c2361f2c7db5a52b0900e298083fefe40 (diff)
downloadgnumach-b3921098e2807d6225d277986bc8063b6a271e88.tar.gz
gnumach-b3921098e2807d6225d277986bc8063b6a271e88.tar.bz2
gnumach-b3921098e2807d6225d277986bc8063b6a271e88.zip
percpu: active_stack with gs
Message-Id: <20230925002417.467022-1-damien@zamaudio.com>
-rw-r--r--i386/i386/cswitch.S12
-rw-r--r--i386/i386/i386asm.sym1
-rw-r--r--i386/i386/locore.S2
-rw-r--r--i386/i386/percpu.h2
-rw-r--r--kern/startup.c2
-rw-r--r--kern/thread.c4
-rw-r--r--kern/thread.h5
-rw-r--r--x86_64/cswitch.S10
-rw-r--r--x86_64/locore.S2
9 files changed, 17 insertions, 23 deletions
diff --git a/i386/i386/cswitch.S b/i386/i386/cswitch.S
index 598e32cf..2dee309b 100644
--- a/i386/i386/cswitch.S
+++ b/i386/i386/cswitch.S
@@ -41,7 +41,7 @@ ENTRY(Load_context)
lea KERNEL_STACK_SIZE-IKS_SIZE-IEL_SIZE(%ecx),%edx
/* point to stack top */
CPU_NUMBER(%eax)
- movl %ecx,CX(EXT(active_stacks),%eax) /* store stack address */
+ movl %ecx,MY(ACTIVE_STACK) /* store stack address */
movl %edx,CX(EXT(kernel_stack),%eax) /* store stack top */
movl KSS_ESP(%ecx),%esp /* switch stacks */
@@ -58,8 +58,7 @@ ENTRY(Load_context)
*/
ENTRY(Switch_context)
- CPU_NUMBER(%edx)
- movl CX(EXT(active_stacks),%edx),%ecx /* get old kernel stack */
+ movl MY(ACTIVE_STACK),%ecx /* get old kernel stack */
movl %ebx,KSS_EBX(%ecx) /* save registers */
movl %ebp,KSS_EBP(%ecx)
@@ -79,8 +78,9 @@ ENTRY(Switch_context)
lea KERNEL_STACK_SIZE-IKS_SIZE-IEL_SIZE(%ecx),%ebx
/* point to stack top */
+ CPU_NUMBER(%edx)
movl %esi,MY(ACTIVE_THREAD) /* new thread is active */
- movl %ecx,CX(EXT(active_stacks),%edx) /* set current stack */
+ movl %ecx,MY(ACTIVE_STACK) /* set current stack */
movl %ebx,CX(EXT(kernel_stack),%edx) /* set stack top */
movl KSS_ESP(%ecx),%esp /* switch stacks */
@@ -110,8 +110,7 @@ ENTRY(Thread_continue)
* has no FPU state)
*/
ENTRY(switch_to_shutdown_context)
- CPU_NUMBER(%edx)
- movl CX(EXT(active_stacks),%edx),%ecx /* get old kernel stack */
+ movl MY(ACTIVE_STACK),%ecx /* get old kernel stack */
movl %ebx,KSS_EBX(%ecx) /* save registers */
movl %ebp,KSS_EBP(%ecx)
movl %edi,KSS_EDI(%ecx)
@@ -125,6 +124,7 @@ ENTRY(switch_to_shutdown_context)
movl 4(%esp),%ebx /* get routine to run next */
movl 8(%esp),%esi /* get its argument */
+ CPU_NUMBER(%edx)
movl CX(EXT(int_stack_base),%edx),%ecx /* point to its interrupt stack */
lea -4+INTSTACK_SIZE(%ecx),%esp /* switch to it (top) */
diff --git a/i386/i386/i386asm.sym b/i386/i386/i386asm.sym
index e9a792c3..e1f5c6bb 100644
--- a/i386/i386/i386asm.sym
+++ b/i386/i386/i386asm.sym
@@ -55,6 +55,7 @@ offset ApicLocalUnit lu apic_id APIC_ID
offset percpu pc cpu_id PERCPU_CPU_ID
offset percpu pc active_thread PERCPU_ACTIVE_THREAD
+offset percpu pc active_stack PERCPU_ACTIVE_STACK
offset pcb pcb iss
diff --git a/i386/i386/locore.S b/i386/i386/locore.S
index 8fba7638..d3986793 100644
--- a/i386/i386/locore.S
+++ b/i386/i386/locore.S
@@ -555,7 +555,7 @@ trap_from_kernel:
cmpl CX(EXT(kernel_stack),%edx),%esp
/* already on kernel stack? */
ja 0f
- cmpl CX(EXT(active_stacks),%edx),%esp
+ cmpl MY(ACTIVE_STACK),%esp
ja 1f /* switch if not */
0:
movl CX(EXT(kernel_stack),%edx),%esp
diff --git a/i386/i386/percpu.h b/i386/i386/percpu.h
index ad4836ce..d73cfc8d 100644
--- a/i386/i386/percpu.h
+++ b/i386/i386/percpu.h
@@ -59,10 +59,10 @@ struct percpu {
int cpu_id;
struct processor processor;
thread_t active_thread;
+ vm_offset_t active_stack;
/*
struct machine_slot machine_slot;
struct mp_desc_table mp_desc_table;
- vm_offset_t active_stack;
vm_offset_t int_stack_top;
vm_offset_t int_stack_base;
ast_t need_ast;
diff --git a/kern/startup.c b/kern/startup.c
index 177232fc..e72cf6f4 100644
--- a/kern/startup.c
+++ b/kern/startup.c
@@ -301,7 +301,7 @@ void cpu_launch_first_thread(thread_t th)
PMAP_ACTIVATE_KERNEL(mycpu);
percpu_assign(active_thread, th);
- active_stacks[mycpu] = th->kernel_stack;
+ percpu_assign(active_stack, th->kernel_stack);
thread_lock(th);
th->state &= ~TH_UNINT;
thread_unlock(th);
diff --git a/kern/thread.c b/kern/thread.c
index c397de84..38287581 100644
--- a/kern/thread.c
+++ b/kern/thread.c
@@ -69,8 +69,6 @@
#include <machine/pcb.h>
#include <machine/thread.h> /* for MACHINE_STACK */
-vm_offset_t active_stacks[NCPUS];
-
struct kmem_cache thread_cache;
struct kmem_cache thread_stack_cache;
@@ -2572,7 +2570,7 @@ kern_return_t processor_set_stack_usage(
for (cpu = 0; cpu < smp_get_numcpus(); cpu++)
if (percpu_array[cpu].active_thread == thread) {
- stack = active_stacks[cpu];
+ stack = percpu_array[cpu].active_stack;
break;
}
}
diff --git a/kern/thread.h b/kern/thread.h
index 144160d5..7bfe2e89 100644
--- a/kern/thread.h
+++ b/kern/thread.h
@@ -268,9 +268,6 @@ typedef struct thread *thread_t;
typedef mach_port_t *thread_array_t;
#endif /* _KERN_KERN_TYPES_H_ */
-
-extern vm_offset_t active_stacks[NCPUS]; /* active kernel stacks */
-
#ifdef KERNEL
/*
* User routines
@@ -417,7 +414,7 @@ extern void thread_unfreeze(
#define current_thread() (percpu_get(thread_t, active_thread))
#endif /* CURRENT_THREAD */
-#define current_stack() (active_stacks[cpu_number()])
+#define current_stack() (percpu_get(vm_offset_t, active_stack))
#define current_task() (current_thread()->task)
#define current_space() (current_task()->itk_space)
diff --git a/x86_64/cswitch.S b/x86_64/cswitch.S
index 29dae62c..9c4640fd 100644
--- a/x86_64/cswitch.S
+++ b/x86_64/cswitch.S
@@ -40,7 +40,7 @@ ENTRY(Load_context)
lea KERNEL_STACK_SIZE-IKS_SIZE-IEL_SIZE(%rcx),%rdx
/* point to stack top */
CPU_NUMBER(%eax)
- movq %rcx,CX(EXT(active_stacks),%rax) /* store stack address */
+ movq %rcx,MY(ACTIVE_STACK) /* store stack address */
movq %rdx,CX(EXT(kernel_stack),%rax) /* store stack top */
/* XXX complete */
@@ -61,8 +61,7 @@ ENTRY(Load_context)
*/
ENTRY(Switch_context)
- CPU_NUMBER(%eax)
- movq CX(EXT(active_stacks),%rax),%rcx /* get old kernel stack */
+ movq MY(ACTIVE_STACK),%rcx /* get old kernel stack */
movq %r12,KSS_R12(%rcx) /* save registers */
movq %r13,KSS_R13(%rcx)
@@ -86,7 +85,7 @@ ENTRY(Switch_context)
CPU_NUMBER(%eax)
movq %rsi,MY(ACTIVE_THREAD) /* new thread is active */
- movq %rcx,CX(EXT(active_stacks),%rax) /* set current stack */
+ movq %rcx,MY(ACTIVE_STACK) /* set current stack */
movq %rbx,CX(EXT(kernel_stack),%rax) /* set stack top */
movq KSS_ESP(%rcx),%rsp /* switch stacks */
@@ -119,8 +118,7 @@ ENTRY(Thread_continue)
*/
ENTRY(switch_to_shutdown_context)
ud2
- CPU_NUMBER(%eax)
- movq CX(EXT(active_stacks),%rax),%rcx /* get old kernel stack */
+ movq MY(ACTIVE_STACK),%rcx /* get old kernel stack */
movq %r12,KSS_R12(%rcx) /* save registers */
movq %r13,KSS_R13(%rcx)
movq %r14,KSS_R14(%rcx)
diff --git a/x86_64/locore.S b/x86_64/locore.S
index 55dc4d27..7eaeda3b 100644
--- a/x86_64/locore.S
+++ b/x86_64/locore.S
@@ -673,7 +673,7 @@ trap_from_kernel:
cmpq CX(EXT(kernel_stack),%rdx),%rsp
/* already on kernel stack? */
ja 0f
- cmpq CX(EXT(active_stacks),%rdx),%rsp
+ cmpq MY(ACTIVE_STACK),%rsp
ja 1f /* switch if not */
0:
movq CX(EXT(kernel_stack),%rdx),%rsp