commit 56df9aed3e88ded5cdf667e7060fb13c65053834 parent 6dd97e59e8e0ed2dfbc740262defaa4d6aebe28c Author: Roberto Vargas <roberto.vargas@arm.com> Date: Thu, 1 Nov 2018 15:01:05 +0000 [libc] Import more files from scc Diffstat:
73 files changed, 321 insertions(+), 84 deletions(-)
diff --git a/arch/arm64/crt-none.s b/arch/arm64/crt-rmode.s diff --git a/arch/arm64/ram-crt-none.s b/arch/arm64/ram-crt-none.s @@ -1,2 +0,0 @@ - .file "ram-crt-none.s" - .include "crt-none.s" diff --git a/arch/arm64/ram-crt-rmode.s b/arch/arm64/ram-crt-rmode.s @@ -0,0 +1,2 @@ + .file "ram-crt-rmode.s" + .include "crt-rmode.s" diff --git a/arch/arm64/ram-none.c b/arch/arm64/ram-rmode.c diff --git a/arch/arm64/rom-crt-none.s b/arch/arm64/rom-crt-none.s @@ -1,2 +0,0 @@ - .file "rom-crt-none.s" - .include "crt-none.s" diff --git a/arch/arm64/rom-crt-rmode.s b/arch/arm64/rom-crt-rmode.s @@ -0,0 +1,2 @@ + .file "rom-crt-rmode.s" + .include "crt-rmode.s" diff --git a/arch/arm64/rom-none.c b/arch/arm64/rom-rmode.c diff --git a/config/arm64-none.mk b/config/arm64-none.mk @@ -1,9 +0,0 @@ -ARCH = arm64 -SYSCFLAGS = -g -static -nostdinc -ffreestanding -std=c99 -mgeneral-regs-only -fno-stack-protector -MD -Wall -SYSLDFLAGS = -static -z nodefaultlib -T $(CONFDIR)/arm64-none.ld -CROSS_COMPILE = aarch64-elf- -SYS=none -COMP = gcc -ASM = as -LINKER = ld -OBJCOPY = objcopy diff --git a/config/arm64-none.ld b/config/arm64-rmode.ld diff --git a/config/arm64-rmode.mk b/config/arm64-rmode.mk @@ -0,0 +1,9 @@ +ARCH = arm64 +SYSCFLAGS = -g -static -nostdinc -ffreestanding -std=c99 -mgeneral-regs-only -fno-stack-protector -MD -Wall +SYSLDFLAGS = -static -z nodefaultlib -T $(CONFDIR)/arm64-rmode.ld +CROSS_COMPILE = aarch64-elf- +SYS=rmode +COMP = gcc +ASM = as +LINKER = ld +OBJCOPY = objcopy diff --git a/include/bits/dragonfly/sys.h b/include/bits/dragonfly/sys.h @@ -8,5 +8,12 @@ typedef int pid_t; +struct sigaction { + void (*sa_handler)(int); + char sa_mask[8]; + int sa_flags; +}; + extern pid_t _getpid(void); extern int _kill(pid_t pid, int signum); +extern int _sigaction(int sig, struct sigaction *new, struct sigaction *old); diff --git a/include/bits/netbsd/sys.h b/include/bits/netbsd/sys.h @@ -8,5 +8,12 @@ typedef int pid_t; +struct sigaction { + void (*sa_handler)(int); + char sa_mask[8]; + int sa_flags; +}; + extern pid_t _getpid(void); extern int _kill(pid_t pid, int signum); +extern int _sigaction(int sig, struct sigaction *new, struct sigaction *old); diff --git a/include/bits/openbsd/sys.h b/include/bits/openbsd/sys.h @@ -8,5 +8,12 @@ typedef int pid_t; +struct sigaction { + void (*sa_handler)(int); + int sa_mask; + int sa_flags; +}; + extern pid_t _getpid(void); extern int _kill(pid_t pid, int signum); +extern int _sigaction(int sig, struct sigaction *new, struct sigaction *old); diff --git a/include/bits/none/sys.h b/include/bits/rmode/sys.h diff --git a/include/bits/none/sys/errno.h b/include/bits/rmode/sys/errno.h diff --git a/include/bits/none/sys/signal.h b/include/bits/rmode/sys/signal.h diff --git a/scripts/rules.mk b/scripts/rules.mk @@ -1,4 +1,4 @@ -CONF = arm64-none +CONF = arm64-rmode include $(PROJECTDIR)/config/$(CONF).mk INCDIR = $(PROJECTDIR)/include diff --git a/src/libc/arch/amd64/dragonfly/Makefile b/src/libc/arch/amd64/dragonfly/Makefile @@ -11,6 +11,12 @@ OBJS = _Exit.o \ _write.o \ _brk.o \ _getheap.o \ + _sigaction.o\ + _tzone.o\ + getenv.o\ + raise.o\ + signal.o\ + time.o\ all: syscall $(MAKE) objs diff --git a/src/libc/arch/amd64/dragonfly/_sigaction.c b/src/libc/arch/amd64/dragonfly/_sigaction.c @@ -0,0 +1,14 @@ +#include <stddef.h> +#include <sys.h> + +extern int _sigaction2(int sig, + struct sigaction *new, struct sigaction *old, + int siginfo[], int num); + +int +_sigaction(int sig, struct sigaction *new, struct sigaction *old) +{ + extern int _setcontext[]; + + return _sigaction2(sig, new, old, _setcontext, 2); +} diff --git a/src/libc/arch/amd64/dragonfly/_tzone.c b/src/libc/arch/amd64/dragonfly/_tzone.c @@ -0,0 +1 @@ +#include "../../posix/_tzone.c" diff --git a/src/libc/arch/amd64/dragonfly/getenv.c b/src/libc/arch/amd64/dragonfly/getenv.c @@ -0,0 +1 @@ +#include "../../posix/getenv.c" diff --git a/src/libc/arch/amd64/dragonfly/raise.c b/src/libc/arch/amd64/dragonfly/raise.c @@ -0,0 +1 @@ +#include "../../posix/raise.c" diff --git a/src/libc/arch/amd64/dragonfly/signal.c b/src/libc/arch/amd64/dragonfly/signal.c @@ -0,0 +1 @@ +#include "../../posix/signal.c" diff --git a/src/libc/arch/amd64/dragonfly/time.c b/src/libc/arch/amd64/dragonfly/time.c @@ -0,0 +1 @@ +#include "../../posix/time.c" diff --git a/src/libc/arch/amd64/linux/_sigaction.c b/src/libc/arch/amd64/linux/_sigaction.c @@ -0,0 +1,14 @@ +#include <stddef.h> +#include <sys.h> + +extern int _sigaction2(int sig, + struct sigaction *new, struct sigaction *old, + int siginfo[], int num); + +int +_sigaction(int sig, struct sigaction *new, struct sigaction *old) +{ + extern int _setcontext[]; + + return _sigaction2(sig, new, old, _setcontext, 2); +} diff --git a/src/libc/arch/amd64/linux/_tzone.c b/src/libc/arch/amd64/linux/_tzone.c @@ -0,0 +1 @@ +#include "../../posix/_tzone.c" diff --git a/src/libc/arch/amd64/linux/getenv.c b/src/libc/arch/amd64/linux/getenv.c @@ -0,0 +1 @@ +#include "../../posix/getenv.c" diff --git a/src/libc/arch/amd64/linux/raise.c b/src/libc/arch/amd64/linux/raise.c @@ -0,0 +1 @@ +#include "../../posix/raise.c" diff --git a/src/libc/arch/amd64/linux/signal.c b/src/libc/arch/amd64/linux/signal.c @@ -0,0 +1 @@ +#include "../../posix/signal.c" diff --git a/src/libc/arch/amd64/linux/time.c b/src/libc/arch/amd64/linux/time.c @@ -0,0 +1 @@ +#include "../../posix/time.c" diff --git a/src/libc/arch/amd64/netbsd/Makefile b/src/libc/arch/amd64/netbsd/Makefile @@ -11,6 +11,15 @@ OBJS = _Exit.o \ _write.o \ _brk.o \ _getheap.o \ + _setcontext.o \ + _sigaction.o \ + _sigaction2.o \ + _sigaction.o\ + _tzone.o\ + getenv.o\ + raise.o\ + signal.o\ + time.o\ all: syscall $(MAKE) objs diff --git a/src/libc/arch/amd64/netbsd/_setcontext.s b/src/libc/arch/amd64/netbsd/_setcontext.s @@ -0,0 +1,14 @@ + + .text + .globl _Exit + .globl _setcontext + +_setcontext: + movq %r15,%rdi + movq $0x134,%rax + syscall + + # Something was wrong, finish the program. We can't call + # abort here because it could generate a loop + movq $-1,%rdi + jmp _Exit diff --git a/src/libc/arch/amd64/netbsd/_sigaction.c b/src/libc/arch/amd64/netbsd/_sigaction.c @@ -0,0 +1,14 @@ +#include <stddef.h> +#include <sys.h> + +extern int _sigaction2(int sig, + struct sigaction *new, struct sigaction *old, + int siginfo[], int num); + +int +_sigaction(int sig, struct sigaction *new, struct sigaction *old) +{ + extern int _setcontext[]; + + return _sigaction2(sig, new, old, _setcontext, 2); +} diff --git a/src/libc/arch/amd64/netbsd/_sigaction2.s b/src/libc/arch/amd64/netbsd/_sigaction2.s @@ -0,0 +1,12 @@ + +# This syscall cannot be autogenerated because it receives more than +# 4 arguments + + .text + .globl _sigaction2 + +_sigaction2: + mov $0x154,%eax + mov %rcx,%r10 + syscall + retq diff --git a/src/libc/arch/amd64/netbsd/_tzone.c b/src/libc/arch/amd64/netbsd/_tzone.c @@ -0,0 +1 @@ +#include "../../posix/_tzone.c" diff --git a/src/libc/arch/amd64/netbsd/getenv.c b/src/libc/arch/amd64/netbsd/getenv.c @@ -0,0 +1 @@ +#include "../../posix/getenv.c" diff --git a/src/libc/arch/amd64/netbsd/raise.c b/src/libc/arch/amd64/netbsd/raise.c @@ -0,0 +1 @@ +#include "../../posix/raise.c" diff --git a/src/libc/arch/amd64/netbsd/signal.c b/src/libc/arch/amd64/netbsd/signal.c @@ -0,0 +1 @@ +#include "../../posix/signal.c" diff --git a/src/libc/arch/amd64/netbsd/time.c b/src/libc/arch/amd64/netbsd/time.c @@ -0,0 +1 @@ +#include "../../posix/time.c" diff --git a/src/libc/arch/amd64/openbsd/Makefile b/src/libc/arch/amd64/openbsd/Makefile @@ -11,6 +11,12 @@ OBJS = _Exit.o \ _write.o \ _brk.o \ _getheap.o \ + _sigaction.o\ + _tzone.o\ + getenv.o\ + raise.o\ + signal.o\ + time.o\ all: syscall $(MAKE) objs diff --git a/src/libc/arch/amd64/openbsd/_sigaction.c b/src/libc/arch/amd64/openbsd/_sigaction.c @@ -0,0 +1,14 @@ +#include <stddef.h> +#include <sys.h> + +extern int _sigaction2(int sig, + struct sigaction *new, struct sigaction *old, + int siginfo[], int num); + +int +_sigaction(int sig, struct sigaction *new, struct sigaction *old) +{ + extern int _setcontext[]; + + return _sigaction2(sig, new, old, _setcontext, 2); +} diff --git a/src/libc/arch/amd64/openbsd/_tzone.c b/src/libc/arch/amd64/openbsd/_tzone.c @@ -0,0 +1 @@ +#include "../../posix/_tzone.c" diff --git a/src/libc/arch/amd64/openbsd/getenv.c b/src/libc/arch/amd64/openbsd/getenv.c @@ -0,0 +1 @@ +#include "../../posix/getenv.c" diff --git a/src/libc/arch/amd64/openbsd/raise.c b/src/libc/arch/amd64/openbsd/raise.c @@ -0,0 +1 @@ +#include "../../posix/raise.c" diff --git a/src/libc/arch/amd64/openbsd/signal.c b/src/libc/arch/amd64/openbsd/signal.c @@ -0,0 +1 @@ +#include "../../posix/signal.c" diff --git a/src/libc/arch/amd64/openbsd/syscall.lst b/src/libc/arch/amd64/openbsd/syscall.lst @@ -6,5 +6,6 @@ 6 _close 17 _brk 20 _getpid -37 _kill -199 _lseek +46 _sigaction +122 _kill +198 _lseek diff --git a/src/libc/arch/amd64/openbsd/time.c b/src/libc/arch/amd64/openbsd/time.c @@ -0,0 +1 @@ +#include "../../posix/time.c" diff --git a/src/libc/arch/arm64/Makefile b/src/libc/arch/arm64/Makefile @@ -2,7 +2,7 @@ PROJECTDIR =../../../.. include $(PROJECTDIR)/scripts/rules.mk OBJS = longjmp.o setjmp.o -DIRS = none linux +DIRS = rmode linux all: $(OBJS) $(SYS) diff --git a/src/libc/arch/arm64/linux/_sigaction.c b/src/libc/arch/arm64/linux/_sigaction.c @@ -0,0 +1,14 @@ +#include <stddef.h> +#include <sys.h> + +extern int _sigaction2(int sig, + struct sigaction *new, struct sigaction *old, + int siginfo[], int num); + +int +_sigaction(int sig, struct sigaction *new, struct sigaction *old) +{ + extern int _setcontext[]; + + return _sigaction2(sig, new, old, _setcontext, 2); +} diff --git a/src/libc/arch/arm64/linux/_tzone.c b/src/libc/arch/arm64/linux/_tzone.c @@ -0,0 +1 @@ +#include "../../posix/_tzone.c" diff --git a/src/libc/arch/arm64/linux/getenv.c b/src/libc/arch/arm64/linux/getenv.c @@ -0,0 +1 @@ +#include "../../posix/getenv.c" diff --git a/src/libc/arch/arm64/linux/raise.c b/src/libc/arch/arm64/linux/raise.c @@ -0,0 +1 @@ +#include "../../posix/raise.c" diff --git a/src/libc/arch/arm64/linux/signal.c b/src/libc/arch/arm64/linux/signal.c @@ -0,0 +1 @@ +#include "../../posix/signal.c" diff --git a/src/libc/arch/arm64/linux/time.c b/src/libc/arch/arm64/linux/time.c @@ -0,0 +1 @@ +#include "../../posix/time.c" diff --git a/src/libc/arch/arm64/none/Makefile b/src/libc/arch/arm64/none/Makefile @@ -1,9 +0,0 @@ -PROJECTDIR =../../../../.. -include $(PROJECTDIR)/scripts/rules.mk - -OBJS = _Exit.o \ - _getpid.o \ - _kill.o \ - _write.o \ - -all: $(OBJS) diff --git a/src/libc/arch/arm64/none/_Exit.s b/src/libc/arch/arm64/none/_Exit.s @@ -1,10 +0,0 @@ - .file "_Exit.s" - - .text - .globl _Exit -_Exit: - adr x0,msg - b panic - - .section .rodata -msg: .asciz "_Exit" diff --git a/src/libc/arch/arm64/none/_getpid.s b/src/libc/arch/arm64/none/_getpid.s @@ -1,10 +0,0 @@ - .file "_getpid.s" - - .text - .globl _getpid -_getpid: - adr x0,msg - b panic - - .section .rodata -msg: .asciz "_getpid" diff --git a/src/libc/arch/arm64/none/_kill.s b/src/libc/arch/arm64/none/_kill.s @@ -1,10 +0,0 @@ - .file "_kill.s" - - .text - .globl _kill -_kill: - adr x0,msg - b panic - - .section .rodata -msg: .asciz "_kill" diff --git a/src/libc/arch/arm64/none/_write.s b/src/libc/arch/arm64/none/_write.s @@ -1,13 +0,0 @@ - .file "_write.s" - - .text - .globl _write -/* - * x0 = fd (unused) - * x1 = buf - * x2 = cnt - */ -_write: - mov x0,x1 - mov x1,x2 - b uartwrite diff --git a/src/libc/arch/arm64/rmode/Makefile b/src/libc/arch/arm64/rmode/Makefile @@ -0,0 +1,8 @@ +PROJECTDIR =../../../../.. +include $(PROJECTDIR)/scripts/rules.mk + +OBJS = _Exit.o \ + raise.o \ + _write.o \ + +all: $(OBJS) diff --git a/src/libc/arch/arm64/rmode/_Exit.c b/src/libc/arch/arm64/rmode/_Exit.c @@ -0,0 +1 @@ +#include "../../rmode/_Exit.c" diff --git a/src/libc/arch/arm64/rmode/_write.c b/src/libc/arch/arm64/rmode/_write.c @@ -0,0 +1 @@ +#include "../../rmode/_write.c" diff --git a/src/libc/arch/arm64/rmode/raise.c b/src/libc/arch/arm64/rmode/raise.c @@ -0,0 +1 @@ +#include "../../rmode/raise.c" diff --git a/src/libc/arch/posix/_tzone.c b/src/libc/arch/posix/_tzone.c @@ -0,0 +1,27 @@ +#include <stdlib.h> +#include <time.h> +#include "../../libc.h" + +struct tzone * +_tzone(struct tm *tm) +{ + static struct tzone tz; + static int first = 1; + + if (!first) + return &tz; + + tz.name = getenv("TZ"); + if (!tz.name || *tz.name == '\0') { + tz.name = NULL; + tz.gmtoff = 0; + tz.isdst = 0; + } else { + /* TODO: parse TZ string */ + tz.gmtoff = 0; + tz.isdst = 0; + } + first = 0; + + return &tz; +} diff --git a/src/libc/arch/posix/getenv.c b/src/libc/arch/posix/getenv.c @@ -0,0 +1,22 @@ +#include <stdlib.h> +#include <string.h> +#undef getenv + +extern char **_environ; + +char * +getenv(const char *name) +{ + char **p; + size_t len = strlen(name); + + for (p = _environ; *p; ++p) { + if (!memcmp(name, *p, len) && (*p)[len] == '=') + break; + } + + if (!*p) + return NULL; + + return &(*p)[len]; +} diff --git a/src/libc/arch/posix/raise.c b/src/libc/arch/posix/raise.c @@ -0,0 +1,11 @@ +#include <stddef.h> +#include <signal.h> +#include <sys.h> + +#undef raise + +int +raise(int signum) +{ + return _kill(_getpid(), signum); +} diff --git a/src/libc/arch/posix/signal.c b/src/libc/arch/posix/signal.c @@ -0,0 +1,17 @@ +#include <stddef.h> +#include <signal.h> +#include <sys.h> +#undef signal + +void +(*signal(int signum, void (*func)(int)))(int) +{ + struct sigaction sa = { + .sa_handler = func, + }; + + if (_sigaction(signum, &sa, &sa) < 0) + return SIG_ERR; + + return sa.sa_handler; +} diff --git a/src/libc/arch/posix/time.c b/src/libc/arch/posix/time.c @@ -0,0 +1,21 @@ +#include <time.h> + +struct timeval { + time_t tv_sec; + int tv_usec; /* TODO use a arch type */ +}; + +int +_gettimeofday(struct timeval * restrict tp, void * restrict tzp); + +time_t +time(time_t *t) +{ + struct timeval tv; + + if (_gettimeofday(&tv, NULL) == -1) + return -1; + if (t) + *t =tv.tv_sec; + return tv.tv_sec; +} diff --git a/src/libc/arch/rmode/_Exit.c b/src/libc/arch/rmode/_Exit.c @@ -0,0 +1,11 @@ +#include <stdlib.h> + +#include <rcode.h> + +#undef _Exit + +void +_Exit(int num) +{ + panic("_Exit"); +} diff --git a/src/libc/arch/rmode/_write.c b/src/libc/arch/rmode/_write.c @@ -0,0 +1,9 @@ +#include <stddef.h> + +#include "../../syscall.h" + +int +_write(int fd, void *buf, size_t len) +{ + return uartwrite(buf, len); +} diff --git a/src/libc/arch/rmode/raise.c b/src/libc/arch/rmode/raise.c @@ -0,0 +1,11 @@ +#include <stdlib.h> + +#include <rcode.h> + +#undef raise + +int +raise(int sig) +{ + panic("raise"); +} diff --git a/src/libc/stdlib/Makefile b/src/libc/stdlib/Makefile @@ -20,7 +20,6 @@ OBJS = __abs.o\ llabs.o\ malloc.o\ qsort.o\ - raise.o\ rand.o\ realloc.o\ diff --git a/src/libc/stdlib/raise.c b/src/libc/stdlib/raise.c @@ -1,14 +0,0 @@ - -#include <stddef.h> -#include "signal.h" - -extern int _getpid(void); -extern int _kill(int pid, int signum); - -#undef raise - -int -raise(int signum) -{ - return _kill(_getpid(), signum); -}