]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
2000-02-01 Andreas Jaeger <aj@suse.de>
authorAndreas Jaeger <aj@suse.de>
Tue, 1 Feb 2000 11:54:37 +0000 (11:54 +0000)
committerAndreas Jaeger <aj@suse.de>
Tue, 1 Feb 2000 11:54:37 +0000 (11:54 +0000)
* sysdeps/unix/sysv/linux/mips/init-first.h: New file, from Ralf
Baechle <ralf@gnu.org>.

* sysdeps/unix/sysv/linux/mips/brk.c: New file.

sysdeps/unix/sysv/linux/mips/brk.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/mips/init-first.h [new file with mode: 0644]

diff --git a/sysdeps/unix/sysv/linux/mips/brk.c b/sysdeps/unix/sysv/linux/mips/brk.c
new file mode 100644 (file)
index 0000000..ce85617
--- /dev/null
@@ -0,0 +1,56 @@
+/* brk system call for Linux/MIPS.
+   Copyright (C) 2000 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>
+
+void *__curbrk = 0;
+
+/* Old braindamage in GCC's crtstuff.c requires this symbol in an attempt
+   to work around different old braindamage in the old Linux/x86 ELF
+   dynamic linker.  Sigh.  */
+weak_alias (__curbrk, ___brk_addr)
+
+int
+__brk (void *addr)
+{
+  void *newbrk;
+
+  {
+    register long int res __asm__ ("$2");
+
+    asm ("move\t$4,%2\n\t"
+        "syscall"              /* Perform the system call.  */
+        : "=r" (res)
+        : "0" (SYS_ify (brk)), "r" (addr)
+        : "$4", "$7");
+    newbrk = (void *) res;
+  }
+  __curbrk = newbrk;
+
+  if (newbrk < addr)
+    {
+      __set_errno (ENOMEM);
+      return -1;
+    }
+
+  return 0;
+}
+weak_alias (__brk, brk)
diff --git a/sysdeps/unix/sysv/linux/mips/init-first.h b/sysdeps/unix/sysv/linux/mips/init-first.h
new file mode 100644 (file)
index 0000000..d8c2f38
--- /dev/null
@@ -0,0 +1,51 @@
+/* Prepare arguments for library initialization function.
+   Copyright (C) 2000 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.  */
+
+/* The job of this fragment it to find argc and friends for INIT.
+   This is done in one of two ways: either in the stack context
+   of program start, or having dlopen pass them in.  */
+
+#define SYSDEP_CALL_INIT(NAME, INIT)           \
+    asm(".weak _dl_starting_up\n\t"            \
+        ".globl " #NAME "\n\t"                 \
+       ".ent " #NAME "\n"                      \
+       #NAME ":\n\t"                           \
+       ".set   noreorder\n\t"                  \
+       ".cpload $25\n\t"                       \
+       ".set   reorder\n\t"                    \
+       /* Are we a dynamic libc being loaded into a static program?  */ \
+       "la     $8, _dl_starting_up\n\t"        \
+       "beqz   $8, 1f\n\t"                     \
+       "lw     $8, 0($8)\n\t"                  \
+       "seq    $8, $8, 0\n"                    \
+       "1:\t"                                  \
+       "sw     $8, __libc_multiple_libcs\n\t"  \
+       /* If so, argc et al are in a0-a2 already.  Otherwise, load them.  */ \
+       "bnez   $8, 2f\n\t"                     \
+       "lw     $4, 16($29)\n\t"                \
+       "addiu  $5, $29, 20\n\t"                \
+       "sll    $6, $4, 2\n\t"                  \
+       "addiu  $6, $6, 4\n\t"                  \
+       "addu   $6, $5, $6\n"                   \
+       "2:\t"                                  \
+       "la     $25, " #INIT "\n\t"             \
+       "jr     $25\n\t"                        \
+       ".end " #NAME "\n\t"                    \
+       "3:\t"                                  \
+       ".size  " #NAME ", 3b-" #NAME);