Home | History | Annotate | Download | only in FSVariable
      1 /*++
      2 
      3 Caution: This file is used for Duet platform only, do not use them in real platform.
      4 All variable code, variable metadata, and variable data used by Duet platform are on
      5 disk. They can be changed by user. BIOS is not able to protoect those.
      6 Duet trusts all meta data from disk. If variable code, variable metadata and variable
      7 data is modified in inproper way, the behavior is undefined.
      8 
      9 Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
     10 This program and the accompanying materials
     11 are licensed and made available under the terms and conditions of the BSD License
     12 which accompanies this distribution.  The full text of the license may be found at
     13 http://opensource.org/licenses/bsd-license.php
     14 
     15 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     16 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     17 
     18 Module Name:
     19 
     20     MemStorage.c
     21 
     22 Abstract:
     23 
     24     handles variable store/reads with emulated memory
     25 
     26 Revision History
     27 
     28 --*/
     29 #include "FSVariable.h"
     30 
     31 VOID
     32 EFIAPI
     33 OnVirtualAddressChangeMs (
     34   IN EFI_EVENT            Event,
     35   IN VOID                 *Context
     36   );
     37 
     38 EFI_STATUS
     39 EFIAPI
     40 MemEraseStore(
     41   IN VARIABLE_STORAGE   *This
     42   );
     43 
     44 EFI_STATUS
     45 EFIAPI
     46 MemWriteStore (
     47   IN VARIABLE_STORAGE   *This,
     48   IN UINTN                Offset,
     49   IN UINTN                BufferSize,
     50   IN VOID                 *Buffer
     51   );
     52 
     53 EFI_STATUS
     54 MemStorageConstructor (
     55   OUT VARIABLE_STORAGE          **VarStore,
     56   OUT EFI_EVENT_NOTIFY          *GoVirtualEvent,
     57   IN  UINTN                     Size
     58   )
     59 {
     60   EFI_STATUS                  Status;
     61   VS_DEV                      *Dev;
     62 
     63   Status = gBS->AllocatePool (EfiRuntimeServicesData, sizeof(VS_DEV), (VOID **) &Dev);
     64   ASSERT_EFI_ERROR (Status);
     65 
     66   ZeroMem (Dev, sizeof(VS_DEV));
     67 
     68   Dev->Signature   = VS_DEV_SIGNATURE;
     69   Dev->Size        = Size;
     70 
     71   Dev->VarStore.Erase    = MemEraseStore;
     72   Dev->VarStore.Write    = MemWriteStore;
     73 
     74   Status = gBS->AllocatePool (EfiRuntimeServicesData, Size, (VOID **) &VAR_DATA_PTR (Dev));
     75   ASSERT_EFI_ERROR (Status);
     76 
     77   DEBUG ((EFI_D_ERROR, "VStorage: Size = 0x%x\n", Size));
     78 
     79   *VarStore       = &Dev->VarStore;
     80   *GoVirtualEvent = OnVirtualAddressChangeMs;
     81 
     82   return EFI_SUCCESS;
     83 }
     84 
     85 VOID
     86 EFIAPI
     87 OnVirtualAddressChangeMs (
     88   IN EFI_EVENT            Event,
     89   IN VOID                 *Context
     90   )
     91 {
     92   VS_DEV                  *Dev;
     93 
     94   Dev = DEV_FROM_THIS (Context);
     95 
     96   EfiConvertPointer (0, (VOID **)&VAR_DATA_PTR (Dev));
     97   EfiConvertPointer (0, (VOID **)&Dev->VarStore.Erase);
     98   EfiConvertPointer (0, (VOID **)&Dev->VarStore.Write);
     99 }
    100 
    101 EFI_STATUS
    102 EFIAPI
    103 MemEraseStore(
    104   IN VARIABLE_STORAGE   *This
    105   )
    106 {
    107   VS_DEV              *Dev;
    108 
    109   Dev = DEV_FROM_THIS(This);
    110   SetMem (VAR_DATA_PTR (Dev), Dev->Size, VAR_DEFAULT_VALUE);
    111   return EFI_SUCCESS;
    112 }
    113 
    114 
    115 EFI_STATUS
    116 EFIAPI
    117 MemWriteStore (
    118   IN VARIABLE_STORAGE     *This,
    119   IN UINTN                Offset,
    120   IN UINTN                BufferSize,
    121   IN VOID                 *UserBuffer
    122   )
    123 {
    124   VS_DEV              *Dev;
    125 
    126   Dev = DEV_FROM_THIS(This);
    127 
    128   ASSERT (Offset + BufferSize < Dev->Size);
    129 
    130   // For better performance
    131   if (VAR_DATA_PTR (Dev) + Offset != UserBuffer) {
    132     CopyMem (VAR_DATA_PTR (Dev) + Offset, UserBuffer, BufferSize);
    133   }
    134   return EFI_SUCCESS;
    135 }
    136