diff options
author | gcc <gcc@7b3dc134-2b1b-0410-93df-9e9f96275f8d> | 2006-08-17 01:30:22 +0000 |
---|---|---|
committer | gcc <gcc@7b3dc134-2b1b-0410-93df-9e9f96275f8d> | 2006-08-17 01:30:22 +0000 |
commit | d5eb8bbe5f32d1af4db8b731c3bf290217fcb18e (patch) | |
tree | 7cef18fec81193830f7bff57599d11d34dc565bf /ports/sysdeps | |
parent | 976b1f28a501872989e39e2db5cbe16ee7c4548e (diff) |
Import glibc-ports-2.3 for 2006-08-16eglibc-2_3@52
git-svn-id: svn://svn.eglibc.org/fsf/glibc-2_3-branch@12 7b3dc134-2b1b-0410-93df-9e9f96275f8d
Diffstat (limited to 'ports/sysdeps')
643 files changed, 29191 insertions, 0 deletions
diff --git a/ports/sysdeps/am29k/ffs.c b/ports/sysdeps/am29k/ffs.c new file mode 100644 index 000000000..6f080db44 --- /dev/null +++ b/ports/sysdeps/am29k/ffs.c @@ -0,0 +1,43 @@ +/* ffs -- find first set bit in a word, counted from least significant end. + For Amd 290x0. + Copyright (C) 1991, 1992, 1997, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Torbjorn Granlund (tege@sics.se). + + 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. */ + +#include <bstring.h> + +#undef ffs + +#ifdef __GNUC__ + +int +__ffs (x) + int x; +{ + int cnt; + + asm ("clz %0,%1" : "=r" (cnt) : "r" (x & -x)); + + return 32 - cnt; +} +weak_alias (__ffs, ffs) +libc_hidden_builtin_def (ffs) + +#else +#include <sysdeps/generic/ffs.c> +#endif diff --git a/ports/sysdeps/am33/Implies b/ports/sysdeps/am33/Implies new file mode 100644 index 000000000..780c4e246 --- /dev/null +++ b/ports/sysdeps/am33/Implies @@ -0,0 +1,3 @@ +wordsize-32 +ieee754/flt-32 +ieee754/dbl-64 diff --git a/ports/sysdeps/am33/__longjmp.S b/ports/sysdeps/am33/__longjmp.S new file mode 100644 index 000000000..9bdcc489e --- /dev/null +++ b/ports/sysdeps/am33/__longjmp.S @@ -0,0 +1,61 @@ +/* longjmp for AM33. + Copyright 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. */ + +#include <sysdep.h> +#define _ASM +#define _SETJMP_H +#include <bits/setjmp.h> +#include <asm-syntax.h> + +ENTRY (__longjmp) + mov d0,a0 + mov (8,a0),d2 + mov d2,mdr + mov (0,a0),d2 + mov (4,a0),d3 + mov (12,a0),a2 + mov (16,a0),a3 + mov (20,a0),a1 + mov a1,sp + add 24,a0 + mov (a0+),r4 + mov (a0+),r5 + mov (a0+),r6 + mov (a0+),r7 +#ifdef __AM33_2__ + fmov (a0+),fs4 + fmov (a0+),fs5 + fmov (a0+),fs6 + fmov (a0+),fs7 + fmov (a0+),fs8 + fmov (a0+),fs9 + fmov (a0+),fs10 + fmov (a0+),fs11 + fmov (a0+),fs12 + fmov (a0+),fs13 + fmov (a0+),fs14 + fmov (a0+),fs15 + fmov (a0+),fs16 + fmov (a0+),fs17 + fmov (a0+),fs18 + fmov (a0+),fs19 +#endif + mov d1,d0 + retf [],0 +END (__longjmp) diff --git a/ports/sysdeps/am33/atomicity.h b/ports/sysdeps/am33/atomicity.h new file mode 100644 index 000000000..d7765338a --- /dev/null +++ b/ports/sysdeps/am33/atomicity.h @@ -0,0 +1,87 @@ +/* Low-level functions for atomic operations. AM33 version. + Copyright 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com>. + Based on ../sparc/sparc32/atomicity.h + + 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. */ + +#ifndef _ATOMICITY_H +#define _ATOMICITY_H 1 + +#include <inttypes.h> + +#define __acquire_lock(lock) \ + __asm__ __volatile__("1: bset %1, (%0)\n\t" \ + " beq 1b" \ + : : "a" (&(lock)), "d" (1) \ + : "memory") + +#define __release_lock(lock) lock = 0 + +static int +__attribute__ ((unused)) +exchange_and_add (volatile uint32_t *mem, int val) +{ + static unsigned char lock; + int result; + + __acquire_lock (lock); + + result = *mem; + *mem += val; + + __release_lock (lock); + + return result; +} + +static void +__attribute__ ((unused)) +atomic_add (volatile uint32_t *mem, int val) +{ + static unsigned char lock; + + __acquire_lock (lock); + + *mem += val; + + __release_lock (lock); +} + +static int +__attribute__ ((unused)) +compare_and_swap (volatile long int *p, long int oldval, long int newval) +{ + static unsigned char lock; + int ret; + + __acquire_lock (lock); + + if (*p != oldval) + ret = 0; + else + { + *p = newval; + ret = 1; + } + + __release_lock (lock); + + return ret; +} + +#endif /* atomicity.h */ diff --git a/ports/sysdeps/am33/bits/endian.h b/ports/sysdeps/am33/bits/endian.h new file mode 100644 index 000000000..7423f0957 --- /dev/null +++ b/ports/sysdeps/am33/bits/endian.h @@ -0,0 +1,7 @@ +/* AM33 is little-endian. */ + +#ifndef _ENDIAN_H +# error "Never use <bits/endian.h> directly; include <endian.h> instead." +#endif + +#define __BYTE_ORDER __LITTLE_ENDIAN diff --git a/ports/sysdeps/am33/bits/setjmp.h b/ports/sysdeps/am33/bits/setjmp.h new file mode 100644 index 000000000..5864b92e6 --- /dev/null +++ b/ports/sysdeps/am33/bits/setjmp.h @@ -0,0 +1,34 @@ +/* Copyright 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. */ + +/* Define the machine-dependent type `jmp_buf'. AM33 version. */ + +#ifndef _SETJMP_H +# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead." +#endif + +#ifndef _ASM +typedef int __jmp_buf[26]; +#endif + +#define __JMP_BUF_SP 20 + +/* Test if longjmp to JMPBUF would unwind the frame + containing a local variable at ADDRESS. */ +#define _JMPBUF_UNWINDS(jmpbuf, address) \ + ((void *) (address) < (void *) (jmpbuf[__JMP_BUF_SP])) diff --git a/ports/sysdeps/am33/bsd-_setjmp.S b/ports/sysdeps/am33/bsd-_setjmp.S new file mode 100644 index 000000000..9bbfcbbba --- /dev/null +++ b/ports/sysdeps/am33/bsd-_setjmp.S @@ -0,0 +1 @@ +/* _setjmp is in setjmp.S */ diff --git a/ports/sysdeps/am33/bsd-setjmp.S b/ports/sysdeps/am33/bsd-setjmp.S new file mode 100644 index 000000000..b6b239e67 --- /dev/null +++ b/ports/sysdeps/am33/bsd-setjmp.S @@ -0,0 +1 @@ +/* setjmp is in setjmp.S */ diff --git a/ports/sysdeps/am33/dl-machine.h b/ports/sysdeps/am33/dl-machine.h new file mode 100644 index 000000000..808fd9cc8 --- /dev/null +++ b/ports/sysdeps/am33/dl-machine.h @@ -0,0 +1,481 @@ +/* Machine-dependent ELF dynamic relocation inline functions. AM33 version. + Copyright (C) 1995,96,97,98,99,2000,2001, 2004 + 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. */ + +#ifndef dl_machine_h +#define dl_machine_h + +#define ELF_MACHINE_NAME "mn10300" + +#include <sys/param.h> + +/* Return nonzero iff ELF header is compatible with the running host. */ +static inline int __attribute__ ((unused)) +elf_machine_matches_host (const Elf32_Ehdr *ehdr) +{ + return ehdr->e_machine == EM_MN10300; +} + + +/* Return the link-time address of _DYNAMIC. Conveniently, this is the + first element of the GOT. This must be inlined in a function which + uses global data. */ +static inline Elf32_Addr __attribute__ ((unused)) +elf_machine_dynamic (void) +{ + register Elf32_Addr *got asm ("a2"); + return *got; +} + + +/* Return the run-time load address of the shared object. */ +static inline Elf32_Addr __attribute__ ((unused)) +elf_machine_load_address (void) +{ + register Elf32_Addr gotaddr asm ("a2"); + Elf32_Addr off, gotval; + + asm ("mov _dl_start@GOTOFF,%0" : "=r" (off)); + asm ("mov (_dl_start@GOT,%1),%0" : "=r" (gotval) : "r" (gotaddr)); + + return off + gotaddr - gotval; +} + +#if !defined PROF && !__BOUNDED_POINTERS__ +/* We add a declaration of this function here so that in dl-runtime.c + the ELF_MACHINE_RUNTIME_TRAMPOLINE macro really can pass the parameters + in registers. + + We cannot use this scheme for profiling because the _mcount call + destroys the passed register information. */ +/* GKM FIXME: Fix trampoline to pass bounds so we can do + without the `__unbounded' qualifier. */ +static ElfW(Addr) fixup (struct link_map *__unbounded l, ElfW(Word) reloc_offset) + __attribute__ ((unused)); +static ElfW(Addr) profile_fixup (struct link_map *l, ElfW(Word) reloc_offset, + ElfW(Addr) retaddr) + __attribute__ ((unused)); +#endif + +/* Set up the loaded object described by L so its unrelocated PLT + entries will jump to the on-demand fixup code in dl-runtime.c. */ + +static inline int __attribute__ ((unused)) +elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) +{ + Elf32_Addr *got; + extern void _dl_runtime_resolve (Elf32_Word) attribute_hidden; + extern void _dl_runtime_profile (Elf32_Word) attribute_hidden; + + if (l->l_info[DT_JMPREL] && lazy) + { + /* The GOT entries for functions in the PLT have not yet been filled + in. Their initial contents will arrange when called to push an + offset into the .rel.plt section, push _GLOBAL_OFFSET_TABLE_[1], + and then jump to _GLOBAL_OFFSET_TABLE[2]. */ + got = (Elf32_Addr *) D_PTR (l, l_info[DT_PLTGOT]); + got[1] = (Elf32_Addr) l; /* Identify this shared object. */ + + /* The got[2] entry contains the address of a function which gets + called to get the address of a so far unresolved function and + jump to it. The profiling extension of the dynamic linker allows + to intercept the calls to collect information. In this case we + don't store the address in the GOT so that all future calls also + end in this function. */ + if (__builtin_expect (profile, 0)) + { + got[2] = (Elf32_Addr) &_dl_runtime_profile; + + if (_dl_name_match_p (GLRO(dl_profile), l)) + /* This is the object we are looking for. Say that we really + want profiling and the timers are started. */ + GL(dl_profile_map) = l; + } + else + /* This function will get called to fix up the GOT entry indicated by + the offset on the stack, and then jump to the resolved address. */ + got[2] = (Elf32_Addr) &_dl_runtime_resolve; + } + + return lazy; +} + +/* This code is used in dl-runtime.c to call the `fixup' function + and then redirect to the address it returns. */ +#if !defined PROF && !__BOUNDED_POINTERS__ +# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\ + .text\n\ + .globl _dl_runtime_resolve\n\ + .type _dl_runtime_resolve, @function\n\ +_dl_runtime_resolve:\n\ + add -12,sp # Preserve registers otherwise clobbered.\n\ + mov d1,(20,sp)\n\ + mov d0,(16,sp)\n\ + mov r1,d0\n\ + mov r0,d1\n\ + call fixup,[],0 # Call resolver.\n\ + mov d0,a0\n\ + mov (12,sp),d1 # Copy return address back to mdr,\n\ + mov d1,mdr # in case the callee returns with retf\n\ + mov (16,sp),d0 # Get register content back.\n\ + mov (20,sp),d1\n\ + add 12,sp\n\ + jmp (a0)\n\ + .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\ +\n\ + .globl _dl_runtime_profile\n\ + .type _dl_runtime_profile, @function\n\ +_dl_runtime_profile:\n\ + add -12,sp # Preserve registers otherwise clobbered.\n\ + mov d1,(20,sp)\n\ + mov d0,(16,sp)\n\ + mov r1,d0\n\ + mov r0,d1\n\ + call profile_fixup,[],0 # Call resolver.\n\ + mov d0,a0\n\ + mov (12,sp),d1 # Copy return address back to mdr,\n\ + mov d1,mdr # in case the callee returns with retf\n\ + mov (16,sp),d0 # Get register content back.\n\ + mov (20,sp),d1\n\ + add 12,sp\n\ + jmp (a0)\n\ + .size _dl_runtime_profile, .-_dl_runtime_profile\n\ + .previous\n\ +"); +#else +# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\n\ + .text\n\ + .globl _dl_runtime_resolve\n\ + .globl _dl_runtime_profile\n\ + .type _dl_runtime_resolve, @function\n\ + .type _dl_runtime_profile, @function\n\ +_dl_runtime_resolve:\n\ +_dl_runtime_profile:\n\ + add -12,sp # Preserve registers otherwise clobbered.\n\ + mov d1,(20,sp)\n\ + mov d0,(16,sp)\n\ + mov r1,d0\n\ + mov r0,d1\n\ + call profile_fixup,[],0 # Call resolver.\n\ + mov d0,a0\n\ + mov (12,sp),d1 # Copy return address back to mdr,\n\ + mov d1,mdr # in case the callee returns with retf\n\ + mov (16,sp),d0 # Get register content back.\n\ + mov (20,sp),d1\n\ + add 12,sp\n\ + jmp (a0)\n\ + .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\ + .size _dl_runtime_profile, .-_dl_runtime_profile\n\ + .previous\n\ +"); +#endif + +/* Mask identifying addresses reserved for the user program, + where the dynamic linker should not map anything. */ +#define ELF_MACHINE_USER_ADDRESS_MASK 0xf8000000UL + +/* Initial entry point code for the dynamic linker. + The C function `_dl_start' is the real entry point; + its return value is the user program's entry point. */ +#define RTLD_START asm ("\n\ + .text\n\ +.globl _start\n\ +.globl _dl_start_user\n\ +_start:\n\ + mov 0,a3 # Mark the top of the stack\n\ + mov sp,a1\n\ + add -20,sp # Prepare for function call\n\ + mov a1,d0\n\ + call _dl_start,[],0\n\ +_dl_start_user:\n\ + # Save the user entry point address in d2.\n\ + mov d0,d2\n\ + # Point a2 at the GOT.\n\ +0: mov pc,a2\n\ + add _GLOBAL_OFFSET_TABLE_ - (0b-.),a2\n\ + # Store the highest stack address\n\ + mov (__libc_stack_end@GOT,a2),a0\n\ + mov a1,(a0)\n\ + # See if we were run as a command with the executable file\n\ + # name as an extra leading argument.\n\ + mov (_dl_skip_args@GOT,a2),a0\n\ + mov (a0),d0\n\ + # Pop the original argument count.\n\ + mov (20,sp),d3\n\ + # Subtract _dl_skip_args from it.\n\ + sub d0,d3\n\ + # Adjust the stack pointer to skip _dl_skip_args words.\n\ + asl2 d0\n\ + mov sp,a0\n\ + add d0,a0\n\ + mov a0,sp\n\ + # Push argc back on the stack.\n\ + mov d3,(20,sp)\n\ + # The special initializer gets called with the stack just\n\ + # as the application's entry point will see it; it can\n\ + # switch stacks if it moves these contents over.\n\ +" RTLD_START_SPECIAL_INIT "\n\ + # Load the parameters again.\n\ + # (d0, d1, (12,sp), (16,sp)) = (_dl_loaded, argc, argv, envp)\n\ + add 24,a0\n\ + mov a0,(12,sp) # a0 is 24+sp\n\ + mov d3,d1 # d3 contained argc\n\ + inc d3\n\ + asl2 d3 # d3 is now (argc+1)*4,\n\ + add d3,a0 # the offset between argv and envp\n\ + mov a0,(16,sp)\n\ + mov (_rtld_local@GOTOFF,a2),d0\n\ + # Call the function to run the initializers.\n\ + call _dl_init@PLT,[],0\n\ + # Pass our finalizer function to the user in d0, as per ELF ABI.\n\ + mov (_dl_fini@GOT,a2),d0\n\ + add 20,sp\n\ + # Jump to the user's entry point.\n\ + mov d2,a1\n\ + jmp (a1)\n\ + .previous\n\ +"); + +#ifndef RTLD_START_SPECIAL_INIT +#define RTLD_START_SPECIAL_INIT /* nothing */ +#endif + +/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so + PLT entries should not be allowed to define the value. + ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one + of the main executable's symbols, as for a COPY reloc. */ +#define elf_machine_type_class(type) \ + ((((type) == R_MN10300_JMP_SLOT) * ELF_RTYPE_CLASS_PLT) \ + | (((type) == R_MN10300_COPY) * ELF_RTYPE_CLASS_COPY)) + +/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ +#define ELF_MACHINE_JMP_SLOT R_MN10300_JMP_SLOT + +static inline Elf32_Addr +elf_machine_fixup_plt (struct link_map *map, lookup_t t, + const Elf32_Rela *reloc, + Elf32_Addr *reloc_addr, Elf32_Addr value) +{ + return *reloc_addr = value; +} + +/* Return the final value of a plt relocation. */ +static inline Elf32_Addr +elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc, + Elf32_Addr value) +{ + return value + reloc->r_addend; +} + +#endif /* !dl_machine_h */ + +#ifdef RESOLVE + +/* The mn10300 never uses Elf32_Rel relocations. */ +#define ELF_MACHINE_NO_REL 1 + +/* Perform the relocation specified by RELOC and SYM (which is fully resolved). + MAP is the object containing the reloc. */ + +static inline void +elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, + const Elf32_Sym *sym, const struct r_found_version *version, + void *const reloc_addr_arg) +{ + const unsigned int r_type = ELF32_R_TYPE (reloc->r_info); + Elf32_Addr value, *reloc_addr; + + /* Make sure we drop any previous alignment assumptions. */ + asm ("" : "=r" (reloc_addr) : "0" (reloc_addr_arg)); + +#define COPY_UNALIGNED_WORD(sw, tw, align) \ + { \ + unsigned long *__sl = (void*)&(sw), *__tl = (void*)&(tw); \ + unsigned short *__ss = (void*)&(sw), *__ts = (void*)&(tw); \ + unsigned char *__sc = (void*)&(sw), *__tc = (void*)&(tw); \ + switch ((align)) \ + { \ + case 0: \ + *__tl = *__sl; \ + break; \ + case 2: \ + *__ts++ = *__ss++; \ + *__ts = *__ss; \ + break; \ + default: \ + *__tc++ = *__sc++; \ + *__tc++ = *__sc++; \ + *__tc++ = *__sc++; \ + *__tc = *__sc; \ + break; \ + } \ + } + +#define COPY_UNALIGNED_HALFWORD(sw, tw, align) \ + { \ + unsigned short *__ss = (void*)&(sw), *__ts = (void*)&(tw); \ + unsigned char *__sc = (void*)&(sw), *__tc = (void*)&(tw); \ + switch ((align)) \ + { \ + case 0: \ + *__ts = *__ss; \ + break; \ + default: \ + *__tc++ = *__sc++; \ + *__tc = *__sc; \ + break; \ + } \ + } + +#if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC + if (__builtin_expect (r_type == R_MN10300_RELATIVE, 0)) + { +# if !defined RTLD_BOOTSTRAP && !defined HAVE_Z_COMBRELOC + /* This is defined in rtld.c, but nowhere in the static libc.a; + make the reference weak so static programs can still link. + This declaration cannot be done when compiling rtld.c (i.e. + #ifdef RTLD_BOOTSTRAP) because rtld.c contains the common + defn for _dl_rtld_map, which is incompatible with a weak decl + in the same file. */ + weak_extern (_dl_rtld_map); + if (map != &_dl_rtld_map) /* Already done in rtld itself. */ +# endif + { + COPY_UNALIGNED_WORD (*reloc_addr, value, (int) reloc_addr & 3); + value += map->l_addr; + COPY_UNALIGNED_WORD (value, *reloc_addr, (int) reloc_addr & 3); + } + } +# ifndef RTLD_BOOTSTRAP + else if (__builtin_expect (r_type == R_MN10300_NONE, 0)) + return; +# endif + else +#endif + { +#ifndef RTLD_BOOTSTRAP + const Elf32_Sym *const refsym = sym; +#endif + + value = RESOLVE (&sym, version, ELF32_R_TYPE (reloc->r_info)); + if (sym) + value += sym->st_value; + value += reloc->r_addend; /* Assume copy relocs have zero addend. */ + + switch (r_type) + { +#ifndef RTLD_BOOTSTRAP + case R_MN10300_COPY: + if (sym == NULL) + /* This can happen in trace mode if an object could not be + found. */ + break; + if (sym->st_size > refsym->st_size + || (GLRO(dl_verbose) && sym->st_size < refsym->st_size)) + { + extern char **_dl_argv; + const char *strtab; + + strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]); + _dl_error_printf ("\ +%s: Symbol `%s' has different size in shared object, consider re-linking\n", + _dl_argv[0] ?: "<program name unknown>", + strtab + refsym->st_name); + } + memcpy (reloc_addr, (void *) value, MIN (sym->st_size, + refsym->st_size)); + break; +#endif + case R_MN10300_GLOB_DAT: + case R_MN10300_JMP_SLOT: + /* These addresses are always aligned. */ + *reloc_addr = value; + break; + case R_MN10300_32: + COPY_UNALIGNED_WORD (value, *reloc_addr, (int) reloc_addr & 3); + break; +#ifndef RTLD_BOOTSTRAP + case R_MN10300_16: + COPY_UNALIGNED_HALFWORD (value, *reloc_addr, (int) reloc_addr & 1); + break; + case R_MN10300_8: + *(char *) reloc_addr = value; + break; + case R_MN10300_PCREL32: + value -= (Elf32_Addr) reloc_addr; + COPY_UNALIGNED_WORD (value, *reloc_addr, (int) reloc_addr & 3); + break; + case R_MN10300_PCREL16: + value -= (Elf32_Addr) reloc_addr; + COPY_UNALIGNED_HALFWORD (value, *reloc_addr, (int) reloc_addr & 1); + break; + case R_MN10300_PCREL8: + value -= (Elf32_Addr) reloc_addr; + *(char *) reloc_addr = (value - (Elf32_Addr) reloc_addr); + break; +#endif + case R_MN10300_NONE: /* Alright, Wilbur. */ + break; +#if !defined RTLD_BOOTSTRAP || defined _NDEBUG + default: + _dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 0); + break; +#endif + } + + } +} + +static inline void +elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc, + void *const reloc_addr_arg) +{ + Elf32_Addr value, *reloc_addr; + + asm ("" : "=r" (reloc_addr) : "0" (reloc_addr_arg)); + + COPY_UNALIGNED_WORD (*reloc_addr, value, (int)reloc_addr & 3); + value += l_addr; + COPY_UNALIGNED_WORD (value, *reloc_addr, (int)reloc_addr & 3); +} + +static inline void +elf_machine_lazy_rel (struct link_map *map, + Elf32_Addr l_addr, const Elf32_Rela *reloc) +{ + unsigned long int const r_type = ELF32_R_TYPE (reloc->r_info); + + /* Check for unexpected PLT reloc type. */ + if (__builtin_expect (r_type, R_MN10300_JMP_SLOT) == R_MN10300_JMP_SLOT) + { + Elf32_Addr* const reloc_addr = (void *)(l_addr + reloc->r_offset); + Elf32_Addr value; + + /* Perform a RELATIVE reloc on the .got entry that transfers + to the .plt. */ + COPY_UNALIGNED_WORD (*reloc_addr, value, (int)reloc_addr & 3); + value += l_addr; + COPY_UNALIGNED_WORD (value, *reloc_addr, (int)reloc_addr & 3); + } + else if (__builtin_expect (r_type, R_MN10300_NONE) != R_MN10300_NONE) + _dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 1); + +} + +#endif /* RESOLVE */ diff --git a/ports/sysdeps/am33/elf/start.S b/ports/sysdeps/am33/elf/start.S new file mode 100644 index 000000000..1b654595c --- /dev/null +++ b/ports/sysdeps/am33/elf/start.S @@ -0,0 +1,81 @@ +/* Startup code compliant to the ELF MN10300 ABI. + Copyright (C) 1995,1996,1997,1998,2000,2001 Free Software Foundation, Inc. + Contributed by Alexandre Oliva <aoliva@redhat.com> + Based on ../../i386/elf/start.S. + 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. */ + +/* This is the canonical entry point, usually the first thing in the text + segment. The SVR4/i386 ABI (pages 3-31, 3-32) says that when the entry + point runs, most registers' values are unspecified, except for: + + a0 Contains a function pointer to be registered with `atexit'. + This is how the dynamic linker arranges to have DT_FINI + functions called for shared libraries that have been loaded + before this code runs. + + sp The stack contains the arguments and environment: + (4,sp) argc + (8,sp) argv[0] + ... + (4*(argc+1),sp) NULL + (4*(argc+2),sp) envp[0] + ... + NULL +*/ + +#include "bp-sym.h" + + .text + .globl _start + .type _start,@function +_start: + /* Extract the arguments as encoded on the stack and set up + the arguments for `main': argc, argv. envp will be determined + later in __libc_start_main. */ + mov sp,a3 + add -32,sp + + mov a3,(28,sp) /* stack_end. */ + mov d0,(24,sp) /* rtld_fini. */ + mov _fini, d3 + mov d3,(20,sp) /* fini. */ + mov _init, d2 + mov d2,(16,sp) /* init. */ + inc4 a3 + mov a3,(12,sp) /* argv. */ + + /* Set the initial frame pointer as 0, so that the bottom of + the stack is clearly marked. */ + mov 0,a3 + + mov (32,sp), d1 /* argc. */ + mov BP_SYM (main), d0 /* main. */ + + /* Call the user's main function, and exit with its value. + But let the libc call main. */ + call BP_SYM (__libc_start_main),[],0 + + call BP_SYM (abort),[],0 /* Crash if somehow `exit' does return. */ + +/* Define a symbol for the first piece of initialized data. */ + .data + .globl __data_start +__data_start: + .long 0 + .weak data_start + data_start = __data_start diff --git a/ports/sysdeps/am33/fpu/bits/fenv.h b/ports/sysdeps/am33/fpu/bits/fenv.h new file mode 100644 index 000000000..04fe293b1 --- /dev/null +++ b/ports/sysdeps/am33/fpu/bits/fenv.h @@ -0,0 +1,67 @@ +/* Copyright (C) 1998, 1999, 2000, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com> + based on the corresponding file in the mips port. + + 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 _FENV_H +# error "Never use <bits/fenv.h> directly; include <fenv.h> instead." +#endif + + +/* Define bits representing the exception. We use the EF bit + positions of the appropriate bits in the FPCR register. */ +enum + { + FE_INEXACT = 0x01, +#define FE_INEXACT FE_INEXACT + FE_UNDERFLOW = 0x02, +#define FE_UNDERFLOW FE_UNDERFLOW + FE_OVERFLOW = 0x04, +#define FE_OVERFLOW FE_OVERFLOW + FE_DIVBYZERO = 0x08, +#define FE_DIVBYZERO FE_DIVBYZERO + FE_INVALID = 0x10, +#define FE_INVALID FE_INVALID + }; + +#define FE_ALL_EXCEPT \ + (FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID) + +/* The AM33/2.0 FPU supports only Round to nearest. Bits 3<<16 are + reserved to represent other rounding modes. */ +enum + { + FE_TONEAREST = 0x00000, +#define FE_TONEAREST FE_TONEAREST + }; + + +/* Type representing exception flags. */ +typedef unsigned int fexcept_t; + + +/* Type representing floating-point environment. */ +typedef unsigned int fenv_t; + +/* If the default argument is used we use this value. */ +#define FE_DFL_ENV ((__const fenv_t *) -1) + +#ifdef __USE_GNU +/* Floating-point environment where none of the exception is masked. */ +# define FE_NOMASK_ENV ((__const fenv_t *) -2) +#endif diff --git a/ports/sysdeps/am33/fpu/fclrexcpt.c b/ports/sysdeps/am33/fpu/fclrexcpt.c new file mode 100644 index 000000000..0c98b4ea9 --- /dev/null +++ b/ports/sysdeps/am33/fpu/fclrexcpt.c @@ -0,0 +1,52 @@ +/* Clear given exceptions in current floating-point environment. + Copyright (C) 1998, 1999, 2000, 2002, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com> + based on corresponding file in the MIPS port. + + 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. */ + +#include <fenv.h> +#include <fenv_libc.h> +#include <fpu_control.h> +#include <shlib-compat.h> + +int +__feclearexcept (int excepts) +{ + fpu_control_t cw; + + /* Mask out unsupported bits/exceptions. */ + excepts &= FE_ALL_EXCEPT; + + /* Read the complete control word. */ + _FPU_GETCW (cw); + + /* Clear exception flag bits and cause bits. EF bits are cleared by + assigning 1 to them (and there's no way to set them); other bits + are copied normally. */ + + cw &= ~((excepts << CAUSE_SHIFT) | FE_ALL_EXCEPT); + cw |= excepts; + + /* Put the new data in effect. */ + _FPU_SETFCW (cw); + + /* Success. */ + return 0; +} + +versioned_symbol (libm, __feclearexcept, feclearexcept, GLIBC_2_2); diff --git a/ports/sysdeps/am33/fpu/fedisblxcpt.c b/ports/sysdeps/am33/fpu/fedisblxcpt.c new file mode 100644 index 000000000..b4a597773 --- /dev/null +++ b/ports/sysdeps/am33/fpu/fedisblxcpt.c @@ -0,0 +1,42 @@ +/* Disable floating-point exceptions. + Copyright (C) 2000, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com> + based on corresponding file in the MIPS port. + + 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. */ + +#include <fenv.h> +#include <fenv_libc.h> +#include <fpu_control.h> + +int +fedisableexcept (int excepts) +{ + fpu_control_t new_exc, old_exc; + + /* Get the current control word. */ + _FPU_GETCW (new_exc); + + old_exc = (new_exc & ENABLE_MASK) >> ENABLE_SHIFT; + + excepts &= FE_ALL_EXCEPT; + + new_exc &= ~(excepts << ENABLE_SHIFT); + _FPU_SETCW (new_exc); + + return old_exc; +} diff --git a/ports/sysdeps/am33/fpu/feenablxcpt.c b/ports/sysdeps/am33/fpu/feenablxcpt.c new file mode 100644 index 000000000..0ecaa1887 --- /dev/null +++ b/ports/sysdeps/am33/fpu/feenablxcpt.c @@ -0,0 +1,42 @@ +/* Enable floating-point exceptions. + Copyright (C) 2000, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com> + based on corresponding file in the MIPS port. + + 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. */ + +#include <fenv.h> +#include <fenv_libc.h> +#include <fpu_control.h> + +int +feenableexcept (int excepts) +{ + fpu_control_t new_exc, old_exc; + + /* Get the current control word. */ + _FPU_GETCW (new_exc); + + old_exc = (new_exc & ENABLE_MASK) >> ENABLE_SHIFT; + + excepts &= FE_ALL_EXCEPT; + + new_exc |= excepts << ENABLE_SHIFT; + _FPU_SETCW (new_exc); + + return old_exc; +} diff --git a/ports/sysdeps/am33/fpu/fegetenv.c b/ports/sysdeps/am33/fpu/fegetenv.c new file mode 100644 index 000000000..f0828011b --- /dev/null +++ b/ports/sysdeps/am33/fpu/fegetenv.c @@ -0,0 +1,35 @@ +/* Store current floating-point environment. + Copyright (C) 1998, 1999, 2000, 2002, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com> + based on corresponding file in the MIPS port. + + 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. */ + +#include <fenv.h> +#include <fpu_control.h> +#include <shlib-compat.h> + +int +__fegetenv (fenv_t *envp) +{ + _FPU_GETCW (*envp); + + /* Success. */ + return 0; +} + +versioned_symbol (libm, __fegetenv, fegetenv, GLIBC_2_2); diff --git a/ports/sysdeps/am33/fpu/fegetexcept.c b/ports/sysdeps/am33/fpu/fegetexcept.c new file mode 100644 index 000000000..500a0f822 --- /dev/null +++ b/ports/sysdeps/am33/fpu/fegetexcept.c @@ -0,0 +1,35 @@ +/* Get enabled floating-point exceptions. + Copyright (C) 2000, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com> + based on corresponding file in the MIPS port. + + 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. */ + +#include <fenv.h> +#include <fenv_libc.h> +#include <fpu_control.h> + +int +fegetexcept (void) +{ + unsigned int exc; + + /* Get the current control word. */ + _FPU_GETCW (exc); + + return (exc & ENABLE_MASK) >> ENABLE_SHIFT; +} diff --git a/ports/sysdeps/am33/fpu/fegetround.c b/ports/sysdeps/am33/fpu/fegetround.c new file mode 100644 index 000000000..2b914075b --- /dev/null +++ b/ports/sysdeps/am33/fpu/fegetround.c @@ -0,0 +1,35 @@ +/* Return current rounding direction. + Copyright (C) 1998, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com> + based on corresponding file in the MIPS port. + + 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. */ + +#include <fenv.h> +#include <fenv_libc.h> +#include <fpu_control.h> + +int +fegetround (void) +{ + int cw; + + /* Get control word. */ + _FPU_GETCW (cw); + + return (cw & ROUND_MASK); +} diff --git a/ports/sysdeps/am33/fpu/feholdexcpt.c b/ports/sysdeps/am33/fpu/feholdexcpt.c new file mode 100644 index 000000000..e90fb67da --- /dev/null +++ b/ports/sysdeps/am33/fpu/feholdexcpt.c @@ -0,0 +1,39 @@ +/* Store current floating-point environment and clear exceptions. + Copyright (C) 2000, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com> + based on corresponding file in the MIPS port. + + 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. */ + +#include <fenv.h> +#include <fpu_control.h> + +int +feholdexcept (fenv_t *envp) +{ + fpu_control_t cw; + + /* Save the current state. */ + _FPU_GETCW (cw); + *envp = cw; + + /* Clear all exception enable bits and flags. */ + cw &= ~(_FPU_MASK_V|_FPU_MASK_Z|_FPU_MASK_O|_FPU_MASK_U|_FPU_MASK_I); + _FPU_SETFCW (cw); + + return 0; +} diff --git a/ports/sysdeps/am33/fpu/fenv_libc.h b/ports/sysdeps/am33/fpu/fenv_libc.h new file mode 100644 index 000000000..508145470 --- /dev/null +++ b/ports/sysdeps/am33/fpu/fenv_libc.h @@ -0,0 +1,33 @@ +/* Copyright (C) 2000, 2002, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com> + based on the corresponding file in the mips port. + + 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 _FENV_LIBC_H +#define _FENV_LIBC_H 1 + +/* Mask for enabling exceptions and for the CAUSE bits. */ +#define ENABLE_MASK 0x003E0U +#define CAUSE_MASK 0x07C00U +#define ROUND_MASK 0x30000U + +/* Shift for FE_* flags to get up to the ENABLE bits and the CAUSE bits. */ +#define ENABLE_SHIFT 5 +#define CAUSE_SHIFT 10 + +#endif /* _FENV_LIBC_H */ diff --git a/ports/sysdeps/am33/fpu/fesetenv.c b/ports/sysdeps/am33/fpu/fesetenv.c new file mode 100644 index 000000000..4c551a5c1 --- /dev/null +++ b/ports/sysdeps/am33/fpu/fesetenv.c @@ -0,0 +1,60 @@ +/* Install given floating-point environment. + Copyright (C) 1998, 1999, 2000, 2002, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com> + based on corresponding file in the MIPS port. + + 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. */ + +#include <fenv.h> +#include <fpu_control.h> +#include <shlib-compat.h> + +int +__fesetenv (const fenv_t *envp) +{ + fpu_control_t cw; + + /* We want to clear all EF bits for the default end IEEE. */ + + if (envp == FE_DFL_ENV) + _FPU_SETFCW (_FPU_DEFAULT|FE_ALL_EXCEPT); + else if (envp == FE_NOMASK_ENV) + _FPU_SETFCW (_FPU_IEEE|FE_ALL_EXCEPT); + else + { + fpu_control_t temp; + + _FPU_GETCW (temp); + cw = *envp; + + /* If EF bits are cleared and the user requests them to be set, + we have to fail, because there's no way to do it. */ + if (~temp & cw & FE_ALL_EXCEPT) + return -1; + + /* We clear EF bits by storing a 1 in them, so flip the + FE_ALL_EXCEPT bits. */ + cw = (cw & ~FE_ALL_EXCEPT) | (~cw & FE_ALL_EXCEPT); + _FPU_SETFCW (cw); + } + + /* Success. */ + return 0; +} + +libm_hidden_ver (__fesetenv, fesetenv) +versioned_symbol (libm, __fesetenv, fesetenv, GLIBC_2_2); diff --git a/ports/sysdeps/am33/fpu/fesetround.c b/ports/sysdeps/am33/fpu/fesetround.c new file mode 100644 index 000000000..b1e2b240c --- /dev/null +++ b/ports/sysdeps/am33/fpu/fesetround.c @@ -0,0 +1,29 @@ +/* Set current rounding direction. + Copyright (C) 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com> + + 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. */ + +#include <fenv.h> + +int +fesetround (int round) +{ + /* The only supported rounding mode is to-nearest. Just check + whether we're switching to it. */ + return (round != FE_TONEAREST); +} diff --git a/ports/sysdeps/am33/fpu/feupdateenv.c b/ports/sysdeps/am33/fpu/feupdateenv.c new file mode 100644 index 000000000..e4a0e39d2 --- /dev/null +++ b/ports/sysdeps/am33/fpu/feupdateenv.c @@ -0,0 +1,47 @@ +/* Install given floating-point environment and raise exceptions. + Copyright (C) 1998, 1999, 2000, 2002, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com> + based on corresponding file in the MIPS port. + + 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. */ + +#include <fenv.h> +#include <fpu_control.h> +#include <shlib-compat.h> + +int +__feupdateenv (const fenv_t *envp) +{ + int temp; + + /* Save current exceptions. */ + _FPU_GETCW (temp); + temp &= FE_ALL_EXCEPT; + + /* Install new environment. */ + fesetenv (envp); + + /* Raise the safed exception. Incidently for us the implementation + defined format of the values in objects of type fexcept_t is the + same as the ones specified using the FE_* constants. */ + feraiseexcept (temp); + + /* Success. */ + return 0; +} + +versioned_symbol (libm, __feupdateenv, feupdateenv, GLIBC_2_2); diff --git a/ports/sysdeps/am33/fpu/fgetexcptflg.c b/ports/sysdeps/am33/fpu/fgetexcptflg.c new file mode 100644 index 000000000..0e8512c9c --- /dev/null +++ b/ports/sysdeps/am33/fpu/fgetexcptflg.c @@ -0,0 +1,44 @@ +/* Store current representation for exceptions. + Copyright (C) 1998, 1999, 2000, 2002, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com> + based on corresponding file in the MIPS port. + + 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. */ + +#include <fenv.h> +#include <fpu_control.h> +#include <shlib-compat.h> + +int +__fegetexceptflag (fexcept_t *flagp, int excepts) +{ + fexcept_t temp; + + /* Get the current exceptions. */ + _FPU_GETCW (temp); + + /* We only save the relevant bits here. In particular, care has to be + taken with the CAUSE bits, as an inadvertent restore later on could + generate unexpected exceptions. */ + + *flagp = temp & excepts & FE_ALL_EXCEPT; + + /* Success. */ + return 0; +} + +versioned_symbol (libm, __fegetexceptflag, fegetexceptflag, GLIBC_2_2); diff --git a/ports/sysdeps/am33/fpu/fpu_control.h b/ports/sysdeps/am33/fpu/fpu_control.h new file mode 100644 index 000000000..c0612ba53 --- /dev/null +++ b/ports/sysdeps/am33/fpu/fpu_control.h @@ -0,0 +1,75 @@ +/* FPU control word bits. AM33/2.0 version. + Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com> + based on the corresponding file in the mips port. + + 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 _FPU_CONTROL_H +#define _FPU_CONTROL_H + +/* AM33/2.0 FPU floating point control register bits. + * + * 31-22 -> reserved + * 21-18 -> floating-point condition codes (L, G, E, U) + * 17-16 -> rounding modes (00 is to-nearest; other values are reserved + * 15 -> reserved (read as 0, write with 0) + * 14-10 -> Exception Cause (inValid, divZero, Overflow, Underflow, Inexact) + * 9- 5 -> Exception Enable + * 4- 0 -> Exception Flag, cleared when exception cause is set + */ + +#include <features.h> +#include <fenv.h> + +/* masking of interrupts */ +#define _FPU_MASK_V 0x0200 /* Invalid operation */ +#define _FPU_MASK_Z 0x0100 /* Division by zero */ +#define _FPU_MASK_O 0x0080 /* Overflow */ +#define _FPU_MASK_U 0x0040 /* Underflow */ +#define _FPU_MASK_I 0x0020 /* Inexact operation */ + +/* rounding control */ +#define _FPU_RC_NEAREST 0x0 /* Only available mode */ + +#define _FPU_RESERVED 0xffc08000 /* Reserved bits in fpcr */ + + +/* The fdlibm code requires strict IEEE double precision arithmetic, + and no interrupts for exceptions, rounding to nearest. */ + +#define _FPU_DEFAULT 0x0000001f + +/* IEEE: same as above, but exceptions */ +#define _FPU_IEEE 0x000003ff + +/* Type of the control word. */ +typedef unsigned int fpu_control_t; + +/* Macros for accessing the hardware control word. _FPU_SETCW is + defined such that it won't modify the EF bits, that are cleared + when assigned bits that are set. Use SETFCW to get them actually + reset. */ +#define _FPU_SETFCW(cw) __asm__ ("fmov %0,fpcr" : : "ri" (cw)) +#define _FPU_SETCW(cw) _FPU_SETFCW((cw) & ~FE_ALL_EXCEPT) +#define _FPU_GETCW(cw) __asm__ ("fmov fpcr,%0" : "=r" (cw)) + +/* Default control word set at startup. */ +extern fpu_control_t __fpu_control; + +#endif /* fpu_control.h */ diff --git a/ports/sysdeps/am33/fpu/fraiseexcpt.c b/ports/sysdeps/am33/fpu/fraiseexcpt.c new file mode 100644 index 000000000..3405ce509 --- /dev/null +++ b/ports/sysdeps/am33/fpu/fraiseexcpt.c @@ -0,0 +1,79 @@ +/* Raise given exceptions. + Copyright (C) 2000, 2002, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com> + based on corresponding file in the M68K port. + + 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. */ + +#include <fenv.h> +#include <float.h> +#include <math.h> +#include <shlib-compat.h> + +int +__feraiseexcept (int excepts) +{ + /* Raise exceptions represented by EXCEPTS. But we must raise only one + signal at a time. It is important that if the overflow/underflow + exception and the divide by zero exception are given at the same + time, the overflow/underflow exception follows the divide by zero + exception. */ + + /* First: invalid exception. */ + if (excepts & FE_INVALID) + { + /* One example of a invalid operation is 0 * Infinity. */ + float x = HUGE_VALF, y = 0.0f; + __asm__ __volatile__ ("fmul %1,%0" : "+f" (x) : "f" (y)); + } + + /* Next: division by zero. */ + if (excepts & FE_DIVBYZERO) + { + float x = 1.0f, y = 0.0f; + __asm__ __volatile__ ("fdiv %1,%0" : "+f" (x) : "f" (y)); + } + + /* Next: overflow. */ + if (excepts & FE_OVERFLOW) + { + float x = FLT_MAX; + + __asm__ __volatile__ ("fmul %0,%0" : "+f" (x)); + } + + /* Next: underflow. */ + if (excepts & FE_UNDERFLOW) + { + float x = -FLT_MIN; + + __asm__ __volatile__ ("fmul %0,%0" : "+f" (x)); + } + + /* Last: inexact. */ + if (excepts & FE_INEXACT) + { + float x = 1.0f, y = 3.0f; + __asm__ __volatile__ ("fdiv %1,%0" : "=f" (x) : "f" (y)); + } + + /* Success. */ + return 0; +} + +libm_hidden_ver (__feraiseexcept, feraiseexcept) +versioned_symbol (libm, __feraiseexcept, feraiseexcept, GLIBC_2_2); diff --git a/ports/sysdeps/am33/fpu/fsetexcptflg.c b/ports/sysdeps/am33/fpu/fsetexcptflg.c new file mode 100644 index 000000000..be315a44b --- /dev/null +++ b/ports/sysdeps/am33/fpu/fsetexcptflg.c @@ -0,0 +1,57 @@ +/* Set floating-point environment exception handling. + Copyright (C) 1998, 1999, 2000, 2002, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com> + based on corresponding file in the MIPS port. + + 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. */ + +#include <fenv.h> +#include <fpu_control.h> +#include <shlib-compat.h> + +int +__fesetexceptflag (const fexcept_t *flagp, int excepts) +{ + fpu_control_t cw, temp; + + /* Get the current exceptions. */ + _FPU_GETCW (cw); + + /* Make sure the flags we want restored are legal. */ + excepts &= FE_ALL_EXCEPT; + temp = *flagp & excepts; + + /* If EF bits are clear and the user requests them to be set, + we have to fail, because there's no way to do it. */ + if (~(cw & excepts) & temp) + return -1; + + /* We clear EF bits by storing a 1 in them, so flip the + FE_ALL_EXCEPT bits. */ + temp = (~temp & FE_ALL_EXCEPT); + + /* Now clear the bits called for, and copy them in from flagp. Note that + we ignore all non-flag bits from *flagp, so they don't matter. */ + cw = (cw & ~FE_ALL_EXCEPT) | temp; + + _FPU_SETFCW (cw); + + /* Success. */ + return 0; +} + +versioned_symbol (libm, __fesetexceptflag, fesetexceptflag, GLIBC_2_2); diff --git a/ports/sysdeps/am33/fpu/ftestexcept.c b/ports/sysdeps/am33/fpu/ftestexcept.c new file mode 100644 index 000000000..0e0db4ca3 --- /dev/null +++ b/ports/sysdeps/am33/fpu/ftestexcept.c @@ -0,0 +1,34 @@ +/* Test exception in current environment. + Copyright (C) 1998, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com> + based on corresponding file in the MIPS port. + + 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. */ + +#include <fenv.h> +#include <fpu_control.h> + +int +fetestexcept (int excepts) +{ + int cw; + + /* Get current control word. */ + _FPU_GETCW (cw); + + return cw & excepts & FE_ALL_EXCEPT; +} diff --git a/ports/sysdeps/am33/linuxthreads/pspinlock.c b/ports/sysdeps/am33/linuxthreads/pspinlock.c new file mode 100644 index 000000000..5eaf81668 --- /dev/null +++ b/ports/sysdeps/am33/linuxthreads/pspinlock.c @@ -0,0 +1,74 @@ +/* POSIX spinlock implementation. AM33 version. + Copyright 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. */ + +#include <errno.h> +#include <pthread.h> +#include "internals.h" + +int +__pthread_spin_lock (pthread_spinlock_t *lock) +{ + __asm__ __volatile__("1: bset %1, (%0); beq 1b" + : : "a" (lock), "d" (1) : "memory"); + return 0; +} +weak_alias (__pthread_spin_lock, pthread_spin_lock) + + +int +__pthread_spin_trylock (pthread_spinlock_t *lock) +{ + int oldval = 1; + + __asm__ __volatile__ ("bset %0, (%1); beq 1f; clr %0; 1:" : + "+d" (oldval) : "a" (lock) : "memory"); + + return oldval ? EBUSY : 0; +} +weak_alias (__pthread_spin_trylock, pthread_spin_trylock) + + +int +__pthread_spin_unlock (pthread_spinlock_t *lock) +{ + *lock = 0; + return 0; +} +weak_alias (__pthread_spin_unlock, pthread_spin_unlock) + + +int +__pthread_spin_init (pthread_spinlock_t *lock, int pshared) +{ + /* We can ignore the `pshared' parameter. Since we are busy-waiting + all processes which can access the memory location `lock' points + to can use the spinlock. */ + *lock = 0; + return 0; +} +weak_alias (__pthread_spin_init, pthread_spin_init) + + +int +__pthread_spin_destroy (pthread_spinlock_t *lock) +{ + /* Nothing to do. */ + return 0; +} +weak_alias (__pthread_spin_destroy, pthread_spin_destroy) diff --git a/ports/sysdeps/am33/linuxthreads/pt-machine.h b/ports/sysdeps/am33/linuxthreads/pt-machine.h new file mode 100644 index 000000000..ba80bfb5e --- /dev/null +++ b/ports/sysdeps/am33/linuxthreads/pt-machine.h @@ -0,0 +1,68 @@ +/* Machine-dependent pthreads configuration and inline functions. + am33 version. + Copyright (C) 1996,1997,1998,1999,2000,2001, 2004 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com> + Based on ../i386/pt-machine.h. + + 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. */ + +#ifndef _PT_MACHINE_H +#define _PT_MACHINE_H 1 + +#ifndef __ASSEMBLER__ +#ifndef PT_EI +# define PT_EI extern inline +#endif + +/* Get some notion of the current stack. Need not be exactly the top + of the stack, just something somewhere in the current frame. */ +#define CURRENT_STACK_FRAME __builtin_frame_address (0) + +/* Spinlock implementation; required. */ +PT_EI long int +testandset (int *spinlock) +{ + long int ret = 1; + + /* This won't test&set the entire int, only the least significant + byte. I hope this doesn't matter, since we can't do better. */ + __asm__ __volatile__ ("bset %0, %1; bne 1f; clr %0; 1:" : + "+d" (ret), "+m" (*(volatile int *)spinlock)); + + return ret; +} + + +PT_EI int +get_eflags (void) +{ + int res; + __asm__ __volatile__ ("mov psw,%0" : "=d" (res)); + return res; +} + + +PT_EI void +set_eflags (int newflags) +{ + __asm__ __volatile__ ("mov %0,psw" : : "d" (newflags) : "cc"); +} + +#endif /* __ASSEMBLER__ */ + +#endif /* pt-machine.h */ diff --git a/ports/sysdeps/am33/memusage.h b/ports/sysdeps/am33/memusage.h new file mode 100644 index 000000000..9913e781e --- /dev/null +++ b/ports/sysdeps/am33/memusage.h @@ -0,0 +1,23 @@ +/* Copyright 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 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. */ + +#define GETSP() ({ uintptr_t stack_ptr; \ + asm ("mov sp,%0" : "=a" (stack_ptr)); \ + stack_ptr; }) + +#include <sysdeps/generic/memusage.h> diff --git a/ports/sysdeps/am33/preconfigure b/ports/sysdeps/am33/preconfigure new file mode 100644 index 000000000..949546538 --- /dev/null +++ b/ports/sysdeps/am33/preconfigure @@ -0,0 +1,5 @@ +case "$machine" in +am33*) + base_machine=am33 machine=am33 + ;; +esac diff --git a/ports/sysdeps/am33/setjmp.S b/ports/sysdeps/am33/setjmp.S new file mode 100644 index 000000000..26ec2ed49 --- /dev/null +++ b/ports/sysdeps/am33/setjmp.S @@ -0,0 +1,80 @@ +/* setjmp for am33. + Copyright (C) 2001, 2004 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. */ + +#include <sysdep.h> +#define _ASM +#define _SETJMP_H +#include <bits/setjmp.h> +#include <asm-syntax.h> + + +ENTRY (__sigsetjmp) +.Lsigsetjmp: + /* Save registers. */ + mov d0,a0 + mov d2,(0,a0) + mov d3,(4,a0) + mov mdr,d0 + mov d0,(8,a0) + /* Restore d0 for __sigjmp_save. */ + mov a0,d0 + mov a2,(12,a0) + mov a3,(16,a0) + mov sp,a1 + mov a1,(20,a0) + add 24,a0 + mov r4,(a0+) + mov r5,(a0+) + mov r6,(a0+) + mov r7,(a0+) +#ifdef __AM33_2__ + fmov fs4,(a0+) + fmov fs5,(a0+) + fmov fs6,(a0+) + fmov fs7,(a0+) + fmov fs8,(a0+) + fmov fs9,(a0+) + fmov fs10,(a0+) + fmov fs11,(a0+) + fmov fs12,(a0+) + fmov fs13,(a0+) + fmov fs14,(a0+) + fmov fs15,(a0+) + fmov fs16,(a0+) + fmov fs17,(a0+) + fmov fs18,(a0+) + fmov fs19,(a0+) +#endif + /* Make a tail call to __sigjmp_save; it takes the same args. */ + jmp __sigjmp_save +END (__sigsetjmp) + +/* BSD `_setjmp' entry point to `sigsetjmp (..., 1)'. */ +ENTRY (setjmp) + /* Tail-call setsetjmp with savesigs==1. */ + mov 1,d1 + bra .Lsigsetjmp +END (setjmp) + +/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. */ +ENTRY (_setjmp) + /* Tail-call setsetjmp with savesigs==0. */ + clr d1 + bra .Lsigsetjmp +END (_setjmp) diff --git a/ports/sysdeps/am33/shlib-versions b/ports/sysdeps/am33/shlib-versions new file mode 100644 index 000000000..ad6ded9dc --- /dev/null +++ b/ports/sysdeps/am33/shlib-versions @@ -0,0 +1 @@ +am33.*-.*-linux.* DEFAULT GLIBC_2.2.5 diff --git a/ports/sysdeps/am33/stackinfo.h b/ports/sysdeps/am33/stackinfo.h new file mode 100644 index 000000000..a64027a6a --- /dev/null +++ b/ports/sysdeps/am33/stackinfo.h @@ -0,0 +1,28 @@ +/* Copyright 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. */ + +/* This file contains a bit of information about the stack allocation + of the processor. */ + +#ifndef _STACKINFO_H +#define _STACKINFO_H 1 + +/* On am33 the stack grows down. */ +#define _STACK_GROWS_DOWN 1 + +#endif /* stackinfo.h */ diff --git a/ports/sysdeps/am33/sys/ucontext.h b/ports/sysdeps/am33/sys/ucontext.h new file mode 100644 index 000000000..7995aae42 --- /dev/null +++ b/ports/sysdeps/am33/sys/ucontext.h @@ -0,0 +1,123 @@ +/* Copyright 1997, 1999, 2000, 2002 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. */ + +/* AM33/2.0 context switching support. */ + +#ifndef _SYS_UCONTEXT_H +#define _SYS_UCONTEXT_H 1 + +#include <features.h> +#include <signal.h> + +/* Type for general register. */ +typedef int greg_t; + +/* Number of general registers. */ +#define NGREG 28 + +/* Container for all general registers. */ +typedef greg_t gregset_t[NGREG]; + +/* Number of each register is the `gregset_t' array. */ +enum +{ + REG_D0 = 0, +#define REG_D0 REG_D0 + REG_D1, +#define REG_D1 REG_D1 + REG_D2, +#define REG_D2 REG_D2 + REG_D3, +#define REG_D3 REG_D3 + REG_A0, +#define REG_A0 REG_A0 + REG_A1, +#define REG_A1 REG_A1 + REG_A2, +#define REG_A2 REG_A2 + REG_A3, +#define REG_A3 REG_A3 + REG_E0, +#define REG_E0 REG_E0 + REG_E1, +#define REG_E1 REG_E1 + REG_E2, +#define REG_E2 REG_E2 + REG_E3, +#define REG_E3 REG_E3 + REG_E4, +#define REG_E4 REG_E4 + REG_E5, +#define REG_E5 REG_E5 + REG_E6, +#define REG_E6 REG_E6 + REG_E7, +#define REG_E7 REG_E7 + REG_LAR, +#define REG_LAR REG_LAR + REG_LIR, +#define REG_LIR REG_LIR + REG_MDR, +#define REG_MDR REG_MDR + REG_MCVF, +#define REG_MCVF REG_MCVF + REG_MCRL, +#define REG_MCRL REG_MCRL + REG_MCRH, +#define REG_MCRH REG_MCRH + REG_MDRQ, +#define REG_MDRQ REG_MDRQ + REG_SP, +#define REG_SP REG_SP + REG_EPSW, +#define REG_EPSW REG_EPSW + REG_PC, +#define REG_PC REG_PC +}; + +typedef int freg_t; + +/* Structure to describe FPU registers. */ +typedef struct { + union { + double fp_dregs[16]; + float fp_fregs[32]; + freg_t fp_regs[32]; + } regs; + freg_t fpcr; +} fpregset_t; + +/* Context to describe whole processor state. */ +typedef struct + { + gregset_t gregs; + fpregset_t fpregs; + } mcontext_t; + +/* Userlevel context. */ +typedef struct ucontext + { + unsigned long int uc_flags; + struct ucontext *uc_link; + __sigset_t uc_sigmask; + stack_t uc_stack; + mcontext_t uc_mcontext; + long int uc_filler[5]; + } ucontext_t; + +#endif /* sys/ucontext.h */ diff --git a/ports/sysdeps/am33/sysdep.h b/ports/sysdeps/am33/sysdep.h new file mode 100644 index 000000000..efd052714 --- /dev/null +++ b/ports/sysdeps/am33/sysdep.h @@ -0,0 +1,82 @@ +/* Copyright 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com>. + Based on ../i386/sysdep.h. + + 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. */ + +#include <sysdeps/generic/sysdep.h> + +#ifdef __ASSEMBLER__ + +/* Syntactic details of assembler. */ + +#ifdef HAVE_ELF +/* For ELF we need the `.type' directive to make shared libs work right. */ +#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg; +#define ASM_SIZE_DIRECTIVE(name) .size name,.-name; + +/* In ELF C symbols are asm symbols. */ +#undef NO_UNDERSCORES +#define NO_UNDERSCORES +#else +#define ASM_TYPE_DIRECTIVE(name,type) /* Nothing is specified. */ +#define ASM_SIZE_DIRECTIVE(name) /* Nothing is specified. */ +#endif + +/* Define an entry point visible from C. */ +#define ENTRY(name) \ + ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ + ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \ + C_LABEL(name) \ + CALL_MCOUNT + +#undef END +#define END(name) \ + ASM_SIZE_DIRECTIVE(name) \ + +/* If compiled for profiling, call `mcount' at the start of each function. */ +#ifdef PROF +/* The mcount code relies on a normal frame pointer being on the stack + to locate our caller, so push one just for its benefit. */ +#define CALL_MCOUNT \ + movm [a3],(sp); mov sp,a3; add -12,sp; \ + call JUMPTARGET(mcount),[],0; add 12,sp; movm (sp),[a3]; +#else +#define CALL_MCOUNT /* Do nothing. */ +#endif + +#ifdef NO_UNDERSCORES +/* Since C identifiers are not normally prefixed with an underscore + on this system, the asm identifier `syscall_error' intrudes on the + C name space. Make sure we use an innocuous name. */ +#define syscall_error __syscall_error +#define mcount _mcount +#endif + +#undef JUMPTARGET +#ifdef PIC +#define JUMPTARGET(name) name##@PLT +#else +#define JUMPTARGET(name) name +#endif + +/* Local label name for asm code. */ +#ifndef L +#define L(name) name +#endif + +#endif /* __ASSEMBLER__ */ diff --git a/ports/sysdeps/cris/Dist b/ports/sysdeps/cris/Dist new file mode 100644 index 000000000..cf1ffb6a0 --- /dev/null +++ b/ports/sysdeps/cris/Dist @@ -0,0 +1 @@ +_mcount.S diff --git a/ports/sysdeps/cris/Implies b/ports/sysdeps/cris/Implies new file mode 100644 index 000000000..780c4e246 --- /dev/null +++ b/ports/sysdeps/cris/Implies @@ -0,0 +1,3 @@ +wordsize-32 +ieee754/flt-32 +ieee754/dbl-64 diff --git a/ports/sysdeps/cris/Makefile b/ports/sysdeps/cris/Makefile new file mode 100644 index 000000000..1ecb78c3e --- /dev/null +++ b/ports/sysdeps/cris/Makefile @@ -0,0 +1,44 @@ +# 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 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. + +# We don't support long doubles as a distinct type. We don't need to set +# this variable; it's here mostly for documentational purposes. + +long-double-fcts = no + +# FIXME: Note that this is a machine-specific stub; profiling is not +# implemented. +ifeq ($(subdir),gmon) +sysdep_routines += _mcount +endif + +# FIXME: This test seems generally bogus. Wrong types in function calls +# and assumes FE_TONEAREST is defined. Does it work somewhere? +# Presumably it does, so let's settle for filtering it out target-wise +# until it's agreed what should be done. +ifeq ($(subdir),math) +tests := $(filter-out test-fenv, $(tests)) +endif + +# PIC code must be assembled with special options, passed on by gcc when +# given the -fpic option. +ASFLAGS-.os = -fpic + +# Overflow occurs at 2**15/4 (8192) symbols. Glibc uses about 2000. +# So use -fpic: smaller-size relocs; smaller, faster code. +pic-ccflag = -fpic diff --git a/ports/sysdeps/cris/__longjmp.S b/ports/sysdeps/cris/__longjmp.S new file mode 100644 index 000000000..cce27ca25 --- /dev/null +++ b/ports/sysdeps/cris/__longjmp.S @@ -0,0 +1,38 @@ +/* longjmp for CRIS. + 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 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. */ + +#include <sysdep.h> +#define _SETJMP_H +#define _ASM +#include <bits/setjmp.h> + + .syntax no_register_prefix + +/* Saving and restoring CCR is meaningless, so we don't do it. */ +ENTRY (__longjmp) + /* Note that r10 = jmp_buf, r11 = retval. */ + move [r10+16*4],srp + test.d r11 + beq 0f /* Already a 1 in place. */ + nop + /* Offset for r9, the return value (see setjmp). */ + move.d r11,[r10+6*4] +0: + movem [r10],pc +END (__longjmp) diff --git a/ports/sysdeps/cris/_mcount.S b/ports/sysdeps/cris/_mcount.S new file mode 100644 index 000000000..a93913164 --- /dev/null +++ b/ports/sysdeps/cris/_mcount.S @@ -0,0 +1,36 @@ +/* Machine-specific calling sequence for `mcount' profiling function for CRIS. + 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 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. */ + +/* FIXME: This isn't implemented yet. This is just a machine-specific + stub. Perhaps a real implementation can make use of it. */ + +#include <sysdep.h> + +#undef CALL_MCOUNT +#define CALL_MCOUNT + +ENTRY (_mcount) + SETUP_PIC + /* Sorry, isn't implemented yet. + Can't call abort; that will recurse. Force SEGV instead. */ + test.d [99] +1: + ba 1b + nop +END (_mcount) diff --git a/ports/sysdeps/cris/bits/endian.h b/ports/sysdeps/cris/bits/endian.h new file mode 100644 index 000000000..034307e39 --- /dev/null +++ b/ports/sysdeps/cris/bits/endian.h @@ -0,0 +1,7 @@ +/* CRIS is little-endian. */ + +#ifndef _ENDIAN_H +# error "Never use <bits/endian.h> directly; include <endian.h> instead." +#endif + +#define __BYTE_ORDER __LITTLE_ENDIAN diff --git a/ports/sysdeps/cris/bits/setjmp.h b/ports/sysdeps/cris/bits/setjmp.h new file mode 100644 index 000000000..0d7825bc8 --- /dev/null +++ b/ports/sysdeps/cris/bits/setjmp.h @@ -0,0 +1,54 @@ +/* Copyright (C) 1997, 1998 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. */ + +/* Define the machine-dependent type `jmp_buf', CRIS version. */ + +/* Note that saving and restoring CCR has no meaning in user mode, so we + don't actually do it; the slot is now reserved. + + jmp_buf[0] - PC + jmp_buf[1] - SP (R14) + jmp_buf[2] - R13 + jmp_buf[3] - R12 + jmp_buf[4] - R11 + jmp_buf[5] - R10 + jmp_buf[6] - R9 + jmp_buf[7] - R8 + jmp_buf[8] - R7 + jmp_buf[9] - R6 + jmp_buf[10] - R5 + jmp_buf[11] - R4 + jmp_buf[12] - R3 + jmp_buf[13] - R2 + jmp_buf[14] - R1 + jmp_buf[15] - R0 + jmp_buf[16] - SRP + jmp_buf[17] - CCR */ + +#ifndef _ASM +typedef unsigned long int __jmp_buf[18]; +#endif + +#if defined (__USE_MISC) || defined (_ASM) +#define JB_SP 1 +#endif + +/* Test if longjmp to JMPBUF would unwind the frame + containing a local variable at ADDRESS. */ +#define _JMPBUF_UNWINDS(jmpbuf, address) \ + ((unsigned long int) (address) < (jmpbuf)[JB_SP]) diff --git a/ports/sysdeps/cris/bits/string.h b/ports/sysdeps/cris/bits/string.h new file mode 100644 index 000000000..fa893d365 --- /dev/null +++ b/ports/sysdeps/cris/bits/string.h @@ -0,0 +1,26 @@ +/* Optimized, inlined string functions. CRIS version. + Copyright (C) 1997, 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. */ + +#ifndef _STRING_H +# error "Never use <bits/string.h> directly; include <string.h> instead." +#endif + +/* Currently the only purpose of this file is to tell the generic inline + macros that unaligned memory access is possible. */ +#define _STRING_ARCH_unaligned 1 diff --git a/ports/sysdeps/cris/configure b/ports/sysdeps/cris/configure new file mode 100755 index 000000000..205bbac85 --- /dev/null +++ b/ports/sysdeps/cris/configure @@ -0,0 +1,7 @@ +# This file is generated from configure.in by Autoconf. DO NOT EDIT! + +libc_cv_asm_line_sep='@' +cat >>confdefs.h <<_ACEOF +#define ASM_LINE_SEP $libc_cv_asm_line_sep +_ACEOF + diff --git a/ports/sysdeps/cris/configure.in b/ports/sysdeps/cris/configure.in new file mode 100644 index 000000000..94bc13750 --- /dev/null +++ b/ports/sysdeps/cris/configure.in @@ -0,0 +1,5 @@ +GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. + +dnl CRIS uses `;' to start comments and `@' for line separator. +libc_cv_asm_line_sep='@' +AC_DEFINE_UNQUOTED(ASM_LINE_SEP, $libc_cv_asm_line_sep) diff --git a/ports/sysdeps/cris/dl-machine.h b/ports/sysdeps/cris/dl-machine.h new file mode 100644 index 000000000..368733e73 --- /dev/null +++ b/ports/sysdeps/cris/dl-machine.h @@ -0,0 +1,391 @@ +/* Machine-dependent ELF dynamic relocation inline functions. CRIS version. + Copyright (C) 1996-2001, 2002, 2003 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 dl_machine_h +#define dl_machine_h + +#define ELF_MACHINE_NAME "CRIS" + +#include <sys/param.h> + +#ifdef __PIC__ +# define CALL_FN(x) \ + "move.d $pc,$r9\n\t" \ + "add.d " #x " - .,$r9\n\t" \ + "jsr $r9" +#else +# define CALL_FN(x) "jsr " #x +#endif + +/* Return nonzero iff ELF header is compatible with the running host. */ + +static inline int +elf_machine_matches_host (const Elf32_Ehdr *ehdr) +{ + return ehdr->e_machine == EM_CRIS; +} + +/* Return the link-time address of _DYNAMIC. Conveniently, this is the + first element of the GOT. This must be inlined in a function which + uses global data. */ + +static inline Elf32_Addr +elf_machine_dynamic (void) +{ + /* Don't just set this to an asm variable "r0" since that's not logical + (like, the variable is uninitialized and the register is fixed) and + may make GCC trip over itself doing register allocation. Yes, I'm + paranoid. Why do you ask? */ + Elf32_Addr *got; + + __asm__ ("move.d $r0,%0" : "=rm" (got)); + return *got; +} + +/* Return the run-time load address of the shared object. We do it like + m68k and i386, by taking an arbitrary local symbol, forcing a GOT entry + for it, and peeking into the GOT table, which is set to the link-time + file-relative symbol value (regardless of whether the target is REL or + RELA). We subtract this link-time file-relative value from the "local" + value we calculate from GOT position and GOT offset. FIXME: Perhaps + there's some other symbol we could use, that we don't *have* to force a + GOT entry for. */ + +static inline Elf32_Addr +elf_machine_load_address (void) +{ + Elf32_Addr gotaddr_diff; + __asm__ ("sub.d [$r0+_dl_start:GOT16],$r0,%0\n\t" + "add.d _dl_start:GOTOFF,%0" : "=r" (gotaddr_diff)); + return gotaddr_diff; +} + +/* Set up the loaded object described by L so its unrelocated PLT + entries will jump to the on-demand fixup code in dl-runtime.c. */ + +static inline int +elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) +{ + Elf32_Addr *got; + extern void _dl_runtime_resolve (Elf32_Word); + extern void _dl_runtime_profile (Elf32_Word); + + if (l->l_info[DT_JMPREL] && lazy) + { + /* The GOT entries for functions in the PLT have not yet been + filled in. Their initial contents will arrange when called + to push an offset into the .rela.plt section, push + _GLOBAL_OFFSET_TABLE_[1], and then jump to + _GLOBAL_OFFSET_TABLE_[2]. */ + got = (Elf32_Addr *) D_PTR (l, l_info[DT_PLTGOT]); + got[1] = (Elf32_Addr) l; /* Identify this shared object. */ + + /* The got[2] entry contains the address of a function which gets + called to get the address of a so far unresolved function and + jump to it. The profiling extension of the dynamic linker allows + to intercept the calls to collect information. In this case we + don't store the address in the GOT so that all future calls also + end in this function. */ + if (__builtin_expect (profile, 0)) + { + got[2] = (Elf32_Addr) &_dl_runtime_profile; + + if (_dl_name_match_p (GL(dl_profile), l)) + { + /* This is the object we are looking for. Say that we really + want profiling and the timers are started. */ + GL(dl_profile_map) = l; + } + } + else + /* This function will get called to fix up the GOT entry indicated by + the offset on the stack, and then jump to the resolved address. */ + got[2] = (Elf32_Addr) &_dl_runtime_resolve; + } + + return lazy; +} + +/* This code is used in dl-runtime.c to call the `fixup' function + and then redirect to the address it returns. + + We get here with the offset into the relocation table pushed on stack, + and the link map in MOF. */ + +#define TRAMPOLINE_TEMPLATE(tramp_name, fixup_name) \ +"; Trampoline for " #fixup_name "\n\ + .globl " #tramp_name "\n\ + .type " #tramp_name ", @function\n\ +" #tramp_name ":\n\ + push $r13\n\ + push $r12\n\ + push $r11\n\ + push $r10\n\ + push $r9\n\ + push $srp\n\ + move.d [$sp+6*4],$r11\n\ + move $mof,$r10\n\ + " CALL_FN (fixup_name) "\n\ + move.d $r10,[$sp+6*4]\n\ + pop $srp\n\ + pop $r9\n\ + pop $r10\n\ + pop $r11\n\ + pop $r12\n\ + pop $r13\n\ + jump [$sp+]\n\ + .size " #tramp_name ", . - " #tramp_name "\n" +#ifndef PROF +#define ELF_MACHINE_RUNTIME_TRAMPOLINE \ +asm (TRAMPOLINE_TEMPLATE (_dl_runtime_resolve, fixup) \ + TRAMPOLINE_TEMPLATE (_dl_runtime_profile, profile_fixup)); +#else +#define ELF_MACHINE_RUNTIME_TRAMPOLINE \ +asm (TRAMPOLINE_TEMPLATE (_dl_runtime_resolve, fixup) \ + ".globl _dl_runtime_profile\n" \ + ".set _dl_runtime_profile, _dl_runtime_resolve"); +#endif + + +/* Mask identifying addresses reserved for the user program, + where the dynamic linker should not map anything. */ +#define ELF_MACHINE_USER_ADDRESS_MASK 0xf8000000UL + +/* Initial entry point code for the dynamic linker. + The C function `_dl_start' is the real entry point; + its return value is the user program's entry point. */ + +#define RTLD_START asm ("\ + .text\n\ + .globl _start\n\ + .type _start,@function\n\ +_start:\n\ + move.d $sp,$r10\n\ + " CALL_FN (_dl_start) "\n\ + /* FALLTHRU */\n\ +\n\ + .globl _dl_start_user\n\ + .type _dl_start_user,@function\n\ +_dl_start_user:\n\ + ; Save the user entry point address in R1.\n\ + move.d $r10,$r1\n\ + ; Point R0 at the GOT.\n\ + move.d $pc,$r0\n\ + sub.d .:GOTOFF,$r0\n\ + ; See if we were run as a command with the executable file\n\ + ; name as an extra leading argument.\n\ + move.d [$r0+_dl_skip_args:GOT16],$r13\n\ + move.d [$r13],$r9\n\ + ; Get the original argument count\n\ + move.d [$sp],$r11\n\ + ; Subtract _dl_skip_args from it.\n\ + sub.d $r9,$r11\n\ + ; Adjust the stack pointer to skip _dl_skip_args words.\n\ + addi $r9.d,$sp\n\ + ; Put the new argc in place as expected by the user entry.\n\ + move.d $r11,[$sp]\n\ + ; Call _dl_init (struct link_map *main_map, int argc, char **argv, char **env)\n\ + ; env: skip scaled argc and skip stored argc and NULL at end of argv[].\n\ + move.d $sp,$r13\n\ + addi $r11.d,$r13\n\ + addq 8,$r13\n\ + ; argv: skip stored argc.\n\ + move.d $sp,$r12\n\ + addq 4,$r12\n\ + ; main_map: at _dl_loaded.\n\ + move.d [$r0+_rtld_local:GOT16],$r9\n\ + move.d [$r9],$r10\n\ + move.d _dl_init_internal:PLTG,$r9\n\ + add.d $r0,$r9\n\ + jsr $r9\n\ + ; Pass our finalizer function to the user in R10.\n\ + move.d [$r0+_dl_fini:GOT16],$r10\n\ + ; Terminate the frame-pointer.\n\ + moveq 0,$r8\n\ + ; Cause SEGV if user entry returns.\n\ + move $r8,$srp\n\ + ; Jump to the user's entry point.\n\ + jump $r1\n\ + .size _dl_start_user, . - _dl_start_user\n\ + .previous"); + +/* The union of reloc-type-classes where the reloc TYPE is a member. + + TYPE is in the class ELF_RTYPE_CLASS_PLT if it can describe a + relocation for a PLT entry, that is, for which a PLT entry should not + be allowed to define the value. The GNU linker for CRIS can merge a + .got.plt entry (R_CRIS_JUMP_SLOT) with a .got entry (R_CRIS_GLOB_DAT), + so we need to match both these reloc types. + + TYPE is in the class ELF_RTYPE_CLASS_NOCOPY if it should not be allowed + to resolve to one of the main executable's symbols, as for a COPY + reloc. */ +#define elf_machine_type_class(type) \ + ((((((type) == R_CRIS_JUMP_SLOT)) \ + || ((type) == R_CRIS_GLOB_DAT)) * ELF_RTYPE_CLASS_PLT) \ + | (((type) == R_CRIS_COPY) * ELF_RTYPE_CLASS_COPY)) + +/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ +#define ELF_MACHINE_JMP_SLOT R_CRIS_JUMP_SLOT + +/* CRIS never uses Elf32_Rel relocations. */ +#define ELF_MACHINE_NO_REL 1 + +/* We define an initialization functions. This is called very early in + _dl_sysdep_start. */ +#define DL_PLATFORM_INIT dl_platform_init () + +static inline void __attribute__ ((unused)) +dl_platform_init (void) +{ + if (GL(dl_platform) != NULL && *GL(dl_platform) == '\0') + /* Avoid an empty string which would disturb us. */ + GL(dl_platform) = NULL; +} + +static inline Elf32_Addr +elf_machine_fixup_plt (struct link_map *map, lookup_t t, + const Elf32_Rela *reloc, + Elf32_Addr *reloc_addr, Elf32_Addr value) +{ + return *reloc_addr = value; +} + +/* Return the final value of a plt relocation. */ +static inline Elf32_Addr +elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc, + Elf32_Addr value) +{ + return value + reloc->r_addend; +} + +#endif /* !dl_machine_h */ + +#ifdef RESOLVE + +/* Perform the relocation specified by RELOC and SYM (which is fully resolved). + MAP is the object containing the reloc. */ + +static inline void +elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, + const Elf32_Sym *sym, const struct r_found_version *version, + void *const reloc_addr_arg) +{ + Elf32_Addr *const reloc_addr = reloc_addr_arg; + const unsigned int r_type = ELF32_R_TYPE (reloc->r_info); + + if (__builtin_expect (r_type == R_CRIS_RELATIVE, 0)) + *reloc_addr = map->l_addr + reloc->r_addend; + else + { +#ifndef RTLD_BOOTSTRAP + const Elf32_Sym *const refsym = sym; +#endif + Elf32_Addr value; + if (sym->st_shndx != SHN_UNDEF + && ELF32_ST_BIND (sym->st_info) == STB_LOCAL) + value = map->l_addr; + else + { + value = RESOLVE (&sym, version, r_type); + if (sym) + value += sym->st_value; + } + value += reloc->r_addend; /* Assume copy relocs have zero addend. */ + + switch (r_type) + { +#ifndef RTLD_BOOTSTRAP + case R_CRIS_COPY: + if (sym == NULL) + /* This can happen in trace mode if an object could not be + found. */ + break; + if (sym->st_size > refsym->st_size + || (GL(dl_verbose) && sym->st_size < refsym->st_size)) + { + const char *strtab; + + strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]); + _dl_error_printf ("\ +%s: Symbol `%s' has different size in shared object, consider re-linking\n", + rtld_progname ?: "<program name unknown>", + strtab + refsym->st_name); + } + memcpy (reloc_addr_arg, (void *) value, + MIN (sym->st_size, refsym->st_size)); + break; + + case R_CRIS_32: +#endif + case R_CRIS_GLOB_DAT: + case R_CRIS_JUMP_SLOT: + *reloc_addr = value; + break; +#ifndef RTLD_BOOTSTRAP + case R_CRIS_8: + *(char *) reloc_addr = value; + break; + case R_CRIS_16: + *(short *) reloc_addr = value; + break; + case R_CRIS_8_PCREL: + *(char *) reloc_addr + = value + reloc->r_addend - (Elf32_Addr) reloc_addr - 1; + break; + case R_CRIS_16_PCREL: + *(short *) reloc_addr + = value + reloc->r_addend - (Elf32_Addr) reloc_addr - 2; + break; + case R_CRIS_32_PCREL: + *reloc_addr = value + reloc->r_addend - (Elf32_Addr) reloc_addr - 4; + break; +#endif + case R_CRIS_NONE: + break; +#if !defined RTLD_BOOTSTRAP || defined _NDEBUG + default: + _dl_reloc_bad_type (map, r_type, 0); + break; +#endif + } + } +} + +static inline void +elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc, + void *const reloc_addr_arg) +{ + Elf32_Addr *const reloc_addr = reloc_addr_arg; + *reloc_addr = l_addr + reloc->r_addend; +} + +static inline void +elf_machine_lazy_rel (struct link_map *map, + Elf32_Addr l_addr, const Elf32_Rela *reloc) +{ + Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset); + const unsigned int r_type = ELF32_R_TYPE (reloc->r_info); + if (__builtin_expect (r_type == R_CRIS_JUMP_SLOT, 1)) + *reloc_addr += l_addr; + else + _dl_reloc_bad_type (map, r_type, 1); +} + +#endif /* RESOLVE */ diff --git a/ports/sysdeps/cris/elf/start.S b/ports/sysdeps/cris/elf/start.S new file mode 100644 index 000000000..a3f85bcd0 --- /dev/null +++ b/ports/sysdeps/cris/elf/start.S @@ -0,0 +1,141 @@ +/* Startup code compliant to the ELF CRIS ABI (to-be-written). + Copyright (C) 2001, 2002 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. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The GNU Lesser General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + Note that people who make modified versions of this file are not + obligated to grant this special exception for their modified + versions; it is their choice whether to do so. The GNU Lesser + General Public License gives permission to release a modified + version without this exception; this exception also makes it + possible to release a modified version which carries forward this + exception. + + 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. */ + +#include <sysdep.h> + +/* This is the canonical entry point, usually the first thing in the text + segment. When the entry point runs, most registers' values are + unspecified, except for: + + R10 Contains a function pointer to be registered with `atexit'. + This is how the dynamic linker arranges to have DT_FINI + functions called for shared libraries that have been loaded + before this code runs. + + SP The stack contains the arguments and environment: + [SP] argc + [SP+4] argv[0] + ... + [SP+4*argc] NULL + [SP+4*(argc+1)] envp[0] + ... + NULL +*/ + + .syntax no_register_prefix + + .text + .globl _start + .type _start,@function +_start: + /* Clear the frame pointer, to mark the outermost frame. */ + moveq 0,r8 + + /* Move the shared library termination function to the right place + for __libc_main. */ + move.d r10,r9 + + /* Extract the arguments as encoded on the stack and set up the + arguments for `main': argc, argv. envp will be determined + later in __libc_start_main. */ + + /* Get the argument count. */ + move.d [sp],r11 + + /* Store the stack pointer as end of stack. We overwrite + the incoming argc. */ + move.d sp,[sp] + + /* The argument vector starts just after the argument count. */ + move.d sp,r12 + addq 4,r12 + + /* There are seven arguments to __libc_start_main: + r10: main - Address of it. + r11: argc + r12: argv + r13: init - Function to call. + + [sp]: fini - Function to register with atexit. + [sp+4]: rtld_fini - Another function to register with atexit. + [sp+8]: stack_end - Top of stack (actually same as argv). + + The last two are passed on stack. */ + + /* Store the fini function coming from the dynamic loader. */ + push r9 + + /* Get the addresses of our own entry points to `.fini' and + `.init'. */ + +#ifdef __PIC__ + /* If for some reason this program is compiled as PIC, set up R0. */ + move.d pc,r0 + sub.d .:GOTOFF,r0 + + move.d __libc_csu_init:PLTG,r13 + add.d r0,r13 + move.d __libc_csu_fini:PLTG,r9 + add.d r0,r9 + move.d main:PLTG,r10 + add.d r0,r10 +#else + move.d __libc_csu_init,r13 + move.d __libc_csu_fini,r9 + move.d main,r10 +#endif + push r9 + + /* Call the user's main function, and exit with its value. But + let the libc call main. */ + PLTCALL (__libc_start_main) + + /* Crash if somehow `exit' does return. We have at least 8192 + invalid addresses to choose from. */ + test.d [6502] + + /* Stop the unstoppable. */ +0: + ba 0b + nop + +/* Define a symbol for the first piece of initialized data. */ + .data + .globl __data_start +__data_start: + .long 0 + .weak data_start + data_start = __data_start diff --git a/ports/sysdeps/cris/machine-gmon.h b/ports/sysdeps/cris/machine-gmon.h new file mode 100644 index 000000000..2f36a34d6 --- /dev/null +++ b/ports/sysdeps/cris/machine-gmon.h @@ -0,0 +1,28 @@ +/* PowerPC-specific implementation of profiling support. + Copyright (C) 1997, 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. */ + +void __mcount_internal (unsigned long frompc, unsigned long selfpc); + +#define _MCOUNT_DECL(frompc, selfpc) \ +void __mcount_internal (unsigned long frompc, unsigned long selfpc) + + +/* Define MCOUNT as empty since we have the implementation in another + file. FIXME: Just stubs, currently. */ +#define MCOUNT diff --git a/ports/sysdeps/cris/memcopy.h b/ports/sysdeps/cris/memcopy.h new file mode 100644 index 000000000..134d36121 --- /dev/null +++ b/ports/sysdeps/cris/memcopy.h @@ -0,0 +1,57 @@ +/* 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 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. */ + +#include <sysdeps/generic/memcopy.h> + +/* We override the word-copying macros, partly because misalignment in one + pointer isn't cause for a special function, partly because we want to + get rid of wordcopy.c; these macros are only used in memmove.c (and + it's sibling bcopy) since we have arch-specific mempcpy, memcpy and + memset. */ + +#undef OP_T_THRES +#define OP_T_THRES OPSIZ + +#define WORD_COPY_FWD(dst_bp, src_bp, nbytes_left, nbytes) \ + do \ + { \ + unsigned long enddst_bp = dst_bp + nbytes - (nbytes % OPSIZ); \ + nbytes_left = (nbytes % OPSIZ); \ + while (dst_bp < (unsigned long) enddst_bp) \ + { \ + op_t x = *(op_t *) src_bp; \ + src_bp += sizeof x; \ + *(op_t *) dst_bp = x; \ + dst_bp += sizeof x; \ + } \ + } while (0) + +#define WORD_COPY_BWD(dst_bp, src_bp, nbytes_left, nbytes) \ + do \ + { \ + unsigned long enddst_bp = dst_bp - nbytes + (nbytes % OPSIZ); \ + nbytes_left = (nbytes % OPSIZ); \ + while (dst_bp > enddst_bp) \ + { \ + op_t x; \ + src_bp -= sizeof x; \ + x = *(op_t *) src_bp; \ + dst_bp -= sizeof x; \ + *(op_t *) dst_bp = x; \ + } \ + } while (0) diff --git a/ports/sysdeps/cris/memusage.h b/ports/sysdeps/cris/memusage.h new file mode 100644 index 000000000..58b57ff37 --- /dev/null +++ b/ports/sysdeps/cris/memusage.h @@ -0,0 +1,27 @@ +/* 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 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. */ + +/* No asm variables, just for reasons of solid healthy paranoia. */ +#define GETSP() \ + ({ \ + uintptr_t stack_ptr; \ + __asm__ ("move.d $sp,%0" : "=rm" (stack_ptr)); \ + stack_ptr; \ + }) + +#include <sysdeps/generic/memusage.h> diff --git a/ports/sysdeps/cris/setjmp.S b/ports/sysdeps/cris/setjmp.S new file mode 100644 index 000000000..c5a512f49 --- /dev/null +++ b/ports/sysdeps/cris/setjmp.S @@ -0,0 +1,66 @@ +/* setjmp for CRIS. + 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 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. */ + +#include <sysdep.h> +#define _SETJMP_H +#define _ASM +#include <bits/setjmp.h> + + .syntax no_register_prefix + +ENTRY (__sigsetjmp) +.Local__sigsetjmp: + moveq 1,r9 + movem sp,[r10+1*4] +#ifdef __PIC__ + move.d pc,r9 + addq 0f-.,r9 +#else + move.d 0f,r9 +#endif + move.d r9,[r10] + move srp,[r10+16*4] + move ccr,[r10+17*4] + PLTJUMP (__sigjmp_save) +0: /* This is where longjmp returns. (Don't use "ret" - it's a macro. */ + Ret + move.d r9,r10 +END (__sigsetjmp) + +/* Binary compatibility entry points. Having these in separate files + is not meaningful and just adds library overhead. */ + +ENTRY (__setjmp) + ba .Local__sigsetjmp + moveq 0,r11 +END (__setjmp) + +ENTRY (_setjmp) + ba .Local__sigsetjmp + moveq 0,r11 +END (_setjmp) + +ENTRY (setjmp) + ba .Local__sigsetjmp + moveq 1,r11 +END (setjmp) + +weak_extern (__setjmp) +weak_extern (_setjmp) +weak_extern (setjmp) diff --git a/ports/sysdeps/cris/stackinfo.h b/ports/sysdeps/cris/stackinfo.h new file mode 100644 index 000000000..43c944834 --- /dev/null +++ b/ports/sysdeps/cris/stackinfo.h @@ -0,0 +1,28 @@ +/* Copyright (C) 2002 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. */ + +/* This file contains a bit of information about the stack allocation + of the processor. */ + +#ifndef _STACKINFO_H +#define _STACKINFO_H 1 + +/* On cris the stack grows down. */ +#define _STACK_GROWS_DOWN 1 + +#endif /* stackinfo.h */ diff --git a/ports/sysdeps/cris/sysdep.h b/ports/sysdeps/cris/sysdep.h new file mode 100644 index 000000000..913d5ad9b --- /dev/null +++ b/ports/sysdeps/cris/sysdep.h @@ -0,0 +1,114 @@ +/* Assembler macros for CRIS. + 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 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. */ + +#include <sysdeps/generic/sysdep.h> + +#ifndef HAVE_ELF +# error ELF is assumed. Generalize the code and retry. +#endif + +#ifndef NO_UNDERSCORES +# error User-label prefix (underscore) assumed absent. Generalize the code and retry. +#endif + +#ifdef __ASSEMBLER__ + +/* Syntactic details of assembly-code. */ + +/* It is *not* generally true that "ELF uses byte-counts for .align, most + others use log2 of count of bytes", like some neighboring configs say. + See "align" in gas/read.c which is not overridden by + gas/config/obj-elf.c. It takes a log2 argument. *Some* targets + override it to take a byte argument. People should read source instead + of relying on hearsay. */ +# define ALIGNARG(log2) log2 + +# define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg +# define ASM_SIZE_DIRECTIVE(name) .size name,.-name + +/* The non-PIC jump is preferred, since it does not stall, and does not + invoke generation of a PLT. These macros assume that $r0 is set up as + GOT register. */ +# ifdef __PIC__ +# define PLTJUMP(_x) \ + add.d C_SYMBOL_NAME (_x):PLT,$pc + +# define PLTCALL(_x) \ + move.d C_SYMBOL_NAME (_x):PLTG,$r9 @ \ + add.d $r0,$r9 @ \ + jsr $r9 + +# define SETUP_PIC \ + push $r0 @ \ + move.d $pc,$r0 @ \ + sub.d .:GOTOFF,$r0 + +# define TEARDOWN_PIC pop $r0 +# else +# define PLTJUMP(_x) jump C_SYMBOL_NAME (_x) +# define PLTCALL(_x) jsr C_SYMBOL_NAME (_x) +# define SETUP_PIC +# define TEARDOWN_PIC +# endif + +/* Define an entry point visible from C. */ +# define ENTRY(name) \ + .text @ \ + ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (name) @ \ + ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME (name), function) @ \ + .align ALIGNARG (2) @ \ + C_LABEL(name) @ \ + CALL_MCOUNT + +# undef END +# define END(name) \ + ASM_SIZE_DIRECTIVE (C_SYMBOL_NAME (name)) + +/* If compiled for profiling, call `mcount' at the start of each function. + FIXME: Note that profiling is not actually implemented. This is just + example code which might not even compile, though it is believed to be + correct. */ +# ifdef PROF +# define CALL_MCOUNT \ + push $srp @ \ + push $r9 @ \ + push $r10 @ \ + push $r11 @ \ + push $r12 @ \ + push $r13 @ \ + SETUP_PIC @ \ + PLTCALL (mcount) @ \ + TEARDOWN_PIC @ \ + pop $r13 @ \ + pop $r12 @ \ + pop $r11 @ \ + pop $r10 @ \ + pop $r9 @ \ + pop $srp +# else +# define CALL_MCOUNT /* Do nothing. */ +# endif + +/* Since C identifiers are not normally prefixed with an underscore + on this system, the asm identifier `syscall_error' intrudes on the + C name space. Make sure we use an innocuous name. */ +# define syscall_error __syscall_error +# define mcount _mcount + +#endif /* __ASSEMBLER__ */ diff --git a/ports/sysdeps/cris/wordcopy.c b/ports/sysdeps/cris/wordcopy.c new file mode 100644 index 000000000..6525e9f03 --- /dev/null +++ b/ports/sysdeps/cris/wordcopy.c @@ -0,0 +1 @@ +/* Empty; not needed. */ diff --git a/ports/sysdeps/i860/memcopy.h b/ports/sysdeps/i860/memcopy.h new file mode 100644 index 000000000..3bb9ba513 --- /dev/null +++ b/ports/sysdeps/i860/memcopy.h @@ -0,0 +1,33 @@ +/* Copyright (C) 1991, 1997 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. */ + +#include <sysdeps/generic/memcopy.h> + +#if 0 +#undef MERGE +/* In order to make this work properly, an 's' constraint need to be added + to tm-i860.h, to mean the SC register. */ +#define MERGE(w0, sh_1, w1, sh_2) \ + ({ \ + unsigned int __merge; \ + asm("shrd %2,%1,%0" : \ + "=r" (__merge) : \ + "r" (w0), "r" (w1), "s" (sh_1)); \ + __merge; \ + }) +#endif diff --git a/ports/sysdeps/i960/Implies b/ports/sysdeps/i960/Implies new file mode 100644 index 000000000..1d569744a --- /dev/null +++ b/ports/sysdeps/i960/Implies @@ -0,0 +1,3 @@ +# i960 family uses IEEE 754 floating point. +ieee754/flt-32 +ieee754/dbl-64 diff --git a/ports/sysdeps/i960/add_n.s b/ports/sysdeps/i960/add_n.s new file mode 100644 index 000000000..6031f6d4c --- /dev/null +++ b/ports/sysdeps/i960/add_n.s @@ -0,0 +1,21 @@ +.text + .align 4 + .globl ___mpn_add_n +___mpn_add_n: + mov 0,g6 # clear carry-save register + cmpo 1,0 # clear cy + +Loop: subo 1,g3,g3 # update loop counter + ld (g1),g5 # load from s1_ptr + addo 4,g1,g1 # s1_ptr++ + ld (g2),g4 # load from s2_ptr + addo 4,g2,g2 # s2_ptr++ + cmpo g6,1 # restore cy from g6, relies on cy being 0 + addc g4,g5,g4 # main add + subc 0,0,g6 # save cy in g6 + st g4,(g0) # store result to res_ptr + addo 4,g0,g0 # res_ptr++ + cmpobne 0,g3,Loop # when branch is taken, clears C bit + + mov g6,g0 + ret diff --git a/ports/sysdeps/i960/addmul_1.s b/ports/sysdeps/i960/addmul_1.s new file mode 100644 index 000000000..1a3de95e5 --- /dev/null +++ b/ports/sysdeps/i960/addmul_1.s @@ -0,0 +1,26 @@ +.text + .align 4 + .globl ___mpn_mul_1 +___mpn_mul_1: + subo g2,0,g2 + shlo 2,g2,g4 + subo g4,g1,g1 + subo g4,g0,g13 + mov 0,g0 + + cmpo 1,0 # clear C bit on AC.cc + +Loop: ld (g1)[g2*4],g5 + emul g3,g5,g6 + ld (g13)[g2*4],g5 + + addc g0,g6,g6 # relies on that C bit is clear + addc 0,g7,g7 + addc g5,g6,g6 # relies on that C bit is clear + st g6,(g13)[g2*4] + addc 0,g7,g0 + + addo g2,1,g2 + cmpobne 0,g2,Loop # when branch is taken, clears C bit + + ret diff --git a/ports/sysdeps/i960/ffs.c b/ports/sysdeps/i960/ffs.c new file mode 100644 index 000000000..ad907a4ec --- /dev/null +++ b/ports/sysdeps/i960/ffs.c @@ -0,0 +1,46 @@ +/* ffs -- find first set bit in a word, counted from least significant end. + For i960 Core architecture + This file is part of the GNU C Library. + Copyright (C) 1994, 1997, 2004 Free Software Foundation, Inc. + Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), + On-Line Applications Research Corporation. + + 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. */ + +#include <string.h> + +#undef ffs + +#if defined (__GNUC__) && defined (__i960__) + +int +__ffs (x) + int x; +{ + int cnt; + + asm ("scanbit %1,%0" : "=d" (cnt) : "rm" (x & -x)); + + return cnt; +} +weak_alias (__ffs, ffs) +libc_hidden_builtin_def (ffs) + +#else + +#include <sysdeps/generic/ffs.c> + +#endif diff --git a/ports/sysdeps/i960/mul_1.s b/ports/sysdeps/i960/mul_1.s new file mode 100644 index 000000000..e75ea42d3 --- /dev/null +++ b/ports/sysdeps/i960/mul_1.s @@ -0,0 +1,23 @@ +.text + .align 4 + .globl ___mpn_mul_1 +___mpn_mul_1: + subo g2,0,g2 + shlo 2,g2,g4 + subo g4,g1,g1 + subo g4,g0,g13 + mov 0,g0 + + cmpo 1,0 # clear C bit on AC.cc + +Loop: ld (g1)[g2*4],g5 + emul g3,g5,g6 + + addc g0,g6,g6 # relies on that C bit is clear + st g6,(g13)[g2*4] + addc 0,g7,g0 + + addo g2,1,g2 + cmpobne 0,g2,Loop # when branch is taken, clears C bit + + ret diff --git a/ports/sysdeps/i960/sub_n.s b/ports/sysdeps/i960/sub_n.s new file mode 100644 index 000000000..13ebbfa9f --- /dev/null +++ b/ports/sysdeps/i960/sub_n.s @@ -0,0 +1,21 @@ +.text + .align 4 + .globl ___mpn_sub_n +___mpn_sub_n: + mov 1,g6 # set carry-save register + cmpo 1,0 # clear cy + +Loop: subo 1,g3,g3 # update loop counter + ld (g1),g5 # load from s1_ptr + addo 4,g1,g1 # s1_ptr++ + ld (g2),g4 # load from s2_ptr + addo 4,g2,g2 # s2_ptr++ + cmpo g6,1 # restore cy from g6, relies on cy being 0 + subc g4,g5,g4 # main subtract + subc 0,0,g6 # save cy in g6 + st g4,(g0) # store result to res_ptr + addo 4,g0,g0 # res_ptr++ + cmpobne 0,g3,Loop # when branch is taken, cy will be 0 + + mov g6,g0 + ret diff --git a/ports/sysdeps/m88k/add_n.s b/ports/sysdeps/m88k/add_n.s new file mode 100644 index 000000000..a10730d7c --- /dev/null +++ b/ports/sysdeps/m88k/add_n.s @@ -0,0 +1,104 @@ +; mc88100 __mpn_add -- Add two limb vectors of the same length > 0 and store +; sum in a third limb vector. + +; Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc. + +; This file is part of the GNU MP Library. + +; The GNU MP 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 MP 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 MP 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. + + +; INPUT PARAMETERS +; res_ptr r2 +; s1_ptr r3 +; s2_ptr r4 +; size r5 + +; This code has been optimized to run one instruction per clock, avoiding +; load stalls and writeback contention. As a result, the instruction +; order is not always natural. + +; The speed is about 4.6 clocks/limb + 18 clocks/limb-vector on an 88100, +; but on the 88110, it seems to run much slower, 6.6 clocks/limb. + + text + align 16 + global ___mpn_add_n +___mpn_add_n: + ld r6,r3,0 ; read first limb from s1_ptr + extu r10,r5,3 + ld r7,r4,0 ; read first limb from s2_ptr + + subu.co r5,r0,r5 ; (clear carry as side effect) + mak r5,r5,3<4> + bcnd eq0,r5,Lzero + + or r12,r0,lo16(Lbase) + or.u r12,r12,hi16(Lbase) + addu r12,r12,r5 ; r12 is address for entering in loop + + extu r5,r5,2 ; divide by 4 + subu r2,r2,r5 ; adjust res_ptr + subu r3,r3,r5 ; adjust s1_ptr + subu r4,r4,r5 ; adjust s2_ptr + + or r8,r6,r0 + + jmp.n r12 + or r9,r7,r0 + +Loop: addu r3,r3,32 + st r8,r2,28 + addu r4,r4,32 + ld r6,r3,0 + addu r2,r2,32 + ld r7,r4,0 +Lzero: subu r10,r10,1 ; add 0 + 8r limbs (adj loop cnt) +Lbase: ld r8,r3,4 + addu.cio r6,r6,r7 + ld r9,r4,4 + st r6,r2,0 + ld r6,r3,8 ; add 7 + 8r limbs + addu.cio r8,r8,r9 + ld r7,r4,8 + st r8,r2,4 + ld r8,r3,12 ; add 6 + 8r limbs + addu.cio r6,r6,r7 + ld r9,r4,12 + st r6,r2,8 + ld r6,r3,16 ; add 5 + 8r limbs + addu.cio r8,r8,r9 + ld r7,r4,16 + st r8,r2,12 + ld r8,r3,20 ; add 4 + 8r limbs + addu.cio r6,r6,r7 + ld r9,r4,20 + st r6,r2,16 + ld r6,r3,24 ; add 3 + 8r limbs + addu.cio r8,r8,r9 + ld r7,r4,24 + st r8,r2,20 + ld r8,r3,28 ; add 2 + 8r limbs + addu.cio r6,r6,r7 + ld r9,r4,28 + st r6,r2,24 + bcnd.n ne0,r10,Loop ; add 1 + 8r limbs + addu.cio r8,r8,r9 + + st r8,r2,28 ; store most significant limb + + jmp.n r1 + addu.ci r2,r0,r0 ; return carry-out from most sign. limb diff --git a/ports/sysdeps/m88k/ffs.c b/ports/sysdeps/m88k/ffs.c new file mode 100644 index 000000000..b7db70fd3 --- /dev/null +++ b/ports/sysdeps/m88k/ffs.c @@ -0,0 +1,45 @@ +/* ffs -- find first set bit in a word, counted from least significant end. + For Motorola 88000. + This file is part of the GNU C Library. + Copyright (C) 1991, 1992, 1997, 2004 Free Software Foundation, Inc. + Contributed by Torbjorn Granlund (tege@sics.se). + + 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. */ + +#include <bstring.h> + +#undef ffs + +#ifdef __GNUC__ + +int +__ffs (x) + int x; +{ + int cnt; + + if (x == 0) + return 0; + + asm ("ff1 %0,%1" : "=r" (cnt) : "r" (x & -x)); + return cnt + 1; +} +weak_alias (__ffs, ffs) +libc_hidden_builtin_def (ffs) + +#else +#include <sysdeps/generic/ffs.c> +#endif diff --git a/ports/sysdeps/m88k/m88100/add_n.S b/ports/sysdeps/m88k/m88100/add_n.S new file mode 100644 index 000000000..2107eb55c --- /dev/null +++ b/ports/sysdeps/m88k/m88100/add_n.S @@ -0,0 +1,133 @@ +; mc88100 __mpn_add -- Add two limb vectors of the same length > 0 and store +; sum in a third limb vector. + +; Copyright (C) 1992, 1994 Free Software Foundation, Inc. + +; This file is part of the GNU MP Library. + +; The GNU MP Library is free software; you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation; either version 2, or (at your option) +; any later version. + +; The GNU MP 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 General Public License for more details. + +; You should have received a copy of the GNU General Public License +; along with the GNU MP Library; see the file COPYING. If not, write to +; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +; INPUT PARAMETERS +; res_ptr r2 +; s1_ptr r3 +; s2_ptr r4 +; size r5 + +; This code has been optimized to run one instruction per clock, avoiding +; load stalls and writeback contention. As a result, the instruction +; order is not always natural. + +; The speed is approximately 4.3 clocks/limb + 18 clocks/limb-vector. + +#include "sysdep.h" + +ENTRY (__mpn_add_n) + ld r6,r3,0 ; read first limb from s1_ptr + extu r10,r5,4 + ld r7,r4,0 ; read first limb from s2_ptr + + subu.co r5,r0,r5 ; (clear carry as side effect) + mak r5,r5,4<4> + bcnd eq0,r5,Lzero + + or r12,r0,lo16(Lbase) + or.u r12,r12,hi16(Lbase) + addu r12,r12,r5 ; r12 is address for entering in loop + + extu r5,r5,2 ; divide by 4 + subu r2,r2,r5 ; adjust res_ptr + subu r3,r3,r5 ; adjust s1_ptr + subu r4,r4,r5 ; adjust s2_ptr + + or r8,r6,r0 + + jmp.n r12 + or r9,r7,r0 + +Loop: addu r3,r3,64 + st r8,r2,60 + addu r4,r4,64 + ld r6,r3,0 + addu r2,r2,64 + ld r7,r4,0 +Lzero: subu r10,r10,1 ; add 0 + 16r limbs (adjust loop counter) +Lbase: ld r8,r3,4 + addu.cio r6,r6,r7 + ld r9,r4,4 + st r6,r2,0 + ld r6,r3,8 ; add 15 + 16r limbs + addu.cio r8,r8,r9 + ld r7,r4,8 + st r8,r2,4 + ld r8,r3,12 ; add 14 + 16r limbs + addu.cio r6,r6,r7 + ld r9,r4,12 + st r6,r2,8 + ld r6,r3,16 ; add 13 + 16r limbs + addu.cio r8,r8,r9 + ld r7,r4,16 + st r8,r2,12 + ld r8,r3,20 ; add 12 + 16r limbs + addu.cio r6,r6,r7 + ld r9,r4,20 + st r6,r2,16 + ld r6,r3,24 ; add 11 + 16r limbs + addu.cio r8,r8,r9 + ld r7,r4,24 + st r8,r2,20 + ld r8,r3,28 ; add 10 + 16r limbs + addu.cio r6,r6,r7 + ld r9,r4,28 + st r6,r2,24 + ld r6,r3,32 ; add 9 + 16r limbs + addu.cio r8,r8,r9 + ld r7,r4,32 + st r8,r2,28 + ld r8,r3,36 ; add 8 + 16r limbs + addu.cio r6,r6,r7 + ld r9,r4,36 + st r6,r2,32 + ld r6,r3,40 ; add 7 + 16r limbs + addu.cio r8,r8,r9 + ld r7,r4,40 + st r8,r2,36 + ld r8,r3,44 ; add 6 + 16r limbs + addu.cio r6,r6,r7 + ld r9,r4,44 + st r6,r2,40 + ld r6,r3,48 ; add 5 + 16r limbs + addu.cio r8,r8,r9 + ld r7,r4,48 + st r8,r2,44 + ld r8,r3,52 ; add 4 + 16r limbs + addu.cio r6,r6,r7 + ld r9,r4,52 + st r6,r2,48 + ld r6,r3,56 ; add 3 + 16r limbs + addu.cio r8,r8,r9 + ld r7,r4,56 + st r8,r2,52 + ld r8,r3,60 ; add 2 + 16r limbs + addu.cio r6,r6,r7 + ld r9,r4,60 + st r6,r2,56 + bcnd.n ne0,r10,Loop ; add 1 + 16r limbs + addu.cio r8,r8,r9 + + st r8,r2,60 ; store most significant limb + + jmp.n r1 + addu.ci r2,r0,r0 ; return carry-out from most sign. limb diff --git a/ports/sysdeps/m88k/m88100/add_n.s b/ports/sysdeps/m88k/m88100/add_n.s new file mode 100644 index 000000000..0741ec91d --- /dev/null +++ b/ports/sysdeps/m88k/m88100/add_n.s @@ -0,0 +1,103 @@ +; mc88100 __mpn_add -- Add two limb vectors of the same length > 0 and store +; sum in a third limb vector. + +; Copyright (C) 1992, 1994 Free Software Foundation, Inc. + +; This file is part of the GNU MP Library. + +; The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to +; the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + +; INPUT PARAMETERS +; res_ptr r2 +; s1_ptr r3 +; s2_ptr r4 +; size r5 + +; This code has been optimized to run one instruction per clock, avoiding +; load stalls and writeback contention. As a result, the instruction +; order is not always natural. + +; The speed is about 4.6 clocks/limb + 18 clocks/limb-vector on an 88100, +; but on the 88110, it seems to run much slower, 6.6 clocks/limb. + + text + align 16 + global ___mpn_add_n +___mpn_add_n: + ld r6,r3,0 ; read first limb from s1_ptr + extu r10,r5,3 + ld r7,r4,0 ; read first limb from s2_ptr + + subu.co r5,r0,r5 ; (clear carry as side effect) + mak r5,r5,3<4> + bcnd eq0,r5,Lzero + + or r12,r0,lo16(Lbase) + or.u r12,r12,hi16(Lbase) + addu r12,r12,r5 ; r12 is address for entering in loop + + extu r5,r5,2 ; divide by 4 + subu r2,r2,r5 ; adjust res_ptr + subu r3,r3,r5 ; adjust s1_ptr + subu r4,r4,r5 ; adjust s2_ptr + + or r8,r6,r0 + + jmp.n r12 + or r9,r7,r0 + +Loop: addu r3,r3,32 + st r8,r2,28 + addu r4,r4,32 + ld r6,r3,0 + addu r2,r2,32 + ld r7,r4,0 +Lzero: subu r10,r10,1 ; add 0 + 8r limbs (adj loop cnt) +Lbase: ld r8,r3,4 + addu.cio r6,r6,r7 + ld r9,r4,4 + st r6,r2,0 + ld r6,r3,8 ; add 7 + 8r limbs + addu.cio r8,r8,r9 + ld r7,r4,8 + st r8,r2,4 + ld r8,r3,12 ; add 6 + 8r limbs + addu.cio r6,r6,r7 + ld r9,r4,12 + st r6,r2,8 + ld r6,r3,16 ; add 5 + 8r limbs + addu.cio r8,r8,r9 + ld r7,r4,16 + st r8,r2,12 + ld r8,r3,20 ; add 4 + 8r limbs + addu.cio r6,r6,r7 + ld r9,r4,20 + st r6,r2,16 + ld r6,r3,24 ; add 3 + 8r limbs + addu.cio r8,r8,r9 + ld r7,r4,24 + st r8,r2,20 + ld r8,r3,28 ; add 2 + 8r limbs + addu.cio r6,r6,r7 + ld r9,r4,28 + st r6,r2,24 + bcnd.n ne0,r10,Loop ; add 1 + 8r limbs + addu.cio r8,r8,r9 + + st r8,r2,28 ; store most significant limb + + jmp.n r1 + addu.ci r2,r0,r0 ; return carry-out from most sign. limb diff --git a/ports/sysdeps/m88k/m88100/mul_1.S b/ports/sysdeps/m88k/m88100/mul_1.S new file mode 100644 index 000000000..503897b29 --- /dev/null +++ b/ports/sysdeps/m88k/m88100/mul_1.S @@ -0,0 +1,127 @@ +; mc88100 __mpn_mul_1 -- Multiply a limb vector with a single limb and +; store the product in a second limb vector. + +; Copyright (C) 1992, 1994 Free Software Foundation, Inc. + +; This file is part of the GNU MP Library. + +; The GNU MP Library is free software; you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation; either version 2, or (at your option) +; any later version. + +; The GNU MP 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 General Public License for more details. + +; You should have received a copy of the GNU General Public License +; along with the GNU MP Library; see the file COPYING. If not, write to +; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +; INPUT PARAMETERS +; res_ptr r2 +; s1_ptr r3 +; size r4 +; s2_limb r5 + +; Common overhead is about 11 cycles/invocation. + +; The speed for S2_LIMB >= 0x10000 is approximately 21 cycles/limb. (The +; pipeline stalls 2 cycles due to WB contention.) + +; The speed for S2_LIMB < 0x10000 is approximately 16 cycles/limb. (The +; pipeline stalls 2 cycles due to WB contention and 1 cycle due to latency.) + +; To enhance speed: +; 1. Unroll main loop 4-8 times. +; 2. Schedule code to avoid WB contention. It might be tempting to move the +; ld instruction in the loops down to save 2 cycles (less WB contention), +; but that looses because the ultimate value will be read from outside +; the allocated space. But if we handle the ultimate multiplication in +; the tail, we can do this. +; 3. Make the multiplication with less instructions. I think the code for +; (S2_LIMB >= 0x10000) is not minimal. +; With these techniques the (S2_LIMB >= 0x10000) case would run in 17 or +; less cycles/limb; the (S2_LIMB < 0x10000) case would run in 11 +; cycles/limb. (Assuming infinite unrolling.) + +#include "sysdep.h" + +ENTRY (__mpn_mul_1) + + ; Make S1_PTR and RES_PTR point at the end of their blocks + ; and negate SIZE. + lda r3,r3[r4] + lda r6,r2[r4] ; RES_PTR in r6 since r2 is retval + subu r4,r0,r4 + + addu.co r2,r0,r0 ; r2 = cy = 0 + ld r9,r3[r4] + mask r7,r5,0xffff ; r7 = lo(S2_LIMB) + extu r8,r5,16 ; r8 = hi(S2_LIMB) + bcnd.n eq0,r8,Lsmall ; jump if (hi(S2_LIMB) == 0) + subu r6,r6,4 + +; General code for any value of S2_LIMB. + + ; Make a stack frame and save r25 and r26 + subu r31,r31,16 + st.d r25,r31,8 + + ; Enter the loop in the middle + br.n L1 + addu r4,r4,1 + +Loop: + ld r9,r3[r4] + st r26,r6[r4] +; bcnd ne0,r0,0 ; bubble + addu r4,r4,1 +L1: mul r26,r9,r5 ; low word of product mul_1 WB ld + mask r12,r9,0xffff ; r12 = lo(s1_limb) mask_1 + mul r11,r12,r7 ; r11 = prod_0 mul_2 WB mask_1 + mul r10,r12,r8 ; r10 = prod_1a mul_3 + extu r13,r9,16 ; r13 = hi(s1_limb) extu_1 WB mul_1 + mul r12,r13,r7 ; r12 = prod_1b mul_4 WB extu_1 + mul r25,r13,r8 ; r25 = prod_2 mul_5 WB mul_2 + extu r11,r11,16 ; r11 = hi(prod_0) extu_2 WB mul_3 + addu r10,r10,r11 ; addu_1 WB extu_2 +; bcnd ne0,r0,0 ; bubble WB addu_1 + addu.co r10,r10,r12 ; WB mul_4 + mask.u r10,r10,0xffff ; move the 16 most significant bits... + addu.ci r10,r10,r0 ; ...to the low half of the word... + rot r10,r10,16 ; ...and put carry in pos 16. + addu.co r26,r26,r2 ; add old carry limb + bcnd.n ne0,r4,Loop + addu.ci r2,r25,r10 ; compute new carry limb + + st r26,r6[r4] + ld.d r25,r31,8 + jmp.n r1 + addu r31,r31,16 + +; Fast code for S2_LIMB < 0x10000 +Lsmall: + ; Enter the loop in the middle + br.n SL1 + addu r4,r4,1 + +SLoop: + ld r9,r3[r4] ; + st r8,r6[r4] ; + addu r4,r4,1 ; +SL1: mul r8,r9,r5 ; low word of product + mask r12,r9,0xffff ; r12 = lo(s1_limb) + extu r13,r9,16 ; r13 = hi(s1_limb) + mul r11,r12,r7 ; r11 = prod_0 + mul r12,r13,r7 ; r12 = prod_1b + addu.cio r8,r8,r2 ; add old carry limb + extu r10,r11,16 ; r11 = hi(prod_0) + addu r10,r10,r12 ; + bcnd.n ne0,r4,SLoop + extu r2,r10,16 ; r2 = new carry limb + + jmp.n r1 + st r8,r6[r4] diff --git a/ports/sysdeps/m88k/m88100/mul_1.s b/ports/sysdeps/m88k/m88100/mul_1.s new file mode 100644 index 000000000..77242778d --- /dev/null +++ b/ports/sysdeps/m88k/m88100/mul_1.s @@ -0,0 +1,128 @@ +; mc88100 __mpn_mul_1 -- Multiply a limb vector with a single limb and +; store the product in a second limb vector. + +; Copyright (C) 1992, 1994 Free Software Foundation, Inc. + +; This file is part of the GNU MP Library. + +; The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to +; the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + +; INPUT PARAMETERS +; res_ptr r2 +; s1_ptr r3 +; size r4 +; s2_limb r5 + +; Common overhead is about 11 cycles/invocation. + +; The speed for S2_LIMB >= 0x10000 is approximately 21 cycles/limb. (The +; pipeline stalls 2 cycles due to WB contention.) + +; The speed for S2_LIMB < 0x10000 is approximately 16 cycles/limb. (The +; pipeline stalls 2 cycles due to WB contention and 1 cycle due to latency.) + +; To enhance speed: +; 1. Unroll main loop 4-8 times. +; 2. Schedule code to avoid WB contention. It might be tempting to move the +; ld instruction in the loops down to save 2 cycles (less WB contention), +; but that looses because the ultimate value will be read from outside +; the allocated space. But if we handle the ultimate multiplication in +; the tail, we can do this. +; 3. Make the multiplication with less instructions. I think the code for +; (S2_LIMB >= 0x10000) is not minimal. +; With these techniques the (S2_LIMB >= 0x10000) case would run in 17 or +; less cycles/limb; the (S2_LIMB < 0x10000) case would run in 11 +; cycles/limb. (Assuming infinite unrolling.) + + text + align 16 + global ___mpn_mul_1 +___mpn_mul_1: + + ; Make S1_PTR and RES_PTR point at the end of their blocks + ; and negate SIZE. + lda r3,r3[r4] + lda r6,r2[r4] ; RES_PTR in r6 since r2 is retval + subu r4,r0,r4 + + addu.co r2,r0,r0 ; r2 = cy = 0 + ld r9,r3[r4] + mask r7,r5,0xffff ; r7 = lo(S2_LIMB) + extu r8,r5,16 ; r8 = hi(S2_LIMB) + bcnd.n eq0,r8,Lsmall ; jump if (hi(S2_LIMB) == 0) + subu r6,r6,4 + +; General code for any value of S2_LIMB. + + ; Make a stack frame and save r25 and r26 + subu r31,r31,16 + st.d r25,r31,8 + + ; Enter the loop in the middle + br.n L1 + addu r4,r4,1 + +Loop: + ld r9,r3[r4] + st r26,r6[r4] +; bcnd ne0,r0,0 ; bubble + addu r4,r4,1 +L1: mul r26,r9,r5 ; low word of product mul_1 WB ld + mask r12,r9,0xffff ; r12 = lo(s1_limb) mask_1 + mul r11,r12,r7 ; r11 = prod_0 mul_2 WB mask_1 + mul r10,r12,r8 ; r10 = prod_1a mul_3 + extu r13,r9,16 ; r13 = hi(s1_limb) extu_1 WB mul_1 + mul r12,r13,r7 ; r12 = prod_1b mul_4 WB extu_1 + mul r25,r13,r8 ; r25 = prod_2 mul_5 WB mul_2 + extu r11,r11,16 ; r11 = hi(prod_0) extu_2 WB mul_3 + addu r10,r10,r11 ; addu_1 WB extu_2 +; bcnd ne0,r0,0 ; bubble WB addu_1 + addu.co r10,r10,r12 ; WB mul_4 + mask.u r10,r10,0xffff ; move the 16 most significant bits... + addu.ci r10,r10,r0 ; ...to the low half of the word... + rot r10,r10,16 ; ...and put carry in pos 16. + addu.co r26,r26,r2 ; add old carry limb + bcnd.n ne0,r4,Loop + addu.ci r2,r25,r10 ; compute new carry limb + + st r26,r6[r4] + ld.d r25,r31,8 + jmp.n r1 + addu r31,r31,16 + +; Fast code for S2_LIMB < 0x10000 +Lsmall: + ; Enter the loop in the middle + br.n SL1 + addu r4,r4,1 + +SLoop: + ld r9,r3[r4] ; + st r8,r6[r4] ; + addu r4,r4,1 ; +SL1: mul r8,r9,r5 ; low word of product + mask r12,r9,0xffff ; r12 = lo(s1_limb) + extu r13,r9,16 ; r13 = hi(s1_limb) + mul r11,r12,r7 ; r11 = prod_0 + mul r12,r13,r7 ; r12 = prod_1b + addu.cio r8,r8,r2 ; add old carry limb + extu r10,r11,16 ; r11 = hi(prod_0) + addu r10,r10,r12 ; + bcnd.n ne0,r4,SLoop + extu r2,r10,16 ; r2 = new carry limb + + jmp.n r1 + st r8,r6[r4] diff --git a/ports/sysdeps/m88k/m88100/sub_n.S b/ports/sysdeps/m88k/m88100/sub_n.S new file mode 100644 index 000000000..927ece4f1 --- /dev/null +++ b/ports/sysdeps/m88k/m88100/sub_n.S @@ -0,0 +1,134 @@ +; mc88100 __mpn_sub -- Subtract two limb vectors of the same length > 0 and +; store difference in a third limb vector. + +; Copyright (C) 1992, 1994 Free Software Foundation, Inc. + +; This file is part of the GNU MP Library. + +; The GNU MP Library is free software; you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation; either version 2, or (at your option) +; any later version. + +; The GNU MP 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 General Public License for more details. + +; You should have received a copy of the GNU General Public License +; along with the GNU MP Library; see the file COPYING. If not, write to +; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +; INPUT PARAMETERS +; res_ptr r2 +; s1_ptr r3 +; s2_ptr r4 +; size r5 + +; This code has been optimized to run one instruction per clock, avoiding +; load stalls and writeback contention. As a result, the instruction +; order is not always natural. + +; The speed is approximately 4.3 clocks/limb + 18 clocks/limb-vector. + +#include "sysdep.h" + +ENTRY (__mpn_sub_n) + ld r6,r3,0 ; read first limb from s1_ptr + extu r10,r5,4 + ld r7,r4,0 ; read first limb from s2_ptr + + subu.co r5,r0,r5 ; (clear carry as side effect) + mak r5,r5,4<4> + bcnd eq0,r5,Lzero + + or r12,r0,lo16(Lbase) + or.u r12,r12,hi16(Lbase) + addu r12,r12,r5 ; r12 is address for entering in loop + + extu r5,r5,2 ; divide by 4 + subu r2,r2,r5 ; adjust res_ptr + subu r3,r3,r5 ; adjust s1_ptr + subu r4,r4,r5 ; adjust s2_ptr + + or r8,r6,r0 + + jmp.n r12 + or r9,r7,r0 + +Loop: addu r3,r3,64 + st r8,r2,60 + addu r4,r4,64 + ld r6,r3,0 + addu r2,r2,64 + ld r7,r4,0 +Lzero: subu r10,r10,1 ; subtract 0 + 16r limbs (adjust loop counter) +Lbase: ld r8,r3,4 + subu.cio r6,r6,r7 + ld r9,r4,4 + st r6,r2,0 + ld r6,r3,8 ; subtract 15 + 16r limbs + subu.cio r8,r8,r9 + ld r7,r4,8 + st r8,r2,4 + ld r8,r3,12 ; subtract 14 + 16r limbs + subu.cio r6,r6,r7 + ld r9,r4,12 + st r6,r2,8 + ld r6,r3,16 ; subtract 13 + 16r limbs + subu.cio r8,r8,r9 + ld r7,r4,16 + st r8,r2,12 + ld r8,r3,20 ; subtract 12 + 16r limbs + subu.cio r6,r6,r7 + ld r9,r4,20 + st r6,r2,16 + ld r6,r3,24 ; subtract 11 + 16r limbs + subu.cio r8,r8,r9 + ld r7,r4,24 + st r8,r2,20 + ld r8,r3,28 ; subtract 10 + 16r limbs + subu.cio r6,r6,r7 + ld r9,r4,28 + st r6,r2,24 + ld r6,r3,32 ; subtract 9 + 16r limbs + subu.cio r8,r8,r9 + ld r7,r4,32 + st r8,r2,28 + ld r8,r3,36 ; subtract 8 + 16r limbs + subu.cio r6,r6,r7 + ld r9,r4,36 + st r6,r2,32 + ld r6,r3,40 ; subtract 7 + 16r limbs + subu.cio r8,r8,r9 + ld r7,r4,40 + st r8,r2,36 + ld r8,r3,44 ; subtract 6 + 16r limbs + subu.cio r6,r6,r7 + ld r9,r4,44 + st r6,r2,40 + ld r6,r3,48 ; subtract 5 + 16r limbs + subu.cio r8,r8,r9 + ld r7,r4,48 + st r8,r2,44 + ld r8,r3,52 ; subtract 4 + 16r limbs + subu.cio r6,r6,r7 + ld r9,r4,52 + st r6,r2,48 + ld r6,r3,56 ; subtract 3 + 16r limbs + subu.cio r8,r8,r9 + ld r7,r4,56 + st r8,r2,52 + ld r8,r3,60 ; subtract 2 + 16r limbs + subu.cio r6,r6,r7 + ld r9,r4,60 + st r6,r2,56 + bcnd.n ne0,r10,Loop ; subtract 1 + 16r limbs + subu.cio r8,r8,r9 + + st r8,r2,60 ; store most significant limb + + addu.ci r2,r0,r0 ; return carry-out from most sign. limb + jmp.n r1 + xor r2,r2,1 diff --git a/ports/sysdeps/m88k/m88100/sub_n.s b/ports/sysdeps/m88k/m88100/sub_n.s new file mode 100644 index 000000000..a132c212a --- /dev/null +++ b/ports/sysdeps/m88k/m88100/sub_n.s @@ -0,0 +1,104 @@ +; mc88100 __mpn_sub -- Subtract two limb vectors of the same length > 0 and +; store difference in a third limb vector. + +; Copyright (C) 1992, 1994 Free Software Foundation, Inc. + +; This file is part of the GNU MP Library. + +; The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to +; the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + +; INPUT PARAMETERS +; res_ptr r2 +; s1_ptr r3 +; s2_ptr r4 +; size r5 + +; This code has been optimized to run one instruction per clock, avoiding +; load stalls and writeback contention. As a result, the instruction +; order is not always natural. + +; The speed is about 4.6 clocks/limb + 18 clocks/limb-vector on an 88100, +; but on the 88110, it seems to run much slower, 6.6 clocks/limb. + + text + align 16 + global ___mpn_sub_n +___mpn_sub_n: + ld r6,r3,0 ; read first limb from s1_ptr + extu r10,r5,3 + ld r7,r4,0 ; read first limb from s2_ptr + + subu.co r5,r0,r5 ; (clear carry as side effect) + mak r5,r5,3<4> + bcnd eq0,r5,Lzero + + or r12,r0,lo16(Lbase) + or.u r12,r12,hi16(Lbase) + addu r12,r12,r5 ; r12 is address for entering in loop + + extu r5,r5,2 ; divide by 4 + subu r2,r2,r5 ; adjust res_ptr + subu r3,r3,r5 ; adjust s1_ptr + subu r4,r4,r5 ; adjust s2_ptr + + or r8,r6,r0 + + jmp.n r12 + or r9,r7,r0 + +Loop: addu r3,r3,32 + st r8,r2,28 + addu r4,r4,32 + ld r6,r3,0 + addu r2,r2,32 + ld r7,r4,0 +Lzero: subu r10,r10,1 ; subtract 0 + 8r limbs (adj loop cnt) +Lbase: ld r8,r3,4 + subu.cio r6,r6,r7 + ld r9,r4,4 + st r6,r2,0 + ld r6,r3,8 ; subtract 7 + 8r limbs + subu.cio r8,r8,r9 + ld r7,r4,8 + st r8,r2,4 + ld r8,r3,12 ; subtract 6 + 8r limbs + subu.cio r6,r6,r7 + ld r9,r4,12 + st r6,r2,8 + ld r6,r3,16 ; subtract 5 + 8r limbs + subu.cio r8,r8,r9 + ld r7,r4,16 + st r8,r2,12 + ld r8,r3,20 ; subtract 4 + 8r limbs + subu.cio r6,r6,r7 + ld r9,r4,20 + st r6,r2,16 + ld r6,r3,24 ; subtract 3 + 8r limbs + subu.cio r8,r8,r9 + ld r7,r4,24 + st r8,r2,20 + ld r8,r3,28 ; subtract 2 + 8r limbs + subu.cio r6,r6,r7 + ld r9,r4,28 + st r6,r2,24 + bcnd.n ne0,r10,Loop ; subtract 1 + 8r limbs + subu.cio r8,r8,r9 + + st r8,r2,28 ; store most significant limb + + addu.ci r2,r0,r0 ; return carry-out from most sign. limb + jmp.n r1 + xor r2,r2,1 diff --git a/ports/sysdeps/m88k/m88110/add_n.S b/ports/sysdeps/m88k/m88110/add_n.S new file mode 100644 index 000000000..3c9067448 --- /dev/null +++ b/ports/sysdeps/m88k/m88110/add_n.S @@ -0,0 +1,200 @@ +; mc88110 __mpn_add_n -- Add two limb vectors of the same length > 0 and store +; sum in a third limb vector. + +; Copyright (C) 1995, 1996 Free Software Foundation, Inc. + +; This file is part of the GNU MP Library. + +; The GNU MP 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 MP 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 MP 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. + + +; INPUT PARAMETERS +#define res_ptr r2 +#define s1_ptr r3 +#define s2_ptr r4 +#define size r5 + +#include "sysdep.h" + + text + align 16 + global C_SYMBOL_NAME(__mpn_add_n) +C_SYMBOL_NAME(__mpn_add_n): + addu.co r0,r0,r0 ; clear cy flag + xor r12,s2_ptr,res_ptr + bb1 2,r12,L1 +; ** V1a ** +L0: bb0 2,res_ptr,L_v1 ; branch if res_ptr is aligned? +/* Add least significant limb separately to align res_ptr and s2_ptr */ + ld r10,s1_ptr,0 + addu s1_ptr,s1_ptr,4 + ld r8,s2_ptr,0 + addu s2_ptr,s2_ptr,4 + subu size,size,1 + addu.co r6,r10,r8 + st r6,res_ptr,0 + addu res_ptr,res_ptr,4 +L_v1: cmp r12,size,2 + bb1 lt,r12,Lend2 + + ld r10,s1_ptr,0 + ld r12,s1_ptr,4 + ld.d r8,s2_ptr,0 + subu size,size,10 + bcnd lt0,size,Lfin1 +/* Add blocks of 8 limbs until less than 8 limbs remain */ + align 8 +Loop1: subu size,size,8 + addu.cio r6,r10,r8 + ld r10,s1_ptr,8 + addu.cio r7,r12,r9 + ld r12,s1_ptr,12 + ld.d r8,s2_ptr,8 + st.d r6,res_ptr,0 + addu.cio r6,r10,r8 + ld r10,s1_ptr,16 + addu.cio r7,r12,r9 + ld r12,s1_ptr,20 + ld.d r8,s2_ptr,16 + st.d r6,res_ptr,8 + addu.cio r6,r10,r8 + ld r10,s1_ptr,24 + addu.cio r7,r12,r9 + ld r12,s1_ptr,28 + ld.d r8,s2_ptr,24 + st.d r6,res_ptr,16 + addu.cio r6,r10,r8 + ld r10,s1_ptr,32 + addu.cio r7,r12,r9 + ld r12,s1_ptr,36 + addu s1_ptr,s1_ptr,32 + ld.d r8,s2_ptr,32 + addu s2_ptr,s2_ptr,32 + st.d r6,res_ptr,24 + addu res_ptr,res_ptr,32 + bcnd ge0,size,Loop1 + +Lfin1: addu size,size,8-2 + bcnd lt0,size,Lend1 +/* Add blocks of 2 limbs until less than 2 limbs remain */ +Loope1: addu.cio r6,r10,r8 + ld r10,s1_ptr,8 + addu.cio r7,r12,r9 + ld r12,s1_ptr,12 + ld.d r8,s2_ptr,8 + st.d r6,res_ptr,0 + subu size,size,2 + addu s1_ptr,s1_ptr,8 + addu s2_ptr,s2_ptr,8 + addu res_ptr,res_ptr,8 + bcnd ge0,size,Loope1 +Lend1: addu.cio r6,r10,r8 + addu.cio r7,r12,r9 + st.d r6,res_ptr,0 + + bb0 0,size,Lret1 +/* Add last limb */ + ld r10,s1_ptr,8 + ld r8,s2_ptr,8 + addu.cio r6,r10,r8 + st r6,res_ptr,8 + +Lret1: jmp.n r1 + addu.ci r2,r0,r0 ; return carry-out from most sign. limb + +L1: xor r12,s1_ptr,res_ptr + bb1 2,r12,L2 +; ** V1b ** + or r12,r0,s2_ptr + or s2_ptr,r0,s1_ptr + or s1_ptr,r0,r12 + br L0 + +; ** V2 ** +/* If we come here, the alignment of s1_ptr and res_ptr as well as the + alignment of s2_ptr and res_ptr differ. Since there are only two ways + things can be aligned (that we care about) we now know that the alignment + of s1_ptr and s2_ptr are the same. */ + +L2: cmp r12,size,1 + bb1 eq,r12,Ljone + bb0 2,s1_ptr,L_v2 ; branch if s1_ptr is aligned +/* Add least significant limb separately to align res_ptr and s2_ptr */ + ld r10,s1_ptr,0 + addu s1_ptr,s1_ptr,4 + ld r8,s2_ptr,0 + addu s2_ptr,s2_ptr,4 + subu size,size,1 + addu.co r6,r10,r8 + st r6,res_ptr,0 + addu res_ptr,res_ptr,4 + +L_v2: subu size,size,8 + bcnd lt0,size,Lfin2 +/* Add blocks of 8 limbs until less than 8 limbs remain */ + align 8 +Loop2: subu size,size,8 + ld.d r8,s1_ptr,0 + ld.d r6,s2_ptr,0 + addu.cio r8,r8,r6 + st r8,res_ptr,0 + addu.cio r9,r9,r7 + st r9,res_ptr,4 + ld.d r8,s1_ptr,8 + ld.d r6,s2_ptr,8 + addu.cio r8,r8,r6 + st r8,res_ptr,8 + addu.cio r9,r9,r7 + st r9,res_ptr,12 + ld.d r8,s1_ptr,16 + ld.d r6,s2_ptr,16 + addu.cio r8,r8,r6 + st r8,res_ptr,16 + addu.cio r9,r9,r7 + st r9,res_ptr,20 + ld.d r8,s1_ptr,24 + ld.d r6,s2_ptr,24 + addu.cio r8,r8,r6 + st r8,res_ptr,24 + addu.cio r9,r9,r7 + st r9,res_ptr,28 + addu s1_ptr,s1_ptr,32 + addu s2_ptr,s2_ptr,32 + addu res_ptr,res_ptr,32 + bcnd ge0,size,Loop2 + +Lfin2: addu size,size,8-2 + bcnd lt0,size,Lend2 +Loope2: ld.d r8,s1_ptr,0 + ld.d r6,s2_ptr,0 + addu.cio r8,r8,r6 + st r8,res_ptr,0 + addu.cio r9,r9,r7 + st r9,res_ptr,4 + subu size,size,2 + addu s1_ptr,s1_ptr,8 + addu s2_ptr,s2_ptr,8 + addu res_ptr,res_ptr,8 + bcnd ge0,size,Loope2 +Lend2: bb0 0,size,Lret2 +/* Add last limb */ +Ljone: ld r10,s1_ptr,0 + ld r8,s2_ptr,0 + addu.cio r6,r10,r8 + st r6,res_ptr,0 + +Lret2: jmp.n r1 + addu.ci r2,r0,r0 ; return carry-out from most sign. limb diff --git a/ports/sysdeps/m88k/m88110/addmul_1.s b/ports/sysdeps/m88k/m88110/addmul_1.s new file mode 100644 index 000000000..a9845efa3 --- /dev/null +++ b/ports/sysdeps/m88k/m88110/addmul_1.s @@ -0,0 +1,61 @@ +; mc88110 __mpn_addmul_1 -- Multiply a limb vector with a single limb and +; store the product in a second limb vector. + +; Copyright (C) 1996 Free Software Foundation, Inc. + +; This file is part of the GNU MP Library. + +; The GNU MP 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 MP 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 MP 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. + + +; INPUT PARAMETERS +; res_ptr r2 +; s1_ptr r3 +; size r4 +; s2_limb r5 + + text + align 16 + global ___mpn_addmul_1 +___mpn_addmul_1: + lda r3,r3[r4] + lda r8,r2[r4] ; RES_PTR in r8 since r2 is retval + subu r4,r0,r4 + addu.co r2,r0,r0 ; r2 = cy = 0 + + ld r6,r3[r4] + addu r4,r4,1 + subu r8,r8,4 + bcnd.n eq0,r4,Lend + mulu.d r10,r6,r5 + +Loop: ld r7,r8[r4] + ld r6,r3[r4] + addu.cio r9,r11,r2 + addu.ci r2,r10,r0 + addu.co r9,r9,r7 + st r9,r8[r4] + addu r4,r4,1 + mulu.d r10,r6,r5 + bcnd ne0,r4,Loop + +Lend: ld r7,r8,0 + addu.cio r9,r11,r2 + addu.ci r2,r10,r0 + addu.co r9,r9,r7 + st r9,r8,0 + jmp.n r1 + addu.ci r2,r2,r0 diff --git a/ports/sysdeps/m88k/m88110/mul_1.S b/ports/sysdeps/m88k/m88110/mul_1.S new file mode 100644 index 000000000..7a0762386 --- /dev/null +++ b/ports/sysdeps/m88k/m88110/mul_1.S @@ -0,0 +1,80 @@ +; mc88110 __mpn_mul_1 -- Multiply a limb vector with a single limb and +; store the product in a second limb vector. + +; Copyright (C) 1992, 1994 Free Software Foundation, Inc. + +; This file is part of the GNU MP Library. + +; The GNU MP Library is free software; you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation; either version 2, or (at your option) +; any later version. + +; The GNU MP 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 General Public License for more details. + +; You should have received a copy of the GNU General Public License +; along with the GNU MP Library; see the file COPYING. If not, write to +; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +; INPUT PARAMETERS +; res_ptr r2 +; s1_ptr r3 +; size r4 +; s2_limb r5 + +#include "sysdep.h" + +ENTRY (__mpn_mul_1) + ld r6,r3,0 + sub r4,r0,r4 + sub r3,r3,r4 ; r3 is offset s1_ptr + sub r2,r2,r4 + sub r8,r2,8 ; r8 is offset res_ptr + mulu.d r10,r6,r5 + + addu r4,r4,1 + bcnd eq0,r4,Lend + addu.co r2,r0,0 ; clear cy_limb + +Loop: ld r6,r3[r4] + addu.cio r9,r11,r2 + or r2,r10,r0 ; could be avoided if unrolled + addu r4,r4,1 + mulu.d r10,r6,r5 + bcnd ne0,r4,Loop + st r9,r8[r4] + +Lend: addu.cio r9,r11,r2 + st r9,r8,4 + jmp.n r1 + addu.ci r2,r10,r0 + +; This is the Right Way to do this on '110. 4 cycles / 64-bit limb. +; ld.d r10, +; mulu.d +; addu.cio +; addu.cio +; st.d +; mulu.d ,r11,r5 +; ld.d r12, +; mulu.d ,r10,r5 +; addu.cio +; addu.cio +; st.d +; mulu.d +; ld.d r10, +; mulu.d +; addu.cio +; addu.cio +; st.d +; mulu.d +; ld.d r10, +; mulu.d +; addu.cio +; addu.cio +; st.d +; mulu.d diff --git a/ports/sysdeps/m88k/m88110/mul_1.s b/ports/sysdeps/m88k/m88110/mul_1.s new file mode 100644 index 000000000..103869dc4 --- /dev/null +++ b/ports/sysdeps/m88k/m88110/mul_1.s @@ -0,0 +1,59 @@ +; mc88110 __mpn_mul_1 -- Multiply a limb vector with a single limb and +; store the product in a second limb vector. + +; Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc. + +; This file is part of the GNU MP Library. + +; The GNU MP 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 MP 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 MP 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. + + +; INPUT PARAMETERS +; res_ptr r2 +; s1_ptr r3 +; size r4 +; s2_limb r5 + + text + align 16 + global ___mpn_mul_1 +___mpn_mul_1: + ; Make S1_PTR and RES_PTR point at the end of their blocks + ; and negate SIZE. + lda r3,r3[r4] + lda r8,r2[r4] ; RES_PTR in r8 since r2 is retval + subu r4,r0,r4 + + addu.co r2,r0,r0 ; r2 = cy = 0 + + ld r6,r3[r4] + addu r4,r4,1 + mulu.d r10,r6,r5 + bcnd.n eq0,r4,Lend + subu r8,r8,8 + +Loop: ld r6,r3[r4] + addu.cio r9,r11,r2 + or r2,r10,r0 ; could be avoided if unrolled + addu r4,r4,1 + mulu.d r10,r6,r5 + bcnd.n ne0,r4,Loop + st r9,r8[r4] + +Lend: addu.cio r9,r11,r2 + st r9,r8,4 + jmp.n r1 + addu.ci r2,r10,r0 diff --git a/ports/sysdeps/m88k/m88110/sub_n.S b/ports/sysdeps/m88k/m88110/sub_n.S new file mode 100644 index 000000000..a937882db --- /dev/null +++ b/ports/sysdeps/m88k/m88110/sub_n.S @@ -0,0 +1,276 @@ +; mc88110 __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and +; store difference in a third limb vector. + +; Copyright (C) 1995, 1996 Free Software Foundation, Inc. + +; This file is part of the GNU MP Library. + +; The GNU MP 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 MP 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 MP 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. + + +; INPUT PARAMETERS +#define res_ptr r2 +#define s1_ptr r3 +#define s2_ptr r4 +#define size r5 + +#include "sysdep.h" + + text + align 16 + global C_SYMBOL_NAME(__mpn_sub_n) +C_SYMBOL_NAME(__mpn_sub_n): + subu.co r0,r0,r0 ; set cy flag + xor r12,s2_ptr,res_ptr + bb1 2,r12,L1 +; ** V1a ** +L0: bb0 2,res_ptr,L_v1 ; branch if res_ptr is aligned +/* Add least significant limb separately to align res_ptr and s2_ptr */ + ld r10,s1_ptr,0 + addu s1_ptr,s1_ptr,4 + ld r8,s2_ptr,0 + addu s2_ptr,s2_ptr,4 + subu size,size,1 + subu.co r6,r10,r8 + st r6,res_ptr,0 + addu res_ptr,res_ptr,4 +L_v1: cmp r12,size,2 + bb1 lt,r12,Lend2 + + ld r10,s1_ptr,0 + ld r12,s1_ptr,4 + ld.d r8,s2_ptr,0 + subu size,size,10 + bcnd lt0,size,Lfin1 +/* Add blocks of 8 limbs until less than 8 limbs remain */ + align 8 +Loop1: subu size,size,8 + subu.cio r6,r10,r8 + ld r10,s1_ptr,8 + subu.cio r7,r12,r9 + ld r12,s1_ptr,12 + ld.d r8,s2_ptr,8 + st.d r6,res_ptr,0 + subu.cio r6,r10,r8 + ld r10,s1_ptr,16 + subu.cio r7,r12,r9 + ld r12,s1_ptr,20 + ld.d r8,s2_ptr,16 + st.d r6,res_ptr,8 + subu.cio r6,r10,r8 + ld r10,s1_ptr,24 + subu.cio r7,r12,r9 + ld r12,s1_ptr,28 + ld.d r8,s2_ptr,24 + st.d r6,res_ptr,16 + subu.cio r6,r10,r8 + ld r10,s1_ptr,32 + subu.cio r7,r12,r9 + ld r12,s1_ptr,36 + addu s1_ptr,s1_ptr,32 + ld.d r8,s2_ptr,32 + addu s2_ptr,s2_ptr,32 + st.d r6,res_ptr,24 + addu res_ptr,res_ptr,32 + bcnd ge0,size,Loop1 + +Lfin1: addu size,size,8-2 + bcnd lt0,size,Lend1 +/* Add blocks of 2 limbs until less than 2 limbs remain */ +Loope1: subu.cio r6,r10,r8 + ld r10,s1_ptr,8 + subu.cio r7,r12,r9 + ld r12,s1_ptr,12 + ld.d r8,s2_ptr,8 + st.d r6,res_ptr,0 + subu size,size,2 + addu s1_ptr,s1_ptr,8 + addu s2_ptr,s2_ptr,8 + addu res_ptr,res_ptr,8 + bcnd ge0,size,Loope1 +Lend1: subu.cio r6,r10,r8 + subu.cio r7,r12,r9 + st.d r6,res_ptr,0 + + bb0 0,size,Lret1 +/* Add last limb */ + ld r10,s1_ptr,8 + ld r8,s2_ptr,8 + subu.cio r6,r10,r8 + st r6,res_ptr,8 + +Lret1: addu.ci r2,r0,r0 ; return carry-out from most sign. limb + jmp.n r1 + xor r2,r2,1 + +L1: xor r12,s1_ptr,res_ptr + bb1 2,r12,L2 +; ** V1b ** + bb0 2,res_ptr,L_v1b ; branch if res_ptr is aligned +/* Add least significant limb separately to align res_ptr and s1_ptr */ + ld r10,s2_ptr,0 + addu s2_ptr,s2_ptr,4 + ld r8,s1_ptr,0 + addu s1_ptr,s1_ptr,4 + subu size,size,1 + subu.co r6,r8,r10 + st r6,res_ptr,0 + addu res_ptr,res_ptr,4 +L_v1b: cmp r12,size,2 + bb1 lt,r12,Lend2 + + ld r10,s2_ptr,0 + ld r12,s2_ptr,4 + ld.d r8,s1_ptr,0 + subu size,size,10 + bcnd lt0,size,Lfin1b +/* Add blocks of 8 limbs until less than 8 limbs remain */ + align 8 +Loop1b: subu size,size,8 + subu.cio r6,r8,r10 + ld r10,s2_ptr,8 + subu.cio r7,r9,r12 + ld r12,s2_ptr,12 + ld.d r8,s1_ptr,8 + st.d r6,res_ptr,0 + subu.cio r6,r8,r10 + ld r10,s2_ptr,16 + subu.cio r7,r9,r12 + ld r12,s2_ptr,20 + ld.d r8,s1_ptr,16 + st.d r6,res_ptr,8 + subu.cio r6,r8,r10 + ld r10,s2_ptr,24 + subu.cio r7,r9,r12 + ld r12,s2_ptr,28 + ld.d r8,s1_ptr,24 + st.d r6,res_ptr,16 + subu.cio r6,r8,r10 + ld r10,s2_ptr,32 + subu.cio r7,r9,r12 + ld r12,s2_ptr,36 + addu s2_ptr,s2_ptr,32 + ld.d r8,s1_ptr,32 + addu s1_ptr,s1_ptr,32 + st.d r6,res_ptr,24 + addu res_ptr,res_ptr,32 + bcnd ge0,size,Loop1b + +Lfin1b: addu size,size,8-2 + bcnd lt0,size,Lend1b +/* Add blocks of 2 limbs until less than 2 limbs remain */ +Loope1b:subu.cio r6,r8,r10 + ld r10,s2_ptr,8 + subu.cio r7,r9,r12 + ld r12,s2_ptr,12 + ld.d r8,s1_ptr,8 + st.d r6,res_ptr,0 + subu size,size,2 + addu s1_ptr,s1_ptr,8 + addu s2_ptr,s2_ptr,8 + addu res_ptr,res_ptr,8 + bcnd ge0,size,Loope1b +Lend1b: subu.cio r6,r8,r10 + subu.cio r7,r9,r12 + st.d r6,res_ptr,0 + + bb0 0,size,Lret1b +/* Add last limb */ + ld r10,s2_ptr,8 + ld r8,s1_ptr,8 + subu.cio r6,r8,r10 + st r6,res_ptr,8 + +Lret1b: addu.ci r2,r0,r0 ; return carry-out from most sign. limb + jmp.n r1 + xor r2,r2,1 + +; ** V2 ** +/* If we come here, the alignment of s1_ptr and res_ptr as well as the + alignment of s2_ptr and res_ptr differ. Since there are only two ways + things can be aligned (that we care about) we now know that the alignment + of s1_ptr and s2_ptr are the same. */ + +L2: cmp r12,size,1 + bb1 eq,r12,Ljone + bb0 2,s1_ptr,L_v2 ; branch if s1_ptr is aligned +/* Add least significant limb separately to align res_ptr and s2_ptr */ + ld r10,s1_ptr,0 + addu s1_ptr,s1_ptr,4 + ld r8,s2_ptr,0 + addu s2_ptr,s2_ptr,4 + subu size,size,1 + subu.co r6,r10,r8 + st r6,res_ptr,0 + addu res_ptr,res_ptr,4 + +L_v2: subu size,size,8 + bcnd lt0,size,Lfin2 +/* Add blocks of 8 limbs until less than 8 limbs remain */ + align 8 +Loop2: subu size,size,8 + ld.d r8,s1_ptr,0 + ld.d r6,s2_ptr,0 + subu.cio r8,r8,r6 + st r8,res_ptr,0 + subu.cio r9,r9,r7 + st r9,res_ptr,4 + ld.d r8,s1_ptr,8 + ld.d r6,s2_ptr,8 + subu.cio r8,r8,r6 + st r8,res_ptr,8 + subu.cio r9,r9,r7 + st r9,res_ptr,12 + ld.d r8,s1_ptr,16 + ld.d r6,s2_ptr,16 + subu.cio r8,r8,r6 + st r8,res_ptr,16 + subu.cio r9,r9,r7 + st r9,res_ptr,20 + ld.d r8,s1_ptr,24 + ld.d r6,s2_ptr,24 + subu.cio r8,r8,r6 + st r8,res_ptr,24 + subu.cio r9,r9,r7 + st r9,res_ptr,28 + addu s1_ptr,s1_ptr,32 + addu s2_ptr,s2_ptr,32 + addu res_ptr,res_ptr,32 + bcnd ge0,size,Loop2 + +Lfin2: addu size,size,8-2 + bcnd lt0,size,Lend2 +Loope2: ld.d r8,s1_ptr,0 + ld.d r6,s2_ptr,0 + subu.cio r8,r8,r6 + st r8,res_ptr,0 + subu.cio r9,r9,r7 + st r9,res_ptr,4 + subu size,size,2 + addu s1_ptr,s1_ptr,8 + addu s2_ptr,s2_ptr,8 + addu res_ptr,res_ptr,8 + bcnd ge0,size,Loope2 +Lend2: bb0 0,size,Lret2 +/* Add last limb */ +Ljone: ld r10,s1_ptr,0 + ld r8,s2_ptr,0 + subu.cio r6,r10,r8 + st r6,res_ptr,0 + +Lret2: addu.ci r2,r0,r0 ; return carry-out from most sign. limb + jmp.n r1 + xor r2,r2,1 diff --git a/ports/sysdeps/m88k/mul_1.s b/ports/sysdeps/m88k/mul_1.s new file mode 100644 index 000000000..7aa6d6406 --- /dev/null +++ b/ports/sysdeps/m88k/mul_1.s @@ -0,0 +1,127 @@ +; mc88100 __mpn_mul_1 -- Multiply a limb vector with a single limb and +; store the product in a second limb vector. + +; Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc. + +; This file is part of the GNU MP Library. + +; The GNU MP 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 MP 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 MP 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. + + +; INPUT PARAMETERS +; res_ptr r2 +; s1_ptr r3 +; size r4 +; s2_limb r5 + +; Common overhead is about 11 cycles/invocation. + +; The speed for S2_LIMB >= 0x10000 is approximately 21 cycles/limb. (The +; pipeline stalls 2 cycles due to WB contention.) + +; The speed for S2_LIMB < 0x10000 is approximately 16 cycles/limb. (The +; pipeline stalls 2 cycles due to WB contention and 1 cycle due to latency.) + +; To enhance speed: +; 1. Unroll main loop 4-8 times. +; 2. Schedule code to avoid WB contention. It might be tempting to move the +; ld instruction in the loops down to save 2 cycles (less WB contention), +; but that looses because the ultimate value will be read from outside +; the allocated space. But if we handle the ultimate multiplication in +; the tail, we can do this. +; 3. Make the multiplication with less instructions. I think the code for +; (S2_LIMB >= 0x10000) is not minimal. +; With these techniques the (S2_LIMB >= 0x10000) case would run in 17 or +; less cycles/limb; the (S2_LIMB < 0x10000) case would run in 11 +; cycles/limb. (Assuming infinite unrolling.) + + text + align 16 + global ___mpn_mul_1 +___mpn_mul_1: + + ; Make S1_PTR and RES_PTR point at the end of their blocks + ; and negate SIZE. + lda r3,r3[r4] + lda r6,r2[r4] ; RES_PTR in r6 since r2 is retval + subu r4,r0,r4 + + addu.co r2,r0,r0 ; r2 = cy = 0 + ld r9,r3[r4] + mask r7,r5,0xffff ; r7 = lo(S2_LIMB) + extu r8,r5,16 ; r8 = hi(S2_LIMB) + bcnd.n eq0,r8,Lsmall ; jump if (hi(S2_LIMB) == 0) + subu r6,r6,4 + +; General code for any value of S2_LIMB. + + ; Make a stack frame and save r25 and r26 + subu r31,r31,16 + st.d r25,r31,8 + + ; Enter the loop in the middle + br.n L1 + addu r4,r4,1 + +Loop: ld r9,r3[r4] + st r26,r6[r4] +; bcnd ne0,r0,0 ; bubble + addu r4,r4,1 +L1: mul r26,r9,r5 ; low word of product mul_1 WB ld + mask r12,r9,0xffff ; r12 = lo(s1_limb) mask_1 + mul r11,r12,r7 ; r11 = prod_0 mul_2 WB mask_1 + mul r10,r12,r8 ; r10 = prod_1a mul_3 + extu r13,r9,16 ; r13 = hi(s1_limb) extu_1 WB mul_1 + mul r12,r13,r7 ; r12 = prod_1b mul_4 WB extu_1 + mul r25,r13,r8 ; r25 = prod_2 mul_5 WB mul_2 + extu r11,r11,16 ; r11 = hi(prod_0) extu_2 WB mul_3 + addu r10,r10,r11 ; addu_1 WB extu_2 +; bcnd ne0,r0,0 ; bubble WB addu_1 + addu.co r10,r10,r12 ; WB mul_4 + mask.u r10,r10,0xffff ; move the 16 most significant bits... + addu.ci r10,r10,r0 ; ...to the low half of the word... + rot r10,r10,16 ; ...and put carry in pos 16. + addu.co r26,r26,r2 ; add old carry limb + bcnd.n ne0,r4,Loop + addu.ci r2,r25,r10 ; compute new carry limb + + st r26,r6[r4] + ld.d r25,r31,8 + jmp.n r1 + addu r31,r31,16 + +; Fast code for S2_LIMB < 0x10000 +Lsmall: + ; Enter the loop in the middle + br.n SL1 + addu r4,r4,1 + +SLoop: ld r9,r3[r4] ; + st r8,r6[r4] ; + addu r4,r4,1 ; +SL1: mul r8,r9,r5 ; low word of product + mask r12,r9,0xffff ; r12 = lo(s1_limb) + extu r13,r9,16 ; r13 = hi(s1_limb) + mul r11,r12,r7 ; r11 = prod_0 + mul r12,r13,r7 ; r12 = prod_1b + addu.cio r8,r8,r2 ; add old carry limb + extu r10,r11,16 ; r11 = hi(prod_0) + addu r10,r10,r12 ; + bcnd.n ne0,r4,SLoop + extu r2,r10,16 ; r2 = new carry limb + + jmp.n r1 + st r8,r6[r4] diff --git a/ports/sysdeps/m88k/sub_n.s b/ports/sysdeps/m88k/sub_n.s new file mode 100644 index 000000000..7616dc46b --- /dev/null +++ b/ports/sysdeps/m88k/sub_n.s @@ -0,0 +1,106 @@ +; mc88100 __mpn_sub -- Subtract two limb vectors of the same length > 0 and +; store difference in a third limb vector. + +; Copyright (C) 1992, 1994, 1996 Free Software Foundation, Inc. + +; This file is part of the GNU MP Library. + +; The GNU MP 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 MP 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 MP 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. + + +; INPUT PARAMETERS +; res_ptr r2 +; s1_ptr r3 +; s2_ptr r4 +; size r5 + +; This code has been optimized to run one instruction per clock, avoiding +; load stalls and writeback contention. As a result, the instruction +; order is not always natural. + +; The speed is about 4.6 clocks/limb + 18 clocks/limb-vector on an 88100, +; but on the 88110, it seems to run much slower, 6.6 clocks/limb. + + text + align 16 + global ___mpn_sub_n +___mpn_sub_n: + ld r6,r3,0 ; read first limb from s1_ptr + extu r10,r5,3 + ld r7,r4,0 ; read first limb from s2_ptr + + subu r5,r0,r5 + mak r5,r5,3<4> + bcnd.n eq0,r5,Lzero + subu.co r0,r0,r0 ; initialize carry + + or r12,r0,lo16(Lbase) + or.u r12,r12,hi16(Lbase) + addu r12,r12,r5 ; r12 is address for entering in loop + + extu r5,r5,2 ; divide by 4 + subu r2,r2,r5 ; adjust res_ptr + subu r3,r3,r5 ; adjust s1_ptr + subu r4,r4,r5 ; adjust s2_ptr + + or r8,r6,r0 + + jmp.n r12 + or r9,r7,r0 + +Loop: addu r3,r3,32 + st r8,r2,28 + addu r4,r4,32 + ld r6,r3,0 + addu r2,r2,32 + ld r7,r4,0 +Lzero: subu r10,r10,1 ; subtract 0 + 8r limbs (adj loop cnt) +Lbase: ld r8,r3,4 + subu.cio r6,r6,r7 + ld r9,r4,4 + st r6,r2,0 + ld r6,r3,8 ; subtract 7 + 8r limbs + subu.cio r8,r8,r9 + ld r7,r4,8 + st r8,r2,4 + ld r8,r3,12 ; subtract 6 + 8r limbs + subu.cio r6,r6,r7 + ld r9,r4,12 + st r6,r2,8 + ld r6,r3,16 ; subtract 5 + 8r limbs + subu.cio r8,r8,r9 + ld r7,r4,16 + st r8,r2,12 + ld r8,r3,20 ; subtract 4 + 8r limbs + subu.cio r6,r6,r7 + ld r9,r4,20 + st r6,r2,16 + ld r6,r3,24 ; subtract 3 + 8r limbs + subu.cio r8,r8,r9 + ld r7,r4,24 + st r8,r2,20 + ld r8,r3,28 ; subtract 2 + 8r limbs + subu.cio r6,r6,r7 + ld r9,r4,28 + st r6,r2,24 + bcnd.n ne0,r10,Loop ; subtract 1 + 8r limbs + subu.cio r8,r8,r9 + + st r8,r2,28 ; store most significant limb + + addu.ci r2,r0,r0 ; return carry-out from most sign. limb + jmp.n r1 + xor r2,r2,1 diff --git a/ports/sysdeps/standalone/Dist b/ports/sysdeps/standalone/Dist new file mode 100644 index 000000000..b6b12b709 --- /dev/null +++ b/ports/sysdeps/standalone/Dist @@ -0,0 +1,2 @@ +filedesc.h +standalone.h diff --git a/ports/sysdeps/standalone/Subdirs b/ports/sysdeps/standalone/Subdirs new file mode 100644 index 000000000..4125ae86d --- /dev/null +++ b/ports/sysdeps/standalone/Subdirs @@ -0,0 +1,4 @@ +# The `bare' subdirectory defines some structure for a target-specific +# library of functions which are actually implemented in +# sysdeps/standalone/CPU/TARGET. +bare diff --git a/ports/sysdeps/standalone/arm/bits/errno.h b/ports/sysdeps/standalone/arm/bits/errno.h new file mode 100644 index 000000000..8e1075433 --- /dev/null +++ b/ports/sysdeps/standalone/arm/bits/errno.h @@ -0,0 +1,65 @@ +/* Copyright (C) 1991,1994,1996,1997,1998,2004 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. */ + +/* This file defines the `errno' constants for standalone ARM machines. + These constants are essentially arbitrary. */ + +#if !defined __Emath_defined && (defined _ERRNO_H || defined __need_Emath) +# undef __need_Emath +# define __Emath_defined 1 + +# define EDOM 1 +# define ERANGE 2 +#endif + +#ifdef _ERRNO_H +# define ENOSYS 3 +# define EINVAL 4 +# define ESPIPE 5 +# define EBADF 6 +# define ENOMEM 7 +# define EACCES 8 +# define ENFILE 9 +# define EMFILE 10 +# define ENAMETOOLONG 11 /* File name too long */ +# define ELOOP 12 /* Too many symbolic links encountered */ +# define ENOMSG 13 /* No message of desired type */ +# define E2BIG 14 /* Arg list too long */ +# define EINTR 15 +# define EILSEQ 16 +# define ENOEXEC 17 +# define ENOENT 18 +# define EPROTOTYPE 19 +# define ESRCH 20 +# define EPERM 21 +# define ENOTDIR 22 +# define ESTALE 23 +# define EISDIR 24 +# define EOPNOTSUPP 25 /* Operation not supported. */ +# define ENOTTY 26 +# define EAGAIN 27 +# define EIO 28 +# define ENOSPC 29 +# define EEXIST 30 +# define EBUSY 31 +# define EOVERFLOW 32 +#endif + + +/* Function to get address of global `errno' variable. */ +extern int *__errno_location (void) __THROW __attribute__ ((__const__)); diff --git a/ports/sysdeps/standalone/arm/sysdep.c b/ports/sysdeps/standalone/arm/sysdep.c new file mode 100644 index 000000000..8c1723422 --- /dev/null +++ b/ports/sysdeps/standalone/arm/sysdep.c @@ -0,0 +1,32 @@ +/* Copyright (C) 1995, 1996, 1997 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. */ + +#include <sysdep.h> + +/* errno has to be defined somewhere, and it might as well be here. */ +int errno = 0; + +/* The same goes for these magic signal functions. This is a standalone + environment so we do nothing. */ +void _sig_dfl(int sig) +{ +} + +void _sig_ign(int sig) +{ +} diff --git a/ports/sysdeps/standalone/bits/errno.h b/ports/sysdeps/standalone/bits/errno.h new file mode 100644 index 000000000..217c6d5d8 --- /dev/null +++ b/ports/sysdeps/standalone/bits/errno.h @@ -0,0 +1,59 @@ +/* Copyright (C) 1991, 1994, 1996, 1997, 1998 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. */ + +/* This file defines the `errno' constants. */ + +#if !defined __Emath_defined && (defined _ERRNO_H || defined __need_Emath) +#undef __need_Emath +#define __Emath_defined 1 + +# define EDOM 1 +# define EILSEQ 17 +# define ERANGE 2 +#endif + +#ifdef _ERRNO_H +# define ENOSYS 3 +# define EINVAL 4 +# define ESPIPE 5 +# define EBADF 6 +# define ENOMEM 7 +# define EACCES 8 +# define ENFILE 9 +# define EMFILE 10 +# define ENOMSG 11 +# define ENAMETOOLONG 12 +# define ELOOP 13 +# define E2BIG 15 +# define EINTR 16 +# define ENOEXEC 18 +# define ENOENT 19 +# define EPROTOTYPE 20 +# define ESRCH 21 +# define EPERM 22 +# define EEXIST 23 +# define ENOTDIR 24 +# define ESTALE 25 +# define ENOTTY 26 +# define EISDIR 27 +# define EOPNOTSUPP 28 +# define EAGAIN 29 +# define EIO 30 +# define ENOSPC 31 +# define EBUSY 32 +#endif diff --git a/ports/sysdeps/standalone/brk.c b/ports/sysdeps/standalone/brk.c new file mode 100644 index 000000000..32e148edc --- /dev/null +++ b/ports/sysdeps/standalone/brk.c @@ -0,0 +1,66 @@ +/* Copyright (C) 1991, 1994, 1995, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Ported to standalone by Joel Sherrill jsherril@redstone-emh2.army.mil, + On-Line Applications Research Corporation. + + 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. */ + +#include <stdlib.h> + +void *__curbrk; +void *__rorig; +void *__rlimit; + +int +__brk (inaddr) + void *inaddr; +{ + + if ( ( (void *)inaddr > (void *)__rlimit ) || + ( (void *)inaddr < (void *)__rorig ) ) + return -1; + + __curbrk = inaddr; + return 0; +} + +/* Initialization Code for Memory Allocation */ + +void *__C_heap_start; +int __C_heap_size; + +#ifdef HAVE_GNU_LD +static +#endif +void +__NONE_set_memvals (argc, argv, envp) + int argc; + char **argv; + char **envp; +{ + + __rorig = + __curbrk = __C_heap_start; + __rlimit = __curbrk + __C_heap_size; + + (void) &__NONE_set_memvals; /* Avoid "defined but not used" warning. */ +} + +#ifdef HAVE_GNU_LD +text_set_element (__libc_subinit, __NONE_set_memvals); +#endif + +weak_alias (__brk, brk) diff --git a/ports/sysdeps/standalone/close.c b/ports/sysdeps/standalone/close.c new file mode 100644 index 000000000..8c2caf197 --- /dev/null +++ b/ports/sysdeps/standalone/close.c @@ -0,0 +1,43 @@ +/* Copyright (C) 1994, 1995, 1996, 1997, 2002 Free Software Foundation, Inc. + Ported to standalone by Joel Sherrill jsherril@redstone-emh2.army.mil, + On-Line Applications Research Corporation. + 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. */ + +#include <errno.h> +#include <unistd.h> + +#define _STDIO_H +#include <bits/stdio_lim.h> +#include "filedesc.h" + +/* Close the file descriptor FD. */ +int +__close (fd) + int fd; +{ + if ( !__FD_Is_valid( fd ) || !__FD_Table[ fd ].in_use ) + { + __set_errno (EBADF); + return -1; + } + + __FD_Table[ fd ].in_use = 0; + return 0; +} +libc_hidden_def (__close) +weak_alias (__close, close) diff --git a/ports/sysdeps/standalone/dirstream.h b/ports/sysdeps/standalone/dirstream.h new file mode 100644 index 000000000..6f58294b4 --- /dev/null +++ b/ports/sysdeps/standalone/dirstream.h @@ -0,0 +1,43 @@ +/* Copyright (C) 1993, 1997 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 _DIRSTREAM_H + +#define _DIRSTREAM_H 1 + +#define __need_size_t +#include <stddef.h> + +/* Directory stream type. + + The miscellaneous Unix `readdir' implementations read directory data + into a buffer and fill in a `struct dirent' copy in the `DIR' object. */ + +struct __dirstream + { + int __fd; /* File descriptor. */ + + char *__data; /* Directory block. */ + size_t __allocation; /* Space allocated for the block. */ + size_t __offset; /* Current offset into the block. */ + size_t __size; /* Total valid data in the block. */ + + struct dirent __entry; /* Returned by `readdir'. */ + }; + +#endif /* dirstream.h */ diff --git a/ports/sysdeps/standalone/filedesc.h b/ports/sysdeps/standalone/filedesc.h new file mode 100644 index 000000000..b7c15b501 --- /dev/null +++ b/ports/sysdeps/standalone/filedesc.h @@ -0,0 +1,48 @@ +/* Copyright (C) 1994, 1997, 1998 Free Software Foundation, Inc. + Ported to standalone by Joel Sherrill jsherril@redstone-emh2.army.mil, + On-Line Applications Research Corporation. + 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. */ + +/* + * This is the file descriptor used by the no OS implementation + * of __open, __read, __write, and __close. + */ + +#ifndef __FILEDESC_h +#define __FILEDESC_h + +#define __need_FOPEN_MAX +#include <bits/stdio_lim.h> + +#ifndef __DECLARE_FILE_DESCRIPTORS__ +#define FILEDESC_EXTERN extern +#else +#define FILEDESC_EXTERN +#endif + +typedef struct { + int in_use; /* 1 if in use, 0 otherwise */ + int flags; /* Flags from open */ +} __no_os_file_descriptor; + +#define __FD_Is_valid( _fd ) \ + ( (_fd) >= 0 && (_fd) < FOPEN_MAX ) + +FILEDESC_EXTERN __no_os_file_descriptor __FD_Table[ FOPEN_MAX ]; + +#endif diff --git a/ports/sysdeps/standalone/i386/Dist b/ports/sysdeps/standalone/i386/Dist new file mode 100644 index 000000000..98d13be9a --- /dev/null +++ b/ports/sysdeps/standalone/i386/Dist @@ -0,0 +1 @@ +i386.h diff --git a/ports/sysdeps/standalone/i386/force_cpu386/Dist b/ports/sysdeps/standalone/i386/force_cpu386/Dist new file mode 100644 index 000000000..8b7b09e10 --- /dev/null +++ b/ports/sysdeps/standalone/i386/force_cpu386/Dist @@ -0,0 +1 @@ +target.ld diff --git a/ports/sysdeps/standalone/i386/force_cpu386/Makefile b/ports/sysdeps/standalone/i386/force_cpu386/Makefile new file mode 100644 index 000000000..5cb4f2819 --- /dev/null +++ b/ports/sysdeps/standalone/i386/force_cpu386/Makefile @@ -0,0 +1,26 @@ +# Copyright (C) 1994, 1997 Free Software Foundation, Inc. +# This file is part of the GNU C Library. +# Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), +# On-Line Applications Research Corporation. + +# 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. + +ifeq (bare,$(subdir)) +install-others += $(inst_libdir)/force_cpu386.ld +$(inst_libdir)/force_cpu386.ld: $(sysdep_dir)/standalone/i386/target.ld \ + $(+force) + $(do-install) +endif diff --git a/ports/sysdeps/standalone/i386/force_cpu386/_exit.c b/ports/sysdeps/standalone/i386/force_cpu386/_exit.c new file mode 100644 index 000000000..2da822e99 --- /dev/null +++ b/ports/sysdeps/standalone/i386/force_cpu386/_exit.c @@ -0,0 +1,47 @@ +/* Copyright (C) 1991, 1997, 1999, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), + On-Line Applications Research Corporation. + + 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. */ + +#include <unistd.h> +#include <stdlib.h> + +/* This returns control to FORCEbug. */ + +void Bsp_cleanup (void); + +/* The function `_exit' should take a status argument and simply + terminate program execution, using the low-order 8 bits of the + given integer as status. */ + +__NORETURN void +_exit (status) + int status; +{ + /* status is ignored */ + Bsp_cleanup(); +} +weak_alias (_exit, _Exit) + +#ifdef HAVE_GNU_LD + +#include <gnu-stabs.h> + +stub_warning(_exit); + +#endif /* GNU stabs. */ diff --git a/ports/sysdeps/standalone/i386/force_cpu386/brdinit.c b/ports/sysdeps/standalone/i386/force_cpu386/brdinit.c new file mode 100644 index 000000000..8392ce585 --- /dev/null +++ b/ports/sysdeps/standalone/i386/force_cpu386/brdinit.c @@ -0,0 +1,42 @@ +/* Copyright (C) 1994, 1997, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), + On-Line Applications Research Corporation. + + 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. */ + +#include <standalone.h> +#include "i386.h" + +/* _Board_Initialize() + +This routine initializes the FORCE CPU386 board. */ + +void _Console_Initialize (void); + +void +_Board_Initialize () +{ + /* + * FORCE documentation incorrectly states that the bus request + * level is initialized to 3. It is actually initialized by + * FORCEbug to 0. + */ + + outport_byte (0x00, 0x3f); /* resets VMEbus request level */ + + _Console_Initialize (); +} diff --git a/ports/sysdeps/standalone/i386/force_cpu386/console.c b/ports/sysdeps/standalone/i386/force_cpu386/console.c new file mode 100644 index 000000000..4c7271b66 --- /dev/null +++ b/ports/sysdeps/standalone/i386/force_cpu386/console.c @@ -0,0 +1,163 @@ +/* Copyright (C) 1994, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), + On-Line Applications Research Corporation. + + 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. */ + +#include <standalone.h> +#include "i386.h" + +/* Console IO routines for a FORCE CPU386 board. */ + +/* Force CPU/386 specific IO addressing + * + * The following determines whether Port B or the Console should + * be used for console I/O. Setting ONE (and only ONE) of these to 1 + * enables I/O on that port. + * + * PORT A - DUSCC MC68562 Channel A (*** not supported here ***) + * PORT B - DUSCC MC68562 Channel B + * PORT C - MFP MC68901 Channel (*** FORCEbug console ***) + */ + +#define PORTB 1 /* use port b as console */ +#define PORTC 0 /* use console port as console */ + +#if ( PORTB == 1 ) +#define TX_STATUS 0x1b6 /* DUSCC General Status Register */ +#define RX_STATUS 0x1b6 /* DUSCC General Status Register */ +#define TX_BUFFER 0x1e0 /* DUSCC Transmitter Channel B */ +#define RX_BUFFER 0x1e8 /* DUSCC Receiver Channel B */ +#define Is_tx_ready( _status ) ( (_status) & 0x20 ) +#define Is_rx_ready( _status ) ( (_status) & 0x10 ) +#endif + +#if ( PORTC == 1 ) +#define TX_STATUS 0x12c /* MFP Transmit Status Register */ +#define RX_STATUS 0x12a /* MFP Receive Status Register */ +#define TX_BUFFER 0x12e /* MFP Transmitter Channel */ +#define RX_BUFFER 0x12e /* MFP Receiver Channel */ +#define Is_tx_ready( _status ) ( (_status) & 0x80 ) +#define Is_rx_ready( _status ) ( (_status) & 0x80 ) +#endif + +/* _Console_Initialize + +On the Force board the console require some initialization. */ + +void +_Console_Initialize () +{ + register unsigned8 ignored; + + /* FORCE technical support mentioned that it may be necessary to + read the DUSCC RX_BUFFER port four times to remove all junk. + This code is a little more paranoid. */ + + inport_byte( RX_BUFFER, ignored ); + inport_byte( RX_BUFFER, ignored ); + inport_byte( RX_BUFFER, ignored ); + inport_byte( RX_BUFFER, ignored ); + inport_byte( RX_BUFFER, ignored ); +} + +/* Miscellaneous support for console IO */ + +static inline int _Force386_is_rx_ready () +{ + register unsigned8 status; + + inport_byte( RX_STATUS, status ); + + if ( Is_rx_ready( status ) ) return 1; + else return 0; +} + +static inline int _Force386_is_tx_ready () +{ + register unsigned8 status; + + inport_byte( TX_STATUS, status ); + + if ( Is_tx_ready( status ) ) return 1; + else return 0; +} + + +static inline int _Force386_read_data () +{ + register unsigned8 ch; + +#if ( PORTB == 1 ) + /* Force example code resets the Channel B Receiver here. + * It appears to cause XON's to be lost. + */ + + /* outport_byte( RX_STATUS, 0x10 ); */ +#endif + + inport_byte( RX_BUFFER, ch ); + + return ch; +} + +/* _Console_Putc + +This routine transmits a character. It supports XON/XOFF flow control. */ + +#define XON 0x11 /* control-Q */ +#define XOFF 0x13 /* control-S */ + +int +_Console_Putc (ch) + char ch; +{ + register unsigned8 inch; + + while ( !_Force386_is_tx_ready() ); + + while ( _Force386_is_rx_ready() == 1 ) { /* must be an XOFF */ + inch = _Force386_read_data(); + if ( inch == XOFF ) + do { + while ( _Force386_is_rx_ready() == 0 ); + inch = _Force386_read_data(); + } while ( inch != XON ); + } + + outport_byte( TX_BUFFER, ch ); + return( 0 ); +} + +/* _Console_Getc + +This routine reads a character from the UART and returns it. */ + +int +_Console_Getc (poll) + int poll; +{ + if ( poll ) { + if ( !_Force386_is_rx_ready() ) + return -1; + else + return _Force386_read_data(); + } else { + while ( !_Force386_is_rx_ready() ); + return _Force386_read_data(); + } +} diff --git a/ports/sysdeps/standalone/i386/force_cpu386/strtsupp.S b/ports/sysdeps/standalone/i386/force_cpu386/strtsupp.S new file mode 100644 index 000000000..5d9ac5c4a --- /dev/null +++ b/ports/sysdeps/standalone/i386/force_cpu386/strtsupp.S @@ -0,0 +1,87 @@ +/* Copyright (C) 1994, 1997 Free Software Foundation, Inc. + Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), + On-Line Applications Research Corporation. + 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. */ + +/* This file assists the board independent startup code by + * loading the proper segment register values. The values + * loaded are dependent on the FORCEBUG. + * + * NOTE: No stack has been established when this routine + * is invoked. It returns by jumping back to the start code. + * + */ + +/* + * FORCEBUG loads us into a virtual address space which + * really starts at PHYSICAL_ADDRESS_BASE. + * + */ + +.set PHYSICAL_ADDRESS_BASE, 0x00002000 + +/* + * At reset time, FORCEBUG normally has the segment selectors preloaded. + * If a human resets the instruction pointer, this will not have occurred. + * However, no guarantee can be made of the other registers if cs:ip was + * modified to restart the program. Because of this, the BSP reloads all + * segment registers (except cs) with the values they have following + * a reset. + */ + + +.set RESET_SS, 0x40 # initial value of stack segment register +.set RESET_DS, 0x40 # initial value of data segment register +.set RESET_ES, 0x40 # initial value of extra segment register +.set RESET_FS, 0x40 # initial value of "f" segment register +.set RESET_GS, 0x30 # initial value of "g" segment register + + +#define LOAD_SEGMENTS(_value,_segreg) \ + movw $_value##,%ax ; \ + movw %ax,##_segreg + + + .global _load_segments + + .global _establish_stack + +_load_segments: + + LOAD_SEGMENTS( RESET_SS, %ss ) + LOAD_SEGMENTS( RESET_DS, %ds ) + LOAD_SEGMENTS( RESET_ES, %es ) + LOAD_SEGMENTS( RESET_FS, %fs ) + LOAD_SEGMENTS( RESET_GS, %gs ) + + jmp _establish_stack # return to the bsp entry code + + .global _return_to_monitor +_return_to_monitor: + + movb $0,%al + int $0x20 # restart FORCEbug + jmp start # FORCEbug does not reset PC + + .data + + .global _Do_Load_IDT +_Do_Load_IDT: .byte 1 + + .global _Do_Load_GDT +_Do_Load_GDT: .byte 0 diff --git a/ports/sysdeps/standalone/i386/force_cpu386/target.ld b/ports/sysdeps/standalone/i386/force_cpu386/target.ld new file mode 100644 index 000000000..d040cf978 --- /dev/null +++ b/ports/sysdeps/standalone/i386/force_cpu386/target.ld @@ -0,0 +1,58 @@ +/* Copyright (C) 1994, 1997 Free Software Foundation, Inc. + Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), + On-Line Applications Research Corporation. + 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. */ + +/* This file contains directives for the GNU linker which are specific +to the FORCE CPU386 board. */ + +MEMORY + { + ram : org = 0x0, l = 1M + } + +/* This value is also when the space is allocated. If you change +this one, change the other one!!! */ + +heap_size = 0x20000; + +SECTIONS +{ + .text 0x0 : + { + _text_start = ABSOLUTE(.) ; + *(.text) + _etext = ALIGN( 0x10 ) ; + } + .data ADDR( .text ) + SIZEOF( .text ): + { + _data_start = . ; + *(.data) + _edata = ALIGN( 0x10 ) ; + } + .bss ADDR( .data ) + SIZEOF( .data ): + { + _bss_start = . ; + *(.bss) + *(COMMON) + heap_memory = .; + . += 0x20000; + _end = . ; + __end = . ; + } +} diff --git a/ports/sysdeps/standalone/i386/i386.h b/ports/sysdeps/standalone/i386/i386.h new file mode 100644 index 000000000..364e8abb3 --- /dev/null +++ b/ports/sysdeps/standalone/i386/i386.h @@ -0,0 +1,326 @@ +/* Copyright (C) 1994, 1997 Free Software Foundation, Inc. + Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), + On-Line Applications Research Corporation. + 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. */ + +/* i386.h + * + * This file contains macros which are used to access i80386 + * registers which are not addressable by C. This file contains + * functions which are useful to those developing target + * specific support routines. + */ + +#ifndef i386_h__ +#define i386_h__ + +typedef unsigned char unsigned8; +typedef unsigned short unsigned16; +typedef unsigned int unsigned32; + +#define disable_intr( isrlevel ) \ + { (isrlevel) = 0; \ + asm volatile ( "pushf ; \ + pop %0 ; \ + cli " \ + : "=r" ((isrlevel)) : "0" ((isrlevel)) ); \ + } + + +#define enable_intr( isrlevel ) \ + { asm volatile ( "push %0 ; \ + popf " \ + : "=r" ((isrlevel)) : "0" ((isrlevel)) ); \ + } + +#define delay( _microseconds ) \ + { \ + unsigned32 _counter; \ + \ + _counter = (_microseconds); \ + \ + asm volatile ( "0: nop;" \ + " mov %0,%0 ;" \ + " loop 0" : "=c" (_counter) \ + : "0" (_counter) \ + ); \ + \ + } + +/* segment access functions */ + +static inline unsigned16 get_cs() +{ + register unsigned16 segment = 0; + + asm volatile ( "movw %%cs,%0" : "=r" (segment) : "0" (segment) ); + + return segment; +} + +static inline unsigned16 get_ds() +{ + register unsigned16 segment = 0; + + asm volatile ( "movw %%ds,%0" : "=r" (segment) : "0" (segment) ); + + return segment; +} + +static inline unsigned16 get_es() +{ + register unsigned16 segment = 0; + + asm volatile ( "movw %%es,%0" : "=r" (segment) : "0" (segment) ); + + return segment; +} + +static inline unsigned16 get_ss() +{ + register unsigned16 segment = 0; + + asm volatile ( "movw %%ss,%0" : "=r" (segment) : "0" (segment) ); + + return segment; +} + +static inline unsigned16 get_fs() +{ + register unsigned16 segment = 0; + + asm volatile ( "movw %%fs,%0" : "=r" (segment) : "0" (segment) ); + + return segment; +} + +static inline unsigned16 get_gs() +{ + register unsigned16 segment = 0; + + asm volatile ( "movw %%gs,%0" : "=r" (segment) : "0" (segment) ); + + return segment; +} + +/* i80x86 I/O instructions */ + +#define outport_byte( _port, _value ) \ + { register unsigned16 __port = _port; \ + register unsigned8 __value = _value; \ + \ + asm volatile ( "outb %0,%1" : "=a" (__value), "=d" (__port) \ + : "0" (__value), "1" (__port) \ + ); \ + } + +#define outport_word( _port, _value ) \ + { register unsigned16 __port = _port; \ + register unsigned16 __value = _value; \ + \ + asm volatile ( "outw %0,%1" : "=a" (__value), "=d" (__port) \ + : "0" (__value), "1" (__port) \ + ); \ + } + +#define outport_long( _port, _value ) \ + { register unsigned16 __port = _port; \ + register unsigned32 __value = _value; \ + \ + asm volatile ( "outl %0,%1" : "=a" (__value), "=d" (__port) \ + : "0" (__value), "1" (__port) \ + ); \ + } + +#define inport_byte( _port, _value ) \ + { register unsigned16 __port = _port; \ + register unsigned8 __value = 0; \ + \ + asm volatile ( "inb %1,%0" : "=a" (__value), "=d" (__port) \ + : "0" (__value), "1" (__port) \ + ); \ + _value = __value; \ + } + +#define inport_word( _port, _value ) \ + { register unsigned16 __port = _port; \ + register unsigned16 __value = 0; \ + \ + asm volatile ( "inw %1,%0" : "=a" (__value), "=d" (__port) \ + : "0" (__value), "1" (__port) \ + ); \ + _value = __value; \ + } + +#define inport_long( _port, _value ) \ + { register unsigned16 __port = _port; \ + register unsigned32 __value = 0; \ + \ + asm volatile ( "inl %1,%0" : "=a" (__value), "=d" (__port) \ + : "0" (__value), "1" (__port) \ + ); \ + _value = __value; \ + } + +/* structures */ + +/* See Chapter 5 - Memory Management in i386 manual */ + +struct GDT_slot { + unsigned16 limit_0_15; + unsigned16 base_0_15; + unsigned8 base_16_23; + unsigned8 type_dt_dpl_p; + unsigned8 limit_16_19_granularity; + unsigned8 base_24_31; +}; + +/* See Chapter 9 - Exceptions and Interrupts in i386 manual + * + * NOTE: This is the IDT entry for interrupt gates ONLY. + */ + +struct IDT_slot { + unsigned16 offset_0_15; + unsigned16 segment_selector; + unsigned8 reserved; + unsigned8 p_dpl; + unsigned16 offset_16_31; +}; + +struct DTR_load_save_format { + unsigned16 limit; + unsigned32 physical_address; +}; + +/* variables */ + +extern struct IDT_slot Interrupt_descriptor_table[ 256 ]; +extern struct GDT_slot Global_descriptor_table[ 8192 ]; + +/* functions */ + +#ifdef CPU_INITIALIZE +#define EXTERN +#else +#undef EXTERN +#define EXTERN extern +#endif + +void *Logical_to_physical( + unsigned16 segment, + void *address +); + +void *Physical_to_logical( + unsigned16 segment, + void *address +); + +/* complicated static inline functions */ + +#define get_GDTR( _gdtr_address ) \ + { \ + void *_gdtr = (_gdtr_address); \ + \ + asm volatile( "sgdt (%0)" : "=r" (_gdtr) : "0" (_gdtr) ); \ + } + +#define get_GDT_slot( _gdtr_base, _segment, _slot_address ) \ + { \ + register unsigned32 _gdt_slot = (_gdtr_base) + (_segment); \ + register volatile void *_slot = (_slot_address); \ + register unsigned32 _temporary = 0; \ + \ + asm volatile( "movl %%gs:(%0),%1 ; \ + movl %1,(%2) ; \ + movl %%gs:4(%0),%1 ; \ + movl %1,4(%2)" \ + : "=r" (_gdt_slot), "=r" (_temporary), "=r" (_slot) \ + : "0" (_gdt_slot), "1" (_temporary), "2" (_slot) \ + ); \ + } + +#define set_GDT_slot( _gdtr_base, _segment, _slot_address ) \ + { \ + register unsigned32 _gdt_slot = (_gdtr_base) + (_segment); \ + register volatile void *_slot = (_slot_address); \ + register unsigned32 _temporary = 0; \ + \ + asm volatile( "movl (%2),%1 ; \ + movl %1,%%gs:(%0) ; \ + movl 4(%2),%1 ; \ + movl %1,%%gs:4(%0) \ + " \ + : "=r" (_gdt_slot), "=r" (_temporary), "=r" (_slot) \ + : "0" (_gdt_slot), "1" (_temporary), "2" (_slot) \ + ); \ + } + +static inline void set_segment( + unsigned16 segment, + unsigned32 base, + unsigned32 limit +) +{ + struct DTR_load_save_format gdtr; + volatile struct GDT_slot Gdt_slot; + volatile struct GDT_slot *gdt_slot = &Gdt_slot; + unsigned16 tmp_segment = 0; + unsigned32 limit_adjusted; + + + /* load physical address of the GDT */ + + get_GDTR( &gdtr ); + + gdt_slot->type_dt_dpl_p = 0x92; /* present, dpl=0, */ + /* application=1, */ + /* type=data read/write */ + gdt_slot->limit_16_19_granularity = 0x40; /* 32 bit segment */ + + limit_adjusted = limit; + if ( limit > 4095 ) { + gdt_slot->limit_16_19_granularity |= 0x80; /* set granularity bit */ + limit_adjusted /= 4096; + } + + gdt_slot->limit_16_19_granularity |= (limit_adjusted >> 16) & 0xff; + gdt_slot->limit_0_15 = limit_adjusted & 0xffff; + + gdt_slot->base_0_15 = base & 0xffff; + gdt_slot->base_16_23 = (base >> 16) & 0xff; + gdt_slot->base_24_31 = (base >> 24); + + set_GDT_slot( gdtr.physical_address, segment, gdt_slot ); + + /* Now, reload all segment registers so the limit takes effect. */ + + asm volatile( "movw %%ds,%0 ; movw %0,%%ds\n" + "movw %%es,%0 ; movw %0,%%es\n" + "movw %%fs,%0 ; movw %0,%%fs\n" + "movw %%gs,%0 ; movw %0,%%gs\n" + "movw %%ss,%0 ; movw %0,%%ss" + : "=r" (tmp_segment) + : "0" (tmp_segment) + ); + +} + +#endif +/* end of include file */ diff --git a/ports/sysdeps/standalone/i386/start.S b/ports/sysdeps/standalone/i386/start.S new file mode 100644 index 000000000..b3fd315e5 --- /dev/null +++ b/ports/sysdeps/standalone/i386/start.S @@ -0,0 +1,338 @@ +/* Copyright (C) 1994, 1997 Free Software Foundation, Inc. + Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), + On-Line Applications Research Corporation. + 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. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The GNU Lesser General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + Note that people who make modified versions of this file are not + obligated to grant this special exception for their modified + versions; it is their choice whether to do so. The GNU Lesser + General Public License gives permission to release a modified + version without this exception; this exception also makes it + possible to release a modified version which carries forward this + exception. + + 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. */ + +/* entry.s + * + * This file contains the entry point for the application. + * The name of this entry point is compiler dependent. + * It jumps to the BSP which is responsible for performing + * all initialization. + * + */ + + .data + .global _Do_Load_IDT + .global _Do_Load_GDT + + .text + .global start # GNU default entry point + .global _establish_stack + + .global _bsp_start + .global _load_segments + .global __exit + +start: + nop + cli # DISABLE INTERRUPTS!!! +# +# Load the segment registers +# +# NOTE: Upon return, gs will contain the segment descriptor for +# a segment which maps directly to all of physical memory. +# + jmp _load_segments # load board dependent segments + +# +# Set up the stack +# + +_establish_stack: + + movl $stack_end,%esp # set stack pointer + movl $stack_end,%ebp # set base pointer + +# +# Zero out the BSS segment +# +zero_bss: + cld # make direction flag count up + movl $_end,%ecx # find end of .bss + movl $_bss_start,%edi # edi = beginning of .bss + subl %edi,%ecx # ecx = size of .bss in bytes + shrl $2,%ecx # size of .bss in longs + xorl %eax,%eax # value to clear out memory + repne # while ecx != 0 + stosl # clear a long in the bss + +# +# Set the C heap information for malloc +# + movl $heap_size,___C_heap_size # set ___C_heap_size + movl $heap_memory,___C_heap_start # set ___C_heap_start + +# +# Copy the Global Descriptor Table to our space +# + + sgdt _Original_GDTR # save original GDT + movzwl _Original_GDTR_limit,%ecx # size of GDT in bytes; limit + # is 8192 entries * 8 bytes per + + # make ds:esi point to the original GDT + + movl _Original_GDTR_base,%esi + push %ds # save ds + movw %gs,%ax + movw %ax,%ds + + # make es:edi point to the new (our copy) GDT + movl $_Global_descriptor_table,%edi + + rep + movsb # copy the GDT (ds:esi -> es:edi) + + pop %ds # restore ds + + # Build and load new contents of GDTR + movw _Original_GDTR_limit,%ecx # set new limit + movw %cx,_New_GDTR_limit + + push $_Global_descriptor_table + push %es + call _Logical_to_physical + addl $6,%esp + movl %eax,_New_GDTR_base # set new base + + cmpb $0,_Do_Load_GDT # Should the new GDT be loaded? + je no_gdt_load # NO, then branch + lgdt _New_GDTR # load the new GDT +no_gdt_load: + +# +# Copy the Interrupt Descriptor Table to our space +# + + sidt _Original_IDTR # save original IDT + movzwl _Original_IDTR_limit,%ecx # size of IDT in bytes; limit + # is 256 entries * 8 bytes per + + + # make ds:esi point to the original IDT + movl _Original_IDTR_base,%esi + + push %ds # save ds + movw %gs,%ax + movw %ax,%ds + + # make es:edi point to the new (our copy) IDT + movl $_Interrupt_descriptor_table,%edi + + rep + movsb # copy the IDT (ds:esi -> es:edi) + pop %ds # restore ds + + # Build and load new contents of IDTR + movw _Original_IDTR_limit,%ecx # set new limit + movw %cx,_New_IDTR_limit + + push $_Interrupt_descriptor_table + push %es + call _Logical_to_physical + addl $6,%esp + movl %eax,_New_IDTR_base # set new base + + cmpb $0,_Do_Load_IDT # Should the new IDT be loaded? + je no_idt_load # NO, then branch + lidt _New_IDTR # load the new IDT +no_idt_load: + +# +# Initialize the i387. +# +# Using the NO WAIT form of the instruction insures that if +# it is not present the board will not lock up or get an +# exception. +# + + fninit # MUST USE NO-WAIT FORM + + call __Board_Initialize # initialize the board + + pushl $0 # envp = NULL + pushl $0 # argv = NULL + pushl $0 # argc = NULL + call ___libc_init # initialize the library and + # call main + addl $12,%esp + + pushl $0 # argc = NULL + call __exit # call the Board specific exit + addl $4,%esp + +# +# Clean up +# + + + .global _Bsp_cleanup + + .global _return_to_monitor + +_Bsp_cleanup: + cmpb $0,_Do_Load_IDT # Was the new IDT loaded? + je no_idt_restore # NO, then branch + lidt _Original_IDTR # restore the new IDT +no_idt_restore: + + cmpb $0,_Do_Load_GDT # Was the new GDT loaded? + je no_gdt_restore # NO, then branch + lgdt _Original_GDTR # restore the new GDT +no_gdt_restore: + jmp _return_to_monitor + +# +# void *Logical_to_physical( +# rtems_unsigned16 segment, +# void *address +# ); +# +# Returns thirty-two bit physical address for segment:address. +# + + .global _Logical_to_physical + +.set SEGMENT_ARG, 4 +.set ADDRESS_ARG, 8 + +_Logical_to_physical: + + xorl %eax,%eax # clear eax + movzwl SEGMENT_ARG(%esp),%ecx # ecx = segment value + movl $_Global_descriptor_table,%edx # edx = address of our GDT + addl %ecx,%edx # edx = address of desired entry + movb 7(%edx),%ah # ah = base 31:24 + movb 4(%edx),%al # al = base 23:16 + shll $16,%eax # move ax into correct bits + movw 2(%edx),%ax # ax = base 0:15 + movl ADDRESS_ARG(%esp),%ecx # ecx = address to convert + addl %eax,%ecx # ecx = physical address equivalent + movl %ecx,%eax # eax = ecx + ret + +# +# void *Physical_to_logical( +# rtems_unsigned16 segment, +# void *address +# ); +# +# Returns thirty-two bit physical address for segment:address. +# + + .global _Physical_to_logical + +#.set SEGMENT_ARG, 4 +#.set ADDRESS_ARG, 8 -- use sets from above + +_Physical_to_logical: + + xorl %eax,%eax # clear eax + movzwl SEGMENT_ARG(%esp),%ecx # ecx = segment value + movl $_Global_descriptor_table,%edx # edx = address of our GDT + addl %ecx,%edx # edx = address of desired entry + movb 7(%edx),%ah # ah = base 31:24 + movb 4(%edx),%al # al = base 23:16 + shll $16,%eax # move ax into correct bits + movw 2(%edx),%ax # ax = base 0:15 + movl ADDRESS_ARG(%esp),%ecx # ecx = address to convert + subl %eax,%ecx # ecx = logical address equivalent + movl %ecx,%eax # eax = ecx + ret + + +/* + * Data Declarations. Start with a macro which helps declare space. + */ + + .bss + +#define DECLARE_SPACE(_name,_space,_align) \ + .globl _name ; \ + .align _align ; \ +_name##: .space _space + +#define DECLARE_LABEL(_name) \ + .globl _name ; \ +_name##: + +#define DECLARE_PTR(_name) DECLARE_SPACE(_name,4,2) +#define DECLARE_U32(_name) DECLARE_SPACE(_name,4,2) +#define DECLARE_U16(_name) DECLARE_SPACE(_name,2,1) + +/* + * Require environment stuff + */ + +DECLARE_LABEL(_environ) +DECLARE_PTR(environ) + +DECLARE_LABEL(_errno) +DECLARE_U32(errno) + +/* + * Miscellaneous Variables used to restore the CPU state. + * + * Start with a macro to declare the space for the contents of + * a Descriptor Table register. + */ + +#define DECLARE_DTR_SPACE(_name) \ + .global _name ; \ + .align 4 ; \ +_name##: ; \ +_name##_limit: .space 2 ; \ +_name##_base: .space 4 + +DECLARE_SPACE(_Interrupt_descriptor_table,256*8,4) +DECLARE_SPACE(_Global_descriptor_table,8192*8,4) + +DECLARE_DTR_SPACE(_Original_IDTR) +DECLARE_DTR_SPACE(_New_IDTR) +DECLARE_DTR_SPACE(_Original_GDTR) +DECLARE_DTR_SPACE(_New_GDTR) + +DECLARE_SPACE(_Physical_base_of_ds,4,4) +DECLARE_SPACE(_Physical_base_of_cs,4,4) + +/* + * Stack Size and Space + */ + + .set stack_size, 0x20000 + +DECLARE_SPACE(stack_memory,stack_size,4) +DECLARE_LABEL(stack_end) diff --git a/ports/sysdeps/standalone/i960/Dist b/ports/sysdeps/standalone/i960/Dist new file mode 100644 index 000000000..e1747ef91 --- /dev/null +++ b/ports/sysdeps/standalone/i960/Dist @@ -0,0 +1 @@ +i960ca.h diff --git a/ports/sysdeps/standalone/i960/i960ca.h b/ports/sysdeps/standalone/i960/i960ca.h new file mode 100644 index 000000000..0dcf5c374 --- /dev/null +++ b/ports/sysdeps/standalone/i960/i960ca.h @@ -0,0 +1,206 @@ +/* Copyright (C) 1994, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), + On-Line Applications Research Corporation. + + 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. */ + +/* i960ca.h + * + * This file contains macros which are used to access i80960CA + * registers which are not addressable by C. The functions + * in this file should be useful to the developer of target + * specific code. + */ + +#ifndef i960ca_h__ +#define i960ca_h__ + +typedef unsigned char unsigned8; +typedef unsigned short unsigned16; +typedef unsigned int unsigned32; + +/* + * Intel i80960CA Processor Control Block + */ + +struct i80960ca_prcb { + unsigned32 *fault_tbl; /* fault table base address */ + struct i80960ca_ctltbl + *control_tbl; /* control table base address */ + unsigned32 initial_ac; /* AC register initial value */ + unsigned32 fault_config; /* fault configuration word */ + void *intr_tbl; /* interrupt table base address */ + void *sys_proc_tbl; /* system procedure table */ + /* base address */ + unsigned32 reserved; /* reserved */ + unsigned32 *intr_stack; /* interrupt stack pointer */ + unsigned32 ins_cache_cfg; /* instruction cache */ + /* configuration word */ + unsigned32 reg_cache_cfg; /* register cache */ + /* configuration word */ +}; + +/* + * Intel i80960CA Control Table + */ + +struct i80960ca_ctltbl { + /* Control Group 0 */ + unsigned32 ipb0; /* IP breakpoint 0 */ + unsigned32 ipb1; /* IP breakpoint 1 */ + unsigned32 dab0; /* data address breakpoint 0 */ + unsigned32 dab1; /* data address breakpoint 1 */ + /* Control Group 1 */ + unsigned32 imap0; /* interrupt map 0 */ + unsigned32 imap1; /* interrupt map 1 */ + unsigned32 imap2; /* interrupt map 2 */ + unsigned32 icon; /* interrupt control */ + /* Control Group 2 */ + unsigned32 mcon0; /* memory region 0 configuration */ + unsigned32 mcon1; /* memory region 1 configuration */ + unsigned32 mcon2; /* memory region 2 configuration */ + unsigned32 mcon3; /* memory region 3 configuration */ + /* Control Group 3 */ + unsigned32 mcon4; /* memory region 4 configuration */ + unsigned32 mcon5; /* memory region 5 configuration */ + unsigned32 mcon6; /* memory region 6 configuration */ + unsigned32 mcon7; /* memory region 7 configuration */ + /* Control Group 4 */ + unsigned32 mcon8; /* memory region 8 configuration */ + unsigned32 mcon9; /* memory region 9 configuration */ + unsigned32 mcon10; /* memory region 10 configuration */ + unsigned32 mcon11; /* memory region 11 configuration */ + /* Control Group 5 */ + unsigned32 mcon12; /* memory region 12 configuration */ + unsigned32 mcon13; /* memory region 13 configuration */ + unsigned32 mcon14; /* memory region 14 configuration */ + unsigned32 mcon15; /* memory region 15 configuration */ + /* Control Group 6 */ + unsigned32 bpcon; /* breakpoint control */ + unsigned32 tc; /* trace control */ + unsigned32 bcon; /* bus configuration control */ + unsigned32 reserved; /* reserved */ +}; + +#define disable_intr( oldlevel ) \ + { (oldlevel) = 0x1f0000; \ + asm volatile ( "modpc 0,%1,%1" \ + : "=d" ((oldlevel)) \ + : "0" ((oldlevel)) ); \ + } + +#define enable_intr( oldlevel ) \ + { unsigned32 _mask = 0x1f0000; \ + asm volatile ( "modpc 0,%0,%1" \ + : "=d" (_mask), "=d" ((oldlevel)) \ + : "0" (_mask), "1" ((oldlevel)) ); \ + } + +#define flash_intr( oldlevel ) \ + { unsigned32 _mask = 0x1f0000; \ + asm volatile ( "modpc 0,%0,%1 ; \ + mov %0,%1 ; \ + modpc 0,%0,%1" \ + : "=d" (_mask), "=d" ((oldlevel)) \ + : "0" (_mask), "1" ((oldlevel)) ); \ + } + +#define atomic_modify( mask, addr, prev ) \ + { register unsigned32 _mask = (mask); \ + register unsigned32 *_addr = (unsigned32 *)(addr); \ + asm volatile( "atmod %0,%1,%1" \ + : "=d" (_addr), "=d" (_mask) \ + : "0" (_addr), "1" (_mask) ); \ + (prev) = _mask; \ + } + +#define delay( microseconds ) \ + { register unsigned32 _delay=(microseconds); \ + register unsigned32 _tmp; \ + asm volatile( "delay0: \ + remo 3,31,%0 ; \ + cmpo 0,%0 ; \ + subo 1,%1,%1 ; \ + cmpobne.t 0,%1,delay0 " \ + : "=d" (_tmp), "=d" (_delay) \ + : "0" (_tmp), "1" (_delay) ); \ + } + +#define enable_tracing() \ + { register unsigned32 _pc = 0x1; \ + asm volatile( "modpc 0,%0,%0" : "=d" (_pc) : "0" (_pc) ); \ + } + +#define unmask_intr( xint ) \ + { register unsigned32 _mask= (1<<(xint)); \ + asm volatile( "or sf1,%0,sf1" : "=d" (_mask) : "0" (_mask) ); \ + } + +#define mask_intr( xint ) \ + { register unsigned32 _mask= (1<<(xint)); \ + asm volatile( "andnot %0,sf1,sf1" : "=d" (_mask) : "0" (_mask) ); \ + } + +#define clear_intr( xint ) \ + { register unsigned32 _xint=(xint); \ + asm volatile( "loop_til_cleared:" \ + " clrbit %0,sf0,sf0 ;" \ + " bbs %0,sf0,loop_til_cleared" \ + : "=d" (_xint) : "0" (_xint) ); \ + } + +#define reload_ctl_group( group ) \ + { register int _cmd = ((group)|0x400) ; \ + asm volatile( "sysctl %0,%0,%0" : "=d" (_cmd) : "0" (_cmd) ); \ + } + +#define cause_intr( intr ) \ + { register int _intr = (intr); \ + asm volatile( "sysctl %0,%0,%0" : "=d" (_intr) : "0" (_intr) ); \ + } + +#define soft_reset( prcb ) \ + { register struct i80960ca_prcb *_prcb = (prcb); \ + register unsigned32 *_next=0; \ + register unsigned32 _cmd = 0x30000; \ + asm volatile( "lda next,%1; \ + sysctl %0,%1,%2; \ + next: mov g0,g0" \ + : "=d" (_cmd), "=d" (_next), "=d" (_prcb) \ + : "0" (_cmd), "1" (_next), "2" (_prcb) ); \ + } + +static inline unsigned32 pend_intrs() +{ register unsigned32 _intr=0; + asm volatile( "mov sf0,%0" : "=d" (_intr) : "0" (_intr) ); + return ( _intr ); +} + +static inline unsigned32 mask_intrs() +{ register unsigned32 _intr=0; + asm volatile( "mov sf1,%0" : "=d" (_intr) : "0" (_intr) ); + return( _intr ); +} + +static inline unsigned32 get_fp() +{ register unsigned32 _fp=0; + asm volatile( "mov fp,%0" : "=d" (_fp) : "0" (_fp) ); + return ( _fp ); +} + +#endif +/* end of include file */ diff --git a/ports/sysdeps/standalone/i960/nindy960/Makefile b/ports/sysdeps/standalone/i960/nindy960/Makefile new file mode 100644 index 000000000..40ead970a --- /dev/null +++ b/ports/sysdeps/standalone/i960/nindy960/Makefile @@ -0,0 +1,24 @@ +# Copyright (C) 1993, 1997 Free Software Foundation, Inc. +# This file is part of the GNU C Library. +# Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), +# On-Line Applications Research Corporation. + +# 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. + + +# The nindy960 support has only been tested on the following boards: +# +# + Cyclone CVME961 VMEbus single board computer. diff --git a/ports/sysdeps/standalone/i960/nindy960/_exit.c b/ports/sysdeps/standalone/i960/nindy960/_exit.c new file mode 100644 index 000000000..9cd3f8519 --- /dev/null +++ b/ports/sysdeps/standalone/i960/nindy960/_exit.c @@ -0,0 +1,55 @@ +/* Copyright (C) 1991, 1997, 1999 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), + On-Line Applications Research Corporation. + + 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. */ + +#include <unistd.h> +#include <stdlib.h> + +/* The function `_exit' should take a status argument and simply + terminate program execution, using the low-order 8 bits of the + given integer as status. */ + +/* This returns control to Nindy. */ +/* XXX where is __NORETURN ? */ +__NORETURN void +_exit (status) + int status; +{ + /* status is ignored */ + + asm volatile( "mov 0,g0; \ + fmark ; \ + syncf ; \ + .word 0xfeedface ; \ + bx start" : : ); + /* The constant 0xfeedface is a magic word for break which + * is defined by NINDY. The branch extended restarts the + * application if the user types "go". + */ +} +weak_alias (_exit, _Exit) + + +#ifdef HAVE_GNU_LD + +#include <gnu-stabs.h> + +stub_warning(_exit); + +#endif /* GNU stabs. */ diff --git a/ports/sysdeps/standalone/i960/nindy960/brdinit.c b/ports/sysdeps/standalone/i960/nindy960/brdinit.c new file mode 100644 index 000000000..9985a9930 --- /dev/null +++ b/ports/sysdeps/standalone/i960/nindy960/brdinit.c @@ -0,0 +1,64 @@ +/* Copyright (C) 1994, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), + On-Line Applications Research Corporation. + + 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. */ + +#include <standalone.h> +#include "i960ca.h" + +/* _Board_Initialize() + +This routine initializes the board. + +NOTE: Only tested on a Cyclone CVME961 but should be OK on any i960ca board. */ + +void +_Board_Initialize () +{ + struct i80960ca_prcb *prcb; /* ptr to processor control block */ + struct i80960ca_ctltbl *ctl_tbl; /* ptr to control table */ + + static inline struct i80960ca_prcb *get_prcb() + { register struct i80960ca_prcb *_prcb = 0; + asm volatile( "calls 5; \ + mov g0,%0" \ + : "=d" (_prcb) \ + : "0" (_prcb) ); + return ( _prcb ); + } + + prcb = get_prcb (); + ctl_tbl = prcb->control_tbl; + + /* The following configures the data breakpoint (which must be set + * before this is executed) to break on writes only. + */ + + ctl_tbl->bpcon &= ~0x00cc0000; + reload_ctl_group (6); + + /* bit 31 of the Register Cache Control can be set to + * enable an alternative caching algorithm. It does + * not appear to help our applications. + */ + + /* Configure Number of Register Caches */ + + prcb->reg_cache_cfg = 8; + soft_reset (prcb); +} diff --git a/ports/sysdeps/standalone/i960/nindy960/console.c b/ports/sysdeps/standalone/i960/nindy960/console.c new file mode 100644 index 000000000..b062d9215 --- /dev/null +++ b/ports/sysdeps/standalone/i960/nindy960/console.c @@ -0,0 +1,76 @@ +/* Copyright (C) 1994, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), + On-Line Applications Research Corporation. + + 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. */ + +#include <standalone.h> +#include "i960ca.h" + +/* Console IO routines for a NINDY960 board. */ + +/* + * NINDY_IO( ... ) + * + * Interface to NINDY. + */ + +#define NINDY_INPUT 0 +#define NINDY_OUTPUT 1 + +void ___NINDY_IO_WRAPPER( void ) /* never called */ +{ + asm volatile ( " .text" ); + asm volatile ( " .align 4" ); + asm volatile ( " .globl _NINDY_IO" ); + asm volatile ( "_NINDY_IO:" ); + asm volatile ( " calls 0 /* call console routines */" ); + asm volatile ( " ret" ); +} + +/***** !!!! HOW DO I EXFUN NINDY_IO? !!!! *****/ + +/* _Console_Putc + +This routine transmits a character using NINDY. */ + +int +_Console_Putc (ch) + char ch; +{ + NINDY_IO( NINDY_OUTPUT, ch ); + return( 0 ); +} + +/* _Console_Getc + +This routine reads a character from NINDY and returns it. */ + +int +_Console_Getc (poll) + int poll; +{ + char ch; + + if ( poll ) { + /* I don't know how to poll with NINDY */ + return -1; + } else { + NINDY_IO( NINDY_INPUT, &ch ); + return ch; + } +} diff --git a/ports/sysdeps/standalone/i960/start.S b/ports/sysdeps/standalone/i960/start.S new file mode 100644 index 000000000..579beb77f --- /dev/null +++ b/ports/sysdeps/standalone/i960/start.S @@ -0,0 +1,152 @@ +/* Copyright (C) 1994, 1997 Free Software Foundation, Inc. + Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), + On-Line Applications Research Corporation. + 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. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The GNU Lesser General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + Note that people who make modified versions of this file are not + obligated to grant this special exception for their modified + versions; it is their choice whether to do so. The GNU Lesser + General Public License gives permission to release a modified + version without this exception; this exception also makes it + possible to release a modified version which carries forward this + exception. + + 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. */ + +/* entry.s + * + * This file contains the entry point for the application. + * The name of this entry point is compiler dependent. + * It jumps to the BSP which is responsible for performing + * all initialization. + * + */ + + .text + .globl start # GNU960 default entry point + +start: + mov 3, r12 + modpc r12, r12, r12 # enable tracing/trace faults + mov g5, g5 # NOP + mov 0, g14 # initialize constant for C + + /* + * zero out uninitialized data area + */ +zerobss: + lda _end, r4 /* find end of .bss */ + lda _bss_start, r5 /* find beginning of .bss */ + ldconst 0, r6 + +loop: st r6, (r5) /* to zero out uninitialized */ + addo 4, r5, r5 /* data area */ + cmpobl r5, r4, loop /* loop until _end reached */ + + + lda heap_memory, r12 /* tell C lib where heap is */ + st r12,___C_heap_start + lda heap_size, r12 /* tell C lib how big heap is */ + st r12,___C_heap_size + lda stack_memory,r12 /* set up stack pointer: */ + mov r12, sp + mov 0, g14 /* initialize constant for C */ + + call init_frames + ret /* return to monitor */ + +init_frames: + ldconst 0x3b001000, g0 + ldconst 0x00009107, g1 + modac g1, g0, g0 /* set AC controls */ + + /* + * Call application mainline. + * Someday, real values of argc and argv will be set up. + * For now, they are set to 0. + */ + + callx __Board_Initialize /* Initialize the board */ + + ldconst 0,g0 + ldconst 0,g1 + ldconst 0,g2 + callx ___libc_init /* initialize the library and */ + /* call main */ + /* + * if we return from main, we have "fallen" off the end + * of the program, therefore status is 0 + * so move 0 to g0 (exit parameter) + */ + + mov 0, g0 + callx __exit + ret + + +/* + * Data Declarations. Start with a macro which helps declare space. + */ + +#define DECLARE_SPACE(_name,_space,_align) \ + .globl _name ; \ + .align _align ; \ +.comm _name##,_space + +#define DECLARE_LABEL(_name) \ + .globl _name ; \ +_name##: + +#define DECLARE_PTR(_name) DECLARE_SPACE(_name,4,2) +#define DECLARE_U32(_name) DECLARE_SPACE(_name,4,2) +#define DECLARE_U16(_name) DECLARE_SPACE(_name,2,1) + +/* + * Require environment stuff + */ + +DECLARE_LABEL(_environ) +DECLARE_PTR(environ) + +DECLARE_LABEL(_errno) +DECLARE_U32(errno) + +/* + * Stack Size and Space + */ + + .set stack_size, 0x20000 + +DECLARE_SPACE(stack_memory,stack_size,4) +DECLARE_LABEL(stack_end) + +/* + * Heap Size and Space + */ + + .set heap_size, 0x20000 + +DECLARE_SPACE(heap_memory,heap_size,4) +DECLARE_LABEL(heap_end) diff --git a/ports/sysdeps/standalone/m68k/m68020/Dist b/ports/sysdeps/standalone/m68k/m68020/Dist new file mode 100644 index 000000000..90b37b40e --- /dev/null +++ b/ports/sysdeps/standalone/m68k/m68020/Dist @@ -0,0 +1 @@ +m68020.h diff --git a/ports/sysdeps/standalone/m68k/m68020/m68020.h b/ports/sysdeps/standalone/m68k/m68020/m68020.h new file mode 100644 index 000000000..8eee00753 --- /dev/null +++ b/ports/sysdeps/standalone/m68k/m68020/m68020.h @@ -0,0 +1,87 @@ +/* Copyright (C) 1994, 1997 Free Software Foundation, Inc. + Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), + On-Line Applications Research Corporation. + 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. */ + +/* m68020.h + * + * This file contains macros which are used to access MC68020 + * registers which are not addressable by C. These are + * useful when developing the board specific support. + */ + +#ifndef m68020_h__ +#define m68020_h__ + +typedef void ( *mc68020_isr )( void ); + +#define disable_intr( level ) \ + { (level) = 0; \ + asm volatile ( "movew %%sr,%0 ; \ + orw #0x0700,%%sr" \ + : "=d" ((level)) : "0" ((level)) ); \ + } + +#define enable_intr( level ) \ + { asm volatile ( "movew %0,%%sr " \ + : "=d" ((level)) : "0" ((level)) ); \ + } + +#define flash_intr( level ) \ + { asm volatile ( "movew %0,%%sr ; \ + orw #0x0700,%%sr" \ + : "=d" ((level)) : "0" ((level)) ); \ + } + +#define get_vbr( vbr ) \ + { (vbr) = 0; \ + asm volatile ( "movec %%vbr,%0 " \ + : "=a" (vbr) : "0" (vbr) ); \ + } + +#define set_vbr( vbr ) \ + { register mc68020_isr *_vbr= (mc68020_isr *)(vbr); \ + asm volatile ( "movec %0,%%vbr " \ + : "=a" (_vbr) : "0" (_vbr) ); \ + } + +#define enable_caching() \ + { register unsigned int _ctl=0x01; \ + asm volatile ( "movec %0,%%cacr" \ + : "=d" (_ctl) : "0" (_ctl) ); \ + } + +#define delay( microseconds ) \ + { register unsigned int _delay=(microseconds); \ + register unsigned int _tmp=123; \ + asm volatile( "0: \ + nbcd %0 ; \ + nbcd %0 ; \ + dbf %1,0 " \ + : "=d" (_tmp), "=d" (_delay) \ + : "0" (_tmp), "1" (_delay) ); \ + } + +#define enable_tracing() +#define cause_intr( X ) +#define clear_intr( X ) + +extern mc68020_isr M68Kvec[]; /* vector table address */ + +#endif +/* end of include file */ diff --git a/ports/sysdeps/standalone/m68k/m68020/mvme135/Implies b/ports/sysdeps/standalone/m68k/m68020/mvme135/Implies new file mode 100644 index 000000000..7142fe298 --- /dev/null +++ b/ports/sysdeps/standalone/m68k/m68020/mvme135/Implies @@ -0,0 +1,2 @@ +# Motorola MVME135 and MVME136 are compatible. +standalone/m68k/m68020/mvme136 diff --git a/ports/sysdeps/standalone/m68k/m68020/mvme136/Dist b/ports/sysdeps/standalone/m68k/m68020/mvme136/Dist new file mode 100644 index 000000000..97b90583e --- /dev/null +++ b/ports/sysdeps/standalone/m68k/m68020/mvme136/Dist @@ -0,0 +1 @@ +mvme136.ld diff --git a/ports/sysdeps/standalone/m68k/m68020/mvme136/Makefile b/ports/sysdeps/standalone/m68k/m68020/mvme136/Makefile new file mode 100644 index 000000000..122c1b183 --- /dev/null +++ b/ports/sysdeps/standalone/m68k/m68020/mvme136/Makefile @@ -0,0 +1,23 @@ +# Copyright (C) 1993, 1997 Free Software Foundation, Inc. +# This file is part of the GNU C Library. +# Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), +# On-Line Applications Research Corporation. + +# 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. + +ifeq (bare,$(subdir)) +install-lib += mvme136.ld +endif diff --git a/ports/sysdeps/standalone/m68k/m68020/mvme136/_exit.c b/ports/sysdeps/standalone/m68k/m68020/mvme136/_exit.c new file mode 100644 index 000000000..e5e078c19 --- /dev/null +++ b/ports/sysdeps/standalone/m68k/m68020/mvme136/_exit.c @@ -0,0 +1,50 @@ +/* Copyright (C) 1994, 1997, 1999 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), + On-Line Applications Research Corporation. + + 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. */ + +#include <unistd.h> +#include <stdlib.h> +#include "m68020.h" + +/* Return control to 135Bug */ + +void +__exit_trap () +{ + set_vbr( 0 ); /* restore 135Bug vectors */ + asm volatile( "trap #15" ); /* trap to 135Bug */ + asm volatile( ".short 0x63" ); /* return to 135Bug (.RETURN) */ + asm volatile( "jmp main" ); /* restart program */ +} + +/* The function `_exit' should take a status argument and simply + terminate program execution, using the low-order 8 bits of the + given integer as status. */ + +void +__attribute__ ((noreturn)) +_exit (status) + int status; +{ + /* status is ignored */ + + M68Kvec[ 45 ] = __exit_trap; /* install exit_trap handler */ + asm volatile( "trap #13" ); /* insures SUPV mode */ +} +weak_alias (_exit, _Exit) diff --git a/ports/sysdeps/standalone/m68k/m68020/mvme136/brdinit.c b/ports/sysdeps/standalone/m68k/m68020/mvme136/brdinit.c new file mode 100644 index 000000000..95b81c1e1 --- /dev/null +++ b/ports/sysdeps/standalone/m68k/m68020/mvme136/brdinit.c @@ -0,0 +1,51 @@ +/* Copyright (C) 1994, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), + On-Line Applications Research Corporation. + + 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. */ + +#include <standalone.h> +#include "m68020.h" + +/* _Board_Initialize() + +This routine initializes the Motorola MVME135/MVME136. */ + +void +_Board_Initialize () +{ + mc68020_isr *monitors_vector_table; + int index; + + monitors_vector_table = (mc68020_isr *)0; /* 135Bug Vectors are at 0 */ + set_vbr( monitors_vector_table ); + + for ( index=2 ; index<=255 ; index++ ) + M68Kvec[ index ] = monitors_vector_table[ 32 ]; + + M68Kvec[ 2 ] = monitors_vector_table[ 2 ]; /* bus error vector */ + M68Kvec[ 4 ] = monitors_vector_table[ 4 ]; /* breakpoints vector */ + M68Kvec[ 9 ] = monitors_vector_table[ 9 ]; /* trace vector */ + M68Kvec[ 47 ] = monitors_vector_table[ 47 ]; /* system call vector */ + + set_vbr( &M68Kvec ); + + (*(unsigned char *)0xfffb0067) = 0x7f; /* make VME access round-robin */ + + enable_caching (); + +} diff --git a/ports/sysdeps/standalone/m68k/m68020/mvme136/console.c b/ports/sysdeps/standalone/m68k/m68020/mvme136/console.c new file mode 100644 index 000000000..85dee983b --- /dev/null +++ b/ports/sysdeps/standalone/m68k/m68020/mvme136/console.c @@ -0,0 +1,101 @@ +/* Copyright (C) 1994, 1996 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), + On-Line Applications Research Corporation. + + 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. */ + +#include <standalone.h> +#include "m68020.h" + +/* Console IO routines for a Motorola MVME135/MVME136 board. + +They currently use the B port. It should be possible to +use the A port by filling in the reset of the chip structure, +adding an ifdef for PORTA/PORTB, and switching the addresses, +and maybe the macros based on the macro. */ + +/* M68681 DUART chip register structures and constants */ + +typedef struct { + volatile unsigned char fill1[ 5 ]; /* channel A regs ( not used ) */ + volatile unsigned char isr; /* interrupt status reg */ + volatile unsigned char fill2[ 2 ]; /* counter regs (not used) */ + volatile unsigned char mr1mr2b; /* MR1B and MR2B regs */ + volatile unsigned char srb; /* status reg channel B */ + volatile unsigned char fill3; /* do not access */ + volatile unsigned char rbb; /* receive buffer channel B */ + volatile unsigned char ivr; /* interrupt vector register */ +} r_m681_info; + +typedef struct { + volatile unsigned char fill1[ 4 ]; /* channel A regs (not used) */ + volatile unsigned char acr; /* auxillary control reg */ + volatile unsigned char imr; /* interrupt mask reg */ + volatile unsigned char fill2[ 2 ]; /* counter regs (not used) */ + volatile unsigned char mr1mr2b; /* MR1B and MR2B regs */ + volatile unsigned char csrb; /* clock select reg */ + volatile unsigned char crb; /* command reg */ + volatile unsigned char tbb; /* transmit buffer channel B */ + volatile unsigned char ivr; /* interrupt vector register */ +} w_m681_info; + +#define RD_M68681 ((r_m681_info *)0xfffb0040) /* ptr to the M68681 */ +#define WR_M68681 ((w_m681_info *)0xfffb0040) /* ptr to the M68681 */ +#define RXRDYB 0x01 /* status reg recv ready mask */ +#define TXRDYB 0x04 /* status reg trans ready mask */ + +/* _Console_Putc + +This routine transmits a character out the M68681. It supports +XON/XOFF flow control. */ + +#define XON 0x11 /* control-Q */ +#define XOFF 0x13 /* control-S */ + +int +_Console_Putc (ch) + char ch; +{ + while ( ! (RD_M68681->srb & TXRDYB) ) ; + while ( RD_M68681->srb & RXRDYB ) /* must be an XOFF */ + if ( RD_M68681->rbb == XOFF ) + do { + while ( ! (RD_M68681->srb & RXRDYB) ) ; + } while ( RD_M68681->rbb != XON ); + + WR_M68681->tbb = ch; + return( 0 ); +} + +/* _Console_Getc + +This routine reads a character from the UART and returns it. */ + +int +_Console_Getc (poll) + int poll; +{ + if ( poll ) { + if ( !(RD_M68681->srb & RXRDYB) ) + return -1; + else + return RD_M68681->rbb; + } else { + while ( !(RD_M68681->srb & RXRDYB) ); + return RD_M68681->rbb; + } +} diff --git a/ports/sysdeps/standalone/m68k/m68020/mvme136/mvme136.ld b/ports/sysdeps/standalone/m68k/m68020/mvme136/mvme136.ld new file mode 100644 index 000000000..9a352f009 --- /dev/null +++ b/ports/sysdeps/standalone/m68k/m68020/mvme136/mvme136.ld @@ -0,0 +1,61 @@ +/* Copyright (C) 1994, 1997 Free Software Foundation, Inc. + Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), + On-Line Applications Research Corporation. + 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. */ + +/* This file contains directives for the GNU linker which are specific +to the Motorola MVME136/MVME135 boards. */ + +MEMORY + { + ram : org = 0x3000, l = 1M + } + +/* This value is also when the space is allocated. If you change +this one, change the other one!!! */ + +heap_size = 0x20000; + +SECTIONS +{ + .text 0x3000 : + { + text_start = ABSOLUTE(.) ; + *(.text) + etext = ALIGN( 0x10 ) ; + } + + .data ADDR( .text ) + SIZEOF( .text ): + { + data_start = . ; + *(.data) + edata = ALIGN( 0x10 ) ; + } + + .bss ADDR( .data ) + SIZEOF( .data ): + { + bss_start = . ; + _bss_start = . ; + *(.bss) + *(COMMON) + heap_memory = .; + . += 0x20000; + end = . ; + _end = . ; + } +} diff --git a/ports/sysdeps/standalone/m68k/m68020/start.S b/ports/sysdeps/standalone/m68k/m68020/start.S new file mode 100644 index 000000000..166605fb4 --- /dev/null +++ b/ports/sysdeps/standalone/m68k/m68020/start.S @@ -0,0 +1,172 @@ +/* Copyright (C) 1994, 1996, 1997 Free Software Foundation, Inc. + Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), + On-Line Applications Research Corporation. + 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. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The GNU Lesser General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + Note that people who make modified versions of this file are not + obligated to grant this special exception for their modified + versions; it is their choice whether to do so. The GNU Lesser + General Public License gives permission to release a modified + version without this exception; this exception also makes it + possible to release a modified version which carries forward this + exception. + + 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. */ + +/* entry.s + * + * This file contains the entry point for the application. + * The name of this entry point is compiler dependent. + * It jumps to the BSP which is responsible for performing + * all initialization. + */ + + .text + .globl start | Default entry point + .globl _start | Default entry point + .globl M68Kvec | Vector Table + .globl _M68Kvec | Vector Table + +start: +_start: +M68Kvec: | standard location for vectors +_M68Kvec: | standard location for vectors + nop | for linkers with problem + | using location zero as entry + jmp around + .space 4088 | to avoid initial intr stack + | from 135BUG on MVME13? as entry + | and start code at 0x4000 +around: + move.w %sr,initial_sr | save initial values + movec %isp,%a0 + movel %a0,initial_isp + movec %usp,%a0 + movel %a0,initial_usp + movec %msp,%a0 + movel %a0,initial_msp + oriw #0x0700,%sr | INTERRUPTS OFF!!! + + + + | + | zero out uninitialized data area + | +zerobss: + moveal #end,%a0 | find end of .bss + moveal #_bss_start,%a1 | find beginning of .bss + movel #0,%d0 + +loop: movel #0,%a1@+ | to zero out uninitialized + cmpal %a0,%a1 + jlt loop | loop until _end reached + + movel #heap_size,__C_heap_size | set ___C_heap_size + movel #heap_memory,__C_heap_start | set ___C_heap_start + moveal #interrupt_stack_end,%a0 | set interrupt stack pointer + movec %a0,%isp + moveal #stack_end,%a0 | set master stack pointer + movec %a0,%msp + moveal #stack_end,%a6 | set base pointer + movw #0x3000,%sr | SUPV MODE,INTERRUPTS ON!!! + +#ifdef NEED_UNDERSCORES + jsr __Board_Initialize | initialize the board +#else + jsr _Board_Initialize | initialize the board +#endif + + move.l #0,%sp@- | envp = NULL + move.l #0,%sp@- | argv = NULL + move.l #0,%sp@- | argc = NULL +#ifdef NEED_UNDERSCORES + jsr ___libc_init | initialize the library and + | call main +#else + jsr __libc_init | initialize the library and + | call main +#endif + add.l #12,%sp + + move.l #0,%sp@- | argc = NULL + jsr __exit | call the Board specific exit + addq.l #4,%sp + + move.l initial_isp,%a0 | if __exit returns then we can + movec %a0,%isp | restore the initial values + move.l initial_usp,%a0 + movec %a0,%usp + move.l initial_msp,%a0 + movec %a0,%msp + move.w initial_sr,%sr + rts + + + .bss + +/* + * So initial stack registers and status register can be saved. + */ + +#define DECLARE_SPACE(_name,_space,_align) \ + .globl _name ; \ + .align _align ; \ +_name##: .space _space + +#define DECLARE_LABEL(_name) \ + .globl _name ; \ +_name##: + +#define DECLARE_PTR(_name) DECLARE_SPACE(_name,4,2) +#define DECLARE_U32(_name) DECLARE_SPACE(_name,4,2) +#define DECLARE_U16(_name) DECLARE_SPACE(_name,2,1) + +DECLARE_U32(initial_isp) +DECLARE_U32(initial_msp) +DECLARE_U32(initial_usp) +DECLARE_U16(initial_sr) + +/* + * Require environment stuff + */ + +DECLARE_LABEL(_environ) +DECLARE_PTR(environ) + +DECLARE_LABEL(__errno) +DECLARE_LABEL(_errno) +DECLARE_U32(errno) + +/* + * Stack Size and Space + */ + + .set stack_size, 0x20000 + +DECLARE_SPACE(stack_memory,stack_size,4) +DECLARE_LABEL(stack_end) + +DECLARE_SPACE(interrupt_stack_memory,0x1000,4) +DECLARE_LABEL(interrupt_stack_end) diff --git a/ports/sysdeps/standalone/open.c b/ports/sysdeps/standalone/open.c new file mode 100644 index 000000000..e0a343241 --- /dev/null +++ b/ports/sysdeps/standalone/open.c @@ -0,0 +1,125 @@ +/* Copyright (C) 1994, 1995, 1996, 1997, 2002 Free Software Foundation, Inc. + Ported to standalone by Joel Sherrill jsherril@redstone-emh2.army.mil, + On-Line Applications Research Corporation. + 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. */ + +#include <errno.h> +#include <fcntl.h> +#include <stdarg.h> +#include <stddef.h> + +#include <stdio.h> +#include <bits/stdio_lim.h> +#include <unistd.h> + +#define __DECLARE_FILE_DESCRIPTORS__ + +#include "filedesc.h" + +/* Open FILE with access OFLAG. If OFLAG includes O_CREAT, + a third argument is the file protection. */ +int +__open (file, oflag) + const char *file; + int oflag; +{ + int mode; + int newfd; + int index; + + if (file == NULL) + { + __set_errno (EINVAL); + return -1; + } + + if (oflag & O_CREAT) + { + va_list arg; + va_start(arg, oflag); + mode = va_arg(arg, int); + va_end(arg); + } + + /* + * Find an open slot. + */ + + newfd = -1; + + for ( index=0 ; index< FOPEN_MAX ; index++ ) + if ( !__FD_Table[ index ].in_use ) { + newfd = index; + break; + } + + if ( newfd == -1 ) { + __set_errno (ENFILE); + return -1; + } + + /* + * Initialize the open slot + */ + + __FD_Table[ newfd ].in_use = 1; + __FD_Table[ newfd ].flags = oflag; + + return newfd; +} +libc_hidden_def (__open) + +/* Initialization Code for Console I/O */ + +#ifdef HAVE_GNU_LD +static +#endif +void +__NONE_init_console_io (argc, argv, envp) + int argc; + char **argv; + char **envp; +{ + int index; + + for ( index=0 ; index< FOPEN_MAX ; index++ ) + __FD_Table[ index ].in_use = 0; + + stdin = fopen( "", "r" ); + + stdout = fopen( "", "w" ); + + stderr = fopen( "", "w" ); + + /* + * Line buffer the standard input and output and use no buffering for + * standard error. + */ + + setvbuf( stdin, NULL, _IOLBF, BUFSIZ ); + setvbuf( stdout, NULL, _IOLBF, BUFSIZ ); + setvbuf( stderr, NULL, _IONBF, BUFSIZ ); + + (void) &__NONE_init_console_io; /* Avoid "defined but not used" warning. */ +} + +#ifdef HAVE_GNU_LD +text_set_element (__libc_subinit, __NONE_init_console_io); +#endif + +weak_alias (__open, open) diff --git a/ports/sysdeps/standalone/read.c b/ports/sysdeps/standalone/read.c new file mode 100644 index 000000000..0fb9e7a1e --- /dev/null +++ b/ports/sysdeps/standalone/read.c @@ -0,0 +1,86 @@ +/* Copyright (C) 1994, 1995, 1996, 1997, 2002 Free Software Foundation, Inc. + Ported to standalone by Joel Sherrill jsherril@redstone-emh2.army.mil, + On-Line Applications Research Corporation. + 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. */ + +#include <errno.h> +#include <unistd.h> +#include <stddef.h> + +#include "filedesc.h" +#include <fcntl.h> +#include <standalone.h> + +/* Read NBYTES into BUF from FD. Return the number read or -1. */ +ssize_t +__libc_read (int fd, void *buf, size_t nbytes) +{ + char *buffer = (char *) buf; + int data; + int poll; + + __set_errno (0); + + if (nbytes == 0) + return 0; + + if ( !__FD_Is_valid( fd ) || !__FD_Table[ fd ].in_use ) + { + __set_errno (EBADF); + return -1; + } + if (buf == NULL) + { + __set_errno (EINVAL); + return -1; + } + + if ( __FD_Table[ fd ].flags & O_WRONLY ) /* is it write only? */ + { + __set_errno (EBADF); + return -1; + } + + /* If this is a non-blocking fd, then we want to poll the console. */ + + poll = ( __FD_Table[ fd ].flags & O_NONBLOCK ) ? 1 : 0; + + /* Read a single character. This is a cheap way to insure that the + upper layers get every character because _Console_Getc can't timeout + or otherwise know when to stop. */ + + + data = _Console_Getc(poll); + + if ( data == -1 ) /* if no data return */ + return -1; + + (void) _Console_Putc(data); /* echo the character */ + + if ( data == '\r' ) { /* translate CR -> CR/LF */ + (void) _Console_Putc('\n'); + data = '\n'; + } + + *buffer = data; + return 1; +} +libc_hidden_def (__libc_read) +weak_alias (__libc_read, __read) +libc_hidden_weak (__read) +weak_alias (__libc_read, read) diff --git a/ports/sysdeps/standalone/standalone.h b/ports/sysdeps/standalone/standalone.h new file mode 100644 index 000000000..20a0c3380 --- /dev/null +++ b/ports/sysdeps/standalone/standalone.h @@ -0,0 +1,31 @@ +/* Copyright (C) 1994, 1997, 2004 Free Software Foundation, Inc. + Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil), + On-Line Applications Research Corporation. + 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 _STANDALONE_H +#define _STANDALONE_H + +#include <sys/cdefs.h> + +extern void _Board_Initialize (void); + +extern int _Console_Putc (char c); +extern int _Console_Getc (int poll); + +#endif diff --git a/ports/sysdeps/standalone/write.c b/ports/sysdeps/standalone/write.c new file mode 100644 index 000000000..5d3823065 --- /dev/null +++ b/ports/sysdeps/standalone/write.c @@ -0,0 +1,73 @@ +/* Copyright (C) 1994, 1995, 1996, 1997, 2002 Free Software Foundation, Inc. + Ported to standalone by Joel Sherrill jsherril@redstone-emh2.army.mil, + On-Line Applications Research Corporation. + 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. */ + +#include <sysdep.h> +#include <errno.h> +#include <unistd.h> +#include <stddef.h> + +#include "filedesc.h" +#include <fcntl.h> +#include <standalone.h> + +/* Write NBYTES of BUF to FD. Return the number written, or -1. */ +ssize_t +__libc_write (int fd, const void *buf, size_t nbytes) +{ + int count; + const char *data = buf; + + if (nbytes == 0) + return 0; + if ( !__FD_Is_valid( fd ) || !__FD_Table[ fd ].in_use ) + { + __set_errno (EBADF); + return -1; + } + if (buf == NULL) + { + __set_errno (EINVAL); + return -1; + } + + if ( !(__FD_Table[ fd ].flags & (O_WRONLY|O_RDWR)) ) /* is it writeable? */ + { + __set_errno (EBADF); + return -1; + } + + /* + * All open file descriptors are mapped to the console. + */ + + for ( count=0 ; count != nbytes ; count++ ) { + if ( _Console_Putc(data[ count ]) == -1 ) + return -1; + if ( data[count] == '\n' && _Console_Putc('\r') == -1 ) + return -1; + } + + return count; +} + +libc_hidden_def (__libc_write) +weak_alias (__libc_write, __write) +libc_hidden_weak (__write) +weak_alias (__libc_write, write) diff --git a/ports/sysdeps/tahoe/Implies b/ports/sysdeps/tahoe/Implies new file mode 100644 index 000000000..5a3163701 --- /dev/null +++ b/ports/sysdeps/tahoe/Implies @@ -0,0 +1,2 @@ +# A Tahoe is mostly just like a Vax. +vax diff --git a/ports/sysdeps/unix/am33/sysdep.S b/ports/sysdeps/unix/am33/sysdep.S new file mode 100644 index 000000000..d6df22ed6 --- /dev/null +++ b/ports/sysdeps/unix/am33/sysdep.S @@ -0,0 +1,64 @@ +/* Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000, 2001 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com>. + Based on ../i386/sysdep.S. + + 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. */ + +#include <sysdep.h> +#define _ERRNO_H +#include <bits/errno.h> + +.globl C_SYMBOL_NAME(errno) +.globl syscall_error + +#undef syscall_error +#ifdef NO_UNDERSCORES +__syscall_error: +#else +syscall_error: +#endif +#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN + /* We translate the system's EWOULDBLOCK error into EAGAIN. + The GNU C library always defines EWOULDBLOCK==EAGAIN. + EWOULDBLOCK_sys is the original number. */ + cmp EWOULDBLOCK_sys,d0 /* Is it the old EWOULDBLOCK? */ + bne .Lnotb /* Branch if not. */ + mov EAGAIN,d0 /* Yes; translate it to EAGAIN. */ +.Lnotb: +#endif +#ifndef PIC +# ifndef _LIBC_REENTRANT + mov d0,(C_SYMBOL_NAME (errno)) +# else + movm [d2],(sp) + add -12,sp + mov d0,d2 + call __errno_location,[],0 + mov d2,(a0) + add 12,sp + movm (sp),[d2] +# endif +#else +# error "This shouldn't be assembled for PIC" +#endif + mov -1,d0 + mov d0,a0 + ret + +#undef __syscall_error +END (__syscall_error) diff --git a/ports/sysdeps/unix/am33/sysdep.h b/ports/sysdeps/unix/am33/sysdep.h new file mode 100644 index 000000000..11578e760 --- /dev/null +++ b/ports/sysdeps/unix/am33/sysdep.h @@ -0,0 +1,33 @@ +/* Copyright 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com>. + Based on ../i386/sysdep.h. + + 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. */ + +#include <sysdeps/unix/sysdep.h> +#include "../../am33/sysdep.h" + +#ifdef __ASSEMBLER__ + +#define r0 d0 /* Normal return-value register. */ +#define r1 !!!! /* Secondary return-value register. */ +#define scratch d1 /* Call-clobbered register for random use. */ +#define MOVE(x,y) mov x, y + +#define ret ret [],0 + +#endif /* __ASSEMBLER__ */ diff --git a/ports/sysdeps/unix/bsd/hp/Dist b/ports/sysdeps/unix/bsd/hp/Dist new file mode 100644 index 000000000..ccd3a610e --- /dev/null +++ b/ports/sysdeps/unix/bsd/hp/Dist @@ -0,0 +1 @@ +m68k/dl-brk.S diff --git a/ports/sysdeps/unix/bsd/hp/m68k/brk.S b/ports/sysdeps/unix/bsd/hp/m68k/brk.S new file mode 100644 index 000000000..037d4d0d0 --- /dev/null +++ b/ports/sysdeps/unix/bsd/hp/m68k/brk.S @@ -0,0 +1,46 @@ +/* Copyright (C) 1991, 1993, 1994, 1995, 1997 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. */ + +#include <sysdep.h> + +#ifndef SYS_brk +#define SYS_brk 17 +#endif + +#ifndef HAVE_GNU_LD +#define __end _end +#endif + +.data +.globl ___curbrk +___curbrk: + .long __end + +.text +ENTRY (__brk) + movel #__end, d0 + cmpl sp@(4), d0 + ble 0f + movel d0, sp@(4) +0: DO_CALL (#SYS_brk, 1) + movel sp@(4), ___curbrk + clrl d0 + rts +error: jmp syscall_error + +weak_alias (__brk, brk) diff --git a/ports/sysdeps/unix/bsd/hp/m68k/dl-brk.S b/ports/sysdeps/unix/bsd/hp/m68k/dl-brk.S new file mode 100644 index 000000000..eeb96544e --- /dev/null +++ b/ports/sysdeps/unix/bsd/hp/m68k/dl-brk.S @@ -0,0 +1 @@ +#include <brk.S> diff --git a/ports/sysdeps/unix/bsd/hp/m68k/start.c b/ports/sysdeps/unix/bsd/hp/m68k/start.c new file mode 100644 index 000000000..e04ca0632 --- /dev/null +++ b/ports/sysdeps/unix/bsd/hp/m68k/start.c @@ -0,0 +1,10 @@ +/* hp300 4.3 BSD starts at 4, rather than 0, when the start address is 0. + Go figure. */ +asm(".globl __start"); +asm("__start: .long 0"); + +#define _start __start0 + +#define DUMMIES dummy0 + +#include <sysdeps/unix/start.c> diff --git a/ports/sysdeps/unix/bsd/hp/m68k/sysdep.h b/ports/sysdeps/unix/bsd/hp/m68k/sysdep.h new file mode 100644 index 000000000..75aee674f --- /dev/null +++ b/ports/sysdeps/unix/bsd/hp/m68k/sysdep.h @@ -0,0 +1,56 @@ +/* Copyright (C) 1991, 92, 93, 94, 95, 97 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. */ + +/* This code wants to be run through m4. */ + +#include <sysdeps/unix/sysdep.h> + +#ifdef __ASSEMBLER__ + +#define POUND # + +#ifdef __STDC__ +#define ENTRY(name) \ + .globl _##name; \ + .even; \ + _##name##: +#else +#define ENTRY(name) \ + .globl _/**/name; \ + .even; \ + _/**/name/**/: +#endif + +#define PSEUDO(name, syscall_name, args) \ + .even; \ + .globl syscall_error; \ + error: jmp syscall_error; \ + ENTRY (name) \ + DO_CALL (POUND SYS_ify (syscall_name), args) + +#define DO_CALL(syscall, args) \ + movel syscall, d0; \ + trap POUND 0; \ + bcs error + +#define ret rts +#define r0 d0 +#define r1 d1 +#define MOVE(x,y) movel x , y + +#endif /* __ASSEMBLER__ */ diff --git a/ports/sysdeps/unix/bsd/hp/m68k/vfork.S b/ports/sysdeps/unix/bsd/hp/m68k/vfork.S new file mode 100644 index 000000000..abcc1c338 --- /dev/null +++ b/ports/sysdeps/unix/bsd/hp/m68k/vfork.S @@ -0,0 +1,56 @@ +/* Copyright (C) 1991, 1994, 1995, 1997, 2002 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. */ + +#include <sysdep.h> + +#ifndef SYS_vfork +#define SYS_vfork 66 +#endif + +/* Clone the calling process, but without copying the whole address space. + The calling process is suspended until the new process exits or is + replaced by a call to `execve'. Return -1 for errors, 0 to the new process, + and the process ID of the new process to the old process. */ +.globl ___vfork +___vfork: + /* Pop the return PC value into A0. */ + moveal sp@+, a0 + + /* Stuff the syscall number in D0 and trap into the kernel. */ + movel #SYS_vfork, d0 + trap #0 + bcs error /* Branch forward if it failed. */ + + /* It succeeded. See which fork we're in. D1 is now 0 for the + parent and 1 for the child. Decrement it to make it -1 (all + bits set) for the parent, and 0 (no bits set) for the child. + Then AND it with D0, so the parent gets D0&-1==R0, and the child + gets D0&0==0. */ + subl #1, d1 + andl d1, d0 + + /* Jump to the return PC. */ + jmp a0@ + +error: + movel d0, _errno + moveq #-1, d0 + jmp a0@ +libc_hidden_def (__vfork) + +weak_alias (__vfork, vfork) diff --git a/ports/sysdeps/unix/bsd/hp/m68k/wait3.S b/ports/sysdeps/unix/bsd/hp/m68k/wait3.S new file mode 100644 index 000000000..5b6319182 --- /dev/null +++ b/ports/sysdeps/unix/bsd/hp/m68k/wait3.S @@ -0,0 +1,39 @@ +/* Copyright (C) 1991, 1992, 1995, 1997 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. */ + +#include <sysdep.h> + +ENTRY(__wait3) + movel sp@(8), d1 + moveal sp@(12), a0 + movel #SYS_wait, d0 + /* Set all condition codes to tell the kernel this is wait3. */ + movew #31, ccr + trap #0 + bcs error + + tstl sp@(4) + beq 1f + moveal sp@(4), a0 + movel d1, a0@ +1: rts + +.globl syscall_error +error: jmp syscall_error + +weak_alias (__wait3, wait3) diff --git a/ports/sysdeps/unix/bsd/osf/Dist b/ports/sysdeps/unix/bsd/osf/Dist new file mode 100644 index 000000000..e792f44bd --- /dev/null +++ b/ports/sysdeps/unix/bsd/osf/Dist @@ -0,0 +1 @@ +alpha/dl-brk.S diff --git a/ports/sysdeps/unix/bsd/osf/Implies b/ports/sysdeps/unix/bsd/osf/Implies new file mode 100644 index 000000000..82719f5a5 --- /dev/null +++ b/ports/sysdeps/unix/bsd/osf/Implies @@ -0,0 +1,2 @@ +# OSF/1 has the canonical set of <sys/mman.h> system calls. +unix/mman diff --git a/ports/sysdeps/unix/bsd/osf/Makefile b/ports/sysdeps/unix/bsd/osf/Makefile new file mode 100644 index 000000000..743788a41 --- /dev/null +++ b/ports/sysdeps/unix/bsd/osf/Makefile @@ -0,0 +1,3 @@ +# Without -non_shared (via the compiler's -static flag), we'll end up +# with some unresolved symbols wrt exceptions. +LDFLAGS := $(LDFLAGS) -static diff --git a/ports/sysdeps/unix/bsd/osf/alpha/bits/stat.h b/ports/sysdeps/unix/bsd/osf/alpha/bits/stat.h new file mode 100644 index 000000000..20f358f70 --- /dev/null +++ b/ports/sysdeps/unix/bsd/osf/alpha/bits/stat.h @@ -0,0 +1,79 @@ +/* Copyright (C) 1993, 1996, 1997, 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 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 _SYS_STAT_H +# error "Never include <bits/stat.h> directly; use <sys/stat.h> instead." +#endif + +#include <bits/types.h> + +/* Structure describing file characteristics. */ +struct stat + { + int st_dev; /* Device. */ + unsigned int st_ino; /* File serial number. */ + unsigned int st_mode; /* File mode. */ + unsigned short st_nlink; /* Link count. */ + unsigned int st_uid; /* User ID of the file's owner. */ + unsigned int st_gid; /* Group ID of the file's group.*/ + int st_rdev; /* Device number, if device. */ + + long st_size; /* Size of file, in bytes. */ + + int st_atime; /* Time of last access. */ + int st_atime_usec; + int st_mtime; /* Time of last modification. */ + int st_mtime_usec; + int st_ctime; /* Time of last status change. */ + int st_ctime_usec; + + __blksize_t st_blksize; /* Optimal block size for I/O. */ +#define _STATBUF_ST_BLKSIZE /* Tell code we have this member. */ + + __blkcnt_t st_blocks; /* Number of 512-byte blocks allocated. */ + unsigned int st_flags; + unsigned int st_gen; + }; + +/* Encoding of the file mode. */ + +#define __S_IFMT 0170000 /* These bits determine file type. */ + +/* File types. */ +#define __S_IFDIR 0040000 /* Directory. */ +#define __S_IFCHR 0020000 /* Character device. */ +#define __S_IFBLK 0060000 /* Block device. */ +#define __S_IFREG 0100000 /* Regular file. */ +#define __S_IFIFO 0010000 /* FIFO. */ + +#define __S_IFLNK 0120000 /* Symbolic link. */ +#define __S_IFSOCK 0140000 /* Socket. */ + +/* POSIX.1b objects. */ +#define __S_TYPEISMQ(buf) (0) +#define __S_TYPEISSEM(buf) (0) +#define __S_TYPEISSHM(buf) (0) + +/* Protection bits. */ + +#define __S_ISUID 04000 /* Set user ID on execution. */ +#define __S_ISGID 02000 /* Set group ID on execution. */ +#define __S_ISVTX 01000 /* Save swapped text after use (sticky). */ +#define __S_IREAD 0400 /* Read by owner. */ +#define __S_IWRITE 0200 /* Write by owner. */ +#define __S_IEXEC 0100 /* Execute by owner. */ diff --git a/ports/sysdeps/unix/bsd/osf/alpha/brk.S b/ports/sysdeps/unix/bsd/osf/alpha/brk.S new file mode 100644 index 000000000..51abaa6c1 --- /dev/null +++ b/ports/sysdeps/unix/bsd/osf/alpha/brk.S @@ -0,0 +1,54 @@ +/* Copyright (C) 1993, 1995, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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. */ + +#include <sysdep.h> + +#ifndef SYS_brk +#define SYS_brk 17 +#endif + +#ifndef HAVE_GNU_LD +#define __end end +#endif + +.data + .extern __end,8 + .globl __curbrk +__curbrk: + .quad __end + +.text +ENTRY(__brk) + /* FIXME We do not check for asking for less than a page yet. */ + ldiq v0, SYS_brk + call_pal PAL_callsys + bne a3, error + + /* Update __curbrk and exit cleanly. */ +/* ldgp gp, 0(t12) */ + stq a0, __curbrk + + mov zero, v0 + ret + /* What a horrible way to die. */ +error: ldgp gp,0(gp) + jmp zero,syscall_error + .end __brk + +weak_alias (__brk, brk) diff --git a/ports/sysdeps/unix/bsd/osf/alpha/dl-brk.S b/ports/sysdeps/unix/bsd/osf/alpha/dl-brk.S new file mode 100644 index 000000000..eeb96544e --- /dev/null +++ b/ports/sysdeps/unix/bsd/osf/alpha/dl-brk.S @@ -0,0 +1 @@ +#include <brk.S> diff --git a/ports/sysdeps/unix/bsd/osf/alpha/fork.S b/ports/sysdeps/unix/bsd/osf/alpha/fork.S new file mode 100644 index 000000000..a4ec14b56 --- /dev/null +++ b/ports/sysdeps/unix/bsd/osf/alpha/fork.S @@ -0,0 +1,28 @@ +/* Copyright (C) 1993, 1995, 1997, 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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. */ + +#include <sysdep.h> + +SYSCALL__ (fork, 0) + cmovne a4, 0, v0 + ret + .end __fork +libc_hidden_def (__fork) + +weak_alias (__fork, fork) diff --git a/ports/sysdeps/unix/bsd/osf/alpha/killpg.S b/ports/sysdeps/unix/bsd/osf/alpha/killpg.S new file mode 100644 index 000000000..741616bc7 --- /dev/null +++ b/ports/sysdeps/unix/bsd/osf/alpha/killpg.S @@ -0,0 +1,27 @@ +/* Copyright (C) 1993, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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. */ + +#include <sysdep.h> + +#include <sys/ult_syscall.h> +#define SYS_killpg SYS_ult_killpg + +SYSCALL (killpg, 2) + ret + .end killpg diff --git a/ports/sysdeps/unix/bsd/osf/alpha/recv.S b/ports/sysdeps/unix/bsd/osf/alpha/recv.S new file mode 100644 index 000000000..92a273d15 --- /dev/null +++ b/ports/sysdeps/unix/bsd/osf/alpha/recv.S @@ -0,0 +1,26 @@ +/* Copyright (C) 1991, 1992, 1997 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. */ + +#include <sysdep.h> + +#include <sys/ult_syscall.h> +#define SYS_recv SYS_ult_recv + +SYSCALL (recv, 4) + ret + .end recv diff --git a/ports/sysdeps/unix/bsd/osf/alpha/send.S b/ports/sysdeps/unix/bsd/osf/alpha/send.S new file mode 100644 index 000000000..7d61d46a1 --- /dev/null +++ b/ports/sysdeps/unix/bsd/osf/alpha/send.S @@ -0,0 +1,26 @@ +/* Copyright (C) 1991, 1992, 1997 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. */ + +#include <sysdep.h> + +#include <sys/ult_syscall.h> +#define SYS_send SYS_ult_send + +SYSCALL (send, 4) + ret + .end send diff --git a/ports/sysdeps/unix/bsd/osf/alpha/sigblock.S b/ports/sysdeps/unix/bsd/osf/alpha/sigblock.S new file mode 100644 index 000000000..5db55f447 --- /dev/null +++ b/ports/sysdeps/unix/bsd/osf/alpha/sigblock.S @@ -0,0 +1,29 @@ +/* Copyright (C) 1994, 1995, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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. */ + +#include <sysdep.h> + +#include <sys/ult_syscall.h> +#define SYS_sigblock SYS_ult_sigblock + +SYSCALL__ (sigblock, 1) + ret + .end __sigblock + +weak_alias (__sigblock, sigblock) diff --git a/ports/sysdeps/unix/bsd/osf/alpha/sigpause.S b/ports/sysdeps/unix/bsd/osf/alpha/sigpause.S new file mode 100644 index 000000000..764636647 --- /dev/null +++ b/ports/sysdeps/unix/bsd/osf/alpha/sigpause.S @@ -0,0 +1,30 @@ +/* Copyright (C) 1993,95,97,2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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. */ + +#include <sysdep.h> + +#include <sys/ult_syscall.h> +#define SYS_sigpause SYS_ult_sigpause + +SYSCALL__ (sigpause, 1) + ret + .end __sigpause +libc_hidden_def (__sigpause) + +weak_alias (__sigpause, sigpause) diff --git a/ports/sysdeps/unix/bsd/osf/alpha/sigsetmask.S b/ports/sysdeps/unix/bsd/osf/alpha/sigsetmask.S new file mode 100644 index 000000000..93333aa0b --- /dev/null +++ b/ports/sysdeps/unix/bsd/osf/alpha/sigsetmask.S @@ -0,0 +1,29 @@ +/* Copyright (C) 1993, 1995, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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. */ + +#include <sysdep.h> + +#include <sys/ult_syscall.h> +#define SYS_sigsetmask SYS_ult_sigsetmask + +SYSCALL__ (sigsetmask, 1) + ret + .end __sigsetmask + +weak_alias (__sigsetmask, sigsetmask) diff --git a/ports/sysdeps/unix/bsd/osf/alpha/sigvec.S b/ports/sysdeps/unix/bsd/osf/alpha/sigvec.S new file mode 100644 index 000000000..45fcc58a0 --- /dev/null +++ b/ports/sysdeps/unix/bsd/osf/alpha/sigvec.S @@ -0,0 +1,29 @@ +/* Copyright (C) 1993, 1995, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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. */ + +#include <sysdep.h> + +#include <sys/ult_syscall.h> +#define SYS_sigvec SYS_ult_sigvec + +SYSCALL__ (sigvec, 3) + ret + .end __sigvec + +weak_alias (__sigvec, sigvec) diff --git a/ports/sysdeps/unix/bsd/osf/alpha/start.S b/ports/sysdeps/unix/bsd/osf/alpha/start.S new file mode 100644 index 000000000..1fa52a643 --- /dev/null +++ b/ports/sysdeps/unix/bsd/osf/alpha/start.S @@ -0,0 +1,83 @@ +/* Copyright (C) 1993, 1995, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The GNU Lesser General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + Note that people who make modified versions of this file are not + obligated to grant this special exception for their modified + versions; it is their choice whether to do so. The GNU Lesser + General Public License gives permission to release a modified + version without this exception; this exception also makes it + possible to release a modified version which carries forward this + exception. + + 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. */ + +#include <sysdep.h> + +#if 0 +.sdata +.globl STARTFRM +STARTFRM = 0 +#endif + +.text +ENTRY(__start) + lda sp, -16(sp) + stq zero, 8(sp) + + /* This branch puts the address of the current insn in t0. */ + br t0, 10f +10: + /* We set the GP register by using the address of the ldgp */ + /* (what we just put into t0). */ + ldgp gp, 0(t0) + + /* get argc */ + ldl a0, 16(sp) + + /* get argv */ + lda a1, 24(sp) + + /* move ahead to envp */ + s8addq a0, a1, a2 + addq a2, 0x8, a2 + + /* Store in environ. */ + stq a2, environ + + /* Clear out errno. */ +/* ldgp gp, 0(t12) */ + stl zero, errno + + /* Call main. */ + jsr ra, main + ldgp gp, 0(ra) + + mov v0, a0 + + jsr ra, exit + ldgp gp, 0(ra) + + .end __start diff --git a/ports/sysdeps/unix/bsd/osf/alpha/syscalls.list b/ports/sysdeps/unix/bsd/osf/alpha/syscalls.list new file mode 100644 index 000000000..ac883925e --- /dev/null +++ b/ports/sysdeps/unix/bsd/osf/alpha/syscalls.list @@ -0,0 +1,3 @@ +# File name Caller Syscall name # args Strong name Weak names + +wait4 - wait4 4 __wait4 wait4 diff --git a/ports/sysdeps/unix/bsd/osf/alpha/sysdep.h b/ports/sysdeps/unix/bsd/osf/alpha/sysdep.h new file mode 100644 index 000000000..84ac541aa --- /dev/null +++ b/ports/sysdeps/unix/bsd/osf/alpha/sysdep.h @@ -0,0 +1,30 @@ +/* Copyright (C) 1993, 1995, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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. */ + +/* OSF/1 does not precede the asm names of C symbols with a `_'. */ +#define NO_UNDERSCORES + +#include <sysdeps/unix/alpha/sysdep.h> + +#ifdef __ASSEMBLER__ + +#include <machine/pal.h> /* get PAL_callsys */ +#include <regdef.h> + +#endif diff --git a/ports/sysdeps/unix/bsd/osf/alpha/vhangup.S b/ports/sysdeps/unix/bsd/osf/alpha/vhangup.S new file mode 100644 index 000000000..3c2b04af7 --- /dev/null +++ b/ports/sysdeps/unix/bsd/osf/alpha/vhangup.S @@ -0,0 +1,26 @@ +/* Copyright (C) 1991, 1992, 1997 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. */ + +#include <sysdep.h> + +#include <sys/ult_syscall.h> +#define SYS_vhangup SYS_ult_vhangup + +SYSCALL (vhangup, 1) + ret + .end vhangup diff --git a/ports/sysdeps/unix/bsd/osf/alpha/waitpid.c b/ports/sysdeps/unix/bsd/osf/alpha/waitpid.c new file mode 100644 index 000000000..8378982ac --- /dev/null +++ b/ports/sysdeps/unix/bsd/osf/alpha/waitpid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/bsd/bsd4.4/waitpid.c> diff --git a/ports/sysdeps/unix/bsd/osf/bits/mman.h b/ports/sysdeps/unix/bsd/osf/bits/mman.h new file mode 100644 index 000000000..d4672ccca --- /dev/null +++ b/ports/sysdeps/unix/bsd/osf/bits/mman.h @@ -0,0 +1,71 @@ +/* Flags for BSD-style memory management. OSF/1 version. + Copyright (C) 1994, 1995, 1996, 1997, 1998 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 _BITS_MMAN_H +#define _BITS_MMAN_H 1 + +/* 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. */ + +/* Flags contain mapping type, sharing type and options. */ + +/* Mapping type (must choose one and only one of these). */ +#ifdef __USE_BSD +# define MAP_FILE 0x00 /* Mapped from a file or device. */ +# define MAP_ANON 0x10 /* Allocated from anonymous virtual memory. */ +# define MAP_ANONYMOUS MAP_ANON +# define MAP_TYPE 0xf0 /* Mask for type field. */ +#endif + +/* Sharing types (must choose one and only one of these). */ +#define MAP_SHARED 0x01 /* Share changes. */ +#define MAP_PRIVATE 0x02 /* Changes private; copy pages on write. */ + +/* Other flags. */ +#define MAP_FIXED 0x0100 /* Map address must be exactly as requested. */ +#ifdef __USE_BSD +# define MAP_VARIABLE 0 /* Absence of MAP_FIXED. */ +# define MAP_HASSEMPHORE 0x0200 /* Region may contain semaphores. */ +# define MAP_INHERIT 0x0400 /* Region is retained after exec. */ +# define MAP_UNALIGNED 0x0800 /* File offset need not be page-aligned. */ +#endif + +/* Advice to `madvise'. */ +#ifdef __USE_BSD +# define MADV_NORMAL 0 /* No further special treatment. */ +# define MADV_RANDOM 1 /* Expect random page references. */ +# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */ +# define MADV_WILLNEED 3 /* Will need these pages. */ +# define MADV_DONTNEED 4 /* Don't need these pages. */ +# define MADV_SPACEAVAIL 5 /* Ensure that resources are available. */ +#endif + +/* Flags to `msync'. */ +#define MS_ASYNC 1 /* Asynchronous cache flush. */ +#define MS_SYNC 3 /* Synchronous cache flush. */ +#define MS_INVALIDATE 4 /* Invalidate cached pages. */ + +#endif /* bits/mman.h */ diff --git a/ports/sysdeps/unix/bsd/osf/bits/sigaction.h b/ports/sysdeps/unix/bsd/osf/bits/sigaction.h new file mode 100644 index 000000000..13f9144fa --- /dev/null +++ b/ports/sysdeps/unix/bsd/osf/bits/sigaction.h @@ -0,0 +1,50 @@ +/* Structure and constant definitions for sigaction et al. OSF/1 version. + Copyright (C) 1993, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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 _SIGNAL_H +# error "Never include <bits/sigaction.h> directly; use <signal.h> instead." +#endif + +/* Structure describing the action to be taken when a signal arrives. */ +struct sigaction + { + /* Signal handler. */ + __sighandler_t sa_handler; + + /* Additional set of signals to be blocked. */ + __sigset_t sa_mask; + + /* Special flags. */ + int sa_flags; + }; + +/* Bits in `sa_flags'. */ +#ifdef __USE_BSD +# define SA_ONSTACK 0x1 /* Take signal on signal stack. */ +# define SA_RESTART 0x2 /* Restart syscall on signal return. */ +# define SA_DISABLE 0x4 /* Disable alternate signal stack. */ +#endif +#define SA_NOCLDSTOP 0x4 /* Don't send SIGCHLD when children stop. */ + + +/* Values for the HOW argument to `sigprocmask'. */ +#define SIG_BLOCK 1 /* Block signals. */ +#define SIG_UNBLOCK 2 /* Unblock signals. */ +#define SIG_SETMASK 3 /* Set the set of blocked signals. */ diff --git a/ports/sysdeps/unix/bsd/osf/syscalls.list b/ports/sysdeps/unix/bsd/osf/syscalls.list new file mode 100644 index 000000000..731763b3e --- /dev/null +++ b/ports/sysdeps/unix/bsd/osf/syscalls.list @@ -0,0 +1,3 @@ +# File name Caller Syscall name # args Strong name Weak names + +msync - msync 3 msync diff --git a/ports/sysdeps/unix/bsd/osf/system.c b/ports/sysdeps/unix/bsd/osf/system.c new file mode 100644 index 000000000..ef42ea215 --- /dev/null +++ b/ports/sysdeps/unix/bsd/osf/system.c @@ -0,0 +1,2 @@ +/* OSF/1 does have `waitpid'. Avoid unix/system.c, which says we don't. */ +#include <sysdeps/posix/system.c> diff --git a/ports/sysdeps/unix/bsd/sequent/i386/getgroups.S b/ports/sysdeps/unix/bsd/sequent/i386/getgroups.S new file mode 100644 index 000000000..55fa7288d --- /dev/null +++ b/ports/sysdeps/unix/bsd/sequent/i386/getgroups.S @@ -0,0 +1,44 @@ +/* Copyright (C) 1994, 1995, 1997 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. */ + +#include <sysdep.h> +#include <limits.h> + +/* Dynix erroneously reports `getgroups (0, 0)' as an error. + We fix up for that case. */ + +#define syscall_error myerror +SYSCALL__ (getgroups, 2) +#undef syscall_error + ret +myerror: + tstl 4(%esp) /* Was the first arg 0? */ + jnz syscall_error /* If not, go to the normal error case. */ + /* When called with (0, 0), we want to return the number of groups + without storing anything. The Dynix system call gives an error + for this case, so we fix up by calling it with a local array we + never use, and just use the return value. */ + subl %esp, $(NGROUPS_MAX * 4) /* Allocate a local array. */ + movl $NGROUPS_MAX, %ecx /* Pass NGROUPS_MAX for first arg. */ + movl %esp, %edx /* Pass local array for second arg. */ + DO_CALL (getgroups, 2) /* Do the system call. */ + addl %esp, $(NGROUPS_MAX * 4) /* Pop the local array. */ + jb syscall_error /* Check for error from the system call. */ + ret /* Return its value. */ + +weak_alias (__getgroups, getgroups) diff --git a/ports/sysdeps/unix/bsd/sequent/i386/sigvec.S b/ports/sysdeps/unix/bsd/sequent/i386/sigvec.S new file mode 100644 index 000000000..62373e131 --- /dev/null +++ b/ports/sysdeps/unix/bsd/sequent/i386/sigvec.S @@ -0,0 +1,45 @@ +/* Copyright (C) 1993, 1995, 1997 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. */ + +#include <sysdep.h> + +/* The Dynix `sigvec' system call takes an extra argument, + which is the address of the trampoline function. */ + +.text +.align 4 +trampoline: + cld /* Clear direction flag. */ + call %eax /* Call the handler, address in %eax. */ + addl $8, %esp /* Pop signum & code off the stack. */ + /* __sigreturn will restore the context, and never return here. */ + call C_SYMBOL_NAME (__sigreturn) + +.globl syscall_error +ENTRY (__sigvec) + pushl $trampoline /* Push fourth arg: trampoline address. */ + pushl 16(%esp) /* Push third arg: our third arg. */ + pushl 16(%esp) /* Push second arg: our second arg. */ + pushl 16(%esp) /* Push first arg: our first arg. */ + mov %esp, %ecx /* Point the syscall at the arguments. */ + addl $16, %esp /* Pop those four args. */ + DO_CALL (sigvec, 4) /* Do the system call. */ + jb syscall_error /* Check for error. */ + ret + +weak_alias (__sigvec, sigvec) diff --git a/ports/sysdeps/unix/bsd/sequent/i386/syscall.S b/ports/sysdeps/unix/bsd/sequent/i386/syscall.S new file mode 100644 index 000000000..9ff189885 --- /dev/null +++ b/ports/sysdeps/unix/bsd/sequent/i386/syscall.S @@ -0,0 +1,31 @@ +/* `syscall' function for Sequent Symmetry running Dynix version 3. + Copyright (C) 1994, 1997 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. */ + +#include <sysdep.h> + +.text +.globl syscall_error +.align 4 +ENTRY (syscall) + leal 8(%esp), %ecx /* Load address of second argument. */ + movl $SYS_HANDLER, %eax /* Use BSD system calls. */ + movw 4(%esp), %ax /* Load system call number into low word. */ + int $T_SVC6 /* Pretend it takes six args. */ + jb syscall_error + ret diff --git a/ports/sysdeps/unix/bsd/sequent/i386/sysdep.h b/ports/sysdeps/unix/bsd/sequent/i386/sysdep.h new file mode 100644 index 000000000..c3d9d919b --- /dev/null +++ b/ports/sysdeps/unix/bsd/sequent/i386/sysdep.h @@ -0,0 +1,82 @@ +/* System call interface code for Sequent Symmetry running Dynix version 3. + Copyright (C) 1993, 1995, 1997 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. */ + +#include <sysdeps/unix/i386/sysdep.h> + +#ifdef __ASSEMBLER__ + +/* Get the symbols for system call interrupts. */ +#include <machine/trap.h> + +/* Use the BSD versions of system calls, by setting the high 16 bits + of the syscall number (see /usr/include/syscall.h). */ +#define SYS_HANDLER (SYS_bsd << 16) + +/* Dynix uses an interrupt interface to system calls. + "int $T_SVCn" are syscall interfaces for 0-6 arg functions. + (see /usr/include/machine/trap.h). */ + +#undef DO_CALL + +#ifdef __STDC__ +#define DO_CALL(syscall_name, args) \ + movl $(SYS_HANDLER | SYS_##syscall_name), %eax; \ + int $T_SVC##args; +#else +#define DO_CALL(syscall_name, args) \ + movl $(SYS_HANDLER | SYS_/**/syscall_name), %eax; \ + int $T_SVC/**/args; +#endif + +#undef PSEUDO +#define PSEUDO(name, syscall_name, args) \ + .text; \ + .globl syscall_error; \ + .align 4; \ + ENTRY (name) \ + ARGS (args) \ + DO_CALL (syscall_name, args) \ + jb syscall_error + +/* For one and two-argument calls, Dynix takes the arguments in %ecx and + %edx. For 3-6 argument calls, Dynix takes the address of the first + argument in %ecx. */ + +#ifdef __STDC__ +#define ARGS(n) ARGS_##n +#else +#define ARGS(n) ARGS_/**/n +#endif + +#define ARGS_0 +#define ARGS_1 movl 4(%esp), %ecx; +#define ARGS_2 movl 4(%esp), %ecx; movl 8(%esp), %edx; +#define ARGS_3 leal 4(%esp), %ecx; +#define ARGS_4 ARGS_3 +#define ARGS_5 ARGS_3 +#define ARGS_6 ARGS_3 + +/* Dynix reverses %ecx and %edx relative to most i386 Unices. */ + +#undef r1 +#define r1 %ecx /* Secondary return-value register. */ +#undef scratch +#define scratch %edx /* Call-clobbered register for random use. */ + +#endif /* __ASSEMBLER__ */ diff --git a/ports/sysdeps/unix/bsd/sony/newsos/m68k/Implies b/ports/sysdeps/unix/bsd/sony/newsos/m68k/Implies new file mode 100644 index 000000000..7b5f3cfc9 --- /dev/null +++ b/ports/sysdeps/unix/bsd/sony/newsos/m68k/Implies @@ -0,0 +1,2 @@ +# A news800 is almost exactly like an hp300 +unix/bsd/hp/m68k diff --git a/ports/sysdeps/unix/bsd/sony/newsos/m68k/sysdep.h b/ports/sysdeps/unix/bsd/sony/newsos/m68k/sysdep.h new file mode 100644 index 000000000..db124fa15 --- /dev/null +++ b/ports/sysdeps/unix/bsd/sony/newsos/m68k/sysdep.h @@ -0,0 +1,56 @@ +/* Copyright (C) 1993, 1994, 1995, 1997 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. */ + +#include <sysdeps/unix/sysdep.h> + +#ifdef __ASSEMBLER__ + +#define POUND # + +#ifdef __STDC__ +#define ENTRY(name) \ + .globl _##name; \ + .even; \ + _##name##: +#else +#define ENTRY(name) \ + .globl _/**/name; \ + .even; \ + _/**/name/**/: +#endif + +#define PSEUDO(name, syscall_name, args) \ + .even; \ + .globl syscall_error; \ + error: jmp syscall_error; \ + ENTRY (name) \ + DO_CALL (POUND SYS_ify (syscall_name), args) + +#define DO_CALL(syscall, args) \ + movel syscall, d0; \ + linkw a6, POUND(0); \ + trap POUND(0); \ + unlk a6; \ + bcs error + +#define ret rts +#define r0 d0 +#define r1 d1 +#define MOVE(x,y) movel x , y + +#endif diff --git a/ports/sysdeps/unix/bsd/sony/newsos4/Makefile b/ports/sysdeps/unix/bsd/sony/newsos4/Makefile new file mode 100644 index 000000000..053da568d --- /dev/null +++ b/ports/sysdeps/unix/bsd/sony/newsos4/Makefile @@ -0,0 +1,3 @@ +ifeq ($(subdir),posix) +sysdep_routines := $(sysdep_routines) sys_wait4 +endif diff --git a/ports/sysdeps/unix/bsd/sony/newsos4/syscalls.list b/ports/sysdeps/unix/bsd/sony/newsos4/syscalls.list new file mode 100644 index 000000000..b90087f42 --- /dev/null +++ b/ports/sysdeps/unix/bsd/sony/newsos4/syscalls.list @@ -0,0 +1,3 @@ +# File name Caller Syscall name # args Strong name Weak names + +sys_wait4 wait4 wait4 4 __wait4_syscall diff --git a/ports/sysdeps/unix/bsd/sony/newsos4/wait.c b/ports/sysdeps/unix/bsd/sony/newsos4/wait.c new file mode 100644 index 000000000..79d54580f --- /dev/null +++ b/ports/sysdeps/unix/bsd/sony/newsos4/wait.c @@ -0,0 +1 @@ +#include <sysdeps/unix/bsd/bsd4.4/wait.c> diff --git a/ports/sysdeps/unix/bsd/sony/newsos4/wait3.c b/ports/sysdeps/unix/bsd/sony/newsos4/wait3.c new file mode 100644 index 000000000..0b3bdee77 --- /dev/null +++ b/ports/sysdeps/unix/bsd/sony/newsos4/wait3.c @@ -0,0 +1 @@ +#include <sysdeps/unix/bsd/bsd4.4/wait3.c> diff --git a/ports/sysdeps/unix/bsd/sony/newsos4/wait4.c b/ports/sysdeps/unix/bsd/sony/newsos4/wait4.c new file mode 100644 index 000000000..856c99fd6 --- /dev/null +++ b/ports/sysdeps/unix/bsd/sony/newsos4/wait4.c @@ -0,0 +1 @@ +#include <sysdeps/unix/bsd/sun/sunos4/wait4.c> diff --git a/ports/sysdeps/unix/bsd/tahoe/Implies b/ports/sysdeps/unix/bsd/tahoe/Implies new file mode 100644 index 000000000..a7ecf5827 --- /dev/null +++ b/ports/sysdeps/unix/bsd/tahoe/Implies @@ -0,0 +1 @@ +unix/bsd/vax diff --git a/ports/sysdeps/unix/bsd/tahoe/sysdep.h b/ports/sysdeps/unix/bsd/tahoe/sysdep.h new file mode 100644 index 000000000..b87590632 --- /dev/null +++ b/ports/sysdeps/unix/bsd/tahoe/sysdep.h @@ -0,0 +1,5 @@ +/* The Tahoe is just like the Vax, except the + `chmk' instruction is called `kcall'. */ + +#define chmk kcall +#include <sysdeps/unix/bsd/vax/sysdep.h> diff --git a/ports/sysdeps/unix/bsd/ultrix4/Implies b/ports/sysdeps/unix/bsd/ultrix4/Implies new file mode 100644 index 000000000..b0e08ef1d --- /dev/null +++ b/ports/sysdeps/unix/bsd/ultrix4/Implies @@ -0,0 +1,2 @@ +# Ultrix 4 has the canonical set of <sys/mman.h> system calls. +unix/mman diff --git a/ports/sysdeps/unix/bsd/ultrix4/Makefile b/ports/sysdeps/unix/bsd/ultrix4/Makefile new file mode 100644 index 000000000..26b90346e --- /dev/null +++ b/ports/sysdeps/unix/bsd/ultrix4/Makefile @@ -0,0 +1,3 @@ +ifeq ($(subdir),posix) +sysdep_routines := $(sysdep_routines) getsysinfo +endif diff --git a/ports/sysdeps/unix/bsd/ultrix4/bits/fcntl.h b/ports/sysdeps/unix/bsd/ultrix4/bits/fcntl.h new file mode 100644 index 000000000..6392bc341 --- /dev/null +++ b/ports/sysdeps/unix/bsd/ultrix4/bits/fcntl.h @@ -0,0 +1,122 @@ +/* O_*, F_*, FD_* bit values for Ultrix 4. + Copyright (C) 1991, 1992, 1997, 2004 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 + + +/* File access modes for `open' and `fcntl'. */ +#define O_RDONLY 0 /* Open read-only. */ +#define O_WRONLY 1 /* Open write-only. */ +#define O_RDWR 2 /* Open read/write. */ + + +/* Bits OR'd into the second argument to open. */ +#define O_CREAT 0x0200 /* Create file if it doesn't exist. */ +#define O_EXCL 0x0800 /* Fail if file already exists. */ +#define O_TRUNC 0x0400 /* Truncate file to zero length. */ +#ifdef __USE_MISC +#define O_ASYNC 0x0040 /* Send SIGIO to owner when data is ready. */ +#define O_FSYNC 0x8000 /* Synchronous writes. */ +#define O_SYNC O_FSYNC +#define O_BLKINUSE 0x1000 /* Block if "in use". */ +#define O_BLKANDSET 0x3000 /* Block, test and set "in use" flag. */ +#define O_TERMIO 0x40000 /* "termio style program". */ +#endif +#define O_NOCTTY 0x80000 /* Don't assign a controlling terminal. */ + +/* File status flags for `open' and `fcntl'. */ +#define O_APPEND 0x0008 /* Writes append to the file. */ +#define O_NONBLOCK 0x20000 /* Non-blocking I/O. */ + +#ifdef __USE_BSD +#define O_NDELAY 0x0004 +#endif + +#ifdef __USE_BSD +/* Bits in the file status flags returned by F_GETFL. + These are all the O_* flags, plus FREAD and FWRITE, which are + independent bits set by which of O_RDONLY, O_WRONLY, and O_RDWR, was + given to `open'. */ +#define FREAD 1 +#define FWRITE 2 + +/* Traditional BSD names the O_* bits. */ +#define FASYNC O_ASYNC +#define FCREAT O_CREAT +#define FEXCL O_EXCL +#define FTRUNC O_TRUNC +#define FNOCTTY O_NOCTTY +#define FFSYNC O_FSYNC +#define FSYNC O_SYNC +#define FAPPEND O_APPEND +#define FNONBLOCK O_NONBLOCK +#define FNDELAY O_NDELAY +#define FNBLOCK O_NONBLOCK +#define FTERMIO O_TERMIO +#define FNOCTTY O_NOCTTY +#define FSYNCRON O_FSYNC +#define FBLKINUSE O_BLKINUSE +#define FBLKANDSET O_BLKANDSET +#endif + +/* Mask for file access modes. This is system-dependent in case + some system ever wants to define some other flavor of access. */ +#define O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR) + +/* 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. */ +#if defined __USE_BSD || defined __USE_UNIX98 +#define F_GETOWN 5 /* Get owner (receiver of SIGIO). */ +#define F_SETOWN 6 /* Set owner (receiver of SIGIO). */ +#endif +#define F_GETLK 7 /* Get record locking info. */ +#define F_SETLK 8 /* Set record locking info (non-blocking). */ +#define F_SETLKW 9 /* Set record locking info (blocking). */ +#ifdef __USE_MISC +#define F_SETSYN 10 /* Set synchronous writing. */ +#define F_CLRSYN 10 /* Clear synchronous writing. */ +#endif + +/* File descriptor flags used with F_GETFD and F_SETFD. */ +#define FD_CLOEXEC 1 /* Close on exec. */ + + +#include <bits/types.h> + +/* The structure describing an advisory lock. This is the type of the third + argument to `fcntl' for the F_GETLK, F_SETLK, and F_SETLKW requests. */ +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'). */ + __off_t l_start; /* Offset where the lock begins. */ + __off_t l_len; /* Size of the locked area; zero means until EOF. */ + __pid_t l_pid; /* Process holding the lock. */ + }; + +/* Values for the `l_type' field of a `struct flock'. */ +#define F_RDLCK 1 /* Read lock. */ +#define F_WRLCK 2 /* Write lock. */ +#define F_UNLCK 3 /* Remove lock. */ diff --git a/ports/sysdeps/unix/bsd/ultrix4/bits/mman.h b/ports/sysdeps/unix/bsd/ultrix4/bits/mman.h new file mode 100644 index 000000000..918b53563 --- /dev/null +++ b/ports/sysdeps/unix/bsd/ultrix4/bits/mman.h @@ -0,0 +1,51 @@ +/* Definitions for BSD-style memory management. Ultrix 4 version. + Copyright (C) 1994, 1995, 1996, 1997, 1998 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 _BITS_MMAN_H +#define _BITS_MMAN_H 1 + +/* 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 private; copy pages on write. */ +#ifdef __USE_BSD +# define MAP_TYPE 0x0f /* Mask for sharing type. */ +#endif + +/* Other flags. */ +#define MAP_FIXED 0x10 /* Map address must be exactly as requested. */ + +/* Advice to `madvise'. */ +#ifdef __USE_BSD +# define MADV_NORMAL 0 /* No further special treatment. */ +# define MADV_RANDOM 1 /* Expect random page references. */ +# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */ +# define MADV_WILLNEED 3 /* Will need these pages. */ +# define MADV_DONTNEED 4 /* Don't need these pages. */ +#endif + +#endif /* bits/mman.h */ diff --git a/ports/sysdeps/unix/bsd/ultrix4/bits/posix_opt.h b/ports/sysdeps/unix/bsd/ultrix4/bits/posix_opt.h new file mode 100644 index 000000000..aba6852e1 --- /dev/null +++ b/ports/sysdeps/unix/bsd/ultrix4/bits/posix_opt.h @@ -0,0 +1,24 @@ +/* Copyright (C) 1992, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ian Lance Taylor (ian@airs.com). + + 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. */ + +#define _POSIX_JOB_CONTROL 1 +#define _POSIX_SAVED_IDS 1 +#define _POSIX_CHOWN_RESTRICTED 1 +#define _POSIX_NO_TRUNC 1 +#define _POSIX_VDISABLE ((unsigned char) -1) diff --git a/ports/sysdeps/unix/bsd/ultrix4/bits/utsname.h b/ports/sysdeps/unix/bsd/ultrix4/bits/utsname.h new file mode 100644 index 000000000..57820471a --- /dev/null +++ b/ports/sysdeps/unix/bsd/ultrix4/bits/utsname.h @@ -0,0 +1,23 @@ +/* Copyright (C) 1997, 2002 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 _SYS_UTSNAME_H +# error "Never include <bits/utsname.h> directly; use <sys/utsname.h> instead." +#endif + +#define _UTSNAME_LENGTH 32 diff --git a/ports/sysdeps/unix/bsd/ultrix4/mips/Dist b/ports/sysdeps/unix/bsd/ultrix4/mips/Dist new file mode 100644 index 000000000..06cf9cc2d --- /dev/null +++ b/ports/sysdeps/unix/bsd/ultrix4/mips/Dist @@ -0,0 +1 @@ +__handler.S diff --git a/ports/sysdeps/unix/bsd/ultrix4/mips/Makefile b/ports/sysdeps/unix/bsd/ultrix4/mips/Makefile new file mode 100644 index 000000000..74e3b04f6 --- /dev/null +++ b/ports/sysdeps/unix/bsd/ultrix4/mips/Makefile @@ -0,0 +1,3 @@ +ifeq ($(subdir),signal) +sysdep_routines := $(sysdep_routines) __handler +endif diff --git a/ports/sysdeps/unix/bsd/ultrix4/mips/__handler.S b/ports/sysdeps/unix/bsd/ultrix4/mips/__handler.S new file mode 100644 index 000000000..2b815c46d --- /dev/null +++ b/ports/sysdeps/unix/bsd/ultrix4/mips/__handler.S @@ -0,0 +1,115 @@ +/* Copyright (C) 1992, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + Also hacked by Ian Lance Taylor (ian@airs.com). + + 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. */ + +#include <sysdep.h> + +/* This function saves all the registers, calls the + user function, and then executes a sigreturn system call. The + sigreturn call wants the address of a sigcontext structure. This + is all hideously system dependent and, for all intents and + purposes, undocumented. + + When we enter here, a3 holds the user's signal handler. We are + supposed to fill in the context given in a2, and then pass it and + the first two arguments to the user's function. If the user's + function returns, we execute a sigreturn system call. + + The sc_onstack, sc_mask and sc_pc elements of the context are + already set by the kernel. For some reason we don't have to save + the floating point state or the coprocessor state; the kernel may + have saved them for us, or it doesn't use them. */ + +.set noat +ENTRY (__handler) + /* Store zero and the asm temp reg. */ + sw $0, 12(a2) + sw AT, 16(a2) + + /* Put v1 in sc_regs[3]. */ + sw v1, 24(a2) + + /* Save the caller saved registers in sc_regs[8..15]. */ + sw t0, 44(a2) + sw t1, 48(a2) + sw t2, 52(a2) + sw t3, 56(a2) + sw t4, 60(a2) + sw t5, 64(a2) + sw t6, 68(a2) + sw t7, 72(a2) + + /* Save the callee saved registers in sc_regs[16..23]. */ + sw s0, 76(a2) + sw s1, 80(a2) + sw s2, 84(a2) + sw s3, 88(a2) + sw s4, 92(a2) + sw s5, 96(a2) + sw s6, 100(a2) + sw s7, 104(a2) + + /* Save the code generator registers in sc_regs[24] & sc_regs[25]. */ + sw t8, 108(a2) + sw t9, 112(a2) + + /* Save the kernel temp regs in sc_regs[26] & sc_regs[27]. */ + sw k0, 116(a2) + sw k1, 120(a2) + + /* Save the global pointer in sc_regs[28]. */ + sw gp, 124(a2) + + /* ... and also the return address in sc_regs[31]. */ + sw ra, 136(a2) + + /* Note: we don't save the stack pointer in sc_regs[29]; + instead, we use the one that was already there. */ +#if 0 + sw sp, 128(a2) +#endif + + /* Save the floating pointer in sc_regs[30]. */ + sw $fp, 132(a2) + + /* Save the mul/div stuff in sc_mdlo and sc_mdhi. */ + mflo t0 + sw t0, 140(a2) + mfhi t0 + sw t0, 144(a2) + + /* Move the stack up four. This will save the context. */ + addu sp, sp, -32 + sw a2, 16(sp) + + /* Call their handler with the signal, code, and context; note + this will clobber the context. */ + .set noreorder + jal ra, a3 + nop + .set reorder + + /* When we come back, restore the context and pass it right + on into sigreturn(). */ + lw a0, 16(sp) + + /* Do a sigreturn syscall; this doesn't return. */ + la v0, __sigreturn + jal ra, v0 + .end __handler diff --git a/ports/sysdeps/unix/bsd/ultrix4/mips/bits/sigcontext.h b/ports/sysdeps/unix/bsd/ultrix4/mips/bits/sigcontext.h new file mode 100644 index 000000000..367465137 --- /dev/null +++ b/ports/sysdeps/unix/bsd/ultrix4/mips/bits/sigcontext.h @@ -0,0 +1,63 @@ +/* Copyright (C) 1992, 1994, 1997 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 _SIGNAL_H +# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead." +#endif + +/* Note that ANY change to this instantly implies a change to __handler.S. */ + +struct sigcontext + { + /* Nonzero if running on signal stack. */ + int sc_onstack; + + /* Signal mask to restore. */ + __sigset_t sc_mask; + + /* Program counter when the signal hit. */ + __ptr_t sc_pc; + + /* Registers 0 through 31. */ + int sc_regs[32]; + + /* mul/div low and hi; these aren't part of a jmp_buf, but are part of the + sigcontext and are referenced from the signal trampoline code. */ + int sc_mdlo; + int sc_mdhi; + + /* Flag to see if the FP's been used. */ + int sc_ownedfp; + + /* Floating point registers 0 to 31. */ + int sc_fpregs[32]; + /* Control & status register for FP. */ + int sc_fpc_csr; + + /* Exception instruction register for FP. */ + int sc_fpc_eir; + + /* The coprocessor's cause register. */ + int sc_cause; + + /* CPU bad virtual address. */ + __ptr_t sc_badvaddr; + + /* CPU board bad physical address. */ + __ptr_t sc_badpaddr; + }; diff --git a/ports/sysdeps/unix/bsd/ultrix4/mips/sigvec.c b/ports/sysdeps/unix/bsd/ultrix4/mips/sigvec.c new file mode 100644 index 000000000..5775c9adb --- /dev/null +++ b/ports/sysdeps/unix/bsd/ultrix4/mips/sigvec.c @@ -0,0 +1,55 @@ +/* Copyright (C) 1992, 1996, 1997, 2004 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. */ + +/* The sigvec system call on MIPS Ultrix takes an additional + parameter, which is the address that is actually called when the + signal occurs. + + When a signal occurs, we arrange for the kernel to call __handler. + That will save the frame and stack pointers into the context, and + then jump to this routine. See __handler.S. + + This code is based on sysdeps/unix/bsd/sun4/sigtramp.c, but it's + different because since we get passed the user signal handler we + don't actually need a trampoline. */ + +#include <signal.h> +#include <stddef.h> +#include <errno.h> + +/* The user's signal handler is called with three arguments. */ +typedef void (*handler_type) (int sig, int code, struct sigcontext *); + +extern int __raw_sigvec (int sig, CONST struct sigvec *vec, + struct sigvec *ovec, + void (*)(int sig, int code, + struct sigcontext *, + handler_type)); + +extern void __handler (int sig, int code, + struct sigcontext *, + handler_type); + +int +__sigvec (sig, vec, ovec) + int sig; + const struct sigvec *vec; + struct sigvec *ovec; +{ + return __raw_sigvec (sig, vec, ovec, __handler); +} diff --git a/ports/sysdeps/unix/bsd/ultrix4/mips/start.S b/ports/sysdeps/unix/bsd/ultrix4/mips/start.S new file mode 100644 index 000000000..a88268af4 --- /dev/null +++ b/ports/sysdeps/unix/bsd/ultrix4/mips/start.S @@ -0,0 +1,87 @@ +/* Copyright (C) 1993, 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The GNU Lesser General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + Note that people who make modified versions of this file are not + obligated to grant this special exception for their modified + versions; it is their choice whether to do so. The GNU Lesser + General Public License gives permission to release a modified + version without this exception; this exception also makes it + possible to release a modified version which carries forward this + exception. + + 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. */ + +#include <sysdep.h> + +ENTRY(__start) + .set noreorder + + /* The first thing on the stack is argc. */ + lw s0, 0(sp) + nop + + /* Set up the global pointer. */ + la gp, _gp + + /* Then set up argv. */ + addiu s1, sp, 4 + + /* To compute where envp is, first we have to jump ahead four + bytes from what argv was. This will bring us ahead, so we don't + need to compute the NULL at the end of argv later. */ + addiu v1, s1, 4 + + /* Now, compute the space to skip given the number of arguments + we've got. We do this by multiplying argc by 4. */ + sll v0, s0, 2 + + /* Now, add (argv+4) with the space to skip...that's envp. */ + addu s2, v1, v0 + + /* __environ = envp; */ + sw s2, __environ + + addiu sp, sp, -24 + + /* __libc_init (argc, argv, envp); */ + move a0, s0 + move a1, s1 + jal __libc_init + move a2, s2 + + /* errno = 0; */ + sw zero, errno + + /* exit (main (argc, argv, envp)); */ + move a0, s0 + move a1, s1 + jal main + move a2, s2 + + /* Make the value returned by main be the argument to exit. */ + jal exit + move a0, v0 + .end __start diff --git a/ports/sysdeps/unix/bsd/ultrix4/mips/syscalls.list b/ports/sysdeps/unix/bsd/ultrix4/mips/syscalls.list new file mode 100644 index 000000000..f7d0bba6a --- /dev/null +++ b/ports/sysdeps/unix/bsd/ultrix4/mips/syscalls.list @@ -0,0 +1,3 @@ +# File name Caller Syscall name # args Strong name Weak names + +raw-sigvec sigvec sigvec 4 __raw_sigvec diff --git a/ports/sysdeps/unix/bsd/ultrix4/mips/sysdep.h b/ports/sysdeps/unix/bsd/ultrix4/mips/sysdep.h new file mode 100644 index 000000000..09b69ff85 --- /dev/null +++ b/ports/sysdeps/unix/bsd/ultrix4/mips/sysdep.h @@ -0,0 +1,3 @@ +#define NO_UNDERSCORES + +#include <sysdeps/unix/mips/sysdep.h> diff --git a/ports/sysdeps/unix/bsd/ultrix4/mips/vfork.S b/ports/sysdeps/unix/bsd/ultrix4/mips/vfork.S new file mode 100644 index 000000000..d413e45dc --- /dev/null +++ b/ports/sysdeps/unix/bsd/ultrix4/mips/vfork.S @@ -0,0 +1,36 @@ +/* Copyright (C) 1992, 1995, 1997, 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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. */ + +#include <sysdep.h> + +#ifndef SYS_vfork +#define SYS_vfork 66 +#endif + +SYSCALL__ (vfork, 0) + beq v1, zero, parent /* Branch if parent. */ + nop + move v0, zero +parent: + ret + nop + .end __vfork +libc_hidden_def (__vfork) + +weak_alias (__vfork, vfork) diff --git a/ports/sysdeps/unix/bsd/ultrix4/syscalls.list b/ports/sysdeps/unix/bsd/ultrix4/syscalls.list new file mode 100644 index 000000000..68df0a766 --- /dev/null +++ b/ports/sysdeps/unix/bsd/ultrix4/syscalls.list @@ -0,0 +1,3 @@ +# File name Caller Syscall name # args Strong name Weak names + +getsysinfo sysconf getsysinfo 5 __getsysinfo diff --git a/ports/sysdeps/unix/bsd/ultrix4/sysconf.c b/ports/sysdeps/unix/bsd/ultrix4/sysconf.c new file mode 100644 index 000000000..0982fc832 --- /dev/null +++ b/ports/sysdeps/unix/bsd/ultrix4/sysconf.c @@ -0,0 +1,61 @@ +/* Copyright (C) 1992, 1995, 1996, 1997, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ian Lance Taylor (ian@airs.com). + + 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. */ + +/* On Ultrix we can use the getsysinfo call to get the right return + value for _SC_CHILD_MAX. Everything else is from <sys/param.h>, + which the default sysconf already knows how to handle. */ + +#include <unistd.h> +#include <errno.h> + +/* This is an Ultrix header file. */ +#include <sys/sysinfo.h> + +extern int __getsysinfo (unsigned int op, void *buffer, + size_t nbytes, int *start, void *arg); +extern long int __default_sysconf (int name); + +long int +__sysconf (name) + int name; +{ + if (name == _SC_CHILD_MAX) + { + int save = errno; + int start = 0; + int ret; + + /* getsysinfo returns the number of values it put into the + buffer, or 0 if not available, or -1 on error. */ + if (__getsysinfo (GSI_MAX_UPROCS, &ret, sizeof (ret), &start, + (void *) 0) > 0) + { + __set_errno (save); + return ret; + } + + __set_errno (save); + } + + return __default_sysconf (name); +} + +#define __sysconf __default_sysconf + +#include <sysdeps/posix/sysconf.c> diff --git a/ports/sysdeps/unix/bsd/ultrix4/system.c b/ports/sysdeps/unix/bsd/ultrix4/system.c new file mode 100644 index 000000000..b133fe77c --- /dev/null +++ b/ports/sysdeps/unix/bsd/ultrix4/system.c @@ -0,0 +1,2 @@ +/* Ultrix 4 does have `waitpid'. Avoid unix/system.c, which says we don't. */ +#include <sysdeps/posix/system.c> diff --git a/ports/sysdeps/unix/bsd/ultrix4/wait3.S b/ports/sysdeps/unix/bsd/ultrix4/wait3.S new file mode 100644 index 000000000..b20ecfa24 --- /dev/null +++ b/ports/sysdeps/unix/bsd/ultrix4/wait3.S @@ -0,0 +1,26 @@ +/* Copyright (C) 1992, 1995, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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. */ + +#include <sysdep.h> + +SYSCALL__ (wait3, 3) + ret + .end __wait3 + +weak_alias (__wait3, wait3) diff --git a/ports/sysdeps/unix/bsd/vax/brk.S b/ports/sysdeps/unix/bsd/vax/brk.S new file mode 100644 index 000000000..52377bc43 --- /dev/null +++ b/ports/sysdeps/unix/bsd/vax/brk.S @@ -0,0 +1,47 @@ +/* Copyright (C) 1991, 1995, 1997 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. */ + +#include <sysdep.h> + +#ifndef SYS_brk +#define SYS_brk 17 +#endif + +#ifndef HAVE_GNU_LD +#define __end _end +#endif + +.data +.globl ___curbrk +___curbrk: + .long __end + +.text +ENTRY (__brk) + cmpl 4(ap), __end + bgeq 0f + movl __env, 4(ap) +0: chmk $SYS_brk + bcs 1f + movl 4(ap), ___curbrk + clrl r0 + ret +1: + jmp syscall_error + +weak_alias (__brk, brk) diff --git a/ports/sysdeps/unix/bsd/vax/dl-brk.S b/ports/sysdeps/unix/bsd/vax/dl-brk.S new file mode 100644 index 000000000..eeb96544e --- /dev/null +++ b/ports/sysdeps/unix/bsd/vax/dl-brk.S @@ -0,0 +1 @@ +#include <brk.S> diff --git a/ports/sysdeps/unix/bsd/vax/pipe.S b/ports/sysdeps/unix/bsd/vax/pipe.S new file mode 100644 index 000000000..3ed784264 --- /dev/null +++ b/ports/sysdeps/unix/bsd/vax/pipe.S @@ -0,0 +1,29 @@ +/* Copyright (C) 1991, 1992, 1995, 1997, 2002 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. */ + +#include <sysdep.h> + +SYSCALL__ (pipe, 1) + movl 4(ap), r2 + movl r0, (r2)+ + movl r1, (r2) + clrl r0 + ret + +libc_hidden_def (__pipe) +weak_alias (__pipe, pipe) diff --git a/ports/sysdeps/unix/bsd/vax/sysdep.S b/ports/sysdeps/unix/bsd/vax/sysdep.S new file mode 100644 index 000000000..786aed2d1 --- /dev/null +++ b/ports/sysdeps/unix/bsd/vax/sysdep.S @@ -0,0 +1,35 @@ +/* Copyright (C) 1991, 1992, 1993, 1994, 1997 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. */ + +#define _ERRNO_H +#include <bits/errno.h> + +.globl _errno +.globl syscall_error +syscall_error: +#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN + /* We translate the system's EWOULDBLOCK error into EAGAIN. + The GNU C library always defines EWOULDBLOCK==EAGAIN. + EWOULDBLOCK_sys is the original number. */ + cmpl r0, $EWOULDBLOCK_sys + bne 0f + movl $EAGAIN, r0 +#endif +0: movl r0, _errno + mnegl $1, r0 + ret diff --git a/ports/sysdeps/unix/bsd/vax/sysdep.h b/ports/sysdeps/unix/bsd/vax/sysdep.h new file mode 100644 index 000000000..563ad26c1 --- /dev/null +++ b/ports/sysdeps/unix/bsd/vax/sysdep.h @@ -0,0 +1,55 @@ +/* Copyright (C) 1991, 1992, 1995, 1997 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. */ + +#include <sysdeps/unix/sysdep.h> + +#ifdef __ASSEMBLER__ + +#ifdef __STDC__ +#define ENTRY(name) \ + .globl _##name; \ + .even; \ + _##name##: +#else +#define ENTRY(name) \ + .globl _/**/name; \ + .even; \ + _/**/name/**/: +#endif + +#ifdef __STDC__ +#define PSEUDO(name, syscall_name, args) \ + .even; \ + .globl syscall_error \ + error: jmp syscall_error; \ + ENTRY (name) \ + chmk $SYS_##syscall_name \ + bcs error +#else +#define PSEUDO(name, syscall_name, args) \ + .even; \ + .globl syscall_error \ + error: jmp syscall_error; \ + ENTRY (name) \ + chmk $SYS_/**/syscall_name \ + bcs error +#endif + +#define MOVE(x,y) movl x , y + +#endif /* __ASSEMBLER__ */ diff --git a/ports/sysdeps/unix/bsd/vax/vfork.S b/ports/sysdeps/unix/bsd/vax/vfork.S new file mode 100644 index 000000000..6c7e754ac --- /dev/null +++ b/ports/sysdeps/unix/bsd/vax/vfork.S @@ -0,0 +1,57 @@ +/* Copyright (C) 1991, 1992, 1995, 1997, 2002 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. */ + +#include <sysdep.h> + +#ifndef SYS_vfork +#define SYS_vfork 66 +#endif + +/* Clone the calling process, but without copying the whole address space. + The calling process is suspended until the new process exits or is + replaced by a call to `execve'. Return -1 for errors, 0 to the new process, + and the process ID of the new process to the old process. */ +.globl ___vfork +___vfork: + .word 0 + /* Save our return address in R2, and return to code below. */ + movl 16(fp), r2 + movab unwind, 16(fp) + ret +unwind: + /* Do the system call. */ + chmk $SYS_vfork + bcs error + + tstl r1 + beq parent + + /* We are the child. Return zero. */ + clrl r0 + + /* Return to the saved address. */ +parent: jmp (r2) + +.globl _errno +error: + movl r0, _errno + mnegl $1, r0 + jmp (r2) +libc_hidden_def (__vfork) + +weak_alias (__vfork, vfork) diff --git a/ports/sysdeps/unix/bsd/vax/wait.S b/ports/sysdeps/unix/bsd/vax/wait.S new file mode 100644 index 000000000..19396f06e --- /dev/null +++ b/ports/sysdeps/unix/bsd/vax/wait.S @@ -0,0 +1,27 @@ +/* Copyright (C) 1991, 1992, 1995, 1997 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. */ + +#include <sysdep.h> + +SYSCALL__ (wait, 1) + movl 4(ap), r2 + beq 1f + movl r1, (r2) +1: ret + +weak_alias (__wait, wait) diff --git a/ports/sysdeps/unix/bsd/vax/wait3.S b/ports/sysdeps/unix/bsd/vax/wait3.S new file mode 100644 index 000000000..e0ceec1de --- /dev/null +++ b/ports/sysdeps/unix/bsd/vax/wait3.S @@ -0,0 +1,37 @@ +/* Copyright (C) 1991, 1992, 1995, 1997 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. */ + +#include <sysdep.h> + +ENTRY(___wait3) + movel 8(ap), r1 + movel 12(ap), r0 + /* Set all condition codes to tell the kernel this is wait3. */ + bispsw $15 + chmk $SYS_wait + bcs error + + movl 4(ap), r2 + beq 1f + movl r1, (r2) +1: ret + +.globl syscall_error +error: jmp syscall_error + +weak_alias (__wait3, wait3) diff --git a/ports/sysdeps/unix/sysv/aix/Dist b/ports/sysdeps/unix/sysv/aix/Dist new file mode 100644 index 000000000..609fd778e --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/Dist @@ -0,0 +1,15 @@ +dl-support.c +dl-error.c +dl-addr.c +dl-sym.c +dl-open.c +dl-close.c +dl-libc.c +dlldr.h +kernel_proto.h +start-libc.c +sysv_termio.h +bits/utmpx.h +gnu/lib-names.h +uitrunc.c +utmpx.h diff --git a/ports/sysdeps/unix/sysv/aix/Implies b/ports/sysdeps/unix/sysv/aix/Implies new file mode 100644 index 000000000..279438d43 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/Implies @@ -0,0 +1,8 @@ +# AIX shares most of the syscalls which are also common to BSD and SVR4. +unix/common + +# AIX has all functions of the mmap family which are described in POSIX.4. +unix/mman + +# AIX has network support in the kernel. +unix/inet diff --git a/ports/sysdeps/unix/sysv/aix/Makefile b/ports/sysdeps/unix/sysv/aix/Makefile new file mode 100644 index 000000000..2da531109 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/Makefile @@ -0,0 +1,41 @@ +# XXX For now always link against the syscalls export file. +# This is a hack until the import/export stuff is worked out. ++postctor += /lib/syscalls.exp + +ifeq ($(subdir),csu) + +sysdep_routines += aix-syscalls + +# +# The foo.c is a workaround for the linker complaining about no input files. +$(objpfx)aix-syscalls.o : /lib/syscalls.exp + echo "static int a;" > foo.c + $(CC) -c foo.c + ld -bM:SRE -bpT:0x00000000 -bpD:0x00000000 -bnoentry -bI:/lib/syscalls.exp -bE:/lib/syscalls.exp foo.o -o $@ + rm foo.c foo.o + + +endif + +ifeq ($(subdir),misc) +sysdep_routines += dl-error dl-support dl-libc dl-open dl-sym \ + dl-close dl-addr uitrunc + +static-only-routines = gprsave0 gprrest0 gprsave1 gprrest1 fprsave fprrest +endif + +ifeq ($(subdir),login) +sysdep_routines += setutxent getutxent endutxent getutxid getutxline \ + pututxline utmpxname + +#sysdep_headers += utmpx.h bits/utmpx.h +#sysdep_headers += bits/utmp.h bits/utmpx.h +endif + +# Don't compile the ctype glue code, since there is no old non-GNU C library. +inhibit-glue = yes + +# XXX Don't know yet why this is needed in the moment. +ifeq ($(subdir),timezone) +CPPFLAGS-zic.c = -Dunix +endif diff --git a/ports/sysdeps/unix/sysv/aix/Versions b/ports/sysdeps/unix/sysv/aix/Versions new file mode 100644 index 000000000..4c32bbbe7 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/Versions @@ -0,0 +1,6 @@ +libc { + GLIBC_2.2 { + # u* + umount; + } +} diff --git a/ports/sysdeps/unix/sysv/aix/_exit.c b/ports/sysdeps/unix/sysv/aix/_exit.c new file mode 100644 index 000000000..510f3ae88 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/_exit.c @@ -0,0 +1,29 @@ +/* Copyright (C) 1999 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. */ + +#include <stdlib.h> + + +/* We define only thr alias introduced in ISO C99 because _exit itself + is a system call. */ +void +_Exit (status) + int status; +{ + _exit (status); +} diff --git a/ports/sysdeps/unix/sysv/aix/accept.c b/ports/sysdeps/unix/sysv/aix/accept.c new file mode 100644 index 000000000..73f11499f --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/accept.c @@ -0,0 +1,30 @@ +/* Copyright (C) 2000, 2002 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. */ + +#include <assert.h> +#include <sys/socket.h> + +extern int naccept (int s, void *uap_name, int *uap_anamelen); + +int +accept (int fd, __SOCKADDR_ARG addr, socklen_t *addr_len) +{ + assert (sizeof (socklen_t) == sizeof (int)); + return naccept (fd, addr.__sockaddr__, addr_len); +} +libc_hidden_def (accept) diff --git a/ports/sysdeps/unix/sysv/aix/access.c b/ports/sysdeps/unix/sysv/aix/access.c new file mode 100644 index 000000000..97f8e6879 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/access.c @@ -0,0 +1,30 @@ +/* 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 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. */ + +#include <unistd.h> + +#define ACC_INVOKER 0x01 + +extern int accessx (const char *name, int type, int who); + +int +__access (const char *name, int type) +{ + return accessx (name, type, ACC_INVOKER); +} +strong_alias (__access, access) diff --git a/ports/sysdeps/unix/sysv/aix/bind.c b/ports/sysdeps/unix/sysv/aix/bind.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bind.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/bits/dirent.h b/ports/sysdeps/unix/sysv/aix/bits/dirent.h new file mode 100644 index 000000000..48eeb3288 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/dirent.h @@ -0,0 +1,55 @@ +/* Directory entry structure `struct dirent'. Old System V version. + Copyright (C) 1996, 1997, 1999 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 _DIRENT_H +# error "Never use <bits/dirent.h> directly; include <dirent.h> instead." +#endif + +struct dirent + { +#ifndef __USE_FILE_OFFSET64 + __off_t d_off; + __ino_t d_ino; +#else + __off64_t d_off; + __ino64_t d_ino; +#endif + unsigned short int d_reclen; + unsigned short int d_namlen; + char d_name[256]; + }; + +#ifdef __USE_LARGEFILE64 +struct dirent64 + { + __off64_t d_off; + __ino64_t d_ino; + unsigned short int d_reclen; + unsigned short int d_namlen; + char d_name[256]; + }; +#endif + +#define d_fileno d_ino /* Backwards compatibility. */ +#define d_offset d_off + +#define _DIRENT_HAVE_D_NAMLEN +#define _DIRENT_HAVE_D_RECLEN +#define _DIRENT_HAVE_D_OFF +#undef _DIRENT_HAVE_D_TYPE diff --git a/ports/sysdeps/unix/sysv/aix/bits/dlfcn.h b/ports/sysdeps/unix/sysv/aix/bits/dlfcn.h new file mode 100644 index 000000000..e18417527 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/dlfcn.h @@ -0,0 +1,47 @@ +/* AIX dependent definitions for run-time dynamic loading. + Copyright (C) 1996, 1997, 1998, 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 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 _DLFCN_H +# error "Never use <bits/dlfcn.h> directly; include <dlfcn.h> instead." +#endif + +/* The MODE argument to `dlopen' contains one of the following: */ +#define RTLD_LAZY 0x004 /* Lazy function call binding. */ +#define RTLD_NOW 0x002 /* Immediate function call binding. */ +#define RTLD_BINDING_MASK 0x6 /* Mask of binding time value. */ + +/* If the following bit is set in the MODE argument to `dlopen', + the symbols of the loaded object and its dependencies are made + visible as if the object were linked directly into the program. */ +#define RTLD_GLOBAL 0x10000 + +/* Unix98 demands the following flag which is the inverse to RTLD_GLOBAL. + The implementation does this by default and so we can define the + value to zero. */ +#define RTLD_LOCAL 0x800000 + +#ifdef __USE_GNU +/* These are extensions of the AIX kernel. */ +# define RTLD_NOAUTODEFER 0x020000 +# define RTLD_MEMBER 0x040000 +# define RTLD_UNIX_LATEST 0x100000 +#endif + +/* No support to profile shared libraries available. */ +# define DL_CALL_FCT(fctp, args) fctp args diff --git a/ports/sysdeps/unix/sysv/aix/bits/endian.h b/ports/sysdeps/unix/sysv/aix/bits/endian.h new file mode 100644 index 000000000..8e9b98ef7 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/endian.h @@ -0,0 +1,23 @@ +/* Copyright (C) 1997, 1998, 1999 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 _ENDIAN_H +# error "Never use <bits/endian.h> directly; include <endian.h> instead." +#endif + +#define __BYTE_ORDER __BIG_ENDIAN diff --git a/ports/sysdeps/unix/sysv/aix/bits/errno.h b/ports/sysdeps/unix/sysv/aix/bits/errno.h new file mode 100644 index 000000000..9f22a965e --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/errno.h @@ -0,0 +1,153 @@ +/* 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 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. */ + +/* This file defines the `errno' constants. */ + +#if !defined __Emath_defined && (defined _ERRNO_H || defined __need_Emath) +#undef __need_Emath +#define __Emath_defined 1 + +#endif + +#ifdef _ERRNO_H +# undef EDOM +# undef EILSEQ +# undef ERANGE + +# define EPERM 1 /* Operation not permitted. */ +# define ENOENT 2 /* No such file or directory. */ +# define ESRCH 3 /* No such process. */ +# define EINTR 4 /* interrupted system call. */ +# define EIO 5 /* I/O error. */ +# define ENXIO 6 /* No such device or address. */ +# define E2BIG 7 /* Arg list too long. */ +# define ENOEXEC 8 /* Exec format error. */ +# define EBADF 9 /* Bad file descriptor. */ +# define ECHILD 10 /* No child processes. */ +# define EAGAIN 11 /* Resource temporarily unavailable. */ +# define ENOMEM 12 /* Not enough space. */ +# define EACCES 13 /* Permission denied. */ +# define EFAULT 14 /* Bad address. */ +# define ENOTBLK 15 /* Block device required. */ +# define EBUSY 16 /* Resource busy. */ +# define EEXIST 17 /* File exists. */ +# define EXDEV 18 /* Improper link. */ +# define ENODEV 19 /* No such device. */ +# define ENOTDIR 20 /* Not a directory. */ +# define EISDIR 21 /* Is a directory. */ +# define EINVAL 22 /* Invalid argument. */ +# define ENFILE 23 /* Too many open files in system. */ +# define EMFILE 24 /* Too many open files. */ +# define ENOTTY 25 /* Inappropriate I/O control operation. */ +# define ETXTBSY 26 /* Text file busy. */ +# define EFBIG 27 /* File too large. */ +# define ENOSPC 28 /* No space left on device. */ +# define ESPIPE 29 /* Invalid seek. */ +# define EROFS 30 /* Read only file system. */ +# define EMLINK 31 /* Too many links. */ +# define EPIPE 32 /* Broken pipe. */ +# define EDOM 33 /* Domain error within math function. */ +# define ERANGE 34 /* Result too large. */ +# define ENOMSG 35 /* No message of desired type. */ +# define EIDRM 36 /* Identifier removed. */ +# define ECHRNG 37 /* Channel number out of range. */ +# define EL2NSYNC 38 /* Level 2 not synchronized. */ +# define EL3HLT 39 /* Level 3 halted. */ +# define EL3RST 40 /* Level 3 reset. */ +# define ELNRNG 41 /* Link number out of range. */ +# define EUNATCH 42 /* Protocol driver not attached. */ +# define ENOCSI 43 /* No CSI structure available. */ +# define EL2HLT 44 /* Level 2 halted. */ +# define EDEADLK 45 /* Resource deadlock avoided. */ +# define ENOTREADY 46 /* Device not ready. */ +# define EWRPROTECT 47 /* Write-protected media. */ +# define EFORMAT 48 /* Unformatted media. */ +# define ENOLCK 49 /* No locks available. */ +# define ENOCONNECT 50 /* No connection. */ +# define ESTALE 52 /* No filesystem. */ +# define EDIST 53 /* Old, currently unused AIX errno. */ +# if __USE_XOPEN_EXTENDED +# define EWOULDBLOCK EAGAIN /* Operation would block. */ +# else /* __USE_XOPEN_EXTENDED */ +# define EWOULDBLOCK 54 +# endif /* __USE_XOPEN_EXTENDED */ +# define EINPROGRESS 55 /* Operation now in progress. */ +# define EALREADY 56 /* Operation already in progress. */ +# define ENOTSOCK 57 /* Socket operation on non-socket. */ +# define EDESTADDRREQ 58 /* Destination address required. */ +# define EDESTADDREQ EDESTADDRREQ /* Destination address required. */ +# define EMSGSIZE 59 /* Message too long. */ +# define EPROTOTYPE 60 /* Protocol wrong type for socket. */ +# define ENOPROTOOPT 61 /* Protocol not available. */ +# define EPROTONOSUPPORT 62 /* Protocol not supported. */ +# define ESOCKTNOSUPPORT 63 /* Socket type not supported. */ +# define EOPNOTSUPP 64 /* Operation not supported on socket. */ +# define EPFNOSUPPORT 65 /* Protocol family not supported. */ +# define EAFNOSUPPORT 66 /* Address family not supported by protocol + family. */ +# define EADDRINUSE 67 /* Address already in use. */ +# define EADDRNOTAVAIL 68 /* Can't assign requested address. */ +# define ENETDOWN 69 /* Network is down. */ +# define ENETUNREACH 70 /* Network is unreachable. */ +# define ENETRESET 71 /* Network dropped connection on reset. */ +# define ECONNABORTED 72 /* Software caused connection abort. */ +# define ECONNRESET 73 /* Connection reset by peer. */ +# define ENOBUFS 74 /* No buffer space available. */ +# define EISCONN 75 /* Socket is already connected. */ +# define ENOTCONN 76 /* Socket is not connected. */ +# define ESHUTDOWN 77 /* Can't send after socket shutdown. */ +# define ETIMEDOUT 78 /* Connection timed out. */ +# define ECONNREFUSED 79 /* Connection refused. */ +# define EHOSTDOWN 80 /* Host is down. */ +# define EHOSTUNREACH 81 /* No route to host. */ +# define ERESTART 82 /* Restart the system call. */ +# define EPROCLIM 83 /* Too many processes. */ +# define EUSERS 84 /* Too many users. */ +# define ELOOP 85 /* Too many levels of symbolic links. */ +# define ENAMETOOLONG 86 /* File name too long. */ +# define ENOTEMPTY EEXIST /* Directory not empty. */ +# define EDQUOT 88 /* Disc quota exceeded. */ +# define ECORRUPT 89 /* Invalid file system control data. */ +# define EREMOTE 93 /* Item is not local to host. */ +# define ENOSYS 109 /* Function not implemented POSIX. */ +# define EMEDIA 110 /* Media surface error. */ +# define ESOFT 111 /* I/O completed, but needs relocation. */ +# define ENOATTR 112 /* No attribute found. */ +# define ESAD 113 /* Security authentication denied. */ +# define ENOTRUST 114 /* Not a trusted program. */ +# define ETOOMANYREFS 115 /* Too many references: can't splice. */ +# define EILSEQ 116 /* Invalid wide character. */ +# define ECANCELED 117 /* Asynchronous i/o cancelled. */ +# define ENOSR 118 /* Temp out of streams resources. */ +# define ETIME 119 /* I_STR ioctl timed out. */ +# define EBADMSG 120 /* Wrong message type at stream head. */ +# define EPROTO 121 /* STREAMS protocol error. */ +# define ENODATA 122 /* No message ready at stream head. */ +# define ENOSTR 123 /* Fd is not a stream. */ +# define ECLONEME ERESTART /* This is the way we clone a stream. */ +# define ENOTSUP 124 /* POSIX threads unsupported value. */ +# define EMULTIHOP 125 /* Multihop is not allowed. */ +# define ENOLINK 126 /* The link has been severed. */ +# define EOVERFLOW 127 /* Value too large to be stored in data type.*/ +#endif + +#if !defined _ERRNO_H && defined __need_Emath +# define EDOM 33 /* Math argument out of domain of function. */ +# define EILSEQ 116 /* Illegal byte sequence. */ +# define ERANGE 34 /* Math result not representable. */ +#endif /* !_ERRNO_H && __need_Emath */ diff --git a/ports/sysdeps/unix/sysv/aix/bits/fcntl.h b/ports/sysdeps/unix/sysv/aix/bits/fcntl.h new file mode 100644 index 000000000..c65b8beeb --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/fcntl.h @@ -0,0 +1,137 @@ +/* O_*, F_*, FD_* bit values for Linux. + Copyright (C) 1995-1999, 2000, 2004 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. */ +#define O_ACCMODE 0003 +#define O_RDONLY 00 +#define O_WRONLY 01 +#define O_RDWR 02 +#define O_NONBLOCK 04 +#define O_NDELAY O_NONBLOCK +#define O_APPEND 010 +#define O_SYNC 020 +#define O_FSYNC O_SYNC +#define O_CREAT 0400 /* not fcntl */ +#define O_TRUNC 01000 /* not fcntl */ +#define O_EXCL 02000 /* not fcntl */ +#define O_NOCTTY 04000 /* not fcntl */ +#define O_ASYNC 0400000 + +#ifdef __USE_LARGEFILE64 +# define O_LARGEFILE 0400000000 +#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 020000000 /* Synchronize data. */ +# define O_RSYNC 010000000 /* Synchronize read operations. */ +#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 11 /* Get record locking info. */ +# define F_SETLK 12 /* Set record locking info (non-blocking). */ +# define F_SETLKW 13 /* Set record locking info (blocking). */ +#endif + +#ifdef __USE_LARGEFILE64 +# define F_GETLK64 11 /* Get record locking info. */ +# define F_SETLK64 12 /* Set record locking info (non-blocking). */ +# define F_SETLKW64 13 /* Set record locking info (blocking). */ +#endif + +#if defined __USE_BSD || defined __USE_UNIX98 +# define F_SETOWN 8 /* Get owner of socket (receiver of SIGIO). */ +# define F_GETOWN 9 /* Set owner of socket (receiver of SIGIO). */ +#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 1 /* Read lock. */ +#define F_WRLCK 2 /* Write lock. */ +#define F_UNLCK 3 /* Remove lock. */ + +#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. */ +#endif + unsigned int l_sysid; + __pid_t l_pid; /* Process holding the lock. */ + int l_vfs; +#ifdef __USE_FILE_OFFSET64 + __off64_t l_start; /* Offset where the lock begins. */ + __off64_t l_len; /* Size of the locked area; zero means until EOF. */ +#endif + }; + +#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'). */ + unsigned int l_sysid; + __pid_t l_pid; /* Process holding the lock. */ + int l_vfs; + __off64_t l_start; /* Offset where the lock begins. */ + __off64_t l_len; /* Size of the locked area; zero means until EOF. */ + }; +#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. */ diff --git a/ports/sysdeps/unix/sysv/aix/bits/ioctl-types.h b/ports/sysdeps/unix/sysv/aix/bits/ioctl-types.h new file mode 100644 index 000000000..d8fe8c8d5 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/ioctl-types.h @@ -0,0 +1,91 @@ +/* Structure types for pre-termios terminal ioctls. AIX version. + Copyright (C) 1999, 2000, 2002 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 _SYS_IOCTL_H +# error "Never use <bits/ioctl-types.h> directly; include <sys/ioctl.h> instead." +#endif + +/* Constants for use with `ioctl'. */ +#define TIOC ('T' << 8) +#define TCGETS (TIOC | 1) +#define TCSETS (TIOC | 2) +#define TCSETSW (TIOC | 3) +#define TCSETSF (TIOC | 4) +#define TCGETA (TIOC | 5) +#define TCSETA (TIOC | 6) +#define TCSETAW (TIOC | 7) +#define TCSETAF (TIOC | 8) +#define TCSBRK (TIOC | 9) +#define TCSBREAK (TIOC | 10) +#define TCXONC (TIOC | 11) +#define TCFLSH (TIOC | 12) +#define TCGLEN (TIOC | 13) +#define TCSLEN (TIOC | 14) +#define TCSAK (TIOC | 15) +#define TCQSAK (TIOC | 16) +#define TCTRUST (TIOC | 17) +#define TCQTRUST (TIOC | 18) +#define TCSMAP (TIOC | 19) +#define TCGMAP (TIOC | 20) +#define TCKEP (TIOC | 21) +#define TCGSAK (TIOC | 22) +#define TCLOOP (TIOC | 23) +#define TCVPD (TIOC | 24) +#define TCREG (TIOC | 25) +#define TCGSTATUS (TIOC | 26) +#define TCSCONTROL (TIOC | 27) +#define TCSCSMAP (TIOC | 28) +#define TCGCSMAP (TIOC | 29) +#define TCMGR TCSAK +#define TCQMGR TCQSAK +#define TIONREAD FIONREAD + + + +struct winsize +{ + unsigned short int ws_row; + unsigned short int ws_col; + unsigned short int ws_xpixel; + unsigned short int ws_ypixel; +}; + +#define NCC 8 +struct termio +{ + unsigned short int c_iflag; /* input mode flags */ + unsigned short int c_oflag; /* output mode flags */ + unsigned short int c_cflag; /* control mode flags */ + unsigned short int c_lflag; /* local mode flags */ + char c_line; /* line discipline */ + unsigned char c_cc[NCC]; /* control characters */ +}; + +/* modem lines */ +#define TIOCM_LE 0x001 +#define TIOCM_DTR 0x002 +#define TIOCM_RTS 0x004 +#define TIOCM_ST 0x008 +#define TIOCM_SR 0x010 +#define TIOCM_CTS 0x020 +#define TIOCM_CAR 0x040 +#define TIOCM_RNG 0x080 +#define TIOCM_DSR 0x100 +#define TIOCM_CD TIOCM_CAR +#define TIOCM_RI TIOCM_RNG diff --git a/ports/sysdeps/unix/sysv/aix/bits/ioctls.h b/ports/sysdeps/unix/sysv/aix/bits/ioctls.h new file mode 100644 index 000000000..8023c144d --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/ioctls.h @@ -0,0 +1,248 @@ +/* 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 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 _SYS_IOCTL_H +# error "Never use <bits/ioctls.h> directly; include <sys/ioctl.h> instead." +#endif + + +#define IOCPARM_MASK 0x7f /* parameters must be < 128 bytes */ +#define IOC_VOID 0x20000000 /* no parameters */ +#define IOC_OUT 0x40000000 /* copy out parameters */ +#define IOC_IN (0x40000000<<1) /* copy in parameters */ +#define IOC_INOUT (IOC_IN|IOC_OUT) +#define _IO(x,y) (IOC_VOID|(x<<8)|y) +#define _IOR(x,y,t) (IOC_OUT|((sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y) +#define _IOW(x,y,t) (IOC_IN|((sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y) +#define _IOWR(x,y,t) (IOC_INOUT|((sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y) + +#define TIOCGETD _IOR('t', 0, int) /* get line discipline */ +#define TIOCSETD _IOW('t', 1, int) /* set line discipline */ +#define TIOCHPCL _IO('t', 2) /* hang up on last close */ +#define TIOCMODG _IOR('t', 3, int) /* get modem control state */ +#define TIOCMODS _IOW('t', 4, int) /* set modem control state */ +#define TIOCGETP _IOR('t', 8,struct sgttyb)/* get parameters -- gtty */ +#define TIOCSETP _IOW('t', 9,struct sgttyb)/* set parameters -- stty */ +#define TIOCSETN _IOW('t',10,struct sgttyb)/* as above, but no flushtty */ +#define TIOCEXCL _IO('t', 13) /* set exclusive use of tty */ +#define TIOCNXCL _IO('t', 14) /* reset exclusive use of tty */ +#define TIOCFLUSH _IOW('t', 16, int) /* flush buffers */ +#define TIOCSETC _IOW('t',17,struct tchars)/* set special characters */ +#define TIOCGETC _IOR('t',18,struct tchars)/* get special characters */ +#define TANDEM 0x00000001 /* send stopc on out q full */ +#define CBREAK 0x00000002 /* half-cooked mode */ +#define LCASE 0x00000004 /* simulate lower case */ +#define CRMOD 0x00000010 /* map \r to \r\n on output */ +#define RAW 0x00000020 /* no i/o processing */ +#define ODDP 0x00000040 /* get/send odd parity */ +#define EVENP 0x00000080 /* get/send even parity */ +#define ANYP 0x000000c0 /* get any parity/send none */ +#define CRDELAY 0x00000300 /* \r delay */ +#define TBDELAY 0x00000c00 /* horizontal tab delay */ +#define XTABS 0x00000c00 /* expand tabs on output */ +#define BSDELAY 0x00001000 /* \b delay */ +#define VTDELAY 0x00002000 /* vertical tab delay */ +#define NLDELAY 0x0000c000 /* \n delay */ +#define NL2 0x00008000 /* vt05 */ +#define NL3 0x0000c000 +#define ALLDELAY (NLDELAY|TBDELAY|CRDELAY|VTDELAY|BSDELAY) +#define PRTERA 0x00020000 /* \ ... / erase */ +#define CRTERA 0x00040000 /* " \b " to wipe out char */ +#define TILDE 0x00080000 /* hazeltine tilde kludge */ +#define LITOUT 0x00200000 /* literal output */ +#define CRTBS 0x00400000 /* do backspacing for crt */ +#define MDMBUF 0x00800000 /* dtr pacing */ +#define NOHANG 0x01000000 /* no SIGHUP on carrier drop */ +#define L001000 0x02000000 +#define CRTKIL 0x04000000 /* kill line with " \b " */ +#define PASS8 0x08000000 +#define CTLECH 0x10000000 /* echo control chars as ^X */ +#define DECCTQ 0x40000000 /* only ^Q starts after ^S */ +#define NOFLUSH 0x80000000 /* no output flush on signal */ + + +/* SYS V REL. 4 PTY IOCTLs */ +#define UNLKPT _IO('t',70) /* unlock slave pty */ +#define ISPTM _IO('t',71) /* ret. maj+min of pty master */ +#define ISPTS _IO('t',73) /* return maj+min of slave */ +#define GRTPT _IO('t',74) /* grantpt slave pty*/ +#define RLOGIND _IO('t',75) /* for rlogind protocol in ptydd */ +#define TELNETDP _IO('t',76) /* for telnetd protocol in ptydd */ + +#define TIOCCONS _IOW('t', 98, int) /* become virtual console */ +#define TIOCGSID _IOR('t', 72, int) /* get the tty session id */ + + /* locals, from 127 down */ +#define TIOCLBIS _IOW('t', 127, int) /* bis local mode bits */ +#define TIOCLBIC _IOW('t', 126, int) /* bic local mode bits */ +#define TIOCLSET _IOW('t', 125, int) /* set entire mode word */ +#define TIOCLGET _IOR('t', 124, int) /* get local modes */ +#define LCRTBS (CRTBS>>16) +#define LPRTERA (PRTERA>>16) +#define LCRTERA (CRTERA>>16) +#define LTILDE (TILDE>>16) +#define LMDMBUF (MDMBUF>>16) +#define LLITOUT (LITOUT>>16) +#define LTOSTOP (TOSTOP>>16) +#define LFLUSHO (FLUSHO>>16) +#define LNOHANG (NOHANG>>16) +#define LCRTKIL (CRTKIL>>16) +#define LPASS8 (PASS8>>16) +#define LCTLECH (CTLECH>>16) +#define LPENDIN (PENDIN>>16) +#define LDECCTQ (DECCTQ>>16) +#define LNOFLSH (NOFLUSH>>16) +#define TIOCSBRK _IO('t', 123) /* set break bit */ +#define TIOCCBRK _IO('t', 122) /* clear break bit */ +#define TIOCSDTR _IO('t', 121) /* set data terminal ready */ +#define TIOCCDTR _IO('t', 120) /* clear data terminal ready */ +#define TIOCGPGRP _IOR('t', 119, int) /* get process group */ +#define TIOCSPGRP _IOW('t', 118, int) /* set process gorup */ +#define TIOCSLTC _IOW('t',117,struct ltchars)/* set local special chars */ +#define TIOCGLTC _IOR('t',116,struct ltchars)/* get local special chars */ +#define TIOCOUTQ _IOR('t', 115, int) /* output queue size */ +#define TIOCSTI _IOW('t', 114, char) /* simulate terminal input */ +#define TIOCNOTTY _IO('t', 113) /* void tty association */ +#define TIOCPKT _IOW('t', 112, int) /* pty: set/clear packet mode */ +#define TIOCPKT_DATA 0x00 /* data packet */ +#define TIOCPKT_FLUSHREAD 0x01 /* flush packet */ +#define TIOCPKT_FLUSHWRITE 0x02 /* flush packet */ +#define TIOCPKT_STOP 0x04 /* stop output */ +#define TIOCPKT_START 0x08 /* start output */ +#define TIOCPKT_NOSTOP 0x10 /* no more ^S, ^Q */ +#define TIOCPKT_DOSTOP 0x20 /* now do ^S ^Q */ +#define TIOCSTOP _IO('t', 111) /* stop output, like ^S */ +#define TIOCSTART _IO('t', 110) /* start output, like ^Q */ +#define TIOCMSET _IOW('t', 109, int) /* set all modem bits */ +#define TIOCMBIS _IOW('t', 108, int) /* bis modem bits */ +#define TIOCMBIC _IOW('t', 107, int) /* bic modem bits */ +#define TIOCMGET _IOR('t', 106, int) /* get all modem bits */ +#define TIOCREMOTE _IOW('t', 105, int) /* remote input editing */ +#define TIOCGWINSZ _IOR('t', 104, struct winsize) /* get window size */ +#define TIOCSWINSZ _IOW('t', 103, struct winsize) /* set window size */ +#define TIOCUCNTL _IOW('t', 102, int) /* pty: set/clr usr cntl mode */ +/* SLIP (Serial Line IP) ioctl's */ +#define SLIOCGUNIT _IOR('t', 101, int) /* get slip unit number */ +#define SLIOCSFLAGS _IOW('t', 89, int) /* set configuration flags */ +#define SLIOCGFLAGS _IOR('t', 90, int) /* get configuration flags */ +#define SLIOCSATTACH _IOWR('t', 91, int) /* Attach slip i.f. to tty */ +#define UIOCCMD(n) _IO('u', n) /* usr cntl op "n" */ + +#define OTTYDISC 0 /* old, v7 std tty driver */ +#define NETLDISC 1 /* line discip for berk net */ +#define NTTYDISC 2 /* new tty discipline */ +#define TABLDISC 3 /* tablet discipline */ +#define SLIPDISC 4 /* serial IP discipline */ + +#define FIOCLEX _IO('f', 1) /* set close on exec */ +#define FIONCLEX _IO('f', 2) /* clear close on exec */ +/* another local */ + +#define FIONREAD _IOR('f', 127, int) /* get # bytes to read */ +#define FIONBIO _IOW('f', 126, int) /* set/clear non-blocking i/o */ +#define FIOASYNC _IOW('f', 125, int) /* set/clear async i/o */ + +#define FIOSETOWN _IOW('f', 124, int) /* set owner */ +#define FIOGETOWN _IOR('f', 123, int) /* get owner */ +#define FIOASYNCQX _IOW('f', 122, int) /* set/clear async queueing */ + +/* socket i/o controls */ +#define SIOCSHIWAT _IOW('s', 0, int) /* set high watermark */ +#define SIOCGHIWAT _IOR('s', 1, int) /* get high watermark */ +#define SIOCSLOWAT _IOW('s', 2, int) /* set low watermark */ +#define SIOCGLOWAT _IOR('s', 3, int) /* get low watermark */ +#define SIOCATMARK _IOR('s', 7, int) /* at oob mark? */ +#define SIOCSPGRP _IOW('s', 8, int) /* set process group */ +#define SIOCGPGRP _IOR('s', 9, int) /* get process group */ + +#define SIOCADDRT (int)_IOW('r', 10, struct ortentry) /* add route */ +#define SIOCDELRT (int)_IOW('r', 11, struct ortentry) /* delete route */ + +#define SIOCSIFADDR (int)_IOW('i', 12, struct oifreq) /* set ifnet address */ +#define OSIOCGIFADDR (int)_IOWR('i',13, struct oifreq) /* get ifnet address */ +#define SIOCGIFADDR (int)_IOWR('i',33, struct oifreq) /* get ifnet address */ +#define SIOCSIFDSTADDR (int)_IOW('i', 14, struct oifreq) /* set p-p address */ +#define OSIOCGIFDSTADDR (int)_IOWR('i',15, struct oifreq) /* get p-p address */ +#define SIOCGIFDSTADDR (int)_IOWR('i',34, struct oifreq) /* get p-p address */ +#define SIOCSIFFLAGS (int)_IOW('i', 16, struct oifreq) /* set ifnet flags */ +#define SIOCGIFFLAGS (int)_IOWR('i',17, struct oifreq) /* get ifnet flags */ +#define OSIOCGIFBRDADDR (int)_IOWR('i',18, struct oifreq) /* get broadcast addr */ +#define SIOCGIFBRDADDR (int)_IOWR('i',35, struct oifreq) /* get broadcast addr */ +#define SIOCSIFBRDADDR (int)_IOW('i',19, struct oifreq) /* set broadcast addr */ +#define OSIOCGIFCONF (int)_IOWR('i',20, struct ifconf) /* get ifnet list */ +#define CSIOCGIFCONF (int)_IOWR('i',36, struct ifconf) /* get ifnet list */ +#define SIOCGIFCONF (int)_IOWR('i',69, struct ifconf) /* get ifnet list */ +#define OSIOCGIFNETMASK (int)_IOWR('i',21, struct oifreq) /* get net addr mask */ +#define SIOCGIFNETMASK (int)_IOWR('i',37, struct oifreq) /* get net addr mask */ +#define SIOCSIFNETMASK (int)_IOW('i',22, struct oifreq) /* set net addr mask */ +#define SIOCGIFMETRIC (int)_IOWR('i',23, struct oifreq) /* get IF metric */ +#define SIOCSIFMETRIC (int)_IOW('i',24, struct oifreq) /* set IF metric */ +#define SIOCDIFADDR (int)_IOW('i',25, struct oifreq) /* delete IF addr */ +#define SIOCAIFADDR (int)_IOW('i',26, struct ifaliasreq) /* add/chg IF alias */ +#define SIOCSIFSUBCHAN (int)_IOW('i',27, struct oifreq) /* set subchannel adr.*/ +#define SIOCSIFNETDUMP (int)_IOW('i',28, struct oifreq) /* set netdump fastwrt*/ + +#define SIOCSARP (int)_IOW('i', 30, struct arpreq) /* set arp entry */ +#define OSIOCGARP (int)_IOWR('i',31, struct arpreq) /* get arp entry */ +#define SIOCGARP (int)_IOWR('i',38, struct arpreq) /* get arp entry */ +#define SIOCDARP (int)_IOW('i', 32, struct arpreq) /* delete arp entry */ + +#define SIOCSIFOPTIONS (int)_IOW('i', 41, struct oifreq) /* set ifnet options */ +#define SIOCGIFOPTIONS (int)_IOWR('i',42, struct oifreq) /* get ifnet options */ +#define SIOCADDMULTI (int)_IOW('i', 49, struct ifreq) /* add multicast addr */ +#define SIOCDELMULTI (int)_IOW('i', 50, struct ifreq) /* del multicast addr */ +#define SIOCGETVIFCNT (int)_IOWR('u', 51, struct sioc_vif_req)/* vif pkt cnt */ +#define SIOCGETSGCNT (int)_IOWR('u', 52, struct sioc_sg_req) /* s,g pkt cnt */ + +#define SIOCADDNETID (int)_IOW('i',87, struct oifreq) /* set netids */ +#define SIOCSIFMTU (int)_IOW('i',88, struct oifreq) /* set mtu */ +#define SIOCGIFMTU (int)_IOWR('i',86, struct oifreq) /* get mtu */ + +#define SIOCSNETOPT (int)_IOW('i', 90, struct optreq) /* set network option */ +#define SIOCGNETOPT (int)_IOWR('i', 91, struct optreq) /* get network option */ +#define SIOCDNETOPT (int)_IOWR('i', 92, struct optreq) /* set default */ + +#define SIOCSX25XLATE (int)_IOW('i', 99, struct oifreq) /* set xlate tab */ +#define SIOCGX25XLATE (int)_IOWR('i',100, struct oifreq) /* get xlate tab */ +#define SIOCDX25XLATE (int)_IOW('i', 101, struct oifreq) /* delete xlate tab */ + +#define SIOCIFDETACH (int)_IOW('i', 102, struct ifreq) /* detach an ifnet */ +#define SIOCIFATTACH (int)_IOW('i', 103, struct ifreq) /* attach an ifnet */ + +#define SIOCGNMTUS (int)_IO('i',110) /* get NMTUs */ +#define SIOCGETMTUS (int)_IO('i',111) /* get common_mtus */ +#define SIOCADDMTU (int)_IOW('i',112, int) /* add mtu */ +#define SIOCDELMTU (int)_IOW('i',113, int) /* delete mtu */ + +#define SIOCGIFGIDLIST (int)_IO('i', 104) /* get gidlist */ +#define SIOCSIFGIDLIST (int)_IO('i', 105) /* set gidlist */ + +#define SIOCGSIZIFCONF (int)_IOR('i', 106, int) /* get size for SIOCGIFCONF */ + +#define SIOCIF_ATM_UBR (int)_IOW('i',120,struct ifreq) /* set ubr rate */ +#define SIOCIF_ATM_SNMPARP (int)_IOW('i',121,struct ifreq) /* atm snmp arp */ +#define SIOCIF_ATM_IDLE (int)_IOW('i',122,struct ifreq) /* set idle time */ +#define SIOCIF_ATM_DUMPARP (int)_IOW('i',123,struct ifreq) /* atm dump arp */ +#define SIOCIF_ATM_SVC (int)_IOW('i',124,struct ifreq) /* atmif init */ +#define SIOCIF_ATM_DARP (int)_IOW('i',125,struct ifreq) /* del atmarp */ +#define SIOCIF_ATM_GARP (int)_IOW('i',126,struct ifreq) /* get atmarp */ +#define SIOCIF_ATM_SARP (int)_IOW('i',127,struct ifreq) /* set atmarp */ + +#define SIOCGISNO (int)_IOWR('i',107, struct oifreq) /* get IF network options */ +#define SIOCSISNO (int)_IOW('i', 108, struct oifreq) /* set IF network options */ +#define SIOCGIFBAUDRATE (int)_IOWR('i', 109, struct oifreq) /* get ifnet's if_baudrate */ diff --git a/ports/sysdeps/unix/sysv/aix/bits/poll.h b/ports/sysdeps/unix/sysv/aix/bits/poll.h new file mode 100644 index 000000000..b9f2f7155 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/poll.h @@ -0,0 +1,43 @@ +/* Copyright (C) 1997, 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 _SYS_POLL_H +# error "Never use <bits/poll.h> directly; include <sys/poll.h> instead." +#endif + +/* Event types that can be polled for. These bits may be set in `events' + to indicate the interesting event types; they will appear in `revents' + to indicate the status of the file descriptor. */ +#define POLLIN 0x0001 /* There is data to read. */ +#define POLLPRI 0x0002 /* There is urgent data to read. */ +#define POLLOUT 0x0004 /* Writing now will not block. */ + +#ifdef __USE_XOPEN +/* These values are defined in XPG4.2. */ +# define POLLRDNORM 0x0010 /* Normal data may be read. */ +# define POLLRDBAND 0x0020 /* Priority data may be read. */ +# define POLLWRNORM POLLOUT /* Writing now will not block. */ +# define POLLWRBAND 0x0040 /* Priority data may be written. */ +#endif + +/* Event types always implicitly polled for. These bits need not be set in + `events', but they will appear in `revents' to indicate the status of + the file descriptor. */ +#define POLLERR 0x4000 /* Error condition. */ +#define POLLHUP 0x2000 /* Hung up. */ +#define POLLNVAL 0x8000 /* Invalid polling request. */ diff --git a/ports/sysdeps/unix/sysv/aix/bits/resource.h b/ports/sysdeps/unix/sysv/aix/bits/resource.h new file mode 100644 index 000000000..cc851e8a0 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/resource.h @@ -0,0 +1,191 @@ +/* Bit values & structures for resource limits. AIX version. + Copyright (C) 1994, 1996-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 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 _SYS_RESOURCE_H +# error "Never use <bits/resource.h> directly; include <sys/resource.h> instead." +#endif + +#include <bits/types.h> + +/* Transmute defines to enumerations. The macro re-definitions are + necessary because some programs want to test for operating system + features with #ifdef RUSAGE_SELF. In ISO C the reflexive + definition is a no-op. */ + +/* Kinds of resource limit. */ +enum __rlimit_resource +{ + /* Per-process CPU limit, in seconds. */ + RLIMIT_CPU = 0, +#define RLIMIT_CPU RLIMIT_CPU + + /* Largest file that can be created, in bytes. */ + RLIMIT_FSIZE = 1, +#define RLIMIT_FSIZE RLIMIT_FSIZE + + /* Maximum size of data segment, in bytes. */ + RLIMIT_DATA = 2, +#define RLIMIT_DATA RLIMIT_DATA + + /* Maximum size of stack segment, in bytes. */ + RLIMIT_STACK = 3, +#define RLIMIT_STACK RLIMIT_STACK + + /* Largest core file that can be created, in bytes. */ + RLIMIT_CORE = 4, +#define RLIMIT_CORE RLIMIT_CORE + + /* Largest resident set size, in bytes. + This affects swapping; processes that are exceeding their + resident set size will be more likely to have physical memory + taken from them. */ + RLIMIT_RSS = 5, +#define RLIMIT_RSS RLIMIT_RSS + + /* Address space limit (?) */ + RLIMIT_AS = 6, +#define RLIMIT_AS RLIMIT_AS + + /* Number of open files. */ + RLIMIT_NOFILE = 7, + RLIMIT_OFILE = RLIMIT_NOFILE, /* BSD name for same. */ +#define RLIMIT_NOFILE RLIMIT_NOFILE +#define RLIMIT_OFILE RLIMIT_OFILE + + RLIM_NLIMITS = 10 +#define RLIMIT_NLIMITS RLIMIT_NLIMITS +#define RLIM_NLIMITS RLIM_NLIMITS +}; + +/* Value to indicate that there is no limit. */ +#ifndef __USE_FILE_OFFSET64 +# define RLIM_INFINITY ((long int)(~0UL >> 1)) +#else +# define RLIM_INFINITY 0x7fffffffffffffffLL +#endif + +#ifdef __USE_LARGEFILE64 +# define RLIM64_INFINITY 0x7fffffffffffffffLL +#endif + +#define RLIM_SAVED_MAX (RLIM_INFINITY - 1) +#define RLIM_SAVED_CUR (RLIM_INFINITY - 2) + + +/* Type for resource quantity measurement. */ +#ifndef __USE_FILE_OFFSET64 +typedef __rlim_t rlim_t; +#else +typedef __rlim64_t rlim_t; +#endif +#ifdef __USE_LARGEFILE64 +typedef __rlim64_t rlim64_t; +#endif + +struct rlimit + { + /* The current (soft) limit. */ + rlim_t rlim_cur; + /* The hard limit. */ + rlim_t rlim_max; + }; + +#ifdef __USE_LARGEFILE64 +struct rlimit64 + { + /* The current (soft) limit. */ + rlim64_t rlim_cur; + /* The hard limit. */ + rlim64_t rlim_max; + }; +#endif + +/* Whose usage statistics do you want? */ +enum __rusage_who +{ + /* The calling process. */ + RUSAGE_SELF = 0, +#define RUSAGE_SELF RUSAGE_SELF + + /* All of its terminated child processes. */ + RUSAGE_CHILDREN = -1 +#define RUSAGE_CHILDREN RUSAGE_CHILDREN +}; + +#define __need_timeval +#include <bits/time.h> /* For `struct timeval'. */ + +/* Structure which says how much of each resource has been used. */ +struct rusage + { + /* Total amount of user time used. */ + struct timeval ru_utime; + /* Total amount of system time used. */ + struct timeval ru_stime; + /* Maximum resident set size (in kilobytes). */ + long int ru_maxrss; + /* Amount of sharing of text segment memory + with other processes (kilobyte-seconds). */ + long int ru_ixrss; + /* Amount of data segment memory used (kilobyte-seconds). */ + long int ru_idrss; + /* Amount of stack memory used (kilobyte-seconds). */ + long int ru_isrss; + /* Number of soft page faults (i.e. those serviced by reclaiming + a page from the list of pages awaiting reallocation. */ + long int ru_minflt; + /* Number of hard page faults (i.e. those that required I/O). */ + long int ru_majflt; + /* Number of times a process was swapped out of physical memory. */ + long int ru_nswap; + /* Number of input operations via the file system. Note: This + and `ru_oublock' do not include operations with the cache. */ + long int ru_inblock; + /* Number of output operations via the file system. */ + long int ru_oublock; + /* Number of IPC messages sent. */ + long int ru_msgsnd; + /* Number of IPC messages received. */ + long int ru_msgrcv; + /* Number of signals delivered. */ + long int ru_nsignals; + /* Number of voluntary context switches, i.e. because the process + gave up the process before it had to (usually to wait for some + resource to be available). */ + long int ru_nvcsw; + /* Number of involuntary context switches, i.e. a higher priority process + became runnable or the current process used up its time slice. */ + long int ru_nivcsw; + }; + +/* Priority limits. */ +#define PRIO_MIN -20 /* Minimum priority a process can have. */ +#define PRIO_MAX 20 /* Maximum priority a process can have. */ + +/* The type of the WHICH argument to `getpriority' and `setpriority', + indicating what flavor of entity the WHO argument specifies. */ +enum __priority_which +{ + PRIO_PROCESS = 0, /* WHO is a process ID. */ +#define PRIO_PROCESS PRIO_PROCESS + PRIO_PGRP = 1, /* WHO is a process group ID. */ +#define PRIO_PGRP PRIO_PGRP + PRIO_USER = 2 /* WHO is a user ID. */ +#define PRIO_USER PRIO_USER +}; diff --git a/ports/sysdeps/unix/sysv/aix/bits/setjmp.h b/ports/sysdeps/unix/sysv/aix/bits/setjmp.h new file mode 100644 index 000000000..82a58ae06 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/setjmp.h @@ -0,0 +1,46 @@ +/* Copyright (C) 1997, 1998, 1999 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. */ + +/* Define the machine-dependent type `jmp_buf'. PowerPC version. */ + +#ifndef _SETJMP_H +# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead." +#endif + +/* The previous bits/setjmp.h had __jmp_buf defined as a structure. + We use an array of 'long int' instead, to make writing the + assembler easier. Naturally, user code should not depend on + either representation. */ + +#if defined __USE_MISC || defined _ASM +# define JB_GPR1 0 /* Also known as the stack pointer */ +# define JB_GPR2 1 +# define JB_LR 2 /* The address we will return to */ +# define JB_GPRS 3 /* GPRs 14 through 31 are saved, 18 in total */ +# define JB_CR 21 /* Condition code registers. */ +# define JB_FPRS 22 /* FPRs 14 through 31 are saved, 18*2 words total */ +#endif + +#ifndef _ASM +typedef long int __jmp_buf[64]; +#endif + +/* Test if longjmp to JMPBUF would unwind the frame + containing a local variable at ADDRESS. */ +#define _JMPBUF_UNWINDS(jmpbuf, address) \ + ((void *) (address) < (void *) (jmpbuf)[JB_GPR1]) diff --git a/ports/sysdeps/unix/sysv/aix/bits/sigaction.h b/ports/sysdeps/unix/sysv/aix/bits/sigaction.h new file mode 100644 index 000000000..55414b8f1 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/sigaction.h @@ -0,0 +1,72 @@ +/* The proper definitions for AIX's sigaction. + Copyright (C) 1993-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 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 _SIGNAL_H +# error "Never include <bits/sigaction.h> directly; use <signal.h> instead." +#endif + +/* Structure describing the action to be taken when a signal arrives. */ +struct sigaction + { + /* Signal handler. */ +#ifdef __USE_POSIX199309 + union + { + /* Used if SA_SIGINFO is not set. */ + __sighandler_t sa_handler; + /* Used if SA_SIGINFO is set. */ + void (*sa_sigaction) (int, siginfo_t *, void *); + } + __sigaction_handler; +# define sa_handler __sigaction_handler.sa_handler +# define sa_sigaction __sigaction_handler.sa_sigaction +#else + __sighandler_t sa_handler; +#endif + + /* Additional set of signals to be blocked. */ + __sigset_t sa_mask; + + /* Special flags. */ + int sa_flags; + }; + +/* Bits in `sa_flags'. */ +#define SA_NOCLDSTOP 4 /* Don't send SIGCHLD when children stop. */ +#define SA_NOCLDWAIT 0x400 /* Don't create on death of child. */ +#define SA_SIGINFO 0x100 /* Invoke signal-catching function with + three arguments instead of one. */ +#if defined __USE_UNIX98 || defined __USE_MISC +# define SA_ONSTACK 0x00000001 /* Use signal stack by using `sa_restorer'. */ +# define SA_RESTART 0x00000008 /* Restart syscall on signal return. */ +# define SA_NODEFER 0x00000200 /* Don't automatically block the signal when + its handler is being executed. */ +# define SA_RESETHAND 0x00000002 /* Reset to SIG_DFL on entry to handler. */ +#endif +#ifdef __USE_MISC +/* Some aliases for the SA_ constants. */ +# define SA_NOMASK SA_NODEFER +# define SA_ONESHOT SA_RESETHAND +# define SA_STACK SA_ONSTACK +#endif + +/* Values for the HOW argument to `sigprocmask'. */ +#define SIG_BLOCK 0 /* Block signals. */ +#define SIG_UNBLOCK 1 /* Unblock signals. */ +#define SIG_SETMASK 2 /* Set the set of blocked signals. */ diff --git a/ports/sysdeps/unix/sysv/aix/bits/sigcontext.h b/ports/sysdeps/unix/sysv/aix/bits/sigcontext.h new file mode 100644 index 000000000..40bec1b71 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/sigcontext.h @@ -0,0 +1,32 @@ +/* Copyright (C) 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. */ + +#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H +# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead." +#endif + +#include <sys/ucontext.h> + + +struct sigcontext +{ + int sc_onstack; /* Sigstack state to restore. */ + sigset_t sc_mask; /* Signal mask to restore. */ + int sc_uerror; /* u_error to restore. */ + struct mcontext_t sc_jmpbuf; /* Process context to restore. */ +}; diff --git a/ports/sysdeps/unix/sysv/aix/bits/signum.h b/ports/sysdeps/unix/sysv/aix/bits/signum.h new file mode 100644 index 000000000..67eb94960 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/signum.h @@ -0,0 +1,96 @@ +/* Signal number definitions. AIX version. + Copyright (C) 1995-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 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. */ + +#ifdef _SIGNAL_H + +/* Fake signal functions. */ +#define SIG_ERR ((__sighandler_t) -1) /* Error return. */ +#define SIG_DFL ((__sighandler_t) 0) /* Default action. */ +#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */ + +#ifdef __USE_UNIX98 +# define SIG_HOLD ((__sighandler_t) 2) /* Add signal to hold mask. */ +# define SIG_CATCHE ((__sighandler_t) 3) +#endif + + +/* Signals. */ +#define SIGHUP 1 /* Hangup (POSIX). */ +#define SIGINT 2 /* Interrupt (ANSI). */ +#define SIGQUIT 3 /* Quit (POSIX). */ +#define SIGILL 4 /* Illegal instruction (ANSI). */ +#define SIGTRAP 5 /* Trace trap (POSIX). */ +#define SIGABRT 6 /* Abort (ANSI). */ +#define SIGIOT SIGABRT /* Abort (terminal) process. */ +#define SIGEMT 7 /* EMT instruction. */ +#define SIGFPE 8 /* Floating-point exception (ANSI). */ +#define SIGKILL 9 /* Kill, unblockable (POSIX). */ +#define SIGBUS 10 /* BUS error (4.2 BSD). */ +#define SIGSEGV 11 /* Segmentation violation (ANSI). */ +#define SIGSYS 12 /* Bad system call. */ +#define SIGPIPE 13 /* Broken pipe (POSIX). */ +#define SIGALRM 14 /* Alarm clock (POSIX). */ +#define SIGTERM 15 /* Termination (ANSI). */ +#define SIGURG 16 /* Urgent condition on socket (4.2 BSD). */ +#define SIGIOINT SIGURG /* Printer to backend error signal. */ +#define SIGSTOP 17 /* Stop, unblockable (POSIX). */ +#define SIGTSTP 18 /* Keyboard stop (POSIX). */ +#define SIGCONT 19 /* Continue (POSIX). */ +#define SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */ +#define SIGCHLD 20 /* Child status has changed (POSIX). */ +#define SIGTTIN 21 /* Background read from tty (POSIX). */ +#define SIGTTOU 22 /* Background write to tty (POSIX). */ +#define SIGIO 23 /* I/O now possible (4.2 BSD). */ +#define SIGAIO SIGIO /* Base LAN I/O. */ +#define SIGPTY SIGIO /* PTY I/O. */ +#define SIGPOLL SIGIO /* ANother I/O event. */ +#define SIGXCPU 24 /* CPU limit exceeded (4.2 BSD). */ +#define SIGXFSZ 25 /* File size limit exceeded (4.2 BSD). */ +#define SIGMSG 27 /* Input data is in the ring buffer. */ +#define SIGWINCH 28 /* Window size change (4.3 BSD, Sun). */ +#define SIGPWR 29 /* Power failure restart (System V). */ +#define SIGUSR1 30 /* User-defined signal 1 (POSIX). */ +#define SIGUSR2 31 /* User-defined signal 2 (POSIX). */ +#define SIGPROF 32 /* Profiling alarm clock (4.2 BSD). */ +#define SIGDANGER 33 /* System crash imminent. */ +#define SIGVTALRM 34 /* Virtual alarm clock (4.2 BSD). */ +#define SIGMIGRATE 35 /* Migrate process. */ +#define SIGPRE 36 /* Programming exception. */ +#define SIGVIRT 37 /* AIX virtual time alarm. */ +#define SIGARLM1 38 /* Reserved, don't use. */ +#define SIGWAITING 39 /* Reserved, don't use. */ +#define SIGCPUFAIL 59 /* Predictive de-configuration of processors.*/ +#define SIGKAP 60 /* Keep alive poll from native keyboard. */ +#define SIGGRANT SIGKAP /* Monitor mode granted. */ +#define SIGRETRACT 61 /* Monitor mode should be relinguished. */ +#define SIGSOUND 62 /* Sound control has completed. */ +#define SIGSAK 63 /* Secure attentation key. */ + +#define _NSIG 64 /* Biggest signal number + 1 + (including real-time signals). */ + +#define SIGRTMIN (__libc_current_sigrtmin ()) +#define SIGRTMAX (__libc_current_sigrtmax ()) + +/* These are the hard limits of the kernel. These values should not be + used directly at user level. */ +#define __SIGRTMIN 888 +#define __SIGRTMAX 999 + +#endif /* <signal.h> included. */ diff --git a/ports/sysdeps/unix/sysv/aix/bits/sigset.h b/ports/sysdeps/unix/sysv/aix/bits/sigset.h new file mode 100644 index 000000000..0dc6b40a7 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/sigset.h @@ -0,0 +1,125 @@ +/* __sig_atomic_t, __sigset_t, and related definitions. AIX version. + Copyright (C) 1991,1992,1994,1996,1997,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 _SIGSET_H_types +# define _SIGSET_H_types 1 + +typedef int __sig_atomic_t; + +/* A `sigset_t' has a bit for each signal. */ + +typedef struct + { + unsigned int __losigs; + unsigned int __hisigs; + } __sigset_t; + +#endif + + +/* We only want to define these functions if <signal.h> was actually + included; otherwise we were included just to define the types. Since we + are namespace-clean, it wouldn't hurt to define extra macros. But + trouble can be caused by functions being defined (e.g., any global + register vars declared later will cause compilation errors). */ + +#if !defined _SIGSET_H_fns && defined _SIGNAL_H +# define _SIGSET_H_fns 1 + +# ifndef _EXTERN_INLINE +# define _EXTERN_INLINE extern __inline +# endif + +/* Return a mask that includes the bit for SIG only. */ +# define __sigmask(sig) \ + (((unsigned long int) 1) << (((sig) - 1) % (8 * sizeof (unsigned int)))) + +# if defined __GNUC__ && __GNUC__ >= 2 +# define __sigemptyset(set) \ + (__extension__ ({ sigset_t *__set = (set); \ + __set->__losigs = __set->__hisigs = 0; \ + 0; })) +# define __sigfillset(set) \ + (__extension__ ({ sigset_t *__set = (set); \ + __set->__losigs = __set->__hisigs = ~0u; \ + 0; })) + +# ifdef __USE_GNU +/* The POSIX does not specify for handling the whole signal set in one + command. This is often wanted and so we define three more functions + here. */ +# define __sigisemptyset(set) \ + (__extension__ ({ const sigset_t *__set = (set); \ + (__set->__losigs | __set->__hisigs) == 0; })) +# define __sigandset(dest, left, right) \ + (__extension__ ({ sigset_t *__dest = (dest); \ + const sigset_t *__left = (left); \ + const sigset_t *__right = (right); \ + __dest->__losigs = __left->__losigs & __right->__losigs; \ + __dest->__hisigs = __left->__hisigs & __right->__hisigs; \ + 0; })) +# define __sigorset(dest, left, right) \ + (__extension__ ({ sigset_t *__dest = (dest); \ + const sigset_t *__left = (left); \ + const sigset_t *__right = (right); \ + __dest->__losigs = __left->__losigs | __right->__losigs; \ + __dest->__hisigs = __left->__hisigs | __right->__hisigs; \ + 0; })) +# endif +# endif + +/* These functions needn't check for a bogus signal number -- error + checking is done in the non __ versions. */ + +extern int __sigismember (__const __sigset_t *, int); +extern int __sigaddset (__sigset_t *, int); +extern int __sigdelset (__sigset_t *, int); + +# ifdef __USE_EXTERN_INLINES +_EXTERN_INLINE int +__sigismember (__const __sigset_t *__set, int __sig) +{ + unsigned int __mask = __sigmask (__sig); + + return ((__sig < 33 ? __set->__losigs : __set->__hisigs) & __mask ) ? 1 : 0; +} + +_EXTERN_INLINE int +__sigaddset (__sigset_t *__set, int __sig) +{ + unsigned int __mask = __sigmask (__sig); + + (__sig < 33 ? __set->__losigs : __set->__hisigs) |= __mask; + + return 0; +} + +_EXTERN_INLINE int +__sigdelset (__sigset_t *__set, int __sig) +{ + unsigned int __mask = __sigmask (__sig); + + (__sig < 33 ? __set->__losigs : __set->__hisigs) &= ~__mask; + + return 0; +} +# endif + + +#endif /* ! _SIGSET_H_fns. */ diff --git a/ports/sysdeps/unix/sysv/aix/bits/sigstack.h b/ports/sysdeps/unix/sysv/aix/bits/sigstack.h new file mode 100644 index 000000000..cefd33c23 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/sigstack.h @@ -0,0 +1,46 @@ +/* sigstack, sigaltstack definitions. + Copyright (C) 1998, 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 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 _SIGNAL_H +# error "Never include this file directly. Use <signal.h> instead" +#endif + + +/* Structure describing a signal stack (obsolete). */ +struct sigstack + { + void *ss_sp; /* Signal stack pointer. */ + int ss_onstack; /* Nonzero if executing on this stack. */ + }; + + +/* Possible values for `ss_flags.'. */ +enum +{ + SS_ONSTACK = 1, +#define SS_ONSTACK SS_ONSTACK + SS_DISABLE +#define SS_DISABLE SS_DISABLE +}; + +/* Minimum stack size for a signal handler. */ +#define MINSIGSTKSZ 1024 + +/* System default stack size. */ +#define SIGSTKSZ 4096 diff --git a/ports/sysdeps/unix/sysv/aix/bits/socket.h b/ports/sysdeps/unix/sysv/aix/bits/socket.h new file mode 100644 index 000000000..1fdadfe08 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/socket.h @@ -0,0 +1,293 @@ +/* System-specific socket constants and types. AIX version. + Copyright (C) 1991,92,1994-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 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 __BITS_SOCKET_H +#define __BITS_SOCKET_H + +#if !defined _SYS_SOCKET_H && !defined _NETINET_IN_H +# error "Never include <bits/socket.h> directly; use <sys/socket.h> instead." +#endif + +#define __need_size_t +#define __need_NULL +#include <stddef.h> + +#include <limits.h> +#include <sys/types.h> + +/* Type for length arguments in socket calls. */ +#ifndef __socklen_t_defined +typedef __socklen_t socklen_t; +# define __socklen_t_defined +#endif + +/* Types of sockets. */ +enum __socket_type +{ + SOCK_STREAM = 1, /* Sequenced, reliable, connection-based + byte streams. */ +#define SOCK_STREAM SOCK_STREAM + SOCK_DGRAM = 2, /* Connectionless, unreliable datagrams + of fixed maximum length. */ +#define SOCK_DGRAM SOCK_DGRAM + SOCK_RAW = 3, /* Raw protocol interface. */ +#define SOCK_RAW SOCK_RAW + SOCK_RDM = 4, /* Reliably-delivered messages. */ +#define SOCK_RDM SOCK_RDM + SOCK_SEQPACKET = 5, /* Sequenced, reliable, connection-based, + datagrams of fixed maximum length. */ +#define SOCK_SEQPACKET SOCK_SEQPACKET + SOCK_CONN_DGRAM = 6 /* Conneciton datagram. */ +#define SOCK_CONN_DGRAM SOCK_CONN_DGRAM +}; + +/* Protocol families. */ +#define PF_UNSPEC 0 /* Unspecified. */ +#define PF_LOCAL 1 /* Local to host (pipes and file-domain). */ +#define PF_UNIX PF_LOCAL /* Old BSD name for PF_LOCAL. */ +#define PF_FILE PF_LOCAL /* Another non-standard name for PF_LOCAL. */ +#define PF_INET 2 /* IP protocol family. */ +#define PF_IMPLINK 3 /* ARPAnet IMP addresses. */ +#define PF_PUP 4 /* PUP protocols (e.g., BSP). */ +#define PF_CHAOS 5 /* MIT CHAOS protocols. */ +#define PF_NS 6 /* XEROX NS protocols. */ +#define PF_ISO 7 /* ISO protocols. */ +#define PF_OSI PF_ISO +#define PF_ECMA 8 /* European Computer Manufacturers. */ +#define PF_DATAKIT 9 /* Datakit protocols. */ +#define PF_CCITT 10 /* CCITT protocols, X.25 etc. */ +#define PF_SNA 11 /* IBM SNA. */ +#define PF_DECnet 12 /* DECnet. */ +#define PF_DLI 13 /* DEC Direct data link interface. */ +#define PF_LAT 14 /* LAT. */ +#define PF_HYLINK 15 /* NSC Hyperchannel. */ +#define PF_APPLETALK 16 /* Apple Talk. */ +#define PF_NETLINK 17 /* Internet Routing Protocol. */ +#define PF_ROUTE PF_NETLINK /* Alias to emulate 4.4BSD. */ +#define PF_LINK 18 /* Link layer interface. */ +#define PF_XTP 19 /* eXpress Transfer Protocol (no AF). */ +#define PF_INTF 20 /* Debugging use only. */ +#define PF_RIF 21 /* Raw interface. */ +#define PF_NETWARE 22 +#define PF_NDD 23 +#define PF_INET6 24 /* IPv6. */ +#define PF_MAX 30 /* For now.. */ + +/* Address families. */ +#define AF_UNSPEC PF_UNSPEC +#define AF_LOCAL PF_LOCAL +#define AF_UNIX PF_UNIX +#define AF_FILE PF_FILE +#define AF_INET PF_INET +#define AF_IMPLINK PF_IMPLINK +#define AF_PUP PF_PUP +#define AF_CHAOS PF_CHAOS +#define AF_NS PF_NS +#define AF_ISO PF_ISO +#define AF_OSI PF_OSI +#define AF_ECMA PF_ECMA +#define AF_DATAKIT PF_DATAKIT +#define AF_CCITT PF_CCITT +#define AF_SNA PF_SNA +#define AF_DECnet PF_DECnet +#define AF_DLI PF_DLI +#define AF_LAT PF_LAT +#define AF_HYLINK PF_HYLINK +#define AF_APPLETALK PF_APPLETALK +#define AF_NETLINK PF_NETLINK +#define AF_ROUTE PF_ROUTE +#define AF_LINK PF_LINK +#define AF_INTF PF_INTF +#define AF_RIF PF_RIF +#define AF_NETWARE PF_NETWARE +#define AF_NDD PF_NDD +#define AF_INET6 PF_INET6 +#define AF_MAX PF_MAX + +/* Socket level values. Others are defined in the appropriate headers. + + XXX These definitions also should go into the appropriate headers as + far as they are available. */ +#define SOL_SOCKET 0xffff + +/* Maximum queue length specifiable by listen. */ +#define SOMAXCONN 1024 + +/* Get the definition of the macro to define the common sockaddr members. */ +#include <bits/sockaddr.h> + +/* Structure describing a generic socket address. */ +struct sockaddr + { + __SOCKADDR_COMMON (sa_); /* Common data: address family and length. */ + char sa_data[14]; /* Address data. */ + }; + + +/* Structure large enough to hold any socket address (with the historical + exception of AF_UNIX). We reserve 128 bytes. */ +#if ULONG_MAX > 0xffffffff +# define __ss_aligntype __uint64_t +#else +# define __ss_aligntype __uint32_t +#endif +#define _SS_SIZE 128 +#define _SS_PADSIZE (_SS_SIZE - (2 * sizeof (__ss_aligntype))) + +struct sockaddr_storage + { + __SOCKADDR_COMMON (ss_); /* Address family, etc. */ + __ss_aligntype __ss_align; /* Force desired alignment. */ + char __ss_padding[_SS_PADSIZE]; + }; + + +/* Bits in the FLAGS argument to `send', `recv', et al. */ +enum + { + MSG_OOB = 0x01, /* Process out-of-band data. */ +#define MSG_OOB MSG_OOB + MSG_PEEK = 0x02, /* Peek at incoming messages. */ +#define MSG_PEEK MSG_PEEK + MSG_DONTROUTE = 0x04, /* Don't use local routing. */ +#define MSG_DONTROUTE MSG_DONTROUTE + MSG_EOR = 0x08, /* End of record. */ +#define MSG_EOR MSG_EOR + MSG_TRUNC = 0x10, +#define MSG_TRUNC MSG_TRUNC + MSG_CTRUNC = 0x20, /* Control data lost before delivery. */ +#define MSG_CTRUNC MSG_CTRUNC + MSG_WAITALL = 0x40, /* Wait for a full request. */ +#define MSG_WAITALL MSG_WAITALL + MSG_MPEG2 = 0x80, /* Message contain MPEG2 data. */ +#define MSG_MPEG2 MSG_MPEG2 + }; + + +/* Structure describing messages sent by + `sendmsg' and received by `recvmsg'. */ +struct msghdr + { + void *msg_name; /* Address to send to/receive from. */ + socklen_t msg_namelen; /* Length of address data. */ + + struct iovec *msg_iov; /* Vector of data to send/receive into. */ + int msg_iovlen; /* Number of elements in the vector. */ + + void *msg_control; /* Ancillary data (eg BSD filedesc passing). */ + socklen_t msg_controllen; /* Ancillary data buffer length. */ + + int msg_flags; /* Flags on received message. */ + }; + +/* Structure used for storage of ancillary data object information. */ +struct cmsghdr + { + socklen_t cmsg_len; /* Length of data in cmsg_data plus length + of cmsghdr structure. */ + int cmsg_level; /* Originating protocol. */ + int cmsg_type; /* Protocol specific type. */ +#if (!defined __STRICT_ANSI__ && __GNUC__ >= 2) || __STDC_VERSION__ >= 199901L + __extension__ unsigned char __cmsg_data __flexarr; /* Ancillary data. */ +#endif + }; + +/* Ancillary data object manipulation macros. */ +#if (!defined __STRICT_ANSI__ && __GNUC__ >= 2) || __STDC_VERSION__ >= 199901L +# define CMSG_DATA(cmsg) ((cmsg)->__cmsg_data) +#else +# define CMSG_DATA(cmsg) ((unsigned char *) ((struct cmsghdr *) (cmsg) + 1)) +#endif +#define CMSG_NXTHDR(mhdr, cmsg) __cmsg_nxthdr (mhdr, cmsg) +#define CMSG_FIRSTHDR(mhdr) \ + ((size_t) (mhdr)->msg_controllen >= sizeof (struct cmsghdr) \ + ? (struct cmsghdr *) (mhdr)->msg_control : (struct cmsghdr *) NULL) +#define CMSG_ALIGN(len) (((len) + sizeof (size_t) - 1) \ + & ~(sizeof (size_t) - 1)) +#define CMSG_SPACE(len) (CMSG_ALIGN (len) \ + + CMSG_ALIGN (sizeof (struct cmsghdr))) +#define CMSG_LEN(len) (CMSG_ALIGN (sizeof (struct cmsghdr)) + (len)) + +extern struct cmsghdr *__cmsg_nxthdr (struct msghdr *__mhdr, + struct cmsghdr *__cmsg) __THROW; +#ifdef __USE_EXTERN_INLINES +# ifndef _EXTERN_INLINE +# define _EXTERN_INLINE extern __inline +# endif +_EXTERN_INLINE struct cmsghdr * +__cmsg_nxthdr (struct msghdr *__mhdr, struct cmsghdr *__cmsg) __THROW +{ + if ((size_t) __cmsg->cmsg_len < sizeof (struct cmsghdr)) + /* The kernel header does this so there may be a reason. */ + return 0; + + __cmsg = (struct cmsghdr *) ((unsigned char *) __cmsg + + CMSG_ALIGN (__cmsg->cmsg_len)); + if ((unsigned char *) (__cmsg + 1) >= ((unsigned char *) __mhdr->msg_control + + __mhdr->msg_controllen) + || ((unsigned char *) __cmsg + CMSG_ALIGN (__cmsg->cmsg_len) + > ((unsigned char *) __mhdr->msg_control + __mhdr->msg_controllen))) + /* No more entries. */ + return 0; + return __cmsg; +} +#endif /* Use `extern inline'. */ + +/* Socket level message types. This must match the definitions in + <linux/socket.h>. */ +enum + { + SCM_RIGHTS = 0x01 /* Transfer file descriptors. */ +#define SCM_RIGHTS SCM_RIGHTS + }; + +/* Options flags per socket. */ +#define SO_DEBUG 0x0001 /* Turn on debugging info recording. */ +#define SO_ACCEPTCONN 0x0002 /* Socket has had listen(). */ +#define SO_REUSEADDR 0x0004 /* Allow local address reuse. */ +#define SO_KEEPALIVE 0x0008 /* Keep connections alive. */ +#define SO_DONTROUTE 0x0010 /* Just use interface addresses. */ +#define SO_BROADCAST 0x0020 /* Permit sending of broadcast msgs. */ +#define SO_USELOOPBACK 0x0040 /* Bypass hardware when possible. */ +#define SO_LINGER 0x0080 /* Linger on close if data present. */ +#define SO_OOBINLINE 0x0100 /* Leave received OOB data in line. */ +#define SO_REUSEPORT 0x0200 /* Allow local address & port reuse. */ +#define SO_USE_IFBUFS 0x0400 /* Interface will supply buffers. */ +#define SO_CKSUMRECV 0x0800 /* Defer checksum until receive. */ +#define SO_NOREUSEADDR 0x1000 /* Prevent local address reuse. */ +#define SO_SNDBUF 0x1001 /* Send buffer size. */ +#define SO_RCVBUF 0x1002 /* Receive buffer size. */ +#define SO_SNDLOWAT 0x1003 /* Send low-water mark. */ +#define SO_RCVLOWAT 0x1004 /* Receive low-water mark. */ +#define SO_SNDTIMEO 0x1005 /* Send timeout. */ +#define SO_RCVTIMEO 0x1006 /* Receive timeout. */ +#define SO_ERROR 0x1007 /* Get error status and clear. */ +#define SO_TYPE 0x1008 /* Get socket type. */ +#define SO_KERNACCEPT 0x2000 /* Derive a in-kernel only socket. */ +#define SO_AUDIT 0x8000 /* Turn on socket auditing. */ + + +/* Structure used to manipulate the SO_LINGER option. */ +struct linger + { + int l_onoff; /* Nonzero to linger on close. */ + int l_linger; /* Time to linger. */ + }; + +#endif /* bits/socket.h */ diff --git a/ports/sysdeps/unix/sysv/aix/bits/stat.h b/ports/sysdeps/unix/sysv/aix/bits/stat.h new file mode 100644 index 000000000..adcb1d101 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/stat.h @@ -0,0 +1,119 @@ +/* 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 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 _SYS_STAT_H +# error "Never include <bits/stat.h> directly; use <sys/stat.h> instead." +#endif + +struct stat + { + __dev_t st_dev; /* Device. */ + __ino_t st_ino; /* File serial number. */ + __mode_t st_mode; /* File mode. */ + __nlink_t st_nlink; /* Link count. */ + unsigned short int st_flag; /* Flag word. */ + __uid_t st_uid; /* User ID of the file's owner. */ + __gid_t st_gid; /* Group ID of the file's group.*/ + __dev_t st_rdev; /* Device number, if device. */ +#ifndef __USE_FILE_OFFSET64 + __off_t st_size; /* Size of file, in bytes. */ +#else + int st_ssize; /* Size of file, in bytes. */ +#endif + __time_t st_atime; /* Time of last access. */ + unsigned long int __unused1; + __time_t st_mtime; /* Time of last modification. */ + unsigned long int __unused2; + __time_t st_ctime; /* Time of last status change. */ + unsigned long int __unused3; + __blksize_t st_blksize; /* Optimal block size for I/O. */ + __blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */ + int st_vfstype; /* Type of the filesystem. */ + unsigned int st_vfs; /* Vfs number. */ + unsigned int st_type; /* Vnode type. */ + unsigned int st_gen; /* Inode generation number. */ + +#define _STATBUF_RESERVED_SPACE 9 + unsigned int st_reserved[_STATBUF_RESERVED_SPACE]; + +#ifdef __USE_FILE_OFFSET64 + unsigned int st_padto_ll; + __off64_t st_size; /* 64 bit file size in bytes. */ +#endif + }; + +#ifdef __USE_LARGEFILE64 +struct stat64 + { + __dev_t st_dev; /* Device. */ + __ino_t st_ino; /* File serial number. */ + __mode_t st_mode; /* File mode. */ + __nlink_t st_nlink; /* Link count. */ + unsigned short int st_flag; /* Flag word. */ + __uid_t st_uid; /* User ID of the file's owner. */ + __gid_t st_gid; /* Group ID of the file's group.*/ + __dev_t st_rdev; /* Device number, if device. */ + int st_ssize; /* Size of file, in bytes. */ + __time_t st_atime; /* Time of last access. */ + unsigned long int __unused1; + __time_t st_mtime; /* Time of last modification. */ + unsigned long int __unused2; + __time_t st_ctime; /* Time of last status change. */ + unsigned long int __unused3; + __blksize_t st_blksize; /* Optimal block size for I/O. */ + __blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */ + int st_vfstype; /* Type of the filesystem. */ + unsigned int st_vfs; /* Vfs number. */ + unsigned int st_type; /* Vnode type. */ + unsigned int st_gen; /* Inode generation number. */ + unsigned int st_reserved[_STATBUF_RESERVED_SPACE]; + unsigned int st_padto_ll; + __off64_t st_size; /* 64 bit file size in bytes. */ + }; +#endif + +/* Tell code we have these members. */ +#define _STATBUF_ST_BLKSIZE +#define _STATBUF_ST_RDEV + +/* Encoding of the file mode. */ + +#define __S_IFMT 0170000 /* These bits determine file type. */ + +/* File types. */ +#define __S_IFDIR 0040000 /* Directory. */ +#define __S_IFCHR 0020000 /* Character device. */ +#define __S_IFBLK 0060000 /* Block device. */ +#define __S_IFREG 0100000 /* Regular file. */ +#define __S_IFIFO 0010000 /* FIFO. */ +#define __S_IFLNK 0120000 /* Symbolic link. */ +#define __S_IFSOCK 0140000 /* Socket. */ + +/* POSIX.1b objects. */ +#define __S_TYPEISMQ(buf) (0) +#define __S_TYPEISSEM(buf) (0) +#define __S_TYPEISSHM(buf) (0) + +/* Protection bits. */ + +#define __S_ISUID 04000 /* Set user ID on execution. */ +#define __S_ISGID 02000 /* Set group ID on execution. */ +#define __S_ISVTX 01000 /* Save swapped text after use (sticky). */ +#define __S_IREAD 0400 /* Read by owner. */ +#define __S_IWRITE 0200 /* Write by owner. */ +#define __S_IEXEC 0100 /* Execute by owner. */ diff --git a/ports/sysdeps/unix/sysv/aix/bits/statfs.h b/ports/sysdeps/unix/sysv/aix/bits/statfs.h new file mode 100644 index 000000000..0a1c0a5e6 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/statfs.h @@ -0,0 +1,77 @@ +/* Copyright (C) 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 _SYS_STATFS_H +# error "Never include <bits/statfs.h> directly; use <sys/statfs.h> instead." +#endif + +#include <bits/types.h> /* for __fsid_t and __fsblkcnt_t*/ + +struct statfs + { + int f_version; + int f_type; + int f_bsize; + /* The following five elements have type `int' since AIX's fsfilcnt_t + and fsblkcnt_t types do not fit. */ + int f_blocks; + int f_bfree; + int f_bavail; + int f_files; + int f_ffree; + __fsid_t f_fsid; + int f_vfstype; + int f_fsize; + int f_vfsnumber; + int f_vfsoff; + int f_vfslen; + int f_vfsvers; + char f_fname[32]; + char f_fpack[32]; + int f_name_max; + }; + +#ifdef __USE_LARGEFILE64 +/* XXX There seems to be no 64-bit versio of this structure. */ +struct statfs64 + { + int f_version; + int f_type; + int f_bsize; + /* The following five elements have type `int' since AIX's fsfilcnt_t + and fsblkcnt_t types do not fit. */ + int f_blocks; + int f_bfree; + int f_bavail; + int f_files; + int f_ffree; + __fsid_t f_fsid; + int f_vfstype; + int f_fsize; + int f_vfsnumber; + int f_vfsoff; + int f_vfslen; + int f_vfsvers; + char f_fname[32]; + char f_fpack[32]; + int f_name_max; + }; +#endif + +/* Tell code we have these members. */ +#define _STATFS_F_NAME_MAX diff --git a/ports/sysdeps/unix/sysv/aix/bits/termios.h b/ports/sysdeps/unix/sysv/aix/bits/termios.h new file mode 100644 index 000000000..b178d9c1b --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/termios.h @@ -0,0 +1,189 @@ +/* termios type and macro definitions. AIX version. + 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 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 _TERMIOS_H +# error "Never include <bits/termios.h> directly; use <termios.h> instead." +#endif + +typedef unsigned char cc_t; +typedef unsigned int speed_t; +typedef unsigned int tcflag_t; + +#define NCCS 16 +struct termios + { + tcflag_t c_iflag; /* input mode flags */ + tcflag_t c_oflag; /* output mode flags */ + tcflag_t c_cflag; /* control mode flags */ + tcflag_t c_lflag; /* local mode flags */ + cc_t c_cc[NCCS]; /* control characters */ + }; + +/* c_cc characters */ +#define VINTR 0 +#define VQUIT 1 +#define VERASE 2 +#define VKILL 3 +#define VEOF 4 +#define VEOL 5 +#define VSTART 7 +#define VSTOP 8 +#define VSUSP 9 +#define VMIN 4 +#define VTIME 5 +#define VEOL2 6 +#define VDSUSP 10 +#define VREPRINT 11 +#define VDISCARD 12 +#define VWERSE 13 +#define VWERASE VWERSE +#define VLNEXT 14 +#define VSTRT VSTART + +/* c_iflag bits */ +#define IGNBRK 0000001 +#define BRKINT 0000002 +#define IGNPAR 0000004 +#define PARMRK 0000010 +#define INPCK 0000020 +#define ISTRIP 0000040 +#define INLCR 0000100 +#define IGNCR 0000200 +#define ICRNL 0000400 +#define IXON 0001000 +#define IXOFF 0002000 +#define IUCLC 0004000 +#define IXANY 0010000 +#define IMAXBEL 0200000 + +/* c_oflag bits */ +#define OPOST 0000001 +#define OLCUC 0000002 +#define ONLCR 0000004 +#define OCRNL 0000010 +#define ONOCR 0000020 +#define ONLRET 0000040 +#define OFILL 0000100 +#define OFDEL 0000200 +#if defined __USE_MISC || defined __USE_XOPEN +# define CRDLY 0001400 +# define CR0 0000000 +# define CR1 0000400 +# define CR2 0001000 +# define CR3 0001400 +# define TABDLY 0006000 +# define TAB0 0000000 +# define TAB1 0002000 +# define TAB2 0004000 +# define TAB3 0006000 +# define BSDLY 0010000 +# define BS0 0000000 +# define BS1 0010000 +# define FFDLY 0020000 +# define FF0 0000000 +# define FF1 0020000 +# define NLDLY 0040000 +# define NL0 0000000 +# define NL1 0040000 +#endif + +#define VTDLY 0100000 +#define VT0 0000000 +#define VT1 0100000 + +/* c_cflag bit meaning */ +#ifdef __USE_MISC +# define CBAUD 0000017 +#endif +#define B0 0000000 /* hang up */ +#define B50 0000001 +#define B75 0000002 +#define B110 0000003 +#define B134 0000004 +#define B150 0000005 +#define B200 0000006 +#define B300 0000007 +#define B600 0000010 +#define B1200 0000011 +#define B1800 0000012 +#define B2400 0000013 +#define B4800 0000014 +#define B9600 0000015 +#define B19200 0000016 +#define B38400 0000017 +#ifdef __USE_MISC +# define EXTA B19200 +# define EXTB B38400 +#endif +#define CSIZE 0000060 +#define CS5 0000000 +#define CS6 0000020 +#define CS7 0000040 +#define CS8 0000060 +#define CSTOPB 0000100 +#define CREAD 0000200 +#define PARENB 0000400 +#define PARODD 0001000 +#define HUPCL 0002000 +#define CLOCAL 0004000 +#ifdef __USE_MISC +# define CIBAUD 000003600000 /* input baud rate (not used) */ +# define CRTSCTS 020000000000 /* flow control */ +#endif + +/* c_lflag bits */ +#define ISIG 0000001 +#define ICANON 0000002 +#if defined __USE_MISC || defined __USE_XOPEN +# define XCASE 0000004 +#endif +#define ECHO 0000010 +#define ECHOE 0000020 +#define ECHOK 0000040 +#define ECHONL 0000100 +#define NOFLSH 0000200 +#define TOSTOP 0200000 +#ifdef __USE_MISC +# define ECHOCTL 0400000 +# define ECHOPRT 01000000 +# define ECHOKE 02000000 +# define FLUSHO 004000000 +# define PENDIN 04000000000 +#endif +#define IEXTEN 010000000 + +/* tcflow() and TCXONC use these */ +#define TCOOFF 0 +#define TCOON 1 +#define TCIOFF 2 +#define TCION 3 + +/* tcflush() and TCFLSH use these */ +#define TCIFLUSH 0 +#define TCOFLUSH 1 +#define TCIOFLUSH 2 + +/* tcsetattr uses these */ +#define TCSANOW 0 +#define TCSADRAIN 1 +#define TCSAFLUSH 2 + + +#define _IOT_termios /* Hurd ioctl type field. */ \ + _IOT (_IOTS (cflag_t), 4, _IOTS (cc_t), NCCS, _IOTS (speed_t), 2) diff --git a/ports/sysdeps/unix/sysv/aix/bits/types.h b/ports/sysdeps/unix/sysv/aix/bits/types.h new file mode 100644 index 000000000..12c3be730 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/types.h @@ -0,0 +1,136 @@ +/* Copyright (C) 1991,92,1994-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 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. */ + +/* + * Never include this file directly; use <sys/types.h> instead. + */ + +#ifndef _BITS_TYPES_H +#define _BITS_TYPES_H 1 + +#include <features.h> + +#define __need_NULL +#define __need_size_t +#include <stddef.h> + +/* Convenience types. */ +typedef unsigned char __u_char; +typedef unsigned short __u_short; +typedef unsigned int __u_int; +typedef unsigned long __u_long; +#ifdef __GNUC__ +__extension__ typedef unsigned long long int __u_quad_t; +__extension__ typedef long long int __quad_t; +#else +typedef struct + { + long int __val[2]; + } __quad_t; +typedef struct + { + __u_long __val[2]; + } __u_quad_t; +#endif +typedef signed char __int8_t; +typedef unsigned char __uint8_t; +typedef signed short int __int16_t; +typedef unsigned short int __uint16_t; +typedef signed int __int32_t; +typedef unsigned int __uint32_t; +#ifdef __GNUC__ +__extension__ typedef signed long long int __int64_t; +__extension__ typedef unsigned long long int __uint64_t; +#endif +typedef __quad_t *__qaddr_t; + +typedef __u_long __dev_t; /* Type of device numbers. */ +typedef __u_int __uid_t; /* Type of user identifications. */ +typedef __u_int __gid_t; /* Type of group identifications. */ +typedef __u_long __ino_t; /* Type of file serial numbers. */ +typedef __u_int __mode_t; /* Type of file attribute bitmasks. */ +typedef short int __nlink_t; /* Type of file link counts. */ +typedef long int __off_t; /* Type of file sizes and offsets. */ +typedef __quad_t __loff_t; /* Type of file sizes and offsets. */ +typedef int __pid_t; /* Type of process identifications. */ +typedef long int __ssize_t; /* Type of a byte count, or error. */ +typedef __u_long __rlim_t; /* Type of resource counts. */ +typedef __u_quad_t __rlim64_t; /* Type of resource counts (LFS). */ +typedef unsigned int __id_t; /* General type for ID. */ + +typedef struct + { + unsigned long int __val[2]; + } __fsid_t; /* Type of file system IDs. */ + +/* Everythin' else. */ +typedef long int __daddr_t; /* The type of a disk address. */ +typedef char *__caddr_t; +typedef long int __time_t; +typedef unsigned int __useconds_t; +typedef int __suseconds_t; +typedef long int __swblk_t; /* Type of a swap block maybe? */ + +typedef int __clock_t; + +/* Clock ID used in clock and timer functions. */ +typedef int __clockid_t; + +/* Timer ID returned by `timer_create'. */ +typedef int __timer_t; + +/* Number of descriptors that can fit in an `fd_set'. */ +#define __FD_SETSIZE 1024 + + +typedef long int __key_t; + +/* Type to represent block size. */ +typedef int __blksize_t; + +/* Types from the Large File Support interface. */ + +/* Type to count number os disk blocks. */ +typedef int __blkcnt_t; +typedef __quad_t __blkcnt64_t; + +/* Type to count file system blocks. */ +typedef __u_long __fsblkcnt_t; +typedef __u_quad_t __fsblkcnt64_t; + +/* Type to count file system inodes. */ +typedef __u_long __fsfilcnt_t; +typedef __u_quad_t __fsfilcnt64_t; + +/* Type of file serial numbers. */ +typedef __u_quad_t __ino64_t; + +/* Type of file sizes and offsets. */ +typedef __loff_t __off64_t; + +/* Used in XTI. */ +typedef int __t_scalar_t; +typedef unsigned int __t_uscalar_t; + +/* Duplicates info from stdint.h but this is used in unistd.h. */ +typedef signed long __intptr_t; + +/* Duplicate info from sys/socket.h. */ +typedef unsigned int __socklen_t; + +#endif /* bits/types.h */ diff --git a/ports/sysdeps/unix/sysv/aix/bits/uio.h b/ports/sysdeps/unix/sysv/aix/bits/uio.h new file mode 100644 index 000000000..60781532a --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/uio.h @@ -0,0 +1,42 @@ +/* Copyright (C) 1996, 1997, 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 _SYS_UIO_H +# error "Never include <bits/uio.h> directly; use <sys/uio.h> instead." +#endif + + +#include <sys/types.h> + + +/* Size of object which can be written atomically. + + This macro has different values in different kernel versions. The + latest versions of ther kernel use 1024 and this is good choice. Since + the C library implementation of readv/writev is able to emulate the + functionality even if the currently running kernel does not support + this large value the readv/writev call will not fail because of this. */ +#define UIO_MAXIOV 16 + + +/* Structure for scatter/gather I/O. */ +struct iovec + { + void *iov_base; /* Pointer to data. */ + size_t iov_len; /* Length of data. */ + }; diff --git a/ports/sysdeps/unix/sysv/aix/bits/utmp.h b/ports/sysdeps/unix/sysv/aix/bits/utmp.h new file mode 100644 index 000000000..b78a2afda --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/utmp.h @@ -0,0 +1,73 @@ +/* The `struct utmp' type, describing entries in the utmp file. AIX. + Copyright (C) 1996, 1997, 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 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 _UTMP_H +# error "Never include <bits/utmp.h> directly; use <utmp.h> instead." +#endif + +#include <paths.h> +#include <sys/time.h> +#include <sys/types.h> + + +#define UT_LINESIZE 12 +#define UT_NAMESIZE 8 +#define UT_HOSTSIZE 16 + + +struct utmp + { +#define ut_name ut_user + char ut_user[UT_NAMESIZE]; + char ut_id[14]; + char ut_line[UT_LINESIZE]; + short int ut_type; + short int ut_pid; + struct exit_status + { + short int e_termination; + short int e_exit; + } ut_exit; + __time_t ut_time; + char ut_host[UT_HOSTSIZE]; + }; + + +/* Values for the `ut_type' field of a `struct utmp'. */ +#define EMPTY 0 /* No valid user accounting information. */ + +#define RUN_LVL 1 /* The system's runlevel. */ +#define BOOT_TIME 2 /* Time of system boot. */ +#define OLD_TIME 3 /* Time when system clock changed. */ +#define NEW_TIME 4 /* Time after system clock changed. */ + +#define INIT_PROCESS 5 /* Process spawned by the init process. */ +#define LOGIN_PROCESS 6 /* Session leader of a logged in user. */ +#define USER_PROCESS 7 /* Normal process. */ +#define DEAD_PROCESS 8 /* Terminated process. */ + +#define ACCOUNTING 9 + + +/* Tell the user that we have a modern system with UT_HOST, UT_TYPE, and + UT_ID fields. */ +#define _HAVE_UT_TYPE 1 +#define _HAVE_UT_PID 1 +#define _HAVE_UT_ID 1 +#define _HAVE_UT_HOST 1 diff --git a/ports/sysdeps/unix/sysv/aix/bits/utmpx.h b/ports/sysdeps/unix/sysv/aix/bits/utmpx.h new file mode 100644 index 000000000..438b5f3a5 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/utmpx.h @@ -0,0 +1,75 @@ +/* Structures and defenitions for the user accounting database. AIX. + Copyright (C) 1997, 1998, 1999 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 _UTMPX_H +# error "Never include <bits/utmpx.h> directly; use <utmpx.h> instead." +#endif + +#include <bits/types.h> +#include <sys/time.h> + + +#ifdef __USE_GNU +# include <paths.h> +# define _PATH_UTMPX _PATH_UTMP +# define _PATH_WTMPX _PATH_WTMP +#endif + + +#define __UT_LINESIZE 12 +#define __UT_NAMESIZE 8 +#define __UT_HOSTSIZE 16 + + +/* The structure describing an entry in the user accounting database. */ +struct utmpx +{ + char ut_user[__UT_NAMESIZE]; /* Username. */ + char ut_id[14]; /* Inittab ID. */ + char ut_line[__UT_LINESIZE]; /* Devicename. */ + short int ut_type; /* Type of login. */ + __pid_t ut_pid; /* Process ID of login process. */ + struct timeval ut_tv; /* Time entry was made. */ + char ut_host[__UT_HOSTSIZE]; /* Hostname for remote login. */ +}; + + +/* Values for the `ut_type' field of a `struct utmpx'. */ +#define EMPTY 0 /* No valid user accounting information. */ + +#define RUN_LVL 1 /* The system's runlevel. */ +#define BOOT_TIME 2 /* Time of system boot. */ +#define NEW_TIME 3 /* Time after system clock changed. */ +#define OLD_TIME 4 /* Time when system clock changed. */ + +#define INIT_PROCESS 5 /* Process spawned by the init process. */ +#define LOGIN_PROCESS 6 /* Session leader of a logged in user. */ +#define USER_PROCESS 7 /* Normal process. */ +#define DEAD_PROCESS 8 /* Terminated process. */ + +#ifdef __USE_GNU +# define ACCOUNTING 9 /* System accounting. */ +#endif + +#define _HAVE_UT_TYPE 1 +#define _HAVE_UT_PID 1 +#define _HAVE_UT_ID 1 +#define _HAVE_UT_TV 1 +#define _HAVE_UT_HOST 1 + diff --git a/ports/sysdeps/unix/sysv/aix/bits/utsname.h b/ports/sysdeps/unix/sysv/aix/bits/utsname.h new file mode 100644 index 000000000..d238f5efd --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/bits/utsname.h @@ -0,0 +1,23 @@ +/* Copyright (C) 1997, 1999 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 _SYS_UTSNAME_H +# error "Never include <bits/utsname.h> directly; use <sys/utsname.h> instead." +#endif + +#define _UTSNAME_LENGTH 32 diff --git a/ports/sysdeps/unix/sysv/aix/brk.c b/ports/sysdeps/unix/sysv/aix/brk.c new file mode 100644 index 000000000..66707fe60 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/brk.c @@ -0,0 +1,25 @@ +/* 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 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. */ + +#include <unistd.h> + +int +__brk (void *addr) +{ + return brk (addr); +} diff --git a/ports/sysdeps/unix/sysv/aix/chdir.c b/ports/sysdeps/unix/sysv/aix/chdir.c new file mode 100644 index 000000000..153084eb6 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/chdir.c @@ -0,0 +1,25 @@ +/* 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 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. */ + +#include <unistd.h> + +int +__chdir (const char *path) +{ + return chdir (path); +} diff --git a/ports/sysdeps/unix/sysv/aix/chmod.c b/ports/sysdeps/unix/sysv/aix/chmod.c new file mode 100644 index 000000000..628d09cce --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/chmod.c @@ -0,0 +1,25 @@ +/* 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 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. */ + +#include <sys/stat.h> + +int +__chmod (const char *path, mode_t mode) +{ + return chmod (path, mode); +} diff --git a/ports/sysdeps/unix/sysv/aix/chown.c b/ports/sysdeps/unix/sysv/aix/chown.c new file mode 100644 index 000000000..2b6e82e73 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/chown.c @@ -0,0 +1,26 @@ +/* Copyright (C) 1999, 2000, 2002 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. */ + +#include <unistd.h> + +int +__chown (const char *file, uid_t owner, gid_t group) +{ + return chown (file, owner, group); +} +libc_hidden_def (__chown) diff --git a/ports/sysdeps/unix/sysv/aix/chroot.c b/ports/sysdeps/unix/sysv/aix/chroot.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/chroot.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/close.c b/ports/sysdeps/unix/sysv/aix/close.c new file mode 100644 index 000000000..7be595643 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/close.c @@ -0,0 +1,26 @@ +/* Copyright (C) 1999, 2000, 2002 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. */ + +#include <unistd.h> + +int +__close (int fd) +{ + return close (fd); +} +libc_hidden_def (__close) diff --git a/ports/sysdeps/unix/sysv/aix/configure b/ports/sysdeps/unix/sysv/aix/configure new file mode 100644 index 000000000..2c07b415f --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/configure @@ -0,0 +1,6 @@ +# This file is generated from configure.in by Autoconf. DO NOT EDIT! + # Local configure fragment for sysdeps/unix/sysv/aix. + +# Don't bother trying to generate any glue code to be compatible with the +# existing system library, because we are the only system library. +inhibit_glue=yes diff --git a/ports/sysdeps/unix/sysv/aix/configure.in b/ports/sysdeps/unix/sysv/aix/configure.in new file mode 100644 index 000000000..bb783fc0c --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/configure.in @@ -0,0 +1,6 @@ +GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. +# Local configure fragment for sysdeps/unix/sysv/aix. + +# Don't bother trying to generate any glue code to be compatible with the +# existing system library, because we are the only system library. +inhibit_glue=yes diff --git a/ports/sysdeps/unix/sysv/aix/connect.c b/ports/sysdeps/unix/sysv/aix/connect.c new file mode 100644 index 000000000..2f58be1ed --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/connect.c @@ -0,0 +1,11 @@ +/* This is a system call. We only have to provide the wrapper. */ +#include <sys/socket.h> + +#undef __connect + +int +__connect (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len) +{ + return connect (fd, addr, len); +} +INTDEF(__connect) diff --git a/ports/sysdeps/unix/sysv/aix/creat.c b/ports/sysdeps/unix/sysv/aix/creat.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/creat.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/dl-addr.c b/ports/sysdeps/unix/sysv/aix/dl-addr.c new file mode 100644 index 000000000..b8dbddfe4 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/dl-addr.c @@ -0,0 +1,30 @@ +/* + Copyright (C) 1996, 1997, 1998, 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 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. */ + +#include <dlfcn.h> +#include <stdlib.h> +#include <ldsodefs.h> + +int +internal_function +_dl_addr (const void *address, Dl_info *info) +{ + return 0; +} + diff --git a/ports/sysdeps/unix/sysv/aix/dl-close.c b/ports/sysdeps/unix/sysv/aix/dl-close.c new file mode 100644 index 000000000..edd45851f --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/dl-close.c @@ -0,0 +1,46 @@ +/* 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 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. */ + +#include <stdarg.h> +#include <stdlib.h> +#include <sys/types.h> +#include <errno.h> +#include <dlfcn.h> +#include <dlldr.h> + +extern int _dl_numso; +extern DL_SODATA *_dl_sotable; + +void +_dl_close (void *handle) +{ + if ((int) handle < 0 || (int) handle >= _dl_numso || _dl_sotable == NULL) + { + errno = EINVAL; + return; + } + + if (_dl_sotable[(int) handle].handle != 0) + __unload (_dl_sotable[(int) handle].handle); + + _dl_sotable[(int) handle].index = 0; + _dl_sotable[(int) handle].dataorg = 0; + _dl_sotable[(int) handle].handle = 0; + _dl_sotable[(int) handle].type = 0; +} + diff --git a/ports/sysdeps/unix/sysv/aix/dl-error.c b/ports/sysdeps/unix/sysv/aix/dl-error.c new file mode 100644 index 000000000..9c6335b59 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/dl-error.c @@ -0,0 +1,20 @@ +/* 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 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. */ + + +#include <elf/dl-error.c> diff --git a/ports/sysdeps/unix/sysv/aix/dl-libc.c b/ports/sysdeps/unix/sysv/aix/dl-libc.c new file mode 100644 index 000000000..69c627c19 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/dl-libc.c @@ -0,0 +1,41 @@ +/* Handle loading and unloading shared objects for internal libc purposes. + 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 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. */ + +#include <dlfcn.h> +#include <stdlib.h> +#include <ldsodefs.h> + +void * +__libc_dlopen (const char *name) +{ + return _dl_open (name, RTLD_LAZY, NULL); +} + +void * +__libc_dlsym (void *map, const char *name) +{ + return _dl_sym (map, name, NULL); +} + +int +__libc_dlclose (void *map) +{ + _dl_close (map); + return 0; +} diff --git a/ports/sysdeps/unix/sysv/aix/dl-open.c b/ports/sysdeps/unix/sysv/aix/dl-open.c new file mode 100644 index 000000000..070471d51 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/dl-open.c @@ -0,0 +1,133 @@ +/* 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 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. */ + +#include <malloc.h> +#include <stdarg.h> +#include <stdlib.h> +#include <sys/types.h> +#include <errno.h> +#include <dlfcn.h> +#include <dlldr.h> + +#define NUM_SHARED_OBJECTS 32 + +int _dl_numso = NUM_SHARED_OBJECTS; +DL_SODATA *_dl_sotable = NULL; + +void * +_dl_open (const char *file, int mode, const void *caller) +{ + DL_SODATA *new_so; + void *handle; + int entry; + int bsize = _dl_numso * sizeof (DL_INFO); + DL_INFO *dl_info = malloc (bsize); + + if (dl_info == NULL) + return NULL; + + /* 1st time thru initial shared object data table. */ + if (_dl_sotable == NULL) + { + _dl_sotable = (DL_SODATA *) calloc (_dl_numso, sizeof (DL_SODATA)); + if (_dl_sotable == NULL) + return NULL; + + __loadx (DL_POSTLOADQ, dl_info, bsize, NULL); + while (!(dl_info[0].dlinfo_xflags & DL_INFO_OK) + || dl_info[0].dlinfo_arraylen == 0) + { + bsize *= 2; + dl_info = realloc (dl_info, bsize); + if (dl_info == NULL) + return NULL; + + __loadx (DL_POSTLOADQ, dl_info, bsize, NULL); + } + } + + /* Validate mode bits. */ + if (!(mode & RTLD_NOW) && !(mode & RTLD_LAZY)) + { + free (dl_info); + errno = EINVAL; + return NULL; + } + + /* Load the module. */ + handle = (void *) __loadx (DL_LOAD | DL_LOAD_RTL | DL_LOAD_LDX1, + dl_info, bsize, file, NULL); + if (handle == NULL) + { + free (dl_info); + errno = EINVAL; + return NULL; + } + + /* Was dl_info buffer to small to get info. */ + while (!(dl_info[0].dlinfo_xflags & DL_INFO_OK) + || dl_info[0].dlinfo_arraylen == 0) + { + bsize *= 2; + dl_info = realloc (dl_info, bsize); + if (dl_info == NULL) + { + (void) __unload ((void *) handle); + errno = ENOMEM; + return NULL; + } + __loadx (DL_POSTLOADQ | DL_LOAD_RTL, dl_info, bsize, handle); + } + + /* Get an empty entry in the shared object table. */ + for (entry = 0; entry < _dl_numso; ++entry) + if (_dl_sotable[entry].type == 0) + break; + + /* See if the table needs to be increased. */ + if (entry == _dl_numso) + { + new_so = (DL_SODATA *) realloc (_dl_sotable, + _dl_numso * 2 * sizeof (DL_SODATA)); + if (new_so == NULL) + return NULL; + + memset (new_so + _dl_numso, '\0', _dl_numso * sizeof (DL_SODATA)); + _dl_numso *= 2; + _dl_sotable = new_so; + } + + /* See if this is syscall (look for /unix in file). */ + if (strcmp ("/unix", file) == 0) + { + _dl_sotable[entry].index = dl_info[1].dlinfo_index; + _dl_sotable[entry].dataorg = dl_info[1].dlinfo_dataorg; + _dl_sotable[entry].handle = handle; + _dl_sotable[entry].type = DL_UNIX_SYSCALL; + } + else + { + _dl_sotable[entry].index = dl_info[1].dlinfo_index; + _dl_sotable[entry].dataorg = dl_info[1].dlinfo_dataorg; + _dl_sotable[entry].handle = handle; + _dl_sotable[entry].type = DL_GETSYM; + } + + free (dl_info); + return (void *) entry; +} diff --git a/ports/sysdeps/unix/sysv/aix/dl-support.c b/ports/sysdeps/unix/sysv/aix/dl-support.c new file mode 100644 index 000000000..6172c853d --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/dl-support.c @@ -0,0 +1,20 @@ +/* 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 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. */ + + +#include <elf/dl-support.c> diff --git a/ports/sysdeps/unix/sysv/aix/dl-sym.c b/ports/sysdeps/unix/sysv/aix/dl-sym.c new file mode 100644 index 000000000..3f48b12cd --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/dl-sym.c @@ -0,0 +1,58 @@ +/* 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 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. */ + +#include <stdarg.h> +#include <stdlib.h> +#include <sys/types.h> +#include <errno.h> +#include <dlfcn.h> +#include <dlldr.h> + +extern int _dl_numso; +extern DL_SODATA *_dl_sotable; + +void * +_dl_sym (void *handle, const char *symbol, void *who) +{ + void *rt_function; + + if ((int) handle < 0 || (int) handle >= _dl_numso || _dl_sotable == NULL) + { + errno = EINVAL; + return NULL; + } + + switch (_dl_sotable[(int) handle].type) + { + case DL_UNIX_SYSCALL: + rt_function = (void *) __loadx (DL_UNIX_SYSCALL, (void *) symbol); + break; + + case DL_GETSYM: + rt_function = (void *) __loadx (DL_GETSYM, (void *) symbol, + _dl_sotable[(int) handle].index, + _dl_sotable[(int) handle].dataorg); + break; + + default: + errno = EINVAL; + return NULL; + } + + return rt_function; +} diff --git a/ports/sysdeps/unix/sysv/aix/dlldr.h b/ports/sysdeps/unix/sysv/aix/dlldr.h new file mode 100644 index 000000000..e0f3740d2 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/dlldr.h @@ -0,0 +1,111 @@ +/* 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 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. */ + + +/* + + int __loadx(flag, module, arg1, arg2, arg3) + + The __loadx() is a call to ld_loadutil() kernel function, which + does the real work. Note ld_loadutil() is not exported an cannot be + called directly from user space. + + void *ld_loadutil() call is a utility function used for loader extensions + supporting run-time linking and dl*() functions. + + void * - will return the modules entry point if it succeds of NULL + on failure. + + int flag - the flag field performas a dual role: the top 8 bits specify + the work for __loadx() to perform, the bottom 8 bits are + used to pass flags to the work routines, all other bits are + reserved. + +*/ + +#define DL_LOAD 0x1000000 /* __loadx(flag,buf, buf_len, filename, libr_path) */ +#define DL_POSTLOADQ 0x2000000 /* __loadx(flag,buf, buf_len, module_handle) */ +#define DL_EXECQ 0x3000000 /* __loadx(flag,buf, buf_len) */ +#define DL_EXITQ 0x4000000 /* __loadx(flag,buf, buf_len) */ +#define DL_PREUNLOADQ 0x5000000 /* __loadx(flag,buf, buf_len, module_handle) */ +#define DL_INIT 0x6000000 /* __loadx(flag,NULL) */ +#define DL_GETSYM 0x7000000 /* __loadx(flag,symbol, index, modules_data_origin) */ +#define DL_SETDEPEND 0x8000000 /* __loadx(flag,import_data_org, import_index, */ + /* export_data_org, export_index) */ +#define DL_DELDEPEND 0x9000000 /* __loadx(flag,import_data_org, import_index, */ + /* export_data_org, export_index) */ +#define DL_GLOBALSYM 0xA000000 /* __loadx(flag,symbol_name, ptr_to_rec_index, */ + /* ptr_to_rec_data_org) */ +#define DL_UNIX_SYSCALL 0xB000000 /* __loadx(flag,syscall_symbol_name) */ + +#define DL_FUNCTION_MASK 0xFF000000 +#define DL_SRCHDEPENDS 0x00100000 +#define DL_SRCHMODULE 0x00080000 +#define DL_SRCHLOADLIST 0x00040000 +#define DL_LOAD_LDX1 0x00040000 +#define DL_LOAD_RTL 0x00020000 +#define DL_HASHSTRING 0x00020000 +#define DL_INFO_OK 0x00010000 +#define DL_LOAD_DLINFO 0x00010000 +#define DL_UNLOADED 0x00020000 + +typedef union _dl_info +{ + struct { + uint _xflags; /* flag bits in the array */ + uint _size; /* size of this structure */ + uint _arraylen; /* number of following elements */ + } _dl_stat; + struct { + caddr_t _textorg; /* start of loaded program image */ + caddr_t _dataorg; /* start of data instance */ + uint _datasize; /* size of data instance */ + ushort _index; /* index of this le in la_dynlist */ + ushort _mflags; /* info about module from load() */ + } _dl_array; +} DL_INFO; + +#define dlinfo_xflags _dl_stat._xflags +#define dlinfo_arraylen _dl_stat._arraylen +#define dlinfo_size _dl_stat._size + +#define dlinfo_textorg _dl_array._textorg +#define dlinfo_datasize _dl_array._datasize +#define dlinfo_dataorg _dl_array._dataorg +#define dlinfo_index _dl_array._index +#define dlinfo_flags _dl_array._mflags + +#define DL_HAS_RTINIT 0x1 /* indicates the module __rtinit symbols */ +#define DL_IS_NEW 0x2 /* indicates that the module is newly loaded */ + +struct _xArgs +{ + char *libpath; + DL_INFO *info; + uint infosize; +}; + +/* Shared Object DATA used for dl-open,dl-sym & dl-close support */ +typedef struct +{ + void *handle; /* handle for __loadx */ + uint type; /* type of __loadx flag */ + ushort index; /* dlinfo_index */ + caddr_t dataorg; /* dlinfo_dataorg */ +} DL_SODATA; + diff --git a/ports/sysdeps/unix/sysv/aix/environ.c b/ports/sysdeps/unix/sysv/aix/environ.c new file mode 100644 index 000000000..01e7ba828 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/environ.c @@ -0,0 +1 @@ +/* We don't need to define environ, the kernel does it. */ diff --git a/ports/sysdeps/unix/sysv/aix/euidaccess.c b/ports/sysdeps/unix/sysv/aix/euidaccess.c new file mode 100644 index 000000000..c666af5fd --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/euidaccess.c @@ -0,0 +1,25 @@ +/* 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 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. */ + +#define ACC_SELF 0 + +int +euidaccess (const char *name, int type) +{ + return accessx (name, type, ACC_SELF); +} diff --git a/ports/sysdeps/unix/sysv/aix/execve.c b/ports/sysdeps/unix/sysv/aix/execve.c new file mode 100644 index 000000000..f8cc07d55 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/execve.c @@ -0,0 +1,25 @@ +/* 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 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. */ + +#include <unistd.h> + +int +__execve (const char *path, char *const argv[], char *const envp[]) +{ + return execve (path, argv, envp); +} diff --git a/ports/sysdeps/unix/sysv/aix/fchdir.c b/ports/sysdeps/unix/sysv/aix/fchdir.c new file mode 100644 index 000000000..9fe7e8bec --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/fchdir.c @@ -0,0 +1,26 @@ +/* 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 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. */ + +#include <unistd.h> + +int +__fchdir (fd) + int fd; +{ + return fchdir (fd); +} diff --git a/ports/sysdeps/unix/sysv/aix/fchmod.c b/ports/sysdeps/unix/sysv/aix/fchmod.c new file mode 100644 index 000000000..d4f0ac958 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/fchmod.c @@ -0,0 +1,25 @@ +/* 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 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. */ + +#include <sys/stat.h> + +int +__fchmod (int fd, mode_t mode) +{ + return fchmod (fd, mode); +} diff --git a/ports/sysdeps/unix/sysv/aix/fchown.c b/ports/sysdeps/unix/sysv/aix/fchown.c new file mode 100644 index 000000000..64252c038 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/fchown.c @@ -0,0 +1,25 @@ +/* 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 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. */ + +#include <unistd.h> + +int +__fchown (int fds, uid_t owner, gid_t group) +{ + return fchown (fds, owner, group); +} diff --git a/ports/sysdeps/unix/sysv/aix/fcntl.c b/ports/sysdeps/unix/sysv/aix/fcntl.c new file mode 100644 index 000000000..7f16cbe01 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/fcntl.c @@ -0,0 +1,43 @@ +/* Copyright (C) 1999, 2000, 2001, 2002 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. */ + +#include <fcntl.h> +#include <stdarg.h> + +extern int kfcntl (int fdes, int cmd, unsigned long int arg); + +int +__fcntl (int fdes, int cmd, ...) +{ + va_list va; + int res; + unsigned long int arg; + + va_start (va, cmd); + arg = va_arg (va, unsigned long int); + + res = kfcntl (fdes, cmd, arg); + + va_end (va); + + return res; +} +libc_hidden_def (__fcntl) +strong_alias (__fcntl, fcntl) +strong_alias (__fcntl, __libc_fcntl) +libc_hidden_def (__libc_fcntl) diff --git a/ports/sysdeps/unix/sysv/aix/fdatasync.c b/ports/sysdeps/unix/sysv/aix/fdatasync.c new file mode 100644 index 000000000..851f2e570 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/fdatasync.c @@ -0,0 +1,31 @@ +/* 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 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. */ + +#include <unistd.h> + +#define _FDATASYNC 0x00400000 +#define FDATASYNC _FDATASYNC + +extern int kfsync_range (int fd, int how, long long int off, + long long int len); + +int +fdatasync (int fd) +{ + return kfsync_range (fd, FDATASYNC, 0, 0); +} diff --git a/ports/sysdeps/unix/sysv/aix/fork.c b/ports/sysdeps/unix/sysv/aix/fork.c new file mode 100644 index 000000000..478d4afad --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/fork.c @@ -0,0 +1,29 @@ +/* Copyright (C) 1999, 2000, 2002 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. */ + +#include <unistd.h> + +#undef __fork + +pid_t +__fork (void) +{ + return kfork (); +} +libc_hidden_def (__fork) +strong_alias (__fork, fork) diff --git a/ports/sysdeps/unix/sysv/aix/fstatfs.c b/ports/sysdeps/unix/sysv/aix/fstatfs.c new file mode 100644 index 000000000..3f531f2a8 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/fstatfs.c @@ -0,0 +1,27 @@ +/* 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 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. */ + +#include <sys/statfs.h> + +extern int fstatfs (int fd, struct statfs *buf); + +int +__fstatfs (int fd, struct statfs *buf) +{ + return fstatfs (fd, buf); +} diff --git a/ports/sysdeps/unix/sysv/aix/fsync.c b/ports/sysdeps/unix/sysv/aix/fsync.c new file mode 100644 index 000000000..58734b6e8 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/fsync.c @@ -0,0 +1,31 @@ +/* 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 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. */ + +#include <unistd.h> + +#define _FSYNC 0x00000010 +#define FFILESYNC _FSYNC + +extern int kfsync_range (int fd, int how, long long int off, + long long int len); + +int +fsync (int fd) +{ + return kfsync_range (fd, FFILESYNC, 0, 0); +} diff --git a/ports/sysdeps/unix/sysv/aix/ftruncate.c b/ports/sysdeps/unix/sysv/aix/ftruncate.c new file mode 100644 index 000000000..758f2a423 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/ftruncate.c @@ -0,0 +1,28 @@ +/* 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 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. */ + +#include <unistd.h> + +extern int kftruncate (int fd, long long int length); + +int +__ftruncate (int fd, off_t length) +{ + return kftruncate (fd, length); +} +strong_alias (__ftruncate, ftruncate) diff --git a/ports/sysdeps/unix/sysv/aix/ftruncate64.c b/ports/sysdeps/unix/sysv/aix/ftruncate64.c new file mode 100644 index 000000000..5e7e4be4c --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/ftruncate64.c @@ -0,0 +1,28 @@ +/* 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 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. */ + +#include <unistd.h> + +extern int kftruncate (int fd, long long int length); + +int +__ftruncate64 (int fd, off64_t length) +{ + return kftruncate (fd, length); +} +weak_alias (__ftruncate64, ftruncate64) diff --git a/ports/sysdeps/unix/sysv/aix/fxstat.c b/ports/sysdeps/unix/sysv/aix/fxstat.c new file mode 100644 index 000000000..1ba56f690 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/fxstat.c @@ -0,0 +1,32 @@ +/* Copyright (C) 1999, 2000, 2002 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. */ + +#include <assert.h> +#include <sys/stat.h> + +#define STX_NORMAL 0x00 + +extern int fstatx (int fd, struct stat *st, int len, int cmd); + +int +__fxstat (int ver, int fd, struct stat *st) +{ + assert (ver == 0); + return fstatx (fd, st, sizeof (*st), STX_NORMAL); +} +hidden_def (__fxstat) diff --git a/ports/sysdeps/unix/sysv/aix/fxstat64.c b/ports/sysdeps/unix/sysv/aix/fxstat64.c new file mode 100644 index 000000000..5f75e070c --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/fxstat64.c @@ -0,0 +1,33 @@ +/* Copyright (C) 1999, 2000, 2002 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. */ + +#include <assert.h> +#include <sys/stat.h> + +#define STX_NORMAL 0x00 +#define STX_64 0x08 + +extern int fstatx (int fd, struct stat64 *st, int len, int cmd); + +int +__fxstat64 (int ver, int fd, struct stat64 *st) +{ + assert (ver == 0); + return fstatx (fd, st, sizeof (*st), STX_NORMAL | STX_64); +} +hidden_def (__fxstat64) diff --git a/ports/sysdeps/unix/sysv/aix/getdents.c b/ports/sysdeps/unix/sysv/aix/getdents.c new file mode 100644 index 000000000..ca896c332 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/getdents.c @@ -0,0 +1,28 @@ +/* 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 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. */ + +#include <dirent.h> +#include <sys/types.h> + +extern int getdirent (int fd, char *buf, size_t count); + +ssize_t +__getdents (int fd, char *buf, size_t count) +{ + return getdirent (fd, buf, count); +} diff --git a/ports/sysdeps/unix/sysv/aix/getegid.c b/ports/sysdeps/unix/sysv/aix/getegid.c new file mode 100644 index 000000000..c24692502 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/getegid.c @@ -0,0 +1,29 @@ +/* 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 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. */ + +#include <unistd.h> + +#define ID_EFFECTIVE 0x01 + + +gid_t +__getegid (void) +{ + return getgidx (ID_EFFECTIVE); +} +strong_alias (__getegid, getegid) diff --git a/ports/sysdeps/unix/sysv/aix/geteuid.c b/ports/sysdeps/unix/sysv/aix/geteuid.c new file mode 100644 index 000000000..b0722134b --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/geteuid.c @@ -0,0 +1,29 @@ +/* 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 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. */ + +#include <unistd.h> + +#define ID_EFFECTIVE 0x01 + + +uid_t +__geteuid (void) +{ + return getuidx (ID_EFFECTIVE); +} +strong_alias (__geteuid, geteuid) diff --git a/ports/sysdeps/unix/sysv/aix/getgid.c b/ports/sysdeps/unix/sysv/aix/getgid.c new file mode 100644 index 000000000..8b102b137 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/getgid.c @@ -0,0 +1,30 @@ +/* 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 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. */ + +#include <unistd.h> + +#define ID_REAL 2 + +extern gid_t getgidx (int which); + +gid_t +__getgid (void) +{ + return getgidx (ID_REAL); +} +strong_alias (__getgid, getgid) diff --git a/ports/sysdeps/unix/sysv/aix/getgroups.c b/ports/sysdeps/unix/sysv/aix/getgroups.c new file mode 100644 index 000000000..f7c813b19 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/getgroups.c @@ -0,0 +1,25 @@ +/* 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 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. */ + +#include <unistd.h> + +int +__getgroups (int size, gid_t list[]) +{ + return getgroups (size, list); +} diff --git a/ports/sysdeps/unix/sysv/aix/gethostname.c b/ports/sysdeps/unix/sysv/aix/gethostname.c new file mode 100644 index 000000000..a42384059 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/gethostname.c @@ -0,0 +1,27 @@ +/* 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 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. */ + +#include <unistd.h> + +int +__gethostname (name, len) + char *name; + size_t len; +{ + return gethostname (name, len); +} diff --git a/ports/sysdeps/unix/sysv/aix/getpeername.c b/ports/sysdeps/unix/sysv/aix/getpeername.c new file mode 100644 index 000000000..bec9bac2a --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/getpeername.c @@ -0,0 +1,28 @@ +/* Copyright (C) 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 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. */ + +#include <sys/socket.h> + +extern int ngetpeername (int s, void *uap_asa, int *uap_alen); + +int +getpeername (int fd, __SOCKADDR_ARG addr, socklen_t *len) +{ + return ngetpeername (fd, addr.__sockaddr__, len); +} +weak_alias (getpeername,__getpeername) diff --git a/ports/sysdeps/unix/sysv/aix/getpgid.c b/ports/sysdeps/unix/sysv/aix/getpgid.c new file mode 100644 index 000000000..a6e75f3f9 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/getpgid.c @@ -0,0 +1,29 @@ +/* Copyright (C) 1999, 2000, 2002 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. */ + +#include <unistd.h> + +extern int kgetpgidx (pid_t pid); + +int +__getgpid (pid_t pid) +{ + return kgetpgidx (pid); +} +libc_hidden_def (__getgpid) +strong_alias (__getpgid, getpgid) diff --git a/ports/sysdeps/unix/sysv/aix/getpgrp.c b/ports/sysdeps/unix/sysv/aix/getpgrp.c new file mode 100644 index 000000000..ce37738be --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/getpgrp.c @@ -0,0 +1 @@ +/* This function is available as a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/getpid.c b/ports/sysdeps/unix/sysv/aix/getpid.c new file mode 100644 index 000000000..8a74e22da --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/getpid.c @@ -0,0 +1,9 @@ +/* This is a system call. We only have to provide the wrapper. */ +#include <unistd.h> + +int +__getpid (void) +{ + return getpid (); +} +libc_hidden_def (__getpid) diff --git a/ports/sysdeps/unix/sysv/aix/getppid.c b/ports/sysdeps/unix/sysv/aix/getppid.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/getppid.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/getpriority.c b/ports/sysdeps/unix/sysv/aix/getpriority.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/getpriority.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/getrlimit.c b/ports/sysdeps/unix/sysv/aix/getrlimit.c new file mode 100644 index 000000000..0699cec64 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/getrlimit.c @@ -0,0 +1,25 @@ +/* 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 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. */ + +#include <sys/resource.h> + +int +__getrlimit (enum __rlimit_resource resource, struct rlimit *rlimits) +{ + return getrlimit (resource, rlimits); +} diff --git a/ports/sysdeps/unix/sysv/aix/getrlimit64.c b/ports/sysdeps/unix/sysv/aix/getrlimit64.c new file mode 100644 index 000000000..dd33ca9c7 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/getrlimit64.c @@ -0,0 +1,25 @@ +/* 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 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. */ + +#include <sys/resource.h> + +int +__getrlimit64 (enum __rlimit_resource resource, struct rlimit64 *rlimits) +{ + return getrlimit64 (resource, rlimits); +} diff --git a/ports/sysdeps/unix/sysv/aix/getrusage.c b/ports/sysdeps/unix/sysv/aix/getrusage.c new file mode 100644 index 000000000..b578b75aa --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/getrusage.c @@ -0,0 +1,27 @@ +/* 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 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. */ + +#include <sys/resource.h> + +int +__getrusage (who, usage) + enum __rusage_who who; + struct rusage *usage; +{ + return getrusage (who, usage); +} diff --git a/ports/sysdeps/unix/sysv/aix/getsid.c b/ports/sysdeps/unix/sysv/aix/getsid.c new file mode 100644 index 000000000..6994eb8dd --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/getsid.c @@ -0,0 +1,27 @@ +/* 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 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. */ + +#include <unistd.h> + +extern int kgetsid (pid_t pid); + +int +getsid (pid_t pid) +{ + return kgetsid (pid); +} diff --git a/ports/sysdeps/unix/sysv/aix/getsockname.c b/ports/sysdeps/unix/sysv/aix/getsockname.c new file mode 100644 index 000000000..ac1bf34fc --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/getsockname.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2000, 2002 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. */ + +#include <sys/socket.h> + +extern int ngetsockname (int s, void *uap_asa, int *uap_alen); + +int +__getsockname (int fd, __SOCKADDR_ARG addr, socklen_t *len) +{ + return ngetsockname (fd, addr.__sockaddr__, len); +} + +weak_alias (__getsockname, getsockname) diff --git a/ports/sysdeps/unix/sysv/aix/gettimeofday.c b/ports/sysdeps/unix/sysv/aix/gettimeofday.c new file mode 100644 index 000000000..34a92eb39 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/gettimeofday.c @@ -0,0 +1,98 @@ +/* Copyright (C) 1991,92,94,95,96,97,2001,2002 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. */ + +#include <errno.h> +#include <time.h> +#include <sys/time.h> + +#ifndef HAVE_GNU_LD +# define __daylight daylight +# define __timezone timezone +# define __tzname tzname +#endif + +#undef __gettimeofday + +extern int rtc_upper (void); +extern int rtc_lower (void); + +/* Assembler Routines to access the timer registers */ +asm("\n\ +.rtc_upper: mfspr 3,4 # copy RTCU to return register\n\ + blr\n\ +\n\ +.rtc_lower: mfspr 3,5 # copy RTCL to return register\n\ + blr\n\ +"); + +/* Get the current time of day and timezone information, + putting it into *TV and *TZ. If TZ is NULL, *TZ is not filled. + Returns 0 on success, -1 on errors. */ +int +__gettimeofday (tv, tz) + struct timeval *tv; + struct timezone *tz; +{ + int ts, tl, tu; + + if (tv == NULL) + { + __set_errno (EINVAL); + return -1; + } + + ts = rtc_upper (); /* Seconds. */ + tl = rtc_lower (); /* Nanoseconds. */ + tu = rtc_upper (); /* Check for a carry from. */ + if (ts != tu) /* The lower reg to the upper. */ + tl = rtc_lower (); /* Recover from the race condition. */ + + tv->tv_sec = (long int) (tu + (double) tl / 1000000000); + tv->tv_usec = (long int) ((double) tl / 1000); + + if (tz != NULL) + { + const time_t timer = tv->tv_sec; + struct tm tm; + const struct tm *tmp; + + const long int save_timezone = __timezone; + const long int save_daylight = __daylight; + char *save_tzname[2]; + save_tzname[0] = __tzname[0]; + save_tzname[1] = __tzname[1]; + + tmp = localtime_r (&timer, &tm); + + tz->tz_minuteswest = __timezone / 60; + tz->tz_dsttime = __daylight; + + __timezone = save_timezone; + __daylight = save_daylight; + __tzname[0] = save_tzname[0]; + __tzname[1] = save_tzname[1]; + + if (tmp == NULL) + return -1; + } + + return 0; +} + +INTDEF(__gettimeofday) +weak_alias (__gettimeofday, gettimeofday) diff --git a/ports/sysdeps/unix/sysv/aix/getuid.c b/ports/sysdeps/unix/sysv/aix/getuid.c new file mode 100644 index 000000000..e042666fe --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/getuid.c @@ -0,0 +1,30 @@ +/* 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 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. */ + +#include <unistd.h> + +#define ID_REAL 2 + +extern uid_t getuidx (int which); + +uid_t +__getuid (void) +{ + return getuidx (ID_REAL); +} +strong_alias (__getuid, getuid) diff --git a/ports/sysdeps/unix/sysv/aix/gnu/lib-names.h b/ports/sysdeps/unix/sysv/aix/gnu/lib-names.h new file mode 100644 index 000000000..d41f822f1 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/gnu/lib-names.h @@ -0,0 +1,31 @@ +#ifndef __GNU_LIB_NAMES_H +#define __GNU_LIB_NAMES_H 1 + +#define LIBBROKENLOCALE_SO "libBrokenLocale.a" +#define LIBCRYPT_SO "libcrypt.a" +#define LIBC_SO "libc.a" +#define LIBDB1_SO "libdb1.a" +#define LIBDB_SO "libdb.a" +#define LIBDL_SO "libdl.a" +#define LIBM_SO "libm.a" +#define LIBNOVERSION_SO "libNoVersion.a" +#define LIBNSL_SO "libnsl.a" +#define LIBNSS1_COMPAT_SO "libnss1_compat.a" +#define LIBNSS1_DB_SO "libnss1_db.a" +#define LIBNSS1_DNS_SO "libnss1_dns.a" +#define LIBNSS1_FILES_SO "libnss1_files.a" +#define LIBNSS1_NIS_SO "libnss1_nis.a" +#define LIBNSS_COMPAT_SO "libnss_compat.a" +#define LIBNSS_DB_SO "libnss_db.a" +#define LIBNSS_DNS_SO "libnss_dns.a" +#define LIBNSS_FILES_SO "libnss_files.a" +#define LIBNSS_HESIOD_SO "libnss_hesiod.a" +#define LIBNSS_LDAP_SO "libnss_ldap.a" +#define LIBNSS_NISPLUS_SO "libnss_nisplus.a" +#define LIBNSS_NIS_SO "libnss_nis.a" +#define LIBPTHREAD_SO "libpthread.a" +#define LIBRESOLV_SO "libresolv.a" +#define LIBRT_SO "librt.a" +#define LIBUTIL_SO "libutil.a" + +#endif /* gnu/lib-names.h */ diff --git a/ports/sysdeps/unix/sysv/aix/init-first.c b/ports/sysdeps/unix/sysv/aix/init-first.c new file mode 100644 index 000000000..24ef109dd --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/init-first.c @@ -0,0 +1,103 @@ +/* Initialization code run first thing by the XCOFF startup code. AIX version. + Copyright (C) 2001, 2002 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. */ + +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> +#include <unistd.h> +#include <sysdep.h> +#include <fpu_control.h> +#include <sys/param.h> +#include <sys/types.h> +#include <libc-internal.h> + +#ifndef SHARED +# include <ldsodefs.h> +# include "dl-osinfo.h" +#endif + +extern void __libc_init (int, char **, char **); + +/* The function is called from assembly stubs the compiler can't see. */ +static void init (int, char **, char **) __attribute__ ((unused)); + +/* Set nonzero if we have to be prepared for more then one libc being + used in the process. Safe assumption if initializer never runs. */ +int __libc_multiple_libcs attribute_hidden = 1; + +/* Remember the command line argument and enviroment contents for + later calls of initializers for dynamic libraries. */ +int __libc_argc attribute_hidden; +char **__libc_argv attribute_hidden; + + +static void +init (int argc, char **argv, char **envp) +{ +#ifdef USE_NONOPTION_FLAGS + extern void __getopt_clean_environment (char **); +#endif + /* The next variable is only here to work around a bug in gcc <= 2.7.2.2. + If the address would be taken inside the expression the optimizer + would try to be too smart and throws it away. Grrr. */ + + /* XXX disable dl for now + __libc_multiple_libcs = &_dl_starting_up && !_dl_starting_up; */ + + /* Save the command-line arguments. */ + __libc_argc = argc; + __libc_argv = argv; + __environ = envp; + +#ifndef SHARED + __libc_init_secure (); +#endif + + __libc_init (argc, argv, envp); + +#ifdef USE_NONOPTION_FLAGS + /* This is a hack to make the special getopt in GNU libc working. */ + __getopt_clean_environment (envp); +#endif + +#ifdef SHARED + __libc_global_ctors (); +#endif +} + +#ifdef SHARED + +strong_alias (init, _init); + +extern void __libc_init_first (void); + +void +__libc_init_first (void) +{ +} + +#else +extern void __libc_init_first (int argc, char **argv, char **envp); + +void +__libc_init_first (int argc, char **argv, char **envp) +{ + init (argc, argv, envp); +} +#endif diff --git a/ports/sysdeps/unix/sysv/aix/ioctl.c b/ports/sysdeps/unix/sysv/aix/ioctl.c new file mode 100644 index 000000000..f47b699be --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/ioctl.c @@ -0,0 +1,43 @@ +/* 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 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. */ + +#include <stdarg.h> +#include <sys/ioctl.h> + +extern int kioctl (int fdes, int cmd, unsigned long int arg, + unsigned long int ext); + +int +__ioctl (int fdes, unsigned long int cmd, ...) +{ + va_list va; + int res; + unsigned long int arg; + unsigned long int ext; + + va_start (va, cmd); + arg = va_arg (va, unsigned long int); + ext = va_arg (va, unsigned long int); + + res = kioctl (fdes, cmd, arg, ext); + + va_end (va); + + return res; +} +strong_alias (__ioctl, ioctl) diff --git a/ports/sysdeps/unix/sysv/aix/kernel_proto.h b/ports/sysdeps/unix/sysv/aix/kernel_proto.h new file mode 100644 index 000000000..e9ad06dc3 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/kernel_proto.h @@ -0,0 +1,25 @@ +/* Copyright (C) 1999 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + + 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. */ + +/* This file contains prototypes for the "functions" exported by /unix + on AIX. */ +#include <sys/types.h> + + +extern ssize_t kwrite (int, const void *, size_t); diff --git a/ports/sysdeps/unix/sysv/aix/kill.c b/ports/sysdeps/unix/sysv/aix/kill.c new file mode 100644 index 000000000..8538e29f8 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/kill.c @@ -0,0 +1,25 @@ +/* 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 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. */ + +#include <unistd.h> + +int +__kill (pid_t pid, int sig) +{ + return kill (pid, sig); +} diff --git a/ports/sysdeps/unix/sysv/aix/lchown.c b/ports/sysdeps/unix/sysv/aix/lchown.c new file mode 100644 index 000000000..44e3b749e --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/lchown.c @@ -0,0 +1,25 @@ +/* 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 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. */ + +#include <unistd.h> + +int +__lchown (const char *file, uid_t owner, gid_t group) +{ + return lchown (file, owner, group); +} diff --git a/ports/sysdeps/unix/sysv/aix/libc-start.c b/ports/sysdeps/unix/sysv/aix/libc-start.c new file mode 100644 index 000000000..813e28d09 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/libc-start.c @@ -0,0 +1,290 @@ +/* Initialization code run first thing by the XCOFF startup code. AIX version. + Copyright (C) 2001, 2002 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. */ + +#include <stdlib.h> +#include <unistd.h> +#include <sys/types.h> + +/* hack to use uchar's */ +typedef unsigned char uchar; +#include <xcoff.h> +#include <rtinit.h> +#include <dlldr.h> +#include <bits/libc-lock.h> + +extern void __libc_init_first (int argc, char **argv, char **envp); + +/* XXX disable for now +extern int __libc_multiple_libcs; */ + +/* XXX normally defined in generic/dl-sydep.c, hack it into existance +extern void *__libc_stack_end; */ +void *__libc_stack_end; + + struct __libc_start_data_rec { + void *stack; + void *toc; + int argc; + char **argv; + char **envp; + char *data; + char *text; + unsigned mcount; + unsigned special; + int (*main)(int, char **, char **); + void (*init)(void); + void (*fini)(void); + void (*rtld_fini)(void); + }; + +extern struct __libc_start_data_rec __libc_start_data; +extern int errno; + +/* The first piece of initialized data. */ +int __data_start = 0; + +#ifndef HAVE_ELF +/* Since gcc/crtstuff.c won't define it unless the ELF format is used + we will need to define it here. */ +void *__dso_handle = NULL; +#endif + +/* AIX kernel function */ +extern int __loadx (int flag, void *module, void *arg1, void *arg2, + void *arg3); +/* Needed by setenv */ +char **__environ; + +/* + * Find __rtinit symbol + * + * __RTINIT *find_rtinit() + * + * __RTINIT *rti - pointer to __rtinit data structure + */ + +static __RTINIT * +find_rtinit (void) +{ + struct xcoffhdr *xcoff_hdr; + SCNHDR *sec_hdr; + SCNHDR *ldr_sec_hdr; + SCNHDR *data_sec_hdr; + LDSYM *ldsym_hdr; + __RTINIT *rtl; + + xcoff_hdr = (struct xcoffhdr *) __libc_start_data.text; + sec_hdr = (SCNHDR *) ((caddr_t) &xcoff_hdr->aouthdr + + xcoff_hdr->filehdr.f_opthdr); + ldr_sec_hdr = (SCNHDR *) (sec_hdr + (xcoff_hdr->aouthdr.o_snloader - 1)); + ldsym_hdr = (LDSYM *) ((caddr_t) xcoff_hdr + ldr_sec_hdr->s_scnptr + + LDHDRSZ); + + if (__libc_start_data.mcount <= 0) + { + if (!ldr_sec_hdr->s_scnptr) + return NULL; + + if (memcmp (ldsym_hdr, RTINIT_NAME, sizeof(RTINIT_NAME) - 1) != 0) + return NULL; + } + + data_sec_hdr = (SCNHDR *) (sec_hdr + (xcoff_hdr->aouthdr.o_sndata - 1)); + rtl = (__RTINIT *) (ldsym_hdr->l_value + + (__libc_start_data.data - data_sec_hdr->s_vaddr)); + return rtl; +} + +/* The mod_init1 calls every initialization function + for a given module. + + void mod_init1(handler, rti) + + void *handler - if NULL init funtions for modules loaded at exec time + are being executed. Otherwise, the handler points to the + module loaded. + + __RTINIT *rti - pointer to __rtinit data structure (with rti->init_offset + not equal to zero) + */ + +static void +mod_init1 (void *handler,__RTINIT *rtl) +{ + __RTINIT_DESCRIPTOR *descriptor; + + descriptor = (__RTINIT_DESCRIPTOR *) ((caddr_t) &rtl->rtl + + rtl->init_offset); + while (descriptor->f != NULL) + { + if (!(descriptor->flags & _RT_CALLED)) + { + descriptor->flags |= _RT_CALLED; + /* Execute init/fini. */ + descriptor->f (handler, rtl, descriptor); + } + descriptor = (__RTINIT_DESCRIPTOR *) ((caddr_t) descriptor + + rtl->__rtinit_descriptor_size); + } +} + +/* The modinit() function performs run-time linking, if enabled, and calling + the init() function for all loaded modules. + + int modinit() + */ + +#define DL_BUFFER_SIZE 1000 + +static int +modinit (void) +{ + int *handler = NULL; + __RTINIT *rtinit_info = NULL; + int flag; + DL_INFO dl_buffer[DL_BUFFER_SIZE]; + DL_INFO *dl_info = dl_buffer; + int i; + + /* Find __rtinit symbols */ + rtinit_info = find_rtinit (); + + flag = DL_EXECQ; + if (rtinit_info && rtinit_info->rtl) + flag |= DL_LOAD_RTL; + + /* Get a list of modules that have __rtinit. */ + if (__loadx (flag, dl_info, (void *) sizeof (dl_buffer), NULL, NULL)) + exit (0x90); + + if (( dl_info[0].dlinfo_xflags & DL_INFO_OK)) + { + rtinit_info = find_rtinit (); + if ((rtinit_info != NULL) & (rtinit_info->rtl != NULL)) + { + if ((*rtinit_info->rtl) (dl_info, 0)) + exit (0x90); + } + } + + /* Initialization each module loaded that has __rtinit. */ + if (dl_info[0].dlinfo_xflags & DL_INFO_OK) + { + for (i = 1; i < dl_info[0].dlinfo_arraylen + 1; ++i) + if (dl_info[i].dlinfo_flags & DL_HAS_RTINIT) + { + rtinit_info = find_rtinit (); + if (rtinit_info) + mod_init1 (handler, rtinit_info); + } + } + + return 0; +} + + +void +__libc_start_init (void) +{ + /* Do run-time linking, if enabled and call the init() + for all loaded modules. */ + if (__libc_start_data.mcount != __libc_start_data.special) + modinit (); +} + +/* For now these are just stubs. */ +void +__libc_start_fini (void) +{ +} + +void +__libc_start_rtld_fini (void) +{ +} + +void +__libc_start_main (void) +{ +#ifndef SHARED + + /* The next variable is only here to work around a bug in gcc <= 2.7.2.2. + If the address would be taken inside the expression the optimizer + would try to be too smart and throws it away. Grrr. */ + + /* XXX disable for now + int *dummy_addr = &_dl_starting_up; + + __libc_multiple_libcs = dummy_addr && !_dl_starting_up; */ +#endif + + /* Store the lowest stack address. */ + __libc_stack_end = __libc_start_data.stack; + + /* Used by setenv */ + __environ = __libc_start_data.envp; + +#ifndef SHARED + /* Clear errno. */ + errno = 0; + + /* Some security at this point. Prevent starting a SUID binary where + the standard file descriptors are not opened. We have to do this + only for statically linked applications since otherwise the dynamic + loader did the work already. */ + if (__builtin_expect (__libc_enable_secure, 0)) + __libc_check_standard_fds (); + +#endif + + /* Register the destructor of the dynamic linker if there is any. */ + if (__builtin_expect (__libc_start_data.rtld_fini != NULL, 1)) + __cxa_atexit ((void (*) (void *)) __libc_start_data.rtld_fini, NULL, NULL); + + /* Call the initializer of the libc. This is only needed here if we + are compiling for the static library in which case we haven't + run the constructors in `_dl_start_user'. */ +#ifndef SHARED + __libc_init_first (__libc_start_data.argc, __libc_start_data.argv, + __libc_start_data.envp); +#endif + + /* Register the destructor of the program, if any. */ + if (__libc_start_data.fini) + __cxa_atexit ((void (*) (void *)) __libc_start_data.fini, NULL, NULL); + + /* Call the initializer of the program, if any. */ +#ifdef SHARED + if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0)) + _dl_debug_printf ("\ninitialize program: %s\n\n", + __libc_start_data.argv[0]); +#endif + if (__libc_start_data.init) + (*__libc_start_data.init) (); + +#ifdef SHARED + if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0)) + _dl_debug_printf ("\ntransferring control: %s\n\n", + __libc_start_data.argv[0]); +#endif + + exit ((*__libc_start_data.main) (__libc_start_data.argc, + __libc_start_data.argv, + __libc_start_data.envp)); +} diff --git a/ports/sysdeps/unix/sysv/aix/link.c b/ports/sysdeps/unix/sysv/aix/link.c new file mode 100644 index 000000000..2cacbebc3 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/link.c @@ -0,0 +1,27 @@ +/* Copyright (C) 1997, 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. */ + +#include <unistd.h> + +int +__link (from, to) + const char *from; + const char *to; +{ + return link (from, to); +} diff --git a/ports/sysdeps/unix/sysv/aix/lockf.c b/ports/sysdeps/unix/sysv/aix/lockf.c new file mode 100644 index 000000000..4a8c14fd6 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/lockf.c @@ -0,0 +1,27 @@ +/* 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 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. */ + +#include <unistd.h> + +extern int klockf (int fd, int function, long long int size); + +int +lockf (int fd, int cmd, off_t len) +{ + return klockf (fd, cmd, len); +} diff --git a/ports/sysdeps/unix/sysv/aix/lockf64.c b/ports/sysdeps/unix/sysv/aix/lockf64.c new file mode 100644 index 000000000..529c2b447 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/lockf64.c @@ -0,0 +1,27 @@ +/* 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 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. */ + +#include <unistd.h> + +extern int klockf (int fd, int function, long long int size); + +int +lockf64 (int fd, int cmd, off64_t len) +{ + return klockf (fd, cmd, len); +} diff --git a/ports/sysdeps/unix/sysv/aix/lseek.c b/ports/sysdeps/unix/sysv/aix/lseek.c new file mode 100644 index 000000000..d4cbdbe70 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/lseek.c @@ -0,0 +1,10 @@ +/* This is a system call. We only have to provide the wrapper. */ +#include <unistd.h> + +off_t +__lseek (int fd, off_t offset, int whence) +{ + return lseek (fd, offset, whence); +} +strong_alias (__lseek, __libc_lseek) +libc_hidden_def (__lseek) diff --git a/ports/sysdeps/unix/sysv/aix/lseek64.c b/ports/sysdeps/unix/sysv/aix/lseek64.c new file mode 100644 index 000000000..5892663d8 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/lseek64.c @@ -0,0 +1,35 @@ +/* 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 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. */ + +#include <unistd.h> + +extern int klseek (int fd, long long int offset, int sbase, + long long int *new_offp); + +off64_t +__libc_lseek64 (int fd, off64_t offset, int whence) +{ + long long int res; + + if (klseek (fd, offset, whence, &res) < 0) + res = -1ll; + + return res; +} +strong_alias (__libc_lseek64, __lseek64) +strong_alias (__libc_lseek64, lseek64) diff --git a/ports/sysdeps/unix/sysv/aix/lxstat.c b/ports/sysdeps/unix/sysv/aix/lxstat.c new file mode 100644 index 000000000..879e80cbe --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/lxstat.c @@ -0,0 +1,32 @@ +/* Copyright (C) 1999, 2000, 2002 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. */ + +#include <assert.h> +#include <sys/stat.h> + +#define STX_LINK 0x01 + +extern int statx (const char *pathname, struct stat *st, int len, int cmd); + +int +__lxstat (int ver, const char *pathname, struct stat *st) +{ + assert (ver == 0); + return statx (pathname, st, sizeof (*st), STX_LINK); +} +hidden_def (__lxstat) diff --git a/ports/sysdeps/unix/sysv/aix/lxstat64.c b/ports/sysdeps/unix/sysv/aix/lxstat64.c new file mode 100644 index 000000000..73324fe55 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/lxstat64.c @@ -0,0 +1,33 @@ +/* Copyright (C) 1999, 2000, 2002 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. */ + +#include <assert.h> +#include <sys/stat.h> + +#define STX_LINK 0x01 +#define STX_64 0x08 + +extern int statx (const char *pathname, struct stat64 *st, int len, int cmd); + +int +__lxstat64 (int ver, const char *pathname, struct stat64 *st) +{ + assert (ver == 0); + return statx (pathname, st, sizeof (*st), STX_LINK | STX_64); +} +hidden_def (__lxstat64) diff --git a/ports/sysdeps/unix/sysv/aix/madvise.c b/ports/sysdeps/unix/sysv/aix/madvise.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/madvise.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/mkdir.c b/ports/sysdeps/unix/sysv/aix/mkdir.c new file mode 100644 index 000000000..4a4e5ceef --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/mkdir.c @@ -0,0 +1,25 @@ +/* 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 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. */ + +#include <sys/stat.h> + +int +__mkdir (const char *name, mode_t mode) +{ + return mkdir (name, mode); +} diff --git a/ports/sysdeps/unix/sysv/aix/mknod.c b/ports/sysdeps/unix/sysv/aix/mknod.c new file mode 100644 index 000000000..8ed3d6b53 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/mknod.c @@ -0,0 +1,28 @@ +/* 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 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. */ + +#include <sys/stat.h> + +int +__mknod (path, mode, device) + const char *path; + mode_t mode; + dev_t device; +{ + return mknod (path, mode, device); +} diff --git a/ports/sysdeps/unix/sysv/aix/mmap.c b/ports/sysdeps/unix/sysv/aix/mmap.c new file mode 100644 index 000000000..cd967d36b --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/mmap.c @@ -0,0 +1,9 @@ +/* This is a system call. We only have to provide the wrapper. */ +#include <sys/mman.h> +#include <sys/types.h> + +void * +__mmap (void *addr, size_t len, int prot, int flags, int fd, off_t offset) +{ + return mmap (addr, len, prot, flags, fd, offset); +} diff --git a/ports/sysdeps/unix/sysv/aix/mmap64.c b/ports/sysdeps/unix/sysv/aix/mmap64.c new file mode 100644 index 000000000..ae70ef4ac --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/mmap64.c @@ -0,0 +1,30 @@ +/* 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 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. */ + +#include <sys/mman.h> +#include <sys/types.h> + +extern int kmmap (void *addr, size_t len, int prot, int flags, int fd, + long long int offset); + +void * +__mmap64 (void *addr, size_t len, int prot, int flags, int fd, off64_t offset) +{ + return kmmap (addr, len, prot, flags, fd, offset); +} +strong_alias (__mmap64, mmap64) diff --git a/ports/sysdeps/unix/sysv/aix/mprotect.c b/ports/sysdeps/unix/sysv/aix/mprotect.c new file mode 100644 index 000000000..8bf95abb0 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/mprotect.c @@ -0,0 +1,25 @@ +/* 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 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. */ + +#include <sys/mman.h> + +int +__mprotect (void *addr, size_t len, int prot) +{ + return mprotect (addr, len, prot); +} diff --git a/ports/sysdeps/unix/sysv/aix/msgctl.c b/ports/sysdeps/unix/sysv/aix/msgctl.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/msgctl.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/msgget.c b/ports/sysdeps/unix/sysv/aix/msgget.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/msgget.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/msgrcv.c b/ports/sysdeps/unix/sysv/aix/msgrcv.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/msgrcv.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/msgsnd.c b/ports/sysdeps/unix/sysv/aix/msgsnd.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/msgsnd.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/msync.c b/ports/sysdeps/unix/sysv/aix/msync.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/msync.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/munmap.c b/ports/sysdeps/unix/sysv/aix/munmap.c new file mode 100644 index 000000000..7f583be35 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/munmap.c @@ -0,0 +1,8 @@ +/* This is a system call. We only have to provide the wrapper. */ +#include <sys/mman.h> + +int +__munmap (void *addr, size_t len) +{ + return munmap (addr, len); +} diff --git a/ports/sysdeps/unix/sysv/aix/nanosleep.c b/ports/sysdeps/unix/sysv/aix/nanosleep.c new file mode 100644 index 000000000..842275f77 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/nanosleep.c @@ -0,0 +1,40 @@ +/* Copyright (C) 2000, 2002 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. */ + +#include <assert.h> +#include <sys/time.h> +#include <sys/types.h> + +struct timestruc_t +{ + time_t tv_sec; /* seconds. */ + suseconds_t tv_nsec; /* and nanoseconds. */ +}; + + +extern int _nsleep (struct timestruc_t *rqtp, struct timestruc_t *rmtp); + +int +__libc_nanosleep (const struct timespec *req, struct timespec *rem) +{ + assert (sizeof (struct timestruc_t) == sizeof (*req)); + return _nsleep ((struct timestruc_t *) req, (struct timestruc_t *) rem); +} +strong_alias (__libc_nanosleep, __nanosleep) +libc_hidden_def (__nanosleep) +strong_alias (__libc_nanosleep, nanosleep) diff --git a/ports/sysdeps/unix/sysv/aix/net/if.h b/ports/sysdeps/unix/sysv/aix/net/if.h new file mode 100644 index 000000000..20256d3ad --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/net/if.h @@ -0,0 +1,196 @@ +/* Copyright (C) 1997, 1998, 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 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 _NET_IF_H + +#define _NET_IF_H 1 +#include <features.h> + +#include <sys/types.h> +#include <sys/socket.h> + +/* Standard interface flags. */ +enum + { + IFF_UP = 0x1, /* Interface is up. */ +#define IFF_UP IFF_UP + IFF_BROADCAST = 0x2, /* Broadcast address valid. */ +#define IFF_BROADCAST IFF_BROADCAST + IFF_DEBUG = 0x4, /* Turn on debugging. */ +#define IFF_DEBUG IFF_DEBUG + IFF_LOOPBACK = 0x8, /* Is a loopback net. */ +#define IFF_LOOPBACK IFF_LOOPBACK + IFF_POINTOPOINT = 0x10, /* Interface is point-to-point link. */ +#define IFF_POINTOPOINT IFF_POINTOPOINT + IFF_NOTRAILERS = 0x20, /* Avoid use of trailers. */ +#define IFF_NOTRAILERS IFF_NOTRAILERS + IFF_RUNNING = 0x40, /* Resources allocated. */ +#define IFF_RUNNING IFF_RUNNING + IFF_NOARP = 0x80, /* No address resolution protocol. */ +#define IFF_NOARP IFF_NOARP + IFF_PROMISC = 0x100, /* Receive all packets. */ +#define IFF_PROMISC IFF_PROMISC + + /* Not supported */ + IFF_ALLMULTI = 0x200, /* Receive all multicast packets. */ +#define IFF_ALLMULTI IFF_ALLMULTI + + IFF_OACTIVE = 0x400, /* Transmission in progress. */ +#define IFF_OACTIVE IFF_OACTIVE + IFF_SIMPLEX = 0x800, /* Cannot hear own transmissions. */ +#define IFF_SIMPLEX IFF_SIMPLEX + IFF_DO_HW_LOOPBACK = 0x10000, /* Force loopback through hardware. */ +#define IFF_DO_HW_LOOPBACK IFF_DO_HW_LOOPBACK + IFF_ALLCAST = 0x20000, /* Global broadcast. */ +#define IFF_ALLCAST IFF_ALLCAST + IFF_BRIDGE = 0x40000, /* Receive all bridge packets. */ +#define IFF_BRIDGE IFF_BRIDGE + IFF_NOECHO = IFF_SIMPLEX, /* Reeives echo packets. */ +#define IFF_NOECHO IFF_NOECHO + }; + +/* The ifaddr structure contains information about one address of an + interface. They are maintained by the different address families, + are allocated and attached when an address is set, and are linked + together so all addresses for an interface can be located. */ + +struct ifaddr + { + struct sockaddr ifa_addr; /* Address of interface. */ + union + { + struct sockaddr ifu_broadaddr; + struct sockaddr ifu_dstaddr; + } ifa_ifu; + struct sockaddr *ifa_netmask; /* Used to determine subnet. */ + struct iface *ifa_ifp; /* Back-pointer to interface. */ + struct ifaddr *ifa_next; /* Next address for interface. */ + void (*ifa_rtrequest) (void); + struct rtentry *ifa_rt; + unsigned short int ifa_flags; + short int ifa_refcnt; + }; + +#define ifa_broadaddr ifa_ifu.ifu_broadaddr /* broadcast address */ +#define ifa_dstaddr ifa_ifu.ifu_dstaddr /* other end of link */ + +/* Interface request structure used for socket ioctl's. All interface + ioctl's must have parameter definitions which begin with ifr_name. + The remainder may be interface specific. */ + +struct ifreq + { +#define IFHWADDRLEN 6 +#define IFNAMSIZ 16 + union + { + char ifrn_name[IFNAMSIZ]; /* Interface name, e.g. "en0". */ + } ifr_ifrn; + + union + { + struct sockaddr ifru_addr; + struct sockaddr ifru_dstaddr; + struct sockaddr ifru_broadaddr; + struct sockaddr ifru_netmask; + struct sockaddr ifru_hwaddr; + short int ifru_flags; + int ifru_ivalue; + unsigned int ifru_mtu; + char ifru_slave[IFNAMSIZ]; /* Just fits the size */ + __caddr_t ifru_data; + unsigned short int ifru_site6; + } ifr_ifru; + }; + +/* Old AIX 3.1 version. */ +struct oifreq +{ + char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */ + union + { + struct sockaddr ifru_addr; + struct sockaddr ifru_dstaddr; + struct sockaddr ifru_broadaddr; + int ifru_flags; + int ifru_metric; + caddr_t ifru_data; + unsigned int ifru_mtu; + } ifr_ifru; + unsigned char reserved[8]; +}; + + +#define ifr_name ifr_ifrn.ifrn_name /* interface name */ +#define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */ +#define ifr_addr ifr_ifru.ifru_addr /* address */ +#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-p lnk */ +#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */ +#define ifr_netmask ifr_ifru.ifru_netmask /* interface net mask */ +#define ifr_flags ifr_ifru.ifru_flags /* flags */ +#define ifr_metric ifr_ifru.ifru_ivalue /* metric */ +#define ifr_mtu ifr_ifru.ifru_mtu /* mtu */ +#define ifr_slave ifr_ifru.ifru_slave /* slave device */ +#define ifr_data ifr_ifru.ifru_data /* for use by interface */ +#define ifr_ifindex ifr_ifru.ifru_ivalue /* interface index */ +#define ifr_bandwidth ifr_ifru.ifru_ivalue /* link bandwidth */ +#define ifr_baudrate ifr_ifru.ifru_ivalue /* link bandwidth */ +#define ifr_qlen ifr_ifru.ifru_ivalue /* queue length */ +#define ifr_site6 ifr_ifru.ifru_site6 /* IPv6 site index */ + + +/* Structure used in SIOCGIFCONF request. Used to retrieve interface + configuration for machine (useful for programs which must know all + networks accessible). */ + +struct ifconf + { + int ifc_len; /* Size of buffer. */ + union + { + __caddr_t ifcu_buf; + struct ifreq *ifcu_req; + } ifc_ifcu; + }; +#define ifc_buf ifc_ifcu.ifcu_buf /* Buffer address. */ +#define ifc_req ifc_ifcu.ifcu_req /* Array of structures. */ + +__BEGIN_DECLS + +/* Convert an interface name to an index, and vice versa. */ + +extern unsigned int if_nametoindex (__const char *__ifname) __THROW; +extern char *if_indextoname (unsigned int __ifindex, char *__ifname) __THROW; + +/* Return a list of all interfaces and their indices. */ + +struct if_nameindex + { + unsigned int if_index; /* 1, 2, ... */ + char *if_name; /* null terminated name: "eth0", ... */ + }; + +extern struct if_nameindex *if_nameindex (void) __THROW; + +/* Free the data returned from if_nameindex. */ + +extern void if_freenameindex (struct if_nameindex *__ptr) __THROW; + +__END_DECLS + +#endif /* net/if.h */ diff --git a/ports/sysdeps/unix/sysv/aix/open.c b/ports/sysdeps/unix/sysv/aix/open.c new file mode 100644 index 000000000..2b42f8e81 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/open.c @@ -0,0 +1,40 @@ +/* Copyright (C) 1999, 2000, 2002 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. */ + +#include <fcntl.h> +#include <stdarg.h> +#include <unistd.h> + +int +__open (const char *file, int oflag, ...) +{ + int mode = 0; + + if (oflag & O_CREAT) + { + va_list arg; + va_start (arg, oflag); + mode = va_arg (arg, int); + va_end (arg); + } + + return open (file, oflag, mode); +} +libc_hidden_def (__open) +strong_alias (__open, __libc_open) +libc_hidden_def (__libc_open) diff --git a/ports/sysdeps/unix/sysv/aix/pipe.c b/ports/sysdeps/unix/sysv/aix/pipe.c new file mode 100644 index 000000000..4a3ba1c04 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/pipe.c @@ -0,0 +1,27 @@ +/* Copyright (C) 1999, 2000, 2002 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. */ + +#include <unistd.h> + +int +__pipe (pipedes) + int pipedes[2]; +{ + return pipe (pipedes); +} +libc_hidden_def (__pipe) diff --git a/ports/sysdeps/unix/sysv/aix/poll.c b/ports/sysdeps/unix/sysv/aix/poll.c new file mode 100644 index 000000000..5ce540991 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/poll.c @@ -0,0 +1,29 @@ +/* Copyright (C) 1999, 2000, 2001, 2002 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. */ + +#include <sys/poll.h> + +int +__poll (fds, nfds, timeout) + struct pollfd *fds; + nfds_t nfds; + int timeout; +{ + return poll (fds, nfds, timeout); +} +libc_hidden_def (__poll) diff --git a/ports/sysdeps/unix/sysv/aix/posix_madvise.c b/ports/sysdeps/unix/sysv/aix/posix_madvise.c new file mode 100644 index 000000000..7ab4bed8e --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/posix_madvise.c @@ -0,0 +1,8 @@ +#include <errno.h> +#include <sys/mman.h> + +int +posix_madvise (void *addr, size_t len, int advise) +{ + return madvise (addr, len, advise) ? errno : 0; +} diff --git a/ports/sysdeps/unix/sysv/aix/powerpc/memset.c b/ports/sysdeps/unix/sysv/aix/powerpc/memset.c new file mode 100644 index 000000000..6955ef5e9 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/powerpc/memset.c @@ -0,0 +1,21 @@ +/* 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 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. */ + + +/* Until the cache line issues are resolved use the generic implementation. */ +#include <sysdeps/generic/memset.c> diff --git a/ports/sysdeps/unix/sysv/aix/powerpc/register-dump.h b/ports/sysdeps/unix/sysv/aix/powerpc/register-dump.h new file mode 100644 index 000000000..f0d8b9983 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/powerpc/register-dump.h @@ -0,0 +1,281 @@ +/* Dump registers. + Copyright (C) 1998 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. */ + +#include <sys/uio.h> +#include <stdio-common/_itoa.h> +#include <sys/ucontext.h> + +/* We will print the register dump in this format: + +Register dump: +fp0-3: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 +fp4-7: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 +fp8-11: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 +fp12-15: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 +fp16-19: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 +fp20-23: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 +fp24-27: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 +fp28-31: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 + +r00-07 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 +r08-15 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 +r16-23 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 +r24-31 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + + trap 00000000 iar 00000000 msr 00000000 cr 00000000 + lr 00000000 ctr 00000000 xer 00000000 mq 00000000 + tid 00000000 fpscr 00000000 + +*/ + + +static void +hexvalue (unsigned long int value, char *buf, size_t len) +{ + char *cp = _itoa_word (value, buf + len, 16, 0); + while (cp > buf) + *--cp = '0'; +} + + +static void +register_dump (int fd, struct sigcontext *ctx) +{ + char regs[108][8]; + struct iovec iov[38]; + struct __mstsafe *reg_state; + int i; + int ii; + size_t nr = 0; + +#define ADD_STRING(str) \ + iov[nr].iov_base = (char *) str; \ + iov[nr].iov_len = strlen (str); \ + ++nr +#define ADD_MEM(str, len) \ + iov[nr].iov_base = str; \ + iov[nr].iov_len = len; \ + ++nr + + reg_state = (struct __mstsafe *)&ctx->sc_jmpbuf.__jmp_context; + + hexvalue (reg_state->__excp_type, regs[0], 8); + hexvalue (reg_state->__iar, regs[1], 8); + hexvalue (reg_state->__msr, regs[2], 8); + hexvalue (reg_state->__cr, regs[3], 8); + hexvalue (reg_state->__lr, regs[4], 8); + hexvalue (reg_state->__ctr, regs[5], 8); + hexvalue (reg_state->__xer, regs[6], 8); + hexvalue (reg_state->__mq, regs[7], 8); + hexvalue (reg_state->__tid, regs[8], 8); + hexvalue (reg_state->__fpscr, regs[9], 8); + + ii=10; + for (i = 0; i <= 96; i++,ii++) + hexvalue (reg_state->__gpr[i], regs[ii], 8); + + /* Generate the output. */ + ADD_STRING ("Register dump:\n\nfp0-3: "); + ADD_MEM (regs[42], 8); + ADD_MEM (regs[43], 8); + ADD_STRING (" "); + ADD_MEM (regs[44], 8); + ADD_MEM (regs[45], 8); + ADD_STRING (" "); + ADD_MEM (regs[46], 8); + ADD_MEM (regs[47], 8); + ADD_STRING (" "); + ADD_MEM (regs[48], 8); + ADD_MEM (regs[49], 8); + ADD_STRING ("\nfp4-7: "); + ADD_MEM (regs[50], 8); + ADD_MEM (regs[51], 8); + ADD_STRING (" "); + ADD_MEM (regs[52], 8); + ADD_MEM (regs[53], 8); + ADD_STRING (" "); + ADD_MEM (regs[54], 8); + ADD_MEM (regs[55], 8); + ADD_STRING (" "); + ADD_MEM (regs[56], 8); + ADD_MEM (regs[57], 8); + ADD_STRING ("\nfp8-11: "); + ADD_MEM (regs[58], 8); + ADD_MEM (regs[59], 8); + ADD_STRING (" "); + ADD_MEM (regs[60], 8); + ADD_MEM (regs[61], 8); + ADD_STRING (" "); + ADD_MEM (regs[62], 8); + ADD_MEM (regs[63], 8); + ADD_STRING (" "); + ADD_MEM (regs[64], 8); + ADD_MEM (regs[65], 8); + ADD_STRING ("\nfp12-15: "); + ADD_MEM (regs[66], 8); + ADD_MEM (regs[67], 8); + ADD_STRING (" "); + ADD_MEM (regs[68], 8); + ADD_MEM (regs[69], 8); + ADD_STRING (" "); + ADD_MEM (regs[70], 8); + ADD_MEM (regs[71], 8); + ADD_STRING (" "); + ADD_MEM (regs[72], 8); + ADD_MEM (regs[73], 8); + ADD_STRING ("\nfp16-19: "); + ADD_MEM (regs[74], 8); + ADD_MEM (regs[75], 8); + ADD_STRING (" "); + ADD_MEM (regs[76], 8); + ADD_MEM (regs[78], 8); + ADD_STRING (" "); + ADD_MEM (regs[79], 8); + ADD_MEM (regs[80], 8); + ADD_STRING (" "); + ADD_MEM (regs[81], 8); + ADD_MEM (regs[82], 8); + ADD_STRING ("\nfp20-23: "); + ADD_MEM (regs[83], 8); + ADD_MEM (regs[84], 8); + ADD_STRING (" "); + ADD_MEM (regs[85], 8); + ADD_MEM (regs[86], 8); + ADD_STRING (" "); + ADD_MEM (regs[87], 8); + ADD_MEM (regs[88], 8); + ADD_STRING (" "); + ADD_MEM (regs[89], 8); + ADD_MEM (regs[90], 8); + ADD_STRING ("\nfp24-27: "); + ADD_MEM (regs[91], 8); + ADD_MEM (regs[92], 8); + ADD_STRING (" "); + ADD_MEM (regs[93], 8); + ADD_MEM (regs[94], 8); + ADD_STRING (" "); + ADD_MEM (regs[95], 8); + ADD_MEM (regs[96], 8); + ADD_STRING (" "); + ADD_MEM (regs[97], 8); + ADD_MEM (regs[98], 8); + ADD_STRING ("\nfp28-31: "); + ADD_MEM (regs[99], 8); + ADD_MEM (regs[100], 8); + ADD_STRING (" "); + ADD_MEM (regs[101], 8); + ADD_MEM (regs[102], 8); + ADD_STRING (" "); + ADD_MEM (regs[103], 8); + ADD_MEM (regs[104], 8); + ADD_STRING (" "); + ADD_MEM (regs[105], 8); + ADD_MEM (regs[106], 8); + ADD_STRING ("\n\nr00-07 "); + ADD_MEM (regs[10], 8); + ADD_STRING (" "); + ADD_MEM (regs[11], 8); + ADD_STRING (" "); + ADD_MEM (regs[12], 8); + ADD_STRING (" "); + ADD_MEM (regs[13], 8); + ADD_STRING (" "); + ADD_MEM (regs[14], 8); + ADD_STRING (" "); + ADD_MEM (regs[15], 8); + ADD_STRING (" "); + ADD_MEM (regs[16], 8); + ADD_STRING (" "); + ADD_MEM (regs[17], 8); + ADD_STRING ("\nr08-15 "); + ADD_MEM (regs[18], 8); + ADD_STRING (" "); + ADD_MEM (regs[19], 8); + ADD_STRING (" "); + ADD_MEM (regs[20], 8); + ADD_STRING (" "); + ADD_MEM (regs[21], 8); + ADD_STRING (" "); + ADD_MEM (regs[22], 8); + ADD_STRING (" "); + ADD_MEM (regs[23], 8); + ADD_STRING (" "); + ADD_MEM (regs[24], 8); + ADD_STRING (" "); + ADD_MEM (regs[25], 8); + ADD_STRING ("\nr16-23 "); + ADD_MEM (regs[26], 8); + ADD_STRING (" "); + ADD_MEM (regs[27], 8); + ADD_STRING (" "); + ADD_MEM (regs[28], 8); + ADD_STRING (" "); + ADD_MEM (regs[29], 8); + ADD_STRING (" "); + ADD_MEM (regs[30], 8); + ADD_STRING (" "); + ADD_MEM (regs[31], 8); + ADD_STRING (" "); + ADD_MEM (regs[32], 8); + ADD_STRING (" "); + ADD_MEM (regs[33], 8); + ADD_STRING ("\nr24-31 "); + ADD_MEM (regs[34], 8); + ADD_STRING (" "); + ADD_MEM (regs[35], 8); + ADD_STRING (" "); + ADD_MEM (regs[36], 8); + ADD_STRING (" "); + ADD_MEM (regs[37], 8); + ADD_STRING (" "); + ADD_MEM (regs[38], 8); + ADD_STRING (" "); + ADD_MEM (regs[39], 8); + ADD_STRING (" "); + ADD_MEM (regs[40], 8); + ADD_STRING (" "); + ADD_MEM (regs[41], 8); + ADD_STRING ("\n\n trap "); + ADD_MEM (regs[0], 8); + ADD_STRING (" iar "); + ADD_MEM (regs[1], 8); + ADD_STRING (" msr "); + ADD_MEM (regs[2], 8); + ADD_STRING (" cr "); + ADD_MEM (regs[3], 8); + ADD_STRING ("\n lr "); + ADD_MEM (regs[4], 8); + ADD_STRING (" ctr "); + ADD_MEM (regs[5], 8); + ADD_STRING (" xer "); + ADD_MEM (regs[6], 8); + ADD_STRING (" mq "); + ADD_MEM (regs[7], 8); + ADD_STRING ("\n tid "); + ADD_MEM (regs[8], 8); + ADD_STRING (" fpscr "); + ADD_MEM (regs[9], 8); + ADD_STRING ("\n"); + + /* Write the stuff out. */ + writev (fd, iov, nr); +} + +#define REGISTER_DUMP register_dump (fd, ctx) + diff --git a/ports/sysdeps/unix/sysv/aix/powerpc/s_lrint.c b/ports/sysdeps/unix/sysv/aix/powerpc/s_lrint.c new file mode 100644 index 000000000..1a8b590d2 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/powerpc/s_lrint.c @@ -0,0 +1,29 @@ +/* Round floating-point to integer. AIX/PowerPC version. + Copyright (C) 1997, 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. */ + +#include <sysdeps/powerpc/fpu/s_lrint.c> + +/* This code will also work for a 'float' argument. */ +asm ("\ + .globl .__lrintf + .globl .lrintf + .weak .lrintf + .set .__lrintf,.__lrint + .set .lrintf,.__lrint +"); diff --git a/ports/sysdeps/unix/sysv/aix/pread.c b/ports/sysdeps/unix/sysv/aix/pread.c new file mode 100644 index 000000000..8d8bfd741 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/pread.c @@ -0,0 +1,28 @@ +/* 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 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. */ + +#include <unistd.h> + +extern int kpread (int fd, void *buf, size_t len, long long int off); + +ssize_t +__pread (int fd, void *buf, size_t len, off_t off) +{ + return kpread (fd, buf, len, off); +} +weak_alias (__pread, pread) diff --git a/ports/sysdeps/unix/sysv/aix/pread64.c b/ports/sysdeps/unix/sysv/aix/pread64.c new file mode 100644 index 000000000..0d4df2263 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/pread64.c @@ -0,0 +1,28 @@ +/* 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 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. */ + +#include <unistd.h> + +extern int kpread (int fd, void *buf, size_t len, long long int off); + +ssize_t +__pread64 (int fd, void *buf, size_t len, off64_t off) +{ + return kpread (fd, buf, len, off); +} +weak_alias (__pread64, pread64) diff --git a/ports/sysdeps/unix/sysv/aix/profil-counter.h b/ports/sysdeps/unix/sysv/aix/profil-counter.h new file mode 100644 index 000000000..2492a63ba --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/profil-counter.h @@ -0,0 +1,27 @@ +/* Machine-dependent SIGPROF signal handler. AIX version. + Copyright (C) 1996, 1997, 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. */ + +/* In many Unix systems signal handlers are called like this + and the interrupted PC is easily findable in the `struct sigcontext'. */ + +static void +profil_counter (int signr, int code, struct sigcontext *scp) +{ + profil_count ((void *) scp->sc_jmpbuf.__jmp_context.__gpr[0]); +} diff --git a/ports/sysdeps/unix/sysv/aix/read.c b/ports/sysdeps/unix/sysv/aix/read.c new file mode 100644 index 000000000..ca0edb30d --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/read.c @@ -0,0 +1,31 @@ +/* Copyright (C) 1999, 2000, 2002 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. */ + +#include <unistd.h> + +extern int kread (int fd, void *buf, size_t len); + +ssize_t +__libc_read (int fd, void *buf, size_t len) +{ + return kread (fd, buf, len); +} +libc_hidden_def (__libc_read) +strong_alias (__libc_read, __read) +libc_hidden_def (__read) +strong_alias (__libc_read, read) diff --git a/ports/sysdeps/unix/sysv/aix/readlink.c b/ports/sysdeps/unix/sysv/aix/readlink.c new file mode 100644 index 000000000..2770358b9 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/readlink.c @@ -0,0 +1,8 @@ +/* This is a system call. We only have to provide the wrapper. */ +#include <unistd.h> + +int +__readlink (const char *path, char *buf, size_t len) +{ + return readlink (path, buf, len); +} diff --git a/ports/sysdeps/unix/sysv/aix/readv.c b/ports/sysdeps/unix/sysv/aix/readv.c new file mode 100644 index 000000000..eddca0fc8 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/readv.c @@ -0,0 +1,38 @@ +/* Copyright (C) 1991, 1995-1998, 2000, 2002 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. */ + +#include <sys/uio.h> + +extern ssize_t kreadv (int fd, const struct iovec *iovp, size_t iovcnt, + long int ext); + +/* Read data from file descriptor FD, and put the result in the + buffers described by VECTOR, which is a vector of COUNT `struct iovec's. + The buffers are filled in the order specified. + Operates just like `read' (see <unistd.h>) except that data are + put in VECTOR instead of a contiguous buffer. */ +ssize_t +__libc_readv (fd, vector, count) + int fd; + const struct iovec *vector; + int count; +{ + return kreadv (fd, vector, count, 0); +} +strong_alias (__libc_readv, __readv) +weak_alias (__libc_readv, readv) diff --git a/ports/sysdeps/unix/sysv/aix/recv.c b/ports/sysdeps/unix/sysv/aix/recv.c new file mode 100644 index 000000000..b8ae73e20 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/recv.c @@ -0,0 +1,28 @@ +/* Copyright (C) 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 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. */ + +#include <sys/socket.h> + +extern ssize_t recv (int fd, void *buf, size_t n, int flags); + + +ssize_t +__recv (int fd, void *buf, size_t n, int flags) +{ + return recv (fd, buf, n, flags); +} diff --git a/ports/sysdeps/unix/sysv/aix/recvfrom.c b/ports/sysdeps/unix/sysv/aix/recvfrom.c new file mode 100644 index 000000000..08ff1113f --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/recvfrom.c @@ -0,0 +1,31 @@ +/* Copyright (C) 1999, 2000, 2001, 2002 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. */ + +#include <sys/socket.h> + +extern ssize_t nrecvfrom (int s, void *uap_buf, size_t len, int flags, + void *uap_from, socklen_t *uap_fromlenaddr); + +ssize_t +__recvfrom (int fd, void *buf, size_t n, int flags, __SOCKADDR_ARG addr, + socklen_t *addr_len) +{ + return nrecvfrom (fd, buf, n, flags, addr.__sockaddr__, addr_len); +} + +weak_alias (__recvfrom, recvfrom) diff --git a/ports/sysdeps/unix/sysv/aix/recvmsg.c b/ports/sysdeps/unix/sysv/aix/recvmsg.c new file mode 100644 index 000000000..201c26741 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/recvmsg.c @@ -0,0 +1,29 @@ +/* Copyright (C) 1999, 2000, 2001, 2002 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. */ + +#include <sys/socket.h> + +extern ssize_t nrecvmsg (int s, struct msghdr *uap_msg, int flags); + +ssize_t +__recvmsg (int fd, struct msghdr *message, int flags) +{ + return nrecvmsg (fd, message, flags); +} + +weak_alias (__recvmsg, recvmsg) diff --git a/ports/sysdeps/unix/sysv/aix/rename.c b/ports/sysdeps/unix/sysv/aix/rename.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/rename.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/revoke.c b/ports/sysdeps/unix/sysv/aix/revoke.c new file mode 100644 index 000000000..8f6a4848d --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/revoke.c @@ -0,0 +1,41 @@ +/* Revoke the access of all descriptors currently open on a file. AIX version. + Copyright (C) 1995, 1996, 1997, 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. */ + +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> + +extern int frevoke (int fdes); + +int +revoke (file) + const char *file; +{ + int fd; + int res; + + fd = open (file, O_RDONLY); + if (fd < 0) + return -1; + + res = frevoke (fd); + (void) close (fd); + + return res; +} diff --git a/ports/sysdeps/unix/sysv/aix/rmdir.c b/ports/sysdeps/unix/sysv/aix/rmdir.c new file mode 100644 index 000000000..91c600694 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/rmdir.c @@ -0,0 +1,25 @@ +/* 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 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. */ + +#include <unistd.h> + +int +__rmdir (const char *name) +{ + return rmdir (name); +} diff --git a/ports/sysdeps/unix/sysv/aix/sbrk.c b/ports/sysdeps/unix/sysv/aix/sbrk.c new file mode 100644 index 000000000..0a590ee8c --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/sbrk.c @@ -0,0 +1,26 @@ +/* Copyright (C) 1999, 2000, 2002 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. */ + +#include <unistd.h> + +void * +__sbrk (intptr_t delta) +{ + return sbrk (delta); +} +libc_hidden_def (__sbrk) diff --git a/ports/sysdeps/unix/sysv/aix/sched_yield.c b/ports/sysdeps/unix/sysv/aix/sched_yield.c new file mode 100644 index 000000000..b5fbc0753 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/sched_yield.c @@ -0,0 +1,31 @@ +/* Copyright (C) 1996, 1997, 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. */ + +#include <sched.h> + +extern void yield (void); + + +/* Yield the processor. */ +int +__sched_yield (void) +{ + yield (); + return 0; +} +strong_alias (__sched_yield, sched_yield) diff --git a/ports/sysdeps/unix/sysv/aix/select.c b/ports/sysdeps/unix/sysv/aix/select.c new file mode 100644 index 000000000..9bf5bae47 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/select.c @@ -0,0 +1,31 @@ +/* Copyright (C) 1999, 2000, 2002 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. */ + +#include <sys/time.h> + +int +__select (nfds, readfds, writefds, exceptfds, timeout) + int nfds; + fd_set *readfds; + fd_set *writefds; + fd_set *exceptfds; + struct timeval *timeout; +{ + return select (nfds, readfds, writefds, exceptfds, timeout); +} +libc_hidden_def (__select) diff --git a/ports/sysdeps/unix/sysv/aix/semctl.c b/ports/sysdeps/unix/sysv/aix/semctl.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/semctl.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/semget.c b/ports/sysdeps/unix/sysv/aix/semget.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/semget.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/semop.c b/ports/sysdeps/unix/sysv/aix/semop.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/semop.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/sendmsg.c b/ports/sysdeps/unix/sysv/aix/sendmsg.c new file mode 100644 index 000000000..5b1baf63a --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/sendmsg.c @@ -0,0 +1,30 @@ +/* Copyright (C) 1999, 2000, 2001, 2002 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. */ + +#include <sys/socket.h> + +extern int nsendmsg (int s, const void *uap_msg, int flags); + +ssize_t +__sendmsg (int fd, const struct msghdr *message, int flags) +{ + return nsendmsg (fd, message, flags); +} + +weak_alias (__sendmsg, sendmsg) + diff --git a/ports/sysdeps/unix/sysv/aix/sendto.c b/ports/sysdeps/unix/sysv/aix/sendto.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/sendto.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/setegid.c b/ports/sysdeps/unix/sysv/aix/setegid.c new file mode 100644 index 000000000..75123cedf --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/setegid.c @@ -0,0 +1,32 @@ +/* Copyright (C) 2000, 2002 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. */ + +#include <unistd.h> + +#define ID_EFFECTIVE 0x01 + + +extern int setgidx (int mask, gid_t gid); + +int +__setegid (gid_t gid) +{ + return setgidx (ID_EFFECTIVE, gid); +} +strong_alias (__setegid, setegid) +libc_hidden_def (setegid) diff --git a/ports/sysdeps/unix/sysv/aix/seteuid.c b/ports/sysdeps/unix/sysv/aix/seteuid.c new file mode 100644 index 000000000..6ea7e7ba0 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/seteuid.c @@ -0,0 +1,32 @@ +/* Copyright (C) 2000, 2002 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. */ + +#include <unistd.h> + +#define ID_EFFECTIVE 0x01 + + +extern int setuidx (int mask, uid_t uid); + +int +__seteuid (uid_t uid) +{ + return setuidx (ID_EFFECTIVE, uid); +} +strong_alias (__seteuid, seteuid) +libc_hidden_def (seteuid) diff --git a/ports/sysdeps/unix/sysv/aix/setgid.c b/ports/sysdeps/unix/sysv/aix/setgid.c new file mode 100644 index 000000000..5b8038110 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/setgid.c @@ -0,0 +1,31 @@ +/* Copyright (C) 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. */ + +#include <unistd.h> + +#define ID_REAL 0x02 + + +extern int setgidx (int mask, gid_t gid); + +int +__setgid (gid_t gid) +{ + return setgidx (ID_REAL, gid); +} +strong_alias (__setgid, setgid) diff --git a/ports/sysdeps/unix/sysv/aix/setgroups.c b/ports/sysdeps/unix/sysv/aix/setgroups.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/setgroups.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/setitimer.c b/ports/sysdeps/unix/sysv/aix/setitimer.c new file mode 100644 index 000000000..d7e741abe --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/setitimer.c @@ -0,0 +1,68 @@ +/* Copyright (C) 1991, 1994, 1995, 1996, 1997 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. */ + +#include <stddef.h> +#include <errno.h> +#include <sys/time.h> +#include <unistd.h> +#include <signal.h> + +extern int __libc_nanosleep (const struct timespec *requested_time, + struct timespec *remaining); +int +__setitimer (which, new, old) + enum __itimer_which which; + const struct itimerval *new; + struct itimerval *old; +{ + if (new == NULL) + { + __set_errno (EINVAL); + return -1; + } + + switch (which) + { + default: + __set_errno (EINVAL); + return -1; + + case ITIMER_VIRTUAL: + case ITIMER_PROF: + __set_errno (ENOSYS); + return -1; + + case ITIMER_REAL: + break; + } + + switch (__fork()) + { + case -1: exit(-1); + case 0: + { + struct timespec ts ={.tv_sec = (long int)new->it_value.tv_sec, .tv_nsec = 0}; + __libc_nanosleep(&ts,&ts); + __kill(getppid(), SIGALRM); + exit(0); + } + default: + } + return 0; +} +weak_alias (__setitimer, setitimer) diff --git a/ports/sysdeps/unix/sysv/aix/setpgid.c b/ports/sysdeps/unix/sysv/aix/setpgid.c new file mode 100644 index 000000000..b076f28ed --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/setpgid.c @@ -0,0 +1,28 @@ +/* Copyright (C) 1999, 2000, 2002 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. */ + +#include <unistd.h> + +int +__setpgid (pid, pgid) + int pid; + int pgid; +{ + return setpgid (pid, pgid); +} +libc_hidden_def (__setpgid) diff --git a/ports/sysdeps/unix/sysv/aix/setpgrp.c b/ports/sysdeps/unix/sysv/aix/setpgrp.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/setpgrp.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/setpriority.c b/ports/sysdeps/unix/sysv/aix/setpriority.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/setpriority.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/setregid.c b/ports/sysdeps/unix/sysv/aix/setregid.c new file mode 100644 index 000000000..35812300b --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/setregid.c @@ -0,0 +1,41 @@ +/* Copyright (C) 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. */ + +#include <unistd.h> + +#define ID_EFFECTIVE 0x01 +#define ID_REAL 0x02 + + +extern int setgidx (int mask, gid_t gid); + +int +__setregid (gid_t rgid, gid_t egid) +{ + int res; + + if (rgid == egid) + return setgidx (ID_EFFECTIVE | ID_REAL, egid); + + res = setgidx (ID_REAL, rgid); + if (res == 0) + res = setgidx (ID_EFFECTIVE, egid); + + return res; +} +strong_alias (__setregid, setregid) diff --git a/ports/sysdeps/unix/sysv/aix/setreuid.c b/ports/sysdeps/unix/sysv/aix/setreuid.c new file mode 100644 index 000000000..430d2fedc --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/setreuid.c @@ -0,0 +1,41 @@ +/* Copyright (C) 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. */ + +#include <unistd.h> + +#define ID_EFFECTIVE 0x01 +#define ID_REAL 0x02 + + +extern int setuidx (int mask, uid_t uid); + +int +__setreuid (uid_t ruid, uid_t euid) +{ + int res; + + if (ruid == euid) + return setuidx (ID_EFFECTIVE | ID_REAL, euid); + + res = setuidx (ID_REAL, ruid); + if (res == 0) + res = setuidx (ID_EFFECTIVE, euid); + + return res; +} +strong_alias (__setreuid, setreuid) diff --git a/ports/sysdeps/unix/sysv/aix/setrlimit.c b/ports/sysdeps/unix/sysv/aix/setrlimit.c new file mode 100644 index 000000000..818819d8e --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/setrlimit.c @@ -0,0 +1,25 @@ +/* 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 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. */ + +#include <sys/resource.h> + +int +__setrlimit (enum __rlimit_resource resource, const struct rlimit *rlimits) +{ + return setrlimit (resource, rlimits); +} diff --git a/ports/sysdeps/unix/sysv/aix/setrlimit64.c b/ports/sysdeps/unix/sysv/aix/setrlimit64.c new file mode 100644 index 000000000..f305c6f82 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/setrlimit64.c @@ -0,0 +1,25 @@ +/* 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 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. */ + +#include <sys/resource.h> + +int +__setrlimit64 (enum __rlimit_resource resource, const struct rlimit64 *rlimits) +{ + return setrlimit64 (resource, rlimits); +} diff --git a/ports/sysdeps/unix/sysv/aix/setsid.c b/ports/sysdeps/unix/sysv/aix/setsid.c new file mode 100644 index 000000000..c017c122b --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/setsid.c @@ -0,0 +1,25 @@ +/* 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 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. */ + +#include <unistd.h> + +int +__setsid () +{ + return setsid (); +} diff --git a/ports/sysdeps/unix/sysv/aix/setsockopt.c b/ports/sysdeps/unix/sysv/aix/setsockopt.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/setsockopt.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/setuid.c b/ports/sysdeps/unix/sysv/aix/setuid.c new file mode 100644 index 000000000..1772fc797 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/setuid.c @@ -0,0 +1,31 @@ +/* Copyright (C) 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. */ + +#include <unistd.h> + +#define ID_REAL 0x02 + + +extern int setuidx (int mask, uid_t uid); + +int +__setuid (uid_t uid) +{ + return setuidx (ID_REAL, uid); +} +strong_alias (__setuid, setuid) diff --git a/ports/sysdeps/unix/sysv/aix/shmat.c b/ports/sysdeps/unix/sysv/aix/shmat.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/shmat.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/shmctl.c b/ports/sysdeps/unix/sysv/aix/shmctl.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/shmctl.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/shmdt.c b/ports/sysdeps/unix/sysv/aix/shmdt.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/shmdt.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/shmget.c b/ports/sysdeps/unix/sysv/aix/shmget.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/shmget.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/sigaction.c b/ports/sysdeps/unix/sysv/aix/sigaction.c new file mode 100644 index 000000000..6b48a505c --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/sigaction.c @@ -0,0 +1,36 @@ +/* Copyright (C) 1991,1995,1996,1997,2000,2002 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. */ + +#include <errno.h> +#include <signal.h> + +extern int _sigaction (int sig, const struct sigaction *act, + struct sigaction *oact); + +/* If ACT is not NULL, change the action for SIG to *ACT. + If OACT is not NULL, put the old action for SIG in *OACT. */ +int +__sigaction (sig, act, oact) + int sig; + const struct sigaction *act; + struct sigaction *oact; +{ + return _sigaction (sig, act, oact); +} +libc_hidden_def (__sigaction) +strong_alias (__sigaction, sigaction) diff --git a/ports/sysdeps/unix/sysv/aix/sigaltstack.c b/ports/sysdeps/unix/sysv/aix/sigaltstack.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/sigaltstack.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/sigpending.c b/ports/sysdeps/unix/sysv/aix/sigpending.c new file mode 100644 index 000000000..729b75a3b --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/sigpending.c @@ -0,0 +1,30 @@ +/* Copyright (C) 1991, 1995, 1996, 1997, 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. */ + +#include <signal.h> + +extern int _sigpending (sigset_t *set); + + +/* Store in SET all signals that are blocked and pending. */ +int +sigpending (set) + sigset_t *set; +{ + return _sigpending (set); +} diff --git a/ports/sysdeps/unix/sysv/aix/sigprocmask.c b/ports/sysdeps/unix/sysv/aix/sigprocmask.c new file mode 100644 index 000000000..1046903b9 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/sigprocmask.c @@ -0,0 +1,8 @@ +/* This is a system call. We only have to provide the wrapper. */ +#include <signal.h> + +int +__sigprocmask (int how, const sigset_t *set, sigset_t *oset) +{ + return sigprocmask (how, set, oset); +} diff --git a/ports/sysdeps/unix/sysv/aix/sigset-cvt-mask.h b/ports/sysdeps/unix/sysv/aix/sigset-cvt-mask.h new file mode 100644 index 000000000..cc05fb70f --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/sigset-cvt-mask.h @@ -0,0 +1,33 @@ +/* Convert between lowlevel sigmask and libc representation of sigset_t. + AIX version. + Copyright (C) 1998,2000,02 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. */ + +static inline int __attribute__ ((unused)) +sigset_set_old_mask (sigset_t *set, int mask) +{ + set->__losigs = (unsigned int) mask; + set->__hisigs = 0; + return 0; +} + +static inline int __attribute__ ((unused)) +sigset_get_old_mask (const sigset_t *set) +{ + return (unsigned int) set->__losigs; +} diff --git a/ports/sysdeps/unix/sysv/aix/sigstack.c b/ports/sysdeps/unix/sysv/aix/sigstack.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/sigstack.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/sigsuspend.c b/ports/sysdeps/unix/sysv/aix/sigsuspend.c new file mode 100644 index 000000000..c9120d6e9 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/sigsuspend.c @@ -0,0 +1,33 @@ +/* Copyright (C) 1991, 1995-1998, 2000, 2002 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. */ + +#include <signal.h> + +extern int _sigsuspend (const sigset_t *sigmask); + + +/* Change the set of blocked signals to SET, + wait until a signal arrives, and restore the set of blocked signals. */ +int +__sigsuspend (set) + const sigset_t *set; +{ + return _sigsuspend (set); +} +libc_hidden_def (__sigsuspend) +weak_alias (__sigsuspend, sigsuspend) diff --git a/ports/sysdeps/unix/sysv/aix/sleep.c b/ports/sysdeps/unix/sysv/aix/sleep.c new file mode 100644 index 000000000..aa8d76d3d --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/sleep.c @@ -0,0 +1,34 @@ +/* Copyright (C) 1991, 1992, 1995, 1996, 1997 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. */ + +#include <time.h> +#include <unistd.h> +#include <errno.h> + +extern int __libc_nanosleep (const struct timespec *requested_time, + struct timespec *remaining); + +unsigned int +__sleep (seconds) + unsigned int seconds; +{ + struct timespec ts ={.tv_sec = (long int)seconds, .tv_nsec = 0}; + __libc_nanosleep(&ts,&ts); + return 0; +} +weak_alias (__sleep, sleep) diff --git a/ports/sysdeps/unix/sysv/aix/socket.c b/ports/sysdeps/unix/sysv/aix/socket.c new file mode 100644 index 000000000..236b1b168 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/socket.c @@ -0,0 +1,25 @@ +/* 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 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. */ + +#include <sys/socket.h> + +int +__socket (int domain, int type, int protocol) +{ + return socket (domain, type, protocol); +} diff --git a/ports/sysdeps/unix/sysv/aix/socketpair.c b/ports/sysdeps/unix/sysv/aix/socketpair.c new file mode 100644 index 000000000..8adeac97f --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/socketpair.c @@ -0,0 +1,25 @@ +/* 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 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. */ + +#include <sys/socket.h> + +int +__socketpair (int domain, int type, int protocol, int fds[2]) +{ + return socketpair (domain, type, protocol, fds); +} diff --git a/ports/sysdeps/unix/sysv/aix/speed.c b/ports/sysdeps/unix/sysv/aix/speed.c new file mode 100644 index 000000000..3a453a7be --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/speed.c @@ -0,0 +1,75 @@ +/* `struct termios' speed frobnication functions. AIX version. + Copyright (C) 2000, 2002 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. */ + +#include <stddef.h> +#include <errno.h> +#include <termios.h> + +/* Return the output baud rate stored in *TERMIOS_P. */ +speed_t +cfgetospeed (termios_p) + const struct termios *termios_p; +{ + return termios_p->c_cflag & 0x0000000f; +} + +/* Return the input baud rate stored in *TERMIOS_P. */ +speed_t +cfgetispeed (termios_p) + const struct termios *termios_p; +{ + return (termios_p->c_cflag & 0x000f0000) >> 16; +} + +/* Set the output baud rate stored in *TERMIOS_P to SPEED. */ +int +cfsetospeed (termios_p, speed) + struct termios *termios_p; + speed_t speed; +{ + if (termios_p == NULL) + { + __set_errno (EINVAL); + return -1; + } + + termios_p->c_cflag &= ~0x0000000f; + termios_p->c_cflag |= speed & 0x0000000f; + return 0; +} +libc_hidden_def (cfsetospeed) + + +/* Set the input baud rate stored in *TERMIOS_P to SPEED. */ +int +cfsetispeed (termios_p, speed) + struct termios *termios_p; + speed_t speed; +{ + if (termios_p == NULL) + { + __set_errno (EINVAL); + return -1; + } + + termios_p->c_cflag &= ~0x000f0000; + termios_p->c_cflag |= (speed << 16) & ~0x000f0000; + return 0; +} +libc_hidden_def (cfsetispeed) diff --git a/ports/sysdeps/unix/sysv/aix/start-libc.c b/ports/sysdeps/unix/sysv/aix/start-libc.c new file mode 100644 index 000000000..0cbe79d0b --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/start-libc.c @@ -0,0 +1,265 @@ +/* Initialization code run first thing by the XCOFF startup code. AIX version. + Copyright (C) 2001, 2002 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. */ + +#include <stdlib.h> +#include <unistd.h> +#include <sys/types.h> + +/* hack to use uchar's */ +typedef unsigned char uchar; +#include <xcoff.h> +#include <rtinit.h> +#include <dlldr.h> +#include <bits/libc-lock.h> + +extern void __libc_init_first (int argc, char **argv, char **envp); + +/* XXX disable for now +extern int __libc_multiple_libcs; */ + +/* XXX normally defined in generic/dl-sydep.c, hack it into existance +extern void *__libc_stack_end; */ +void *__libc_stack_end; + +struct __libc_start_data_rec +{ + void *stack; + void *toc; + int argc; + char **argv; + char **envp; + char *data; + char *text; + unsigned int mcount; + unsigned int special; + int (*main) (int, char **, char **); + void (*init) (void); + void (*fini) (void); + void (*rtld_fini) (void); +}; + +extern struct __libc_start_data_rec __libc_start_data; +extern int errno; + +/* The first piece of initialized data. */ +int __data_start = 0; + +#ifndef HAVE_ELF +/* Since gcc/crtstuff.c won't define it unless the ELF format is used + we will need to define it here. */ +void *__dso_handle = NULL; +#endif + +/* AIX kernel function */ +extern int __loadx (int flag, void *module, void *arg1, void *arg2, + void *arg3); +/* Needed by setenv */ +char **__environ; + +/* + Find __rtinit symbol + + __RTINIT *find_rtinit() + + __RTINIT *rti - pointer to __rtinit data structure + */ + +static __RTINIT * +find_rtinit (void) +{ + struct xcoffhdr *xcoff_hdr; + SCNHDR *sec_hdr; + SCNHDR *ldr_sec_hdr; + SCNHDR *data_sec_hdr; + LDSYM *ldsym_hdr; + __RTINIT *rtl; + + xcoff_hdr = (struct xcoffhdr *) __libc_start_data.text; + sec_hdr = (SCNHDR *) ((caddr_t) &xcoff_hdr->aouthdr + + xcoff_hdr->filehdr.f_opthdr); + ldr_sec_hdr = (SCNHDR *) (sec_hdr + (xcoff_hdr->aouthdr.o_snloader - 1)); + ldsym_hdr = (LDSYM *) ((caddr_t)xcoff_hdr + ldr_sec_hdr->s_scnptr + + LDHDRSZ); + + if ( __libc_start_data.mcount <= 0) + { + if (!ldr_sec_hdr->s_scnptr) + return (__RTINIT *) 0; + + if (memcmp (ldsym_hdr, RTINIT_NAME, sizeof (RTINIT_NAME) - 1)) + return (__RTINIT *) 0; + } + + data_sec_hdr = (SCNHDR *) (sec_hdr + (xcoff_hdr->aouthdr.o_sndata - 1)); + rtl = (__RTINIT *) (ldsym_hdr->l_value + + (__libc_start_data.data - data_sec_hdr->s_vaddr)); + return rtl; +} + +/* + The mod_init1 calls every initialization function for a given module. + + void mod_init1(handler, rti) + + void *handler - if NULL init funtions for modules loaded at exec time + are being executed. Otherwise, the handler points to the + module loaded. + + __RTINIT *rti - pointer to __rtinit data structure (with rti->init_offset + not equal to zero) + */ + +static void +mod_init1 (void *handler,__RTINIT *rtl) +{ + __RTINIT_DESCRIPTOR *descriptor; + + descriptor = (__RTINIT_DESCRIPTOR *) ((caddr_t) &rtl->rtl + + rtl->init_offset); + while (descriptor->f != NULL) + { + if (!(descriptor->flags & _RT_CALLED)) + { + descriptor->flags |= _RT_CALLED; + (descriptor->f) (handler, rtl, descriptor); /* execute init/fini */ + } + descriptor = (__RTINIT_DESCRIPTOR *) ((caddr_t) descriptor + + rtl->__rtinit_descriptor_size); + } +} + +/* The modinit() function performs run-time linking, if enabled, and calling + the init() function for all loaded modules. */ + +#define DL_BUFFER_SIZE 1000 + +static int +modinit (void) +{ + int *handler = 0; + __RTINIT *rtinit_info = 0; + int flag; + DL_INFO dl_buffer[DL_BUFFER_SIZE]; + DL_INFO *dl_info = dl_buffer; + int i; + + /* Find __rtinit symbols */ + rtinit_info = find_rtinit (); + + flag = DL_EXECQ; + if (rtinit_info && rtinit_info->rtl) + flag |= DL_LOAD_RTL; + + /* Get a list of modules that have __rtinit */ + if (__loadx (flag, dl_info, (void *) sizeof (dl_buffer), NULL, NULL)) + exit (0x90); + + if (dl_info[0].dlinfo_xflags & DL_INFO_OK) + { + rtinit_info = find_rtinit (); + if ((rtinit_info != NULL) & (rtinit_info->rtl != NULL)) + { + if ((*rtinit_info->rtl) (dl_info, 0)) + exit (0x90); + } + } + + /* Initialization each module loaded that has __rtinit. */ + if (dl_info[0].dlinfo_xflags & DL_INFO_OK) + { + for (i = 1; i < dl_info[0].dlinfo_arraylen + 1; ++i) + if (dl_info[i].dlinfo_flags & DL_HAS_RTINIT) + { + rtinit_info = find_rtini t(); + if (rtinit_info) + mod_init1 (handler, rtinit_info); + } + } + + return 0; +} + + +void +__libc_start_init (void) +{ + /* Do run-time linking, if enabled and call the init() + for all loaded modules. */ + if (__libc_start_data.mcount != __libc_start_data.special) + modinit (); +} + +/* For now these are just stubs. */ +void +__libc_start_fini (void) +{ +} + +void +__libc_start_rtld_fini (void) +{ +} + + +int +__libc_start_main (void) +{ + /* Store the lowest stack address. */ + __libc_stack_end = __libc_start_data.stack; + + /* Used by setenv */ + __environ = __libc_start_data.envp; + +#ifndef SHARED + /* Clear errno. */ + errno = 0; + + /* Some security at this point. Prevent starting a SUID binary where + the standard file descriptors are not opened. We have to do this + only for statically linked applications since otherwise the dynamic + loader did the work already. */ + if (__builtin_expect (__libc_enable_secure, 0)) + __libc_check_standard_fds (); + +#endif + + /* Register the destructor of the dynamic linker if there is any. */ + if (__builtin_expect (__libc_start_data.rtld_fini != NULL, 1)) + __cxa_atexit ((void (*) (void *)) __libc_start_data.rtld_fini, NULL, NULL); + + /* Call the initializer of the libc. This is only needed here if we + are compiling for the static library in which case we haven't + run the constructors in `_dl_start_user'. */ +#ifndef SHARED + __libc_init_first (__libc_start_data.argc, __libc_start_data.argv, + __libc_start_data.envp); +#endif + + /* Register the destructor of the program, if any. */ + if (__libc_start_data.fini) + __cxa_atexit ((void (*) (void *)) __libc_start_data.fini, NULL, NULL); + + /* Call the initializer of the program, if any. */ + if (__libc_start_data.init) + (*__libc_start_data.init) (); + + exit ((*__libc_start_data.main) (__libc_start_data.argc, + __libc_start_data.argv, + __libc_start_data.envp)); +} diff --git a/ports/sysdeps/unix/sysv/aix/start.s b/ports/sysdeps/unix/sysv/aix/start.s new file mode 100644 index 000000000..79d8ef489 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/start.s @@ -0,0 +1,126 @@ +/* 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 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. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The GNU Lesser General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + Note that people who make modified versions of this file are not + obligated to grant this special exception for their modified + versions; it is their choice whether to do so. The GNU Lesser + General Public License gives permission to release a modified + version without this exception; this exception also makes it + possible to release a modified version which carries forward this + exception. + + 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. */ + + .file "start.s" + .toc +T.lsd: .tc __libc_start_data[tc], __libc_start_data[rw] +T.main: .tc main[tc], main[rw] +T.init: .tc __libc_start_init[tc], __libc_start_init[rw] +T.fini: .tc __libc_start_fini[tc], __libc_start_init[rw] +T.rtld_fini : .tc __libc_start_rtld_fini[tc], __libc_start_rtld_fini[rw] + + .globl __start + .globl .__start + .globl __libc_start_data + + .extern .__libc_start_main + .extern .main + .extern main + .extern __libc_start_init + .extern __libc_start_fini + .extern __libc_start_rtld_fini + +/* Text */ + + .csect __start[ds] +__start: + .long .__start, TOC[tc0], 0 + + .csect .text[pr] +.__start: + +/* No prologue needed, __start does not have to follow the ABI. + + Input from kernel/loader + r1 : stack + r2 : TOC + r3 : argc + r4 : argv + r5 : envp + r28 : data origin + r29 : text origin + r30 : module count + r31 : default processing flag + + If r31 == r30, no special processing is needed, ie r28, r29 & r30 + are not used + + Save input in __libc_start_data */ + l 16, T.lsd(2) + st 1, 0(16) /* stack */ + st 2, 4(16) /* toc */ + st 3, 8(16) /* argc */ + st 4, 12(16) /* argv */ + st 5, 16(16) /* envp */ + st 28, 20(16) /* data origin */ + st 29, 24(16) /* text origin */ + st 30, 28(16) /* module count */ + st 31, 32(16) /* special */ + +/* Call __libc_start_main() */ + + bl .__libc_start_main + nop + +/* No epilog needed, __start does not have to follow the ABI */ + +/* Trace back */ +TB.__start: + .long 0x0 + .long 0xc2040 + .long 0x0 + .long TB.__start - .__start + .short 7 + .byte "__start" + .byte 0,0,0 + +/* Data + __libc_start_data + Space to keep libc initialization information */ + + .csect __libc_start_data[rw] +__libc_start_data: +/* For kernel/loader input args */ + .space 36 + +/* Externs */ + .long main +init: + .long __libc_start_init +fini: + .long __libc_start_fini +rtld_fini: + .long __libc_start_rtld_fini + .space 0x1000 + (4 + rtld_fini - __libc_start_data) diff --git a/ports/sysdeps/unix/sysv/aix/statfs.c b/ports/sysdeps/unix/sysv/aix/statfs.c new file mode 100644 index 000000000..1ead597da --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/statfs.c @@ -0,0 +1,28 @@ +/* Copyright (C) 1999, 2000, 2002 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. */ + +#include <sys/statfs.h> + +extern int statfs (const char *file, struct statfs *buf); + +int +__statfs (const char *file, struct statfs *buf) +{ + return statfs (file, buf); +} +libc_hidden_def (__statfs) diff --git a/ports/sysdeps/unix/sysv/aix/symlink.c b/ports/sysdeps/unix/sysv/aix/symlink.c new file mode 100644 index 000000000..cb2496595 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/symlink.c @@ -0,0 +1,27 @@ +/* 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 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. */ + +#include <unistd.h> + +int +__symlink (from, to) + const char *from; + const char *to; +{ + return symlink (from, to); +} diff --git a/ports/sysdeps/unix/sysv/aix/sync.c b/ports/sysdeps/unix/sysv/aix/sync.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/sync.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/sys/param.h b/ports/sysdeps/unix/sysv/aix/sys/param.h new file mode 100644 index 000000000..7448f1a6e --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/sys/param.h @@ -0,0 +1,48 @@ +/* Copyright (C) 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 _SYS_PARAM_H +#define _SYS_PARAM_H 1 + +/* This file should contain various parameter macros appropriate for the + machine and operating system. There is no standard set of macros; this + file is just for compatibility with programs written for Unix that + expect it to define things. On Unix systems that do not have their own + sysdep version of this file, it is generated at build time by examining + the installed headers on the system. */ + +#include <limits.h> + +#define MAXSYMLINKS 1 +#define MAXPATHLEN 256 + +/* The pagesize is 4096. */ +#define EXEC_PAGESIZE 4096 + +/* maximum number of supplemental groups. */ +#define NGROUPS 32 + +/* Macros for min/max. */ +#define MIN(a,b) (((a)<(b))?(a):(b)) +#define MAX(a,b) (((a)>(b))?(a):(b)) + + +/* Maximum length of hostname. */ +#define MAXHOSTNAMELEN 256 + +#endif /* sys/param.h */ diff --git a/ports/sysdeps/unix/sysv/aix/sys/ucontext.h b/ports/sysdeps/unix/sysv/aix/sys/ucontext.h new file mode 100644 index 000000000..ddb3f010c --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/sys/ucontext.h @@ -0,0 +1,113 @@ +/* Copyright (C) 1997, 1998, 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 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 _SYS_UCONTEXT_H +#define _SYS_UCONTEXT_H 1 + +#include <features.h> +#include <bits/types.h> +#include <bits/sigset.h> + + +/* Alternate, preferred interface. */ +typedef struct sigaltstack + { + void *ss_sp; + size_t ss_size; + int ss_flags; + int __pad[4]; + } stack_t; + + +/* Forward declaration of AIX type. */ +typedef struct label_t label_t; + + + +typedef unsigned int kvmhandle_t; +typedef struct + { + unsigned long int __alloc; + kvmhandle_t __srval[16]; + } adspace_t; + + + +#define _NGPRS 32 +#define _NFPRS 32 + +struct __mstsafe +{ + struct __mstsave *__prev; /* Previous save area. */ + label_t *__kjmpbuf; /* Pointer to saved context. */ + char *__stackfix; /* Stack fix pointer. */ + char __intpri; /* Interrupt priority. */ + char __backt; /* Back-track flag. */ + char __rsvd[2]; /* Reserved. */ + __pid_t __curid; /* Copy of curid. */ + + int __excp_type; /* Exception type for debugger. */ + unsigned long int __iar; /* Instruction address register. */ + unsigned long int __msr; /* Machine state register. */ + unsigned long int __cr; /* Condition register. */ + unsigned long int __lr; /* Link register. */ + unsigned long int __ctr; /* Count register. */ + unsigned long int __xer; /* Fixed point exception. */ + unsigned long int __mq; /* Multiply/quotient register. */ + unsigned long int __tid; /* TID register. */ + unsigned long int __fpscr; /* Floating point status reg. */ + char __fpeu; /* Floating point ever used. */ + char __fpinfo; /* Floating point status flags. */ + char __pad[2]; /* Pad to dword boundary. */ + /* 1 implies state is in mstext */ + unsigned long int __except[5]; /* exception structure. */ + char __pad1[4]; /* Old bus field. */ + unsigned long int __o_iar; /* Old iar (for longjmp excpt). */ + unsigned long int __o_toc; /* Old toc (for longjmp excpt). */ + unsigned long int __o_arg1; /* Old arg1 (for longjmp excpt). */ + unsigned long int __excbranch; /* If not NULL, address to branch + to on exception. Used by + assembler routines for low + cost exception handling. */ + unsigned long int __fpscrx; /* Software extension to fpscr. */ + unsigned long int __o_vaddr; /* Saved vaddr for vmexception. */ + unsigned long int __cachealign[7]; /* Reserved. */ + adspace_t __as; /* Segment registers. */ + unsigned long int __gpr[_NGPRS]; /* General purpose registers. */ + double __fpr[_NFPRS]; /* Floating point registers. */ + }; + +typedef struct mcontext_t + { + struct __mstsafe __jmp_context; + } mcontext_t; + + +typedef struct ucontext_t + { + int __sc_onstack; /* Sigstack state to restore. */ + __sigset_t uc_sigmask; /* The set of signals that are blocked when + this context is active. */ + int __sc_uerror; /* u_error to restore. */ + mcontext_t uc_mcontext; /* Machine-specific image of saved context. */ + struct ucontext_t *uc_link; /* context resumed after this one returns */ + stack_t uc_stack; /* stack used by context */ + int __pad[4]; + } ucontext_t; + +#endif /* sys/ucontext.h */ diff --git a/ports/sysdeps/unix/sysv/aix/syscall.c b/ports/sysdeps/unix/sysv/aix/syscall.c new file mode 100644 index 000000000..6f204ff80 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/syscall.c @@ -0,0 +1,2 @@ +/* XXX We will have to see whether it is possible to implement this + function at all. */ diff --git a/ports/sysdeps/unix/sysv/aix/sysdep.h b/ports/sysdeps/unix/sysv/aix/sysdep.h new file mode 100644 index 000000000..dcf37f253 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/sysdep.h @@ -0,0 +1,88 @@ +/* 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 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. */ + +#include <sysdeps/unix/powerpc/sysdep.h> + + +/* This seems to always be the case on PPC. */ +#define ALIGNARG(log2) log2 + +/* How to define local lables. */ +#define L(name) L..##name + +/* Label in text section. */ +#define C_TEXT(name) .##name + +/* Function descriptor. */ +#define FUNCDESC(real, code) \ + .toc; \ + .csect real##[DS], 3; \ + .globl real; \ +real: \ + .long code, TOC[tc0], 0; + +/* Code to generate function entry code. */ +#define ENTRY(name) \ + FUNCDESC (name, C_TEXT (name)) \ + .csect .text[PR], 2; \ + .globl C_TEXT (name); \ +C_TEXT (name): + +/* XXX For now we don't define any code. */ +#define CALL_MCOUNT + +#define EALIGN_W_0 /* No words to insert. */ +#define EALIGN_W_1 nop +#define EALIGN_W_2 nop;nop +#define EALIGN_W_3 nop;nop;nop +#define EALIGN_W_4 EALIGN_W_3;nop +#define EALIGN_W_5 EALIGN_W_4;nop +#define EALIGN_W_6 EALIGN_W_5;nop +#define EALIGN_W_7 EALIGN_W_6;nop + +/* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes + past a 2^align boundary. */ +#ifdef PROF +#define EALIGN(name, alignt, words) \ + FUNCDESC (name, C_TEXT (name)) \ + .csect .text[PR], 2; \ + .align ALIGNARG(2); \ + .globl C_TEXT (name); \ +C_TEXT (name): \ + CALL_MCOUNT \ + b L(align_0); \ + .align ALIGNARG(alignt); \ + EALIGN_W_##words; \ +L(align_0): +#else /* PROF */ +#define EALIGN(name, alignt, words) \ + FUNCDESC (name, C_TEXT (name)) \ + .csect .text[PR], 2; \ + .align ALIGNARG(alignt); \ + EALIGN_W_##words; \ + .globl C_TEXT (name); \ +C_TEXT (name): +#endif + +/* No special end code for now. We will eventually add to usual prolog + with function length etc. */ +#define END(name) + + +/* Jumping to another function. We are jumping to the TOC entry. */ +#define JUMPTARGET(name) C_TEXT (name) diff --git a/ports/sysdeps/unix/sysv/aix/sysv_termio.h b/ports/sysdeps/unix/sysv/aix/sysv_termio.h new file mode 100644 index 000000000..f314c0e16 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/sysv_termio.h @@ -0,0 +1,155 @@ +/* Copyright (C) 1992, 1997, 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. */ + +/* In various parts of this file we define the System V values for + things as _SYSV_<whatever>. Those are the values that System V + uses for termio, and also (SVR4) termios. Not necessarily the + same as the GNU termios that the library user sees. */ + +/* Number of elements of c_cc. termio only. */ +#define _SYSV_NCC 8 + +#define _SYSV_VINTR 0 +#define _SYSV_VQUIT 1 +#define _SYSV_VERASE 2 +#define _SYSV_VKILL 3 +#define _SYSV_VEOF 4 +/* This field means VEOF if ICANON, VMIN if not. */ +#define _SYSV_VMIN 4 +#define _SYSV_VEOL 5 +/* This field means VEOL if ICANON, VTIME if not. */ +#define _SYSV_VTIME 5 +#define _SYSV_VEOL2 6 + +/* Flags in c_iflag. */ +#define _SYSV_IGNBRK 1 +#define _SYSV_BRKINT 2 +#define _SYSV_IGNPAR 4 +#define _SYSV_PARMRK 8 +#define _SYSV_INPCK 0x10 +#define _SYSV_ISTRIP 0x20 +#define _SYSV_INLCR 0x40 +#define _SYSV_IGNCR 0x80 +#define _SYSV_ICRNL 0x100 +#define _SYSV_IUCLC 0x200 +#define _SYSV_IXON 0x400 +#define _SYSV_IXANY 0x800 +#define _SYSV_IXOFF 0x1000 +#define _SYSV_IMAXBEL 0x2000 + +/* Flags in c_cflag. */ +#define _SYSV_CBAUD 0xf +#define _SYSV_CIBAUD 0xf0000 /* termios only. */ +#define _SYSV_IBSHIFT 16 +/* Values for CBAUD and CIBAUD. */ +#define _SYSV_B0 0 +#define _SYSV_B50 1 +#define _SYSV_B75 2 +#define _SYSV_B110 3 +#define _SYSV_B134 4 +#define _SYSV_B150 5 +#define _SYSV_B200 6 +#define _SYSV_B300 7 +#define _SYSV_B600 8 +#define _SYSV_B1200 9 +#define _SYSV_B1800 10 +#define _SYSV_B2400 11 +#define _SYSV_B4800 12 +#define _SYSV_B9600 13 +#define _SYSV_B19200 14 +#define _SYSV_B38400 15 + +#define _SYSV_CS5 0 +#define _SYSV_CS6 0x10 +#define _SYSV_CS7 0x20 +#define _SYSV_CS8 0x30 +#define _SYSV_CSIZE 0x30 +#define _SYSV_CSTOPB 0x40 +#define _SYSV_CREAD 0x80 +#define _SYSV_PARENB 0x100 +#define _SYSV_PARODD 0x200 +#define _SYSV_HUPCL 0x400 +#define _SYSV_CLOCAL 0x800 + +/* Flags in c_lflag. */ +#define _SYSV_ISIG 1 +#define _SYSV_ICANON 2 +#define _SYSV_ECHO 8 +#define _SYSV_ECHOE 0x10 +#define _SYSV_ECHOK 0x20 +#define _SYSV_ECHONL 0x40 +#define _SYSV_NOFLSH 0x80 +#define _SYSV_TOSTOP 0x100 +#define _SYSV_ECHOCTL 0x200 +#define _SYSV_ECHOPRT 0x400 +#define _SYSV_ECHOKE 0x800 +#define _SYSV_FLUSHO 0x2000 +#define _SYSV_PENDIN 0x4000 +#define _SYSV_IEXTEN 0x8000 + +/* Flags in c_oflag. */ +#define _SYSV_OPOST 1 +#define _SYSV_OLCUC 2 +#define _SYSV_ONLCR 4 +#define _SYSV_NLDLY 0x100 +#define _SYSV_NL0 0 +#define _SYSV_NL1 0x100 +#define _SYSV_CRDLY 0x600 +#define _SYSV_CR0 0 +#define _SYSV_CR1 0x200 +#define _SYSV_CR2 0x400 +#define _SYSV_CR3 0x600 +#define _SYSV_TABDLY 0x1800 +#define _SYSV_TAB0 0 +#define _SYSV_TAB1 0x0800 +#define _SYSV_TAB2 0x1000 +/* TAB3 is an obsolete name for XTABS. But we provide it since some + programs expect it to exist. */ +#define _SYSV_TAB3 0x1800 +#define _SYSV_XTABS 0x1800 +#define _SYSV_BSDLY 0x2000 +#define _SYSV_BS0 0 +#define _SYSV_BS1 0x2000 +#define _SYSV_VTDLY 0x4000 +#define _SYSV_VT0 0 +#define _SYSV_VT1 0x4000 +#define _SYSV_FFDLY 0x8000 +#define _SYSV_FF0 0 +#define _SYSV_FF1 0x8000 + +/* ioctl's. */ + +#define _TCGETA 0x5405 +#define _TCSETA 0x5406 +#define _TCSETAW 0x5407 +#define _TCSETAF 0x5408 +#define _TCSBRK 0x5409 +#define _TCXONC 0x540B +#define _TCFLSH 0x540C +#define _TIOCGPGRP 0x7414 +#define _TIOCSPGRP 0x7415 + +struct __sysv_termio + { + unsigned short c_iflag; + unsigned short c_oflag; + unsigned short c_cflag; + unsigned short c_lflag; + char c_line; + unsigned char c_cc[_SYSV_NCC]; + }; diff --git a/ports/sysdeps/unix/sysv/aix/tcgetattr.c b/ports/sysdeps/unix/sysv/aix/tcgetattr.c new file mode 100644 index 000000000..01ffd55ef --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/tcgetattr.c @@ -0,0 +1,152 @@ +/* Copyright (C) 1992, 1995, 1996, 1997, 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. */ + +#include <errno.h> +#include <stddef.h> +#include <sysv_termio.h> +#include <termios.h> +#include <sys/ioctl.h> + +/* Put the state of FD into *TERMIOS_P. */ +int +__tcgetattr (fd, termios_p) + int fd; + struct termios *termios_p; +{ + struct __sysv_termio buf; + + if (termios_p == NULL) + { + __set_errno (EINVAL); + return -1; + } + + if (__ioctl (fd, _TCGETA, &buf) < 0) + return -1; + + termios_p->c_cflag &= ~0x000f0000; + termios_p->c_cflag |= (termios_p->c_cflag & 0xf) << 16; + + termios_p->c_iflag = 0; + if (buf.c_iflag & _SYSV_IGNBRK) + termios_p->c_iflag |= IGNBRK; + if (buf.c_iflag & _SYSV_BRKINT) + termios_p->c_iflag |= BRKINT; + if (buf.c_iflag & _SYSV_IGNPAR) + termios_p->c_iflag |= IGNPAR; + if (buf.c_iflag & _SYSV_PARMRK) + termios_p->c_iflag |= PARMRK; + if (buf.c_iflag & _SYSV_INPCK) + termios_p->c_iflag |= INPCK; + if (buf.c_iflag & _SYSV_ISTRIP) + termios_p->c_iflag |= ISTRIP; + if (buf.c_iflag & _SYSV_INLCR) + termios_p->c_iflag |= INLCR; + if (buf.c_iflag & _SYSV_IGNCR) + termios_p->c_iflag |= IGNCR; + if (buf.c_iflag & _SYSV_ICRNL) + termios_p->c_iflag |= ICRNL; + if (buf.c_iflag & _SYSV_IXON) + termios_p->c_iflag |= IXON; + if (buf.c_iflag & _SYSV_IXOFF) + termios_p->c_iflag |= IXOFF; + if (buf.c_iflag & _SYSV_IXANY) + termios_p->c_iflag |= IXANY; + if (buf.c_iflag & _SYSV_IMAXBEL) + termios_p->c_iflag |= IMAXBEL; + + termios_p->c_oflag = 0; + if (buf.c_oflag & OPOST) + termios_p->c_oflag |= OPOST; + if (buf.c_oflag & ONLCR) + termios_p->c_oflag |= ONLCR; + termios_p->c_cflag = 0; + switch (buf.c_cflag & _SYSV_CSIZE) + { + case _SYSV_CS5: + termios_p->c_cflag |= CS5; + break; + case _SYSV_CS6: + termios_p->c_cflag |= CS6; + break; + case _SYSV_CS7: + termios_p->c_cflag |= CS7; + break; + case _SYSV_CS8: + termios_p->c_cflag |= CS8; + break; + } + if (buf.c_cflag & _SYSV_CSTOPB) + termios_p->c_cflag |= CSTOPB; + if (buf.c_cflag & _SYSV_CREAD) + termios_p->c_cflag |= CREAD; + if (buf.c_cflag & _SYSV_PARENB) + termios_p->c_cflag |= PARENB; + if (buf.c_cflag & _SYSV_PARODD) + termios_p->c_cflag |= PARODD; + if (buf.c_cflag & _SYSV_HUPCL) + termios_p->c_cflag |= HUPCL; + if (buf.c_cflag & _SYSV_CLOCAL) + termios_p->c_cflag |= CLOCAL; + termios_p->c_lflag = 0; + if (buf.c_lflag & _SYSV_ISIG) + termios_p->c_lflag |= ISIG; + if (buf.c_lflag & _SYSV_ICANON) + termios_p->c_lflag |= ICANON; + if (buf.c_lflag & _SYSV_ECHO) + termios_p->c_lflag |= ECHO; + if (buf.c_lflag & _SYSV_ECHOE) + termios_p->c_lflag |= ECHOE; + if (buf.c_lflag & _SYSV_ECHOK) + termios_p->c_lflag |= ECHOK; + if (buf.c_lflag & _SYSV_ECHONL) + termios_p->c_lflag |= ECHONL; + if (buf.c_lflag & _SYSV_NOFLSH) + termios_p->c_lflag |= NOFLSH; + if (buf.c_lflag & _SYSV_TOSTOP) + termios_p->c_lflag |= TOSTOP; + if (buf.c_lflag & _SYSV_ECHOKE) + termios_p->c_lflag |= ECHOKE; + if (buf.c_lflag & _SYSV_ECHOPRT) + termios_p->c_lflag |= ECHOPRT; + if (buf.c_lflag & _SYSV_ECHOCTL) + termios_p->c_lflag |= ECHOCTL; + if (buf.c_lflag & _SYSV_FLUSHO) + termios_p->c_lflag |= FLUSHO; + if (buf.c_lflag & _SYSV_PENDIN) + termios_p->c_lflag |= PENDIN; + if (buf.c_lflag & _SYSV_IEXTEN) + termios_p->c_lflag |= IEXTEN; + + termios_p->c_cc[VEOF] = buf.c_cc[_SYSV_VEOF]; + termios_p->c_cc[VEOL] = buf.c_cc[_SYSV_VEOL]; + termios_p->c_cc[VEOL2] = buf.c_cc[_SYSV_VEOL2]; + termios_p->c_cc[VERASE] = buf.c_cc[_SYSV_VERASE]; + termios_p->c_cc[VKILL] = buf.c_cc[_SYSV_VKILL]; + termios_p->c_cc[VINTR] = buf.c_cc[_SYSV_VINTR]; + termios_p->c_cc[VQUIT] = buf.c_cc[_SYSV_VQUIT]; + termios_p->c_cc[VSTART] = '\021'; /* XON (^Q). */ + termios_p->c_cc[VSTOP] = '\023'; /* XOFF (^S). */ + termios_p->c_cc[VSUSP] = '\0'; /* System V release 3 lacks job control. */ + termios_p->c_cc[VMIN] = buf.c_cc[_SYSV_VMIN]; + termios_p->c_cc[VTIME] = buf.c_cc[_SYSV_VTIME]; + + return 0; +} + +weak_alias (__tcgetattr, tcgetattr) diff --git a/ports/sysdeps/unix/sysv/aix/tcsetattr.c b/ports/sysdeps/unix/sysv/aix/tcsetattr.c new file mode 100644 index 000000000..8e78da1c2 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/tcsetattr.c @@ -0,0 +1,198 @@ +/* Copyright (C) 1992,1995,1996,1997,2000,2002 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. */ + +#include <errno.h> +#include <stddef.h> +#include <termios.h> +#include <sys/ioctl.h> + +#include <sysv_termio.h> + + +const speed_t __unix_speeds[] = + { + 0, + 50, + 75, + 110, + 134, + 150, + 200, + 300, + 600, + 1200, + 1800, + 2400, + 4800, + 9600, + 19200, + 38400, + }; + + +/* Set the state of FD to *TERMIOS_P. */ +int +tcsetattr (fd, optional_actions, termios_p) + int fd; + int optional_actions; + const struct termios *termios_p; +{ + struct __sysv_termio buf; + int ioctl_function; + + if (termios_p == NULL) + { + __set_errno (EINVAL); + return -1; + } + switch (optional_actions) + { + case TCSANOW: + ioctl_function = _TCSETA; + break; + case TCSADRAIN: + ioctl_function = _TCSETAW; + break; + case TCSAFLUSH: + ioctl_function = _TCSETAF; + break; + default: + __set_errno (EINVAL); + return -1; + } + + if ((termios_p->c_cflag & 0x000f0000) >> 16 != (termios_p->c_cflag & 0xf)) + { + __set_errno (EINVAL); + return -1; + } + + buf.c_iflag = 0; + if (termios_p->c_iflag & IGNBRK) + buf.c_iflag |= _SYSV_IGNBRK; + if (termios_p->c_iflag & BRKINT) + buf.c_iflag |= _SYSV_BRKINT; + if (termios_p->c_iflag & IGNPAR) + buf.c_iflag |= _SYSV_IGNPAR; + if (termios_p->c_iflag & PARMRK) + buf.c_iflag |= _SYSV_PARMRK; + if (termios_p->c_iflag & INPCK) + buf.c_iflag |= _SYSV_INPCK; + if (termios_p->c_iflag & ISTRIP) + buf.c_iflag |= _SYSV_ISTRIP; + if (termios_p->c_iflag & INLCR) + buf.c_iflag |= _SYSV_INLCR; + if (termios_p->c_iflag & IGNCR) + buf.c_iflag |= _SYSV_IGNCR; + if (termios_p->c_iflag & ICRNL) + buf.c_iflag |= _SYSV_ICRNL; + if (termios_p->c_iflag & IXON) + buf.c_iflag |= _SYSV_IXON; + if (termios_p->c_iflag & IXOFF) + buf.c_iflag |= _SYSV_IXOFF; + if (termios_p->c_iflag & IXANY) + buf.c_iflag |= _SYSV_IXANY; + if (termios_p->c_iflag & IMAXBEL) + buf.c_iflag |= _SYSV_IMAXBEL; + + buf.c_oflag = 0; + if (termios_p->c_oflag & OPOST) + buf.c_oflag |= _SYSV_OPOST; + if (termios_p->c_oflag & ONLCR) + buf.c_oflag |= _SYSV_ONLCR; + + /* So far, buf.c_cflag contains the speed in CBAUD. */ + if (termios_p->c_cflag & CSTOPB) + buf.c_cflag |= _SYSV_CSTOPB; + if (termios_p->c_cflag & CREAD) + buf.c_cflag |= _SYSV_CREAD; + if (termios_p->c_cflag & PARENB) + buf.c_cflag |= _SYSV_PARENB; + if (termios_p->c_cflag & PARODD) + buf.c_cflag |= _SYSV_PARODD; + if (termios_p->c_cflag & HUPCL) + buf.c_cflag |= _SYSV_HUPCL; + if (termios_p->c_cflag & CLOCAL) + buf.c_cflag |= _SYSV_CLOCAL; + switch (termios_p->c_cflag & CSIZE) + { + case CS5: + buf.c_cflag |= _SYSV_CS5; + break; + case CS6: + buf.c_cflag |= _SYSV_CS6; + break; + case CS7: + buf.c_cflag |= _SYSV_CS7; + break; + case CS8: + buf.c_cflag |= _SYSV_CS8; + break; + } + + buf.c_lflag = 0; + if (termios_p->c_lflag & ISIG) + buf.c_lflag |= _SYSV_ISIG; + if (termios_p->c_lflag & ICANON) + buf.c_lflag |= _SYSV_ICANON; + if (termios_p->c_lflag & ECHO) + buf.c_lflag |= _SYSV_ECHO; + if (termios_p->c_lflag & ECHOE) + buf.c_lflag |= _SYSV_ECHOE; + if (termios_p->c_lflag & ECHOK) + buf.c_lflag |= _SYSV_ECHOK; + if (termios_p->c_lflag & ECHONL) + buf.c_lflag |= _SYSV_ECHONL; + if (termios_p->c_lflag & NOFLSH) + buf.c_lflag |= _SYSV_NOFLSH; + if (termios_p->c_lflag & TOSTOP) + buf.c_lflag |= _SYSV_TOSTOP; + if (termios_p->c_lflag & ECHOCTL) + buf.c_lflag |= _SYSV_ECHOCTL; + if (termios_p->c_lflag & ECHOPRT) + buf.c_lflag |= _SYSV_ECHOPRT; + if (termios_p->c_lflag & ECHOKE) + buf.c_lflag |= _SYSV_ECHOKE; + if (termios_p->c_lflag & FLUSHO) + buf.c_lflag |= _SYSV_FLUSHO; + if (termios_p->c_lflag & PENDIN) + buf.c_lflag |= _SYSV_PENDIN; + if (termios_p->c_lflag & IEXTEN) + buf.c_lflag |= _SYSV_IEXTEN; + + buf.c_cc[_SYSV_VINTR] = termios_p->c_cc[VINTR]; + buf.c_cc[_SYSV_VQUIT] = termios_p->c_cc[VQUIT]; + buf.c_cc[_SYSV_VERASE] = termios_p->c_cc[VERASE]; + buf.c_cc[_SYSV_VKILL] = termios_p->c_cc[VKILL]; + if (buf.c_lflag & _SYSV_ICANON) + { + buf.c_cc[_SYSV_VEOF] = termios_p->c_cc[VEOF]; + buf.c_cc[_SYSV_VEOL] = termios_p->c_cc[VEOL]; + } + else + { + buf.c_cc[_SYSV_VMIN] = termios_p->c_cc[VMIN]; + buf.c_cc[_SYSV_VTIME] = termios_p->c_cc[VTIME]; + } + buf.c_cc[_SYSV_VEOL2] = termios_p->c_cc[VEOL2]; + + if (__ioctl (fd, ioctl_function, &buf) < 0) + return -1; + return 0; +} +libc_hidden_def (tcsetattr) diff --git a/ports/sysdeps/unix/sysv/aix/times.c b/ports/sysdeps/unix/sysv/aix/times.c new file mode 100644 index 000000000..8ebc40b02 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/times.c @@ -0,0 +1,30 @@ +/* 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 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. */ + +#include <sys/times.h> + +/* Store the CPU time used by this process and all its + dead children (and their dead children) in BUFFER. + Return the elapsed real time, or (clock_t) -1 for errors. + All times are in CLK_TCKths of a second. */ +clock_t +__times (buffer) + struct tms *buffer; +{ + return times (buffer); +} diff --git a/ports/sysdeps/unix/sysv/aix/truncate.c b/ports/sysdeps/unix/sysv/aix/truncate.c new file mode 100644 index 000000000..247aebb33 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/truncate.c @@ -0,0 +1,28 @@ +/* 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 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. */ + +#include <unistd.h> + +extern int ktruncate (const char *name, long long int length); + +int +__truncate (const char *name, off_t length) +{ + return ktruncate (name, length); +} +strong_alias (__truncate, truncate) diff --git a/ports/sysdeps/unix/sysv/aix/truncate64.c b/ports/sysdeps/unix/sysv/aix/truncate64.c new file mode 100644 index 000000000..3a219c018 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/truncate64.c @@ -0,0 +1,28 @@ +/* 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 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. */ + +#include <unistd.h> + +extern int ktruncate (const char *name, long long int length); + +int +__truncate64 (const char *name, off64_t length) +{ + return ktruncate (name, length); +} +strong_alias (__truncate64, truncate64) diff --git a/ports/sysdeps/unix/sysv/aix/uitrunc.c b/ports/sysdeps/unix/sysv/aix/uitrunc.c new file mode 100644 index 000000000..54cdc3af7 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/uitrunc.c @@ -0,0 +1,42 @@ +/* Copyright (C) 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. */ + +#include <math.h> + +/* The uitrunc function returns the nearest unsigned integer + to the x parameter in the direction of 0. This actions is + equivalent to truncation off the fraction bits of the x + parameter and then converting x to an unsigned integer. */ +unsigned int +__uitrunc (double x) +{ + double xrf; + unsigned int xr; + xr = (unsigned int) x; + xrf = (double) xr; + if (x >= 0.0) + if (x - xrf >= 0.5 && x - xrf < 1.0 && x + 1 > 0) + return x + 1; + else + return x; + else + if (xrf - x >= 0.5 && xrf - x < 1.0 && x - 1 < 0) + return x - 1; + else + return x; +} diff --git a/ports/sysdeps/unix/sysv/aix/ulimit.c b/ports/sysdeps/unix/sysv/aix/ulimit.c new file mode 100644 index 000000000..44fef6449 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/ulimit.c @@ -0,0 +1,37 @@ +/* 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 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. */ + +#include <stdarg.h> +#include <sys/resource.h> + +long int +__ulimit (int cmd, ...) +{ + va_list va; + long int arg; + long int res; + + va_start (va, cmd); + arg = va_arg (va, long int); + + res = ulimit (cmd, arg); + + va_end (va); + + return res; +} diff --git a/ports/sysdeps/unix/sysv/aix/umask.c b/ports/sysdeps/unix/sysv/aix/umask.c new file mode 100644 index 000000000..e8c45e40b --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/umask.c @@ -0,0 +1,26 @@ +/* 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 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. */ + +#include <sys/stat.h> + +mode_t +__umask (mask) + mode_t mask; +{ + return umask (mask); +} diff --git a/ports/sysdeps/unix/sysv/aix/uname.c b/ports/sysdeps/unix/sysv/aix/uname.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/uname.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/unlink.c b/ports/sysdeps/unix/sysv/aix/unlink.c new file mode 100644 index 000000000..6fe9b59c6 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/unlink.c @@ -0,0 +1,26 @@ +/* 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 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. */ + +#include <unistd.h> + +int +__unlink (name) + const char *name; +{ + return unlink (name); +} diff --git a/ports/sysdeps/unix/sysv/aix/usleep.c b/ports/sysdeps/unix/sysv/aix/usleep.c new file mode 100644 index 000000000..a1d55eb2b --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/usleep.c @@ -0,0 +1,34 @@ +/* Copyright (C) 1991, 1992, 1995, 1996, 1997 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. */ + +#include <time.h> +#include <unistd.h> +#include <errno.h> + +extern int __libc_nanosleep (const struct timespec *requested_time, + struct timespec *remaining); + +/* Sleep USECONDS microseconds, or until a previously set timer goes off. */ +int +usleep (useconds) + useconds_t useconds; +{ + struct timespec ts ={.tv_sec = 0, .tv_nsec = (long int)useconds * 1000}; + __libc_nanosleep(&ts,&ts); + return 0; +} diff --git a/ports/sysdeps/unix/sysv/aix/ustat.c b/ports/sysdeps/unix/sysv/aix/ustat.c new file mode 100644 index 000000000..6036fbbff --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/ustat.c @@ -0,0 +1 @@ +/* This is a system call. */ diff --git a/ports/sysdeps/unix/sysv/aix/utimes.c b/ports/sysdeps/unix/sysv/aix/utimes.c new file mode 100644 index 000000000..9bef02ae0 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/utimes.c @@ -0,0 +1,27 @@ +/* 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 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. */ + +#include <sys/time.h> + +int +__utimes (file, tvp) + const char *file; + const struct timeval tvp[2]; +{ + return utimes (file, tvp); +} diff --git a/ports/sysdeps/unix/sysv/aix/utmpx.h b/ports/sysdeps/unix/sysv/aix/utmpx.h new file mode 100644 index 000000000..1647bfe68 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/utmpx.h @@ -0,0 +1,89 @@ +/* Copyright (C) 1997, 1998, 1999 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 _UTMPX_H +#define _UTMPX_H 1 + +#include <features.h> +#include <sys/time.h> + +/* Required according to Unix98. */ +#ifndef __pid_t_defined +typedef __pid_t pid_t; +# define __pid_t_defined +#endif + +/* Get system dependent values and data structures. */ +#include <bits/utmpx.h> + +#ifdef __USE_GNU +/* Compatibility names for the strings of the canonical file names. */ +# define UTMPX_FILE _PATH_UTMPX +# define UTMPX_FILENAME _PATH_UTMPX +# define WTMPX_FILE _PATH_WTMPX +# define WTMPX_FILENAME _PATH_WTMPX +#endif + +/* For the getutmp{,x} functions we need the `struct utmp'. */ +#ifdef __USE_GNU +struct utmp; +#endif + + +__BEGIN_DECLS + +/* Open user accounting database. */ +extern void setutxent (void) __THROW; + +/* Close user accounting database. */ +extern void endutxent (void) __THROW; + +/* Get the next entry from the user accounting database. */ +extern struct utmpx *getutxent (void) __THROW; + +/* Get the user accounting database entry corresponding to ID. */ +extern struct utmpx *getutxid (__const struct utmpx *__id) __THROW; + +/* Get the user accounting database entry corresponding to LINE. */ +extern struct utmpx *getutxline (__const struct utmpx *__line) __THROW; + +/* Write the entry UTMPX into the user accounting database. */ +extern struct utmpx *pututxline (__const struct utmpx *__utmpx) __THROW; + + +#ifdef __USE_GNU +/* Change name of the utmpx file to be examined. */ +extern int utmpxname (__const char *__file) __THROW; + +/* Append entry UTMP to the wtmpx-like file WTMPX_FILE. */ +extern void updwtmpx (__const char *__wtmpx_file, + __const struct utmpx *__utmpx) __THROW; + + +/* Copy the information in UTMPX to UTMP. */ +extern void getutmp (__const struct utmpx *__utmpx, + struct utmp *__utmp) __THROW; + +/* Copy the information in UTMP to UTMPX. */ +extern void getutmpx (__const struct utmp *__utmp, + struct utmpx *__utmpx) __THROW; +#endif + +__END_DECLS + +#endif /* utmpx.h */ diff --git a/ports/sysdeps/unix/sysv/aix/wait3.c b/ports/sysdeps/unix/sysv/aix/wait3.c new file mode 100644 index 000000000..b0f7faa15 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/wait3.c @@ -0,0 +1,42 @@ +/* Copyright (C) 1992, 93, 1995-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 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. */ + +#include <errno.h> +#include <sys/wait.h> +#include <sys/types.h> +#include <stddef.h> + +extern pid_t kwaitpid (int *stat_loc, pid_t pid, int options, + struct rusage *ru_loc, siginfo_t *infop); + +/* Wait for a child to exit. When one does, put its status in *STAT_LOC and + return its process ID. For errors return (pid_t) -1. If USAGE is not nil, + store information about the child's resource usage (as a `struct rusage') + there. If the WUNTRACED bit is set in OPTIONS, return status for stopped + children; otherwise don't. */ +pid_t +__wait3 (__WAIT_STATUS stat_loc, int options, struct rusage *usage) +{ + if (usage != NULL) + { + __set_errno (ENOSYS); + return (pid_t) -1; + } + return kwaitpid (stat_loc.__iptr, WAIT_ANY, options, usage, NULL); +} +strong_alias (__wait3, wait3) diff --git a/ports/sysdeps/unix/sysv/aix/wait4.c b/ports/sysdeps/unix/sysv/aix/wait4.c new file mode 100644 index 000000000..dd08f4278 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/wait4.c @@ -0,0 +1,33 @@ +/* Copyright (C) 1991, 1992, 1995-1997, 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. */ + +#include <errno.h> +#include <stddef.h> +#include <sys/types.h> +#include <sys/wait.h> + +extern pid_t kwaitpid (int *stat_loc, pid_t pid, int options, + struct rusage *ru_loc, siginfo_t *infop); + +pid_t +__wait4 (__pid_t pid, __WAIT_STATUS stat_loc, int options, + struct rusage *usage) +{ + return kwaitpid (stat_loc.__iptr, pid, options, usage, NULL); +} +strong_alias (__wait4, wait4) diff --git a/ports/sysdeps/unix/sysv/aix/waitid.c b/ports/sysdeps/unix/sysv/aix/waitid.c new file mode 100644 index 000000000..1d637df76 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/waitid.c @@ -0,0 +1,83 @@ +/* Pseudo implementation of waitid. + Copyright (C) 1997, 1998, 2000, 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Zack Weinberg <zack@rabi.phys.columbia.edu>, 1997. + + 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. */ + +#include <errno.h> +#include <signal.h> +#define __need_NULL +#include <stddef.h> +#include <sys/wait.h> +#include <sys/types.h> + +#include <assert.h> + +extern pid_t kwaitpid (int *stat_loc, pid_t pid, int options, + struct rusage *ru_loc, siginfo_t *infop); + +int +__waitid (idtype, id, infop, options) + idtype_t idtype; + id_t id; + siginfo_t *infop; + int options; +{ + pid_t pid, child; + int status; + + switch (idtype) + { + case P_PID: + if(id <= 0) + goto invalid; + pid = (pid_t) id; + break; + case P_PGID: + if (id < 0 || id == 1) + goto invalid; + pid = (pid_t) -id; + break; + case P_ALL: + pid = -1; + break; + default: + invalid: + __set_errno (EINVAL); + return -1; + } + + /* Technically we're supposed to return EFAULT if infop is bogus, + but that would involve mucking with signals, which is + too much hassle. User will have to deal with SIGSEGV/SIGBUS. + We just check for a null pointer. */ + + if (infop == NULL) + { + __set_errno (EFAULT); + return -1; + } + + child = kwaitpid (&status, pid, options, NULL, infop); + + if (child == -1) + /* `waitpid' set `errno' for us. */ + return -1; + + return 0; +} +weak_alias (__waitid, waitid) diff --git a/ports/sysdeps/unix/sysv/aix/waitpid.c b/ports/sysdeps/unix/sysv/aix/waitpid.c new file mode 100644 index 000000000..19bcbab72 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/waitpid.c @@ -0,0 +1,53 @@ +/* Copyright (C) 1991,95,96,97,2000,02 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. */ + +#include <errno.h> +#include <stddef.h> +#include <sys/wait.h> +#include <sys/types.h> + +extern pid_t kwaitpid (int *stat_loc, pid_t pid, int options, + struct rusage *ru_loc, siginfo_t *infop); + + +/* Wait for a child matching PID to die. + If PID is greater than 0, match any process whose process ID is PID. + If PID is (pid_t) -1, match any process. + If PID is (pid_t) 0, match any process with the + same process group as the current process. + If PID is less than -1, match any process whose + process group is the absolute value of PID. + If the WNOHANG bit is set in OPTIONS, and that child + is not already dead, return (pid_t) 0. If successful, + return PID and store the dead child's status in STAT_LOC. + Return (pid_t) -1 for errors. If the WUNTRACED bit is set in OPTIONS, + return status for stopped children; otherwise don't. */ +pid_t +__libc_waitpid (pid_t pid, int *stat_loc, int options) +{ + if ((options & ~(WNOHANG|WUNTRACED)) != 0) + { + __set_errno (EINVAL); + return (pid_t) -1; + } + + return kwaitpid (stat_loc, pid, options, NULL, NULL); +} +weak_alias (__libc_waitpid, __waitpid) +libc_hidden_weak (__waitpid) +weak_alias (__libc_waitpid, waitpid) diff --git a/ports/sysdeps/unix/sysv/aix/write.c b/ports/sysdeps/unix/sysv/aix/write.c new file mode 100644 index 000000000..0cc5d33ac --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/write.c @@ -0,0 +1,36 @@ +/* Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + + 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. */ + +#include <unistd.h> + +#include "kernel_proto.h" + +ssize_t +__write (fd, ptr, n) + int fd; + const void *ptr; + size_t n; +{ + return kwrite (fd, ptr, n); +} +libc_hidden_def (__write) +/* AIX has no weak aliases (yet) but let's hope for better times. */ +weak_alias (__write, write) +strong_alias (__write, __libc_write) +libc_hidden_def (__libc_write) diff --git a/ports/sysdeps/unix/sysv/aix/writev.c b/ports/sysdeps/unix/sysv/aix/writev.c new file mode 100644 index 000000000..d0e574159 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/writev.c @@ -0,0 +1,38 @@ +/* Copyright (C) 1991, 1995-1998, 2000, 2002 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. */ + +#include <sys/uio.h> + +extern ssize_t kwritev (int fd, const struct iovec *iovp, size_t iovcnt, + long int ext); + +/* Read data from file descriptor FD, and put the result in the + buffers described by VECTOR, which is a vector of COUNT `struct iovec's. + The buffers are filled in the order specified. + Operates just like `read' (see <unistd.h>) except that data are + put in VECTOR instead of a contiguous buffer. */ +ssize_t +__libc_writev (fd, vector, count) + int fd; + const struct iovec *vector; + int count; +{ + return kwritev (fd, vector, count, 0); +} +strong_alias (__libc_writev, __writev) +weak_alias (__libc_writev, writev) diff --git a/ports/sysdeps/unix/sysv/aix/xstat.c b/ports/sysdeps/unix/sysv/aix/xstat.c new file mode 100644 index 000000000..c76ad0799 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/xstat.c @@ -0,0 +1,32 @@ +/* Copyright (C) 1999, 2000, 2002 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. */ + +#include <assert.h> +#include <sys/stat.h> + +#define STX_NORMAL 0x00 + +extern int statx (const char *pathname, struct stat *st, int len, int cmd); + +int +__xstat (int ver, const char *pathname, struct stat *st) +{ + assert (ver == 0); + return statx (pathname, st, sizeof (*st), STX_NORMAL); +} +hidden_def (__xstat) diff --git a/ports/sysdeps/unix/sysv/aix/xstat64.c b/ports/sysdeps/unix/sysv/aix/xstat64.c new file mode 100644 index 000000000..cb1bea118 --- /dev/null +++ b/ports/sysdeps/unix/sysv/aix/xstat64.c @@ -0,0 +1,34 @@ +/* Copyright (C) 1999, 2000, 2002 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. */ + +#include <assert.h> +#include <sys/stat.h> + +#define STX_NORMAL 0x00 +#define STX_64 0x08 + + +extern int statx (const char *pathname, struct stat64 *st, int len, int cmd); + +int +__xstat64 (int ver, const char *pathname, struct stat64 *st) +{ + assert (ver == 0); + return statx (pathname, st, sizeof (*st), STX_NORMAL | STX_64); +} +hidden_def (__xstat64) diff --git a/ports/sysdeps/unix/sysv/hpux/bits/errno.h b/ports/sysdeps/unix/sysv/hpux/bits/errno.h new file mode 100644 index 000000000..c9903c6df --- /dev/null +++ b/ports/sysdeps/unix/sysv/hpux/bits/errno.h @@ -0,0 +1,34 @@ +/* Copyright (C) 1991, 1994, 1996, 1997 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. */ + +/* This file defines the `errno' constants. */ + +#if !defined __Emath_defined && (defined _ERRNO_H || defined __need_Emath) +#undef __need_Emath +#define __Emath_defined 1 + +#endif + +#ifdef _ERRNO_H +#define EBADF 9 +#define ENOMEM 12 +#define EINVAL 22 +#define ERANGE 34 +#define ENOMSG 35 +#define ENOSYS 251 +#endif diff --git a/ports/sysdeps/unix/sysv/hpux/bits/setjmp.h b/ports/sysdeps/unix/sysv/hpux/bits/setjmp.h new file mode 100644 index 000000000..216d7bdd6 --- /dev/null +++ b/ports/sysdeps/unix/sysv/hpux/bits/setjmp.h @@ -0,0 +1,16 @@ +/* Define the machine-dependent type `jmp_buf'. Stub version. */ + +#ifndef _SETJMP_H +# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead." +#endif + +/* XXX This should go into different files!!! */ + +#ifdef __hp9000s300 +typedef int __jmp_buf[100]; +#endif /* __hp9000s300 */ + +#ifdef __hp9000s800 +typedef double __jmp_buf[25]; +#endif /* __hp9000s800 */ + diff --git a/ports/sysdeps/unix/sysv/hpux/bits/stat.h b/ports/sysdeps/unix/sysv/hpux/bits/stat.h new file mode 100644 index 000000000..845b29765 --- /dev/null +++ b/ports/sysdeps/unix/sysv/hpux/bits/stat.h @@ -0,0 +1,128 @@ +/* Copyright (C) 1992, 95, 96, 97, 98, 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 _SYS_STAT_H +# error "Never include <bits/stat.h> directly; use <sys/stat.h> instead." +#endif + +/* Versions of the `struct stat' data structure. */ +#define _STAT_VER_SVR4 1 +#define _STAT_VER _STAT_VER_SVR4 /* The one defined below. */ + +/* Versions of the `xmknod' interface. */ +#define _MKNOD_VER_SVR4 1 +#define _MKNOD_VER _MKNOD_VER_SVR4 /* The bits defined below. */ + + +struct stat + { + __dev_t st_dev; /* Device. */ + unsigned short int __pad1; +#ifndef __USE_FILE_OFFSET64 + __ino_t st_ino; /* File serial number. */ +#else + __ino64_t st_ino; /* File serial number. */ +#endif + __mode_t st_mode; /* File mode. */ + __nlink_t st_nlink; /* Link count. */ + __uid_t st_uid; /* User ID of the file's owner. */ + __gid_t st_gid; /* Group ID of the file's group.*/ + __dev_t st_rdev; /* Device number, if device. */ + unsigned short int __pad2; +#ifndef __USE_FILE_OFFSET64 + __off_t st_size; /* Size of file, in bytes. */ +#else + __off64_t st_size; /* Size of file, in bytes. */ +#endif + unsigned long int st_blksize; /* Optimal block size for I/O. */ + +#ifndef __USE_FILE_OFFSET64 + __blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */ +#else + __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ +#endif + __time_t st_atime; /* Time of last access. */ + unsigned long int __unused1; + __time_t st_mtime; /* Time of last modification. */ + unsigned long int __unused2; + __time_t st_ctime; /* Time of last status change. */ + unsigned long int __unused3; + unsigned long int __unused4; + unsigned long int __unused5; + }; + +#ifdef __USE_LARGEFILE64 +struct stat64 + { + __dev_t st_dev; /* Device. */ + unsigned short int __pad1; + + __ino64_t st_ino; /* File serial number. */ + __mode_t st_mode; /* File mode. */ + __nlink_t st_nlink; /* Link count. */ + __uid_t st_uid; /* User ID of the file's owner. */ + __gid_t st_gid; /* Group ID of the file's group.*/ + __dev_t st_rdev; /* Device number, if device. */ + unsigned short int __pad2; + __off64_t st_size; /* Size of file, in bytes. */ + unsigned long int st_blksize; /* Optimal block size for I/O. */ + + __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ + __time_t st_atime; /* Time of last access. */ + unsigned long int __unused1; + __time_t st_mtime; /* Time of last modification. */ + unsigned long int __unused2; + __time_t st_ctime; /* Time of last status change. */ + unsigned long int __unused3; + unsigned long int __unused4; + unsigned long int __unused5; + }; +#endif + +/* Tell code we have these members. */ +#define _STATBUF_ST_BLKSIZE +#define _STATBUF_ST_RDEV + +/* Encoding of the file mode. */ + +#define __S_IFMT 0170000 /* These bits determine file type. */ + +/* File types. */ +#define __S_IFDIR 0040000 /* Directory. */ +#define __S_IFCHR 0020000 /* Character device. */ +#define __S_IFBLK 0060000 /* Block device. */ +#define __S_IFREG 0100000 /* Regular file. */ +#define __S_IFIFO 0010000 /* FIFO. */ + +/* These don't actually exist on System V, but having them doesn't hurt. */ +#define __S_IFLNK 0120000 /* Symbolic link. */ +#define __S_IFSOCK 0140000 /* Socket. */ + +/* POSIX.1b objects. */ +#define __S_TYPEISMQ(buf) (0) +#define __S_TYPEISSEM(buf) (0) +#define __S_TYPEISSHM(buf) (0) + +/* Protection bits. */ + +#define __S_ISUID 04000 /* Set user ID on execution. */ +#define __S_ISGID 02000 /* Set group ID on execution. */ +#define __S_ISVTX 01000 /* Save swapped text after use (sticky). */ +#define __S_IREAD 0400 /* Read by owner. */ +#define __S_IWRITE 0200 /* Write by owner. */ +#define __S_IEXEC 0100 /* Execute by owner. */ diff --git a/ports/sysdeps/unix/sysv/hpux/bits/types.h b/ports/sysdeps/unix/sysv/hpux/bits/types.h new file mode 100644 index 000000000..e231841a8 --- /dev/null +++ b/ports/sysdeps/unix/sysv/hpux/bits/types.h @@ -0,0 +1,128 @@ +/* Copyright (C) 1991,1992,1994-1998,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 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. */ + +/* + * Never include this file directly; use <sys/types.h> instead. + */ + +#ifndef _BITS_TYPES_H +#define _BITS_TYPES_H 1 + +#include <features.h> + +#define __need_size_t +#include <stddef.h> + +/* Convenience types. */ +typedef unsigned char __u_char; +typedef unsigned short __u_short; +typedef unsigned int __u_int; +typedef unsigned long __u_long; +#ifdef __GNUC__ +__extension__ typedef unsigned long long int __u_quad_t; +__extension__ typedef long long int __quad_t; +#else +typedef struct + { + long int __val[2]; + } __quad_t; +typedef struct + { + __u_long __val[2]; + } __u_quad_t; +#endif +typedef signed char __int8_t; +typedef unsigned char __uint8_t; +typedef signed short int __int16_t; +typedef unsigned short int __uint16_t; +typedef signed int __int32_t; +typedef unsigned int __uint32_t; +#ifdef __GNUC__ +__extension__ typedef signed long long int __int64_t; +__extension__ typedef unsigned long long int __uint64_t; +#endif +typedef __quad_t *__qaddr_t; + +typedef long int __dev_t; /* Type of device numbers. */ +typedef long int __uid_t; /* Type of user identifications. */ +typedef long int __gid_t; /* Type of group identifications. */ +typedef __u_long __ino_t; /* Type of file serial numbers. */ +typedef __u_short __mode_t; /* Type of file attribute bitmasks. */ +typedef short __nlink_t; /* Type of file link counts. */ +typedef long int __off_t; /* Type of file sizes and offsets. */ +typedef __quad_t __loff_t; /* Type of file sizes and offsets. */ +typedef long int __pid_t; /* Type of process identifications. */ +typedef long int __ssize_t; /* Type of a byte count, or error. */ +typedef __u_long __rlim_t; /* Type of resource counts. */ +typedef __quad_t __rlim64_t; /* Type of resource counts (LFS). */ +typedef long int __id_t; /* General type for ID. */ + +typedef struct + { + long int __val[2]; + } __fsid_t; /* Type of file system IDs. */ + +/* Everythin' else. */ +typedef long int __daddr_t; /* The type of a disk address. */ +typedef char *__caddr_t; +typedef long int __time_t; +typedef long int __swblk_t; /* Type of a swap block maybe? */ + +typedef __u_long __clock_t; + +/* Number of descriptors that can fit in an `fd_set'. */ +#define __FD_SETSIZE 2048 + + +typedef long int __key_t; + +/* Used in `struct shmid_ds'. */ +typedef unsigned short int __ipc_pid_t; + + +/* Types from the Large File Support interface. */ + +/* Type to count number os disk blocks. */ +typedef __u_long __blkcnt_t; +typedef __u_quad_t __blkcnt64_t; + +/* Type to count file system blocks. */ +typedef long int __fsblkcnt_t; +typedef __quad_t __fsblkcnt64_t; + +/* Type to count file system inodes. */ +typedef __u_long __fsfilcnt_t; +typedef __u_quad_t __fsfilcnt64_t; + +/* Type of file serial numbers. */ +typedef __u_long __ino64_t; + +/* Type of file sizes and offsets. */ +typedef __loff_t __off64_t; + +/* Used in XTI. */ +typedef int __t_scalar_t; +typedef unsigned int __t_uscalar_t; + +/* Duplicates info from stdint.h but this is used in unistd.h. */ +typedef int __intptr_t; + +/* Duplicate info from sys/socket.h. */ +typedef unsigned int __socklen_t; + +#endif /* bits/types.h */ diff --git a/ports/sysdeps/unix/sysv/hpux/sysdep.h b/ports/sysdeps/unix/sysv/hpux/sysdep.h new file mode 100644 index 000000000..89a337711 --- /dev/null +++ b/ports/sysdeps/unix/sysv/hpux/sysdep.h @@ -0,0 +1,26 @@ +/* Copyright (C) 1999 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper, <drepper@cygnus.com>, August 1999. + + 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. */ + +/* No underscores necessary. */ +#define NO_UNDERSCORES + +#include <sysdeps/hppa/sysdep.h> + +/* HPUX uses the usual syscall naming. */ +#define SYS_ify(name) SYS_##name diff --git a/ports/sysdeps/unix/sysv/irix4/Dist b/ports/sysdeps/unix/sysv/irix4/Dist new file mode 100644 index 000000000..09026af26 --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/Dist @@ -0,0 +1,2 @@ +__handler.S +sigtramp.c diff --git a/ports/sysdeps/unix/sysv/irix4/Implies b/ports/sysdeps/unix/sysv/irix4/Implies new file mode 100644 index 000000000..35e1edd83 --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/Implies @@ -0,0 +1,4 @@ +# Irix 4 has the set of things which are also common to BSD and SVR4. +unix/common +# Irix 4 has the canonical set of <sys/mman.h> system calls. +unix/mman diff --git a/ports/sysdeps/unix/sysv/irix4/Makefile b/ports/sysdeps/unix/sysv/irix4/Makefile new file mode 100644 index 000000000..d07981e8f --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/Makefile @@ -0,0 +1,25 @@ +# Copyright (C) 1993, 1997 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. + +ifeq ($(subdir),signal) +sysdep_routines := $(sysdep_routines) sigtramp __handler +endif + +ifeq ($(subdir),misc) +sysdep_routines := $(sysdep_routines) syssgi sysmp +endif diff --git a/ports/sysdeps/unix/sysv/irix4/__handler.S b/ports/sysdeps/unix/sysv/irix4/__handler.S new file mode 100644 index 000000000..f02121a0c --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/__handler.S @@ -0,0 +1,117 @@ +/* Copyright (C) 1992, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@cs.widener.edu). + Also hacked by Ian Lance Taylor (ian@airs.com). + + 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. */ + +#include <sysdep.h> + +/* This function saves all the registers, calls the + user function, and then executes a sigreturn system call. The + sigreturn call wants the address of a sigcontext structure. This + is all hideously system dependent and, for all intents and + purposes, undocumented. + + When we enter here, a3 holds the user's signal handler. We are + supposed to fill in the context given in a2, and then pass it and + the first two arguments to the user's function. If the user's + function returns, we execute a sigreturn system call. + + The sc_onstack, sc_mask and sc_pc elements of the context are + already set by the kernel. For some reason we don't have to save + the floating point state or the coprocessor state; the kernel may + have saved them for us, or it doesn't use them. */ + +.set noat +ENTRY (__handler) +#if 0 + /* Store zero and the asm temp reg. */ + sw $0, 12(a2) + sw AT, 16(a2) + + /* Put v1 in sc_regs[3]. */ + sw v1, 24(a2) + + /* Save the caller saved registers in sc_regs[8..15]. */ + sw t0, 44(a2) + sw t1, 48(a2) + sw t2, 52(a2) + sw t3, 56(a2) + sw t4, 60(a2) + sw t5, 64(a2) + sw t6, 68(a2) + sw t7, 72(a2) + + /* Save the callee saved registers in sc_regs[16..23]. */ + sw s0, 76(a2) + sw s1, 80(a2) + sw s2, 84(a2) + sw s3, 88(a2) + sw s4, 92(a2) + sw s5, 96(a2) + sw s6, 100(a2) + sw s7, 104(a2) + + /* Save the code generator registers in sc_regs[24] & sc_regs[25]. */ + sw t8, 108(a2) + sw t9, 112(a2) + + /* Save the kernel temp regs in sc_regs[26] & sc_regs[27]. */ + sw k0, 116(a2) + sw k1, 120(a2) + + /* Save the global pointer in sc_regs[28]. */ + sw gp, 124(a2) + + /* ... and also the return address in sc_regs[31]. */ + sw ra, 136(a2) + + /* Note: we don't save the stack pointer in sc_regs[29]; + instead, we use the one that was already there. */ +#if 0 + sw sp, 128(a2) +#endif + + /* Save the floating pointer in sc_regs[30]. */ + sw fp, 132(a2) + + /* Save the mul/div stuff in sc_mdlo and sc_mdhi. */ + mflo t0 + sw t0, 140(a2) + mfhi t0 + sw t0, 144(a2) + +#endif + /* Move the stack up six. This will save the context. */ + addu sp, sp, -24 + sw a2, 16(sp) + + /* Call their handler with the signal, code, and context; note + this will clobber the context. */ + .set noreorder + jal ra, a3 + nop + .set reorder + + /* When we come back, restore the context and pass it right + on into sigreturn(). */ + lw a0, 16(sp) + + /* Do a sigreturn syscall; this doesn't return. */ + li v0, SYS_sigreturn + syscall + nop diff --git a/ports/sysdeps/unix/sysv/irix4/bits/confname.h b/ports/sysdeps/unix/sysv/irix4/bits/confname.h new file mode 100644 index 000000000..ed334694c --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/bits/confname.h @@ -0,0 +1,84 @@ +/* `sysconf', `pathconf', and `confstr' NAME values. Irix 4 version. + Copyright (C) 1994, 1997 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 _UNISTD_H +# error "Never use <bits/confname.h> directly; include <unistd.h> instead." +#endif + +/* Values for the NAME argument to `pathconf' and `fpathconf'. */ +enum + { + _PC_LINK_MAX = 1, + _PC_MAX_CANON, + _PC_MAX_INPUT, + _PC_NAME_MAX, + _PC_PATH_MAX, + _PC_PIPE_BUF, + _PC_CHOWN_RESTRICTED, + _PC_NO_TRUNC, + _PC_VDISABLE + }; + +/* Values for the argument to `sysconf'. */ +enum + { + _SC_ARG_MAX = 1, + _SC_CHILD_MAX, + _SC_CLK_TCK, + _SC_NGROUPS_MAX, + _SC_OPEN_MAX, + _SC_JOB_CONTROL, + _SC_SAVED_IDS, + _SC_VERSION, + + /* Above are done by the Irix system call. + The rest are done by the C library (or are not really implemented). */ + + _SC_STREAM_MAX, + _SC_TZNAME_MAX, + _SC_PAGESIZE, + + /* Values for the argument to `sysconf' + corresponding to _POSIX2_* symbols. */ + _SC_BC_BASE_MAX, + _SC_BC_DIM_MAX, + _SC_BC_SCALE_MAX, + _SC_BC_STRING_MAX, + _SC_COLL_WEIGHTS_MAX, + _SC_EQUIV_CLASS_MAX, + _SC_EXPR_NEST_MAX, + _SC_LINE_MAX, + _SC_RE_DUP_MAX, + + _SC_2_VERSION, + _SC_2_C_BIND, + _SC_2_C_DEV, + _SC_2_FORT_DEV, + _SC_2_FORT_RUN, + _SC_2_SW_DEV, + _SC_2_LOCALEDEF + }; + +#ifdef __USE_POSIX2 +/* Values for the NAME argument to `confstr'. */ +enum + { + _CS_PATH /* The default search path. */ + }; +#endif diff --git a/ports/sysdeps/unix/sysv/irix4/bits/fcntl.h b/ports/sysdeps/unix/sysv/irix4/bits/fcntl.h new file mode 100644 index 000000000..5eb7c76eb --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/bits/fcntl.h @@ -0,0 +1,109 @@ +/* O_*, F_*, FD_* bit values for SGI Irix 4. + Copyright (C) 1994, 1997, 2004 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 + + +/* File access modes for `open' and `fcntl'. */ +#define O_RDONLY 0 /* Open read-only. */ +#define O_WRONLY 1 /* Open write-only. */ +#define O_RDWR 2 /* Open read/write. */ + + +/* Bits OR'd into the second argument to open. */ +#define O_CREAT 00400 /* Create file if it doesn't exist. */ +#define O_EXCL 02000 /* Fail if file already exists. */ +#define O_TRUNC 01000 /* Truncate file to zero length. */ +#ifdef __USE_MISC +#define O_SYNC 00020 /* Synchronous writes. */ +#define O_FSYNC O_SYNC +#define O_ASYNC 00100 /* Send SIGIO to owner when data is ready. */ +#endif + +/* File status flags for `open' and `fcntl'. */ +#define O_APPEND 000010 /* Writes append to the file. */ +#ifdef __USE_BSD +#define O_NDELAY 000004 /* Non-blocking I/O. */ +#endif +#define O_NONBLOCK 000200 /* POSIX.1 non-blocking I/O. */ + +/* Mask for file access modes. This is system-dependent in case + some system ever wants to define some other flavor of access. */ +#define O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR) + +/* 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. */ +#define F_GETLK 5 /* Get record locking info. */ +#define F_SETLK 6 /* Set record locking info. */ +#define F_SETLKW 7 /* Set record locking info, wait. */ +#ifdef __USE_MISC +#define F_CHKFL 8 /* Check legality of file flag changes. */ +#define F_ALLOCSP 10 +#define F_FREESP 11 +#define F_SETBSDLK 12 /* Set Berkeley record lock. */ +#define F_SETBSDLKW 13 /* Set Berkeley record lock and wait. */ +#define F_RGETLK 20 /* Get info on a remote lock. */ +#define F_RSETLK 21 /* Set or unlock a remote lock. */ +#define F_RSETLKW 22 /* Set or unlock a remote lock and wait. */ +#endif +#if defined __USE_BSD || defined __USE_UNIX98 +#define F_GETOWN 10 /* Get owner; only works on sockets. */ +#define F_SETOWN 11 /* Set owner; only works on sockets. */ +#endif + + +/* File descriptor flags used with F_GETFD and F_SETFD. */ +#define FD_CLOEXEC 1 /* Close on exec. */ + + +#include <bits/types.h> + +/* The structure describing an advisory lock. This is the type of the third + argument to `fcntl' for the F_GETLK, F_SETLK, and F_SETLKW requests. */ +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'). */ + __off_t l_start; /* Offset where the lock begins. */ + __off_t l_len; /* Size of the locked area; zero means until EOF. */ + short int l_sysid; /* System ID where locking process resides. */ + short int l_pid; /* Process holding the lock. */ + }; + +/* Values for the `l_type' field of a `struct flock'. */ +#define F_RDLCK 1 /* Read lock. */ +#define F_WRLCK 2 /* Write lock. */ +#define F_UNLCK 3 /* Remove lock. */ + + +/* 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. */ diff --git a/ports/sysdeps/unix/sysv/irix4/bits/mman.h b/ports/sysdeps/unix/sysv/irix4/bits/mman.h new file mode 100644 index 000000000..1549ff01c --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/bits/mman.h @@ -0,0 +1,64 @@ +/* Definitions for BSD-style memory management. Irix 4 version. + Copyright (C) 1994, 1995, 1996, 1997, 1998 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 _BITS_MMAN_H +#define _BITS_MMAN_H 1 + +/* 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 0x04 /* Pages can be read. */ +#define PROT_WRITE 0x02 /* Pages can be written. */ +#define PROT_EXEC 0x01 /* Pages can be executed. */ +#ifdef __USE_MISC +# define PROT_EXECUTE PROT_EXEC +#endif + +/* Sharing types (must choose one and only one of these). */ +#define MAP_SHARED 0x01 /* Share changes. */ +#define MAP_PRIVATE 0x02 /* Changes private; copy pages on write. */ +#ifdef __USE_BSD +# define MAP_TYPE 0x0f /* Mask for sharing type. */ +#endif + +/* Other flags. */ +#define MAP_FIXED 0x10 /* Map address must be exactly as requested. */ +#ifdef __USE_MISC +# define MAP_RENAME 0x20 /* Rename private pages to file. */ +# define MAP_AUTOGROW 0x40 /* Grow file as pages are written. */ +# define MAP_LOCAL 0x80 /* Copy the mapped region on fork. */ +#endif + +/* Advice to `madvise'. */ +#ifdef __USE_BSD +# define MADV_NORMAL 0 /* No further special treatment. */ +# define MADV_RANDOM 1 /* Expect random page references. */ +# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */ +# define MADV_WILLNEED 3 /* Will need these pages. */ +# define MADV_DONTNEED 4 /* Don't need these pages. */ +#endif + +/* Flags to `msync'. */ +#define MS_ASYNC 0x1 /* Return immediately, don't fsync. */ +#define MS_INVALIDATE 0x2 /* Invalidate caches. */ + +#endif /* bits/mman.h */ diff --git a/ports/sysdeps/unix/sysv/irix4/bits/signum.h b/ports/sysdeps/unix/sysv/irix4/bits/signum.h new file mode 100644 index 000000000..c96ab9d2b --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/bits/signum.h @@ -0,0 +1,69 @@ +/* Signal number definitions. Irix4 version. + Copyright (C) 1994, 1996 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. */ + +#ifdef _SIGNAL_H + +/* This file defines the fake signal functions and signal + number constants for SGI Irix 4. */ + +/* Fake signal functions. */ +#define SIG_ERR ((__sighandler_t) -1) +#define SIG_DFL ((__sighandler_t) 0) +#define SIG_IGN ((__sighandler_t) 1) + + +/* Signals. */ +#define SIGHUP 1 /* Hangup (POSIX). */ +#define SIGINT 2 /* Interrupt (ANSI). */ +#define SIGQUIT 3 /* Quit (POSIX). */ +#define SIGILL 4 /* Illegal instruction (ANSI). */ +#define SIGABRT SIGIOT /* Abort (ANSI). */ +#define SIGTRAP 5 /* Trace trap (POSIX). */ +#define SIGIOT 6 /* IOT trap. */ +#define SIGEMT 7 /* EMT trap. */ +#define SIGFPE 8 /* Floating-point exception (ANSI). */ +#define SIGKILL 9 /* Kill, unblockable (POSIX). */ +#define SIGBUS 10 /* Bus error. */ +#define SIGSEGV 11 /* Segmentation violation (ANSI). */ +#define SIGSYS 12 /* Bad argument to system call*/ +#define SIGPIPE 13 /* Broken pipe (POSIX). */ +#define SIGALRM 14 /* Alarm clock (POSIX). */ +#define SIGTERM 15 /* Termination (ANSI). */ +#define SIGUSR1 16 /* User-defined signal 1 (POSIX). */ +#define SIGUSR2 17 /* User-defined signal 2 (POSIX). */ +#define SIGCHLD 18 /* Child status has changed (POSIX). */ +#define SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */ +#define SIGPWR 19 /* Power going down. */ +#define SIGSTOP 20 /* Stop, unblockable (POSIX). */ +#define SIGTSTP 21 /* Keyboard stop (POSIX). */ +#define SIGPOLL 22 /* Same as SIGIO? (SVID). */ +#define SIGIO 23 /* I/O now possible. */ +#define SIGURG 24 /* Urgent condition on socket.*/ +#define SIGWINCH 25 /* Window size change. */ +#define SIGVTALRM 26 /* Virtual alarm clock. */ +#define SIGPROF 27 /* Profiling alarm clock. */ +#define SIGCONT 28 /* Continue (POSIX). */ +#define SIGTTIN 29 /* Background read from tty (POSIX). */ +#define SIGTTOU 30 /* Background write to tty (POSIX). */ +#define SIGXCPU 31 /* CPU limit exceeded. */ +#define SIGXFSZ 32 /* File size limit exceeded. */ + +#endif /* <signal.h> included. */ + +#define _NSIG 33 /* Biggest signal number + 1. */ diff --git a/ports/sysdeps/unix/sysv/irix4/bits/stat.h b/ports/sysdeps/unix/sysv/irix4/bits/stat.h new file mode 100644 index 000000000..33f575db1 --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/bits/stat.h @@ -0,0 +1,65 @@ +/* Copyright (C) 1992, 1996, 1997, 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 _SYS_STAT_H +# error "Never include <bits/stat.h> directly; use <sys/stat.h> instead." +#endif + +struct stat + { + unsigned long st_ino; + short int st_dev; + unsigned short int st_mode; + short int st_nlink; + unsigned short int st_uid; + unsigned short int st_gid; + short int st_rdev; + long int st_size; + long int st_atime; + long int st_mtime; + long int st_ctime; + }; + +/* Encoding of the file mode. */ + +#define __S_IFMT 0170000 /* These bits determine file type. */ + +/* File types. */ +#define __S_IFDIR 0040000 /* Directory. */ +#define __S_IFCHR 0020000 /* Character device. */ +#define __S_IFBLK 0060000 /* Block device. */ +#define __S_IFREG 0100000 /* Regular file. */ +#define __S_IFIFO 0010000 /* FIFO. */ + +/* These don't actually exist on System V, but having them doesn't hurt. */ +#define __S_IFLNK 0120000 /* Symbolic link. */ +#define __S_IFSOCK 0140000 /* Socket. */ + +/* POSIX.1b objects. */ +#define __S_TYPEISMQ(buf) (0) +#define __S_TYPEISSEM(buf) (0) +#define __S_TYPEISSHM(buf) (0) + +/* Protection bits. */ + +#define __S_ISUID 04000 /* Set user ID on execution. */ +#define __S_ISGID 02000 /* Set group ID on execution. */ +#define __S_ISVTX 01000 /* Save swapped text after use (sticky). */ +#define __S_IREAD 0400 /* Read by owner. */ +#define __S_IWRITE 0200 /* Write by owner. */ +#define __S_IEXEC 0100 /* Execute by owner. */ diff --git a/ports/sysdeps/unix/sysv/irix4/dup2.c b/ports/sysdeps/unix/sysv/irix4/dup2.c new file mode 100644 index 000000000..86720b1b7 --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/dup2.c @@ -0,0 +1,3 @@ +#include <sysdeps/posix/__dup2.c> + +weak_alias (__dup2, dup2) diff --git a/ports/sysdeps/unix/sysv/irix4/fpathconf.c b/ports/sysdeps/unix/sysv/irix4/fpathconf.c new file mode 100644 index 000000000..236eb1a6b --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/fpathconf.c @@ -0,0 +1,35 @@ +/* Copyright (C) 1994, 1995, 1997, 2004 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. */ + +#include <errno.h> +#include <stddef.h> +#include <unistd.h> +#include <sys/syssgi.h> + +extern int __syssgi (int, ...); + +/* Get file-specific information about descriptor FD. */ +long int +__fpathconf (fd, name) + int fd; + int name; +{ + return __syssgi (SGI_PATHCONF, FPATHCONF, fd, name); +} + +weak_alias (__fpathconf, fpathconf) diff --git a/ports/sysdeps/unix/sysv/irix4/getgroups.c b/ports/sysdeps/unix/sysv/irix4/getgroups.c new file mode 100644 index 000000000..4c859eac8 --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/getgroups.c @@ -0,0 +1,34 @@ +/* Copyright (C) 1994, 1995, 1997, 2004 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. */ + +#include <sys/syssgi.h> +#include <sys/types.h> +#include <grp.h> + +extern int __syssgi (int, ...); + +/* Set the group set for the current user to GROUPS (N of them). */ +int +__getgroups (n, groups) + size_t n; + gid_t *groups; +{ + return __syssgi (SGI_GETGROUPS, n, groups); +} + +weak_alias (__getgroups, getgroups) diff --git a/ports/sysdeps/unix/sysv/irix4/getpriority.c b/ports/sysdeps/unix/sysv/irix4/getpriority.c new file mode 100644 index 000000000..807ac2fba --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/getpriority.c @@ -0,0 +1,47 @@ +/* Copyright (C) 1994,96,97,2000,02, 2004 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. */ + +#include <errno.h> +#include <sys/resource.h> +#include <sys/sysmp.h> + +extern int __sysmp (int, ...); + +/* Return the highest priority of any process specified by WHICH and WHO + (see <sys/resource.h>); if WHO is zero, the current process, process group, + or user (as specified by WHO) is used. A lower priority number means higher + priority. Priorities range from PRIO_MIN to PRIO_MAX. */ +int +getpriority (which, who) + enum __priority_which which; + id_t who; +{ + switch (which) + { + case PRIO_PROCESS: + return __sysmp (MP_SCHED, MPTS_GTNICE_PROC, who); + case PRIO_PGRP: + return __sysmp (MP_SCHED, MPTS_GTNICE_PGRP, who); + case PRIO_USER: + return __sysmp (MP_SCHED, MPTS_GTNICE_USER, who); + } + + __set_errno (EINVAL); + return -1; +} +libc_hidden_def (getpriority) diff --git a/ports/sysdeps/unix/sysv/irix4/getrusage.c b/ports/sysdeps/unix/sysv/irix4/getrusage.c new file mode 100644 index 000000000..3cabbdf3e --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/getrusage.c @@ -0,0 +1,35 @@ +/* Copyright (C) 1994, 1995, 1997, 2004 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. */ + +#include <sys/resource.h> +#include <errno.h> +#include <sys/syssgi.h> + +extern int __syssgi (int, ...); + +/* Return resource usage information on process indicated by WHO + and put it in *USAGE. Returns 0 for success, -1 for failure. */ +int +__getrusage (who, usage) + enum __rusage_who who; + struct rusage *usage; +{ + return __syssgi (SGI_RUSAGE, who, usage); +} + +weak_alias (__getrusage, getrusage) diff --git a/ports/sysdeps/unix/sysv/irix4/gettimeofday.c b/ports/sysdeps/unix/sysv/irix4/gettimeofday.c new file mode 100644 index 000000000..d7055be82 --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/gettimeofday.c @@ -0,0 +1 @@ +#include <sysdeps/posix/gettimeofday.c> diff --git a/ports/sysdeps/unix/sysv/irix4/pathconf.c b/ports/sysdeps/unix/sysv/irix4/pathconf.c new file mode 100644 index 000000000..51da0c563 --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/pathconf.c @@ -0,0 +1,35 @@ +/* Copyright (C) 1994, 1995, 1997, 2004 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. */ + +#include <errno.h> +#include <stddef.h> +#include <unistd.h> +#include <sys/syssgi.h> + +extern int __syssgi (int, ...); + +/* Get file-specific information about PATH. */ +long int +__pathconf (path, name) + const char *path; + int name; +{ + return __syssgi (SGI_PATHCONF, PATHCONF, path, name); +} + +weak_alias (__pathconf, pathconf) diff --git a/ports/sysdeps/unix/sysv/irix4/readv.c b/ports/sysdeps/unix/sysv/irix4/readv.c new file mode 100644 index 000000000..baa976da6 --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/readv.c @@ -0,0 +1 @@ +#include <sysdeps/posix/readv.c> diff --git a/ports/sysdeps/unix/sysv/irix4/reboot.c b/ports/sysdeps/unix/sysv/irix4/reboot.c new file mode 100644 index 000000000..4d90e6fc5 --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/reboot.c @@ -0,0 +1 @@ +#include <sysdeps/generic/reboot.c> diff --git a/ports/sysdeps/unix/sysv/irix4/setgroups.c b/ports/sysdeps/unix/sysv/irix4/setgroups.c new file mode 100644 index 000000000..cca816bcf --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/setgroups.c @@ -0,0 +1,33 @@ +/* Copyright (C) 1994,97,2002, 2004 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. */ + +#include <sys/syssgi.h> +#include <sys/types.h> +#include <grp.h> + +extern int __syssgi (int, ...); + +/* Set the group set for the current user to GROUPS (N of them). */ +int +setgroups (n, groups) + size_t n; + const gid_t *groups; +{ + return __syssgi (SGI_SETGROUPS, n, groups); +} +libc_hidden_def (setgroups) diff --git a/ports/sysdeps/unix/sysv/irix4/setpriority.c b/ports/sysdeps/unix/sysv/irix4/setpriority.c new file mode 100644 index 000000000..99353187f --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/setpriority.c @@ -0,0 +1,42 @@ +/* Copyright (C) 1994,96,97,2000,02 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. */ + +#include <errno.h> +#include <sys/resource.h> +#include <sys/sysmp.h> + +int +setpriority (which, who, prio) + enum __priority_which which; + id_t who; + int prio; +{ + switch (which) + { + case PRIO_PROCESS: + return __sysmp (MP_SCHED, MPTS_RENICE_PROC, who, prio); + case PRIO_PGRP: + return __sysmp (MP_SCHED, MPTS_RENICE_PGRP, who, prio); + case PRIO_USER: + return __sysmp (MP_SCHED, MPTS_RENICE_USER, who, prio); + } + + __set_errno (EINVAL); + return -1; +} +libc_hidden_def (setpriority) diff --git a/ports/sysdeps/unix/sysv/irix4/sigreturn.S b/ports/sysdeps/unix/sysv/irix4/sigreturn.S new file mode 100644 index 000000000..296db1d47 --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/sigreturn.S @@ -0,0 +1,26 @@ +/* Copyright (C) 1992, 1995, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@cs.widener.edu). + + 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. */ + +#include <sysdep.h> + +ENTRY(__sigreturn) + li v0, SYS_sigreturn + syscall + +weak_alias (__sigreturn, sigreturn) diff --git a/ports/sysdeps/unix/sysv/irix4/sigtramp.c b/ports/sysdeps/unix/sysv/irix4/sigtramp.c new file mode 100644 index 000000000..f8de75a7c --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/sigtramp.c @@ -0,0 +1,53 @@ +/* Copyright (C) 1992, 1997, 2004 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. */ + +/* The sigvec system call on MIPS Ultrix takes an additional + parameter, which is the address that is actually called when the + signal occurs. + + When a signal occurs, we arrange for the kernel to call __handler. + That will save the frame and stack pointers into the context, and + then jump to this routine. See __handler.S. + + This code is based on sysdeps/unix/bsd/sun4/sigtramp.c, but it's + different because since we get passed the user signal handler we + don't actually need a trampoline. */ + +#include <signal.h> +#include <stddef.h> +#include <errno.h> + +/* The user's signal handler is called with three arguments. */ +typedef void (*handler_type) (int sig, int code, struct sigcontext *); + +/* Defined in signal.S. */ +extern __sighandler_t __raw_signal (int sig, __sighandler_t func, + void (*)(int sig, int code, + struct sigcontext *, + handler_type)); + +extern void __handler (int sig, int code, struct sigcontext *, + handler_type); + +__sighandler_t +signal (sig, func) + int sig; + __sighandler_t func; +{ + return __raw_signal (sig, func, __handler); +} diff --git a/ports/sysdeps/unix/sysv/irix4/start.c b/ports/sysdeps/unix/sysv/irix4/start.c new file mode 100644 index 000000000..fdda8809e --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/start.c @@ -0,0 +1,75 @@ +/* Copyright (C) 1991,1992,1995,1996,1997,2004 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. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The GNU Lesser General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + Note that people who make modified versions of this file are not + obligated to grant this special exception for their modified + versions; it is their choice whether to do so. The GNU Lesser + General Public License gives permission to release a modified + version without this exception; this exception also makes it + possible to release a modified version which carries forward this + exception. + + 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. */ + +#include <errno.h> +#include <stdlib.h> +#include <unistd.h> + +#ifndef __GNUC__ + #error This file uses GNU C extensions; you must compile with GCC. +#endif + +/* The first piece of initialized data. */ +int __data_start = 0; + +extern void __libc_init (int argc, char **argv, char **envp); +extern int main (int argc, char **argv, char **envp); + +/* Use the stack pointer to access the arguments. This assumes that + we can guess how big the frame will be. */ +register long int sp asm("sp"); +#ifdef __OPTIMIZE__ +#define STACKSIZE 8 +#else +#define STACKSIZE 10 +#endif + +void +__start () +{ + int argc; + char **argv, **envp; + + /* Set up the global pointer. */ + asm volatile ("la $28,_gp"); + argc = ((int *) sp)[STACKSIZE]; + argv = (char **) &((int *) sp)[STACKSIZE + 1]; + envp = &argv[argc + 1]; + __environ = envp; + + __libc_init (argc, argv, envp); + errno = 0; + exit (main (argc, argv, envp)); +} diff --git a/ports/sysdeps/unix/sysv/irix4/swapon.c b/ports/sysdeps/unix/sysv/irix4/swapon.c new file mode 100644 index 000000000..54885a883 --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/swapon.c @@ -0,0 +1 @@ +#include <sysdeps/generic/swapon.c> diff --git a/ports/sysdeps/unix/sysv/irix4/syscalls.list b/ports/sysdeps/unix/sysv/irix4/syscalls.list new file mode 100644 index 000000000..a57529e9a --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/syscalls.list @@ -0,0 +1,8 @@ +# File name Caller Syscall name # args Strong name Weak names + +getpgid - bsdgetpgrp 1 __getpgid getpgid +msync - msync 3 msync +setpgid - bsdsetpgrp 2 __setpgid setpgid +signal - signal 3 __raw_signal +sysmp - sysmp 4 __sysmp +syssgi - syssgi 2 __syssgi diff --git a/ports/sysdeps/unix/sysv/irix4/sysconf.c b/ports/sysdeps/unix/sysv/irix4/sysconf.c new file mode 100644 index 000000000..ef7606eda --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/sysconf.c @@ -0,0 +1,36 @@ +/* Copyright (C) 1994, 1995, 1997, 2002, 2004 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. */ + +#include <unistd.h> +#include <sys/syssgi.h> + +extern int __syssgi ((int, ...); + +/* Get the value of the system variable NAME. */ +long int +__sysconf (name) + int name; +{ + if (name == _SC_TZNAME_MAX) + return __tzname_max (); + + return __syssgi (SGI_SYSCONF, name); +} + +weak_alias (__sysconf, sysconf) +libc_hidden_def (__sysconf) diff --git a/ports/sysdeps/unix/sysv/irix4/uname.S b/ports/sysdeps/unix/sysv/irix4/uname.S new file mode 100644 index 000000000..0b6536fd2 --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/uname.S @@ -0,0 +1,26 @@ +/* Copyright (C) 1994, 1997 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. */ + +#include <sysdep.h> + +ENTRY(uname) + li a2, 0 + li a3, 0 +SYSCALL__ (utssys, 1) + j ra + move v0, zero diff --git a/ports/sysdeps/unix/sysv/irix4/wait.S b/ports/sysdeps/unix/sysv/irix4/wait.S new file mode 100644 index 000000000..90cd5948e --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/wait.S @@ -0,0 +1,43 @@ +/* Copyright (C) 1992, 1995, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@cs.widener.edu). + + 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. */ + +#include <sysdep.h> + +.set noreorder + +ENTRY(__wait) + /* Prep it for wait */ + move a1, zero + move a2, zero + + li v0, SYS_wait + syscall + beq a3, zero, noerror + nop + j syscall_error + nop +noerror: + beq a0, zero, noarg + nop + sw v1, 0(a0) + nop +noarg: + ret + +weak_alias (__wait, wait) diff --git a/ports/sysdeps/unix/sysv/irix4/waitpid.c b/ports/sysdeps/unix/sysv/irix4/waitpid.c new file mode 100644 index 000000000..8378982ac --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/waitpid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/bsd/bsd4.4/waitpid.c> diff --git a/ports/sysdeps/unix/sysv/irix4/writev.c b/ports/sysdeps/unix/sysv/irix4/writev.c new file mode 100644 index 000000000..0dc6a7601 --- /dev/null +++ b/ports/sysdeps/unix/sysv/irix4/writev.c @@ -0,0 +1 @@ +#include <sysdeps/posix/writev.c> diff --git a/ports/sysdeps/unix/sysv/isc2.2/syscalls.list b/ports/sysdeps/unix/sysv/isc2.2/syscalls.list new file mode 100644 index 000000000..0ea253e3c --- /dev/null +++ b/ports/sysdeps/unix/sysv/isc2.2/syscalls.list @@ -0,0 +1,2 @@ +# File name Caller Syscall name # args Strong name Weak names + diff --git a/ports/sysdeps/unix/sysv/linux/am33/Makefile b/ports/sysdeps/unix/sysv/linux/am33/Makefile new file mode 100644 index 000000000..ece39e8a4 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/Makefile @@ -0,0 +1,3 @@ +ifeq ($(subdir),misc) +sysdep_routines += setfsgid setfsuid +endif diff --git a/ports/sysdeps/unix/sysv/linux/am33/bits/fcntl.h b/ports/sysdeps/unix/sysv/linux/am33/bits/fcntl.h new file mode 100644 index 000000000..4c276c548 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/bits/fcntl.h @@ -0,0 +1,179 @@ +/* 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 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. */ + +#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. */ +#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 + +#ifdef __USE_GNU +# define F_SETLEASE 1024 /* Set a lease. */ +# define F_GETLEASE 1025 /* Enquire what lease is active. */ +# define F_NOTIFY 1026 /* Request notfications on a directory. */ +#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 + +#ifdef __USE_GNU +# define LOCK_MAND 32 /* This is a mandatory flock: */ +# define LOCK_READ 64 /* ... which allows concurrent read operations. */ +# define LOCK_WRITE 128 /* ... which allows concurrent write operations. */ +# define LOCK_RW 192 /* ... Which allows concurrent read & write operations. */ +#endif + +#ifdef __USE_GNU +/* Types of directory notifications that may be requested with F_NOTIFY. */ +# define DN_ACCESS 0x00000001 /* File accessed. */ +# define DN_MODIFY 0x00000002 /* File modified. */ +# define DN_CREATE 0x00000004 /* File created. */ +# define DN_DELETE 0x00000008 /* File removed. */ +# define DN_RENAME 0x00000010 /* File renamed. */ +# define DN_ATTRIB 0x00000020 /* File changed attibutes. */ +# define DN_MULTISHOT 0x80000000 /* Don't remove notifier. */ +#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/ports/sysdeps/unix/sysv/linux/am33/bits/mman.h b/ports/sysdeps/unix/sysv/linux/am33/bits/mman.h new file mode 100644 index 000000000..99fceda88 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/bits/mman.h @@ -0,0 +1,97 @@ +/* Definitions for POSIX memory map interface. Linux/AM33 version. + Copyright (C) 1997, 2000, 2001, 2004 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. */ + +#ifndef _SYS_MMAN_H +# error "Never use <bits/mman.h> directly; include <sys/mman.h> instead." +#endif + +/* The following definitions basically come from the kernel headers. + But the kernel header is not namespace clean. */ + + +/* 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_READ 0x1 /* Page can be read. */ +#define PROT_WRITE 0x2 /* Page can be written. */ +#define PROT_EXEC 0x4 /* Page can be executed. */ +#define PROT_NONE 0x0 /* Page can not be accessed. */ +#define PROT_GROWSDOWN 0x01000000 /* Extend change to start of + growsdown vma (mprotect only). */ +#define PROT_GROWSUP 0x02000000 /* Extend change to start of + growsup vma (mprotect only). */ + +/* 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 + +/* Advice to `madvise'. */ +#ifdef __USE_BSD +# define MADV_NORMAL 0 /* No further special treatment. */ +# define MADV_RANDOM 1 /* Expect random page references. */ +# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */ +# define MADV_WILLNEED 3 /* Will need these pages. */ +# define MADV_DONTNEED 4 /* Don't need these pages. */ +#endif + +/* The POSIX people had to invent similar names for the same things. */ +#ifdef __USE_XOPEN2K +# define POSIX_MADV_NORMAL 0 /* No further special treatment. */ +# define POSIX_MADV_RANDOM 1 /* Expect random page references. */ +# define POSIX_MADV_SEQUENTIAL 2 /* Expect sequential page references. */ +# define POSIX_MADV_WILLNEED 3 /* Will need these pages. */ +# define POSIX_MADV_DONTNEED 4 /* Don't need these pages. */ +#endif diff --git a/ports/sysdeps/unix/sysv/linux/am33/brk.c b/ports/sysdeps/unix/sysv/linux/am33/brk.c new file mode 100644 index 000000000..f56736359 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/brk.c @@ -0,0 +1,46 @@ +/* brk system call for Linux/am33. + Copyright (C) 1995, 1996, 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com>. + Based on ../i386/brk.c. + + 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. */ + +#include <errno.h> +#include <unistd.h> +#include <sysdep.h> + +/* This must be initialized data because commons can't have aliases. */ +void *__curbrk = 0; + +int +__brk (void *addr) +{ + void *newbrk; + + newbrk = INLINE_SYSCALL (brk, 1, __ptrvalue (addr)); + + __curbrk = newbrk; + + if (newbrk < addr) + { + __set_errno (ENOMEM); + return -1; + } + + return 0; +} +weak_alias (__brk, brk) diff --git a/ports/sysdeps/unix/sysv/linux/am33/chown.c b/ports/sysdeps/unix/sysv/linux/am33/chown.c new file mode 100644 index 000000000..819923eb4 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/chown.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/chown.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/clone.S b/ports/sysdeps/unix/sysv/linux/am33/clone.S new file mode 100644 index 000000000..26ba740d2 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/clone.S @@ -0,0 +1,81 @@ +/* Copyright 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com>. + Based on ../i386/clone.S. + + 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. */ + +/* clone() is even more special than fork() as it mucks with stacks + and invokes a function in the right context after its all over. */ + +#include <sysdep.h> +#define _ERRNO_H 1 +#include <bits/errno.h> +#include <asm-syntax.h> +#include <bp-sym.h> + +/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */ + + .text +ENTRY (BP_SYM (__clone)) + /* Sanity check arguments. */ + cmp 0,d0 /* no NULL function pointers */ + beq L(error_inval) + cmp 0,d1 /* no NULL stack pointers */ + beq L(error_inval) + + /* Allocate room for a function call in the new stack, and + store fn and arg in it. They will be read back in + thread_start. */ + mov d1,a0 + sub 12,a0 + mov d0,(a0) + mov (16,sp),d1 + mov d1,(4,a0) + + /* Do the system call */ + mov a0,d1 + mov (12,sp),a0 + mov SYS_ify(clone),d0 + syscall 0 + + cmp 0,d0 + beq thread_start + blt L(to_SYSCALL_ERROR_LABEL) + +L(pseudo_end): + ret + +L(error_inval): + mov -EINVAL,d0 +L(to_SYSCALL_ERROR_LABEL): + jmp SYSCALL_ERROR_LABEL + +thread_start: + mov 0,a3 /* terminate the stack frame */ + mov (4,sp),d0 + mov (sp),a0 + calls (a0) +#ifdef PIC +L(here): + mov pc,a2 + add _GLOBAL_OFFSET_TABLE_-(L(here) - .),a2 +#endif + call JUMPTARGET (_exit),[],0 + +PSEUDO_END (BP_SYM (__clone)) + +weak_alias (BP_SYM (__clone), BP_SYM (clone)) diff --git a/ports/sysdeps/unix/sysv/linux/am33/configure b/ports/sysdeps/unix/sysv/linux/am33/configure new file mode 100755 index 000000000..d4490122b --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/configure @@ -0,0 +1,4 @@ +# This file is generated from configure.in by Autoconf. DO NOT EDIT! + # Local configure fragment for am33/sysdeps/unix/sysv/linux/am33 + +arch_minimum_kernel=2.4.0 diff --git a/ports/sysdeps/unix/sysv/linux/am33/configure.in b/ports/sysdeps/unix/sysv/linux/am33/configure.in new file mode 100644 index 000000000..a94c370cf --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/configure.in @@ -0,0 +1,4 @@ +GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. +# Local configure fragment for am33/sysdeps/unix/sysv/linux/am33 + +arch_minimum_kernel=2.4.0 diff --git a/ports/sysdeps/unix/sysv/linux/am33/fchown.c b/ports/sysdeps/unix/sysv/linux/am33/fchown.c new file mode 100644 index 000000000..3a69ecc9e --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/fchown.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/fchown.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/fcntl.c b/ports/sysdeps/unix/sysv/linux/am33/fcntl.c new file mode 100644 index 000000000..ea951bc4f --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/fcntl.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/fcntl.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/fxstat.c b/ports/sysdeps/unix/sysv/linux/am33/fxstat.c new file mode 100644 index 000000000..4f219f0b9 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/fxstat.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/fxstat.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/getegid.c b/ports/sysdeps/unix/sysv/linux/am33/getegid.c new file mode 100644 index 000000000..37b4b4a53 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/getegid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/getegid.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/geteuid.c b/ports/sysdeps/unix/sysv/linux/am33/geteuid.c new file mode 100644 index 000000000..ebcb555b5 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/geteuid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/geteuid.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/getgid.c b/ports/sysdeps/unix/sysv/linux/am33/getgid.c new file mode 100644 index 000000000..0a4d6061f --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/getgid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/getgid.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/getgroups.c b/ports/sysdeps/unix/sysv/linux/am33/getgroups.c new file mode 100644 index 000000000..20a716610 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/getgroups.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/getgroups.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/getmsg.c b/ports/sysdeps/unix/sysv/linux/am33/getmsg.c new file mode 100644 index 000000000..3a1fa0852 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/getmsg.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/getmsg.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/getresgid.c b/ports/sysdeps/unix/sysv/linux/am33/getresgid.c new file mode 100644 index 000000000..b703a414c --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/getresgid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/getresgid.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/getresuid.c b/ports/sysdeps/unix/sysv/linux/am33/getresuid.c new file mode 100644 index 000000000..0b14cefe3 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/getresuid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/getresuid.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/getrlimit.c b/ports/sysdeps/unix/sysv/linux/am33/getrlimit.c new file mode 100644 index 000000000..fc06dbd64 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/getrlimit.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/getrlimit.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/getuid.c b/ports/sysdeps/unix/sysv/linux/am33/getuid.c new file mode 100644 index 000000000..d682c79a4 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/getuid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/getuid.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/lchown.c b/ports/sysdeps/unix/sysv/linux/am33/lchown.c new file mode 100644 index 000000000..c89de99ba --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/lchown.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/lchown.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/linuxthreads/sysdep-cancel.h b/ports/sysdeps/unix/sysv/linux/am33/linuxthreads/sysdep-cancel.h new file mode 100644 index 000000000..56d3bb62f --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/linuxthreads/sysdep-cancel.h @@ -0,0 +1,159 @@ +/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com> + + 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. */ + +#include <sysdep.h> +#include <tls.h> +#include <pt-machine.h> +#ifndef __ASSEMBLER__ +# include <linuxthreads/internals.h> +#endif + +#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt + +# undef PSEUDO +# define PSEUDO(name, syscall_name, args) \ + .text ; \ + ENTRY (name) \ + PUSHARGS_##args \ + DOARGS_##args \ + SINGLE_THREAD_P; \ + bne L(pseudo_cancel); \ + mov SYS_ify (syscall_name),d0; \ + syscall 0 \ + POPARGS_##args ; \ + cmp -126,d0; \ + bls L(pseudo_end); \ + jmp SYSCALL_ERROR_LABEL; \ + L(pseudo_cancel): \ + add -(16+STACK_SPACE (args)),sp; \ + SAVE_ARGS_##args \ + CENABLE \ + mov d0,r0; \ + LOAD_ARGS_##args \ + mov SYS_ify (syscall_name),d0; \ + syscall 0; \ + mov d0,(12,sp); \ + mov r0,d0; \ + CDISABLE \ + mov (12,sp),d0; \ + add +16+STACK_SPACE (args),sp \ + POPARGS_##args ; \ + cmp -126,d0; \ + bls L(pseudo_end); \ + jmp SYSCALL_ERROR_LABEL; \ + L(pseudo_end): \ + mov d0,a0 + +/* Reserve up to 2 stack slots for a0 and d1, but fewer than that if + we don't have that many arguments. */ +# define STACK_SPACE(n) (((((n) < 3) * (2 - (n))) + 2) * 4) + +# define SAVE_ARGS_0 +# define SAVE_ARGS_1 mov a0,(20,sp) ; +# define SAVE_ARGS_2 SAVE_ARGS_1 mov d1,(24,sp) ; +# define SAVE_ARGS_3 SAVE_ARGS_2 +# define SAVE_ARGS_4 SAVE_ARGS_3 +# define SAVE_ARGS_5 SAVE_ARGS_4 +# define SAVE_ARGS_6 SAVE_ARGS_5 + +# define LOAD_ARGS_0 +# define LOAD_ARGS_1 mov (20,sp),a0 ; +# define LOAD_ARGS_2 LOAD_ARGS_1 mov (24,sp),d1 ; +# define LOAD_ARGS_3 LOAD_ARGS_2 +# define LOAD_ARGS_4 LOAD_ARGS_3 +# define LOAD_ARGS_5 LOAD_ARGS_4 +# define LOAD_ARGS_6 LOAD_ARGS_5 + +# ifdef IS_IN_libpthread +# define CENABLE call __pthread_enable_asynccancel,[],0; +# define CDISABLE call __pthread_disable_asynccancel,[],0; +# elif defined IS_IN_librt +# ifdef PIC +# define CENABLE movm [a2],(sp); \ + 1: mov pc,a2; \ + add _GLOBAL_OFFSET_TABLE_-(1b-.),a2; \ + call +__librt_enable_asynccancel@PLT,[],0; \ + movm (sp),[a2]; +# define CENABLE movm [a2],(sp); \ + 1: mov pc,a2; \ + add _GLOBAL_OFFSET_TABLE_-(1b-.),a2; \ + call +__librt_disable_asynccancel@PLT,[],0; \ + movm (sp),[a2]; +# else +# define CENABLE call +__librt_enable_asynccancel,[],0; +# define CDISABLE call +__librt_disable_asynccancel,[],0; +# endif +# else +# define CENABLE call +__libc_enable_asynccancel,[],0; +# define CDISABLE call +__libc_disable_asynccancel,[],0; +# endif + +#if !defined NOT_IN_libc +# define __local_multiple_threads __libc_multiple_threads +#elif defined IS_IN_libpthread +# define __local_multiple_threads __pthread_multiple_threads +#else +# define __local_multiple_threads __librt_multiple_threads +#endif + +# ifndef __ASSEMBLER__ +# if defined FLOATING_STACKS && USE___THREAD && defined PIC +# define SINGLE_THREAD_P \ + __builtin_expect (THREAD_GETMEM (THREAD_SELF, \ + p_header.data.multiple_threads) == 0, 1) +# else +extern int __local_multiple_threads +# if !defined NOT_IN_libc || defined IS_IN_libpthread + attribute_hidden; +# else + ; +# endif +# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1) +# endif +# else +# if !defined PIC +# define SINGLE_THREAD_P \ + mov (+__local_multiple_threads),d0; \ + cmp 0,d0 +# elif !defined NOT_IN_libc || defined IS_IN_libpthread +# define SINGLE_THREAD_P \ + movm [a2],(sp); \ + 1: mov pc,a2; \ + add _GLOBAL_OFFSET_TABLE_-(1b-.),a2; \ + mov (+__local_multiple_threads@GOTOFF,a2),d0; \ + movm (sp),[a2]; \ + cmp 0,d0 +# else +# define SINGLE_THREAD_P \ + movm [a2],(sp); \ + 1: mov pc,a2; \ + add _GLOBAL_OFFSET_TABLE_-(1b-.),a2; \ + mov (+__local_multiple_threads@GOT,a2),a2; \ + mov (a2),d0; \ + movm (sp),[a2]; \ + cmp 0,d0 +# endif +# endif + +#elif !defined __ASSEMBLER__ + +/* This code should never be used but we define it anyhow. */ +# define SINGLE_THREAD_P (1) + +#endif diff --git a/ports/sysdeps/unix/sysv/linux/am33/lockf64.c b/ports/sysdeps/unix/sysv/linux/am33/lockf64.c new file mode 100644 index 000000000..a88f5a784 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/lockf64.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/lockf64.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/lxstat.c b/ports/sysdeps/unix/sysv/linux/am33/lxstat.c new file mode 100644 index 000000000..0efa0aea4 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/lxstat.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/lxstat.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/profil-counter.h b/ports/sysdeps/unix/sysv/linux/am33/profil-counter.h new file mode 100644 index 000000000..31422bb7e --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/profil-counter.h @@ -0,0 +1,27 @@ +/* Low-level statistical profiling support function. Linux/am33 version. + Copyright (C) 1996, 1997, 1998, 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. */ + +#include <signal.h> +#include <sigcontextinfo.h> + +static void +profil_counter (int signo, SIGCONTEXT scp) +{ + profil_count ((void *) GET_PC (scp)); +} diff --git a/ports/sysdeps/unix/sysv/linux/am33/putmsg.c b/ports/sysdeps/unix/sysv/linux/am33/putmsg.c new file mode 100644 index 000000000..ebc1680ca --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/putmsg.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/putmsg.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/setegid.c b/ports/sysdeps/unix/sysv/linux/am33/setegid.c new file mode 100644 index 000000000..2e3a54c89 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/setegid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setegid.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/seteuid.c b/ports/sysdeps/unix/sysv/linux/am33/seteuid.c new file mode 100644 index 000000000..18e41d08c --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/seteuid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/seteuid.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/setfsgid.c b/ports/sysdeps/unix/sysv/linux/am33/setfsgid.c new file mode 100644 index 000000000..088671256 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/setfsgid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setfsgid.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/setfsuid.c b/ports/sysdeps/unix/sysv/linux/am33/setfsuid.c new file mode 100644 index 000000000..a9f22eb8a --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/setfsuid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setfsuid.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/setgid.c b/ports/sysdeps/unix/sysv/linux/am33/setgid.c new file mode 100644 index 000000000..377021d9e --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/setgid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setgid.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/setgroups.c b/ports/sysdeps/unix/sysv/linux/am33/setgroups.c new file mode 100644 index 000000000..cb9a7708e --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/setgroups.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setgroups.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/setregid.c b/ports/sysdeps/unix/sysv/linux/am33/setregid.c new file mode 100644 index 000000000..99c57ad20 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/setregid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setregid.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/setresgid.c b/ports/sysdeps/unix/sysv/linux/am33/setresgid.c new file mode 100644 index 000000000..daca1a483 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/setresgid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setresgid.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/setresuid.c b/ports/sysdeps/unix/sysv/linux/am33/setresuid.c new file mode 100644 index 000000000..3aeabe9ad --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/setresuid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setresuid.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/setreuid.c b/ports/sysdeps/unix/sysv/linux/am33/setreuid.c new file mode 100644 index 000000000..8ad61226e --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/setreuid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setreuid.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/setrlimit.c b/ports/sysdeps/unix/sysv/linux/am33/setrlimit.c new file mode 100644 index 000000000..bfaef74c3 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/setrlimit.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setrlimit.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/setuid.c b/ports/sysdeps/unix/sysv/linux/am33/setuid.c new file mode 100644 index 000000000..de394379b --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/setuid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setuid.c> diff --git a/ports/sysdeps/unix/sysv/linux/am33/socket.S b/ports/sysdeps/unix/sysv/linux/am33/socket.S new file mode 100644 index 000000000..2c09239f3 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/socket.S @@ -0,0 +1,73 @@ +/* Copyright 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com>. + Based on ../i386/socket.S. + + 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. */ + +#include <sysdep.h> +#include <socketcall.h> + +#define P(a, b) P2(a, b) +#define P2(a, b) a##b + + .text +/* The socket-oriented system calls are handled unusally in Linux. + They are all gated through the single `socketcall' system call number. + `socketcall' takes two arguments: the first is the subcode, specifying + which socket function is being called; and the second is a pointer to + the arguments to the specific function. + + The .S files for the other calls just #define socket and #include this. */ + +#ifndef __socket +#ifndef NO_WEAK_ALIAS +#define __socket P(__,socket) +#else +#define __socket socket +#endif +#endif + +.globl __socket +ENTRY (__socket) + + mov d0,(4,sp) + mov d1,(8,sp) + + mov SYS_ify(socketcall),d0 /* System call number in d0. */ + + /* Use ## so `socket' is a separate token that might be #define'd. */ + mov P(SOCKOP_,socket),a0 /* Subcode is first arg to syscall. */ + mov sp,d1 + add 4,d1 /* Address of args is 2nd arg. */ + + /* Do the system call trap. */ + syscall 0 + + /* d0 is < 0 if there was an error. */ + cmp -126,d0 + bls L(pseudo_end) + jmp SYSCALL_ERROR_LABEL + + /* Successful; return the syscall's value. */ +L(pseudo_end): + ret + +PSEUDO_END (__socket) + +#ifndef NO_WEAK_ALIAS +weak_alias (__socket, socket) +#endif diff --git a/ports/sysdeps/unix/sysv/linux/am33/syscall.S b/ports/sysdeps/unix/sysv/linux/am33/syscall.S new file mode 100644 index 000000000..180e5822c --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/syscall.S @@ -0,0 +1,43 @@ +/* Copyright (C) 1995, 1996, 1998, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com>. + Based on ../i386/syscall.S. + + 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. */ + +#include <sysdep.h> + +/* Please consult the file sysdeps/unix/sysv/linux/am33/sysdep.h for + more information about the value -126 used below.*/ + + .text +ENTRY (syscall) + movm [d2,d3,a2,a3],(sp) /* Save register contents. */ + mov d1,a0 + mov (28,sp),d1 + mov (32,sp),a3 + mov (36,sp),a2 + mov (40,sp),d3 + mov (44,sp),d2 + syscall 0 /* Do the system call. */ + movm (sp),[d2,d3,a2,a3] /* Restore register contents. */ + cmp -126,d0 /* Check for error. */ + bls L(pseudo_end) + jmp SYSCALL_ERROR_LABEL /* Jump to error handler if error. */ +L(pseudo_end): + ret /* Return to caller. */ + +PSEUDO_END (syscall) diff --git a/ports/sysdeps/unix/sysv/linux/am33/sysdep.S b/ports/sysdeps/unix/sysv/linux/am33/sysdep.S new file mode 100644 index 000000000..b41bfce40 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/sysdep.S @@ -0,0 +1,42 @@ +/* Copyright (C) 1995, 1996, 1997, 1998, 2001, 2004 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com>. + Based on ../i386/sysdep.S. + + 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. */ + +#include <sysdep.h> + +/* The following code is only used in the shared library when we + compile the reentrant version. Otherwise each system call defines + each own version. */ + +#ifndef PIC + +#undef CALL_MCOUNT +#define CALL_MCOUNT /* Don't insert the profiling call, it clobbers %eax. */ + + .text +ENTRY (__syscall_error) + mov d0,d1 + clr d0 + sub d1,d0 + +#define __syscall_error __syscall_error_1 +#include <../../../am33/sysdep.S> + +#endif /* !PIC */ diff --git a/ports/sysdeps/unix/sysv/linux/am33/sysdep.h b/ports/sysdeps/unix/sysv/linux/am33/sysdep.h new file mode 100644 index 000000000..b0ff4ec86 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/sysdep.h @@ -0,0 +1,317 @@ +/* Copyright 2001, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Alexandre Oliva <aoliva@redhat.com>. + Based on ../i386/sysdep.h. + + 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. */ + +#ifndef _LINUX_AM33_SYSDEP_H +#define _LINUX_AM33_SYSDEP_H 1 + +/* There is some commonality. */ +#include "../../../am33/sysdep.h" + +/* For Linux we can use the system call table in the header file + /usr/include/asm/unistd.h + of the kernel. But these symbols do not follow the SYS_* syntax + so we have to redefine the `SYS_ify' macro here. */ +#undef SYS_ify +#define SYS_ify(syscall_name) __NR_##syscall_name + +/* ELF-like local names start with `.L'. */ +#undef L +#define L(name) .L##name + +#ifdef __ASSEMBLER__ + +/* Linux uses a negative return value to indicate syscall errors, + unlike most Unices, which use the condition codes' carry flag. + + Since version 2.1 the return value of a system call might be + negative even if the call succeeded. E.g., the `lseek' system call + might return a large offset. Therefore we must not anymore test + for < 0, but test for a real error by making sure the value in %eax + is a real error number. Linus said he will make sure the no syscall + returns a value in -1 .. -4095 as a valid result so we can savely + test with -4095. */ + +/* We don't want the label for the error handle to be global when we define + it here. */ +#ifdef PIC +# define SYSCALL_ERROR_LABEL 0f +#else +# define SYSCALL_ERROR_LABEL syscall_error +#endif + +#undef PSEUDO +#define PSEUDO(name, syscall_name, args) \ + .text; \ + ENTRY (name) \ + DO_CALL (syscall_name, args); \ + cmp -126,d0; \ + bls L(pseudo_end); \ + jmp SYSCALL_ERROR_LABEL; \ + L(pseudo_end): \ + mov d0,a0; + +#undef PSEUDO_END +#define PSEUDO_END(name) \ + SYSCALL_ERROR_HANDLER \ + END (name) + +#undef PSEUDO_NOERROR +#define PSEUDO_NOERRNO(name, syscall_name, args) \ + .text; \ + ENTRY (name) \ + DO_CALL (syscall_name, args) + +#undef PSEUDO_END_NOERRNO +#define PSEUDO_END_NOERRNO(name) \ + END (name) + +#define ret_NOERRNO ret + +/* The function has to return the error code. */ +#undef PSEUDO_ERRVAL +#define PSEUDO_ERRVAL(name, syscall_name, args) \ + .text; \ + ENTRY (name) \ + DO_CALL (syscall_name, args); \ + clr d1; \ + sub d0,d1,d0 + +#undef PSEUDO_END_ERRVAL +#define PSEUDO_END_ERRVAL(name) \ + END (name) + +#define ret_ERRVAL ret + +#ifndef PIC +#define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */ +#else +/* Store (- d0) into errno through the GOT. */ +#ifdef _LIBC_REENTRANT +#define SYSCALL_ERROR_HANDLER \ +0:movm [d2,a2],(sp); \ + add -12,sp; \ +1:mov pc,a2; \ + add _GLOBAL_OFFSET_TABLE_-(1b-.),a2; \ + clr d2; \ + sub d0,d2; \ + call __errno_location@PLT,[],0; \ + mov d2,(a0); \ + add 12,sp; \ + movm (sp),[d2,a2]; \ + mov -1,d0; \ + mov d0,a0; \ + jmp L(pseudo_end); +/* A quick note: it is assumed that the call to `__errno_location' does + not modify the stack! */ +#else +#define SYSCALL_ERROR_HANDLER \ +0:mov pc,a0; \ + add _GLOBAL_OFFSET_TABLE_-(0b-.),a0; \ + clr d1; \ + sub d0,d1; \ + mov (errno@GOT,a0),a1; \ + mov d1,(a0); \ + mov -1,d0; \ + mov d0,a0; \ + jmp L(pseudo_end); +#endif /* _LIBC_REENTRANT */ +#endif /* PIC */ + +/* Linux takes system call arguments in registers: + + syscall number d0 call-clobbered + arg 1 a0 call-clobbered + arg 2 d1 call-clobbered + arg 3 a3 call-saved + arg 4 a2 call-saved + arg 5 d3 call-saved + arg 6 d2 call-saved + + The stack layout upon entering the function is: + + (24,sp) Arg# 6 + (20,sp) Arg# 5 + (16,sp) Arg# 4 + (12,sp) Arg# 3 + d1 Arg# 2 + d0 Arg# 1 + (sp) Return address + + (Of course a function with say 3 arguments does not have entries for + arguments 4, 5 and 6.) */ + +#undef DO_CALL +#define DO_CALL(syscall_name, args) \ + PUSHARGS_##args \ + DOARGS_##args \ + mov SYS_ify (syscall_name),d0; \ + syscall 0 \ + POPARGS_##args + +#define PUSHARGS_0 /* No arguments to push. */ +#define _DOARGS_0(N) /* No arguments to frob. */ +#define DOARGS_0 /* No arguments to frob. */ +#define POPARGS_0 /* No arguments to pop. */ + +#define PUSHARGS_1 /* No arguments to push. */ +#define _DOARGS_1(N) _DOARGS_0 (N-4) mov d0,a0; +#define DOARGS_1 _DOARGS_1 (4) +#define POPARGS_1 /* No arguments to pop. */ + +#define PUSHARGS_2 /* No arguments to push. */ +#define _DOARGS_2(N) _DOARGS_1 (N-4) /* Argument already in d1. */ +#define DOARGS_2 _DOARGS_2 (8) +#define POPARGS_2 /* No arguments to pop. */ + +#define PUSHARGS_3 movm [a3],(sp); +#define _DOARGS_3(N) _DOARGS_2 (N-4) mov (N,sp),a3; +#define DOARGS_3 _DOARGS_3 (16) +#define POPARGS_3 ; movm (sp),[a3] + +#define PUSHARGS_4 movm [a2,a3],(sp); +#define _DOARGS_4(N) _DOARGS_3 (N-4) mov (N,sp),a2; +#define DOARGS_4 _DOARGS_4 (24) +#define POPARGS_4 ; movm (sp),[a2,a3] + +#define PUSHARGS_5 movm [d3,a2,a3],(sp); +#define _DOARGS_5(N) _DOARGS_4 (N-4) mov (N,sp),d3; +#define DOARGS_5 _DOARGS_5 (32) +#define POPARGS_5 ; movm (sp),[d3,a2,a3] + +#define PUSHARGS_6 movm [d2,d3,a2,a3],(sp); +#define _DOARGS_6(N) _DOARGS_5 (N-4) mov (N,sp),d2; +#define DOARGS_6 _DOARGS_6 (40) +#define POPARGS_6 ; movm (sp),[d2,d3,a2,a3] + +#else /* !__ASSEMBLER__ */ + +/* Define a macro which expands inline into the wrapper code for a system + call. */ +#undef INLINE_SYSCALL +#define INLINE_SYSCALL(name, nr, args...) \ + ({ \ + unsigned int resultvar = INTERNAL_SYSCALL (name, , nr, args); \ + if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (resultvar, ), 0)) \ + { \ + __set_errno (INTERNAL_SYSCALL_ERRNO (resultvar, )); \ + resultvar = 0xffffffff; \ + } \ + (int) resultvar; }) + +#define INTERNAL_SYSCALL(name, err, nr, args...) \ +({ \ + register long __sc0 asm ("d0") = __NR_##name; \ + inline_syscall##nr(name, ## args); \ + __sc0; \ +}) + +#undef INTERNAL_SYSCALL_DECL +#define INTERNAL_SYSCALL_DECL(err) do { } while (0) + +#undef INTERNAL_SYSCALL_ERROR_P +#define INTERNAL_SYSCALL_ERROR_P(val, err) \ + ((unsigned int) (val) >= (unsigned long)-125) + +#undef INTERNAL_SYSCALL_ERRNO +#define INTERNAL_SYSCALL_ERRNO(val, err) (-(val)) + +#define inline_syscall0(name,dummy...) \ +__asm__ __volatile__ ("syscall 0" \ + : "+d" (__sc0) \ + : : "memory") + +#define inline_syscall1(name,arg1) \ +register long __sc1 asm ("a0") = (long) (arg1); \ +inline_syscall0 (name); \ +__asm__ __volatile__ ("" : : "r" (__sc1)) + +#define inline_syscall2(name,arg1,arg2) \ +register long __sc2 asm ("d1") = (long) (arg2); \ +inline_syscall1 (name,(arg1)); \ +__asm__ __volatile__ ("" : : "r" (__sc2)) + +/* We can't tell whether a3 is going to be eliminated in the enclosing + function, so we have to assume it isn't. We first load the value + of any arguments into their registers, except for a3 itself, that + may be needed to load the value of the other arguments. Then, we + save a3's value in some other register, and load the argument value + into a3. We have to force both a3 and its copy to be live in + different registers at the same time, to avoid having the copy + spilled and the value reloaded into the same register, in which + case we'd be unable to get the value of a3 back, should the stack + slot reference be (offset,a3). */ +#define inline_syscall3(name,arg1,arg2,arg3) \ +long __sc3v = (long) (arg3); \ +register long __sc1 asm ("a0") = (long) (arg1); \ +register long __sc2 asm ("d1") = (long) (arg2); \ +register long __sc3 asm ("a3") = __sc3; \ +register long __sc3c; \ +__asm__ __volatile__ ("mov %1,%0" : "=&r" (__sc3c) : "r" (__sc3)); \ +__sc3 = __sc3v; \ +__asm__ __volatile__ ("" : : "r" (__sc3c), "r" (__sc3)); \ +inline_syscall0 (name); \ +__sc3 = __sc3c; \ +__asm__ __volatile__ ("" : : "r" (__sc3), "r" (__sc2), "r" (__sc1)) + +#ifdef PIC +/* Since a2 is the PIC register, it requires similar handling as a3 + when we're generating PIC, as a2's value may be needed to load + arguments whose values live in global variables. The difference is + that we don't need to require its value to be live in a register; + it may well be in a stack slot, as long as we save it before + clobbering a3 and restore it after restoring a3. */ +#define inline_syscall4(name,arg1,arg2,arg3,arg4) \ +long __sc4v = (long) (arg4); \ +long __sc3v = (long) (arg3); \ +register long __sc1 asm ("a0") = (long) (arg1); \ +register long __sc2 asm ("d1") = (long) (arg2); \ +register long __sc3 asm ("a3") = __sc3; \ +register long __sc3c; \ +register long __sc4 asm ("a2") = __sc4; \ +long __sc4c = __sc4; \ +__sc4 = __sc4v; \ +__asm__ __volatile__ ("mov %1,%0" : "=&r" (__sc3c) : "r" (__sc3)); \ +__sc3 = __sc3v; \ +__asm__ __volatile__ ("" : : "r" (__sc3c), "r" (__sc3), "r" (__sc4)); \ +inline_syscall0 (name); \ +__sc3 = __sc3c; \ +__sc4 = __sc4c; \ +__asm__ __volatile__ ("" : : "r" (__sc4), "r" (__sc3), \ + "r" (__sc2), "r" (__sc1)) +#else +#define inline_syscall4(name,arg1,arg2,arg3,arg4) \ +register long __sc4 asm ("a2") = (long) (arg4); \ +inline_syscall3 (name,(arg1),(arg2),(arg3)); \ +__asm__ __volatile__ ("" : : "r" (__sc4)) +#endif + +#define inline_syscall5(name,arg1,arg2,arg3,arg4,arg5) \ +register long __sc5 asm ("d3") = (long) (arg5); \ +inline_syscall4 (name,(arg1),(arg2),(arg3),(arg4)); \ +__asm__ __volatile__ ("" : : "r" (__sc5)) + +#define inline_syscall6(name,arg1,arg2,arg3,arg4,arg5,arg6) \ +register long __sc6 asm ("d2") = (long) (arg6); \ +inline_syscall5 (name,(arg1),(arg2),(arg3),(arg4),(arg5)); \ +__asm__ __volatile__ ("" : : "r" (__sc6)) + +#endif /* __ASSEMBLER__ */ + +#endif /* linux/am33/sysdep.h */ diff --git a/ports/sysdeps/unix/sysv/linux/am33/xstat.c b/ports/sysdeps/unix/sysv/linux/am33/xstat.c new file mode 100644 index 000000000..e9869f550 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/am33/xstat.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/xstat.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/Dist b/ports/sysdeps/unix/sysv/linux/cris/Dist new file mode 100644 index 000000000..1b8a7e61a --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/Dist @@ -0,0 +1,5 @@ +clone.S +setresuid.c +setresgid.c +setfsuid.c +setfsgid.c diff --git a/ports/sysdeps/unix/sysv/linux/cris/_G_config.h b/ports/sysdeps/unix/sysv/linux/cris/_G_config.h new file mode 100644 index 000000000..083a00abf --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/_G_config.h @@ -0,0 +1,106 @@ +/* This file is needed by libio to define various configuration parameters. + These are always the same in the GNU C library. */ + +/* We have to keep a separate copy for CRIS, because we don't use thunks, + and libstdc++-v2 (which we currently use) cares. The C++ ABI is + changed totally with GCC 3.0, where we should not need a separate file. */ + +#ifndef _G_config_h +#define _G_config_h 1 + +/* Define types for libio in terms of the standard internal type names. */ + +#include <bits/types.h> +#define __need_size_t +#define __need_wchar_t +#define __need_wint_t +#define __need_NULL +#include <stddef.h> +#ifndef _WINT_T +/* Integral type unchanged by default argument promotions that can + hold any value corresponding to members of the extended character + set, as well as at least one value that does not correspond to any + member of the extended character set. */ +# define _WINT_T +typedef unsigned int wint_t; +#endif +#define __need_mbstate_t +#include <wchar.h> +#define _G_size_t size_t +typedef struct +{ + __off_t __pos; + __mbstate_t __state; +} _G_fpos_t; +typedef struct +{ + __off64_t __pos; + __mbstate_t __state; +} _G_fpos64_t; +#define _G_ssize_t __ssize_t +#define _G_off_t __off_t +#define _G_off64_t __off64_t +#define _G_pid_t __pid_t +#define _G_uid_t __uid_t +#define _G_wchar_t wchar_t +#define _G_wint_t wint_t +#define _G_stat64 stat64 +#include <gconv.h> +typedef union +{ + struct __gconv_info __cd; + struct + { + struct __gconv_info __cd; + struct __gconv_step_data __data; + } __combined; +} _G_iconv_t; + +typedef int _G_int16_t __attribute__ ((__mode__ (__HI__))); +typedef int _G_int32_t __attribute__ ((__mode__ (__SI__))); +typedef unsigned int _G_uint16_t __attribute__ ((__mode__ (__HI__))); +typedef unsigned int _G_uint32_t __attribute__ ((__mode__ (__SI__))); + +#define _G_HAVE_BOOL 1 + + +/* These library features are always available in the GNU C library. */ +#define _G_HAVE_ATEXIT 1 +#define _G_HAVE_SYS_CDEFS 1 +#define _G_HAVE_SYS_WAIT 1 +#define _G_NEED_STDARG_H 1 +#define _G_va_list __gnuc_va_list + +#define _G_HAVE_PRINTF_FP 1 +#define _G_HAVE_MMAP 1 +#define _G_HAVE_LONG_DOUBLE_IO 1 +#define _G_HAVE_IO_FILE_OPEN 1 +#define _G_HAVE_IO_GETLINE_INFO 1 + +#define _G_IO_IO_FILE_VERSION 0x20001 + +#define _G_OPEN64 __open64 +#define _G_LSEEK64 __lseek64 +#define _G_MMAP64 __mmap64 +#define _G_FSTAT64(fd,buf) __fxstat64 (_STAT_VER, fd, buf) + +/* This is defined by <bits/stat.h> if `st_blksize' exists. */ +#define _G_HAVE_ST_BLKSIZE defined (_STATBUF_ST_BLKSIZE) + +#define _G_BUFSIZ 8192 + +/* These are the vtbl details for ELF. */ +#define _G_NAMES_HAVE_UNDERSCORE 0 +#define _G_VTABLE_LABEL_HAS_LENGTH 1 +#undef _G_USING_THUNKS +#define _G_VTABLE_LABEL_PREFIX "_vt." +#define _G_VTABLE_LABEL_PREFIX_ID _vt. + + +#if defined __cplusplus || defined __STDC__ +# define _G_ARGS(ARGLIST) ARGLIST +#else +# define _G_ARGS(ARGLIST) () +#endif + +#endif /* _G_config.h */ diff --git a/ports/sysdeps/unix/sysv/linux/cris/bits/fcntl.h b/ports/sysdeps/unix/sysv/linux/cris/bits/fcntl.h new file mode 100644 index 000000000..36799aa50 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/bits/fcntl.h @@ -0,0 +1,189 @@ +/* O_*, F_*, FD_* bit values for Linux. + Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001, 2004 + 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_NOATIME 01000000 /* Do not set atime. */ +#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_UNIX98 +# 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 + +#ifdef __USE_GNU +# define F_SETLEASE 1024 /* Set a lease. */ +# define F_GETLEASE 1025 /* Enquire what lease is active. */ +# define F_NOTIFY 1026 /* Request notfications on a directory. */ +#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 + +#ifdef __USE_GNU +# define LOCK_MAND 32 /* This is a mandatory flock: */ +# define LOCK_READ 64 /* ... which allows concurrent read operations. */ +# define LOCK_WRITE 128 /* ... which allows concurrent write operations. */ +# define LOCK_RW 192 /* ... Which allows concurrent read & write operations. */ +#endif + +#ifdef __USE_GNU +/* Types of directory notifications that may be requested with F_NOTIFY. */ +# define DN_ACCESS 0x00000001 /* File accessed. */ +# define DN_MODIFY 0x00000002 /* File modified. */ +# define DN_CREATE 0x00000004 /* File created. */ +# define DN_DELETE 0x00000008 /* File removed. */ +# define DN_RENAME 0x00000010 /* File renamed. */ +# define DN_ATTRIB 0x00000020 /* File changed attibutes. */ +# define DN_MULTISHOT 0x80000000 /* Don't remove notifier. */ +#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 + +__BEGIN_DECLS + +/* Provide kernel hint to read ahead. */ +extern ssize_t readahead (int __fd, __off64_t __offset, size_t __count) + __THROW; + +__END_DECLS diff --git a/ports/sysdeps/unix/sysv/linux/cris/bits/mman.h b/ports/sysdeps/unix/sysv/linux/cris/bits/mman.h new file mode 100644 index 000000000..b66c0bdb6 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/bits/mman.h @@ -0,0 +1,97 @@ +/* Definitions for POSIX memory map interface. Linux/CRIS version. + Copyright (C) 1997, 2000, 2001, 2003 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 _SYS_MMAN_H +# error "Never use <bits/mman.h> directly; include <sys/mman.h> instead." +#endif + +/* The following definitions basically come from the kernel headers. + But the kernel header is not namespace clean. */ + + +/* 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_READ 0x1 /* Page can be read. */ +#define PROT_WRITE 0x2 /* Page can be written. */ +#define PROT_EXEC 0x4 /* Page can be executed. */ +#define PROT_NONE 0x0 /* Page can not be accessed. */ +#define PROT_GROWSDOWN 0x01000000 /* Extend change to start of + growsdown vma (mprotect only). */ +#define PROT_GROWSUP 0x02000000 /* Extend change to start of + growsup vma (mprotect only). */ + +/* 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 + +/* Advice to `madvise'. */ +#ifdef __USE_BSD +# define MADV_NORMAL 0 /* No further special treatment. */ +# define MADV_RANDOM 1 /* Expect random page references. */ +# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */ +# define MADV_WILLNEED 3 /* Will need these pages. */ +# define MADV_DONTNEED 4 /* Don't need these pages. */ +#endif + +/* The POSIX people had to invent similar names for the same things. */ +#ifdef __USE_XOPEN2K +# define POSIX_MADV_NORMAL 0 /* No further special treatment. */ +# define POSIX_MADV_RANDOM 1 /* Expect random page references. */ +# define POSIX_MADV_SEQUENTIAL 2 /* Expect sequential page references. */ +# define POSIX_MADV_WILLNEED 3 /* Will need these pages. */ +# define POSIX_MADV_DONTNEED 4 /* Don't need these pages. */ +#endif diff --git a/ports/sysdeps/unix/sysv/linux/cris/brk.c b/ports/sysdeps/unix/sysv/linux/cris/brk.c new file mode 100644 index 000000000..ce4944512 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/brk.c @@ -0,0 +1,44 @@ +/* brk system call for Linux/CRIS. + Copyright (C) 1995, 1996, 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. */ + +#include <errno.h> +#include <unistd.h> +#include <sysdep.h> + +/* This must be initialized data because commons can't have aliases. */ +void *__curbrk = 0; + +int +__brk (void *addr) +{ + unsigned char *newbrk; + + newbrk = (unsigned char *) INLINE_SYSCALL (brk, 1, addr); + + __curbrk = newbrk; + + if (newbrk < (unsigned char *) addr) + { + __set_errno (ENOMEM); + return -1; + } + + return 0; +} +weak_alias (__brk, brk) diff --git a/ports/sysdeps/unix/sysv/linux/cris/chown.c b/ports/sysdeps/unix/sysv/linux/cris/chown.c new file mode 100644 index 000000000..196162256 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/chown.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/m68k/chown.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/clone.S b/ports/sysdeps/unix/sysv/linux/cris/clone.S new file mode 100644 index 000000000..b2016438a --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/clone.S @@ -0,0 +1,88 @@ +/* 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 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. */ + +#include <sysdep.h> +#define _ERRNO_H 1 +#include <bits/errno.h> + +/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */ + + .syntax no_register_prefix + + .text +ENTRY (__clone) + /* Sanity check arguments: No NULL function pointers. Allow a NULL + stack pointer though; it makes the kernel allocate stack. */ + test.d r10 + beq 1f + nop + + /* We need to muck with a few registers. */ + movem r1,[sp=sp-8] + + /* Save the function pointer and argument. We can't save them + onto the new stack since it can be NULL. */ + move.d r10,r0 + move.d r13,r1 + + /* Move the other arguments into place for the system call. */ + move.d r11,r10 + move.d r12,r11 + + /* Do the system call. */ + movu.w SYS_ify (clone),r9 + break 13 + test.d r10 + beq .Lthread_start + nop + + /* Jump to error handler if we get (unsigned) -4096 .. 0xffffffff. */ + cmps.w -4096,r10 + bhs 0f + movem [sp+],r1 + + /* In parent, successful return. (Avoid using "ret" - it's a macro.) */ + Ret + nop + +.Lthread_start: + /* Terminate frame pointers here. */ + moveq 0,r8 + + /* I've told you once. */ + move.d r1,r10 + jsr r0 + + SETUP_PIC + PLTCALL (_exit) + + /* Die horribly. */ + test.d [6809] + + /* Stop the unstoppable. */ +9: + ba 9b + nop + +/* Local error handler. */ +1: + movs.w -EINVAL,r10 + /* Drop through into the ordinary error handler. */ +PSEUDO_END (__clone) + +weak_alias (__clone, clone) diff --git a/ports/sysdeps/unix/sysv/linux/cris/fchown.c b/ports/sysdeps/unix/sysv/linux/cris/fchown.c new file mode 100644 index 000000000..3a69ecc9e --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/fchown.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/fchown.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/fcntl.c b/ports/sysdeps/unix/sysv/linux/cris/fcntl.c new file mode 100644 index 000000000..ea951bc4f --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/fcntl.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/fcntl.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/fxstat.c b/ports/sysdeps/unix/sysv/linux/cris/fxstat.c new file mode 100644 index 000000000..4f219f0b9 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/fxstat.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/fxstat.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/getegid.c b/ports/sysdeps/unix/sysv/linux/cris/getegid.c new file mode 100644 index 000000000..37b4b4a53 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/getegid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/getegid.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/geteuid.c b/ports/sysdeps/unix/sysv/linux/cris/geteuid.c new file mode 100644 index 000000000..ebcb555b5 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/geteuid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/geteuid.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/getgid.c b/ports/sysdeps/unix/sysv/linux/cris/getgid.c new file mode 100644 index 000000000..0a4d6061f --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/getgid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/getgid.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/getgroups.c b/ports/sysdeps/unix/sysv/linux/cris/getgroups.c new file mode 100644 index 000000000..102ea24e1 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/getgroups.c @@ -0,0 +1,2 @@ +/* We also have to rewrite the kernel gid_t to the user land type. */ +#include <sysdeps/unix/sysv/linux/i386/getgroups.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/getresgid.c b/ports/sysdeps/unix/sysv/linux/cris/getresgid.c new file mode 100644 index 000000000..b703a414c --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/getresgid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/getresgid.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/getresuid.c b/ports/sysdeps/unix/sysv/linux/cris/getresuid.c new file mode 100644 index 000000000..0b14cefe3 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/getresuid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/getresuid.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/getrlimit.c b/ports/sysdeps/unix/sysv/linux/cris/getrlimit.c new file mode 100644 index 000000000..fc06dbd64 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/getrlimit.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/getrlimit.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/getrlimit64.c b/ports/sysdeps/unix/sysv/linux/cris/getrlimit64.c new file mode 100644 index 000000000..fef018f47 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/getrlimit64.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/getrlimit64.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/getuid.c b/ports/sysdeps/unix/sysv/linux/cris/getuid.c new file mode 100644 index 000000000..d682c79a4 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/getuid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/getuid.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/lchown.c b/ports/sysdeps/unix/sysv/linux/cris/lchown.c new file mode 100644 index 000000000..c89de99ba --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/lchown.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/lchown.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/lockf64.c b/ports/sysdeps/unix/sysv/linux/cris/lockf64.c new file mode 100644 index 000000000..a88f5a784 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/lockf64.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/lockf64.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/lxstat.c b/ports/sysdeps/unix/sysv/linux/cris/lxstat.c new file mode 100644 index 000000000..2371cd971 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/lxstat.c @@ -0,0 +1,2 @@ +#include <sysdeps/unix/sysv/linux/i386/lxstat.c> + diff --git a/ports/sysdeps/unix/sysv/linux/cris/mmap.S b/ports/sysdeps/unix/sysv/linux/cris/mmap.S new file mode 100644 index 000000000..3c74d590f --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/mmap.S @@ -0,0 +1,68 @@ +/* Copyright (C) 1995, 96, 97, 98, 99, 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 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. */ + +#include <sysdep.h> + +#include "kernel-features.h" + +#include <asm/errno.h> + +/* Rather than dragging in yet another kernel file, <asm/page.h>, we + define it here. Provide for easy override. */ +#ifndef PAGE_SHIFT +#define PAGE_SHIFT 13 +#endif + + .syntax no_register_prefix + +/* This is __ptr_t + __mmap (__ptr_t addr, size_t len, int prot, int flags, int fd, off_t offset) */ + + ENTRY (__mmap) + + /* Only accept a offset (and address) being a multiple of PAGE_SIZE, + since we only pass the page part in the system call. */ + move.d [sp+4],r9 + btstq (PAGE_SHIFT - 1),r9 + bne 1f + btstq (PAGE_SHIFT - 1),r10 + + bne 1f + lsrq PAGE_SHIFT,r9 + + move [sp],mof + move srp,[sp] + move r9,srp + + movu.b SYS_ify (mmap2),r9 + break 13 + + cmps.w -4096,r10 + bhs 0f + move [sp],srp + + Ret + nop + +/* Local error handler. */ +1: + movs.w -EINVAL,r10 + /* Drop through into the ordinary error handler. */ +PSEUDO_END (__mmap) + +weak_alias (__mmap, mmap) diff --git a/ports/sysdeps/unix/sysv/linux/cris/mmap64.S b/ports/sysdeps/unix/sysv/linux/cris/mmap64.S new file mode 100644 index 000000000..d71114454 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/mmap64.S @@ -0,0 +1,91 @@ +/* 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 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. */ + +#include <sysdep.h> + +#include "kernel-features.h" + +#include <asm/errno.h> + +/* Rather than dragging in yet another kernel file, <asm/page.h>, we + define it here. Provide for easy override. */ +#ifndef PAGE_SHIFT +#define PAGE_SHIFT 13 +#endif + +/* This is: __ptr_t + __mmap64 (__ptr_t addr, size_t len, int prot, int flags, int fd, + off64_t offset); */ + +/* This was done in C, but the resulting code didn't look anywhere near + nice, and mmap64 is important enough to have fast code. Rather than + fixing (the generic bits in) gcc, we make sure not to depend on it by + writing code that GCC cannot reasonably generate. */ + + .syntax no_register_prefix + +ENTRY (__mmap64) + + move [sp],mof + move.d [sp+4],r9 + + /* Only accept an offset being a multiple of PAGE_SIZE, ditto address. */ + btstq (PAGE_SHIFT - 1),r9 + bne 1f + lsrq PAGE_SHIFT,r9 + + btstq (PAGE_SHIFT - 1),r10 + bne 1f + move.d r9,[sp] + + /* We have to store the adjusted part somewhere we can "or" from. + No registers available, so let's re-use the incoming low-part + parameter location. */ + move.d [sp+8],r9 + + swapwbr r9 + /* Check if the highest bits (now the lowest bits) are zero. They + must be, since we're actually calling a system function + specifying the size in *pages* in a single dword. Thus you can + mmap64 PAGE_SIZE * 4 Gbyte. */ + btstq (PAGE_SHIFT - 1),r9 + bne 1f + swapwbr r9 + + lslq (32 - PAGE_SHIFT),r9 + or.d [sp],r9 + move srp,[sp] + move r9,srp + + movu.b SYS_ify (mmap2),r9 + break 13 + + cmps.w -4096,r10 + bhs 0f + move [sp],srp + + Ret + nop + +/* Local error handler. */ +1: + movs.w -EINVAL,r10 + /* Drop through into the ordinary error handler. */ +PSEUDO_END (__mmap64) + +weak_alias (__mmap64, mmap64) diff --git a/ports/sysdeps/unix/sysv/linux/cris/msgctl.c b/ports/sysdeps/unix/sysv/linux/cris/msgctl.c new file mode 100644 index 000000000..9f9b8431a --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/msgctl.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/msgctl.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/profil-counter.h b/ports/sysdeps/unix/sysv/linux/cris/profil-counter.h new file mode 100644 index 000000000..37adc1fee --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/profil-counter.h @@ -0,0 +1,26 @@ +/* Low-level statistical profiling support function. Linux/CRIS version. + 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 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. */ + +#include <signal.h> + +static void +profil_counter (int signo, struct sigcontext *scp) +{ + profil_count ((void *) scp->regs.irp); +} diff --git a/ports/sysdeps/unix/sysv/linux/cris/register-dump.h b/ports/sysdeps/unix/sysv/linux/cris/register-dump.h new file mode 100644 index 000000000..309728bf9 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/register-dump.h @@ -0,0 +1,117 @@ +/* Dump registers. + Copyright (C) 1998, 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. */ + +#include <stddef.h> +#include <sys/uio.h> +#include <stdio-common/_itoa.h> + +/* We will print the register dump in this format: + + R0: XXXXXXXX R1: XXXXXXXX R2: XXXXXXXX R3: XXXXXXXX + R4: XXXXXXXX R5: XXXXXXXX R6: XXXXXXXX R7: XXXXXXXX + R8: XXXXXXXX R9: XXXXXXXX R10: XXXXXXXX R11: XXXXXXXX + R12: XXXXXXXX R13: XXXXXXXX SP: XXXXXXXX PC: XXXXXXXX +DCCR: XXXXXXXX SRP: XXXXXXXX */ + +static void +hexvalue (unsigned long int value, char *buf, size_t len) +{ + char *cp = _itoa_word (value, buf + len, 16, 0); + while (cp > buf) + *--cp = '0'; +} + +static void register_dump (int fd, struct sigcontext *ctx) +{ + char regs[18][8]; + struct iovec iov[36], *next_iov = iov; + struct pt_regs *rx = &ctx->regs; + +#define ADD_STRING(str) \ + next_iov->iov_base = (char *) (str); \ + next_iov->iov_len = strlen (str); \ + ++next_iov +#define ADD_MEM(str, len) \ + next_iov->iov_base = (str); \ + next_iov->iov_len = (len); \ + ++next_iov + + /* Generate strings of register contents. */ + hexvalue (rx->r0, regs[0], 8); + hexvalue (rx->r1, regs[1], 8); + hexvalue (rx->r2, regs[2], 8); + hexvalue (rx->r3, regs[3], 8); + hexvalue (rx->r4, regs[4], 8); + hexvalue (rx->r5, regs[5], 8); + hexvalue (rx->r6, regs[6], 8); + hexvalue (rx->r7, regs[7], 8); + hexvalue (rx->r8, regs[8], 8); + hexvalue (rx->r9, regs[9], 8); + hexvalue (rx->r10, regs[10], 8); + hexvalue (rx->r11, regs[11], 8); + hexvalue (rx->r12, regs[12], 8); + hexvalue (rx->r13, regs[13], 8); + hexvalue (ctx->usp, regs[14], 8); + hexvalue (rx->irp, regs[17], 8); + hexvalue (rx->dccr, regs[15], 8); + hexvalue (rx->srp, regs[16], 8); + + /* Generate the output. */ + ADD_STRING ("Register dump:\n\n R0: "); + ADD_MEM (regs[0], 8); + ADD_STRING (" R1: "); + ADD_MEM (regs[1], 8); + ADD_STRING (" R2: "); + ADD_MEM (regs[2], 8); + ADD_STRING (" R3: "); + ADD_MEM (regs[3], 8); + ADD_STRING ("\n R4: "); + ADD_MEM (regs[4], 8); + ADD_STRING (" R5: "); + ADD_MEM (regs[5], 8); + ADD_STRING (" R6: "); + ADD_MEM (regs[6], 8); + ADD_STRING (" R7: "); + ADD_MEM (regs[7], 8); + ADD_STRING ("\n R8: "); + ADD_MEM (regs[8], 8); + ADD_STRING (" R9: "); + ADD_MEM (regs[9], 8); + ADD_STRING (" R10: "); + ADD_MEM (regs[10], 8); + ADD_STRING (" R11: "); + ADD_MEM (regs[11], 8); + ADD_STRING ("\n R12: "); + ADD_MEM (regs[12], 8); + ADD_STRING (" R13: "); + ADD_MEM (regs[13], 8); + ADD_STRING (" SP: "); + ADD_MEM (regs[14], 8); + ADD_STRING (" PC: "); + ADD_MEM (regs[17], 8); + ADD_STRING ("\nDCCR: "); + ADD_MEM (regs[15], 8); + ADD_STRING (" SRP: "); + ADD_MEM (regs[16], 4); + + /* Write the stuff out. */ + writev (fd, iov, next_iov - iov); +} + +#define REGISTER_DUMP register_dump (fd, ctx) diff --git a/ports/sysdeps/unix/sysv/linux/cris/semctl.c b/ports/sysdeps/unix/sysv/linux/cris/semctl.c new file mode 100644 index 000000000..e9b1a483c --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/semctl.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/semctl.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/setegid.c b/ports/sysdeps/unix/sysv/linux/cris/setegid.c new file mode 100644 index 000000000..2e3a54c89 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/setegid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setegid.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/seteuid.c b/ports/sysdeps/unix/sysv/linux/cris/seteuid.c new file mode 100644 index 000000000..18e41d08c --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/seteuid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/seteuid.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/setfsgid.c b/ports/sysdeps/unix/sysv/linux/cris/setfsgid.c new file mode 100644 index 000000000..088671256 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/setfsgid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setfsgid.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/setfsuid.c b/ports/sysdeps/unix/sysv/linux/cris/setfsuid.c new file mode 100644 index 000000000..a9f22eb8a --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/setfsuid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setfsuid.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/setgid.c b/ports/sysdeps/unix/sysv/linux/cris/setgid.c new file mode 100644 index 000000000..377021d9e --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/setgid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setgid.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/setgroups.c b/ports/sysdeps/unix/sysv/linux/cris/setgroups.c new file mode 100644 index 000000000..0e7086278 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/setgroups.c @@ -0,0 +1,2 @@ +/* We also have to rewrite the kernel gid_t to the user land type. */ +#include <sysdeps/unix/sysv/linux/i386/setgroups.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/setregid.c b/ports/sysdeps/unix/sysv/linux/cris/setregid.c new file mode 100644 index 000000000..99c57ad20 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/setregid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setregid.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/setresgid.c b/ports/sysdeps/unix/sysv/linux/cris/setresgid.c new file mode 100644 index 000000000..daca1a483 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/setresgid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setresgid.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/setresuid.c b/ports/sysdeps/unix/sysv/linux/cris/setresuid.c new file mode 100644 index 000000000..3aeabe9ad --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/setresuid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setresuid.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/setreuid.c b/ports/sysdeps/unix/sysv/linux/cris/setreuid.c new file mode 100644 index 000000000..8ad61226e --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/setreuid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setreuid.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/setrlimit.c b/ports/sysdeps/unix/sysv/linux/cris/setrlimit.c new file mode 100644 index 000000000..bfaef74c3 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/setrlimit.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setrlimit.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/setuid.c b/ports/sysdeps/unix/sysv/linux/cris/setuid.c new file mode 100644 index 000000000..de394379b --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/setuid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/setuid.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/shmctl.c b/ports/sysdeps/unix/sysv/linux/cris/shmctl.c new file mode 100644 index 000000000..7eac6380d --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/shmctl.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/shmctl.c> diff --git a/ports/sysdeps/unix/sysv/linux/cris/socket.S b/ports/sysdeps/unix/sysv/linux/cris/socket.S new file mode 100644 index 000000000..38b4ac5fb --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/socket.S @@ -0,0 +1,96 @@ +/* Copyright (C) 1995, 1996, 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. */ + +#include <sysdep.h> +#include <socketcall.h> + +#define P(a, b) P2(a, b) +#define P2(a, b) a##b + +/* The socket-oriented system calls are handled unusally in Linux. + They are all gated through the single `socketcall' system call number. + `socketcall' takes two arguments: the first is the subcode, specifying + which socket function is being called; and the second is a pointer to + the arguments to the specific function. + + The .S files for the other calls just #define socket and #include this. + They also #define a 'number-of-arguments' word in NARGS, which + defaults to 3. */ + +#ifndef NARGS +#ifdef socket +#error NARGS not defined +#endif +#define NARGS 3 +#endif + + .syntax no_register_prefix + +#ifndef __socket +#define __socket P(__,socket) +#endif + +ENTRY(__socket) + subq NARGS*4,sp + +#if NARGS >= 2 + move.d sp,r9 + move.d r10,[r9+] +#else + move.d r10,[sp] +#endif +#if NARGS >= 2 + move.d r11,[r9+] +#endif +#if NARGS >= 3 + move.d r12,[r9+] +#endif +#if NARGS >= 4 + move.d r13,[r9+] +#endif +#if NARGS >= 5 + move.d [sp+NARGS*4],r13 + move.d r13,[r9+] +#endif +#if NARGS >= 6 + move.d [sp+NARGS*4+4],r13 + move.d r13,[r9+] +#endif +#if NARGS >= 7 + move.d [sp+NARGS*4+8],r13 + move.d r13,[r9+] +#endif +#if NARGS >= 8 + move.d [sp+NARGS*4+12],r13 + move.d r13,[r9+] +#endif +#if NARGS >= 9 +#error Too many arguments! +#endif + moveq P(SOCKOP_,socket),r10 + move.d sp,r11 + movu.w SYS_ify(socketcall),r9 + break 13 + cmps.w -4096,r10 + bhs 0f + addq NARGS*4,sp + Ret + nop +PSEUDO_END (__socket) + +weak_alias (__socket, socket) diff --git a/ports/sysdeps/unix/sysv/linux/cris/sys/ucontext.h b/ports/sysdeps/unix/sysv/linux/cris/sys/ucontext.h new file mode 100644 index 000000000..2d3aee076 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/sys/ucontext.h @@ -0,0 +1,56 @@ +/* Copyright (C) 1998, 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 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 _SYS_UCONTEXT_H +#define _SYS_UCONTEXT_H 1 + +#include <features.h> +#include <signal.h> + +#include <bits/sigcontext.h> + + +/* Type for general register. */ +typedef long int greg_t; + +/* Number of general registers. */ +#define NGREG 20 + +/* Container for all general registers. */ +typedef greg_t gregset_t[NGREG]; + +/* A placeholder type for floating-point register. */ +typedef long int fpreg_t; + +/* A placeholder; CRIS does not have any fp regs. */ +typedef unsigned long fpregset_t; + +/* A machine context is exactly a sigcontext. */ +typedef struct sigcontext 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 */ diff --git a/ports/sysdeps/unix/sysv/linux/cris/syscall.S b/ports/sysdeps/unix/sysv/linux/cris/syscall.S new file mode 100644 index 000000000..03626b094 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/syscall.S @@ -0,0 +1,40 @@ +/* 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 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. */ + +#include <sysdep.h> + + .syntax no_register_prefix + +/* Make syscall (callno, ...) into a system call. */ + +ENTRY (syscall) + move.d r10,r9 + move.d r11,r10 + move.d r12,r11 + move.d r13,r12 + move.d [sp],r13 + move srp,[sp] + move [sp+4],mof + move [sp+8],srp + break 13 + cmps.w -4096,r10 + bhs 0f + move [sp],srp + Ret + nop +PSEUDO_END (syscall) diff --git a/ports/sysdeps/unix/sysv/linux/cris/sysdep.S b/ports/sysdeps/unix/sysv/linux/cris/sysdep.S new file mode 100644 index 000000000..e53e7bbfb --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/sysdep.S @@ -0,0 +1,66 @@ +/* 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 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. */ + +#include <sysdep.h> + +/* The syscall stubs jump here when they detect an error, bot for PIC and + non-PIC. */ + + .syntax no_register_prefix + +ENTRY (__syscall_error) + neg.d r10,r10 + +#ifdef _LIBC_REENTRANT + push r10 + push srp + + /* Note that __syscall_error is only visible within this library, + and no-one passes it on as a pointer, so can assume that R0 (GOT + pointer) is correctly set up. */ + PLTCALL (__errno_location) + + pop srp + pop r11 + move.d r11,[r10] + +#else /* not _LIBC_REENTRANT */ +# ifdef __PIC__ + move.d [r0+C_SYMBOL_NAME(errno:GOT)],r9 + move.d r10,[r9] +# else + move.d r10,[C_SYMBOL_NAME(errno)] +# endif +#endif /* _LIBC_REENTRANT */ + +#ifdef __PIC__ +/* PIC callers are supposed to have R0 on stack, ready for us to restore. + Callers are only allowed from within this DSO, so the GOT in r0 is the + one we want to use. + + (Don't use "ret" - it's a macro). */ + + moveq -1,r10 + Ret + pop r0 +#else + Ret + moveq -1,r10 +#endif + +END (__syscall_error) diff --git a/ports/sysdeps/unix/sysv/linux/cris/sysdep.h b/ports/sysdeps/unix/sysv/linux/cris/sysdep.h new file mode 100644 index 000000000..5013dd5d3 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/sysdep.h @@ -0,0 +1,226 @@ +/* Assembler macros for CRIS. + Copyright (C) 1999, 2001, 2003 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. */ + +#include <asm/unistd.h> +#include <sysdeps/cris/sysdep.h> +#include <sys/syscall.h> +#include "config.h" + +#undef SYS_ify +#define SYS_ify(syscall_name) (__NR_##syscall_name) + + +#ifdef __ASSEMBLER__ + +/* For Linux we can use the system call table in the header file + /usr/include/asm/unistd.h + of the kernel. But these symbols do not follow the SYS_* syntax + so we have to redefine the `SYS_ify' macro here. */ +#undef SYS_ify +#define SYS_ify(syscall_name) __NR_##syscall_name + +/* ELF-like local names start with `.L'. */ +#undef L +#define L(name) .L##name + +/* Linux uses a negative return value to indicate syscall errors, + unlike most Unices, which use the condition codes' carry flag. + + Since version 2.1 the return value of a system call might be + negative even if the call succeeded. E.g., the `lseek' system call + might return a large offset. Therefore we must not anymore test + for < 0, but test for a real error by making sure the value in %eax + is a real error number. Linus said he will make sure the no syscall + returns a value in -1 .. -4095 as a valid result so we can safely + test with -4095. */ + +/* Syscall wrappers consist of + #include <sysdep.h> + PSEUDO (...) + ret + PSEUDO_END (...) + + which expand to the following. */ + +/* Linux takes system call arguments in registers: + syscall number R9 + arg 1 R10 + arg 2 R11 + arg 3 R12 + arg 4 R13 + arg 5 MOF + arg 6 SRP + + The compiler calls us by the C convention: + syscall number in the DO_CALL macro + arg 1 R10 + arg 2 R11 + arg 3 R12 + arg 4 R13 + arg 5 [SP] + arg 6 [SP + 4] + */ + +/* Note that we use "bhs", since we want to match + (unsigned) -4096 .. 0xffffffff. Using "ble" would match + -4096 .. -2**31. */ +#define PSEUDO(name, syscall_name, args) \ + ENTRY (name) @ \ + DOARGS_##args @ \ + movu.w SYS_ify (syscall_name),$r9 @ \ + break 13 @ \ + cmps.w -4096,$r10 @ \ + bhs 0f @ \ + nop @ \ + UNDOARGS_return_##args + +/* Ouch! We have to remember not to use "ret" in assembly-code. + ("Luckily", mnemonics are case-insensitive.) + Note that we assume usage is exactly: + PSEUDO (...) + ret + PSEUDO_END (...) + so we can put all payload into PSEUDO (except for error handling). */ + +#define ret + +#define PSEUDO_END(name) \ +0: @ \ + SETUP_PIC @ \ + PLTJUMP (syscall_error) @ \ + END (name) + +#define PSEUDO_NOERRNO(name, syscall_name, args) \ + ENTRY (name) @ \ + DOARGS_##args @ \ + movu.w SYS_ify (syscall_name),$r9 @ \ + break 13 @ \ + UNDOARGS_return_##args + +#define ret_NOERRNO + +#define PSEUDO_END_NOERRNO(name) \ + END (name) + +#define DOARGS_0 +#define DOARGS_1 +#define DOARGS_2 +#define DOARGS_3 +#define DOARGS_4 +#define DOARGS_5 \ + move [$sp],$mof + +/* To avoid allocating stack-space, we re-use the arg 5 (MOF) entry by + storing SRP into it. If called with too-few arguments, we will crash, + but that will happen in the general case too. */ +#define DOARGS_6 \ + DOARGS_5 @ \ + move $srp,[$sp] @ \ + move [$sp+4],$srp + +#define UNDOARGS_return_0 \ + Ret @ \ + nop + +#define UNDOARGS_return_1 UNDOARGS_return_0 +#define UNDOARGS_return_2 UNDOARGS_return_0 +#define UNDOARGS_return_3 UNDOARGS_return_0 +#define UNDOARGS_return_4 UNDOARGS_return_0 +#define UNDOARGS_return_5 UNDOARGS_return_0 + +/* We assume the following code will be "ret" and "PSEUDO_END". */ +#define UNDOARGS_return_return_6 \ + jump [$sp] + +#else /* not __ASSEMBLER__ */ + +#undef INLINE_SYSCALL +#define INLINE_SYSCALL(name, nr, args...) \ + ({ \ + unsigned long __sys_res; \ + register unsigned long __res asm ("r10"); \ + LOAD_ARGS_c_##nr (args) \ + register unsigned long __callno asm ("r9") \ + = SYS_ify (name); \ + asm volatile (LOAD_ARGS_asm_##nr (args) \ + "break 13" \ + : "=r" (__res) \ + : ASM_ARGS_##nr (args) \ + : ASM_CLOBBER_##nr); \ + __sys_res = __res; \ + \ + if (__sys_res >= (unsigned long) -4096) \ + { \ + __set_errno (- __sys_res); \ + __sys_res = (unsigned long) -1; \ + } \ + (long int) __sys_res; \ + }) + +#define LOAD_ARGS_c_0() +#define LOAD_ARGS_asm_0() +#define ASM_CLOBBER_0 "memory" +#define ASM_ARGS_0() "r" (__callno) + +#define LOAD_ARGS_c_1(r10) \ + LOAD_ARGS_c_0() \ + register unsigned long __r10 __asm__ ("r10") = (unsigned long) (r10); +#define LOAD_ARGS_asm_1(r10) LOAD_ARGS_asm_0 () +#define ASM_CLOBBER_1 ASM_CLOBBER_0 +#define ASM_ARGS_1(r10) ASM_ARGS_0 (), "0" (__r10) + +#define LOAD_ARGS_c_2(r10, r11) \ + LOAD_ARGS_c_1(r10) \ + register unsigned long __r11 __asm__ ("r11") = (unsigned long) (r11); +#define LOAD_ARGS_asm_2(r10, r11) LOAD_ARGS_asm_1 (r10) +#define ASM_CLOBBER_2 ASM_CLOBBER_1 +#define ASM_ARGS_2(r10, r11) ASM_ARGS_1 (r10), "r" (__r11) + +#define LOAD_ARGS_c_3(r10, r11, r12) \ + LOAD_ARGS_c_2(r10, r11) \ + register unsigned long __r12 __asm__ ("r12") = (unsigned long) (r12); +#define LOAD_ARGS_asm_3(r10, r11, r12) LOAD_ARGS_asm_2 (r10, r11) +#define ASM_CLOBBER_3 ASM_CLOBBER_2 +#define ASM_ARGS_3(r10, r11, r12) ASM_ARGS_2 (r10, r11), "r" (__r12) + +#define LOAD_ARGS_c_4(r10, r11, r12, r13) \ + LOAD_ARGS_c_3(r10, r11, r12) \ + register unsigned long __r13 __asm__ ("r13") = (unsigned long) (r13); +#define LOAD_ARGS_asm_4(r10, r11, r12, r13) LOAD_ARGS_asm_3 (r10, r11, r12) +#define ASM_CLOBBER_4 ASM_CLOBBER_3 +#define ASM_ARGS_4(r10, r11, r12, r13) ASM_ARGS_3 (r10, r11, r12), "r" (__r13) + +#define LOAD_ARGS_c_5(r10, r11, r12, r13, mof) \ + LOAD_ARGS_c_4(r10, r11, r12, r13) +#define LOAD_ARGS_asm_5(r10, r11, r12, r13, mof) \ + LOAD_ARGS_asm_4 (r10, r11, r12, r13) "move %6,$mof\n\t" +#define ASM_CLOBBER_5 ASM_CLOBBER_4 +#define ASM_ARGS_5(r10, r11, r12, r13, mof) \ + ASM_ARGS_4 (r10, r11, r12, r13), "g" (mof) + +#define LOAD_ARGS_c_6(r10, r11, r12, r13, mof, srp) \ + LOAD_ARGS_c_5(r10, r11, r12, r13, mof) +#define LOAD_ARGS_asm_6(r10, r11, r12, r13, mof, srp) \ + LOAD_ARGS_asm_5(r10, r11, r12, r13, mof) \ + "move %7,$srp\n\t" +#define ASM_CLOBBER_6 ASM_CLOBBER_5, "srp" +#define ASM_ARGS_6(r10, r11, r12, r13, mof, srp) \ + ASM_ARGS_5 (r10, r11, r12, r13, mof), "g" (srp) + +#endif /* not __ASSEMBLER__ */ diff --git a/ports/sysdeps/unix/sysv/linux/cris/vfork.S b/ports/sysdeps/unix/sysv/linux/cris/vfork.S new file mode 100644 index 000000000..74a855676 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/vfork.S @@ -0,0 +1,27 @@ +/* Copyright (C) 1999, 2001, 2002 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. */ + +#include <sysdep.h> + +PSEUDO (__vfork, vfork, 0) + Ret + nop +PSEUDO_END (__vfork) +libc_hidden_def (__vfork) + +weak_alias (__vfork, vfork) diff --git a/ports/sysdeps/unix/sysv/linux/cris/xstat.c b/ports/sysdeps/unix/sysv/linux/cris/xstat.c new file mode 100644 index 000000000..e9869f550 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/cris/xstat.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/linux/i386/xstat.c> diff --git a/ports/sysdeps/unix/sysv/minix/bits/sigaction.h b/ports/sysdeps/unix/sysv/minix/bits/sigaction.h new file mode 100644 index 000000000..4b04b7b55 --- /dev/null +++ b/ports/sysdeps/unix/sysv/minix/bits/sigaction.h @@ -0,0 +1,53 @@ +/* Copyright (C) 1992, 1996, 1997 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 _SIGNAL_H +# error "Never include <bits/sigaction.h> directly; use <signal.h> instead." +#endif + +/* Structure describing the action to be taken when a signal arrives. */ +struct sigaction + { + /* Signal handler. */ + __sighandler_t sa_handler; + + /* Additional set of signals to be blocked. */ + __sigset_t sa_mask; + + /* Special flags. */ + int sa_flags; + }; + +/* Bits in `sa_flags'. */ +#ifdef __USE_MISC +# define SA_ONSTACK 0x1 /* Take signal on signal stack. */ +# define SA_RESETHAND 0x2 /* Reset signal handler when signal caught. */ +# define SA_NODEFER 0x4 /* Don't block signal while catching it. */ +# define SA_RESTART 0x8 /* Restart syscall on signal return. */ +# define SA_SIGINFO 0x10 /* Extended signal handling. */ +# define SA_NOCLDWAIT 0x20 /* Don't create zombies. */ +# define SA_COMPAT 0x80 /* Internal flag for old signal catchers. */ +# define SA_DISABLE 0x100 /* Disable alternate signal stack. */ +#endif +#define SA_NOCLDSTOP 0x40 /* Don't send SIGCHLD when children stop. */ + + +/* Values for the HOW argument to `sigprocmask'. */ +#define SIG_BLOCK 0 /* Block signals. */ +#define SIG_UNBLOCK 1 /* Unblock signals. */ +#define SIG_SETMASK 2 /* Set the set of blocked signals. */ diff --git a/ports/sysdeps/unix/sysv/sco3.2.4/Dist b/ports/sysdeps/unix/sysv/sco3.2.4/Dist new file mode 100644 index 000000000..984b47334 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sco3.2.4/Dist @@ -0,0 +1 @@ +__setpgid.c diff --git a/ports/sysdeps/unix/sysv/sco3.2.4/Makefile b/ports/sysdeps/unix/sysv/sco3.2.4/Makefile new file mode 100644 index 000000000..a199ba900 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sco3.2.4/Makefile @@ -0,0 +1,17 @@ +ifeq (posix,$(subdir)) +sysdep_routines := $(sysdep_routines) pgrpsys sco_getgrp +endif + +ifeq (csu,$(subdir)) + +# SCO uses crt1.o, and expects that single initializer file to also start +# the .init and .fini sections as crti.o normally does. +start-installed-name = crt1.o +start-installed-name-rule = yes + +# Link together start.o and crti.o into the expected crt1.o. +# Now crt1.o as initializer and crtn.o as finalizer will work. +$(objpfx)crt1.o: $(objpfx)start.o $(objpfx)crti.o + $(CC) -nostdlib -nostartfiles -Wl,-r -o $@ $^ + +endif diff --git a/ports/sysdeps/unix/sysv/sco3.2.4/__setpgid.c b/ports/sysdeps/unix/sysv/sco3.2.4/__setpgid.c new file mode 100644 index 000000000..d51fa602c --- /dev/null +++ b/ports/sysdeps/unix/sysv/sco3.2.4/__setpgid.c @@ -0,0 +1,33 @@ +/* Copyright (C) 1994, 1997, 2002, 2004 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. */ + +#include <errno.h> +#include <unistd.h> +#include <sys/types.h> + +extern int __pgrpsys (int type, ...); + +/* Get the process group ID of process PID. */ +int +__setpgid (pid, pgid) + pid_t pid; + pid_t pgid; +{ + return __pgrpsys (2, pid, pgid); +} +libc_hidden_def (__setpgid) diff --git a/ports/sysdeps/unix/sysv/sco3.2.4/bits/confname.h b/ports/sysdeps/unix/sysv/sco3.2.4/bits/confname.h new file mode 100644 index 000000000..42e6ed0ea --- /dev/null +++ b/ports/sysdeps/unix/sysv/sco3.2.4/bits/confname.h @@ -0,0 +1,54 @@ +/* `sysconf', `pathconf', and `confstr' NAME values. Generic version. + Copyright (C) 1993, 1997 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 _UNISTD_H +# error "Never use <bits/confname.h> directly; include <unistd.h> instead." +#endif + +/* Values for the NAME argument to `pathconf' and `fpathconf'. */ +#define _PC_LINK_MAX 0 +#define _PC_MAX_CANON 1 +#define _PC_MAX_INPUT 2 +#define _PC_NAME_MAX 3 +#define _PC_PATH_MAX 4 +#define _PC_PIPE_BUF 5 +#define _PC_CHOWN_RESTRICTED 6 +#define _PC_NO_TRUNC 7 +#define _PC_VDISABLE 8 + +/* Values for the argument to `sysconf'. */ +#define _SC_ARG_MAX 0 +#define _SC_CHILD_MAX 1 +#define _SC_CLK_TCK 2 +#define _SC_NGROUPS_MAX 3 +#define _SC_OPEN_MAX 4 +#define _SC_JOB_CONTROL 5 +#define _SC_SAVED_IDS 6 +#define _SC_VERSION 7 +#define _SC_PASS_MAX 8 +#define _SC_XOPEN_VERSION 9 +#define _SC_TZNAME_MAX 666 /* Not handled by SCO's system call. */ + +#ifdef __USE_POSIX2 +/* Values for the NAME argument to `confstr'. */ +enum + { + _CS_PATH /* The default search path. */ + }; +#endif diff --git a/ports/sysdeps/unix/sysv/sco3.2.4/bits/sigaction.h b/ports/sysdeps/unix/sysv/sco3.2.4/bits/sigaction.h new file mode 100644 index 000000000..f08738855 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sco3.2.4/bits/sigaction.h @@ -0,0 +1,43 @@ +/* The proper definitions for SCO's sigaction. + Copyright (C) 1993, 1994, 1996, 1997 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 _SIGNAL_H +# error "Never include <bits/sigaction.h> directly; use <signal.h> instead." +#endif + +/* Structure describing the action to be taken when a signal arrives. */ +struct sigaction + { + /* Signal handler. */ + __sighandler_t sa_handler; + + /* Additional set of signals to be blocked. */ + __sigset_t sa_mask; + + /* Special flags. */ + int sa_flags; + }; + +/* Bits in `sa_flags'. */ +#define SA_NOCLDSTOP 0x01 /* Don't send SIGCHLD when children stop. */ + +/* Values for the HOW argument to `sigprocmask'. */ +#define SIG_SETMASK 0 /* Set the set of blocked signals. */ +#define SIG_BLOCK 1 /* Block signals. */ +#define SIG_UNBLOCK 2 /* Unblock signals. */ diff --git a/ports/sysdeps/unix/sysv/sco3.2.4/getgroups.c b/ports/sysdeps/unix/sysv/sco3.2.4/getgroups.c new file mode 100644 index 000000000..2aac40bdd --- /dev/null +++ b/ports/sysdeps/unix/sysv/sco3.2.4/getgroups.c @@ -0,0 +1,45 @@ +/* Copyright (C) 1994, 1995, 1997, 2004 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. */ + +#include <sys/types.h> +#include <unistd.h> +#include <limits.h> +#include <alloca.h> + +extern int __sco_getgroups (int size, unsigned short int *list); + +int +__getgroups (size, list) + int size; gid_t *list; +{ + int i; + unsigned short int *shortlist; + + if (size <= 0) + return __sco_getgroups (size, NULL); + + shortlist = __alloca (size * sizeof (*shortlist)); + + size = __sco_getgroups (size, shortlist); + for (i = 0; i < size; ++i) + list[i] = shortlist[i]; + + return size; +} + +weak_alias (__getgroups, getgroups) diff --git a/ports/sysdeps/unix/sysv/sco3.2.4/getpgid.c b/ports/sysdeps/unix/sysv/sco3.2.4/getpgid.c new file mode 100644 index 000000000..3b47d9dee --- /dev/null +++ b/ports/sysdeps/unix/sysv/sco3.2.4/getpgid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/sysv4/getpgid.c> diff --git a/ports/sysdeps/unix/sysv/sco3.2.4/setpgid.c b/ports/sysdeps/unix/sysv/sco3.2.4/setpgid.c new file mode 100644 index 000000000..cc9c4cd61 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sco3.2.4/setpgid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/sysv4/setpgid.c> diff --git a/ports/sysdeps/unix/sysv/sco3.2.4/setsid.c b/ports/sysdeps/unix/sysv/sco3.2.4/setsid.c new file mode 100644 index 000000000..633765255 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sco3.2.4/setsid.c @@ -0,0 +1 @@ +#include <sysdeps/unix/sysv/sysv4/setsid.c> diff --git a/ports/sysdeps/unix/sysv/sco3.2.4/sigaction.S b/ports/sysdeps/unix/sysv/sco3.2.4/sigaction.S new file mode 100644 index 000000000..ae50c17d9 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sco3.2.4/sigaction.S @@ -0,0 +1,30 @@ +/* Copyright (C) 1993, 1994, 1995, 1997, 2002 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. */ + +#include <sysdep.h> + +.globl C_SYMBOL_NAME(__sigreturn) + +ENTRY (__sigaction) + movl $C_SYMBOL_NAME(__sigreturn), %ecx + DO_CALL (sigaction, 3) + jb syscall_error + ret + +libc_hidden_def (__sigaction) +weak_alias (__sigaction, sigaction) diff --git a/ports/sysdeps/unix/sysv/sco3.2.4/sys/syscall.h b/ports/sysdeps/unix/sysv/sco3.2.4/sys/syscall.h new file mode 100644 index 000000000..05bbb89f3 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sco3.2.4/sys/syscall.h @@ -0,0 +1,125 @@ +/* Copyright (C) 1994, 1996 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. */ + +/* From Scott Bartram. */ + +#ifndef _SYSCALL_H +#define _SYSCALL_H + +#define SYS_access 33 +#define SYS_acct 51 +#define SYS_advfs 70 +#define SYS_alarm 27 +#define SYS_break 17 +#define SYS_brk 17 +#define SYS_chdir 12 +#define SYS_chmod 15 +#define SYS_chown 16 +#define SYS_chroot 61 +#define SYS_chsize 0x0a28 +#define SYS_close 6 +#define SYS_creat 8 +#define SYS_dup 41 +#define SYS_exec 11 +#define SYS_exece 59 +#define SYS_exit 1 +#define SYS_fcntl 62 +#define SYS_fork 2 +#define SYS_fpathconf 0x2f28 +#define SYS_fstat 28 +#define SYS_fstatfs 38 +#define SYS_ftime 0x0b28 +#define SYS_getdents 81 +#define SYS_getgid 47 +#define SYS_getgroups 0x2b28 +#define SYS_getitimer 0x3728 +#define SYS_getmsg 85 +#define SYS_getpid 20 +#define SYS_getuid 24 +#define SYS_gtty 32 +#define SYS_ioctl 54 +#define SYS_kill 37 +#define SYS_link 9 +#define SYS_lock 45 +#define SYS_lseek 19 +#define SYS_lstat 91 +#define SYS_mkdir 80 +#define SYS_mknod 14 +#define SYS_mount 21 +#define SYS_msgsys 49 +#define SYS_nap 0x0c28 +#define SYS_nice 34 +#define SYS_open 5 +#define SYS_pathconf 0x2e28 +#define SYS_pause 29 +#define SYS_pgrpsys 39 +#define SYS_pipe 42 +#define SYS_plock 45 +#define SYS_poll 87 +#define SYS_prof 44 +#define SYS_ptrace 26 +#define SYS_putmsg 86 +#define SYS_rdebug 76 +#define SYS_read 3 +#define SYS_readlink 92 +#define SYS_rename 0x3028 +#define SYS_rfstart 74 +#define SYS_rfstop 77 +#define SYS_rfsys 78 +#define SYS_rmdir 79 +#define SYS_rmount 72 +#define SYS_rumount 73 +#define SYS_seek 19 +#define SYS_select 0x2428 +#define SYS_semsys 53 +#define SYS_setgid 46 +#define SYS_setgroups 0x2c28 +#define SYS_setitimer 0x3828 +#define SYS_setpgrp 39 +#define SYS_setuid 23 +#define SYS_shmsys 52 +#define SYS_sigaction 0x2728 +#define SYS_signal 48 +#define SYS_sigpending 0x2928 +#define SYS_sigprocmask 0x2828 +#define SYS_sigsuspend 0x2a28 +#define SYS_stat 18 +#define SYS_statfs 35 +#define SYS_stime 25 +#define SYS_stty 31 +#define SYS_symlink 90 +#define SYS_sync 36 +#define SYS_sys3b 50 +#define SYS_sysacct 51 +#define SYS_sysconf 0x2d28 +#define SYS_sysfs 84 +#define SYS_sysi86 50 +#define SYS_time 13 +#define SYS_times 43 +#define SYS_uadmin 55 +#define SYS_ulimit 63 +#define SYS_umask 60 +#define SYS_umount 22 +#define SYS_unadvfs 71 +#define SYS_unlink 10 +#define SYS_utime 30 +#define SYS_utssys 57 +#define SYS_wait 7 +#define SYS_write 4 + +#endif diff --git a/ports/sysdeps/unix/sysv/sco3.2.4/syscalls.list b/ports/sysdeps/unix/sysv/sco3.2.4/syscalls.list new file mode 100644 index 000000000..bda6c16c7 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sco3.2.4/syscalls.list @@ -0,0 +1,8 @@ +# File name Caller Syscall name # args Strong name Weak names + +pathconf - pathconf 2 __pathconf pathconf +pgrpsys - pgrpsys 3 __pgrpsys +sco_getgrp getgroups getgroups 2 __sco_getgroups +sigpending - sigpending 1 sigpending +sigprocmask - sigprocmask 3 __sigprocmask sigprocmask +sigsuspend - sigsuspend 1 sigsuspend diff --git a/ports/sysdeps/unix/sysv/sco3.2.4/sysconf.S b/ports/sysdeps/unix/sysv/sco3.2.4/sysconf.S new file mode 100644 index 000000000..9780bd488 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sco3.2.4/sysconf.S @@ -0,0 +1,30 @@ +/* Copyright (C) 1993, 1994, 1995, 1997 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. */ + +#include <sysdep.h> +#include <bits/confname.h> + +.globl __tzname_max +ENTRY (__sysconf) + cmpl $_SC_TZNAME_MAX, 4(%esp) /* Is the arg _SC_TZNAME_MAX? */ + je tzname + DO_CALL (sysconf, 1) /* No; use the SCO system call. */ + ret +tzname: jmp C_SYMBOL_NAME(__tzname_max) /* Yes; bounce to __tzname_max (). */ + +weak_alias (__sysconf, sysconf) diff --git a/ports/sysdeps/unix/sysv/sco3.2.4/system.c b/ports/sysdeps/unix/sysv/sco3.2.4/system.c new file mode 100644 index 000000000..06dc066b8 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sco3.2.4/system.c @@ -0,0 +1,10 @@ +/* SCO has a bug where `waitpid' will never return if SIGCHLD is blocked. + They have acknowledged that this is a bug but I have not seen nor heard + of any forthcoming fix. */ + +#define WAITPID_CANNOT_BLOCK_SIGCHLD + +/* SCO 3.2v4 does have `waitpid'. + Avoid unix/system.c, which says we don't. */ + +#include <sysdeps/posix/system.c> diff --git a/ports/sysdeps/unix/sysv/sco3.2.4/uname.S b/ports/sysdeps/unix/sysv/sco3.2.4/uname.S new file mode 100644 index 000000000..bc61089d6 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sco3.2.4/uname.S @@ -0,0 +1,41 @@ +/* Copyright (C) 1993, 1994, 1997 Free Software Foundation, Inc. + Contributed by Scott Bartram. + 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. */ + +#include <sysdep.h> + +/* + before lcall, stack contents should be: + + 4(%esp) -> name + 8(%esp) -> unspecified + 12(%esp) -> 0 + */ + +ENTRY (uname) + pushl $0x0 /* Push the discriminator flag. */ + pushl $0x0 /* Push dummy placeholder. */ + pushl 12(%esp,1) /* Push NAME (ptr to struct utsname) */ + subl $0x4, %esp /* Adjust stack pointer. */ + DO_CALL (utssys, 3) + jb error /* Test for error. */ + addl $0x10, %esp /* Adjust the stack pointer. */ + xorl %eax, %eax /* Clear return value. */ + ret +error: addl $0x10, %esp /* Adjust the stack pointer. */ + jmp syscall_error diff --git a/ports/sysdeps/unix/sysv/sco3.2.4/waitpid.S b/ports/sysdeps/unix/sysv/sco3.2.4/waitpid.S new file mode 100644 index 000000000..ccbc81274 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sco3.2.4/waitpid.S @@ -0,0 +1,37 @@ +/* Copyright (C) 1993,94,95,97,2002 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. */ + +#include <sysdep.h> + +ENTRY (__waitpid) + /* The `waitpid' system call is distinguished from plain + `wait' by setting lots of bits in the processor flags. */ + pushfl /* Push the flags word. */ + popl %eax /* Pop it into the accumulator. */ + orl $0x8c4, %eax /* Set lots of bits. */ + pushl %eax /* Push the new flags word. */ + popfl /* Pop it into the flags. */ + DO_CALL (wait, 2) + movl 8(%esp), scratch /* Put status pointer in scratch register. */ + testl scratch, scratch /* Is it non-nil? */ + je null + movl r1, (scratch) /* Yes; store the status there. */ +null: ret + +libc_hidden_def (__waitpid) +weak_alias (__waitpid, waitpid) diff --git a/ports/sysdeps/unix/sysv/sco3.2/Dist b/ports/sysdeps/unix/sysv/sco3.2/Dist new file mode 100644 index 000000000..60fab2bde --- /dev/null +++ b/ports/sysdeps/unix/sysv/sco3.2/Dist @@ -0,0 +1 @@ +__fltused.c diff --git a/ports/sysdeps/unix/sysv/sco3.2/Makefile b/ports/sysdeps/unix/sysv/sco3.2/Makefile new file mode 100644 index 000000000..c4d9da7a0 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sco3.2/Makefile @@ -0,0 +1,23 @@ +# Copyright (C) 1993, 1997 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. + +ifeq ($(subdir),misc) + +sysdep_routines := $(sysdep_routines) __fltused + +endif diff --git a/ports/sysdeps/unix/sysv/sco3.2/__fltused.c b/ports/sysdeps/unix/sysv/sco3.2/__fltused.c new file mode 100644 index 000000000..5d1d67f0b --- /dev/null +++ b/ports/sysdeps/unix/sysv/sco3.2/__fltused.c @@ -0,0 +1,3 @@ +/* Code compiled by the SCO compiler apparently likes this to be defined. */ + +int __fltused = 1; diff --git a/ports/sysdeps/unix/sysv/sco3.2/bits/local_lim.h b/ports/sysdeps/unix/sysv/sco3.2/bits/local_lim.h new file mode 100644 index 000000000..b4141d0db --- /dev/null +++ b/ports/sysdeps/unix/sysv/sco3.2/bits/local_lim.h @@ -0,0 +1,37 @@ +/* Copyright (C) 1993, 1996 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 _BITS_LOCAL_LIM_H +#define _BITS_LOCAL_LIM_H 1 + +#define NGROUPS_MAX 8 /* Maximum number of supplementary groups. */ +#define ARG_MAX 5120 +#define CHILD_MAX 25 +#define OPEN_MAX 60 +#define LINK_MAX 1000 +#define MAX_CANON 256 + +/* For SVR3, this is 14. For SVR4, it is 255, at least on ufs + file systems, even though the System V limits.h incorrectly + defines it as 14. Giving it a value which is too large + is harmless (it is a maximum). */ +#define NAME_MAX 255 + +#define PATH_MAX 1024 + +#endif /* bits/local_lim.h */ diff --git a/ports/sysdeps/unix/sysv/sysv4/Dist b/ports/sysdeps/unix/sysv/sysv4/Dist new file mode 100644 index 000000000..639506450 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/Dist @@ -0,0 +1,4 @@ +__getpgid.c +__setpgid.c +sysconfig.h +siginfo.h diff --git a/ports/sysdeps/unix/sysv/sysv4/Implies b/ports/sysdeps/unix/sysv/sysv4/Implies new file mode 100644 index 000000000..953822ea4 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/Implies @@ -0,0 +1,3 @@ +# The directory unix/common contains things which are common to both BSD +# and SVR4. +unix/common diff --git a/ports/sysdeps/unix/sysv/sysv4/Makefile b/ports/sysdeps/unix/sysv/sysv4/Makefile new file mode 100644 index 000000000..6f7155c71 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/Makefile @@ -0,0 +1,29 @@ +# Copyright (C) 1992, 1993, 1995, 1996, 1997 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. + +ifeq ($(subdir),posix) + +sysdep_routines := $(sysdep_routines) sysconfig pgrpsys __waitid + +endif + +ifeq ($(subdir),misc) + +sysdep_routines := $(sysdep_routines) sysinfo + +endif diff --git a/ports/sysdeps/unix/sysv/sysv4/__getpgid.c b/ports/sysdeps/unix/sysv/sysv4/__getpgid.c new file mode 100644 index 000000000..74ca3e0f9 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/__getpgid.c @@ -0,0 +1,33 @@ +/* Copyright (C) 1993, 1997, 2002, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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. */ + +#include <errno.h> +#include <unistd.h> +#include <sys/types.h> + +extern int __pgrpsys (int type, ...); + +/* Get the process group ID of process PID. */ +int +__getpgid (pid) + pid_t pid; +{ + return __pgrpsys (4, pid); +} +libc_hidden_def (__getpgid) diff --git a/ports/sysdeps/unix/sysv/sysv4/__setpgid.c b/ports/sysdeps/unix/sysv/sysv4/__setpgid.c new file mode 100644 index 000000000..36ad5cc77 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/__setpgid.c @@ -0,0 +1,34 @@ +/* Copyright (C) 1993, 1997, 2002, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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. */ + +#include <errno.h> +#include <unistd.h> +#include <sys/types.h> + +extern int __pgrpsys (int type, ...); + +/* Get the process group ID of process PID. */ +int +__setpgid (pid, pgid) + pid_t pid; + pid_t pgid; +{ + return __pgrpsys (5, pid, pgid); +} +libc_hidden_def (__setpgid) diff --git a/ports/sysdeps/unix/sysv/sysv4/bits/sigaction.h b/ports/sysdeps/unix/sysv/sysv4/bits/sigaction.h new file mode 100644 index 000000000..faf07e5ff --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/bits/sigaction.h @@ -0,0 +1,55 @@ +/* The proper definitions for SVR4's sigaction. + Copyright (C) 1993, 1994, 1996, 1997 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 _SIGNAL_H +# error "Never include <bits/sigaction.h> directly; use <signal.h> instead." +#endif + +/* Structure describing the action to be taken when a signal arrives. */ +struct sigaction + { + /* Special flags. */ + int sa_flags; + + /* Signal handler. */ + __sighandler_t sa_handler; + + /* Additional set of signals to be blocked. */ + __sigset_t sa_mask; + + /* Padding. */ + int sa_resv[2]; + }; + +/* Bits in `sa_flags'. */ +#ifdef __USE_MISC +# define SA_ONSTACK 0x1 /* Take signal on signal stack. */ +# define SA_RESETHAND 0x2 /* Reset to SIG_DFL on entry to handler. */ +# define SA_RESTART 0x4 /* Restart syscall on signal return. */ +# define SA_SIGINFO 0x8 /* Provide additional info to the handler. */ +# define SA_NODEFER 0x10 /* Don't automatically block the signal when + its handler is being executed. */ +# define SA_NOCLDWAIT 0x10000 /* Don't save zombie processes. */ +#endif +#define SA_NOCLDSTOP 0x20000 /* Don't send SIGCHLD when children stop. */ + +/* Values for the HOW argument to `sigprocmask'. */ +#define SIG_BLOCK 1 /* Block signals. */ +#define SIG_UNBLOCK 2 /* Unblock signals. */ +#define SIG_SETMASK 3 /* Set the set of blocked signals. */ diff --git a/ports/sysdeps/unix/sysv/sysv4/bits/signum.h b/ports/sysdeps/unix/sysv/sysv4/bits/signum.h new file mode 100644 index 000000000..07f900a78 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/bits/signum.h @@ -0,0 +1,66 @@ +/* Signal number definitions. SVR4 version. + Copyright (C) 1994, 1996 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. */ + +#ifdef _SIGNAL_H + +/* Fake signal functions. */ +#define SIG_ERR ((__sighandler_t) -1) /* Error return. */ +#define SIG_DFL ((__sighandler_t) 0) /* Default action. */ +#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */ + + +/* Signals. */ +#define SIGHUP 1 /* Hangup (POSIX). */ +#define SIGINT 2 /* Interrupt (ANSI). */ +#define SIGQUIT 3 /* Quit (POSIX). */ +#define SIGILL 4 /* Illegal instruction (ANSI). */ +#define SIGABRT SIGIOT /* Abort (ANSI). */ +#define SIGTRAP 5 /* Trace trap (POSIX). */ +#define SIGIOT 6 /* IOT trap (4.2 BSD). */ +#define SIGEMT 7 /* EMT trap (4.2 BSD). */ +#define SIGFPE 8 /* Floating-point exception (ANSI). */ +#define SIGKILL 9 /* Kill, unblockable (POSIX). */ +#define SIGBUS 10 /* Bus error (4.2 BSD). */ +#define SIGSEGV 11 /* Segmentation violation (ANSI). */ +#define SIGSYS 12 /* Bad argument to system call (4.2 BSD)*/ +#define SIGPIPE 13 /* Broken pipe (POSIX). */ +#define SIGALRM 14 /* Alarm clock (POSIX). */ +#define SIGTERM 15 /* Termination (ANSI). */ +#define SIGUSR1 16 /* User-defined signal 1 (POSIX). */ +#define SIGUSR2 17 /* User-defined signal 2 (POSIX). */ +#define SIGCHLD 18 /* Child status has changed (POSIX). */ +#define SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */ +#define SIGPWR 19 /* Power failure restart (System V). */ +#define SIGWINCH 20 /* Window size change (4.3 BSD, Sun). */ +#define SIGURG 21 /* Urgent condition on socket (4.2 BSD).*/ +#define SIGPOLL 22 /* Pollable event occurred (System V). */ +#define SIGIO SIGPOLL /* I/O now possible (4.2 BSD). */ +#define SIGSTOP 23 /* Stop, unblockable (POSIX). */ +#define SIGTSTP 24 /* Keyboard stop (POSIX). */ +#define SIGCONT 25 /* Continue (POSIX). */ +#define SIGTTIN 26 /* Background read from tty (POSIX). */ +#define SIGTTOU 27 /* Background write to tty (POSIX). */ +#define SIGVTALRM 28 /* Virtual alarm clock (4.2 BSD). */ +#define SIGPROF 29 /* Profiling alarm clock (4.2 BSD). */ +#define SIGXCPU 30 /* CPU limit exceeded (4.2 BSD). */ +#define SIGXFSZ 31 /* File size limit exceeded (4.2 BSD). */ + +#endif /* <signal.h> included. */ + +#define _NSIG 32 /* Biggest signal number + 1. */ diff --git a/ports/sysdeps/unix/sysv/sysv4/bits/sigset.h b/ports/sysdeps/unix/sysv/sysv4/bits/sigset.h new file mode 100644 index 000000000..9093c7295 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/bits/sigset.h @@ -0,0 +1,98 @@ +/* __sig_atomic_t, __sigset_t, and related definitions. SVR4 version. + Copyright (C) 1994-1996, 2002 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 _SIGSET_H_types +#define _SIGSET_H_types 1 + +typedef int __sig_atomic_t; + +/* A `sigset_t' has a bit for each signal. */ +typedef struct + { + unsigned long int __sigbits[4]; + } __sigset_t; + +#endif /* ! _SIGSET_H_types */ + +/* We only want to define these functions if <signal.h> was actually + included; otherwise we were included just to define the types. Since we + are namespace-clean, it wouldn't hurt to define extra macros. But + trouble can be caused by functions being defined (e.g., any global + register vars declared later will cause compilation errors). */ + +#if !defined (_SIGSET_H_fns) && defined (_SIGNAL_H) +#define _SIGSET_H_fns 1 + +/* Return a mask that includes SIG only. */ +#define __sigmask(sig) (1 << ((sig) - 1)) + + +/* It's easier to assume 8-bit bytes than to get CHAR_BIT. */ +#define __NSSBITS (sizeof (unsigned long int) * 8) +#define __SSELT(s) ((s) / __NSSBITS) +#define __SSMASK(s) (1 << ((s) % __NSSBITS)) + +#ifdef __USE_EXTERN_INLINES +# ifndef _EXTERN_INLINE +# define _EXTERN_INLINE extern __inline +# endif + +_EXTERN_INLINE int +__sigemptyset (__sigset_t *__set) +{ + __set->__sigbits[0] = __set->__sigbits[1] = + __set->__sigbits[2] = __set->__sigbits[3] = 0L; + return 0; +} + +_EXTERN_INLINE int +__sigfillset (__sigset_t *__set) +{ + /* SVR4 has a system call for `sigfillset' (!), and it only sets the bits + for signals [1,31]. Setting bits for unimplemented signals seems + harmless (and we will find out if it really is). */ + __set->__sigbits[0] = __set->__sigbits[1] = + __set->__sigbits[2] = __set->__sigbits[3] = ~0L; + return 0; +} + +_EXTERN_INLINE int +__sigaddset (__sigset_t *__set, int __sig) +{ + __set->__sigbits[__SSELT (__sig)] |= __SSMASK (__sig); + return 0; +} + +_EXTERN_INLINE int +__sigdelset (__sigset_t *__set, int __sig) +{ + __set->__sigbits[__SSELT (__sig)] &= ~__SSMASK (__sig); + return 0; +} + +_EXTERN_INLINE int +__sigismember (__const __sigset_t *__set, int __sig) +{ + if (__set->__sigbits[__SSELT (__sig)] & __SSMASK (__sig)) + return 1; + return 0; +} +#endif /* use extern inlines. */ + +#endif /* ! _SIGSET_H_fns */ diff --git a/ports/sysdeps/unix/sysv/sysv4/bits/utsname.h b/ports/sysdeps/unix/sysv/sysv4/bits/utsname.h new file mode 100644 index 000000000..891ae6862 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/bits/utsname.h @@ -0,0 +1,23 @@ +/* Copyright (C) 1995, 1996, 1997, 1998 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 _SYS_UTSNAME_H +# error "Never include <bits/utsname.h> directly; use <sys/utsname.h> instead." +#endif + +#define _UTSNAME_LENGTH 257 diff --git a/ports/sysdeps/unix/sysv/sysv4/bits/waitflags.h b/ports/sysdeps/unix/sysv/sysv4/bits/waitflags.h new file mode 100644 index 000000000..40bc823de --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/bits/waitflags.h @@ -0,0 +1,34 @@ +/* Definitions of flag bits for `waitpid' et al. + Copyright (C) 1993, 1996, 1997, 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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. */ + +#if !defined _SYS_WAIT_H && !defined _STDLIB_H +# error "Never include <bits/waitflags.h> directly; use <sys/wait.h> instead." +#endif + + +/* Bits in the third argument to `waitpid'. */ +#define WNOHANG 64 /* Don't block waiting. */ +#define WUNTRACED 4 /* Report status of stopped children. */ + +#ifdef __USE_SVID +# define WEXITED 1 /* Look for children that have exited. */ +# define WTRAPPED 2 /* Look for processes that stopped + while tracing. */ +#endif diff --git a/ports/sysdeps/unix/sysv/sysv4/dup2.c b/ports/sysdeps/unix/sysv/sysv4/dup2.c new file mode 100644 index 000000000..7d36e0e35 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/dup2.c @@ -0,0 +1,2 @@ +/* SVR4 uses the POSIX dup2. */ +#include <sysdeps/posix/dup2.c> diff --git a/ports/sysdeps/unix/sysv/sysv4/ftruncate.c b/ports/sysdeps/unix/sysv/sysv4/ftruncate.c new file mode 100644 index 000000000..47e040eb2 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/ftruncate.c @@ -0,0 +1,37 @@ +/* ftruncate for SVR4 using the fcntl F_FREESP command. + Copyright (C) 1995, 1997 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. */ + +#include <sys/types.h> +#include <unistd.h> +#include <fcntl.h> +#include <string.h> + +/* Truncate the file FD refers to to LENGTH bytes. */ +int +ftruncate (fd, length) + int fd; + off_t length; +{ + struct flock fl; + + memset (&fl, 0, sizeof fl); + fl.l_type = F_WRLCK; + fl.l_start = length; + return fcntl (fd, F_FREESP, &fl); +} diff --git a/ports/sysdeps/unix/sysv/sysv4/gethostname.c b/ports/sysdeps/unix/sysv/sysv4/gethostname.c new file mode 100644 index 000000000..4a058b51c --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/gethostname.c @@ -0,0 +1,35 @@ +/* Copyright (C) 1994, 1995, 1997, 2000, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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. */ + +#include <errno.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/systeminfo.h> + +extern int __sysinfo (int command, char *buf, long int count); + +int +__gethostname (name, namelen) + char *name; + size_t namelen; +{ + return __sysinfo (SI_HOSTNAME, name, namelen); +} + +weak_alias (__gethostname, gethostname) diff --git a/ports/sysdeps/unix/sysv/sysv4/getpagesize.c b/ports/sysdeps/unix/sysv/sysv4/getpagesize.c new file mode 100644 index 000000000..611964075 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/getpagesize.c @@ -0,0 +1,2 @@ +/* Solaris uses sysconf ala POSIX.1. */ +#include <sysdeps/posix/getpagesize.c> diff --git a/ports/sysdeps/unix/sysv/sysv4/getpgid.c b/ports/sysdeps/unix/sysv/sysv4/getpgid.c new file mode 100644 index 000000000..95f96417c --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/getpgid.c @@ -0,0 +1,32 @@ +/* Copyright (C) 1993,1995,1997,1999,2002,2004 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. */ + +#include <unistd.h> +#include <sys/types.h> + +extern pid_t __pgrpsys (int type, ...); + +/* Get the process group ID of process PID. */ +pid_t +__getpgid (pid) + pid_t pid; +{ + return __pgrpsys (4, pid); +} +libc_hidden_def (__getpgid) +weak_alias (__getpgid, getpgid) diff --git a/ports/sysdeps/unix/sysv/sysv4/i386/Dist b/ports/sysdeps/unix/sysv/sysv4/i386/Dist new file mode 100644 index 000000000..69d16ac6b --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/i386/Dist @@ -0,0 +1 @@ +sys-sig.S diff --git a/ports/sysdeps/unix/sysv/sysv4/i386/Makefile b/ports/sysdeps/unix/sysv/sysv4/i386/Makefile new file mode 100644 index 000000000..56f0a37de --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/i386/Makefile @@ -0,0 +1,3 @@ +ifeq ($(subdir),signal) +sysdep_routines := $(sysdep_routines) sys-sig +endif diff --git a/ports/sysdeps/unix/sysv/sysv4/i386/bits/stat.h b/ports/sysdeps/unix/sysv/sysv4/i386/bits/stat.h new file mode 100644 index 000000000..c1016a922 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/i386/bits/stat.h @@ -0,0 +1,93 @@ +/* Copyright (C) 1993, 1996, 1997, 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 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 _SYS_STAT_H +# error "Never include <bits/stat.h> directly; use <sys/stat.h> instead." +#endif + +#include <bits/types.h> + +/* Versions of the `struct stat' data structure and + the bits of the `xmknod' interface. */ +#define _STAT_VER 2 +#define _MKNOD_VER 2 + +/* Structure describing file characteristics. */ +struct stat + { + unsigned long itn st_dev; /* Device. */ + long int st_filler1[3]; + unsigned long int st_ino; /* File serial number. */ + unsigned long int st_mode; /* File mode. */ + unsigned long int st_nlink; /* Link count. */ + long int st_uid; /* User ID of the file's owner. */ + long int st_gid; /* Group ID of the file's group.*/ + unsigned long int st_rdev; /* Device number, if device. */ + long int st_filler2[2]; + + long int st_size; /* Size of file, in bytes. */ + /* SVR4 added this extra long to allow for expansion of off_t. */ + long int st_filler3; + + long int st_atime; /* Time of last access. */ + unsigned long int st_atime_usec; + long int st_mtime; /* Time of last modification. */ + unsigned long int st_mtime_usec; + long int st_ctime; /* Time of last status change. */ + unsigned long int st_ctime_usec; + + __blksize_t st_blksize; /* Optimal block size for I/O. */ +#define _STATBUF_ST_BLKSIZE /* Tell code we have this member. */ + + __blkcnt_t st_blocks; /* Number of 512-byte blocks allocated. */ + char st_fstype[16]; /* The type of this filesystem. */ + int st_aclcnt; + unsigned long int st_level; + unsigned long int st_flags; + unsigned long int st_cmwlevel; + long int st_filler4[4]; + }; + +/* Encoding of the file mode. */ + +#define __S_IFMT 0170000 /* These bits determine file type. */ + +/* File types. */ +#define __S_IFDIR 0040000 /* Directory. */ +#define __S_IFCHR 0020000 /* Character device. */ +#define __S_IFBLK 0060000 /* Block device. */ +#define __S_IFREG 0100000 /* Regular file. */ +#define __S_IFIFO 0010000 /* FIFO. */ + +/* These don't actually exist on System V, but having them doesn't hurt. */ +#define __S_IFLNK 0120000 /* Symbolic link. */ +#define __S_IFSOCK 0140000 /* Socket. */ + +/* POSIX.1b objects. */ +#define __S_TYPEISMQ(buf) (0) +#define __S_TYPEISSEM(buf) (0) +#define __S_TYPEISSHM(buf) (0) + +/* Protection bits. */ + +#define __S_ISUID 04000 /* Set user ID on execution. */ +#define __S_ISGID 02000 /* Set group ID on execution. */ +#define __S_ISVTX 01000 /* Save swapped text after use (sticky). */ +#define __S_IREAD 0400 /* Read by owner. */ +#define __S_IWRITE 0200 /* Write by owner. */ +#define __S_IEXEC 0100 /* Execute by owner. */ diff --git a/ports/sysdeps/unix/sysv/sysv4/i386/sys-sig.S b/ports/sysdeps/unix/sysv/sysv4/i386/sys-sig.S new file mode 100644 index 000000000..6e2d1abde --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/i386/sys-sig.S @@ -0,0 +1,30 @@ +/* Copyright (C) 1994, 1997 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. */ + +#include <sysdep.h> + +.globl C_SYMBOL_NAME(__sigreturn) + +ENTRY (__sigaction_syscall) + movl $C_SYMBOL_NAME(__sigreturn), %edx + DO_CALL (sigaction, 3) + jb syscall_error + ret + +PSEUDO (__context_syscall, context, 2) + ret diff --git a/ports/sysdeps/unix/sysv/sysv4/i386/syscalls.list b/ports/sysdeps/unix/sysv/sysv4/i386/syscalls.list new file mode 100644 index 000000000..560cd8366 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/i386/syscalls.list @@ -0,0 +1,6 @@ +# File name Caller Syscall name # args Strong name Weak names + +xstat - xstat 3 __xstat _xstat +fxstat - fxstat 3 __fxstat _fxstat +lxstat - lxstat 3 __lxstat _lxstat +xmknod - xmknod 4 __xmknod _xmknod diff --git a/ports/sysdeps/unix/sysv/sysv4/i386/sysdep.h b/ports/sysdeps/unix/sysv/sysv4/i386/sysdep.h new file mode 100644 index 000000000..daecdb622 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/i386/sysdep.h @@ -0,0 +1,38 @@ +/* Copyright (C) 1994, 1997 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. */ + +#include <sysdeps/unix/sysv/i386/sysdep.h> + +/* In SVR4 some system calls can fail with the error ERESTART, + and this means the call should be retried. */ + +#ifndef _ERRNO_H +#define _ERRNO_H +#endif +#include <bits/errno.h> + +#undef PSEUDO +#define PSEUDO(name, syscall_name, args) \ + .globl syscall_error; \ + ENTRY (name) \ + DO_CALL (syscall_name, args); \ + jae noerror; \ + cmpb $ERESTART, %al; \ + je C_SYMBOL_NAME (name); \ + jmp syscall_error; \ + noerror: diff --git a/ports/sysdeps/unix/sysv/sysv4/i386/vfork.S b/ports/sysdeps/unix/sysv/sysv4/i386/vfork.S new file mode 100644 index 000000000..bbe99fbc4 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/i386/vfork.S @@ -0,0 +1 @@ +#include <sysdeps/unix/bsd/i386/vfork.S> diff --git a/ports/sysdeps/unix/sysv/sysv4/sethostname.c b/ports/sysdeps/unix/sysv/sysv4/sethostname.c new file mode 100644 index 000000000..d74b0f4f3 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/sethostname.c @@ -0,0 +1,33 @@ +/* Copyright (C) 1994, 1997, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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. */ + +#include <errno.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/systeminfo.h> + +extern int __sysinfo (int command, const char *buf, long count); + +int +sethostname (name, namelen) + const char *name; + size_t namelen; +{ + return __sysinfo (SI_SET_HOSTNAME, name, namelen); +} diff --git a/ports/sysdeps/unix/sysv/sysv4/setpgid.c b/ports/sysdeps/unix/sysv/sysv4/setpgid.c new file mode 100644 index 000000000..80f4ad643 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/setpgid.c @@ -0,0 +1,34 @@ +/* Copyright (C) 1993,1995-1997,1999,2002,2004 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. */ + +#include <errno.h> +#include <unistd.h> + +extern int __pgrpsys (pid_t type, ...); + +/* Set the process group ID of the process matching PID to PGID. + If PID is zero, the current process's process group ID is set. + If PGID is zero, the process ID of the process is used. */ +int +__setpgid (pid, pgid) + pid_t pid, pgid; +{ + return __pgrpsys (5, pid, pgid); +} +libc_hidden_def (__setpgid) +weak_alias (__setpgid, setpgid) diff --git a/ports/sysdeps/unix/sysv/sysv4/setsid.c b/ports/sysdeps/unix/sysv/sysv4/setsid.c new file mode 100644 index 000000000..faa2c42d7 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/setsid.c @@ -0,0 +1,33 @@ +/* Copyright (C) 1993, 1995, 1997, 1999, 2004 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. */ + +#include <errno.h> +#include <unistd.h> + +extern pid_t __pgrpsys (int type, ...); + +/* Create a new session with the calling process as its leader. + The process group IDs of the session and the calling process + are set to the process ID of the calling process, which is returned. */ +pid_t +__setsid () +{ + return __pgrpsys (3); +} + +weak_alias (__setsid, setsid) diff --git a/ports/sysdeps/unix/sysv/sysv4/sigaction.c b/ports/sysdeps/unix/sysv/sysv4/sigaction.c new file mode 100644 index 000000000..d5926b3d4 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/sigaction.c @@ -0,0 +1,80 @@ +/* Copyright (C) 1994,1995,1996,1997,2002 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. */ + +#include <errno.h> +#include <signal.h> +#include <stddef.h> + +static __sighandler_t user_handlers[NSIG]; + +extern int __context_syscall (int, struct sigcontext *); +extern int __sigaction_syscall (int, + const struct sigaction *, struct sigaction *); + +static void +trampoline (int sig, int code, struct sigcontext *context) +{ + (*(void (*) (int, int, struct sigcontext *)) user_handlers[sig]) + (sig, code, context); + __context_syscall (1, context); +} + +/* If ACT is not NULL, change the action for SIG to *ACT. + If OACT is not NULL, put the old action for SIG in *OACT. */ +int +__sigaction (sig, act, oact) + int sig; + const struct sigaction *act; + struct sigaction *oact; +{ + struct sigaction myact; + __sighandler_t ohandler; + + if (sig <= 0 || sig >= NSIG) + { + __set_errno (EINVAL); + return -1; + } + + ohandler = user_handlers[sig]; + + if (act != NULL) + { + user_handlers[sig] = act->sa_handler; + if (act->sa_handler != SIG_DFL && act->sa_handler != SIG_IGN) + { + myact = *act; + act = &myact; + act->sa_handler = (__sighandler_t) trampoline; + } + } + + if (__sigaction_syscall (sig, act, oact) < 0) + { + /* The syscall got an error. Restore the old handler and return -1. */ + user_handlers[sig] = ohandler; + return -1; + } + + if (oact != NULL && oact->sa_handler == (__sighandler_t) trampoline) + oact->sa_handler = ohandler; + + return 0; +} +libc_hidden_def (__sigaction) +weak_alias (__sigaction, sigaction) diff --git a/ports/sysdeps/unix/sysv/sysv4/siginfo.h b/ports/sysdeps/unix/sysv/sysv4/siginfo.h new file mode 100644 index 000000000..2bb925738 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/siginfo.h @@ -0,0 +1,59 @@ +/* Definitions of the siginfo structure. + Copyright (C) 1993, 1994, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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 _SIGINFO_H +#define _SIGINFO_H 1 + +#ifdef __USE_SVID +/* SVR4 puts a ton of other stuff in this structure. For now, we'll just + define the two things we really need out of it, and hope for the best. */ + +/* These define the different states a child can have on exit. + We need these to build the status return for things like waitpid. */ +#define EXITED 1 +#define KILLED 2 +#define CORED 3 +#define TRAPPED 4 +#define STOPPED 5 +#define CONTINUED 6 + +typedef struct __siginfo + { + int filler1; + + /* Code indicating child's status */ + int __code; + + int filler2; + + /* The PID of the child. */ + long __pid; + + int filler3; + + /* The child's status. */ + int __status; + + int filler4[26]; + + } __siginfo_t; + +#endif /* __USE_SVID */ +#endif /* siginfo.h */ diff --git a/ports/sysdeps/unix/sysv/sysv4/sigset-cvt-mask.h b/ports/sysdeps/unix/sysv/sysv4/sigset-cvt-mask.h new file mode 100644 index 000000000..5b7ea2588 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/sigset-cvt-mask.h @@ -0,0 +1,37 @@ +/* Convert between lowlevel sigmask and libc representation of sigset_t. + SysVr4 version. + Copyright (C) 1998, 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Joe Keane <jgk@jgk.org>. + + 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. */ + +static inline int __attribute__ ((unused)) +sigset_set_old_mask (sigset_t *set, int mask) +{ + set->__sigbits[0] = (unsigned int) mask; + set->__sigbits[1] = 0ul; + set->__sigbits[2] = 0ul; + set->__sigbits[3] = 0ul; + + return 0; +} + +static inline int __attribute__ ((unused)) +sigset_get_old_mask (const sigset_t *set) +{ + return (unsigned int) set->__sigbits[0]; +} diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/Makefile b/ports/sysdeps/unix/sysv/sysv4/solaris2/Makefile new file mode 100644 index 000000000..3ad90f748 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/Makefile @@ -0,0 +1,6 @@ +# The linker supplied with Solaris looks in the current directory +# before searching others. Compiling the various programs that come +# along the way (e.g., glue-ctype) will fail because it'll try to link +# with the libc.a being *constructed* in $(objdir). As a work-around, +# we add this to each native-compile. +ALL_BUILD_CFLAGS += -L/lib diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/bits/dirent.h b/ports/sysdeps/unix/sysv/sysv4/solaris2/bits/dirent.h new file mode 100644 index 000000000..fa0250eb3 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/bits/dirent.h @@ -0,0 +1,50 @@ +/* Copyright (C) 1996, 1997, 1999 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 _DIRENT_H +# error "Never use <bits/dirent.h> directly; include <dirent.h> instead." +#endif + +struct dirent + { +#ifndef __USE_FILE_OFFSET64 + __ino_t d_ino; + __off_t d_off; +#else + __ino64_t d_ino; + __off64_t d_off; +#endif + unsigned short int d_reclen; + char d_name[256]; /* We must not include limits.h! */ + }; + +#ifdef __USE_LARGEFILE64 +struct dirent64 + { + __ino64_t d_ino; + __off64_t d_off; + unsigned short int d_reclen; + char d_name[256]; /* We must not include limits.h! */ + }; +#endif + +#define d_fileno d_ino /* Backwards compatibility. */ + +#undef _DIRENT_HAVE_D_NAMLEN +#define _DIRENT_HAVE_D_RECLEN +#define _DIRENT_HAVE_D_OFF diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/bits/errno.h b/ports/sysdeps/unix/sysv/sysv4/solaris2/bits/errno.h new file mode 100644 index 000000000..6c0de9215 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/bits/errno.h @@ -0,0 +1,168 @@ +/* Copyright (C) 1991, 1994, 1996, 1997, 1998 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. */ + +/* This file defines the `errno' constants. */ + +#if !defined __Emath_defined && (defined _ERRNO_H || defined __need_Emath) +#undef __need_Emath +#define __Emath_defined 1 + +# define EDOM 33 /* Math argument out of domain of function. */ +# define EILSEQ 88 /* Illegal byte sequence. */ +# define ERANGE 34 /* Math result not representable. */ +#endif + +#ifdef _ERRNO_H +/* All error codes the system knows about. */ + +# define EPERM 1 /* Not super-user. */ +# define ENOENT 2 /* No such file or directory. */ +# define ESRCH 3 /* No such process. */ +# define EINTR 4 /* Interrupted system call. */ +# define EIO 5 /* I/O error. */ +# define ENXIO 6 /* No such device or address. */ +# define E2BIG 7 /* Arg list too long. */ +# define ENOEXEC 8 /* Exec format error. */ +# define EBADF 9 /* Bad file number. */ +# define ECHILD 10 /* No children. */ +# define EAGAIN 11 /* Resource temporarily unavailable. */ +# define EWOULDBLOCK EAGAIN +# define ENOMEM 12 /* Not enough core. */ +# define EACCES 13 /* Permission denied. */ +# define EFAULT 14 /* Bad address. */ +# define ENOTBLK 15 /* Block device required. */ +# define EBUSY 16 /* Mount device busy. */ +# define EEXIST 17 /* File exists. */ +# define EXDEV 18 /* Cross-device link. */ +# define ENODEV 19 /* No such device. */ +# define ENOTDIR 20 /* Not a directory. */ +# define EISDIR 21 /* Is a directory. */ +# define EINVAL 22 /* Invalid argument. */ +# define ENFILE 23 /* File table overflow. */ +# define EMFILE 24 /* Too many open files. */ +# define ENOTTY 25 /* Inappropriate ioctl for device. */ +# define ETXTBSY 26 /* Text file busy. */ +# define EFBIG 27 /* File too large. */ +# define ENOSPC 28 /* No space left on device. */ +# define ESPIPE 29 /* Illegal seek. */ +# define EROFS 30 /* Read only file system. */ +# define EMLINK 31 /* Too many links. */ +# define EPIPE 32 /* Broken pipe. */ +# define ENOMSG 35 /* No message of desired type. */ +# define EIDRM 36 /* Identifier removed. */ +# define ECHRNG 37 /* Channel number out of range. */ +# define EL2NSYNC 38 /* Level 2 not synchronized. */ +# define EL3HLT 39 /* Level 3 halted. */ +# define EL3RST 40 /* Level 3 reset. */ +# define ELNRNG 41 /* Link number out of range. */ +# define EUNATCH 42 /* Protocol driver not attached. */ +# define ENOCSI 43 /* No CSI structure available. */ +# define EL2HLT 44 /* Level 2 halted. */ +# define EDEADLK 45 /* Deadlock condition. */ +# define ENOLCK 46 /* No record locks available. */ +# define ECANCELED 47 /* Operation canceled. */ +# define ENOTSUP 48 /* Operation not supported. */ + +/* Filesystem Quotas. */ +# define EDQUOT 49 /* Disc quota exceeded. */ + +/* Convergent Error Returns. */ +# define EBADE 50 /* Invalid exchange. */ +# define EBADR 51 /* Invalid request descriptor. */ +# define EXFULL 52 /* Exchange full. */ +# define ENOANO 53 /* No anode. */ +# define EBADRQC 54 /* Invalid request code. */ +# define EBADSLT 55 /* Invalid slot. */ +# define EDEADLOCK 56 /* File locking deadlock error. */ + +# define EBFONT 57 /* Bad font file fmt. */ + +/* STREAM problems. */ +# define ENOSTR 60 /* Device not a stream. */ +# define ENODATA 61 /* No data (for no delay io). */ +# define ETIME 62 /* Timer expired. */ +# define ENOSR 63 /* Out of streams resources. */ + +# define ENONET 64 /* Machine is not on the network. */ +# define ENOPKG 65 /* Package not installed. */ +# define EREMOTE 66 /* The object is remote. */ +# define ENOLINK 67 /* The link has been severed. */ +# define EADV 68 /* Advertise error. */ +# define ESRMNT 69 /* Srmount error. */ + +# define ECOMM 70 /* Communication error on send. */ +# define EPROTO 71 /* Protocol error. */ +# define EMULTIHOP 74 /* Multihop attempted. */ +# define EBADMSG 77 /* Trying to read unreadable message. */ +# define ENAMETOOLONG 78 /* Path name is too long. */ +# define EOVERFLOW 79 /* Value too large to be stored in data type.*/ +# define ENOTUNIQ 80 /* Given log. name not unique. */ +# define EBADFD 81 /* F.d. invalid for this operation. */ +# define EREMCHG 82 /* Remote address changed. */ + +/* Shared library problems. */ +# define ELIBACC 83 /* Can't access a needed shared lib. */ +# define ELIBBAD 84 /* Accessing a corrupted shared lib. */ +# define ELIBSCN 85 /* .lib section in a.out corrupted. */ +# define ELIBMAX 86 /* Attempting to link in too many libs. */ +# define ELIBEXEC 87 /* Attempting to exec a shared library. */ +# define ENOSYS 89 /* Unsupported file system operation. */ +# define ELOOP 90 /* Symbolic link loop. */ +# define ERESTART 91 /* Restartable system call. */ +# define ESTRPIPE 92 /* If pipe/FIFO, don't sleep in stream head. */ +# define ENOTEMPTY 93 /* Directory not empty. */ +# define EUSERS 94 /* Too many users (for UFS). */ + +/* BSD Networking Software: argument errors. */ +# define ENOTSOCK 95 /* Socket operation on non-socket. */ +# define EDESTADDRREQ 96 /* Destination address required. */ +# define EMSGSIZE 97 /* Message too long. */ +# define EPROTOTYPE 98 /* Protocol wrong type for socket. */ +# define ENOPROTOOPT 99 /* Protocol not available. */ +# define EPROTONOSUPPORT 120 /* Protocol not supported. */ +# define ESOCKTNOSUPPORT 121 /* Socket type not supported. */ +# define EOPNOTSUPP 122 /* Operation not supported on socket. */ +# define EPFNOSUPPORT 123 /* Protocol family not supported. */ +# define EAFNOSUPPORT 124 /* Address family not supported by + protocol family. */ +# define EADDRINUSE 125 /* Address already in use. */ +# define EADDRNOTAVAIL 126 /* Can't assign requested address. */ +/* BSD Networking Software: operational errors. */ +# define ENETDOWN 127 /* Network is down. */ +# define ENETUNREACH 128 /* Network is unreachable. */ +# define ENETRESET 129 /* Network dropped connection because + of reset. */ +# define ECONNABORTED 130 /* Software caused connection abort. */ +# define ECONNRESET 131 /* Connection reset by peer. */ +# define ENOBUFS 132 /* No buffer space available. */ +# define EISCONN 133 /* Socket is already connected. */ +# define ENOTCONN 134 /* Socket is not connected. */ +/* XENIX has 135 - 142. */ +# define ESHUTDOWN 143 /* Can't send after socket shutdown. */ +# define ETOOMANYREFS 144 /* Too many references: can't splice. */ +# define ETIMEDOUT 145 /* Connection timed out. */ +# define ECONNREFUSED 146 /* Connection refused. */ +# define EHOSTDOWN 147 /* Host is down. */ +# define EHOSTUNREACH 148 /* No route to host. */ +# define EALREADY 149 /* operation already in progress. */ +# define EINPROGRESS 150 /* operation now in progress. */ + +/* SUN Network File System. */ +# define ESTALE 151 /* Stale NFS file handle. */ + +#endif diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/bits/signum.h b/ports/sysdeps/unix/sysv/sysv4/solaris2/bits/signum.h new file mode 100644 index 000000000..a2659530b --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/bits/signum.h @@ -0,0 +1,76 @@ +/* Signal number definitions. Solaris 2 version. + Copyright (C) 1994, 1996, 1998 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. */ + +#ifdef _SIGNAL_H + +/* Fake signal functions. */ +#define SIG_ERR ((__sighandler_t) -1) /* Error return. */ +#define SIG_DFL ((__sighandler_t) 0) /* Default action. */ +#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */ +#ifdef __USE_UNIX98 +# define SIG_HOLD ((__sighandler_t) 2) /* Add signal to hold mask. */ +#endif + + +/* Signals. */ +#define SIGHUP 1 /* Hangup (POSIX). */ +#define SIGINT 2 /* Interrupt (ANSI). */ +#define SIGQUIT 3 /* Quit (POSIX). */ +#define SIGILL 4 /* Illegal instruction (ANSI). */ +#define SIGABRT SIGIOT /* Abort (ANSI). */ +#define SIGTRAP 5 /* Trace trap (POSIX). */ +#define SIGIOT 6 /* IOT trap (4.2 BSD). */ +#define SIGEMT 7 /* EMT trap (4.2 BSD). */ +#define SIGFPE 8 /* Floating-point exception (ANSI). */ +#define SIGKILL 9 /* Kill, unblockable (POSIX). */ +#define SIGBUS 10 /* Bus error (4.2 BSD). */ +#define SIGSEGV 11 /* Segmentation violation (ANSI). */ +#define SIGSYS 12 /* Bad argument to system call (4.2 BSD)*/ +#define SIGPIPE 13 /* Broken pipe (POSIX). */ +#define SIGALRM 14 /* Alarm clock (POSIX). */ +#define SIGTERM 15 /* Termination (ANSI). */ +#define SIGUSR1 16 /* User-defined signal 1 (POSIX). */ +#define SIGUSR2 17 /* User-defined signal 2 (POSIX). */ +#define SIGCHLD 18 /* Child status has changed (POSIX). */ +#define SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */ +#define SIGPWR 19 /* Power failure restart (System V). */ +#define SIGWINCH 20 /* Window size change (4.3 BSD, Sun). */ +#define SIGURG 21 /* Urgent condition on socket (4.2 BSD).*/ +#define SIGPOLL 22 /* Pollable event occurred (System V). */ +#define SIGIO SIGPOLL /* I/O now possible (4.2 BSD). */ +#define SIGSTOP 23 /* Stop, unblockable (POSIX). */ +#define SIGTSTP 24 /* Keyboard stop (POSIX). */ +#define SIGCONT 25 /* Continue (POSIX). */ +#define SIGTTIN 26 /* Background read from tty (POSIX). */ +#define SIGTTOU 27 /* Background write to tty (POSIX). */ +#define SIGVTALRM 28 /* Virtual alarm clock (4.2 BSD). */ +#define SIGPROF 29 /* Profiling alarm clock (4.2 BSD). */ +#define SIGXCPU 30 /* CPU limit exceeded (4.2 BSD). */ +#define SIGXFSZ 31 /* File size limit exceeded (4.2 BSD). */ +/* The following signals are new in Solaris 2. */ +#define SIGWAITING 32 /* Process's lwps are blocked. */ +#define SIGLWP 33 /* Special signal used by thread library. */ +#define SIGFREEZE 34 /* Special signal used by CPR. */ +#define SIGTHAW 35 /* Special signal used by CPR. */ +#define _SIGRTMIN 36 /* First (highest-priority) realtime signal. */ +#define _SIGRTMAX 43 /* Last (lowest-priority) realtime signal. */ + +#endif /* <signal.h> included. */ + +#define _NSIG 44 /* Biggest signal number + 1. */ diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/bits/sigstack.h b/ports/sysdeps/unix/sysv/sysv4/solaris2/bits/sigstack.h new file mode 100644 index 000000000..753caac8a --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/bits/sigstack.h @@ -0,0 +1,55 @@ +/* sigstack, sigaltstack definitions. + Copyright (C) 1998 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 _SIGNAL_H +# error "Never include this file directly. Use <signal.h> instead" +#endif + + +/* Structure describing a signal stack (obsolete). */ +struct sigstack + { + __ptr_t ss_sp; /* Signal stack pointer. */ + int ss_onstack; /* Nonzero if executing on this stack. */ + }; + + +/* Possible values for `ss_flags.'. */ +enum +{ + SS_ONSTACK = 1, +#define SS_ONSTACK SS_ONSTACK + SS_DISABLE +#define SS_DISABLE SS_DISABLE +}; + +/* Minimum stack size for a signal handler. */ +#define MINSIGSTKSZ 2048 + +/* System default stack size. */ +#define SIGSTKSZ 8192 + + +/* Alternate, preferred interface. */ +typedef struct sigaltstack + { + __ptr_t ss_sp; + int ss_flags; + size_t ss_size; + } stack_t; diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/bits/stat.h b/ports/sysdeps/unix/sysv/sysv4/solaris2/bits/stat.h new file mode 100644 index 000000000..22c1c1f85 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/bits/stat.h @@ -0,0 +1,119 @@ +/* Copyright (C) 1993, 96, 97, 98, 99, 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 _SYS_STAT_H +# error "Never include <bits/stat.h> directly; use <sys/stat.h> instead." +#endif + +#include <bits/types.h> + +/* Length of array allocated for file system type name. */ +#define _ST_FSTYPSZ 16 + + +/* Structure describing file characteristics. */ +struct stat + { + __dev_t st_dev; + long int st_filler1[3]; + __ino_t st_ino; /* File serial number. */ + __mode_t st_mode; /* File mode. */ + __nlink_t st_nlink; /* Link count. */ + __uid_t st_uid; /* User ID of the file's owner. */ + __gid_t st_gid; /* Group ID of the file's group.*/ + __dev_t st_rdev; /* Device number, if device. */ + long int st_filler2[2]; + + __off_t st_size; /* Size of file, in bytes. */ + /* SVR4 added this extra long to allow for expansion of off_t. */ + long int st_filler3; + + __time_t st_atime; /* Time of last access. */ + unsigned long int st_atime_usec; + __time_t st_mtime; /* Time of last modification. */ + unsigned long int st_mtime_usec; + __time_t st_ctime; /* Time of last status change. */ + unsigned long int st_ctime_usec; + + __blksize_t st_blksize; /* Optimal block size for I/O. */ +#define _STATBUF_ST_BLKSIZE /* Tell code we have this member. */ + + __blkcnt_t st_blocks; /* Number of 512-byte blocks allocated. */ + char st_fstype[_ST_FSTYPSZ]; + long int st_filler4[8]; + }; + +#ifdef __USE_LARGEFILE64 +/* struct stat64 has the shape as stat */ +struct stat64 + { + __dev_t st_dev; /* Device */ + long int st_filler1[2]; + __ino64_t st_ino; /* File serial number */ + __mode_t st_mode; /* File mode */ + __nlink_t st_nlink; /* Link count */ + __uid_t st_uid; /* User ID of the file's owner. */ + __gid_t st_gid; /* Group ID of the file's group.*/ + __dev_t st_rdev; /* Device number, if device */ + long int st_filler2; + + __off64_t st_size; /* Size of file, in bytes. */ + + __time_t st_atime; /* Time of last access */ + unsigned long int st_atime_usec; + __time_t st_mtime; /* Time of last modification */ + unsigned long int st_mtime_usec; + __time_t st_ctime; /* Time of last status change */ + unsigned long int st_ctime_usec; + + __blksize_t st_blksize; + __blkcnt64_t st_blocks; + char st_fstype[_ST_FSTYPSZ]; + long int st_filler3[8]; +}; +#endif + + +/* Encoding of the file mode. */ + +#define __S_IFMT 0170000 /* These bits determine file type. */ + +/* File types. */ +#define __S_IFDIR 0040000 /* Directory. */ +#define __S_IFCHR 0020000 /* Character device. */ +#define __S_IFBLK 0060000 /* Block device. */ +#define __S_IFREG 0100000 /* Regular file. */ +#define __S_IFIFO 0010000 /* FIFO. */ + +/* These don't actually exist on System V, but having them doesn't hurt. */ +#define __S_IFLNK 0120000 /* Symbolic link. */ +#define __S_IFSOCK 0140000 /* Socket. */ + +/* POSIX.1b objects. */ +#define __S_TYPEISMQ(buf) (0) +#define __S_TYPEISSEM(buf) (0) +#define __S_TYPEISSHM(buf) (0) + +/* Protection bits. */ + +#define __S_ISUID 04000 /* Set user ID on execution. */ +#define __S_ISGID 02000 /* Set group ID on execution. */ +#define __S_ISVTX 01000 /* Save swapped text after use (sticky). */ +#define __S_IREAD 0400 /* Read by owner. */ +#define __S_IWRITE 0200 /* Write by owner. */ +#define __S_IEXEC 0100 /* Execute by owner. */ diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/bits/types.h b/ports/sysdeps/unix/sysv/sysv4/solaris2/bits/types.h new file mode 100644 index 000000000..a9ce216c6 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/bits/types.h @@ -0,0 +1,120 @@ +/* Copyright (C) 1991,92,1994-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 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. */ + +/* + * Never include this file directly; use <sys/types.h> instead. + */ + +#ifndef _BITS_TYPES_H +#define _BITS_TYPES_H 1 + +#include <features.h> + +#define __need_size_t +#include <stddef.h> + +/* Convenience types. */ +typedef unsigned char __u_char; +typedef unsigned short __u_short; +typedef unsigned int __u_int; +typedef unsigned long __u_long; +#ifdef __GNUC__ +typedef unsigned long long int __u_quad_t; +typedef long long int __quad_t; +#else +typedef struct +{ + long __val[2]; +} __quad_t; +typedef struct +{ + __u_long __val[2]; +} __u_quad_t; +#endif +typedef signed char __int8_t; +typedef unsigned char __uint8_t; +typedef signed short int __int16_t; +typedef unsigned short int __uint16_t; +typedef signed int __int32_t; +typedef unsigned int __uint32_t; +#ifdef __GNUC__ +typedef signed long long int __int64_t; +typedef unsigned long long int __uint64_t; +#endif +typedef __quad_t *__qaddr_t; +typedef unsigned long int __dev_t; /* Type of device numbers. */ +typedef long int __uid_t; /* Type of user identifications. */ +typedef long int __gid_t; /* Type of group identifications. */ +typedef unsigned long int __ino_t; /* Type of file serial numbers. */ +typedef unsigned long int __mode_t; /* Type of file attribute bitmasks. */ +typedef unsigned long int __nlink_t; /* Type of file link counts. */ +typedef long int __off_t; /* Type of file sizes and offsets. */ +typedef __quad_t __loff_t; /* Type of file sizes and offsets. */ +typedef long int __pid_t; /* Type of process identifications. */ +typedef int __ssize_t; /* Type of a byte count, or error. */ +typedef __u_quad_t __fsid_t; /* Type of file system IDs. */ +typedef long int __clock_t; /* Type of CPU usage counts. */ +typedef long int __rlim_t; /* Type for resource measurement. */ +typedef __quad_t __rlim64_t; /* Type for resource measurement (LFS). */ +typedef __quad_t __ino64_t; /* Type for file serial numbers. */ +typedef __loff_t __off64_t; /* Type of file izes and offsets. */ +typedef unsigned int __id_t; /* General type for IDs. */ + +/* Everythin' else. */ +typedef long int __daddr_t; /* The type of a disk address. */ +typedef char *__caddr_t; +typedef long int __time_t; +typedef unsigned int __useconds_t; +typedef int __suseconds_t; +typedef long int __swblk_t; /* Type of a swap block maybe? */ +typedef int __key_t; /* Type of an IPC key */ + +/* fd_set for select. */ + +/* Number of descriptors that can fit in an `fd_set'. */ +#define __FD_SETSIZE 1024 + + +/* Type to represent block size. */ +typedef long int __blksize_t; + +/* Types from the Large File Support interface. */ + +/* Type to count number os disk blocks. */ +typedef long int __blkcnt_t; +typedef __quad_t __blkcnt64_t; + +/* Type to count file system blocks. */ +typedef unsigned int __fsblkcnt_t; +typedef __u_quad_t __fsblkcnt64_t; + +/* Type to count file system inodes. */ +typedef unsigned long int __fsfilcnt_t; +typedef __u_quad_t __fsfilcnt64_t; + +/* Used in XTI. */ +typedef int __t_scalar_t; +typedef unsigned int __t_uscalar_t; + +/* Duplicates info from stdint.h but this is used in unistd.h. */ +typedef long int __intptr_t; + +/* Duplicate info from sys/socket.h. */ +typedef unsigned int __socklen_t; + +#endif /* bits/types.h */ diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/fsync.S b/ports/sysdeps/unix/sysv/sysv4/solaris2/fsync.S new file mode 100644 index 000000000..493926a98 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/fsync.S @@ -0,0 +1,30 @@ +/* Copyright (C) 1994, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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. */ + +#include <sysdep.h> + +/* Solaris uses fdsync for the normal fsync. */ +ENTRY(fsync) + mov 16, %i1 + mov SYS_ify(fdsync), %g1 + ta 8 + bcs syscall_error + nop + mov %g0, %o0 + ret diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/getdents.c b/ports/sysdeps/unix/sysv/sysv4/solaris2/getdents.c new file mode 100644 index 000000000..ab782ffaa --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/getdents.c @@ -0,0 +1,114 @@ +/* Copyright (C) 1993,95,96,97,98, 2004 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. */ + +#include <alloca.h> +#include <dirent.h> +#include <stddef.h> +#include <string.h> +#include <unistd.h> +#include <sys/param.h> +#include <sys/types.h> + +#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) + + +extern int __getdents (int fd, char *buf, size_t nbytes); + +/* For Solaris we need a special version of this file since the + definition of `struct dirent' is not the same for the kernel and + the libc. There is one additional field which might be introduced + in the kernel structure in the future. + + He is the system definition of `struct dirent' as of 2.6: */ + +struct kernel_dirent + { + ino_t d_ino; + off_t d_off; + unsigned short int d_reclen; + char d_name[256]; + }; + +#ifdef GETDENTS64 +#define __getdirentries __getdirentries64 +#define dirent dirent64 +#endif + +/* The problem here is that we cannot simply read the next NBYTES + bytes. We need to take the additional field into account. We use + some heuristic. Assuming the directory contains names with 14 + characters on average we can compute an estimate number of entries + which fit in the buffer. Taking this number allows us to specify a + correct number of bytes to read. If we should be wrong, we can reset + the file descriptor. */ +ssize_t +__getdirentries (int fd, char *buf, size_t nbytes, off_t *basep) +{ + off_t base = __lseek (fd, (off_t) 0, SEEK_CUR); + off_t last_offset = base; + size_t red_nbytes; + struct kernel_dirent *skdp, *kdp; + struct dirent *dp; + int retval; + const size_t size_diff = (offsetof (struct dirent, d_name) + - offsetof (struct kernel_dirent, d_name)); + + red_nbytes = nbytes - ((nbytes / (offsetof (struct dirent, d_name) + 14)) + * size_diff); + + dp = (struct dirent *) buf; + skdp = kdp = __alloca (red_nbytes); + + retval = __getdents (fd, (char *) kdp, red_nbytes); + + while ((char *) kdp < (char *) skdp + retval) + { + const size_t alignment = __alignof__ (struct dirent); + /* Since kdp->d_reclen is already aligned for the kernel structure + this may compute a value that is bigger than necessary. */ + size_t new_reclen = ((kdp->d_reclen + size_diff + alignment - 1) + & ~(alignment - 1)); + if ((char *) dp + new_reclen > buf + nbytes) + { + /* Our heuristic failed. We read too many entries. Reset + the stream. */ + __lseek (fd, last_offset, SEEK_SET); + break; + } + + last_offset = kdp->d_off; + dp->d_ino = kdp->d_ino; + dp->d_off = kdp->d_off; + dp->d_reclen = new_reclen; + dp->d_type = DT_UNKNOWN; + memcpy (dp->d_name, kdp->d_name, + kdp->d_reclen - offsetof (struct kernel_dirent, d_name)); + + dp = (struct dirent *) ((char *) dp + new_reclen); + kdp = (struct kernel_dirent *) (((char *) kdp) + kdp->d_reclen); + } + + if (basep) + *basep = base; + + return (char *) dp - buf; +} + +#ifndef GETDENTS64 +weak_alias (__getdirentries, getdirentries) +#endif diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/sigpending.c b/ports/sysdeps/unix/sysv/sysv4/solaris2/sigpending.c new file mode 100644 index 000000000..2723d79f7 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/sigpending.c @@ -0,0 +1,37 @@ +/* Copyright (C) 1998 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. */ + +#include <errno.h> +#include <stddef.h> +#include <signal.h> + +extern int __syscall_sigpending (int subcode, sigset_t *set); + + +/* Store in SET all signals that are blocked and pending. */ +int +sigpending (sigset_t *set) +{ + if (set == NULL) + { + __set_errno (EINVAL); + return -1; + } + + return __syscall_sigpending (1, set); +} diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/sigstack.c b/ports/sysdeps/unix/sysv/sysv4/solaris2/sigstack.c new file mode 100644 index 000000000..5aa73c8dc --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/sigstack.c @@ -0,0 +1,3 @@ +/* We can reuse the Linux implementation with some tricks. */ +#define __NR_sigaltstack 1 +#include <sysdeps/unix/sysv/linux/sigstack.c> diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/sigwaitinfo.c b/ports/sysdeps/unix/sysv/sysv4/solaris2/sigwaitinfo.c new file mode 100644 index 000000000..f24664002 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/sigwaitinfo.c @@ -0,0 +1,2 @@ +/* We can reuse the Linux implementation. */ +#include <sysdeps/unix/sysv/linux/sigwaitinfo.c> diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/Dist b/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/Dist new file mode 100644 index 000000000..783250777 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/Dist @@ -0,0 +1 @@ +sys/trap.h diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/Makefile b/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/Makefile new file mode 100644 index 000000000..1c17ea168 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/Makefile @@ -0,0 +1,11 @@ +# This flag is necessary because GCC now tries to call _Q_{mul, etc...} +# instead of doing the stuff the hard way. For now, printf_fp.o, __vfscanf.o, +# and difftime.o don't work because of this. The long-term fix is to actually +# implement what they're doing, but for the short-term, we must do this. +sysdep-CFLAGS := $(sysdep-CFLAGS) -mhard-quad-float + +ifeq ($(subdir),crypt) + +crypt := crypt.solar + +endif diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/bits/sigcontext.h b/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/bits/sigcontext.h new file mode 100644 index 000000000..7c4bca604 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/bits/sigcontext.h @@ -0,0 +1,34 @@ +/* Structure describing state saved while handling a signal. Sparc version. + Copyright (C) 1992, 1994, 1997 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 _SIGNAL_H +# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead." +#endif + +struct sigcontext + { + int sc_onstack; + __sigset_t sc_mask; + +#define SPARC_MAXREGWINDOW 31 /* Maximum usable register windows. */ + int sc_sp, sc_pc, sc_npc, sc_psr, sc_g1, sc_o0; + int sc_wbcnt; /* Number of outstanding windows. */ + __ptr_t sc_spbuf[SPARC_MAXREGWINDOW]; /* SP's for each window. */ + int sc_wbuf[SPARC_MAXREGWINDOW][16]; /* Saved register windows. */ + }; diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c b/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c new file mode 100644 index 000000000..3c75e3f01 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c @@ -0,0 +1,185 @@ +/* Copyright (C) 1999 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. */ + +#include <stddef.h> +#include <libintl.h> + + +/* This is a list of all known `errno' codes. */ + + +const int _sys_nerr = 152; + +const char *const _sys_errlist[] = +{ + N_("Error 0"), + N_("Not owner"), + N_("No such file or directory"), + N_("No such process"), + N_("Interrupted system call"), + N_("I/O error"), + N_("No such device or address"), + N_("Arg list too long"), + N_("Exec format error"), + N_("Bad file number"), + N_("No child processes"), + N_("Resource temporarily unavailable"), + N_("Not enough space"), + N_("Permission denied"), + N_("Bad address"), + N_("Block device required"), + N_("Device busy"), + N_("File exists"), + N_("Cross-device link"), + N_("No such device"), + N_("Not a directory"), + N_("Is a directory"), + N_("Invalid argument"), + N_("File table overflow"), + N_("Too many open files"), + N_("Inappropriate ioctl for device"), + N_("Text file busy"), + N_("File too large"), + N_("No space left on device"), + N_("Illegal seek"), + N_("Read-only file system"), + N_("Too many links"), + N_("Broken pipe"), + N_("Argument out of domain"), + N_("Result too large"), + N_("No message of desired type"), + N_("Identifier removed"), + N_("Channel number out of range"), + N_("Level 2 not synchronized"), + N_("Level 3 halted"), + N_("Level 3 reset"), + N_("Link number out of range"), + N_("Protocol driver not attached"), + N_("No CSI structure available"), + N_("Level 2 halted"), + N_("Deadlock situation detected/avoided"), + N_("No record locks available"), + N_("Operation canceled"), + N_("Operation not supported"), + N_("Disc quota exceeded"), + N_("Bad exchange descriptor"), + N_("Bad request descriptor"), + N_("Message tables full"), + N_("Anode table overflow"), + N_("Bad request code"), + N_("Invalid slot"), + N_("File locking deadlock"), + N_("Bad font file format"), + N_("Error 58"), + N_("Error 59"), + N_("Not a stream device"), + N_("No data available"), + N_("Timer expired"), + N_("Out of stream resources"), + N_("Machine is not on the network"), + N_("Package not installed"), + N_("Object is remote"), + N_("Link has been severed"), + N_("Advertise error"), + N_("Srmount error"), + N_("Communication error on send"), + N_("Protocol error"), + N_("Error 72"), + N_("Error 73"), + N_("Multihop attempted"), + N_("Error 75"), + N_("Error 76"), + N_("Not a data message"), + N_("File name too long"), + N_("Value too large for defined data type"), + N_("Name not unique on network"), + N_("File descriptor in bad state"), + N_("Remote address changed"), + N_("Can not access a needed shared library"), + N_("Accessing a corrupted shared library"), + N_(".lib section in a.out corrupted"), + N_("Attempting to link in more shared libraries than system limit"), + N_("Can not exec a shared library directly"), + N_("Illegal byte sequence"), + N_("Operation not applicable"), + N_("Number of symbolic links encountered during path name traversal exceeds MAXSYMLINKS"), + N_("Error 91"), + N_("Error 92"), + N_("Directory not empty"), + N_("Too many users"), + N_("Socket operation on non-socket"), + N_("Destination address required"), + N_("Message too long"), + N_("Protocol wrong type for socket"), + N_("Option not supported by protocol"), + N_("Error 100"), + N_("Error 101"), + N_("Error 102"), + N_("Error 103"), + N_("Error 104"), + N_("Error 105"), + N_("Error 106"), + N_("Error 107"), + N_("Error 108"), + N_("Error 109"), + N_("Error 110"), + N_("Error 111"), + N_("Error 112"), + N_("Error 113"), + N_("Error 114"), + N_("Error 115"), + N_("Error 116"), + N_("Error 117"), + N_("Error 118"), + N_("Error 119"), + N_("Protocol not supported"), + N_("Socket type not supported"), + N_("Operation not supported on transport endpoint"), + N_("Protocol family not supported"), + N_("Address family not supported by protocol family"), + N_("Address already in use"), + N_("Cannot assign requested address"), + N_("Network is down"), + N_("Network is unreachable"), + N_("Network dropped connection because of reset"), + N_("Software caused connection abort"), + N_("Connection reset by peer"), + N_("No buffer space available"), + N_("Transport endpoint is already connected"), + N_("Transport endpoint is not connected"), + N_("Structure needs cleaning"), + N_("Error 136"), + N_("Not a name file"), + N_("Not available"), + N_("Is a name file"), + N_("Remote I/O error"), + N_("Reserved for future use"), + N_("Error 142"), + N_("Cannot send after socket shutdown"), + N_("Too many references: cannot splice"), + N_("Connection timed out"), + N_("Connection refused"), + N_("Host is down"), + N_("No route to host"), + N_("Operation already in progress"), + N_("Operation now in progress"), + N_("Stale NFS file handle") +}; + +weak_alias (_sys_errlist, sys_errlist) +weak_alias (_sys_nerr, sys_nerr) diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/sparc32/syscall.S b/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/sparc32/syscall.S new file mode 100644 index 000000000..b9f2996e3 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/sparc32/syscall.S @@ -0,0 +1,2 @@ +/* Bets are that the Linux code works... */ +#include <sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S> diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/start.c b/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/start.c new file mode 100644 index 000000000..afdfaaa2e --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/start.c @@ -0,0 +1,4 @@ +#define NO_SHLIB +/* Solaris needs start named `_start', not `start'. */ +#define NO_EXPLICIT_START +#include <sysdeps/unix/sparc/start.c> diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/sys/trap.h b/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/sys/trap.h new file mode 100644 index 000000000..39d264597 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/sys/trap.h @@ -0,0 +1,36 @@ +/* Copyright (C) 1998 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 _SYS_TRAP_H +#define _SYS_TRAP_H 1 + +/* Solaris2 software traps. */ + +#define ST_OSYSCALL 0x00 +#define ST_BREAKPOINT 0x01 +#define ST_DIV0 0x02 +#define ST_FLUSH_WINDOWS 0x03 +#define ST_CLEAN_WINDOWS 0x04 +#define ST_RANGE_CHECK 0x05 +#define ST_FIX_ALIGN 0x06 +#define ST_INT_OVERFLOW 0x07 +#define ST_SYSCALL 0x08 + +/* Traps 0x10 through 0x1f are allotted to the user. */ + +#endif /* sys/trap.h */ diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/sys/ucontext.h b/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/sys/ucontext.h new file mode 100644 index 000000000..6e9f69067 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/sys/ucontext.h @@ -0,0 +1,42 @@ +/* Copyright (C) 1998 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 _SYS_UCONTEXT_H +#define _SYS_UCONTEXT_H 1 + +#include <features.h> +#include <signal.h> +#include <sys/types.h> + +typedef struct +{ + long int mc_filler[78]; +} mcontext_t; + +struct ucontext +{ + unsigned long int uc_flags; + struct ucontext *uc_link; + sigset_t uc_sigmask; + stack_t uc_stack; + mcontext_t uc_mcontext; + long int uc_filler[23]; +}; +typedef struct ucontext ucontext_t; + +#endif /* sys/ucontext.h */ diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/syscalls.list b/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/syscalls.list new file mode 100644 index 000000000..d96fbba7e --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/syscalls.list @@ -0,0 +1,3 @@ +# File name Caller Syscall name # args Strong name Weak names + +sys-sig - context 2 __context_syscall diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/sysdep.S b/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/sysdep.S new file mode 100644 index 000000000..2ac767c98 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/sysdep.S @@ -0,0 +1,47 @@ +/* Copyright (C) 1993, 1994, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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. */ + +#include <sysdep.h> +#define _ERRNO_H +#include <bits/errno.h> + +ENTRY(syscall_error) + /* If it was a syscall that got interrupted, but can + be restarted, drop EINTR in. */ + cmp %o0, ERESTART + be,a notint + mov EINTR, %o0 + +notint: +#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN + /* We translate the system's EWOULDBLOCK error into EAGAIN. + The GNU C library always defines EWOULDBLOCK==EAGAIN. + EWOULDBLOCK_sys is the original number. */ + cmp %o0, EWOULDBLOCK_sys + be,a notblock + mov EAGAIN, %o0 +#endif + +notblock:/* Store it in errno... */ + sethi %hi(C_SYMBOL_NAME(errno)), %g1 + st %o0, [%g1 + %lo(C_SYMBOL_NAME(errno))] + + /* And just kick back a -1. */ + retl + mov -1, %o0 diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/sysdep.h b/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/sysdep.h new file mode 100644 index 000000000..9a0db6afe --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/sparc/sysdep.h @@ -0,0 +1,56 @@ +/* Copyright (C) 1993,1994,1995,1997,1998,2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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. */ + +/* Solaris 2 does not precede the asm names of C symbols with a `_'. */ +#ifndef NO_UNDERSCORES +#define NO_UNDERSCORES +#endif + +#include <sysdeps/unix/sysdep.h> + +#ifdef __ASSEMBLER__ + +/* As of gcc-2.6.0, it complains about pound signs in front of things + that aren't arguments to the macro. So we use this to pull it off + instead. */ +#define cat(a,b) a##b +#define poundfnc cat(#,function) + +#define ENTRY(name) \ + .section ".text"; \ + .align 4; \ + .global C_SYMBOL_NAME(name); \ + .type C_SYMBOL_NAME(name), poundfnc; \ + C_LABEL(name) + +#define PSEUDO(name, syscall_name, args) \ + ENTRY (name) \ + mov SYS_ify(syscall_name), %g1; \ + ta 8; \ + bcs C_SYMBOL_NAME(syscall_error); \ + nop + +#define ret retl; nop +#define r0 %o0 +#define r1 %o1 +#define MOVE(x,y) mov x, y + +#define LOC(name) .L##name + +#endif /* __ASSEMBLER__ */ diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/sys/param.h b/ports/sysdeps/unix/sysv/sysv4/solaris2/sys/param.h new file mode 100644 index 000000000..bbd7b06a1 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/sys/param.h @@ -0,0 +1,59 @@ +/* Copyright (C) 1995, 1996, 1997, 1998 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 _SYS_PARAM_H +#define _SYS_PARAM_H 1 + +#include <limits.h> + +/* BSD names for some <limits.h> values. */ + +#define NBBY CHAR_BIT +#ifndef NGROUPS +# define NGROUPS NGROUPS_MAX +#endif +#define MAXSYMLINKS 5 +#define CANBSIZ MAX_CANON +#define NCARGS ARG_MAX +#define MAXPATHLEN PATH_MAX +#define NOFILE OPEN_MAX + + +#include <sys/types.h> + +/* Bit map related macros. */ +#define setbit(a,i) ((a)[(i)/NBBY] |= 1<<((i)%NBBY)) +#define clrbit(a,i) ((a)[(i)/NBBY] &= ~(1<<((i)%NBBY))) +#define isset(a,i) ((a)[(i)/NBBY] & (1<<((i)%NBBY))) +#define isclr(a,i) (((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0) + +/* Macros for counting and rounding. */ +#ifndef howmany +# define howmany(x, y) (((x)+((y)-1))/(y)) +#endif +#define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) +#define powerof2(x) ((((x)-1)&(x))==0) + +/* Macros for min/max. */ +#define MIN(a,b) (((a)<(b))?(a):(b)) +#define MAX(a,b) (((a)>(b))?(a):(b)) + +/* Unit of `st_blocks'. */ +#define DEV_BSIZE 512 + +#endif /* sys/param.h */ diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/sys/syscall.h b/ports/sysdeps/unix/sysv/sysv4/solaris2/sys/syscall.h new file mode 100644 index 000000000..15c43a3c3 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/sys/syscall.h @@ -0,0 +1,245 @@ +/* Copyright (C) 1998 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 _SYSCALL_H +#define _SYSCALL_H 1 + +/* Solaris 2 syscall numbers */ + +#define SYS_syscall 0 +#define SYS_exit 1 +#define SYS_fork 2 +#define SYS_read 3 +#define SYS_write 4 +#define SYS_open 5 +#define SYS_close 6 +#define SYS_wait 7 +#define SYS_creat 8 +#define SYS_link 9 +#define SYS_unlink 10 +#define SYS_exec 11 +#define SYS_chdir 12 +#define SYS_time 13 +#define SYS_mknod 14 +#define SYS_chmod 15 +#define SYS_chown 16 +#define SYS_brk 17 +#define SYS_stat 18 +#define SYS_lseek 19 +#define SYS_getpid 20 +#define SYS_mount 21 +#define SYS_umount 22 +#define SYS_setuid 23 +#define SYS_getuid 24 +#define SYS_stime 25 +#define SYS_ptrace 26 +#define SYS_alarm 27 +#define SYS_fstat 28 +#define SYS_pause 29 +#define SYS_utime 30 +#define SYS_stty 31 +#define SYS_gtty 32 +#define SYS_access 33 +#define SYS_nice 34 +#define SYS_statfs 35 +#define SYS_sync 36 +#define SYS_kill 37 +#define SYS_fstatfs 38 +#define SYS_pgrpsys 39 +#define SYS_xenix 40 +#define SYS_dup 41 +#define SYS_pipe 42 +#define SYS_times 43 +#define SYS_profil 44 +#define SYS_plock 45 +#define SYS_setgid 46 +#define SYS_getgid 47 +#define SYS_signal 48 +#define SYS_msgsys 49 +#define SYS_syssun 50 +#define SYS_sysi86 50 +#define SYS_sysppc 50 +#define SYS_acct 51 +#define SYS_shmsys 52 +#define SYS_semsys 53 +#define SYS_ioctl 54 +#define SYS_uadmin 55 +#define SYS_utssys 57 +#define SYS_fdsync 58 +#define SYS_execve 59 +#define SYS_umask 60 +#define SYS_chroot 61 +#define SYS_fcntl 62 +#define SYS_ulimit 63 +#define SYS_rmdir 79 +#define SYS_mkdir 80 +#define SYS_getdents 81 +#define SYS_sysfs 84 +#define SYS_getmsg 85 +#define SYS_putmsg 86 +#define SYS_poll 87 +#define SYS_lstat 88 +#define SYS_symlink 89 +#define SYS_readlink 90 +#define SYS_setgroups 91 +#define SYS_getgroups 92 +#define SYS_fchmod 93 +#define SYS_fchown 94 +#define SYS_sigprocmask 95 +#define SYS_sigsuspend 96 +#define SYS_sigaltstack 97 +#define SYS_sigaction 98 +#define SYS_sigpending 99 +#define SYS_context 100 +#define SYS_evsys 101 +#define SYS_evtrapret 102 +#define SYS_statvfs 103 +#define SYS_fstatvfs 104 +#define SYS_nfssys 106 +#define SYS_waitsys 107 +#define SYS_sigsendsys 108 +#define SYS_hrtsys 109 +#define SYS_acancel 110 +#define SYS_async 111 +#define SYS_priocntlsys 112 +#define SYS_pathconf 113 +#define SYS_mincore 114 +#define SYS_mmap 115 +#define SYS_mprotect 116 +#define SYS_munmap 117 +#define SYS_fpathconf 118 +#define SYS_vfork 119 +#define SYS_fchdir 120 +#define SYS_readv 121 +#define SYS_writev 122 +#define SYS_xstat 123 +#define SYS_lxstat 124 +#define SYS_fxstat 125 +#define SYS_xmknod 126 +#define SYS_clocal 127 +#define SYS_setrlimit 128 +#define SYS_getrlimit 129 +#define SYS_lchown 130 +#define SYS_memcntl 131 +#define SYS_getpmsg 132 +#define SYS_putpmsg 133 +#define SYS_rename 134 +#define SYS_uname 135 +#define SYS_setegid 136 +#define SYS_sysconfig 137 +#define SYS_adjtime 138 +#define SYS_systeminfo 139 +#define SYS_seteuid 141 +#define SYS_vtrace 142 +#define SYS_fork1 143 +#define SYS_sigtimedwait 144 +#define SYS_lwp_info 145 +#define SYS_yield 146 +#define SYS_lwp_sema_wait 147 +#define SYS_lwp_sema_post 148 +#define SYS_lwp_sema_trywait 149 +#define SYS_modctl 152 +#define SYS_fchroot 153 +#define SYS_utimes 154 +#define SYS_vhangup 155 +#define SYS_gettimeofday 156 +#define SYS_getitimer 157 +#define SYS_setitimer 158 +#define SYS_lwp_create 159 +#define SYS_lwp_exit 160 +#define SYS_lwp_suspend 161 +#define SYS_lwp_continue 162 +#define SYS_lwp_kill 163 +#define SYS_lwp_self 164 +#define SYS_lwp_setprivate 165 +#define SYS_lwp_getprivate 166 +#define SYS_lwp_wait 167 +#define SYS_lwp_mutex_unlock 168 +#define SYS_lwp_mutex_lock 169 +#define SYS_lwp_cond_wait 170 +#define SYS_lwp_cond_signal 171 +#define SYS_lwp_cond_broadcast 172 +#define SYS_pread 173 +#define SYS_pwrite 174 +#define SYS_llseek 175 +#define SYS_inst_sync 176 +#define SYS_kaio 178 +#define SYS_tsolsys 184 +#define SYS_acl 185 +#define SYS_auditsys 186 +#define SYS_processor_bind 187 +#define SYS_processor_info 188 +#define SYS_p_online 189 +#define SYS_sigqueue 190 +#define SYS_clock_gettime 191 +#define SYS_clock_settime 192 +#define SYS_clock_getres 193 +#define SYS_timer_create 194 +#define SYS_timer_delete 195 +#define SYS_timer_settime 196 +#define SYS_timer_gettime 197 +#define SYS_timer_getoverrun 198 +#define SYS_nanosleep 199 +#define SYS_facl 200 +#define SYS_door 201 +#define SYS_setreuid 202 +#define SYS_setregid 203 +#define SYS_install_utrap 204 +#define SYS_signotify 205 +#define SYS_schedctl 206 +#define SYS_pset 207 +#define SYS_resolvepath 209 +#define SYS_signotifywait 210 +#define SYS_lwp_sigredirect 211 +#define SYS_lwp_alarm 212 +#define SYS_getdents64 213 +#define SYS_mmap64 214 +#define SYS_stat64 215 +#define SYS_lstat64 216 +#define SYS_fstat64 217 +#define SYS_statvfs64 218 +#define SYS_fstatvfs64 219 +#define SYS_setrlimit64 220 +#define SYS_getrlimit64 221 +#define SYS_pread64 222 +#define SYS_pwrite64 223 +#define SYS_creat64 224 +#define SYS_open64 225 +#define SYS_rpcsys 226 +#define SYS_so_socket 230 +#define SYS_so_socketpair 231 +#define SYS_bind 232 +#define SYS_listen 233 +#define SYS_accept 234 +#define SYS_connect 235 +#define SYS_shutdown 236 +#define SYS_recv 237 +#define SYS_recvfrom 238 +#define SYS_recvmsg 239 +#define SYS_send 240 +#define SYS_sendmsg 241 +#define SYS_sendto 242 +#define SYS_getpeername 243 +#define SYS_getsockname 244 +#define SYS_getsockopt 245 +#define SYS_setsockopt 246 +#define SYS_sockconfig 247 +#define SYS_ntp_gettime 248 +#define SYS_ntp_adjtime 249 + +#endif /* sys/syscall.h */ diff --git a/ports/sysdeps/unix/sysv/sysv4/solaris2/syscalls.list b/ports/sysdeps/unix/sysv/sysv4/solaris2/syscalls.list new file mode 100644 index 000000000..092d869ef --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/solaris2/syscalls.list @@ -0,0 +1,7 @@ +# File name Caller Syscall name # args Strong name Weak names + +sigaction - sigaction 3 __sigaction sigaction +sigaltstack - sigaltstack 2 sigaltstack +sigpending - sigpending 2 __syscall_sigpending +sigqueue - sigqueue 3 __sigqueue sigqueue +sigtimedwait - sigtimedwait 3 __sigtimedwait sigtime diff --git a/ports/sysdeps/unix/sysv/sysv4/syscalls.list b/ports/sysdeps/unix/sysv/sysv4/syscalls.list new file mode 100644 index 000000000..7b75d5524 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/syscalls.list @@ -0,0 +1,7 @@ +# File name Caller Syscall name # args Strong name Weak names + +pgrpsys - pgrpsys 3 __pgrpsys +sigprocmask - sigprocmask 3 __sigprocmask sigprocmask +sysconfig - sysconfig 1 __sysconfig +sysinfo - systeminfo 3 __sysinfo +__waitid waitpid waitsys 3 __waitid diff --git a/ports/sysdeps/unix/sysv/sysv4/sysconf.c b/ports/sysdeps/unix/sysv/sysv4/sysconf.c new file mode 100644 index 000000000..bfe7823c4 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/sysconf.c @@ -0,0 +1,366 @@ +/* Copyright (C) 1993,1995,1996,1997,2002,2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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. */ + +#include <errno.h> +#include <limits.h> +#include <unistd.h> +#include <stdio.h> +#include <time.h> +#include <sysconfig.h> + +extern int __sysconfig (int); + +/* Get the value of the system variable NAME. */ +long int +__sysconf (name) + int name; +{ + switch (name) + { + default: + __set_errno (EINVAL); + return -1; + + case _SC_ARG_MAX: +#ifdef ARG_MAX + return ARG_MAX; +#else + return -1; +#endif + + case _SC_CHILD_MAX: +#ifdef CHILD_MAX + return CHILD_MAX; +#else + return -1; +#endif + + case _SC_CLK_TCK: + return __sysconfig (_CONFIG_CLK_TCK); + + case _SC_NGROUPS_MAX: +#ifdef NGROUPS_MAX + return NGROUPS_MAX; +#else + return -1; +#endif + + /* Both of these are looking for _CONFIG_OPEN_FILES. */ + case _SC_OPEN_MAX: + case _SC_STREAM_MAX: + return __sysconfig (_CONFIG_OPEN_FILES); + + case _SC_TZNAME_MAX: + return __tzname_max (); + + case _SC_JOB_CONTROL: +#ifdef _POSIX_JOB_CONTROL + return 1; +#else + return -1; +#endif + + case _SC_SAVED_IDS: +#ifdef _POSIX_SAVED_IDS + return 1; +#else + return -1; +#endif + + case _SC_REALTIME_SIGNALS: +#ifdef _POSIX_REALTIME_SIGNALS + return 1; +#else + return -1; +#endif + + case _SC_PRIORITY_SCHEDULING: +#ifdef _POSIX_PRIORITY_SCHEDULING + return 1; +#else + return -1; +#endif + + case _SC_TIMERS: +#ifdef _POSIX_TIMERS + return 1; +#else + return -1; +#endif + + case _SC_ASYNCHRONOUS_IO: +#ifdef _POSIX_ASYNCHRONOUS_IO + return 1; +#else + return -1; +#endif + + case _SC_PRIORITIZED_IO: +#ifdef _POSIX_PRIORITIZED_IO + return 1; +#else + return -1; +#endif + + case _SC_SYNCHRONIZED_IO: +#ifdef _POSIX_SYNCHRONIZED_IO + return 1; +#else + return -1; +#endif + + case _SC_FSYNC: +#ifdef _POSIX_FSYNC + return 1; +#else + return -1; +#endif + + case _SC_MAPPED_FILES: +#ifdef _POSIX_MAPPED_FILES + return 1; +#else + return -1; +#endif + + case _SC_MEMLOCK: +#ifdef _POSIX_MEMLOCK + return 1; +#else + return -1; +#endif + + case _SC_MEMLOCK_RANGE: +#ifdef _POSIX_MEMLOCK_RANGE + return 1; +#else + return -1; +#endif + + case _SC_MEMORY_PROTECTION: +#ifdef _POSIX_MEMORY_PROTECTION + return 1; +#else + return -1; +#endif + + case _SC_MESSAGE_PASSING: +#ifdef _POSIX_MESSAGE_PASSING + return 1; +#else + return -1; +#endif + + case _SC_SEMAPHORES: +#ifdef _POSIX_SEMAPHORES + return 1; +#else + return -1; +#endif + + case _SC_SHARED_MEMORY_OBJECTS: +#ifdef _POSIX_SHARED_MEMORY_OBJECTS + return 1; +#else + return -1; +#endif + + case _SC_VERSION: + return _POSIX_VERSION; + + case _SC_PAGESIZE: + return __sysconfig (_CONFIG_PAGESIZE); + + case _SC_AIO_LISTIO_MAX: +#ifdef AIO_LISTIO_MAX + return AIO_LISTIO_MAX; +#else + return -1; +#endif + + case _SC_AIO_MAX: +#ifdef AIO_MAX + return AIO_MAX; +#else + return -1; +#endif + + case _SC_AIO_PRIO_DELTA_MAX: +#ifdef AIO_PRIO_DELTA_MAX + return AIO_PRIO_DELTA_MAX; +#else + return -1; +#endif + + case _SC_DELAYTIMER_MAX: +#ifdef DELAYTIMER_MAX + return DELAYTIMER_MAX; +#else + return -1; +#endif + + case _SC_MQ_OPEN_MAX: +#ifdef MQ_OPEN_MAX + return MQ_OPEN_MAX; +#else + return -1; +#endif + + case _SC_MQ_PRIO_MAX: +#ifdef MQ_PRIO_MAX + return MQ_PRIO_MAX; +#else + return -1; +#endif + + case _SC_RTSIG_MAX: +#ifdef RTSIG_MAX + return RTSIG_MAX; +#else + return -1; +#endif + + case _SC_SEM_NSEMS_MAX: +#ifdef SEM_NSEMS_MAX + return SEM_NSEMS_MAX; +#else + return -1; +#endif + + case _SC_SEM_VALUE_MAX: +#ifdef SEM_VALUE_MAX + return SEM_VALUE_MAX; +#else + return -1; +#endif + + case _SC_SIGQUEUE_MAX: +#ifdef SIGQUEUE_MAX + return SIGQUEUE_MAX; +#else + return -1; +#endif + + case _SC_TIMER_MAX: +#ifdef TIMER_MAX + return TIMER_MAX; +#else + return -1; +#endif + + case _SC_BC_BASE_MAX: +#ifdef BC_BASE_MAX + return BC_BASE_MAX; +#else + return -1; +#endif + + case _SC_BC_DIM_MAX: +#ifdef BC_DIM_MAX + return BC_DIM_MAX; +#else + return -1; +#endif + + case _SC_BC_SCALE_MAX: +#ifdef BC_SCALE_MAX + return BC_SCALE_MAX; +#else + return -1; +#endif + + case _SC_BC_STRING_MAX: +#ifdef BC_STRING_MAX + return BC_STRING_MAX; +#else + return -1; +#endif + + case _SC_EQUIV_CLASS_MAX: +#ifdef EQUIV_CLASS_MAX + return EQUIV_CLASS_MAX; +#else + return -1; +#endif + + case _SC_EXPR_NEST_MAX: +#ifdef EXPR_NEST_MAX + return EXPR_NEST_MAX; +#else + return -1; +#endif + + case _SC_LINE_MAX: +#ifdef LINE_MAX + return LINE_MAX; +#else + return -1; +#endif + + case _SC_RE_DUP_MAX: +#ifdef RE_DUP_MAX + return RE_DUP_MAX; +#else + return -1; +#endif + + case _SC_CHARCLASS_NAME_MAX: +#ifdef CHARCLASS_NAME_MAX + return CHARCLASS_NAME_MAX; +#else + return -1; +#endif + + case _SC_2_VERSION: + /* This is actually supposed to return the version + of the 1003.2 utilities on the system {POSIX2_VERSION}. */ + return _POSIX2_C_VERSION; + + case _SC_2_C_BIND: +#ifdef _POSIX2_C_BIND + return _POSIX2_C_BIND; +#else + return -1; +#endif + + case _SC_2_C_DEV: +#ifdef _POSIX2_C_DEV + return _POSIX2_C_DEV; +#else + return -1; +#endif + + case _SC_2_FORT_DEV: +#ifdef _POSIX2_FORT_DEV + return _POSIX2_FORT_DEV; +#else + return -1; +#endif + + case _SC_2_SW_DEV: +#ifdef _POSIX2_SW_DEV + return _POSIX2_SW_DEV; +#else + return -1; +#endif + } +} + +weak_alias (__sysconf, sysconf) +libc_hidden_def (__sysconf) diff --git a/ports/sysdeps/unix/sysv/sysv4/sysconfig.h b/ports/sysdeps/unix/sysv/sysv4/sysconfig.h new file mode 100644 index 000000000..b51a3649a --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/sysconfig.h @@ -0,0 +1,28 @@ +/* `__sysconfig' NAME values. + Copyright (C) 1993, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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 __SYSCONFIG_H +#define __SYSCONFIG_H + +#define _CONFIG_OPEN_FILES 4 /* process limit on open files */ +#define _CONFIG_PAGESIZE 6 /* MMU page size */ +#define _CONFIG_CLK_TCK 7 /* all times are in CLK_TCKths of a second */ + +#endif diff --git a/ports/sysdeps/unix/sysv/sysv4/system.c b/ports/sysdeps/unix/sysv/sysv4/system.c new file mode 100644 index 000000000..fbfe43f19 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/system.c @@ -0,0 +1,2 @@ +/* SVR4 does have `waitpid'. Avoid unix/system.c, which says we don't. */ +#include <sysdeps/posix/system.c> diff --git a/ports/sysdeps/unix/sysv/sysv4/waitpid.c b/ports/sysdeps/unix/sysv/sysv4/waitpid.c new file mode 100644 index 000000000..23f9ceb02 --- /dev/null +++ b/ports/sysdeps/unix/sysv/sysv4/waitpid.c @@ -0,0 +1,120 @@ +/* Copyright (C) 1993,94,95,96,97,2002,2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Brendan Kehoe (brendan@zen.org). + + 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. */ + +#include <errno.h> +#include <sys/wait.h> +#include <sys/types.h> +#include <stddef.h> +#include "siginfo.h" + +typedef enum __idtype + { + /* Look for processes based upon a given PID. */ + P_PID, + + /* Look for processes based upon a given process-group ID. */ + P_PGID = 2, + + /* Look for any process. */ + P_ALL = 7, + } __idtype_t; + +extern __pid_t __getpgid (__pid_t pid); +extern int __waitid (__idtype_t idtype, __pid_t id, + __siginfo_t *infop, int options); + +/* Wait for a child matching PID to die. + If PID is greater than 0, match any process whose process ID is PID. + If PID is (pid_t) -1, match any process. + If PID is (pid_t) 0, match any process with the + same process group as the current process. + If PID is less than -1, match any process whose + process group is the absolute value of PID. + If the WNOHANG bit is set in OPTIONS, and that child + is not already dead, return (pid_t) 0. If successful, + return PID and store the dead child's status in STAT_LOC. + Return (pid_t) -1 for errors. If the WUNTRACED bit is set in OPTIONS, + return status for stopped children; otherwise don't. */ + +__pid_t +__libc_waitpid (__pid_t pid, int *stat_loc, int options) +{ + __idtype_t idtype; + __pid_t tmp_pid = pid; + __siginfo_t infop; + + if (pid <= WAIT_MYPGRP) + { + if (pid == WAIT_ANY) + { + /* Request the status for any child. */ + idtype = P_ALL; + } + else if (pid == WAIT_MYPGRP) + { + /* Request the status for any child process that has + a pgid that's equal to that of our parent. */ + tmp_pid = __getpgid (0); + idtype = P_PGID; + } + else /* PID < -1 */ + { + /* Request the status for any child whose pgid is equal + to the absolute value of PID. */ + tmp_pid = pid & ~0; /* XXX not pseudo-insn */ + idtype = P_PGID; + } + } + else + { + /* Request the status for the child whose pid is PID. */ + idtype = P_PID; + } + + if (__waitid (idtype, tmp_pid, &infop, options | WEXITED | WTRAPPED) < 0) + return -1; + + switch (infop.__code) + { + case EXITED: + *stat_loc = W_EXITCODE (infop.__status, 0); + break; + case STOPPED: + case TRAPPED: + *stat_loc = W_STOPCODE (infop.__status); + break; + case KILLED: + /* Don't know what to do with continue, since it isn't documented. + Putting it here seemed the right place though. */ + case CONTINUED: + *stat_loc = infop.__status; + /* FALLTHROUGH */ + case CORED: + *stat_loc |= WCOREFLAG; + break; + } + + /* Return the PID out of the INFOP structure instead of the one we were + called with, to account for cases of being called with -1 to signify + any PID. */ + return infop.__pid; +} +weak_alias (__libc_waitpid, __waitpid) +weak_alias (__libc_waitpid, waitpid) +libc_hidden_weak (__waitpid) diff --git a/ports/sysdeps/vax/DEFS.h b/ports/sysdeps/vax/DEFS.h new file mode 100644 index 000000000..50f8b7e13 --- /dev/null +++ b/ports/sysdeps/vax/DEFS.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 1982, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)DEFS.h 8.1 (Berkeley) 6/4/93 + */ + +#define R0 0x001 +#define R1 0x002 +#define R2 0x004 +#define R3 0x008 +#define R4 0x010 +#define R5 0x020 +#define R6 0x040 +#define R7 0x080 +#define R8 0x100 +#define R9 0x200 +#define R10 0x400 +#define R11 0x800 + +#ifdef PROF +#define ENTRY(x, regs) \ + .globl _/**/x; .align 2; _/**/x: .word regs; \ + .data; 1:; .long 0; .text; moval 1b,r0; jsb mcount +#define ASENTRY(x, regs) \ + .globl x; .align 2; x: .word regs; \ + .data; 1:; .long 0; .text; moval 1b,r0; jsb mcount +#else +#define ENTRY(x, regs) \ + .globl _/**/x; .align 2; _/**/x: .word regs +#define ASENTRY(x, regs) \ + .globl x; .align 2; x: .word regs +#endif diff --git a/ports/sysdeps/vax/Dist b/ports/sysdeps/vax/Dist new file mode 100644 index 000000000..22a693094 --- /dev/null +++ b/ports/sysdeps/vax/Dist @@ -0,0 +1,2 @@ +DEFS.h +fl.h diff --git a/ports/sysdeps/vax/Makefile b/ports/sysdeps/vax/Makefile new file mode 100644 index 000000000..909fc29f3 --- /dev/null +++ b/ports/sysdeps/vax/Makefile @@ -0,0 +1,32 @@ +# Copyright (C) 1991, 1994, 1997 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. + +ifeq ($(subdir),math) +ifndef math-twiddled + +elided-routines := $(elided-routines) acos asin cos sin ceil rint hypot \ + __copysign __scalb __drem __logb __finite +sysdep_routines := $(sysdep_routines) asincos sincos argred \ + support exp__E log__L + +math-twiddled := t +endif + +bsdmath_dirs := $(bsdmath_dirs) vax + +endif diff --git a/ports/sysdeps/vax/__longjmp.c b/ports/sysdeps/vax/__longjmp.c new file mode 100644 index 000000000..8ffb8cd4b --- /dev/null +++ b/ports/sysdeps/vax/__longjmp.c @@ -0,0 +1,129 @@ +/* Copyright (C) 1991, 1992, 1994, 1997 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. + + Derived from @(#)_setjmp.s 5.7 (Berkeley) 6/27/88, + Copyright (C) 1980 Regents of the University of California. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 4. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE.*/ + +#include <setjmp.h> + +#ifndef __GNUC__ + #error This file uses GNU C extensions; you must compile with GCC. +#endif + + +#define REI 02 /* Vax `rei' opcode. */ + +/* Jump to the position specified by ENV, causing the + setjmp call there to return VAL, or 1 if VAL is 0. */ +__NORETURN +void +__longjmp (env, val) + const __jmp_buf env; + int val; +{ + register long int *fp asm("fp"); + long int *regsave; + unsigned long int flags; + + if (env.__fp == NULL) + __libc_fatal("longjmp: Invalid ENV argument.\n"); + + if (val == 0) + val = 1; + + asm volatile("loop:"); + + flags = *(long int *) (6 + (char *) fp); + regsave = (long int *) (20 + (char *) fp); + if (flags & 1) + /* R0 was saved by the caller. + Store VAL where it will be restored from. */ + *regsave++ = val; + if (flags & 2) + /* R1 was saved by the caller. + Store ENV where it will be restored from. */ + *regsave = env; + + /* Was the FP saved in the last call the same one in ENV? */ + asm volatile("cmpl %0, 12(fp);" + /* Yes, return to it. */ + "beql done;" + /* The FP in ENV is less than the one saved in the last call. + This means we have already returned from the function that + called `setjmp' with ENV! */ + "blssu latejump;" : /* No outputs. */ : "g" (env.__fp)); + + /* We are more than one level below the state in ENV. + Return to where we will pop another stack frame. */ + asm volatile("movl $loop, 16(fp);" + "ret"); + + asm volatile("done:"); + { + char return_insn asm("*16(fp)"); + if (return_insn == REI) + /* We're returning with an `rei' instruction. + Do a return with PSL-PC pop. */ + asm volatile("movab 0f, 16(fp)"); + else + /* Do a standard return. */ + asm volatile("movab 1f, 16(fp)"); + + /* Return. */ + asm volatile("ret"); + } + + asm volatile("0:" /* `rei' return. */ + /* Compensate for PSL-PC push. */ + "addl2 %0, sp;" + "1:" /* Standard return. */ + /* Return to saved PC. */ + "jmp %1" : /* No outputs. */ : + "g" (8), "g" (env.__pc)); + + /* Jump here when the FP saved in ENV points + to a function that has already returned. */ + asm volatile("latejump:"); + __libc_fatal("longjmp: Attempt to jump to a function that has returned.\n"); +} diff --git a/ports/sysdeps/vax/add_n.s b/ports/sysdeps/vax/add_n.s new file mode 100644 index 000000000..265a8c788 --- /dev/null +++ b/ports/sysdeps/vax/add_n.s @@ -0,0 +1,48 @@ +# VAX __mpn_add_n -- Add two limb vectors of the same length > 0 and store +# sum in a third limb vector. + +# Copyright (C) 1992, 1994 Free Software Foundation, Inc. + +# This file is part of the GNU MP Library. + +# The GNU MP 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 MP 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 MP 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. + + +# INPUT PARAMETERS +# res_ptr (sp + 4) +# s1_ptr (sp + 8) +# s2_ptr (sp + 12) +# size (sp + 16) + +.text + .align 1 +.globl ___mpn_add_n +___mpn_add_n: + .word 0x0 + movl 16(ap),r0 + movl 12(ap),r1 + movl 8(ap),r2 + movl 4(ap),r3 + subl2 r4,r4 + +Loop: + movl (r2)+,r4 + adwc (r1)+,r4 + movl r4,(r3)+ + jsobgtr r0,Loop + + adwc r0,r0 + ret diff --git a/ports/sysdeps/vax/addmul_1.s b/ports/sysdeps/vax/addmul_1.s new file mode 100644 index 000000000..c6d657dcf --- /dev/null +++ b/ports/sysdeps/vax/addmul_1.s @@ -0,0 +1,126 @@ +# VAX __mpn_addmul_1 -- Multiply a limb vector with a limb and add +# the result to a second limb vector. + +# Copyright (C) 1992, 1994 Free Software Foundation, Inc. + +# This file is part of the GNU MP Library. + +# The GNU MP 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 MP 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 MP 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. + + +# INPUT PARAMETERS +# res_ptr (sp + 4) +# s1_ptr (sp + 8) +# size (sp + 12) +# s2_limb (sp + 16) + +.text + .align 1 +.globl ___mpn_addmul_1 +___mpn_addmul_1: + .word 0xfc0 + movl 12(ap),r4 + movl 8(ap),r8 + movl 4(ap),r9 + movl 16(ap),r6 + jlss s2_big + + clrl r3 + incl r4 + ashl $-1,r4,r7 + jlbc r4,L1 + clrl r11 + +# Loop for S2_LIMB < 0x80000000 +Loop1: movl (r8)+,r1 + jlss L1n0 + emul r1,r6,$0,r2 + addl2 r11,r2 + adwc $0,r3 + addl2 r2,(r9)+ + adwc $0,r3 +L1: movl (r8)+,r1 + jlss L1n1 +L1p1: emul r1,r6,$0,r10 + addl2 r3,r10 + adwc $0,r11 + addl2 r10,(r9)+ + adwc $0,r11 + + jsobgtr r7,Loop1 + movl r11,r0 + ret + +L1n0: emul r1,r6,$0,r2 + addl2 r11,r2 + adwc r6,r3 + addl2 r2,(r9)+ + adwc $0,r3 + movl (r8)+,r1 + jgeq L1p1 +L1n1: emul r1,r6,$0,r10 + addl2 r3,r10 + adwc r6,r11 + addl2 r10,(r9)+ + adwc $0,r11 + + jsobgtr r7,Loop1 + movl r11,r0 + ret + + +s2_big: clrl r3 + incl r4 + ashl $-1,r4,r7 + jlbc r4,L2 + clrl r11 + +# Loop for S2_LIMB >= 0x80000000 +Loop2: movl (r8)+,r1 + jlss L2n0 + emul r1,r6,$0,r2 + addl2 r11,r2 + adwc r1,r3 + addl2 r2,(r9)+ + adwc $0,r3 +L2: movl (r8)+,r1 + jlss L2n1 +L2p1: emul r1,r6,$0,r10 + addl2 r3,r10 + adwc r1,r11 + addl2 r10,(r9)+ + adwc $0,r11 + + jsobgtr r7,Loop2 + movl r11,r0 + ret + +L2n0: emul r1,r6,$0,r2 + addl2 r11,r2 + adwc r6,r3 + addl2 r2,(r9)+ + adwc r1,r3 + movl (r8)+,r1 + jgeq L2p1 +L2n1: emul r1,r6,$0,r10 + addl2 r3,r10 + adwc r6,r11 + addl2 r10,(r9)+ + adwc r1,r11 + + jsobgtr r7,Loop2 + movl r11,r0 + ret diff --git a/ports/sysdeps/vax/bcopy.s b/ports/sysdeps/vax/bcopy.s new file mode 100644 index 000000000..186ad365f --- /dev/null +++ b/ports/sysdeps/vax/bcopy.s @@ -0,0 +1,74 @@ +/* + * Copyright (c) 1983 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)bcopy.s 5.6 (Berkeley) 6/1/90" +#endif /* LIBC_SCCS and not lint */ + +/* bcopy(from, to, size) */ + +#include "DEFS.h" + +ENTRY(bcopy, R6) + movl 4(ap),r1 + movl 8(ap),r3 + movl 12(ap),r6 + cmpl r1,r3 + bgtr 2f # normal forward case + blss 3f # overlapping, must do backwards + ret # equal, nothing to do +1: + subl2 r0,r6 + movc3 r0,(r1),(r3) +2: + movzwl $65535,r0 + cmpl r6,r0 + jgtr 1b + movc3 r6,(r1),(r3) + ret +3: + addl2 r6,r1 + addl2 r6,r3 + movzwl $65535,r0 + jbr 5f +4: + subl2 r0,r6 + subl2 r0,r1 + subl2 r0,r3 + movc3 r0,(r1),(r3) + movzwl $65535,r0 + subl2 r0,r1 + subl2 r0,r3 +5: + cmpl r6,r0 + jgtr 4b + subl2 r6,r1 + subl2 r6,r3 + movc3 r6,(r1),(r3) + ret diff --git a/ports/sysdeps/vax/bits/huge_val.h b/ports/sysdeps/vax/bits/huge_val.h new file mode 100644 index 000000000..63395b15e --- /dev/null +++ b/ports/sysdeps/vax/bits/huge_val.h @@ -0,0 +1,26 @@ +/* `HUGE_VAL' constant for Vaxen. + Used by <stdlib.h> and <math.h> functions for overflow. + Copyright (C) 1992, 1996, 1997 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 _MATH_H +# error "Never use <bits/huge_val.h> directly; include <math.h> instead." +#endif + + +#define HUGE_VAL 1.70141182460469227e38 diff --git a/ports/sysdeps/vax/bits/setjmp.h b/ports/sysdeps/vax/bits/setjmp.h new file mode 100644 index 000000000..10ca170a2 --- /dev/null +++ b/ports/sysdeps/vax/bits/setjmp.h @@ -0,0 +1,11 @@ +/* Define the machine-dependent type `jmp_buf'. Vax version. */ + +#ifndef _SETJMP_H +# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead." +#endif + +typedef struct + { + PTR __fp; + PTR __pc; + } __jmp_buf[1]; diff --git a/ports/sysdeps/vax/bsd-_setjmp.S b/ports/sysdeps/vax/bsd-_setjmp.S new file mode 100644 index 000000000..756e96b70 --- /dev/null +++ b/ports/sysdeps/vax/bsd-_setjmp.S @@ -0,0 +1,33 @@ +/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. Vax version. + Copyright (C) 1994, 1997, 2002 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. */ + +/* This just does a tail-call to `__sigsetjmp (ARG, 0)'. + We cannot do it in C because it must be a tail-call, so frame-unwinding + in setjmp doesn't clobber the state restored by longjmp. */ + +#include <sysdep.h> + +ENTRY (_setjmp) + popl r0 /* Pop return PC. */ + popl r1 /* Pop jmp_buf argument. */ + pushl $0 /* Push second argument of zero. */ + pushl r1 /* Push back first argument. */ + pushl r0 /* Push back return PC. */ + jmp C_SYMBOL_NAME (__sigsetjmp) +libc_hidden_def (_setjmp) diff --git a/ports/sysdeps/vax/bsd-setjmp.S b/ports/sysdeps/vax/bsd-setjmp.S new file mode 100644 index 000000000..792fcf7a6 --- /dev/null +++ b/ports/sysdeps/vax/bsd-setjmp.S @@ -0,0 +1,32 @@ +/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. Vax version. + Copyright (C) 1994, 1997 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. */ + +/* This just does a tail-call to `__sigsetjmp (ARG, 1)'. + We cannot do it in C because it must be a tail-call, so frame-unwinding + in setjmp doesn't clobber the state restored by longjmp. */ + +#include <sysdep.h> + +ENTRY (setjmp) + popl r0 /* Pop return PC. */ + popl r1 /* Pop jmp_buf argument. */ + pushl $1 /* Push second argument of one. */ + pushl r1 /* Push back first argument. */ + pushl r0 /* Push back return PC. */ + jmp C_SYMBOL_NAME (__sigsetjmp) diff --git a/ports/sysdeps/vax/bzero.s b/ports/sysdeps/vax/bzero.s new file mode 100644 index 000000000..be61a97d8 --- /dev/null +++ b/ports/sysdeps/vax/bzero.s @@ -0,0 +1,50 @@ +/* + * Copyright (c) 1983 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)bzero.s 5.6 (Berkeley) 6/1/90" +#endif /* LIBC_SCCS and not lint */ + +/* bzero(base, length) */ + +#include "DEFS.h" + +ENTRY(__bzero, 0) + movl 4(ap),r3 + jbr 2f +1: + subl2 r0,8(ap) + movc5 $0,(r3),$0,r0,(r3) +2: + movzwl $65535,r0 + cmpl 8(ap),r0 + jgtr 1b + movc5 $0,(r3),$0,8(ap),(r3) + ret +weak_alias (__bzero, bzero) diff --git a/ports/sysdeps/vax/ffs.s b/ports/sysdeps/vax/ffs.s new file mode 100644 index 000000000..6272cfd59 --- /dev/null +++ b/ports/sysdeps/vax/ffs.s @@ -0,0 +1,45 @@ +/* + * Copyright (c) 1983 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)ffs.s 5.6 (Berkeley) 6/1/90" +#endif /* LIBC_SCCS and not lint */ + +/* bit = ffs(value) */ + +#include "DEFS.h" + +ENTRY(__ffs, 0) + ffs $0,$32,4(ap),r0 + bneq 1f + mnegl $1,r0 +1: + incl r0 + ret +weak_alias (__ffs, ffs) diff --git a/ports/sysdeps/vax/fl.h b/ports/sysdeps/vax/fl.h new file mode 100644 index 000000000..79cbeb247 --- /dev/null +++ b/ports/sysdeps/vax/fl.h @@ -0,0 +1,68 @@ +/* Copyright (C) 1991, 1997 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 __need_HUGE_VAL + +/* Floating-point constants for Vaxen. */ + +#define FLT_RADIX 2 + +#define FLT_ROUNDS _FLT_ROUNDS_TONEAREST + +#define FLT_MANT_DIG 23 +#define DBL_MANT_DIG 55 +#define LDBL_MANT_DIG 55 + +#define FLT_DIG 6 +#define DBL_DIG 16 +#define LDBL_DIG 16 + +#define FLT_MIN_EXP (-128) +#define DBL_MIN_EXP (-128) +#define LDBL_MIN_EXP (-128) + +#define FLT_MIN_10_EXP (-38) +#define DBL_MIN_10_EXP (-38) +#define LDBL_MIN_10_EXP (-38) + +#define FLT_MAX_EXP 127 +#define DBL_MAX_EXP 127 +#define LDBL_MAX_EXP 127 + +#define FLT_MAX_10_EXP 38 +#define DBL_MAX_10_EXP 38 +#define LDBL_MAX_10_EXP 38 + +#define FLT_MAX 1.7014116e38 +#define DBL_MAX 1.70141182460469227e38 +#define LDBL_MAX DBL_MAX + +#define FLT_EPSILON 2.384186e-7 +#define DBL_EPSILON 5.55111512312578270e-17 +#define LDBL_EPSILON DBL_EPSILON + +#define FLT_MIN 0.2938736e-38 +#define DBL_MIN 0.29387358770557187e-38 +#define LDBL_MIN DBL_MIN + +#else /* Need HUGE_VAL. */ + +/* Used by <stdlib.h> and <math.h> functions for overflow. */ +#define HUGE_VAL 1.70141182460469227e38 + +#endif /* Don't need HUGE_VAL. */ diff --git a/ports/sysdeps/vax/gccframe.h b/ports/sysdeps/vax/gccframe.h new file mode 100644 index 000000000..323d5115d --- /dev/null +++ b/ports/sysdeps/vax/gccframe.h @@ -0,0 +1,22 @@ +/* Definition of object in frame unwind info. vax version. + 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 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. */ + +#define DWARF_FRAME_REGISTERS 16 + +#include <sysdeps/generic/gccframe.h> diff --git a/ports/sysdeps/vax/gmp-mparam.h b/ports/sysdeps/vax/gmp-mparam.h new file mode 100644 index 000000000..1ebfa19c5 --- /dev/null +++ b/ports/sysdeps/vax/gmp-mparam.h @@ -0,0 +1,29 @@ +/* gmp-mparam.h -- Compiler/machine parameter header file. + +Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP 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 MP 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 MP 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 BITS_PER_MP_LIMB 32 +#define BYTES_PER_MP_LIMB 4 +#define BITS_PER_LONGINT 32 +#define BITS_PER_INT 32 +#define BITS_PER_SHORTINT 16 +#define BITS_PER_CHAR 8 + +#define IEEE_DOUBLE_BIG_ENDIAN 0 diff --git a/ports/sysdeps/vax/htonl.s b/ports/sysdeps/vax/htonl.s new file mode 100644 index 000000000..f3e2195c0 --- /dev/null +++ b/ports/sysdeps/vax/htonl.s @@ -0,0 +1,43 @@ +/* + * Copyright (C) 1983 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)htonl.s 5.5 (Berkeley) 6/27/88" +#endif /* LIBC_SCCS and not lint */ + +/* netorder = htonl(hostorder) */ + +#include "DEFS.h" + +ENTRY(htonl, 0) + rotl $-8,4(ap),r0 + insv r0,$16,$8,r0 + movb 7(ap),r0 + ret +weak_alias (htonl, ntohl) diff --git a/ports/sysdeps/vax/htons.s b/ports/sysdeps/vax/htons.s new file mode 100644 index 000000000..5f9ea7384 --- /dev/null +++ b/ports/sysdeps/vax/htons.s @@ -0,0 +1,43 @@ +/* + * Copyright (C) 1983 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)htons.s 5.5 (Berkeley) 6/27/88" +#endif /* LIBC_SCCS and not lint */ + +/* hostorder = htons(netorder) */ + +#include "DEFS.h" + +ENTRY(htons, 0) + rotl $8,4(ap),r0 + movb 5(ap),r0 + movzwl r0,r0 + ret +weak_alias (htons, ntohs) diff --git a/ports/sysdeps/vax/memccpy.c b/ports/sysdeps/vax/memccpy.c new file mode 100644 index 000000000..9a459ff5e --- /dev/null +++ b/ports/sysdeps/vax/memccpy.c @@ -0,0 +1,46 @@ +/* Copyright (C) 1991, 1992, 1995, 1997 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. */ + +#include <string.h> + +/* Copy no more than N bytes of SRC to DEST, stopping when C is found. + Return the position in DEST one byte past where C was copied, + or NULL if C was not found in the first N bytes of SRC. */ +void * +__memccpy (dest, src, c, n) + void *dest; + const void *src; + int c; + size_t nbytes; +{ + /* Except when N > 65535, this is what a hand-coded version would + do anyway. */ + + void *found = memchr (src, c, n); + + if (found == NULL) + { + (void) memcpy (dest, src, n); + return NULL; + } + + (void) memcpy (dest, src, (char *) found + 1 - (char *) src); + return (PTR) ((char *) dest + ((char *) found + 1 - (char *) src)); +} + +weak_alias (__memccpy, memccpy) diff --git a/ports/sysdeps/vax/memchr.s b/ports/sysdeps/vax/memchr.s new file mode 100644 index 000000000..5c54ba8e7 --- /dev/null +++ b/ports/sysdeps/vax/memchr.s @@ -0,0 +1,74 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)memchr.s 5.1 (Berkeley) 5/29/90" +#endif /* LIBC_SCCS and not lint */ + +/* + * Find the first occurrence of c in the memory at cp (length n). + * Return pointer to match or null pointer. + * + * This code optimises the usual case (0 < n < 65535). + * + * void * + * memchr(cp, c, n) + * char *cp, c; + * size_t n; + */ + +#include "DEFS.h" + +ENTRY(__memchr, 0) + movq 4(ap),r1 # r1 = cp; r2 = c + movl 12(ap),r0 # r0 = n + movzwl $65535,r4 # handy constant +0: + cmpl r0,r4 # check for annoying locc limit + bgtru 3f + + /* n <= 65535 */ + locc r2,r0,(r1) # search n bytes for c + beql 2f # done if not found (r0 already 0) +1: /* found character c at (r1) */ + movl r1,r0 +2: + ret + +3: /* n > 65535 */ + locc r2,r4,(r1) # search 65535 bytes for c + beql 1b # done if found + decw r0 # from 0 to 65535 + subl2 r0,r4 # adjust n + brb 0b # and loop + +weak_alias (__memchr, memchr) +#if !__BOUNDED_POINTERS__ +weak_alias (__memchr, __ubp_memchr) +#endif diff --git a/ports/sysdeps/vax/memcmp.s b/ports/sysdeps/vax/memcmp.s new file mode 100644 index 000000000..e32fe24f4 --- /dev/null +++ b/ports/sysdeps/vax/memcmp.s @@ -0,0 +1,59 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)memcmp.s 5.1 (Berkeley) 5/15/90" +#endif /* LIBC_SCCS and not lint */ + +/* int memcmp(s1, s2, n) */ + +#include "DEFS.h" + +ENTRY(memcmp, 0) + movl 4(ap),r1 /* r1 = s1 */ + movq 8(ap),r3 /* r3 = s2; r4 = n */ + movzwl $65535,r5 +0: + cmpl r4,r5 + jgtru 3f /* handle stupid cmpc3 limitation */ + cmpc3 r4,(r1),(r3) /* compare */ + beql 2f /* done if same (r0 = 0) */ +1: + movzbl (r1),r0 + movzbl (r3),r2 + subl2 r2,r0 /* return *s1 - *s2; s1,s2 unsigned chars */ +2: + ret +3: + subl2 r5,r4 /* do 64K; adjust count */ + cmpc3 r5,(r1),(r3) + jeql 0b /* loop if same */ + jbr 1b + +weak_alias (memcmp, bcmp) diff --git a/ports/sysdeps/vax/memmove.s b/ports/sysdeps/vax/memmove.s new file mode 100644 index 000000000..738544142 --- /dev/null +++ b/ports/sysdeps/vax/memmove.s @@ -0,0 +1,89 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)memmove.s 5.1 (Berkeley) 5/15/90" +#endif /* LIBC_SCCS and not lint */ + +/* + * void *memmove(dst, src, size) + * returns dst + * + * This optimises the usual case (count < 65536) at the expense + * of some extra memory references and branches when count >= 65536. + */ + +#include "DEFS.h" + +ENTRY(memmove, 0) + movzwl $65535,r0 /* r0 = 64K (needed below) */ + movq 8(ap),r1 /* r1 = src, r2 = length */ + movl 4(ap),r3 /* r3 = dst */ + cmpl r1,r3 + bgtru 1f /* normal forward case */ + beql 2f /* equal, nothing to do */ + addl2 r2,r1 /* overlaps iff src<dst but src+len>dst */ + cmpl r1,r3 + bgtru 4f /* overlapping, must move backwards */ + subl2 r2,r1 + +1: /* move forward */ + cmpl r2,r0 + bgtru 3f /* stupid movc3 limitation */ + movc3 r2,(r1),(r3) /* move it all */ +2: + movl 4(ap),r0 /* return original dst */ + ret +3: + subl2 r0,12(ap) /* adjust length by 64K */ + movc3 r0,(r1),(r3) /* move 64K */ + movl 12(ap),r2 + decw r0 /* from 0 to 65535 */ + brb 1b /* retry */ + +4: /* move backward */ + addl2 r2,r3 +5: + cmpl r2,r0 + bgtru 6f /* stupid movc3 limitation */ + subl2 r2,r1 + subl2 r2,r3 + movc3 r2,(r1),(r3) /* move it all */ + movl 4(ap),r0 /* return original dst */ + ret +6: + subl2 r0,12(ap) /* adjust length by 64K */ + subl2 r0,r1 + subl2 r0,r3 + movc3 r0,(r1),(r3) /* move 64K */ + movl 12(ap),r2 + decw r0 + subl2 r0,r1 + subl2 r0,r3 + brb 5b diff --git a/ports/sysdeps/vax/memset.s b/ports/sysdeps/vax/memset.s new file mode 100644 index 000000000..dda14868f --- /dev/null +++ b/ports/sysdeps/vax/memset.s @@ -0,0 +1,51 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)memset.s 5.2 (Berkeley) 5/12/91" +#endif /* LIBC_SCCS and not lint */ + +/* void *memset(base, c, length) */ + +#include "DEFS.h" + +ENTRY(memset, 0) + movl 4(ap),r3 +1: + movzwl $65535,r0 + movq 8(ap),r1 + cmpl r2,r0 + jgtru 2f + movc5 $0,(r3),r1,r2,(r3) + movl r1,r0 + ret +2: + subl2 r0,12(ap) + movc5 $0,(r3),r1,r0,(r3) + jbr 1b diff --git a/ports/sysdeps/vax/mul_1.s b/ports/sysdeps/vax/mul_1.s new file mode 100644 index 000000000..295638b06 --- /dev/null +++ b/ports/sysdeps/vax/mul_1.s @@ -0,0 +1,123 @@ +# VAX __mpn_mul_1 -- Multiply a limb vector with a limb and store +# the result in a second limb vector. + +# Copyright (C) 1992, 1994 Free Software Foundation, Inc. + +# This file is part of the GNU MP Library. + +# The GNU MP 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 MP 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 MP 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. + + +# INPUT PARAMETERS +# res_ptr (sp + 4) +# s1_ptr (sp + 8) +# size (sp + 12) +# s2_limb (sp + 16) + +.text + .align 1 +.globl ___mpn_mul_1 +___mpn_mul_1: + .word 0xfc0 + movl 12(ap),r4 + movl 8(ap),r8 + movl 4(ap),r9 + movl 16(ap),r6 + jlss s2_big + +# One might want to combine the addl2 and the store below, but that +# is actually just slower according to my timing tests. (VAX 3600) + + clrl r3 + incl r4 + ashl $-1,r4,r7 + jlbc r4,L1 + clrl r11 + +# Loop for S2_LIMB < 0x80000000 +Loop1: movl (r8)+,r1 + jlss L1n0 + emul r1,r6,$0,r2 + addl2 r11,r2 + adwc $0,r3 + movl r2,(r9)+ +L1: movl (r8)+,r1 + jlss L1n1 +L1p1: emul r1,r6,$0,r10 + addl2 r3,r10 + adwc $0,r11 + movl r10,(r9)+ + + jsobgtr r7,Loop1 + movl r11,r0 + ret + +L1n0: emul r1,r6,$0,r2 + addl2 r11,r2 + adwc r6,r3 + movl r2,(r9)+ + movl (r8)+,r1 + jgeq L1p1 +L1n1: emul r1,r6,$0,r10 + addl2 r3,r10 + adwc r6,r11 + movl r10,(r9)+ + + jsobgtr r7,Loop1 + movl r11,r0 + ret + + +s2_big: clrl r3 + incl r4 + ashl $-1,r4,r7 + jlbc r4,L2 + clrl r11 + +# Loop for S2_LIMB >= 0x80000000 +Loop2: movl (r8)+,r1 + jlss L2n0 + emul r1,r6,$0,r2 + addl2 r11,r2 + adwc r1,r3 + movl r2,(r9)+ +L2: movl (r8)+,r1 + jlss L2n1 +L2p1: emul r1,r6,$0,r10 + addl2 r3,r10 + adwc r1,r11 + movl r10,(r9)+ + + jsobgtr r7,Loop2 + movl r11,r0 + ret + +L2n0: emul r1,r6,$0,r2 + addl2 r1,r3 + addl2 r11,r2 + adwc r6,r3 + movl r2,(r9)+ + movl (r8)+,r1 + jgeq L2p1 +L2n1: emul r1,r6,$0,r10 + addl2 r1,r11 + addl2 r3,r10 + adwc r6,r11 + movl r10,(r9)+ + + jsobgtr r7,Loop2 + movl r11,r0 + ret diff --git a/ports/sysdeps/vax/setjmp.c b/ports/sysdeps/vax/setjmp.c new file mode 100644 index 000000000..0e38f3974 --- /dev/null +++ b/ports/sysdeps/vax/setjmp.c @@ -0,0 +1,62 @@ +/* Copyright (C) 1991, 1992, 1994, 1997 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. + + Derived from @(#)_setjmp.s 5.7 (Berkeley) 6/27/88, + Copyright (C) 1980 Regents of the University of California. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 4. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ + +#include <setjmp.h> + + +/* Save the current program position in ENV and return 0. */ +int +__sigsetjmp (jmp_buf env, int savemask) +{ + /* Save our caller's FP and PC. */ + asm ("movl 12(fp), %0" : "=g" (env[0].__jmpbuf[0].__fp)); + asm ("movl 16(fp), %0" : "=g" (env[0].__jmpbuf[0].__pc)); + + /* Save the signal mask if requested. */ + return __sigjmp_save (env, savemask); +} diff --git a/ports/sysdeps/vax/strcat.s b/ports/sysdeps/vax/strcat.s new file mode 100644 index 000000000..bfe64e61a --- /dev/null +++ b/ports/sysdeps/vax/strcat.s @@ -0,0 +1,62 @@ +/* + * Copyright (c) 1983 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)strcat.s 5.6 (Berkeley) 6/1/90" +#endif /* LIBC_SCCS and not lint */ + +/* + * Concatenate string s2 to the end of s1 + * and return the base of s1. + * + * char * + * strcat(s1, s2) + * char *s1, *s2; + */ +#include "DEFS.h" + +ENTRY(strcat, R6|R7) + movq 4(ap), r6 # r6 = s1; r7 = s2 + movl r6,r1 +0: + locc $0,$65535,(r1) # look for '\0' + beql 0b + movl r1,r3 # save end of s1 +1: + locc $0,$65535,(r7) # find length of s2 + bneq 2f + movc3 $65535,(r7),(r3)# copy full block + movl r1,r7 + jbr 1b +2: + subl2 r7,r1 # calculate length + incl r1 + movc3 r1,(r7),(r3) # copy remainder + movl r6,r0 + ret diff --git a/ports/sysdeps/vax/strchr.s b/ports/sysdeps/vax/strchr.s new file mode 100644 index 000000000..d56cb4b0a --- /dev/null +++ b/ports/sysdeps/vax/strchr.s @@ -0,0 +1,103 @@ +/* + * Copyright (c) 1988 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)strchr.s 5.4 (Berkeley) 6/1/90" +#endif /* LIBC_SCCS and not lint */ + +/* + * Find the first occurrence of c in the string cp. + * Return pointer to match or null pointer. + * + * char * + * strchr(cp, c) + * char *cp, c; + */ +#include "DEFS.h" + + .lcomm tbl,256 + +ENTRY(strchr, 0) + movzwl $65535,r4 /* handy constant */ + movq 4(ap),r1 /* r1 = cp; r2 = c */ + movzbl r2,r2 + beql Lzero /* special case for c == '\0' */ + +/* + * Fancy scanc version. Alas, it is not reentrant. + */ + movab tbl,r3 /* r3 = base of table */ + bbss $0,(r3),Lreent /* ensure not reentering */ + movab (r3)[r2],r5 + incb (r5) /* mark both '\0' and c */ +0: + scanc r4,(r1),(r3),$1 /* look for c or '\0' */ + beql 0b /* still looking */ + movl r1,r0 /* return whatever we found */ + tstb (r0) + bneq 1f # unless it was '\0': + clrl r0 # then return NULL +1: + clrb (r5) /* clean up table */ + clrb (r3) + ret + +/* + * Special case for \0. + */ +Lzero: + locc r2,r4,(r1) /* just find end of string */ + beql Lzero /* still looking */ + movl r1,r0 /* found it */ + ret + +/* + * Slower reentrant version is two two-step searches. The first + * phase runs until we know where the string ends; it locates the + * first occurrence of c within a 65535-byte block. If we find + * the end of the string first, we switch to the second phase, + * were we look only up to the known end of string. + */ +Lreent: +0: /* first phase */ + movl r1,r3 + locc $0,r4,(r3) /* look for '\0' */ + bneq 1f + locc r2,r4,(r3) /* look for c */ + beql 0b /* not found: reset pointer and loop */ + movl r1,r0 /* found: return it */ + ret +1: /* second phase */ + subl3 r3,r1,r0 /* length of short block */ + locc r2,r0,(r3) /* look for c */ + beql 2f /* not found: return NULL */ + movl r1,r0 +2: ret + +weak_alias (strchr, index) diff --git a/ports/sysdeps/vax/strcmp.s b/ports/sysdeps/vax/strcmp.s new file mode 100644 index 000000000..479e14f30 --- /dev/null +++ b/ports/sysdeps/vax/strcmp.s @@ -0,0 +1,81 @@ +/* + * Copyright (c) 1983 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)strcmp.s 5.6 (Berkeley) 6/1/90" +#endif /* LIBC_SCCS and not lint */ + +/* + * Compare string s1 lexicographically to string s2. + * Return: + * 0 s1 == s2 + * > 0 s1 > s2 + * < 0 s2 < s2 + * + * strcmp(s1, s2) + * char *s1, *s2; + */ +#include "DEFS.h" + +ENTRY(strcmp, 0) + movl 4(ap),r1 # r1 = s1 + movl 8(ap),r3 # r3 = s2 + subb3 (r3),(r1),r0 # quick check for first char different + beql 1f # have to keep checking + cvtbl r0,r0 + ret +1: + clrl r5 # calculate min bytes to next page boundary + subb3 r1,$255,r5 # r5 = (bytes - 1) to end of page for s1 + subb3 r3,$255,r0 # r0 = (bytes - 1) to end of page for s2 + cmpb r0,r5 # r5 = min(r0, r5); + bgtru 2f + movb r0,r5 +2: + incl r5 # r5 = min bytes to next page boundary + cmpc3 r5,(r1),(r3) # compare strings + bneq 3f + subl2 r5,r1 # check if found null yet + locc $0,r5,(r1) + beql 1b # not yet done, continue checking + subl2 r0,r3 + mnegb (r3),r0 # r0 = '\0' - *s2 + cvtbl r0,r0 + ret +3: + subl2 r0,r5 # check for null in matching string + subl2 r5,r1 + locc $0,r5,(r1) + bneq 4f + subb3 (r3),(r1),r0 # r0 = *s1 - *s2 + cvtbl r0,r0 + ret +4: + clrl r0 # both the same to null + ret diff --git a/ports/sysdeps/vax/strcpy.s b/ports/sysdeps/vax/strcpy.s new file mode 100644 index 000000000..1eb00ba6c --- /dev/null +++ b/ports/sysdeps/vax/strcpy.s @@ -0,0 +1,58 @@ +/* + * Copyright (c) 1983 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)strcpy.s 5.6 (Berkeley) 6/1/90" +#endif /* LIBC_SCCS and not lint */ + +/* + * Copy string s2 over top of s1. + * Return base of s1. + * + * char * + * strcpy(s1, s2) + * char *s1, *s2; + */ +#include "DEFS.h" + +ENTRY(strcpy, R6) + movl 4(ap), r3 # r3 = s1 + movl 8(ap), r6 # r6 = s2 +1: + locc $0,$65535,(r6) # find length of s2 + bneq 2f + movc3 $65535,(r6),(r3)# copy full block + movl r1,r6 + jbr 1b +2: + subl2 r6,r1 # calculate length + incl r1 + movc3 r1,(r6),(r3) # copy remainder + movl 4(ap),r0 # return base of s1 + ret diff --git a/ports/sysdeps/vax/strcspn.s b/ports/sysdeps/vax/strcspn.s new file mode 100644 index 000000000..155b78308 --- /dev/null +++ b/ports/sysdeps/vax/strcspn.s @@ -0,0 +1,62 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)strcspn.s 5.1 (Berkeley) 5/15/90" +#endif /* LIBC_SCCS and not lint */ + +/* + * Span the complement of string s2 (skip characters that are not in s2). + * Return the number of characters in s1 that were skipped. + * + * size_t + * strcspn(s1, s2) + * const char *s1, *s2; + */ +#include "DEFS.h" + +ENTRY(strcspn, 0) + subl2 $32,sp /* make 256 bit table */ + movc5 $0,(sp),$0,$32,(sp) + movq 4(ap),r1 /* r1 = s1, r2 = s2 */ + + /* turn on bit for each character in s2, including '\0' */ +1: + movzbl (r2)+,r0 + bbss r0,(sp),1b + bneq 1b + movl r1,r0 /* r0 = s (current pos in s1) */ + + /* look for a character that is in s2 */ +2: + movzbl (r0)+,r2 /* c = *s++ */ + bbc r2,(sp),2b /* loop until c is in table */ + decl r0 /* s-- */ + subl2 r1,r0 /* r0 = s - s1 = count */ + ret diff --git a/ports/sysdeps/vax/strlen.s b/ports/sysdeps/vax/strlen.s new file mode 100644 index 000000000..9479fbbf6 --- /dev/null +++ b/ports/sysdeps/vax/strlen.s @@ -0,0 +1,48 @@ +/* + * Copyright (c) 1983 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)strlen.s 5.6 (Berkeley) 6/1/90" +#endif /* LIBC_SCCS and not lint */ + +/* + * Return the length of cp (not counting '\0'). + * + * strlen(cp) + * char *cp; + */ +#include "DEFS.h" + +ENTRY(strlen, 0) + movl 4(ap),r1 +1: + locc $0,$65535,(r1) # look for '\0' + beql 1b + subl3 4(ap),r1,r0 # len = cp - base + ret diff --git a/ports/sysdeps/vax/strncat.s b/ports/sysdeps/vax/strncat.s new file mode 100644 index 000000000..2387d1b1b --- /dev/null +++ b/ports/sysdeps/vax/strncat.s @@ -0,0 +1,79 @@ +/* + * Copyright (c) 1983 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)strncat.s 5.6 (Berkeley) 6/1/90" +#endif /* LIBC_SCCS and not lint */ + +/* + * Concatenate string s2 on the end of s1 + * and return the base of s1. The parameter + * n is the maximum length of string s2 to + * concatenate. + * + * char * + * strncat(s1, s2, n) + * char *s1, *s2; + * int n; + */ +#include "DEFS.h" + +ENTRY(strncat, R6) + movl 12(ap),r6 # r6 = n + bleq done # n <= 0 + movl 4(ap),r3 # r3 = s1 + movl r3,r1 +0: + locc $0,$65535,(r1) + beql 0b + movl r1,r3 # r3 = index(s1, '\0'); + movl 8(ap),r1 # r1 = s2 +1: + movzwl $65535,r2 # r2 = bytes in first chunk + cmpl r6,r2 # r2 = min(bytes in chunk, n); + jgeq 2f + movl r6,r2 +2: + subl2 r2,r6 # update n + locc $0,r2,(r1) # '\0' found? + jneq 3f + subl2 r2,r1 # back up pointer updated by locc + movc3 r2,(r1),(r3) # copy in next piece + tstl r6 # run out of space? + jneq 1b + clrb (r3) # force '\0' termination + jbr done +3: + subl2 r0,r2 # r2 = number of bytes to move + subl2 r2,r1 # back up pointer updated by locc + incl r2 # copy '\0' as well + movc3 r2,(r1),(r3) # copy in last piece +done: + movl 4(ap),r0 # return s1 + ret diff --git a/ports/sysdeps/vax/strncmp.s b/ports/sysdeps/vax/strncmp.s new file mode 100644 index 000000000..8d8f5d419 --- /dev/null +++ b/ports/sysdeps/vax/strncmp.s @@ -0,0 +1,85 @@ +/* + * Copyright (c) 1983 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)strncmp.s 5.6 (Berkeley) 6/1/90" +#endif /* LIBC_SCCS and not lint */ + +/* + * Compare at most n characters of string + * s1 lexicographically to string s2. + * Return: + * 0 s1 == s2 + * > 0 s1 > s2 + * < 0 s2 < s2 + * + * strncmp(s1, s2, n) + * char *s1, *s2; + * int n; + */ +#include "DEFS.h" + +ENTRY(strncmp, 0) + movl 4(ap),r1 # r1 = s1 + movq 8(ap),r3 # r3 = s2; r4 = n +1: + clrl r5 # calculate min bytes to next page boundary + subb3 r1,$255,r5 # r5 = (bytes - 1) to end of page for s1 + subb3 r3,$255,r0 # r0 = (bytes - 1) to end of page for s2 + cmpb r0,r5 # r5 = min(r0, r5); + bgtru 2f + movb r0,r5 +2: + incl r5 # r5 = min bytes to next page boundary + cmpl r4,r5 # r5 = min(n, r5); + bgeq 3f + movl r4,r5 +3: + cmpc3 r5,(r1),(r3) # compare strings + bneq 4f + subl2 r5,r4 # check for end of comparison + beql 5f + subl2 r5,r1 # check if found null yet + locc $0,r5,(r1) + beql 1b # not yet done, continue checking + subl2 r0,r3 + mnegb (r3),r0 # r0 = '\0' - *s2 + cvtbl r0,r0 + ret +4: + subl2 r0,r5 # check for null in matching string + subl2 r5,r1 + locc $0,r5,(r1) + bneq 5f + subb3 (r3),(r1),r0 # r0 = *s1 - *s2 + cvtbl r0,r0 + ret +5: + clrl r0 # both the same to null + ret diff --git a/ports/sysdeps/vax/strncpy.s b/ports/sysdeps/vax/strncpy.s new file mode 100644 index 000000000..ade70e9dc --- /dev/null +++ b/ports/sysdeps/vax/strncpy.s @@ -0,0 +1,80 @@ +/* + * Copyright (c) 1983 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)strncpy.s 5.6 (Berkeley) 6/1/90" +#endif /* LIBC_SCCS and not lint */ + +/* + * Copy string s2 over top of string s1. + * Truncate or null-pad to n bytes. + * + * char * + * strncpy(s1, s2, n) + * char *s1, *s2; + */ +#include "DEFS.h" + +ENTRY(strncpy, R6) + movl 12(ap),r6 # r6 = n + bleq done # n <= 0 + movl 4(ap),r3 # r3 = s1 + movl 8(ap),r1 # r1 = s2 +1: + movzwl $65535,r2 # r2 = bytes in first chunk + cmpl r6,r2 # r2 = min(bytes in chunk, n); + jgeq 2f + movl r6,r2 +2: + subl2 r2,r6 # update n + locc $0,r2,(r1) # '\0' found? + jneq 3f + subl2 r2,r1 # back up pointer updated by locc + movc3 r2,(r1),(r3) # copy in next piece + tstl r6 # run out of space? + jneq 1b + jbr done +3: # copy up to '\0' logic + addl2 r0,r6 # r6 = number of null-pad bytes + subl2 r0,r2 # r2 = number of bytes to move + subl2 r2,r1 # back up pointer updated by locc + movc3 r2,(r1),(r3) # copy in last piece +4: # null-pad logic + movzwl $65535,r2 # r2 = bytes in first chunk + cmpl r6,r2 # r2 = min(bytes in chunk, n); + jgeq 5f + movl r6,r2 +5: + subl2 r2,r6 # update n + movc5 $0,(r3),$0,r2,(r3)# pad with '\0's + tstl r6 # finished padding? + jneq 4b +done: + movl 4(ap),r0 # return s1 + ret diff --git a/ports/sysdeps/vax/strpbrk.s b/ports/sysdeps/vax/strpbrk.s new file mode 100644 index 000000000..4a0e54171 --- /dev/null +++ b/ports/sysdeps/vax/strpbrk.s @@ -0,0 +1,64 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)strpbrk.s 5.1 (Berkeley) 5/15/90" +#endif /* LIBC_SCCS and not lint */ + +/* + * Find in s1 the first occurrence of any character from s2. + * If there are none, return NULL. + * + * char * + * strpbrk(s1, s2) + * const char *s1, *s2; + */ +#include "DEFS.h" + +ENTRY(strpbrk, 0) + subl2 $32,sp /* make 256 bit table */ + movc5 $0,(sp),$0,$32,(sp) + movq 4(ap),r0 /* r0 = s1, r1 = s2 */ + + /* turn on bit for each character in s2, including '\0' */ +1: + movzbl (r1)+,r2 + bbss r2,(sp),1b + bneq 1b + + /* look for a character that is in s2 */ +2: + movzbl (r0)+,r2 /* c = *s++ */ + bbc r2,(sp),2b /* loop until c is in table */ + beql 3f /* if c==0, go return NULL */ + decl r0 /* s-- */ + ret +3: + clrl r0 + ret diff --git a/ports/sysdeps/vax/strrchr.s b/ports/sysdeps/vax/strrchr.s new file mode 100644 index 000000000..b0e482c9f --- /dev/null +++ b/ports/sysdeps/vax/strrchr.s @@ -0,0 +1,112 @@ +/* + * Copyright (c) 1988 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)strrchr.s 5.4 (Berkeley) 6/1/90" +#endif /* LIBC_SCCS and not lint */ + +/* + * Find the last occurrence of c in the string cp. + * Return pointer to match or null pointer. + * + * char * + * strrchr(cp, c) + * char *cp, c; + */ +#include "DEFS.h" + + .lcomm tbl,256 + +ENTRY(strrchr, 0) + movzwl $65535,r4 /* handy 65535 */ + movq 4(ap),r1 /* r1 = cp; r2 = c */ + movzbl r2,r2 + beql Lzero /* special case for c == '\0' */ + + clrl r5 /* r5 = pointer to last match */ + +/* + * Fancy scanc version. Alas, it is not reentrant. + */ + movab tbl,r3 /* r3 = address of table */ + bbss $0,(r3),Lreent /* ensure not reentering */ + movab (r3)[r2],r4 + incb (r4) /* mark both '\0' and c */ +0: + scanc $65535,(r1),(r3),$1 /* look for c or '\0' */ + beql 0b /* keep looking */ + tstb (r1) + beql 1f /* done if '\0' */ + movab (r1)+,r5 /* save most recently found, and skip over it */ + jbr 0b /* keep looking */ +1: + movl r5,r0 /* return last found (if any) */ + clrb (r4) /* clean up table */ + clrb (r3) + ret + +/* + * Special case for \0. + */ +Lzero: + locc $0,r4,(r1) /* just find end of string */ + beql Lzero /* still looking */ + movl r1,r0 /* found it */ + ret + +/* + * Slower reentrant version is two two-step searches. The first + * phase runs until we know where the string ends; it locates any + * occurrences of c within a 65535-byte block. Once we have found + * the end of the string, we find any further occurrences before + * that location. + */ +Lreent: +0: /* first phase */ + movl r1,r3 + locc $0,r4,(r3) /* look for '\0' */ + bneq 1f + locc r2,r4,(r3) /* continue phase 1 search for c */ + beql 0b + movab (r1)+,r5 /* found c: save and increment pointer */ + brb 0b /* and continue */ + +1: /* second phase */ + subl3 r3,r1,r0 /* length of short block */ + movl r3,r1 +2: + locc r2,r0,(r1) /* look for c */ + beql 3f /* skip if not found */ + movab (r1)+,r5 /* save pointer as before */ + sobgtr r0,2b /* adjust count and loop */ +3: + movl r5,r0 /* return stashed pointer */ + ret + +weak_alias (strrchr, rindex) diff --git a/ports/sysdeps/vax/strsep.s b/ports/sysdeps/vax/strsep.s new file mode 100644 index 000000000..dcf2a7caa --- /dev/null +++ b/ports/sysdeps/vax/strsep.s @@ -0,0 +1,81 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)strsep.s 5.1 (Berkeley) 5/15/90" +#endif /* LIBC_SCCS and not lint */ + +/* + * Get next word from string *stringp, where words are + * strings separated by characters from delim. + * + * Writes NULs into the string at *stringp to end tokens. + * On return, *stringp points past the last NUL written (if there might + * be further tokens), or is NULL (if there are definitely no more tokens). + * + * If *stringp is NULL, strtoken returns NULL. + * + * char * + * strtoken(stringp, delim) + * register char **stringp; + * register char const *delim; + */ +#include "DEFS.h" + +ENTRY(strsep, 0) + tstl *4(ap) /* if (*stringp == NULL) */ + bneq 0f + clrl r0 # return (NULL); + ret + +0: + subl2 $32,sp /* make room for 256 bit table */ + movc5 $0,(sp),$0,$32,(sp) + movq 4(ap),r1 /* r1 = stringp, r2 = delim */ + + /* turn on bit for each character in s2, including '\0' */ +1: + movzbl (r2)+,r0 + bbss r0,(sp),1b + bneq 1b + + movl (r1),r3 /* r3 = s = *stringp */ + movl r3,r0 /* save return value */ + + /* scan for delimiters */ +2: + movzbl (r3)+,r2 /* c = *s++ */ + bbc r2,(sp),2b /* loop until c is in table */ + beql 3f + clrb -1(r3) /* if c!='\0', s[-1] = 0 */ + movl r3,(r1) /* and *stringp = s */ + ret +3: + clrl (r1) /* else *stringp = NULL */ + ret diff --git a/ports/sysdeps/vax/strspn.s b/ports/sysdeps/vax/strspn.s new file mode 100644 index 000000000..ca944828c --- /dev/null +++ b/ports/sysdeps/vax/strspn.s @@ -0,0 +1,66 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)strspn.s 5.1 (Berkeley) 5/15/90" +#endif /* LIBC_SCCS and not lint */ + +/* + * Span the string s2 (skip characters that are in s2). + * Return the number of characters in s1 that were skipped. + * + * size_t + * strspn(s1, s2) + * const char *s1, *s2; + */ +#include "DEFS.h" + +ENTRY(strspn, 0) + subl2 $32,sp /* make 256 bit table */ + movc5 $0,(sp),$0,$32,(sp) + movq 4(ap),r1 /* r1 = s1, r2 = s2 */ + + /* turn on bit for each character in s2, including '\0' */ +1: + movzbl (r2)+,r0 + bbss r0,(sp),1b + bneq 1b + + /* now clear bit for '\0' */ + /* (this is easier than avoiding setting it in the first place) */ + bicb2 $1,(sp) /* stop at '\0' */ + movl r1,r0 /* r0 = s (current pos in s1) */ + + /* look for a character that is not in s2 */ +2: + movzbl (r0)+,r2 /* c = *s++ */ + bbs r2,(sp),2b /* loop while c is in table */ + decl r0 /* s-- */ + subl2 r1,r0 /* r0 = s - s1 = count */ + ret diff --git a/ports/sysdeps/vax/strstr.s b/ports/sysdeps/vax/strstr.s new file mode 100644 index 000000000..0283a57dc --- /dev/null +++ b/ports/sysdeps/vax/strstr.s @@ -0,0 +1,109 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)strstr.s 5.2 (Berkeley) 8/21/90" +#endif /* LIBC_SCCS and not lint */ + +/* + * Find the first occurrence of s2 as a substring in s1. + * If s2 is empty, return s1. + * + * char *strstr(s1, s2) + * const char *s1, *s2; + */ +#include "DEFS.h" + +ENTRY(strstr, 0) + movq 4(ap),r3 /* r3 = s1, r4 = s2 */ + movzwl $65535,r2 /* r2 = locc/matchc limit */ + locc $0,r2,(r4) /* find '\0' in s2 */ + beql 4f + subl3 r4,r1,r5 /* r5 = strlen(s2) */ + beql 1f /* if r5 == 0, return s1 */ + + /* + * s2 is short enough to apply matchc. + * If s1 is long, we have to do it in stages. + */ +0: locc $0,r2,(r3) /* find '\0' in s1 */ + beql 3f + + /* + * Both strings are `short'; we can use matchc directly. + */ + subl3 r3,r1,r1 /* r1 = strlen(s1) */ + matchc r5,(r4),r1,(r3) /* find substring */ + bneq 2f + + /* + * r3 points r5 bytes past match. Return the match. + */ +1: subl3 r5,r3,r0 /* return (byte_past_match - strlen(s2)) */ + ret + + /* + * There is no matching substring. + */ +2: clrl r0 /* return NULL */ + ret + + /* + * s1 is too long (> 65535 bytes) to apply matchc directly, + * but s2 is short enough. Apply s2 to s1, then (if not + * found yet) advancing s1 by (65536-strlen(s2)) bytes and + * loop. + */ +3: matchc r5,(r4),r2,(r3) /* search */ + beql 1b /* if found, go return it */ + decw r2 /* from 0 to 65535 */ + incl r3 /* already advanced 65535, now 65536 */ + subl2 r5,r3 /* ... minus strlen(s2) */ + brb 0b + + /* + * s2 is too long (> 65535 bytes) to bother with matchc. + */ +4: locc $0,r2,(r1) /* continue working on strlen(s2) */ + beql 4b + subl3 r1,r4,r5 /* r5 = strlen(s2) */ + movb (r4)+,r2 /* r2 = *s2++ */ + decl r5 /* fix up length */ +5: movb (r3)+,r0 /* r0 = *s1++ */ + beql 2b /* if '\0', return NULL */ + cmpb r0,r2 + bneq 5b /* loop until first char found */ + pushr R5|R4|R3|R2 /* save c, s1, s2, n */ + pushr R5|R4|R3 /* strncmp(s1, s2, n) */ + calls $3,_strncmp + popr R2|R3|R4|R5 /* restore */ + tstl r0 + bneq 5b /* loop until strncmp says rest same too */ + subl3 $1,r3,r0 /* return previous s1 */ + ret diff --git a/ports/sysdeps/vax/sub_n.s b/ports/sysdeps/vax/sub_n.s new file mode 100644 index 000000000..14ba343f9 --- /dev/null +++ b/ports/sysdeps/vax/sub_n.s @@ -0,0 +1,48 @@ +# VAX __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and store +# difference in a third limb vector. + +# Copyright (C) 1992, 1994 Free Software Foundation, Inc. + +# This file is part of the GNU MP Library. + +# The GNU MP 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 MP 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 MP 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. + + +# INPUT PARAMETERS +# res_ptr (sp + 4) +# s1_ptr (sp + 8) +# s2_ptr (sp + 12) +# size (sp + 16) + +.text + .align 1 +.globl ___mpn_sub_n +___mpn_sub_n: + .word 0x0 + movl 16(ap),r0 + movl 12(ap),r1 + movl 8(ap),r2 + movl 4(ap),r3 + subl2 r4,r4 + +Loop: + movl (r2)+,r4 + sbwc (r1)+,r4 + movl r4,(r3)+ + jsobgtr r0,Loop + + adwc r0,r0 + ret diff --git a/ports/sysdeps/vax/submul_1.s b/ports/sysdeps/vax/submul_1.s new file mode 100644 index 000000000..5ff8d016c --- /dev/null +++ b/ports/sysdeps/vax/submul_1.s @@ -0,0 +1,126 @@ +# VAX __mpn_submul_1 -- Multiply a limb vector with a limb and subtract +# the result from a second limb vector. + +# Copyright (C) 1992, 1994 Free Software Foundation, Inc. + +# This file is part of the GNU MP Library. + +# The GNU MP 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 MP 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 MP 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. + + +# INPUT PARAMETERS +# res_ptr (sp + 4) +# s1_ptr (sp + 8) +# size (sp + 12) +# s2_limb (sp + 16) + +.text + .align 1 +.globl ___mpn_submul_1 +___mpn_submul_1: + .word 0xfc0 + movl 12(ap),r4 + movl 8(ap),r8 + movl 4(ap),r9 + movl 16(ap),r6 + jlss s2_big + + clrl r3 + incl r4 + ashl $-1,r4,r7 + jlbc r4,L1 + clrl r11 + +# Loop for S2_LIMB < 0x80000000 +Loop1: movl (r8)+,r1 + jlss L1n0 + emul r1,r6,$0,r2 + addl2 r11,r2 + adwc $0,r3 + subl2 r2,(r9)+ + adwc $0,r3 +L1: movl (r8)+,r1 + jlss L1n1 +L1p1: emul r1,r6,$0,r10 + addl2 r3,r10 + adwc $0,r11 + subl2 r10,(r9)+ + adwc $0,r11 + + jsobgtr r7,Loop1 + movl r11,r0 + ret + +L1n0: emul r1,r6,$0,r2 + addl2 r11,r2 + adwc r6,r3 + subl2 r2,(r9)+ + adwc $0,r3 + movl (r8)+,r1 + jgeq L1p1 +L1n1: emul r1,r6,$0,r10 + addl2 r3,r10 + adwc r6,r11 + subl2 r10,(r9)+ + adwc $0,r11 + + jsobgtr r7,Loop1 + movl r11,r0 + ret + + +s2_big: clrl r3 + incl r4 + ashl $-1,r4,r7 + jlbc r4,L2 + clrl r11 + +# Loop for S2_LIMB >= 0x80000000 +Loop2: movl (r8)+,r1 + jlss L2n0 + emul r1,r6,$0,r2 + addl2 r11,r2 + adwc r1,r3 + subl2 r2,(r9)+ + adwc $0,r3 +L2: movl (r8)+,r1 + jlss L2n1 +L2p1: emul r1,r6,$0,r10 + addl2 r3,r10 + adwc r1,r11 + subl2 r10,(r9)+ + adwc $0,r11 + + jsobgtr r7,Loop2 + movl r11,r0 + ret + +L2n0: emul r1,r6,$0,r2 + addl2 r11,r2 + adwc r6,r3 + subl2 r2,(r9)+ + adwc r1,r3 + movl (r8)+,r1 + jgeq L2p1 +L2n1: emul r1,r6,$0,r10 + addl2 r3,r10 + adwc r6,r11 + subl2 r10,(r9)+ + adwc r1,r11 + + jsobgtr r7,Loop2 + movl r11,r0 + ret diff --git a/ports/sysdeps/z8000/add_n.s b/ports/sysdeps/z8000/add_n.s new file mode 100644 index 000000000..4d290265a --- /dev/null +++ b/ports/sysdeps/z8000/add_n.s @@ -0,0 +1,53 @@ +! Z8000 __mpn_add_n -- Add two limb vectors of equal, non-zero length. + +! Copyright (C) 1993, 1994 Free Software Foundation, Inc. + +! This file is part of the GNU MP Library. + +! The GNU MP 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 MP 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 MP 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. + + +! INPUT PARAMETERS +! res_ptr r7 +! s1_ptr r6 +! s2_ptr r5 +! size r4 + +! If we are really crazy, we can use push to write a few result words +! backwards, using push just because it is faster than reg+disp. We'd +! then add 2x the number of words written to r7... + + unseg + .text + even + global ___mpn_add_n +___mpn_add_n: + pop r0,@r6 + pop r1,@r5 + add r0,r1 + ld @r7,r0 + dec r4 + jr eq,Lend +Loop: pop r0,@r6 + pop r1,@r5 + adc r0,r1 + inc r7,#2 + ld @r7,r0 + dec r4 + jr ne,Loop +Lend: ld r2,r4 ! use 0 already in r4 + adc r2,r2 + ret t diff --git a/ports/sysdeps/z8000/gmp-mparam.h b/ports/sysdeps/z8000/gmp-mparam.h new file mode 100644 index 000000000..4216df673 --- /dev/null +++ b/ports/sysdeps/z8000/gmp-mparam.h @@ -0,0 +1,27 @@ +/* gmp-mparam.h -- Compiler/machine parameter header file. + +Copyright (C) 1991, 1993, 1994 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP 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 MP 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 MP 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 BITS_PER_MP_LIMB 16 +#define BYTES_PER_MP_LIMB 2 +#define BITS_PER_LONGINT 32 +#define BITS_PER_INT 16 +#define BITS_PER_SHORTINT 16 +#define BITS_PER_CHAR 8 diff --git a/ports/sysdeps/z8000/mul_1.s b/ports/sysdeps/z8000/mul_1.s new file mode 100644 index 000000000..e449dfacb --- /dev/null +++ b/ports/sysdeps/z8000/mul_1.s @@ -0,0 +1,68 @@ +! Z8000 __mpn_mul_1 -- Multiply a limb vector with a limb and store +! the result in a second limb vector. + +! Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc. + +! This file is part of the GNU MP Library. + +! The GNU MP 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 MP 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 MP 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. + + +! INPUT PARAMETERS +! res_ptr r7 +! s1_ptr r6 +! size r5 +! s2_limb r4 + + unseg + .text + even + global ___mpn_mul_1 +___mpn_mul_1: + sub r2,r2 ! zero carry limb + and r4,r4 + jr mi,Lneg + +Lpos: pop r1,@r6 + ld r9,r1 + mult rr8,r4 + and r1,r1 ! shift msb of loaded limb into cy + jr mi,Lp ! branch if loaded limb's msb is set + add r8,r4 ! hi_limb += sign_comp2 +Lp: add r9,r2 ! lo_limb += cy_limb + xor r2,r2 + adc r2,r8 + ld @r7,r9 + inc r7,#2 + dec r5 + jr ne,Lpos + ret t + +Lneg: pop r1,@r6 + ld r9,r1 + mult rr8,r4 + add r8,r1 ! hi_limb += sign_comp1 + and r1,r1 + jr mi,Ln + add r8,r4 ! hi_limb += sign_comp2 +Ln: add r9,r2 ! lo_limb += cy_limb + xor r2,r2 + adc r2,r8 + ld @r7,r9 + inc r7,#2 + dec r5 + jr ne,Lneg + ret t diff --git a/ports/sysdeps/z8000/sub_n.s b/ports/sysdeps/z8000/sub_n.s new file mode 100644 index 000000000..c0787755c --- /dev/null +++ b/ports/sysdeps/z8000/sub_n.s @@ -0,0 +1,54 @@ +! Z8000 __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and +! store difference in a third limb vector. + +! Copyright (C) 1993, 1994 Free Software Foundation, Inc. + +! This file is part of the GNU MP Library. + +! The GNU MP 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 MP 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 MP 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. + + +! INPUT PARAMETERS +! res_ptr r7 +! s1_ptr r6 +! s2_ptr r5 +! size r4 + +! If we are really crazy, we can use push to write a few result words +! backwards, using push just because it is faster than reg+disp. We'd +! then add 2x the number of words written to r7... + + unseg + .text + even + global ___mpn_sub_n +___mpn_sub_n: + pop r0,@r6 + pop r1,@r5 + sub r0,r1 + ld @r7,r0 + dec r4 + jr eq,Lend +Loop: pop r0,@r6 + pop r1,@r5 + sbc r0,r1 + inc r7,#2 + ld @r7,r0 + dec r4 + jr ne,Loop +Lend: ld r2,r4 ! use 0 already in r4 + adc r2,r2 + ret t |