mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-24 22:10:13 +00:00
Update.
2000-08-02 Andreas Jaeger <aj@suse.de> * sysdeps/unix/sysv/linux/s390/Dist: New file. * sysdeps/unix/sysv/linux/s390/sysdep.h: New file. * sysdeps/unix/sysv/linux/s390/sysdep.S: New file. * sysdeps/unix/sysv/linux/s390/syscall.S: New file. * sysdeps/unix/sysv/linux/s390/sys/user.h: New file. * sysdeps/unix/sysv/linux/s390/sys/ucontext.h: New file. * sysdeps/unix/sysv/linux/s390/sys/ptrace.h: New file. * sysdeps/unix/sysv/linux/s390/sys/elf.h: New file. * sysdeps/unix/sysv/linux/s390/socket.S: New file. * sysdeps/unix/sysv/linux/s390/sigcontextinfo.h: New file. * sysdeps/unix/sysv/linux/s390/shmctl.c: New file. * sysdeps/unix/sysv/linux/s390/setreuid.c: New file. * sysdeps/unix/sysv/linux/s390/setresuid.c: New file. * sysdeps/unix/sysv/linux/s390/setresgid.c: New file. * sysdeps/unix/sysv/linux/s390/setregid.c: New file. * sysdeps/unix/sysv/linux/s390/setgroups.c: New file. * sysdeps/unix/sysv/linux/s390/setgid.c: New file. * sysdeps/unix/sysv/linux/s390/setfsuid.c: New file. * sysdeps/unix/sysv/linux/s390/setfsgid.c: New file. * sysdeps/unix/sysv/linux/s390/seteuid.c: New file. * sysdeps/unix/sysv/linux/s390/setegid.c: New file. * sysdeps/unix/sysv/linux/s390/semctl.c: New file. * sysdeps/unix/sysv/linux/s390/register-dump.h: New file. * sysdeps/unix/sysv/linux/s390/putpmsg.c: New file. * sysdeps/unix/sysv/linux/s390/putmsg.c: New file. * sysdeps/unix/sysv/linux/s390/profil-counter.h: New file. * sysdeps/unix/sysv/linux/s390/msgctl.c: New file. * sysdeps/unix/sysv/linux/s390/mmap.S: New file. * sysdeps/unix/sysv/linux/s390/getuid.c: New file. * sysdeps/unix/sysv/linux/s390/getresuid.c: New file. * sysdeps/unix/sysv/linux/s390/getresgid.c: New file. * sysdeps/unix/sysv/linux/s390/getpmsg.c: New file. * sysdeps/unix/sysv/linux/s390/getmsg.c: New file. * sysdeps/unix/sysv/linux/s390/getgroups.c: New file. * sysdeps/unix/sysv/linux/s390/getegid.c: New file. * sysdeps/unix/sysv/linux/s390/geteuid.c: New file. * sysdeps/unix/sysv/linux/s390/fchown.c: New file. * sysdeps/unix/sysv/linux/s390/clone.S: New file. * sysdeps/unix/sysv/linux/s390/brk.c: New file. * sysdeps/unix/sysv/linux/s390/bits/time.h: New file. * sysdeps/unix/sysv/linux/s390/bits/resource.h: New file. * sysdeps/unix/sysv/linux/s390/bits/mman.h: New file. * sysdeps/unix/sysv/linux/s390/bits/fcntl.h: New file. * sysdeps/unix/sysv/linux/s390/Makefile: New file. * sysdeps/s390/sysdep.h: New file. * sysdeps/s390/sys/ucontext.h: New file. * sysdeps/s390/sub_n.S: New file. * sysdeps/s390/strncpy.S: New file. * sysdeps/s390/strcpy.S: New file. * sysdeps/s390/stackinfo.h: New file. * sysdeps/s390/setjmp.S: New file. * sysdeps/s390/s390-mcount.S: New file. * sysdeps/s390/mul_1.S: New file. * sysdeps/s390/memusage.h: New file. * sysdeps/s390/memset.S: New file. * sysdeps/s390/memcpy.S: New file. * sysdeps/s390/memchr.S: New file. * sysdeps/s390/machine-gmon.h: New file. * sysdeps/s390/ldbl2mpn.c: New file. * sysdeps/s390/gmp-mparam.h: New file. * sysdeps/s390/fpu/fpu_control.h: New file. * sysdeps/s390/fpu/fesetround.c: New file. * sysdeps/s390/fpu/fegetround.c: New file. * sysdeps/s390/fpu/fclrexcpt.c: New file. * sysdeps/s390/fpu/bits/fenv.h: New file. * sysdeps/s390/ffs.c: New file. * sysdeps/s390/elf/start.S: New file. * sysdeps/s390/elf/setjmp.S: New file. * sysdeps/s390/elf/bsd-setjmp.S: New file. * sysdeps/s390/elf/bsd-_setjmp.S: New file. * sysdeps/s390/dl-machine.h: New file. * sysdeps/s390/bzero.S: New file. * sysdeps/s390/bsd-setjmp.S: New file. * sysdeps/s390/bsd-_setjmp.S: New file. * sysdeps/s390/bits/string.h: New file. * sysdeps/s390/bits/setjmp.h: New file. * sysdeps/s390/bits/huge_val.h: New file. * sysdeps/s390/bits/endian.h: New file. * sysdeps/s390/bits/byteswap.h: New file. * sysdeps/s390/bcopy.S: New file. * sysdeps/s390/backtrace.c: New file. * sysdeps/s390/atomicity.h: New file. * sysdeps/s390/asm-syntax.h: New file. * sysdeps/s390/addmul_1.S: New file. * sysdeps/s390/add_n.S: New file. * sysdeps/s390/abort-instr.h: New file. * sysdeps/s390/__longjmp.c: New file. * sysdeps/s390/Makefile: New file. * sysdeps/s390/Implies: New file. * sysdeps/s390/Dist: New file. Patches by Martin Schwidefsky <schwidefsky@de.ibm.com>.
This commit is contained in:
parent
9016e55cb8
commit
847b055c65
94
ChangeLog
94
ChangeLog
@ -1,3 +1,97 @@
|
||||
2000-08-02 Andreas Jaeger <aj@suse.de>
|
||||
|
||||
* sysdeps/unix/sysv/linux/s390/Dist: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/sysdep.h: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/sysdep.S: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/syscall.S: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/sys/user.h: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/sys/ucontext.h: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/sys/ptrace.h: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/sys/elf.h: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/socket.S: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/sigcontextinfo.h: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/shmctl.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/setreuid.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/setresuid.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/setresgid.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/setregid.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/setgroups.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/setgid.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/setfsuid.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/setfsgid.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/seteuid.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/setegid.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/semctl.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/register-dump.h: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/putpmsg.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/putmsg.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/profil-counter.h: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/msgctl.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/mmap.S: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/getuid.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/getresuid.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/getresgid.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/getpmsg.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/getmsg.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/getgroups.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/getegid.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/geteuid.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/fchown.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/clone.S: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/brk.c: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/bits/time.h: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/bits/resource.h: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/bits/mman.h: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/bits/fcntl.h: New file.
|
||||
* sysdeps/unix/sysv/linux/s390/Makefile: New file.
|
||||
* sysdeps/s390/sysdep.h: New file.
|
||||
* sysdeps/s390/sys/ucontext.h: New file.
|
||||
* sysdeps/s390/sub_n.S: New file.
|
||||
* sysdeps/s390/strncpy.S: New file.
|
||||
* sysdeps/s390/strcpy.S: New file.
|
||||
* sysdeps/s390/stackinfo.h: New file.
|
||||
* sysdeps/s390/setjmp.S: New file.
|
||||
* sysdeps/s390/s390-mcount.S: New file.
|
||||
* sysdeps/s390/mul_1.S: New file.
|
||||
* sysdeps/s390/memusage.h: New file.
|
||||
* sysdeps/s390/memset.S: New file.
|
||||
* sysdeps/s390/memcpy.S: New file.
|
||||
* sysdeps/s390/memchr.S: New file.
|
||||
* sysdeps/s390/machine-gmon.h: New file.
|
||||
* sysdeps/s390/ldbl2mpn.c: New file.
|
||||
* sysdeps/s390/gmp-mparam.h: New file.
|
||||
* sysdeps/s390/fpu/fpu_control.h: New file.
|
||||
* sysdeps/s390/fpu/fesetround.c: New file.
|
||||
* sysdeps/s390/fpu/fegetround.c: New file.
|
||||
* sysdeps/s390/fpu/fclrexcpt.c: New file.
|
||||
* sysdeps/s390/fpu/bits/fenv.h: New file.
|
||||
* sysdeps/s390/ffs.c: New file.
|
||||
* sysdeps/s390/elf/start.S: New file.
|
||||
* sysdeps/s390/elf/setjmp.S: New file.
|
||||
* sysdeps/s390/elf/bsd-setjmp.S: New file.
|
||||
* sysdeps/s390/elf/bsd-_setjmp.S: New file.
|
||||
* sysdeps/s390/dl-machine.h: New file.
|
||||
* sysdeps/s390/bzero.S: New file.
|
||||
* sysdeps/s390/bsd-setjmp.S: New file.
|
||||
* sysdeps/s390/bsd-_setjmp.S: New file.
|
||||
* sysdeps/s390/bits/string.h: New file.
|
||||
* sysdeps/s390/bits/setjmp.h: New file.
|
||||
* sysdeps/s390/bits/huge_val.h: New file.
|
||||
* sysdeps/s390/bits/endian.h: New file.
|
||||
* sysdeps/s390/bits/byteswap.h: New file.
|
||||
* sysdeps/s390/bcopy.S: New file.
|
||||
* sysdeps/s390/backtrace.c: New file.
|
||||
* sysdeps/s390/atomicity.h: New file.
|
||||
* sysdeps/s390/asm-syntax.h: New file.
|
||||
* sysdeps/s390/addmul_1.S: New file.
|
||||
* sysdeps/s390/add_n.S: New file.
|
||||
* sysdeps/s390/abort-instr.h: New file.
|
||||
* sysdeps/s390/__longjmp.c: New file.
|
||||
* sysdeps/s390/Makefile: New file.
|
||||
* sysdeps/s390/Implies: New file.
|
||||
* sysdeps/s390/Dist: New file.
|
||||
Patches by Martin Schwidefsky <schwidefsky@de.ibm.com>.
|
||||
|
||||
2000-08-01 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
Remove incompatible IPv6 extension of RPC.
|
||||
|
2
sysdeps/s390/Dist
Normal file
2
sysdeps/s390/Dist
Normal file
@ -0,0 +1,2 @@
|
||||
s390-mcount.S
|
||||
machine-gmon.h
|
4
sysdeps/s390/Implies
Normal file
4
sysdeps/s390/Implies
Normal file
@ -0,0 +1,4 @@
|
||||
wordsize-32
|
||||
ieee754
|
||||
ieee754/dbl-64
|
||||
ieee754/flt-32
|
11
sysdeps/s390/Makefile
Normal file
11
sysdeps/s390/Makefile
Normal file
@ -0,0 +1,11 @@
|
||||
pic-ccflag = -fpic
|
||||
|
||||
ifeq ($(subdir),gmon)
|
||||
sysdep_routines += s390-mcount
|
||||
endif
|
||||
|
||||
ifeq ($(subdir),elf)
|
||||
CFLAGS-rtld.c += -Wno-uninitialized -Wno-unused
|
||||
CFLAGS-dl-load.c += -Wno-unused
|
||||
CFLAGS-dl-reloc.c += -Wno-unused
|
||||
endif
|
43
sysdeps/s390/__longjmp.c
Normal file
43
sysdeps/s390/__longjmp.c
Normal file
@ -0,0 +1,43 @@
|
||||
/* Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
|
||||
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 <sysdep.h>
|
||||
#include <setjmp.h>
|
||||
#include <bits/setjmp.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* Jump to the position specified by ENV, causing the
|
||||
setjmp call there to return VAL, or 1 if VAL is 0. */
|
||||
void
|
||||
__longjmp (__jmp_buf env, int val)
|
||||
{
|
||||
unsigned int result;
|
||||
|
||||
/* Restore registers and jump back */
|
||||
asm volatile("lr %%r2,%0\n\t" /* put val in grp 2 */
|
||||
"lm %%r6,%%r15,%1\n\t"
|
||||
"br %%r14"
|
||||
: : "r" (val == 0 ? 1 : val),
|
||||
"m" (env->gregs[JB_GPR6]) : "2" );
|
||||
|
||||
/* Avoid `volatile function does return' warnings. */
|
||||
for (;;);
|
||||
}
|
2
sysdeps/s390/abort-instr.h
Normal file
2
sysdeps/s390/abort-instr.h
Normal file
@ -0,0 +1,2 @@
|
||||
/* An op-code of 0 should crash any program. */
|
||||
#define ABORT_INSTRUCTION asm (".word 0")
|
63
sysdeps/s390/add_n.S
Normal file
63
sysdeps/s390/add_n.S
Normal file
@ -0,0 +1,63 @@
|
||||
/* Add two limb vectors of the same length > 0 and store sum in a third
|
||||
limb vector.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
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 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 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 Library General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library 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
|
||||
*/
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
.text
|
||||
ENTRY(__mpn_add_n)
|
||||
st %r6,24(%r15) # save register 6
|
||||
sr %r1,%r1
|
||||
lhi %r0,1 # cannot use ahi to add carry, use alr
|
||||
.L0: l %r6,0(%r1,%r3) # .L0 -> no carry from last add
|
||||
al %r6,0(%r1,%r4)
|
||||
st %r6,0(%r1,%r2)
|
||||
la %r1,4(0,%r1)
|
||||
brc 3,.L3
|
||||
.L1: brct %r5,.L0
|
||||
slr %r2,%r2 # no last carry to return
|
||||
j .Lexit
|
||||
.L2: l %r6,0(%r1,%r3) # .L2 -> carry from last add
|
||||
al %r6,0(%r1,%r4)
|
||||
brc 3,.L4
|
||||
alr %r6,%r0 # no carry yet, add carry from last add
|
||||
st %r6,0(%r1,%r2)
|
||||
la %r1,4(0,%r1)
|
||||
brc 12,.L1 # new carry ?
|
||||
.L3: brct %r5,.L2
|
||||
lr %r2,%r0 # return last carry
|
||||
j .Lexit
|
||||
.L4: alr %r6,%r0 # already a carry, add carry from last add
|
||||
st %r6,0(%r1,%r2)
|
||||
la %r1,4(0,%r1)
|
||||
brct %r5,.L2
|
||||
lr %r2,%r0 # return last carry
|
||||
.Lexit: l %r6,24(%r15) # restore register 6
|
||||
br %r14
|
||||
END(__mpn_add_n)
|
58
sysdeps/s390/addmul_1.S
Normal file
58
sysdeps/s390/addmul_1.S
Normal file
@ -0,0 +1,58 @@
|
||||
/* S390 __mpn_addmul_1 -- Multiply a limb vector with a limb and add
|
||||
the result to a second limb vector.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
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 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 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 Library General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library 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
|
||||
sizeP %r4
|
||||
s2_limb %r5
|
||||
*/
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
.text
|
||||
ENTRY(__mpn_addmul_1)
|
||||
st %r6,24(%r15)
|
||||
slr %r6,%r6 # cy_limb = 0
|
||||
.L0: icm %r1,15,0(%r3) # get s1_ptr[i]
|
||||
mr %r0,%r5 # umul_ppmm(prod_high,prod_low,s1_ptr[j],s2_limb)
|
||||
jnm .L1
|
||||
alr %r0,%r5
|
||||
.L1: ltr %r5,%r5
|
||||
jnm .L2
|
||||
al %r0,0(%r3)
|
||||
.L2: alr %r1,%r6 # prod_low += cy_limb
|
||||
lr %r6,%r0 # cy_limb = prod_high
|
||||
brc 12,.L3
|
||||
ahi %r6,1 # + (prod_low < cy_limb)
|
||||
.L3: al %r1,0(%r2) # prod_low += res_ptr[i]
|
||||
brc 12,.L4
|
||||
ahi %r6,1 # cy_limb++
|
||||
.L4: st %r1,0(%r2)
|
||||
la %r2,4(0,%r2)
|
||||
la %r3,4(0,%r3)
|
||||
brct %r4,.L0
|
||||
lr %r2,%r6 # return cy_limb
|
||||
l %r6,24(%r15)
|
||||
.Lexit: br %r14
|
||||
END(__mpn_addmul_1)
|
42
sysdeps/s390/asm-syntax.h
Normal file
42
sysdeps/s390/asm-syntax.h
Normal file
@ -0,0 +1,42 @@
|
||||
/* Definitions for S/390 syntax variations.
|
||||
Copyright (C) 1992, 1994, 1995, 1997, 2000 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of the GNU C Library. Its master source is NOT part of
|
||||
the C library, however. The master source lives in the GNU MP 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. */
|
||||
|
||||
#undef ALIGN
|
||||
#if defined NOLOG_ALIGN || defined HAVE_ELF
|
||||
# define ALIGN(log) .align 1<<log
|
||||
#else
|
||||
# define ALIGN(log) .align log
|
||||
#endif
|
||||
|
||||
#undef L
|
||||
#ifdef __ELF__
|
||||
# ifdef __STDC__
|
||||
# define L(body) .L##body
|
||||
# else
|
||||
# define L(body) .L/**/body
|
||||
# endif
|
||||
#else
|
||||
# ifdef __STDC__
|
||||
# define L(body) L##body
|
||||
# else
|
||||
# define L(body) L/**/body
|
||||
# endif
|
||||
#endif
|
74
sysdeps/s390/atomicity.h
Normal file
74
sysdeps/s390/atomicity.h
Normal file
@ -0,0 +1,74 @@
|
||||
/* Low-level functions for atomic operations. S390 version.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
This file is part of the 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 _ATOMICITY_H
|
||||
#define _ATOMICITY_H 1
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
static inline int
|
||||
__attribute__ ((unused))
|
||||
exchange_and_add (volatile uint32_t *mem, int val)
|
||||
{
|
||||
int result;
|
||||
__asm__ __volatile__(
|
||||
" L %0,%2\n"
|
||||
" LA 2,%1\n"
|
||||
"0: LR 0,%0\n"
|
||||
" AR 0,%3\n"
|
||||
" CS %0,0,0(2)\n"
|
||||
" JL 0b"
|
||||
: "=&d" (result), "=m" (*mem)
|
||||
: "1" (*mem), "d" (val) : "0", "1", "2" );
|
||||
return result;
|
||||
}
|
||||
|
||||
static inline void
|
||||
__attribute__ ((unused))
|
||||
atomic_add (volatile uint32_t *mem, int val)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
" LA 2,%0\n"
|
||||
"0: L 0,%1\n"
|
||||
" LR 1,0\n"
|
||||
" AR 1,%2\n"
|
||||
" CS 0,1,0(2)\n"
|
||||
" JL 0b"
|
||||
: "=m" (*mem) : "0" (*mem), "d" (val) : "0", "1", "2" );
|
||||
}
|
||||
|
||||
static inline int
|
||||
__attribute__ ((unused))
|
||||
compare_and_swap (volatile long int *p, long int oldval, long int newval)
|
||||
{
|
||||
int retval;
|
||||
|
||||
__asm__ __volatile__(
|
||||
" cs %2,%3,%1\n"
|
||||
" ipm %0\n"
|
||||
" srl %0,28\n"
|
||||
"0:"
|
||||
: "=&r" (retval), "+m" (*p)
|
||||
: "d" (oldval) , "d" (newval)
|
||||
: "memory", "cc");
|
||||
return !retval;
|
||||
}
|
||||
|
||||
#endif /* atomicity.h */
|
81
sysdeps/s390/backtrace.c
Normal file
81
sysdeps/s390/backtrace.c
Normal file
@ -0,0 +1,81 @@
|
||||
/* Return backtrace of current program state.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
This file is part of the 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 <execinfo.h>
|
||||
#include <stddef.h>
|
||||
|
||||
/* This is a global variable set at program start time. It marks the
|
||||
highest used stack address. */
|
||||
extern void *__libc_stack_end;
|
||||
|
||||
|
||||
/* This is the stack layout we see for every non-leaf function.
|
||||
size offset
|
||||
%r15 -> +------------------+
|
||||
4 | back chain | 0
|
||||
4 | end of stack | 4
|
||||
8 | glue | 8
|
||||
8 | scratch | 16
|
||||
40 | save area r6-r15 | 24
|
||||
16 | save area f4,f6 | 64
|
||||
16 | empty | 80
|
||||
+------------------+
|
||||
r14 in the save area holds the return address.
|
||||
*/
|
||||
|
||||
struct layout
|
||||
{
|
||||
int back_chain;
|
||||
int end_of_stack;
|
||||
int glue[2];
|
||||
int scratch[2];
|
||||
int save_grps[10];
|
||||
int save_fp[4];
|
||||
int empty[2];
|
||||
};
|
||||
|
||||
int
|
||||
__backtrace (array, size)
|
||||
void **array;
|
||||
int size;
|
||||
{
|
||||
/* We assume that all the code is generated with frame pointers set. */
|
||||
struct layout *stack;
|
||||
int cnt = 0;
|
||||
|
||||
asm ("LR %0,%%r15" : "=d" (stack) );
|
||||
/* We skip the call to this function, it makes no sense to record it. */
|
||||
stack = (struct layout *) stack->back_chain;
|
||||
while (cnt < size)
|
||||
{
|
||||
if (stack == NULL || (void *) stack > __libc_stack_end)
|
||||
/* This means the address is out of range. Note that for the
|
||||
toplevel we see a frame pointer with value NULL which clearly is
|
||||
out of range. */
|
||||
break;
|
||||
|
||||
array[cnt++] = stack->save_grps[9];
|
||||
|
||||
stack = (struct layout *) stack->back_chain;
|
||||
}
|
||||
|
||||
return cnt;
|
||||
}
|
||||
weak_alias (__backtrace, backtrace)
|
69
sysdeps/s390/bcopy.S
Normal file
69
sysdeps/s390/bcopy.S
Normal file
@ -0,0 +1,69 @@
|
||||
/* bcopy -- copy a block from source to destination. For IBM S390
|
||||
This file is part of the GNU C Library.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
|
||||
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. */
|
||||
|
||||
/*
|
||||
* R2 = address of source
|
||||
* R3 = address of destination
|
||||
* R4 = number of bytes to copy
|
||||
*/
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
.text
|
||||
ENTRY(__bcopy)
|
||||
clr %r2,%r3 # check against destructive overlap
|
||||
jnl .L0
|
||||
lr %r1,%r2
|
||||
alr %r1,%r4
|
||||
clr %r1,%r3
|
||||
jh .L2
|
||||
.L0:
|
||||
lr %r5,%r4 # source length
|
||||
lr %r4,%r2 # source address
|
||||
sr %r1,%r1 # set pad byte to zero
|
||||
lr %r2,%r3 # set destination
|
||||
lr %r3,%r5 # destination length = source length
|
||||
.L1: mvcle %r2,%r4,0(%r1) # thats it, MVCLE is your friend
|
||||
jo .L1
|
||||
br %r14
|
||||
.L2: # destructive overlay, can not use mvcle
|
||||
lr %r1,%r2 # bcopy is called with source,dest
|
||||
lr %r2,%r3 # memmove with dest,source! Oh, well...
|
||||
lr %r3,%r1
|
||||
basr %r1,0
|
||||
.L3:
|
||||
#ifdef PIC
|
||||
al %r1,.L4-.L3(%r1) # get address of global offset table
|
||||
# load address of memmove
|
||||
l %r1,memmove@GOT12(%r1)
|
||||
br %r1
|
||||
.L4: .long _GLOBAL_OFFSET_TABLE_-.L3
|
||||
#else
|
||||
al %r1,.L4-.L3(%r1) # load address of memmove
|
||||
br %r1 # jump to memmove
|
||||
.L4: .long memmove-.L3
|
||||
#endif
|
||||
|
||||
END(__bcopy)
|
||||
|
||||
#ifndef NO_WEAK_ALIAS
|
||||
weak_alias (__bcopy, bcopy)
|
||||
#endif
|
86
sysdeps/s390/bits/byteswap.h
Normal file
86
sysdeps/s390/bits/byteswap.h
Normal file
@ -0,0 +1,86 @@
|
||||
/* Macros to swap the order of bytes in integer values. s390 version.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
This file is part of the 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. */
|
||||
|
||||
#if !defined _BYTESWAP_H && !defined _NETINET_IN_H
|
||||
# error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead."
|
||||
#endif
|
||||
|
||||
#define __bswap_constant_16(x) \
|
||||
((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))
|
||||
|
||||
/* Swap bytes in 16 bit value. */
|
||||
#if defined __GNUC__ && __GNUC__ >= 2
|
||||
# define __bswap_16(x) \
|
||||
(__extension__ \
|
||||
({ unsigned short int __v; \
|
||||
if (__builtin_constant_p (x)) \
|
||||
__v = __bswap_constant_16 (x); \
|
||||
else { \
|
||||
unsigned short int __tmp = (unsigned short int) (x); \
|
||||
__asm__ __volatile__ ( \
|
||||
"sr %0,%0\n" \
|
||||
"la 1,%1\n" \
|
||||
"icm %0,2,1(1)\n" \
|
||||
"ic %0,0(1)" \
|
||||
: "=&d" (__v) : "m" (__tmp) : "1"); \
|
||||
} \
|
||||
__v; }))
|
||||
#else
|
||||
/* This is better than nothing. */
|
||||
#define __bswap_16(x) __bswap_constant_16 (x)
|
||||
#endif
|
||||
|
||||
/* Swap bytes in 32 bit value. */
|
||||
#define __bswap_constant_32(x) \
|
||||
((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \
|
||||
(((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))
|
||||
|
||||
#if defined __GNUC__ && __GNUC__ >= 2
|
||||
# define __bswap_32(x) \
|
||||
(__extension__ \
|
||||
({ unsigned int __v; \
|
||||
if (__builtin_constant_p (x)) \
|
||||
__v = __bswap_constant_32 (x); \
|
||||
else { \
|
||||
unsigned int __tmp = (unsigned int) (x); \
|
||||
__asm__ __volatile__ ( \
|
||||
"la 1,%1\n" \
|
||||
"icm %0,8,3(1)\n" \
|
||||
"icm %0,4,2(1)\n" \
|
||||
"icm %0,2,1(1)\n" \
|
||||
"ic %0,0(1)" \
|
||||
: "=&d" (__v) : "m" (__tmp) : "1"); \
|
||||
} \
|
||||
__v; }))
|
||||
#else
|
||||
# define __bswap_32(x) __bswap_constant_32 (x)
|
||||
#endif
|
||||
|
||||
#if defined __GNUC__ && __GNUC__ >= 2
|
||||
/* Swap bytes in 64 bit value. */
|
||||
# define __bswap_64(x) \
|
||||
__extension__ \
|
||||
({ union { unsigned long long int __ll; \
|
||||
unsigned long int __l[2]; } __w, __r; \
|
||||
__w.__ll = (x); \
|
||||
__r.__l[0] = __bswap_32 (__w.__l[1]); \
|
||||
__r.__l[1] = __bswap_32 (__w.__l[0]); \
|
||||
__r.__ll; })
|
||||
#endif
|
7
sysdeps/s390/bits/endian.h
Normal file
7
sysdeps/s390/bits/endian.h
Normal file
@ -0,0 +1,7 @@
|
||||
/* s390 is big-endian */
|
||||
|
||||
#ifndef _ENDIAN_H
|
||||
# error "Never use <bits/endian.h> directly; include <endian.h> instead."
|
||||
#endif
|
||||
|
||||
#define __BYTE_ORDER __BIG_ENDIAN
|
73
sysdeps/s390/bits/huge_val.h
Normal file
73
sysdeps/s390/bits/huge_val.h
Normal file
@ -0,0 +1,73 @@
|
||||
/* `HUGE_VAL' constants for s390 (where it is infinity).
|
||||
Used by <stdlib.h> and <math.h> functions for overflow.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
This file is part of the 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 _MATH_H
|
||||
# error "Never use <bits/huge_val.h> directly; include <math.h> instead."
|
||||
#endif
|
||||
|
||||
#include <features.h>
|
||||
|
||||
/* IEEE positive infinity (-HUGE_VAL is negative infinity). */
|
||||
|
||||
#if __GNUC_PREREQ(2,96)
|
||||
# define HUGE_VAL (__extension__ 0x1.0p2047)
|
||||
#else
|
||||
#define __HUGE_VAL_bytes { 0x7f, 0xf0, 0, 0, 0, 0, 0, 0 }
|
||||
|
||||
#define __huge_val_t union { unsigned char __c[8]; double __d; }
|
||||
#ifdef __GNUC__
|
||||
# define HUGE_VAL (__extension__ \
|
||||
((__huge_val_t) { __c: __HUGE_VAL_bytes }).__d)
|
||||
#else /* Not GCC. */
|
||||
static __huge_val_t __huge_val = { __HUGE_VAL_bytes };
|
||||
# define HUGE_VAL (__huge_val.__d)
|
||||
#endif /* GCC. */
|
||||
#endif /* GCC 2.95 */
|
||||
|
||||
|
||||
/* ISO C 99 extensions: (float) HUGE_VALF and (long double) HUGE_VALL. */
|
||||
|
||||
#ifdef __USE_ISOC99
|
||||
|
||||
# if __GNUC_PREREQ(2,96)
|
||||
|
||||
# define HUGE_VALF (__extension__ 0x1.0p255f)
|
||||
# define HUGE_VALL (__extension__ 0x1.0p255f)
|
||||
|
||||
# else
|
||||
|
||||
# define __HUGE_VALF_bytes { 0x7f, 0x80, 0, 0 }
|
||||
|
||||
# define __huge_valf_t union { unsigned char __c[4]; float __f; }
|
||||
# ifdef __GNUC__
|
||||
# define HUGE_VALF (__extension__ \
|
||||
((__huge_valf_t) { __c: __HUGE_VALF_bytes }).__f)
|
||||
# else /* Not GCC. */
|
||||
static __huge_valf_t __huge_valf = { __HUGE_VALF_bytes };
|
||||
# define HUGE_VALF (__huge_valf.__f)
|
||||
# endif /* GCC. */
|
||||
|
||||
/* On 390 there is no 'long double' format. Make it the same as 'double' */
|
||||
# define HUGE_VALL HUGE_VAL
|
||||
|
||||
# endif /* GCC 2.95 */
|
||||
|
||||
#endif /* __USE_ISOC99. */
|
52
sysdeps/s390/bits/setjmp.h
Normal file
52
sysdeps/s390/bits/setjmp.h
Normal file
@ -0,0 +1,52 @@
|
||||
/* 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 Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* Define the machine-dependent type `jmp_buf'. IBM s390 version. */
|
||||
|
||||
#ifndef __S390_SETJMP_H__
|
||||
#define __S390_SETJMP_H__
|
||||
|
||||
#define JB_GPR6 0
|
||||
#define JB_GPR7 1
|
||||
#define JB_GPR8 2
|
||||
#define JB_GPR9 3
|
||||
#define JB_GPR10 4
|
||||
#define JB_GPR11 5
|
||||
#define JB_GPR12 6
|
||||
#define JB_GPR13 7
|
||||
#define JB_GPR14 8
|
||||
#define JB_GPR15 9
|
||||
|
||||
#ifndef _ASM
|
||||
|
||||
typedef struct {
|
||||
/* We save registers 6-15 */
|
||||
long int gregs[10];
|
||||
|
||||
/* We save fpu registers 4 and 6 */
|
||||
long long fpregs[2];
|
||||
} __jmp_buf[1];
|
||||
|
||||
#endif
|
||||
|
||||
/* Test if longjmp to JMPBUF would unwind the frame
|
||||
containing a local variable at ADDRESS. */
|
||||
#define _JMPBUF_UNWINDS(jmpbuf, address) \
|
||||
((int) (address) < (jmpbuf)->gregs[JB_GPR15])
|
||||
|
||||
#endif /* __S390_SETJMP_H__ */
|
140
sysdeps/s390/bits/string.h
Normal file
140
sysdeps/s390/bits/string.h
Normal file
@ -0,0 +1,140 @@
|
||||
/* Optimized, inlined string functions. s390 version.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
This file is part of the 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 _STRING_H
|
||||
# error "Never use <bits/string.h> directly; include <string.h> instead."
|
||||
#endif
|
||||
|
||||
/* The s390 processors can access unaligned multi-byte variables. */
|
||||
#define _STRING_ARCH_unaligned 1
|
||||
|
||||
|
||||
/* We only provide optimizations if the user selects them and if
|
||||
GNU CC is used. */
|
||||
#if !defined __NO_STRING_INLINES && defined __USE_STRING_INLINES \
|
||||
&& defined __GNUC__ && __GNUC__ >= 2
|
||||
|
||||
#ifdef __cplusplus
|
||||
# define __STRING_INLINE inline
|
||||
#else
|
||||
# define __STRING_INLINE extern __inline
|
||||
#endif
|
||||
|
||||
#define _HAVE_STRING_ARCH_strlen 1
|
||||
__STRING_INLINE size_t
|
||||
strlen (__const char *__str)
|
||||
{
|
||||
size_t __len;
|
||||
|
||||
__asm__ __volatile__ (" sr 0,0\n"
|
||||
" lr %0,%1\n"
|
||||
"0: srst 0,%0\n"
|
||||
" jo 0b\n"
|
||||
" lr %0,0\n"
|
||||
" sr %0,%1"
|
||||
: "=&a" (__len) : "a" (__str)
|
||||
: "cc", "0" );
|
||||
return __len;
|
||||
}
|
||||
|
||||
/* Copy SRC to DEST. */
|
||||
#define _HAVE_STRING_ARCH_strcpy 1
|
||||
__STRING_INLINE char *
|
||||
strcpy (char *__dest, __const char *__src)
|
||||
{
|
||||
char *tmp = __dest;
|
||||
|
||||
__asm__ __volatile__ (" sr 0,0\n"
|
||||
"0: mvst %0,%1\n"
|
||||
" jo 0b"
|
||||
: "+&a" (__dest), "+&a" (__src) :
|
||||
: "cc", "memory", "0" );
|
||||
return tmp;
|
||||
}
|
||||
|
||||
#define _HAVE_STRING_ARCH_strncpy 1
|
||||
__STRING_INLINE char *
|
||||
strncpy (char *__dest, __const char *__src, size_t __n)
|
||||
{
|
||||
char *tmp = __dest;
|
||||
|
||||
if (__n <= 0)
|
||||
return tmp;
|
||||
__asm__ __volatile (" slr %0,%1\n"
|
||||
"0: icm 0,1,0(%1)\n"
|
||||
" stc 0,0(%0,%1)\n"
|
||||
" jz 2f\n"
|
||||
" la %1,1(%1)\n"
|
||||
" brct %2,0b\n"
|
||||
" j 3f\n"
|
||||
"1: la %1,1(%1)\n"
|
||||
" stc 0,0(%0,%1)\n"
|
||||
"2: brct %2,1b\n"
|
||||
"3:"
|
||||
: "+&a" (__dest), "+&a" (__src), "+&d" (__n) :
|
||||
: "cc", "memory", "0" );
|
||||
return tmp;
|
||||
}
|
||||
|
||||
/* Append SRC onto DEST. */
|
||||
#define _HAVE_STRING_ARCH_strcat 1
|
||||
__STRING_INLINE char *
|
||||
strcat(char *__dest, const char *__src)
|
||||
{
|
||||
char *tmp = __dest;
|
||||
|
||||
__asm__ __volatile__ (" sr 0,0\n"
|
||||
"0: srst 0,%0\n"
|
||||
" jo 0b\n"
|
||||
" lr %0,0\n"
|
||||
" sr 0,0\n"
|
||||
"1: mvst %0,%1\n"
|
||||
" jo 1b"
|
||||
: "+&a" (__dest), "+&a" (__src) :
|
||||
: "cc", "memory", "0" );
|
||||
return tmp;
|
||||
}
|
||||
|
||||
/* Append no more than N characters from SRC onto DEST. */
|
||||
#define _HAVE_STRING_ARCH_strncat 1
|
||||
__STRING_INLINE char *
|
||||
strncat (char *__dest, __const char *__src, size_t __n)
|
||||
{
|
||||
char *tmp = __dest;
|
||||
|
||||
if (__n <= 0)
|
||||
return tmp;
|
||||
__asm__ __volatile__ (" sr 0,0\n"
|
||||
"0: srst 0,%0\n"
|
||||
" jo 0b\n"
|
||||
" lr %0,0\n"
|
||||
" slr %0,%1\n"
|
||||
"1: icm 0,1,0(%1)\n"
|
||||
" stc 0,0(%0,%1)\n"
|
||||
" jz 2f\n"
|
||||
" la %1,1(%1)\n"
|
||||
" brct %2,1b\n"
|
||||
"2:"
|
||||
: "+&a" (__dest), "+&a" (__src), "+&d" (__n) :
|
||||
: "cc", "memory", "0" );
|
||||
return tmp;
|
||||
}
|
||||
|
||||
#endif /* Use string inlines && GNU CC. */
|
46
sysdeps/s390/bsd-_setjmp.S
Normal file
46
sysdeps/s390/bsd-_setjmp.S
Normal file
@ -0,0 +1,46 @@
|
||||
/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. s390 version.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software ; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation ; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY ; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* This 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)
|
||||
#ifdef PIC
|
||||
/* We cannot use the PLT, because it requires that %r12 be set, but
|
||||
we can't save and restore our caller's value. Instead, we do an
|
||||
indirect jump through the GOT. */
|
||||
basr %r1,0
|
||||
.L0: al %r1,.L1 - .L0(0,%r1) /* get address of global offset table */
|
||||
/* get address of __sigjmp_save from got */
|
||||
l %r1,__sigjmp_save@GOT12(0,%r1)
|
||||
lhi %r3,0 /* second argument of one */
|
||||
br %r1
|
||||
.L1: .long _GLOBAL_OFFSET_TABLE_ - .L0
|
||||
#else
|
||||
basr %r1,0
|
||||
.L0: l %r1,.L1 - .L0(0,%r1) /* load address of __sigsetjmp */
|
||||
lhi %r3,0 /* second argument of zero */
|
||||
br %r1 /* branch to __sigsetjmp */
|
||||
.L1: .long __sigsetjmp
|
||||
#endif
|
||||
END (_setjmp)
|
46
sysdeps/s390/bsd-setjmp.S
Normal file
46
sysdeps/s390/bsd-setjmp.S
Normal file
@ -0,0 +1,46 @@
|
||||
/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. s390 version.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software ; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation ; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY ; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* This 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)
|
||||
#ifdef PIC
|
||||
/* We cannot use the PLT, because it requires that %r12 be set, but
|
||||
we can't save and restore our caller's value. Instead, we do an
|
||||
indirect jump through the GOT. */
|
||||
basr %r1,0
|
||||
.L0: al %r1,.L1 - .L0(0,%r1) /* get address of global offset table */
|
||||
/* get address of __sigjmp_save from got */
|
||||
l %r1,__sigjmp_save@GOT12(0,%r1)
|
||||
lhi %r3,1 /* second argument of one */
|
||||
br %r1
|
||||
.L1: .long _GLOBAL_OFFSET_TABLE_ - .L0
|
||||
#else
|
||||
basr %r1,0
|
||||
.L0: l %r1,.L1 - .L0(0,%r1) /* load address of __sigsetjmp */
|
||||
lhi %r3,1 /* second argument of zero */
|
||||
br %r1 /* branch to __sigsetjmp */
|
||||
.L1: .long __sigsetjmp
|
||||
#endif
|
||||
END (setjmp)
|
43
sysdeps/s390/bzero.S
Normal file
43
sysdeps/s390/bzero.S
Normal file
@ -0,0 +1,43 @@
|
||||
/* bzero -- set a block of memory to zero. IBM S390 version
|
||||
This file is part of the GNU C Library.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
|
||||
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. */
|
||||
|
||||
/*
|
||||
* R2 = address to memory area
|
||||
* R3 = number of bytes to fill
|
||||
*/
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
.text
|
||||
ENTRY(__bzero)
|
||||
ltr %r3,%r3
|
||||
jz .L1
|
||||
sr %r1,%r1 # set pad byte to zero
|
||||
sr %r4,%r4 # no source for MVCLE, only a pad byte
|
||||
sr %r5,%r5
|
||||
.L0: mvcle %r2,%r4,0(%r1) # thats it, MVCLE is your friend
|
||||
jo .L0
|
||||
.L1: br %r14
|
||||
END(__bzero)
|
||||
|
||||
#ifndef NO_WEAK_ALIAS
|
||||
weak_alias (__bzero, bzero)
|
||||
#endif
|
464
sysdeps/s390/dl-machine.h
Normal file
464
sysdeps/s390/dl-machine.h
Normal file
@ -0,0 +1,464 @@
|
||||
/* Machine-dependent ELF dynamic relocation inline functions. S390 Version.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Carl Pederson & Martin Schwidefsky.
|
||||
This file is part of the 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 "s390"
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <string.h>
|
||||
#include <link.h>
|
||||
|
||||
|
||||
/* Return nonzero iff E_MACHINE is compatible with the running host. */
|
||||
static inline int
|
||||
elf_machine_matches_host (Elf32_Half e_machine)
|
||||
{
|
||||
switch (e_machine)
|
||||
{
|
||||
case EM_S390:
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* 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)
|
||||
{
|
||||
register Elf32_Addr *got;
|
||||
|
||||
asm( " bras %0,2f\n"
|
||||
"1: .long _GLOBAL_OFFSET_TABLE_-1b\n"
|
||||
"2: al %0,0(%0)"
|
||||
: "=&a" (got) : : "0" );
|
||||
|
||||
return *got;
|
||||
}
|
||||
|
||||
|
||||
/* Return the run-time load address of the shared object. */
|
||||
static inline Elf32_Addr
|
||||
elf_machine_load_address (void)
|
||||
{
|
||||
Elf32_Addr addr;
|
||||
|
||||
asm( " bras 1,2f\n"
|
||||
"1: .long _GLOBAL_OFFSET_TABLE_ - 1b\n"
|
||||
" .long _dl_start - 1b - 0x80000000\n"
|
||||
"2: l %0,4(1)\n"
|
||||
" ar %0,1\n"
|
||||
" al 1,0(1)\n"
|
||||
" sl %0,_dl_start@GOT12(1)"
|
||||
: "=&d" (addr) : : "1" );
|
||||
return addr;
|
||||
}
|
||||
|
||||
/* 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)
|
||||
{
|
||||
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 .rel.plt section, push _GLOBAL_OFFSET_TABLE_[1],
|
||||
and then jump to _GLOBAL_OFFSET_TABLE[2]. */
|
||||
Elf32_Addr *got;
|
||||
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 (_dl_profile, l))
|
||||
/* This is the object we are looking for. Say that we really
|
||||
want profiling and the timers are started. */
|
||||
_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. */
|
||||
|
||||
/* s390:
|
||||
Arguments are in register.
|
||||
r2 - r7 holds the original parameters for the function call, fixup
|
||||
and trampoline code use r0-r5 and r14-15. For the correct function
|
||||
call r2-r5 and r14-15 must be restored.
|
||||
Arguments from the PLT are stored at 24(r15) and 28(r15)
|
||||
and must be moved to r2 and r3 for the fixup call (see elf32-s390.c
|
||||
in the binutils for the PLT code).
|
||||
Fixup function address in r2.
|
||||
*/
|
||||
#ifndef PROF
|
||||
#define ELF_MACHINE_RUNTIME_TRAMPOLINE \
|
||||
asm ( "\
|
||||
.text\n\
|
||||
.globl _dl_runtime_resolve\n\
|
||||
.type _dl_runtime_resolve, @function\n\
|
||||
.align 16\n\
|
||||
_dl_runtime_resolve:\n\
|
||||
# save registers\n\
|
||||
stm 2,5,32(15)\n\
|
||||
st 14,48(15)\n\
|
||||
lr 0,15\n\
|
||||
ahi 15,-96\n\
|
||||
st 0,0(15)\n\
|
||||
# load args saved by PLT\n\
|
||||
lm 2,3,120(15)\n\
|
||||
basr 1,0\n\
|
||||
0: ahi 1,1f-0b\n\
|
||||
l 14,0(1)\n\
|
||||
bas 14,0(14,1) # call fixup\n\
|
||||
lr 1,2 # function addr returned in r2\n\
|
||||
# restore registers\n\
|
||||
ahi 15,96\n\
|
||||
l 14,48(15)\n\
|
||||
lm 2,5,32(15)\n\
|
||||
br 1\n\
|
||||
1: .long fixup-1b\n\
|
||||
.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
|
||||
\n\
|
||||
.globl _dl_runtime_profile\n\
|
||||
.type _dl_runtime_profile, @function\n\
|
||||
.align 16\n\
|
||||
_dl_runtime_profile:\n\
|
||||
# save registers\n\
|
||||
stm 2,5,32(15)\n\
|
||||
st 14,48(15)\n\
|
||||
lr 0,15\n\
|
||||
ahi 15,-96\n\
|
||||
st 0,0(15)\n\
|
||||
# load args saved by PLT\n\
|
||||
lm 2,3,120(15)\n\
|
||||
# load return address as third parameter\n\
|
||||
lr 4,14\n\
|
||||
basr 1,0\n\
|
||||
0: ahi 1,1f-0b\n\
|
||||
l 14,0(1)\n\
|
||||
bas 14,0(14,1) # call fixup\n\
|
||||
lr 1,2 # function addr returned in r2\n\
|
||||
# restore registers\n\
|
||||
ahi 15,96\n\
|
||||
l 14,48(15)\n\
|
||||
lm 2,5,32(15)\n\
|
||||
br 1\n\
|
||||
1: .long profile_fixup-1b\n\
|
||||
.size _dl_runtime_profile, .-_dl_runtime_profile\n\
|
||||
");
|
||||
#else
|
||||
#define ELF_MACHINE_RUNTIME_TRAMPOLINE \
|
||||
asm ( "\
|
||||
.text\n\
|
||||
.globl _dl_runtime_resolve\n\
|
||||
.globl _dl_runtime_profile\n\
|
||||
.type _dl_runtime_resolve, @function\n\
|
||||
.type _dl_runtime_profile, @function\n\
|
||||
.align 16\n\
|
||||
_dl_runtime_resolve:\n\
|
||||
_dl_runtime_profile:\n\
|
||||
# save registers\n\
|
||||
stm 2,5,32(15)\n\
|
||||
st 14,48(15)\n\
|
||||
lr 0,15\n\
|
||||
ahi 15,-96\n\
|
||||
st 0,0(15)\n\
|
||||
# load args saved by PLT\n\
|
||||
lm 2,3,120(15)\n\
|
||||
# load return address as third parameter\n\
|
||||
lr 4,14\n\
|
||||
basr 1,0\n\
|
||||
0: ahi 1,1f-0b\n\
|
||||
l 14,0(1)\n\
|
||||
bas 14,0(14,1) # call fixup\n\
|
||||
lr 1,2 # function addr returned in r2\n\
|
||||
# restore registers\n\
|
||||
ahi 15,96\n\
|
||||
l 14,48(15)\n\
|
||||
lm 2,5,32(15)\n\
|
||||
br 1\n\
|
||||
1: .long fixup-1b\n\
|
||||
.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
|
||||
.size _dl_runtime_profile, .-_dl_runtime_profile\n\
|
||||
");
|
||||
#endif
|
||||
|
||||
/* The PLT uses Elf32_Rela relocs. */
|
||||
#define elf_machine_relplt elf_machine_rela
|
||||
|
||||
/* 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\
|
||||
.align 4\n\
|
||||
.globl _start\n\
|
||||
.globl _dl_start_user\n\
|
||||
_start:\n\
|
||||
basr %r13,0\n\
|
||||
.L0: ahi %r13,.Llit-.L0\n\
|
||||
lr %r2,%r15\n\
|
||||
# Alloc stack frame\n\
|
||||
ahi %r15,-96\n\
|
||||
# Set the back chain to zero\n\
|
||||
xc 0(4,%r15),0(%r15)\n\
|
||||
# Call _dl_start with %r2 pointing to arg on stack\n\
|
||||
l %r14,.Ladr1-.Llit(%r13)\n\
|
||||
bas %r14,0(%r14,%r13) # call _dl_start\n\
|
||||
_dl_start_user:\n\
|
||||
# Save the user entry point address in %r8.\n\
|
||||
lr %r8,%r2\n\
|
||||
# Point %r12 at the GOT.\n\
|
||||
l %r12,.Ladr0-.Llit(%r13)\n\
|
||||
ar %r12,%r13\n\
|
||||
# Store the highest stack address\n\
|
||||
l %r1,__libc_stack_end@GOT(%r12)\n\
|
||||
st %r15, 0(%r1)\n\
|
||||
# See if we were run as a command with the executable file\n\
|
||||
# name as an extra leading argument.\n\
|
||||
l %r1,_dl_skip_args@GOT12(0,%r12)\n\
|
||||
l %r1,0(%r1) # load _dl_skip_args\n\
|
||||
# Get the original argument count.\n\
|
||||
l %r0,96(%r15)\n\
|
||||
# Subtract _dl_skip_args from it.\n\
|
||||
sr %r0,%r1\n\
|
||||
# Adjust the stack pointer to skip _dl_skip_args words.\n\
|
||||
sll %r1,2\n\
|
||||
ar %r15,%r1\n\
|
||||
# Set the back chain to zero again\n\
|
||||
xc 0(4,%r15),0(%r15)\n\
|
||||
# Store back the modified argument count.\n\
|
||||
st %r0,96(%r15)\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\
|
||||
# Call the function to run the initializers.\n\
|
||||
# Load the parameters:\n\
|
||||
# (%r2, %r3, %r4, %r5) = (_dl_loaded, argc, argv, envp)\n\
|
||||
l %r2,_dl_loaded@GOT(%r12)\n\
|
||||
l %r2,0(%r2)\n\
|
||||
l %r3,96(%r15)\n\
|
||||
la %r4,100(%r15)\n\
|
||||
lr %r5,%r3\n\
|
||||
sll %r5,2\n\
|
||||
la %r5,104(%r5,%r15)\n\
|
||||
l %r1,.Ladr4-.Llit(%r13)\n\
|
||||
bas %r14,0(%r1,%r13)\n\
|
||||
# Pass our finalizer function to the user in %r14, as per ELF ABI.\n\
|
||||
l %r14,_dl_fini@GOT(%r12)\n\
|
||||
# Free stack frame\n\
|
||||
ahi %r15,96\n\
|
||||
# Jump to the user's entry point (saved in %r8).\n\
|
||||
br %r8\n\
|
||||
.Llit:\n\
|
||||
.Ladr0: .long _GLOBAL_OFFSET_TABLE_-.Llit\n\
|
||||
.Ladr1: .long _dl_start-.Llit\n\
|
||||
.Ladr4: .long _dl_init@PLT-.Llit\n\
|
||||
");
|
||||
|
||||
#ifndef RTLD_START_SPECIAL_INIT
|
||||
#define RTLD_START_SPECIAL_INIT /* nothing */
|
||||
#endif
|
||||
|
||||
/* Nonzero iff TYPE describes relocation of a PLT entry, so
|
||||
PLT entries should not be allowed to define the value. */
|
||||
#define elf_machine_pltrel_p(type) ((type) == R_390_JMP_SLOT)
|
||||
|
||||
/* Nonzero iff TYPE should not be allowed to resolve to one of
|
||||
the main executable's symbols, as for a COPY reloc. */
|
||||
#define elf_machine_lookup_noexec_p(type) ((type) == R_390_COPY)
|
||||
|
||||
/* Nonzero iff TYPE describes relocation of a PLT entry, so
|
||||
PLT entries should not be allowed to define the value. */
|
||||
#define elf_machine_lookup_noplt_p(type) ((type) == R_390_JMP_SLOT)
|
||||
|
||||
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
|
||||
#define ELF_MACHINE_JMP_SLOT R_390_JMP_SLOT
|
||||
|
||||
/* The S390 never uses Elf32_Rel relocations. */
|
||||
#define ELF_MACHINE_NO_REL 1
|
||||
|
||||
/* The S390 overlaps DT_RELA and DT_PLTREL. */
|
||||
#define ELF_MACHINE_PLTREL_OVERLAP 1
|
||||
|
||||
/* We define an initialization functions. This is called very early in
|
||||
_dl_sysdep_start. */
|
||||
#define DL_PLATFORM_INIT dl_platform_init ()
|
||||
|
||||
extern const char *_dl_platform;
|
||||
|
||||
static inline void __attribute__ ((unused))
|
||||
dl_platform_init (void)
|
||||
{
|
||||
if (_dl_platform != NULL && *_dl_platform == '\0')
|
||||
/* Avoid an empty string which would disturb us. */
|
||||
_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;
|
||||
}
|
||||
|
||||
#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,
|
||||
Elf32_Addr *const reloc_addr)
|
||||
{
|
||||
if (ELF32_R_TYPE (reloc->r_info) == R_390_RELATIVE) {
|
||||
#ifndef RTLD_BOOTSTRAP
|
||||
if (map != &_dl_rtld_map) /* Already done in rtld itself. */
|
||||
#endif
|
||||
*reloc_addr = map->l_addr + reloc->r_addend;
|
||||
}
|
||||
else if (ELF32_R_TYPE (reloc->r_info) != R_390_NONE)
|
||||
{
|
||||
const Elf32_Sym *const refsym = sym;
|
||||
Elf32_Addr value = RESOLVE (&sym, version, ELF32_R_TYPE (reloc->r_info));
|
||||
if (sym)
|
||||
value += sym->st_value;
|
||||
|
||||
switch (ELF32_R_TYPE (reloc->r_info))
|
||||
{
|
||||
case R_390_COPY:
|
||||
if (sym == NULL)
|
||||
/* This can happen in trace mode if an object could not be
|
||||
found. */
|
||||
break;
|
||||
if (__builtin_expect (sym->st_size > refsym->st_size, 0)
|
||||
|| (__builtin_expect (sym->st_size < refsym->st_size, 0)
|
||||
&& __builtin_expect (_dl_verbose, 0)))
|
||||
{
|
||||
const char *strtab;
|
||||
|
||||
strtab = (const char *) D_PTR(map,l_info[DT_STRTAB]);
|
||||
_dl_sysdep_error (_dl_argv[0] ?: "<program name unknown>",
|
||||
": Symbol `", strtab + refsym->st_name,
|
||||
"' has different size in shared object, "
|
||||
"consider re-linking\n", NULL);
|
||||
}
|
||||
memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
|
||||
refsym->st_size));
|
||||
break;
|
||||
case R_390_GLOB_DAT:
|
||||
case R_390_JMP_SLOT:
|
||||
*reloc_addr = value;
|
||||
break;
|
||||
case R_390_32:
|
||||
{
|
||||
#ifndef RTLD_BOOTSTRAP
|
||||
/* 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)
|
||||
/* Undo the relocation done here during bootstrapping.
|
||||
Now we will relocate it anew, possibly using a
|
||||
binding found in the user program or a loaded library
|
||||
rather than the dynamic linker's built-in definitions
|
||||
used while loading those libraries. */
|
||||
value -= map->l_addr + refsym->st_value;
|
||||
#endif
|
||||
*reloc_addr = value + reloc->r_addend;
|
||||
break;
|
||||
}
|
||||
|
||||
case R_390_PC32:
|
||||
*reloc_addr = value +reloc->r_addend - (Elf32_Addr) reloc_addr;
|
||||
break;
|
||||
case R_390_NONE:
|
||||
break;
|
||||
default:
|
||||
_dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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);
|
||||
/* Check for unexpected PLT reloc type. */
|
||||
if (__builtin_expect (ELF32_R_TYPE (reloc->r_info), R_390_JMP_SLOT)
|
||||
== R_390_JMP_SLOT)
|
||||
*reloc_addr += l_addr;
|
||||
else
|
||||
_dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 1);
|
||||
}
|
||||
|
||||
#endif /* RESOLVE */
|
1
sysdeps/s390/elf/bsd-_setjmp.S
Normal file
1
sysdeps/s390/elf/bsd-_setjmp.S
Normal file
@ -0,0 +1 @@
|
||||
/* We don't need any code here since the setjmp.S file contains it. */
|
1
sysdeps/s390/elf/bsd-setjmp.S
Normal file
1
sysdeps/s390/elf/bsd-setjmp.S
Normal file
@ -0,0 +1 @@
|
||||
/* We don't need any code here since the setjmp.S file contains it. */
|
58
sysdeps/s390/elf/setjmp.S
Normal file
58
sysdeps/s390/elf/setjmp.S
Normal file
@ -0,0 +1,58 @@
|
||||
/* setjmp for s390, ELF version.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
This file is part of the 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 <sysdep.h>
|
||||
#define _ASM
|
||||
#define _SETJMP_H
|
||||
#include <bits/setjmp.h>
|
||||
|
||||
/* We include the BSD entry points here as well but we make
|
||||
them weak. */
|
||||
ENTRY (setjmp)
|
||||
.weak C_SYMBOL_NAME (setjmp)
|
||||
lhi %r3,1 /* second argument of one */
|
||||
j __sigsetjmp /* branch relativ to __sigsetjmp */
|
||||
END (setjmp)
|
||||
|
||||
/* Binary compatibility entry point. */
|
||||
ENTRY(_setjmp)
|
||||
.weak C_SYMBOL_NAME (_setjmp)
|
||||
ENTRY(__setjmp)
|
||||
lhi %r3,0 /* second argument of zero */
|
||||
|
||||
ENTRY(__sigsetjmp)
|
||||
stm %r6,%r15,0(%r2) /* store registers in jmp_buf */
|
||||
#ifdef PIC
|
||||
/* We cannot use the PLT, because it requires that %r12 be set, but
|
||||
we can't save and restore our caller's value. Instead, we do an
|
||||
indirect jump through the GOT. */
|
||||
basr %r1,0
|
||||
.L0: al %r1,.L1 - .L0(0,%r1) /* get address of global offset table */
|
||||
/* get address of __sigjmp_save from got */
|
||||
l %r1,__sigjmp_save@GOT12(0,%r1)
|
||||
br %r1
|
||||
.L1: .long _GLOBAL_OFFSET_TABLE_ - .L0
|
||||
#else
|
||||
basr %r1,0
|
||||
.L0: l %r1,.L1-.L0(0,%r1) /* load address of __sigjmp_save */
|
||||
br %r1 /* tail-call __sigjmp_save */
|
||||
.L1: .long __sigjmp_save
|
||||
#endif
|
||||
END (__sigsetjmp)
|
95
sysdeps/s390/elf/start.S
Normal file
95
sysdeps/s390/elf/start.S
Normal file
@ -0,0 +1,95 @@
|
||||
/* Startup code compliant to the ELF s390 ABI.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
/*
|
||||
This is the canonical entry point, usually the first thing in the text
|
||||
segment. Most registers' values are unspecified, except for:
|
||||
|
||||
%r14 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.
|
||||
|
||||
%r15 The stack contains the arguments and environment:
|
||||
0(%r15) argc
|
||||
4(%r15) argv[0]
|
||||
...
|
||||
(4*argc)(%r15) NULL
|
||||
(4*(argc+1))(%r15) envp[0]
|
||||
...
|
||||
NULL
|
||||
*/
|
||||
|
||||
.text
|
||||
.globl _start
|
||||
_start:
|
||||
/* Setup pointer to literal pool of _start */
|
||||
basr %r13,0
|
||||
.L0: ahi %r13,.Llit-.L0
|
||||
|
||||
/* load argc and argv from stack */
|
||||
la %r4,4(%r15) # get argv
|
||||
l %r3,0(%r15) # get argc
|
||||
|
||||
/* align the stack to a double word boundary */
|
||||
lhi %r0,-8
|
||||
nr %r15,%r0
|
||||
|
||||
/* Setup a stack frame and a parameter area */
|
||||
ahi %r15,-104 # make room on stack
|
||||
xc 0(4,%r15),0(%r15) # clear back-chain
|
||||
|
||||
/* set up arguments for __libc_start_main:
|
||||
main, argc, argv, envp, _init, _fini, rtld_fini, stack_end
|
||||
Note that envp will be determined later in __libc_start_main
|
||||
*/
|
||||
stm %r14,%r15,96(%r15) # store rtld_fini/stack_end to parameter area
|
||||
la %r7,96(%r15)
|
||||
l %r6,.L2-.Llit(%r13) # load pointer to _fini
|
||||
l %r5,.L1-.Llit(%r13) # load pointer to _init
|
||||
l %r2,.L3-.Llit(%r13) # load pointer to main
|
||||
|
||||
/* ok, now branch to the libc main routine */
|
||||
l %r1,.L4-.Llit(%r13)
|
||||
basr %r14,%r1
|
||||
|
||||
/* crash if __libc_start_main returns */
|
||||
.word 0
|
||||
|
||||
.Llit:
|
||||
.L1: .long _init
|
||||
.L2: .long _fini
|
||||
.L3: .long main
|
||||
.L4: .long __libc_start_main
|
||||
|
||||
/* FIXME: FPU flags or what ?!? */
|
||||
|
||||
.section .rodata
|
||||
.globl _fp_hw
|
||||
.long 3
|
||||
.size _fp_hw, 4
|
||||
|
||||
/* 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
|
68
sysdeps/s390/ffs.c
Normal file
68
sysdeps/s390/ffs.c
Normal file
@ -0,0 +1,68 @@
|
||||
/* ffs -- find first set bit in a word, counted from least significant end.
|
||||
This file is part of the GNU C Library.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#define ffsl __something_else
|
||||
#include <string.h>
|
||||
|
||||
#undef ffs
|
||||
|
||||
/*
|
||||
* ffs: find first bit set. This is defined the same way as
|
||||
* the libc and compiler builtin ffs routines, therefore
|
||||
* differs in spirit from the above ffz (man ffs).
|
||||
*/
|
||||
|
||||
int
|
||||
__ffs (x)
|
||||
int x;
|
||||
{
|
||||
int r;
|
||||
|
||||
if (x == 0)
|
||||
return 0;
|
||||
__asm__(" lr %%r1,%1\n"
|
||||
" sr %0,%0\n"
|
||||
" tml %%r1,0xFFFF\n"
|
||||
" jnz 0f\n"
|
||||
" ahi %0,16\n"
|
||||
" srl %%r1,16\n"
|
||||
"0: tml %%r1,0x00FF\n"
|
||||
" jnz 1f\n"
|
||||
" ahi %0,8\n"
|
||||
" srl %%r1,8\n"
|
||||
"1: tml %%r1,0x000F\n"
|
||||
" jnz 2f\n"
|
||||
" ahi %0,4\n"
|
||||
" srl %%r1,4\n"
|
||||
"2: tml %%r1,0x0003\n"
|
||||
" jnz 3f\n"
|
||||
" ahi %0,2\n"
|
||||
" srl %%r1,2\n"
|
||||
"3: tml %%r1,0x0001\n"
|
||||
" jnz 4f\n"
|
||||
" ahi %0,1\n"
|
||||
"4:"
|
||||
: "=&d" (r) : "d" (x) : "cc", "1" );
|
||||
return r+1;
|
||||
}
|
||||
|
||||
weak_alias (__ffs, ffs)
|
||||
#undef ffsl
|
||||
weak_alias (__ffs, ffsl)
|
90
sysdeps/s390/fpu/bits/fenv.h
Normal file
90
sysdeps/s390/fpu/bits/fenv.h
Normal file
@ -0,0 +1,90 @@
|
||||
/* Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Denis Joseph Barrow (djbarrow@de.ibm.com).
|
||||
|
||||
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 _FENV_H
|
||||
# error "Never use <bits/fenv.h> directly; include <fenv.h> instead."
|
||||
#endif
|
||||
|
||||
/* Define bits representing the exception. We use the bit positions
|
||||
of the appropriate bits in the FPU control word. */
|
||||
enum
|
||||
{
|
||||
FE_INVALID = 0x80,
|
||||
#define FE_INVALID FE_INVALID
|
||||
FE_DIVBYZERO = 0x40,
|
||||
#define FE_DIVBYZERO FE_DIVBYZERO
|
||||
FE_OVERFLOW = 0x20,
|
||||
#define FE_OVERFLOW FE_OVERFLOW
|
||||
FE_UNDERFLOW = 0x10,
|
||||
#define FE_UNDERFLOW FE_UNDERFLOW
|
||||
FE_INEXACT = 0x08
|
||||
#define FE_INEXACT FE_INEXACT
|
||||
};
|
||||
/* We dont use the y bit of the DXC in the floating point control register
|
||||
* as glibc has no FE encoding for fe inexact incremented
|
||||
* or fe inexact truncated.
|
||||
* We currently use the flag bits in the fpc
|
||||
* as these are sticky for feholdenv & feupdatenv as it is defined
|
||||
* in the HP Manpages.
|
||||
*/
|
||||
|
||||
|
||||
#define FE_ALL_EXCEPT \
|
||||
(FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)
|
||||
|
||||
enum
|
||||
{
|
||||
FE_TONEAREST = 0,
|
||||
#define FE_TONEAREST FE_TONEAREST
|
||||
FE_DOWNWARD = 0x3,
|
||||
#define FE_DOWNWARD FE_DOWNWARD
|
||||
FE_UPWARD = 0x2,
|
||||
#define FE_UPWARD FE_UPWARD
|
||||
FE_TOWARDZERO = 0x1
|
||||
#define FE_TOWARDZERO FE_TOWARDZERO
|
||||
};
|
||||
|
||||
#define FPC_EXCEPTION_MASK_SHIFT 24
|
||||
#define FPC_FLAGS_SHIFT 16
|
||||
#define FPC_DXC_SHIFT 8
|
||||
#define FPC_NOT_FPU_EXCEPTION 0x300
|
||||
|
||||
|
||||
/* Type representing exception flags. */
|
||||
typedef unsigned int fexcept_t; /* size of fpc */
|
||||
|
||||
|
||||
/* Type representing floating-point environment. This function corresponds
|
||||
to the layout of the block written by the `fstenv'. */
|
||||
typedef struct
|
||||
{
|
||||
fexcept_t fpc;
|
||||
void *ieee_instruction_pointer;
|
||||
/* failing instruction for ieee exceptions */
|
||||
} fenv_t;
|
||||
|
||||
/* If the default argument is used we use this value. */
|
||||
#define FE_DFL_ENV ((fenv_t *) -1)
|
||||
|
||||
#ifdef __USE_GNU
|
||||
/* Floating-point environment where none of the exceptions are masked. */
|
||||
#define FE_NOMASK_ENV ((fenv_t *) -2)
|
||||
#endif
|
40
sysdeps/s390/fpu/fclrexcpt.c
Normal file
40
sysdeps/s390/fpu/fclrexcpt.c
Normal file
@ -0,0 +1,40 @@
|
||||
/* Clear given exceptions in current floating-point environment.
|
||||
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 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 <fenv.h>
|
||||
#include <fpu_control.h>
|
||||
|
||||
int
|
||||
feclearexcept (int excepts)
|
||||
{
|
||||
fexcept_t temp;
|
||||
|
||||
/* Mask out unsupported bits/exceptions. */
|
||||
excepts &= FE_ALL_EXCEPT;
|
||||
|
||||
_FPU_GETCW(temp);
|
||||
/* Clear the relevant bits. */
|
||||
temp &= ~((excepts<<FPC_DXC_SHIFT)|(excepts<<FPC_FLAGS_SHIFT));
|
||||
|
||||
/* Put the new data in effect. */
|
||||
_FPU_SETCW(temp);
|
||||
|
||||
/* Success. */
|
||||
return 0;
|
||||
}
|
35
sysdeps/s390/fpu/fegetround.c
Normal file
35
sysdeps/s390/fpu/fegetround.c
Normal file
@ -0,0 +1,35 @@
|
||||
/* Return current rounding direction.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Denis Joseph Barrow (djbarrow@de.ibm.com)
|
||||
|
||||
|
||||
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 <fenv.h>
|
||||
#include <fpu_control.h>
|
||||
|
||||
int
|
||||
fegetround (void)
|
||||
{
|
||||
fexcept_t cw;
|
||||
|
||||
_FPU_GETCW(cw);
|
||||
|
||||
return cw & FPC_RM_MASK;
|
||||
}
|
||||
|
||||
|
37
sysdeps/s390/fpu/fesetround.c
Normal file
37
sysdeps/s390/fpu/fesetround.c
Normal file
@ -0,0 +1,37 @@
|
||||
/* Set current rounding direction.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Denis Joseph Barrow (djbarrow@de.ibm.com)
|
||||
|
||||
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 <fenv.h>
|
||||
#include <fpu_control.h>
|
||||
|
||||
int
|
||||
fesetround (int round)
|
||||
{
|
||||
if ((round|FPC_RM_MASK) != FPC_RM_MASK)
|
||||
{
|
||||
/* ROUND is not a valid rounding mode. */
|
||||
return 1;
|
||||
}
|
||||
__asm__ volatile ("srnm 0(%0)"
|
||||
:
|
||||
: "a" (round));
|
||||
|
||||
return 0;
|
||||
}
|
46
sysdeps/s390/fpu/fgetexcptflg.c
Normal file
46
sysdeps/s390/fpu/fgetexcptflg.c
Normal file
@ -0,0 +1,46 @@
|
||||
/* Store current representation for exceptions.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
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.
|
||||
|
||||
Contributed by:
|
||||
Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
|
||||
*/
|
||||
|
||||
#include <fenv.h>
|
||||
#include <fpu_control.h>
|
||||
|
||||
int fegetexceptflag (fexcept_t *flagp, int excepts)
|
||||
{
|
||||
fexcept_t temp,newexcepts;
|
||||
|
||||
/* Get the current exceptions. */
|
||||
_FPU_GETCW(temp);
|
||||
newexcepts=((excepts<<FPC_DXC_SHIFT)|(excepts<<FPC_FLAGS_SHIFT));
|
||||
*flagp = temp & newexcepts;
|
||||
|
||||
/* Success. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
47
sysdeps/s390/fpu/fpu_control.h
Normal file
47
sysdeps/s390/fpu/fpu_control.h
Normal file
@ -0,0 +1,47 @@
|
||||
/* FPU control word definitions. Stub version.
|
||||
Copyright (C) 1999 Free Software Foundation, Inc.
|
||||
Contributed by
|
||||
Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com) and
|
||||
Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
This file is part of the 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 _FPU_CONTROL_H
|
||||
# define _FPU_CONTROL_H
|
||||
|
||||
# include <features.h>
|
||||
|
||||
/* These bits are reserved are not changed. */
|
||||
# define _FPU_RESERVED 0x070700FC
|
||||
|
||||
/* The fdlibm code requires no interrupts for exceptions. Don't
|
||||
change the rounding mode, it would break long double I/O! */
|
||||
#define _FPU_DEFAULT 0x00000000 /* Default value. */
|
||||
|
||||
/* Type of the control word. */
|
||||
typedef unsigned int fpu_control_t;
|
||||
|
||||
/* Macros for accessing the hardware control word. */
|
||||
#define _FPU_GETCW(cw) __asm__ volatile ("efpc %0,0" : "=d" (cw))
|
||||
#define _FPU_SETCW(cw) __asm__ volatile ("sfpc %0,0" : : "d" (cw))
|
||||
|
||||
/* Default control word set at startup. */
|
||||
extern fpu_control_t __fpu_control;
|
||||
|
||||
#endif /* _FPU_CONTROL_H */
|
||||
|
||||
|
||||
|
29
sysdeps/s390/gmp-mparam.h
Normal file
29
sysdeps/s390/gmp-mparam.h
Normal file
@ -0,0 +1,29 @@
|
||||
/* gmp-mparam.h -- Compiler/machine parameter header file.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
|
||||
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 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 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA.
|
||||
|
||||
#define 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
|
101
sysdeps/s390/ldbl2mpn.c
Normal file
101
sysdeps/s390/ldbl2mpn.c
Normal file
@ -0,0 +1,101 @@
|
||||
/* 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 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 "gmp.h"
|
||||
#include "gmp-impl.h"
|
||||
#include "longlong.h"
|
||||
#include "ieee754.h"
|
||||
#include <float.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/* Convert a `long double' in IEEE854 standard double-precision format to a
|
||||
multi-precision integer representing the significand scaled up by its
|
||||
number of bits (64 for long double) and an integral power of two
|
||||
(MPN frexpl). */
|
||||
|
||||
mp_size_t
|
||||
__mpn_extract_long_double (mp_ptr res_ptr, mp_size_t size,
|
||||
int *expt, int *is_neg,
|
||||
long double value)
|
||||
{
|
||||
union ieee854_long_double u;
|
||||
u.d = value;
|
||||
|
||||
*is_neg = u.ieee.negative;
|
||||
*expt = (int) u.ieee.exponent - IEEE854_LONG_DOUBLE_BIAS;
|
||||
|
||||
#if BITS_PER_MP_LIMB == 32
|
||||
res_ptr[0] = u.ieee.mantissa1; /* Low-order 32 bits of fraction. */
|
||||
res_ptr[1] = u.ieee.mantissa0; /* High-order 32 bits. */
|
||||
#define N 2
|
||||
#elif BITS_PER_MP_LIMB == 64
|
||||
/* Hopefully the compiler will combine the two bitfield extracts
|
||||
and this composition into just the original quadword extract. */
|
||||
res_ptr[0] = ((unsigned long int) u.ieee.mantissa0 << 32) | u.ieee.mantissa1;
|
||||
#define N 1
|
||||
#else
|
||||
#error "mp_limb size " BITS_PER_MP_LIMB "not accounted for"
|
||||
#endif
|
||||
|
||||
if (u.ieee.exponent == 0)
|
||||
{
|
||||
/* A biased exponent of zero is a special case.
|
||||
Either it is a zero or it is a denormal number. */
|
||||
if (res_ptr[0] == 0 && res_ptr[N - 1] == 0) /* Assumes N<=2. */
|
||||
/* It's zero. */
|
||||
*expt = 0;
|
||||
else
|
||||
{
|
||||
/* It is a denormal number, meaning it has no implicit leading
|
||||
one bit, and its exponent is in fact the format minimum. */
|
||||
int cnt;
|
||||
|
||||
/* One problem with Intel's 80-bit format is that the explicit
|
||||
leading one in the normalized representation has to be zero
|
||||
for denormalized number. If it is one, the number is according
|
||||
to Intel's specification an invalid number. We make the
|
||||
representation unique by explicitly clearing this bit. */
|
||||
res_ptr[N - 1] &= ~(1L << ((LDBL_MANT_DIG - 1) % BITS_PER_MP_LIMB));
|
||||
|
||||
if (res_ptr[N - 1] != 0)
|
||||
{
|
||||
count_leading_zeros (cnt, res_ptr[N - 1]);
|
||||
if (cnt != 0)
|
||||
{
|
||||
#if N == 2
|
||||
res_ptr[N - 1] = res_ptr[N - 1] << cnt
|
||||
| (res_ptr[0] >> (BITS_PER_MP_LIMB - cnt));
|
||||
res_ptr[0] <<= cnt;
|
||||
#else
|
||||
res_ptr[N - 1] <<= cnt;
|
||||
#endif
|
||||
}
|
||||
*expt = LDBL_MIN_EXP - 1 - cnt;
|
||||
}
|
||||
else
|
||||
{
|
||||
count_leading_zeros (cnt, res_ptr[0]);
|
||||
res_ptr[N - 1] = res_ptr[0] << cnt;
|
||||
res_ptr[0] = 0;
|
||||
*expt = LDBL_MIN_EXP - 1 - BITS_PER_MP_LIMB - cnt;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return N;
|
||||
}
|
36
sysdeps/s390/machine-gmon.h
Normal file
36
sysdeps/s390/machine-gmon.h
Normal file
@ -0,0 +1,36 @@
|
||||
/* s390-specific implementation of profiling support.
|
||||
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 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>
|
||||
|
||||
/* We need a special version of the `mcount' function since for S/390 it
|
||||
must not clobber any register. */
|
||||
|
||||
/* We must not pollute the global namespace. */
|
||||
#define mcount_internal __mcount_internal
|
||||
|
||||
void mcount_internal (u_long frompc, u_long selfpc);
|
||||
|
||||
#define _MCOUNT_DECL(frompc, selfpc) \
|
||||
void mcount_internal (u_long frompc, u_long selfpc)
|
||||
|
||||
|
||||
/* Define MCOUNT as empty since we have the implementation in another
|
||||
file. */
|
||||
#define MCOUNT
|
40
sysdeps/s390/memchr.S
Normal file
40
sysdeps/s390/memchr.S
Normal file
@ -0,0 +1,40 @@
|
||||
/* Search a character in a block of memory. For IBM S390
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
|
||||
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. */
|
||||
|
||||
/*
|
||||
* R2 = address to memory area
|
||||
* R3 = character to find
|
||||
* R4 = number of bytes to search
|
||||
*/
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
.text
|
||||
ENTRY(memchr)
|
||||
lhi %r0,0xff
|
||||
nr %r0,%r3
|
||||
lr %r1,%r2
|
||||
la %r2,0(%r4,%r1)
|
||||
0: srst %r2,%r1
|
||||
jo 0b
|
||||
brc 13,1f
|
||||
slr %r2,%r2
|
||||
1: br %r14
|
||||
END(memchr)
|
41
sysdeps/s390/memcpy.S
Normal file
41
sysdeps/s390/memcpy.S
Normal file
@ -0,0 +1,41 @@
|
||||
/* Set a block of memory to some byte value. For IBM S390
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
|
||||
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. */
|
||||
|
||||
/*
|
||||
* R2 = address to destination memory area
|
||||
* R3 = address to source memory area
|
||||
* R4 = number of bytes to copy
|
||||
*/
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
.text
|
||||
ENTRY(memcpy)
|
||||
ltr %r5,%r4
|
||||
jz .L1
|
||||
lr %r4,%r3 # %r4/%r5 = source ptr/len
|
||||
lr %r3,%r5 # %r2/%r3 = dest ptr/len
|
||||
lr %r0,%r2 # save source address
|
||||
.L0: mvcle %r2,%r4,0 # thats it, MVCLE is your friend
|
||||
jo .L0
|
||||
lr %r2,%r0 # return value is source address
|
||||
.L1:
|
||||
br %r14
|
||||
END(memset)
|
43
sysdeps/s390/memset.S
Normal file
43
sysdeps/s390/memset.S
Normal file
@ -0,0 +1,43 @@
|
||||
/* Set a block of memory to some byte value. For IBM S390
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
|
||||
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. */
|
||||
|
||||
/*
|
||||
* R2 = address to memory area
|
||||
* R3 = byte to fill memory with
|
||||
* R4 = number of bytes to fill
|
||||
*/
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
.text
|
||||
ENTRY(memset)
|
||||
ltr %r4,%r4
|
||||
jz .L1
|
||||
lr %r0,%r2 # save source address
|
||||
lr %r1,%r3 # move pad byte to R1
|
||||
lr %r3,%r4
|
||||
sr %r4,%r4 # no source for MVCLE, only a pad byte
|
||||
sr %r5,%r5
|
||||
.L0: mvcle %r2,%r4,0(%r1) # thats it, MVCLE is your friend
|
||||
jo .L0
|
||||
lr %r2,%r0 # return value is source address
|
||||
.L1:
|
||||
br %r14
|
||||
END(memset)
|
21
sysdeps/s390/memusage.h
Normal file
21
sysdeps/s390/memusage.h
Normal file
@ -0,0 +1,21 @@
|
||||
/* 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 Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#define GETSP() ({ register uintptr_t stack_ptr asm ("15"); stack_ptr; })
|
||||
|
||||
#include <sysdeps/generic/memusage.h>
|
55
sysdeps/s390/mul_1.S
Normal file
55
sysdeps/s390/mul_1.S
Normal file
@ -0,0 +1,55 @@
|
||||
/* i80386 __mpn_mul_1 -- Multiply a limb vector with a limb and store
|
||||
the result in a second limb vector.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
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 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 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 Library General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library 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
|
||||
*/
|
||||
|
||||
#include <sysdep.h>
|
||||
#include "asm-syntax.h"
|
||||
|
||||
.text
|
||||
ENTRY(__mpn_mul_1)
|
||||
st %r6,24(%r15)
|
||||
slr %r6,%r6 # cy_limb = 0
|
||||
.L0: icm %r1,15,0(%r3) # get s1_ptr[i]
|
||||
mr %r0,%r5 # umul_ppmm(prod_high,prod_low,s1_ptr[j],s2_limb)
|
||||
jnm .L1
|
||||
alr %r0,%r5
|
||||
.L1: ltr %r5,%r5
|
||||
jnm .L2
|
||||
al %r0,0(%r3)
|
||||
.L2: alr %r1,%r6 # prod_low += cy_limb
|
||||
lr %r6,%r0 # cy_limb = prod_high
|
||||
brc 12,.L3
|
||||
ahi %r6,1 # + (prod_low < cy_limb)
|
||||
.L3: st %r1,0(%r2)
|
||||
la %r2,4(0,%r2)
|
||||
la %r3,4(0,%r3)
|
||||
brct %r4,.L0
|
||||
lr %r2,%r6 # return cy_limb
|
||||
l %r6,24(%r15)
|
||||
.Lexit: br %r14
|
||||
END(__mpn_mul_1)
|
84
sysdeps/s390/s390-mcount.S
Normal file
84
sysdeps/s390/s390-mcount.S
Normal file
@ -0,0 +1,84 @@
|
||||
/* S/390-specific implemetation of profiling support.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com)
|
||||
|
||||
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>
|
||||
|
||||
/*
|
||||
* How profiling works on S/390:
|
||||
* On the start of each function _mcount is called with the address of a
|
||||
* data word in %r1 (initialized to 0, used for counting). The compiler
|
||||
* with the option -p generates code of the form:
|
||||
*
|
||||
* STM 6,15,24(15)
|
||||
* BRAS 13,.LTN0_0
|
||||
* .LT0_0:
|
||||
* .LC12: .long _mcount
|
||||
* .LC13: .long .LP0
|
||||
* .data
|
||||
* .align 4
|
||||
* .LP0: .long 0
|
||||
* .text
|
||||
* # function profiler
|
||||
* st 14,4(15)
|
||||
* l 14,.LC12-.LT0_0(13)
|
||||
* l 1,.LC13-.LT0_0(13)
|
||||
* basr 14,14
|
||||
* l 14,4(15)
|
||||
*
|
||||
* The _mcount implementation now has to call __mcount_internal with the
|
||||
* address of .LP0 as first parameter and the return address as second
|
||||
* parameter. &.LP0 was loaded to %r1 and the return address is in %r14.
|
||||
* _mcount may not modify any register.
|
||||
*/
|
||||
|
||||
ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(_mcount)
|
||||
ASM_TYPE_DIRECTIVE(C_SYMBOL_NAME(_mcount), @function)
|
||||
.align ALIGNARG(4)
|
||||
C_LABEL(_mcount)
|
||||
/* Save the caller-clobbered registers. */
|
||||
ahi %r15,-128
|
||||
stm %r14,%r5,96(%r15)
|
||||
l %r2,132(%r15) # callers address = first parameter
|
||||
la %r2,0(%r2) # clear bit 0
|
||||
la %r3,0(%r14) # callees address = second parameter
|
||||
|
||||
#ifdef PIC
|
||||
bras %r14,0f
|
||||
.long _GLOBAL_OFFSET_TABLE_-.
|
||||
0: al %r14,0(%r14)
|
||||
l %r14,__mcount_internal@GOT(%r14)
|
||||
#else
|
||||
bras %r14,0f
|
||||
.long __mcount_internal
|
||||
0: l %r14,0(%r14)
|
||||
#endif
|
||||
basr %r14,%r14
|
||||
|
||||
/*
|
||||
* Pop the saved registers. Please note that `mcount' has no
|
||||
* return value.
|
||||
*/
|
||||
lm %r14,%r5,96(%r15)
|
||||
ahi %r15,128
|
||||
br %r14
|
||||
ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(_mcount))
|
||||
|
||||
#undef mcount
|
||||
weak_alias(_mcount, mcount)
|
55
sysdeps/s390/setjmp.S
Normal file
55
sysdeps/s390/setjmp.S
Normal file
@ -0,0 +1,55 @@
|
||||
/*
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
This file is part of the 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 _ASM
|
||||
#define _ASM
|
||||
#endif
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <bits/setjmp.h>
|
||||
|
||||
/* Save the current program position in ENV and return 0. */
|
||||
/* R2 = pointer to jmp_buf, R3 = savemask */
|
||||
|
||||
/* Binary compatibility entry point. */
|
||||
|
||||
ENTRY(__setjmp)
|
||||
sr %r3,%r3 /* set savemask to zero */
|
||||
END (__setjmp)
|
||||
|
||||
ENTRY(__sigsetjmp)
|
||||
stm %r6,%r15,0(%r2) /* store registers in jmp_buf */
|
||||
#ifdef PIC
|
||||
/* We cannot use the PLT, because it requires that %r12 be set, but
|
||||
we can't save and restore our caller's value. Instead, we do an
|
||||
indirect jump through the GOT. */
|
||||
basr %r1,0
|
||||
.L0: al %r1,.L1 - .L0(0,%r1) /* get address of global offset table */
|
||||
/* get address of __sigjmp_save from got */
|
||||
l %r1,__sigjmp_save@GOT12(0,%r1)
|
||||
br %r1
|
||||
.L1: .long _GLOBAL_OFFSET_TABLE_ - .L0
|
||||
#else
|
||||
basr %r1,0
|
||||
.L0: l %r1,.L1-.L0(0,%r1) /* load address of __sigjmp_save */
|
||||
br %r1 /* tail-call __sigjmp_save */
|
||||
.L1: .long __sigjmp_save
|
||||
#endif
|
||||
END (__sigsetjmp)
|
28
sysdeps/s390/stackinfo.h
Normal file
28
sysdeps/s390/stackinfo.h
Normal file
@ -0,0 +1,28 @@
|
||||
/* 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 Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* This file contains a bit of information about the stack allocation
|
||||
of the processor. */
|
||||
|
||||
#ifndef _STACKINFO_H
|
||||
#define _STACKINFO_H 1
|
||||
|
||||
/* On s390 the stack grows down. */
|
||||
#define _STACK_GROWS_DOWN 1
|
||||
|
||||
#endif /* stackinfo.h */
|
36
sysdeps/s390/strcpy.S
Normal file
36
sysdeps/s390/strcpy.S
Normal file
@ -0,0 +1,36 @@
|
||||
/* strcpy - copy a string from source to destination. For IBM S390
|
||||
This file is part of the GNU C Library.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
|
||||
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. */
|
||||
|
||||
/*
|
||||
* R2 = address of destination
|
||||
* R3 = address of source
|
||||
*/
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
.text
|
||||
ENTRY(strcpy)
|
||||
slr %r0,%r0
|
||||
lr %r1,%r2
|
||||
0: mvst %r1,%r3
|
||||
jo 0b
|
||||
br %r14
|
||||
END(strcpy)
|
79
sysdeps/s390/strncpy.S
Normal file
79
sysdeps/s390/strncpy.S
Normal file
@ -0,0 +1,79 @@
|
||||
/* strncpy - copy at most n characters from a string from source to
|
||||
destination. For IBM S390
|
||||
This file is part of the GNU C Library.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
|
||||
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. */
|
||||
|
||||
/*
|
||||
* R2 = address of destination (dst)
|
||||
* R3 = address of source (src)
|
||||
* R4 = max of bytes to copy
|
||||
*/
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
ENTRY(strncpy)
|
||||
.text
|
||||
st %r2,24(%r15) # save dst pointer
|
||||
slr %r2,%r3 # %r3 points to src, %r2+%r3 to dst
|
||||
lhi %r1,3
|
||||
nr %r1,%r4 # last 2 bits of # bytes
|
||||
srl %r4,2
|
||||
ltr %r4,%r4 # less than 4 bytes to copy ?
|
||||
jz .L1
|
||||
bras %r5,.L0 # enter loop & load address of a 0
|
||||
.long 0
|
||||
.L0: icm %r0,8,0(%r3) # first byte
|
||||
jz .L3
|
||||
icm %r0,4,1(%r3) # second byte
|
||||
jz .L4
|
||||
icm %r0,2,2(%r3) # third byte
|
||||
jz .L5
|
||||
icm %r0,1,3(%r3) # fourth byte
|
||||
jz .L6
|
||||
st %r0,0(%r2,%r3) # store all four to dest.
|
||||
la %r3,4(%r3)
|
||||
brct %r4,.L0
|
||||
.L1: ltr %r1,%r1
|
||||
jz .Lexit
|
||||
.L2: icm %r0,1,0(%r3)
|
||||
stc %r0,0(%r2,%r3)
|
||||
la %r3,1(%r3)
|
||||
jz .L7
|
||||
brct %r1,.L2
|
||||
j .Lexit
|
||||
.L3: icm %r0,4,0(%r5)
|
||||
.L4: icm %r0,2,0(%r5)
|
||||
.L5: icm %r0,1,0(%r5)
|
||||
.L6: st %r0,0(%r2,%r3)
|
||||
la %r3,4(%r3)
|
||||
ahi %r4,-1
|
||||
j .L8
|
||||
.L7: ahi %r1,-1
|
||||
.L8: sll %r4,2
|
||||
alr %r4,%r1
|
||||
alr %r2,%r3 # start of dst area to be zeroed
|
||||
lr %r3,%r4
|
||||
slr %r4,%r4
|
||||
slr %r5,%r5
|
||||
.L9: mvcle %r2,%r4,0 # pad dst with zeroes
|
||||
jo .L9
|
||||
.Lexit: l %r2,24(%r15) # return dst pointer
|
||||
br %r14
|
||||
END(strncpy)
|
62
sysdeps/s390/sub_n.S
Normal file
62
sysdeps/s390/sub_n.S
Normal file
@ -0,0 +1,62 @@
|
||||
/* i80386 __mpn_sub_n -- Add two limb vectors of the same length > 0 and store
|
||||
sum in a third limb vector.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
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 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 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 Library General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library 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
|
||||
*/
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
ENTRY(__mpn_sub_n)
|
||||
st %r6,24(%r15) # save register 6
|
||||
sr %r1,%r1
|
||||
lhi %r0,1 # cannot use ahi to add carry, use slr
|
||||
.L0: l %r6,0(%r1,%r3) # .L0 -> no carry from last sub
|
||||
sl %r6,0(%r1,%r4)
|
||||
st %r6,0(%r1,%r2)
|
||||
la %r1,4(0,%r1)
|
||||
brc 4,.L3
|
||||
.L1: brct %r5,.L0
|
||||
slr %r2,%r2 # no last carry to return
|
||||
j .Lexit
|
||||
.L2: l %r6,0(%r1,%r3) # .L2 -> carry from last sub
|
||||
sl %r6,0(%r1,%r4)
|
||||
brc 4,.L4
|
||||
slr %r6,%r0 # no carry yet, add carry from last sub
|
||||
st %r6,0(%r1,%r2)
|
||||
la %r1,4(0,%r1)
|
||||
brc 11,.L1 # new carry ?
|
||||
.L3: brct %r5,.L2
|
||||
lr %r2,%r0 # return last carry
|
||||
j .Lexit
|
||||
.L4: slr %r6,%r0 # already a carry, add carry from last sub
|
||||
st %r6,0(%r1,%r2)
|
||||
la %r1,4(0,%r1)
|
||||
brct %r5,.L2
|
||||
lr %r2,%r0 # return last carry
|
||||
.Lexit: l %r6,24(%r15) # restore register 6
|
||||
br %r14
|
||||
END(__mpn_sub_n)
|
95
sysdeps/s390/sys/ucontext.h
Normal file
95
sysdeps/s390/sys/ucontext.h
Normal file
@ -0,0 +1,95 @@
|
||||
/* Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
This file is part of the 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. */
|
||||
|
||||
/* System V/s390 ABI compliant 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 16
|
||||
|
||||
/* Number of each register is the `greg_t gregs[NREG]' array. */
|
||||
enum
|
||||
{
|
||||
R_GPR0 = 0,
|
||||
#define R_GPR0 R_GPR0
|
||||
R_GPR1 = 1,
|
||||
#define R_GPR1 R_GPR1
|
||||
R_GPR2 = 2,
|
||||
#define R_GPR2 R_GPR2
|
||||
R_GPR3 = 3,
|
||||
#define R_GPR3 R_GPR3
|
||||
R_GPR4 = 4,
|
||||
#define R_GPR4 R_GPR4
|
||||
R_GPR5 = 5,
|
||||
#define R_GPR5 R_GPR5
|
||||
R_GPR6 = 6,
|
||||
#define R_GPR6 R_GPR6
|
||||
R_GPR7 = 7,
|
||||
#define R_GPR7 R_GPR7
|
||||
R_GPR8 = 8,
|
||||
#define R_GPR8 R_GPR8
|
||||
R_GPR9 = 9,
|
||||
#define R_GPR9 R_GPR9
|
||||
R_GPRA = 10,
|
||||
#define R_GPRA R_GPRA
|
||||
R_GPRB = 11,
|
||||
#define R_GPRB R_GPRB
|
||||
R_GPRC = 12,
|
||||
#define R_GPRC R_GPRC
|
||||
R_GPRD = 13,
|
||||
#define R_GPRD R_GPRD
|
||||
R_GPRE = 14,
|
||||
#define R_GPRE R_GPRE
|
||||
R_GPRF = 15
|
||||
#define R_GPRF R_GPRF
|
||||
};
|
||||
|
||||
/* Structure to describe FPU registers. */
|
||||
typedef long long fpreg_t;
|
||||
|
||||
/* Context to describe whole processor state. */
|
||||
typedef struct
|
||||
{
|
||||
int version;
|
||||
greg_t gregs[NGREG];
|
||||
fpreg_t fpregs[16];
|
||||
} mcontext_t;
|
||||
|
||||
#define MCONTEXT_VERSION 1
|
||||
|
||||
/* Userlevel context. */
|
||||
typedef struct ucontext
|
||||
{
|
||||
unsigned long int uc_flags;
|
||||
struct ucontext *uc_links;
|
||||
__sigset_t uc_sigmask;
|
||||
stack_t uc_stack;
|
||||
mcontext_t uc_mcontext;
|
||||
long int uc_filler[170];
|
||||
} ucontext_t;
|
||||
|
||||
#endif /* sys/ucontext.h */
|
121
sysdeps/s390/sysdep.h
Normal file
121
sysdeps/s390/sysdep.h
Normal file
@ -0,0 +1,121 @@
|
||||
/* Assembler macros for s390.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
This file is part of the 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 <sysdeps/generic/sysdep.h>
|
||||
|
||||
#ifdef __ASSEMBLER__
|
||||
|
||||
/* Syntactic details of assembler. */
|
||||
|
||||
#ifdef HAVE_ELF
|
||||
|
||||
/* ELF uses byte-counts for .align, most others use log2 of count of bytes. */
|
||||
#define ALIGNARG(log2) 1<<log2
|
||||
/* 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 ALIGNARG(log2) log2
|
||||
#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) \
|
||||
.align ALIGNARG(2); \
|
||||
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
|
||||
#ifdef PIC
|
||||
#define CALL_MCOUNT \
|
||||
lr 0,14 ; bras 14,.+12 ; .long _GLOBAL_OFFSET_TABLE_ - . ; .long 0f-. ; \
|
||||
lr 1,14 ; al 1,4(14) ; al 14,0(14) ; l 14,_mcount@GOT(14) ; \
|
||||
basr 14,14 ; lr 14,0 ; .data ; .align 4 ; 0: .long 0 ; .text ;
|
||||
#else
|
||||
#define CALL_MCOUNT \
|
||||
lr 0,14 ; bras 14,.+12 ; .long _mcount ; .long 0f ; \
|
||||
l 1,4(14) ; l 14,0(14) ; basr 14,14 ; lr 14,0 ; \
|
||||
.data ; .align 4 ; 0: .long 0 ; .text ;
|
||||
#endif
|
||||
#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
|
||||
|
||||
#define PSEUDO(name, syscall_name, args) \
|
||||
lose: SYSCALL_PIC_SETUP \
|
||||
JUMPTARGET(syscall_error) \
|
||||
.globl syscall_error; \
|
||||
ENTRY (name) \
|
||||
DO_CALL (syscall_name, args); \
|
||||
jm lose
|
||||
|
||||
#undef PSEUDO_END
|
||||
#define PSEUDO_END(name) \
|
||||
END (name)
|
||||
|
||||
#ifdef PIC
|
||||
#define JUMPTARGET(name) \
|
||||
basr %r1,0 \
|
||||
0: al %r1,1f-0b(0,%r1) \
|
||||
br %r1 \
|
||||
1: .long name##@PLT - 0b
|
||||
#define SYSCALL_PIC_SETUP \
|
||||
bras %r12,1f \
|
||||
0: .long _GLOBAL_OFFSET_TABLE_-0b \
|
||||
1: al %r12,0(%r12)
|
||||
#else
|
||||
#define JUMPTARGET(name) \
|
||||
basr %r1,0 \
|
||||
0: al %r1,1f-0b(0,%r1) \
|
||||
br %r1 \
|
||||
1: .long name - 0b
|
||||
#define SYSCALL_PIC_SETUP /* Nothing. */
|
||||
#endif
|
||||
|
||||
/* Local label name for asm code. */
|
||||
#ifndef L
|
||||
#define L(name) name
|
||||
#endif
|
||||
|
||||
#endif /* __ASSEMBLER__ */
|
9
sysdeps/unix/sysv/linux/s390/Dist
Normal file
9
sysdeps/unix/sysv/linux/s390/Dist
Normal file
@ -0,0 +1,9 @@
|
||||
clone.S
|
||||
setresuid.c
|
||||
setresgid.c
|
||||
setfsuid.c
|
||||
setfsgid.c
|
||||
sys/elf.h
|
||||
sys/perm.h
|
||||
sys/procfs.h
|
||||
sys/user.h
|
4
sysdeps/unix/sysv/linux/s390/Makefile
Normal file
4
sysdeps/unix/sysv/linux/s390/Makefile
Normal file
@ -0,0 +1,4 @@
|
||||
ifeq ($(subdir),misc)
|
||||
sysdep_routines += setfsgid setfsuid setresgid setresuid
|
||||
sysdep_headers += sys/elf.h sys/reg.h
|
||||
endif
|
151
sysdeps/unix/sysv/linux/s390/bits/fcntl.h
Normal file
151
sysdeps/unix/sysv/linux/s390/bits/fcntl.h
Normal file
@ -0,0 +1,151 @@
|
||||
/* O_*, F_*, FD_* bit values for Linux.
|
||||
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 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. */
|
||||
#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). */
|
||||
|
||||
/* XXX missing */
|
||||
#define F_GETLK64 5 /* Get record locking info. */
|
||||
#define F_SETLK64 6 /* Set record locking info (non-blocking). */
|
||||
#define F_SETLKW64 7 /* Set record locking info (blocking). */
|
||||
|
||||
#if defined __USE_BSD || defined __USE_XOPEN2K
|
||||
# define F_SETOWN 8 /* Get owner of socket (receiver of SIGIO). */
|
||||
# define F_GETOWN 9 /* Set owner of socket (receiver of SIGIO). */
|
||||
#endif
|
||||
|
||||
#ifdef __USE_GNU
|
||||
# define F_SETSIG 10 /* Set number of signal to be sent. */
|
||||
# define F_GETSIG 11 /* Get number of signal to be sent. */
|
||||
#endif
|
||||
|
||||
/* For F_[GET|SET]FL. */
|
||||
#define FD_CLOEXEC 1 /* actually anything with low bit set goes */
|
||||
|
||||
/* For posix fcntl() and `l_type' field of a `struct flock' for lockf(). */
|
||||
#define F_RDLCK 0 /* Read lock. */
|
||||
#define F_WRLCK 1 /* Write lock. */
|
||||
#define F_UNLCK 2 /* Remove lock. */
|
||||
|
||||
/* for old implementation of bsd flock () */
|
||||
#define F_EXLCK 4 /* or 3 */
|
||||
#define F_SHLCK 8 /* or 4 */
|
||||
|
||||
#ifdef __USE_BSD
|
||||
/* operations for bsd flock(), also used by the kernel implementation */
|
||||
# define LOCK_SH 1 /* shared lock */
|
||||
# define LOCK_EX 2 /* exclusive lock */
|
||||
# define LOCK_NB 4 /* or'd with one of the above to prevent
|
||||
blocking */
|
||||
# define LOCK_UN 8 /* remove lock */
|
||||
#endif
|
||||
|
||||
struct flock
|
||||
{
|
||||
short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */
|
||||
short int l_whence; /* Where `l_start' is relative to (like `lseek'). */
|
||||
#ifndef __USE_FILE_OFFSET64
|
||||
__off_t l_start; /* Offset where the lock begins. */
|
||||
__off_t l_len; /* Size of the locked area; zero means until EOF. */
|
||||
#else
|
||||
__off64_t l_start; /* Offset where the lock begins. */
|
||||
__off64_t l_len; /* Size of the locked area; zero means until EOF. */
|
||||
#endif
|
||||
__pid_t l_pid; /* Process holding the lock. */
|
||||
};
|
||||
|
||||
#ifdef __USE_LARGEFILE64
|
||||
struct flock64
|
||||
{
|
||||
short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */
|
||||
short int l_whence; /* Where `l_start' is relative to (like `lseek'). */
|
||||
__off64_t l_start; /* Offset where the lock begins. */
|
||||
__off64_t l_len; /* Size of the locked area; zero means until EOF. */
|
||||
__pid_t l_pid; /* Process holding the lock. */
|
||||
};
|
||||
#endif
|
||||
|
||||
/* Define some more compatibility macros to be backward compatible with
|
||||
BSD systems which did not managed to hide these kernel macros. */
|
||||
#ifdef __USE_BSD
|
||||
# define FAPPEND O_APPEND
|
||||
# define FFSYNC O_FSYNC
|
||||
# define FASYNC O_ASYNC
|
||||
# define FNONBLOCK O_NONBLOCK
|
||||
# define FNDELAY O_NDELAY
|
||||
#endif /* Use BSD. */
|
||||
|
||||
/* Advise to `posix_fadvise'. */
|
||||
#ifdef __USE_XOPEN2K
|
||||
# define POSIX_FADV_NORMAL 0 /* No further special treatment. */
|
||||
# define POSIX_FADV_RANDOM 1 /* Expect random page references. */
|
||||
# define POSIX_FADV_SEQUENTIAL 2 /* Expect sequential page references. */
|
||||
# define POSIX_FADV_WILLNEED 3 /* Will need these pages. */
|
||||
# define POSIX_FADV_DONTNEED 4 /* Don't need these pages. */
|
||||
# define POSIX_FADV_NOREUSE 5 /* Data will be accessed once. */
|
||||
#endif
|
93
sysdeps/unix/sysv/linux/s390/bits/mman.h
Normal file
93
sysdeps/unix/sysv/linux/s390/bits/mman.h
Normal file
@ -0,0 +1,93 @@
|
||||
/* Definitions for POSIX memory map interface. Linux/s390 version.
|
||||
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 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. */
|
||||
|
||||
/* 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
|
205
sysdeps/unix/sysv/linux/s390/bits/resource.h
Normal file
205
sysdeps/unix/sysv/linux/s390/bits/resource.h
Normal file
@ -0,0 +1,205 @@
|
||||
/* Bit values & structures for resource limits. Linux version.
|
||||
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 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_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
|
||||
|
||||
/* 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
|
||||
|
||||
/* Address space limit. */
|
||||
RLIMIT_AS = 9,
|
||||
#define RLIMIT_AS RLIMIT_AS
|
||||
|
||||
/* Number of processes. */
|
||||
RLIMIT_NPROC = 6,
|
||||
#define RLIMIT_NPROC RLIMIT_NPROC
|
||||
|
||||
/* Locked-in-memory address space. */
|
||||
RLIMIT_MEMLOCK = 8,
|
||||
#define RLIMIT_MEMLOCK RLIMIT_MEMLOCK
|
||||
|
||||
RLIMIT_NLIMITS = 10,
|
||||
RLIM_NLIMITS = RLIMIT_NLIMITS
|
||||
#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 ((unsigned long int) (~0UL))
|
||||
#else
|
||||
# define RLIM_INFINITY 0xffffffffffffffffuLL
|
||||
#endif
|
||||
|
||||
#ifdef __USE_LARGEFILE64
|
||||
# define RLIM64_INFINITY 0xffffffffffffffffuLL
|
||||
#endif
|
||||
|
||||
/* We can represent all limits. */
|
||||
#define RLIM_SAVED_MAX RLIM_INFINITY
|
||||
#define RLIM_SAVED_CUR RLIM_INFINITY
|
||||
|
||||
|
||||
/* 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
|
||||
|
||||
/* Both. */
|
||||
RUSAGE_BOTH = -2
|
||||
#define RUSAGE_BOTH RUSAGE_BOTH
|
||||
};
|
||||
|
||||
#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
|
||||
};
|
79
sysdeps/unix/sysv/linux/s390/bits/time.h
Normal file
79
sysdeps/unix/sysv/linux/s390/bits/time.h
Normal file
@ -0,0 +1,79 @@
|
||||
/* System-dependent timing definitions. Linux version.
|
||||
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 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. */
|
||||
|
||||
/*
|
||||
* Never include this file directly; use <time.h> instead.
|
||||
*/
|
||||
|
||||
#ifndef __need_timeval
|
||||
# ifndef _BITS_TIME_H
|
||||
# define _BITS_TIME_H 1
|
||||
|
||||
/* ISO/IEC 9899:1990 7.12.1: <time.h>
|
||||
The macro `CLOCKS_PER_SEC' is the number per second of the value
|
||||
returned by the `clock' function. */
|
||||
/* CAE XSH, Issue 4, Version 2: <time.h>
|
||||
The value of CLOCKS_PER_SEC is required to be 1 million on all
|
||||
XSI-conformant systems. */
|
||||
# define CLOCKS_PER_SEC 1000000
|
||||
|
||||
# ifndef __STRICT_ANSI__
|
||||
/* Even though CLOCKS_PER_SEC has such a strange value CLK_TCK
|
||||
presents the real value for clock ticks per second for the system. */
|
||||
# define CLK_TCK 100
|
||||
# endif
|
||||
|
||||
/* Clock ID used in clock and timer functions. */
|
||||
typedef int __clockid_t;
|
||||
|
||||
/* Timer ID returned by `timer_create'. */
|
||||
typedef int __timer_t;
|
||||
|
||||
# ifdef __USE_POSIX199309
|
||||
/* Identifier for system-wide realtime clock. */
|
||||
# define CLOCK_REALTIME 0
|
||||
/* Monotonic clock. */
|
||||
# define CLOCK_MONOTONIC 1
|
||||
/* High-resolution timer from the CPU. */
|
||||
# define CLOCK_PROCESS_CPUTIME_ID 2
|
||||
/* Thread-specific CPU-time clock. */
|
||||
# define CLOCK_THREAD_CPUTIME_ID 3
|
||||
|
||||
/* Flag to indicate time is absolute. */
|
||||
# define TIMER_ABSTIME 1
|
||||
# endif
|
||||
|
||||
# endif /* bits/time.h */
|
||||
#endif
|
||||
|
||||
#ifdef __need_timeval
|
||||
# undef __need_timeval
|
||||
# ifndef _STRUCT_TIMEVAL
|
||||
# define _STRUCT_TIMEVAL 1
|
||||
# include <bits/types.h>
|
||||
|
||||
/* A time value that is accurate to the nearest
|
||||
microsecond but also has a range of years. */
|
||||
struct timeval
|
||||
{
|
||||
__time_t tv_sec; /* Seconds. */
|
||||
__suseconds_t tv_usec; /* Microseconds. */
|
||||
};
|
||||
# endif /* struct timeval */
|
||||
#endif /* need timeval */
|
57
sysdeps/unix/sysv/linux/s390/brk.c
Normal file
57
sysdeps/unix/sysv/linux/s390/brk.c
Normal file
@ -0,0 +1,57 @@
|
||||
/*
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
This file is part of the 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 <unistd.h>
|
||||
#include <sysdep.h>
|
||||
|
||||
void *__curbrk = 0;
|
||||
|
||||
/* Old braindamage in GCC's crtstuff.c requires this symbol in an attempt
|
||||
to work around different old braindamage in the old Linux/x86 ELF
|
||||
dynamic linker. Sigh. */
|
||||
weak_alias (__curbrk, ___brk_addr)
|
||||
|
||||
int
|
||||
__brk (void *addr)
|
||||
{
|
||||
void *newbrk;
|
||||
|
||||
{
|
||||
register long r0 asm ("2");
|
||||
register void *__addr asm("2") = addr;
|
||||
|
||||
asm ("svc %b1\n\t" /* call sys_brk */
|
||||
: "=d" (r0)
|
||||
: "I" (SYS_ify(brk)), "r" (__addr)
|
||||
: _svc_clobber );
|
||||
newbrk = (void *) r0;
|
||||
}
|
||||
__curbrk = newbrk;
|
||||
|
||||
if (newbrk < addr)
|
||||
{
|
||||
__set_errno (ENOMEM);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
weak_alias (__brk, brk)
|
66
sysdeps/unix/sysv/linux/s390/clone.S
Normal file
66
sysdeps/unix/sysv/linux/s390/clone.S
Normal file
@ -0,0 +1,66 @@
|
||||
/* Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
|
||||
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>
|
||||
|
||||
/*int __clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg);*/
|
||||
/* sys_clone(void *child_stack, unsigned long flags) */
|
||||
|
||||
.text
|
||||
ENTRY(__clone)
|
||||
/* Sanity check arguments & move registers */
|
||||
ltr %r1,%r2 /* no NULL function pointers */
|
||||
lhi %r2,-EINVAL
|
||||
jz SYSCALL_ERROR_LABEL
|
||||
ltr %r3,%r3 /* no NULL stack pointers */
|
||||
jz SYSCALL_ERROR_LABEL
|
||||
/* move child_stack and flags, then call SVC */
|
||||
lr %r2,%r3
|
||||
lr %r3,%r4
|
||||
svc SYS_ify(clone)
|
||||
ltr %r2,%r2 /* check return code */
|
||||
jm SYSCALL_ERROR_LABEL
|
||||
jz thread_start
|
||||
br %r14
|
||||
|
||||
thread_start:
|
||||
/* fn is in gpr 1, arg in gpr 5 */
|
||||
lr %r2,%r5 /* set first parameter to void *arg */
|
||||
sr %r11,%r11 /* terminate the stack frame */
|
||||
ahi %r15,-96 /* make room on the stack for the save area */
|
||||
basr %r14,%r1 /* jump to fn */
|
||||
#ifdef PIC
|
||||
basr %r12,0
|
||||
.L0: lr %r1,%r12
|
||||
al %r12,.L1-.L0(%r12)
|
||||
al %r1,.L2-.L0(%r1)
|
||||
br %r1 /* branch to _exit -> thread termination */
|
||||
.L1: .long _GLOBAL_OFFSET_TABLE_ - .L0
|
||||
.L2: .long _exit@PLT - .L0
|
||||
#else
|
||||
basr %r1,0
|
||||
.L0: al %r1,.L1-.L0(0,%r1)
|
||||
br %r1 /* branch to _exit -> thread termination */
|
||||
.L1: .long _exit - .L0
|
||||
#endif
|
||||
PSEUDO_END (__clone)
|
1
sysdeps/unix/sysv/linux/s390/fchown.c
Normal file
1
sysdeps/unix/sysv/linux/s390/fchown.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/fchown.c>
|
1
sysdeps/unix/sysv/linux/s390/getegid.c
Normal file
1
sysdeps/unix/sysv/linux/s390/getegid.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/getegid.c>
|
1
sysdeps/unix/sysv/linux/s390/geteuid.c
Normal file
1
sysdeps/unix/sysv/linux/s390/geteuid.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/geteuid.c>
|
1
sysdeps/unix/sysv/linux/s390/getgid.c
Normal file
1
sysdeps/unix/sysv/linux/s390/getgid.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/getgid.c>
|
1
sysdeps/unix/sysv/linux/s390/getgroups.c
Normal file
1
sysdeps/unix/sysv/linux/s390/getgroups.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/getgroups.c>
|
1
sysdeps/unix/sysv/linux/s390/getmsg.c
Normal file
1
sysdeps/unix/sysv/linux/s390/getmsg.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/getmsg.c>
|
1
sysdeps/unix/sysv/linux/s390/getpmsg.c
Normal file
1
sysdeps/unix/sysv/linux/s390/getpmsg.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/getpmsg.c>
|
1
sysdeps/unix/sysv/linux/s390/getresgid.c
Normal file
1
sysdeps/unix/sysv/linux/s390/getresgid.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/getresgid.c>
|
1
sysdeps/unix/sysv/linux/s390/getresuid.c
Normal file
1
sysdeps/unix/sysv/linux/s390/getresuid.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/getresuid.c>
|
1
sysdeps/unix/sysv/linux/s390/getuid.c
Normal file
1
sysdeps/unix/sysv/linux/s390/getuid.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/getuid.c>
|
60
sysdeps/unix/sysv/linux/s390/mmap.S
Normal file
60
sysdeps/unix/sysv/linux/s390/mmap.S
Normal file
@ -0,0 +1,60 @@
|
||||
/* Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
This file is part of the 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 <sysdep.h>
|
||||
|
||||
.text
|
||||
|
||||
ENTRY(__mmap)
|
||||
/* Save registers and setup stack frame. */
|
||||
stm %r6,%r15,24(%r15)
|
||||
lr %r1,%r15
|
||||
l %r0,4(0,%r15) /* load eos */
|
||||
ahi %r15,-120 /* buy stack space */
|
||||
st %r1,0(0,%r15) /* store back chain */
|
||||
st %r0,4(0,%r15) /* store eos */
|
||||
|
||||
/* Store parameters on stack, because old_mmap
|
||||
* takes only one parameter: a pointer to the parameter area
|
||||
*/
|
||||
mvc 0x74(4,%r15),216(%r15) /* move 'offset' */
|
||||
st %r6,0x70(0,%r15) /* store 'fd' */
|
||||
st %r5,0x6C(0,%r15) /* store 'flags' */
|
||||
st %r4,0x68(0,%r15) /* store 'prot' */
|
||||
st %r3,0x64(0,%r15) /* store 'length' */
|
||||
st %r2,0x60(0,%r15) /* store 'start' */
|
||||
|
||||
la %r2,0x60(0,%r15) /* load address of parameter list */
|
||||
/* Do the system call trap. */
|
||||
svc SYS_ify(mmap)
|
||||
|
||||
l %r15,0(0,%r15) /* load back chain */
|
||||
lm %r6,%r15,24(%r15) /* load registers */
|
||||
|
||||
/* check gpr 2 for error */
|
||||
lhi %r0,-4096
|
||||
clr %r2,%r0
|
||||
jnl SYSCALL_ERROR_LABEL
|
||||
|
||||
/* Successful; return the syscall's value. */
|
||||
br %r14
|
||||
|
||||
PSEUDO_END (__mmap)
|
||||
|
||||
weak_alias (__mmap, mmap)
|
1
sysdeps/unix/sysv/linux/s390/msgctl.c
Normal file
1
sysdeps/unix/sysv/linux/s390/msgctl.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/msgctl.c>
|
27
sysdeps/unix/sysv/linux/s390/profil-counter.h
Normal file
27
sysdeps/unix/sysv/linux/s390/profil-counter.h
Normal file
@ -0,0 +1,27 @@
|
||||
/* Low-level statistical profiling support function. Linux/s390 version.
|
||||
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 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));
|
||||
}
|
1
sysdeps/unix/sysv/linux/s390/putmsg.c
Normal file
1
sysdeps/unix/sysv/linux/s390/putmsg.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/putmsg.c>
|
1
sysdeps/unix/sysv/linux/s390/putpmsg.c
Normal file
1
sysdeps/unix/sysv/linux/s390/putpmsg.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/putpmsg.c>
|
130
sysdeps/unix/sysv/linux/s390/register-dump.h
Normal file
130
sysdeps/unix/sysv/linux/s390/register-dump.h
Normal file
@ -0,0 +1,130 @@
|
||||
/* Dump registers.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
This file is part of the 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 <sys/uio.h>
|
||||
#include <stdio-common/_itoa.h>
|
||||
|
||||
/* We will print the register dump in this format:
|
||||
|
||||
GPR0: XXXXXXXX GPR1: XXXXXXXX GPR2: XXXXXXXX GPR3: XXXXXXXX
|
||||
GPR4: XXXXXXXX GPR5: XXXXXXXX GPR6: XXXXXXXX GPR7: XXXXXXXX
|
||||
GPR8: XXXXXXXX GPR9: XXXXXXXX GPRA: XXXXXXXX GPRB: XXXXXXXX
|
||||
GPRC: XXXXXXXX GPRD: XXXXXXXX GPRE: XXXXXXXX GPRF: XXXXXXXX
|
||||
|
||||
PSW.MASK: XXXXXXXX PSW.ADDR: XXXXXXXX
|
||||
|
||||
ST(0) XXXX XXXXXXXXXXXXXXXX ST(1) XXXX XXXXXXXXXXXXXXXX
|
||||
ST(2) XXXX XXXXXXXXXXXXXXXX ST(3) XXXX XXXXXXXXXXXXXXXX
|
||||
ST(4) XXXX XXXXXXXXXXXXXXXX ST(5) XXXX XXXXXXXXXXXXXXXX
|
||||
ST(6) XXXX XXXXXXXXXXXXXXXX ST(7) XXXX XXXXXXXXXXXXXXXX
|
||||
|
||||
*/
|
||||
|
||||
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[19][8];
|
||||
struct iovec iov[40];
|
||||
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
|
||||
|
||||
/* Generate strings of register contents. */
|
||||
hexvalue (ctx->sregs->regs.gprs[0], regs[0], 8);
|
||||
hexvalue (ctx->sregs->regs.gprs[1], regs[1], 8);
|
||||
hexvalue (ctx->sregs->regs.gprs[2], regs[2], 8);
|
||||
hexvalue (ctx->sregs->regs.gprs[3], regs[3], 8);
|
||||
hexvalue (ctx->sregs->regs.gprs[4], regs[4], 8);
|
||||
hexvalue (ctx->sregs->regs.gprs[5], regs[5], 8);
|
||||
hexvalue (ctx->sregs->regs.gprs[6], regs[6], 8);
|
||||
hexvalue (ctx->sregs->regs.gprs[7], regs[7], 8);
|
||||
hexvalue (ctx->sregs->regs.gprs[8], regs[8], 8);
|
||||
hexvalue (ctx->sregs->regs.gprs[9], regs[9], 8);
|
||||
hexvalue (ctx->sregs->regs.gprs[10], regs[10], 8);
|
||||
hexvalue (ctx->sregs->regs.gprs[11], regs[11], 8);
|
||||
hexvalue (ctx->sregs->regs.gprs[12], regs[12], 8);
|
||||
hexvalue (ctx->sregs->regs.gprs[13], regs[13], 8);
|
||||
hexvalue (ctx->sregs->regs.gprs[14], regs[14], 8);
|
||||
hexvalue (ctx->sregs->regs.gprs[15], regs[15], 8);
|
||||
hexvalue (ctx->sregs->regs.psw.mask, regs[16], 8);
|
||||
hexvalue (ctx->sregs->regs.psw.addr, regs[17], 8);
|
||||
|
||||
/* Generate the output. */
|
||||
ADD_STRING ("Register dump:\n\n GPR0: ");
|
||||
ADD_MEM (regs[0], 8);
|
||||
ADD_STRING (" GPR1: ");
|
||||
ADD_MEM (regs[1], 8);
|
||||
ADD_STRING (" GPR2: ");
|
||||
ADD_MEM (regs[2], 8);
|
||||
ADD_STRING (" GPR3: ");
|
||||
ADD_MEM (regs[3], 8);
|
||||
ADD_STRING ("\n GPR4: ");
|
||||
ADD_MEM (regs[4], 8);
|
||||
ADD_STRING (" GPR5: ");
|
||||
ADD_MEM (regs[5], 8);
|
||||
ADD_STRING (" GPR6: ");
|
||||
ADD_MEM (regs[6], 8);
|
||||
ADD_STRING (" GPR7: ");
|
||||
ADD_MEM (regs[7], 8);
|
||||
ADD_STRING ("\n GPR8: ");
|
||||
ADD_MEM (regs[8], 8);
|
||||
ADD_STRING (" GPR9: ");
|
||||
ADD_MEM (regs[9], 8);
|
||||
ADD_STRING (" GPRA: ");
|
||||
ADD_MEM (regs[10], 8);
|
||||
ADD_STRING (" GPRB: ");
|
||||
ADD_MEM (regs[11], 8);
|
||||
ADD_STRING ("\n GPRC: ");
|
||||
ADD_MEM (regs[12], 8);
|
||||
ADD_STRING (" GPRD: ");
|
||||
ADD_MEM (regs[13], 8);
|
||||
ADD_STRING (" GPRE: ");
|
||||
ADD_MEM (regs[14], 8);
|
||||
ADD_STRING (" GPRF: ");
|
||||
ADD_MEM (regs[15], 8);
|
||||
ADD_STRING ("\n\n PSW.MASK: ");
|
||||
ADD_MEM (regs[16], 8);
|
||||
ADD_STRING (" PSW.ADDR: ");
|
||||
ADD_MEM (regs[17], 8);
|
||||
ADD_STRING (" TRAP: ");
|
||||
ADD_MEM (regs[18], 4);
|
||||
ADD_STRING ("\n");
|
||||
|
||||
/* Write the stuff out. */
|
||||
writev (fd, iov, nr);
|
||||
}
|
||||
|
||||
|
||||
#define REGISTER_DUMP register_dump (fd, &ctx)
|
1
sysdeps/unix/sysv/linux/s390/semctl.c
Normal file
1
sysdeps/unix/sysv/linux/s390/semctl.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/semctl.c>
|
1
sysdeps/unix/sysv/linux/s390/setegid.c
Normal file
1
sysdeps/unix/sysv/linux/s390/setegid.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/setegid.c>
|
1
sysdeps/unix/sysv/linux/s390/seteuid.c
Normal file
1
sysdeps/unix/sysv/linux/s390/seteuid.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/seteuid.c>
|
1
sysdeps/unix/sysv/linux/s390/setfsgid.c
Normal file
1
sysdeps/unix/sysv/linux/s390/setfsgid.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/setfsgid.c>
|
1
sysdeps/unix/sysv/linux/s390/setfsuid.c
Normal file
1
sysdeps/unix/sysv/linux/s390/setfsuid.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/setfsuid.c>
|
1
sysdeps/unix/sysv/linux/s390/setgid.c
Normal file
1
sysdeps/unix/sysv/linux/s390/setgid.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/setgid.c>
|
2
sysdeps/unix/sysv/linux/s390/setgroups.c
Normal file
2
sysdeps/unix/sysv/linux/s390/setgroups.c
Normal file
@ -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>
|
1
sysdeps/unix/sysv/linux/s390/setregid.c
Normal file
1
sysdeps/unix/sysv/linux/s390/setregid.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/setregid.c>
|
1
sysdeps/unix/sysv/linux/s390/setresgid.c
Normal file
1
sysdeps/unix/sysv/linux/s390/setresgid.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/setresgid.c>
|
1
sysdeps/unix/sysv/linux/s390/setresuid.c
Normal file
1
sysdeps/unix/sysv/linux/s390/setresuid.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/setresuid.c>
|
1
sysdeps/unix/sysv/linux/s390/setreuid.c
Normal file
1
sysdeps/unix/sysv/linux/s390/setreuid.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/setreuid.c>
|
2
sysdeps/unix/sysv/linux/s390/setuid.c
Normal file
2
sysdeps/unix/sysv/linux/s390/setuid.c
Normal file
@ -0,0 +1,2 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/setuid.c>
|
||||
|
1
sysdeps/unix/sysv/linux/s390/shmctl.c
Normal file
1
sysdeps/unix/sysv/linux/s390/shmctl.c
Normal file
@ -0,0 +1 @@
|
||||
#include <sysdeps/unix/sysv/linux/i386/shmctl.c>
|
26
sysdeps/unix/sysv/linux/s390/sigcontextinfo.h
Normal file
26
sysdeps/unix/sysv/linux/s390/sigcontextinfo.h
Normal file
@ -0,0 +1,26 @@
|
||||
/* Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
This file is part of the 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>
|
||||
|
||||
#define SIGCONTEXT struct sigcontext *
|
||||
#define SIGCONTEXT_EXTRA_ARGS
|
||||
#define GET_PC(ctx) ((void *)((ctx)->sregs->regs.psw.addr))
|
||||
#define GET_FRAME(ctx) (*(void **)((ctx)->sregs->regs.gprs[11]))
|
||||
#define GET_STACK(ctx) ((void *)((ctx)->sregs->regs.gprs[15]))
|
98
sysdeps/unix/sysv/linux/s390/socket.S
Normal file
98
sysdeps/unix/sysv/linux/s390/socket.S
Normal file
@ -0,0 +1,98 @@
|
||||
/* Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
This file is part of the 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 <sysdep.h>
|
||||
#include <socketcall.h>
|
||||
|
||||
/* &%/$&!! preprocessor */
|
||||
#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
|
||||
|
||||
#ifndef NARGS /* the socket.o object is compiled directly ... */
|
||||
#define NARGS 3
|
||||
#endif
|
||||
|
||||
.globl __socket
|
||||
ENTRY(__socket)
|
||||
|
||||
/* Save registers and setup stack. */
|
||||
stm %r6,%r15,24(%r15) /* save registers */
|
||||
lr %r1,%r15
|
||||
l %r0,4(0,%r15) /* load eos */
|
||||
ahi %r15,-120 /* buy stack space */
|
||||
st %r1,0(0,%r15) /* store back chain */
|
||||
st %r0,4(0,%r15) /* store eos */
|
||||
|
||||
/* Reorder arguments */
|
||||
#if (NARGS >= 6)
|
||||
mvc 0x74(4,%r15),216(%r15) /* move between parameter lists */
|
||||
#endif
|
||||
#if (NARGS >= 5)
|
||||
st %r6,0x70(0,%r15) /* store into parameter list */
|
||||
#endif
|
||||
#if (NARGS >= 4)
|
||||
st %r5,0x6C(0,%r15) /* store into parameter list */
|
||||
#endif
|
||||
#if (NARGS >= 3)
|
||||
st %r4,0x68(0,%r15) /* store into parameter list */
|
||||
#endif
|
||||
#if (NARGS >= 2)
|
||||
st %r3,0x64(0,%r15) /* store into parameter list */
|
||||
st %r2,0x60(0,%r15)
|
||||
#endif
|
||||
/* load subcode for socket syscall */
|
||||
lhi %r2,P(SOCKOP_,socket)
|
||||
la %r3,0x60(0,%r15) /* load address of parameter list */
|
||||
|
||||
/* Do the system call trap. */
|
||||
svc SYS_ify(socketcall)
|
||||
|
||||
l %r15,0(0,%r15) /* load back chain */
|
||||
lm %r6,15,24(%r15) /* load registers */
|
||||
|
||||
/* gpr2 is < 0 if there was an error. */
|
||||
lhi %r0,-125
|
||||
clr %r2,%r0
|
||||
jnl SYSCALL_ERROR_LABEL
|
||||
|
||||
/* Successful; return the syscall's value. */
|
||||
br %r14
|
||||
|
||||
PSEUDO_END (__socket)
|
||||
|
||||
#ifndef NO_WEAK_ALIAS
|
||||
weak_alias (__socket, socket)
|
||||
#endif
|
28
sysdeps/unix/sysv/linux/s390/sys/elf.h
Normal file
28
sysdeps/unix/sysv/linux/s390/sys/elf.h
Normal file
@ -0,0 +1,28 @@
|
||||
/* 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 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_ELF_H
|
||||
#define _SYS_ELF_H 1
|
||||
|
||||
/*
|
||||
* ELF register definitions..
|
||||
*/
|
||||
|
||||
#include <asm/elf.h>
|
||||
|
||||
#endif /* _SYS_ELF_H */
|
138
sysdeps/unix/sysv/linux/s390/sys/ptrace.h
Normal file
138
sysdeps/unix/sysv/linux/s390/sys/ptrace.h
Normal file
@ -0,0 +1,138 @@
|
||||
/* `ptrace' debugger support interface. Linux version.
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Denis Joseph Barrow (djbarrow@de.ibm.com).
|
||||
This file is part of the 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_PTRACE_H
|
||||
#define _SYS_PTRACE_H 1
|
||||
|
||||
#include <features.h>
|
||||
|
||||
__BEGIN_DECLS
|
||||
#ifdef _LINUX_PTRACE_H
|
||||
/* Kludge to stop stuff gdb & strace compiles from getting upset
|
||||
*/
|
||||
#undef PTRACE_TRACEME
|
||||
#undef PTRACE_PEEKTEXT
|
||||
#undef PTRACE_PEEKDATA
|
||||
#undef PTRACE_PEEKUSR
|
||||
#undef PTRACE_POKETEXT
|
||||
#undef PTRACE_POKEDATA
|
||||
#undef PTRACE_POKEUSR
|
||||
#undef PTRACE_CONT
|
||||
#undef PTRACE_KILL
|
||||
#undef PTRACE_SINGLESTEP
|
||||
|
||||
#undef PTRACE_ATTACH
|
||||
#undef PTRACE_DETACH
|
||||
|
||||
#undef PTRACE_SYSCALL
|
||||
#endif
|
||||
/* Type of the REQUEST argument to `ptrace.' */
|
||||
enum __ptrace_request
|
||||
{
|
||||
/* Indicate that the process making this request should be traced.
|
||||
All signals received by this process can be intercepted by its
|
||||
parent, and its parent can use the other `ptrace' requests. */
|
||||
PTRACE_TRACEME = 0,
|
||||
#define PT_TRACE_ME PTRACE_TRACEME
|
||||
|
||||
/* Return the word in the process's text space at address ADDR. */
|
||||
PTRACE_PEEKTEXT = 1,
|
||||
#define PT_READ_I PTRACE_PEEKTEXT
|
||||
|
||||
/* Return the word in the process's data space at address ADDR. */
|
||||
PTRACE_PEEKDATA = 2,
|
||||
#define PT_READ_D PTRACE_PEEKDATA
|
||||
|
||||
/* Return the word in the process's user area at offset ADDR. */
|
||||
PTRACE_PEEKUSER = 3,
|
||||
#define PT_READ_U PTRACE_PEEKUSER
|
||||
|
||||
/* Write the word DATA into the process's text space at address ADDR. */
|
||||
PTRACE_POKETEXT = 4,
|
||||
#define PT_WRITE_I PTRACE_POKETEXT
|
||||
|
||||
/* Write the word DATA into the process's data space at address ADDR. */
|
||||
PTRACE_POKEDATA = 5,
|
||||
#define PT_WRITE_D PTRACE_POKEDATA
|
||||
|
||||
/* Write the word DATA into the process's user area at offset ADDR. */
|
||||
PTRACE_POKEUSER = 6,
|
||||
#define PT_WRITE_U PTRACE_POKEUSER
|
||||
|
||||
/* Continue the process. */
|
||||
PTRACE_CONT = 7,
|
||||
#define PT_CONTINUE PTRACE_CONT
|
||||
|
||||
/* Kill the process. */
|
||||
PTRACE_KILL = 8,
|
||||
#define PT_KILL PTRACE_KILL
|
||||
|
||||
/* Single step the process.
|
||||
This is not supported on all machines. */
|
||||
PTRACE_SINGLESTEP = 9,
|
||||
#define PT_STEP PTRACE_SINGLESTEP
|
||||
|
||||
/* Get all general purpose registers used by a processes.
|
||||
This is not supported on all machines. */
|
||||
PTRACE_GETREGS = 12,
|
||||
#define PT_GETREGS PTRACE_GETREGS
|
||||
|
||||
/* Set all general purpose registers used by a processes.
|
||||
This is not supported on all machines. */
|
||||
PTRACE_SETREGS = 13,
|
||||
#define PT_SETREGS PTRACE_SETREGS
|
||||
|
||||
/* Get all floating point registers used by a processes.
|
||||
This is not supported on all machines. */
|
||||
PTRACE_GETFPREGS = 14,
|
||||
#define PT_GETFPREGS PTRACE_GETFPREGS
|
||||
|
||||
/* Set all floating point registers used by a processes.
|
||||
This is not supported on all machines. */
|
||||
PTRACE_SETFPREGS = 15,
|
||||
#define PT_SETFPREGS PTRACE_SETFPREGS
|
||||
|
||||
/* Attach to a process that is already running. */
|
||||
PTRACE_ATTACH = 16,
|
||||
#define PT_ATTACH PTRACE_ATTACH
|
||||
|
||||
/* Detach from a process attached to with PTRACE_ATTACH. */
|
||||
PTRACE_DETACH = 17,
|
||||
#define PT_DETACH PTRACE_DETACH
|
||||
|
||||
/* Continue and stop at the next (return from) syscall. */
|
||||
PTRACE_SYSCALL = 24
|
||||
#define PT_SYSCALL PTRACE_SYSCALL
|
||||
};
|
||||
|
||||
/* Perform process tracing functions. REQUEST is one of the values
|
||||
above, and determines the action to be taken.
|
||||
For all requests except PTRACE_TRACEME, PID specifies the process to be
|
||||
traced.
|
||||
|
||||
PID and the other arguments described above for the various requests should
|
||||
appear (those that are used for the particular request) as:
|
||||
pid_t PID, void *ADDR, int DATA, void *ADDR2
|
||||
after REQUEST. */
|
||||
extern long int ptrace (enum __ptrace_request __request, ...);
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#endif /* _SYS_PTRACE_H */
|
96
sysdeps/unix/sysv/linux/s390/sys/ucontext.h
Normal file
96
sysdeps/unix/sysv/linux/s390/sys/ucontext.h
Normal file
@ -0,0 +1,96 @@
|
||||
/* Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Denis Joseph Barrow (djbarrow@de.ibm.com).
|
||||
This file is part of the 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_UCONTEXT_H
|
||||
#define _SYS_UCONTEXT_H 1
|
||||
|
||||
#include <features.h>
|
||||
#include <signal.h>
|
||||
|
||||
/* We need the signal context definitions even if they are not used
|
||||
included in <signal.h>. */
|
||||
#include <bits/sigcontext.h>
|
||||
|
||||
|
||||
/* Type for general register. */
|
||||
typedef int greg_t;
|
||||
|
||||
/* Number of general registers. */
|
||||
#define NGREG 16
|
||||
|
||||
/* Number of each register is the `gregset_t' array. */
|
||||
enum
|
||||
{
|
||||
GPR0 = 0,
|
||||
#define GPR0 GPR0
|
||||
GPR1,
|
||||
#define GPR1 GPR1
|
||||
GPR2,
|
||||
#define GPR2 GPR2
|
||||
GPR3,
|
||||
#define GPR3 GPR3
|
||||
GPR4,
|
||||
#define GPR4 GPR4
|
||||
GPR5,
|
||||
#define GPR5 GPR5
|
||||
GPR6,
|
||||
#define GPR6 GPR6
|
||||
GPR7,
|
||||
#define GPR7 GPR7
|
||||
GPR8,
|
||||
#define GPR8 GPR8
|
||||
GPR9,
|
||||
#define GPR9 GPR9
|
||||
GPRA,
|
||||
#define GPRA GPRA
|
||||
GPRB,
|
||||
#define GPRB GPRB
|
||||
GPRC,
|
||||
#define GPRC GPRC
|
||||
GPRD,
|
||||
#define GPRD GPRD
|
||||
GPRE,
|
||||
#define GPRE GPRE
|
||||
GPRF
|
||||
#define GPRF GPRF
|
||||
};
|
||||
|
||||
/* Structure to describe FPU registers. */
|
||||
typedef long long fpreg_t;
|
||||
|
||||
/* Context to describe whole processor state. */
|
||||
typedef struct
|
||||
{
|
||||
int version;
|
||||
greg_t gregs[NGREG];
|
||||
fpreg_t fpregs[16];
|
||||
} mcontext_t;
|
||||
|
||||
/* Userlevel context. */
|
||||
typedef struct ucontext
|
||||
{
|
||||
unsigned long int uc_flags;
|
||||
struct ucontext *uc_links;
|
||||
__sigset_t uc_sigmask;
|
||||
stack_t uc_stack;
|
||||
mcontext_t uc_mcontext;
|
||||
long int uc_filler[170];
|
||||
} ucontext_t;
|
||||
|
||||
#endif /* sys/ucontext.h */
|
24
sysdeps/unix/sysv/linux/s390/sys/user.h
Normal file
24
sysdeps/unix/sysv/linux/s390/sys/user.h
Normal file
@ -0,0 +1,24 @@
|
||||
/* 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 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_USER_H
|
||||
#define _SYS_USER_H 1
|
||||
|
||||
#include <asm/user.h>
|
||||
|
||||
#endif /* _SYS_USER_H */
|
51
sysdeps/unix/sysv/linux/s390/syscall.S
Normal file
51
sysdeps/unix/sysv/linux/s390/syscall.S
Normal file
@ -0,0 +1,51 @@
|
||||
/* Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
This file is part of the 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 <sysdep.h>
|
||||
|
||||
/* Please consult the file sysdeps/unix/sysv/linux/s390/sysdep.h for
|
||||
more information about the value -4095 used below.*/
|
||||
|
||||
ENTRY (syscall)
|
||||
/* Save registers and setup stack. */
|
||||
stm %r6,%r15,24(%r15) /* save registers */
|
||||
lr %r1,%r15
|
||||
l %r0,4(0,%r15) /* load eos */
|
||||
ahi %r15,-96 /* buy stack space */
|
||||
st %r1,0(0,%r15) /* store back chain */
|
||||
st %r0,4(0,%r15) /* store eos */
|
||||
|
||||
lr %r1,%r2 /* move syscall number */
|
||||
lr %r2,%r3 /* first parameter */
|
||||
lr %r3,%r4 /* second parameter */
|
||||
lr %r4,%r5 /* third parameter */
|
||||
lr %r5,%r6 /* fourth parameter */
|
||||
l %r6,192(%r15) /* fifth parameter */
|
||||
basr %r7,0
|
||||
.L0: ex %r1,.L1-.L0(%r7) /* lsb of R1 is subsituted as SVC number */
|
||||
|
||||
l %r15,0(0,%r15) /* load back chain */
|
||||
lm %r6,15,24(%r15) /* load registers */
|
||||
|
||||
lhi %r0,-4095
|
||||
clr %r2,%r0 /* check R2 for error */
|
||||
jnl SYSCALL_ERROR_LABEL
|
||||
br %r14 /* return to caller */
|
||||
.L1: .word 0x0A00 /* opcode for SVC 0 */
|
||||
PSEUDO_END (syscall)
|
104
sysdeps/unix/sysv/linux/s390/sysdep.S
Normal file
104
sysdeps/unix/sysv/linux/s390/sysdep.S
Normal file
@ -0,0 +1,104 @@
|
||||
/* Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
This file is part of the 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 <sysdep.h>
|
||||
|
||||
/* Because the Linux version is in fact m68k/ELF and the start.? file
|
||||
for this system (sysdeps/m68k/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.
|
||||
|
||||
...and this place is here. */
|
||||
.bss
|
||||
.globl errno
|
||||
.type errno,@object
|
||||
.size errno,4
|
||||
errno:
|
||||
.space 4
|
||||
weak_alias (errno, _errno)
|
||||
|
||||
/* The following code is only used in the shared library when we
|
||||
compile the reentrant version. Otherwise each system call defines
|
||||
each own version. */
|
||||
|
||||
/* The syscall stubs jump here when they detect an error. */
|
||||
|
||||
#undef CALL_MCOUNT
|
||||
#define CALL_MCOUNT
|
||||
|
||||
.text
|
||||
ENTRY(__syscall_error)
|
||||
#ifndef PIC
|
||||
#ifndef _LIBC_REENTRANT
|
||||
lcr %r2,%r2
|
||||
basr %r1,0
|
||||
.L0: l %r1,.L1-.L0(%r1)
|
||||
st %r2,0(0,%r1)
|
||||
lhi %r2,-1
|
||||
br %r14
|
||||
.L1: .long errno
|
||||
#else
|
||||
stm %r11,%r15,44(%r15)
|
||||
lr %r0,%r15
|
||||
ahi %r15,-96
|
||||
st %r0,0(%r15)
|
||||
lcr %r11,%r2
|
||||
basr %r13,0
|
||||
.L0: l %r1,.L1-.L0(%r13)
|
||||
basr %r14,%r1
|
||||
st %r11,0(%r2)
|
||||
lhi %r2,-1
|
||||
l %r15,0(%r15)
|
||||
lm %r11,%r15,44(%r15)
|
||||
br %r14
|
||||
.L1: .long __errno_location
|
||||
#endif
|
||||
#else
|
||||
#ifndef _LIBC_REENTRANT
|
||||
basr %r1,0
|
||||
.L0: al %r1,.L1-.L0(%r1)
|
||||
l %r1,errno@GOT12(%r1)
|
||||
lcr %r2,%r2
|
||||
st %r2,0(0,%r1)
|
||||
lhi %r2,-1
|
||||
br %r14
|
||||
.L1: .long _GLOBAL_OFFSET_TABLE_-0b
|
||||
#else
|
||||
stm %r11,%r15,44(%r15)
|
||||
lr %r0,%r15
|
||||
ahi %r15,-96
|
||||
st %r0,0(%r15)
|
||||
lcr %r11,%r2
|
||||
basr %r13,0
|
||||
.L0: l %r12,.L1-.L0(%r13)
|
||||
ar %r12,%r13
|
||||
l %r14,.L2-.L0(%r13)
|
||||
bas %r14,0(%r14,%r13)
|
||||
st %r11,0(0,%r2)
|
||||
lhi %r2,-1
|
||||
l %r15,0(%r15)
|
||||
lm %r11,%r15,44(%r15)
|
||||
br %r14
|
||||
.L1: .long _GLOBAL_OFFSET_TABLE_ - .L0
|
||||
.L2: .long __errno_location@PLT - .L0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
END (__syscall_error)
|
212
sysdeps/unix/sysv/linux/s390/sysdep.h
Normal file
212
sysdeps/unix/sysv/linux/s390/sysdep.h
Normal file
@ -0,0 +1,212 @@
|
||||
/* Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
|
||||
This file is part of the 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 _LINUX_S390_SYSDEP_H
|
||||
#define _LINUX_S390_SYSEDP_H
|
||||
|
||||
#include <sysdeps/s390/sysdep.h>
|
||||
#include <sysdeps/unix/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. */
|
||||
/* in newer 2.1 kernels __NR_syscall is missing so we define it here */
|
||||
#define __NR_syscall 0
|
||||
|
||||
#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 gpr2 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. */
|
||||
|
||||
#define SYSCALL_ERROR_LABEL 0f
|
||||
|
||||
#undef PSEUDO
|
||||
#define PSEUDO(name, syscall_name, args) \
|
||||
.text; \
|
||||
ENTRY (name) \
|
||||
DO_CALL (args, syscall_name); \
|
||||
lhi %r4,-4095 ; \
|
||||
clr %r2,%r4 ; \
|
||||
jnl SYSCALL_ERROR_LABEL ; \
|
||||
L(pseudo_end):
|
||||
|
||||
#undef PSEUDO_END
|
||||
#define PSEUDO_END(name) \
|
||||
SYSCALL_ERROR_HANDLER; \
|
||||
END (name)
|
||||
|
||||
#ifndef _LIBC_REENTRANT
|
||||
#ifndef PIC
|
||||
#define SYSCALL_ERROR_HANDLER \
|
||||
0: lcr %r2,%r2 ; \
|
||||
basr %r1,0 ; \
|
||||
1: l %r1,2f-1b(%r1) \
|
||||
st %r2,0(%r1) \
|
||||
lhi %r2,-1 \
|
||||
br %r14 \
|
||||
2: .long errno
|
||||
#else
|
||||
#define SYSCALL_ERROR_HANDLER \
|
||||
0: basr %r1,0 ; \
|
||||
1: al %r1,2f-1b(%r1) ; \
|
||||
l %r1,errno@GOT12(%r1) ; \
|
||||
lcr %r2,%r2 ; \
|
||||
st %r2,0(%r1) ; \
|
||||
lhi %r2,-1 ; \
|
||||
br %r14 ; \
|
||||
2: .long _GLOBAL_OFFSET_TABLE_-1b
|
||||
#endif /* PIC */
|
||||
#else
|
||||
#define SYSCALL_ERROR_HANDLER \
|
||||
0: basr %r1,0 ; \
|
||||
1: al %r1,2f-1b(%r1) ; \
|
||||
br %r1 ; \
|
||||
2: .long __syscall_error@PLT-1b
|
||||
#endif /* _LIBC_REENTRANT */
|
||||
|
||||
/* Linux takes system call arguments in registers:
|
||||
|
||||
syscall number 1 call-clobbered
|
||||
arg 1 2 call-clobbered
|
||||
arg 2 3 call-clobbered
|
||||
arg 3 4 call-clobbered
|
||||
arg 4 5 call-clobbered
|
||||
arg 5 6 call-saved
|
||||
|
||||
(Of course a function with say 3 arguments does not have entries for
|
||||
arguments 4 and 5.)
|
||||
S390 does not need to do ANY stack operations to get its parameters
|
||||
right.
|
||||
*/
|
||||
|
||||
#define DO_CALL(args, syscall) \
|
||||
svc SYS_ify (syscall)
|
||||
|
||||
#define ret \
|
||||
br 14
|
||||
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#undef INLINE_SYSCALL
|
||||
#define INLINE_SYSCALL(name, nr, args...) \
|
||||
({ \
|
||||
DECLARGS_##nr(args) \
|
||||
int err; \
|
||||
asm volatile ( \
|
||||
LOADARGS_##nr \
|
||||
"svc %b1\n\t" \
|
||||
"lr %0,%%r2\n\t" \
|
||||
: "=d" (err) \
|
||||
: "I" (__NR_##name) ASMFMT_##nr \
|
||||
: "memory", "cc", "2", "3", "4", "5", "6"); \
|
||||
if (err >= 0xfffff001) \
|
||||
{ \
|
||||
__set_errno(-err); \
|
||||
err = 0xffffffff; \
|
||||
} \
|
||||
(int) err; })
|
||||
|
||||
#define DECLARGS_0()
|
||||
#define DECLARGS_1(arg1) \
|
||||
unsigned int gpr2 = (unsigned int) (arg1);
|
||||
#define DECLARGS_2(arg1, arg2) \
|
||||
DECLARGS_1(arg1) \
|
||||
unsigned int gpr3 = (unsigned int) (arg2);
|
||||
#define DECLARGS_3(arg1, arg2, arg3) \
|
||||
DECLARGS_2(arg1, arg2) \
|
||||
unsigned int gpr4 = (unsigned int) (arg3);
|
||||
#define DECLARGS_4(arg1, arg2, arg3, arg4) \
|
||||
DECLARGS_3(arg1, arg2, arg3) \
|
||||
unsigned int gpr5 = (unsigned int) (arg4);
|
||||
#define DECLARGS_5(arg1, arg2, arg3, arg4, arg5) \
|
||||
DECLARGS_4(arg1, arg2, arg3, arg4) \
|
||||
unsigned int gpr6 = (unsigned int) (arg5);
|
||||
|
||||
#define LOADARGS_0
|
||||
#define LOADARGS_1 "L 2,%2\n\t"
|
||||
#define LOADARGS_2 LOADARGS_1 "L 3,%3\n\t"
|
||||
#define LOADARGS_3 LOADARGS_2 "L 4,%4\n\t"
|
||||
#define LOADARGS_4 LOADARGS_3 "L 5,%5\n\t"
|
||||
#define LOADARGS_5 LOADARGS_4 "L 6,%6\n\t"
|
||||
|
||||
#define ASMFMT_0
|
||||
#define ASMFMT_1 , "m" (gpr2)
|
||||
#define ASMFMT_2 , "m" (gpr2), "m" (gpr3)
|
||||
#define ASMFMT_3 , "m" (gpr2), "m" (gpr3), "m" (gpr4)
|
||||
#define ASMFMT_4 , "m" (gpr2), "m" (gpr3), "m" (gpr4), "m" (gpr5)
|
||||
#define ASMFMT_5 , "m" (gpr2), "m" (gpr3), "m" (gpr4), "m" (gpr5), "m" (gpr6)
|
||||
|
||||
#if 0
|
||||
#undef INLINE_SYSCALL
|
||||
#define INLINE_SYSCALL(name, nr, args...) \
|
||||
({ \
|
||||
DECLARGS_##nr(args) \
|
||||
asm volatile ( \
|
||||
"svc %b1\n\t" \
|
||||
: "+d" (gpr2) \
|
||||
: "I" (__NR_##name) ASMFMT_##nr : "memory", "cc"); \
|
||||
if (gpr2 >= 0xfffff001) \
|
||||
{ \
|
||||
__set_errno(-gpr2); \
|
||||
gpr2 = 0xffffffff; \
|
||||
} \
|
||||
(int) gpr2; })
|
||||
|
||||
#define DECLARGS_0() \
|
||||
register unsigned int gpr2 asm("2");
|
||||
#define DECLARGS_1(arg1) \
|
||||
register unsigned int gpr2 asm("2") = (unsigned int) (arg1);
|
||||
#define DECLARGS_2(arg1, arg2) \
|
||||
DECLARGS_1(arg1) \
|
||||
register unsigned int gpr3 asm("3") = (unsigned int) (arg2);
|
||||
#define DECLARGS_3(arg1, arg2, arg3) \
|
||||
DECLARGS_2(arg1, arg2) \
|
||||
register unsigned int gpr4 asm("4") = (unsigned int) (arg3);
|
||||
#define DECLARGS_4(arg1, arg2, arg3, arg4) \
|
||||
DECLARGS_3(arg1, arg2, arg3) \
|
||||
register unsigned int gpr5 asm("5") = (unsigned int) (arg4);
|
||||
#define DECLARGS_5(arg1, arg2, arg3, arg4, arg5) \
|
||||
DECLARGS_4(arg1, arg2, arg3, arg4) \
|
||||
register unsigned int gpr6 asm("6") = (unsigned int) (arg5);
|
||||
|
||||
#define ASMFMT_0
|
||||
#define ASMFMT_1
|
||||
#define ASMFMT_2 , "d" (gpr3)
|
||||
#define ASMFMT_3 , "d" (gpr3), "d" (gpr4)
|
||||
#define ASMFMT_4 , "d" (gpr3), "d" (gpr4), "d" (gpr5)
|
||||
#define ASMFMT_5 , "d" (gpr3), "d" (gpr4), "d" (gpr5), "d" (gpr6)
|
||||
|
||||
#endif /* 0 */
|
||||
|
||||
#endif /* _LINUX_S390_SYSDEP_H */
|
Loading…
Reference in New Issue
Block a user