]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
e500 port: getcontext / setcontext / swapcontext.
authorJoseph Myers <joseph@codesourcery.com>
Fri, 4 Oct 2013 15:55:15 +0000 (15:55 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Fri, 4 Oct 2013 15:55:15 +0000 (15:55 +0000)
ChangeLog
ports/ChangeLog.powerpc
ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/context-e500.h [new file with mode: 0644]
ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/getcontext.S
ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/setcontext.S
ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/swapcontext.S
sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S
sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S
sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S

index de681c3b0bf2a2f31f386198df39b51c90de6431..5a226dde2931d87444c6d8c56c31694d7e3cef65 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2013-10-04  Joseph Myers  <joseph@codesourcery.com>
+
+       * sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S
+       (__CONTEXT_FUNC_NAME) [__CONTEXT_ENABLE_E500]: Use
+       getcontext_e500.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S
+       (__CONTEXT_FUNC_NAME) [__CONTEXT_ENABLE_E500]: Use
+       setcontext_e500.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S
+       (__CONTEXT_FUNC_NAME) [__CONTEXT_ENABLE_E500]: Use getcontext_e500
+       and setcontext_e500.
+
 2013-10-04  Chris Leonard  <cjl@sugarlabs,.org>
 
        * locale/iso-3166.def: Update iso-1366.def and related occurrences
index 375e9566ea49d199fa94ac9e2dd35fc0a8bf96dd..773c2402e312b845ba4f1010fa741f0975d8f7b3 100644 (file)
@@ -1,3 +1,14 @@
+2013-10-04  Joseph Myers  <joseph@codesourcery.com>
+
+       * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/context-e500.h:
+       New file.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/getcontext.S:
+       Include <context-e500.h>.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/setcontext.S:
+       Likewise.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/swapcontext.S:
+       Likewise.
+
 2013-08-30   Ondřej Bílka  <neleai@seznam.cz>
 
        * sysdeps/powerpc/powerpc32/405/memcpy.S: Fix typos.
diff --git a/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/context-e500.h b/ports/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/context-e500.h
new file mode 100644 (file)
index 0000000..9eb1a95
--- /dev/null
@@ -0,0 +1,144 @@
+/* getcontext/setcontext/makecontext support for e500 high parts of registers.
+   Copyright (C) 2006-2013 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
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _CONTEXT_E500_H
+#define _CONTEXT_E500_H 1
+
+#if defined __SPE__ || (defined __NO_FPRS__ && !defined _SOFT_FLOAT)
+
+# define __CONTEXT_ENABLE_E500 1
+
+/* We follow the kernel's layout, which saves the high parts of the
+   SPE registers in the vregs area, immediately followed by the ACC
+   value (call-clobbered, not handled here) and the SPEFSCR value.  */
+
+.macro getcontext_e500
+       la      r10,(_UC_VREGS)(r3)
+       evstwwe r0,(0*4)(r10)
+       evstwwe r1,(1*4)(r10)
+       evstwwe r2,(2*4)(r10)
+       evstwwe r3,(3*4)(r10)
+       evstwwe r4,(4*4)(r10)
+       evstwwe r5,(5*4)(r10)
+       evstwwe r6,(6*4)(r10)
+       evstwwe r7,(7*4)(r10)
+       evstwwe r8,(8*4)(r10)
+       evstwwe r9,(9*4)(r10)
+       evstwwe r10,(10*4)(r10)
+       evstwwe r11,(11*4)(r10)
+       evstwwe r12,(12*4)(r10)
+       evstwwe r13,(13*4)(r10)
+       evstwwe r14,(14*4)(r10)
+       evstwwe r15,(15*4)(r10)
+       evstwwe r16,(16*4)(r10)
+       evstwwe r17,(17*4)(r10)
+       evstwwe r18,(18*4)(r10)
+       evstwwe r19,(19*4)(r10)
+       evstwwe r20,(20*4)(r10)
+       evstwwe r21,(21*4)(r10)
+       evstwwe r22,(22*4)(r10)
+       evstwwe r23,(23*4)(r10)
+       evstwwe r24,(24*4)(r10)
+       evstwwe r25,(25*4)(r10)
+       evstwwe r26,(26*4)(r10)
+       evstwwe r27,(27*4)(r10)
+       evstwwe r28,(28*4)(r10)
+       evstwwe r29,(29*4)(r10)
+       evstwwe r30,(30*4)(r10)
+       evstwwe r31,(31*4)(r10)
+       mfspefscr       r9
+       stw     r9,(34*4)(r10)
+.endm
+
+.macro setcontext_e500
+       lwz     r3,_UC_VREGS+(0*4)(r31)
+       evmergelo       r0,r3,r0
+       lwz     r3,_UC_VREGS+(1*4)(r31)
+       evmergelo       r1,r3,r1
+       lwz     r3,_UC_VREGS+(2*4)(r31)
+       evmergelo       r2,r3,r2
+       lwz     r3,_UC_VREGS+(1*4)(r31)
+       evmergelo       r1,r3,r1
+       lwz     r3,_UC_VREGS+(2*4)(r31)
+       evmergelo       r2,r3,r2
+       lwz     r3,_UC_VREGS+(3*4)(r31)
+       evmergelo       r3,r3,r3
+       lwz     r3,_UC_VREGS+(4*4)(r31)
+       evmergelo       r4,r3,r4
+       lwz     r3,_UC_VREGS+(5*4)(r31)
+       evmergelo       r5,r3,r5
+       lwz     r3,_UC_VREGS+(6*4)(r31)
+       evmergelo       r6,r3,r6
+       lwz     r3,_UC_VREGS+(7*4)(r31)
+       evmergelo       r7,r3,r7
+       lwz     r3,_UC_VREGS+(8*4)(r31)
+       evmergelo       r8,r3,r8
+       lwz     r3,_UC_VREGS+(9*4)(r31)
+       evmergelo       r9,r3,r9
+       lwz     r3,_UC_VREGS+(10*4)(r31)
+       evmergelo       r10,r3,r10
+       lwz     r3,_UC_VREGS+(11*4)(r31)
+       evmergelo       r11,r3,r11
+       lwz     r3,_UC_VREGS+(12*4)(r31)
+       evmergelo       r12,r3,r12
+       lwz     r3,_UC_VREGS+(13*4)(r31)
+       evmergelo       r13,r3,r13
+       lwz     r3,_UC_VREGS+(14*4)(r31)
+       evmergelo       r14,r3,r14
+       lwz     r3,_UC_VREGS+(15*4)(r31)
+       evmergelo       r15,r3,r15
+       lwz     r3,_UC_VREGS+(16*4)(r31)
+       evmergelo       r16,r3,r16
+       lwz     r3,_UC_VREGS+(17*4)(r31)
+       evmergelo       r17,r3,r17
+       lwz     r3,_UC_VREGS+(18*4)(r31)
+       evmergelo       r18,r3,r18
+       lwz     r3,_UC_VREGS+(19*4)(r31)
+       evmergelo       r19,r3,r19
+       lwz     r3,_UC_VREGS+(20*4)(r31)
+       evmergelo       r20,r3,r20
+       lwz     r3,_UC_VREGS+(21*4)(r31)
+       evmergelo       r21,r3,r21
+       lwz     r3,_UC_VREGS+(22*4)(r31)
+       evmergelo       r22,r3,r22
+       lwz     r3,_UC_VREGS+(23*4)(r31)
+       evmergelo       r23,r3,r23
+       lwz     r3,_UC_VREGS+(24*4)(r31)
+       evmergelo       r24,r3,r24
+       lwz     r3,_UC_VREGS+(25*4)(r31)
+       evmergelo       r25,r3,r25
+       lwz     r3,_UC_VREGS+(26*4)(r31)
+       evmergelo       r26,r3,r26
+       lwz     r3,_UC_VREGS+(27*4)(r31)
+       evmergelo       r27,r3,r27
+       lwz     r3,_UC_VREGS+(28*4)(r31)
+       evmergelo       r28,r3,r28
+       lwz     r3,_UC_VREGS+(29*4)(r31)
+       evmergelo       r29,r3,r29
+       lwz     r3,_UC_VREGS+(30*4)(r31)
+       evmergelo       r30,r3,r30
+       lwz     r3,_UC_VREGS+(31*4)(r31)
+       evmergelo       r31,r3,r31
+       lwz     r3,_UC_VREGS+(34*4)(r31)
+       mtspefscr       r3
+.endm
+#else
+# undef __CONTEXT_ENABLE_E500
+#endif
+
+#endif /* context-e500.h */
index 90d9dcd4294c0992849ca1ccaee6cb00a3d17974..8bc3c7a43e3939c7d75ecb07e78867b1771aa546 100644 (file)
@@ -24,6 +24,8 @@
 #include <asm/ptrace.h>
 #include "ucontext_i.h"
 
+#include <context-e500.h>
+
 #define __CONTEXT_FUNC_NAME __getcontext
 #undef __CONTEXT_ENABLE_FPRS
 #undef __CONTEXT_ENABLE_VRS
index 06061eab9fe8cc8ae163bad5e8c066719c0e7f77..5f8653ffbb1253a0e776a5e3a43253a77e090b13 100644 (file)
@@ -24,6 +24,8 @@
 #include <asm/ptrace.h>
 #include "ucontext_i.h"
 
+#include <context-e500.h>
+
 #define __CONTEXT_FUNC_NAME __setcontext
 #undef __CONTEXT_ENABLE_FPRS
 #undef __CONTEXT_ENABLE_VRS
index 2150eec3c3cd017b486abbe920e548fccbdd8e0a..de6d56f9603a7698173169eff996a70e2f0bed50 100644 (file)
@@ -24,6 +24,8 @@
 #include <asm/ptrace.h>
 #include "ucontext_i.h"
 
+#include <context-e500.h>
+
 #define __CONTEXT_FUNC_NAME __swapcontext
 #undef __CONTEXT_ENABLE_FPRS
 #undef __CONTEXT_ENABLE_VRS
index 14f39d6611f8a6222cc1172c618e3b64da1882f3..082d302e8adbae5af49aaeba5797c895dd2e3001 100644 (file)
@@ -261,6 +261,11 @@ ENTRY(__CONTEXT_FUNC_NAME)
 2: /* L(no_vec): */
 # endif
 #endif
+
+#ifdef __CONTEXT_ENABLE_E500
+       getcontext_e500
+#endif
+
 /* We need to set up parms and call sigprocmask which will clobber
    volatile registers. So before the call we need to retrieve the
    original ucontext ptr (parm1) from stack and store the UC_REGS_PTR
index f980d282ae485d91984490d82c66a9be3a52566b..6525cf74297e5bbd5b2a7dcb9b3603891d05d9d9 100644 (file)
@@ -243,6 +243,10 @@ ENTRY(__CONTEXT_FUNC_NAME)
        lfd     fp31,_UC_FREGS+(31*8)(r31)
 #endif /* __CONTEXT_ENABLE_FPRS */
 
+#ifdef __CONTEXT_ENABLE_E500
+       setcontext_e500
+#endif
+
        /* Restore LR and CCR, and set CTR to the NIP value */
        lwz     r3,_UC_GREGS+(PT_LNK*4)(r31)
        lwz     r4,_UC_GREGS+(PT_NIP*4)(r31)
index 90d7d721282fc52f68620bcfc4b1737945eb6935..caa5b8932bb00ffd38f85847176f29976884e9de 100644 (file)
@@ -265,6 +265,10 @@ ENTRY(__CONTEXT_FUNC_NAME)
 # endif /* __CONTEXT_ENABLE_VRS */
 #endif /* __CONTEXT_ENABLE_FPRS */
 
+#ifdef __CONTEXT_ENABLE_E500
+       getcontext_e500
+#endif
+
 /* Restore ucontext (parm1) from stack.  */
        lwz     r12,_FRAME_PARM_SAVE1(r1)
        li      r4,0
@@ -468,6 +472,10 @@ ENTRY(__CONTEXT_FUNC_NAME)
        lfd     fp31,_UC_FREGS+(31*8)(r31)
 #endif /* __CONTEXT_ENABLE_FPRS */
 
+#ifdef __CONTEXT_ENABLE_E500
+       setcontext_e500
+#endif
+
        /* Restore LR and CCR, and set CTR to the NIP value */
        lwz     r3,_UC_GREGS+(PT_LNK*4)(r31)
        lwz     r4,_UC_GREGS+(PT_NIP*4)(r31)