From 71150804d1ac8ed2f7b9c6d3025fd415c58b129e Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Thu, 15 Jul 2004 07:34:00 +0000 Subject: h8300 updates from Yoshinori Sato --- libc/sysdeps/linux/h8300/Makefile | 14 +- libc/sysdeps/linux/h8300/__longjmp.S | 26 ++++ libc/sysdeps/linux/h8300/bits/atomicity.h | 79 ++++++++++ libc/sysdeps/linux/h8300/bits/huge_val.h | 75 --------- libc/sysdeps/linux/h8300/bits/kernel_stat.h | 5 +- libc/sysdeps/linux/h8300/bits/kernel_types.h | 24 ++- libc/sysdeps/linux/h8300/bits/mman.h | 20 +-- libc/sysdeps/linux/h8300/bits/resource.h | 204 ------------------------- libc/sysdeps/linux/h8300/bits/setjmp.h | 42 ++--- libc/sysdeps/linux/h8300/bits/sigcontextinfo.h | 26 ++++ libc/sysdeps/linux/h8300/bits/stackinfo.h | 28 ++++ libc/sysdeps/linux/h8300/bits/syscalls.h | 156 +++++++++++++++++-- libc/sysdeps/linux/h8300/bits/wordsize.h | 20 +-- libc/sysdeps/linux/h8300/brk.c | 33 ++++ libc/sysdeps/linux/h8300/bsd-_setjmp.S | 27 ++++ libc/sysdeps/linux/h8300/bsd-setjmp.S | 30 ++++ libc/sysdeps/linux/h8300/clone.S | 78 ++++++++++ libc/sysdeps/linux/h8300/crt0.S | 5 + libc/sysdeps/linux/h8300/crti.S | 30 ++++ libc/sysdeps/linux/h8300/crtn.S | 30 ++++ libc/sysdeps/linux/h8300/pt-machine.h | 58 +++++++ libc/sysdeps/linux/h8300/ptrace.c | 22 +-- libc/sysdeps/linux/h8300/setjmp.S | 46 ++---- libc/sysdeps/linux/h8300/sys/procfs.h | 126 +++++++++++++++ libc/sysdeps/linux/h8300/vfork.S | 5 + 25 files changed, 788 insertions(+), 421 deletions(-) create mode 100644 libc/sysdeps/linux/h8300/__longjmp.S create mode 100644 libc/sysdeps/linux/h8300/bits/atomicity.h delete mode 100644 libc/sysdeps/linux/h8300/bits/huge_val.h delete mode 100644 libc/sysdeps/linux/h8300/bits/resource.h create mode 100644 libc/sysdeps/linux/h8300/bits/sigcontextinfo.h create mode 100644 libc/sysdeps/linux/h8300/bits/stackinfo.h create mode 100644 libc/sysdeps/linux/h8300/brk.c create mode 100644 libc/sysdeps/linux/h8300/bsd-_setjmp.S create mode 100644 libc/sysdeps/linux/h8300/bsd-setjmp.S create mode 100644 libc/sysdeps/linux/h8300/clone.S create mode 100644 libc/sysdeps/linux/h8300/crti.S create mode 100644 libc/sysdeps/linux/h8300/crtn.S create mode 100644 libc/sysdeps/linux/h8300/pt-machine.h create mode 100644 libc/sysdeps/linux/h8300/sys/procfs.h (limited to 'libc/sysdeps/linux/h8300') diff --git a/libc/sysdeps/linux/h8300/Makefile b/libc/sysdeps/linux/h8300/Makefile index 141a68f69..f79069241 100644 --- a/libc/sysdeps/linux/h8300/Makefile +++ b/libc/sysdeps/linux/h8300/Makefile @@ -19,6 +19,9 @@ TOPDIR=../../../../ include $(TOPDIR)Rules.mak ASFLAGS=$(CFLAGS) +ifeq ($(DOPIC),y) +ASFLAGS+=-D__PIC__ +endif #FIXME -- this arch should include its own crti.S and crtn.S UCLIBC_CTOR_DTOR=n @@ -27,17 +30,17 @@ CRT0_SRC = crt0.S CRT0_OBJ = crt0.o crt1.o CTOR_TARGETS=$(TOPDIR)lib/crti.o $(TOPDIR)lib/crtn.o -SSRC=setjmp.S vfork.S # longjmp.S _start.S clone.S +SSRC=__longjmp.S bsd-_setjmp.S bsd-setjmp.S clone.S setjmp.S vfork.S SOBJS=$(patsubst %.S,%.o, $(SSRC)) -CSRC=ptrace.c +CSRC=ptrace.c brk.c COBJS=$(patsubst %.c,%.o, $(CSRC)) OBJS=$(SOBJS) $(COBJS) all: $(OBJS) $(LIBC) -$(LIBC): ar-target +$(LIBC): ar-target ar-target: $(OBJS) $(CRT0_OBJ) $(CTOR_TARGETS) $(AR) $(ARFLAGS) $(LIBC) $(OBJS) @@ -48,7 +51,7 @@ $(CRT0_OBJ): $(CRT0_SRC) $(STRIPTOOL) -x -R .note -R .comment $*.o $(SOBJS): %.o : %.S - $(CC) $(CFLAGS) -c $< -o $@ + $(CC) $(ASFLAGS) -c $< -o $@ $(STRIPTOOL) -x -R .note -R .comment $*.o $(COBJS): %.o : %.c @@ -83,7 +86,4 @@ headers: clean: $(RM) *.[oa] *~ core -ifneq ($(strip $(HAVE_ELF)),y) - $(RM) $(TOPDIR)/include/float.h -endif diff --git a/libc/sysdeps/linux/h8300/__longjmp.S b/libc/sysdeps/linux/h8300/__longjmp.S new file mode 100644 index 000000000..2233644d0 --- /dev/null +++ b/libc/sysdeps/linux/h8300/__longjmp.S @@ -0,0 +1,26 @@ +#define _ASM +#define _SETJMP_H +#include + +#ifdef __H8300S__ + .h8300s +#else + .h8300h +#endif + .text + +.global ___longjmp + +___longjmp: + mov.l er1,er1 + bne 1f + sub.l er1,er1 + inc.l #1,er1 +1: + mov.l @er0+,er4 + mov.l @er0+,er5 + mov.l @er0+,er6 + mov.l @er0+,sp + mov.l @er0+,er3 ; return PC + adds #4,sp ; adjust return stack + jmp @er3 diff --git a/libc/sysdeps/linux/h8300/bits/atomicity.h b/libc/sysdeps/linux/h8300/bits/atomicity.h new file mode 100644 index 000000000..a4fcc1524 --- /dev/null +++ b/libc/sysdeps/linux/h8300/bits/atomicity.h @@ -0,0 +1,79 @@ +/* Low-level functions for atomic operations. H8/300 version. + Copyright (C) 1997, 2000, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _ATOMICITY_H +#define _ATOMICITY_H 1 + +#include + + +static inline uint32_t +__attribute__ ((unused)) +exchange_and_add (volatile uint32_t *mem, uint32_t val) +{ + uint32_t result; + __asm__ __volatile__ ("stc ccr,@-sp\n\t" + "orc #0x80,ccr\n\t" + "mov.l %1,er1\n\t" + "mov.l %0,%1\n\t" + "add.l er1,%0\n\t" + "ldc @sp+,ccr" + : "=r" (result), "=m" (*mem) + : "0" (val), "1" (*mem) + : "er1"); + return result; +} + +static inline void +__attribute__ ((unused)) +atomic_add (volatile uint32_t *mem, int val) +{ + __asm__ __volatile__ ("stc ccr,@-sp\n\t" + "orc #0x80,ccr\n\t" + "mov.l %0,er0\n\t" + "add %1,er0\n\t" + "mov.l er0,%0\n\t" + "ldc @sp+,ccr" + : "=m" (*mem) + : "r" (val), "0" (*mem) + : "er0"); +} + +static inline int +__attribute__ ((unused)) +compare_and_swap (volatile long int *p, long int oldval, long int newval) +{ + int ret = 0; + + __asm__ __volatile__ ("stc ccr,@-sp\n\t" + "orc #0x80,ccr\n\t" + "mov.l %1,er0\n\t" + "cmp.l %2,er0\n\t" + "bne 1f\n\t" + "mov.l %3,%1\n\t" + "inc.l #1,%0\n" + "1:\n\t" + "ldc @sp+,ccr" + : "=r"(ret),"=m"(*p) + : "r"(oldval),"r"(newval),"0"(ret),"1"(*p) + : "er0"); + return ret; +} + +#endif /* atomicity.h */ diff --git a/libc/sysdeps/linux/h8300/bits/huge_val.h b/libc/sysdeps/linux/h8300/bits/huge_val.h deleted file mode 100644 index 822b82930..000000000 --- a/libc/sysdeps/linux/h8300/bits/huge_val.h +++ /dev/null @@ -1,75 +0,0 @@ -/* `HUGE_VAL' constants for m68k (where it is infinity). - Used by and functions for overflow. - Copyright (C) 1992, 1995, 1996, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#ifndef _MATH_H -# error "Never use directly; include instead." -#endif - - -#include -#include - -/* IEEE positive infinity (-HUGE_VAL is negative infinity). */ - -#ifdef __GNUC__ - -# define HUGE_VAL \ - (__extension__ \ - ((union { unsigned long long __l; double __d; }) \ - { __l: 0x7ff0000000000000ULL }).__d) - -#else /* not GCC */ - -static union { unsigned char __c[8]; double __d; } __huge_val = - { { 0x7f, 0xf0, 0, 0, 0, 0, 0, 0 } }; -# define HUGE_VAL (__huge_val.__d) - -#endif /* GCC. */ - - -/* ISO C 9X extensions: (float) HUGE_VALF and (long double) HUGE_VALL. */ - -#ifdef __USE_ISOC9X - -# ifdef __GNUC__ - -# define HUGE_VALF \ - (__extension__ \ - ((union { unsigned long __l; float __f; }) \ - { __l: 0x7f800000UL }).__f) - -# define HUGE_VALL \ - (__extension__ \ - ((union { unsigned long __l[3]; long double __ld; }) \ - { __l: { 0x7fff0000UL, 0x80000000UL, 0UL } }).__ld) - -# else /* not GCC */ - -static union { unsigned char __c[4]; float __f; } __huge_valf = - { { 0x7f, 0x80, 0, 0 } }; -# define HUGE_VALF (__huge_valf.__f) - -static union { unsigned char __c[12]; long double __ld; } __huge_vall = - { { 0x7f, 0xff, 0, 0, 0x80, 0, 0, 0, 0, 0, 0, 0 } }; -# define HUGE_VALL (__huge_vall.__ld) - -# endif /* GCC. */ - -#endif /* __USE_ISOC9X. */ diff --git a/libc/sysdeps/linux/h8300/bits/kernel_stat.h b/libc/sysdeps/linux/h8300/bits/kernel_stat.h index 3d2805e7f..c227a30d0 100644 --- a/libc/sysdeps/linux/h8300/bits/kernel_stat.h +++ b/libc/sysdeps/linux/h8300/bits/kernel_stat.h @@ -38,13 +38,12 @@ struct kernel_stat64 { unsigned int st_nlink; unsigned long st_uid; unsigned long st_gid; - unsigned char __pad2[6]; unsigned short st_rdev; - unsigned char __pad3[2]; + unsigned char __pad3[10]; long long st_size; unsigned long st_blksize; - unsigned long __pad4; /* future possible st_blocks high bits */ unsigned long st_blocks; /* Number 512-byte blocks allocated. */ + unsigned long __pad4; /* future possible st_blocks high bits */ unsigned long st_atime; unsigned long __pad5; unsigned long st_mtime; diff --git a/libc/sysdeps/linux/h8300/bits/kernel_types.h b/libc/sysdeps/linux/h8300/bits/kernel_types.h index ad0c08271..057067560 100644 --- a/libc/sysdeps/linux/h8300/bits/kernel_types.h +++ b/libc/sysdeps/linux/h8300/bits/kernel_types.h @@ -1,11 +1,11 @@ -/* Note that we use the exact same include guard #define names - * as asm/posix_types.h. This will avoid gratuitous conflicts - * with the posix_types.h kernel header, and will ensure that - * our private content, and not the kernel header, will win. - * -Erik - */ -#ifndef __ARCH_H8300_POSIX_TYPES_H -#define __ARCH_H8300_POSIX_TYPES_H +#ifndef _BITS_KERNEL_TYPES_H +#define _BITS_KERNEL_TYPES_H + +/* Sigh. We need to carefully wrap this one... No guarantees + * that the asm/posix_types.h kernel header is working. Many + * arches have broken headers that introduce tons of gratuitous + * conflicts with uClibc's namespace. See bits/kernel_types.h + * for i386, arm, etc for examples... */ typedef unsigned short __kernel_dev_t; typedef unsigned long __kernel_ino_t; @@ -28,14 +28,10 @@ typedef unsigned short __kernel_uid16_t; typedef unsigned short __kernel_gid16_t; typedef unsigned int __kernel_uid32_t; typedef unsigned int __kernel_gid32_t; - typedef unsigned short __kernel_old_uid_t; typedef unsigned short __kernel_old_gid_t; -typedef __kernel_dev_t __kernel_old_dev_t; - -#ifdef __GNUC__ typedef long long __kernel_loff_t; -#endif +typedef __kernel_dev_t __kernel_old_dev_t; typedef struct { #ifdef __USE_ALL @@ -45,4 +41,4 @@ typedef struct { #endif } __kernel_fsid_t; -#endif /* __ARCH_H8300_POSIX_TYPES_H */ +#endif /* _BITS_KERNEL_TYPES_H */ diff --git a/libc/sysdeps/linux/h8300/bits/mman.h b/libc/sysdeps/linux/h8300/bits/mman.h index 4bf232029..34f14ee5b 100644 --- a/libc/sysdeps/linux/h8300/bits/mman.h +++ b/libc/sysdeps/linux/h8300/bits/mman.h @@ -1,5 +1,5 @@ -/* Definitions for BSD-style memory management. - Copyright (C) 1994-1998,2000,01 Free Software Foundation, Inc. +/* Definitions for POSIX memory map interface. Linux/m68k version. + Copyright (C) 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -17,23 +17,23 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -/* These are the bits used by 4.4 BSD and its derivatives. On systems - (such as GNU) where these facilities are not system services but can be - emulated in the C library, these are the definitions we emulate. */ - #ifndef _SYS_MMAN_H # error "Never use directly; include instead." #endif +/* The following definitions basically come from the kernel headers. + But the kernel header is not namespace clean. */ + + /* Protections are chosen from these bits, OR'd together. The implementation does not necessarily support PROT_EXEC or PROT_WRITE without PROT_READ. The only guarantees are that no writing will be allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */ -#define PROT_NONE 0x00 /* No access. */ -#define PROT_READ 0x01 /* Pages can be read. */ -#define PROT_WRITE 0x02 /* Pages can be written. */ -#define PROT_EXEC 0x04 /* Pages can be executed. */ +#define PROT_READ 0x1 /* Page can be read. */ +#define PROT_WRITE 0x2 /* Page can be written. */ +#define PROT_EXEC 0x4 /* Page can be executed. */ +#define PROT_NONE 0x0 /* Page can not be accessed. */ /* Sharing types (must choose one and only one of these). */ #define MAP_SHARED 0x01 /* Share changes. */ diff --git a/libc/sysdeps/linux/h8300/bits/resource.h b/libc/sysdeps/linux/h8300/bits/resource.h deleted file mode 100644 index 50c659389..000000000 --- a/libc/sysdeps/linux/h8300/bits/resource.h +++ /dev/null @@ -1,204 +0,0 @@ -/* Bit values & structures for resource limits. Linux version. - Copyright (C) 1994, 1996, 1997, 1998, 1999 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#ifndef _SYS_RESOURCE_H -# error "Never use directly; include instead." -#endif - -#include - -/* Transmute defines to enumerations. The macro re-definitions are - necessary because some programs want to test for operating system - features with #ifdef RUSAGE_SELF. In ISO C the reflexive - definition is a no-op. */ - -/* Kinds of resource limit. */ -enum __rlimit_resource -{ - /* Per-process CPU limit, in seconds. */ - RLIMIT_CPU = 0, -#define RLIMIT_CPU RLIMIT_CPU - - /* Largest file that can be created, in bytes. */ - RLIMIT_FSIZE = 1, -#define RLIMIT_FSIZE RLIMIT_FSIZE - - /* Maximum size of data segment, in bytes. */ - RLIMIT_DATA = 2, -#define RLIMIT_DATA RLIMIT_DATA - - /* Maximum size of stack segment, in bytes. */ - RLIMIT_STACK = 3, -#define RLIMIT_STACK RLIMIT_STACK - - /* Largest core file that can be created, in bytes. */ - RLIMIT_CORE = 4, -#define RLIMIT_CORE RLIMIT_CORE - - /* Largest resident set size, in bytes. - This affects swapping; processes that are exceeding their - resident set size will be more likely to have physical memory - taken from them. */ - RLIMIT_RSS = 5, -#define RLIMIT_RSS RLIMIT_RSS - - /* Number of open files. */ - RLIMIT_NOFILE = 7, - RLIMIT_OFILE = RLIMIT_NOFILE, /* BSD name for same. */ -#define RLIMIT_NOFILE RLIMIT_NOFILE -#define RLIMIT_OFILE RLIMIT_OFILE - - /* Address space limit (?) */ - RLIMIT_AS = 9, -#define RLIMIT_AS RLIMIT_AS - - /* Number of processes. */ - RLIMIT_NPROC = 6, -#define RLIMIT_NPROC RLIMIT_NPROC - - /* Locked-in-memory address space. */ - RLIMIT_MEMLOCK = 8, -#define RLIMIT_MEMLOCK RLIMIT_MEMLOCK - - RLIM_NLIMITS = 10 -#define RLIMIT_NLIMITS RLIMIT_NLIMITS -#define RLIM_NLIMITS RLIM_NLIMITS -}; - -/* Value to indicate that there is no limit. */ -#ifndef __USE_FILE_OFFSET64 -# define RLIM_INFINITY ((long int)(~0UL >> 1)) -#else -# define RLIM_INFINITY 0x7fffffffffffffffLL -#endif - -#ifdef __USE_LARGEFILE64 -# define RLIM64_INFINITY 0x7fffffffffffffffLL -#endif - -/* We can represent all limits. */ -#define RLIM_SAVED_MAX RLIM_INFINITY -#define RLIM_SAVED_CUR RLIM_INFINITY - - -/* Type for resource quantity measurement. */ -#ifndef __USE_FILE_OFFSET64 -typedef __rlim_t rlim_t; -#else -typedef __rlim64_t rlim_t; -#endif -#ifdef __USE_LARGEFILE64 -typedef __rlim64_t rlim64_t; -#endif - -struct rlimit - { - /* The current (soft) limit. */ - rlim_t rlim_cur; - /* The hard limit. */ - rlim_t rlim_max; - }; - -#ifdef __USE_LARGEFILE64 -struct rlimit64 - { - /* The current (soft) limit. */ - rlim64_t rlim_cur; - /* The hard limit. */ - rlim64_t rlim_max; - }; -#endif - -/* Whose usage statistics do you want? */ -enum __rusage_who -{ - /* The calling process. */ - RUSAGE_SELF = 0, -#define RUSAGE_SELF RUSAGE_SELF - - /* All of its terminated child processes. */ - RUSAGE_CHILDREN = -1, -#define RUSAGE_CHILDREN RUSAGE_CHILDREN - - /* Both. */ - RUSAGE_BOTH = -2 -#define RUSAGE_BOTH RUSAGE_BOTH -}; - -#define __need_timeval -#include /* For `struct timeval'. */ - -/* Structure which says how much of each resource has been used. */ -struct rusage - { - /* Total amount of user time used. */ - struct timeval ru_utime; - /* Total amount of system time used. */ - struct timeval ru_stime; - /* Maximum resident set size (in kilobytes). */ - long int ru_maxrss; - /* Amount of sharing of text segment memory - with other processes (kilobyte-seconds). */ - long int ru_ixrss; - /* Amount of data segment memory used (kilobyte-seconds). */ - long int ru_idrss; - /* Amount of stack memory used (kilobyte-seconds). */ - long int ru_isrss; - /* Number of soft page faults (i.e. those serviced by reclaiming - a page from the list of pages awaiting reallocation. */ - long int ru_minflt; - /* Number of hard page faults (i.e. those that required I/O). */ - long int ru_majflt; - /* Number of times a process was swapped out of physical memory. */ - long int ru_nswap; - /* Number of input operations via the file system. Note: This - and `ru_oublock' do not include operations with the cache. */ - long int ru_inblock; - /* Number of output operations via the file system. */ - long int ru_oublock; - /* Number of IPC messages sent. */ - long int ru_msgsnd; - /* Number of IPC messages received. */ - long int ru_msgrcv; - /* Number of signals delivered. */ - long int ru_nsignals; - /* Number of voluntary context switches, i.e. because the process - gave up the process before it had to (usually to wait for some - resource to be available). */ - long int ru_nvcsw; - /* Number of involuntary context switches, i.e. a higher priority process - became runnable or the current process used up its time slice. */ - long int ru_nivcsw; - }; - -/* Priority limits. */ -#define PRIO_MIN -20 /* Minimum priority a process can have. */ -#define PRIO_MAX 20 /* Maximum priority a process can have. */ - -/* The type of the WHICH argument to `getpriority' and `setpriority', - indicating what flavor of entity the WHO argument specifies. */ -enum __priority_which -{ - PRIO_PROCESS = 0, /* WHO is a process ID. */ -#define PRIO_PROCESS PRIO_PROCESS - PRIO_PGRP = 1, /* WHO is a process group ID. */ -#define PRIO_PGRP PRIO_PGRP - PRIO_USER = 2 /* WHO is a user ID. */ -#define PRIO_USER PRIO_USER -}; diff --git a/libc/sysdeps/linux/h8300/bits/setjmp.h b/libc/sysdeps/linux/h8300/bits/setjmp.h index 78f9c83fb..024861440 100644 --- a/libc/sysdeps/linux/h8300/bits/setjmp.h +++ b/libc/sysdeps/linux/h8300/bits/setjmp.h @@ -1,43 +1,27 @@ -/* Copyright (C) 1997, 1998 Free Software Foundation, Inc. - This file is part of the GNU C Library. - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* Define the machine-dependent type `jmp_buf'. H8/300H version. */ +/* Copyright (C) 2004, Yoshinori Sato */ +/* Define the machine-dependent type `jmp_buf'. H8/300 version. */ #ifndef _SETJMP_H # error "Never include directly; use instead." #endif -#include +#ifndef _ASM typedef struct { - /* er1-er5 */ - long int __regs[5]; - - /* er6 */ - int *__fp; - /* sp */ - int *__sp; - /* pc */ - void *__pc; + unsigned long __regs[4]; /* save er4 - er7(sp) */ + unsigned long __pc; /* the return address */ } __jmp_buf[1]; +#endif /* _ASM */ + +#define JB_REGS 0 +#define JB_PC 16 +#define JB_SIZE 20 + + /* Test if longjmp to JMPBUF would unwind the frame containing a local variable at ADDRESS. */ #define _JMPBUF_UNWINDS(jmpbuf, address) \ - ((void *) (address) < (void *) (jmpbuf)->__sp) + ((void *) (address) < (void *) (jmpbuf)->__regs[3]) diff --git a/libc/sysdeps/linux/h8300/bits/sigcontextinfo.h b/libc/sysdeps/linux/h8300/bits/sigcontextinfo.h new file mode 100644 index 000000000..b7e08cfc9 --- /dev/null +++ b/libc/sysdeps/linux/h8300/bits/sigcontextinfo.h @@ -0,0 +1,26 @@ +/* Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Schwab , 1998. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#define SIGCONTEXT int _code, struct sigcontext * +#define SIGCONTEXT_EXTRA_ARGS _code, +#define GET_PC(ctx) ((void *) (ctx)->sc_pc) +#define GET_FRAME(ctx) ((void *) __builtin_frame_address (1)) +#define GET_STACK(ctx) ((void *) (ctx)->sc_usp) +#define CALL_SIGHANDLER(handler, signo, ctx) \ + (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx)) diff --git a/libc/sysdeps/linux/h8300/bits/stackinfo.h b/libc/sysdeps/linux/h8300/bits/stackinfo.h new file mode 100644 index 000000000..89a77d932 --- /dev/null +++ b/libc/sysdeps/linux/h8300/bits/stackinfo.h @@ -0,0 +1,28 @@ +/* Copyright (C) 1999 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* This file contains a bit of information about the stack allocation + of the processor. */ + +#ifndef _STACKINFO_H +#define _STACKINFO_H 1 + +/* On h8300 the stack grows down. */ +#define _STACK_GROWS_DOWN 1 + +#endif /* stackinfo.h */ diff --git a/libc/sysdeps/linux/h8300/bits/syscalls.h b/libc/sysdeps/linux/h8300/bits/syscalls.h index 62541b873..b734a6251 100644 --- a/libc/sysdeps/linux/h8300/bits/syscalls.h +++ b/libc/sysdeps/linux/h8300/bits/syscalls.h @@ -1,19 +1,157 @@ -#ifndef _BITS_SYSCALLS_H -#define _BITS_SYSCALLS_H +/* Unlike the asm/unistd.h kernel header file (which this is partly based on), + * this file must be able to cope with PIC and non-PIC code. For some arches + * there is no difference. For x86 (which has far too few registers) there is + * a difference. Regardless, including asm/unistd.h is hereby officially + * forbidden. Don't do it. It is bad for you. + */ #ifndef _SYSCALL_H # error "Never use directly; include instead." #endif -#include - -/* Do something very evil for now. Until we create our own syscall - * macros, short circuit bits/sysnum.h and use asm/unistd.h instead */ -#include - /* This includes the `__NR_' syscall numbers taken from the Linux kernel * header files. It also defines the traditional `SYS_' macros for older * programs. */ #include -#endif /* _BITS_SYSCALLS_H */ + +#define __syscall_return(type, res) \ +do { \ + if ((unsigned long)(res) >= (unsigned long)(-125)) { \ + /* avoid using res which is declared to be in register d0; \ + errno might expand to a function call and clobber it. */ \ + int __err = -(res); \ + errno = __err; \ + res = -1; \ + } \ + return (type) (res); \ +} while (0) + +#define _syscall0(type, name) \ +type name(void) \ +{ \ + register long __res __asm__("er0"); \ + __asm__ __volatile__ ("mov.l %1,er0\n\t" \ + "trapa #0\n\t" \ + : "=r" (__res) \ + : "ir" (__NR_##name) \ + : "cc"); \ + if ((unsigned long)(__res) >= (unsigned long)(-125)) { \ + errno = -__res; \ + __res = -1; \ + } \ + return (type)__res; \ +} + +#define _syscall1(type, name, atype, a) \ +type name(atype a) \ +{ \ + register long __res __asm__("er0"); \ + __asm__ __volatile__ ("mov.l %2, er1\n\t" \ + "mov.l %1, er0\n\t" \ + "trapa #0\n\t" \ + : "=r" (__res) \ + : "ir" (__NR_##name), \ + "g" ((long)a) \ + : "cc", "er1"); \ + if ((unsigned long)(__res) >= (unsigned long)(-125)) { \ + errno = -__res; \ + __res = -1; \ + } \ + return (type)__res; \ +} + +#define _syscall2(type, name, atype, a, btype, b) \ +type name(atype a, btype b) \ +{ \ + register long __res __asm__("er0"); \ + __asm__ __volatile__ ("mov.l %3, er2\n\t" \ + "mov.l %2, er1\n\t" \ + "mov.l %1, er0\n\t" \ + "trapa #0\n\t" \ + : "=r" (__res) \ + : "ir" (__NR_##name), \ + "g" ((long)a), \ + "g" ((long)b) \ + : "cc", "er1", "er2"); \ + if ((unsigned long)(__res) >= (unsigned long)(-125)) { \ + errno = -__res; \ + __res = -1; \ + } \ + return (type)__res; \ +} + +#define _syscall3(type, name, atype, a, btype, b, ctype, c) \ +type name(atype a, btype b, ctype c) \ +{ \ + register long __res __asm__("er0"); \ + __asm__ __volatile__ ("mov.l %4, er3\n\t" \ + "mov.l %3, er2\n\t" \ + "mov.l %2, er1\n\t" \ + "mov.l %1, er0\n\t" \ + "trapa #0\n\t" \ + : "=r" (__res) \ + : "ir" (__NR_##name), \ + "g" ((long)a), \ + "g" ((long)b), \ + "g" ((long)c) \ + : "cc", "er1", "er2", "er3"); \ + if ((unsigned long)(__res) >= (unsigned long)(-125)) { \ + errno = -__res; \ + __res = -1; \ + } \ + return (type)__res; \ +} + +#define _syscall4(type, name, atype, a, btype, b, ctype, c, dtype, d) \ +type name(atype a, btype b, ctype c, dtype d) \ +{ \ + register long __res __asm__("er0"); \ + __asm__ __volatile__ ("mov.l %5, er4\n\t" \ + "mov.l %4, er3\n\t" \ + "mov.l %3, er2\n\t" \ + "mov.l %2, er1\n\t" \ + "mov.l %1, er0\n\t" \ + "trapa #0\n\t" \ + : "=r" (__res) \ + : "ir" (__NR_##name), \ + "g" ((long)a), \ + "g" ((long)b), \ + "g" ((long)c), \ + "g" ((long)d) \ + : "cc", "er1", "er2", "er3", "er4"); \ + if ((unsigned long)(__res) >= (unsigned long)(-125)) { \ + errno = -__res; \ + __res = -1; \ + } \ + return (type)__res; \ +} + +#define _syscall5(type, name, atype, a, btype, b, ctype, c, dtype, d, etype, e) \ +type name(atype a, btype b, ctype c, dtype d, etype e) \ +{ \ + register long __res __asm__("er0"); \ + __asm__ __volatile__ ( \ + "mov.l er5,@-sp\n\t" \ + "mov.l %5, er4\n\t" \ + "mov.l %4, er3\n\t" \ + "mov.l %3, er2\n\t" \ + "mov.l %2, er1\n\t" \ + "mov.l %1, er0\n\t" \ + "mov.l %6, er5\n\t" \ + "trapa #0\n\t" \ + "mov.l @sp+,er5\n\t" \ + : "=r" (__res) \ + : "ir" (__NR_##name), \ + "g" ((long)a), \ + "g" ((long)b), \ + "g" ((long)c), \ + "g" ((long)d), \ + "m" ((long)e) \ + : "cc", "er1", "er2", "er3", "er4"); \ + if ((unsigned long)(__res) >= (unsigned long)(-125)) { \ + errno = -__res; \ + __res = -1; \ + } \ + return (type)__res; \ +} diff --git a/libc/sysdeps/linux/h8300/bits/wordsize.h b/libc/sysdeps/linux/h8300/bits/wordsize.h index ba643b60a..b47eee944 100644 --- a/libc/sysdeps/linux/h8300/bits/wordsize.h +++ b/libc/sysdeps/linux/h8300/bits/wordsize.h @@ -1,19 +1 @@ -/* Copyright (C) 1999 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#define __WORDSIZE 32 +#define __WORDSIZE 32 diff --git a/libc/sysdeps/linux/h8300/brk.c b/libc/sysdeps/linux/h8300/brk.c new file mode 100644 index 000000000..71de9501f --- /dev/null +++ b/libc/sysdeps/linux/h8300/brk.c @@ -0,0 +1,33 @@ +/* brk on H8/300 by ysato */ + +#include +#include +#include + + +/* This must be initialized data because commons can't have aliases. */ +void *___brk_addr = 0; + + +int brk (void *addr) +{ + void *newbrk; + + asm ("mov.l %2,er1\n\t" + "mov.l %1,er0\n\t" + "trapa #0\n\t" + "mov.l er0,%0" + : "=r" (newbrk) + : "0" (__NR_brk), "g" (addr) + : "er0","er1"); + + ___brk_addr = newbrk; + + if (newbrk < addr) + { + __set_errno (ENOMEM); + return -1; + } + + return 0; +} diff --git a/libc/sysdeps/linux/h8300/bsd-_setjmp.S b/libc/sysdeps/linux/h8300/bsd-_setjmp.S new file mode 100644 index 000000000..e315058a7 --- /dev/null +++ b/libc/sysdeps/linux/h8300/bsd-_setjmp.S @@ -0,0 +1,27 @@ +/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. H8/300 version. */ + +#define _ASM +#define _SETJMP_H +#include + +#ifdef __H8300S__ + .h8300s +#else + .h8300h +#endif + .text + +.global __setjmp + +__setjmp: + add.l #JB_SIZE,er0 + mov.l @sp,er1 ; return PC + mov.l er1,@-er0 + mov.l sp,@-er0 + mov.l er6,@-er0 + mov.l er5,@-er0 + mov.l er4,@-er0 + mov.l er0,er1 + sub.l er0,er0 + mov.l er0,@(JB_SIZE:16,er1) + rts diff --git a/libc/sysdeps/linux/h8300/bsd-setjmp.S b/libc/sysdeps/linux/h8300/bsd-setjmp.S new file mode 100644 index 000000000..9c3535503 --- /dev/null +++ b/libc/sysdeps/linux/h8300/bsd-setjmp.S @@ -0,0 +1,30 @@ +/* BSD `_setjmp' entry point to `sigsetjmp (..., 1)'. H8/300 version. */ + +#define _ASM +#define _SETJMP_H +#include + +#ifdef __H8300S__ + .h8300s +#else + .h8300h +#endif + .text + +.global _setjmp + +_setjmp: + add.l #JB_SIZE,er0 + mov.l @sp,er1 ; return PC + mov.l er1,@-er0 + mov.l sp,@-er0 + mov.l er6,@-er0 + mov.l er5,@-er0 + mov.l er4,@-er0 + sub.l er0,er0 +#if !defined(__PIC__) + jmp @___sigjmp_save +#else + mov.l @(___sigjmp_save@GOTOFF,er5),er1 + jmp @er3 +#endif diff --git a/libc/sysdeps/linux/h8300/clone.S b/libc/sysdeps/linux/h8300/clone.S new file mode 100644 index 000000000..7d100b6c4 --- /dev/null +++ b/libc/sysdeps/linux/h8300/clone.S @@ -0,0 +1,78 @@ +/* Adapted from glibc */ +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. */ + +/* clone is even more special than fork as it mucks with stacks + and invokes a function in the right context after its all over. */ + +#define _ERRNO_H +#include +#include + +/* int _clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */ + +#ifdef __H8300H__ + .h8300h +#endif +#ifdef __H8300S__ + .h8300s +#endif + +.text +.globl _clone +.globl ___clone +_clone: +___clone: + /* Sanity check arguments. */ + mov.l #-EINVAL,er3 + mov.l er0,er0 /* no NULL function pointers */ + beq __syscall_error + mov.l er1,er1 /* no NULL stack pointers */ + beq __syscall_error + + /* Allocate space and copy the argument onto the new stack. */ + mov.l @(4:16,sp),er3 + mov.l er3,@-er1 + + /* Do the system call */ + mov.l er0,er3 /* er3 = child entry */ + mov.l er1,er0 + mov.l er2,er1 /* er1 = flags */ + mov.l er0,er2 /* er2 = child sp */ + mov.l #__NR_clone,r0 + trapa #0 + mov.l er0,er0 + bmi __syscall_error + beq thread_start + + rts + +__syscall_error: + neg.l er0 + mov.l er0,@-sp +#if !defined(__PIC__) + jsr @__errno_location +#else + mov.l @(__errno_location@GOTOFF,er5),er1 + jsr @er1 +#endif + mov.l @sp,er1 + mov.l er1,@er0 + sub.l er0,er0 + dec.l #1,er0 + + rts + +thread_start: + mov.l @sp+,er0 /* restore args */ + jsr @er3 + mov.l er0,er1 + mov.l #__NR_exit,er0 + trapa #0 + +#if defined(__HAVE_ELF__) + .weak clone + clone = __clone +#else + .set clone,__clone +#endif + diff --git a/libc/sysdeps/linux/h8300/crt0.S b/libc/sysdeps/linux/h8300/crt0.S index dc7dc8b6d..a593b88e2 100644 --- a/libc/sysdeps/linux/h8300/crt0.S +++ b/libc/sysdeps/linux/h8300/crt0.S @@ -36,7 +36,12 @@ _start: /* put here so that references to _start work with elf-PIC */ mov.l @(0,sp),er0 /* argc */ mov.l @(4,sp),er1 /* argv */ mov.l @(8,sp),er2 /* envp */ +#if !defined(__PIC__) jsr @___uClibc_main +#else + mov.l @(___uClibc_main@GOTOFF,er5),er3 + jsr @er3 +#endif /* If that didn't kill us, ... */ __exit: diff --git a/libc/sysdeps/linux/h8300/crti.S b/libc/sysdeps/linux/h8300/crti.S new file mode 100644 index 000000000..270df276e --- /dev/null +++ b/libc/sysdeps/linux/h8300/crti.S @@ -0,0 +1,30 @@ +#ifdef __H8300H__ + .h8300h +#endif +#ifdef __H8300S__ + .h8300s +#endif + .file "initfini.c" +; #APP + + .section .init +; #NO_APP + .align 1 + .global __init +__init: + mov.l er6,@-er7 + mov.l er7,er6 +; #APP + .align 1 + + .section .fini +; #NO_APP + .align 1 + .global __fini +__fini: + mov.l er6,@-er7 + mov.l er7,er6 +; #APP + .align 1 + + .end diff --git a/libc/sysdeps/linux/h8300/crtn.S b/libc/sysdeps/linux/h8300/crtn.S new file mode 100644 index 000000000..89e321868 --- /dev/null +++ b/libc/sysdeps/linux/h8300/crtn.S @@ -0,0 +1,30 @@ +#ifdef __H8300H__ + .h8300h +#endif +#ifdef __H8300S__ + .h8300s +#endif + .file "initfini.c" +; #APP + + .section .init +; #NO_APP + .align 1 + .global __init +; #NO_APP + mov.l @er7+,er6 + rts + .size __init, .-__init +; #APP + + .section .fini +; #NO_APP + .align 1 + .global __fini +; #NO_APP + mov.l @er7+,er6 + rts + .size __fini, .-__fini +; #APP + + .end diff --git a/libc/sysdeps/linux/h8300/pt-machine.h b/libc/sysdeps/linux/h8300/pt-machine.h new file mode 100644 index 000000000..ad83147cb --- /dev/null +++ b/libc/sysdeps/linux/h8300/pt-machine.h @@ -0,0 +1,58 @@ +/* Machine-dependent pthreads configuration and inline functions. + H8/300 version. + Copyright (C) 1996, 1998, 2000, 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson . + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; see the file COPYING.LIB. If + not, write to the Free Software Foundation, Inc., + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _PT_MACHINE_H +#define _PT_MACHINE_H 1 + +#ifndef PT_EI +# define PT_EI extern inline +#endif + +extern long int testandset (int *spinlock); + +/* Spinlock implementation; required. */ +PT_EI long int +testandset (int *spinlock) +{ + char ret; + + __asm__ __volatile__( + "sub.w %0,%0\n\t" + "stc ccr,@-sp\n\t" + "orc #0x80,ccr\n\t" + "bld #0,@%2\n\t" + "bset #0,@%2\n\t" + "rotxl.w %0\n\t" + "ldc @sp+,ccr\n\t" + :"=r"(ret),"=m"(*spinlock) + :"g"(spinlock) + :"cc"); + + return ret; +} + + +/* Get some notion of the current stack. Need not be exactly the top + of the stack, just something somewhere in the current frame. */ +#define CURRENT_STACK_FRAME stack_pointer +register char * stack_pointer __asm__ ("%sp"); + +#endif /* pt-machine.h */ diff --git a/libc/sysdeps/linux/h8300/ptrace.c b/libc/sysdeps/linux/h8300/ptrace.c index 64fb7bc96..7ce1b277e 100644 --- a/libc/sysdeps/linux/h8300/ptrace.c +++ b/libc/sysdeps/linux/h8300/ptrace.c @@ -1,24 +1,15 @@ #include #include -#include -#include +#include int -ptrace(int request, ... /* int pid, int addr, int data */) +ptrace(int request, int pid, int addr, int data) { - long ret; - long res; - int pid,addr,data; - va_list ap; + int ret; + int res; - va_start(ap,request); - pid = va_arg(ap,int); - addr = va_arg(ap,int); - data = va_arg(ap,int); - va_end(ap); - - if (request > 0 && request < 4) (long *)data = &ret; + if (request > 0 && request < 4) data = (int)&ret; __asm__ volatile ("sub.l er0,er0\n\t" "mov.b %1,r0l\n\t" @@ -30,7 +21,8 @@ ptrace(int request, ... /* int pid, int addr, int data */) "mov.l er0,%0" :"=g" (res) :"i" (__NR_ptrace), "g" (request), "g" (pid), - "g" (addr), "g" (data) : "er0", "er1", "er2", "er3", "er4"); + "g" (addr), "g" (data) + : "er0", "er1", "er2", "er3", "er4"); if (res >= 0) { if (request > 0 && request < 4) { diff --git a/libc/sysdeps/linux/h8300/setjmp.S b/libc/sysdeps/linux/h8300/setjmp.S index 53ecf3dbe..5e487674b 100644 --- a/libc/sysdeps/linux/h8300/setjmp.S +++ b/libc/sysdeps/linux/h8300/setjmp.S @@ -1,49 +1,23 @@ +#define _ASM +#define _SETJMP_H +#include + #ifdef __H8300S__ .h8300s #else .h8300h #endif .text - -.global __setjmp + .global ___sigsetjmp -.global ___longjmp -__setjmp: ___sigsetjmp: - add.l #20,er0 - mov.l er6,@er0 + add.l #JB_SIZE,er0 + mov.l @sp,er1 ; return PC + mov.l er1,@-er0 + mov.l sp,@-er0 + mov.l er6,@-er0 mov.l er5,@-er0 mov.l er4,@-er0 - mov.l er3,@-er0 - mov.l er2,@-er0 - mov.l er1,@-er0 - mov.l sp,@(24,er0) - mov.l @sp,er1 - mov.l er1,@(28,er0) sub.l er0,er0 rts - -___longjmp: - mov.l er1,er1 - bne 1f - sub.l er1,er1 - inc.l #1,er1 -1: - adds #4,er0 - adds #4,er0 - mov.l @er0+,er3 - mov.l @er0+,er4 - mov.l @er0+,er5 - mov.l @er0+,er6 - mov.l @er0+,sp - mov.l @er0,er2 - mov.l er2,@sp - mov.l er1,er2 - mov.l er0,er1 - mov.l er2,er0 - sub.l #28,er1 - mov.l @(4,er1),er2 - mov.l @er1,er1 - rts - diff --git a/libc/sysdeps/linux/h8300/sys/procfs.h b/libc/sysdeps/linux/h8300/sys/procfs.h new file mode 100644 index 000000000..27abf8ef5 --- /dev/null +++ b/libc/sysdeps/linux/h8300/sys/procfs.h @@ -0,0 +1,126 @@ +/* Copyright (C) 1996, 1997, 1999, 2000, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _SYS_PROCFS_H +#define _SYS_PROCFS_H 1 + +/* This is somewhat modelled after the file of the same name on SVR4 + systems. It provides a definition of the core file format for ELF + used on Linux. It doesn't have anything to do with the /proc file + system, even though Linux has one. + + Anyway, the whole purpose of this file is for GDB and GDB only. + Don't read too much into it. Don't use it for anything other than + GDB unless you know what you are doing. */ + +#include +#include +#include +#include + +__BEGIN_DECLS + +/* Type for a general-purpose register. */ +typedef unsigned long elf_greg_t; + +/* And the whole bunch of them. We could have used `struct + user_regs_struct' directly in the typedef, but tradition says that + the register set is an array, which does have some peculiar + semantics, so leave it that way. */ +#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof(elf_greg_t)) +typedef elf_greg_t elf_gregset_t[ELF_NGREG]; + +/* Register set for the floating-point registers. */ +typedef struct user_m68kfp_struct elf_fpregset_t; + + +/* Signal info. */ +struct elf_siginfo + { + int si_signo; /* Signal number. */ + int si_code; /* Extra code. */ + int si_errno; /* Errno. */ + }; + + +/* Definitions to generate Intel SVR4-like core files. These mostly + have the same names as the SVR4 types with "elf_" tacked on the + front to prevent clashes with Linux definitions, and the typedef + forms have been avoided. This is mostly like the SVR4 structure, + but more Linuxy, with things that Linux does not support and which + GDB doesn't really use excluded. */ + +struct elf_prstatus + { + struct elf_siginfo pr_info; /* Info associated with signal. */ + short int pr_cursig; /* Current signal. */ + unsigned long int pr_sigpend; /* Set of pending signals. */ + unsigned long int pr_sighold; /* Set of held signals. */ + __pid_t pr_pid; + __pid_t pr_ppid; + __pid_t pr_pgrp; + __pid_t pr_sid; + struct timeval pr_utime; /* User time. */ + struct timeval pr_stime; /* System time. */ + struct timeval pr_cutime; /* Cumulative user time. */ + struct timeval pr_cstime; /* Cumulative system time. */ + elf_gregset_t pr_reg; /* GP registers. */ + int pr_fpvalid; /* True if math copro being used. */ + }; + + +#define ELF_PRARGSZ (80) /* Number of chars for args. */ + +struct elf_prpsinfo + { + char pr_state; /* Numeric process state. */ + char pr_sname; /* Char for pr_state. */ + char pr_zomb; /* Zombie. */ + char pr_nice; /* Nice val. */ + unsigned long int pr_flag; /* Flags. */ + unsigned short int pr_uid; + unsigned short int pr_gid; + int pr_pid, pr_ppid, pr_pgrp, pr_sid; + /* Lots missing */ + char pr_fname[16]; /* Filename of executable. */ + char pr_psargs[ELF_PRARGSZ]; /* Initial part of arg list. */ + }; + + +/* The rest of this file provides the types for emulation of the + Solaris interfaces that should be implemented by + users of libthread_db. */ + +/* Addresses. */ +typedef void *psaddr_t; + +/* Register sets. Linux has different names. */ +typedef elf_gregset_t prgregset_t; +typedef elf_fpregset_t prfpregset_t; + +/* We don't have any differences between processes and threads, + therefore have only one PID type. */ +typedef __pid_t lwpid_t; + +/* Process status and info. In the end we do provide typedefs for them. */ +typedef struct elf_prstatus prstatus_t; +typedef struct elf_prpsinfo prpsinfo_t; + +__END_DECLS + +#endif /* sys/procfs.h */ diff --git a/libc/sysdeps/linux/h8300/vfork.S b/libc/sysdeps/linux/h8300/vfork.S index e84a78d6a..e101bf5ed 100644 --- a/libc/sysdeps/linux/h8300/vfork.S +++ b/libc/sysdeps/linux/h8300/vfork.S @@ -28,7 +28,12 @@ _vfork: jmp @er1 /* don't return, just jmp directly */ fix_errno: neg.l er0 +#if !defined(__PIC__) mov.l er0,@_errno +#else + mov.l @(_errno@GOTOFF,er5),er2 + mov.l er0,@er2 +#endif sub.l er0,er0 dec.l #1,er0 jmp @er1 /* don't return, just jmp directly */ -- cgit v1.2.3