1/* Copyright (C) 1996-2022 Free Software Foundation, Inc. 2 This file is part of the GNU C Library. 3 4 The GNU C Library is free software; you can redistribute it and/or 5 modify it under the terms of the GNU Lesser General Public 6 License as published by the Free Software Foundation; either 7 version 2.1 of the License, or (at your option) any later version. 8 9 The GNU C Library is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 Lesser General Public License for more details. 13 14 You should have received a copy of the GNU Lesser General Public 15 License along with the GNU C Library. If not, see 16 <https://www.gnu.org/licenses/>. */ 17 18#include <sysdep.h> 19 20/* 21 * This is for COMPATIBILITY with Linux/x86 only. Linux/Alpha system 22 * calls return an error indication in a3. This allows arbitrary 64bit 23 * values to be returned in v0 (because negative values are not 24 * mistaken as error numbers). However, C allows only one value to 25 * be returned, so the interface below folds the error indication passed in 26 * a3 back into v0: it sets v0 to -errno if an error occurs. Thus, 27 * no negative 64bit numbers can be returned. To avoid this problem, 28 * use assembly stubs wherever possible/convenient. 29 * 30 * Usage: 31 * 32 * long syscall(syscall_number, arg1, arg2, arg3, arg4, arg5, arg6) 33 * 34 * syscall_number = the index of the system call we're invoking 35 * arg1-arg6 = up to 6 integer arguments to the system call 36 * 37 * We need to do some arg shifting: the kernel expects the 38 * syscall number in v0 and the first six args in a0-a5. 39 * 40 */ 41 42 43LEAF(__syscall, 0) 44#ifdef PROF 45 ldgp gp, 0(pv) 46 .set noat 47 lda AT, _mcount 48 jsr AT, (AT), _mcount 49 .set at 50 .prologue 1 51#else 52 .prologue 0 53#endif 54 55 mov a0, v0 /* Syscall number -> v0 */ 56 mov a1, a0 /* arg1-arg5 -> a0-a4 */ 57 mov a2, a1 58 mov a3, a2 59 mov a4, a3 60 mov a5, a4 61 ldq a5,0(sp) /* arg6 -> a5 */ 62 63 call_pal PAL_callsys /* Invoke system call */ 64 bne a3, SYSCALL_ERROR_LABEL 65 ret 66 67PSEUDO_END(__syscall) 68 69weak_alias (__syscall, syscall) 70