Skip to content

Commit 09193c3

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 19abb41 commit 09193c3

File tree

14 files changed

+152
-327
lines changed

14 files changed

+152
-327
lines changed

hypervisor/arch/x86/assign.c

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,25 @@ static bool ptdev_hv_owned_intx(const struct vm *vm, union source_id *virt_sid)
5353
}
5454
}
5555

56+
static uint64_t calculate_logical_dest_mask(uint64_t pdmask)
57+
{
58+
uint64_t dest_mask = 0UL;
59+
uint64_t pcpu_mask = pdmask;
60+
uint16_t pcpu_id;
61+
62+
pcpu_id = ffs64(pcpu_mask);
63+
while (pcpu_id != INVALID_BIT_INDEX) {
64+
bitmap_clear_nolock(pcpu_id, &pcpu_mask);
65+
dest_mask |= per_cpu(lapic_ldr, pcpu_id);
66+
pcpu_id = ffs64(pcpu_mask);
67+
}
68+
return dest_mask;
69+
}
70+
5671
static void ptdev_build_physical_msi(struct vm *vm, struct ptdev_msi_info *info,
5772
uint32_t vector)
5873
{
59-
uint64_t vdmask, pdmask;
74+
uint64_t vdmask, pdmask, dest_mask;
6075
uint32_t dest, delmode;
6176
bool phys;
6277

@@ -78,10 +93,11 @@ static void ptdev_build_physical_msi(struct vm *vm, struct ptdev_msi_info *info,
7893
info->pmsi_data &= ~0x7FFU;
7994
info->pmsi_data |= delmode | vector;
8095

96+
dest_mask = calculate_logical_dest_mask(pdmask);
8197
/* update physical dest mode & dest field */
8298
info->pmsi_addr = info->vmsi_addr;
8399
info->pmsi_addr &= ~0xFF00CU;
84-
info->pmsi_addr |= (uint32_t)(pdmask << 12U) |
100+
info->pmsi_addr |= (uint32_t)(dest_mask << 12U) |
85101
MSI_ADDR_RH | MSI_ADDR_LOG;
86102

87103
dev_dbg(ACRN_DBG_IRQ, "MSI addr:data = 0x%x:%x(V) -> 0x%x:%x(P)",
@@ -99,7 +115,7 @@ ptdev_build_physical_rte(struct vm *vm,
99115
union source_id *virt_sid = &entry->virt_sid;
100116

101117
if (virt_sid->intx_id.src == PTDEV_VPIN_IOAPIC) {
102-
uint64_t vdmask, pdmask, delmode;
118+
uint64_t vdmask, pdmask, delmode, dest_mask;
103119
uint32_t dest;
104120
union ioapic_rte virt_rte;
105121
bool phys;
@@ -142,9 +158,10 @@ ptdev_build_physical_rte(struct vm *vm,
142158
IOAPIC_RTE_DELMOD | IOAPIC_RTE_INTVEC);
143159
rte.full |= IOAPIC_RTE_DESTLOG | delmode | (uint64_t)vector;
144160

161+
dest_mask = calculate_logical_dest_mask(pdmask);
145162
/* update physical dest field */
146163
rte.full &= ~IOAPIC_RTE_DEST_MASK;
147-
rte.full |= pdmask << IOAPIC_RTE_DEST_SHIFT;
164+
rte.full |= dest_mask << IOAPIC_RTE_DEST_SHIFT;
148165

149166
dev_dbg(ACRN_DBG_IRQ, "IOAPIC RTE = 0x%x:%x(V) -> 0x%x:%x(P)",
150167
virt_rte.u.hi_32, virt_rte.u.lo_32,

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,

0 commit comments

Comments
 (0)