ppc/ppc64 support from Paul Mackerras
diff --git a/klibc/arch/ppc/Makefile.inc b/klibc/arch/ppc/Makefile.inc
index 3bd2c06..c6bb975 100644
--- a/klibc/arch/ppc/Makefile.inc
+++ b/klibc/arch/ppc/Makefile.inc
@@ -9,6 +9,7 @@
ARCHOBJS = \
arch/$(ARCH)/setjmp.o \
+ arch/$(ARCH)/syscall.o \
libgcc/__divdi3.o \
libgcc/__moddi3.o \
libgcc/__udivdi3.o \
diff --git a/klibc/arch/ppc/syscall.S b/klibc/arch/ppc/syscall.S
new file mode 100644
index 0000000..0a7c37c
--- /dev/null
+++ b/klibc/arch/ppc/syscall.S
@@ -0,0 +1,16 @@
+/*
+ * arch/ppc/syscall.S
+ *
+ * Common error-handling path for system calls.
+ */
+
+ .text
+ .align 2
+ .globl __syscall_error
+ .type __syscall_error,@function
+__syscall_error:
+ lis 9,errno@ha
+ stw 3,errno@l(9)
+ li 3,-1
+ blr
+ .size __syscall_error,.-__syscall_error
diff --git a/klibc/arch/ppc/sysstub.ph b/klibc/arch/ppc/sysstub.ph
new file mode 100644
index 0000000..542ab55
--- /dev/null
+++ b/klibc/arch/ppc/sysstub.ph
@@ -0,0 +1,25 @@
+# -*- perl -*-
+#
+# arch/ppc/sysstub.ph
+#
+# Script to generate system call stubs
+#
+
+sub make_sysstub($$$$@) {
+ my($fname, $type, $sname, $stype, @args) = @_;
+
+ open(OUT, '>', "syscalls/${fname}.S");
+ print OUT "#include <asm/unistd.h>\n";
+ print OUT "\n";
+ print OUT "\t.type ${fname},\@function\n";
+ print OUT "\t.globl ${fname}\n";
+ print OUT "${fname}:\n";
+ print OUT "\tli 0,__NR_${sname}\n";
+ print OUT "\tsc\n";
+ print OUT "\tbnslr\n";
+ print OUT "\tb __syscall_error\n";
+ print OUT "\t.size ${fname},.-${fname}\n";
+ close(OUT);
+}
+
+1;
diff --git a/klibc/arch/ppc64/Makefile.inc b/klibc/arch/ppc64/Makefile.inc
index 3ab3a8c..c2d1d2f 100644
--- a/klibc/arch/ppc64/Makefile.inc
+++ b/klibc/arch/ppc64/Makefile.inc
@@ -8,7 +8,8 @@
#
ARCHOBJS = \
- arch/$(ARCH)/setjmp.o
+ arch/$(ARCH)/setjmp.o \
+ arch/$(ARCH)/syscall.o
ARCHSOOBJS = $(patsubst %.o,%.lo,$(ARCHOBJS))
diff --git a/klibc/arch/ppc64/syscall.c b/klibc/arch/ppc64/syscall.c
new file mode 100644
index 0000000..a5895fe
--- /dev/null
+++ b/klibc/arch/ppc64/syscall.c
@@ -0,0 +1,14 @@
+/*
+ * arch/ppc64/syscall.c
+ *
+ * Common error-handling path for system calls.
+ * The return value from __syscall_error becomes the
+ * return value from the system call.
+ */
+#include <errno.h>
+
+long int __syscall_error(long int err)
+{
+ errno = err;
+ return -1;
+}
diff --git a/klibc/arch/ppc64/sysstub.ph b/klibc/arch/ppc64/sysstub.ph
new file mode 100644
index 0000000..6292f05
--- /dev/null
+++ b/klibc/arch/ppc64/sysstub.ph
@@ -0,0 +1,32 @@
+# -*- perl -*-
+#
+# arch/ppc64/sysstub.ph
+#
+# Script to generate system call stubs
+#
+
+sub make_sysstub($$$$@) {
+ my($fname, $type, $sname, $stype, @args) = @_;
+
+ open(OUT, '>', "syscalls/${fname}.S");
+ print OUT "#include <asm/unistd.h>\n";
+ print OUT "\n";
+ print OUT "\t.globl ${fname}\n";
+ print OUT "\t.section \".opd\",\"aw\"\n";
+ print OUT "\t.align 3\n";
+ print OUT "${fname}:\n";
+ print OUT "\t.quad .${fname},.TOC.\@tocbase,0\n";
+ print OUT "\t.size ${fname},24\n";
+ print OUT "\t.text\n";
+ print OUT "\t.type .${fname},\@function\n";
+ print OUT "\t.globl .${fname}\n";
+ print OUT ".${fname}:\n";
+ print OUT "\tli 0,__NR_${sname}\n";
+ print OUT "\tsc\n";
+ print OUT "\tbnslr\n";
+ print OUT "\tb __syscall_error\n";
+ print OUT "\t.size .${fname},.-.${fname}\n";
+ close(OUT);
+}
+
+1;