summaryrefslogtreecommitdiffstats
path: root/src/boot/efi/proto/file-io.h
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:49:52 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:49:52 +0000
commit55944e5e40b1be2afc4855d8d2baf4b73d1876b5 (patch)
tree33f869f55a1b149e9b7c2b7e201867ca5dd52992 /src/boot/efi/proto/file-io.h
parentInitial commit. (diff)
downloadsystemd-55944e5e40b1be2afc4855d8d2baf4b73d1876b5.tar.xz
systemd-55944e5e40b1be2afc4855d8d2baf4b73d1876b5.zip
Adding upstream version 255.4.upstream/255.4
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/boot/efi/proto/file-io.h')
-rw-r--r--src/boot/efi/proto/file-io.h83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/boot/efi/proto/file-io.h b/src/boot/efi/proto/file-io.h
new file mode 100644
index 0000000..001ad48
--- /dev/null
+++ b/src/boot/efi/proto/file-io.h
@@ -0,0 +1,83 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#pragma once
+
+#include "efi.h"
+
+#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID \
+ GUID_DEF(0x0964e5b22, 0x6459, 0x11d2, 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
+#define EFI_FILE_INFO_ID \
+ GUID_DEF(0x009576e92, 0x6d3f, 0x11d2, 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
+
+#define EFI_FILE_MODE_READ 0x0000000000000001U
+#define EFI_FILE_MODE_WRITE 0x0000000000000002U
+#define EFI_FILE_MODE_CREATE 0x8000000000000000U
+
+#define EFI_FILE_READ_ONLY 0x01U
+#define EFI_FILE_HIDDEN 0x02U
+#define EFI_FILE_SYSTEM 0x04U
+#define EFI_FILE_RESERVED 0x08U
+#define EFI_FILE_DIRECTORY 0x10U
+#define EFI_FILE_ARCHIVE 0x20U
+#define EFI_FILE_VALID_ATTR 0x37U
+
+typedef struct {
+ uint64_t Size;
+ uint64_t FileSize;
+ uint64_t PhysicalSize;
+ EFI_TIME CreateTime;
+ EFI_TIME LastAccessTime;
+ EFI_TIME ModificationTime;
+ uint64_t Attribute;
+ char16_t FileName[];
+} EFI_FILE_INFO;
+
+/* Some broken firmware violates the EFI spec by still advancing the readdir
+ * position when returning EFI_BUFFER_TOO_SMALL, effectively skipping over any files when
+ * the buffer was too small. Therefore, we always start with a buffer that should handle FAT32
+ * max file name length. */
+#define EFI_FILE_INFO_MIN_SIZE (offsetof(EFI_FILE_INFO, FileName) + 256U * sizeof(char16_t))
+
+typedef struct EFI_SIMPLE_FILE_SYSTEM_PROTOCOL EFI_SIMPLE_FILE_SYSTEM_PROTOCOL;
+struct EFI_SIMPLE_FILE_SYSTEM_PROTOCOL {
+ uint64_t Revision;
+ EFI_STATUS (EFIAPI *OpenVolume)(
+ EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
+ EFI_FILE **Root);
+};
+
+struct EFI_FILE_PROTOCOL {
+ uint64_t Revision;
+ EFI_STATUS (EFIAPI *Open)(
+ EFI_FILE *This,
+ EFI_FILE **NewHandle,
+ char16_t *FileName,
+ uint64_t OpenMode,
+ uint64_t Attributes);
+ EFI_STATUS (EFIAPI *Close)(EFI_FILE *This);
+ EFI_STATUS (EFIAPI *Delete)(EFI_FILE *This);
+ EFI_STATUS (EFIAPI *Read)(
+ EFI_FILE *This,
+ size_t *BufferSize,
+ void *Buffer);
+ EFI_STATUS (EFIAPI *Write)(
+ EFI_FILE *This,
+ size_t *BufferSize,
+ void *Buffer);
+ EFI_STATUS (EFIAPI *GetPosition)(EFI_FILE *This, uint64_t *Position);
+ EFI_STATUS (EFIAPI *SetPosition)(EFI_FILE *This, uint64_t Position);
+ EFI_STATUS (EFIAPI *GetInfo)(
+ EFI_FILE *This,
+ EFI_GUID *InformationType,
+ size_t *BufferSize,
+ void *Buffer);
+ EFI_STATUS (EFIAPI *SetInfo)(
+ EFI_FILE *This,
+ EFI_GUID *InformationType,
+ size_t BufferSize,
+ void *Buffer);
+ EFI_STATUS (EFIAPI *Flush)(EFI_FILE *This);
+ void *OpenEx;
+ void *ReadEx;
+ void *WriteEx;
+ void *FlushEx;
+};