Sat Feb 10 13:09:03 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>

* sysdeps/unix/sysv/linux/m68k/brk.c,
	sysdeps/unix/sysv/linux/m68k/mmap.S,
	sysdeps/unix/sysv/linux/m68k/select.S,
	sysdeps/unix/sysv/linux/m68k/sigcontext.h,
	sysdeps/unix/sysv/linux/m68k/sigreturn.S,
	sysdeps/unix/sysv/linux/m68k/socket.S,
	sysdeps/unix/sysv/linux/m68k/syscall.S,
	sysdeps/unix/sysv/linux/m68k/sysdep.S,
	sysdeps/unix/sysv/linux/m68k/sysdep.h: New files.
This commit is contained in:
Roland McGrath 1996-02-13 11:38:58 +00:00
parent 9168a08cef
commit 9298f9e195
9 changed files with 503 additions and 0 deletions

View File

@ -0,0 +1,52 @@
/* brk system call for Linux/m68k.
Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <errno.h>
#include <unistd.h>
#include <sysdep.h>
void *__curbrk;
int
__brk (void *addr)
{
void *newbrk;
{
register long d0 __asm__ ("%d0");
asm ("move%.l %2, %%d1\n"
"trap #0" /* Perform the system call. */
: "=d" (d0)
: "0" (SYS_ify (brk)), "g" (addr)
: "%d0", "%d1");
newbrk = (void *) d0;
}
__curbrk = newbrk;
if (newbrk < addr)
{
errno = ENOMEM;
return -1;
}
return 0;
}
weak_alias (__brk, brk)

View File

@ -0,0 +1,44 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <sysdep.h>
.text
SYSCALL_ERROR_HANDLER
ENTRY (__mmap)
move.l #SYS_ify (mmap), %d0 /* System call number in %d0. */
lea 4(%sp), %a0 /* Address of args is 1st arg. */
move.l %a0, %d1
/* Do the system call trap. */
trap #0
/* Kludge: negative numbers are among the legal return values.
If %d0 is between -4096 and 0 then there was an error. */
cmp.l #-4096, %d0
jhi syscall_error
/* Successful; return the syscall's value. Copy it to %a0 because
mmap is declared to return a pointer. */
move.l %d0, %a0
rts
weak_alias (__mmap, mmap)

View File

@ -0,0 +1,53 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
#define _ERRNO_H
#include <errnos.h>
/* Linux has two versions of the select system call. The old one expected
one argument which must be a pointer to a struct which contains the
five values. The new version expects the five arguments be given in the
registers. First try the new version, if it's not available fall back
to the old version. */
.text
SYSCALL_ERROR_HANDLER
ENTRY (__select)
#if 0 /* For now only use the old version. */
DO_CALL (#SYS_ify (_newselect), 5)
tst.l %d0
jmi 1f
rts
1: move.l #-ENOSYS, %d1
cmp.l %d1, %d0
jne syscall_error /* Real error */
/* Try again using the old syscall interface. */
#endif
lea 4(%sp), %a0
move.l %a0, %d1
move.l #SYS_ify (select), %d0
trap #0
tst.l %d0
jmi syscall_error
ret
weak_alias (__select, select)

View File

@ -0,0 +1,31 @@
/* Structure describing state saved while handling a signal. Linux/m68k version.
Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
/* State of this thread when the signal was taken. */
struct sigcontext
{
__sigset_t sc_mask;
unsigned long sc_usp;
unsigned long sc_d0;
unsigned long sc_d1;
unsigned long sc_a0;
unsigned long sc_a1;
unsigned short sc_sr;
unsigned long sc_pc;
};

View File

@ -0,0 +1,28 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <sysdep.h>
.text
ENTRY (__sigreturn)
addq.l #4, %sp /* Pop the return PC. */
DO_CALL (#SYS_ify (sigreturn), 0)
/* Do the system call; it never returns. */
/* NOTREACHED */
weak_alias (__sigreturn, sigreturn)

View File

@ -0,0 +1,62 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <sysdep.h>
#include <sys/socketcall.h>
#define P(a, b) P2(a, b)
#define P2(a, b) a##b
.text
SYSCALL_ERROR_HANDLER
/* 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. */
.globl P(__,socket)
ENTRY (P(__,socket))
/* Save registers. */
move.l %d2, %a0
move.l #SYS_ify (socketcall), %d0 /* System call number in %d0. */
/* Use ## so `socket' is a separate token that might be #define'd. */
move.l #P (SOCKOP_,socket), %d1 /* Subcode is first arg to syscall. */
lea 4(%sp), %a1 /* Address of args is 2nd arg. */
move.l %a1, %d2
/* Do the system call trap. */
trap #0
/* Restore registers. */
move.l %a0, %d2
/* %d0 is < 0 if there was an error. */
tst.l %d0
jmi syscall_error
/* Successful; return the syscall's value. */
rts
weak_alias (P(__,socket), socket)

View File

@ -0,0 +1,31 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <sysdep.h>
.text
SYSCALL_ERROR_HANDLER
ENTRY (syscall)
move.l (%sp)+, %a0 /* Pop return address. */
DO_CALL ((%sp), 5) /* Frob the args and do the system call. */
tst.l %d0 /* Check %d0 for error. */
jmi error /* Jump to error handler if negative. */
jmp (%a0) /* Return to caller. */
error: pea (%a0)
jra syscall_error

View File

@ -0,0 +1,71 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU 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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
/* 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
errno: .space 4
.size errno,4
.globl _errno
.type _errno,@object
_errno = errno /* This name is expected by hj libc.so.5 startup code. */
.text
/* The following code is not used at all in the shared library.
The PIC system call stubs set errno themselves. */
#ifndef PIC
#include <sysdep.h>
#define _ERRNO_H
#include <errnos.h>
.globl errno
.globl __syscall_error
/* The syscall stubs jump here when they detect an error. */
.globl __syscall_error
__syscall_error:
neg.l %d0
#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN
/* We translate the system's EWOULDBLOCK error into EAGAIN.
The GNU C library always defines EWOULDBLOCK==EAGAIN.
EWOULDBLOCK_sys is the original number. */
move.l #EWOULDBLOCK_sys, %d1
cmp.l %d0, %d1
jne 1f
move.l #EAGAIN, %d0
1:
#endif
move.l %d0, errno
move.l #-1, %d0
/* Copy return value to %a0 for syscalls that are declared to
return a pointer. */
move.l %d0, %a0
rts
#endif /* PIC */

View File

@ -0,0 +1,131 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Andreas Schwab, <schwab@issan.informatik.uni-dortmund.de>,
December 1995.
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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
/* In the Linux/ELF world, C symbols are asm symbols. */
#define NO_UNDERSCORES
#include <sysdeps/unix/sysdep.h>
#ifdef ASSEMBLER
#define POUND #
/* Define an entry point visible from C. */
#define ENTRY(name) \
.globl name; \
.type name, @function; \
.align 4; \
name##:
/* 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
/* Linux uses a negative return value to indicate syscall errors, unlike
most Unices, which use the condition codes' carry flag. */
#define PSEUDO(name, syscall_name, args) \
.text; \
SYSCALL_ERROR_HANDLER \
ENTRY (name) \
DO_CALL (POUND SYS_ify (syscall_name), args); \
tst.l %d0; \
jmi syscall_error;
#ifdef PIC
/* Store (- %d0) into errno through the GOT. */
#define SYSCALL_ERROR_HANDLER \
syscall_error: \
move.l (errno@GOTPC.l, %pc), %a0; \
neg.l %d0; \
move.l %d0, (%a0); \
move.l POUND -1, %d0; \
/* Copy return value to %a0 for syscalls that are declared to return \
a pointer (e.g., mmap). */ \
move.l %d0, %a0; \
rts;
#else
#define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */
#endif
/* Linux takes system call arguments in registers:
syscall number %d0 call-clobbered
arg 1 %d1 call-clobbered
arg 2 %d2 call-saved
arg 3 %d3 call-saved
arg 4 %d4 call-saved
arg 5 %d5 call-saved
The stack layout upon entering the function is:
20(%sp) Arg# 5
16(%sp) Arg# 4
12(%sp) Arg# 3
8(%sp) Arg# 2
4(%sp) Arg# 1
(%sp) Return address
(Of course a function with say 3 arguments does not have entries for
arguments 4 and 5.)
Separate move's are faster than movem, but need more space. Since
speed is more important, we don't use movem. Since %a0 and %a1 are
scratch registers, we can use them for saving as well. */
#define DO_CALL(syscall, args) \
move.l syscall, %d0; \
DOARGS_##args \
trap POUND 0; \
UNDOARGS_##args
#define DOARGS_0 /* No arguments to frob. */
#define UNDOARGS_0 /* No arguments to unfrob. */
#define _DOARGS_0(n) /* No arguments to frob. */
#define DOARGS_1 _DOARGS_1 (4)
#define _DOARGS_1(n) move.l n(%sp), %d1; _DOARGS_0 (n)
#define UNDOARGS_1 UNDOARGS_0
#define DOARGS_2 _DOARGS_2 (8)
#define _DOARGS_2(n) move.l %d2, %a0; move.l n(%sp), %d2; _DOARGS_1 (n-4)
#define UNDOARGS_2 UNDOARGS_1; move.l %a0, %d2
#define DOARGS_3 _DOARGS_3 (12)
#define _DOARGS_3(n) move.l %d3, %a1; move.l n(%sp), %d3; _DOARGS_2 (n-4)
#define UNDOARGS_3 UNDOARGS_2; move.l %a1, %d3
#define DOARGS_4 _DOARGS_4 (16)
#define _DOARGS_4(n) move.l %d4, -(%sp); move.l n+4(%sp), %d4; _DOARGS_3 (n)
#define UNDOARGS_4 UNDOARGS_3; move.l (%sp)+, %d4
#define DOARGS_5 _DOARGS_5 (20)
#define _DOARGS_5(n) move.l %d5, -(%sp); move.l n+4(%sp), %d5; _DOARGS_4 (n)
#define UNDOARGS_5 UNDOARGS_4; move.l (%sp)+, %d5
#define ret rts
#if 0 /* Not used by Linux */
#define r0 %d0
#define r1 %d1
#define MOVE(x,y) movel x , y
#endif
#endif /* ASSEMBLER */