hv: fix size issue in mptable guest copy - ACRN partition mode

1)Fix to take into account the size of proc entries in MPtable.
2)Change APIC ids to virtual APIC IDs

Signed-off-by: Sainath Grandhi <sainath.grandhi@intel.com>
This commit is contained in:
Sainath Grandhi 2018-08-16 00:40:45 -07:00 committed by wenlingz
parent 0c93a1388c
commit 150b389120
1 changed files with 19 additions and 8 deletions

View File

@ -13,8 +13,15 @@
#define MPTABLE_BASE 0xF0000U #define MPTABLE_BASE 0xF0000U
/* floating pointer length + maximum length of configuration table */ /*
#define MPTABLE_MAX_LENGTH (65536 + 16)U * floating pointer length + maximum length of configuration table
* ACRN uses contiguous guest memory from 0xF0000 to place floating pointer
* structure and config table. Maximum length of config table is 64K. So the
* maximum length of combined floating pointer and config table can go up to
* 64K + 16 bytes.Since we are left with only 64K from 0xF0000 to 0x100000(1MB)
* max length is limited to 64K.
*/
#define MPTABLE_MAX_LENGTH 65536U
#define LAPIC_VERSION 16U #define LAPIC_VERSION 16U
@ -29,7 +36,7 @@
#define MPCH_PRODID_LEN 12U #define MPCH_PRODID_LEN 12U
/* Processor entry defines */ /* Processor entry defines */
#define MPEP_SIG_FAMILY 6U /* XXX cwpdm should supply this */ #define MPEP_SIG_FAMILY 6U
#define MPEP_SIG_MODEL 26U #define MPEP_SIG_MODEL 26U
#define MPEP_SIG_STEPPING 5U #define MPEP_SIG_STEPPING 5U
#define MPEP_SIG \ #define MPEP_SIG \
@ -163,7 +170,7 @@ struct mptable_info mptable_vm1 = {
}, },
{ {
.type = MPCT_ENTRY_PROCESSOR, .type = MPCT_ENTRY_PROCESSOR,
.apic_id = 4U, .apic_id = 1U,
.apic_version = LAPIC_VERSION, .apic_version = LAPIC_VERSION,
.cpu_flags = PROCENTRY_FLAG_EN, .cpu_flags = PROCENTRY_FLAG_EN,
.cpu_signature = MPEP_SIG, .cpu_signature = MPEP_SIG,
@ -225,7 +232,7 @@ struct mptable_info mptable_vm2 = {
.proc_entry_array = { .proc_entry_array = {
{ {
.type = MPCT_ENTRY_PROCESSOR, .type = MPCT_ENTRY_PROCESSOR,
.apic_id = 2U, .apic_id = 0U,
.apic_version = LAPIC_VERSION, .apic_version = LAPIC_VERSION,
.cpu_flags = PROCENTRY_FLAG_EN | PROCENTRY_FLAG_BP, .cpu_flags = PROCENTRY_FLAG_EN | PROCENTRY_FLAG_BP,
.cpu_signature = MPEP_SIG, .cpu_signature = MPEP_SIG,
@ -233,7 +240,7 @@ struct mptable_info mptable_vm2 = {
}, },
{ {
.type = MPCT_ENTRY_PROCESSOR, .type = MPCT_ENTRY_PROCESSOR,
.apic_id = 6U, .apic_id = 1U,
.apic_version = LAPIC_VERSION, .apic_version = LAPIC_VERSION,
.cpu_flags = PROCENTRY_FLAG_EN, .cpu_flags = PROCENTRY_FLAG_EN,
.cpu_signature = MPEP_SIG, .cpu_signature = MPEP_SIG,
@ -292,12 +299,16 @@ int mptable_build(struct vm *vm)
char *curraddr; char *curraddr;
struct mpcth *mpch; struct mpcth *mpch;
struct mpfps *mpfp; struct mpfps *mpfp;
size_t mptable_length, table_length;
startaddr = (char *)GPA2HVA(vm, MPTABLE_BASE); startaddr = (char *)GPA2HVA(vm, MPTABLE_BASE);
table_length = vm->vm_desc->mptable->mpch.base_table_length;
mptable_length = sizeof(struct mpfps) + table_length;
/* Copy mptable info into guest memory */ /* Copy mptable info into guest memory */
(void)memcpy_s((void *)startaddr, sizeof(struct mptable_info), (void)memcpy_s((void *)startaddr, MPTABLE_MAX_LENGTH,
(void *)vm->vm_desc->mptable, (void *)vm->vm_desc->mptable,
sizeof(struct mptable_info)); mptable_length);
curraddr = startaddr; curraddr = startaddr;
mpfp = (struct mpfps *)curraddr; mpfp = (struct mpfps *)curraddr;