From 50dff52c99cd61d1526a4e1469d5cafd38aac696 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Sat, 11 Aug 2018 18:39:48 +0200 Subject: [PATCH] mescc: Mes C Library: Add x86_64 libc+tcc support. * include/linux/x86/syscall.h: Move SYS_ defines from tcc.c. * include/linux/x86_64/syscall.h: Add SYS_ defines for tcc. * lib/x86-mes-gcc/setjmp.c: Rename from lib/libc+tcc-gcc.c * lib/x86-mes/setjmp.c: Rename from lib/libc+tcc-mes.c * lib/linux/tcc.c: Update. --- .gitignore | 2 - build-aux/build-cc.sh | 6 +- include/linux/x86/syscall.h | 10 +++ include/linux/x86_64/syscall.h | 10 +++ lib/libc+tcc.c | 16 ++--- lib/linux/tcc.c | 7 -- lib/{libc+tcc-gcc.c => x86-mes-gcc/setjmp.c} | 0 lib/{libc+tcc-mes.c => x86-mes/setjmp.c} | 4 +- lib/x86_64-mes-gcc/setjmp.c | 75 ++++++++++++++++++++ 9 files changed, 108 insertions(+), 22 deletions(-) rename lib/{libc+tcc-gcc.c => x86-mes-gcc/setjmp.c} (100%) rename lib/{libc+tcc-mes.c => x86-mes/setjmp.c} (94%) create mode 100644 lib/x86_64-mes-gcc/setjmp.c diff --git a/.gitignore b/.gitignore index 3a7e009a..c3fc54c5 100644 --- a/.gitignore +++ b/.gitignore @@ -41,8 +41,6 @@ *.x86_64-out -/lib/x86-mes-gcc -/lib/x86-mes-tcc /src/*.h /src/*.i /src/mes diff --git a/build-aux/build-cc.sh b/build-aux/build-cc.sh index 596dc7e3..3c4efd59 100755 --- a/build-aux/build-cc.sh +++ b/build-aux/build-cc.sh @@ -53,11 +53,11 @@ ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/linux/x86_64-mes-gcc/c # ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/linux/x86_64/crtn ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/libc-mini ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/libc -# ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/libgetopt -# ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/libc+tcc -# ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/libtcc1 # ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/libc+gnu # ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/libg +ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/libgetopt +ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/libc+tcc +ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/libtcc1 sh ${srcdest}build-aux/cc64-mes.sh scaffold/main sh ${srcdest}build-aux/cc64-mes.sh scaffold/hello diff --git a/include/linux/x86/syscall.h b/include/linux/x86/syscall.h index 7c06bd38..aa8bca28 100644 --- a/include/linux/x86/syscall.h +++ b/include/linux/x86/syscall.h @@ -20,9 +20,11 @@ #ifndef __MES_LINUX_X86_SYSCALL_H #define __MES_LINUX_X86_SYSCALL_H 1 +// libc-mini // #define SYS_exit 0x01 // #define SYS_write 0x04 +// libc #define SYS_fork 0x02 #define SYS_read 0x03 #define SYS_open 0x05 @@ -35,4 +37,12 @@ #define SYS_ioctl 0x36 #define SYS_fsync 0x76 +// libc+tcc +#define SYS_close 0x06 +#define SYS_lseek 0x13 +#define SYS_unlink 0x0a +#define SYS_rmdir 0x28 +#define SYS_stat 0x6a +#define SYS_getcwd 0xb7 + #endif // __MES_LINUX_X86_SYSCALL_H diff --git a/include/linux/x86_64/syscall.h b/include/linux/x86_64/syscall.h index b0630dd1..c8846d73 100644 --- a/include/linux/x86_64/syscall.h +++ b/include/linux/x86_64/syscall.h @@ -20,9 +20,11 @@ #ifndef __MES_LINUX_X86_64_SYSCALL_H #define __MES_LINUX_X86_64_SYSCALL_H 1 +// libc-mini // #define SYS_write 0x01 // #define SYS_exit 0x3c +// libc #define SYS_fork 0x39 #define SYS_read 0x00 #define SYS_open 0x02 @@ -35,4 +37,12 @@ #define SYS_ioctl 0x10 #define SYS_fsync 0x4a +// libc+tcc +#define SYS_close 0x03 +#define SYS_lseek 0x08 +#define SYS_unlink 0x57 +#define SYS_rmdir 0x54 +#define SYS_stat 0x04 +#define SYS_getcwd 0x4f + #endif // __MES_LINUX_X86_64_SYSCALL_H diff --git a/lib/libc+tcc.c b/lib/libc+tcc.c index 46168ae7..d19d7363 100644 --- a/lib/libc+tcc.c +++ b/lib/libc+tcc.c @@ -46,14 +46,14 @@ #endif #if __MESC__ - -#include - -#else // !__MESC__ - -#include - -#endif // !__MESC__ +#include +#elif __i386__ +#include +#elif __x86_64__ +#include +#else +#error arch not supported +#endif char * search_path (char const *file_name) diff --git a/lib/linux/tcc.c b/lib/linux/tcc.c index 8efc4719..07aec9e8 100644 --- a/lib/linux/tcc.c +++ b/lib/linux/tcc.c @@ -18,13 +18,6 @@ * along with GNU Mes. If not, see . */ -#define SYS_close 0x06 -#define SYS_lseek 0x13 -#define SYS_unlink 0x0a -#define SYS_rmdir 0x28 -#define SYS_stat 0x6a -#define SYS_getcwd 0xb7 - int close (int filedes) { diff --git a/lib/libc+tcc-gcc.c b/lib/x86-mes-gcc/setjmp.c similarity index 100% rename from lib/libc+tcc-gcc.c rename to lib/x86-mes-gcc/setjmp.c diff --git a/lib/libc+tcc-mes.c b/lib/x86-mes/setjmp.c similarity index 94% rename from lib/libc+tcc-mes.c rename to lib/x86-mes/setjmp.c index cfca1ec9..99bdd303 100644 --- a/lib/libc+tcc-mes.c +++ b/lib/x86-mes/setjmp.c @@ -1,6 +1,6 @@ /* -*-comment-start: "//";comment-end:""-*- * GNU Mes --- Maxwell Equations of Software - * Copyright © 2017 Jan (janneke) Nieuwenhuizen + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen * * This file is part of GNU Mes. * @@ -70,6 +70,6 @@ setjmp (__jmp_buf *env) int *p = (int*)&env; env[0].__bp = p[-2]; env[0].__pc = p[-1]; - env[0].__sp = (int)&env; + env[0].__sp = (long)&env; return 0; } diff --git a/lib/x86_64-mes-gcc/setjmp.c b/lib/x86_64-mes-gcc/setjmp.c new file mode 100644 index 00000000..ae372638 --- /dev/null +++ b/lib/x86_64-mes-gcc/setjmp.c @@ -0,0 +1,75 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2017,2018 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 +#include +#include +#include +#include +#include +#include +#include +#include + +int errno; + +void +longjmp (jmp_buf env, int val) +{ + val = val == 0 ? 1 : val; + asm ("mov %esi,%eax\n\t" // val + + "mov 0x00(%rdi),%rbp\n\t" // env->__bp + "mov 0x08(%rdi),%rbx\n\t" // env->__pc + "mov 0x16(%rdi),%rsp\n\t" // env->__sp + "jmp *%rbx\n\t" // jmp *PC + ); + // not reached + exit (42); +} + +#if 0 +int +setjmp_debug (jmp_buf env, int val) +{ + int i; +#if 1 + i = env->__bp; + i = env->__pc; + i = env->__sp; +#else + i = env[0].__bp; + i = env[0].__pc; + i = env[0].__sp; +#endif + return val == 0 ? 1 : val; +} +#endif + +int +setjmp (jmp_buf env) +{ + int *p = (int*)&env; + env[0].__bp = p[-2]; + env[0].__pc = p[-1]; + env[0].__sp = (long)&env; + return 0; +}