import boost-1.66.0-10.el8

This commit is contained in:
CentOS Sources 2021-03-30 08:50:08 -04:00 committed by Stepan Oksanichenko
parent 9dc83657d2
commit 761aba3def
6 changed files with 5 additions and 1711 deletions

View File

@ -1,125 +0,0 @@
--- boost_1_66_0/boost/predef/architecture.h 2017-12-14 00:56:47.000000000 +0100
+++ boost_1_66_0-git/boost/predef/architecture.h 2020-03-23 11:37:30.289735409 +0100
@@ -21,6 +21,7 @@ http://www.boost.org/LICENSE_1_0.txt)
#include <boost/predef/architecture/ppc.h>
#include <boost/predef/architecture/pyramid.h>
#include <boost/predef/architecture/rs6k.h>
+#include <boost/predef/architecture/s390x.h>
#include <boost/predef/architecture/sparc.h>
#include <boost/predef/architecture/superh.h>
#include <boost/predef/architecture/sys370.h>
--- boost_1_66_0/boost/predef/architecture/s390x.h 1970-01-01 01:00:00.000000000 +0100
+++ boost_1_66_0-git/boost/predef/architecture/s390x.h 2020-03-23 11:37:48.519735409 +0100
@@ -0,0 +1,42 @@
+/*
+Copyright Andreas Krebbel 2020
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef BOOST_PREDEF_ARCHITECTURE_S390X_H
+#define BOOST_PREDEF_ARCHITECTURE_S390X_H
+
+#include <boost/predef/version_number.h>
+#include <boost/predef/make.h>
+
+/*`
+[heading `BOOST_ARCH_S390X`]
+
+[@http://en.wikipedia.org/wiki/System/390 System/390] architecture.
+
+[table
+ [[__predef_symbol__] [__predef_version__]]
+
+ [[`__s390x__`] [__predef_detection__]]
+ ]
+ */
+
+#define BOOST_ARCH_S390X BOOST_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__s390x__)
+# undef BOOST_ARCH_S390X
+# define BOOST_ARCH_S390X BOOST_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if BOOST_ARCH_S390X
+# define BOOST_ARCH_S390X_AVAILABLE
+#endif
+
+#define BOOST_ARCH_S390X_NAME "IBM Z"
+
+#endif
+
+#include <boost/predef/detail/test.h>
+BOOST_PREDEF_DECLARE_TEST(BOOST_ARCH_S390X,BOOST_ARCH_S390X_NAME)
--- boost_1_66_0/boostcpp.jam 2017-12-14 00:56:35.000000000 +0100
+++ boost_1_66_0-git/boostcpp.jam 2020-03-23 11:37:35.829735409 +0100
@@ -678,7 +678,7 @@ rule address-model ( )
return <conditional>@boostcpp.deduce-address-model ;
}
-local deducable-architectures = arm mips1 power sparc x86 combined ;
+local deducable-architectures = arm mips1 power s390x sparc x86 combined ;
feature.feature deduced-architecture : $(deducable-architectures) : propagated optional composite hidden ;
for a in $(deducable-architectures)
{
@@ -701,6 +701,10 @@ rule deduce-architecture ( properties *
{
result = power ;
}
+ else if [ configure.builds /boost/architecture//s390x : $(filtered) : s390x ]
+ {
+ result = s390x ;
+ }
else if [ configure.builds /boost/architecture//sparc : $(filtered) : sparc ]
{
result = sparc ;
--- boost_1_66_0/libs/config/checks/architecture/Jamroot.jam 2017-12-14 00:56:42.000000000 +0100
+++ boost_1_66_0-git/libs/config/checks/architecture/Jamroot.jam 2020-03-23 11:37:35.829735409 +0100
@@ -19,5 +19,6 @@ obj arm : arm.cpp ;
obj combined : combined.cpp ;
obj mips1 : mips1.cpp ;
obj power : power.cpp ;
+obj s390x : s390x.cpp ;
obj sparc : sparc.cpp ;
obj x86 : x86.cpp ;
--- boost_1_66_0/libs/config/checks/architecture/s390x.cpp 1970-01-01 01:00:00.000000000 +0100
+++ boost_1_66_0-git/libs/config/checks/architecture/s390x.cpp 2020-03-23 11:37:35.829735409 +0100
@@ -0,0 +1,11 @@
+// s390x.cpp
+//
+// Copyright (c) 2020 Andreas Krebbel
+//
+// Distributed under the Boost Software License Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#if !defined(__s390x__)
+#error "Not IBM Z"
+#endif
--- boost_1_66_0/tools/build/src/tools/builtin.py 2017-12-14 00:56:50.000000000 +0100
+++ boost_1_66_0-git/tools/build/src/tools/builtin.py 2020-03-23 11:37:35.829735409 +0100
@@ -250,6 +250,9 @@ def register_globals ():
# ia64
'ia64',
+ # IBM Z
+ 's390x',
+
# Sparc
'sparc',
--- boost_1_66_0/tools/build/src/tools/features/architecture-feature.jam 2017-12-14 00:56:50.000000000 +0100
+++ boost_1_66_0-git/tools/build/src/tools/features/architecture-feature.jam 2020-03-23 11:37:35.829735409 +0100
@@ -15,6 +15,9 @@ feature.feature architecture
# ia64
ia64
+ # IBM Z
+ s390x
+
# Sparc
sparc

View File

@ -1,24 +0,0 @@
From db13a7f7a5c2ca8da48ea364bc9998ccf0aa6184 Mon Sep 17 00:00:00 2001
From: Andreas Krebbel <krebbel@linux.ibm.com>
Date: Mon, 23 Mar 2020 09:07:32 +0100
Subject: [PATCH 2/4] docu: update architectures
---
doc/architectures.qbk | 1 +
1 file changed, 1 insertion(+)
diff --git a/doc/architectures.qbk b/doc/architectures.qbk
index 893c5b3..de6f55a 100644
--- a/libs/context/doc/architectures.qbk
+++ b/libs/context/doc/architectures.qbk
@@ -18,6 +18,7 @@ architectures:
[[mips1] [O32|ELF] [-] [-] [-]]
[[ppc32] [SYSV|ELF,XCOFF] [-] [SYSV|MACH-O] [-]]
[[ppc64] [SYSV|ELF,XCOFF] [-] [SYSV|MACH-O] [-]]
+ [[s390x] [SYSV|ELF] [-] [-] [-]]
[[sparc] [-] [-] [-] [-]]
[[x86_64] [SYSV,X32|ELF] [MS|PE] [SYSV|MACH-O] [-]]
]
--
2.18.1

View File

@ -1,736 +0,0 @@
From f60b86bddcf964f1a97df7a33aa36bc0160dba38 Mon Sep 17 00:00:00 2001
From: Andreas Krebbel <krebbel@linux.ibm.com>
Date: Mon, 23 Mar 2020 09:09:17 +0100
Subject: [PATCH 4/4] IBM Z: Fix fcontext routines
---
src/asm/jump_s390x_sysv_elf_gas.S | 257 +++++++++++++++++------------
src/asm/make_s390x_sysv_elf_gas.S | 176 ++++++++++----------
src/asm/ontop_s390x_sysv_elf_gas.S | 238 ++++++++++++++------------
3 files changed, 374 insertions(+), 297 deletions(-)
diff --git a/src/asm/jump_s390x_sysv_elf_gas.S b/src/asm/jump_s390x_sysv_elf_gas.S
index b2163cc..c2a578b 100644
--- a/libs/context/src/asm/jump_s390x_sysv_elf_gas.S
+++ b/libs/context/src/asm/jump_s390x_sysv_elf_gas.S
@@ -1,117 +1,156 @@
/*******************************************************
-* *
-* ------------------------------------------------- *
-* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
-* ------------------------------------------------- *
-* | 0 | 8 | 16 | 24 | *
-* ------------------------------------------------- *
-* | R6 | R7 | R8 | R9 | *
-* ------------------------------------------------- *
-* ------------------------------------------------- *
-* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
-* ------------------------------------------------- *
-* | 32 | 40 | 48 | 56 | *
-* ------------------------------------------------- *
-* | R10 | R11 | R12 | R13 | *
-* ------------------------------------------------- *
-* ------------------------------------------------- *
-* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
-* ------------------------------------------------- *
-* | 64 | 72 | 80 | 88 | *
-* ------------------------------------------------- *
-* | R14/LR | R15 | F1 | F3 | *
-* ------------------------------------------------- *
-* ------------------------------------------------- *
-* | 24 | 25 | 26 | 27 | 28 | 29 | | *
-* ------------------------------------------------- *
-* | 96 | 104 | 112 | 120 | *
-* ------------------------------------------------- *
-* | F5 | F7 | PC | | *
-* ------------------------------------------------- *
-* *****************************************************/
-
-.file "jump_s390x_sysv_elf_gas.S"
+ * ------------------------------------------------- *
+ * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
+ * ------------------------------------------------- *
+ * | 0 | 8 | 16 | 24 | *
+ * ------------------------------------------------- *
+ * | t.fctx | t.data | r2 | r6 | *
+ * ------------------------------------------------- *
+ * ------------------------------------------------- *
+ * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
+ * ------------------------------------------------- *
+ * | 32 | 40 | 48 | 56 | *
+ * ------------------------------------------------- *
+ * | r7 | r8 | r9 | r10 | *
+ * ------------------------------------------------- *
+ * ------------------------------------------------- *
+ * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
+ * ------------------------------------------------- *
+ * | 64 | 72 | 80 | 88 | *
+ * ------------------------------------------------- *
+ * | r11 | r12 | r13 | r14 | *
+ * ------------------------------------------------- *
+ * ------------------------------------------------- *
+ * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
+ * ------------------------------------------------- *
+ * | 96 | 104 | 112 | 120 | *
+ * ------------------------------------------------- *
+ * | f8 | f9 | f10 | f11 | *
+ * ------------------------------------------------- *
+ * ------------------------------------------------- *
+ * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
+ * ------------------------------------------------- *
+ * | 128 | 136 | 144 | 152 | *
+ * ------------------------------------------------- *
+ * | f12 | f13 | f14 | f15 | *
+ * ------------------------------------------------- *
+ * ------------------------------------------------- *
+ * | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
+ * ------------------------------------------------- *
+ * | 160 | 168 | 176 | | *
+ * ------------------------------------------------- *
+ * | fpc | pc | | | *
+ * ------------------------------------------------- *
+ *******************************************************/
+
.text
-.align 4 # According to the sample code in the ELF ABI docs
-.global jump_fcontext
-.type jump_fcontext, @function
-
-#define GR_OFFSET 0
-#define LR_OFFSET 64
-#define SP_OFFSET 72
-#define FP_OFFSET 80
-#define PC_OFFSET 112
-#define L_CTX 120
-#define L_STACKFRAME 120
+.align 8
+.global jump_fcontext
+.type jump_fcontext, @function
+
+#define ARG_OFFSET 0
+#define GR_OFFSET 16
+#define FP_OFFSET 96
+#define FPC_OFFSET 160
+#define PC_OFFSET 168
+#define CONTEXT_SIZE 176
+
+#define REG_SAVE_AREA_SIZE 160
+
+/*
+
+typedef void* fcontext_t;
+
+struct transfer_t {
+ fcontext_t fctx;
+ void * data;
+};
+
+transfer_t jump_fcontext( fcontext_t const to,
+ void * data);
+
+Incoming args
+r2 - Hidden argument to the location where the return transfer_t needs to be returned
+r3 - Context we want to switch to
+r4 - Data pointer
+
+*/
jump_fcontext:
-
- # Reserved the space for stack to store the data of current context
- # before we jump to the new context.
- aghi %r15,-L_STACKFRAME
-
- # save the registers to the stack
- stmg %r6, %r15, GR_OFFSET(%r15)
-
- # save the floating point registers
- std %f0,FP_OFFSET(%r15)
- std %f3,FP_OFFSET+8(%r15)
- std %f5,FP_OFFSET+16(%r15)
- std %f7,FP_OFFSET+24(%r15)
-
- # Save LR as PC
- stg %r14,PC_OFFSET(%r15)
-
- # Store the SP pointing to the old context-data into R0
- lgr %r0,%r15
-
- # Get the SP pointing to the new context-data
- # Note: Since the return type of the jump_fcontext is struct whose
- # size is more than 8. The compiler automatically passes the
- # address of the transfer_t where the data needs to store into R2.
-
- # Hence the first param passed to the jump_fcontext which represent
- # the fctx we want to switch to is present in R3
- # R2 --> Address of the return transfer_t struct
- # R3 --> Context we want to switch to
- # R4 --> Data
- lgr %r15,%r3
-
- # Load the registers with the data present in context-data of the
- # context we are going to switch to
- lmg %r6, %r14, GR_OFFSET(%r15)
-
- # Restore Floating point registers
- ld %f1,FP_OFFSET(%r15)
- ld %f3,FP_OFFSET+8(%r15)
- ld %f5,FP_OFFSET+16(%r15)
- ld %f7,FP_OFFSET+24(%r15)
-
- # Load PC
- lg %r1,PC_OFFSET(%r15)
-
- # Adjust the stack
- aghi %r15,120
-
- # R2 --> Address where the return transfer_t is stored
- # R0 --> FCTX
- # R4 --> DATA
-
- # Store the elements to return transfer_t
- stg %r15, 0(%r2)
- stg %r4, 8(%r2)
-
- # Note: The address in R2 points to the place where the return
- # transfer_t is stored. Since context_function take transfer_t
- # as first parameter. And R2 is the register which holds the
- # first parameter value.
-
- #jump to context
- br %r1
+ .machine "z10"
+ /* Reserve stack space to store the current context. */
+ aghi %r15,-CONTEXT_SIZE
-.size jump_fcontext,.-jump_fcontext
-# Mark that we don't need executable stack.
-.section .note.GNU-stack,"",%progbits
+ /* Save the argument register holding the location of the return value. */
+ stg %r2,GR_OFFSET(%r15)
+
+ /* Save the call-saved general purpose registers. */
+ stmg %r6,%r14,GR_OFFSET+8(%r15)
+
+ /* Save call-saved floating point registers. */
+ std %f8,FP_OFFSET(%r15)
+ std %f9,FP_OFFSET+8(%r15)
+ std %f10,FP_OFFSET+16(%r15)
+ std %f11,FP_OFFSET+24(%r15)
+ std %f12,FP_OFFSET+32(%r15)
+ std %f13,FP_OFFSET+40(%r15)
+ std %f14,FP_OFFSET+48(%r15)
+ std %f15,FP_OFFSET+56(%r15)
+
+ /* Save the return address as current pc. */
+ stg %r14,PC_OFFSET(%r15)
+ /* Save the floating point control register. */
+ stfpc FPC_OFFSET(%r15)
+ /* Backup the stack pointer pointing to the old context-data into r1. */
+ lgr %r1,%r15
+ /* Load the new context pointer as stack pointer. */
+ lgr %r15,%r3
+
+ /* Restore the call-saved GPRs from the new context. */
+ lmg %r6,%r14,GR_OFFSET+8(%r15)
+
+ /* Restore call-saved floating point registers. */
+ ld %f8,FP_OFFSET(%r15)
+ ld %f9,FP_OFFSET+8(%r15)
+ ld %f10,FP_OFFSET+16(%r15)
+ ld %f11,FP_OFFSET+24(%r15)
+ ld %f12,FP_OFFSET+32(%r15)
+ ld %f13,FP_OFFSET+40(%r15)
+ ld %f14,FP_OFFSET+48(%r15)
+ ld %f15,FP_OFFSET+56(%r15)
+
+ /* Load the floating point control register. */
+ lfpc FPC_OFFSET(%r15)
+
+ /* Restore PC - the location where we will jump to at the end. */
+ lg %r5,PC_OFFSET(%r15)
+
+ ltg %r2,GR_OFFSET(%r15)
+ jnz use_return_slot
+
+ /* We restore a make_fcontext context. Use the function
+ argument slot in the context we just saved and allocate the
+ register save area for the target function. */
+ la %r2,ARG_OFFSET(%r1)
+ aghi %r15,-REG_SAVE_AREA_SIZE
+
+use_return_slot:
+ /* Save the two fields in transfer_t. When calling a
+ make_fcontext function this becomes the function argument of
+ the target function, otherwise it will be the return value of
+ jump_fcontext. */
+ stg %r1,0(%r2)
+ stg %r4,8(%r2)
+
+ /* Free the restored context. */
+ aghi %r15,CONTEXT_SIZE
+
+ /* Jump to the PC loaded from the new context. */
+ br %r5
+
+
+.size jump_fcontext,.-jump_fcontext
+.section .note.GNU-stack,"",%progbits
diff --git a/src/asm/make_s390x_sysv_elf_gas.S b/src/asm/make_s390x_sysv_elf_gas.S
index d02856c..e7e2d5f 100644
--- a/libs/context/src/asm/make_s390x_sysv_elf_gas.S
+++ b/libs/context/src/asm/make_s390x_sysv_elf_gas.S
@@ -1,104 +1,108 @@
/*******************************************************
-* *
-* ------------------------------------------------- *
-* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
-* ------------------------------------------------- *
-* | 0 | 8 | 16 | 24 | *
-* ------------------------------------------------- *
-* | R6 | R7 | R8 | R9 | *
-* ------------------------------------------------- *
-* ------------------------------------------------- *
-* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
-* ------------------------------------------------- *
-* | 32 | 40 | 48 | 56 | *
-* ------------------------------------------------- *
-* | R10 | R11 | R12 | R13 | *
-* ------------------------------------------------- *
-* ------------------------------------------------- *
-* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
-* ------------------------------------------------- *
-* | 64 | 72 | 80 | 88 | *
-* ------------------------------------------------- *
-* | R14/LR | R15 | F1 | F3 | *
-* ------------------------------------------------- *
-* ------------------------------------------------- *
-* | 24 | 25 | 26 | 27 | 28 | 29 | | *
-* ------------------------------------------------- *
-* | 96 | 104 | 112 | 120 | *
-* ------------------------------------------------- *
-* | F5 | F7 | PC | | *
-* ------------------------------------------------- *
-* *****************************************************/
-
-.file "make_s390x_sysv_elf_gas.S"
+ * ------------------------------------------------- *
+ * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
+ * ------------------------------------------------- *
+ * | 0 | 8 | 16 | 24 | *
+ * ------------------------------------------------- *
+ * | t.fctx | t.data | r2 | r6 | *
+ * ------------------------------------------------- *
+ * ------------------------------------------------- *
+ * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
+ * ------------------------------------------------- *
+ * | 32 | 40 | 48 | 56 | *
+ * ------------------------------------------------- *
+ * | r7 | r8 | r9 | r10 | *
+ * ------------------------------------------------- *
+ * ------------------------------------------------- *
+ * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
+ * ------------------------------------------------- *
+ * | 64 | 72 | 80 | 88 | *
+ * ------------------------------------------------- *
+ * | r11 | r12 | r13 | r14 | *
+ * ------------------------------------------------- *
+ * ------------------------------------------------- *
+ * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
+ * ------------------------------------------------- *
+ * | 96 | 104 | 112 | 120 | *
+ * ------------------------------------------------- *
+ * | f8 | f9 | f10 | f11 | *
+ * ------------------------------------------------- *
+ * ------------------------------------------------- *
+ * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
+ * ------------------------------------------------- *
+ * | 128 | 136 | 144 | 152 | *
+ * ------------------------------------------------- *
+ * | f12 | f13 | f14 | f15 | *
+ * ------------------------------------------------- *
+ * ------------------------------------------------- *
+ * | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
+ * ------------------------------------------------- *
+ * | 160 | 168 | 176 | | *
+ * ------------------------------------------------- *
+ * | fpc | pc | | | *
+ * ------------------------------------------------- *
+ *******************************************************/
+
.text
-.align 4 # According to the sample code in the ELF ABI docs
-.global make_fcontext
-.type make_fcontext, @function
-
-#define GR_OFFSET 0
-#define LR_OFFSET 64
-#define SP_OFFSET 72
-#define FP_OFFSET 80
-#define PC_OFFSET 112
-#define L_CTX 120
-#define L_STACKFRAME 120
+.align 8
+.global make_fcontext
+.type make_fcontext, @function
-make_fcontext:
+#define ARG_OFFSET 0
+#define GR_OFFSET 16
+#define R14_OFFSET 88
+#define FP_OFFSET 96
+#define FPC_OFFSET 160
+#define PC_OFFSET 168
+#define CONTEXT_SIZE 176
- # make_fcontext takes in 3 arguments
- # arg1 --> The address where the context needs to be made
- # arg2 --> The size of the context
- # arg3 --> The address of the context function
+/*
- # According to the ELF ABI, the register R2 holds the first arg.
- # R2 also acts as the register which holds return value
- # Register R3 holds the second, R4 the third so on.
+fcontext_t make_fcontext( void * sp, std::size_t size, void (* fn)( transfer_t) );
- # Shift the address in R2 to a lower 8 byte boundary
+Create and return a context below SP to call FN.
- # This is done because according to the ELF ABI Doc, the stack needs
- # to be 8 byte aligned.
- # In order to do so, we need to make sure that the address is divisible
- # by 8. We can check this, by checking if the the last 3 bits of the
- # address is zero or not. If not AND it with `-8`.
+Incoming args
+r2 - The stack location where to create the context
+r3 - The size of the context
+r4 - The address of the context function
- # Here we AND the lower 16 bits of the memory address present in the
- # R2 with the bits 1111 1111 1111 1000
- nill %r2,0xfff0
+*/
- # Reserve space for context-data on context-stack.
- # This is done by shifting the SP/address by 112 bytes.
- aghi %r2,-L_CTX
+make_fcontext:
+ .machine "z10"
+ /* Align the stack to an 8 byte boundary. */
+ nill %r2,0xfff0
- # third arg of make_fcontext() == address of the context-function
- # Store the address as a PC to jump in, whenever we call the
- # make_fcontext.
- stg %r4,PC_OFFSET(%r2)
+ /* Allocate stack space for the context. */
+ aghi %r2,-CONTEXT_SIZE
- # Save the address of finish as return-address for context-function
- # This will be entered after context-function return
- # The address of finish will be saved in Link register, this register
- # specifies where we need to jump after the function executes
- # completely.
- larl %r1,finish
- stg %r1,LR_OFFSET(%r2)
+ /* Set the r2 save slot to zero. This indicates jump_fcontext
+ that this is a special context. */
+ mvghi GR_OFFSET(%r2),0
- # Return pointer to context data
- # R14 acts as the link register
- # R2 holds the address of the context stack. When we return from the
- # make_fcontext, R2 is passed back.
- br %r14
+ /* Save the floating point control register. */
+ stfpc FPC_OFFSET(%r2)
- finish:
+ /* Store the address of the target function as new pc. */
+ stg %r4,PC_OFFSET(%r2)
- # In finish tasks, you load the exit code and exit the make_fcontext
- # This is called when the context-function is entirely executed
+ /* Store a pointer to the finish routine as r14. If a function
+ called via context routines just returns that value will be
+ loaded and used as return address. Hence the program will
+ just exit. */
+ larl %r1,finish
+ stg %r1,R14_OFFSET(%r2)
- lghi %r2,0
- brasl %r14,_exit@PLT
+ /* Return as usual with the new context returned in r2. */
+ br %r14
+
+finish:
+ /* In finish tasks, you load the exit code and exit the
+ make_fcontext This is called when the context-function is
+ entirely executed. */
+ lghi %r2,0
+ brasl %r14,_exit@PLT
.size make_fcontext,.-make_fcontext
-# Mark that we don't need executable stack.
.section .note.GNU-stack,"",%progbits
-
diff --git a/src/asm/ontop_s390x_sysv_elf_gas.S b/src/asm/ontop_s390x_sysv_elf_gas.S
index 4488654..709b3d6 100644
--- a/libs/context/src/asm/ontop_s390x_sysv_elf_gas.S
+++ b/libs/context/src/asm/ontop_s390x_sysv_elf_gas.S
@@ -1,112 +1,146 @@
/*******************************************************
-* *
-* ------------------------------------------------- *
-* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
-* ------------------------------------------------- *
-* | 0 | 8 | 16 | 24 | *
-* ------------------------------------------------- *
-* | R6 | R7 | R8 | R9 | *
-* ------------------------------------------------- *
-* ------------------------------------------------- *
-* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
-* ------------------------------------------------- *
-* | 32 | 40 | 48 | 56 | *
-* ------------------------------------------------- *
-* | R10 | R11 | R12 | R13 | *
-* ------------------------------------------------- *
-* ------------------------------------------------- *
-* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
-* ------------------------------------------------- *
-* | 64 | 72 | 80 | 88 | *
-* ------------------------------------------------- *
-* | R14/LR | R15 | F1 | F3 | *
-* ------------------------------------------------- *
-* ------------------------------------------------- *
-* | 24 | 25 | 26 | 27 | 28 | 29 | | *
-* ------------------------------------------------- *
-* | 96 | 104 | 112 | 120 | *
-* ------------------------------------------------- *
-* | F5 | F7 | PC | | *
-* ------------------------------------------------- *
-* *****************************************************/
-
-.file "ontop_s390x_sysv_elf_gas.S"
+ * ------------------------------------------------- *
+ * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
+ * ------------------------------------------------- *
+ * | 0 | 8 | 16 | 24 | *
+ * ------------------------------------------------- *
+ * | t.fctx | t.data | r2 | r6 | *
+ * ------------------------------------------------- *
+ * ------------------------------------------------- *
+ * | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
+ * ------------------------------------------------- *
+ * | 32 | 40 | 48 | 56 | *
+ * ------------------------------------------------- *
+ * | r7 | r8 | r9 | r10 | *
+ * ------------------------------------------------- *
+ * ------------------------------------------------- *
+ * | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
+ * ------------------------------------------------- *
+ * | 64 | 72 | 80 | 88 | *
+ * ------------------------------------------------- *
+ * | r11 | r12 | r13 | r14 | *
+ * ------------------------------------------------- *
+ * ------------------------------------------------- *
+ * | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
+ * ------------------------------------------------- *
+ * | 96 | 104 | 112 | 120 | *
+ * ------------------------------------------------- *
+ * | f8 | f9 | f10 | f11 | *
+ * ------------------------------------------------- *
+ * ------------------------------------------------- *
+ * | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
+ * ------------------------------------------------- *
+ * | 128 | 136 | 144 | 152 | *
+ * ------------------------------------------------- *
+ * | f12 | f13 | f14 | f15 | *
+ * ------------------------------------------------- *
+ * ------------------------------------------------- *
+ * | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
+ * ------------------------------------------------- *
+ * | 160 | 168 | 176 | | *
+ * ------------------------------------------------- *
+ * | fpc | pc | | | *
+ * ------------------------------------------------- *
+ *******************************************************/
+
.text
-.align 4 # According to the sample code in the ELF ABI docs
+.align 8
.global ontop_fcontext
.type ontop_fcontext, @function
-#define GR_OFFSET 0
-#define LR_OFFSET 64
-#define SP_OFFSET 72
-#define FP_OFFSET 80
-#define PC_OFFSET 112
-#define L_CTX 120
+#define ARG_OFFSET 0
+#define GR_OFFSET 16
+#define R14_OFFSET 88
+#define FP_OFFSET 96
+#define FPC_OFFSET 160
+#define PC_OFFSET 168
+#define CONTEXT_SIZE 176
+
+
+/*
+
+typedef void* fcontext_t;
+
+struct transfer_t {
+ fcontext_t fctx;
+ void * data;
+};
+
+transfer_t ontop_fcontext( fcontext_t const to,
+ void * vp,
+ transfer_t (* fn)( transfer_t) );
+
+Incoming args
+r2 - Hidden argument to the location where the return transfer_t needs to be returned
+r3 - Target context
+r4 - Data pointer
+r5 - Function to be executed
+
+This implementation assumes that ontop_fcontext will never be called with target contexts
+created via make_fcontext.
+
+*/
ontop_fcontext:
-
- # Reserved the space for stack to store the data of current context
- # before we jump to the new context.
- aghi %r15,-L_CTX
-
- # save the registers to the stack
- stmg %r6, %r15, GR_OFFSET(%r15)
-
- # save the floating point registers
- std %f0,FP_OFFSET(%r15)
- std %f3,FP_OFFSET+8(%r15)
- std %f5,FP_OFFSET+16(%r15)
- std %f7,FP_OFFSET+24(%r15)
- # Save LR as PC
- stg %r14,PC_OFFSET(%r15)
-
- # Store the SP pointing to the old context-data into R0
- lgr %r0,%r15
-
- # Get the SP pointing to the new context-data
- # Note: Since the return type of the jump_fcontext is struct whose
- # size is more than 8. The compiler automatically passes the
- # address of the transfer_t where the data needs to store into R2.
-
- # Hence the first param passed to the jump_fcontext which represent
- # the fctx we want to switch to is present in R3
- # R2 --> Address of the return transfer_t struct
- # R3 --> Context we want to switch to
- # R4 --> Data
- lgr %r15,%r3
-
- # Load the registers with the data present in context-data of the
- # context we are going to switch to
- lmg %r6,%r15,GR_OFFSET(%r15)
-
- # Restore Floating point registers
- ld %f1,FP_OFFSET(%r15)
- ld %f3,FP_OFFSET+8(%r15)
- ld %f5,FP_OFFSET+16(%r15)
- ld %f7,FP_OFFSET+24(%r15)
-
- # Skip PC
-
- # Adjust the stack
- aghi %r15,L_CTX
-
- # R2 --> Address where the return transfer_t is stored
- # R0 --> FCTX
- # R4 --> DATA
- # R5 --> Context function
-
- # Store the elements to return transfer_t
- stg %r15, 0(%r2)
- stg %r4, 8(%r2)
-
- # Note: The address in R2 points to the place where the return
- # transfer_t is stored. Since context_function take transfer_t
- # as first parameter. And R2 is the register which holds the
- # first parameter value.
-
- #jump to context function
- br %r5
+ /* Reserve stack space to store the current context. */
+ aghi %r15,-CONTEXT_SIZE
+
+ /* Save the argument register holding the location of the return value. */
+ stg %r2,GR_OFFSET(%r15)
+
+ /* Save the call-saved general purpose registers. */
+ stmg %r6,%r14,GR_OFFSET+8(%r15)
+
+ /* Save call-saved floating point registers. */
+ std %f8,FP_OFFSET(%r15)
+ std %f9,FP_OFFSET+8(%r15)
+ std %f10,FP_OFFSET+16(%r15)
+ std %f11,FP_OFFSET+24(%r15)
+ std %f12,FP_OFFSET+32(%r15)
+ std %f13,FP_OFFSET+40(%r15)
+ std %f14,FP_OFFSET+48(%r15)
+ std %f15,FP_OFFSET+56(%r15)
+
+ /* Save the return address as current pc. */
+ stg %r14,PC_OFFSET(%r15)
+
+ /* Save the floating point control register. */
+ stfpc FPC_OFFSET(%r15)
+
+ /* Backup the stack pointer pointing to the old context-data into r1. */
+ lgr %r1,%r15
+
+ /* Load the new context pointer as stack pointer. */
+ lgr %r15,%r3
+
+ /* Restore the call-saved GPRs from the new context. */
+ lmg %r6,%r14,GR_OFFSET+8(%r15)
+
+ /* Restore call-saved floating point registers. */
+ ld %f8,FP_OFFSET(%r15)
+ ld %f9,FP_OFFSET+8(%r15)
+ ld %f10,FP_OFFSET+16(%r15)
+ ld %f11,FP_OFFSET+24(%r15)
+ ld %f12,FP_OFFSET+32(%r15)
+ ld %f13,FP_OFFSET+40(%r15)
+ ld %f14,FP_OFFSET+48(%r15)
+ ld %f15,FP_OFFSET+56(%r15)
+
+ /* Load the floating point control register. */
+ lfpc FPC_OFFSET(%r15)
+
+ /* Store the transfer_t values located in the saved context. */
+ stg %r1,0(%r1) /* transfer_t.fctx = old context */
+ stg %r4,8(%r1) /* transfer_t.data = data */
+
+ /* Set up the arguments for the target function. */
+ lg %r2,GR_OFFSET(%r15)
+ lgr %r3,%r1
+
+ /* Deallocate the context. */
+ aghi %r15,CONTEXT_SIZE
+
+ br %r5
.size ontop_fcontext,.-ontop_fcontext
-# Mark that we don't need executable stack.
.section .note.GNU-stack,"",%progbits
--
2.18.1

View File

@ -1,351 +0,0 @@
From 519786ec38bb5123547071021e4bd7678d7673ad Mon Sep 17 00:00:00 2001
From: Andreas Krebbel <krebbel@linux.ibm.com>
Date: Mon, 23 Mar 2020 09:08:27 +0100
Subject: [PATCH 3/4] Optimize s390x instructions
---
src/asm/jump_s390x_sysv_elf_gas.S | 84 ++++++++++--------------------
src/asm/make_s390x_sysv_elf_gas.S | 27 ++++++----
src/asm/ontop_s390x_sysv_elf_gas.S | 81 +++++++++-------------------
3 files changed, 70 insertions(+), 122 deletions(-)
diff --git a/src/asm/jump_s390x_sysv_elf_gas.S b/src/asm/jump_s390x_sysv_elf_gas.S
index c011d53..b2163cc 100644
--- a/libs/context/src/asm/jump_s390x_sysv_elf_gas.S
+++ b/libs/context/src/asm/jump_s390x_sysv_elf_gas.S
@@ -36,47 +36,34 @@
.global jump_fcontext
.type jump_fcontext, @function
+#define GR_OFFSET 0
+#define LR_OFFSET 64
+#define SP_OFFSET 72
+#define FP_OFFSET 80
+#define PC_OFFSET 112
+#define L_CTX 120
+#define L_STACKFRAME 120
+
jump_fcontext:
# Reserved the space for stack to store the data of current context
# before we jump to the new context.
- lay 15,-120(15)
+ aghi %r15,-L_STACKFRAME
# save the registers to the stack
- stg 6, 0(15) # save R6
- stg 7, 8(15) # save R7
- stg 8, 16(15) # save R8
- stg 9, 24(15) # save R9
- stg 10, 32(15) # save R10
- stg 11, 40(15) # save R11
- stg 12, 48(15) # save R12
- stg 13, 56(15) # save R13
- stg 14, 64(15) # save R14
- stg 15, 72(15) # save R15
+ stmg %r6, %r15, GR_OFFSET(%r15)
# save the floating point registers
- # Load the FPR into R0 then save it to the stack
- # Load F1 into R0
- lgdr 0,1
- stg 0,80(15) # save F1
-
- # Load F3 into R0
- lgdr 0,3
- stg 0,88(15) # save F3
-
- # Load F5 into R0
- lgdr 0,5
- stg 0,96(15) # save F5
-
- # Load F7 into R0
- lgdr 0,7
- stg 0,104(15) # save F7
+ std %f0,FP_OFFSET(%r15)
+ std %f3,FP_OFFSET+8(%r15)
+ std %f5,FP_OFFSET+16(%r15)
+ std %f7,FP_OFFSET+24(%r15)
# Save LR as PC
- stg 14,112(15)
+ stg %r14,PC_OFFSET(%r15)
# Store the SP pointing to the old context-data into R0
- lgr 0,15
+ lgr %r0,%r15
# Get the SP pointing to the new context-data
# Note: Since the return type of the jump_fcontext is struct whose
@@ -88,46 +75,31 @@ jump_fcontext:
# R2 --> Address of the return transfer_t struct
# R3 --> Context we want to switch to
# R4 --> Data
- lgr 15,3
+ lgr %r15,%r3
# Load the registers with the data present in context-data of the
# context we are going to switch to
- lg 6, 0(15) # restore R6
- lg 7, 8(15) # restore R7
- lg 8, 16(15) # restore R8
- lg 9, 24(15) # restore R9
- lg 10, 32(15) # restore R10
- lg 11, 40(15) # restore R11
- lg 12, 48(15) # restore R12
- lg 13, 56(15) # restore R13
- lg 14, 64(15) # restore R14
+ lmg %r6, %r14, GR_OFFSET(%r15)
# Restore Floating point registers
- lg 1,80(15)
- ldgr 1,1 # restore F1
-
- lg 1,88(15)
- ldgr 1,3 # restore F3
-
- lg 1,96(15)
- ldgr 1,5 # restore F5
-
- lg 1,104(15)
- ldgr 1,7 # restore F7
+ ld %f1,FP_OFFSET(%r15)
+ ld %f3,FP_OFFSET+8(%r15)
+ ld %f5,FP_OFFSET+16(%r15)
+ ld %f7,FP_OFFSET+24(%r15)
# Load PC
- lg 1,112(15)
+ lg %r1,PC_OFFSET(%r15)
- # Adjust the stack
- lay 15, 120(15)
+ # Adjust the stack
+ aghi %r15,120
# R2 --> Address where the return transfer_t is stored
# R0 --> FCTX
# R4 --> DATA
# Store the elements to return transfer_t
- stg 15, 0(2)
- stg 4, 8(2)
+ stg %r15, 0(%r2)
+ stg %r4, 8(%r2)
# Note: The address in R2 points to the place where the return
# transfer_t is stored. Since context_function take transfer_t
@@ -135,7 +107,7 @@ jump_fcontext:
# first parameter value.
#jump to context
- br 1
+ br %r1
.size jump_fcontext,.-jump_fcontext
# Mark that we don't need executable stack.
diff --git a/src/asm/make_s390x_sysv_elf_gas.S b/src/asm/make_s390x_sysv_elf_gas.S
index f566533..d02856c 100644
--- a/libs/context/src/asm/make_s390x_sysv_elf_gas.S
+++ b/libs/context/src/asm/make_s390x_sysv_elf_gas.S
@@ -36,6 +36,14 @@
.global make_fcontext
.type make_fcontext, @function
+#define GR_OFFSET 0
+#define LR_OFFSET 64
+#define SP_OFFSET 72
+#define FP_OFFSET 80
+#define PC_OFFSET 112
+#define L_CTX 120
+#define L_STACKFRAME 120
+
make_fcontext:
# make_fcontext takes in 3 arguments
@@ -56,40 +64,39 @@ make_fcontext:
# address is zero or not. If not AND it with `-8`.
# Here we AND the lower 16 bits of the memory address present in the
- # R2 with the bits 1111 1111 1111 1000 which when converted into
- # decimal is 65528
- nill 2,65528
+ # R2 with the bits 1111 1111 1111 1000
+ nill %r2,0xfff0
# Reserve space for context-data on context-stack.
# This is done by shifting the SP/address by 112 bytes.
- lay 2,-120(2)
+ aghi %r2,-L_CTX
# third arg of make_fcontext() == address of the context-function
# Store the address as a PC to jump in, whenever we call the
# make_fcontext.
- stg 4,112(2)
+ stg %r4,PC_OFFSET(%r2)
# Save the address of finish as return-address for context-function
# This will be entered after context-function return
# The address of finish will be saved in Link register, this register
# specifies where we need to jump after the function executes
# completely.
- larl 1,finish
- stg 1,64(2)
+ larl %r1,finish
+ stg %r1,LR_OFFSET(%r2)
# Return pointer to context data
# R14 acts as the link register
# R2 holds the address of the context stack. When we return from the
# make_fcontext, R2 is passed back.
- br 14
+ br %r14
finish:
# In finish tasks, you load the exit code and exit the make_fcontext
# This is called when the context-function is entirely executed
- lghi 2,0
- brasl 14,_exit
+ lghi %r2,0
+ brasl %r14,_exit@PLT
.size make_fcontext,.-make_fcontext
# Mark that we don't need executable stack.
diff --git a/src/asm/ontop_s390x_sysv_elf_gas.S b/src/asm/ontop_s390x_sysv_elf_gas.S
index 7ab2cf5..4488654 100644
--- a/libs/context/src/asm/ontop_s390x_sysv_elf_gas.S
+++ b/libs/context/src/asm/ontop_s390x_sysv_elf_gas.S
@@ -36,47 +36,32 @@
.global ontop_fcontext
.type ontop_fcontext, @function
+#define GR_OFFSET 0
+#define LR_OFFSET 64
+#define SP_OFFSET 72
+#define FP_OFFSET 80
+#define PC_OFFSET 112
+#define L_CTX 120
+
ontop_fcontext:
# Reserved the space for stack to store the data of current context
# before we jump to the new context.
- lay 15,-120(15)
+ aghi %r15,-L_CTX
# save the registers to the stack
- stg 6, 0(15) # save R6
- stg 7, 8(15) # save R7
- stg 8, 16(15) # save R8
- stg 9, 24(15) # save R9
- stg 10, 32(15) # save R10
- stg 11, 40(15) # save R11
- stg 12, 48(15) # save R12
- stg 13, 56(15) # save R13
- stg 14, 64(15) # save R14
- stg 15, 72(15) # save R15
+ stmg %r6, %r15, GR_OFFSET(%r15)
# save the floating point registers
- # Load the FPR into R0 then save it to the stack
- # Load F1 into R0
- lgdr 0,1
- stg 0,80(15) # save F1
-
- # Load F3 into R0
- lgdr 0,3
- stg 0,88(15) # save F3
-
- # Load F5 into R0
- lgdr 0,5
- stg 0,96(15) # save F5
-
- # Load F7 into R0
- lgdr 0,7
- stg 0,104(15) # save F7
-
+ std %f0,FP_OFFSET(%r15)
+ std %f3,FP_OFFSET+8(%r15)
+ std %f5,FP_OFFSET+16(%r15)
+ std %f7,FP_OFFSET+24(%r15)
# Save LR as PC
- stg 14,112(15)
+ stg %r14,PC_OFFSET(%r15)
# Store the SP pointing to the old context-data into R0
- lgr 0,15
+ lgr %r0,%r15
# Get the SP pointing to the new context-data
# Note: Since the return type of the jump_fcontext is struct whose
@@ -88,38 +73,22 @@ ontop_fcontext:
# R2 --> Address of the return transfer_t struct
# R3 --> Context we want to switch to
# R4 --> Data
- lgr 15,3
+ lgr %r15,%r3
# Load the registers with the data present in context-data of the
# context we are going to switch to
- lg 6, 0(15) # restore R6
- lg 7, 8(15) # restore R7
- lg 8, 16(15) # restore R8
- lg 9, 24(15) # restore R9
- lg 10, 32(15) # restore R10
- lg 11, 40(15) # restore R11
- lg 12, 48(15) # restore R12
- lg 13, 56(15) # restore R13
- lg 14, 64(15) # restore R14
- lg 15, 72(15) # restore R15
+ lmg %r6,%r15,GR_OFFSET(%r15)
# Restore Floating point registers
- lg 1,80(15)
- ldgr 1,1 # restore F1
-
- lg 1,88(15)
- ldgr 1,3 # restore F3
-
- lg 1,96(15)
- ldgr 1,5 # restore F5
-
- lg 1,104(15)
- ldgr 1,7 # restore F7
+ ld %f1,FP_OFFSET(%r15)
+ ld %f3,FP_OFFSET+8(%r15)
+ ld %f5,FP_OFFSET+16(%r15)
+ ld %f7,FP_OFFSET+24(%r15)
# Skip PC
# Adjust the stack
- lay 15, 120(15)
+ aghi %r15,L_CTX
# R2 --> Address where the return transfer_t is stored
# R0 --> FCTX
@@ -127,8 +96,8 @@ ontop_fcontext:
# R5 --> Context function
# Store the elements to return transfer_t
- stg 15, 0(2)
- stg 4, 8(2)
+ stg %r15, 0(%r2)
+ stg %r4, 8(%r2)
# Note: The address in R2 points to the place where the return
# transfer_t is stored. Since context_function take transfer_t
@@ -136,7 +105,7 @@ ontop_fcontext:
# first parameter value.
#jump to context function
- br 5
+ br %r5
.size ontop_fcontext,.-ontop_fcontext
# Mark that we don't need executable stack.
--
2.18.1

View File

@ -1,461 +0,0 @@
From ffa7c8b7f8033413d7088edcd9947bf782b9d3fd Mon Sep 17 00:00:00 2001
From: Andreas Krebbel <krebbel@linux.ibm.com>
Date: Mon, 23 Mar 2020 09:04:54 +0100
Subject: [PATCH 1/4] S390x: Add Support for s390x arch
---
build/Jamfile.v2 | 13 +++
build/architecture.jam | 4 +
src/asm/jump_s390x_sysv_elf_gas.S | 145 +++++++++++++++++++++++++++++
src/asm/make_s390x_sysv_elf_gas.S | 97 +++++++++++++++++++
src/asm/ontop_s390x_sysv_elf_gas.S | 143 ++++++++++++++++++++++++++++
5 files changed, 402 insertions(+)
create mode 100644 src/asm/jump_s390x_sysv_elf_gas.S
create mode 100644 src/asm/make_s390x_sysv_elf_gas.S
create mode 100644 src/asm/ontop_s390x_sysv_elf_gas.S
diff --git a/build/Jamfile.v2 b/build/Jamfile.v2
index 719ca91..08f1675 100644
--- a/libs/context/build/Jamfile.v2
+++ b/libs/context/build/Jamfile.v2
@@ -447,6 +447,19 @@ alias asm_sources
<binary-format>mach-o
;
+# S390X
+# S390X/SYSV/ELF
+alias asm_sources
+ : asm/make_s390x_sysv_elf_gas.S
+ asm/jump_s390x_sysv_elf_gas.S
+ asm/ontop_s390x_sysv_elf_gas.S
+ : <abi>sysv
+ <address-model>64
+ <architecture>s390x
+ <binary-format>elf
+ <toolset>gcc
+ ;
+
# X86
# X86/SYSV/ELF
alias asm_sources
diff --git a/build/architecture.jam b/build/architecture.jam
index 81dcb49..f62806d 100644
--- a/libs/context/build/architecture.jam
+++ b/libs/context/build/architecture.jam
@@ -63,6 +63,10 @@ rule deduce-architecture ( properties * )
{
return <architecture>power ;
}
+ else if [ configure.builds /boost/architecture//s390x : $(properties) : s390x ]
+ {
+ return <architecture>s390x ;
+ }
else if [ configure.builds /boost/architecture//sparc : $(properties) : sparc ]
{
return <architecture>sparc ;
diff --git a/src/asm/jump_s390x_sysv_elf_gas.S b/src/asm/jump_s390x_sysv_elf_gas.S
new file mode 100644
index 0000000..c011d53
--- /dev/null
+++ b/libs/context/src/asm/jump_s390x_sysv_elf_gas.S
@@ -0,0 +1,145 @@
+/*******************************************************
+* *
+* ------------------------------------------------- *
+* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
+* ------------------------------------------------- *
+* | 0 | 8 | 16 | 24 | *
+* ------------------------------------------------- *
+* | R6 | R7 | R8 | R9 | *
+* ------------------------------------------------- *
+* ------------------------------------------------- *
+* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
+* ------------------------------------------------- *
+* | 32 | 40 | 48 | 56 | *
+* ------------------------------------------------- *
+* | R10 | R11 | R12 | R13 | *
+* ------------------------------------------------- *
+* ------------------------------------------------- *
+* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
+* ------------------------------------------------- *
+* | 64 | 72 | 80 | 88 | *
+* ------------------------------------------------- *
+* | R14/LR | R15 | F1 | F3 | *
+* ------------------------------------------------- *
+* ------------------------------------------------- *
+* | 24 | 25 | 26 | 27 | 28 | 29 | | *
+* ------------------------------------------------- *
+* | 96 | 104 | 112 | 120 | *
+* ------------------------------------------------- *
+* | F5 | F7 | PC | | *
+* ------------------------------------------------- *
+* *****************************************************/
+
+.file "jump_s390x_sysv_elf_gas.S"
+.text
+.align 4 # According to the sample code in the ELF ABI docs
+.global jump_fcontext
+.type jump_fcontext, @function
+
+jump_fcontext:
+
+ # Reserved the space for stack to store the data of current context
+ # before we jump to the new context.
+ lay 15,-120(15)
+
+ # save the registers to the stack
+ stg 6, 0(15) # save R6
+ stg 7, 8(15) # save R7
+ stg 8, 16(15) # save R8
+ stg 9, 24(15) # save R9
+ stg 10, 32(15) # save R10
+ stg 11, 40(15) # save R11
+ stg 12, 48(15) # save R12
+ stg 13, 56(15) # save R13
+ stg 14, 64(15) # save R14
+ stg 15, 72(15) # save R15
+
+ # save the floating point registers
+ # Load the FPR into R0 then save it to the stack
+ # Load F1 into R0
+ lgdr 0,1
+ stg 0,80(15) # save F1
+
+ # Load F3 into R0
+ lgdr 0,3
+ stg 0,88(15) # save F3
+
+ # Load F5 into R0
+ lgdr 0,5
+ stg 0,96(15) # save F5
+
+ # Load F7 into R0
+ lgdr 0,7
+ stg 0,104(15) # save F7
+
+ # Save LR as PC
+ stg 14,112(15)
+
+ # Store the SP pointing to the old context-data into R0
+ lgr 0,15
+
+ # Get the SP pointing to the new context-data
+ # Note: Since the return type of the jump_fcontext is struct whose
+ # size is more than 8. The compiler automatically passes the
+ # address of the transfer_t where the data needs to store into R2.
+
+ # Hence the first param passed to the jump_fcontext which represent
+ # the fctx we want to switch to is present in R3
+ # R2 --> Address of the return transfer_t struct
+ # R3 --> Context we want to switch to
+ # R4 --> Data
+ lgr 15,3
+
+ # Load the registers with the data present in context-data of the
+ # context we are going to switch to
+ lg 6, 0(15) # restore R6
+ lg 7, 8(15) # restore R7
+ lg 8, 16(15) # restore R8
+ lg 9, 24(15) # restore R9
+ lg 10, 32(15) # restore R10
+ lg 11, 40(15) # restore R11
+ lg 12, 48(15) # restore R12
+ lg 13, 56(15) # restore R13
+ lg 14, 64(15) # restore R14
+
+ # Restore Floating point registers
+ lg 1,80(15)
+ ldgr 1,1 # restore F1
+
+ lg 1,88(15)
+ ldgr 1,3 # restore F3
+
+ lg 1,96(15)
+ ldgr 1,5 # restore F5
+
+ lg 1,104(15)
+ ldgr 1,7 # restore F7
+
+ # Load PC
+ lg 1,112(15)
+
+ # Adjust the stack
+ lay 15, 120(15)
+
+ # R2 --> Address where the return transfer_t is stored
+ # R0 --> FCTX
+ # R4 --> DATA
+
+ # Store the elements to return transfer_t
+ stg 15, 0(2)
+ stg 4, 8(2)
+
+ # Note: The address in R2 points to the place where the return
+ # transfer_t is stored. Since context_function take transfer_t
+ # as first parameter. And R2 is the register which holds the
+ # first parameter value.
+
+ #jump to context
+ br 1
+
+.size jump_fcontext,.-jump_fcontext
+# Mark that we don't need executable stack.
+.section .note.GNU-stack,"",%progbits
+
+
+
diff --git a/src/asm/make_s390x_sysv_elf_gas.S b/src/asm/make_s390x_sysv_elf_gas.S
new file mode 100644
index 0000000..f566533
--- /dev/null
+++ b/libs/context/src/asm/make_s390x_sysv_elf_gas.S
@@ -0,0 +1,97 @@
+/*******************************************************
+* *
+* ------------------------------------------------- *
+* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
+* ------------------------------------------------- *
+* | 0 | 8 | 16 | 24 | *
+* ------------------------------------------------- *
+* | R6 | R7 | R8 | R9 | *
+* ------------------------------------------------- *
+* ------------------------------------------------- *
+* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
+* ------------------------------------------------- *
+* | 32 | 40 | 48 | 56 | *
+* ------------------------------------------------- *
+* | R10 | R11 | R12 | R13 | *
+* ------------------------------------------------- *
+* ------------------------------------------------- *
+* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
+* ------------------------------------------------- *
+* | 64 | 72 | 80 | 88 | *
+* ------------------------------------------------- *
+* | R14/LR | R15 | F1 | F3 | *
+* ------------------------------------------------- *
+* ------------------------------------------------- *
+* | 24 | 25 | 26 | 27 | 28 | 29 | | *
+* ------------------------------------------------- *
+* | 96 | 104 | 112 | 120 | *
+* ------------------------------------------------- *
+* | F5 | F7 | PC | | *
+* ------------------------------------------------- *
+* *****************************************************/
+
+.file "make_s390x_sysv_elf_gas.S"
+.text
+.align 4 # According to the sample code in the ELF ABI docs
+.global make_fcontext
+.type make_fcontext, @function
+
+make_fcontext:
+
+ # make_fcontext takes in 3 arguments
+ # arg1 --> The address where the context needs to be made
+ # arg2 --> The size of the context
+ # arg3 --> The address of the context function
+
+ # According to the ELF ABI, the register R2 holds the first arg.
+ # R2 also acts as the register which holds return value
+ # Register R3 holds the second, R4 the third so on.
+
+ # Shift the address in R2 to a lower 8 byte boundary
+
+ # This is done because according to the ELF ABI Doc, the stack needs
+ # to be 8 byte aligned.
+ # In order to do so, we need to make sure that the address is divisible
+ # by 8. We can check this, by checking if the the last 3 bits of the
+ # address is zero or not. If not AND it with `-8`.
+
+ # Here we AND the lower 16 bits of the memory address present in the
+ # R2 with the bits 1111 1111 1111 1000 which when converted into
+ # decimal is 65528
+ nill 2,65528
+
+ # Reserve space for context-data on context-stack.
+ # This is done by shifting the SP/address by 112 bytes.
+ lay 2,-120(2)
+
+ # third arg of make_fcontext() == address of the context-function
+ # Store the address as a PC to jump in, whenever we call the
+ # make_fcontext.
+ stg 4,112(2)
+
+ # Save the address of finish as return-address for context-function
+ # This will be entered after context-function return
+ # The address of finish will be saved in Link register, this register
+ # specifies where we need to jump after the function executes
+ # completely.
+ larl 1,finish
+ stg 1,64(2)
+
+ # Return pointer to context data
+ # R14 acts as the link register
+ # R2 holds the address of the context stack. When we return from the
+ # make_fcontext, R2 is passed back.
+ br 14
+
+ finish:
+
+ # In finish tasks, you load the exit code and exit the make_fcontext
+ # This is called when the context-function is entirely executed
+
+ lghi 2,0
+ brasl 14,_exit
+
+.size make_fcontext,.-make_fcontext
+# Mark that we don't need executable stack.
+.section .note.GNU-stack,"",%progbits
+
diff --git a/src/asm/ontop_s390x_sysv_elf_gas.S b/src/asm/ontop_s390x_sysv_elf_gas.S
new file mode 100644
index 0000000..7ab2cf5
--- /dev/null
+++ b/libs/context/src/asm/ontop_s390x_sysv_elf_gas.S
@@ -0,0 +1,143 @@
+/*******************************************************
+* *
+* ------------------------------------------------- *
+* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
+* ------------------------------------------------- *
+* | 0 | 8 | 16 | 24 | *
+* ------------------------------------------------- *
+* | R6 | R7 | R8 | R9 | *
+* ------------------------------------------------- *
+* ------------------------------------------------- *
+* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
+* ------------------------------------------------- *
+* | 32 | 40 | 48 | 56 | *
+* ------------------------------------------------- *
+* | R10 | R11 | R12 | R13 | *
+* ------------------------------------------------- *
+* ------------------------------------------------- *
+* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
+* ------------------------------------------------- *
+* | 64 | 72 | 80 | 88 | *
+* ------------------------------------------------- *
+* | R14/LR | R15 | F1 | F3 | *
+* ------------------------------------------------- *
+* ------------------------------------------------- *
+* | 24 | 25 | 26 | 27 | 28 | 29 | | *
+* ------------------------------------------------- *
+* | 96 | 104 | 112 | 120 | *
+* ------------------------------------------------- *
+* | F5 | F7 | PC | | *
+* ------------------------------------------------- *
+* *****************************************************/
+
+.file "ontop_s390x_sysv_elf_gas.S"
+.text
+.align 4 # According to the sample code in the ELF ABI docs
+.global ontop_fcontext
+.type ontop_fcontext, @function
+
+ontop_fcontext:
+
+ # Reserved the space for stack to store the data of current context
+ # before we jump to the new context.
+ lay 15,-120(15)
+
+ # save the registers to the stack
+ stg 6, 0(15) # save R6
+ stg 7, 8(15) # save R7
+ stg 8, 16(15) # save R8
+ stg 9, 24(15) # save R9
+ stg 10, 32(15) # save R10
+ stg 11, 40(15) # save R11
+ stg 12, 48(15) # save R12
+ stg 13, 56(15) # save R13
+ stg 14, 64(15) # save R14
+ stg 15, 72(15) # save R15
+
+ # save the floating point registers
+ # Load the FPR into R0 then save it to the stack
+ # Load F1 into R0
+ lgdr 0,1
+ stg 0,80(15) # save F1
+
+ # Load F3 into R0
+ lgdr 0,3
+ stg 0,88(15) # save F3
+
+ # Load F5 into R0
+ lgdr 0,5
+ stg 0,96(15) # save F5
+
+ # Load F7 into R0
+ lgdr 0,7
+ stg 0,104(15) # save F7
+
+ # Save LR as PC
+ stg 14,112(15)
+
+ # Store the SP pointing to the old context-data into R0
+ lgr 0,15
+
+ # Get the SP pointing to the new context-data
+ # Note: Since the return type of the jump_fcontext is struct whose
+ # size is more than 8. The compiler automatically passes the
+ # address of the transfer_t where the data needs to store into R2.
+
+ # Hence the first param passed to the jump_fcontext which represent
+ # the fctx we want to switch to is present in R3
+ # R2 --> Address of the return transfer_t struct
+ # R3 --> Context we want to switch to
+ # R4 --> Data
+ lgr 15,3
+
+ # Load the registers with the data present in context-data of the
+ # context we are going to switch to
+ lg 6, 0(15) # restore R6
+ lg 7, 8(15) # restore R7
+ lg 8, 16(15) # restore R8
+ lg 9, 24(15) # restore R9
+ lg 10, 32(15) # restore R10
+ lg 11, 40(15) # restore R11
+ lg 12, 48(15) # restore R12
+ lg 13, 56(15) # restore R13
+ lg 14, 64(15) # restore R14
+ lg 15, 72(15) # restore R15
+
+ # Restore Floating point registers
+ lg 1,80(15)
+ ldgr 1,1 # restore F1
+
+ lg 1,88(15)
+ ldgr 1,3 # restore F3
+
+ lg 1,96(15)
+ ldgr 1,5 # restore F5
+
+ lg 1,104(15)
+ ldgr 1,7 # restore F7
+
+ # Skip PC
+
+ # Adjust the stack
+ lay 15, 120(15)
+
+ # R2 --> Address where the return transfer_t is stored
+ # R0 --> FCTX
+ # R4 --> DATA
+ # R5 --> Context function
+
+ # Store the elements to return transfer_t
+ stg 15, 0(2)
+ stg 4, 8(2)
+
+ # Note: The address in R2 points to the place where the return
+ # transfer_t is stored. Since context_function take transfer_t
+ # as first parameter. And R2 is the register which holds the
+ # first parameter value.
+
+ #jump to context function
+ br 5
+
+.size ontop_fcontext,.-ontop_fcontext
+# Mark that we don't need executable stack.
+.section .note.GNU-stack,"",%progbits
--
2.18.1

View File

@ -11,7 +11,7 @@
%bcond_without mpich
%bcond_without openmpi
%ifnarch %{ix86} x86_64 ppc64le aarch64 s390x
%ifnarch %{ix86} x86_64 ppc64le aarch64
%bcond_with context
%else
%bcond_without context
@ -27,7 +27,7 @@ Name: boost
Summary: The free peer-reviewed portable C++ source libraries
Version: 1.66.0
%global version_enc 1_66_0
Release: 9%{?dist}
Release: 10%{?dist}
License: Boost and MIT and Python
%global toplev_dirname %{name}_%{version_enc}
@ -143,13 +143,6 @@ Patch90: boost-1.66-build-memory-leak.patch
# https://github.com/boostorg/graph/pull/84
Patch91: boost-1.66-graph-return-local-addr.patch
# https://bugzilla.redhat.com/show_bug.cgi?id=1782292
Patch92: boost-1.66-support-s390x-arch.patch
Patch93: boost-1.66-docu-update-architectures.patch
Patch94: boost-1.66-optimize-s390x-instructions.patch
Patch95: boost-1.66-fix-fcontext-routines.patch
Patch96: boost-1.66-build-s390x.patch
%bcond_with tests
%bcond_with docs_generated
@ -657,11 +650,6 @@ find ./boost -name '*.hpp' -perm /111 | xargs chmod a-x
%patch89 -p1
%patch90 -p1
%patch91 -p2
%patch92 -p1
%patch93 -p1
%patch94 -p1
%patch95 -p1
%patch96 -p1
%build
PYTHON3_ABIFLAGS=$(/usr/bin/python3-config --abiflags)
@ -1321,6 +1309,9 @@ fi
%{_mandir}/man1/bjam.1*
%changelog
* Tue Aug 04 2020 Jonathan Wakely <jwakely@redhat.com> - 1.66.0-10
- Revert changes for s390x support in Boost.Context
* Fri May 29 2020 Jonathan Wakely <jwakely@redhat.com> - 1.66.0-9
- Actually apply the patches added to the spec in 1.66.0-8