Home | History | Annotate | Download | only in Smm
      1 /** @file
      2   Runtime memory status code worker.
      3 
      4   Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
      5   (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
      6   This program and the accompanying materials
      7   are licensed and made available under the terms and conditions of the BSD License
      8   which accompanies this distribution.  The full text of the license may be found at
      9   http://opensource.org/licenses/bsd-license.php
     10 
     11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 **/
     15 
     16 #include "StatusCodeHandlerSmm.h"
     17 
     18 RUNTIME_MEMORY_STATUSCODE_HEADER  *mSmmMemoryStatusCodeTable;
     19 
     20 /**
     21   Initialize SMM memory status code table as initialization for memory status code worker
     22 
     23   @retval EFI_SUCCESS  SMM memory status code table successfully initialized.
     24   @retval others       Errors from gSmst->SmmInstallConfigurationTable().
     25 **/
     26 EFI_STATUS
     27 MemoryStatusCodeInitializeWorker (
     28   VOID
     29   )
     30 {
     31   EFI_STATUS                        Status;
     32 
     33   //
     34   // Allocate SMM memory status code pool.
     35   //
     36   mSmmMemoryStatusCodeTable = (RUNTIME_MEMORY_STATUSCODE_HEADER *)AllocateZeroPool (sizeof (RUNTIME_MEMORY_STATUSCODE_HEADER) + PcdGet16 (PcdStatusCodeMemorySize) * 1024);
     37   ASSERT (mSmmMemoryStatusCodeTable != NULL);
     38 
     39   mSmmMemoryStatusCodeTable->MaxRecordsNumber = (PcdGet16 (PcdStatusCodeMemorySize) * 1024) / sizeof (MEMORY_STATUSCODE_RECORD);
     40   Status = gSmst->SmmInstallConfigurationTable (
     41                     gSmst,
     42                     &gMemoryStatusCodeRecordGuid,
     43                     &mSmmMemoryStatusCodeTable,
     44                     sizeof (mSmmMemoryStatusCodeTable)
     45                     );
     46   return Status;
     47 }
     48 
     49 
     50 /**
     51   Report status code into runtime memory. If the runtime pool is full, roll back to the
     52   first record and overwrite it.
     53 
     54   @param  CodeType                Indicates the type of status code being reported.
     55   @param  Value                   Describes the current status of a hardware or software entity.
     56                                   This included information about the class and subclass that is used to
     57                                   classify the entity as well as an operation.
     58   @param  Instance                The enumeration of a hardware or software entity within
     59                                   the system. Valid instance numbers start with 1.
     60   @param  CallerId                This optional parameter may be used to identify the caller.
     61                                   This parameter allows the status code driver to apply different rules to
     62                                   different callers.
     63   @param  Data                    This optional parameter may be used to pass additional data.
     64 
     65   @retval EFI_SUCCESS             Status code successfully recorded in runtime memory status code table.
     66 
     67 **/
     68 EFI_STATUS
     69 EFIAPI
     70 MemoryStatusCodeReportWorker (
     71   IN EFI_STATUS_CODE_TYPE               CodeType,
     72   IN EFI_STATUS_CODE_VALUE              Value,
     73   IN UINT32                             Instance,
     74   IN EFI_GUID                           *CallerId,
     75   IN EFI_STATUS_CODE_DATA               *Data OPTIONAL
     76   )
     77 {
     78   MEMORY_STATUSCODE_RECORD              *Record;
     79 
     80   //
     81   // Locate current record buffer.
     82   //
     83   Record = (MEMORY_STATUSCODE_RECORD *) (mSmmMemoryStatusCodeTable + 1);
     84   Record = &Record[mSmmMemoryStatusCodeTable->RecordIndex++];
     85 
     86   //
     87   // Save status code.
     88   //
     89   Record->CodeType = CodeType;
     90   Record->Value    = Value;
     91   Record->Instance = Instance;
     92 
     93   //
     94   // If record index equals to max record number, then wrap around record index to zero.
     95   //
     96   // The reader of status code should compare the number of records with max records number,
     97   // If it is equal to or larger than the max number, then the wrap-around had happened,
     98   // so the first record is pointed by record index.
     99   // If it is less then max number, index of the first record is zero.
    100   //
    101   mSmmMemoryStatusCodeTable->NumberOfRecords++;
    102   if (mSmmMemoryStatusCodeTable->RecordIndex == mSmmMemoryStatusCodeTable->MaxRecordsNumber) {
    103     //
    104     // Wrap around record index.
    105     //
    106     mSmmMemoryStatusCodeTable->RecordIndex = 0;
    107   }
    108 
    109   return EFI_SUCCESS;
    110 }
    111 
    112 
    113 
    114