summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGwenolé Beauchesne <gbeauchesne@mandriva.org>2004-12-14 17:07:23 +0000
committerGwenolé Beauchesne <gbeauchesne@mandriva.org>2004-12-14 17:07:23 +0000
commit06aaee48192d4dcd92c7d38de77b2dc50c8a0346 (patch)
tree4672874f8942d7d79661c7f196c57e14c6796699
parent4983f8df715b7df93d59b83f42d4ed9aeb248d72 (diff)
downloaddrakx-backup-do-not-use-06aaee48192d4dcd92c7d38de77b2dc50c8a0346.tar
drakx-backup-do-not-use-06aaee48192d4dcd92c7d38de77b2dc50c8a0346.tar.gz
drakx-backup-do-not-use-06aaee48192d4dcd92c7d38de77b2dc50c8a0346.tar.bz2
drakx-backup-do-not-use-06aaee48192d4dcd92c7d38de77b2dc50c8a0346.tar.xz
drakx-backup-do-not-use-06aaee48192d4dcd92c7d38de77b2dc50c8a0346.zip
ppc64 support
-rw-r--r--mdk-stage1/dietlibc/ppc64/Makefile.add3
-rw-r--r--mdk-stage1/dietlibc/ppc64/__longjmp.S54
-rw-r--r--mdk-stage1/dietlibc/ppc64/__testandset.S12
-rw-r--r--mdk-stage1/dietlibc/ppc64/clone.S48
-rw-r--r--mdk-stage1/dietlibc/ppc64/mmap.S3
-rw-r--r--mdk-stage1/dietlibc/ppc64/setjmp.S59
-rw-r--r--mdk-stage1/dietlibc/ppc64/start.S74
-rw-r--r--mdk-stage1/dietlibc/ppc64/syscalls.h289
-rw-r--r--mdk-stage1/dietlibc/ppc64/umount.S8
-rw-r--r--mdk-stage1/dietlibc/ppc64/unified.S68
10 files changed, 618 insertions, 0 deletions
diff --git a/mdk-stage1/dietlibc/ppc64/Makefile.add b/mdk-stage1/dietlibc/ppc64/Makefile.add
new file mode 100644
index 000000000..e5031d6b5
--- /dev/null
+++ b/mdk-stage1/dietlibc/ppc64/Makefile.add
@@ -0,0 +1,3 @@
+
+CFLAGS+=-Os -mpowerpc64
+VPATH:=ppc64:syscalls.s:$(VPATH)
diff --git a/mdk-stage1/dietlibc/ppc64/__longjmp.S b/mdk-stage1/dietlibc/ppc64/__longjmp.S
new file mode 100644
index 000000000..f22aa274c
--- /dev/null
+++ b/mdk-stage1/dietlibc/ppc64/__longjmp.S
@@ -0,0 +1,54 @@
+#include <setjmp.h>
+
+ .quad .__longjmp,.TOC.@tocbase,0
+ .previous
+ .size __longjmp,24
+ .type .__longjmp,@function
+ .globl .__longjmp
+.align 2
+.__longjmp:
+ ld 1,(JB_GPR1*8)(3)
+ ld 2,(JB_GPR2*8)(3)
+ ld 0,(JB_LR*8)(3)
+ ld 14,((JB_GPRS+0)*8)(3)
+ lfd 14,((JB_FPRS+0*2)*8)(3)
+ ld 15,((JB_GPRS+1)*8)(3)
+ lfd 15,((JB_FPRS+1*2)*8)(3)
+ ld 16,((JB_GPRS+2)*8)(3)
+ lfd 16,((JB_FPRS+2*2)*8)(3)
+ ld 17,((JB_GPRS+3)*8)(3)
+ lfd 17,((JB_FPRS+3*2)*8)(3)
+ ld 18,((JB_GPRS+4)*8)(3)
+ lfd 18,((JB_FPRS+4*2)*8)(3)
+ ld 19,((JB_GPRS+5)*8)(3)
+ lfd 19,((JB_FPRS+5*2)*8)(3)
+ ld 20,((JB_GPRS+6)*8)(3)
+ lfd 20,((JB_FPRS+6*2)*8)(3)
+ mtlr 0
+ ld 21,((JB_GPRS+7)*8)(3)
+ lfd 21,((JB_FPRS+7*2)*8)(3)
+ ld 22,((JB_GPRS+8)*8)(3)
+ lfd 22,((JB_FPRS+8*2)*8)(3)
+ ld 0,(JB_CR*8)(3)
+ ld 23,((JB_GPRS+9)*8)(3)
+ lfd 23,((JB_FPRS+9*2)*8)(3)
+ ld 24,((JB_GPRS+10)*8)(3)
+ lfd 24,((JB_FPRS+10*2)*8)(3)
+ ld 25,((JB_GPRS+11)*8)(3)
+ lfd 25,((JB_FPRS+11*2)*8)(3)
+ mtcrf 0xFF,0
+ ld 26,((JB_GPRS+12)*8)(3)
+ lfd 26,((JB_FPRS+12*2)*8)(3)
+ ld 27,((JB_GPRS+13)*8)(3)
+ lfd 27,((JB_FPRS+13*2)*8)(3)
+ ld 28,((JB_GPRS+14)*8)(3)
+ lfd 28,((JB_FPRS+14*2)*8)(3)
+ ld 29,((JB_GPRS+15)*8)(3)
+ lfd 29,((JB_FPRS+15*2)*8)(3)
+ ld 30,((JB_GPRS+16)*8)(3)
+ lfd 30,((JB_FPRS+16*2)*8)(3)
+ ld 31,((JB_GPRS+17)*8)(3)
+ lfd 31,((JB_FPRS+17*2)*8)(3)
+ mr 3,4
+ blr
+.size .__longjmp,.-.__longjmp
diff --git a/mdk-stage1/dietlibc/ppc64/__testandset.S b/mdk-stage1/dietlibc/ppc64/__testandset.S
new file mode 100644
index 000000000..146982337
--- /dev/null
+++ b/mdk-stage1/dietlibc/ppc64/__testandset.S
@@ -0,0 +1,12 @@
+.global __testandset
+.type __testandset,@function
+.align 2
+__testandset:
+1: lwarx 5,0,3
+ li 0,1
+ stwcx. 0,0,3
+ bne- 1b
+ mr 3,5
+ blr
+.size __testandset,.-__testandset
+
diff --git a/mdk-stage1/dietlibc/ppc64/clone.S b/mdk-stage1/dietlibc/ppc64/clone.S
new file mode 100644
index 000000000..98f6bd4e8
--- /dev/null
+++ b/mdk-stage1/dietlibc/ppc64/clone.S
@@ -0,0 +1,48 @@
+#include <dietfeatures.h>
+#include "syscalls.h"
+#include <errno.h>
+
+.text
+.weak clone
+clone:
+.global __clone
+__clone:
+ cmpwi 4,0 /* check have non null child_stack pointer */
+ cmpwi cr1, 3,0 /* check have non null thread_funcion */
+ cror eq,4*cr1+eq,eq /* now if eq is set one is or both are zero */
+ beq .Lclone_error
+
+ stwu 1,-32(1) /* alloc some space on the stack */
+ stmw 29, 16(1) /* save r29,r30,r31 on stack */
+
+ rlwinm 4,4,0,0,27 /* mask out lower 4 bits */
+
+ /* move parameter to positions clone wants them */
+ mr 29,3 /* r29 = r3 fn */
+ mr 30,4 /* r30 = r4 stack */
+ mr 31,6 /* r31 = r6 arg */
+ mr 3, 5 /* r3 = r5 flags */
+
+ li 0, __NR_clone /* load syscall nr. */
+ sc
+
+ cmpwi cr1,3,0 /* compare return of syscall with 0 */
+ crandc 4*cr1+eq,4*cr1+eq,so
+ bne .Lclone_parent /* return was non zero -> .Lclone_parent */
+
+ /* we are the cloned process */
+ mr 1, 30 /* set stack pointer */
+ mtctr 29 /* set count register to fn ? */
+ mr 3, 31 /* set argument */
+ bctrl /* branch trough count register and link */
+ b _exit /* exit thread */
+
+.Lclone_parent:
+ lmw 29,16(1) /* restore saved registers */
+ addi 1, 1,32 /* free stack */
+ bnslr+ /* had cloned a thread so return to parent */
+ b error_unified_syscall
+
+.Lclone_error:
+ li 3, EINVAL
+ b error_unified_syscall
diff --git a/mdk-stage1/dietlibc/ppc64/mmap.S b/mdk-stage1/dietlibc/ppc64/mmap.S
new file mode 100644
index 000000000..2e57fbb74
--- /dev/null
+++ b/mdk-stage1/dietlibc/ppc64/mmap.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(mmap,mmap)
diff --git a/mdk-stage1/dietlibc/ppc64/setjmp.S b/mdk-stage1/dietlibc/ppc64/setjmp.S
new file mode 100644
index 000000000..34aa4c2cd
--- /dev/null
+++ b/mdk-stage1/dietlibc/ppc64/setjmp.S
@@ -0,0 +1,59 @@
+#include <setjmp.h>
+
+#ifdef PIC
+#define JUMPTARGET(name) name##@plt
+#else
+#define JUMPTARGET(name) .name
+#endif
+
+ .quad .__sigsetjmp,.TOC.@tocbase,0
+ .previous
+ .size __sigsetjmp,24
+ .type .__sigsetjmp,@function
+ .globl .__sigsetjmp
+.align 2
+.__sigsetjmp:
+ std 1,(JB_GPR1*8)(3)
+ mflr 0
+ std 2,(JB_GPR2*8)(3)
+ std 14,((JB_GPRS+0)*8)(3)
+ stfd 14,((JB_FPRS+0*2)*8)(3)
+ std 0,(JB_LR*8)(3)
+ std 15,((JB_GPRS+1)*8)(3)
+ stfd 15,((JB_FPRS+1*2)*8)(3)
+ mfcr 0
+ std 16,((JB_GPRS+2)*8)(3)
+ stfd 16,((JB_FPRS+2*2)*8)(3)
+ std 0,(JB_CR*8)(3)
+ std 17,((JB_GPRS+3)*8)(3)
+ stfd 17,((JB_FPRS+3*2)*8)(3)
+ std 18,((JB_GPRS+4)*8)(3)
+ stfd 18,((JB_FPRS+4*2)*8)(3)
+ std 19,((JB_GPRS+5)*8)(3)
+ stfd 19,((JB_FPRS+5*2)*8)(3)
+ std 20,((JB_GPRS+6)*8)(3)
+ stfd 20,((JB_FPRS+6*2)*8)(3)
+ std 21,((JB_GPRS+7)*8)(3)
+ stfd 21,((JB_FPRS+7*2)*8)(3)
+ std 22,((JB_GPRS+8)*8)(3)
+ stfd 22,((JB_FPRS+8*2)*8)(3)
+ std 23,((JB_GPRS+9)*8)(3)
+ stfd 23,((JB_FPRS+9*2)*8)(3)
+ std 24,((JB_GPRS+10)*8)(3)
+ stfd 24,((JB_FPRS+10*2)*8)(3)
+ std 25,((JB_GPRS+11)*8)(3)
+ stfd 25,((JB_FPRS+11*2)*8)(3)
+ std 26,((JB_GPRS+12)*8)(3)
+ stfd 26,((JB_FPRS+12*2)*8)(3)
+ std 27,((JB_GPRS+13)*8)(3)
+ stfd 27,((JB_FPRS+13*2)*8)(3)
+ std 28,((JB_GPRS+14)*8)(3)
+ stfd 28,((JB_FPRS+14*2)*8)(3)
+ std 29,((JB_GPRS+15)*8)(3)
+ stfd 29,((JB_FPRS+15*2)*8)(3)
+ std 30,((JB_GPRS+16)*8)(3)
+ stfd 30,((JB_FPRS+16*2)*8)(3)
+ std 31,((JB_GPRS+17)*8)(3)
+ stfd 31,((JB_FPRS+17*2)*8)(3)
+ b JUMPTARGET (__sigjmp_save)
+.size .__sigsetjmp,.-.__sigsetjmp
diff --git a/mdk-stage1/dietlibc/ppc64/start.S b/mdk-stage1/dietlibc/ppc64/start.S
new file mode 100644
index 000000000..6fc8d327b
--- /dev/null
+++ b/mdk-stage1/dietlibc/ppc64/start.S
@@ -0,0 +1,74 @@
+ .section ".text"
+ .align 2
+ .globl ._start
+ .type ._start,@function
+ .globl _start
+ .section ".opd","aw"
+_start:
+ .quad ._start
+ .quad .TOC.@tocbase, 0
+ .previous
+._start:
+
+/*
+ .section ".text"
+ .align 2
+ .globl ._start
+ .type ._start,@function
+ .globl _start
+ .section ".opd","aw"
+_start:
+ .quad ._start
+ .quad .TOC.@tocbase, 0
+ .previous
+._start:
+*/
+ /* Save the stack pointer, in case we're statically linked under Linux. */
+ mr 9,1
+ /* Set up an initial stack frame, and clear the LR. */
+ clrrdi 1,1,4
+ li 0,0
+ stdu 1,-128(1)
+ mtlr 0
+ std 0,0(1)
+
+ /* r9 contains the initial stack pointer
+ argc = (r9)
+ argv = (r9+4)
+ envp = argv+(argc+1)*4 */
+
+ ldu 3,0(9) /* argc */
+ addi 4,9,8 /* argv */
+ add 5,0,3 /* argc... */
+ addi 5,5,1 /* argc+1...*/
+ slwi 5,5,3 /* (argc+1)*4 */
+ add 5,5,4 /* argv+(argc+1)*4 */
+
+ lis 14,environ@ha
+ std 5,environ@l(14)
+
+#ifdef WANT_DYNAMIC
+#warning dynamic
+ mr 6,7
+ bl ._dyn_start
+#else
+#warning static
+ bl .main
+#endif
+ b .exit
+
+.LT_start:
+ .long 0
+ .quad 0x000c000000000000 | 0x0000200000000000 | 0x0000004000000000
+ .long .LT_start-._start
+ .short .LT_start_name_end-.LT_start_name_start
+.LT_start_name_start:
+ .ascii "_start"
+.LT_start_name_end:
+ .align 2
+ .size _start,.-_start
+
+/* Define a symbol for the first piece of initialized data. */
+ .section ".data"
+__data_start:
+
diff --git a/mdk-stage1/dietlibc/ppc64/syscalls.h b/mdk-stage1/dietlibc/ppc64/syscalls.h
new file mode 100644
index 000000000..0547a3516
--- /dev/null
+++ b/mdk-stage1/dietlibc/ppc64/syscalls.h
@@ -0,0 +1,289 @@
+
+#define __NR_exit 1
+#define __NR_fork 2
+#define __NR_read 3
+#define __NR_write 4
+#define __NR_open 5
+#define __NR_close 6
+#define __NR_waitpid 7
+#define __NR_creat 8
+#define __NR_link 9
+#define __NR_unlink 10
+#define __NR_execve 11
+#define __NR_chdir 12
+#define __NR_time 13
+#define __NR_mknod 14
+#define __NR_chmod 15
+#define __NR_lchown 16
+#define __NR_break 17
+#define __NR_oldstat 18
+#define __NR_lseek 19
+#define __NR_getpid 20
+#define __NR_mount 21
+#define __NR_umount 22
+#define __NR_setuid 23
+#define __NR_getuid 24
+#define __NR_stime 25
+#define __NR_ptrace 26
+#define __NR_alarm 27
+#define __NR_oldfstat 28
+#define __NR_pause 29
+#define __NR_utime 30
+#define __NR_stty 31
+#define __NR_gtty 32
+#define __NR_access 33
+#define __NR_nice 34
+#define __NR_ftime 35
+#define __NR_sync 36
+#define __NR_kill 37
+#define __NR_rename 38
+#define __NR_mkdir 39
+#define __NR_rmdir 40
+#define __NR_dup 41
+#define __NR_pipe 42
+#define __NR_times 43
+#define __NR_prof 44
+#define __NR_brk 45
+#define __NR_setgid 46
+#define __NR_getgid 47
+#define __NR_signal 48
+#define __NR_geteuid 49
+#define __NR_getegid 50
+#define __NR_acct 51
+#define __NR_umount2 52
+#define __NR_lock 53
+#define __NR_ioctl 54
+#define __NR_fcntl 55
+#define __NR_mpx 56
+#define __NR_setpgid 57
+#define __NR_ulimit 58
+#define __NR_oldolduname 59
+#define __NR_umask 60
+#define __NR_chroot 61
+#define __NR_ustat 62
+#define __NR_dup2 63
+#define __NR_getppid 64
+#define __NR_getpgrp 65
+#define __NR_setsid 66
+#define __NR_sigaction 67
+#define __NR_sgetmask 68
+#define __NR_ssetmask 69
+#define __NR_setreuid 70
+#define __NR_setregid 71
+#define __NR_sigsuspend 72
+#define __NR_sigpending 73
+#define __NR_sethostname 74
+#define __NR_setrlimit 75
+#define __NR_getrlimit 76
+#define __NR_getrusage 77
+#define __NR_gettimeofday 78
+#define __NR_settimeofday 79
+#define __NR_getgroups 80
+#define __NR_setgroups 81
+#define __NR_select 82
+#define __NR_symlink 83
+#define __NR_oldlstat 84
+#define __NR_readlink 85
+#define __NR_uselib 86
+#define __NR_swapon 87
+#define __NR_reboot 88
+#define __NR_readdir 89
+#define __NR_mmap 90
+#define __NR_munmap 91
+#define __NR_truncate 92
+#define __NR_ftruncate 93
+#define __NR_fchmod 94
+#define __NR_fchown 95
+#define __NR_getpriority 96
+#define __NR_setpriority 97
+#define __NR_profil 98
+#define __NR_statfs 99
+#define __NR_fstatfs 100
+#define __NR_ioperm 101
+#define __NR_socketcall 102
+#define __NR_syslog 103
+#define __NR_setitimer 104
+#define __NR_getitimer 105
+#define __NR_stat 106
+#define __NR_lstat 107
+#define __NR_fstat 108
+#define __NR_olduname 109
+#define __NR_iopl 110
+#define __NR_vhangup 111
+#define __NR_idle 112
+#define __NR_vm86 113
+#define __NR_wait4 114
+#define __NR_swapoff 115
+#define __NR_sysinfo 116
+#define __NR_ipc 117
+#define __NR_fsync 118
+#define __NR_sigreturn 119
+#define __NR_clone 120
+#define __NR_setdomainname 121
+#define __NR_uname 122
+#define __NR_modify_ldt 123
+#define __NR_adjtimex 124
+#define __NR_mprotect 125
+#define __NR_sigprocmask 126
+#define __NR_create_module 127
+#define __NR_init_module 128
+#define __NR_delete_module 129
+#define __NR_get_kernel_syms 130
+#define __NR_quotactl 131
+#define __NR_getpgid 132
+#define __NR_fchdir 133
+#define __NR_bdflush 134
+#define __NR_sysfs 135
+#define __NR_personality 136
+#define __NR_afs_syscall 137 /* Syscall for Andrew File System */
+#define __NR_setfsuid 138
+#define __NR_setfsgid 139
+#define __NR__llseek 140
+#define __NR_getdents 141
+#define __NR__newselect 142
+#define __NR_flock 143
+#define __NR_msync 144
+#define __NR_readv 145
+#define __NR_writev 146
+#define __NR_getsid 147
+#define __NR_fdatasync 148
+#define __NR__sysctl 149
+#define __NR_mlock 150
+#define __NR_munlock 151
+#define __NR_mlockall 152
+#define __NR_munlockall 153
+#define __NR_sched_setparam 154
+#define __NR_sched_getparam 155
+#define __NR_sched_setscheduler 156
+#define __NR_sched_getscheduler 157
+#define __NR_sched_yield 158
+#define __NR_sched_get_priority_max 159
+#define __NR_sched_get_priority_min 160
+#define __NR_sched_rr_get_interval 161
+#define __NR_nanosleep 162
+#define __NR_mremap 163
+#define __NR_setresuid 164
+#define __NR_getresuid 165
+#define __NR_query_module 166
+#define __NR_poll 167
+#define __NR_nfsservctl 168
+#define __NR_setresgid 169
+#define __NR_getresgid 170
+#define __NR_prctl 171
+#define __NR_rt_sigreturn 172
+#define __NR_rt_sigaction 173
+#define __NR_rt_sigprocmask 174
+#define __NR_rt_sigpending 175
+#define __NR_rt_sigtimedwait 176
+#define __NR_rt_sigqueueinfo 177
+#define __NR_rt_sigsuspend 178
+#define __NR_pread 179
+#define __NR_pwrite 180
+#define __NR_chown 181
+#define __NR_getcwd 182
+#define __NR_capget 183
+#define __NR_capset 184
+#define __NR_sigaltstack 185
+#define __NR_sendfile 186
+#define __NR_getpmsg 187 /* some people actually want streams */
+#define __NR_putpmsg 188 /* some people actually want streams */
+#define __NR_vfork 189
+#define __NR_ugetrlimit 190 /* SuS compliant getrlimit */
+#define __NR_mmap2 192
+//#define __NR_truncate64 193
+//#define __NR_ftruncate64 194
+//#define __NR_stat64 195
+//#define __NR_lstat64 196
+//#define __NR_fstat64 197
+#define __NR_pciconfig_read 198
+#define __NR_pciconfig_write 199
+#define __NR_pciconfig_iobase 200
+#define __NR_multiplexer 201
+//#define __NR_getdents64 202
+#define __NR_pivot_root 203
+//#define __NR_fcntl64 204
+#define __NR_madvise 205
+#define __NR_mincore 206
+#define __NR_gettid 207
+#define __NR_tkill 208
+#define __NR_setxattr 209
+#define __NR_lsetxattr 210
+#define __NR_fsetxattr 211
+#define __NR_getxattr 212
+#define __NR_lgetxattr 213
+#define __NR_fgetxattr 214
+#define __NR_listxattr 215
+#define __NR_llistxattr 216
+#define __NR_flistxattr 217
+#define __NR_removexattr 218
+#define __NR_lremovexattr 219
+#define __NR_fremovexattr 220
+#define __NR_futex 221
+#define __NR_sched_setaffinity 222
+#define __NR_sched_getaffinity 223
+/* 224 currently unused */
+#define __NR_tuxcall 225
+//#define __NR_sendfile64 226
+#define __NR_io_setup 227
+#define __NR_io_destroy 228
+#define __NR_io_getevents 229
+#define __NR_io_submit 230
+#define __NR_io_cancel 231
+#define __NR_set_tid_address 232
+#define __NR_fadvise64 233
+#define __NR_exit_group 234
+#define __NR_lookup_dcookie 235
+#define __NR_sys_epoll_create 236
+#define __NR_sys_epoll_ctl 237
+#define __NR_sys_epoll_wait 238
+#define __NR_remap_file_pages 239
+#define __NR_timer_create 240
+#define __NR_timer_settime 241
+#define __NR_timer_gettime 242
+#define __NR_timer_getoverrun 243
+#define __NR_timer_delete 244
+#define __NR_clock_settime 245
+#define __NR_clock_gettime 246
+#define __NR_clock_getres 247
+#define __NR_clock_nanosleep 248
+#define __NR_swapcontext 249
+#define __NR_tgkill 250
+#define __NR_utimes 251
+#define __NR_statfs64 252
+#define __NR_fstatfs64 253
+
+
+#define diet_proto_weak(wsym) \
+wsym: \
+ .quad .wsym,.TOC.@tocbase,0;\
+ .previous;\
+ .size wsym,24;\
+ .type .wsym,@function;\
+ .globl .wsym;\
+ .weak wsym;\
+
+#define diet_proto(sym) \
+sym:\
+ .quad .sym,.TOC.@tocbase,0;\
+ .previous;\
+ .size sym,24;\
+ .type .sym,@function;\
+ .globl .sym;\
+
+#define syscall_weak(name,wsym,sym) \
+.text; \
+diet_proto_weak(wsym); \
+diet_proto(sym); \
+.wsym:\
+ .weak .wsym;\
+.sym: \
+ li 0,__NR_##name; \
+ b __unified_syscall
+
+#define syscall(name,sym) \
+.text; \
+diet_proto(sym); \
+.sym: \
+ li 0,__NR_##name; \
+ b __unified_syscall
+
diff --git a/mdk-stage1/dietlibc/ppc64/umount.S b/mdk-stage1/dietlibc/ppc64/umount.S
new file mode 100644
index 000000000..2f548a402
--- /dev/null
+++ b/mdk-stage1/dietlibc/ppc64/umount.S
@@ -0,0 +1,8 @@
+#include "syscalls.h"
+
+ .text
+diet_proto(umount)
+.umount:
+ li 0, __NR_umount2
+ li 4, 0
+ b __unified_syscall
diff --git a/mdk-stage1/dietlibc/ppc64/unified.S b/mdk-stage1/dietlibc/ppc64/unified.S
new file mode 100644
index 000000000..4c7353d3f
--- /dev/null
+++ b/mdk-stage1/dietlibc/ppc64/unified.S
@@ -0,0 +1,68 @@
+#include <dietfeatures.h>
+#include "syscalls.h"
+
+ .text
+.exit:
+ .weak .exit
+._exit:
+ li 0,__NR_exit
+ .global __unified_syscall
+__unified_syscall:
+ sc
+ bnslr+
+
+ .global error_unified_syscall
+error_unified_syscall:
+
+#ifdef WANT_THREAD_SAFE
+ stdu 1,-128(1)
+ mflr 0
+ std 0,20(1)
+ std 3,12(1)
+ bl .__errno_location
+ ld 0,12(1)
+ stw 0,0(3)
+ ld 0,20(1)
+ mtlr 0
+ addi 1,1,128
+#else
+ lis 9,errno@ha
+ stw 3,errno@l(9)
+#endif
+ li 3,-1
+
+/* here we go and "reuse" the return for weak-void functions */
+//#include "dietuglyweaks.h"
+.__thread_doexit:
+ .weak .__thread_doexit
+.__fflush_stdin:
+ .weak .__fflush_stdin
+.__fflush_stdout:
+ .weak .__fflush_stdout
+.__fflush_stderr:
+ .weak .__fflush_stderr
+.flockfile:
+ .weak .flockfile
+.funlockfile:
+ .weak .funlockfile
+.__nop:
+ .weak .__nop
+.__you_tried_to_link_a_dietlibc_object_against_glibc:
+ .weak .__you_tried_to_link_a_dietlibc_object_against_glibc
+
+ blr
+ .long 0
+ .byte 0,0,0,1,128,0,0,0
+ .size ._exit,.-._exit
+ .size .exit,.-.exit
+
+diet_proto_weak(__thread_doexit)
+diet_proto_weak(__fflush_stdin)
+diet_proto_weak(__fflush_stdout)
+diet_proto_weak(__fflush_stderr)
+diet_proto_weak(flockfile)
+diet_proto_weak(funlockfile)
+diet_proto_weak(__nop)
+diet_proto_weak(__you_tried_to_link_a_dietlibc_object_against_glibc)
+diet_proto_weak(exit)
+diet_proto(_exit)