@@ -243,8 +243,6 @@ void mask_pic_interrupts(void)
outb(0xff, 0xa1);
}
-extern unsigned char online_cpus[(MAX_TEST_CPUS + 7) / 8];
-
void init_apic_map(void)
{
unsigned int i, j = 0;
@@ -16,4 +16,7 @@ efi_status_t setup_efi(efi_bootinfo_t *efi_bootinfo);
void setup_5level_page_table(void);
#endif /* CONFIG_EFI */
+void save_id(void);
+void ap_start64(void);
+
#endif /* _X86_ASM_SETUP_H_ */
@@ -14,6 +14,9 @@
#include "apic.h"
#include "apic-defs.h"
#include "asm/setup.h"
+#include "atomic.h"
+#include "processor.h"
+#include "smp.h"
extern char edata;
@@ -195,7 +198,22 @@ static void setup_segments64(void)
"1:"
:: "r" ((u64)KERNEL_DS), "i" (KERNEL_CS));
}
+#endif
+
+static void setup_gdt_tss(void)
+{
+ size_t tss_offset;
+ /* 64-bit setup_tss does not use the stacktop argument. */
+ tss_offset = setup_tss(NULL);
+ load_gdt_tss(tss_offset);
+
+#ifdef CONFIG_EFI
+ setup_segments64();
+#endif
+}
+
+#ifdef CONFIG_EFI
static efi_status_t setup_memory_allocator(efi_bootinfo_t *efi_bootinfo)
{
int i;
@@ -292,17 +310,6 @@ static void setup_page_table(void)
write_cr3((ulong)&ptl4);
}
-static void setup_gdt_tss(void)
-{
- size_t tss_offset;
-
- /* 64-bit setup_tss does not use the stacktop argument. */
- tss_offset = setup_tss(NULL);
- load_gdt_tss(tss_offset);
-
- setup_segments64();
-}
-
efi_status_t setup_efi(efi_bootinfo_t *efi_bootinfo)
{
efi_status_t status;
@@ -349,6 +356,7 @@ efi_status_t setup_efi(efi_bootinfo_t *efi_bootinfo)
mask_pic_interrupts();
setup_page_table();
enable_apic();
+ save_id();
ap_init();
enable_x2apic();
smp_init();
@@ -371,3 +379,25 @@ void setup_libcflat(void)
add_setup_arg("bootloader");
}
}
+
+void save_id(void)
+{
+ set_bit(apic_id(), online_cpus);
+}
+
+void ap_start64(void)
+{
+ setup_gdt_tss();
+ reset_apic();
+ load_idt();
+ save_id();
+ enable_apic();
+ enable_x2apic();
+ sti();
+ asm volatile ("nop");
+ printf("setup: AP %d online\n", apic_id());
+ atomic_inc(&cpu_online_count);
+ while (1) {
+ ;
+ }
+}
@@ -31,6 +31,7 @@ extern u32 smp_stacktop;
extern u8 stacktop;
#endif
atomic_t cpu_online_count = { .counter = 1 };
+unsigned char online_cpus[(MAX_TEST_CPUS + 7) / 8];
static __attribute__((used)) void ipi(void)
{
@@ -5,6 +5,7 @@
#include <asm/spinlock.h>
#include "libcflat.h"
#include "atomic.h"
+#include "apic-defs.h"
/* Address where to store the address of realmode GDT descriptor. */
#define REALMODE_GDT_LOWMEM (PAGE_SIZE - 2)
@@ -86,5 +87,6 @@ void smp_reset_apic(void);
void ap_init(void);
extern atomic_t cpu_online_count;
+extern unsigned char online_cpus[(MAX_TEST_CPUS + 7) / 8];
#endif
@@ -124,7 +124,4 @@ start32:
push %eax
call exit
-online_cpus:
- .fill (max_cpus + 7) / 8, 1, 0
-
#include "start16.S"
@@ -1,8 +1,6 @@
#include "apic-defs.h"
-.globl online_cpus
-
ipi_vector = 0x20
max_cpus = MAX_TEST_CPUS
@@ -108,27 +106,6 @@ gdt32_end:
#include "start16.S"
.code64
-save_id:
- movl $(APIC_DEFAULT_PHYS_BASE + APIC_ID), %eax
- movl (%rax), %eax
- shrl $24, %eax
- lock btsl %eax, online_cpus
- retq
-
-ap_start64:
- call reset_apic
- call load_idt
- load_tss
- call enable_apic
- call save_id
- call enable_x2apic
- sti
- nop
- lock incw cpu_online_count
-
-1: hlt
- jmp 1b
-
start64:
call reset_apic
call load_idt
@@ -167,6 +144,3 @@ setup_5level_page_table:
lretq
lvl5:
retq
-
-online_cpus:
- .fill (max_cpus + 7) / 8, 1, 0
@@ -76,8 +76,3 @@ rm_trampoline_end:
.code32
#include "../start32.S"
-
-.code64:
-
-ap_start64:
- jmp ap_start64
ap_start64() currently serves as the 64-bit entrypoint for non-EFI tests. Having ap_start64() and save_id() written in asm prevents sharing these routines between EFI and non-EFI tests. Rewrite them in C and use ap_start64 as the 64-bit entrypoint in the EFI boot flow. With this, EFI tests support -smp > 1. smptest.efi now passes. Signed-off-by: Varad Gautam <varad.gautam@suse.com> --- lib/x86/apic.c | 2 -- lib/x86/asm/setup.h | 3 +++ lib/x86/setup.c | 52 ++++++++++++++++++++++++++++++++++---------- lib/x86/smp.c | 1 + lib/x86/smp.h | 2 ++ x86/cstart.S | 3 --- x86/cstart64.S | 26 ---------------------- x86/efi/efistart64.S | 5 ----- 8 files changed, 47 insertions(+), 47 deletions(-)