diff options
author | andrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524> | 2011-06-08 04:32:18 +0000 |
---|---|---|
committer | andrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524> | 2011-06-08 04:32:18 +0000 |
commit | 8052c4a2b9e0c3575e912e5867cd0d7c2669c925 (patch) | |
tree | 20a53fc9216e13a113df9e9360f5899051e5727a /InOsEmuPkg/Unix/Sec/SecMain.c | |
parent | 7e284acb40a3d27009de3cfe48275fed3c5d004b (diff) | |
download | edk2-platforms-8052c4a2b9e0c3575e912e5867cd0d7c2669c925.tar.xz |
Update the FD mapping so the volatile areas write back to the FD file. Currently they are only mapped as a memory copy of the file. This also make FV read only.
The current scheme maps a file into a memory buffer. You can write to the memory buffer, but if you restart the emulator the data is not written back to the FD. Since the build, rebuilds the FD it will blow away any changes. You can now set variables and restart the emulator and they are still set. There is a bug if the FV is set to write protect that still needs to be tracked down.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11761 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'InOsEmuPkg/Unix/Sec/SecMain.c')
-rw-r--r-- | InOsEmuPkg/Unix/Sec/SecMain.c | 87 |
1 files changed, 76 insertions, 11 deletions
diff --git a/InOsEmuPkg/Unix/Sec/SecMain.c b/InOsEmuPkg/Unix/Sec/SecMain.c index 41b66b3bc0..1771f36132 100644 --- a/InOsEmuPkg/Unix/Sec/SecMain.c +++ b/InOsEmuPkg/Unix/Sec/SecMain.c @@ -212,14 +212,24 @@ main ( } FileName[Index1] = '\0'; - // - // Open the FD and remmeber where it got mapped into our processes address space - // - Status = MapFile ( - FileName, - &gFdInfo[Index].Address, - &gFdInfo[Index].Size - ); + if (Index == 0) { + // Map FV Recovery Read Only and other areas Read/Write + Status = MapFd0 ( + FileName, + &gFdInfo[0].Address, + &gFdInfo[0].Size + ); + } else { + // + // Open the FD and remmeber where it got mapped into our processes address space + // Maps Read Only + // + Status = MapFile ( + FileName, + &gFdInfo[Index].Address, + &gFdInfo[Index].Size + ); + } if (EFI_ERROR (Status)) { printf ("ERROR : Can not open Firmware Device File %s (%x). Exiting.\n", FileName, (unsigned int)Status); exit (1); @@ -350,7 +360,7 @@ MapFile ( OUT UINT64 *Length ) { - int fd; + int fd; VOID *res; UINTN FileSize; @@ -361,7 +371,7 @@ MapFile ( FileSize = lseek (fd, 0, SEEK_END); - res = MapMemory (fd, FileSize, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_SHARED); + res = MapMemory (fd, FileSize, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE); close (fd); @@ -369,13 +379,68 @@ MapFile ( perror ("MapFile() Failed"); return EFI_DEVICE_ERROR; } - + *Length = (UINT64) FileSize; *BaseAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) res; return EFI_SUCCESS; } +EFI_STATUS +MapFd0 ( + IN CHAR8 *FileName, + IN OUT EFI_PHYSICAL_ADDRESS *BaseAddress, + OUT UINT64 *Length + ) +{ + int fd; + VOID *res, *res2; + UINTN FileSize; + UINTN FvSize; + + fd = open (FileName, O_RDWR); + if (fd < 0) { + return EFI_NOT_FOUND; + } + FileSize = lseek (fd, 0, SEEK_END); + + FvSize = FixedPcdGet64 (PcdEmuFlashFvRecoverySize); + + // Assume start of FD is Recovery FV, and make it write protected + res = mmap ( + (void *)(UINTN)FixedPcdGet64 (PcdEmuFlashFvRecoveryBase), + FvSize, + PROT_READ | PROT_WRITE | PROT_EXEC, + MAP_PRIVATE, + fd, + 0 + ); + if (res == MAP_FAILED) { + perror ("MapFile() Failed res ="); + close (fd); + return EFI_DEVICE_ERROR; + } + + // Map the rest of the FD as read/write + res2 = mmap ( + (void *)(FixedPcdGet64 (PcdEmuFlashFvRecoveryBase) + FvSize), + FileSize - FvSize, + PROT_READ | PROT_WRITE | PROT_EXEC, + MAP_SHARED, + fd, + FvSize + ); + close (fd); + if (res2 == MAP_FAILED) { + perror ("MapFile() Failed res2 ="); + return EFI_DEVICE_ERROR; + } + + *Length = (UINT64) FileSize; + *BaseAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) res; + + return EFI_SUCCESS; +} /*++ |