**/ \r
\r
#include "AcpiPlatform.h"\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
#include <Library/QemuFwCfgLib.h>\r
\r
\r
}\r
\r
\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+QemuInstallAcpiMadtTable (\r
+ IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol,\r
+ IN VOID *AcpiTableBuffer,\r
+ IN UINTN AcpiTableBufferSize,\r
+ OUT UINTN *TableKey\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN Count;\r
+ UINTN Loop;\r
+ EFI_ACPI_DESCRIPTION_HEADER *Hdr;\r
+ UINTN NewBufferSize;\r
+ EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC_STRUCTURE *LocalApic;\r
+\r
+ QemuFwCfgSelectItem (QemuFwCfgItemSmpCpuCount);\r
+ Count = (UINTN) QemuFwCfgRead16 ();\r
+ ASSERT (Count >= 1);\r
+\r
+ if (Count == 1) {\r
+ //\r
+ // The pre-built MADT table covers the single CPU case\r
+ //\r
+ return InstallAcpiTable (\r
+ AcpiProtocol,\r
+ AcpiTableBuffer,\r
+ AcpiTableBufferSize,\r
+ TableKey\r
+ );\r
+ }\r
+\r
+ //\r
+ // We need to add additional Local APIC entries to the MADT\r
+ //\r
+ NewBufferSize = AcpiTableBufferSize + ((Count - 1) * sizeof (*LocalApic));\r
+ Hdr = (EFI_ACPI_DESCRIPTION_HEADER*) AllocatePool (NewBufferSize);\r
+ ASSERT (Hdr != NULL);\r
+\r
+ CopyMem (Hdr, AcpiTableBuffer, AcpiTableBufferSize);\r
+\r
+ LocalApic = (EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC_STRUCTURE*)\r
+ (((UINT8*) Hdr) + AcpiTableBufferSize);\r
+\r
+ //\r
+ // Add Local APIC entries for the APs to the MADT\r
+ //\r
+ for (Loop = 1; Loop < Count; Loop++) {\r
+ LocalApic->Type = EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC;\r
+ LocalApic->Length = sizeof (*LocalApic);\r
+ LocalApic->AcpiProcessorId = Loop;\r
+ LocalApic->ApicId = Loop;\r
+ LocalApic->Flags = 1;\r
+ LocalApic++;\r
+ }\r
+\r
+ Hdr->Length = NewBufferSize;\r
+\r
+ Status = InstallAcpiTable (AcpiProtocol, Hdr, NewBufferSize, TableKey);\r
+\r
+ FreePool (Hdr);\r
+\r
+ return Status;\r
+}\r
+\r
+\r
EFI_STATUS\r
EFIAPI\r
QemuInstallAcpiTable (\r
OUT UINTN *TableKey\r
)\r
{\r
- return InstallAcpiTable(\r
+ EFI_ACPI_DESCRIPTION_HEADER *Hdr;\r
+ EFI_ACPI_TABLE_INSTALL_ACPI_TABLE TableInstallFunction;\r
+\r
+ Hdr = (EFI_ACPI_DESCRIPTION_HEADER*) AcpiTableBuffer;\r
+ switch (Hdr->Signature) {\r
+ case EFI_ACPI_1_0_APIC_SIGNATURE:\r
+ TableInstallFunction = QemuInstallAcpiMadtTable;\r
+ break;\r
+ default:\r
+ TableInstallFunction = InstallAcpiTable;\r
+ }\r
+\r
+ return TableInstallFunction (\r
AcpiProtocol,\r
AcpiTableBuffer,\r
AcpiTableBufferSize,\r