summaryrefslogtreecommitdiff
path: root/ArmVirtPkg/QemuFwCfgToPcdDxe/QemuFwCfgToPcd.c
blob: 814bb5c55eccea34cb01c70fef5190e49ee2ef35 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/** @file
*  An "early" DXE driver that parses well-known fw-cfg files into dynamic PCDs
*  that control other (universal) DXE drivers.
*
*  Copyright (C) 2015, Red Hat, Inc.
*  Copyright (c) 2014, Linaro Ltd. All rights reserved.<BR>
*
*  This program and the accompanying materials are licensed and made available
*  under the terms and conditions of the BSD License which accompanies this
*  distribution.  The full text of the license may be found at
*  http://opensource.org/licenses/bsd-license.php
*
*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR
*  IMPLIED.
*
**/

#include <Uefi/UefiBaseType.h>
#include <Uefi/UefiSpec.h>

#include <IndustryStandard/SmBios.h>

#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/PcdLib.h>
#include <Library/QemuFwCfgLib.h>


/**
  Set the SMBIOS entry point version for the generic SmbiosDxe driver.
**/
STATIC
VOID
SmbiosVersionInitialization (
  VOID
  )
{
  FIRMWARE_CONFIG_ITEM     Anchor;
  UINTN                    AnchorSize;
  SMBIOS_TABLE_ENTRY_POINT QemuAnchor;
  UINT16                   SmbiosVersion;

  if (RETURN_ERROR (QemuFwCfgFindFile ("etc/smbios/smbios-anchor", &Anchor,
                      &AnchorSize)) ||
      AnchorSize != sizeof QemuAnchor) {
    return;
  }

  QemuFwCfgSelectItem (Anchor);
  QemuFwCfgReadBytes (AnchorSize, &QemuAnchor);
  if (CompareMem (QemuAnchor.AnchorString, "_SM_", 4) != 0 ||
      CompareMem (QemuAnchor.IntermediateAnchorString, "_DMI_", 5) != 0) {
    return;
  }

  SmbiosVersion = (UINT16)(QemuAnchor.MajorVersion << 8 |
                           QemuAnchor.MinorVersion);
  DEBUG ((EFI_D_INFO, "%a: SMBIOS version from QEMU: 0x%04x\n", __FUNCTION__,
    SmbiosVersion));
  PcdSet16 (PcdSmbiosVersion, SmbiosVersion);
}

EFI_STATUS
EFIAPI
ParseQemuFwCfgToPcd (
  IN EFI_HANDLE       ImageHandle,
  IN EFI_SYSTEM_TABLE *SystemTable
  )
{
  SmbiosVersionInitialization ();
  return EFI_SUCCESS;
}