diff options
| author | Ulrich Drepper <drepper@redhat.com> | 2004-01-16 04:50:59 +0000 |
|---|---|---|
| committer | Ulrich Drepper <drepper@redhat.com> | 2004-01-16 04:50:59 +0000 |
| commit | 5ef6ae4bdb04ed21b8efc70566d22fab821ec6b2 (patch) | |
| tree | 15f431839d8211e34b54bd4294f48a25770a0170 | |
| parent | 39b04aa39823faf1cc414e7f3eca4f43e01426e4 (diff) | |
| download | glibc-5ef6ae4bdb04ed21b8efc70566d22fab821ec6b2.tar.xz glibc-5ef6ae4bdb04ed21b8efc70566d22fab821ec6b2.zip | |
Update.
2004-01-14 Steven Munroe <sjmunroe@us.ibm.com>
* include/libc-symbols.h [HAVE_ASM_GLOBAL_DOT_NAME]
(_symbol_version): Use C_SYMBOL_DOT_NAME to create '.'ed symbols.
(_default_symbol_version): Use C_SYMBOL_DOT_NAME to create '.'ed
symbols.
* sysdeps/powerpc/Makefile: Add rtld-global-offsets.sym to
gen-as-const-headers.
* sysdeps/powerpc/elf/rtld-global-offsets.sym: New file.
* sysdeps/powerpc/sysdep.h: Define v# symbols for vector registers.
Define PPC_FEATURE_* masks for Aux Vector AT_HWCAP.
* sysdeps/unix/sysv/linux/kernel-features.h
(__ASSUME_SWAPCONTEXT_SYSCALL): Define for PPC and 2.6.0 kernels.
* sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h [!__WORDSIZE == 32]:
Declare mcontext_t inline and include altivec state for 64-bit.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/Versions: Add GLIBC_2.3.4
versions for setcontext, getcontext, and swapcontext.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/Versions: Add GLIBC_2.3.4
versions for setcontext, getcontext, swapcontext, and makecontext.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/getcontext.S
(__getcontext): Upgrade to save Altivec regs and version GLIBC_2_3_4.
[SHLIB_COMPAT (libc, GLIBC_2_3, GLIBC_2_3_4)](__novec_getcontext):
Compatible with GLIBC_2.3.3 release.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S
(__makecontext): Use parm save area instead of compiler_dw to hold
context pointer.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S
(__setcontext): Upgrade to restore Altivec regs and version
GLIBC_2_3_4.
[SHLIB_COMPAT (libc, GLIBC_2_3, GLIBC_2_3_4)](__novec_setcontext):
Compatible with GLIBC_2.3.3 release.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/swapcontext.S
(__swapcontext): Upgrade to swap Altivec regs and version GLIBC_2_3_4.
[SHLIB_COMPAT (libc, GLIBC_2_3, GLIBC_2_3_4)](__novec_swapcontext):
Compatible with GLIBC_2.3.3 release.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/ucontext_i.h
(SIGCONTEXT_V_REGS_PTR, SIGCONTEXT_V_RESERVE): Defined.
2004-01-12 Steven Munroe <sjmunroe@us.ibm.com>
* sysdeps/unix/sysv/linux/powerpc/powerpc32/Versions: Add GLIBC_2.3.4
versions for setcontext, getcontext, swapcontext, and makecontext.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext.S
(__getcontext): Upgrade to save Altivec regs and version GLIBC_2_3_4.
[SHLIB_COMPAT (libc, GLIBC_2_3_3, GLIBC_2_3_4)](__novec_getcontext):
Compatible with GLIBC_2.3.3 release.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S
(__makecontext): Upgrade to align for Altivec regs and version
GLIBC_2_3_4.
[SHLIB_COMPAT (libc, GLIBC_2_3_3, GLIBC_2_3_4)](__novec_makecontext):
Compatible with GLIBC_2.3.3 release.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext.S
(__setcontext): Upgrade to restore Altivec regs and version
GLIBC_2_3_4.
[SHLIB_COMPAT (libc, GLIBC_2_3_3, GLIBC_2_3_4)](__novec_setcontext):
Compatible with GLIBC_2.3.3 release.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext.S
(__swapcontext): Upgrade to swap Altivec regs and version GLIBC_2_3_4.
[SHLIB_COMPAT (libc, GLIBC_2_3_3, GLIBC_2_3_4)]
(__novec_swapcontext): Compatible with GLIBC_2.3.3 release.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/ucontext_i.h:
(_UC_VSCR, _UC_VRSAVE): Define.
(_FRAME_BACKCHAIN, _FRAME_LR_SAVE,_FRAME_PARM_SAVE1,_FRAME_PARM_SAVE2,
_FRAME_PARM_SAVE3, _FRAME_PARM_SAVE4): Defined.
19 files changed, 2283 insertions, 34 deletions
@@ -1,3 +1,70 @@ +2004-01-14 Steven Munroe <sjmunroe@us.ibm.com> + + * include/libc-symbols.h [HAVE_ASM_GLOBAL_DOT_NAME] + (_symbol_version): Use C_SYMBOL_DOT_NAME to create '.'ed symbols. + (_default_symbol_version): Use C_SYMBOL_DOT_NAME to create '.'ed + symbols. + * sysdeps/powerpc/Makefile: Add rtld-global-offsets.sym to + gen-as-const-headers. + * sysdeps/powerpc/elf/rtld-global-offsets.sym: New file. + * sysdeps/powerpc/sysdep.h: Define v# symbols for vector registers. + Define PPC_FEATURE_* masks for Aux Vector AT_HWCAP. + * sysdeps/unix/sysv/linux/kernel-features.h + (__ASSUME_SWAPCONTEXT_SYSCALL): Define for PPC and 2.6.0 kernels. + * sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h [!__WORDSIZE == 32]: + Declare mcontext_t inline and include altivec state for 64-bit. + * sysdeps/unix/sysv/linux/powerpc/powerpc64/Versions: Add GLIBC_2.3.4 + versions for setcontext, getcontext, and swapcontext. + + * sysdeps/unix/sysv/linux/powerpc/powerpc64/Versions: Add GLIBC_2.3.4 + versions for setcontext, getcontext, swapcontext, and makecontext. + * sysdeps/unix/sysv/linux/powerpc/powerpc64/getcontext.S + (__getcontext): Upgrade to save Altivec regs and version GLIBC_2_3_4. + [SHLIB_COMPAT (libc, GLIBC_2_3, GLIBC_2_3_4)](__novec_getcontext): + Compatible with GLIBC_2.3.3 release. + * sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S + (__makecontext): Use parm save area instead of compiler_dw to hold + context pointer. + * sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S + (__setcontext): Upgrade to restore Altivec regs and version + GLIBC_2_3_4. + [SHLIB_COMPAT (libc, GLIBC_2_3, GLIBC_2_3_4)](__novec_setcontext): + Compatible with GLIBC_2.3.3 release. + * sysdeps/unix/sysv/linux/powerpc/powerpc64/swapcontext.S + (__swapcontext): Upgrade to swap Altivec regs and version GLIBC_2_3_4. + [SHLIB_COMPAT (libc, GLIBC_2_3, GLIBC_2_3_4)](__novec_swapcontext): + Compatible with GLIBC_2.3.3 release. + * sysdeps/unix/sysv/linux/powerpc/powerpc64/ucontext_i.h + (SIGCONTEXT_V_REGS_PTR, SIGCONTEXT_V_RESERVE): Defined. + + +2004-01-12 Steven Munroe <sjmunroe@us.ibm.com> + + * sysdeps/unix/sysv/linux/powerpc/powerpc32/Versions: Add GLIBC_2.3.4 + versions for setcontext, getcontext, swapcontext, and makecontext. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext.S + (__getcontext): Upgrade to save Altivec regs and version GLIBC_2_3_4. + [SHLIB_COMPAT (libc, GLIBC_2_3_3, GLIBC_2_3_4)](__novec_getcontext): + Compatible with GLIBC_2.3.3 release. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S + (__makecontext): Upgrade to align for Altivec regs and version + GLIBC_2_3_4. + [SHLIB_COMPAT (libc, GLIBC_2_3_3, GLIBC_2_3_4)](__novec_makecontext): + Compatible with GLIBC_2.3.3 release. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext.S + (__setcontext): Upgrade to restore Altivec regs and version + GLIBC_2_3_4. + [SHLIB_COMPAT (libc, GLIBC_2_3_3, GLIBC_2_3_4)](__novec_setcontext): + Compatible with GLIBC_2.3.3 release. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext.S + (__swapcontext): Upgrade to swap Altivec regs and version GLIBC_2_3_4. + [SHLIB_COMPAT (libc, GLIBC_2_3_3, GLIBC_2_3_4)] + (__novec_swapcontext): Compatible with GLIBC_2.3.3 release. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/ucontext_i.h: + (_UC_VSCR, _UC_VRSAVE): Define. + (_FRAME_BACKCHAIN, _FRAME_LR_SAVE,_FRAME_PARM_SAVE1,_FRAME_PARM_SAVE2, + _FRAME_PARM_SAVE3, _FRAME_PARM_SAVE4): Defined. + 2004-01-15 Ulrich Drepper <drepper@redhat.com> * elf/rtld.c: Handle platforms with HP_TIMING_NONAVAIL defined. diff --git a/include/libc-symbols.h b/include/libc-symbols.h index d14f26c73d..399b4b9226 100644 --- a/include/libc-symbols.h +++ b/include/libc-symbols.h @@ -420,10 +420,10 @@ for linking") # ifdef HAVE_ASM_GLOBAL_DOT_NAME # define _symbol_version(real, name, version) \ .symver real, name##@##version ASM_LINE_SEP \ - .symver .##real, .##name##@##version + .symver C_SYMBOL_DOT_NAME(real), C_SYMBOL_DOT_NAME(name##@##version) # define _default_symbol_version(real, name, version) \ .symver real, name##@##@##version ASM_LINE_SEP \ - .symver .##real, .##name##@##@##version + .symver C_SYMBOL_DOT_NAME(real), C_SYMBOL_DOT_NAME(name##@##@##version) # else # define _symbol_version(real, name, version) \ .symver real, name##@##version diff --git a/sysdeps/powerpc/Makefile b/sysdeps/powerpc/Makefile index befa9c3bb7..f0b37bbdf9 100644 --- a/sysdeps/powerpc/Makefile +++ b/sysdeps/powerpc/Makefile @@ -17,3 +17,8 @@ sysdep_routines += dl-machine # extra shared linker files to link only into dl-allobjs.so sysdep-rtld-routines += dl-machine endif + +ifeq ($(subdir),csu) +# get offset to rtld_global._dl_hwcap +gen-as-const-headers += rtld-global-offsets.sym +endif diff --git a/sysdeps/powerpc/elf/rtld-global-offsets.sym b/sysdeps/powerpc/elf/rtld-global-offsets.sym new file mode 100644 index 0000000000..6bc8aaac55 --- /dev/null +++ b/sysdeps/powerpc/elf/rtld-global-offsets.sym @@ -0,0 +1,7 @@ +#define SHARED 1 + +#include <ldsodefs.h> + +#define rtdl_global_offsetof(mem) offsetof (struct rtld_global, mem) + +RTLD_GLOBAL_DL_HWCAP_OFFSET rtdl_global_offsetof (_dl_hwcap) diff --git a/sysdeps/powerpc/sysdep.h b/sysdeps/powerpc/sysdep.h index cd0485e070..214ac6a2ed 100644 --- a/sysdeps/powerpc/sysdep.h +++ b/sysdeps/powerpc/sysdep.h @@ -100,6 +100,42 @@ #define cr6 6 #define cr7 7 +/* Vector registers. */ +#define v0 0 +#define v1 1 +#define v2 2 +#define v3 3 +#define v4 4 +#define v5 5 +#define v6 6 +#define v7 7 +#define v8 8 +#define v9 9 +#define v10 10 +#define v11 11 +#define v12 12 +#define v13 13 +#define v14 14 +#define v15 15 +#define v16 16 +#define v17 17 +#define v18 18 +#define v19 19 +#define v20 20 +#define v21 21 +#define v22 22 +#define v23 23 +#define v24 24 +#define v25 25 +#define v26 26 +#define v27 27 +#define v28 28 +#define v29 29 +#define v30 30 +#define v31 31 + +#define VRSAVE 256 + #ifdef __ELF__ @@ -111,5 +147,18 @@ #endif /* __ELF__ */ +/* + * Powerpc Feature masks for the Aux Vector Hardware Capabilities (AT_HWCAP). + * This entry is copied to _dl_hwcap or rtld_global._dl_hwcap during startup. + * The following must match the kernels linux/asm/cputable.h. + */ +#define PPC_FEATURE_32 0x80000000 /* 32-bit mode. */ +#define PPC_FEATURE_64 0x40000000 /* 64-bit mode. */ +#define PPC_FEATURE_601_INSTR 0x20000000 /* 601 chip, Old POWER ISA. */ +#define PPC_FEATURE_HAS_ALTIVEC 0x10000000 /* SIMD/Vector Unit. */ +#define PPC_FEATURE_HAS_FPU 0x08000000 /* Floating Point Unit. */ +#define PPC_FEATURE_HAS_MMU 0x04000000 /* Memory Management Unit. */ +#define PPC_FEATURE_HAS_4xxMAC 0x02000000 /* 4xx Multiply Accumulator. */ +#define PPC_FEATURE_UNIFIED_CACHE 0x01000000 /* Unified I/D cache. */ #endif /* __ASSEMBLER__ */ diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h index c2618ff8ed..43e95dfee4 100644 --- a/sysdeps/unix/sysv/linux/kernel-features.h +++ b/sysdeps/unix/sysv/linux/kernel-features.h @@ -379,3 +379,10 @@ #if __LINUX_KERNEL_VERSION >= 132609 # define __ASSUME_PROT_GROWSUPDOWN 1 #endif + +/* Starting with 2.6.0 PowerPC adds signal/swapcontext support for Vector + SIMD (AKA Altivec, VMX) instructions and register state. This changes + the overall size of the sigcontext and adds the swapcontext syscall. */ +#if __LINUX_KERNEL_VERSION >= (132608) && defined __powerpc__ +# define __ASSUME_SWAPCONTEXT_SYSCALL 1 +#endif diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/Versions b/sysdeps/unix/sysv/linux/powerpc/powerpc32/Versions index d667eadbce..181d70150c 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/Versions +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/Versions @@ -24,4 +24,7 @@ libc { posix_fadvise64; posix_fallocate64; setcontext; getcontext; swapcontext; makecontext; } + GLIBC_2.3.4 { + setcontext; getcontext; swapcontext; makecontext; + } } diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext.S b/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext.S index 3b1b3b9449..760e9b5534 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext.S +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext.S @@ -1,5 +1,5 @@ /* Save current context. - Copyright (C) 2002 Free Software Foundation, Inc. + Copyright (C) 2002, 2004 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 @@ -18,6 +18,7 @@ 02111-1307 USA. */ #include <sysdep.h> +#include <rtld-global-offsets.h> #include <shlib-compat.h> #define __ASSEMBLY__ @@ -25,6 +26,231 @@ #include "ucontext_i.h" ENTRY(__getcontext) + stw r3,_FRAME_PARM_SAVE1(r1) + addi r3,r3,_UC_REG_SPACE+12 + clrrwi r3,r3,4 + stw r0,_UC_GREGS+(PT_R0*4)(r3) + mflr r0 + stw r1,_UC_GREGS+(PT_R1*4)(r3) + stwu r1,-16(r1) + stw r0,_UC_GREGS+(PT_LNK*4)(r3) + stw r0,_UC_GREGS+(PT_NIP*4)(r3) + stw r0,_FRAME_LR_SAVE+16(r1) + stw r2,_UC_GREGS+(PT_R2*4)(r3) + stw r4,_UC_GREGS+(PT_R4*4)(r3) + stw r5,_UC_GREGS+(PT_R5*4)(r3) + stw r6,_UC_GREGS+(PT_R6*4)(r3) + stw r7,_UC_GREGS+(PT_R7*4)(r3) + stw r8,_UC_GREGS+(PT_R8*4)(r3) + stw r9,_UC_GREGS+(PT_R9*4)(r3) + stw r10,_UC_GREGS+(PT_R10*4)(r3) + stw r11,_UC_GREGS+(PT_R11*4)(r3) + stw r12,_UC_GREGS+(PT_R12*4)(r3) + stw r13,_UC_GREGS+(PT_R13*4)(r3) + stw r14,_UC_GREGS+(PT_R14*4)(r3) + stw r15,_UC_GREGS+(PT_R15*4)(r3) + stw r16,_UC_GREGS+(PT_R16*4)(r3) + stw r17,_UC_GREGS+(PT_R17*4)(r3) + stw r18,_UC_GREGS+(PT_R18*4)(r3) + stw r19,_UC_GREGS+(PT_R19*4)(r3) + stw r20,_UC_GREGS+(PT_R20*4)(r3) + stw r21,_UC_GREGS+(PT_R21*4)(r3) + stw r22,_UC_GREGS+(PT_R22*4)(r3) + stw r23,_UC_GREGS+(PT_R23*4)(r3) + stw r24,_UC_GREGS+(PT_R24*4)(r3) + stw r25,_UC_GREGS+(PT_R25*4)(r3) + stw r26,_UC_GREGS+(PT_R26*4)(r3) + stw r27,_UC_GREGS+(PT_R27*4)(r3) + stw r28,_UC_GREGS+(PT_R28*4)(r3) + stw r29,_UC_GREGS+(PT_R29*4)(r3) + stw r30,_UC_GREGS+(PT_R30*4)(r3) + stw r31,_UC_GREGS+(PT_R31*4)(r3) + mfctr r0 + stw r0,_UC_GREGS+(PT_CTR*4)(r3) + mfxer r0 + stw r0,_UC_GREGS+(PT_XER*4)(r3) + mfcr r0 + stw r0,_UC_GREGS+(PT_CCR*4)(r3) + + /* Set the return value of getcontext to "success". R3 is the only + register whose value is not preserved in the saved context. */ + li r0,0 + stw r0,_UC_GREGS+(PT_R3*4)(r3) + + /* Zero fill fields that can't be set in user state. */ + stw r0,_UC_GREGS+(PT_MSR*4)(r3) + stw r0,_UC_GREGS+(PT_MQ*4)(r3) + + /* Save the floating-point registers */ + stfd fp0,_UC_FREGS+(0*8)(r3) + stfd fp1,_UC_FREGS+(1*8)(r3) + stfd fp2,_UC_FREGS+(2*8)(r3) + stfd fp3,_UC_FREGS+(3*8)(r3) + stfd fp4,_UC_FREGS+(4*8)(r3) + stfd fp5,_UC_FREGS+(5*8)(r3) + stfd fp6,_UC_FREGS+(6*8)(r3) + stfd fp7,_UC_FREGS+(7*8)(r3) + stfd fp8,_UC_FREGS+(8*8)(r3) + stfd fp9,_UC_FREGS+(9*8)(r3) + stfd fp10,_UC_FREGS+(10*8)(r3) + stfd fp11,_UC_FREGS+(11*8)(r3) + stfd fp12,_UC_FREGS+(12*8)(r3) + stfd fp13,_UC_FREGS+(13*8)(r3) + stfd fp14,_UC_FREGS+(14*8)(r3) + stfd fp15,_UC_FREGS+(15*8)(r3) + stfd fp16,_UC_FREGS+(16*8)(r3) + stfd fp17,_UC_FREGS+(17*8)(r3) + stfd fp18,_UC_FREGS+(18*8)(r3) + stfd fp19,_UC_FREGS+(19*8)(r3) + stfd fp20,_UC_FREGS+(20*8)(r3) + stfd fp21,_UC_FREGS+(21*8)(r3) + stfd fp22,_UC_FREGS+(22*8)(r3) + stfd fp23,_UC_FREGS+(23*8)(r3) + stfd fp24,_UC_FREGS+(24*8)(r3) + stfd fp25,_UC_FREGS+(25*8)(r3) + stfd fp26,_UC_FREGS+(26*8)(r3) + stfd fp27,_UC_FREGS+(27*8)(r3) + stfd fp28,_UC_FREGS+(28*8)(r3) + stfd fp29,_UC_FREGS+(29*8)(r3) + mffs fp0 + stfd fp30,_UC_FREGS+(30*8)(r3) + stfd fp31,_UC_FREGS+(31*8)(r3) + stfd fp0,_UC_FREGS+(32*8)(r3) + +#ifdef PIC + mflr r8 + bl _GLOBAL_OFFSET_TABLE_@local-4 + mflr r7 +#ifdef SHARED + lwz r7,_rtld_global@got(r7) + mtlr r8 + lwz r7,RTLD_GLOBAL_DL_HWCAP_OFFSET(r7) +#else + lwz r7,_dl_hwcap@got(r7) + mtlr r8 + lwz r7,0(r7) +#endif +#else + lis r7,_dl_hwcap@ha + lwz r7,_dl_hwcap@l(r7) +#endif + andis. r7,r7,(PPC_FEATURE_HAS_ALTIVEC >> 16) + beq L(no_vec) + + la r10,(_UC_VREGS)(r3) + la r9,(_UC_VREGS+16)(r3) + + stvx v0,0,r10 + stvx v1,0,r9 + addi r10,r10,32 + addi r9,r9,32 + + stvx v2,0,r10 + stvx v3,0,r9 + addi r10,r10,32 + addi r9,r9,32 + + stvx v4,0,r10 + stvx v5,0,r9 + addi r10,r10,32 + addi r9,r9,32 + + stvx v6,0,r10 + stvx v7,0,r9 + addi r10,r10,32 + addi r9,r9,32 + + stvx v8,0,r10 + stvx v9,0,r9 + addi r10,r10,32 + addi r9,r9,32 + + stvx v10,0,r10 + stvx v11,0,r9 + addi r10,r10,32 + addi r9,r9,32 + + stvx v12,0,r10 + stvx v13,0,r9 + addi r10,r10,32 + addi r9,r9,32 + + stvx v14,0,r10 + stvx v15,0,r9 + addi r10,r10,32 + addi r9,r9,32 + + stvx v16,0,r10 + stvx v17,0,r9 + addi r10,r10,32 + addi r9,r9,32 + + stvx v18,0,r10 + stvx v11,0,r9 + addi r19,r10,32 + addi r9,r9,32 + + stvx v20,0,r10 + stvx v21,0,r9 + addi r10,r10,32 + addi r9,r9,32 + + stvx v22,0,r10 + stvx v23,0,r9 + addi r10,r10,32 + addi r9,r9,32 + + stvx v24,0,r10 + stvx v25,0,r9 + addi r10,r10,32 + addi r9,r9,32 + + stvx v26,0,r10 + stvx v27,0,r9 + addi r10,r10,32 + addi r9,r9,32 + + stvx v28,0,r10 + stvx v29,0,r9 + addi r10,r10,32 + addi r9,r9,32 + + stvx v30,0,r10 + stvx v31,0,r9 + addi r10,r10,32 + addi r9,r9,32 + + stvx v10,0,r10 + stvx v11,0,r9 + addi r10,r10,32 + addi r9,r9,32 + + mfvscr v0 + mfspr r0,VRSAVE + stvx v0,0,r10 + sync + stw r0,0(r10) + +L(no_vec): +/* Restore ucontext (parm1) from stack. */ + lwz r12,_FRAME_PARM_SAVE1+16(r1) + li r4,0 + stw r3,_UC_REGS_PTR(r12) + addi r5,r12,_UC_SIGMASK + li r3,SIG_BLOCK + bl JUMPTARGET(sigprocmask) + + lwz r0,_FRAME_LR_SAVE+16(r1) + addi r1,r1,16 + mtlr r0 + blr +PSEUDO_END(__getcontext) + +versioned_symbol (libc, __getcontext, getcontext, GLIBC_2_3_4) + +#if SHLIB_COMPAT (libc, GLIBC_2_3_3, GLIBC_2_3_4) + +ENTRY(__novec_getcontext) /* * Since we are not attempting to save the altivec registers, * there is no need to get the register storage space @@ -119,7 +345,7 @@ ENTRY(__getcontext) stfd fp30,_UC_FREGS+(30*8)(r3) stfd fp31,_UC_FREGS+(31*8)(r3) stfd fp0,_UC_FREGS+(32*8)(r3) - + addi r5,r3,_UC_SIGMASK - _UC_REG_SPACE li r4,0 li r3,SIG_BLOCK @@ -129,9 +355,11 @@ ENTRY(__getcontext) addi r1,r1,16 mtlr r0 blr -PSEUDO_END(__getcontext) +PSEUDO_END(__novec_getcontext) + +compat_symbol (libc, __novec_getcontext, getcontext, GLIBC_2_3_3) -versioned_symbol (libc, __getcontext, getcontext, GLIBC_2_3_3) +#endif #if SHLIB_COMPAT (libc, GLIBC_2_1, GLIBC_2_3_3) diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S b/sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S index 9cb0b874f5..9f34357deb 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S @@ -1,5 +1,5 @@ /* Set up a context to call a function. - Copyright (C) 2002 Free Software Foundation, Inc. + Copyright (C) 2002, 2004 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 @@ -26,7 +26,8 @@ ENTRY(__makecontext) /* Set up the first 7 args to the function in its registers */ - addi r11,r3,_UC_REG_SPACE + addi r11,r3,_UC_REG_SPACE+12 + clrrwi r11,r11,4 stw r11,_UC_REGS_PTR(r3) stw r6,_UC_GREGS+(PT_R3*4)(r11) stw r7,_UC_GREGS+(PT_R4*4)(r11)< |
