diff options
| author | andromeda <andromeda@bsd.my.domain> | 2026-10-19 18:54:26 -0400 |
|---|---|---|
| committer | andromeda <andromeda@bsd.my.domain> | 2026-10-19 18:54:26 -0400 |
| commit | aa113b17449e67dbd808587b411aeb21ea869974 (patch) | |
| tree | b6b7f1b71d761cbc043d5e97f72345d428c140ac /lib/uefi.c3l/uefi/status.c3i | |
| parent | 97d331175ae47aec3d0b990ada9754a9e4298e32 (diff) | |
minimal running stub
Diffstat (limited to 'lib/uefi.c3l/uefi/status.c3i')
| -rw-r--r-- | lib/uefi.c3l/uefi/status.c3i | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/lib/uefi.c3l/uefi/status.c3i b/lib/uefi.c3l/uefi/status.c3i new file mode 100644 index 0000000..e846cdb --- /dev/null +++ b/lib/uefi.c3l/uefi/status.c3i @@ -0,0 +1,174 @@ +module uefi::status::error; + +// Errors +faultdef + NO_FAULT, + LOAD_ERROR, + INVALID_PARAMETER, + UNSUPPORTED, + BAD_BUFFER_SIZE, + BUFFER_TOO_SMALL, + NOT_READY, + DEVICE_ERROR, + WRITE_PROTECTED, + OUT_OF_RESOURCES, + VOLUME_CORRUPTED, + VOLUME_FULL, + NO_MEDIA, + MEDIA_CHANGED, + NOT_FOUND, + ACCESS_DENIED, + NO_RESPONSE, + NO_MAPPING, + TIMEOUT, + NOT_STARTED, + ALREADY_STARTED, + ABORTED, + ICMP_ERROR, + TFTP_ERROR, + PROTOCOL_ERROR, + INCOMPATIBLE_VERSION, + SECURITY_VIOLATION, + CRC_ERROR, + END_OF_MEDIA, + UNKNOWN_29, /* UEFI spec is missing this definition. */ + UNKNOWN_30, /* UEFI spec is missing this definition. */ + END_OF_FILE, + INVALID_LANGUAGE, + COMPROMISED_DATA, + IP_ADDRESS_CONFLICT, + HTTP_ERROR, + EFILIB_UNINITIALIZED, /* Used for efilib calls when init() hasn't been called. */ + UNKNOWN_STATUS; /* Fallback for an unknown status code. */ + +module uefi::status::warning; + +// Warnings +faultdef + UNKNOWN_GLYPH, + DELETE_FAILURE, + WRITE_FAILURE, + BUFFER_TOO_SMALL, + STALE_DATA, + FILE_SYSTEM, + RESET_REQUIRED; + +module uefi; + +import uefi::status; + +macro @efi_err($x) @private => (usz)((1ul << ((usz::size * 8) - 1)) | $x); +macro @from_efi_err(#x) @private => (usz)((#x ^ (1ul << ((usz::size * 8) - 1)))+7); // add 7 warning to get the right ordinal +macro @efi_warn($x) @private => (usz)$x; + +constdef EfiStatus : ulong { + SUCCESS, + WARN_UNKNOWN_GLYPH = @efi_warn(1), + WARN_DELETE_FAILURE, + WARN_WRITE_FAILURE, + WARN_BUFFER_TOO_SMALL, + WARN_STALE_DATA, + WARN_FILE_SYSTEM, + WARN_RESET_REQUIRED, + LOAD_ERROR = @efi_err(1), + INVALID_PARAMETER, + UNSUPPORTED, + BAD_BUFFER_SIZE, + BUFFER_TOO_SMALL, + NOT_READY, + DEVICE_ERROR, + WRITE_PROTECTED, + OUT_OF_RESOURCES, + VOLUME_CORRUPTED, + VOLUME_FULL, + NO_MEDIA, + MEDIA_CHANGED, + NOT_FOUND, + ACCESS_DENIED, + NO_RESPONSE, + NO_MAPPING, + TIMEOUT, + NOT_STARTED, + ALREADY_STARTED, + ABORTED, + ICMP_ERROR, + TFTP_ERROR, + PROTOCOL_ERROR, + INCOMPATIBLE_VERSION, + SECURITY_VIOLATION, + CRC_ERROR, + END_OF_MEDIA, + UNKNOWN_29, + UNKNOWN_30, + END_OF_FILE, + INVALID_LANGUAGE, + COMPROMISED_DATA, + IP_ADDRESS_CONFLICT, + HTTP_ERROR, +} + +enum EfiStatusInternal : ulong (usz raw, fault faultType) { + SUCCESS { 0, error::NO_FAULT }, + + WARN_UNKNOWN_GLYPH { @efi_warn(1), warning::UNKNOWN_GLYPH }, + WARN_DELETE_FAILURE { @efi_warn(2), warning::DELETE_FAILURE }, + WARN_WRITE_FAILURE { @efi_warn(3), warning::WRITE_FAILURE }, + WARN_BUFFER_TOO_SMALL { @efi_warn(4), warning::BUFFER_TOO_SMALL }, + WARN_STALE_DATA { @efi_warn(5), warning::STALE_DATA }, + WARN_FILE_SYSTEM { @efi_warn(6), warning::FILE_SYSTEM }, + WARN_RESET_REQUIRED { @efi_warn(7), warning::RESET_REQUIRED }, + + LOAD_ERROR { @efi_err(1), error::LOAD_ERROR }, + INVALID_PARAMETER { @efi_err(2), error::INVALID_PARAMETER }, + UNSUPPORTED { @efi_err(3), error::UNSUPPORTED }, + BAD_BUFFER_SIZE { @efi_err(4), error::BAD_BUFFER_SIZE }, + BUFFER_TOO_SMALL { @efi_err(5), error::BUFFER_TOO_SMALL }, + NOT_READY { @efi_err(6), error::NOT_READY }, + DEVICE_ERROR { @efi_err(7), error::DEVICE_ERROR }, + WRITE_PROTECTED { @efi_err(8), error::WRITE_PROTECTED }, + OUT_OF_RESOURCES { @efi_err(9), error::OUT_OF_RESOURCES }, + VOLUME_CORRUPTED { @efi_err(10), error::VOLUME_CORRUPTED }, + VOLUME_FULL { @efi_err(11), error::VOLUME_FULL }, + NO_MEDIA { @efi_err(12), error::NO_MEDIA }, + MEDIA_CHANGED { @efi_err(13), error::MEDIA_CHANGED }, + NOT_FOUND { @efi_err(14), error::NOT_FOUND }, + ACCESS_DENIED { @efi_err(15), error::ACCESS_DENIED }, + NO_RESPONSE { @efi_err(16), error::NO_RESPONSE }, + NO_MAPPING { @efi_err(17), error::NO_MAPPING }, + TIMEOUT { @efi_err(18), error::TIMEOUT }, + NOT_STARTED { @efi_err(19), error::NOT_STARTED }, + ALREADY_STARTED { @efi_err(20), error::ALREADY_STARTED }, + ABORTED { @efi_err(21), error::ABORTED }, + ICMP_ERROR { @efi_err(22), error::ICMP_ERROR }, + TFTP_ERROR { @efi_err(23), error::TFTP_ERROR }, + PROTOCOL_ERROR { @efi_err(24), error::PROTOCOL_ERROR }, + INCOMPATIBLE_VERSION { @efi_err(25), error::INCOMPATIBLE_VERSION }, + SECURITY_VIOLATION { @efi_err(26), error::SECURITY_VIOLATION }, + CRC_ERROR { @efi_err(27), error::CRC_ERROR }, + END_OF_MEDIA { @efi_err(28), error::END_OF_MEDIA }, + UNKNOWN_29 { @efi_err(29), error::UNKNOWN_29 }, /* UEFI spec is missing this definition. */ + UNKNOWN_30 { @efi_err(30), error::UNKNOWN_30 }, /* UEFI spec is missing this definition. */ + END_OF_FILE { @efi_err(31), error::END_OF_FILE }, + INVALID_LANGUAGE { @efi_err(32), error::INVALID_LANGUAGE }, + COMPROMISED_DATA { @efi_err(33), error::COMPROMISED_DATA }, + IP_ADDRESS_CONFLICT { @efi_err(34), error::IP_ADDRESS_CONFLICT }, + HTTP_ERROR { @efi_err(35), error::HTTP_ERROR }, +} + +<* + Handle EFI errors when they occur. +*> +macro bool? efi_error(EfiStatus status, bool catchWarnings = true) @builtin { + switch { + case status == SUCCESS: return false; + + case status >= EfiStatus.WARN_UNKNOWN_GLYPH && status <= EfiStatus.WARN_RESET_REQUIRED: + EfiStatusInternal statusInternal = EfiStatusInternal::from_ordinal((ulong)status); + return catchWarnings ? statusInternal.faultType~ : true; + + case status >= EfiStatus.LOAD_ERROR && status <= EfiStatus.HTTP_ERROR: + return EfiStatusInternal::from_ordinal(@from_efi_err((ulong)status)).faultType~; + } + + return error::UNKNOWN_STATUS~; +}
\ No newline at end of file |
