From 3705cf387ec9a87f0330766ccc933ff53f0bf530 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Fri, 8 Sep 2017 19:52:17 +0200 Subject: [PATCH] Add syscalls to x86-64 linux --- .gitignore | 3 ++ arch/build.ninja | 9 ++++++ arch/x64/linux/syscall.S | 65 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+) create mode 100644 arch/build.ninja create mode 100644 arch/x64/linux/syscall.S diff --git a/.gitignore b/.gitignore index 6df3f56..09178b0 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,6 @@ __test__*__.core /docs.json /*.lst + +# Ninja build +.ninja_* diff --git a/arch/build.ninja b/arch/build.ninja new file mode 100644 index 0000000..42ee8f6 --- /dev/null +++ b/arch/build.ninja @@ -0,0 +1,9 @@ +rule gas + command = gcc -c $in -o $out + +rule archive + command = ar rcs $out $in + +build syscall.o: gas x64/linux/syscall.S + +build tanya.a: archive syscall.o diff --git a/arch/x64/linux/syscall.S b/arch/x64/linux/syscall.S new file mode 100644 index 0000000..9261d87 --- /dev/null +++ b/arch/x64/linux/syscall.S @@ -0,0 +1,65 @@ +/* +The kernel uses the following registers: +%rdi, %rsi, %rdx, %r8, %r9, %r10 + +The number of the syscall is passed in %rax. + +A syscall clobbers: +%rax, %rcx, %r11 + +The returned value is placed in %rax. +*/ + .text + + .globl syscall1 + .type syscall1, @function + +syscall1: + movq %rsi, %rax // Syscall number. + + syscall + + ret + + + .globl syscall2 + .type syscall2, @function + +syscall2: + // Store registers. + movq %rdi, %r8 + + movq %rdx, %rax // Syscall number. + + // Syscall arguments. + movq %rsi, %rdi + movq %r8, %rsi + + syscall + + // Restore registers. + movq %rdi, %rsi + movq %r8, %rdi + + ret + + + .globl syscall3 + .type syscall3, @function + +syscall3: + // Store registers. + movq %rdi, %r8 + + movq %rcx, %rax // Syscall number. + + // Syscall arguments. + movq %rdx, %rdi + movq %r8, %rdx + + syscall + + // Restore registers. + movq %r8, %rdi + + ret