]> rtime.felk.cvut.cz Git - jailhouse.git/blobdiff - inmates/lib/x86/header-32.S
Merge remote-tracking branch 'kiszka/master'
[jailhouse.git] / inmates / lib / x86 / header-32.S
index 6f704f9d32aaf0769249515b007a051a504d3b38..31a39fb826f2cedf5df214408290560f180d5afb 100644 (file)
@@ -47,7 +47,7 @@ start32:
        or $X86_CR4_PSE,%eax
        mov %eax,%cr4
 
-       mov $loader_pdpt + FSEGMENT_BASE,%eax
+       mov $loader_pdpt,%eax
        mov %eax,%cr3
 
        mov $(X86_CR0_PG | X86_CR0_WP | X86_CR0_PE),%eax
@@ -58,26 +58,67 @@ start32:
        or $MTRR_ENABLE,%eax
        wrmsr
 
-       mov $stack_top,%esp
-
        mov $INMATE_DS32,%eax
        mov %eax,%ds
        mov %eax,%es
        mov %eax,%ss
 
+       xor %ebx,%ebx
+       xchg ap_entry,%ebx
+       or %ebx,%ebx
+       jnz call_entry
+
+       mov $1,%edi
+       lock xadd %edi,cpu_number + FSEGMENT_BASE
+
+       cmp $SMP_MAX_CPUS,%edi
+       jae stop
+
+       mov $0x01,%eax
+       cpuid
+       shr $24,%ebx
+       mov %bl,smp_cpu_ids(%edi)
+
+       lock incl smp_num_cpus
+
+       cmp $0,%edi
+       jne stop
+
        xor %eax,%eax
        mov $bss_start,%edi
        mov $bss_dwords,%ecx
        rep stosl
 
-       mov $inmate_main,%eax
-       call *%eax
+       mov $inmate_main,%ebx
+
+call_entry:
+       mov $stack_top,%esp
+       call *%ebx
 
 stop:  cli
        hlt
        jmp stop
 
 
+       .pushsection ".data"
+
+       .globl ap_entry
+ap_entry:
+       .long   0
+
+       .globl smp_num_cpus
+smp_num_cpus:
+       .long   0
+
+       .globl smp_cpu_ids
+smp_cpu_ids:
+       .fill   SMP_MAX_CPUS, 1, 0
+
+       .popsection
+
+cpu_number:
+       .long   0
+
        .align(16)
        .global loader_gdt
 loader_gdt:
@@ -90,6 +131,9 @@ gdt_ptr:
        .short  gdt_ptr - loader_gdt - 1
        .long   loader_gdt + FSEGMENT_BASE
 
+
+       .section ".rodata"
+
        .align(4096)
        .global loader_pdpt
 loader_pdpt: