1 /** @file
2 
3   Functions and types shared by the SMM accessor PEI and DXE modules.
4 
5   Copyright (C) 2015, Red Hat, Inc.
6 
7   This program and the accompanying materials are licensed and made available
8   under the terms and conditions of the BSD License which accompanies this
9   distribution. The full text of the license may be found at
10   http://opensource.org/licenses/bsd-license.php
11 
12   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT
13   WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14 
15 **/
16 
17 #include <Pi/PiMultiPhase.h>
18 
19 //
20 // We'll have two SMRAM ranges.
21 //
22 // The first is a tiny one that hosts an SMM_S3_RESUME_STATE object, to be
23 // filled in by the CPU SMM driver during normal boot, for the PEI instance of
24 // the LockBox library (which will rely on the object during S3 resume).
25 //
26 // The other SMRAM range is the main one, for the SMM core and the SMM drivers.
27 //
28 typedef enum {
29   DescIdxSmmS3ResumeState = 0,
30   DescIdxMain             = 1,
31   DescIdxCount            = 2
32 } DESCRIPTOR_INDEX;
33 
34 /**
35   Read the MCH_SMRAM and ESMRAMC registers, and update the LockState and
36   OpenState fields in the PEI_SMM_ACCESS_PPI / EFI_SMM_ACCESS2_PROTOCOL object,
37   from the D_LCK and T_EN bits.
38 
39   PEI_SMM_ACCESS_PPI and EFI_SMM_ACCESS2_PROTOCOL member functions can rely on
40   the LockState and OpenState fields being up-to-date on entry, and they need
41   to restore the same invariant on exit, if they touch the bits in question.
42 
43   @param[out] LockState  Reflects the D_LCK bit on output; TRUE iff SMRAM is
44                          locked.
45   @param[out] OpenState  Reflects the inverse of the T_EN bit on output; TRUE
46                          iff SMRAM is open.
47 **/
48 VOID
49 GetStates (
50   OUT BOOLEAN *LockState,
51   OUT BOOLEAN *OpenState
52   );
53 
54 //
55 // The functions below follow the PEI_SMM_ACCESS_PPI and
56 // EFI_SMM_ACCESS2_PROTOCOL member declarations. The PeiServices and This
57 // pointers are removed (TSEG doesn't depend on them), and so is the
58 // DescriptorIndex parameter (TSEG doesn't support range-wise locking).
59 //
60 // The LockState and OpenState members that are common to both
61 // PEI_SMM_ACCESS_PPI and EFI_SMM_ACCESS2_PROTOCOL are taken and updated in
62 // isolation from the rest of the (non-shared) members.
63 //
64 
65 EFI_STATUS
66 SmramAccessOpen (
67   OUT BOOLEAN *LockState,
68   OUT BOOLEAN *OpenState
69   );
70 
71 EFI_STATUS
72 SmramAccessClose (
73   OUT BOOLEAN *LockState,
74   OUT BOOLEAN *OpenState
75   );
76 
77 EFI_STATUS
78 SmramAccessLock (
79   OUT    BOOLEAN *LockState,
80   IN OUT BOOLEAN *OpenState
81   );
82 
83 EFI_STATUS
84 SmramAccessGetCapabilities (
85   IN BOOLEAN                  LockState,
86   IN BOOLEAN                  OpenState,
87   IN OUT UINTN                *SmramMapSize,
88   IN OUT EFI_SMRAM_DESCRIPTOR *SmramMap
89   );
90