varfile.c

来自「Next BIOS Source code : Extensible Firmw」· C语言 代码 · 共 659 行 · 第 1/2 页

C
659
字号

    } else {

        BS->FreePool(Dev);

        DEBUG ((D_VAR|D_ERROR, "VarAddBSStore: Volume not available, NV+BS is using BS only\n"));

        PlInitNvVarStoreMem (Attributes, BankSize, NoBanks);
    }
}

#pragma RUNTIME_CODE(RtVarBSDeviceSetVirtualMapping)
VOID
STATIC RUNTIMEFUNCTION
RtVarBSDeviceSetVirtualMapping (
    IN EFI_EVENT            Event,
    IN VOID                 *Context
    )
{
    VAR_DEV              *VarDevice;
    EFI_CONVERT_POINTER  ConvertPointer;

    VarDevice = Context;

    ConvertPointer = RT->ConvertPointer;

    VarDevice->VarStore.ClearStore  = RtVarBSClearStore;
    VarDevice->VarStore.ReadStore   = RtVarBSReadStore;
    VarDevice->VarStore.UpdateStore = RtVarBSUpdateStore;
    VarDevice->VarStore.SizeStore   = NULL;

    ConvertPointer (EFI_INTERNAL_FNC, (VOID **) &VarDevice->VarStore.ClearStore);
    ConvertPointer (EFI_INTERNAL_FNC, (VOID **) &VarDevice->VarStore.ReadStore);
    ConvertPointer (EFI_INTERNAL_FNC, (VOID **) &VarDevice->VarStore.UpdateStore);
    ConvertPointer (EFI_INTERNAL_FNC, (VOID **) &VarDevice->VarStore.SizeStore);
}

#pragma RUNTIME_CODE(RtVarBSClearStore)
STATIC
EFI_STATUS
RUNTIMEFUNCTION
RtVarBSClearStore(
    IN EFI_VARIABLE_STORE   *This,
    IN UINTN                BankNo,
    IN VOID                 *Scratch
    )
{
    return EFI_SUCCESS;
}

#pragma RUNTIME_CODE(RtVarBSReadStore)
STATIC
EFI_STATUS
RUNTIMEFUNCTION
RtVarBSReadStore (
    IN EFI_VARIABLE_STORE   *This,
    IN UINTN                BankNo,
    IN UINTN                Offset,
    IN UINTN                BufferSize,
    OUT VOID                *Buffer
    )
{
    RtSetMem (Buffer, BufferSize, 0xff);
    return EFI_SUCCESS;
}

#pragma RUNTIME_CODE(RtVarBSUpdateStore)
STATIC
EFI_STATUS
RUNTIMEFUNCTION
RtVarBSUpdateStore (
    IN EFI_VARIABLE_STORE   *This,
    IN UINTN                BankNo,
    IN UINTN                Offset,
    IN UINTN                BufferSize,
    IN VOID                 *UserBuffer
    )
{
    return EFI_SUCCESS;
}


STATIC
VOID
VarOpenBSStore (
    IN VAR_DEV              *Dev,
    IN UINT64               OpenMode,
    OUT UINT64              *AvailableSpace
    )
{
    EFI_HANDLE              Handle;
    EFI_FILE_HANDLE         Vol, DirHandle;
    EFI_FILE_SYSTEM_INFO    *Info;    
    EFI_STATUS              Status;
    UINTN                   BufferSize;
    UINT64                  Attr;
    EFI_DEVICE_PATH         *DevicePath;

    ASSERT (!Dev->File);

    if (AvailableSpace) {
        *AvailableSpace = 0;
    }

    DevicePath = Dev->DevicePath;
    Status = BS->LocateDevicePath (&FileSystemProtocol, &DevicePath, &Handle);
    if (EFI_ERROR(Status) || (Handle == NULL)) {
        return;
    }

    OpenMode = OpenMode | EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE;
    Attr = EFI_FILE_HIDDEN | EFI_FILE_SYSTEM;

    //
    // Connect to the volume
    //

    Vol = LibOpenRoot(Handle);
    if (Vol) {

        //
        // Open/create the efi directory
        //

        Status = Vol->Open (
                    Vol, 
                    &DirHandle, 
                    L"efi",
                    EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE, 
                    EFI_FILE_DIRECTORY
                    );
        if (EFI_ERROR (Status)) {

          Status = Vol->Open (
                      Vol, 
                      &DirHandle, 
                      L"efi",
                      OpenMode, 
                      Attr | EFI_FILE_DIRECTORY
                      );
        }

        if (!EFI_ERROR(Status)) {

            //
            // Open the boot store file
            //

            Status = DirHandle->Open (
                        DirHandle, 
                        &Dev->File, 
                        L"BootStr", 
                        OpenMode,
                        Attr
                        );

            DirHandle->Close (DirHandle);
        }

        //
        // On error, return the available space
        //

        if (EFI_ERROR(Status) && AvailableSpace) {
            BufferSize = sizeof(Info);
            Info = LibFileSystemInfo (Vol);
            if (Info) {
                if (!Info->ReadOnly) {
                    *AvailableSpace = Info->FreeSpace;
                }

                FreePool (Info);
            }
        }

        //
        // Close the volume handle
        //

        Vol->Close (Vol);
    }
}

STATIC
EFI_STATUS
VarBSOpenStore (
    IN EFI_VARIABLE_STORE   *This,
    IN UINTN                BankNo,    
    IN UINTN                Offset
    )
{
    EFI_STATUS              Status;    
    VAR_DEV                 *Dev;

    Dev = DEV_FROM_THIS(This);

    //
    // If the boot store file isn't open, open it now
    //

    if (!Dev->File) {
        VarOpenBSStore (Dev, 0, NULL);
    }

    //
    // Set the position for the io
    //

    if (Dev->File) {
        Offset = Offset + BankNo * Dev->BankSize;
        Status = Dev->File->SetPosition (Dev->File, Offset);
    } else {
        DEBUG((D_ERROR,"NVRAM : Can not open \\Efi\\BootStr on %s\n",DevicePathToStr(Dev->DevicePath)));
        Status = EFI_NOT_FOUND;
    }

    return Status;
}
    

STATIC
EFI_STATUS
VarBSClearStore(
    IN EFI_VARIABLE_STORE   *This,
    IN UINTN                BankNo,
    IN OUT VOID             *Scratch
    )
{
    EFI_STATUS              Status;
    UINTN                   WriteSize;
    VAR_DEV                 *Dev;

    Dev = DEV_FROM_THIS(This);

    Status = VarBSOpenStore (This, BankNo, 0);

    if (!EFI_ERROR(Status)) {

        //
        // Write all 1 bits to the bank
        //

        WriteSize = Dev->BankSize;
        Status = Dev->File->Write (Dev->File, &WriteSize, Dev->Scratch);
        Dev->File->Flush (Dev->File);
        Dev->File->Close (Dev->File);
    }
    Dev->File = NULL;

    return Status;
}


STATIC
EFI_STATUS
VarBSReadStore (
    IN EFI_VARIABLE_STORE   *This,
    IN UINTN                BankNo,
    IN UINTN                Offset,
    IN UINTN                BufferSize,
    OUT VOID                *Buffer
    )
{
    EFI_STATUS              Status;
    VAR_DEV                 *Dev;

    Dev = DEV_FROM_THIS(This);

    Status = VarBSOpenStore (This, BankNo, Offset);

    if (!EFI_ERROR(Status)) {
        Status = Dev->File->Read (Dev->File, &BufferSize, Buffer);
        Dev->File->Flush (Dev->File);
        Dev->File->Close (Dev->File);
    }
    Dev->File = NULL;

    return Status;
}


STATIC
EFI_STATUS
VarBSUpdateStore (
    IN EFI_VARIABLE_STORE   *This,
    IN UINTN                BankNo,
    IN UINTN                Offset,
    IN UINTN                BufferSize,
    IN VOID                 *Buffer
    )
{
    EFI_STATUS              Status;
    VAR_DEV                 *Dev;

    Dev = DEV_FROM_THIS(This);

    Status = VarBSOpenStore (This, BankNo, Offset);

    if (!EFI_ERROR(Status)) {
        Status = Dev->File->Write (Dev->File, &BufferSize, Buffer);
        Dev->File->Flush (Dev->File);
        Dev->File->Close (Dev->File);
    }
    Dev->File = NULL;

    return Status;
}

STATIC
EFI_STATUS
VarBSSizeStore (
    IN EFI_VARIABLE_STORE   *This,
    IN UINTN                NoBanks
    )
{
    EFI_STATUS              Status;
    UINT8                   c;
    VAR_DEV                 *Dev;

    Dev = DEV_FROM_THIS(This);

    Status = VarBSUpdateStore (This, NoBanks, -1, 1, &c);
    if (!EFI_ERROR(Status)) {
        Dev->VarStore.NoBanks = (UINT32) NoBanks;
    }

    return Status;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?