diff options
Diffstat (limited to 'sysdeps/mach/mips')
-rw-r--r-- | sysdeps/mach/mips/cacheflush.c | 30 | ||||
-rw-r--r-- | sysdeps/mach/mips/machine-lock.h | 63 | ||||
-rw-r--r-- | sysdeps/mach/mips/machine-sp.h | 34 | ||||
-rw-r--r-- | sysdeps/mach/mips/syscall.S | 57 | ||||
-rw-r--r-- | sysdeps/mach/mips/sysdep.h | 58 | ||||
-rw-r--r-- | sysdeps/mach/mips/thread_state.h | 33 |
6 files changed, 162 insertions, 113 deletions
diff --git a/sysdeps/mach/mips/cacheflush.c b/sysdeps/mach/mips/cacheflush.c index 5325e6fd1e..de2ec58bff 100644 --- a/sysdeps/mach/mips/cacheflush.c +++ b/sysdeps/mach/mips/cacheflush.c @@ -1,28 +1,28 @@ /* Flush the insn cache after GCC writes a closure on the stack. Mach/MIPS. -Copyright (C) 1994 Free Software Foundation, Inc. -This file is part of the GNU C Library. + Copyright (C) 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 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. + The GNU C Library is distributed in the hope that 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. */ + 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 <mach.h> #include <mach/vm_attributes.h> /* Stupid name, but this is what GCC generates (config/mips/mips.h). */ void -cacheflush (void *addr, size_t size, int flag) +cacheflush (void *addr, unsigned size, int flag) { vm_machine_attribute_val_t val; diff --git a/sysdeps/mach/mips/machine-lock.h b/sysdeps/mach/mips/machine-lock.h index 628aae41bb..91d39e3753 100644 --- a/sysdeps/mach/mips/machine-lock.h +++ b/sysdeps/mach/mips/machine-lock.h @@ -1,25 +1,28 @@ /* Machine-specific definition for spin locks. MIPS version. -Copyright (C) 1994 Free Software Foundation, Inc. -This file is part of the GNU C Library. + Copyright (C) 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 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. + The GNU C Library is distributed in the hope that 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. */ + 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 _MACHINE_LOCK_H #define _MACHINE_LOCK_H +/* To get the TAS pseudo-instruction. */ +#include <mach/mips/mips_instruction.h> + /* The type of a spin lock variable. */ typedef __volatile int __spin_lock_t; @@ -46,19 +49,35 @@ __spin_unlock (__spin_lock_t *__lock) _EXTERN_INLINE int __spin_try_lock (register __spin_lock_t *__lock) { - register int __rtn; +#if (__mips >= 2) + int __rtn; + __asm__ __volatile (".set noreorder"); -#if 0 - __asm__ __volatile ("lw %0,0(%1)": "=r" (__rtn) : "r" (__lock)); - __asm__ __volatile ("sw %0,0(%0)": : "r" (__lock)); - __asm__ __volatile ("xor %0,%1,%0": "=r" (__rtn) : "r" (__lock)); +#if (__mips64) + __asm__ __volatile ("lld %0,0(%1)" : "=r" (__rtn) : "r" (__lock)); #else - /* Use the Mach microkernel's emulated TAS pseudo-instruction. */ - register int __rtn __asm__ ("a0"); - __asm__ __volatile (".word 0xf ! %0 " : "=r" (__rtn) : "0" (__lock)); + __asm__ __volatile ("ll %0,0(%1)" : "=r" (__rtn) : "r" (__lock)); +#endif + if (__rtn) + return 0; + __asm__ __volatile ("move %0,%1" : "=r" (__rtn) : "r" (__lock)); +#if (__mips64) + __asm__ __volatile ("scd %0,0(%1)" : "=r" (__rtn) : "r" (__lock)); +#else + __asm__ __volatile ("sc %0,0(%1)" : "=r" (__rtn) : "r" (__lock)); #endif __asm__ __volatile (".set reorder"); + return __rtn; +#else + register int __rtn __asm__ ("a0"); + + /* Use the Mach microkernel's emulated TAS pseudo-instruction. */ + __asm__ __volatile (".set noreorder"); + __asm__ __volatile (".word %1" : "=r" (__rtn) : "i" (op_tas), "0" (__lock)); + __asm__ __volatile ("nop"); + __asm__ __volatile (".set reorder"); return __rtn ^ (int) __lock; +#endif } /* Return nonzero if LOCK is locked. */ diff --git a/sysdeps/mach/mips/machine-sp.h b/sysdeps/mach/mips/machine-sp.h index 7406658f53..e1217c31f3 100644 --- a/sysdeps/mach/mips/machine-sp.h +++ b/sysdeps/mach/mips/machine-sp.h @@ -1,21 +1,21 @@ /* Machine-specific function to return the stack pointer. MIPS version. -Copyright (C) 1994 Free Software Foundation, Inc. -This file is part of the 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. */ + Copyright (C) 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. */ #ifndef _MACHINE_SP_H #define _MACHINE_SP_H diff --git a/sysdeps/mach/mips/syscall.S b/sysdeps/mach/mips/syscall.S index bf56b401dd..9936772295 100644 --- a/sysdeps/mach/mips/syscall.S +++ b/sysdeps/mach/mips/syscall.S @@ -1,37 +1,48 @@ -/* Copyright (C) 1994 Free Software Foundation, Inc. -This file is part of the GNU C Library. +/* Copyright (C) 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 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. + The GNU C Library is distributed in the hope that 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. */ + 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> +#ifdef PIC + .option pic2 +#endif ENTRY (syscall) - .frame sp,0,ra move v0, a0 /* Load system call number from first arg. */ move a0, a1 /* Move the next three args up a register. */ move a1, a2 move a2, a3 /* Load the remaining possible args (up to 11) from the stack. */ - lw t0,16(sp) - lw t1,20(sp) - lw t2,24(sp) - lw t3,28(sp) - lw t4,32(sp) - lw t5,36(sp) - lw t6,40(sp) +#ifdef __mips64 + ld t0,4*8(sp) + ld t1,5*8(sp) + ld t2,6*8(sp) + ld t3,7*8(sp) + ld t4,8*8(sp) + ld t5,9*8(sp) + ld t6,10*8(sp) +#else + lw t0,4*4(sp) + lw t1,5*4(sp) + lw t2,6*4(sp) + lw t3,7*4(sp) + lw t4,8*4(sp) + lw t5,9*4(sp) + lw t6,10*4(sp) +#endif syscall /* Do the system call. */ j ra /* Return to caller. */ - .end syscall diff --git a/sysdeps/mach/mips/sysdep.h b/sysdeps/mach/mips/sysdep.h index 7609be5931..a4e6dff148 100644 --- a/sysdeps/mach/mips/sysdep.h +++ b/sysdeps/mach/mips/sysdep.h @@ -1,35 +1,40 @@ -/* Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation, Inc. -This file is part of the GNU C Library. +/* Copyright (C) 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 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. + The GNU C Library is distributed in the hope that 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. */ + 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 MOVE(x,y) move y , x - -#if 0 #define LOSE asm volatile ("1: b 1b") -#endif +#define START_MACHDEP asm ("\ + .text\n\ + .globl _start\n\ + .ent _start\n\ +_start:\n\ + # Put initial SP in a0.\n\ + move $4, $29\n\ + # Jump to _start0; don't return.\n\ + j _start0\n\ + .end _start\n\ +"); +#define START_ARGS int *entry_sp #define SNARF_ARGS(argc, argv, envp) \ do \ { \ - int *entry_sp; \ register char **p; \ \ - asm ("addu %0,$30,4" : "=r" (entry_sp)); \ - \ argc = *entry_sp; \ argv = (char **) (entry_sp + 1); \ p = argv; \ @@ -44,11 +49,20 @@ Cambridge, MA 02139, USA. */ ({ register int __fn = fn, __sp = (int) sp; \ asm volatile ("move $sp,%0; j %1" : : "r" (__sp), "r" (__fn));}) +#define RETURN_TO(sp, pc, retval) \ + asm volatile ("move $29, %0; move $2, %2; move $25, %1; jr $25" \ + : : "r" (sp), "r" (pc), "r" (retval)) + #define STACK_GROWTH_DOWN -#ifdef P40 #include <syscall.h> +#if defined (ASSEMBLER) + +#define ALIGN 2 + +#define MOVE(x,y) move y , x + #define SYSCALL(name, args) \ .globl syscall_error; \ kernel_trap(name,SYS_##name,args); \ diff --git a/sysdeps/mach/mips/thread_state.h b/sysdeps/mach/mips/thread_state.h index f4f4b429cf..a72848dfc0 100644 --- a/sysdeps/mach/mips/thread_state.h +++ b/sysdeps/mach/mips/thread_state.h @@ -1,25 +1,30 @@ /* Mach thread state definitions for machine-independent code. MIPS version. -Copyright (C) 1994 Free Software Foundation, Inc. -This file is part of the GNU C Library. + Copyright (C) 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 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. + The GNU C Library is distributed in the hope that 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. */ + 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 MACHINE_THREAD_STATE_FLAVOR MIPS_THREAD_STATE #define MACHINE_THREAD_STATE_COUNT MIPS_THREAD_STATE_COUNT +#ifdef PIC +#define MACHINE_THREAD_STATE_SET_PC(ts, pc) \ + ((ts)->PC = (ts)->r25 = (unsigned long int) (pc)) +#endif + #define machine_thread_state mips_thread_state #define PC pc |