summaryrefslogtreecommitdiff
path: root/libc
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2003-08-13 20:08:30 +0000
committerEric Andersen <andersen@codepoet.org>2003-08-13 20:08:30 +0000
commit533d76fbc420a8cdca389dbea0d86eb64e0e8096 (patch)
tree122e91e59f3b0d1b346a30c2b90320980db0935d /libc
parentae3cf778c3155c085468fe72a47ddd696a1b5a00 (diff)
Patch from Paul Mundt adding uClibc sh64 support:
Here's a patch that implements the beginnings of a rudimentary sh64 port. So far, this only works static, as I haven't done any of the ldso work yet. I've also not touched the libpthread stuff yet either, so that's also disabled for now. This port was based off of some work that Sean McGoogan at SuperH did for his initial port, but the this patch doesn't carry over too much from there (basically the libc/sysdeps/linux/sh64/Makefile (or rather, parts of it), the setjmp/longjmp stuff (which I had to rewrite portions of it to work with the new toolchains), etc.). However, for static, everything appears to work correcly, at least in a hello world type application.
Diffstat (limited to 'libc')
-rw-r--r--libc/sysdeps/linux/Makefile2
-rw-r--r--libc/sysdeps/linux/common/initfini.c2
-rw-r--r--libc/sysdeps/linux/sh64/Makefile65
-rw-r--r--libc/sysdeps/linux/sh64/__init_brk.c25
-rw-r--r--libc/sysdeps/linux/sh64/bits/endian.h20
-rw-r--r--libc/sysdeps/linux/sh64/bits/fcntl.h156
-rw-r--r--libc/sysdeps/linux/sh64/bits/kernel_stat.h63
-rw-r--r--libc/sysdeps/linux/sh64/bits/kernel_types.h55
-rw-r--r--libc/sysdeps/linux/sh64/bits/setjmp.h48
-rw-r--r--libc/sysdeps/linux/sh64/bits/syscalls.h134
-rw-r--r--libc/sysdeps/linux/sh64/bits/wordsize.h12
-rw-r--r--libc/sysdeps/linux/sh64/brk.c22
-rw-r--r--libc/sysdeps/linux/sh64/crt0.S78
-rw-r--r--libc/sysdeps/linux/sh64/fork.c35
-rw-r--r--libc/sysdeps/linux/sh64/longjmp.S140
-rw-r--r--libc/sysdeps/linux/sh64/sbrk.c25
-rw-r--r--libc/sysdeps/linux/sh64/setjmp.S140
-rw-r--r--libc/sysdeps/linux/sh64/sys/ucontext.h205
18 files changed, 1225 insertions, 2 deletions
diff --git a/libc/sysdeps/linux/Makefile b/libc/sysdeps/linux/Makefile
index 59e460709..1251543d2 100644
--- a/libc/sysdeps/linux/Makefile
+++ b/libc/sysdeps/linux/Makefile
@@ -20,7 +20,7 @@ TOPDIR=../../../
include $(TOPDIR)Rules.mak
DIRS = common $(TARGET_ARCH)
-ALL_SUBDIRS = arm common cris h8300 i386 m68k mips powerpc sh sparc v850
+ALL_SUBDIRS = arm common cris h8300 i386 m68k mips powerpc sh sh64 sparc v850
all: subdirs
diff --git a/libc/sysdeps/linux/common/initfini.c b/libc/sysdeps/linux/common/initfini.c
index ba4d68fc9..4941e9ad1 100644
--- a/libc/sysdeps/linux/common/initfini.c
+++ b/libc/sysdeps/linux/common/initfini.c
@@ -51,7 +51,7 @@
# define HIDDEN(func)
#endif
-#if defined(__sh__)
+#if defined(__sh__) && !defined(__SH5__)
/* The macro insert this sh specific stuff:
@_SH_GLB_BEGINS
bra 1f
diff --git a/libc/sysdeps/linux/sh64/Makefile b/libc/sysdeps/linux/sh64/Makefile
new file mode 100644
index 000000000..6e9192718
--- /dev/null
+++ b/libc/sysdeps/linux/sh64/Makefile
@@ -0,0 +1,65 @@
+# Makefile for uClibc
+#
+# Copyright (C) 2001 SuperH (UK) Ltd.
+# Copyright (C) 2003 Paul Mundt <lethal@linux-sh.org>
+#
+# This program 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.
+#
+# This program 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 this program; if not, write to the Free Software Foundation, Inc.,
+# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+TOPDIR=../../../../
+include $(TOPDIR)Rules.mak
+
+CFLAGS += -I..
+SFLAGS = $(CFLAGS) -D__ASSEMBLER__ -DASM_GLOBAL_DIRECTIVE=.globl
+
+TARGET_MACHINE_TYPE=$(shell $(CC) -dumpmachine)
+
+CRT0_SRC = crt0.S
+CRT0_OBJ = crt0.o crt1.o
+
+SSRC = setjmp.S longjmp.S
+SOBJS = $(patsubst %.S,%.o, $(SSRC))
+
+CSRC = fork.c __init_brk.c brk.c sbrk.c
+COBJS = $(patsubst %.c,%.o, $(CSRC))
+
+OBJS = $(SOBJS) $(COBJS)
+
+
+all: $(OBJS) $(LIBC)
+
+$(LIBC): ar-target
+
+ar-target: $(OBJS) $(CRT0_OBJ)
+ $(AR) $(ARFLAGS) $(LIBC) $(OBJS)
+ cp $(CRT0_OBJ) $(TOPDIR)lib/
+
+$(CRT0_OBJ): $(CRT0_SRC)
+ $(CC) $(CFLAGS) -DL_$* $< -c -o $*.o
+ $(STRIPTOOL) -x -R .note -R .comment $*.o
+
+$(SOBJS): %.o : %.S
+ $(CC) $(SFLAGS) -c $< -o $@
+ $(STRIPTOOL) -x -R .note -R .comment $*.o
+
+$(COBJS): %.o : %.c
+ $(CC) $(CFLAGS) -c $< -o $@
+ $(STRIPTOOL) -x -R .note -R .comment $*.o
+
+headers:
+
+clean:
+ rm -f *.[oa] *~ core
+ rm -f bits/sysnum.h
+
diff --git a/libc/sysdeps/linux/sh64/__init_brk.c b/libc/sysdeps/linux/sh64/__init_brk.c
new file mode 100644
index 000000000..7f9cd3c31
--- /dev/null
+++ b/libc/sysdeps/linux/sh64/__init_brk.c
@@ -0,0 +1,25 @@
+/* From libc-5.3.12 */
+
+#include <errno.h>
+#include <unistd.h>
+#include <sys/syscall.h>
+
+void * ___brk_addr = 0;
+
+#define __NR__brk __NR_brk
+_syscall1(void *, _brk, void *, ptr);
+
+int
+__init_brk (void)
+{
+ if (___brk_addr == 0)
+ {
+ ___brk_addr = _brk(0);
+ if (___brk_addr == 0)
+ {
+ __set_errno(ENOMEM);
+ return -1;
+ }
+ }
+ return 0;
+}
diff --git a/libc/sysdeps/linux/sh64/bits/endian.h b/libc/sysdeps/linux/sh64/bits/endian.h
new file mode 100644
index 000000000..ae7e3bb2d
--- /dev/null
+++ b/libc/sysdeps/linux/sh64/bits/endian.h
@@ -0,0 +1,20 @@
+/*
+ * libc/sysdeps/linux/sh64/bits/endian.h
+ *
+ * Copyright (C) 2003 Paul Mundt
+ *
+ * This file is subject to the terms and conditions of the GNU Lesser
+ * General Public License. See the file COPYING.LIB in the main
+ * directory of this archive for more details.
+ */
+
+#ifndef _ENDIAN_H
+# error "Never use <bits/endian.h> directly; include <endian.h> instead."
+#endif
+
+#ifdef __LITTLE_ENDIAN__
+# define __BYTE_ORDER __LITTLE_ENDIAN
+#else
+# define __BYTE_ORDER __BIG_ENDIAN
+#endif
+
diff --git a/libc/sysdeps/linux/sh64/bits/fcntl.h b/libc/sysdeps/linux/sh64/bits/fcntl.h
new file mode 100644
index 000000000..69a20966d
--- /dev/null
+++ b/libc/sysdeps/linux/sh64/bits/fcntl.h
@@ -0,0 +1,156 @@
+/* O_*, F_*, FD_* bit values for Linux.
+ Copyright (C) 1995, 1996, 1997, 1998, 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 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 _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. */
+# define O_STREAMING 04000000/* streaming access */
+#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 --git a/libc/sysdeps/linux/sh64/bits/kernel_stat.h b/libc/sysdeps/linux/sh64/bits/kernel_stat.h
new file mode 100644
index 000000000..036448e6d
--- /dev/null
+++ b/libc/sysdeps/linux/sh64/bits/kernel_stat.h
@@ -0,0 +1,63 @@
+/* Stat structure for Linux/sh64 */
+
+#ifndef _BITS_STAT_STRUCT_H
+#define _BITS_STAT_STRUCT_H
+
+struct kernel_stat {
+ unsigned short st_dev;
+ unsigned short __pad1;
+ unsigned long st_ino;
+ unsigned short st_mode;
+ unsigned short st_nlink;
+ unsigned short st_uid;
+ unsigned short st_gid;
+ unsigned short st_rdev;
+ unsigned short __pad2;
+ unsigned long st_size;
+ unsigned long st_blksize;
+ unsigned long st_blocks;
+ unsigned long st_atime;
+ unsigned long __unused1;
+ unsigned long st_mtime;
+ unsigned long __unused2;
+ unsigned long st_ctime;
+ unsigned long __unused3;
+ unsigned long __unused4;
+ unsigned long __unused5;
+};
+
+struct kernel_stat64 {
+ unsigned short st_dev;
+ unsigned char __pad0[10];
+
+ unsigned long st_ino;
+ unsigned int st_mode;
+ unsigned int st_nlink;
+
+ unsigned long st_uid;
+ unsigned long st_gid;
+
+ unsigned short st_rdev;
+ unsigned char __pad3[10];
+
+ long long st_size;
+ unsigned long st_blksize;
+
+ unsigned long st_blocks; /* Number 512-byte blocks allocated. */
+ unsigned long __pad4; /* future possible st_blocks high bits */
+
+ unsigned long st_atime;
+ unsigned long __pad5;
+
+ unsigned long st_mtime;
+ unsigned long __pad6;
+
+ unsigned long st_ctime;
+ unsigned long __pad7; /* will be high 32 bits of ctime someday */
+
+ unsigned long __unused1;
+ unsigned long __unused2;
+};
+
+#endif /* _BITS_STAT_STRUCT_H */
+
diff --git a/libc/sysdeps/linux/sh64/bits/kernel_types.h b/libc/sysdeps/linux/sh64/bits/kernel_types.h
new file mode 100644
index 000000000..e4340eb60
--- /dev/null
+++ b/libc/sysdeps/linux/sh64/bits/kernel_types.h
@@ -0,0 +1,55 @@
+/*
+ * sysdeps/linux/sh64/bits/kernel_types.h
+ *
+ * Copyright (C) 2000, 2001 Paolo Alberelli
+ * Copyright (C) 2003 Paul Mundt
+ *
+ * This file is subject to the terms and conditions of the GNU Lesser
+ * General Public License. See the file COPYING.LIB in the main
+ * directory of this archive for more details.
+ */
+
+/*
+ * Note that we use the exact same include guard #define names
+ * as asm/posix_types.h. This will avoid gratuitous conflicts
+ * with the posix_types.h kernel header, and will ensure that
+ * our private content, and not the kernel header, will win.
+ * -Erik
+ */
+#ifndef __ASM_SH64_POSIX_TYPES_H
+#define __ASM_SH64_POSIX_TYPES_H
+
+typedef unsigned short __kernel_dev_t;
+typedef unsigned long __kernel_ino_t;
+typedef unsigned short __kernel_mode_t;
+typedef unsigned short __kernel_nlink_t;
+typedef long __kernel_off_t;
+typedef int __kernel_pid_t;
+typedef unsigned short __kernel_ipc_pid_t;
+typedef unsigned short __kernel_uid_t;
+typedef unsigned short __kernel_gid_t;
+typedef long unsigned int __kernel_size_t;
+typedef int __kernel_ssize_t;
+typedef int __kernel_ptrdiff_t;
+typedef long __kernel_time_t;
+typedef long __kernel_suseconds_t;
+typedef long __kernel_clock_t;
+typedef int __kernel_daddr_t;
+typedef char * __kernel_caddr_t;
+typedef unsigned short __kernel_uid16_t;
+typedef unsigned short __kernel_gid16_t;
+typedef unsigned int __kernel_uid32_t;
+typedef unsigned int __kernel_gid32_t;
+typedef unsigned short __kernel_old_uid_t;
+typedef unsigned short __kernel_old_gid_t;
+typedef long long __kernel_loff_t;
+
+typedef struct {
+#ifdef __USE_ALL
+ int val[2];
+#else
+ int __val[2];
+#endif
+} __kernel_fsid_t;
+
+#endif /* __ASM_SH64_POSIX_TYPES_H */
diff --git a/libc/sysdeps/linux/sh64/bits/setjmp.h b/libc/sysdeps/linux/sh64/bits/setjmp.h
new file mode 100644
index 000000000..08ffbc78c
--- /dev/null
+++ b/libc/sysdeps/linux/sh64/bits/setjmp.h
@@ -0,0 +1,48 @@
+/* Copyright (C) 1999, 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. */
+
+/* Define the machine-dependent type `jmp_buf'. SH-5 version. */
+
+#ifndef _SETJMP_H
+# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead."
+#endif
+
+#define __SETJMP_NUM_INT 31 /* number of integer registers to save */
+#define __SETJMP_NUM_DBL 0 /* 16 */ /* number of double registers to save */
+#define __SETJMP_NUM_TRG 3 /* number of traget registers to save */
+
+#define __SETJMP_INT(x) (x)
+#define __SETJMP_DBL(x) (__SETJMP_NUM_INT+(x))
+#define __SETJMP_TRG(x) (__SETJMP_NUM_INT+__SETJMP_NUM_DBL+(x))
+#define __SETJMP_LR (__SETJMP_NUM_INT+__SETJMP_NUM_DBL+__SETJMP_NUM_TRG)
+
+
+#ifndef _ASM
+typedef struct
+ {
+ /* Callee-saved registers. */
+ unsigned long long __ints[__SETJMP_NUM_INT]; /* integer registers */
+#if __SETJMP_NUM_DBL > 0
+ unsigned long long __dbls[__SETJMP_NUM_DBL]; /* double registers */
+#endif
+ unsigned long long __trgs[__SETJMP_NUM_TRG]; /* traget registers */
+ unsigned long long __lr; /* linkage register */
+ } __jmp_buf[1];
+#endif
+
+
diff --git a/libc/sysdeps/linux/sh64/bits/syscalls.h b/libc/sysdeps/linux/sh64/bits/syscalls.h
new file mode 100644
index 000000000..e6190303a
--- /dev/null
+++ b/libc/sysdeps/linux/sh64/bits/syscalls.h
@@ -0,0 +1,134 @@
+#ifndef _BITS_SYSCALLS_H
+#define _BITS_SYSCALLS_H
+#ifndef _SYSCALL_H
+# error "Never use <bits/syscalls.h> directly; include <sys/syscall.h> instead."
+#endif
+
+/* This includes the `__NR_<name>' syscall numbers taken from the Linux kernel
+ * header files. It also defines the traditional `SYS_<name>' macros for older
+ * programs. */
+#include <bits/sysnum.h>
+
+#ifndef __set_errno
+# define __set_errno(val) (*__errno_location ()) = (val)
+#endif
+#ifndef SYS_ify
+# define SYS_ify(syscall_name) (__NR_##syscall_name)
+#endif
+
+#ifndef __ASSEMBLER__
+
+/* user-visible error numbers are in the range -1 - -125: see <asm-sh64/errno.h> */
+#define __syscall_return(type, res) \
+do { \
+ /* Note: when returning from kernel the return value is in r9 \
+ ** This prevents conflicts between return value and arg1 \
+ ** when dispatching signal handler, in other words makes \
+ ** life easier in the system call epilogue (see entry.S) \
+ */ \
+ register unsigned long __sr2 __asm__ ("r2") = res; \
+ if ((unsigned long)(res) >= (unsigned long)(-125)) { \
+ errno = -(res); \
+ __sr2 = -1; \
+ } \
+ return (type) (__sr2); \
+} while (0)
+
+/* XXX - _foo needs to be __foo, while __NR_bar could be _NR_bar. */
+
+#define _syscall0(type,name) \
+type name(void) \
+{ \
+register unsigned long __sc0 __asm__ ("r9") = ((0x10 << 16) | __NR_##name); \
+__asm__ __volatile__ ("trapa %1" \
+ : "=r" (__sc0) \
+ : "r" (__sc0) ); \
+__syscall_return(type,__sc0); \
+}
+
+#define _syscall1(type,name,type1,arg1) \
+type name(type1 arg1) \
+{ \
+register unsigned long __sc0 __asm__ ("r9") = ((0x11 << 16) | __NR_##name); \
+register unsigned long __sc2 __asm__ ("r2") = (unsigned long) arg1; \
+__asm__ __volatile__ ("trapa %1" \
+ : "=r" (__sc0) \
+ : "r" (__sc0), "r" (__sc2)); \
+__syscall_return(type,__sc0); \
+}
+
+#define _syscall2(type,name,type1,arg1,type2,arg2) \
+type name(type1 arg1,type2 arg2) \
+{ \
+register unsigned long __sc0 __asm__ ("r9") = ((0x12 << 16) | __NR_##name); \
+register unsigned long __sc2 __asm__ ("r2") = (unsigned long) arg1; \
+register unsigned long __sc3 __asm__ ("r3") = (unsigned long) arg2; \
+__asm__ __volatile__ ("trapa %1" \
+ : "=r" (__sc0) \
+ : "r" (__sc0), "r" (__sc2), "r" (__sc3) ); \
+__syscall_return(type,__sc0); \
+}
+
+#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
+type name(type1 arg1,type2 arg2,type3 arg3) \
+{ \
+register unsigned long __sc0 __asm__ ("r9") = ((0x13 << 16) | __NR_##name); \
+register unsigned long __sc2 __asm__ ("r2") = (unsigned long) arg1; \
+register unsigned long __sc3 __asm__ ("r3") = (unsigned long) arg2; \
+register unsigned long __sc4 __asm__ ("r4") = (unsigned long) arg3; \
+__asm__ __volatile__ ("trapa %1" \
+ : "=r" (__sc0) \
+ : "r" (__sc0), "r" (__sc2), "r" (__sc3), "r" (__sc4) ); \
+__syscall_return(type,__sc0); \
+}
+
+#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
+type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
+{ \
+register unsigned long __sc0 __asm__ ("r9") = ((0x14 << 16) | __NR_##name); \
+register unsigned long __sc2 __asm__ ("r2") = (unsigned long) arg1; \
+register unsigned long __sc3 __asm__ ("r3") = (unsigned long) arg2; \
+register unsigned long __sc4 __asm__ ("r4") = (unsigned long) arg3; \
+register unsigned long __sc5 __asm__ ("r5") = (unsigned long) arg4; \
+__asm__ __volatile__ ("trapa %1" \
+ : "=r" (__sc0) \
+ : "r" (__sc0), "r" (__sc2), "r" (__sc3), "r" (__sc4), "r" (__sc5) );\
+__syscall_return(type,__sc0); \
+}
+
+#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \
+type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
+{ \
+register unsigned long __sc0 __asm__ ("r9") = ((0x15 << 16) | __NR_##name); \
+register unsigned long __sc2 __asm__ ("r2") = (unsigned long) arg1; \
+register unsigned long __sc3 __asm__ ("r3") = (unsigned long) arg2; \
+register unsigned long __sc4 __asm__ ("r4") = (unsigned long) arg3; \
+register unsigned long __sc5 __asm__ ("r5") = (unsigned long) arg4; \
+register unsigned long __sc6 __asm__ ("r6") = (unsigned long) arg5; \
+__asm__ __volatile__ ("trapa %1" \
+ : "=r" (__sc0) \
+ : "r" (__sc0), "r" (__sc2), "r" (__sc3), "r" (__sc4), "r" (__sc5), \
+ "r" (__sc6)); \
+__syscall_return(type,__sc0); \
+}
+
+#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5, type6, arg6) \
+type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6) \
+{ \
+register unsigned long __sc0 __asm__ ("r9") = ((0x16 << 16) | __NR_##name); \
+register unsigned long __sc2 __asm__ ("r2") = (unsigned long) arg1; \
+register unsigned long __sc3 __asm__ ("r3") = (unsigned long) arg2; \
+register unsigned long __sc4 __asm__ ("r4") = (unsigned long) arg3; \
+register unsigned long __sc5 __asm__ ("r5") = (unsigned long) arg4; \
+register unsigned long __sc6 __asm__ ("r6") = (unsigned long) arg5; \
+register unsigned long __sc7 __asm__ ("r7") = (unsigned long) arg6; \
+__asm__ __volatile__ ("trapa %1" \
+ : "=r" (__sc0) \
+ : "r" (__sc0), "r" (__sc2), "r" (__sc3), "r" (__sc4), "r" (__sc5), \
+ "r" (__sc6), "r" (__sc7)); \
+__syscall_return(type,__sc0); \
+}
+
+#endif /* __ASSEMBLER__ */
+#endif /* _BITS_SYSCALLS_H */
+
diff --git a/libc/sysdeps/linux/sh64/bits/wordsize.h b/libc/sysdeps/linux/sh64/bits/wordsize.h
new file mode 100644
index 000000000..7c2723be4
--- /dev/null
+++ b/libc/sysdeps/linux/sh64/bits/wordsize.h
@@ -0,0 +1,12 @@
+/*
+ * libc/sysdeps/linux/sh64/bits/wordsize.h
+ *
+ * Copyright (C) 2003 Paul Mundt
+ *
+ * This file is subject to the terms and conditions of the GNU Lesser
+ * General Public License. See the file COPYING.LIB in the main
+ * directory of this archive for more details.
+ */
+
+#define __WORDSIZE 32
+
diff --git a/libc/sysdeps/linux/sh64/brk.c b/libc/sysdeps/linux/sh64/brk.c
new file mode 100644
index 000000000..4f97fb084
--- /dev/null
+++ b/libc/sysdeps/linux/sh64/brk.c
@@ -0,0 +1,22 @@
+/* From libc-5.3.12 */
+
+#include <errno.h>
+#include <unistd.h>
+#include <sys/syscall.h>
+
+extern void * ___brk_addr;
+
+extern int __init_brk (void);
+extern void *_brk(void *ptr);
+
+int brk(void * end_data_seg)
+{
+ if (__init_brk () == 0)
+ {
+ ___brk_addr = _brk(end_data_seg);
+ if (___brk_addr == end_data_seg)
+ return 0;
+ __set_errno(ENOMEM);
+ }
+ return -1;
+}
diff --git a/libc/sysdeps/linux/sh64/crt0.S b/libc/sysdeps/linux/sh64/crt0.S
new file mode 100644
index 000000000..bd54ba5e2
--- /dev/null
+++ b/libc/sysdeps/linux/sh64/crt0.S
@@ -0,0 +1,78 @@
+/* Startup code for SH5 & ELF.
+ Copyright (C) 1999 Free Software Foundation, Inc.
+ Copyright (C) 2001 Hewlett-Packard Australia
+
+ 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.
+
+ At this entry point, most registers' values are unspecified, except:
+
+ 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
+*/
+
+ .file "crt0.S"
+
+ .globl _start
+ .globl __main
+
+ .type __uClibc_start_main,@function
+
+ .section .text64,"xa"
+ .align 2 /* 2^2 = 4 */
+
+_start:
+ /* Clear the frame pointer since this is the outermost frame. */
+### mov #0, r14 # qqq
+
+ /* Pop argc off the stack and save a pointer to argv */
+ ld.l r15, 0, r2 /* argc */
+ addi r15, 4, r3 /* argv */
+
+ /* set up the value for the environment pointer r4 = (argc+1)*4+argv */
+ addi r2, 1, r4 /* envp = argc + 1 */
+ shlli r4, 2, r4 /* envp = envp * 4 */
+ add r3, r4, r4 /* envp = envp + argv */
+
+ /* call main() */
+ movi __uClibc_start_main,r17
+ ptabs/l r17,tr0
+ blink tr0,r18
+
+ /* should never get here....*/
+### movi abort@lh,r17
+### shori abort@ll,r17
+ ptabs/l r17,tr0
+ blink tr0,r63 /* call abort() => (r63) do not come back ... */
+
+ /*
+ * The following is a stub to stop the GNU toolchain
+ * from calling its C-RTL initialization routines.
+ */
+__main:
+ ptabs/l r18,tr0
+ blink tr0,r63
+
diff --git a/libc/sysdeps/linux/sh64/fork.c b/libc/sysdeps/linux/sh64/fork.c
new file mode 100644
index 000000000..af56d3675
--- /dev/null
+++ b/libc/sysdeps/linux/sh64/fork.c
@@ -0,0 +1,35 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * fork for uClibc
+ *
+ * Copyright (C) 2000 by Lineo, inc. Written by Erik Andersen
+ * <andersen@lineo.com>, <andersee@debian.org>
+ *
+ * This program 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.
+ *
+ * This program 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 this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <errno.h>
+#include <features.h>
+#include <sys/types.h>
+#include <sys/syscall.h>
+
+#ifndef __HAS_NO_MMU__
+
+//#define __NR_fork 2
+#include <unistd.h>
+_syscall0(pid_t, fork);
+
+#endif
diff --git a/libc/sysdeps/linux/sh64/longjmp.S b/libc/sysdeps/linux/sh64/longjmp.S
new file mode 100644
index 000000000..d22a1677d
--- /dev/null
+++ b/libc/sysdeps/linux/sh64/longjmp.S
@@ -0,0 +1,140 @@
+/* longjmp for SH-5.
+ Copyright (C) 1999, 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. */
+
+
+#define _SETJMP_H
+#define _ASM
+#include <bits/setjmp.h>
+
+
+#define INTEGER(reg,offset) ld.q r2, offset*8, reg
+#define DOUBLE(reg,offset) fld.d r2, offset*8, reg
+
+
+ .file "longjmp.S"
+
+ .section .text64,"xa"
+ .align 2
+
+ .global longjmp
+ .type longjmp,@function
+
+longjmp:
+ /*
+ * extern void longjmp(jmp_buf env, int val);
+ *
+ * r2 == env
+ * r3 == val
+ * r4 == temporary
+ */
+
+ /* callee-save registers R10-R16 */
+ INTEGER(r10, __SETJMP_INT(0))
+ INTEGER(r11, __SETJMP_INT(1))
+ INTEGER(r12, __SETJMP_INT(2))
+ INTEGER(r13, __SETJMP_INT(3))
+ INTEGER(r14, __SETJMP_INT(4))
+ INTEGER(r15, __SETJMP_INT(5))
+ INTEGER(r16, __SETJMP_INT(6))
+
+ /* callee-save registers R28-R35 */
+ INTEGER(r28, __SETJMP_INT(7))
+ INTEGER(r29, __SETJMP_INT(8))
+ INTEGER(r30, __SETJMP_INT(9))
+ INTEGER(r31, __SETJMP_INT(10))
+ INTEGER(r32, __SETJMP_INT(11))
+ INTEGER(r33, __SETJMP_INT(12))
+ INTEGER(r34, __SETJMP_INT(13))
+ INTEGER(r35, __SETJMP_INT(14))
+
+ /* callee-save registers R44-R59 */
+ INTEGER(r44, __SETJMP_INT(15))
+ INTEGER(r45, __SETJMP_INT(16))
+ INTEGER(r46, __SETJMP_INT(17))
+ INTEGER(r47, __SETJMP_INT(18))
+ INTEGER(r48, __SETJMP_INT(19))
+ INTEGER(r49, __SETJMP_INT(20))
+ INTEGER(r50, __SETJMP_INT(21))
+ INTEGER(r51, __SETJMP_INT(22))
+ INTEGER(r52, __SETJMP_INT(23))
+ INTEGER(r53, __SETJMP_INT(24))
+ INTEGER(r54, __SETJMP_INT(25))
+ INTEGER(r55, __SETJMP_INT(26))
+ INTEGER(r56, __SETJMP_INT(27))
+ INTEGER(r57, __SETJMP_INT(28))
+ INTEGER(r58, __SETJMP_INT(29))
+ INTEGER(r59, __SETJMP_INT(30))
+
+ #if __SETJMP_NUM_INT != 31
+ #error __SETJMP_NUM_INT does agree with expected value
+ #endif
+
+#if __SETJMP_NUM_DBL > 0
+ /* callee-save registers FR12-FR15 */
+ DOUBLE(d12, __SETJMP_DBL(0))
+ DOUBLE(d14, __SETJMP_DBL(1))
+
+ /* callee-save registers FR36-FR63 */
+ DOUBLE(d36, __SETJMP_DBL(2))
+ DOUBLE(d38, __SETJMP_DBL(3))
+ DOUBLE(d40, __SETJMP_DBL(4))
+ DOUBLE(d42, __SETJMP_DBL(5))
+ DOUBLE(d44, __SETJMP_DBL(6))
+ DOUBLE(d46, __SETJMP_DBL(7))
+ DOUBLE(d48, __SETJMP_DBL(8))
+ DOUBLE(d50, __SETJMP_DBL(9))
+ DOUBLE(d52, __SETJMP_DBL(10))
+ DOUBLE(d54, __SETJMP_DBL(11))
+ DOUBLE(d56, __SETJMP_DBL(12))
+ DOUBLE(d58, __SETJMP_DBL(13))
+ DOUBLE(d60, __SETJMP_DBL(14))
+ DOUBLE(d62, __SETJMP_DBL(15))
+
+ #if __SETJMP_NUM_DBL != 16
+ #error __SETJMP_NUM_DBL does agree with expected value
+ #endif
+
+#endif /* __SETJMP_NUM_DBL > 0 */
+
+ /* callee-save registers TR5-TR7 */
+ INTEGER(r4, __SETJMP_TRG(0))
+ ptabs r4, tr5
+ INTEGER(r4, __SETJMP_TRG(1))
+ ptabs r4, tr6
+ INTEGER(r4, __SETJMP_TRG(2))
+ ptabs r4, tr7
+
+ #if __SETJMP_NUM_TRG != 3
+ #error __SETJMP_NUM_TRG does agree with expected value
+ #endif
+
+ /* restore Linkage Register (LR) for longjmp return */
+ INTEGER(r18, __SETJMP_LR)
+ ptabs/l r18, tr0
+
+ /*
+ * must ensure longjmp() never returns 0.
+ * if 'val' == 0, then return 1.
+ */
+ cmpeq r3, r63, r2 /* r2 = (r3==0) ? 1 : 0; */
+ add.l r3, r2, r2 /* return value */
+
+ /* return to caller */
+ blink tr0, r63
+
diff --git a/libc/sysdeps/linux/sh64/sbrk.c b/libc/sysdeps/linux/sh64/sbrk.c
new file mode 100644
index 000000000..c39d60063
--- /dev/null
+++ b/libc/sysdeps/linux/sh64/sbrk.c
@@ -0,0 +1,25 @@
+/* From libc-5.3.12 */
+
+#include <errno.h>
+#include <unistd.h>
+#include <sys/syscall.h>
+
+extern void * ___brk_addr;
+
+extern int __init_brk (void);
+extern void *_brk(void *ptr);
+
+void *
+sbrk(intptr_t increment)
+{
+ if (__init_brk () == 0)
+ {
+ char * tmp = (char*)___brk_addr+increment;
+ ___brk_addr = _brk(tmp);
+ if (___brk_addr == tmp)
+ return tmp-increment;
+ __set_errno(ENOMEM);
+ return ((void *) -1);
+ }
+ return ((void *) -1);
+}
diff --git a/libc/sysdeps/linux/sh64/setjmp.S b/libc/sysdeps/linux/sh64/setjmp.S
new file mode 100644
index 000000000..11d76d372
--- /dev/null
+++ b/libc/sysdeps/linux/sh64/setjmp.S
@@ -0,0 +1,140 @@
+/* setjmp for SH-5.
+ Copyright (C) 2001 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 _SETJMP_H
+#define _ASM
+#include <bits/setjmp.h>
+
+
+#define INTEGER(reg,offset) st.q r2, offset*8, reg
+#define DOUBLE(reg,offset) fst.d r2, offset*8, reg
+
+
+ .file "setjmp.S"
+
+ .section .text64,"xa"
+ .align 2
+
+ .global __sigsetjmp
+ .type __sigsetjmp,@function
+
+__sigsetjmp:
+ /*
+ * extern int __sigsetjmp(jmp_buf env, int savemask);
+ *
+ * r2 == env
+ * r3 == savemask
+ * r4 == temporary
+ */
+
+ /* callee-save registers R10-R16 */
+ INTEGER(r10, __SETJMP_INT(0))
+ INTEGER(r11, __SETJMP_INT(1))
+ INTEGER(r12, __SETJMP_INT(2))
+ INTEGER(r13, __SETJMP_INT(3))
+ INTEGER(r14, __SETJMP_INT(4))
+ INTEGER(r15, __SETJMP_INT(5))
+ INTEGER(r16, __SETJMP_INT(6))
+
+ /* callee-save registers R28-R35 */
+ INTEGER(r28, __SETJMP_INT(7))
+ INTEGER(r29, __SETJMP_INT(8))
+ INTEGER(r30, __SETJMP_INT(9))
+ INTEGER(r31, __SETJMP_INT(10))
+ INTEGER(r32, __SETJMP_INT(11))
+ INTEGER(r33, __SETJMP_INT(12))
+ INTEGER(r34, __SETJMP_INT(13))
+ INTEGER(r35, __SETJMP_INT(14))
+
+ /* callee-save registers R44-R59 */
+ INTEGER(r44, __SETJMP_INT(15))
+ INTEGER(r45, __SETJMP_INT(16))
+ INTEGER(r46, __SETJMP_INT(17))
+ INTEGER(r47, __SETJMP_INT(18))
+ INTEGER(r48, __SETJMP_INT(19))
+ INTEGER(r49, __SETJMP_INT(20))
+ INTEGER(r50, __SETJMP_INT(21))
+ INTEGER(r51, __SETJMP_INT(22))
+ INTEGER(r52, __SETJMP_INT(23))
+ INTEGER(r53, __SETJMP_INT(24))
+ INTEGER(r54, __SETJMP_INT(25))
+ INTEGER(r55, __SETJMP_INT(26))
+ INTEGER(r56, __SETJMP_INT(27))
+ INTEGER(r57, __SETJMP_INT(28))
+ INTEGER(r58, __SETJMP_INT(29))
+ INTEGER(r59, __SETJMP_INT(30))
+
+ #if __SETJMP_NUM_INT != 31
+ #error __SETJMP_NUM_INT does agree with expected value
+ #endif
+
+#if __SETJMP_NUM_DBL > 0
+ /* callee-save registers FR12-FR15 */
+ DOUBLE(d12, __SETJMP_DBL(0))
+ DOUBLE(d14, __SETJMP_DBL(1))
+
+ /* callee-save registers FR36-FR63 */
+ DOUBLE(d36, __SETJMP_DBL(2))
+ DOUBLE(d38, __SETJMP_DBL(3))
+ DOUBLE(d40, __SETJMP_DBL(4))
+ DOUBLE(d42, __SETJMP_DBL(5))
+ DOUBLE(d44, __SETJMP_DBL(6))
+ DOUBLE(d46, __SETJMP_DBL(7))
+ DOUBLE(d48, __SETJMP_DBL(8))
+ DOUBLE(d50, __SETJMP_DBL(9))
+ DOUBLE(d52, __SETJMP_DBL(10))
+ DOUBLE(d54, __SETJMP_DBL(11))
+ DOUBLE(d56, __SETJMP_DBL(12))
+ DOUBLE(d58, __SETJMP_DBL(13))
+ DOUBLE(d60, __SETJMP_DBL(14))
+ DOUBLE(d62, __SETJMP_DBL(15))
+
+ #if __SETJMP_NUM_DBL != 16
+ #error __SETJMP_NUM_DBL does agree with expected value
+ #endif
+
+#endif /* __SETJMP_NUM_DBL > 0 */
+
+ /* callee-save registers TR5-TR7 */
+ gettr tr5, r4
+ INTEGER(r4, __SETJMP_TRG(0))
+ gettr tr6, r4
+ INTEGER(r4, __SETJMP_TRG(1))
+ gettr tr7, r4
+ INTEGER(r4, __SETJMP_TRG(2))
+
+ #if __SETJMP_NUM_TRG != 3
+ #error __SETJMP_NUM_TRG does agree with expected value
+ #endif
+
+ /* save Linkage Register (LR) for longjmp return */
+ INTEGER(r18, __SETJMP_LR)
+
+ /*
+ * return a value of zero if call is __sigsetjmp().
+ * This is so that caller of setjmp() knows
+ * we have retruned via setjmp, and not via longjmp.
+ * R0 is the result register.
+ */
+
+ ptabs/l r18, tr0 /* return to caller */
+ movi 0, r2 /* return value */
+ blink tr0, r63
+
diff --git a/libc/sysdeps/linux/sh64/sys/ucontext.h b/libc/sysdeps/linux/sh64/sys/ucontext.h
new file mode 100644
index 000000000..16feb49a5
--- /dev/null
+++ b/libc/sysdeps/linux/sh64/sys/ucontext.h
@@ -0,0 +1,205 @@
+/* Copyright (C) 1999, 2000, 2001 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 long long greg_t;
+
+/* Number of general registers. */
+#define NGREG 64
+
+/* Container for all general registers. */
+typedef greg_t gregset_t[NGREG];
+
+#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
+ R16 = 16,
+#define R16 R16
+ R17 = 17,
+#define R17 R17
+ R18 = 18,
+#define R18 R18
+ R19 = 19,
+#define R19 R19
+ R20 = 20,
+#define R20 R20
+ R21 = 21,
+#define R21 R21
+ R22 = 22,
+#define R22 R22
+ R23 = 23,
+#define R23 R23
+ R24 = 24,
+#define R24 R24
+ R25 = 25,
+#define R25 R25
+ R26 = 26,
+#define R26 R26
+ R27 = 27,
+#define R27 R27
+ R28 = 28,
+#define R28 R28
+ R29 = 29,
+#define R29 R29
+ R30 = 30,
+#define R30 R30
+ R31 = 31,
+#define R31 R31
+ R32 = 32,
+#define R32 R32
+ R33 = 33,
+#define R33 R33
+ R34 = 34,
+#define R34 R34
+ R35 = 35,
+#define R35 R35
+ R36 = 36,
+#define R36 R36
+ R37 = 37,
+#define R37 R37
+ R38 = 38,
+#define R38 R38
+ R39 = 39,
+#define R39 R39
+ R40 = 40,
+#define R40 R40
+ R41 = 41,
+#define R41 R41
+ R42 = 42,
+#define R42 R42
+ R43 = 43,
+#define R43 R43
+ R44 = 44,
+#define R44 R44
+ R45 = 45,
+#define R45 R45
+ R46 = 46,
+#define R46 R46
+ R47 = 47,
+#define R47 R47
+ R48 = 48,
+#define R48 R48
+ R49 = 49,
+#define R49 R49
+ R50 = 50,
+#define R50 R50
+ R51 = 51,
+#define R51 R51
+ R52 = 52,
+#define R52 R52
+ R53 = 53,
+#define R53 R53
+ R54 = 54,
+#define R54 R54
+ R55 = 55,
+#define R55 R55
+ R56 = 56,
+#define R56 R56
+ R57 = 57,
+#define R57 R57
+ R58 = 58,
+#define R58 R58
+ R59 = 59,
+#define R59 R59
+ R60 = 60,
+#define R60 R60
+ R61 = 61,
+#define R61 R61
+ R62 = 62,
+#define R62 R62
+ R63 = 63,
+#define R63 R63
+};
+#endif
+
+typedef int freg_t;
+
+/* Number of FPU registers. */
+#define NFPREG 32
+
+/* 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;
+ unsigned long long sc_tregs[8];
+ unsigned long long sc_pc;
+ unsigned long long sc_sr;
+ unsigned long long sc_fpscr;
+
+ } 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 */