diff --git a/src/libos/src/process/do_spawn/mod.rs b/src/libos/src/process/do_spawn/mod.rs index f9cd215a..7e9817b7 100644 --- a/src/libos/src/process/do_spawn/mod.rs +++ b/src/libos/src/process/do_spawn/mod.rs @@ -311,8 +311,8 @@ fn init_auxvec(process_vm: &ProcessVM, exec_elf_file: &ElfFile) -> Result Result i64; + fn __occlum_syscall_native() -> i64; fn occlum_gdb_hook_load_elf(elf_base: u64, elf_path: *const u8, elf_path_len: u64); } diff --git a/src/libos/src/syscall/syscall_entry_native_x86-64.S b/src/libos/src/syscall/syscall_entry_native_x86-64.S new file mode 100644 index 00000000..449d50aa --- /dev/null +++ b/src/libos/src/syscall/syscall_entry_native_x86-64.S @@ -0,0 +1,46 @@ +#define __ASSEMBLY__ +#include "task.h" + + .file "syscall_entry_native_x86-64.S" + .global __occlum_syscall_native + .type __occlum_syscall_native, @function +__occlum_syscall_native: + push %rbp + movq %rsp,%rbp + + // Save registers + pushq %rdi + pushq %rsi + pushq %rdx + pushq %r10 + pushq %r8 + // arg5 + pushq %r9 + // arg4--arg0 + movq %r8, %r9 + movq %r10, %r8 + movq %rdx, %rcx + movq %rsi, %rdx + movq %rdi, %rsi + // num + movq %rax, %rdi + + // num - %rdi + // arg0 - %rsi + // arg1 - %rdx + // arg2 - %rcx + // arg3 - %r8 + // arg4 - %r9 + // arg5 - *0x8(%rsp) + call __occlum_syscall + + // Restore registers + popq %r9 + popq %r8 + popq %r10 + popq %rdx + popq %rsi + popq %rdi + + popq %rbp + ret