Closed10
UEFI - Simple File System Protocol メモ
MikanOSをRustで実装しており、uefi-rs
下のuefi-raw
crateを使っていたが、EFI_SIMPLE_FILE_SYSTEM_PROTOCOL
がなさそう。
自前で実装した場合必要なものは何か?
以下の実装を参考にする:
- https://github.com/rust-osdev/uefi-rs/tree/main
- https://github.com/tianocore/edk2/tree/master/MdePkg
また
EDK2 interface for Simple File System Protocol
// #L73
struct _EFI_SIMPLE_FILE_SYSTEM_PROTOCOL {
///
/// The version of the EFI_SIMPLE_FILE_SYSTEM_PROTOCOL. The version
/// specified by this specification is 0x00010000. All future revisions
/// must be backwards compatible.
///
UINT64 Revision;
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_OPEN_VOLUME OpenVolume;
};
で、EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_OPEN_VOLUME OpenVolume;
はこうか:
// #L59
typedef
EFI_STATUS
(EFIAPI *EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_OPEN_VOLUME)(
IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
OUT EFI_FILE_PROTOCOL **Root
);
そしてOUT EFI_FILE_PROTOCOL **Root
は
// #L528
struct _EFI_FILE_PROTOCOL {
///
/// The version of the EFI_FILE_PROTOCOL interface. The version specified
/// by this specification is EFI_FILE_PROTOCOL_LATEST_REVISION.
/// Future versions are required to be backward compatible to version 1.0.
///
UINT64 Revision;
EFI_FILE_OPEN Open;
EFI_FILE_CLOSE Close;
EFI_FILE_DELETE Delete;
EFI_FILE_READ Read;
EFI_FILE_WRITE Write;
EFI_FILE_GET_POSITION GetPosition;
EFI_FILE_SET_POSITION SetPosition;
EFI_FILE_GET_INFO GetInfo;
EFI_FILE_SET_INFO SetInfo;
EFI_FILE_FLUSH Flush;
EFI_FILE_OPEN_EX OpenEx;
EFI_FILE_READ_EX ReadEx;
EFI_FILE_WRITE_EX WriteEx;
EFI_FILE_FLUSH_EX FlushEx;
};
// #L25
typedef struct _EFI_FILE_PROTOCOL EFI_FILE_PROTOCOL;
問題はこれをRustでやりたい:
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL* fs;
gBS->OpenProtocol(
loaded_image->DeviceHandle,
&gEfiSimpleFileSystemProtocolGuid,
(VOID**)&fs,
image_handle,
NULL,
EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
fs->OpenVolume(fs, root);
OpenProtocol()
にfs
を渡してから何があったんですかね?
fs->OpenVolume(fs, root);
は仕様書によると、型は
typedef
EFI_STATUS
(EFIAPI *EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_OPEN_VOLUME) (
IN EFI_SIMPLE_FILE_SYSTEM PROTOCOL *This,
OUT EFI_FILE_PROTOCOL **Root
);
Q. EFI_FILE_PROTOCOL
はuefi-rs
でどう定義されているのか?
struct _EFI_FILE_PROTOCOL
の各member関数の型はこういう雰囲気のものが続く感じ:
typedef
EFI_STATUS
(EFIAPI *EFI_FILE_OPEN) (
IN EFI_FILE_PROTOCOL *This,
OUT EFI_FILE_PROTOCOL **NewHandle,
IN CHAR16 *FileName,
IN UINT64 OpenMode,
IN UINT64 Attributes
);
EFI_FILE_PROTOCOL
までinterfaceをRustで定義してやれば、なんとかなるんじゃないの? (楽観からの死)
このスクラップは2023/08/29にクローズされました