This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
m32r-linux add-on ports of glibc
- From: Kazuhiro Inaoka <inaoka dot kazuhiro at renesas dot com>
- To: Roland McGrath <roland at redhat dot com>
- Cc: "libc-alpha at sources dot redhat dot com" <libc-alpha at sources dot redhat dot com>
- Date: Mon, 25 Oct 2004 14:20:17 +0900
- Subject: m32r-linux add-on ports of glibc
Hi Roland,
I tried again to use 'ports' for m32r targets.
This is a patch for it.
We are maintaining linux/m32r project with the following site.
http://www.linux-m32r.org/
Thanks everyone,
Kazuhiro Inaoka
diff --exclude CVS -uNr org/ports/ChangeLog.m32r ports/ChangeLog.m32r
--- org/ports/ChangeLog.m32r 1970-01-01 09:00:00.000000000 +0900
+++ ports/ChangeLog.m32r 2004-10-25 13:09:27.000000000 +0900
@@ -0,0 +1,130 @@
+2004-10-25 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com>
+
+ Moved from separate m32r-linuxthreads into m32r/linuxthreads
+ subdirs:
+ 2004-09-09 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com>
+ * sysdeps/m32r/pspinlock.c: New file.
+ * sysdeps/m32r/pt-machine.h: New file
+ * sysdeps/m32r/preconfigure: Renamed from configure.
+ * sysdeps/m32r/shlib-versions: Moved from top level..
+ * sysdeps/unix/sysv/linux/m32r/Makefile: Add static-gnulilb
+ environment value difinition.
+
+2004-10-19 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com>
+
+ * m32r/configure: Changed into the simple rule.
+
+2004-10-08 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com>
+
+ * sysdeps/unix/sysv/linux/m32r/mmap.S (__mmap): Use sys_mmap2.
+
+2004-10-05 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com>
+
+ * sysdeps/m32r/dl-macihne.h (elf_machine_rela_relative): Replace
+ static inline by auto inline, add always_inline attribute.
+ (elf_machine_rela): Likewise.
+ (elf_machine_lazy_rel): Likewise.
+ (elf_machine_runtime_setup): add always_inline attribute.
+ * sysdeps/unix/sysv/linux/m32r/bits/mman.h: Define PROT_GROWSDOWN
+ and PROT_GROWSUP.
+ * sysdeps/unix/sysv/linux/m32r/sysdep.h (SYSCALL_ERROR_HANDLER):
+ Define RTLD_PRIVATE_ERRNO variant. include <dl-sysdep.h>.
+
+2004-09-14 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com>
+
+ * configure: check for assembler line separator
+
+2004-09-09 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com>
+
+ * configure, Makefile: Do nothing
+ * shlib-versions: New file.
+ * sysdeps/unix/m32r/sysdep.h: Use relative pathnames.
+ * sysdeps/unix/sysv/linux/m32r/sysdep.h: Use relative
+ pathnames.
+ * sysdeps/unix/sysv/linux/m32r/sysdep.S: Use relative
+ pathnames.
+ * sysdeps/m32r/init-first.c: Remove file
+
+2004-09-09 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com>
+
+ * sysdeps/m32r/Implies: New file
+ * sysdeps/m32r/Makefile: New file
+ * sysdeps/m32r/__longjmp.S: New file
+ * sysdeps/m32r/bits/endian.h: New file
+ * sysdeps/m32r/bits/huge_val.h: New file
+ * sysdeps/m32r/bits/setjmp.h: New file
+ * sysdeps/m32r/bsd-_setjmp.S: New file
+ * sysdeps/m32r/bsd-setjmp.S: New file
+ * sysdeps/m32r/dl-machine.h: New file
+ * sysdeps/m32r/elf/start.S: New file
+ * sysdeps/m32r/gmp-mparam.h: New file
+ * sysdeps/m32r/init-first.c: New file
+ * sysdeps/m32r/m32r-mcount.S: New file
+ * sysdeps/m32r/machine-gmon.h: New file
+ * sysdeps/m32r/memcpy.S: New file
+ * sysdeps/m32r/memset.S: New file
+ * sysdeps/m32r/memusage.h: New file
+ * sysdeps/m32r/setjmp.S: New file
+ * sysdeps/m32r/stackinfo.h: New file
+ * sysdeps/m32r/strlen.S: New file
+ * sysdeps/m32r/sys/ucontext.h: New file
+ * sysdeps/m32r/sysdep.h: New file
+ * sysdeps/unix/m32r/Makefile: New file
+ * sysdeps/unix/m32r/sysdep.S: New file
+ * sysdeps/unix/m32r/sysdep.h: New file
+ * sysdeps/unix/sysv/linux/m32r/Dist: New file
+ * sysdeps/unix/sysv/linux/m32r/Makefile: New file
+ * sysdeps/unix/sysv/linux/m32r/Versions: New file
+ * sysdeps/unix/sysv/linux/m32r/bits/fcntl.h: New file
+ * sysdeps/unix/sysv/linux/m32r/bits/mman.h: New file
+ * sysdeps/unix/sysv/linux/m32r/bits/resource.h: New file
+ * sysdeps/unix/sysv/linux/m32r/brk.c: New file
+ * sysdeps/unix/sysv/linux/m32r/chown.c: New file
+ * sysdeps/unix/sysv/linux/m32r/clone.S: New file
+ * sysdeps/unix/sysv/linux/m32r/fchown.c: New file
+ * sysdeps/unix/sysv/linux/m32r/fcntl.c: New file
+ * sysdeps/unix/sysv/linux/m32r/flushcache.S: New file
+ * sysdeps/unix/sysv/linux/m32r/fxstat.c: New file
+ * sysdeps/unix/sysv/linux/m32r/getegid.c: New file
+ * sysdeps/unix/sysv/linux/m32r/geteuid.c: New file
+ * sysdeps/unix/sysv/linux/m32r/getgroups.c: New file
+ * sysdeps/unix/sysv/linux/m32r/getresgid.c: New file
+ * sysdeps/unix/sysv/linux/m32r/getresuid.c: New file
+ * sysdeps/unix/sysv/linux/m32r/getrlimit.c: New file
+ * sysdeps/unix/sysv/linux/m32r/getrlimit64.c: New file
+ * sysdeps/unix/sysv/linux/m32r/getuid.c: New file
+ * sysdeps/unix/sysv/linux/m32r/lchown.c: New file
+ * sysdeps/unix/sysv/linux/m32r/lockf64.c: New file
+ * sysdeps/unix/sysv/linux/m32r/lxstat.c: New file
+ * sysdeps/unix/sysv/linux/m32r/m32r-stub.c: New file
+ * sysdeps/unix/sysv/linux/m32r/mmap.S: New file
+ * sysdeps/unix/sysv/linux/m32r/msgctl.c: New file
+ * sysdeps/unix/sysv/linux/m32r/pipe.S: New file
+ * sysdeps/unix/sysv/linux/m32r/profil-counter.h: New file
+ * sysdeps/unix/sysv/linux/m32r/semctl.c: New file
+ * sysdeps/unix/sysv/linux/m32r/setegid.c: New file
+ * sysdeps/unix/sysv/linux/m32r/seteuid.c: New file
+ * sysdeps/unix/sysv/linux/m32r/setfsgid.c: New file
+ * sysdeps/unix/sysv/linux/m32r/setfsuid.c: New file
+ * sysdeps/unix/sysv/linux/m32r/setgid.c: New file
+ * sysdeps/unix/sysv/linux/m32r/setgroups.c: New file
+ * sysdeps/unix/sysv/linux/m32r/setregid.c: New file
+ * sysdeps/unix/sysv/linux/m32r/setresgid.c: New file
+ * sysdeps/unix/sysv/linux/m32r/setresuid.c: New file
+ * sysdeps/unix/sysv/linux/m32r/setreuid.c: New file
+ * sysdeps/unix/sysv/linux/m32r/setrlimit.c: New file
+ * sysdeps/unix/sysv/linux/m32r/setuid.c: New file
+ * sysdeps/unix/sysv/linux/m32r/shmctl.c: New file
+ * sysdeps/unix/sysv/linux/m32r/sigcontextinfo.h: New file
+ * sysdeps/unix/sysv/linux/m32r/socket.S: New file
+ * sysdeps/unix/sysv/linux/m32r/sys/cachectl.h: New file
+ * sysdeps/unix/sysv/linux/m32r/sys/io.h: New file
+ * sysdeps/unix/sysv/linux/m32r/sys/tas.h: New file
+ * sysdeps/unix/sysv/linux/m32r/sys/ucontext.h: New file
+ * sysdeps/unix/sysv/linux/m32r/sys/user.h: New file
+ * sysdeps/unix/sysv/linux/m32r/syscall.S: New file
+ * sysdeps/unix/sysv/linux/m32r/syscalls.list: New file
+ * sysdeps/unix/sysv/linux/m32r/sysdep.S: New file
+ * sysdeps/unix/sysv/linux/m32r/sysdep.h: New file
+ * sysdeps/unix/sysv/linux/m32r/vfork.S: New file
+ * sysdeps/unix/sysv/linux/m32r/xstat.c: New file
diff --exclude CVS -uNr org/ports/sysdeps/m32r/Implies ports/sysdeps/m32r/Implies
--- org/ports/sysdeps/m32r/Implies 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/Implies 2004-10-25 10:35:22.000000000 +0900
@@ -0,0 +1,3 @@
+wordsize-32
+ieee754/flt-32
+ieee754/dbl-64
diff --exclude CVS -uNr org/ports/sysdeps/m32r/Makefile ports/sysdeps/m32r/Makefile
--- org/ports/sysdeps/m32r/Makefile 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/Makefile 2004-10-25 10:35:22.000000000 +0900
@@ -0,0 +1,7 @@
+# m32r/ELF specific definitions.
+
+# The assembler on m32r needs the -fPIC flag even when it's assembler code.
+#ASFLAGS-.os = -fPIC
+ifeq ($(subdir),gmon)
+sysdep_routines += m32r-mcount
+endif
diff --exclude CVS -uNr org/ports/sysdeps/m32r/__longjmp.S ports/sysdeps/m32r/__longjmp.S
--- org/ports/sysdeps/m32r/__longjmp.S 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/__longjmp.S 2004-10-25 10:35:22.000000000 +0900
@@ -0,0 +1,43 @@
+/* longjmp for M32R.
+ Copyright (C) 2003, 2004 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. */
+
+#include <sysdep.h>
+#define _SETJMP_H
+#define _ASM
+#include <bits/setjmp.h>
+
+/* __longjmp(jmpbuf, val) */
+
+ENTRY (__longjmp)
+ ld r8, @r0+
+ ld r9, @r0+
+ ld r10, @r0+
+ ld r11, @r0+
+ ld r12, @r0+
+ ld r13, @r0+
+ ld r2, @r0+ /* lr */
+ ld r15, @r0 /* sp */
+
+ mv r0,r1
+ bnez r0, 1f /* get the return value in place */
+ ldi r0, #1 /* can't let setjmp() return zero! */
+ .fillinsn
+1:
+ jmp r2
+END (__longjmp)
diff --exclude CVS -uNr org/ports/sysdeps/m32r/bits/endian.h ports/sysdeps/m32r/bits/endian.h
--- org/ports/sysdeps/m32r/bits/endian.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/bits/endian.h 2004-10-25 10:35:22.000000000 +0900
@@ -0,0 +1,13 @@
+/* M32R is bi-endian. */
+
+#ifndef _ENDIAN_H
+# error "Never use <bits/endian.h> directly; include <endian.h> instead."
+#endif
+
+#ifdef __LITTLE_ENDIAN__
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#define __FLOAT_WORD_ORDER __LITTLE_ENDIAN
+#else
+#define __BYTE_ORDER __BIG_ENDIAN
+#define __FLOAT_WORD_ORDER __BIG_ENDIAN
+#endif
diff --exclude CVS -uNr org/ports/sysdeps/m32r/bits/huge_val.h ports/sysdeps/m32r/bits/huge_val.h
--- org/ports/sysdeps/m32r/bits/huge_val.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/bits/huge_val.h 2004-10-25 10:35:22.000000000 +0900
@@ -0,0 +1,56 @@
+/* `HUGE_VAL' constants for IEEE 754 machines (where it is infinity).
+ Used by <stdlib.h> and <math.h> functions for overflow.
+ M32R version.
+ Copyright (C) 1992, 95, 96, 97, 98, 99, 2000, 2004
+ 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 _MATH_H
+# error "Never use <bits/huge_val.h> directly; include <math.h> instead."
+#endif
+
+/* IEEE positive infinity (-HUGE_VAL is negative infinity). */
+
+#if __GNUC_PREREQ(3,3)
+# define HUGE_VAL (__builtin_huge_val())
+#elif __GNUC_PREREQ(2,96)
+# define HUGE_VAL (__extension__ 0x1.0p2047)
+#elif defined __GNUC__
+
+# define HUGE_VAL \
+ (__extension__ \
+ ((union { unsigned __l __attribute__((__mode__(__DI__))); double __d; }) \
+ { __l: 0x000000007ff00000ULL }).__d)
+
+#else /* not GCC */
+
+# include <endian.h>
+
+typedef union { unsigned char __c[8]; double __d; } __huge_val_t;
+
+# if __BYTE_ORDER == __BIG_ENDIAN
+# define __HUGE_VAL_bytes { 0, 0, 0, 0, 0x7f, 0xf0, 0, 0 }
+# endif
+# if __BYTE_ORDER == __LITTLE_ENDIAN
+# define __HUGE_VAL_bytes { 0, 0, 0xf0, 0x7f, 0, 0, 0, 0 }
+# endif
+
+static __huge_val_t __huge_val = { __HUGE_VAL_bytes };
+# define HUGE_VAL (__huge_val.__d)
+
+#endif /* GCC. */
diff --exclude CVS -uNr org/ports/sysdeps/m32r/bits/setjmp.h ports/sysdeps/m32r/bits/setjmp.h
--- org/ports/sysdeps/m32r/bits/setjmp.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/bits/setjmp.h 2004-10-25 10:35:22.000000000 +0900
@@ -0,0 +1,55 @@
+/* Copyright (C) 2003, 2004 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'. M32R version. */
+#ifndef _BITS_SETJMP_H
+#define _BITS_SETJMP_H 1
+
+#ifndef _SETJMP_H
+# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead."
+#endif
+
+#ifndef _ASM
+typedef struct
+ {
+ /* Callee-saved registers r8 through r15. */
+ int __regs[8];
+
+ /* Program counter. */
+ void * __pc;
+ } __jmp_buf[1];
+#endif
+
+#define JB_R8 0
+#define JB_R9 1
+#define JB_R10 2
+#define JB_R11 3
+#define JB_R12 4
+#define JB_FP 5
+#define JB_LR 6
+#define JB_SP 7
+#define JB_PC 8
+
+#define JB_SIZE (4 * 9)
+
+/* Test if longjmp to JMPBUF would unwind the frame
+ containing a local variable at ADDRESS. */
+#define _JMPBUF_UNWINDS(jmpbuf, address) \
+ ((void *) (address) < &(jmpbuf)[0].__regs[JB_SP])
+
+#endif /* bits/setjmp.h */
diff --exclude CVS -uNr org/ports/sysdeps/m32r/bsd-_setjmp.S ports/sysdeps/m32r/bsd-_setjmp.S
--- org/ports/sysdeps/m32r/bsd-_setjmp.S 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/bsd-_setjmp.S 2004-10-25 10:35:22.000000000 +0900
@@ -0,0 +1,43 @@
+/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. M32R version.
+ Copyright (C) 2003, 2004 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. */
+
+/* This just does a tail-call to `__sigsetjmp (ARG, 0)'.
+ We cannot do it in C because it must be a tail-call, so frame-unwinding
+ in setjmp doesn't clobber the state restored by longjmp. */
+
+#include <sysdep.h>
+
+ENTRY (_setjmp)
+#ifdef SHARED
+ mv r2,lr
+ bl.s .+4
+ ld24 r1,#_GLOBAL_OFFSET_TABLE_
+ add r1,lr
+ mv lr,r2
+
+ ld24 r2,C_SYMBOL_NAME(__sigsetjmp)
+ add r2,r1
+ ld r2,@r2
+#else
+ LDIMM (r2, C_SYMBOL_NAME(__sigsetjmp))
+#endif
+ ldi r1, #0 /* Pass a second argument of zero. */
+ jmp r2
+END (_setjmp)
+libc_hidden_def(_setjmp)
diff --exclude CVS -uNr org/ports/sysdeps/m32r/bsd-setjmp.S ports/sysdeps/m32r/bsd-setjmp.S
--- org/ports/sysdeps/m32r/bsd-setjmp.S 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/bsd-setjmp.S 2004-10-25 10:35:22.000000000 +0900
@@ -0,0 +1,42 @@
+/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. M32R version.
+ Copyright (C) 2003, 2004 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. */
+
+/* This just does a tail-call to `__sigsetjmp (ARG, 1)'.
+ We cannot do it in C because it must be a tail-call, so frame-unwinding
+ in setjmp doesn't clobber the state restored by longjmp. */
+
+#include <sysdep.h>
+
+ENTRY (setjmp)
+#ifdef SHARED
+ mv r2,lr
+ bl.s .+4
+ ld24 r1,#_GLOBAL_OFFSET_TABLE_
+ add r1,lr
+ mv lr,r2
+
+ ld24 r2,C_SYMBOL_NAME(__sigsetjmp)
+ add r2,r1
+ ld r2,@r2
+#else
+ LDIMM (r2, C_SYMBOL_NAME(__sigsetjmp))
+#endif
+ ldi r1, #1 /* Pass a second argument of one. */
+ jmp r2
+END (setjmp)
diff --exclude CVS -uNr org/ports/sysdeps/m32r/dl-machine.h ports/sysdeps/m32r/dl-machine.h
--- org/ports/sysdeps/m32r/dl-machine.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/dl-machine.h 2004-10-25 10:35:22.000000000 +0900
@@ -0,0 +1,784 @@
+/* Machine-dependent ELF dynamic relocation inline functions. M32R version.
+ Copyright (C) 2003, 2004 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 dl_machine_h
+#define dl_machine_h
+
+/* Only dummy. This doesn't work. */
+
+#define ELF_MACHINE_NAME "M32R"
+
+#include <sys/param.h>
+
+#include <assert.h>
+
+/* Define the M32R_OLD_ABI, if you want to keep compatibility with
+ an old Renesas relocs */
+#ifdef M32R_OLD_ABI
+#define R_M32R_16_SAMPLE 1
+#define R_M32R_32_SAMPLE 2
+#define R_M32R_24_SAMPLE 3
+#define R_M32R_10_PCREL_SAMPLE 4
+#define R_M32R_18_PCREL_SAMPLE 5
+#define R_M32R_26_PCREL_SAMPLE 6
+#define R_M32R_HI16_ULO_SAMPLE 7
+#define R_M32R_HI16_SLO_SAMPLE 8
+#define R_M32R_LO16_SAMPLE 9
+#define R_M32R_SDA16_SAMPLE 10
+
+#define R_M32R_GOT24_SAMPLE 11 /* conflict */
+#define R_M32R_26_PLTREL_SAMPLE 12 /* conflict */
+#define R_M32R_GOT16_HI_ULO_SAMPLE 13
+#define R_M32R_GOT16_HI_SLO_SAMPLE 14
+#define R_M32R_GOT16_LO_SAMPLE 15
+#define R_M32R_GOTPC24_SAMPLE 16
+#define R_M32R_COPY_SAMPLE 17
+#define R_M32R_GLOB_DAT_SAMPLE 18
+#define R_M32R_JMP_SLOT_SAMPLE 19
+#define R_M32R_RELATIVE_SAMPLE 20
+#define R_M32R_GNU_VTINHERIT_SAMPLE 21
+#define R_M32R_GNU_VTENTRY_SAMPLE 22
+#endif /* M32R_OLD_ABI */
+
+/* Return nonzero iff ELF header is compatible with the running host. */
+static inline int __attribute__ ((unused))
+elf_machine_matches_host (const Elf32_Ehdr *ehdr)
+{
+ return (ehdr->e_machine == EM_M32R);
+}
+
+
+/* Return the link-time address of _DYNAMIC. Conveniently, this is the
+ first element of the GOT. This must be inlined in a function which
+ uses global data. */
+static inline Elf32_Addr __attribute__ ((unused))
+elf_machine_dynamic (void)
+{
+ register Elf32_Addr *got;
+ asm (" bl.s .+4\n"
+ " ld24 %0,#_GLOBAL_OFFSET_TABLE_\n"
+ " add %0,lr" :"=r" (got) : : "lr" );
+ return *got;
+}
+
+
+/* Return the run-time load address of the shared object. */
+static inline Elf32_Addr __attribute__ ((unused))
+elf_machine_load_address (void)
+{
+ Elf32_Addr addr;
+ asm (" ld24 r0,#here\n\t"
+ " add r0,r12\n\t"
+ " ld r0,@r0\n\t"
+ "here: \n\t"
+ " ld24 r1,#_GLOBAL_OFFSET_TABLE_\n\t"
+ " mv r2,r12\n\t"
+ " sub r2,r1\n\t"
+ " sub r2,r0\n\t"
+ " mv %0,r2"
+ : "=r" (addr) : : "r0", "r1", "r2" );
+ return addr;
+}
+
+
+/* Set up the loaded object described by L so its unrelocated PLT
+ entries will jump to the on-demand fixup code in dl-runtime.c. */
+
+static inline int __attribute__ ((unused, always_inline))
+elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
+{
+ Elf32_Addr *got;
+ extern void _dl_runtime_resolve (Elf32_Word);
+ extern void _dl_runtime_profile (Elf32_Word);
+
+ if (l->l_info[DT_JMPREL] && lazy)
+ {
+ /* The GOT entries for functions in the PLT have not yet been filled
+ in. Their initial contents will arrange when called to load an
+ offset into the .rela.plt section and _GLOBAL_OFFSET_TABLE_[1],
+ and then jump to _GLOBAL_OFFSET_TABLE[2]. */
+ got = (Elf32_Addr *) D_PTR (l, l_info[DT_PLTGOT]);
+ got[1] = (Elf32_Addr) l; /* Identify this shared object. */
+
+ /* The got[2] entry contains the address of a function which gets
+ called to get the address of a so far unresolved function and
+ jump to it. The profiling extension of the dynamic linker allows
+ to intercept the calls to collect information. In this case we
+ don't store the address in the GOT so that all future calls also
+ end in this function. */
+ if (profile)
+ {
+ got[2] = (Elf32_Addr) &_dl_runtime_profile;
+ /* Say that we really want profiling and the timers are started. */
+ GL(dl_profile_map) = l;
+ }
+ else
+ /* This function will get called to fix up the GOT entry indicated by
+ the offset on the stack, and then jump to the resolved address. */
+ got[2] = (Elf32_Addr) &_dl_runtime_resolve;
+ }
+ return lazy;
+}
+
+/* This code is used in dl-runtime.c to call the `fixup' function
+ and then redirect to the address it returns. */
+
+#define ELF_MACHINE_RUNTIME_FIXUP_ARGS int plt_type
+
+#ifdef SHARED
+#define FUN_ADDR( func ) "\n\
+ bl.s .+4 \n\
+ ld24 r12,#_GLOBAL_OFFSET_TABLE_ \n\
+ add r12,lr \n\
+ ld24 r4,#" #func " \n\
+ add r4,r12 \n\
+ ld r4,@r4"
+#else
+#define FUN_ADDR( func ) "\
+ seth r4,#high( " #func " ) \n\
+ or3 r4,r4,#low( " #func " )"
+#endif
+
+#define FGR_SAVE ""
+#define FGR_LOAD ""
+
+#ifdef M32R_OLD_NEWABI
+#define LOAD_ARGS_FROM_STACK( name ) "\n\
+ mv r7,lr \n\
+ ; OLD_PLT to keep compatible mode only \n\
+ bl.s .+4 \n\
+ .fillinsn \n\
+ addi lr,# " #name " -. \n\
+ beq r6,lr,1f \n\
+ ; OLT_PLT ABI \n\
+ pop r4 ; link map address \n\
+ pop r5 ; reloc offset \n\
+ .fillinsn \n\
+1: \n\
+ mv lr,r7"
+#else
+#define LOAD_ARGS_FROM_STACK( name ) "\n\
+ ; DELETE FOR NEW ABI pop r4 ; link map address \n\
+ ; DELETE FOR NEW ABI pop r5 ; reloc offset\n"
+#endif
+
+#ifndef PROF
+# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
+ .text \n\
+ .globl _dl_runtime_resolve \n\
+ .type _dl_runtime_resolve, @function \n\
+ \n\
+ .balign 4 \n\
+_dl_runtime_resolve: \n\
+ " LOAD_ARGS_FROM_STACK( _dl_runtime_resolve ) " \n\
+ push r0 \n\
+ push r1 \n\
+ push r2 \n\
+ push r3 \n\
+ push r12 \n\
+ " FGR_SAVE " \n\
+ push lr \n\
+ \n\
+ ; fixup( ELF_MACHINE_RUNTIME_TRAMPOLINE, link_map, reloc_offset ) \n\
+ ;mv r0,*** ; plt_type (dummy) \n\
+ \n\
+ mv r1,r4 ; link map address \n\
+ mv r2,r5 ; reloc offset \n\
+ \n\
+ " FUN_ADDR( fixup ) " \n\
+ \n\
+ jl r4 ; Call resolver. \n\
+ mv r4,r0 ; value \n\
+ \n\
+ pop lr ; Get register content back. \n\
+ " FGR_LOAD " \n\
+ pop r12 \n\
+ pop r3 \n\
+ pop r2 \n\
+ pop r1 \n\
+ pop r0 \n\
+ \n\
+ jmp r4 ; Jump to function address. \n\
+ \n\
+ .balign 4 \n\
+ .size _dl_runtime_resolve, .-_dl_runtime_resolve \n\
+ \n\
+ .globl _dl_runtime_profile \n\
+ .type _dl_runtime_profile, @function \n\
+ \n\
+ .balign 4 \n\
+_dl_runtime_profile: \n\
+ " LOAD_ARGS_FROM_STACK( _dl_runtime_profile ) " \n\
+ push r0 \n\
+ push r1 \n\
+ push r2 \n\
+ push r3 \n\
+ push r12 \n\
+ " FGR_SAVE " \n\
+ push lr \n\
+ \n\
+ ; profile_fixup( ELF_MACHINE_RUNTIME_TRAMPOLINE, link_map, reloc_offset ) \n\
+ ;mv r0,*** ; plt_type (dummy) \n\
+ mv r1,r4 ; link map address \n\
+ mv r2,r5 ; reloc offset \n\
+ \n\
+ " FUN_ADDR( profile_fixup ) " \n\
+ \n\
+ jl r4 ; Call resolver. \n\
+ mv r4,r0 ; value \n\
+ \n\
+ pop lr ; Get register content back. \n\
+ " FGR_LOAD " \n\
+ pop r12 \n\
+ pop r3 \n\
+ pop r2 \n\
+ pop r1 \n\
+ pop r0 \n\
+ \n\
+ jmp r4 ; Jump to function address. \n\
+ \n\
+ .balign 4 \n\
+ .size _dl_runtime_profile, .-_dl_runtime_profile \n\
+ .previous \n\
+");
+#else
+# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
+ .text \n\
+ .globl _dl_runtime_resolve \n\
+ .globl _dl_runtime_profile \n\
+ .type _dl_runtime_resolve, @function \n\
+ .type _dl_runtime_profile, @function \n\
+ \n\
+ .balign 4 \n\
+_dl_runtime_resolve: \n\
+_dl_runtime_profile: \n\
+ " LOAD_ARGS_FROM_STACK( _dl_runtime_resolve ) " \n\
+ push r0 \n\
+ push r1 \n\
+ push r2 \n\
+ push r3 \n\
+ push r12 \n\
+ " FGR_SAVE " \n\
+ push lr \n\
+ \n\
+ ; fixup( ELF_MACHINE_RUNTIME_TRAMPOLINE, link_map, reloc_offset ) \n\
+ ;mv r0,*** ; plt_type (dummy) \n\
+ mv r1,r4 ; link map address \n\
+ mv r2,r5 ; reloc offset \n\
+ \n\
+ " FUN_ADDR( fixup ) " \n\
+ \n\
+ jl r4 ; Call resolver. \n\
+ mv r4,r0 ; value \n\
+ \n\
+ pop lr ; Get register content back. \n\
+ " FGR_LOAD " \n\
+ pop r12 \n\
+ pop r3 \n\
+ pop r2 \n\
+ pop r1 \n\
+ pop r0 \n\
+ \n\
+ jmp r4 ; Jump to function address. \n\
+ \n\
+ .balign 4 \n\
+ .size _dl_runtime_resolve, .-_dl_runtime_resolve \n\
+ .size _dl_runtime_profile, .-_dl_runtime_profile \n\
+ .previous \n\
+");
+#endif
+
+/* Mask identifying addresses reserved for the user program,
+ where the dynamic linker should not map anything. */
+#define ELF_MACHINE_USER_ADDRESS_MASK 0x80000000UL
+
+/* Initial entry point code for the dynamic linker.
+ The C function `_dl_start' is the real entry point;
+ its return value is the user program's entry point. */
+
+#define RTLD_START asm ("\
+.text\n\
+.globl _start\n\
+.globl _dl_start_user\n\
+_start:\n\
+ mv r0,r15\n\
+ bl _dl_start\n\
+_dl_start_user:\n\
+ ; Save the user entry point address in r8.\n\
+ mv r8,r0\n\
+ ; Point r12 at the GOT.\n\
+ bl.s .+4\n\
+ ld24 r12,#_GLOBAL_OFFSET_TABLE_\n\
+ add r12,lr\n\
+ ; Store the highest stack address\n\
+ ld24 r0,#__libc_stack_end ; __libc_stack_end@GOT \n\
+ add r0,r12\n\
+ ld r0,@r0\n\
+ st r15,@r0\n\
+ ; See if we were run as a command with the executable file\n\
+ ; name as an extra leading argument.\n\
+ ld24 r0,#_dl_skip_args ; _dl_skip_args@GOT \n\
+ add r0,r12\n\
+ ld r0,@r0\n\
+ ld r0,@r0\n\
+ ; Get the original argument count.\n\
+ ld r1,@r15\n\
+ ; Subtract _dl_skip_args from it.\n\
+ sub r1,r0\n\
+ ; Adjust the stack pointer to skip _dl_skip_args words.\n\
+ slli r0,#2\n\
+ add r15,r0\n\
+ ; Store back the modified argument count.\n\
+ st r1,@r15\n\
+ ; Compute argv address and envp.\n\
+ mv r2,r15\n\
+ addi r2,#4\n\
+ mv r3,r1\n\
+ addi r3,#1\n\
+ slli r3,#2\n\
+ add r3,r2\n\
+ ld24 r0,#_rtld_local\n\
+ add r0,r12\n\
+ ld r0,@r0\n\
+ ld r0,@r0\n\
+ ; Call _dl_init.\n\
+ bl _dl_init ; _dl_init@PLT \n\
+ .fillinsn\n\
+1: ; Pass our finalizer function to the user in r4, as per ELF ABI.\n\
+ ld24 r0,#_dl_fini ; _dl_fini@GOT \n\
+ add r0,r12\n\
+ ld r0,@r0\n\
+ ; Jump to the user's entry point.\n\
+ jmp r8\n\
+.previous\n\
+");
+
+/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so
+ PLT entries should not be allowed to define the value.
+ ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
+ of the main executable's symbols, as for a COPY reloc. */
+#ifdef M32R_OLD_ABI
+/* for oldtype relocation compatibility */
+#define elf_machine_type_class(type) \
+ ((((type) == R_M32R_JMP_SLOT || (type) == R_M32R_JMP_SLOT_SAMPLE) * ELF_RTYPE_CLASS_PLT) \
+ | (((type) == R_M32R_COPY || (type) == R_M32R_COPY_SAMPLE) * ELF_RTYPE_CLASS_COPY))
+#else
+#define elf_machine_type_class(type) \
+ ((((type) == R_M32R_JMP_SLOT) * ELF_RTYPE_CLASS_PLT) \
+ | (((type) == R_M32R_COPY) * ELF_RTYPE_CLASS_COPY))
+#endif
+
+/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
+#ifdef M32R_OLD_ABI
+/* for oldtype relocation compatibility */
+#define ELF_MACHINE_JMP_SLOT \
+ R_M32R_JMP_SLOT || ELFW(R_TYPE)(reloc->r_info) == R_M32R_JMP_SLOT_SAMPLE
+#else
+#define ELF_MACHINE_JMP_SLOT R_M32R_JMP_SLOT
+#endif
+
+/* M32R never uses Elf32_Rel relocations. */
+#define ELF_MACHINE_NO_REL 1
+
+/* We define an initialization functions. This is called very early in
+ _dl_sysdep_start. */
+#define DL_PLATFORM_INIT dl_platform_init ()
+
+static inline void __attribute__ ((unused))
+dl_platform_init (void)
+{
+ if (GLRO(dl_platform) != NULL && *GLRO(dl_platform) == '\0')
+ /* Avoid an empty string which would disturb us. */
+ GLRO(dl_platform) = NULL;
+}
+
+static inline Elf32_Addr
+elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+ const Elf32_Rela *reloc,
+ Elf32_Addr *reloc_addr, Elf32_Addr value)
+{
+ return *reloc_addr = value;
+}
+
+/* Return the final value of a plt relocation. */
+static inline Elf32_Addr
+elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc,
+ Elf32_Addr value)
+{
+ return value + reloc->r_addend;
+}
+
+#endif /* !dl_machine_h */
+
+#ifdef RESOLVE
+
+extern char **_dl_argv;
+
+/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
+ MAP is the object containing the reloc. */
+
+auto inline void
+__attribute ((always_inline))
+elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
+ const Elf32_Sym *sym, const struct r_found_version *version,
+ void *const reloc_addr_arg)
+{
+ Elf32_Addr *const reloc_addr = reloc_addr_arg;
+ const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
+ Elf32_Addr value;
+
+#define COPY_UNALIGNED_WORD(swp, twp, align) \
+ { \
+ void *__s = (swp), *__t = (twp); \
+ unsigned char *__s1 = __s, *__t1 = __t; \
+ unsigned short *__s2 = __s, *__t2 = __t; \
+ unsigned long *__s4 = __s, *__t4 = __t; \
+ switch ((align)) \
+ { \
+ case 0: \
+ *__t4 = *__s4; \
+ break; \
+ case 2: \
+ *__t2++ = *__s2++; \
+ *__t2 = *__s2; \
+ break; \
+ default: \
+ *__t1++ = *__s1++; \
+ *__t1++ = *__s1++; \
+ *__t1++ = *__s1++; \
+ *__t1 = *__s1; \
+ break; \
+ } \
+ }
+#define COPY_UNALIGNED_HWORD(swp, twp, align) \
+ { \
+ void *__s = (swp), *__t = (twp); \
+ unsigned char *__s1 = __s, *__t1 = __t; \
+ unsigned short *__s2 = __s, *__t2 = __t; \
+ switch ((align)) \
+ { \
+ case 0: \
+ *__t2 = *__s2; \
+ break; \
+ default: \
+ *__t1++ = *__s1++; \
+ *__t1 = *__s1; \
+ break; \
+ } \
+ }
+
+#ifdef M32R_OLD_ABI
+/* for oldtype relocation compatibility */
+ if (__builtin_expect (r_type == R_M32R_RELATIVE || r_type == R_M32R_RELATIVE_SAMPLE, 0))
+#else
+ if (__builtin_expect (r_type == R_M32R_RELATIVE, 0))
+#endif
+ {
+#ifndef RTLD_BOOTSTRAP
+ if (map != &GL(dl_rtld_map)) /* Already done in rtld itself. */
+#endif
+ {
+ if (reloc->r_addend)
+ value = map->l_addr + reloc->r_addend;
+ else
+ {
+ COPY_UNALIGNED_WORD (reloc_addr_arg, &value,
+ (int) reloc_addr_arg & 3);
+ value += map->l_addr;
+ }
+ COPY_UNALIGNED_WORD (&value, reloc_addr_arg,
+ (int) reloc_addr_arg & 3);
+ }
+ }
+#ifndef RTLD_BOOTSTRAP
+ else if (__builtin_expect (r_type == R_M32R_NONE, 0))
+ return;
+#endif
+ else
+ {
+ const Elf32_Sym *const refsym = sym;
+#ifndef RTLD_BOOTSTRAP
+ Elf32_Addr tmp_value;
+#endif
+ value = RESOLVE (&sym, version, r_type);
+ if (sym)
+ value += sym->st_value;
+ value += reloc->r_addend;
+
+ switch (r_type)
+ {
+#ifdef M32R_OLD_ABI
+ case R_M32R_COPY_SAMPLE:
+#endif
+ case R_M32R_COPY:
+ if (sym == NULL)
+ /* This can happen in trace mode if an object could not be
+ found. */
+ break;
+ if (sym->st_size > refsym->st_size
+ || (sym->st_size < refsym->st_size && GLRO(dl_verbose)))
+ {
+ const char *strtab;
+
+ strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
+ _dl_error_printf ("\
+%s: Symbol `%s' has different size in shared object, consider re-linking\n",
+ _dl_argv[0] ?: "<program name unknown>",
+ strtab + refsym->st_name);
+ }
+ memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
+ refsym->st_size));
+ break;
+#ifdef M32R_OLD_ABI
+ case R_M32R_GLOB_DAT_SAMPLE:
+#endif
+ case R_M32R_GLOB_DAT:
+#if 0 /* 20021129 1 -> 0 */
+ case R_M32R_32:
+ *reloc_addr = value;
+ break;
+#endif /* 20021129 1 -> 0 */
+#ifdef M32R_OLD_ABI
+ case R_M32R_JMP_SLOT_SAMPLE:
+#endif
+ case R_M32R_JMP_SLOT:
+ elf_machine_fixup_plt(map, 0, reloc, reloc_addr, value);
+ break;
+#if 1 /* 20021129 0 -> 1 */
+#ifdef M32R_OLD_ABI
+ case R_M32R_32_SAMPLE:
+#endif
+ case R_M32R_32_RELA:
+#ifndef RTLD_BOOTSTRAP
+#ifdef M32R_OLD_ABI
+ case R_M32R_24_SAMPLE:
+ case R_M32R_16_SAMPLE:
+ case R_M32R_HI16_ULO_SAMPLE:
+ case R_M32R_HI16_SLO_SAMPLE:
+ case R_M32R_LO16_SAMPLE:
+ case R_M32R_SDA16_SAMPLE:
+#endif
+ case R_M32R_24_RELA:
+ case R_M32R_16_RELA:
+ case R_M32R_HI16_ULO_RELA:
+ case R_M32R_HI16_SLO_RELA:
+ case R_M32R_LO16_RELA:
+ case R_M32R_SDA16_RELA:
+#endif
+ {
+#ifndef RTLD_BOOTSTRAP
+ /* This is defined in rtld.c, but nowhere in the static
+ libc.a; make the reference weak so static programs can
+ still link. This declaration cannot be done when
+ compiling rtld.c (i.e. #ifdef RTLD_BOOTSTRAP) because
+ rtld.c contains the common defn for _dl_rtld_map, which
+ is incompatible with a weak decl in the same file. */
+# ifndef SHARED
+ weak_extern (GL(dl_rtld_map));
+# endif
+ if (map == &GL(dl_rtld_map))
+ /* Undo the relocation done here during bootstrapping.
+ Now we will relocate it anew, possibly using a
+ binding found in the user program or a loaded library
+ rather than the dynamic linker's built-in definitions
+ used while loading those libraries. */
+ value -= map->l_addr + refsym->st_value + reloc->r_addend;
+#endif
+#ifdef M32R_OLD_ABI
+ if (r_type == R_M32R_32_SAMPLE
+ || r_type == R_M32R_32_RELA)
+#else
+ if (r_type == R_M32R_32_RELA)
+#endif
+ {
+ COPY_UNALIGNED_WORD (&value, reloc_addr_arg,
+ (int) reloc_addr_arg & 3);
+ }
+#ifndef RTLD_BOOTSTRAP
+#ifdef M32R_OLD_ABI
+ else if (r_type == R_M32R_16_SAMPLE
+ || r_type == R_M32R_16_RELA)
+#else
+ else if (r_type == R_M32R_16_RELA)
+#endif
+ {
+ COPY_UNALIGNED_HWORD (&value, reloc_addr_arg,
+ (int) reloc_addr_arg & 3);
+ }
+ else
+ {
+ COPY_UNALIGNED_WORD (reloc_addr_arg, &tmp_value,
+ (int) reloc_addr_arg & 3);
+ switch (r_type)
+ {
+#ifdef M32R_OLD_ABI
+ case R_M32R_24_SAMPLE:
+ if (value & 0xff000000)
+ {
+ _dl_signal_error (0, map->l_name, NULL,
+ "R_M32R_24 relocation overflow");
+ }
+ value = (tmp_value & ~0xffffff) | (value & 0xffffff);
+ break;
+#endif
+ case R_M32R_24_RELA:
+ if (value & 0xff000000)
+ {
+ _dl_signal_error (0, map->l_name, NULL,
+ "R_M32R_24_RELA relocation overflow");
+ }
+ value = (tmp_value & ~0xffffff) | (value & 0xffffff);
+ break;
+#ifdef M32R_OLD_ABI
+ case R_M32R_HI16_ULO_SAMPLE:
+#endif
+ case R_M32R_HI16_ULO_RELA:
+ value = (tmp_value & ~0xffff) | ((value >>16) & 0xffff);
+ break;
+#ifdef M32R_OLD_ABI
+ case R_M32R_HI16_SLO_SAMPLE:
+#endif
+ case R_M32R_HI16_SLO_RELA:
+ if (value & 0x8000)
+ value += 0x10000;
+ value = (tmp_value & ~0xffff) | ((value >>16) & 0xffff);
+ break;
+#ifdef M32R_OLD_ABI
+ case R_M32R_LO16_SAMPLE:
+ case R_M32R_SDA16_SAMPLE:
+#endif
+ case R_M32R_LO16_RELA:
+ case R_M32R_SDA16_RELA:
+ value = (tmp_value & ~0xffff) | (value & 0xffff);
+ break;
+ }
+ COPY_UNALIGNED_WORD (&value, reloc_addr_arg,
+ (int) reloc_addr_arg & 3);
+ }
+#endif
+ break;
+ }
+#ifndef RTLD_BOOTSTRAP
+#ifdef M32R_OLD_ABI
+ case R_M32R_26_PCREL_SAMPLE:
+ COPY_UNALIGNED_WORD (reloc_addr_arg, &tmp_value,
+ (int) reloc_addr_arg & 3);
+ value += (signed long)(tmp_value & 0xffffff) << 2;
+ value = value - (Elf32_Addr) reloc_addr;
+ if ((signed long)value < -0x2000000 || 0x1fffffc < (signed long)value)
+ {
+ _dl_signal_error (0, map->l_name, NULL,
+ "R_M32R_26_PCREL relocation overflow");
+ }
+ value = (tmp_value & ~0xffffff) | ((value >> 2) & 0xffffff);
+ COPY_UNALIGNED_WORD (&value, reloc_addr_arg, (int) reloc_addr_arg & 3);
+ break;
+#endif
+ case R_M32R_26_PCREL_RELA:
+ COPY_UNALIGNED_WORD (reloc_addr_arg, &tmp_value,
+ (int) reloc_addr_arg & 3);
+ value += (signed long)(tmp_value & 0xffffff) << 2;
+ value = value - (Elf32_Addr) reloc_addr;
+ if ((signed long)value < -0x2000000 || 0x1fffffc < (signed long)value)
+ {
+ _dl_signal_error (0, map->l_name, NULL,
+ "R_M32R_26_PCREL_RELA relocation overflow");
+ }
+ value = (tmp_value & ~0xffffff) | ((value >> 2) & 0xffffff);
+ COPY_UNALIGNED_WORD (&value, reloc_addr_arg,
+ (int) reloc_addr_arg & 3);
+ break;
+#ifdef M32R_OLD_ABI
+ case R_M32R_18_PCREL_SAMPLE:
+ COPY_UNALIGNED_WORD (reloc_addr_arg, &tmp_value,
+ (int) reloc_addr_arg & 3);
+ value += (signed long)(tmp_value & 0xffff) << 2;
+ value = value - (Elf32_Addr) reloc_addr;
+ if ((signed long)value < -0x20000 || 0x1fffc < (signed long)value)
+ {
+ _dl_signal_error (0, map->l_name, NULL,
+ "R_M32R_18_PCREL relocation overflow");
+ }
+ value = (tmp_value & ~0xffff) | ((value >> 2) & 0xffff);
+ COPY_UNALIGNED_WORD (&value, reloc_addr_arg,
+ (int) reloc_addr_arg & 3);
+ break;
+#endif
+ case R_M32R_18_PCREL_RELA:
+ COPY_UNALIGNED_WORD (reloc_addr_arg, &tmp_value,
+ (int) reloc_addr_arg & 3);
+ value += (signed long)(tmp_value & 0xffff) << 2;
+ value = value - (Elf32_Addr) reloc_addr;
+ if ((signed long)value < -0x20000 || 0x1fffc < (signed long)value)
+ {
+ _dl_signal_error (0, map->l_name, NULL,
+ "R_M32R_18_PCREL_RELA relocation overflow");
+ }
+ value = (tmp_value & ~0xffff) | ((value >> 2) & 0xffff);
+ COPY_UNALIGNED_WORD (&value, reloc_addr_arg,
+ (int) reloc_addr_arg & 3);
+ break;
+#endif
+#endif /* 20021129 0 -> 1 */
+ default:
+ _dl_reloc_bad_type (map, r_type, 0);
+ break;
+ }
+ }
+}
+
+auto inline void
+__attribute ((always_inline))
+elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
+ void *const reloc_addr_arg)
+{
+ Elf32_Addr value;
+
+ if (reloc->r_addend)
+ value = l_addr + reloc->r_addend;
+ else
+ {
+ COPY_UNALIGNED_WORD (reloc_addr_arg, &value, (int) reloc_addr_arg & 3);
+ value += l_addr;
+ }
+ COPY_UNALIGNED_WORD (&value, reloc_addr_arg, (int) reloc_addr_arg & 3);
+
+#undef COPY_UNALIGNED_WORD
+#undef COPY_UNALIGNED_HWORD
+}
+
+auto inline void
+__attribute ((always_inline))
+elf_machine_lazy_rel (struct link_map *map,
+ Elf32_Addr l_addr, const Elf32_Rela *reloc)
+{
+ Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset);
+ /* Check for unexpected PLT reloc type. */
+#ifdef M32R_OLD_ABI
+ if (ELF32_R_TYPE (reloc->r_info) == R_M32R_JMP_SLOT
+ || ELF32_R_TYPE (reloc->r_info) == R_M32R_JMP_SLOT_SAMPLE)
+#else
+ if (ELF32_R_TYPE (reloc->r_info) == R_M32R_JMP_SLOT)
+#endif
+ *reloc_addr += l_addr;
+ else
+ _dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 1);
+}
+
+#endif /* RESOLVE */
diff --exclude CVS -uNr org/ports/sysdeps/m32r/elf/start.S ports/sysdeps/m32r/elf/start.S
--- org/ports/sysdeps/m32r/elf/start.S 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/elf/start.S 2004-10-25 10:35:22.000000000 +0900
@@ -0,0 +1,81 @@
+/* Startup code for M32R & ELF.
+ Copyright (C) 2003, 2004 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. */
+
+/* This is the canonical entry point, usually the first thing in the text
+ segment.
+
+ Note that the code in the .init section has already been run.
+ This includes _init and _libc_init
+
+
+ At this entry point, most registers' values are unspecified, except:
+
+ r0 Contains a function pointer to be registered with `atexit'.
+ This is how the dynamic linker arranges to have DT_FINI
+ functions called for shared libraries that have been loaded
+ before this code runs.
+
+ sp The stack contains the arguments and environment:
+ @(0,sp) argc
+ @(4,sp) argv[0]
+ ...
+ @((4*argc),sp) NULL
+ @((4*(argc+1)),sp) envp[0]
+ ...
+ NULL
+*/
+
+#include "sysdep.h"
+#include "bp-sym.h"
+
+ .text
+ .globl _start
+_start:
+ /* Clear the frame pointer since this is the outermost frame. */
+ ldi r13, #0
+
+ /* Pop argc off the stack and save a pointer to argv */
+ pop r1
+ mv r2, sp
+
+ /* Push the last arguments to main() onto the stack */
+ push r0
+ LDIMM (r0, __libc_csu_fini)
+ push r0
+
+ /* Set up the other arguments for main() that go in registers */
+ LDIMM (r0, BP_SYM (main))
+ LDIMM (r3, __libc_csu_init)
+
+ /* __libc_start_main (main, argc, argv, init, fini, rtld_fini) */
+
+ /* Let the libc call main and exit with its return code. */
+ LDIMM (r4, BP_SYM (__libc_start_main))
+ jl r4
+ /* should never get here....*/
+ LDIMM (r4, abort)
+ jl r4
+
+/* Define a symbol for the first piece of initialized data. */
+ .data
+ .globl __data_start
+__data_start:
+ .long 0
+ .weak data_start
+ data_start = __data_start
diff --exclude CVS -uNr org/ports/sysdeps/m32r/gmp-mparam.h ports/sysdeps/m32r/gmp-mparam.h
--- org/ports/sysdeps/m32r/gmp-mparam.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/gmp-mparam.h 2004-10-25 10:35:22.000000000 +0900
@@ -0,0 +1,30 @@
+/* gmp-mparam.h -- Compiler/machine parameter header file.
+
+Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+
+This file is part of the GNU MP Library.
+
+The GNU MP 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 MP 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 MP 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 BITS_PER_MP_LIMB 32
+#define BYTES_PER_MP_LIMB 4
+#define BITS_PER_LONGINT 32
+#define BITS_PER_INT 32
+#define BITS_PER_SHORTINT 16
+#define BITS_PER_CHAR 8
+
+#define IEEE_DOUBLE_BIG_ENDIAN 0
+#define IEEE_DOUBLE_MIXED_ENDIAN 1
diff --exclude CVS -uNr org/ports/sysdeps/m32r/linuxthreads/pspinlock.c ports/sysdeps/m32r/linuxthreads/pspinlock.c
--- org/ports/sysdeps/m32r/linuxthreads/pspinlock.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/linuxthreads/pspinlock.c 2004-10-25 10:41:33.000000000 +0900
@@ -0,0 +1,70 @@
+/* POSIX spinlock implementation. M32R version.
+ Copyright (C) 2003, 2004 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. */
+
+#include <errno.h>
+#include <pthread.h>
+#include "internals.h"
+
+int
+__pthread_spin_lock (pthread_spinlock_t *lock)
+{
+ while (INLINE_SYSCALL (tas, 1, lock));
+ return 0;
+}
+weak_alias (__pthread_spin_lock, pthread_spin_lock)
+
+
+int
+__pthread_spin_trylock (pthread_spinlock_t *lock)
+{
+ unsigned int val;
+
+ if ((val = *lock) == 0)
+ val = INLINE_SYSCALL (tas, 1, lock);
+ return (val > 0 ? EBUSY : 0);
+}
+weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
+
+
+int
+__pthread_spin_unlock (pthread_spinlock_t *lock)
+{
+ return *lock = 0;
+}
+weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
+
+
+int
+__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
+{
+ /* We can ignore the `pshared' parameter. Since we are busy-waiting
+ all processes which can access the memory location `lock' points
+ to can use the spinlock. */
+ return *lock = 0;
+}
+weak_alias (__pthread_spin_init, pthread_spin_init)
+
+
+int
+__pthread_spin_destroy (pthread_spinlock_t *lock)
+{
+ /* Nothing to do. */
+ return 0;
+}
+weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
diff --exclude CVS -uNr org/ports/sysdeps/m32r/linuxthreads/pt-machine.h ports/sysdeps/m32r/linuxthreads/pt-machine.h
--- org/ports/sysdeps/m32r/linuxthreads/pt-machine.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/linuxthreads/pt-machine.h 2004-10-25 10:41:33.000000000 +0900
@@ -0,0 +1,55 @@
+/* Machine-dependent pthreads configuration and inline functions.
+ M32R version.
+ Copyright (C) 2003, 2004 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 _PT_MACHINE_H
+#define _PT_MACHINE_H 1
+
+#include <errno.h>
+#include <sysdep.h>
+
+#ifndef __ASSEMBLER__
+#ifndef PT_EI
+# define PT_EI extern inline
+#endif
+
+extern long int testandset (int *spinlock);
+extern int __compare_and_swap (long int *p, long int oldval, long int newval);
+
+/* Spinlock implementation; required. */
+PT_EI long int
+testandset (int *spinlock)
+{
+ int ret;
+
+ ret = INLINE_SYSCALL (tas, 1, spinlock);
+ return ret;
+}
+
+#define lock_held(p) *(p)
+
+/* 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__ ("r15");
+
+#endif /* __ASSEMBLER__ */
+
+#endif /* pt-machine.h */
+
diff --exclude CVS -uNr org/ports/sysdeps/m32r/m32r-mcount.S ports/sysdeps/m32r/m32r-mcount.S
--- org/ports/sysdeps/m32r/m32r-mcount.S 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/m32r-mcount.S 2004-10-25 10:35:22.000000000 +0900
@@ -0,0 +1,67 @@
+/* m32r-specific implemetation of profiling support.
+ Copyright (C) 2003 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. */
+
+#include <sysdep.h>
+
+ ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(_mcount)
+ ASM_TYPE_DIRECTIVE(C_SYMBOL_NAME(_mcount), function)
+ .balign 4
+C_LABEL(_mcount)
+ /* Save the caller-clobbered registers. */
+ push r0
+ push r1
+ push r2
+ push r3
+ push r4
+ push r5
+ push r6
+ push r7
+ push lr
+ ld r0,@(36,sp)
+ mv r1,lr
+
+#ifdef __PIC__
+ push r12
+ bl.s .+4
+ ld24 r12,#_GLOBAL_OFFSET_TABLE_
+ add r12,lr
+ ld24 lr,#__mcount_internal
+ add lr,r12
+ ld lr,@(lr)
+ jl lr
+ pop r12
+#else
+ bl __mcount_internal
+#endif
+ /* Pop the saved registers. Please note that `mcount' has no
+ return value. */
+ pop lr
+ pop r7
+ pop r6
+ pop r5
+ pop r4
+ pop r3
+ pop r2
+ pop r1
+ pop r0
+ ret
+ ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(_mcount))
+
+#undef mcount
+weak_alias(_mcount, mcount)
diff --exclude CVS -uNr org/ports/sysdeps/m32r/machine-gmon.h ports/sysdeps/m32r/machine-gmon.h
--- org/ports/sysdeps/m32r/machine-gmon.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/machine-gmon.h 2004-10-25 10:35:22.000000000 +0900
@@ -0,0 +1,34 @@
+/* Machine-dependent definitions for profiling support. M32R version.
+ Copyright (C) 2003, 2004 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. */
+
+/* NOTYET */
+
+/* We must not pollute the global namespace. */
+#define mcount_internal __mcount_internal
+
+void mcount_internal (u_long frompc, u_long selfpc);
+
+#define _MCOUNT_DECL(frompc, selfpc) \
+void mcount_internal (u_long frompc, u_long selfpc)
+
+
+/* Define MCOUNT as empty since we have the implementation in another
+ file. */
+#define MCOUNT
+
diff --exclude CVS -uNr org/ports/sysdeps/m32r/memcpy.S ports/sysdeps/m32r/memcpy.S
--- org/ports/sysdeps/m32r/memcpy.S 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/memcpy.S 2004-10-25 10:35:22.000000000 +0900
@@ -0,0 +1,62 @@
+/* Copyright (C) 2003, 2004 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. */
+
+#include <sysdep.h>
+#include <endian.h>
+
+/*
+ * void *memcpy(void *dst, const void *src, size_t n);
+ * No overlap between the memory of DST and of SRC are assumed.
+ *
+ * dst: r0
+ * src: r1
+ * n : r2
+ */
+
+ENTRY(memcpy)
+ mv r4, r0
+ mv r7, r0
+ or r7, r1
+ beq r0, r1, end_memcopy
+ beqz r2, end_memcopy
+
+ and3 r7, r7, #3
+ bnez r7, byte_copy
+ srl3 r3, r2, #2
+ and3 r2, r2, #3
+ beqz r3, byte_copy
+ addi r4, #-4
+word_copy:
+ ld r7, @r1+
+ addi r3, #-1
+ st r7, @+r4
+ bnez r3, word_copy
+ beqz r2, end_memcopy
+ addi r4, #4
+byte_copy:
+ ldb r7, @r1
+ addi r1, #1
+ addi r2, #-1
+ stb r7, @r4
+ addi r4, #1
+ bnez r2, byte_copy
+end_memcopy:
+ jmp r14
+ nop
+END(memcpy)
+libc_hidden_builtin_def (memcpy)
diff --exclude CVS -uNr org/ports/sysdeps/m32r/memset.S ports/sysdeps/m32r/memset.S
--- org/ports/sysdeps/m32r/memset.S 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/memset.S 2004-10-25 10:35:22.000000000 +0900
@@ -0,0 +1,76 @@
+/* Copyright (C) 2003, 2004 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. */
+
+#include <sysdep.h>
+
+/* void *memset(void *dst, int val, int len);
+ *
+ * dst: r0
+ * val: r1
+ * len: r2
+ * ret: r0
+ */
+
+ENTRY(memset)
+ mv r4, r0
+ beqz r2, end_memset
+ cmpui r2, #4
+ bc byte_set
+; case len >= 4
+ and3 r3, r4, #3
+ beqz r3, word_set
+; case miss align
+ addi r3, #-4
+ neg r3, r3 ; r3 = -(r3 - 4)
+miss_align:
+ stb r1, @r4
+ addi r4, #1
+ addi r2, #-1
+ addi r3, #-1
+ bnez r3, miss_align
+ cmpui r2, #4
+ bc byte_set
+word_set:
+ and3 r1, r1, #0x00ff ; r1: abababab <-- ??????ab
+ sll3 r3, r1, #8
+ or r1, r3
+ sll3 r3, r1, #16
+ or r1, r3
+ addi r2, #-4
+ addi r4, #-4
+word_set_loop:
+ st r1, @+r4
+ addi r2, #-4
+ bgtz r2, word_set_loop
+ bnez r2, byte_set_wrap
+ st r1, @+r4
+ jmp r14
+byte_set_wrap:
+ addi r2, #4
+ addi r4, #4
+ beqz r2, end_memset
+byte_set:
+ addi r2, #-1
+ stb r1, @r4
+ addi r4, #1
+ bnez r2, byte_set
+end_memset:
+ jmp r14
+ nop
+END(memset)
+libc_hidden_builtin_def (memset)
diff --exclude CVS -uNr org/ports/sysdeps/m32r/memusage.h ports/sysdeps/m32r/memusage.h
--- org/ports/sysdeps/m32r/memusage.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/memusage.h 2004-10-25 10:35:22.000000000 +0900
@@ -0,0 +1,21 @@
+/* Copyright (C) 2003, 2004 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 GETSP() ({ register uintptr_t stack_ptr asm ("r15"); stack_ptr; })
+
+#include <sysdeps/generic/memusage.h>
diff --exclude CVS -uNr org/ports/sysdeps/m32r/preconfigure ports/sysdeps/m32r/preconfigure
--- org/ports/sysdeps/m32r/preconfigure 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/preconfigure 2004-10-25 11:17:23.000000000 +0900
@@ -0,0 +1,9 @@
+case "${host_cpu}-${host_os}" in
+ m32r*)
+ libc_cv_asm_line_sep='!'
+ cat >>confdefs.h <<_ACEOF
+#define ASM_LINE_SEP $libc_cv_asm_line_sep
+_ACEOF
+
+ ;;
+esac
diff --exclude CVS -uNr org/ports/sysdeps/m32r/setjmp.S ports/sysdeps/m32r/setjmp.S
--- org/ports/sysdeps/m32r/setjmp.S 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/setjmp.S 2004-10-25 10:35:22.000000000 +0900
@@ -0,0 +1,53 @@
+/* setjmp for M32R.
+ Copyright (C) 2003, 2004 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. */
+
+#include <sysdep.h>
+#define _SETJMP_H
+#define _ASM
+#include <bits/setjmp.h>
+
+ENTRY (__sigsetjmp)
+ mv r2, r0
+ /* Save registers */
+ st r8, @r0
+ st r9, @+r0
+ st r10, @+r0
+ st r11, @+r0
+ st r12, @+r0
+ st r13, @+r0
+ st r14, @+r0 /* lr */
+ st r15, @+r0 /* sp */
+ mv r0, r2
+
+ /* Make a tail call to __sigjmp_save; it takes the same args. */
+#ifdef SHARED
+ mv r2,lr
+ bl.s .+4
+ ld24 r3,#_GLOBAL_OFFSET_TABLE_
+ add r3,lr
+ mv lr,r2
+
+ ld24 r2,C_SYMBOL_NAME(__sigjmp_save)
+ add r2,r3
+ ld r2,@r2
+#else
+ LDIMM (r2, C_SYMBOL_NAME(__sigjmp_save))
+#endif
+ jmp r2
+END (__sigsetjmp)
diff --exclude CVS -uNr org/ports/sysdeps/m32r/shlib-versions ports/sysdeps/m32r/shlib-versions
--- org/ports/sysdeps/m32r/shlib-versions 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/shlib-versions 2004-10-25 11:19:06.000000000 +0900
@@ -0,0 +1,2 @@
+m32r.*-.*-linux.* DEFAULT GLIBC_2.3
+m32r.*-.*-linux.* ld=ld-linux.so.2
diff --exclude CVS -uNr org/ports/sysdeps/m32r/stackinfo.h ports/sysdeps/m32r/stackinfo.h
--- org/ports/sysdeps/m32r/stackinfo.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/stackinfo.h 2004-10-25 10:35:22.000000000 +0900
@@ -0,0 +1,28 @@
+/* Copyright (C) 2003, 2004 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. */
+
+/* This file contains a bit of information about the stack allocation
+ of the processor. */
+
+#ifndef _STACKINFO_H
+#define _STACKINFO_H 1
+
+/* On SH the stack grows down. */
+#define _STACK_GROWS_DOWN 1
+
+#endif /* stackinfo.h */
diff --exclude CVS -uNr org/ports/sysdeps/m32r/strlen.S ports/sysdeps/m32r/strlen.S
--- org/ports/sysdeps/m32r/strlen.S 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/strlen.S 2004-10-25 10:35:22.000000000 +0900
@@ -0,0 +1,77 @@
+/* Copyright (C) 2003, 2004 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. */
+
+#include <sysdep.h>
+#include <endian.h>
+
+/* size_t strlen (const char *s) */
+
+ENTRY(strlen)
+ mv r6, r0
+ ldi r2, #0
+ and3 r0, r0, #3
+ bnez r0, strlen_byte
+;
+strlen_word:
+ ld r0, @r6+
+;
+ seth r5, #high(0x01010101)
+ or3 r5, r5, #low(0x01010101)
+ sll3 r7, r5, #7
+strlen_word_loop:
+ ld r1, @r6+
+ not r4, r0 ; NOTE: If a null char. exists, return 0.
+ sub r0, r5 ; if ((x - 0x01010101) & ~x & 0x80808080)
+ and r4, r7 ; return 0;
+ and r4, r0
+ bnez r4, strlen_last_bytes
+ addi r2, #4
+;
+ ld r0, @r6+
+ not r4, r1 ; NOTE: If a null char. exists, return 0.
+ sub r1, r5 ; if ((x - 0x01010101) & ~x & 0x80808080)
+ and r4, r7 ; return 0;
+ and r4, r1
+ bnez r4, strlen_last_bytes
+ addi r2, #4
+ bra strlen_word_loop
+;
+strlen_byte:
+ ldb r1, @r6
+ addi r6, #1
+ beqz r1, strlen_exit
+ addi r2, #1
+ bra strlen_byte
+;
+strlen_last_bytes:
+ ldi r0, #4
+ addi r6, #-8
+;
+strlen_byte_loop:
+ ldb r1, @r6
+ addi r6, #1
+ addi r0, #-1
+ beqz r1, strlen_exit
+ addi r2, #1
+ bnez r0, strlen_byte_loop
+;
+strlen_exit:
+ mv r0, r2
+ jmp r14
+END(strlen)
+libc_hidden_builtin_def (strlen)
diff --exclude CVS -uNr org/ports/sysdeps/m32r/sys/ucontext.h ports/sysdeps/m32r/sys/ucontext.h
--- org/ports/sysdeps/m32r/sys/ucontext.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/sys/ucontext.h 2004-10-25 10:35:22.000000000 +0900
@@ -0,0 +1,102 @@
+/* Copyright (C) 2003, 2004 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_UCONTEXT_H
+#define _SYS_UCONTEXT_H 1
+
+#include <features.h>
+#include <signal.h>
+
+typedef int greg_t;
+
+/* Number of general registers. */
+#define NGREG 16
+
+/* Container for all general registers. */
+typedef greg_t gregset_t[NGREG];
+
+/* Number of each register is the `gregset_t' array. */
+enum
+{
+ R0 = 0,
+#define R0 R0
+ R1 = 1,
+#define R1 R1
+ R2 = 2,
+#define R2 R2
+ R3 = 3,
+#define R3 R3
+ R4 = 4,
+#define R4 R4
+ R5 = 5,
+#define R5 R5
+ R6 = 6,
+#define R6 R6
+ R7 = 7,
+#define R7 R7
+ R8 = 8,
+#define R8 R8
+ R9 = 9,
+#define R9 R9
+ R10 = 10,
+#define R10 R10
+ R11 = 11,
+#define R11 R11
+ R12 = 12,
+#define R12 R12
+ R13 = 13,
+#define R13 R13
+ R14 = 14,
+#define R14 R14
+ R15 = 15,
+#define R15 R15
+};
+
+#if 0
+/* FIXME */
+typedef int freg_t;
+
+/* Number of FPU registers. */
+#define NFREG 16
+
+/* Structure to describe FPU registers. */
+typedef freg_t fpregset_t[NFREG];
+#endif
+
+/* Context to describe whole processor state. */
+typedef struct
+ {
+ gregset_t gregs;
+#if 0
+ fpregset_t fpregs;
+ fpregset_t xfpregs;
+#endif
+ } mcontext_t;
+
+/* Userlevel context. */
+typedef struct ucontext
+ {
+ unsigned long int uc_flags;
+ struct ucontext *uc_link;
+ __sigset_t uc_sigmask;
+ stack_t uc_stack;
+ mcontext_t uc_mcontext;
+ long int uc_filler[5];
+ } ucontext_t;
+
+#endif /* sys/ucontext.h */
diff --exclude CVS -uNr org/ports/sysdeps/m32r/sysdep.h ports/sysdeps/m32r/sysdep.h
--- org/ports/sysdeps/m32r/sysdep.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/m32r/sysdep.h 2004-10-25 10:35:22.000000000 +0900
@@ -0,0 +1,92 @@
+/* Assembler macros for M32R.
+ Copyright (C) 2003, 2004 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. */
+
+#include <sysdeps/generic/sysdep.h>
+
+#ifdef __ASSEMBLER__
+
+/* Syntactic details of assembler. */
+
+#ifdef HAVE_ELF
+
+#define ALIGNARG(log2) log2
+/* For ELF we need the `.type' directive to make shared libs work right. */
+#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,@##typearg
+#define ASM_SIZE_DIRECTIVE(name) .size name,.-name
+
+#define PLTJMP(_x) _x
+#define GOT(_x) _x
+
+#else
+
+#define ALIGNARG(log2) log2
+#define ASM_TYPE_DIRECTIVE(name,type) /* Nothing is specified. */
+#define ASM_SIZE_DIRECTIVE(name) /* Nothing is specified. */
+
+#define PLTJMP(_x) _x
+#define GOT(_x) _x
+
+#endif
+
+/* If compiled for profiling, call `mcount' at the start of each function. */
+#ifdef PROF
+#ifdef __PIC__
+#define CALL_MCOUNT \
+ push r14 ! \
+ ld24 r14,#mcount ! \
+ add r14,r12 ! \
+ ld r14,@r14 ! \
+ jl r14 ! \
+ pop r14
+#else
+#define CALL_MCOUNT \
+ push r14 ! \
+ seth r14,#high(mcount) ! \
+ or3 r14,r14,#low(mcount) ! \
+ jl r14 ! \
+ pop r14
+#endif
+#else
+#define CALL_MCOUNT /* Do nothing. */
+#endif
+
+#undef CALL_MCOUNT /* Do nothing. */
+#define CALL_MCOUNT /* Do nothing. */
+
+/* Define an entry point visible from C. */
+#define ENTRY(name) \
+ ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name) ! \
+ ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),function) ! \
+ .balign 4 ! \
+ C_LABEL(name) ! \
+ CALL_MCOUNT
+
+#undef END
+#define END(name) \
+ ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(name))
+
+#ifdef NO_UNDERSCORES
+/* Since C identifiers are not normally prefixed with an underscore
+ on this system, the asm identifier `syscall_error' intrudes on the
+ C name space. Make sure we use an innocuous name. */
+#define syscall_error __syscall_error
+#define mcount _mcount
+#endif
+
+#endif /* __ASSEMBLER__ */
diff --exclude CVS -uNr org/ports/sysdeps/unix/m32r/Makefile ports/sysdeps/unix/m32r/Makefile
--- org/ports/sysdeps/unix/m32r/Makefile 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/m32r/Makefile 2004-10-25 10:36:18.000000000 +0900
@@ -0,0 +1,4 @@
+# m32r/ELF specific definitions.
+
+# The assembler on m32r needs the -fPIC flag even when it's assembler code.
+ASFLAGS-.os = -fPIC
diff --exclude CVS -uNr org/ports/sysdeps/unix/m32r/sysdep.S ports/sysdeps/unix/m32r/sysdep.S
--- org/ports/sysdeps/unix/m32r/sysdep.S 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/m32r/sysdep.S 2004-10-25 10:36:18.000000000 +0900
@@ -0,0 +1,76 @@
+/* Copyright (C) 2003, 2004 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. */
+
+#include <sysdep.h>
+#define _ERRNO_H
+#include <bits/errno.h>
+
+ENTRY(__syscall_error)
+#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN
+ /* We translate the system's EWOULDBLOCK error into EAGAIN.
+ The GNU C library always defines EWOULDBLOCK==EAGAIN.
+ EWOULDBLOCK_sys is the original number. */
+ ldi r1, #EWOULDBLOCK_sys
+ bne r1, r0, skip
+ ldi r0, #EAGAIN
+skip:
+#endif
+ /* Store it in errno... */
+#ifndef SHARED
+#ifndef _LIBC_REENTRANT
+ LDIMM (r1, C_SYMBOL_NAME(errno))
+ st r0, @r1
+#else
+ push r0
+ push lr
+ LDIMM (r1, C_SYMBOL_NAME(__errno_location))
+ jl r1
+ pop lr
+ pop r1
+ st r1, @r0
+#endif
+#else
+ push r12
+ push lr
+ bl.s .+4
+ ld24 r12,#_GLOBAL_OFFSET_TABLE_
+ add r12, lr
+#ifndef _LIBC_REENTRANT
+ mv r2, r0
+ LDIMM (r1, C_SYMBOL_NAME(errno))
+ add r1, r12
+ ld r1, @r1
+ st r2, @r1
+#else
+ push r0
+ LDIMM (r1, C_SYMBOL_NAME(__errno_location))
+ add r1, r12
+ ld r1, @r1
+ jl r1
+ pop r1
+ st r1, @r0
+#endif
+ pop lr
+ pop r12
+#endif
+ /* And just kick back a -1. */
+ ldi r0, #-1
+ ret
+END(__syscall_error)
+
+weak_alias (__syscall_error, syscall_error)
diff --exclude CVS -uNr org/ports/sysdeps/unix/m32r/sysdep.h ports/sysdeps/unix/m32r/sysdep.h
--- org/ports/sysdeps/unix/m32r/sysdep.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/m32r/sysdep.h 2004-10-25 10:36:18.000000000 +0900
@@ -0,0 +1,33 @@
+/* Copyright (C) 2003, 2004 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. */
+
+#include <sysdeps/unix/sysdep.h>
+#include "../../m32r/sysdep.h"
+
+#ifdef __ASSEMBLER__
+
+#define ret jmp r14
+
+/* The m32r move insn is d, s. */
+#define MOVE(x,y) mv y,x
+
+#define LDIMM(reg,x) \
+ seth reg, #high(x) ! \
+ or3 reg, reg, #low(x)
+
+#endif
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/am33/linuxthreads/sysdep-cancel.h ports/sysdeps/unix/sysv/linux/am33/linuxthreads/sysdep-cancel.h
--- org/ports/sysdeps/unix/sysv/linux/am33/linuxthreads/sysdep-cancel.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/am33/linuxthreads/sysdep-cancel.h 2004-10-23 09:33:35.000000000 +0900
@@ -0,0 +1,159 @@
+/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Alexandre Oliva <aoliva@redhat.com>
+
+ 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. */
+
+#include <sysdep.h>
+#include <tls.h>
+#include <pt-machine.h>
+#ifndef __ASSEMBLER__
+# include <linuxthreads/internals.h>
+#endif
+
+#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
+
+# undef PSEUDO
+# define PSEUDO(name, syscall_name, args) \
+ .text ; \
+ ENTRY (name) \
+ PUSHARGS_##args \
+ DOARGS_##args \
+ SINGLE_THREAD_P; \
+ bne L(pseudo_cancel); \
+ mov SYS_ify (syscall_name),d0; \
+ syscall 0 \
+ POPARGS_##args ; \
+ cmp -126,d0; \
+ bls L(pseudo_end); \
+ jmp SYSCALL_ERROR_LABEL; \
+ L(pseudo_cancel): \
+ add -(16+STACK_SPACE (args)),sp; \
+ SAVE_ARGS_##args \
+ CENABLE \
+ mov d0,r0; \
+ LOAD_ARGS_##args \
+ mov SYS_ify (syscall_name),d0; \
+ syscall 0; \
+ mov d0,(12,sp); \
+ mov r0,d0; \
+ CDISABLE \
+ mov (12,sp),d0; \
+ add +16+STACK_SPACE (args),sp \
+ POPARGS_##args ; \
+ cmp -126,d0; \
+ bls L(pseudo_end); \
+ jmp SYSCALL_ERROR_LABEL; \
+ L(pseudo_end): \
+ mov d0,a0
+
+/* Reserve up to 2 stack slots for a0 and d1, but fewer than that if
+ we don't have that many arguments. */
+# define STACK_SPACE(n) (((((n) < 3) * (2 - (n))) + 2) * 4)
+
+# define SAVE_ARGS_0
+# define SAVE_ARGS_1 mov a0,(20,sp) ;
+# define SAVE_ARGS_2 SAVE_ARGS_1 mov d1,(24,sp) ;
+# define SAVE_ARGS_3 SAVE_ARGS_2
+# define SAVE_ARGS_4 SAVE_ARGS_3
+# define SAVE_ARGS_5 SAVE_ARGS_4
+# define SAVE_ARGS_6 SAVE_ARGS_5
+
+# define LOAD_ARGS_0
+# define LOAD_ARGS_1 mov (20,sp),a0 ;
+# define LOAD_ARGS_2 LOAD_ARGS_1 mov (24,sp),d1 ;
+# define LOAD_ARGS_3 LOAD_ARGS_2
+# define LOAD_ARGS_4 LOAD_ARGS_3
+# define LOAD_ARGS_5 LOAD_ARGS_4
+# define LOAD_ARGS_6 LOAD_ARGS_5
+
+# ifdef IS_IN_libpthread
+# define CENABLE call __pthread_enable_asynccancel,[],0;
+# define CDISABLE call __pthread_disable_asynccancel,[],0;
+# elif defined IS_IN_librt
+# ifdef PIC
+# define CENABLE movm [a2],(sp); \
+ 1: mov pc,a2; \
+ add _GLOBAL_OFFSET_TABLE_-(1b-.),a2; \
+ call +__librt_enable_asynccancel@PLT,[],0; \
+ movm (sp),[a2];
+# define CENABLE movm [a2],(sp); \
+ 1: mov pc,a2; \
+ add _GLOBAL_OFFSET_TABLE_-(1b-.),a2; \
+ call +__librt_disable_asynccancel@PLT,[],0; \
+ movm (sp),[a2];
+# else
+# define CENABLE call +__librt_enable_asynccancel,[],0;
+# define CDISABLE call +__librt_disable_asynccancel,[],0;
+# endif
+# else
+# define CENABLE call +__libc_enable_asynccancel,[],0;
+# define CDISABLE call +__libc_disable_asynccancel,[],0;
+# endif
+
+#if !defined NOT_IN_libc
+# define __local_multiple_threads __libc_multiple_threads
+#elif defined IS_IN_libpthread
+# define __local_multiple_threads __pthread_multiple_threads
+#else
+# define __local_multiple_threads __librt_multiple_threads
+#endif
+
+# ifndef __ASSEMBLER__
+# if defined FLOATING_STACKS && USE___THREAD && defined PIC
+# define SINGLE_THREAD_P \
+ __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
+ p_header.data.multiple_threads) == 0, 1)
+# else
+extern int __local_multiple_threads
+# if !defined NOT_IN_libc || defined IS_IN_libpthread
+ attribute_hidden;
+# else
+ ;
+# endif
+# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
+# endif
+# else
+# if !defined PIC
+# define SINGLE_THREAD_P \
+ mov (+__local_multiple_threads),d0; \
+ cmp 0,d0
+# elif !defined NOT_IN_libc || defined IS_IN_libpthread
+# define SINGLE_THREAD_P \
+ movm [a2],(sp); \
+ 1: mov pc,a2; \
+ add _GLOBAL_OFFSET_TABLE_-(1b-.),a2; \
+ mov (+__local_multiple_threads@GOTOFF,a2),d0; \
+ movm (sp),[a2]; \
+ cmp 0,d0
+# else
+# define SINGLE_THREAD_P \
+ movm [a2],(sp); \
+ 1: mov pc,a2; \
+ add _GLOBAL_OFFSET_TABLE_-(1b-.),a2; \
+ mov (+__local_multiple_threads@GOT,a2),a2; \
+ mov (a2),d0; \
+ movm (sp),[a2]; \
+ cmp 0,d0
+# endif
+# endif
+
+#elif !defined __ASSEMBLER__
+
+/* This code should never be used but we define it anyhow. */
+# define SINGLE_THREAD_P (1)
+
+#endif
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/linuxthreads/sysdep-cancel.h ports/sysdeps/unix/sysv/linux/linuxthreads/sysdep-cancel.h
--- org/ports/sysdeps/unix/sysv/linux/linuxthreads/sysdep-cancel.h 2004-10-23 09:33:35.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/linuxthreads/sysdep-cancel.h 1970-01-01 09:00:00.000000000 +0900
@@ -1,159 +0,0 @@
-/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Alexandre Oliva <aoliva@redhat.com>
-
- 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. */
-
-#include <sysdep.h>
-#include <tls.h>
-#include <pt-machine.h>
-#ifndef __ASSEMBLER__
-# include <linuxthreads/internals.h>
-#endif
-
-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
-
-# undef PSEUDO
-# define PSEUDO(name, syscall_name, args) \
- .text ; \
- ENTRY (name) \
- PUSHARGS_##args \
- DOARGS_##args \
- SINGLE_THREAD_P; \
- bne L(pseudo_cancel); \
- mov SYS_ify (syscall_name),d0; \
- syscall 0 \
- POPARGS_##args ; \
- cmp -126,d0; \
- bls L(pseudo_end); \
- jmp SYSCALL_ERROR_LABEL; \
- L(pseudo_cancel): \
- add -(16+STACK_SPACE (args)),sp; \
- SAVE_ARGS_##args \
- CENABLE \
- mov d0,r0; \
- LOAD_ARGS_##args \
- mov SYS_ify (syscall_name),d0; \
- syscall 0; \
- mov d0,(12,sp); \
- mov r0,d0; \
- CDISABLE \
- mov (12,sp),d0; \
- add +16+STACK_SPACE (args),sp \
- POPARGS_##args ; \
- cmp -126,d0; \
- bls L(pseudo_end); \
- jmp SYSCALL_ERROR_LABEL; \
- L(pseudo_end): \
- mov d0,a0
-
-/* Reserve up to 2 stack slots for a0 and d1, but fewer than that if
- we don't have that many arguments. */
-# define STACK_SPACE(n) (((((n) < 3) * (2 - (n))) + 2) * 4)
-
-# define SAVE_ARGS_0
-# define SAVE_ARGS_1 mov a0,(20,sp) ;
-# define SAVE_ARGS_2 SAVE_ARGS_1 mov d1,(24,sp) ;
-# define SAVE_ARGS_3 SAVE_ARGS_2
-# define SAVE_ARGS_4 SAVE_ARGS_3
-# define SAVE_ARGS_5 SAVE_ARGS_4
-# define SAVE_ARGS_6 SAVE_ARGS_5
-
-# define LOAD_ARGS_0
-# define LOAD_ARGS_1 mov (20,sp),a0 ;
-# define LOAD_ARGS_2 LOAD_ARGS_1 mov (24,sp),d1 ;
-# define LOAD_ARGS_3 LOAD_ARGS_2
-# define LOAD_ARGS_4 LOAD_ARGS_3
-# define LOAD_ARGS_5 LOAD_ARGS_4
-# define LOAD_ARGS_6 LOAD_ARGS_5
-
-# ifdef IS_IN_libpthread
-# define CENABLE call __pthread_enable_asynccancel,[],0;
-# define CDISABLE call __pthread_disable_asynccancel,[],0;
-# elif defined IS_IN_librt
-# ifdef PIC
-# define CENABLE movm [a2],(sp); \
- 1: mov pc,a2; \
- add _GLOBAL_OFFSET_TABLE_-(1b-.),a2; \
- call +__librt_enable_asynccancel@PLT,[],0; \
- movm (sp),[a2];
-# define CENABLE movm [a2],(sp); \
- 1: mov pc,a2; \
- add _GLOBAL_OFFSET_TABLE_-(1b-.),a2; \
- call +__librt_disable_asynccancel@PLT,[],0; \
- movm (sp),[a2];
-# else
-# define CENABLE call +__librt_enable_asynccancel,[],0;
-# define CDISABLE call +__librt_disable_asynccancel,[],0;
-# endif
-# else
-# define CENABLE call +__libc_enable_asynccancel,[],0;
-# define CDISABLE call +__libc_disable_asynccancel,[],0;
-# endif
-
-#if !defined NOT_IN_libc
-# define __local_multiple_threads __libc_multiple_threads
-#elif defined IS_IN_libpthread
-# define __local_multiple_threads __pthread_multiple_threads
-#else
-# define __local_multiple_threads __librt_multiple_threads
-#endif
-
-# ifndef __ASSEMBLER__
-# if defined FLOATING_STACKS && USE___THREAD && defined PIC
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- p_header.data.multiple_threads) == 0, 1)
-# else
-extern int __local_multiple_threads
-# if !defined NOT_IN_libc || defined IS_IN_libpthread
- attribute_hidden;
-# else
- ;
-# endif
-# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
-# endif
-# else
-# if !defined PIC
-# define SINGLE_THREAD_P \
- mov (+__local_multiple_threads),d0; \
- cmp 0,d0
-# elif !defined NOT_IN_libc || defined IS_IN_libpthread
-# define SINGLE_THREAD_P \
- movm [a2],(sp); \
- 1: mov pc,a2; \
- add _GLOBAL_OFFSET_TABLE_-(1b-.),a2; \
- mov (+__local_multiple_threads@GOTOFF,a2),d0; \
- movm (sp),[a2]; \
- cmp 0,d0
-# else
-# define SINGLE_THREAD_P \
- movm [a2],(sp); \
- 1: mov pc,a2; \
- add _GLOBAL_OFFSET_TABLE_-(1b-.),a2; \
- mov (+__local_multiple_threads@GOT,a2),a2; \
- mov (a2),d0; \
- movm (sp),[a2]; \
- cmp 0,d0
-# endif
-# endif
-
-#elif !defined __ASSEMBLER__
-
-/* This code should never be used but we define it anyhow. */
-# define SINGLE_THREAD_P (1)
-
-#endif
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/Dist ports/sysdeps/unix/sysv/linux/m32r/Dist
--- org/ports/sysdeps/unix/sysv/linux/m32r/Dist 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/Dist 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,9 @@
+clone.S
+pipe.S
+flushcache.S
+setresuid.c
+setresgid.c
+setfsuid.c
+setfsgid.c
+sys/io.h
+sys/user.h
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/Makefile ports/sysdeps/unix/sysv/linux/m32r/Makefile
--- org/ports/sysdeps/unix/sysv/linux/m32r/Makefile 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/Makefile 2004-10-25 12:55:02.000000000 +0900
@@ -0,0 +1,16 @@
+# m32r/ELF specific definitions.
+gnulib := -lgcc
+static-gnulib := -lgcc
+
+# The assembler on m32r needs the -fPIC flag even when it's assembler code.
+ASFLAGS-.os = -fPIC
+
+ifeq ($(subdir),io)
+sysdep_routines += pipe
+endif
+
+ifeq ($(subdir),misc)
+sysdep_routines += m32r-stub tas \
+ cachectl flushcache
+sysdep_headers += sys/io.h sys/tas.h sys/cachectl.h
+endif
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/Versions ports/sysdeps/unix/sysv/linux/m32r/Versions
--- org/ports/sysdeps/unix/sysv/linux/m32r/Versions 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/Versions 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,33 @@
+libc {
+ GLIBC_2.2 {
+ # functions used in other libraries
+ __xstat64; __fxstat64; __lxstat64;
+
+ # Needed by gcc
+ _flush_cache;
+
+ # a*
+ alphasort64;
+
+ # c*
+ cachectl; cacheflush;
+
+ # g*
+ glob64;
+
+ # New rlimit interface
+ getrlimit; setrlimit; getrlimit64;
+
+ # r*
+ readdir64; readdir64_r;
+
+ # s*
+ scandir64;
+
+ # t*
+ tas;
+
+ # v*
+ versionsort64;
+ }
+}
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/bits/fcntl.h ports/sysdeps/unix/sysv/linux/m32r/bits/fcntl.h
--- org/ports/sysdeps/unix/sysv/linux/m32r/bits/fcntl.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/bits/fcntl.h 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,155 @@
+/* O_*, F_*, FD_* bit values for Linux.
+ Copyright (C) 2003, 2004 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 _FCNTL_H
+# error "Never use <bits/fcntl.h> directly; include <fcntl.h> instead."
+#endif
+
+
+#include <sys/types.h>
+
+/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
+ located on an ext2 file system */
+#define O_ACCMODE 0003
+#define O_RDONLY 00
+#define O_WRONLY 01
+#define O_RDWR 02
+#define O_CREAT 0100 /* not fcntl */
+#define O_EXCL 0200 /* not fcntl */
+#define O_NOCTTY 0400 /* not fcntl */
+#define O_TRUNC 01000 /* not fcntl */
+#define O_APPEND 02000
+#define O_NONBLOCK 04000
+#define O_NDELAY O_NONBLOCK
+#define O_SYNC 010000
+#define O_FSYNC O_SYNC
+#define O_ASYNC 020000
+
+#ifdef __USE_GNU
+# define O_DIRECT 040000 /* Direct disk access. */
+# define O_DIRECTORY 0200000 /* Must be a directory. */
+# define O_NOFOLLOW 0400000 /* Do not follow links. */
+#endif
+
+/* For now Linux has synchronisity options for data and read operations.
+ We define the symbols here but let them do the same as O_SYNC since
+ this is a superset. */
+#if defined __USE_POSIX199309 || defined __USE_UNIX98
+# define O_DSYNC O_SYNC /* Synchronize data. */
+# define O_RSYNC O_SYNC /* Synchronize read operations. */
+#endif
+
+#ifdef __USE_LARGEFILE64
+# define O_LARGEFILE 0100000
+#endif
+
+/* Values for the second argument to `fcntl'. */
+#define F_DUPFD 0 /* Duplicate file descriptor. */
+#define F_GETFD 1 /* Get file descriptor flags. */
+#define F_SETFD 2 /* Set file descriptor flags. */
+#define F_GETFL 3 /* Get file status flags. */
+#define F_SETFL 4 /* Set file status flags. */
+#ifndef __USE_FILE_OFFSET64
+# define F_GETLK 5 /* Get record locking info. */
+# define F_SETLK 6 /* Set record locking info (non-blocking). */
+# define F_SETLKW 7 /* Set record locking info (blocking). */
+#else
+# define F_GETLK F_GETLK64 /* Get record locking info. */
+# define F_SETLK F_SETLK64 /* Set record locking info (non-blocking).*/
+# define F_SETLKW F_SETLKW64 /* Set record locking info (blocking). */
+#endif
+#define F_GETLK64 12 /* Get record locking info. */
+#define F_SETLK64 13 /* Set record locking info (non-blocking). */
+#define F_SETLKW64 14 /* Set record locking info (blocking). */
+
+#if defined __USE_BSD || defined __USE_XOPEN2K
+# define F_SETOWN 8 /* Get owner of socket (receiver of SIGIO). */
+# define F_GETOWN 9 /* Set owner of socket (receiver of SIGIO). */
+#endif
+
+#ifdef __USE_GNU
+# define F_SETSIG 10 /* Set number of signal to be sent. */
+# define F_GETSIG 11 /* Get number of signal to be sent. */
+#endif
+
+/* For F_[GET|SET]FL. */
+#define FD_CLOEXEC 1 /* actually anything with low bit set goes */
+
+/* For posix fcntl() and `l_type' field of a `struct flock' for lockf(). */
+#define F_RDLCK 0 /* Read lock. */
+#define F_WRLCK 1 /* Write lock. */
+#define F_UNLCK 2 /* Remove lock. */
+
+/* For old implementation of bsd flock(). */
+#define F_EXLCK 4 /* or 3 */
+#define F_SHLCK 8 /* or 4 */
+
+#ifdef __USE_BSD
+/* Operations for bsd flock(), also used by the kernel implementation. */
+# define LOCK_SH 1 /* shared lock */
+# define LOCK_EX 2 /* exclusive lock */
+# define LOCK_NB 4 /* or'd with one of the above to prevent
+ blocking */
+# define LOCK_UN 8 /* remove lock */
+#endif
+
+struct flock
+ {
+ short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */
+ short int l_whence; /* Where `l_start' is relative to (like `lseek'). */
+#ifndef __USE_FILE_OFFSET64
+ __off_t l_start; /* Offset where the lock begins. */
+ __off_t l_len; /* Size of the locked area; zero means until EOF. */
+#else
+ __off64_t l_start; /* Offset where the lock begins. */
+ __off64_t l_len; /* Size of the locked area; zero means until EOF. */
+#endif
+ __pid_t l_pid; /* Process holding the lock. */
+ };
+
+#ifdef __USE_LARGEFILE64
+struct flock64
+ {
+ short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */
+ short int l_whence; /* Where `l_start' is relative to (like `lseek'). */
+ __off64_t l_start; /* Offset where the lock begins. */
+ __off64_t l_len; /* Size of the locked area; zero means until EOF. */
+ __pid_t l_pid; /* Process holding the lock. */
+ };
+#endif
+
+/* Define some more compatibility macros to be backward compatible with
+ BSD systems which did not managed to hide these kernel macros. */
+#ifdef __USE_BSD
+# define FAPPEND O_APPEND
+# define FFSYNC O_FSYNC
+# define FASYNC O_ASYNC
+# define FNONBLOCK O_NONBLOCK
+# define FNDELAY O_NDELAY
+#endif /* Use BSD. */
+
+/* Advise to `posix_fadvise'. */
+#ifdef __USE_XOPEN2K
+# define POSIX_FADV_NORMAL 0 /* No further special treatment. */
+# define POSIX_FADV_RANDOM 1 /* Expect random page references. */
+# define POSIX_FADV_SEQUENTIAL 2 /* Expect sequential page references. */
+# define POSIX_FADV_WILLNEED 3 /* Will need these pages. */
+# define POSIX_FADV_DONTNEED 4 /* Don't need these pages. */
+# define POSIX_FADV_NOREUSE 5 /* Data will be accessed once. */
+#endif
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/bits/mman.h ports/sysdeps/unix/sysv/linux/m32r/bits/mman.h
--- org/ports/sysdeps/unix/sysv/linux/m32r/bits/mman.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/bits/mman.h 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,98 @@
+/* Definitions for POSIX memory map interface. Linux/M32R version.
+ Copyright (C) 2003, 2004 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_MMAN_H
+# error "Never include this file directly. Use <sys/mman.h> 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_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. */
+#define PROT_GROWSDOWN 0x01000000 /* Extend change to start of
+ growsdown vma (mprotect only). */
+#define PROT_GROWSUP 0x02000000 /* Extend change to start of
+ growsup vma (mprotect only). */
+
+
+/* Sharing types (must choose one and only one of these). */
+#define MAP_SHARED 0x01 /* Share changes. */
+#define MAP_PRIVATE 0x02 /* Changes are private. */
+#ifdef __USE_MISC
+# define MAP_TYPE 0x0f /* Mask for type of mapping. */
+#endif
+
+/* Other flags. */
+#define MAP_FIXED 0x10 /* Interpret addr exactly. */
+#ifdef __USE_MISC
+# define MAP_FILE 0
+# define MAP_ANONYMOUS 0x20 /* Don't use a file. */
+# define MAP_ANON MAP_ANONYMOUS
+#endif
+
+/* These are Linux-specific. */
+#ifdef __USE_MISC
+# define MAP_GROWSDOWN 0x0100 /* Stack-like segment. */
+# define MAP_DENYWRITE 0x0800 /* ETXTBSY */
+# define MAP_EXECUTABLE 0x1000 /* Mark it as an executable. */
+# define MAP_LOCKED 0x2000 /* Lock the mapping. */
+# define MAP_NORESERVE 0x4000 /* Don't check for reservations. */
+#endif
+
+/* Flags to `msync'. */
+#define MS_ASYNC 1 /* Sync memory asynchronously. */
+#define MS_SYNC 4 /* Synchronous memory sync. */
+#define MS_INVALIDATE 2 /* Invalidate the caches. */
+
+/* Flags for `mlockall'. */
+#define MCL_CURRENT 1 /* Lock all currently mapped pages. */
+#define MCL_FUTURE 2 /* Lock all additions to address
+ space. */
+
+/* Flags for `mremap'. */
+#ifdef __USE_GNU
+# define MREMAP_MAYMOVE 1
+#endif
+
+/* Advice to `madvise'. */
+#ifdef __USE_BSD
+# define MADV_NORMAL 0 /* No further special treatment. */
+# define MADV_RANDOM 1 /* Expect random page references. */
+# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */
+# define MADV_WILLNEED 3 /* Will need these pages. */
+# define MADV_DONTNEED 4 /* Don't need these pages. */
+#endif
+
+/* The POSIX people had to invent similar names for the same things. */
+#ifdef __USE_XOPEN2K
+# define POSIX_MADV_NORMAL 0 /* No further special treatment. */
+# define POSIX_MADV_RANDOM 1 /* Expect random page references. */
+# define POSIX_MADV_SEQUENTIAL 2 /* Expect sequential page references. */
+# define POSIX_MADV_WILLNEED 3 /* Will need these pages. */
+# define POSIX_MADV_DONTNEED 4 /* Don't need these pages. */
+#endif
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/bits/resource.h ports/sysdeps/unix/sysv/linux/m32r/bits/resource.h
--- org/ports/sysdeps/unix/sysv/linux/m32r/bits/resource.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/bits/resource.h 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,209 @@
+/* Bit values & structures for resource limits. Linux/M32R version.
+ Copyright (C) 2003, 2004 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 <bits/resource.h> directly; include <sys/resource.h> instead."
+#endif
+
+#include <bits/types.h>
+
+/* 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
+
+ /* Maximum number of file locks. */
+ RLIMIT_LOCKS = 10,
+#define RLIMIT_LOCKS RLIMIT_LOCKS
+
+ RLIMIT_NLIMITS = 11,
+ RLIM_NLIMITS = RLIMIT_NLIMITS
+#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 ((unsigned long int)(~0UL))
+#else
+# define RLIM_INFINITY 0xffffffffffffffffuLL
+#endif
+
+#ifdef __USE_LARGEFILE64
+# define RLIM64_INFINITY 0xffffffffffffffffuLL
+#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 <bits/time.h> /* 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 --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/brk.c ports/sysdeps/unix/sysv/linux/m32r/brk.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/brk.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/brk.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,50 @@
+/* brk system call for Linux/M32R.
+ Copyright (C) 2003, 2004 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. */
+
+#include <errno.h>
+#include <unistd.h>
+#include <sysdep.h>
+
+/* This must be initialized data because commons can't have aliases. */
+void *__curbrk = 0;
+
+int
+__brk (void *addr)
+{
+ void *newbrk;
+ register long r7 asm ("r7") = SYS_ify (brk);
+ register long r0 asm ("r0") = (long)addr;
+
+ asm volatile ("trap #0x2\n\t"
+ "mv %0,r0\n"
+ : "=r"(newbrk)
+ : "r" (r7), "r" (r0)
+ );
+
+ __curbrk = newbrk;
+
+ if (newbrk < addr)
+ {
+ __set_errno (ENOMEM);
+ return -1;
+ }
+
+ return 0;
+}
+weak_alias (__brk, brk)
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/chown.c ports/sysdeps/unix/sysv/linux/m32r/chown.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/chown.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/chown.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/m68k/chown.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/clone.S ports/sysdeps/unix/sysv/linux/m32r/clone.S
--- org/ports/sysdeps/unix/sysv/linux/m32r/clone.S 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/clone.S 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,70 @@
+/* Copyright (C) 2003, 2004 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. */
+
+/* clone() is even more special than fork() as it mucks with stacks
+ and invokes a function in the right context after its all over. */
+
+#include <sysdep.h>
+#define _ERRNO_H 1
+#include <bits/errno.h>
+
+/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */
+
+ .text
+ENTRY(__clone)
+ /* sanity check arguments. */
+ beqz r0, 1f
+ bnez r1, 2f
+
+ .fillinsn
+1:
+ ldi r0, #-EINVAL
+ SYSCALL_ERROR_HANDLER
+ .fillinsn
+2:
+ /* insert the args onto the new stack */
+ st r3, @-r1
+ /* save the function pointer as the 0th element */
+ st r0, @-r1
+
+ /* do the system call */
+ mv r0, r2
+ ldi r7, #SYS_ify(clone)
+ SYSCALL_INST
+ not r1, r0
+ srai r1, #12 // r1=0 means r0 = -1 to -4095
+ bnez r1, 3f // i.e. error in linux
+
+ SYSCALL_ERROR_HANDLER
+ .fillinsn
+3:
+ beqz r0, 4f
+ ret
+ .fillinsn
+4:
+ /* thread starts */
+ ld r1, @r15
+ ld r0, @(4,r15)
+ jl r1
+
+ /* we are done, passing the return value through r0 */
+ SYSCALL_ERROR_HANDLER
+
+PSEUDO_END (__clone)
+
+weak_alias (__clone, clone)
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/fchown.c ports/sysdeps/unix/sysv/linux/m32r/fchown.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/fchown.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/fchown.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/fchown.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/fcntl.c ports/sysdeps/unix/sysv/linux/m32r/fcntl.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/fcntl.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/fcntl.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/flushcache.S ports/sysdeps/unix/sysv/linux/m32r/flushcache.S
--- org/ports/sysdeps/unix/sysv/linux/m32r/flushcache.S 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/flushcache.S 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,29 @@
+/* Copyright (C) 2003, 2004 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. */
+
+#include <sysdep.h>
+
+/* int _flush_cache(char *addr, int nbytes, int cache); */
+
+ .text
+ENTRY(__flush_cache)
+ trap #12
+ ret
+PSEUDO_END (__flush_cache)
+
+weak_alias (__flush_cache, _flush_cache)
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/fxstat.c ports/sysdeps/unix/sysv/linux/m32r/fxstat.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/fxstat.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/fxstat.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/fxstat.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/getegid.c ports/sysdeps/unix/sysv/linux/m32r/getegid.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/getegid.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/getegid.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getegid.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/geteuid.c ports/sysdeps/unix/sysv/linux/m32r/geteuid.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/geteuid.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/geteuid.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/geteuid.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/getgroups.c ports/sysdeps/unix/sysv/linux/m32r/getgroups.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/getgroups.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/getgroups.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,2 @@
+/* We also have to rewrite the kernel gid_t to the user land type. */
+#include <sysdeps/unix/sysv/linux/i386/getgroups.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/getresgid.c ports/sysdeps/unix/sysv/linux/m32r/getresgid.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/getresgid.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/getresgid.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getresgid.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/getresuid.c ports/sysdeps/unix/sysv/linux/m32r/getresuid.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/getresuid.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/getresuid.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getresuid.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/getrlimit.c ports/sysdeps/unix/sysv/linux/m32r/getrlimit.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/getrlimit.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/getrlimit.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getrlimit.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/getrlimit64.c ports/sysdeps/unix/sysv/linux/m32r/getrlimit64.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/getrlimit64.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/getrlimit64.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getrlimit64.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/getuid.c ports/sysdeps/unix/sysv/linux/m32r/getuid.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/getuid.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/getuid.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/getuid.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/lchown.c ports/sysdeps/unix/sysv/linux/m32r/lchown.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/lchown.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/lchown.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/lchown.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/lockf64.c ports/sysdeps/unix/sysv/linux/m32r/lockf64.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/lockf64.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/lockf64.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/lockf64.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/lxstat.c ports/sysdeps/unix/sysv/linux/m32r/lxstat.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/lxstat.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/lxstat.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,2 @@
+#include <sysdeps/unix/sysv/linux/i386/lxstat.c>
+
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/m32r-stub.c ports/sysdeps/unix/sysv/linux/m32r/m32r-stub.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/m32r-stub.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/m32r-stub.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,11 @@
+#include <elf/link.h>
+
+struct link_map _dl_rtld_map;
+
+#ifndef __PIC__
+void __pthread_initialize_minimal(void)
+{
+}
+#endif
+
+
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/mmap.S ports/sysdeps/unix/sysv/linux/m32r/mmap.S
--- org/ports/sysdeps/unix/sysv/linux/m32r/mmap.S 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/mmap.S 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,53 @@
+/* Copyright (C) 2003, 2004 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. */
+
+#include <sysdep.h>
+
+/*
+__ptr_t
+__mmap (__ptr_t addr, size_t len, int prot, int flags, int fd, off_t offset);
+*/
+
+ENTRY (__mmap)
+ /* Push args and pass the address of 1st arg.
+ * The 5th and 6th args are already passed in the stack.
+ */
+ ld r4, @sp // fd
+ ld r5, @(4,sp) // offset
+ and3 r6, r5, #0x00000fff
+ bnez r6, 0f
+ srli r5, #12
+
+ ldi r7, #__NR_mmap2
+ SYSCALL_INST
+
+ .fillinsn
+0:
+ not r1, r0
+ srai r1, #12 // r1=0 means r0 = -1 to -4095
+ bnez r1, 1f // i.e. error in linux
+
+ SYSCALL_ERROR_HANDLER
+
+ .fillinsn
+1:
+ ret
+
+PSEUDO_END (__mmap)
+
+weak_alias (__mmap, mmap)
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/msgctl.c ports/sysdeps/unix/sysv/linux/m32r/msgctl.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/msgctl.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/msgctl.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/msgctl.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/pipe.S ports/sysdeps/unix/sysv/linux/m32r/pipe.S
--- org/ports/sysdeps/unix/sysv/linux/m32r/pipe.S 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/pipe.S 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,37 @@
+/* Copyright (C) 2003, 2004 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. */
+
+#include <sysdep.h>
+
+ENTRY (__libc_pipe)
+ ldi r7, #__NR_pipe
+ SYSCALL_INST
+ not r1, r0
+ srai r1, #12 // r1=0 means r0 = -1 to -4095
+ bnez r1, 1f // i.e. error in linux
+
+ SYSCALL_ERROR_HANDLER
+ .fillinsn
+1:
+ ldi r0, #0
+ ret
+PSEUDO_END (__libc_pipe)
+
+weak_alias (__libc_pipe, __pipe)
+libc_hidden_def (__pipe)
+weak_alias (__libc_pipe, pipe)
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/profil-counter.h ports/sysdeps/unix/sysv/linux/m32r/profil-counter.h
--- org/ports/sysdeps/unix/sysv/linux/m32r/profil-counter.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/profil-counter.h 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,29 @@
+/* Low-level statistical profiling support function. Linux/M32R version.
+ Copyright (C) 2003, 2004 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. */
+
+#include <signal.h>
+#include <sigcontextinfo.h>
+
+static void
+profil_counter (int signo, SIGCONTEXT sc)
+{
+ void *pc;
+ pc = GET_PC(sc);
+ profil_count (pc);
+}
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/semctl.c ports/sysdeps/unix/sysv/linux/m32r/semctl.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/semctl.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/semctl.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/semctl.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/setegid.c ports/sysdeps/unix/sysv/linux/m32r/setegid.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/setegid.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/setegid.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setegid.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/seteuid.c ports/sysdeps/unix/sysv/linux/m32r/seteuid.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/seteuid.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/seteuid.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/seteuid.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/setfsgid.c ports/sysdeps/unix/sysv/linux/m32r/setfsgid.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/setfsgid.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/setfsgid.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setfsgid.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/setfsuid.c ports/sysdeps/unix/sysv/linux/m32r/setfsuid.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/setfsuid.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/setfsuid.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setfsuid.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/setgid.c ports/sysdeps/unix/sysv/linux/m32r/setgid.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/setgid.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/setgid.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setgid.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/setgroups.c ports/sysdeps/unix/sysv/linux/m32r/setgroups.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/setgroups.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/setgroups.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,2 @@
+/* We also have to rewrite the kernel gid_t to the user land type. */
+#include <sysdeps/unix/sysv/linux/i386/setgroups.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/setregid.c ports/sysdeps/unix/sysv/linux/m32r/setregid.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/setregid.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/setregid.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setregid.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/setresgid.c ports/sysdeps/unix/sysv/linux/m32r/setresgid.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/setresgid.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/setresgid.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setresgid.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/setresuid.c ports/sysdeps/unix/sysv/linux/m32r/setresuid.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/setresuid.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/setresuid.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setresuid.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/setreuid.c ports/sysdeps/unix/sysv/linux/m32r/setreuid.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/setreuid.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/setreuid.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setreuid.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/setrlimit.c ports/sysdeps/unix/sysv/linux/m32r/setrlimit.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/setrlimit.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/setrlimit.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setrlimit.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/setuid.c ports/sysdeps/unix/sysv/linux/m32r/setuid.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/setuid.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/setuid.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/setuid.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/shmctl.c ports/sysdeps/unix/sysv/linux/m32r/shmctl.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/shmctl.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/shmctl.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/shmctl.c>
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/sigcontextinfo.h ports/sysdeps/unix/sysv/linux/m32r/sigcontextinfo.h
--- org/ports/sysdeps/unix/sysv/linux/m32r/sigcontextinfo.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/sigcontextinfo.h 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,26 @@
+/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Philip Blundell <philb@gnu.org>, 1999.
+
+ 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 SIGCONTEXT struct sigcontext *
+#define SIGCONTEXT_EXTRA_ARGS
+#define GET_PC(ctx) ((void *)((ctx)->sc_bpc))
+#define GET_FRAME(ctx) ((void *)((ctx)->sc_fp))
+#define GET_STACK(ctx) ((void *)((ctx)->sc_spi))
+#define CALL_SIGHANDLER(handler, signo, ctx) \
+ (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx))
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/socket.S ports/sysdeps/unix/sysv/linux/m32r/socket.S
--- org/ports/sysdeps/unix/sysv/linux/m32r/socket.S 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/socket.S 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,114 @@
+/* Copyright (C) 2003, 2004 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. */
+
+#include <sysdep.h>
+#include <socketcall.h>
+
+#define P(a, b) P2(a, b)
+#define P2(a, b) a##b
+
+ .text
+/* The socket-oriented system calls are handled unusally in Linux.
+ They are all gated through the single `socketcall' system call number.
+ `socketcall' takes two arguments: the first is the subcode, specifying
+ which socket function is being called; and the second is a pointer to
+ the arguments to the specific function.
+
+ The .S files for the other calls just #define socket and #include this. */
+
+#ifndef __socket
+#ifndef NO_WEAK_ALIAS
+#define __socket P(__,socket)
+#else
+#define __socket socket
+#endif
+#endif
+
+#define PUSHARGS(x) PUSHARGS x
+ .macro PUSHARGS nargs
+ push r0
+ .aif \nargs ge 2
+ push r1
+ .aif \nargs ge 3
+ push r2
+ .aif \nargs ge 4
+ push r3
+ /* If nargs is 5, caller has already pushed arg 5. */
+ /* If nargs is 6, caller has already pushed arg 5, 6. */
+ .aendi
+ .aendi
+ .aendi
+ .endm
+
+#define PUSHARGS(x) PUSHARGS x
+
+#define POPARGS_1 addi r15,#4
+#define POPARGS_2 addi r15,#8
+#define POPARGS_3 addi r15,#12
+#define POPARGS_4 addi r15,#16
+#define POPARGS_5 addi r15,#16
+#define POPARGS_6 addi r15,#16
+
+#ifndef NARGS
+#define NARGS 3 /* If we were called with no wrapper, this is really socket() */
+#endif
+
+.globl __socket
+ENTRY (__socket)
+ /* This will not work in the case of a socket call being interrupted
+ by a signal. If the signal handler uses any stack the arguments
+ to socket will be trashed. The results of a restart of any
+ socket call are then unpredictable. */
+
+ /* Push args onto the stack. */
+ /* PUSHARGS(NARGS) */
+#if (NARGS >= 4)
+ push r3
+ /* If nargs is 6, caller has already pushed arg 5, 6. */
+ /* If nargs is 5, caller has already pushed arg 5. */
+#endif
+#if (NARGS >= 3)
+ push r2
+#endif
+#if (NARGS >= 2)
+ push r1
+#endif
+ push r0
+
+ /* Do the system call trap. */
+ ldi r0, #P(SOCKOP_,socket)
+ mv r1, r15
+ ldi r7, #SYS_ify(socketcall)
+ SYSCALL_INST
+
+ /* Pop args off the stack */
+ P(POPARGS_,NARGS)
+
+ not r1, r0
+ srai r1, #12 // r1=0 means r0 = -1 to -4095
+ bnez r1, 1f // i.e. error in linux
+
+ SYSCALL_ERROR_HANDLER
+ .fillinsn
+1:
+ /* Successful; return the syscall's value. */
+ ret
+
+PSEUDO_END (__socket)
+
+weak_alias (__socket, socket)
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/sys/cachectl.h ports/sysdeps/unix/sysv/linux/m32r/sys/cachectl.h
--- org/ports/sysdeps/unix/sysv/linux/m32r/sys/cachectl.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/sys/cachectl.h 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,38 @@
+/* Copyright (C) 2003, 2004 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_CACHECTL_H
+#define _SYS_CACHECTL_H 1
+
+#include <features.h>
+
+/*
+ * Get the kernel definition for the op bits.
+ */
+#include <asm/cachectl.h>
+
+__BEGIN_DECLS
+
+#ifdef __USE_MISC
+extern int cacheflush (void *addr, __const int nbytes, __const int op) __THROW;
+#endif
+extern int _flush_cache (char *addr, __const int nbytes, __const int op) __THROW;
+
+__END_DECLS
+
+#endif /* sys/cachectl.h */
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/sys/io.h ports/sysdeps/unix/sysv/linux/m32r/sys/io.h
--- org/ports/sysdeps/unix/sysv/linux/m32r/sys/io.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/sys/io.h 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,48 @@
+/* Copyright (C) 2003, 2004 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_IO_H
+
+#define _SYS_IO_H 1
+#include <features.h>
+
+__BEGIN_DECLS
+
+/* If TURN_ON is TRUE, request for permission to do direct i/o on the
+ port numbers in the range [FROM,FROM+NUM-1]. Otherwise, turn I/O
+ permission off for that range. This call requires root privileges. */
+extern int ioperm (unsigned long int __from, unsigned long int __num,
+ int __turn_on) __THROW;
+
+/* Set the I/O privilege level to LEVEL. If LEVEL is nonzero,
+ permission to access any I/O port is granted. This call requires
+ root privileges. */
+extern int iopl (int __level) __THROW;
+
+/* The functions that actually perform reads and writes. */
+extern unsigned char inb (unsigned long int port) __THROW;
+extern unsigned short int inw (unsigned long int port) __THROW;
+extern unsigned long int inl (unsigned long int port) __THROW;
+
+extern void outb (unsigned char value, unsigned long int port) __THROW;
+extern void outw (unsigned short value, unsigned long int port) __THROW;
+extern void outl (unsigned long value, unsigned long int port) __THROW;
+
+__END_DECLS
+
+#endif /* _SYS_IO_H */
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/sys/tas.h ports/sysdeps/unix/sysv/linux/m32r/sys/tas.h
--- org/ports/sysdeps/unix/sysv/linux/m32r/sys/tas.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/sys/tas.h 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,13 @@
+#ifndef _SYS_TAS_H
+
+#define _SYS_TAS_H 1
+
+#include <features.h>
+
+__BEGIN_DECLS
+
+extern int tas(int *) __THROW;
+
+__END_DECLS
+
+#endif /* _SYS_TAS_H */
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/sys/ucontext.h ports/sysdeps/unix/sysv/linux/m32r/sys/ucontext.h
--- org/ports/sysdeps/unix/sysv/linux/m32r/sys/ucontext.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/sys/ucontext.h 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,111 @@
+/* Copyright (C) 2003, 2004 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. */
+
+/* Where is System V/SH ABI? */
+
+#ifndef _SYS_UCONTEXT_H
+#define _SYS_UCONTEXT_H 1
+
+#include <features.h>
+#include <signal.h>
+
+/* We need the signal context definitions even if they are not used
+ included in <signal.h>. */
+#include <bits/sigcontext.h>
+
+
+typedef int greg_t;
+
+/* Number of general registers. */
+#define NFPREG 16
+
+/* Container for all general registers. */
+typedef greg_t gregset_t[NFPREG];
+
+#if 0
+#ifdef __USE_GNU
+/* Number of each register is the `gregset_t' array. */
+enum
+{
+ R0 = 0,
+#define R0 R0
+ R1 = 1,
+#define R1 R1
+ R2 = 2,
+#define R2 R2
+ R3 = 3,
+#define R3 R3
+ R4 = 4,
+#define R4 R4
+ R5 = 5,
+#define R5 R5
+ R6 = 6,
+#define R6 R6
+ R7 = 7,
+#define R7 R7
+ R8 = 8,
+#define R8 R8
+ R9 = 9,
+#define R9 R9
+ R10 = 10,
+#define R10 R10
+ R11 = 11,
+#define R11 R11
+ R12 = 12,
+#define R12 R12
+ R13 = 13,
+#define R13 R13
+ R14 = 14,
+#define R14 R14
+ R15 = 15,
+#define R15 R15
+};
+#endif
+#endif /* 0 */
+
+typedef int freg_t;
+
+/* Number of FPU registers. */
+#define NFPREG 16
+
+/* Structure to describe FPU registers. */
+typedef freg_t fpregset_t[NFPREG];
+
+/* Context to describe whole processor state. */
+typedef struct
+ {
+ gregset_t gregs;
+ fpregset_t fpregs;
+ fpregset_t xfpregs;
+ unsigned int fpscr;
+ unsigned int fpul;
+ unsigned int macl;
+ unsigned int mach;
+ } mcontext_t;
+
+/* Userlevel context. */
+typedef struct ucontext
+ {
+ unsigned long int uc_flags;
+ struct ucontext *uc_link;
+ stack_t uc_stack;
+ mcontext_t uc_mcontext;
+ __sigset_t uc_sigmask;
+ } ucontext_t;
+
+#endif /* sys/ucontext.h */
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/sys/user.h ports/sysdeps/unix/sysv/linux/m32r/sys/user.h
--- org/ports/sysdeps/unix/sysv/linux/m32r/sys/user.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/sys/user.h 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,26 @@
+/* Copyright (C) 2003, 2004 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_USER_H
+#define _SYS_USER_H 1
+
+#include <features.h>
+
+#include <asm/user.h>
+
+#endif /* sys/user.h */
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/syscall.S ports/sysdeps/unix/sysv/linux/m32r/syscall.S
--- org/ports/sysdeps/unix/sysv/linux/m32r/syscall.S 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/syscall.S 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,41 @@
+/* Copyright (C) 2003, 2004 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. */
+
+#include <sysdep.h>
+
+ENTRY (__syscall)
+ mv r7, r0 // syscall number
+ mv r0, r1 // p1
+ mv r1, r2 // p2
+ mv r2, r3 // p3
+ ld r3, @(sp) // p4
+ ld r4, @(4,sp) // p5
+ ld r5, @(8,sp) // p6
+ ld r6, @(12,sp) // p7
+ SYSCALL_INST
+ not r1, r0
+ srai r1, #12 // r1=0 means r0 = -1 to -4095
+ bnez r1, 1f // i.e. error in linux
+
+ SYSCALL_ERROR_HANDLER
+ .fillinsn
+1:
+ ret
+PSEUDO_END (__syscall)
+
+weak_alias (__syscall, syscall)
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/syscalls.list ports/sysdeps/unix/sysv/linux/m32r/syscalls.list
--- org/ports/sysdeps/unix/sysv/linux/m32r/syscalls.list 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/syscalls.list 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,4 @@
+# File name Caller Syscall name # args Strong name Weak names
+tas - tas i:p __tas tas
+cachectl - cachectl i:pii __cachectl cachectl
+cacheflush - cacheflush i:pii __cacheflush cacheflush
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/sysdep.S ports/sysdeps/unix/sysv/linux/m32r/sysdep.S
--- org/ports/sysdeps/unix/sysv/linux/m32r/sysdep.S 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/sysdep.S 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,32 @@
+/* Copyright (C) 2003, 2004 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. */
+
+#include <sysdep.h>
+
+/* The syscall stubs jump here when they detect an error.
+ The code for Linux is almost identical to the canonical Unix
+ code, except that the error number in R0 is negated. */
+
+#undef CALL_MCOUNT
+#define CALL_MCOUNT /* Don't insert the profiling call, it clobbers R0. */
+
+ENTRY (__syscall_error)
+ neg r0, r0
+
+#define __syscall_error __syscall_error_1
+#include "../../../m32r/sysdep.S"
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/sysdep.h ports/sysdeps/unix/sysv/linux/m32r/sysdep.h
--- org/ports/sysdeps/unix/sysv/linux/m32r/sysdep.h 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/sysdep.h 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,294 @@
+/* Copyright (C) 2003, 2004 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 _LINUX_M32R_SYSDEP_H
+#define _LINUX_M32R_SYSDEP_H 1
+
+/* There is some commonality. */
+#include "../../../m32r/sysdep.h"
+
+/* Defines RTLD_PRIVATE_ERRNO. */
+#include <dl-sysdep.h>
+
+/* For Linux we can use the system call table in the header file
+ /usr/include/asm/unistd.h
+ of the kernel. But these symbols do not follow the SYS_* syntax
+ so we have to redefine the `SYS_ify' macro here. */
+#undef SYS_ify
+#define SYS_ify(syscall_name) __NR_##syscall_name
+
+#ifdef __ASSEMBLER__
+
+/* Linux uses a negative return value to indicate syscall errors,
+ unlike most Unices, which use the condition codes' carry flag.
+
+ Since version 2.1 the return value of a system call might be
+ negative even if the call succeeded. E.g., the `lseek' system call
+ might return a large offset. Therefore we must not anymore test
+ for < 0, but test for a real error by making sure the value in R0
+ is a real error number. Linus said he will make sure the no syscall
+ returns a value in -1 .. -4095 as a valid result so we can savely
+ test with -4095. */
+
+#define SYSCALL_INST trap #2
+#define SYSCALL_INST_0 trap #2
+#define SYSCALL_INST_1 trap #2
+#define SYSCALL_INST_2 trap #2
+#define SYSCALL_INST_3 trap #2
+#define SYSCALL_INST_4 trap #2
+#define SYSCALL_INST_5 \
+ ld r4,@sp ! \
+ trap #2
+#define SYSCALL_INST_STR_6 \
+ ld r4,@sp ! \
+ ld r5,@(4,sp) ! \
+ trap #2
+#define SYSCALL_INST_STR_7 \
+ ld r4,@sp ! \
+ ld r5,@(4,sp) ! \
+ ld r6,@(8,sp) ! \
+ trap #2
+
+#define DO_CALL( syscall_name, args ) \
+ ldi r7,SYS_ify(syscall_name) ! \
+ SYSCALL_INST_##args
+
+#undef PSEUDO
+#define PSEUDO(name, syscall_name, args) \
+ .text !\
+ENTRY (name) !\
+ DO_CALL (syscall_name, args) !\
+ not r1,r0 !\
+ srai r1,#12 !\
+ bnez r1,.Lpseudo_end !\
+ SYSCALL_ERROR_HANDLER !\
+ .fillinsn !\
+ .Lpseudo_end:
+
+#undef PSEUDO_END
+#define PSEUDO_END(name) \
+ END (name)
+
+#undef PSEUDO_NOERRNO
+#define PSEUDO_NOERRNO(name, syscall_name, args) \
+ .text !\
+ ENTRY (name) !\
+ DO_CALL (syscall_name, args)
+
+#undef PSEUDO_END_NOERRNO
+#define PSEUDO_END_NOERRNO(name) \
+ END (name)
+
+#define ret_NOERRNO ret
+
+#define PSEUDO_ERRVAL(name, syscall_name, args) \
+ .text !\
+ ENTRY (name) !\
+ DO_CALL (syscall_name, args)
+
+#undef PSEUDO_END_ERRVAL
+#define PSEUDO_END_ERRVAL(name) \
+ END (name)
+
+#define ret_ERRVAL ret
+
+#ifndef __PIC__
+# define SYSCALL_ERROR_HANDLER \
+ LDIMM (r1, C_SYMBOL_NAME(__syscall_error)) !\
+ jmp r1 !\
+
+#else
+# if RTLD_PRIVATE_ERRNO
+# define SYSCALL_ERROR_HANDLER \
+ neg r1,r0 !\
+ mv r3,lr !\
+ bl.s .+4 !\
+ ld24 r2,#_GLOBAL_OFFSET_TABLE_ !\
+ add r2,lr !\
+ mv lr,r3 !\
+ ld24 r0,#GOT(C_SYMBOL_NAME(rtld_errno)) !\
+ add r2,r0 !\
+ ld r2,@r2 !\
+ st r1,@r2 !\
+ ldi r0,#-1 !\
+ ret
+
+# elif defined _LIBC_REENTRANT
+
+# if USE___THREAD
+# ifndef NOT_IN_libc
+# define SYSCALL_ERROR_ERRNO __libc_errno
+# else
+# define SYSCALL_ERROR_ERRNO errno
+# endif
+# define SYSCALL_ERROR_HANDLER \
+ neg r1,r0 !\
+ mv r3,lr !\
+ bl.s .+4 !\
+ ld24 r2,#_GLOBAL_OFFSET_TABLE_ !\
+ add r2,lr !\
+ mv lr,r3 !\
+ ld24 r0,#GOT(C_SYMBOL_NAME(SYSCALL_ERROR_ERRNO)) !\
+ add r2,r0 !\
+ ld r2,@r2 !\
+ st r1,@r2 !\
+ ldi r0,#-1 !\
+ ret
+
+# else
+# define SYSCALL_ERROR_HANDLER \
+ neg r1,r0 !\
+ push r12 !\
+ push lr !\
+ push r1 !\
+ bl.s .+4 !\
+ ld24 r12,#_GLOBAL_OFFSET_TABLE_ !\
+ add r12,lr !\
+ ld24 r1,#GOT(C_SYMBOL_NAME(__errno_location)) !\
+ add r1,r12 !\
+ ld r1,@r1 !\
+ jl r1 !\
+ pop r1 !\
+ st r1,@r0 !\
+ pop lr !\
+ pop r12 !\
+ ldi r0,#-1 !\
+ ret !\
+
+# endif
+
+# else
+/* Store (-r0) into errno through the GOT. */
+# define SYSCALL_ERROR_HANDLER \
+ neg r1,r0 !\
+ mv r3,lr !\
+ bl.s .+4 !\
+ ld24 r2,#_GLOBAL_OFFSET_TABLE_ !\
+ add r2,lr !\
+ mv lr,r3 !\
+ ld24 r0,#GOT(C_SYMBOL_NAME(errno)) !\
+ add r2,r0 !\
+ ld r2,@r2 !\
+ st r1,@r2 !\
+ ldi r0,#-1 !\
+ ret
+
+# endif /* _LIBC_REENTRANT */
+#endif /* __PIC__ */
+
+#define ret_ERRVAL ret
+
+#else /* not __ASSEMBLER__ */
+
+#undef DO_CALL
+
+#define SYSCALL_INST_STR "trap #2\n\t"
+
+#define ASMFMT_0 \
+ , "0" (r0)
+#define ASMFMT_1 \
+ , "0" (r0)
+#define ASMFMT_2 \
+ , "0" (r0), "r" (r1)
+#define ASMFMT_3 \
+ , "0" (r0), "r" (r1), "r" (r2)
+#define ASMFMT_4 \
+ , "0" (r0), "r" (r1), "r" (r2), "r" (r3)
+#define ASMFMT_5 \
+ , "0" (r0), "r" (r1), "r" (r2), "r" (r3), "r" (r4)
+#define ASMFMT_6 \
+ , "0" (r0), "r" (r1), "r" (r2), "r" (r3), "r" (r4), "r" (r5)
+#define ASMFMT_7 \
+ , "0" (r0), "r" (r1), "r" (r2), "r" (r3), "r" (r4), "r" (r5), "r" (r6)
+
+#define SUBSTITUTE_ARGS_0() \
+ register long r0 asm ("r0") = 0
+#define SUBSTITUTE_ARGS_1(arg1) \
+ register long r0 asm ("r0") = (long)(arg1)
+#define SUBSTITUTE_ARGS_2(arg1, arg2) \
+ register long r0 asm ("r0") = (long)(arg1); \
+ register long r1 asm ("r1") = (long)(arg2)
+#define SUBSTITUTE_ARGS_3(arg1, arg2, arg3) \
+ register long r0 asm ("r0") = (long)(arg1); \
+ register long r1 asm ("r1") = (long)(arg2); \
+ register long r2 asm ("r2") = (long)(arg3)
+#define SUBSTITUTE_ARGS_4(arg1, arg2, arg3, arg4) \
+ register long r0 asm ("r0") = (long)(arg1); \
+ register long r1 asm ("r1") = (long)(arg2); \
+ register long r2 asm ("r2") = (long)(arg3); \
+ register long r3 asm ("r3") = (long)(arg4)
+#define SUBSTITUTE_ARGS_5(arg1, arg2, arg3, arg4, arg5) \
+ register long r0 asm ("r0") = (long)(arg1); \
+ register long r1 asm ("r1") = (long)(arg2); \
+ register long r2 asm ("r2") = (long)(arg3); \
+ register long r3 asm ("r3") = (long)(arg4); \
+ register long r4 asm ("r4") = (long)(arg5)
+#define SUBSTITUTE_ARGS_6(arg1, arg2, arg3, arg4, arg5, arg6) \
+ register long r0 asm ("r0") = (long)(arg1); \
+ register long r1 asm ("r1") = (long)(arg2); \
+ register long r2 asm ("r2") = (long)(arg3); \
+ register long r3 asm ("r3") = (long)(arg4); \
+ register long r4 asm ("r4") = (long)(arg5); \
+ register long r5 asm ("r5") = (long)(arg6)
+#define SUBSTITUTE_ARGS_7(arg1, arg2, arg3, arg4, arg5, arg6, arg7) \
+ register long r0 asm ("r0") = (long)(arg1); \
+ register long r1 asm ("r1") = (long)(arg2); \
+ register long r2 asm ("r2") = (long)(arg3); \
+ register long r3 asm ("r3") = (long)(arg4); \
+ register long r4 asm ("r4") = (long)(arg5); \
+ register long r5 asm ("r5") = (long)(arg6); \
+ register long r6 asm ("r6") = (long)(arg7)
+
+#undef INLINE_SYSCALL
+#define INLINE_SYSCALL(name, nr, args...) \
+ ({ \
+ unsigned int resultvar = INTERNAL_SYSCALL (name, , nr, args); \
+ if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (resultvar, ), 0)) \
+ { \
+ __set_errno (INTERNAL_SYSCALL_ERRNO (resultvar, )); \
+ resultvar = 0xffffffff; \
+ } \
+ (int) resultvar; })
+
+#undef INTERNAL_SYSCALL
+#define INTERNAL_SYSCALL(name, err, nr, args...) \
+ ({ \
+ register long r7 asm ("r7") = SYS_ify (name); \
+ SUBSTITUTE_ARGS_##nr(args); \
+ \
+ asm volatile (SYSCALL_INST_STR "\n\t" \
+ : "=r" (r0) \
+ : "r" (r7) ASMFMT_##nr \
+ : "memory"); \
+ \
+ (int) r0; })
+
+#undef INTERNAL_SYSCALL_DECL
+#define INTERNAL_SYSCALL_DECL(err) do { } while (0)
+
+#undef INTERNAL_SYSCALL_ERROR_P
+#define INTERNAL_SYSCALL_ERROR_P(val, err) \
+ ((unsigned int) (val) >= 0xfffff001u)
+
+#undef INTERNAL_SYSCALL_ERRNO
+#define INTERNAL_SYSCALL_ERRNO(val, err) (-(val))
+
+#endif /* __ASSEMBLER__ */
+
+#endif /* linux/m32r/sysdep.h */
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/vfork.S ports/sysdeps/unix/sysv/linux/m32r/vfork.S
--- org/ports/sysdeps/unix/sysv/linux/m32r/vfork.S 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/vfork.S 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1,65 @@
+/* Copyright (C) 2003, 2004 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. */
+
+#include <sysdep.h>
+#define _ERRNO_H 1
+#include <bits/errno.h>
+
+/* Clone the calling process, but without copying the whole address space.
+ The calling process is suspended until the new process exits or is
+ replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
+ and the process ID of the new process to the old process. */
+
+ENTRY (__vfork)
+
+#ifdef __NR_vfork
+ ldi r7, #__NR_vfork
+ SYSCALL_INST
+ not r1, r0
+ srai r1, #12 // r1=0 means r0 = -1 to -4095
+ bnez r1, 1f // i.e. error in linux
+
+ /* Check if vfork syscall is known at all. */
+ ldi r1, #-ENOSYS
+ beq r0, r1, 2f
+ bra vfork_error
+ .fillinsn
+1:
+ ret
+ .fillinsn
+2:
+#endif
+
+ /* If we don't have vfork, fork is close enough. */
+ ldi r7, #__NR_fork
+ SYSCALL_INST
+ not r1, r0
+ srai r1, #12 // r1=0 means r0 = -1 to -4095
+ bnez r1, 4f // i.e. error in linux
+vfork_error:
+
+ SYSCALL_ERROR_HANDLER
+
+ .fillinsn
+4:
+ ret
+
+PSEUDO_END (__vfork)
+libc_hidden_def(__vfork)
+
+weak_alias (__vfork, vfork)
diff --exclude CVS -uNr org/ports/sysdeps/unix/sysv/linux/m32r/xstat.c ports/sysdeps/unix/sysv/linux/m32r/xstat.c
--- org/ports/sysdeps/unix/sysv/linux/m32r/xstat.c 1970-01-01 09:00:00.000000000 +0900
+++ ports/sysdeps/unix/sysv/linux/m32r/xstat.c 2004-10-25 10:37:43.000000000 +0900
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/xstat.c>