From 0650e08744f0a9c7b95d2d5e5d4401415a867e0a Mon Sep 17 00:00:00 2001 From: "Jan (janneke) Nieuwenhuizen" Date: Sun, 30 Aug 2020 12:14:28 +0200 Subject: [PATCH] mescc: Mes C Library: x86_64: Add syscall-internal. This resurrects the x86_64 build. * lib/linux/x86_64-mes-gcc/syscall-internal.c (__sys_call_internal), lib/linux/x86_64-mes-mescc/syscall-internal.c: New file. --- lib/linux/x86_64-mes-gcc/syscall-internal.c | 67 +++++++++++++++++++ lib/linux/x86_64-mes-mescc/syscall-internal.c | 61 +++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 lib/linux/x86_64-mes-gcc/syscall-internal.c create mode 100644 lib/linux/x86_64-mes-mescc/syscall-internal.c diff --git a/lib/linux/x86_64-mes-gcc/syscall-internal.c b/lib/linux/x86_64-mes-gcc/syscall-internal.c new file mode 100644 index 00000000..c9d05467 --- /dev/null +++ b/lib/linux/x86_64-mes-gcc/syscall-internal.c @@ -0,0 +1,67 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2016,2017,2018,2020 Jan (janneke) Nieuwenhuizen + * + * This file is part of GNU Mes. + * + * GNU Mes is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or (at + * your option) any later version. + * + * GNU Mes is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Mes. If not, see . + */ + +#include +#include + +// *INDENT-OFF* +static long +__sys_call_internal (long sys_call) +{ + long r; + asm ( + "mov %1,%%rax\n\t" + "syscall \n\t" + "mov %%rax,%0\n\t" + : "=r" (r) + : "rm" (sys_call) + : "rax" + ); + return r; +} + +static long +__sys_call2_internal (long sys_call, long one, long two) +{ + long r; + asm ( + "mov %1,%%rax\n\t" + "mov %2,%%rdi\n\t" + "mov %3,%%rsi\n\t" + "syscall \n\t" + "mov %%rax,%0\n\t" + : "=r" (r) + : "rm" (sys_call), "rm" (one), "rm" (two) + : "rax", "rdi", "rsi" + ); + return r; +} +// *INDENT-ON* + +/* Return < 0 on error (errno-like value from kernel), or 0 on success */ +int +__raise (int signum) +{ + long pid = __sys_call_internal (SYS_getpid); + if (pid < 0) + return pid; + else + return __sys_call2_internal (SYS_kill, pid, signum); +} diff --git a/lib/linux/x86_64-mes-mescc/syscall-internal.c b/lib/linux/x86_64-mes-mescc/syscall-internal.c new file mode 100644 index 00000000..156a47b4 --- /dev/null +++ b/lib/linux/x86_64-mes-mescc/syscall-internal.c @@ -0,0 +1,61 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2016,2017,2018,2020 Jan (janneke) Nieuwenhuizen + * + * This file is part of GNU Mes. + * + * GNU Mes is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or (at + * your option) any later version. + * + * GNU Mes is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Mes. If not, see . + */ + +#include +#include + +static long +__sys_call_internal (long sys_call) +{ +#if 0 // !MES_CCAMD64 + asm ("mov____0x8(%rbp),%rdi !0x10"); +#else + asm ("mov____0x8(%rbp),%rax !0x10"); +#endif + + asm ("syscall"); +} + +static long +__sys_call2_internal (long sys_call, long one, long two) +{ +#if 0 // !MES_CCAMD64 + asm ("mov____0x8(%rbp),%rdi !0x10"); + asm ("mov____0x8(%rbp),%rsi !0x18"); + asm ("mov____0x8(%rbp),%rdx !0x20"); +#else + asm ("mov____0x8(%rbp),%rax !0x10"); + asm ("mov____0x8(%rbp),%rdi !0x18"); + asm ("mov____0x8(%rbp),%rsi !0x20"); +#endif + + asm ("syscall"); +} + +/* Return < 0 on error (errno-like value from kernel), or 0 on success */ +int +__raise (int signum) +{ + long pid = __sys_call_internal (SYS_getpid); + if (pid < 0) + return pid; + else + return __sys_call2_internal (SYS_kill, pid, signum); +}