diff options
Diffstat (limited to 'sysdeps')
33 files changed, 642 insertions, 110 deletions
diff --git a/sysdeps/generic/crypt-entry.c b/sysdeps/generic/crypt-entry.c index e6c2554019..8248ed9ba3 100644 --- a/sysdeps/generic/crypt-entry.c +++ b/sysdeps/generic/crypt-entry.c @@ -1,5 +1,5 @@ /* Wrapper around MD5 sum replacement for crypt function. - Copyright (C) 1996, 1997 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -34,6 +34,8 @@ extern char *__md5_crypt_r (const char *key, const char *salt, char *buffer, int buflen); extern char *__md5_crypt (const char *key, const char *salt); +extern char *__crypt_r (const char *key, const char *salt, + struct crypt_data *__restrict data); /* We recognize an intended call of the MD5 crypt replacement function by the first 3 characters of the salt string. If they match the @@ -42,7 +44,7 @@ char * __crypt_r (key, salt, data) const char *key; const char *salt; - struct crypt_data *data; + struct crypt_data *__restrict data; { if (strncmp (md5_salt_prefix, salt, sizeof (md5_salt_prefix) - 1) == 0) return __md5_crypt_r (key, salt, (char *) data, diff --git a/sysdeps/generic/crypt.h b/sysdeps/generic/crypt.h index c14554c829..0713e950ba 100644 --- a/sysdeps/generic/crypt.h +++ b/sysdeps/generic/crypt.h @@ -1,7 +1,7 @@ /* * UFC-crypt: ultra fast crypt(3) implementation * - * Copyright (C) 1991, 1992, 1993, 1996, 1997 Free Software Foundation, Inc. + * Copyright (C) 1991, 92, 93, 96, 97, 98 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -50,10 +50,8 @@ struct crypt_data int direction, initialized; }; -extern char *__crypt_r __P ((__const char *__key, __const char *__salt, - struct crypt_data *__data)); extern char *crypt_r __P ((__const char *__key, __const char *__salt, - struct crypt_data *__data)); + struct crypt_data *__restrict __data)); #endif __END_DECLS diff --git a/sysdeps/generic/dl-hash.h b/sysdeps/generic/dl-hash.h index fc17793324..c3b8aa62b3 100644 --- a/sysdeps/generic/dl-hash.h +++ b/sysdeps/generic/dl-hash.h @@ -1,4 +1,4 @@ -/* Compute hash alue for given string according to ELF standard. +/* Compute hash value for given string according to ELF standard. Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. diff --git a/sysdeps/generic/hp-timing.h b/sysdeps/generic/hp-timing.h index 7795f510d5..35f3291e63 100644 --- a/sysdeps/generic/hp-timing.h +++ b/sysdeps/generic/hp-timing.h @@ -1,4 +1,4 @@ -/* High precision, low overhead timing functions. i686 version. +/* High precision, low overhead timing functions. Generic version. Copyright (C) 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. diff --git a/sysdeps/i386/i686/hp-timing.h b/sysdeps/i386/i686/hp-timing.h index ffbeb277e5..004cfff77f 100644 --- a/sysdeps/i386/i686/hp-timing.h +++ b/sysdeps/i386/i686/hp-timing.h @@ -84,7 +84,7 @@ /* We use 64bit values for the times. */ typedef unsigned long long int hp_timing_t; -/* Internal variabled used to store the overhead of the measurement +/* Internal variable used to store the overhead of the measurement opcodes. */ extern hp_timing_t __libc_hp_timing_overhead; diff --git a/sysdeps/i386/i686/mempcpy.S b/sysdeps/i386/i686/mempcpy.S new file mode 100644 index 0000000000..5760d9f940 --- /dev/null +++ b/sysdeps/i386/i686/mempcpy.S @@ -0,0 +1,51 @@ +/* Copy memory block and return pointer to following byte. + For Intel 80x86, x>=6. + This file is part of the GNU C Library. + Copyright (C) 1998 Free Software Foundation, Inc. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. + + 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 "asm-syntax.h" + +/* strtok: + INPUT PARAMETER: + dest (sp + 4) + src (sp + 8) + len (sp + 12) +*/ + +ENTRY(__mempcpy) + movl %edi, %eax + movl 4(%esp), %edi + movl %esi, %edx + movl 8(%esp), %esi + movl 12(%esp), %ecx + cld + shrl $1, %ecx + jnc 1f + movsb +1: shrl $1, %ecx + jnc 2f + movsw +2: rep + movsl + xchgl %edi, %eax + movl %edx, %esi + ret +END(mempcpy) +weak_alias (__mempcpy, mempcpy) diff --git a/sysdeps/i386/i686/strtok.S b/sysdeps/i386/i686/strtok.S index c7a058eb41..18aa7c8c7b 100644 --- a/sysdeps/i386/i686/strtok.S +++ b/sysdeps/i386/i686/strtok.S @@ -73,6 +73,7 @@ ENTRY (FUNCTION) movl $64, %ecx movl %esp, %edi xorl %eax, %eax + cld rep stosl diff --git a/sysdeps/mips/Dist b/sysdeps/mips/Dist index 9b6fd71f01..7ccfb1bfe6 100644 --- a/sysdeps/mips/Dist +++ b/sysdeps/mips/Dist @@ -1,3 +1,9 @@ setjmp_aux.c rtld-ldscript.in rtld-parms +regdef.h +sgidefs.h +fpregdef.h +sys/regdef.h +sys/fpregdef.h +sys/asm.h diff --git a/sysdeps/mips/Makefile b/sysdeps/mips/Makefile index 5585c61f03..54b3520c84 100644 --- a/sysdeps/mips/Makefile +++ b/sysdeps/mips/Makefile @@ -1,3 +1,7 @@ +ifeq ($(subdir),misc) +headers += regdef.h fpregdef.h sys/regdef.h sys/fpregdef.h sys/asm.h sgidefs.h +endif + ifeq ($(subdir),setjmp) sysdep_routines += setjmp_aux endif diff --git a/sysdeps/unix/sysv/linux/mips/sys/fpregdef.h b/sysdeps/mips/fpregdef.h index 48d8f7513e..25b93cade4 100644 --- a/sysdeps/unix/sysv/linux/mips/sys/fpregdef.h +++ b/sysdeps/mips/fpregdef.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 92, 94, 95, 96, 97 Free Software Foundation, Inc. +/* Copyright (C) 1991, 92, 94, 95, 96 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -16,12 +16,9 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef _SYS_FPREGDEF_H -#define _SYS_FPREGDEF_H +#ifndef _FPREGDEF_H +#define _FPREGDEF_H -/* - * The real definitions come from the Linux kernel sources - */ -#include <asm/fpregdef.h> +#include <sys/fpregdef.h> -#endif /* sys/fpregdef.h */ +#endif /* _FPREGDEF_H */ diff --git a/sysdeps/mips/fpu_control.h b/sysdeps/mips/fpu_control.h index e271ae1fcc..471c68e413 100644 --- a/sysdeps/mips/fpu_control.h +++ b/sysdeps/mips/fpu_control.h @@ -1,5 +1,5 @@ /* FPU control word bits. Mips version. - Copyright (C) 1996, 1997 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Olaf Flebbe and Ralf Baechle. @@ -80,7 +80,7 @@ /* The fdlibm code requires strict IEEE double precision arithmetic, and no interrupts for exceptions, rounding to nearest. */ -#define _FPU_DEFAULT 0x00000600 +#define _FPU_DEFAULT 0x00000000 /* IEEE: same as above, but exceptions */ #define _FPU_IEEE 0x00000F80 diff --git a/sysdeps/unix/sysv/linux/mips/sys/asm.h b/sysdeps/mips/regdef.h index 346a9c4ec2..0fa50f0926 100644 --- a/sysdeps/unix/sysv/linux/mips/sys/asm.h +++ b/sysdeps/mips/regdef.h @@ -1,6 +1,6 @@ -/* Copyright (C) 1997 Free Software Foundation, Inc. +/* Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Ralf Baechle <ralf@gnu.ai.mit.edu>. + Contributed by Ralf Baechle <ralf@gnu.org>. 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 @@ -17,12 +17,11 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef _SYS_ASM_H -#define _SYS_ASM_H +#ifndef _REGDEF_H +#define _REGDEF_H -/* - * The real definitions come from the Linux kernel sources - */ -#include <asm/asm.h> +#include <sys/regdef.h> +#include <sys/fpregdef.h> + +#endif /* _REGDEF_H */ -#endif /* sys/asm.h */ diff --git a/sysdeps/unix/sysv/linux/mips/sgidefs.h b/sysdeps/mips/sgidefs.h index a36ece0175..56567e884e 100644 --- a/sysdeps/unix/sysv/linux/mips/sgidefs.h +++ b/sysdeps/mips/sgidefs.h @@ -1,6 +1,6 @@ -/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Ralf Baechle <ralf@gnu.ai.mit.edu>. + Contributed by Ralf Baechle <ralf@gnu.org>. 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 @@ -21,8 +21,24 @@ #define _SGIDEFS_H 1 /* - * The real definitions come from the Linux kernel sources + * Definitions for the ISA level */ -#include <asm/sgidefs.h> +#define _MIPS_ISA_MIPS1 1 +#define _MIPS_ISA_MIPS2 2 +#define _MIPS_ISA_MIPS3 3 +#define _MIPS_ISA_MIPS4 4 +#define _MIPS_ISA_MIPS5 5 + +/* + * Subprogram calling convention + * + * At the moment only _MIPS_SIM_ABI32 is in use. This will change rsn. + * Until GCC 2.8.0 is released don't rely on this definitions because the + * 64bit code is essentially using the 32bit interface model just with + * 64bit registers. + */ +#define _MIPS_SIM_ABI32 1 +#define _MIPS_SIM_NABI32 2 +#define _MIPS_SIM_ABI64 3 #endif /* sgidefs.h */ diff --git a/sysdeps/mips/sys/asm.h b/sysdeps/mips/sys/asm.h new file mode 100644 index 0000000000..b90a331ab7 --- /dev/null +++ b/sysdeps/mips/sys/asm.h @@ -0,0 +1,377 @@ +/* Copyright (C) 1997, 1998 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ralf Baechle <ralf@gnu.org>. + + 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_ASM_H +#define _SYS_ASM_H + +#include <sgidefs.h> + +#ifndef CAT +#ifdef __STDC__ +#define __CAT(str1,str2) str1##str2 +#else +#define __CAT(str1,str2) str1/**/str2 +#endif +#define CAT(str1,str2) __CAT(str1,str2) +#endif + +/* + * Macros to handle different pointer/register sizes for 32/64-bit code + * + * 64 bit address space isn't used yet, so we may use the R3000 32 bit + * defines for now. + */ +#define PTR .word +#define PTRSIZE 4 +#define PTRLOG 2 + +/* + * PIC specific declarations + */ +#ifdef __PIC__ +#define CPRESTORE(register) \ + .cprestore register +#define CPADD(register) \ + .cpadd register +#define CPLOAD(register) \ + .cpload register +#else +#define CPRESTORE(register) +#define CPADD(register) +#define CPLOAD(register) +#endif + +/* + * LEAF - declare leaf routine + */ +#define LEAF(symbol) \ + .globl symbol; \ + .align 2; \ + .type symbol,@function; \ + .ent symbol,0; \ +symbol: .frame sp,0,ra + +/* + * NESTED - declare nested routine entry point + */ +#define NESTED(symbol, framesize, rpc) \ + .globl symbol; \ + .align 2; \ + .type symbol,@function; \ + .ent symbol,0; \ +symbol: .frame sp, framesize, rpc + +/* + * END - mark end of function + */ +#define END(function) \ + .end function; \ + .size function,.-function + +/* + * EXPORT - export definition of symbol + */ +#define EXPORT(symbol) \ + .globl symbol; \ +symbol: + +/* + * ABS - export absolute symbol + */ +#define ABS(symbol,value) \ + .globl symbol; \ +symbol = value + +#define PANIC(msg) \ + .set push; \ + .set reorder; \ + la a0,8f; \ + jal panic; \ +9: b 9b; \ + .set pop; \ + TEXT(msg) + +/* + * Print formated string + */ +#define PRINT(string) \ + .set push; \ + .set reorder; \ + la a0,8f; \ + jal printk; \ + .set pop; \ + TEXT(string) + +#define TEXT(msg) \ + .data; \ +8: .asciiz msg; \ + .previous; + +/* + * Build text tables + */ +#define TTABLE(string) \ + .text; \ + .word 1f; \ + .previous; \ + .data; \ +1: .asciz string; \ + .previous + +/* + * MIPS IV pref instruction. + * Use with .set noreorder only! + * + * MIPS IV implementations are free to treat this as a nop. The R5000 + * is one of them. So we should have an option not to use this instruction. + */ +#if (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5) +#define PREF(hint,addr) \ + pref hint,addr +#define PREFX(hint,addr) \ + prefx hint,addr +#else +#define PREF +#define PREFX +#endif + +/* + * MIPS ISA IV/V movn/movz instructions and equivalents for older CPUs. + */ +#if _MIPS_ISA == _MIPS_ISA_MIPS1 +#define MOVN(rd,rs,rt) \ + .set push; \ + .set reorder; \ + beqz rt,9f; \ + move rd,rs; \ + .set pop; \ +9: +#define MOVZ(rd,rs,rt) \ + .set push; \ + .set reorder; \ + bnez rt,9f; \ + move rd,rt; \ + .set pop; \ +9: +#endif /* _MIPS_ISA == _MIPS_ISA_MIPS1 */ +#if (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3) +#define MOVN(rd,rs,rt) \ + .set push; \ + .set noreorder; \ + bnezl rt,9f; \ + move rd,rs; \ + .set pop; \ +9: +#define MOVZ(rd,rs,rt) \ + .set push; \ + .set noreorder; \ + beqzl rt,9f; \ + movz rd,rs; \ + .set pop; \ +9: +#endif /* (_MIPS_ISA == _MIPS_ISA_MIPS2) || (_MIPS_ISA == _MIPS_ISA_MIPS3) */ +#if (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5) +#define MOVN(rd,rs,rt) \ + movn rd,rs,rt +#define MOVZ(rd,rs,rt) \ + movz rd,rs,rt +#endif /* (_MIPS_ISA == _MIPS_ISA_MIPS4) || (_MIPS_ISA == _MIPS_ISA_MIPS5) */ + +/* + * Stack alignment + */ +#if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2) +#define ALSZ 7 +#define ALMASK ~7 +#endif +#if (_MIPS_ISA == _MIPS_ISA_MIPS3) || (_MIPS_ISA == _MIPS_ISA_MIPS4) || \ + (_MIPS_ISA == _MIPS_ISA_MIPS5) +#define ALSZ 15 +#define ALMASK ~15 +#endif + +/* + * Size of a register + */ +#ifdef __mips64 +#define SZREG 8 +#else +#define SZREG 4 +#endif + +/* + * Use the following macros in assemblercode to load/store registers, + * pointers etc. + */ +#if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2) +#define REG_S sw +#define REG_L lw +#define PTR_SUBU subu +#define PTR_ADDU addu +#endif +#if (_MIPS_ISA == _MIPS_ISA_MIPS3) || (_MIPS_ISA == _MIPS_ISA_MIPS4) || \ + (_MIPS_ISA == _MIPS_ISA_MIPS5) +#define REG_S sd +#define REG_L ld +/* We still live in a 32 bit address space ... */ +#define PTR_SUBU subu +#define PTR_ADDU addu +#endif + +/* + * How to add/sub/load/store/shift C int variables. + */ +#if (_MIPS_SZINT == 32) +#define INT_ADD add +#define INT_ADDI addi +#define INT_ADDU addu +#define INT_ADDIU addiu +#define INT_SUB add +#define INT_SUBI subi +#define INT_SUBU subu +#define INT_SUBIU subu +#define INT_L lw +#define INT_S sw +#define LONG_SLL sll +#define LONG_SLLV sllv +#define LONG_SRL srl +#define LONG_SRLV srlv +#define LONG_SRA sra +#define LONG_SRAV srav +#endif + +#if (_MIPS_SZINT == 64) +#define INT_ADD dadd +#define INT_ADDI daddi +#define INT_ADDU daddu +#define INT_ADDIU daddiu +#define INT_SUB dadd +#define INT_SUBI dsubi +#define INT_SUBU dsubu +#define INT_SUBIU dsubu +#define INT_L ld +#define INT_S sd +#define LONG_SLL dsll +#define LONG_SLLV dsllv +#define LONG_SRL dsrl +#define LONG_SRLV dsrlv +#define LONG_SRA dsra +#define LONG_SRAV dsrav +#endif + +/* + * How to add/sub/load/store/shift C long variables. + */ +#if (_MIPS_SZLONG == 32) +#define LONG_ADD add +#define LONG_ADDI addi +#define LONG_ADDU addu +#define LONG_ADDIU addiu +#define LONG_SUB add +#define LONG_SUBI subi +#define LONG_SUBU subu +#define LONG_SUBIU subu +#define LONG_L lw +#define LONG_S sw +#define LONG_SLL sll +#define LONG_SLLV sllv +#define LONG_SRL srl +#define LONG_SRLV srlv +#define LONG_SRA sra +#define LONG_SRAV srav +#endif + +#if (_MIPS_SZLONG == 64) +#define LONG_ADD dadd +#define LONG_ADDI daddi +#define LONG_ADDU daddu +#define LONG_ADDIU daddiu +#define LONG_SUB dadd +#define LONG_SUBI dsubi +#define LONG_SUBU dsubu +#define LONG_SUBIU dsubu +#define LONG_L ld +#define LONG_S sd +#define LONG_SLL dsll +#define LONG_SLLV dsllv +#define LONG_SRL dsrl +#define LONG_SRLV dsrlv +#define LONG_SRA dsra +#define LONG_SRAV dsrav +#endif + +/* + * How to add/sub/load/store/shift pointers. + */ +#if (_MIPS_SZLONG == 32) +#define PTR_ADD add +#define PTR_ADDI addi +#define PTR_ADDU addu +#define PTR_ADDIU addiu +#define PTR_SUB add +#define PTR_SUBI subi +#define PTR_SUBU subu +#define PTR_SUBIU subu +#define PTR_L lw +#define PTR_S sw +#define PTR_SLL sll +#define PTR_SLLV sllv +#define PTR_SRL srl +#define PTR_SRLV srlv +#define PTR_SRA sra +#define PTR_SRAV srav + +#define PTR_SCALESHIFT 2 +#endif + +#if (_MIPS_SZLONG == 64) +#define PTR_ADD dadd +#define PTR_ADDI daddi +#define PTR_ADDU daddu +#define PTR_ADDIU daddiu +#define PTR_SUB dadd +#define PTR_SUBI dsubi +#define PTR_SUBU dsubu +#define PTR_SUBIU dsubu +#define PTR_L ld +#define PTR_S sd +#define PTR_SLL dsll +#define PTR_SLLV dsllv +#define PTR_SRL dsrl +#define PTR_SRLV dsrlv +#define PTR_SRA dsra +#define PTR_SRAV dsrav + +#define PTR_SCALESHIFT 3 +#endif + +/* + * Some cp0 registers were extended to 64bit for MIPS III. + */ +#if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2) +#define MFC0 mfc0 +#define MTC0 mtc0 +#endif +#if (_MIPS_ISA == _MIPS_ISA_MIPS3) || (_MIPS_ISA == _MIPS_ISA_MIPS4) || \ + (_MIPS_ISA == _MIPS_ISA_MIPS5) +#define MFC0 dmfc0 +#define MTC0 dmtc0 +#endif + +#endif /* sys/asm.h */ diff --git a/sysdeps/mips/sys/fpregdef.h b/sysdeps/mips/sys/fpregdef.h new file mode 100644 index 0000000000..ef7309c454 --- /dev/null +++ b/sysdeps/mips/sys/fpregdef.h @@ -0,0 +1,61 @@ +/* Copyright (C) 1991, 92, 94, 95, 96, 97, 98 Free Software Foundation, Inc. + This file is part of the 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_FPREGDEF_H +#define _SYS_FPREGDEF_H + +/* + * These definitions only cover the R3000-ish 16/32 register model. + * But we're trying to be R3000 friendly anyway ... + */ +#define fv0 $f0 /* return value */ +#define fv0f $f1 +#define fv1 $f2 +#define fv1f $f3 +#define fa0 $f12 /* argument registers */ +#define fa0f $f13 +#define fa1 $f14 +#define fa1f $f15 +#define ft0 $f4 /* caller saved */ +#define ft0f $f5 +#define ft1 $f6 +#define ft1f $f7 +#define ft2 $f8 +#define ft2f $f9 +#define ft3 $f10 +#define ft3f $f11 +#define ft4 $f16 +#define ft4f $f17 +#define ft5 $f18 +#define ft5f $f19 +#define fs0 $f20 /* callee saved */ +#define fs0f $f21 +#define fs1 $f22 +#define fs1f $f23 +#define fs2 $f24 +#define fs2f $f25 +#define fs3 $f26 +#define fs3f $f27 +#define fs4 $f28 +#define fs4f $f29 +#define fs5 $f30 +#define fs5f $f31 + +#define fcr31 $31 /* FPU status register */ + +#endif /* sys/fpregdef.h */ diff --git a/sysdeps/powerpc/dl-machine.c b/sysdeps/powerpc/dl-machine.c index 4b6205ceda..7d45e74d65 100644 --- a/sysdeps/powerpc/dl-machine.c +++ b/sysdeps/powerpc/dl-machine.c @@ -45,16 +45,16 @@ #define PLT_DATA_START_WORDS(num_entries) PLT_ENTRY_START_WORDS(num_entries) #define OPCODE_ADDI(rd,ra,simm) \ - (0x38000000 | (rd) << 21 | (ra) << 16 | (simm) & 0xffff) + (0x38000000 | (rd) << 21 | (ra) << 16 | ((simm) & 0xffff)) #define OPCODE_ADDIS(rd,ra,simm) \ - (0x3c000000 | (rd) << 21 | (ra) << 16 | (simm) & 0xffff) + (0x3c000000 | (rd) << 21 | (ra) << 16 | ((simm) & 0xffff)) #define OPCODE_ADD(rd,ra,rb) \ (0x7c000214 | (rd) << 21 | (ra) << 16 | (rb) << 11) -#define OPCODE_B(target) (0x48000000 | (target) & 0x03fffffc) -#define OPCODE_BA(target) (0x48000002 | (target) & 0x03fffffc) +#define OPCODE_B(target) (0x48000000 | ((target) & 0x03fffffc)) +#define OPCODE_BA(target) (0x48000002 | ((target) & 0x03fffffc)) #define OPCODE_BCTR() 0x4e800420 #define OPCODE_LWZ(rd,d,ra) \ - (0x80000000 | (rd) << 21 | (ra) << 16 | (d) & 0xffff) + (0x80000000 | (rd) << 21 | (ra) << 16 | ((d) & 0xffff)) #define OPCODE_MTCTR(rd) (0x7C0903A6 | (rd) << 21) #define OPCODE_RLWINM(ra,rs,sh,mb,me) \ (0x54000000 | (rs) << 21 | (ra) << 16 | (sh) << 11 | (mb) << 6 | (me) << 1) @@ -305,7 +305,7 @@ __elf_machine_fixup_plt(struct link_map *map, const Elf32_Rela *reloc, updating a lazy PLT entry). */ reloc_addr[0] = OPCODE_LI (11, finaladdr); - reloc_addr[1] = OPCODE_ADDIS (11, 11, finaladdr + 0x8000 >> 16); + reloc_addr[1] = OPCODE_ADDIS (11, 11, (finaladdr + 0x8000) >> 16); reloc_addr[2] = OPCODE_MTCTR (11); reloc_addr[3] = OPCODE_BCTR (); } @@ -355,7 +355,7 @@ __process_machine_rela (struct link_map *map, _dl_signal_error(0, map->l_name, "R_PPC_ADDR24 relocation out of range"); } - *reloc_addr = *reloc_addr & 0xfc000003 | finaladdr & 0x3fffffc; + *reloc_addr = (*reloc_addr & 0xfc000003) | (finaladdr & 0x3fffffc); break; case R_PPC_ADDR16: @@ -388,11 +388,11 @@ __process_machine_rela (struct link_map *map, _dl_signal_error(0, map->l_name, "R_PPC_ADDR14 relocation out of range"); } - *reloc_addr = *reloc_addr & 0xffff0003 | finaladdr & 0xfffc; + *reloc_addr = (*reloc_addr & 0xffff0003) | (finaladdr & 0xfffc); if (rinfo != R_PPC_ADDR14) - *reloc_addr = (*reloc_addr & 0xffdfffff - | (rinfo == R_PPC_ADDR14_BRTAKEN - ^ finaladdr >> 31) << 21); + *reloc_addr = ((*reloc_addr & 0xffdfffff) + | ((rinfo == R_PPC_ADDR14_BRTAKEN) + ^ (finaladdr >> 31)) << 21); break; case R_PPC_REL24: @@ -403,7 +403,7 @@ __process_machine_rela (struct link_map *map, _dl_signal_error(0, map->l_name, "R_PPC_REL24 relocation out of range"); } - *reloc_addr = *reloc_addr & 0xfc000003 | delta & 0x3fffffc; + *reloc_addr = (*reloc_addr & 0xfc000003) | (delta & 0x3fffffc); } break; diff --git a/sysdeps/powerpc/fclrexcpt.c b/sysdeps/powerpc/fclrexcpt.c index cfcf175637..47254fd384 100644 --- a/sysdeps/powerpc/fclrexcpt.c +++ b/sysdeps/powerpc/fclrexcpt.c @@ -29,8 +29,8 @@ feclearexcept (int excepts) u.fenv = fegetenv_register (); /* Clear the relevant bits. */ - u.l[1] = u.l[1] & ~(-((excepts) >> 31-FPSCR_VX & 1) & FE_ALL_INVALID - | (excepts) & FPSCR_STICKY_BITS); + u.l[1] = u.l[1] & ~((-((excepts) >> (31-FPSCR_VX) & 1) & FE_ALL_INVALID) + | ((excepts) & FPSCR_STICKY_BITS)); /* Put the new state in effect. */ fesetenv_register (u.fenv); diff --git a/sysdeps/powerpc/fesetround.c b/sysdeps/powerpc/fesetround.c index 0afd6ceaa5..875c89768a 100644 --- a/sysdeps/powerpc/fesetround.c +++ b/sysdeps/powerpc/fesetround.c @@ -32,7 +32,7 @@ fesetround (int round) u.fenv = fegetenv_register (); /* Set the relevant bits. */ - u.l[1] = u.l[1] & ~3 | round & 3; + u.l[1] = (u.l[1] & ~3) | (round & 3); /* Put the new state in effect. */ fesetenv_register (u.fenv); diff --git a/sysdeps/powerpc/feupdateenv.c b/sysdeps/powerpc/feupdateenv.c index b3a3f95ac3..14fa6bbe4e 100644 --- a/sysdeps/powerpc/feupdateenv.c +++ b/sysdeps/powerpc/feupdateenv.c @@ -30,7 +30,7 @@ feupdateenv (const fenv_t *envp) old.fenv = fegetenv_register (); /* Copy the set exceptions from `old' to `new'. */ - new.l[1] = new.l[1] & 0xE00000FF | old.l[1] & 0x1FFFFF00; + new.l[1] = (new.l[1] & 0xE00000FF) | (old.l[1] & 0x1FFFFF00); /* Atomically enable and raise (if appropriate) exceptions set in `new'. */ fesetenv_register (new.fenv); diff --git a/sysdeps/powerpc/fraiseexcpt.c b/sysdeps/powerpc/fraiseexcpt.c index d0c7971836..39e3fbd6bf 100644 --- a/sysdeps/powerpc/fraiseexcpt.c +++ b/sysdeps/powerpc/fraiseexcpt.c @@ -35,9 +35,9 @@ feraiseexcept (int excepts) /* Add the exceptions */ u.l[1] = (u.l[1] - | excepts & FPSCR_STICKY_BITS + | (excepts & FPSCR_STICKY_BITS) /* Turn FE_INVALID into FE_INVALID_SOFTWARE. */ - | (excepts >> (31 - FPSCR_VX) - (31 - FPSCR_VXSOFT) + | (excepts >> ((31 - FPSCR_VX) - (31 - FPSCR_VXSOFT)) & FE_INVALID_SOFTWARE)); /* Store the new status word (along with the rest of the environment), diff --git a/sysdeps/powerpc/fsetexcptflg.c b/sysdeps/powerpc/fsetexcptflg.c index b762552dbf..347035e9d2 100644 --- a/sysdeps/powerpc/fsetexcptflg.c +++ b/sysdeps/powerpc/fsetexcptflg.c @@ -32,9 +32,9 @@ fesetexceptflag (const fexcept_t *flagp, int excepts) flag = *flagp & excepts; /* Replace the exception status */ - u.l[1] = (u.l[1] & ~(FPSCR_STICKY_BITS & excepts) - | flag & FPSCR_STICKY_BITS - | (flag >> (31 - FPSCR_VX) - (31 - FPSCR_VXSOFT) + u.l[1] = ((u.l[1] & ~(FPSCR_STICKY_BITS & excepts)) + | (flag & FPSCR_STICKY_BITS) + | (flag >> ((31 - FPSCR_VX) - (31 - FPSCR_VXSOFT)) & FE_INVALID_SOFTWARE)); /* Store the new status word (along with the rest of the environment). diff --git a/sysdeps/powerpc/s_rint.c b/sysdeps/powerpc/s_rint.c index d6d1dd2f76..a475875a97 100644 --- a/sysdeps/powerpc/s_rint.c +++ b/sysdeps/powerpc/s_rint.c @@ -25,16 +25,18 @@ __rint (double x) static const float TWO52 = 4503599627370496.0; if (fabs (x) < TWO52) - if (x > 0.0) - { - x += TWO52; - x -= TWO52; - } - else if (x < 0.0) - { - x -= TWO52; - x += TWO52; - } + { + if (x > 0.0) + { + x += TWO52; + x -= TWO52; + } + else if (x < 0.0) + { + x -= TWO52; + x += TWO52; + } + } return x; } diff --git a/sysdeps/powerpc/s_rintf.c b/sysdeps/powerpc/s_rintf.c index b95c0540bf..dde40bb3e5 100644 --- a/sysdeps/powerpc/s_rintf.c +++ b/sysdeps/powerpc/s_rintf.c @@ -25,17 +25,19 @@ __rintf (float x) static const float TWO23 = 8388608.0; if (fabsf (x) < TWO23) - if (x > 0.0) - { - x += TWO23; - x -= TWO23; - } - else if (x < 0.0) - { - x -= TWO23; - x += TWO23; - } - + { + if (x > 0.0) + { + x += TWO23; + x -= TWO23; + } + else if (x < 0.0) + { + x -= TWO23; + x += TWO23; + } + } + return x; } weak_alias (__rintf, rintf) diff --git a/sysdeps/powerpc/w_sqrt.c b/sysdeps/powerpc/w_sqrt.c index df80973f58..c42ace503b 100644 --- a/sysdeps/powerpc/w_sqrt.c +++ b/sysdeps/powerpc/w_sqrt.c @@ -74,9 +74,9 @@ __sqrt(double x) fe = fegetenv_register(); EXTRACT_WORDS (xi0,xi1,x); relax_fenv_state(); - sxi = xi0 & 0x3fffffff | 0x3fe00000; + sxi = (xi0 & 0x3fffffff) | 0x3fe00000; INSERT_WORDS (sx, sxi, xi1); - t_sqrt = __t_sqrt + (xi0 >> 52-32-8-1 & 0x3fe); + t_sqrt = __t_sqrt + (xi0 >> (52-32-8-1) & 0x3fe); sg = t_sqrt[0]; sy = t_sqrt[1]; @@ -84,7 +84,7 @@ __sqrt(double x) division and a square root and the remainder of the argument reduction, all interleaved. */ sd = -(sg*sg - sx); - fsgi = xi0 + 0x40000000 >> 1 & 0x7ff00000; + fsgi = (xi0 + 0x40000000) >> 1 & 0x7ff00000; sy2 = sy + sy; sg = sy*sd + sg; /* 16-bit approximation to sqrt(sx). */ INSERT_WORDS (fsg, fsgi, 0); diff --git a/sysdeps/powerpc/w_sqrtf.c b/sysdeps/powerpc/w_sqrtf.c index 804dff3c44..d40ade12d0 100644 --- a/sysdeps/powerpc/w_sqrtf.c +++ b/sysdeps/powerpc/w_sqrtf.c @@ -74,9 +74,9 @@ __sqrtf(float x) GET_FLOAT_WORD (xi, x); fe = fegetenv_register (); relax_fenv_state (); - sxi = xi & 0x3fffffff | 0x3f000000; + sxi = (xi & 0x3fffffff) | 0x3f000000; SET_FLOAT_WORD (sx, sxi); - t_sqrt = __t_sqrt + (xi >> 23-8-1 & 0x3fe); + t_sqrt = __t_sqrt + (xi >> (23-8-1) & 0x3fe); sg = t_sqrt[0]; sy = t_sqrt[1]; @@ -84,7 +84,7 @@ __sqrtf(float x) division and a square root and the remainder of the argument reduction, all interleaved. */ sd = -(sg*sg - sx); - fsgi = xi + 0x40000000 >> 1 & 0x7f800000; + fsgi = (xi + 0x40000000) >> 1 & 0x7f800000; sy2 = sy + sy; sg = sy*sd + sg; /* 16-bit approximation to sqrt(sx). */ e = -(sy*sg - almost_half); diff --git a/sysdeps/unix/sysv/linux/mips/Dist b/sysdeps/unix/sysv/linux/mips/Dist index 5f0429b282..576aef8046 100644 --- a/sysdeps/unix/sysv/linux/mips/Dist +++ b/sysdeps/unix/sysv/linux/mips/Dist @@ -3,14 +3,8 @@ kernel_sigaction.h kernel_stat.h kernel_termios.h entry.h -regdef.h -fpregdef.h -sgidefs.h xstatconv.c sys/acct.h -sys/asm.h sys/cachectl.h -sys/fpregdef.h sys/procfs.h -sys/regdef.h sys/sysmips.h diff --git a/sysdeps/unix/sysv/linux/mips/Makefile b/sysdeps/unix/sysv/linux/mips/Makefile index 5d3e280d7c..41451ca7d1 100644 --- a/sysdeps/unix/sysv/linux/mips/Makefile +++ b/sysdeps/unix/sysv/linux/mips/Makefile @@ -7,6 +7,5 @@ endif ifeq ($(subdir),misc) sysdep_routines += cachectl cacheflush sysmips -headers += regdef.h fpregdef.h sys/asm.h sys/cachectl.h sys/fpregdef.h \ - sys/regdef.h sys/sysmips.h +headers += sys/cachectl.h sys/sysmips.h endif diff --git a/sysdeps/unix/sysv/linux/mips/bits/sigaction.h b/sysdeps/unix/sysv/linux/mips/bits/sigaction.h index 435f8e00f6..855fe287d4 100644 --- a/sysdeps/unix/sysv/linux/mips/bits/sigaction.h +++ b/sysdeps/unix/sysv/linux/mips/bits/sigaction.h @@ -28,8 +28,20 @@ struct sigaction unsigned int sa_flags; /* 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) __PMT ((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; @@ -43,14 +55,17 @@ struct sigaction }; /* Bits in `sa_flags'. */ -#define SA_NOCLDSTOP 1 /* Don't send SIGCHLD when children stop. */ -#ifdef __USE_MISC +#define SA_NOCLDSTOP 0x00020000 /* Don't send SIGCHLD when children stop. */ +#define SA_SIGINFO 0x00000008 /* 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 0x00000004 /* Restart syscall on signal return. */ -# define SA_INTERRUPT 0x00000000 /* Historical no-op. */ # define SA_NODEFER 0x00000010 /* 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 +# define SA_INTERRUPT 0x01000000 /* Historical no-op. */ /* Some aliases for the SA_ constants. */ # define SA_NOMASK SA_NODEFER @@ -63,5 +78,7 @@ struct sigaction #define SIG_BLOCK 1 /* Block signals. */ #define SIG_UNBLOCK 2 /* Unblock signals. */ #define SIG_SETMASK 3 /* Set the set of blocked signals. */ -#define SIG_SETMASK32 256 /* Goodie from SGI for BSD compatibility: +#ifdef __USE_MISC +# define SIG_SETMASK32 256 /* Goodie from SGI for BSD compatibility: set only the low 32 bit of the sigset. */ +#endif diff --git a/sysdeps/unix/sysv/linux/mips/fpregdef.h b/sysdeps/unix/sysv/linux/mips/fpregdef.h deleted file mode 100644 index a963d5f588..0000000000 --- a/sysdeps/unix/sysv/linux/mips/fpregdef.h +++ /dev/null @@ -1 +0,0 @@ -#include <sys/fpregdef.h> diff --git a/sysdeps/unix/sysv/linux/mips/regdef.h b/sysdeps/unix/sysv/linux/mips/regdef.h deleted file mode 100644 index b613c8b250..0000000000 --- a/sysdeps/unix/sysv/linux/mips/regdef.h +++ /dev/null @@ -1 +0,0 @@ -#include <sys/regdef.h> diff --git a/sysdeps/unix/sysv/linux/mips/syscalls.list b/sysdeps/unix/sysv/linux/mips/syscalls.list index dd29d159aa..434be84898 100644 --- a/sysdeps/unix/sysv/linux/mips/syscalls.list +++ b/sysdeps/unix/sysv/linux/mips/syscalls.list @@ -37,7 +37,7 @@ socketpair - socketpair 4 __socketpair socketpair # # There are defined locally because the caller is also defined in this dir. # -s_llseek llseek _llseek 5 __sys_llseek +s_llseek llseek _llseek 5 __syscall_llseek s_sigaction sigaction sigaction 3 __syscall_sigaction s_ustat ustat ustat 2 __syscall_ustat sys_mknod xmknod mknod 3 __syscall_mknod @@ -57,10 +57,11 @@ s_getdents getdents getdents 3 __syscall_getdents s_getpriority getpriority getpriority 2 __syscall_getpriority s_getresgid getresgid getresgid 3 __syscall_getresgid s_getresuid getresuid getresuid 3 __syscall_getresuid +s_ipc msgget ipc 5 __syscall_ipc s_poll poll poll 3 __syscall_poll -s_pread pread pread 6 __syscall_pread +s_pread64 pread64 pread 6 __syscall_pread s_ptrace ptrace ptrace 4 __syscall_ptrace -s_pwrite pwrite pwrite 6 __syscall_pwrite +s_pwrite64 pwrite64 pwrite 6 __syscall_pwrite s_reboot reboot reboot 3 __syscall_reboot s_sigpending sigpending sigpending 1 __syscall_sigpending s_sigprocmask sigprocmask sigprocmask 3 __syscall_sigprocmask diff --git a/sysdeps/unix/sysv/linux/mips/sys/regdef.h b/sysdeps/unix/sysv/linux/mips/sysdep.S index 700fd66f0b..c7bc193a40 100644 --- a/sysdeps/unix/sysv/linux/mips/sys/regdef.h +++ b/sysdeps/unix/sysv/linux/mips/sysdep.S @@ -1,6 +1,5 @@ -/* Copyright (C) 1997 Free Software Foundation, Inc. +/* Copyright (C) 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Ralf Baechle <ralf@gnu.ai.mit.edu>. 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 @@ -17,13 +16,21 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef _REGDEF_H -#define _REGDEF_H 1 +#include <sysdep.h> -/* - * The real definitions come from the Linux kernel sources - */ -#include <asm/regdef.h> -#include <asm/fpregdef.h> +/* Because the Linux version is in fact MIPS/ELF and the start.? file + for this system (sysdeps/mips/elf/start.S) is also used by The Hurd + and therefore this files must not contain the definition of the + `errno' variable (I don't know why, ask Roland), we have to define + it somewhere else. -#endif /* regdef.h */ + ...and this place is here. */ + .bss + .globl errno + .type errno,@object + .size errno,4 +errno: .word 4 + .text +weak_alias(errno, _errno) + +#include <sysdeps/unix/mips/sysdep.S> diff --git a/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c b/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c index 7e5acc83cb..4419953d06 100644 --- a/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c +++ b/sysdeps/unix/sysv/linux/powerpc/dl-sysdep.c @@ -34,7 +34,7 @@ ++_tmp; \ \ _test = (size_t)_tmp; \ - _test = _test + 0xf & ~0xf; \ + _test = (_test + 0xf) & ~0xf; \ /* Under some circumstances, MkLinux (up to at least DR3a5) \ omits the padding. To work around this, we make a \ basic sanity check of the argument vector. Of \ |