Acpi MADT table correction for VM_MAXCPU > 21

The bhyve acpi MADT table was given a static space of 256 (0x100) bytes,
this is enough space to allow VM_MAXCPU to be 21, this patch changes that
so VM_MAXCPU can be of arbitrary value and not overflow the space by
actually calculating the space needed for the table.

PR:			212782
Reviewed by:		Patrick Mooney <patrick.mooney@joyent.com>
Approved by:		bde (mentor), jhb (maintainer)
MFC after:		3 days
Differential Revision:	https://reviews.freebsd.org/D18815
This commit is contained in:
Rodney W. Grimes 2019-04-25 22:52:44 +00:00
parent a488c9c99a
commit 77be224862
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=346715

View File

@ -39,7 +39,9 @@
* The tables are placed in the guest's ROM area just below 1MB physical, * The tables are placed in the guest's ROM area just below 1MB physical,
* above the MPTable. * above the MPTable.
* *
* Layout * Layout (No longer correct at FADT and beyond due to properly
* calculating the size of the MADT to allow for changes to
* VM_MAXCPU above 21 which overflows this layout.)
* ------ * ------
* RSDP -> 0xf2400 (36 bytes fixed) * RSDP -> 0xf2400 (36 bytes fixed)
* RSDT -> 0xf2440 (36 bytes + 4*7 table addrs, 4 used) * RSDT -> 0xf2440 (36 bytes + 4*7 table addrs, 4 used)
@ -74,18 +76,31 @@ __FBSDID("$FreeBSD$");
#include "pci_emul.h" #include "pci_emul.h"
/* /*
* Define the base address of the ACPI tables, and the offsets to * Define the base address of the ACPI tables, the sizes of some tables,
* the individual tables * and the offsets to the individual tables,
*/ */
#define BHYVE_ACPI_BASE 0xf2400 #define BHYVE_ACPI_BASE 0xf2400
#define RSDT_OFFSET 0x040 #define RSDT_OFFSET 0x040
#define XSDT_OFFSET 0x080 #define XSDT_OFFSET 0x080
#define MADT_OFFSET 0x100 #define MADT_OFFSET 0x100
#define FADT_OFFSET 0x200 /*
#define HPET_OFFSET 0x340 * The MADT consists of:
#define MCFG_OFFSET 0x380 * 44 Fixed Header
#define FACS_OFFSET 0x3C0 * 8 * maxcpu Processor Local APIC entries
#define DSDT_OFFSET 0x400 * 12 I/O APIC entry
* 2 * 10 Interrupt Source Override entires
* 6 Local APIC NMI entry
*/
#define MADT_SIZE (44 + VM_MAXCPU*8 + 12 + 2*10 + 6)
#define FADT_OFFSET (MADT_OFFSET + MADT_SIZE)
#define FADT_SIZE 0x140
#define HPET_OFFSET (FADT_OFFSET + FADT_SIZE)
#define HPET_SIZE 0x40
#define MCFG_OFFSET (HPET_OFFSET + HPET_SIZE)
#define MCFG_SIZE 0x40
#define FACS_OFFSET (MCFG_OFFSET + MCFG_SIZE)
#define FACS_SIZE 0x40
#define DSDT_OFFSET (FACS_OFFSET + FACS_SIZE)
#define BHYVE_ASL_TEMPLATE "bhyve.XXXXXXX" #define BHYVE_ASL_TEMPLATE "bhyve.XXXXXXX"
#define BHYVE_ASL_SUFFIX ".aml" #define BHYVE_ASL_SUFFIX ".aml"