You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.5 KiB
81 lines
2.5 KiB
commit 1d9764aba8c00754fbf8299e48afbe222245ee3e |
|
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org> |
|
Date: Wed Aug 4 21:34:12 2021 +0300 |
|
|
|
linux: Add sparck brk implementation |
|
|
|
It turned that the generic implementation of brk() does not work |
|
for sparc, since on failure kernel will just return the previous |
|
input value without setting the conditional register. |
|
|
|
This patches adds back a sparc32 and sparc64 implementation removed |
|
by 720480934ab9107. |
|
|
|
Checked on sparc64-linux-gnu and sparcv9-linux-gnu. |
|
|
|
(cherry picked from commit 5b86241a032c50462988bdd1439e078384690d34) |
|
|
|
diff --git a/sysdeps/unix/sysv/linux/sparc/brk.c b/sysdeps/unix/sysv/linux/sparc/brk.c |
|
new file mode 100644 |
|
index 0000000000000000..aafe9673e3062cf8 |
|
--- /dev/null |
|
+++ b/sysdeps/unix/sysv/linux/sparc/brk.c |
|
@@ -0,0 +1,58 @@ |
|
+/* Change data segment. Linux SPARC version. |
|
+ Copyright (C) 2021 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, see |
|
+ <https://www.gnu.org/licenses/>. */ |
|
+ |
|
+#include <errno.h> |
|
+#include <unistd.h> |
|
+#include <sysdep.h> |
|
+ |
|
+/* This must be initialized data because commons can't have aliases. */ |
|
+void *__curbrk = 0; |
|
+ |
|
+#if HAVE_INTERNAL_BRK_ADDR_SYMBOL |
|
+/* Old braindamage in GCC's crtstuff.c requires this symbol in an attempt |
|
+ to work around different old braindamage in the old Linux ELF dynamic |
|
+ linker. */ |
|
+weak_alias (__curbrk, ___brk_addr) |
|
+#endif |
|
+ |
|
+#ifdef __arch64__ |
|
+# define SYSCALL_NUM "0x6d" |
|
+#else |
|
+# define SYSCALL_NUM "0x10" |
|
+#endif |
|
+ |
|
+int |
|
+__brk (void *addr) |
|
+{ |
|
+ register long int g1 asm ("g1") = __NR_brk; |
|
+ register long int o0 asm ("o0") = (long int) addr; |
|
+ asm volatile ("ta " SYSCALL_NUM |
|
+ : "=r"(o0) |
|
+ : "r"(g1), "0"(o0) |
|
+ : "cc"); |
|
+ __curbrk = (void *) o0; |
|
+ |
|
+ if (__curbrk < addr) |
|
+ { |
|
+ __set_errno (ENOMEM); |
|
+ return -1; |
|
+ } |
|
+ |
|
+ return 0; |
|
+} |
|
+weak_alias (__brk, brk)
|
|
|