From bab7ef8ca969e8c598729063f919634ad7938680 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jan=20R=C4=99korajski?= Date: Sun, 28 Dec 2014 19:11:55 +0000 Subject: [PATCH] - context and coroutine do not build on x32 (added TODO) --- boost-x32-context.patch | 85 +++++++++++++++++++++++++++++++++++++++++ boost.spec | 25 +++++++++++- 2 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 boost-x32-context.patch diff --git a/boost-x32-context.patch b/boost-x32-context.patch new file mode 100644 index 0000000..f3f69c8 --- /dev/null +++ b/boost-x32-context.patch @@ -0,0 +1,85 @@ +Index: libs/context/src/asm/jump_x86_64_sysv_elf_gas.S +=================================================================== +--- libs/context/src/asm/jump_x86_64_sysv_elf_gas.S (revision 86799) ++++ libs/context/src/asm/jump_x86_64_sysv_elf_gas.S (working copy) +@@ -38,6 +38,12 @@ + * * + * **************************************************************************************/ + ++#ifdef __ILP32__ ++# define SIZEOF_FCONTEXT_T 0x50 ++#else ++# define SIZEOF_FCONTEXT_T 0x58 ++#endif ++ + .text + .globl jump_fcontext + .type jump_fcontext,@function +@@ -53,11 +59,11 @@ jump_fcontext: + cmp $0, %rcx + je 1f + +- stmxcsr 0x50(%rdi) /* save MMX control and status word */ +- fnstcw 0x54(%rdi) /* save x87 control word */ ++ stmxcsr (SIZEOF_FCONTEXT_T - 8)(%rdi) /* save MMX control and status word */ ++ fnstcw (SIZEOF_FCONTEXT_T - 4)(%rdi) /* save x87 control word */ + +- ldmxcsr 0x50(%rsi) /* restore MMX control and status word */ +- fldcw 0x54(%rsi) /* restore x87 control word */ ++ ldmxcsr (SIZEOF_FCONTEXT_T - 8)(%rsi) /* restore MMX control and status word */ ++ fldcw (SIZEOF_FCONTEXT_T - 4)(%rsi) /* restore x87 control word */ + 1: + + leaq 0x8(%rsp), %rax /* exclude the return address and save as stack pointer */ +Index: libs/context/src/asm/make_x86_64_sysv_elf_gas.S +=================================================================== +--- libs/context/src/asm/make_x86_64_sysv_elf_gas.S (revision 86799) ++++ libs/context/src/asm/make_x86_64_sysv_elf_gas.S (working copy) +@@ -38,26 +38,43 @@ + * * + * **************************************************************************************/ + ++#ifdef __ILP32__ ++# define SIZEOF_FCONTEXT_T 0x50 ++#else ++# define SIZEOF_FCONTEXT_T 0x58 ++#endif ++ + .text + .globl make_fcontext + .type make_fcontext,@function + .align 16 +-make_fcontext: +- leaq -0x58(%rdi), %rax /* reserve space for fcontext_t at top of context stack */ ++make_fcontext: // (rax, rsi, rdx) ++ leaq -SIZEOF_FCONTEXT_T(%rdi), %rax /* reserve space for fcontext_t at top of context stack */ + + /* shift address in RAX to lower 16 byte boundary */ + /* == pointer to fcontext_t and address of context stack */ + andq $-16, %rax + ++#ifdef __ILP32__ ++ mov %edi, 0x40(%rax) /* save address of context stack pointer (base) in fcontext_t */ ++ mov %esi, 0x44(%rax) /* save context stack size in fcontext_t */ ++ mov %edx, 0x38(%rax) /* save address of context function in fcontext_t */ ++#else + movq %rdi, 0x40(%rax) /* save address of context stack pointer (base) in fcontext_t */ + movq %rsi, 0x48(%rax) /* save context stack size in fcontext_t */ + movq %rdx, 0x38(%rax) /* save address of context function in fcontext_t */ ++#endif + +- stmxcsr 0x50(%rax) /* save MMX control and status word */ +- fnstcw 0x54(%rax) /* save x87 control word */ ++ stmxcsr (SIZEOF_FCONTEXT_T - 8)(%rax) /* save MMX control and status word */ ++ fnstcw (SIZEOF_FCONTEXT_T - 4)(%rax) /* save x87 control word */ + ++#ifdef __ILP32__ ++ leaq -0x10(%rax), %rdx /* reserve space for the return address on context stack, (RSP - 0x8) % 16 == 0 */ ++ mov %edx, 0x30(%rax) /* save address in RDX as stack pointer for context function */ ++#else + leaq -0x8(%rax), %rdx /* reserve space for the return address on context stack, (RSP - 0x8) % 16 == 0 */ + movq %rdx, 0x30(%rax) /* save address in RDX as stack pointer for context function */ ++#endif + + leaq finish(%rip), %rcx /* compute abs address of label finish */ + movq %rcx, (%rdx) /* save address of finish as return address for context function */ diff --git a/boost.spec b/boost.spec index 9f33904..b92ee57 100644 --- a/boost.spec +++ b/boost.spec @@ -2,6 +2,7 @@ # TODO: # - think about building MPI. # - split shared libs from core package into -iostreams/-serialization. +# - fix building context and corouting on x32 (patch1) # # Conditional build: %bcond_without python # without boost-python support @@ -17,6 +18,7 @@ Group: Libraries Source0: http://downloads.sourceforge.net/boost/%{name}_%{fver}.tar.bz2 # Source0-md5: a744cf167b05d72335f27c88115f211d Patch0: %{name}-link.patch +Patch1: %{name}-x32-context.patch # FC Patches: # https://svn.boost.org/trac/boost/ticket/5637 Patch203: %{name}-1.54.0-mpl-print.patch @@ -395,6 +397,7 @@ Dokumentacja dla biblioteki Boost C++. %prep %setup -q -n %{name}_%{fver} %patch0 -p1 +#patch1 -p0 %patch203 -p0 %patch211 -p1 @@ -433,10 +436,20 @@ PYTHON_VERSION= EXPAT_INCLUDE=%{_includedir} \ EXPAT_LIBPATH=%{_libdir} \ ICU_PATH=%{_prefix} \ -./bootstrap.sh --prefix=%{_prefix} +./bootstrap.sh \ + --prefix=%{_prefix} + ./b2 \ +%ifarch x32 + --without-context \ + --without-coroutine \ +%endif -d2 --toolset=gcc \ - variant=release debug-symbols=on inlining=on link=static,shared threading=multi + variant=release \ + debug-symbols=on \ + inlining=on \ + link=static,shared \ + threading=multi %install rm -rf $RPM_BUILD_ROOT @@ -550,7 +563,9 @@ rm -rf $RPM_BUILD_ROOT %defattr(644,root,root,755) %attr(755,root,root) %{_libdir}/libboost_atomic.so.*.*.* %attr(755,root,root) %{_libdir}/libboost_container.so.*.*.* +%ifnarch x32 %attr(755,root,root) %{_libdir}/libboost_coroutine.so.*.*.* +%endif %attr(755,root,root) %{_libdir}/libboost_iostreams.so.*.*.* %attr(755,root,root) %{_libdir}/libboost_math_*.so.*.*.* %attr(755,root,root) %{_libdir}/libboost_random.so.*.*.* @@ -562,8 +577,10 @@ rm -rf $RPM_BUILD_ROOT %attr(755,root,root) %{_libdir}/libboost_atomic.so %attr(755,root,root) %{_libdir}/libboost_chrono.so %attr(755,root,root) %{_libdir}/libboost_container.so +%ifnarch x32 %attr(755,root,root) %{_libdir}/libboost_context.so %attr(755,root,root) %{_libdir}/libboost_coroutine.so +%endif %attr(755,root,root) %{_libdir}/libboost_date_time.so %attr(755,root,root) %{_libdir}/libboost_filesystem.so %attr(755,root,root) %{_libdir}/libboost_graph.so @@ -593,8 +610,10 @@ rm -rf $RPM_BUILD_ROOT %{_libdir}/libboost_atomic.a %{_libdir}/libboost_chrono.a %{_libdir}/libboost_container.a +%ifnarch x32 %{_libdir}/libboost_context.a %{_libdir}/libboost_coroutine.a +%endif %{_libdir}/libboost_date_time.a %{_libdir}/libboost_exception.a %{_libdir}/libboost_filesystem.a @@ -638,9 +657,11 @@ rm -rf $RPM_BUILD_ROOT %defattr(644,root,root,755) %attr(755,root,root) %{_libdir}/libboost_chrono.so.*.*.* +%ifnarch x32 %files context %defattr(644,root,root,755) %attr(755,root,root) %{_libdir}/libboost_context.so.*.*.* +%endif %files date_time %defattr(644,root,root,755) -- 2.43.0