From a25b25984f5e54f675ea2859445a42ae97b544b0 Mon Sep 17 00:00:00 2001 From: Alec Murphy Date: Tue, 10 Jun 2025 07:42:11 -0400 Subject: [PATCH] Initialize interpreter in Adam task --- Run.HC | 9 ++++--- System/FFI/Base.HC | 51 --------------------------------------- System/FFI/ELF64.HC | 45 ++++++++++++++++++++++------------ System/FFI/LibC.HC | 22 +++++++++++++++++ System/MakeSystem.HC | 36 ++------------------------- MuJS.HC => System/MuJS.HC | 0 scripts/build-all | 2 +- 7 files changed, 60 insertions(+), 105 deletions(-) delete mode 100644 System/FFI/Base.HC rename MuJS.HC => System/MuJS.HC (100%) diff --git a/Run.HC b/Run.HC index c9808e0..5216383 100644 --- a/Run.HC +++ b/Run.HC @@ -1,7 +1,8 @@ -XTalkWait(Fs, "Cd(\"M:/System/\");\n"); -XTalkWait(Fs, "#include \"M:/System/MakeSystem\";\n"); -XTalkWait(Fs, "#include \"M:/MuJS\";\n"); +Adam("Cd(\"M:/System/\");\n"); +Adam("#include \"M:/System/MakeSystem\";\n"); + +WinMax; +AutoComplete(0); XTalkWait(Fs, "Cd(\"M:/\");\n"); XTalkWait(Fs, "mujs(\"examples/hello.js\");\n"); - diff --git a/System/FFI/Base.HC b/System/FFI/Base.HC deleted file mode 100644 index 0211c44..0000000 --- a/System/FFI/Base.HC +++ /dev/null @@ -1,51 +0,0 @@ -#define PUSH_SYSV_REGS \ - asm {PUSH RCX PUSH RDX PUSH RBX PUSH RBP PUSH RSI PUSH RDI PUSH R8 PUSH R9 PUSH \ - R10 PUSH R11 PUSH R12 PUSH R13 PUSH R14 PUSH R15} -#define POP_SYSV_REGS \ - p0 = p0; \ - p1 = p1; \ - p2 = p2; \ - p3 = p3; \ - p4 = p4; \ - p5 = p5; \ - asm {POP R15 POP R14 POP R13 POP R12 POP R11 POP R10 POP R9 POP R8 POP RDI POP \ - RSI POP RBP POP RBX POP RDX POP RCX} -#define GET_SYSV_ARGS \ - asm {PUSH R9 PUSH R8 PUSH RCX PUSH RDX PUSH RSI PUSH RDI} \ - I64 reg RDI p0; \ - I64 reg RSI p1; \ - I64 reg RDX p2; \ - I64 reg RCX p3; \ - I64 reg R8 p4; \ - I64 reg R9 p5; \ - asm {POP RDI POP RSI POP RDX POP RCX POP R8 POP R9} - -#define MOV_ANS_RAX asm { MOV[&ans], RAX } -#define MOV_PARAM0_RDI asm {MOV [¶m0], RDI} - -I64 param0; -I64 elf_argc; -U8** elf_argv; - -asm { -_ELF_CALL:: - PUSH RBP - MOV RBP,RSP - MOV RAX,U64 SF_ARG1[RBP] - MOV RDI,U64 SF_ARG2[RBP] - MOV RSI,U64 SF_ARG3[RBP] - TEST RAX,RAX - JZ @@05 - CALL RAX -@@05: POP RBP - RET1 8 -} - -U0 _main() -{ - MOV_PARAM0_RDI - CallInd(_ELF_CALL, param0, elf_argc, elf_argv); - UserTaskCont; -} - -//U0 _exit() { UserTaskCont; } diff --git a/System/FFI/ELF64.HC b/System/FFI/ELF64.HC index 87af9fd..324ca1f 100644 --- a/System/FFI/ELF64.HC +++ b/System/FFI/ELF64.HC @@ -3,6 +3,36 @@ #define ET_EXEC 2 #define ET_DYN 3 +U0 @patch_call_rel32(U32 from, U32 to) +{ + *(from(U8*)) = 0xE8; + *((from + 1)(I32*)) = to - from - 5; +} + +U0 @patch_jmp_rel32(U32 from, U32 to) +{ + *(from(U8*)) = 0xE9; + *((from + 1)(I32*)) = to - from - 5; +} + +U0 @sse_enable() +{ + /* clang-format off */ + asm + { + MOV_EAX_CR0 + AND AX, 0xFFFB // clear coprocessor emulation CR0.EM + OR AX, 0x2 // set coprocessor monitoring CR0.MP + MOV_CR0_EAX + MOV_EAX_CR4 + OR AX, 3 << 9 // set CR4.OSFXSR and CR4.OSXMMEXCPT at the same time + MOV_CR4_EAX + } + /* clang-format on */ +} + +@sse_enable; + U0 @elf64_debug_print(U8 fmt, ...) { // FIXME: Remove unnecessary debug_print statements and PrintErr for errors. @@ -170,11 +200,6 @@ U0 process_elf_rela_dyn_entries(Elf* elf) entry_name = elf->dynstr + elf->dynsym[(rela_dyn->r_info >> 32)].st_name; @elf64_debug_print("rela_dyn->r_offset = %08x\n", rela_dyn->r_offset); @elf64_debug_print("entry name = '%s'\n", entry_name); - if (!StrCmp(entry_name, "__libc_start_main")) { - *(rela_dyn->r_offset)(U64*) = &_main; - @elf64_debug_print("Set value for .rela.dyn entry '%s' to: &_main\n", - entry_name); - } if (!StrCmp(entry_name, "stdin")) { *(rela_dyn->r_offset)(U64*) = 0; @elf64_debug_print("Set value for .rela.dyn entry '%s' to: %d\n", entry_name, 0); @@ -249,12 +274,6 @@ U0 process_elf_rela_plt_entries(Elf* elf) *patch = entry_name; @patch_jmp_rel32(plt, handler); @patch_call_rel32(handler + 0x16, &PrintErr); - //@patch_call_rel32(handler + 0x21, &_exit); - if (!StrCmp(entry_name, "__libc_start_main")) { - symbol_exists = TRUE; - @patch_jmp_rel32(plt, &_main); - @elf64_debug_print("Set value for .rela.plt entry '%s' to &_main\n", entry_name); - } if (get_symbol_address(entry_name)) { symbol_exists = TRUE; @patch_jmp_rel32(plt, get_symbol_address(entry_name)); @@ -293,8 +312,4 @@ U0 load_elf(...) process_elf_section_header_table(&elf); process_elf_rela_dyn_entries(&elf); process_elf_rela_plt_entries(&elf); - - _start = elf.ehdr->e_entry; - elf_argc = argc; - elf_argv = argv; } diff --git a/System/FFI/LibC.HC b/System/FFI/LibC.HC index 230fef1..d089d7a 100644 --- a/System/FFI/LibC.HC +++ b/System/FFI/LibC.HC @@ -1,3 +1,25 @@ +#define PUSH_SYSV_REGS \ +asm {PUSH RCX PUSH RDX PUSH RBX PUSH RBP PUSH RSI PUSH RDI PUSH R8 PUSH R9 PUSH \ + R10 PUSH R11 PUSH R12 PUSH R13 PUSH R14 PUSH R15} + #define POP_SYSV_REGS \ + p0 = p0; \ + p1 = p1; \ + p2 = p2; \ + p3 = p3; \ + p4 = p4; \ + p5 = p5; \ + asm {POP R15 POP R14 POP R13 POP R12 POP R11 POP R10 POP R9 POP R8 POP RDI POP \ + RSI POP RBP POP RBX POP RDX POP RCX} + #define GET_SYSV_ARGS \ + asm {PUSH R9 PUSH R8 PUSH RCX PUSH RDX PUSH RSI PUSH RDI} \ + I64 reg RDI p0; \ + I64 reg RSI p1; \ + I64 reg RDX p2; \ + I64 reg RCX p3; \ + I64 reg R8 p4; \ + I64 reg R9 p5; \ + asm {POP RDI POP RSI POP RDX POP RCX POP R8 POP R9} + asm { _SETJMP:: MOV [RDI], RBX // Store caller saved registers diff --git a/System/MakeSystem.HC b/System/MakeSystem.HC index 54ed209..fbb1cbd 100644 --- a/System/MakeSystem.HC +++ b/System/MakeSystem.HC @@ -1,44 +1,12 @@ /* clang-format off */ -WinMax; -AutoComplete(0); - -U0 @patch_call_rel32(U32 from, U32 to) -{ - *(from(U8*)) = 0xE8; - *((from + 1)(I32*)) = to - from - 5; -} - -U0 @patch_jmp_rel32(U32 from, U32 to) -{ - *(from(U8*)) = 0xE9; - *((from + 1)(I32*)) = to - from - 5; -} - -U0 @sse_enable() -{ - /* clang-format off */ - asm - { - MOV_EAX_CR0 - AND AX, 0xFFFB // clear coprocessor emulation CR0.EM - OR AX, 0x2 // set coprocessor monitoring CR0.MP - MOV_CR0_EAX - MOV_EAX_CR4 - OR AX, 3 << 9 // set CR4.OSFXSR and CR4.OSXMMEXCPT at the same time - MOV_CR4_EAX - } - /* clang-format on */ -} - -@sse_enable; - // FFI support files -#include "FFI/Base"; #include "FFI/LibC"; #include "FFI/ELF64"; // LibTemple support files #include "LibTemple/OS"; +#include "MuJS"; + /* clang-format on */ diff --git a/MuJS.HC b/System/MuJS.HC similarity index 100% rename from MuJS.HC rename to System/MuJS.HC diff --git a/scripts/build-all b/scripts/build-all index d6cef26..9a90620 100755 --- a/scripts/build-all +++ b/scripts/build-all @@ -118,7 +118,7 @@ def generate_iso_c_file(): # Fixup addresses for MuJS mujs_bin_path = redsea_path + '/build/bin/mujs' - mujs_hc_path = redsea_path + '/MuJS.HC' + mujs_hc_path = redsea_path + '/System/MuJS.HC' hc_fixup('MUJS_MAIN', 'main', mujs_bin_path, mujs_hc_path) exit_fixup(mujs_bin_path, mujs_hc_path)