From c092e07832f36ea3e4d3c20b8edc4f8fd3ceda9c Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Mon, 20 Feb 2023 11:05:53 -0800 Subject: [PATCH] [libj6] Allow driver_main instead of main for accepting extra arguments Clang will complain if main() is not declared with 0, 2, or 3 arguments. In order to allow an extra 4th parameter, a new weak main() symbol which just jumps to driver_main is defined, and _start passes the extra init pointer to main. Additionally, libc's crt0.s _start is made weak, and a matching _libc_crt0_start symbol is defined for implementations that wish to override _start but still call libc's _start. (Will be used by init.) --- src/libraries/j6/init.s | 6 ++++++ src/libraries/j6/j6.module | 1 + src/libraries/j6/j6/init.h | 3 +++ src/libraries/libc/arch/amd64/crt/crt0.s | 5 ++++- src/user/drv.uefi_fb/main.cpp | 6 ++---- src/user/drv.uefi_fb/uefi_fb.module | 4 +--- src/user/testapp/main.cpp | 4 ---- 7 files changed, 17 insertions(+), 12 deletions(-) create mode 100644 src/libraries/j6/init.s diff --git a/src/libraries/j6/init.s b/src/libraries/j6/init.s new file mode 100644 index 0000000..6945ffb --- /dev/null +++ b/src/libraries/j6/init.s @@ -0,0 +1,6 @@ +extern driver_main +global main:function weak (main.end - main) +main: + jmp driver_main +main.end: + diff --git a/src/libraries/j6/j6.module b/src/libraries/j6/j6.module index 6fd2d9a..d693649 100644 --- a/src/libraries/j6/j6.module +++ b/src/libraries/j6/j6.module @@ -5,6 +5,7 @@ j6 = module("j6", deps = [ "util" ], sources = [ "init.cpp", + "init.s", "protocol_ids.cpp", "syscalls.s.cog", "sysconf.cpp.cog", diff --git a/src/libraries/j6/j6/init.h b/src/libraries/j6/j6/init.h index 50f0300..3f75d29 100644 --- a/src/libraries/j6/j6/init.h +++ b/src/libraries/j6/j6/init.h @@ -16,6 +16,9 @@ struct j6_init_args /// Find the first handle of the given type held by this process j6_handle_t j6_find_first_handle(j6_object_type obj_type); +/// Drivers may use driver_main instead of main +int driver_main(unsigned, const char **, const char **, const j6_init_args *); + #ifdef __cplusplus } // extern "C" #endif diff --git a/src/libraries/libc/arch/amd64/crt/crt0.s b/src/libraries/libc/arch/amd64/crt/crt0.s index 671c3ee..5e4034a 100644 --- a/src/libraries/libc/arch/amd64/crt/crt0.s +++ b/src/libraries/libc/arch/amd64/crt/crt0.s @@ -3,8 +3,11 @@ extern exit extern __init_libj6 extern __init_libc -global _start:function (_start.end - _start) +global _start:function weak (_libc_crt0_start.end - _libc_crt0_start) +global _libc_crt0_start:function (_libc_crt0_start.end - _libc_crt0_start) + _start: +_libc_crt0_start: push 0 ; Add null frame push 0 mov rbp, rsp diff --git a/src/user/drv.uefi_fb/main.cpp b/src/user/drv.uefi_fb/main.cpp index 75e6b7f..06ae627 100644 --- a/src/user/drv.uefi_fb/main.cpp +++ b/src/user/drv.uefi_fb/main.cpp @@ -18,8 +18,8 @@ extern "C" { void _get_init(size_t *initc, struct j6_init_value **initv); } -extern "C" int -driver_main(int argc, const char **argv, const char **env, const j6_init_args *init) +int +driver_main(unsigned argc, const char **argv, const char **env, const j6_init_args *init) { j6_log("fb driver starting"); @@ -130,5 +130,3 @@ driver_main(int argc, const char **argv, const char **env, const j6_init_args *i j6_log("fb driver done, exiting"); return 0; } - -int main () __attribute__ ((weak, alias ("driver_main"))); diff --git a/src/user/drv.uefi_fb/uefi_fb.module b/src/user/drv.uefi_fb/uefi_fb.module index 541068d..d3afb8e 100644 --- a/src/user/drv.uefi_fb/uefi_fb.module +++ b/src/user/drv.uefi_fb/uefi_fb.module @@ -1,6 +1,6 @@ # vim: ft=python -fb = module("drv.uefi_fb", +module("drv.uefi_fb", targets = [ "user" ], deps = [ "libc", "bootproto" ], description = "UEFI framebuffer driver", @@ -11,5 +11,3 @@ fb = module("drv.uefi_fb", "screen.cpp", "scrollback.cpp", ]) - -fb.variables['asflags'] = ["${asflags}", "-dmain_func=driver_main"] diff --git a/src/user/testapp/main.cpp b/src/user/testapp/main.cpp index 64d2d23..7fb0460 100644 --- a/src/user/testapp/main.cpp +++ b/src/user/testapp/main.cpp @@ -11,10 +11,6 @@ char inbuf[1024]; extern j6_handle_t __handle_sys; j6_handle_t endp = j6_handle_invalid; -extern "C" { - int main(int, const char **); -} - extern j6_handle_t __handle_self; constexpr uintptr_t stack_top = 0xf80000000;