4 Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "AcpiPlatform.h"
16 #include <Library/BaseMemoryLib.h>
17 #include <Library/MemoryAllocationLib.h>
18 #include <Library/QemuFwCfgLib.h>
26 if (!QemuFwCfgIsAvailable ()) {
37 QemuInstallAcpiMadtTable (
38 IN EFI_ACPI_TABLE_PROTOCOL
*AcpiProtocol
,
39 IN VOID
*AcpiTableBuffer
,
40 IN UINTN AcpiTableBufferSize
,
47 EFI_ACPI_DESCRIPTION_HEADER
*Hdr
;
49 EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC_STRUCTURE
*LocalApic
;
51 QemuFwCfgSelectItem (QemuFwCfgItemSmpCpuCount
);
52 Count
= (UINTN
) QemuFwCfgRead16 ();
57 // The pre-built MADT table covers the single CPU case
59 return InstallAcpiTable (
68 // We need to add additional Local APIC entries to the MADT
70 NewBufferSize
= AcpiTableBufferSize
+ ((Count
- 1) * sizeof (*LocalApic
));
71 Hdr
= (EFI_ACPI_DESCRIPTION_HEADER
*) AllocatePool (NewBufferSize
);
74 CopyMem (Hdr
, AcpiTableBuffer
, AcpiTableBufferSize
);
76 LocalApic
= (EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC_STRUCTURE
*)
77 (((UINT8
*) Hdr
) + AcpiTableBufferSize
);
80 // Add Local APIC entries for the APs to the MADT
82 for (Loop
= 1; Loop
< Count
; Loop
++) {
83 LocalApic
->Type
= EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC
;
84 LocalApic
->Length
= sizeof (*LocalApic
);
85 LocalApic
->AcpiProcessorId
= (UINT8
) Loop
;
86 LocalApic
->ApicId
= (UINT8
) Loop
;
91 Hdr
->Length
= (UINT32
) NewBufferSize
;
93 Status
= InstallAcpiTable (AcpiProtocol
, Hdr
, NewBufferSize
, TableKey
);
103 QemuInstallAcpiTable (
104 IN EFI_ACPI_TABLE_PROTOCOL
*AcpiProtocol
,
105 IN VOID
*AcpiTableBuffer
,
106 IN UINTN AcpiTableBufferSize
,
110 EFI_ACPI_DESCRIPTION_HEADER
*Hdr
;
111 EFI_ACPI_TABLE_INSTALL_ACPI_TABLE TableInstallFunction
;
113 Hdr
= (EFI_ACPI_DESCRIPTION_HEADER
*) AcpiTableBuffer
;
114 switch (Hdr
->Signature
) {
115 case EFI_ACPI_1_0_APIC_SIGNATURE
:
116 TableInstallFunction
= QemuInstallAcpiMadtTable
;
119 TableInstallFunction
= InstallAcpiTable
;
122 return TableInstallFunction (