Skip to content

Commit 348e2ba

Browse files
Sainath Grandhiwenlingz
authored andcommitted
hv: x2apic support for acrn
All the platforms supported by ACRN supports x2APIC. So enabled x2APIC for ACRN hv. Removed any code that is needed for xAPIC mode of operation. Tracked-On: #1455 Signed-off-by: Sainath Grandhi <sainath.grandhi@intel.com> Reviewed-by: Eddie Dong <eddie.dong@intel.com> Reviewed by: Yonghua Huang <yonghua.huang@intel.com>
1 parent a0fb1c4 commit 348e2ba

File tree

14 files changed

+132
-326
lines changed

14 files changed

+132
-326
lines changed

hypervisor/arch/x86/cpu.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ static void cpu_cap_detect(void);
5454
static void cpu_xsave_init(void);
5555
static void set_current_cpu_id(uint16_t pcpu_id);
5656
static void print_hv_banner(void);
57-
static uint16_t get_cpu_id_from_lapic_id(uint8_t lapic_id);
57+
static uint16_t get_cpu_id_from_lapic_id(uint32_t lapic_id);
5858
int ibrs_type;
5959
static uint64_t start_tsc __attribute__((__section__(".bss_noinit")));
6060

@@ -276,9 +276,9 @@ static void alloc_phy_cpu_data(uint16_t pcpu_num)
276276
ASSERT(per_cpu_data_base_ptr != NULL, "");
277277
}
278278

279-
uint16_t __attribute__((weak)) parse_madt(uint8_t lapic_id_array[MAX_PCPU_NUM])
279+
uint16_t __attribute__((weak)) parse_madt(uint32_t lapic_id_array[MAX_PCPU_NUM])
280280
{
281-
static const uint8_t lapic_id[] = {0U, 2U, 4U, 6U};
281+
static const uint32_t lapic_id[] = {0U, 2U, 4U, 6U};
282282
uint32_t i;
283283

284284
for (i = 0U; i < ARRAY_SIZE(lapic_id); i++) {
@@ -292,7 +292,7 @@ static void init_percpu_data_area(void)
292292
{
293293
uint16_t i;
294294
uint16_t pcpu_num = 0U;
295-
uint8_t lapic_id_array[MAX_PCPU_NUM];
295+
uint32_t lapic_id_array[MAX_PCPU_NUM];
296296

297297
/* Save all lapic_id detected via parse_mdt in lapic_id_array */
298298
pcpu_num = parse_madt(lapic_id_array);
@@ -306,9 +306,6 @@ static void init_percpu_data_area(void)
306306
for (i = 0U; i < pcpu_num; i++) {
307307
per_cpu(lapic_id, i) = lapic_id_array[i];
308308
}
309-
310-
ASSERT(get_cpu_id_from_lapic_id(get_cur_lapic_id()) != INVALID_CPU_ID,
311-
"fail to get phy cpu id");
312309
}
313310

314311
static void cpu_set_current_state(uint16_t pcpu_id, enum pcpu_boot_state state)
@@ -406,6 +403,10 @@ void bsp_boot_init(void)
406403
/* Initialize the hypervisor paging */
407404
init_paging();
408405

406+
if (!cpu_has_cap(X86_FEATURE_X2APIC)) {
407+
panic("x2APIC is not present!");
408+
}
409+
409410
early_init_lapic();
410411

411412
init_percpu_data_area();
@@ -581,7 +582,7 @@ static void cpu_secondary_post(void)
581582
cpu_dead(get_cpu_id());
582583
}
583584

584-
static uint16_t get_cpu_id_from_lapic_id(uint8_t lapic_id)
585+
static uint16_t get_cpu_id_from_lapic_id(uint32_t lapic_id)
585586
{
586587
uint16_t i;
587588

hypervisor/arch/x86/guest/vmsr.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ static const uint32_t emulated_msrs[] = {
1414
MSR_IA32_BIOS_SIGN_ID, /* Enable MSR_IA32_BIOS_SIGN_ID */
1515
MSR_IA32_TIME_STAMP_COUNTER,
1616
MSR_IA32_PAT,
17+
MSR_IA32_APIC_BASE,
1718

1819
/* following MSR not emulated now */
1920
/*
20-
* MSR_IA32_APIC_BASE,
2121
* MSR_IA32_SYSENTER_CS,
2222
* MSR_IA32_SYSENTER_ESP,
2323
* MSR_IA32_SYSENTER_EIP,

hypervisor/arch/x86/irq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,7 @@ void interrupt_init(uint16_t pcpu_id)
484484
struct host_idt_descriptor *idtd = &HOST_IDTR;
485485

486486
set_idt(idtd);
487-
init_lapic(pcpu_id);
487+
init_lapic();
488488
init_default_irqs(pcpu_id);
489489
#ifndef CONFIG_EFI_STUB
490490
CPU_IRQ_ENABLE();

0 commit comments

Comments
 (0)