From 2559592659fe8225fc7d67fa5bc83a1589819054 Mon Sep 17 00:00:00 2001 From: Waldemar Brodkorb Date: Mon, 23 May 2016 03:38:00 +0200 Subject: microblaze: fix setjmp/longjmp Sync mostly with GNU libc implementation of setjmp/longjmp. Just generate PIC compatible code, so no difference for static builds are made. Add sysdep.h with some handy assembly macros used inside setjmp.S/__longjmp.S. This unbreaks dynamic linker support, first test suite run only shows 10 errors, which doesn't look so bad. --- libc/sysdeps/linux/microblaze/__longjmp.S | 92 ++++++++++++++++--------------- libc/sysdeps/linux/microblaze/setjmp.S | 43 +++++---------- libc/sysdeps/linux/microblaze/sysdep.h | 25 +++++++++ 3 files changed, 89 insertions(+), 71 deletions(-) create mode 100644 libc/sysdeps/linux/microblaze/sysdep.h (limited to 'libc') diff --git a/libc/sysdeps/linux/microblaze/__longjmp.S b/libc/sysdeps/linux/microblaze/__longjmp.S index c7fce3435..0e0e2f45e 100644 --- a/libc/sysdeps/linux/microblaze/__longjmp.S +++ b/libc/sysdeps/linux/microblaze/__longjmp.S @@ -1,45 +1,51 @@ -/* - * libc/sysdeps/linux/microblaze/longjmp.S -- `longjmp' for microblaze - * - * Copyright (C) 2003 John Williams - * Copyright (C) 2001 NEC Corporation - * Copyright (C) 2001 Miles Bader - * - * This file is subject to the terms and conditions of the GNU Lesser - * General Public License. See the file COPYING.LIB in the main - * directory of this archive for more details. - * - * Written by Miles Bader - */ - -#include - - .text - .globl C_SYMBOL_NAME(__longjmp) - .align 4 -C_SYMBOL_NAME(__longjmp): - /* load registers from memory to r5 (arg0) */ - lwi r1, r5, 0 - lwi r15, r5, 4 - lwi r2, r5, 8 - lwi r13, r5, 12 - lwi r18, r5, 16 - lwi r19, r5, 20 - lwi r20, r5, 24 - lwi r21, r5, 28 - lwi r22, r5, 32 - lwi r23, r5, 36 - lwi r24, r5, 40 - lwi r25, r5, 44 - lwi r26, r5, 48 - lwi r27, r5, 52 - lwi r28, r5, 56 - lwi r29, r5, 60 - lwi r30, r5, 64 - lwi r31, r5, 68 - - addi r3, r0, 1 /* return val */ - rtsd r15, 8 /* normal return */ - nop +/* Copyright (C) 1997-2016 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 Lesser General Public License as + published by the Free Software Foundation; either version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include + +ENTRY(__longjmp) + + lwi r1, r5, 0 + lwi r15, r5, 4 + lwi r2, r5, 8 + lwi r13, r5, 12 + lwi r18, r5, 16 + lwi r19, r5, 20 + lwi r20, r5, 24 + lwi r21, r5, 28 + lwi r22, r5, 32 + lwi r23, r5, 36 + lwi r24, r5, 40 + lwi r25, r5, 44 + lwi r26, r5, 48 + lwi r27, r5, 52 + lwi r28, r5, 56 + lwi r29, r5, 60 + lwi r30, r5, 64 + lwi r31, r5, 68 + + addk r3,r6,r0 + beqi r3,L(return_1) + rtsd r15,8 + nop +L(return_1): + rtsd r15,8 + addik r3,r0,1 /* delay slot. */ + +END(__longjmp) libc_hidden_def(__longjmp) diff --git a/libc/sysdeps/linux/microblaze/setjmp.S b/libc/sysdeps/linux/microblaze/setjmp.S index 3c1d8a1dd..b40850cae 100644 --- a/libc/sysdeps/linux/microblaze/setjmp.S +++ b/libc/sysdeps/linux/microblaze/setjmp.S @@ -28,27 +28,21 @@ License along with the GNU C Library; if not, see . */ -#include +#include - .text - .globl C_SYMBOL_NAME(setjmp) - .align 4 -C_SYMBOL_NAME(setjmp): -#ifdef __PIC__ - brid 1f -#else - braid C_SYMBOL_NAME(__sigsetjmp) -#endif - addi r6, r0, 1 /* Save the signal mask. */ +ENTRY(_setjmp) + addik r6, r0, 0 +END(_setjmp) +libc_hidden_def(_setjmp) - .globl C_SYMBOL_NAME(_setjmp) -C_SYMBOL_NAME(_setjmp): - and r6, r0, r0 /* Don't save the signal mask. */ +ENTRY(setjmp) + brid 1f + addik r6, r0, 1 +END(setjmp) +libc_hidden_def(setjmp) - .globl C_SYMBOL_NAME(__sigsetjmp) -C_SYMBOL_NAME(__sigsetjmp): +ENTRY(__sigsetjmp) 1: - /* Save registers relative to r5 (arg0)*/ swi r1, r5, 0 /* stack pointer */ swi r15, r5, 4 /* link register */ swi r2, r5, 8 /* SDA and SDA2 ptrs */ @@ -68,14 +62,7 @@ C_SYMBOL_NAME(__sigsetjmp): swi r30, r5, 64 swi r31, r5, 68 - /* Make a tail call to __sigjmp_save; it takes the same args. */ -#ifdef __PIC__ - mfs r12,rpc - addik r12,r12,_GLOBAL_OFFSET_TABLE_+8 - lwi r12,r12,__sigjmp_save@GOT - brad r12 - nop -#else - braid C_SYMBOL_NAME(__sigjmp_save) - nop -#endif + bri __sigjmp_save + +END(__sigsetjmp) +libc_hidden_def(__sigsetjmp) diff --git a/libc/sysdeps/linux/microblaze/sysdep.h b/libc/sysdeps/linux/microblaze/sysdep.h new file mode 100644 index 000000000..1f01a2a1d --- /dev/null +++ b/libc/sysdeps/linux/microblaze/sysdep.h @@ -0,0 +1,25 @@ +#include + +#ifdef __ASSEMBLER__ + +/* Syntactic details of assembler. */ + +# define ALIGNARG(log2) log2 +# define ASM_SIZE_DIRECTIVE(name) .size name,.-name + +/* Define an entry point visible from C. */ +# define ENTRY(name) \ + .globl C_SYMBOL_NAME(name); \ + .type C_SYMBOL_NAME(name),@function; \ + .align ALIGNARG(2); \ + C_LABEL(name) + +# undef END +# define END(name) ASM_SIZE_DIRECTIVE(name) + +/* Local label name for asm code. */ +# ifndef L +# define L(name) $L##name +# endif + +#endif -- cgit v1.2.3