qemu-patch-raspberry4/hw/i386
Laszlo Ersek 9bcc80cd71 i386/acpi-build: allow more than 255 elements in CPON
The build_ssdt() function builds a number of AML objects that are related
to CPU hotplug, and whose IDs form a contiguous sequence of APIC IDs.
(APIC IDs are in fact discontiguous, but this is the traditional
interface: build a contiguous sequence from zero up that covers all
possible APIC IDs.) These objects are:

- a Processor() object for each VCPU,
- a NTFY method, with one branch for each VCPU,
- a CPON package with one element (hotplug status byte) for each VCPU.

The build_ssdt() function currently limits the *count* of processor
objects, and NTFY branches, and CPON elements, in 0xFF (see the assignment
to "acpi_cpus"). This allows for an inclusive APIC ID range of [0..254].
This is incorrect, because the highest APIC ID that we otherwise allow a
VCPU to take is 255.

In order to extend the maximum count to 256, and the traversed APIC ID
range correspondingly to [0..255]:
- the Processor() objects need no change,
- the NTFY method also needs no change,
- the CPON package must be updated, because it is defined with a
  DefPackage, and the number of elements in such a package can be at most
  255. We pick a DefVarPackage instead.

We replace the Op byte, and the encoding of the number of elements.
Compare:

DefPackage     := PackageOp    PkgLength NumElements    PackageElementList
DefVarPackage  := VarPackageOp PkgLength VarNumElements PackageElementList

PackageOp      := 0x12
VarPackageOp   := 0x13

NumElements    := ByteData
VarNumElements := TermArg => Integer

The build_append_int() function implements precisely the following TermArg
encodings (a subset of what the ACPI spec describes):

  TermArg             := DataObject
  DataObject          := ComputationalData
  ComputationalData   := ConstObj | ByteConst | WordConst | DWordConst

  directly encoded in the function, with build_append_byte():
    ConstObj          := ZeroOp | OneOp
      ZeroOp          := 0x00
      OneOp           := 0x01

  call to build_append_value(..., 1):
    ByteConst         := BytePrefix ByteData
      BytePrefix      := 0x0A
      ByteData        := 0x00 - 0xFF

  call to build_append_value(..., 2):
    WordConst         := WordPrefix WordData
      WordPrefix      := 0x0B
      WordData        := ByteData[0:7] ByteData[8:15]

  call to build_append_value(..., 4):
    DWordConst        := DWordPrefix DWordData
      DWordPrefix     := 0x0C
      DWordData       := WordData[0:15] WordData[16:31]

Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
2014-03-18 16:08:43 +02:00
..
kvm pci-assign: Fix potential read beyond buffer on -EBUSY 2014-02-26 10:30:03 -07:00
acpi-build.c i386/acpi-build: allow more than 255 elements in CPON 2014-03-18 16:08:43 +02:00
acpi-build.h i386: ACPI table generation code from seabios 2013-10-14 17:48:57 +03:00
acpi-defs.h i386: ACPI table generation code from seabios 2013-10-14 17:48:57 +03:00
acpi-dsdt-cpu-hotplug.dsl pc: ACPI: unify source of CPU hotplug IO base/len 2014-01-26 13:11:44 +02:00
acpi-dsdt-dbug.dsl i386: add ACPI table files from seabios 2013-10-14 17:48:51 +03:00
acpi-dsdt-hpet.dsl ACPI: Remove commented-out code from HPET._CRS 2014-02-10 11:09:33 +02:00
acpi-dsdt-isa.dsl ACPI: Fix AppleSMC _STA size 2014-01-26 13:06:48 +02:00
acpi-dsdt-pci-crs.dsl pc: Q35 DSDT: exclude CPU hotplug IO range from PCI bus resources 2014-01-26 13:11:44 +02:00
acpi-dsdt.dsl acpi-build: append description for non-hotplug 2014-03-09 21:09:30 +02:00
acpi-dsdt.hex.generated acpi-build: append description for non-hotplug 2014-03-09 21:09:30 +02:00
bios-linker-loader.c i386: Add missing include file for QEMU_PACKED 2014-02-01 13:43:52 +04:00
bios-linker-loader.h i386: add bios linker/loader 2013-10-14 17:48:52 +03:00
kvmvapic.c QOM CPUState refactorings / X86CPU 2014-01-10 11:04:31 -08:00
Makefile.objs pc: ACPI: unify source of CPU hotplug IO base/len 2014-01-26 13:11:44 +02:00
multiboot.c multiboot: Calculate upper_mem in the ROM 2013-06-28 14:01:52 -05:00
multiboot.h refer to FWCfgState explicitly 2013-06-02 18:14:02 +03:00
pc.c pc: Refuse max_cpus if it results in too large APIC ID 2014-03-18 16:08:43 +02:00
pc_piix.c pc: avoid duplicate names for ROM MRs 2014-03-11 13:25:48 +02:00
pc_q35.c pc: avoid duplicate names for ROM MRs 2014-03-11 13:25:48 +02:00
pc_sysfw.c hw/i386/pc_sysfw: support two flash drives 2013-12-23 13:12:34 +02:00
q35-acpi-dsdt.dsl acpi-build: append description for non-hotplug 2014-03-09 21:09:30 +02:00
q35-acpi-dsdt.hex.generated acpi-build: append description for non-hotplug 2014-03-09 21:09:30 +02:00
smbios.c smbios: Set system manufacturer, product & version by default 2013-12-10 13:29:22 +02:00
ssdt-misc.dsl i386: add ACPI table files from seabios 2013-10-14 17:48:51 +03:00
ssdt-misc.hex.generated acpi: pre-compiled ASL files 2013-10-14 17:48:51 +03:00
ssdt-pcihp.dsl acpi-build: append description for non-hotplug 2014-03-09 21:09:30 +02:00
ssdt-pcihp.hex.generated acpi-build: append description for non-hotplug 2014-03-09 21:09:30 +02:00
ssdt-proc.dsl ssdt: fix PBLK length 2013-10-14 17:48:57 +03:00
ssdt-proc.hex.generated pc: ACPI: update acpi-dsdt.hex.generated q35-acpi-dsdt.hex.generated 2014-01-26 13:11:44 +02:00
xen_domainbuild.c aio / timers: Switch entire codebase to the new timer API 2013-08-22 19:14:24 +02:00
xen_domainbuild.h hw: move private headers to hw/ subdirectories. 2013-04-08 18:13:16 +02:00
xen_machine_pv.c hw: Clean up bogus default boot order 2013-08-28 10:16:47 +03:00