From 7b9c28f2b1f61fec9cf611dfd6dc845ec694d5e0 Mon Sep 17 00:00:00 2001 From: Carmen Date: Tue, 1 Apr 2025 00:06:52 +0200 Subject: [PATCH 1/5] lib/std/start: allow return uefi error union in main --- lib/std/start.zig | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/std/start.zig b/lib/std/start.zig index a91df357006d..cbdbd0bf906c 100644 --- a/lib/std/start.zig +++ b/lib/std/start.zig @@ -200,6 +200,8 @@ fn wasi_start() callconv(.c) void { } fn EfiMain(handle: uefi.Handle, system_table: *uefi.tables.SystemTable) callconv(.c) usize { + const Status = uefi.Status; + uefi.handle = handle; uefi.system_table = system_table; @@ -214,10 +216,22 @@ fn EfiMain(handle: uefi.Handle, system_table: *uefi.tables.SystemTable) callconv usize => { return root.main(); }, - uefi.Status => { + Status => { return @intFromEnum(root.main()); }, - else => @compileError("expected return type of main to be 'void', 'noreturn', 'usize', or 'std.os.uefi.Status'"), + Status.Error!void => { + root.main() catch |err| { + // if (err == error.Unexpected) { + // unreachable; + // } + + const status = Status.fromError(err); + return status; + }; + + return 0; + }, + else => @compileError("expected return type of main to be 'void', 'noreturn', 'usize', 'std.os.uefi.Status', or 'std.os.uefi.Status.Error!void"), } } From 80b7ea715a92422042878a99bcb717a36d186bc8 Mon Sep 17 00:00:00 2001 From: Carmen Date: Tue, 1 Apr 2025 04:38:07 -0700 Subject: [PATCH 2/5] handle catch with switch Co-authored-by: Linus Groh --- lib/std/start.zig | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/std/start.zig b/lib/std/start.zig index cbdbd0bf906c..2ff448a94388 100644 --- a/lib/std/start.zig +++ b/lib/std/start.zig @@ -220,13 +220,12 @@ fn EfiMain(handle: uefi.Handle, system_table: *uefi.tables.SystemTable) callconv return @intFromEnum(root.main()); }, Status.Error!void => { - root.main() catch |err| { - // if (err == error.Unexpected) { - // unreachable; - // } - - const status = Status.fromError(err); - return status; + root.main() catch |err| switch (err) { + error.Unexpected => @panic("EfiMain: unexpected error"), + else => { + const status = Status.fromError(@errorCast(err)); + return @intFromEnum(status); + } }; return 0; From 515aa0dafbe0ad2da017261e51ed74902a7b57c1 Mon Sep 17 00:00:00 2001 From: Carmen Date: Tue, 1 Apr 2025 13:42:17 +0200 Subject: [PATCH 3/5] eliminate returning usize, define std.os.uefi.Error --- lib/std/os/uefi.zig | 1 + lib/std/start.zig | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/std/os/uefi.zig b/lib/std/os/uefi.zig index 1402766669f1..c362f707c6bc 100644 --- a/lib/std/os/uefi.zig +++ b/lib/std/os/uefi.zig @@ -7,6 +7,7 @@ pub const hii = @import("uefi/hii.zig"); /// Status codes returned by EFI interfaces pub const Status = @import("uefi/status.zig").Status; +pub const Error = UnexpectedError || Status.Error; pub const tables = @import("uefi/tables.zig"); /// The memory type to allocate when using the pool. diff --git a/lib/std/start.zig b/lib/std/start.zig index 2ff448a94388..9de44bc82e48 100644 --- a/lib/std/start.zig +++ b/lib/std/start.zig @@ -213,24 +213,24 @@ fn EfiMain(handle: uefi.Handle, system_table: *uefi.tables.SystemTable) callconv root.main(); return 0; }, - usize => { - return root.main(); - }, Status => { return @intFromEnum(root.main()); }, - Status.Error!void => { + uefi.Error!void => { root.main() catch |err| switch (err) { error.Unexpected => @panic("EfiMain: unexpected error"), else => { const status = Status.fromError(@errorCast(err)); return @intFromEnum(status); - } + }, }; return 0; }, - else => @compileError("expected return type of main to be 'void', 'noreturn', 'usize', 'std.os.uefi.Status', or 'std.os.uefi.Status.Error!void"), + else => @compileError( + "expected return type of main to be 'void', 'noreturn', " ++ + "'uefi.Status', 'uefi.Error!void', or 'uefi.Error!noreturn'", + ), } } From 7659f6b6044a2c3577bb748f092f6a9bc2b671b5 Mon Sep 17 00:00:00 2001 From: Carmen Date: Tue, 1 Apr 2025 14:10:01 +0200 Subject: [PATCH 4/5] Error!noreturn doesnt compile --- lib/std/start.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/std/start.zig b/lib/std/start.zig index 9de44bc82e48..34e87cdc1ec5 100644 --- a/lib/std/start.zig +++ b/lib/std/start.zig @@ -229,7 +229,7 @@ fn EfiMain(handle: uefi.Handle, system_table: *uefi.tables.SystemTable) callconv }, else => @compileError( "expected return type of main to be 'void', 'noreturn', " ++ - "'uefi.Status', 'uefi.Error!void', or 'uefi.Error!noreturn'", + "'uefi.Status', or 'uefi.Error!void'", ), } } From 86565c7dc56144ddede51ac07351a5582c8b27e9 Mon Sep 17 00:00:00 2001 From: Carmen Date: Tue, 1 Apr 2025 14:49:26 +0200 Subject: [PATCH 5/5] don't alias uefi.Status Co-authored-by: linusg --- lib/std/start.zig | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/std/start.zig b/lib/std/start.zig index 34e87cdc1ec5..3757462be11b 100644 --- a/lib/std/start.zig +++ b/lib/std/start.zig @@ -200,8 +200,6 @@ fn wasi_start() callconv(.c) void { } fn EfiMain(handle: uefi.Handle, system_table: *uefi.tables.SystemTable) callconv(.c) usize { - const Status = uefi.Status; - uefi.handle = handle; uefi.system_table = system_table; @@ -213,14 +211,14 @@ fn EfiMain(handle: uefi.Handle, system_table: *uefi.tables.SystemTable) callconv root.main(); return 0; }, - Status => { + uefi.Status => { return @intFromEnum(root.main()); }, uefi.Error!void => { root.main() catch |err| switch (err) { error.Unexpected => @panic("EfiMain: unexpected error"), else => { - const status = Status.fromError(@errorCast(err)); + const status = uefi.Status.fromError(@errorCast(err)); return @intFromEnum(status); }, };