1/*	$NetBSD: efishell.h,v 1.1.1.1 2021/09/30 18:50:09 jmcneill Exp $	*/
2
3/**
4  EFI Shell protocol as defined in the UEFI Shell Specification 2.2.
5
6  (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR>
7  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
8  SPDX-License-Identifier: BSD-2-Clause-Patent
9
10  This file is based on MdePkg/Include/Protocol/Shell.h from EDK2
11  Ported to gnu-efi by Jiaqing Zhao <jiaqing.zhao@intel.com>
12**/
13
14#ifndef _EFI_SHELL_H
15#define _EFI_SHELL_H
16
17#include "efilink.h"
18
19#define EFI_SHELL_PROTOCOL_GUID \
20    { 0x6302d008, 0x7f9b, 0x4f30, { 0x87, 0xac, 0x60, 0xc9, 0xfe, 0xf5, 0xda, 0x4e } }
21
22INTERFACE_DECL(_EFI_SHELL_PROTOCOL);
23
24typedef enum {
25    SHELL_SUCCESS              = 0,
26    SHELL_LOAD_ERROR           = 1,
27    SHELL_INVALID_PARAMETER    = 2,
28    SHELL_UNSUPPORTED          = 3,
29    SHELL_BAD_BUFFER_SIZE      = 4,
30    SHELL_BUFFER_TOO_SMALL     = 5,
31    SHELL_NOT_READY            = 6,
32    SHELL_DEVICE_ERROR         = 7,
33    SHELL_WRITE_PROTECTED      = 8,
34    SHELL_OUT_OF_RESOURCES     = 9,
35    SHELL_VOLUME_CORRUPTED     = 10,
36    SHELL_VOLUME_FULL          = 11,
37    SHELL_NO_MEDIA             = 12,
38    SHELL_MEDIA_CHANGED        = 13,
39    SHELL_NOT_FOUND            = 14,
40    SHELL_ACCESS_DENIED        = 15,
41    SHELL_TIMEOUT              = 18,
42    SHELL_NOT_STARTED          = 19,
43    SHELL_ALREADY_STARTED      = 20,
44    SHELL_ABORTED              = 21,
45    SHELL_INCOMPATIBLE_VERSION = 25,
46    SHELL_SECURITY_VIOLATION   = 26,
47    SHELL_NOT_EQUAL            = 27
48} SHELL_STATUS;
49
50typedef VOID *SHELL_FILE_HANDLE;
51
52typedef struct {
53    EFI_LIST_ENTRY    Link;
54    EFI_STATUS        Status;
55    CONST CHAR16      *FullName;
56    CONST CHAR16      *FileName;
57    SHELL_FILE_HANDLE Handle;
58    EFI_FILE_INFO     *Info;
59} EFI_SHELL_FILE_INFO;
60
61typedef
62BOOLEAN
63(EFIAPI *EFI_SHELL_BATCH_IS_ACTIVE) (
64    VOID
65    );
66
67typedef
68EFI_STATUS
69(EFIAPI *EFI_SHELL_CLOSE_FILE) (
70    IN SHELL_FILE_HANDLE FileHandle
71    );
72
73typedef
74EFI_STATUS
75(EFIAPI *EFI_SHELL_CREATE_FILE) (
76    IN CONST CHAR16       *FileName,
77    IN UINT64             FileAttribs,
78    OUT SHELL_FILE_HANDLE *FileHandle
79    );
80
81typedef
82EFI_STATUS
83(EFIAPI *EFI_SHELL_DELETE_FILE) (
84    IN SHELL_FILE_HANDLE FileHandle
85    );
86
87typedef
88EFI_STATUS
89(EFIAPI *EFI_SHELL_DELETE_FILE_BY_NAME) (
90    IN CONST CHAR16 *FileName
91    );
92
93typedef
94VOID
95(EFIAPI *EFI_SHELL_DISABLE_PAGE_BREAK) (
96    VOID
97    );
98
99typedef
100VOID
101(EFIAPI *EFI_SHELL_ENABLE_PAGE_BREAK) (
102    VOID
103    );
104
105typedef
106EFI_STATUS
107(EFIAPI *EFI_SHELL_EXECUTE) (
108    IN EFI_HANDLE  *ParentImageHandle,
109    IN CHAR16      *CommandLine OPTIONAL,
110    IN CHAR16      **Environment OPTIONAL,
111    OUT EFI_STATUS *StatusCode OPTIONAL
112    );
113
114typedef
115EFI_STATUS
116(EFIAPI *EFI_SHELL_FIND_FILES) (
117    IN CONST CHAR16         *FilePattern,
118    OUT EFI_SHELL_FILE_INFO **FileList
119    );
120
121typedef
122EFI_STATUS
123(EFIAPI *EFI_SHELL_FIND_FILES_IN_DIR) (
124    IN SHELL_FILE_HANDLE    FileDirHandle,
125    OUT EFI_SHELL_FILE_INFO **FileList
126    );
127
128typedef
129EFI_STATUS
130(EFIAPI *EFI_SHELL_FLUSH_FILE) (
131    IN SHELL_FILE_HANDLE FileHandle
132    );
133
134typedef
135EFI_STATUS
136(EFIAPI *EFI_SHELL_FREE_FILE_LIST) (
137    IN EFI_SHELL_FILE_INFO **FileList
138    );
139
140typedef
141CONST CHAR16 *
142(EFIAPI *EFI_SHELL_GET_ALIAS) (
143  IN  CONST CHAR16 *Alias,
144  OUT BOOLEAN      *Volatile OPTIONAL
145  );
146
147typedef
148CONST CHAR16 *
149(EFIAPI *EFI_SHELL_GET_CUR_DIR) (
150  IN CONST CHAR16 *FileSystemMapping OPTIONAL
151  );
152
153typedef UINT32 EFI_SHELL_DEVICE_NAME_FLAGS;
154#define EFI_DEVICE_NAME_USE_COMPONENT_NAME 0x00000001
155#define EFI_DEVICE_NAME_USE_DEVICE_PATH    0x00000002
156
157typedef
158EFI_STATUS
159(EFIAPI *EFI_SHELL_GET_DEVICE_NAME) (
160    IN EFI_HANDLE                   DeviceHandle,
161    IN EFI_SHELL_DEVICE_NAME_FLAGS  Flags,
162    IN CHAR8                        *Language,
163    OUT CHAR16                      **BestDeviceName
164    );
165
166typedef
167CONST EFI_DEVICE_PATH_PROTOCOL *
168(EFIAPI *EFI_SHELL_GET_DEVICE_PATH_FROM_MAP) (
169    IN CONST CHAR16 *Mapping
170    );
171
172typedef
173EFI_DEVICE_PATH_PROTOCOL *
174(EFIAPI *EFI_SHELL_GET_DEVICE_PATH_FROM_FILE_PATH) (
175    IN CONST CHAR16 *Path
176    );
177
178typedef
179CONST CHAR16 *
180(EFIAPI *EFI_SHELL_GET_ENV) (
181    IN CONST CHAR16 *Name
182    );
183
184typedef
185CONST CHAR16 *
186(EFIAPI *EFI_SHELL_GET_ENV_EX) (
187    IN CONST CHAR16 *Name,
188    OUT UINT32      *Attributes OPTIONAL
189    );
190
191typedef
192EFI_FILE_INFO *
193(EFIAPI *EFI_SHELL_GET_FILE_INFO) (
194    IN SHELL_FILE_HANDLE FileHandle
195    );
196
197typedef
198CHAR16 *
199(EFIAPI *EFI_SHELL_GET_FILE_PATH_FROM_DEVICE_PATH) (
200    IN CONST EFI_DEVICE_PATH_PROTOCOL *Path
201    );
202
203typedef
204EFI_STATUS
205(EFIAPI *EFI_SHELL_GET_FILE_POSITION) (
206    IN SHELL_FILE_HANDLE FileHandle,
207    OUT UINT64           *Position
208    );
209
210typedef
211EFI_STATUS
212(EFIAPI *EFI_SHELL_GET_FILE_SIZE) (
213    IN SHELL_FILE_HANDLE FileHandle,
214    OUT UINT64           *Size
215    );
216
217typedef
218EFI_STATUS
219(EFIAPI *EFI_SHELL_GET_GUID_FROM_NAME) (
220    IN CONST CHAR16 *GuidName,
221    OUT EFI_GUID    *Guid
222    );
223
224typedef
225EFI_STATUS
226(EFIAPI *EFI_SHELL_GET_GUID_NAME)(
227    IN CONST EFI_GUID *Guid,
228    OUT CONST CHAR16  **GuidName
229    );
230
231typedef
232EFI_STATUS
233(EFIAPI *EFI_SHELL_GET_HELP_TEXT) (
234    IN CONST CHAR16 *Command,
235    IN CONST CHAR16 *Sections,
236    OUT CHAR16      **HelpText
237    );
238
239typedef
240CONST CHAR16 *
241(EFIAPI *EFI_SHELL_GET_MAP_FROM_DEVICE_PATH) (
242    IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
243    );
244
245typedef
246BOOLEAN
247(EFIAPI *EFI_SHELL_GET_PAGE_BREAK) (
248    VOID
249    );
250
251typedef
252BOOLEAN
253(EFIAPI *EFI_SHELL_IS_ROOT_SHELL) (
254    VOID
255    );
256
257typedef
258EFI_STATUS
259(EFIAPI *EFI_SHELL_OPEN_FILE_BY_NAME) (
260    IN CONST CHAR16       *FileName,
261    OUT SHELL_FILE_HANDLE *FileHandle,
262    IN UINT64             OpenMode
263    );
264
265typedef
266EFI_STATUS
267(EFIAPI *EFI_SHELL_OPEN_FILE_LIST) (
268    IN CHAR16                  *Path,
269    IN UINT64                  OpenMode,
270    IN OUT EFI_SHELL_FILE_INFO **FileList
271    );
272
273typedef
274EFI_STATUS
275(EFIAPI *EFI_SHELL_OPEN_ROOT) (
276    IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
277    OUT SHELL_FILE_HANDLE       *FileHandle
278    );
279
280typedef
281EFI_STATUS
282(EFIAPI *EFI_SHELL_OPEN_ROOT_BY_HANDLE) (
283    IN EFI_HANDLE         DeviceHandle,
284    OUT SHELL_FILE_HANDLE *FileHandle
285    );
286
287typedef
288EFI_STATUS
289(EFIAPI *EFI_SHELL_READ_FILE) (
290    IN SHELL_FILE_HANDLE FileHandle,
291    IN OUT UINTN         *ReadSize,
292    IN OUT VOID          *Buffer
293    );
294
295typedef
296EFI_STATUS
297(EFIAPI *EFI_SHELL_REGISTER_GUID_NAME) (
298    IN CONST EFI_GUID *Guid,
299    IN CONST CHAR16   *GuidName
300    );
301
302typedef
303EFI_STATUS
304(EFIAPI *EFI_SHELL_REMOVE_DUP_IN_FILE_LIST) (
305    IN EFI_SHELL_FILE_INFO **FileList
306    );
307
308typedef
309EFI_STATUS
310(EFIAPI *EFI_SHELL_SET_ALIAS) (
311    IN CONST CHAR16 *Command,
312    IN CONST CHAR16 *Alias,
313    IN BOOLEAN      Replace,
314    IN BOOLEAN      Volatile
315    );
316
317typedef
318EFI_STATUS
319(EFIAPI *EFI_SHELL_SET_CUR_DIR) (
320    IN CONST CHAR16 *FileSystem OPTIONAL,
321    IN CONST CHAR16 *Dir
322    );
323
324typedef
325EFI_STATUS
326(EFIAPI *EFI_SHELL_SET_ENV) (
327    IN CONST CHAR16 *Name,
328    IN CONST CHAR16 *Value,
329    IN BOOLEAN      Volatile
330    );
331
332typedef
333EFI_STATUS
334(EFIAPI *EFI_SHELL_SET_FILE_INFO) (
335    IN SHELL_FILE_HANDLE   FileHandle,
336    IN CONST EFI_FILE_INFO *FileInfo
337    );
338
339typedef
340EFI_STATUS
341(EFIAPI *EFI_SHELL_SET_FILE_POSITION) (
342    IN SHELL_FILE_HANDLE FileHandle,
343    IN UINT64            Position
344    );
345
346typedef
347EFI_STATUS
348(EFIAPI *EFI_SHELL_SET_MAP) (
349    IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,
350    IN CONST CHAR16                   *Mapping
351    );
352
353typedef
354EFI_STATUS
355(EFIAPI *EFI_SHELL_WRITE_FILE) (
356    IN SHELL_FILE_HANDLE FileHandle,
357    IN OUT UINTN         *BufferSize,
358    IN VOID              *Buffer
359    );
360
361typedef struct _EFI_SHELL_PROTOCOL {
362    EFI_SHELL_EXECUTE                         Execute;
363    EFI_SHELL_GET_ENV                         GetEnv;
364    EFI_SHELL_SET_ENV                         SetEnv;
365    EFI_SHELL_GET_ALIAS                       GetAlias;
366    EFI_SHELL_SET_ALIAS                       SetAlias;
367    EFI_SHELL_GET_HELP_TEXT                   GetHelpText;
368    EFI_SHELL_GET_DEVICE_PATH_FROM_MAP        GetDevicePathFromMap;
369    EFI_SHELL_GET_MAP_FROM_DEVICE_PATH        GetMapFromDevicePath;
370    EFI_SHELL_GET_DEVICE_PATH_FROM_FILE_PATH  GetDevicePathFromFilePath;
371    EFI_SHELL_GET_FILE_PATH_FROM_DEVICE_PATH  GetFilePathFromDevicePath;
372    EFI_SHELL_SET_MAP                         SetMap;
373    EFI_SHELL_GET_CUR_DIR                     GetCurDir;
374    EFI_SHELL_SET_CUR_DIR                     SetCurDir;
375    EFI_SHELL_OPEN_FILE_LIST                  OpenFileList;
376    EFI_SHELL_FREE_FILE_LIST                  FreeFileList;
377    EFI_SHELL_REMOVE_DUP_IN_FILE_LIST         RemoveDupInFileList;
378    EFI_SHELL_BATCH_IS_ACTIVE                 BatchIsActive;
379    EFI_SHELL_IS_ROOT_SHELL                   IsRootShell;
380    EFI_SHELL_ENABLE_PAGE_BREAK               EnablePageBreak;
381    EFI_SHELL_DISABLE_PAGE_BREAK              DisablePageBreak;
382    EFI_SHELL_GET_PAGE_BREAK                  GetPageBreak;
383    EFI_SHELL_GET_DEVICE_NAME                 GetDeviceName;
384    EFI_SHELL_GET_FILE_INFO                   GetFileInfo;
385    EFI_SHELL_SET_FILE_INFO                   SetFileInfo;
386    EFI_SHELL_OPEN_FILE_BY_NAME               OpenFileByName;
387    EFI_SHELL_CLOSE_FILE                      CloseFile;
388    EFI_SHELL_CREATE_FILE                     CreateFile;
389    EFI_SHELL_READ_FILE                       ReadFile;
390    EFI_SHELL_WRITE_FILE                      WriteFile;
391    EFI_SHELL_DELETE_FILE                     DeleteFile;
392    EFI_SHELL_DELETE_FILE_BY_NAME             DeleteFileByName;
393    EFI_SHELL_GET_FILE_POSITION               GetFilePosition;
394    EFI_SHELL_SET_FILE_POSITION               SetFilePosition;
395    EFI_SHELL_FLUSH_FILE                      FlushFile;
396    EFI_SHELL_FIND_FILES                      FindFiles;
397    EFI_SHELL_FIND_FILES_IN_DIR               FindFilesInDir;
398    EFI_SHELL_GET_FILE_SIZE                   GetFileSize;
399    EFI_SHELL_OPEN_ROOT                       OpenRoot;
400    EFI_SHELL_OPEN_ROOT_BY_HANDLE             OpenRootByHandle;
401    EFI_EVENT                                 ExecutionBreak;
402    UINT32                                    MajorVersion;
403    UINT32                                    MinorVersion;
404    // Added for Shell 2.1
405    EFI_SHELL_REGISTER_GUID_NAME              RegisterGuidName;
406    EFI_SHELL_GET_GUID_NAME                   GetGuidName;
407    EFI_SHELL_GET_GUID_FROM_NAME              GetGuidFromName;
408    EFI_SHELL_GET_ENV_EX                      GetEnvEx;
409} EFI_SHELL_PROTOCOL;
410
411#define EFI_SHELL_PARAMETERS_PROTOCOL_GUID \
412    { 0x752f3136, 0x4e16, 0x4fdc, { 0xa2, 0x2a, 0xe5, 0xf4, 0x68, 0x12, 0xf4, 0xca } }
413
414INTERFACE_DECL(_EFI_SHELL_PARAMETERS_PROTOCOL);
415
416typedef struct _EFI_SHELL_PARAMETERS_PROTOCOL {
417    CHAR16            **Argv;
418    UINTN             Argc;
419    SHELL_FILE_HANDLE StdIn;
420    SHELL_FILE_HANDLE StdOut;
421    SHELL_FILE_HANDLE StdErr;
422} EFI_SHELL_PARAMETERS_PROTOCOL;
423
424#define EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL_GUID \
425    { 0x3c7200e9, 0x005f, 0x4ea4, { 0x87, 0xde, 0xa3, 0xdf, 0xac, 0x8a, 0x27, 0xc3 } }
426
427INTERFACE_DECL(_EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL);
428
429typedef
430SHELL_STATUS
431(EFIAPI *SHELL_COMMAND_HANDLER)(
432    IN struct _EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL *This,
433    IN EFI_SYSTEM_TABLE                           *SystemTable,
434    IN EFI_SHELL_PARAMETERS_PROTOCOL              *ShellParameters,
435    IN EFI_SHELL_PROTOCOL                         *Shell
436    );
437
438typedef
439CHAR16*
440(EFIAPI *SHELL_COMMAND_GETHELP)(
441    IN struct _EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL *This,
442    IN CONST CHAR8                                *Language
443    );
444
445typedef struct _EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL {
446    CONST CHAR16          *CommandName;
447    SHELL_COMMAND_HANDLER Handler;
448    SHELL_COMMAND_GETHELP GetHelp;
449} EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL;
450
451#endif
452