]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDebug1CommandsLib/EfiDecompress.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / EfiDecompress.c
CommitLineData
5d73d92f 1/** @file\r
2 Main file for EfiDecompress shell Debug1 function.\r
3\r
c011b6c9 4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
ba0014b9 5 Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>\r
56ba3746 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
5d73d92f 7\r
8**/\r
9\r
10#include "UefiShellDebug1CommandsLib.h"\r
11#include <Protocol/Decompress.h>\r
12\r
3737ac2b 13/**\r
14 Function for 'decompress' command.\r
15\r
16 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
17 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
18**/\r
5d73d92f 19SHELL_STATUS\r
20EFIAPI\r
21ShellCommandRunEfiDecompress (\r
22 IN EFI_HANDLE ImageHandle,\r
23 IN EFI_SYSTEM_TABLE *SystemTable\r
24 )\r
25{\r
47d20b54
MK
26 EFI_STATUS Status;\r
27 LIST_ENTRY *Package;\r
28 CHAR16 *ProblemParam;\r
29 SHELL_STATUS ShellStatus;\r
30 SHELL_FILE_HANDLE InFileHandle;\r
31 SHELL_FILE_HANDLE OutFileHandle;\r
32 UINT32 OutSize;\r
33 UINTN OutSizeTemp;\r
34 VOID *OutBuffer;\r
35 UINTN InSize;\r
36 VOID *InBuffer;\r
37 CHAR16 *InFileName;\r
38 CONST CHAR16 *OutFileName;\r
39 UINT64 Temp64Bit;\r
40 UINT32 ScratchSize;\r
41 VOID *ScratchBuffer;\r
42 EFI_DECOMPRESS_PROTOCOL *Decompress;\r
43 CONST CHAR16 *TempParam;\r
44\r
45 InFileName = NULL;\r
46 OutFileName = NULL;\r
47 OutSize = 0;\r
48 ScratchSize = 0;\r
49 ShellStatus = SHELL_SUCCESS;\r
50 Status = EFI_SUCCESS;\r
51 OutBuffer = NULL;\r
52 InBuffer = NULL;\r
53 ScratchBuffer = NULL;\r
54 InFileHandle = NULL;\r
55 OutFileHandle = NULL;\r
56 Decompress = NULL;\r
5d73d92f 57\r
58 //\r
59 // initialize the shell lib (we must be in non-auto-init...)\r
60 //\r
47d20b54
MK
61 Status = ShellInitialize ();\r
62 ASSERT_EFI_ERROR (Status);\r
5d73d92f 63\r
47d20b54
MK
64 Status = CommandInit ();\r
65 ASSERT_EFI_ERROR (Status);\r
5d73d92f 66\r
67 //\r
68 // parse the command line\r
69 //\r
70 Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE);\r
47d20b54
MK
71 if (EFI_ERROR (Status)) {\r
72 if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) {\r
73 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"efidecompress", ProblemParam);\r
74 FreePool (ProblemParam);\r
5d73d92f 75 ShellStatus = SHELL_INVALID_PARAMETER;\r
76 } else {\r
47d20b54 77 ASSERT (FALSE);\r
5d73d92f 78 }\r
79 } else {\r
47d20b54
MK
80 if (ShellCommandLineGetCount (Package) > 3) {\r
81 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"efidecompress");\r
5d73d92f 82 ShellStatus = SHELL_INVALID_PARAMETER;\r
47d20b54
MK
83 } else if (ShellCommandLineGetCount (Package) < 3) {\r
84 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"efidecompress");\r
5d73d92f 85 ShellStatus = SHELL_INVALID_PARAMETER;\r
86 } else {\r
47d20b54
MK
87 TempParam = ShellCommandLineGetRawValue (Package, 1);\r
88 ASSERT (TempParam != NULL);\r
89 InFileName = ShellFindFilePath (TempParam);\r
90 OutFileName = ShellCommandLineGetRawValue (Package, 2);\r
3737ac2b 91 if (InFileName == NULL) {\r
47d20b54 92 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_FILE_FIND_FAIL), gShellDebug1HiiHandle, L"efidecompress", TempParam);\r
5d73d92f 93 ShellStatus = SHELL_NOT_FOUND;\r
5d73d92f 94 } else {\r
47d20b54
MK
95 if (ShellIsDirectory (InFileName) == EFI_SUCCESS) {\r
96 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, L"efidecompress", InFileName);\r
3737ac2b 97 ShellStatus = SHELL_INVALID_PARAMETER;\r
98 }\r
47d20b54
MK
99\r
100 if (ShellIsDirectory (OutFileName) == EFI_SUCCESS) {\r
101 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_FILE_NOT_DIR), gShellDebug1HiiHandle, L"efidecompress", OutFileName);\r
3737ac2b 102 ShellStatus = SHELL_INVALID_PARAMETER;\r
103 }\r
47d20b54 104\r
3737ac2b 105 if (ShellStatus == SHELL_SUCCESS) {\r
47d20b54
MK
106 Status = ShellOpenFileByName (InFileName, &InFileHandle, EFI_FILE_MODE_READ, 0);\r
107 if (EFI_ERROR (Status)) {\r
108 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, L"efidecompress", ShellCommandLineGetRawValue (Package, 1));\r
3737ac2b 109 ShellStatus = SHELL_NOT_FOUND;\r
110 }\r
3737ac2b 111 }\r
112\r
113 if (ShellStatus == SHELL_SUCCESS) {\r
47d20b54
MK
114 Status = FileHandleGetSize (InFileHandle, &Temp64Bit);\r
115 ASSERT (Temp64Bit <= (UINT32)(-1));\r
3737ac2b 116 InSize = (UINTN)Temp64Bit;\r
47d20b54
MK
117 ASSERT_EFI_ERROR (Status);\r
118 InBuffer = AllocateZeroPool (InSize);\r
aba0ca78
RN
119 if (InBuffer == NULL) {\r
120 Status = EFI_OUT_OF_RESOURCES;\r
121 } else {\r
122 Status = gEfiShellProtocol->ReadFile (InFileHandle, &InSize, InBuffer);\r
123 ASSERT_EFI_ERROR (Status);\r
3737ac2b 124\r
47d20b54 125 Status = gBS->LocateProtocol (&gEfiDecompressProtocolGuid, NULL, (VOID **)&Decompress);\r
aba0ca78
RN
126 ASSERT_EFI_ERROR (Status);\r
127\r
47d20b54 128 Status = Decompress->GetInfo (Decompress, InBuffer, (UINT32)InSize, &OutSize, &ScratchSize);\r
aba0ca78 129 }\r
3737ac2b 130\r
47d20b54
MK
131 if (EFI_ERROR (Status) || (OutSize == 0)) {\r
132 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_EFI_DECOMPRESS_NOPE), gShellDebug1HiiHandle, InFileName);\r
09a43a5d 133 ShellStatus = SHELL_NOT_FOUND;\r
3737ac2b 134 } else {\r
47d20b54
MK
135 Status = ShellOpenFileByName (OutFileName, &OutFileHandle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE|EFI_FILE_MODE_CREATE, 0);\r
136 if (EFI_ERROR (Status)) {\r
137 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_FILE_OPEN_FAIL), gShellDebug1HiiHandle, ShellCommandLineGetRawValue (Package, 2), Status);\r
09a43a5d
JC
138 ShellStatus = SHELL_NOT_FOUND;\r
139 } else {\r
47d20b54
MK
140 OutBuffer = AllocateZeroPool (OutSize);\r
141 ScratchBuffer = AllocateZeroPool (ScratchSize);\r
142 if ((OutBuffer == NULL) || (ScratchBuffer == NULL)) {\r
aba0ca78 143 Status = EFI_OUT_OF_RESOURCES;\r
09a43a5d 144 } else {\r
47d20b54 145 Status = Decompress->Decompress (Decompress, InBuffer, (UINT32)InSize, OutBuffer, OutSize, ScratchBuffer, ScratchSize);\r
09a43a5d 146 }\r
aba0ca78
RN
147 }\r
148 }\r
149\r
150 if (EFI_ERROR (Status)) {\r
151 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_EFI_DECOMPRESS_FAIL), gShellDebug1HiiHandle, Status);\r
152 ShellStatus = ((Status == EFI_OUT_OF_RESOURCES) ? SHELL_OUT_OF_RESOURCES : SHELL_DEVICE_ERROR);\r
153 } else {\r
154 OutSizeTemp = OutSize;\r
47d20b54
MK
155 Status = gEfiShellProtocol->WriteFile (OutFileHandle, &OutSizeTemp, OutBuffer);\r
156 OutSize = (UINT32)OutSizeTemp;\r
aba0ca78
RN
157 if (EFI_ERROR (Status)) {\r
158 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_FILE_WRITE_FAIL), gShellDebug1HiiHandle, L"efidecompress", OutFileName, Status);\r
159 ShellStatus = SHELL_DEVICE_ERROR;\r
160 }\r
3737ac2b 161 }\r
5d73d92f 162 }\r
163 }\r
164 }\r
165\r
166 ShellCommandLineFreeVarList (Package);\r
167 }\r
47d20b54 168\r
5d73d92f 169 if (InFileHandle != NULL) {\r
47d20b54 170 gEfiShellProtocol->CloseFile (InFileHandle);\r
5d73d92f 171 }\r
47d20b54 172\r
5d73d92f 173 if (OutFileHandle != NULL) {\r
47d20b54 174 gEfiShellProtocol->CloseFile (OutFileHandle);\r
5d73d92f 175 }\r
3737ac2b 176\r
47d20b54
MK
177 SHELL_FREE_NON_NULL (InFileName);\r
178 SHELL_FREE_NON_NULL (InBuffer);\r
179 SHELL_FREE_NON_NULL (OutBuffer);\r
180 SHELL_FREE_NON_NULL (ScratchBuffer);\r
5d73d92f 181\r
182 return (ShellStatus);\r
183}\r