229 lines
4.6 KiB
C
229 lines
4.6 KiB
C
/*++
|
|
|
|
Copyright (c) 1999 Intel Corporation
|
|
|
|
Module Name:
|
|
libMemImage.c
|
|
|
|
Abstract:
|
|
Defines the routines for handling a memory buffer
|
|
|
|
--*/
|
|
|
|
#ifndef _LIB_MEM_IMAGE
|
|
#define _LIB_MEM_IMAGE
|
|
|
|
#include "libMisc.h"
|
|
|
|
STATIC EFI_STATUS MemImageInit (VOID);
|
|
STATIC EFI_STATUS MemImageOpen (VOID);
|
|
STATIC EFI_STATUS MemImageClose (VOID);
|
|
STATIC EFI_STATUS MemImageCleanup (VOID);
|
|
STATIC EFI_STATUS MemImageRead (VOID);
|
|
STATIC EFI_STATUS MemImageWrite (VOID);
|
|
STATIC EFI_STATUS MemImageSetOffset (UINTN);
|
|
STATIC EFI_STATUS MemImageSetSize (UINTN);
|
|
|
|
extern EE_BUFFER_IMAGE BufferImage;
|
|
|
|
EE_MEM_IMAGE MemImage = {
|
|
NULL,
|
|
0,
|
|
0,
|
|
MemImageInit,
|
|
MemImageSetOffset,
|
|
MemImageSetSize,
|
|
};
|
|
|
|
STATIC
|
|
EFI_STATUS
|
|
MemImageInit (
|
|
VOID
|
|
)
|
|
{
|
|
BufferImage.ImageCleanup();
|
|
|
|
MemImage.IoFncs = AllocatePool(sizeof(EFI_DEVICE_IO_INTERFACE));
|
|
|
|
BufferImage.ImageCleanup = MemImageCleanup;
|
|
BufferImage.Open = MemImageOpen;
|
|
BufferImage.Close = MemImageClose;
|
|
BufferImage.Read = MemImageRead;
|
|
BufferImage.Write = MemImageWrite;
|
|
BufferImage.BufferType = MEM_BUFFER;
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
STATIC
|
|
EFI_STATUS
|
|
MemImageOpen (
|
|
VOID
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
EFI_HANDLE Handle;
|
|
EFI_DEVICE_PATH *DevicePath;
|
|
EFI_DEV_PATH Node;
|
|
|
|
ZeroMem(&Node,sizeof(Node));
|
|
Node.DevPath.Type = HARDWARE_DEVICE_PATH;
|
|
Node.DevPath.SubType = HW_MEMMAP_DP;
|
|
SetDevicePathNodeLength(&Node.DevPath,sizeof(MEMMAP_DEVICE_PATH));
|
|
|
|
Node.MemMap.StartingAddress = MemImage.Offset;
|
|
Node.MemMap.EndingAddress = MemImage.Offset + MemImage.Size;
|
|
|
|
DevicePath = AppendDevicePathNode (EndDevicePath, &Node.DevPath);
|
|
|
|
Status = BS->LocateDevicePath(&DevicePathProtocol,
|
|
&DevicePath,
|
|
&Handle
|
|
);
|
|
if (EFI_ERROR(Status)) {
|
|
EditorError(Status,L"MemImageOpen: Could not get DevicePath");
|
|
return Status;
|
|
}
|
|
|
|
Status = BS->HandleProtocol (Handle,
|
|
&DeviceIoProtocol,
|
|
&MemImage.IoFncs
|
|
);
|
|
if (EFI_ERROR(Status)) {
|
|
EditorError(Status,L"MemImageOpen: Could not get DeviceIo Protocol");
|
|
return Status;
|
|
}
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
STATIC
|
|
EFI_STATUS
|
|
MemImageClose (
|
|
VOID
|
|
)
|
|
{
|
|
LineDeleteAll(BufferImage.ListHead);
|
|
BufferImage.NumBytes = 0;
|
|
|
|
MainEditor.FileBuffer->Offset = 0x00;
|
|
MainEditor.StatusBar->SetOffset(0x00);
|
|
MainEditor.FileBuffer->LowVisibleOffset = 0x00;
|
|
|
|
MainEditor.FileBuffer->SetPosition(DISP_START_ROW,HEX_POSITION);
|
|
|
|
MainEditor.FileModified = FALSE;
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
STATIC
|
|
EFI_STATUS
|
|
MemImageCleanup (
|
|
VOID
|
|
)
|
|
{
|
|
if (MemImage.IoFncs != NULL) {
|
|
FreePool(MemImage.IoFncs);
|
|
}
|
|
|
|
MemImage.Offset = 0;
|
|
MemImage.Size = 0;
|
|
|
|
BufferImage.ImageCleanup = Nothing;
|
|
BufferImage.Open = Nothing;
|
|
BufferImage.Close = Nothing;
|
|
BufferImage.Read = Nothing;
|
|
BufferImage.Write = Nothing;
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
STATIC
|
|
EFI_STATUS
|
|
MemImageRead (
|
|
VOID
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
VOID *Buffer;
|
|
|
|
Buffer = AllocatePool(MemImage.Size);
|
|
|
|
Status = MemImage.IoFncs->Mem.Read (
|
|
MemImage.IoFncs,
|
|
IO_UINT8,
|
|
MemImage.Offset,
|
|
MemImage.Size,
|
|
Buffer
|
|
);
|
|
|
|
if (EFI_ERROR(Status)) {
|
|
EditorError(Status,L"MemImageRead: Trouble Reading Memory");
|
|
return Status;
|
|
}
|
|
|
|
BufferToList(BufferImage.ListHead,MemImage.Size,Buffer);
|
|
|
|
FreePool(Buffer);
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
STATIC
|
|
EFI_STATUS
|
|
MemImageWrite (
|
|
VOID
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
VOID *Buffer;
|
|
|
|
MemImage.Size = MainEditor.BufferImage->NumBytes;
|
|
Buffer = AllocatePool(MemImage.Size);
|
|
|
|
/*
|
|
* Construct the buffer from the list of lines
|
|
*/
|
|
|
|
Status = MemImage.IoFncs->Mem.Write (
|
|
MemImage.IoFncs,
|
|
IO_UINT8,
|
|
MemImage.Offset,
|
|
MemImage.Size,
|
|
Buffer
|
|
);
|
|
|
|
if (EFI_ERROR(Status)) {
|
|
EditorError(Status,L"Trouble Writing Memory");
|
|
}
|
|
|
|
FreePool(Buffer);
|
|
|
|
return Status;
|
|
}
|
|
|
|
STATIC
|
|
EFI_STATUS
|
|
MemImageSetOffset (
|
|
IN UINTN Offset
|
|
)
|
|
{
|
|
MemImage.Offset = Offset;
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
STATIC
|
|
EFI_STATUS
|
|
MemImageSetSize (
|
|
IN UINTN Size
|
|
)
|
|
{
|
|
MemImage.Size = Size;
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
|
|
|
|
#endif _LIB_MEM_IMAGE
|