Home | History | Annotate | Download | only in SmmAccess
      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