aboutsummaryrefslogtreecommitdiff
path: root/src/cpu/x86/lapic/secondary.S
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu/x86/lapic/secondary.S')
-rw-r--r--src/cpu/x86/lapic/secondary.S20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/cpu/x86/lapic/secondary.S b/src/cpu/x86/lapic/secondary.S
index dc00b082e9..67e44c46df 100644
--- a/src/cpu/x86/lapic/secondary.S
+++ b/src/cpu/x86/lapic/secondary.S
@@ -2,7 +2,7 @@
#include <cpu/x86/lapic_def.h>
.text
- .globl _secondary_start, _secondary_start_end
+ .globl _secondary_start, _secondary_start_end, cpucount
.balign 4096
_secondary_start:
.code16
@@ -38,15 +38,25 @@ _secondary_start:
/* Load the Interrupt descriptor table */
lidt idtarg
- /* Set the stack pointer, and flag that we are done */
- xorl %eax, %eax
- movl secondary_stack, %esp
- movl %eax, secondary_stack
+ /* increment our cpu index */
+ movl $1, %eax
+ lock xadd %eax, cpucount
+ incl %eax
+ movl %eax, %ecx
+
+ /* assign stack for this specific cpu */
+ mov _stack, %esp
+ mov $CONFIG_STACK_SIZE, %ebx
+ mul %ebx
+ add %eax, %esp
+ pushl %ecx
call secondary_cpu_init
1: hlt
jmp 1b
+cpucount:
+ .long 1
gdtaddr:
.word gdt_limit /* the table limit */
.long gdt /* we know the offset */