From de2abcca5af59ebc11f66fb6fb491e16f50c8166 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Thu, 21 Nov 2002 06:43:23 +0000 Subject: Patch from Yoshinori Sato to update the h8300 architecture. --- Rules.mak | 5 ++ extra/Configs/Config.h8300 | 1 - extra/scripts/initfini.awk | 2 + libc/misc/internals/abi-note.S | 4 ++ libc/sysdeps/linux/h8300/bits/kernel_stat.h | 88 ++++++++++++++++++++++++++++ libc/sysdeps/linux/h8300/bits/kernel_types.h | 47 +++++++++++++++ libc/sysdeps/linux/h8300/bits/mman.h | 75 ++++++++++++++++++++++++ libc/sysdeps/linux/h8300/sys/ucontext.h | 75 ++++++++++++++++++++++++ 8 files changed, 296 insertions(+), 1 deletion(-) create mode 100644 libc/sysdeps/linux/h8300/bits/kernel_stat.h create mode 100644 libc/sysdeps/linux/h8300/bits/kernel_types.h create mode 100644 libc/sysdeps/linux/h8300/bits/mman.h create mode 100644 libc/sysdeps/linux/h8300/sys/ucontext.h diff --git a/Rules.mak b/Rules.mak index 46e480801..dd3a6cab0 100644 --- a/Rules.mak +++ b/Rules.mak @@ -150,6 +150,11 @@ ifeq ($(strip $(TARGET_ARCH)),sh) CPU_CFLAGS-$(CONFIG_SH5)+="-m5" endif +ifeq ($(strip $(TARGET_ARCH)),h8300) + CPU_LDFLAGS-y:=-mh8300h + CPU_CFLAGS-y+=-mh -mint32 -fsigned-char +endif + # Add a bunch of extra pedantic annoyingly strict checks WARNINGS+=-Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing # Some nice CFLAGS to work with diff --git a/extra/Configs/Config.h8300 b/extra/Configs/Config.h8300 index 8620dfa4a..657128d17 100644 --- a/extra/Configs/Config.h8300 +++ b/extra/Configs/Config.h8300 @@ -13,7 +13,6 @@ config HAVE_ELF config ARCH_CFLAGS string - default "-mh -mint32 -fsigned-char" config ARCH_LDFLAGS string diff --git a/extra/scripts/initfini.awk b/extra/scripts/initfini.awk index a04d5e5b0..a079d3442 100755 --- a/extra/scripts/initfini.awk +++ b/extra/scripts/initfini.awk @@ -35,6 +35,8 @@ BEGIN \ /_fini_SH_GLB/ && glb_idx>=2 {print glb_label[1] glb >> "crti.S"} /SH_GLB_ENDS/ && glb_idx==0 {omitcrti -=1} /SH_GLB/ || /_GLOBAL_OFFSET_TABLE_/{getline} +# special rules for H8/300 (sorry quick hack) +/.h8300h/ {end=0} # rules for all targets /HEADER_ENDS/{omitcrti=1;omitcrtn=1;getline} diff --git a/libc/misc/internals/abi-note.S b/libc/misc/internals/abi-note.S index 5c30c35a8..e6bbbe6ae 100644 --- a/libc/misc/internals/abi-note.S +++ b/libc/misc/internals/abi-note.S @@ -60,7 +60,11 @@ offset length contents name begins with `.note' and creates a PT_NOTE program header entry pointing at it. */ +#ifdef HAVE_ELF .section ".note.ABI-tag", "a" +#else + .section .note +#endif .align 4 .long 1f - 0f /* name length */ .long 3f - 2f /* data length */ diff --git a/libc/sysdeps/linux/h8300/bits/kernel_stat.h b/libc/sysdeps/linux/h8300/bits/kernel_stat.h new file mode 100644 index 000000000..5ca018eac --- /dev/null +++ b/libc/sysdeps/linux/h8300/bits/kernel_stat.h @@ -0,0 +1,88 @@ +#ifndef _BITS_STAT_STRUCT_H +#define _BITS_STAT_STRUCT_H + +/* This file provides whatever this particular arch's kernel thinks + * struct stat should look like... It turns out each arch has a + * different opinion on the subject... */ + +#ifndef __USE_FILE_OFFSET64 +struct 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; +}; +#else +struct stat { + unsigned char __pad0[6]; + unsigned short st_dev; + unsigned char __pad1[2]; +#define STAT64_HAS_BROKEN_ST_INO 1 + unsigned long __st_ino; + unsigned int st_mode; + unsigned int st_nlink; + unsigned long st_uid; + unsigned long st_gid; + unsigned char __pad2[6]; + unsigned short st_rdev; + unsigned char __pad3[2]; + long long st_size; + unsigned long st_blksize; + unsigned long __pad4; /* future possible st_blocks high bits */ + unsigned long st_blocks; /* Number 512-byte blocks allocated. */ + 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 long st_ino; +}; +#endif + +#ifdef __USE_LARGEFILE64 +struct stat64 { + unsigned char __pad0[6]; + unsigned short st_dev; + unsigned char __pad1[2]; +#define STAT64_HAS_BROKEN_ST_INO 1 + unsigned long __st_ino; + unsigned int st_mode; + unsigned int st_nlink; + unsigned long st_uid; + unsigned long st_gid; + unsigned char __pad2[6]; + unsigned short st_rdev; + unsigned char __pad3[2]; + long long st_size; + unsigned long st_blksize; + unsigned long __pad4; /* future possible st_blocks high bits */ + unsigned long st_blocks; /* Number 512-byte blocks allocated. */ + 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 long st_ino; +}; +#endif + +#endif /* _BITS_STAT_STRUCT_H */ + diff --git a/libc/sysdeps/linux/h8300/bits/kernel_types.h b/libc/sysdeps/linux/h8300/bits/kernel_types.h new file mode 100644 index 000000000..4f5f2864f --- /dev/null +++ b/libc/sysdeps/linux/h8300/bits/kernel_types.h @@ -0,0 +1,47 @@ +/* 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 __ARCH_H8300_POSIX_TYPES_H +#define __ARCH_H8300_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 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; + +#ifdef __GNUC__ +typedef long long __kernel_loff_t; +#endif + +typedef struct { +#ifdef __USE_ALL + int val[2]; +#else + int __val[2]; +#endif +} __kernel_fsid_t; + +#endif /* __ARCH_H8300_POSIX_TYPES_H */ diff --git a/libc/sysdeps/linux/h8300/bits/mman.h b/libc/sysdeps/linux/h8300/bits/mman.h new file mode 100644 index 000000000..4bf232029 --- /dev/null +++ b/libc/sysdeps/linux/h8300/bits/mman.h @@ -0,0 +1,75 @@ +/* Definitions for BSD-style memory management. + Copyright (C) 1994-1998,2000,01 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. */ + +/* These are the bits used by 4.4 BSD and its derivatives. On systems + (such as GNU) where these facilities are not system services but can be + emulated in the C library, these are the definitions we emulate. */ + +#ifndef _SYS_MMAN_H +# error "Never use directly; include instead." +#endif + +/* Protections are chosen from these bits, OR'd together. The + implementation does not necessarily support PROT_EXEC or PROT_WRITE + without PROT_READ. The only guarantees are that no writing will be + allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */ + +#define PROT_NONE 0x00 /* No access. */ +#define PROT_READ 0x01 /* Pages can be read. */ +#define PROT_WRITE 0x02 /* Pages can be written. */ +#define PROT_EXEC 0x04 /* Pages can be executed. */ + +/* Sharing types (must choose one and only one of these). */ +#define MAP_SHARED 0x01 /* Share changes. */ +#define MAP_PRIVATE 0x02 /* Changes are private. */ +#ifdef __USE_MISC +# define MAP_TYPE 0x0f /* Mask for type of mapping. */ +#endif + +/* Other flags. */ +#define MAP_FIXED 0x10 /* Interpret addr exactly. */ +#ifdef __USE_MISC +# define MAP_FILE 0 +# define MAP_ANONYMOUS 0x20 /* Don't use a file. */ +# define MAP_ANON MAP_ANONYMOUS +#endif + +/* These are Linux-specific. */ +#ifdef __USE_MISC +# define MAP_GROWSDOWN 0x0100 /* Stack-like segment. */ +# define MAP_DENYWRITE 0x0800 /* ETXTBSY */ +# define MAP_EXECUTABLE 0x1000 /* Mark it as an executable. */ +# define MAP_LOCKED 0x2000 /* Lock the mapping. */ +# define MAP_NORESERVE 0x4000 /* Don't check for reservations. */ +#endif + +/* Flags to `msync'. */ +#define MS_ASYNC 1 /* Sync memory asynchronously. */ +#define MS_SYNC 4 /* Synchronous memory sync. */ +#define MS_INVALIDATE 2 /* Invalidate the caches. */ + +/* Flags for `mlockall'. */ +#define MCL_CURRENT 1 /* Lock all currently mapped pages. */ +#define MCL_FUTURE 2 /* Lock all additions to address + space. */ + +/* Flags for `mremap'. */ +#ifdef __USE_GNU +# define MREMAP_MAYMOVE 1 +#endif diff --git a/libc/sysdeps/linux/h8300/sys/ucontext.h b/libc/sysdeps/linux/h8300/sys/ucontext.h new file mode 100644 index 000000000..ffc9ea024 --- /dev/null +++ b/libc/sysdeps/linux/h8300/sys/ucontext.h @@ -0,0 +1,75 @@ +/* Copyright (C) 1997, 1999, 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 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. */ + +/* H8/300 compliant context switching support. */ + +#ifndef _SYS_UCONTEXT_H +#define _SYS_UCONTEXT_H 1 + +#include +#include + +typedef int greg_t; + +/* Number of general registers. */ +#define NFPREG 8 + +/* Container for all general registers. */ +typedef greg_t gregset_t[NFPREG]; + +#ifdef __USE_GNU +/* Number of each register is the `gregset_t' array. */ +enum +{ + ER0 = 0, +#define ER0 ER0 + ER1 = 1, +#define ER1 ER1 + ER2 = 2, +#define ER2 ER2 + ER3 = 3, +#define ER3 ER3 + ER4 = 4, +#define ER4 ER4 + ER5 = 5, +#define ER5 ER5 + ER6 = 6, +#define ER6 ER6 + ER7 = 7, +#define ER7 ER7 +}; +#endif + +/* Context to describe whole processor state. */ +typedef struct + { + gregset_t gregs; + } 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 + -- cgit v1.2.3