summaryrefslogtreecommitdiff
path: root/MdeModulePkg/Universal/FvSimpleFilesystemDxe/FvSimpleFilesystemInternal.h
blob: ecf5461a042c9b9cfc2f660ddbb14a41b9a7ab64 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/** @file
*
*  Copyright (c) 2014, ARM Limited. All rights reserved.
*
*  This program and the accompanying materials
*  are licensed and made available under the terms and conditions of the BSD License
*  which accompanies this distribution.  The full text of the license may be found at
*  http://opensource.org/licenses/bsd-license.php
*
*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
*
**/

#ifndef __FVFS_INTERNAL_H__
#define __FVFS_INTERNAL_H__

#include <Library/BaseLib.h>

typedef struct _FV_FILESYSTEM_FILE FV_FILESYSTEM_FILE;

// Struct representing an instance of the "filesystem". There will be one of
// these structs per FV.
typedef struct _FV_FILESYSTEM_INSTANCE {
  UINT32                           Signature;
  LIST_ENTRY                       Link;
  LIST_ENTRY                       Files;
  EFI_DRIVER_BINDING_PROTOCOL     *DriverBinding;
  EFI_FIRMWARE_VOLUME2_PROTOCOL   *FvProtocol;
  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL  SimpleFs;
  FV_FILESYSTEM_FILE              *Root;
  CHAR16                          *VolumeLabel;
} FV_FILESYSTEM_INSTANCE;

// Struct representing a file. There will be one of these for each file on each
// FV, plus one for each FV representing the "root directory".
struct _FV_FILESYSTEM_FILE {
  UINT32                           Signature;
  LIST_ENTRY                       Link;
  CHAR16                          *Name;
  FV_FILESYSTEM_FILE              *DirReadNext;
  EFI_GUID                         NameGuid;
  FV_FILESYSTEM_INSTANCE          *Instance;
  EFI_FILE_PROTOCOL                FileProtocol;
  UINTN                            Size;
  EFI_FV_FILETYPE                  Type;
};

#define FVFS_FILE_SIGNATURE      SIGNATURE_32 ('f', 'v', 'f', 'l')
#define FVFS_INSTANCE_SIGNATURE  SIGNATURE_32 ('f', 'v', 'f', 's')

#define FVFS_INSTANCE_FROM_BINDING_THIS(This) CR (    \
          This,                                       \
          FV_FILESYSTEM_INSTANCE,                     \
          DriverBinding,                              \
          FVFS_INSTANCE_SIGNATURE                     \
          )

#define FVFS_INSTANCE_FROM_SIMPLE_FS_THIS(This) CR (  \
          This,                                       \
          FV_FILESYSTEM_INSTANCE,                     \
          SimpleFs,                                   \
          FVFS_INSTANCE_SIGNATURE                     \
          )

#define FVFS_FILE_FROM_FILE_THIS(This) CR (           \
          This,                                       \
          FV_FILESYSTEM_FILE,                         \
          FileProtocol,                               \
          FVFS_FILE_SIGNATURE                         \
          )

#define FVFS_FILE_FROM_LINK(FileLink) CR (FileLink, FV_FILESYSTEM_FILE, Link, FVFS_FILE_SIGNATURE)

#define FVFS_GET_FIRST_FILE(Instance) FVFS_FILE_FROM_LINK (GetFirstNode (&Instance->Files))

#define FV_FILETYPE_IS_EXECUTABLE(Type) ((Type) == EFI_FV_FILETYPE_PEIM                  || \
                                         (Type) == EFI_FV_FILETYPE_DRIVER                || \
                                         (Type) == EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER  || \
                                         (Type) == EFI_FV_FILETYPE_APPLICATION)

EFI_STATUS
FvFsReadFile (
  FV_FILESYSTEM_FILE *File,
  UINTN              *BufferSize,
  VOID              **Buffer
  );

EFI_STATUS
FvFsGetFileSize (
  IN  FV_FILESYSTEM_FILE *File,
  OUT UINTN              *Size
  );

extern EFI_FILE_PROTOCOL mFilesystemTemplate;

extern EFI_UNICODE_COLLATION_PROTOCOL *mUnicodeCollation;

#endif