On Tue, Sep 03, 2019 at 11:49:05PM -0400, George Koehler wrote:

> On Tue, 27 Aug 2019 21:04:00 +0200
> Otto Moerbeek <[email protected]> wrote:
> 
> > A first shot did not work here, so if you can take a closer look please
> > do. In the meantime I'll try to do so as well after reading up on the ABI.
> 
> I made my own attempt to fix the *ppc32_sysv_elf* assembly code in
> lang/boost, but I made some mistake.  I believe that I set the stack
> pointer %r1 outside MAP_STACK memory.  This causes the machine to
> freeze, as the macppc kernel gets stuck in an infinite loop, repeatedly
> printing a message like
> 
> [jump]57834/195711 sp=9421ffc0 inside ffbee000-fffee000: not MAP_STACK
> 
> where "jump" is the name of the executable.  "jump" is one of the
> programs from WRKSRC/libs/context/example
> 
> To get the kernel messages to appear, I needed to rcctl stop xenodm,
> so xconsole doesn't grab the messages.  Then I ran the executable from
> the boot console ttyC0 (Ctrl-Meta-F1).
> 
> I don't need boost to reproduce this kernel problem; it is enough to
> build a program that sets a bad stack pointer, like
> 
> $ cat crash.c
> #include <stdlib.h>
> int
> main(void) {
>       malloc(16384);
>       __asm__("addi %r1, %r3, 16368");
>       exit(0);
> }
> $ gcc -o crash crash.c
> $ ./crash
> 
> The stuck kernel responds to nothing -- it doesn't answer ping(8) --
> so my only way out is to force off the power, by holding the power
> button of my PowerBook G4.  I need to work around this kernel problem;
> I might upgrade to a newer snapshot (my kernel is from Aug 26), report
> a bug, or try to build a kernel without the MAP_STACK check.

The kernel is supposed to abort programs that have a stack pointer
not pointing to a MAP_STACK flagged reagion. The repeating is indeed a
bug. 

Pleaase post your test program on bugs. This need to be fixed to be
able to do debug the boost problem further.

        -Otto


> 
> The rest of this email is the *broken* diff to devel/boost.  It
> includes your fixes, plus my assembly changes.
> 
> Index: Makefile
> ===================================================================
> RCS file: /cvs/ports/devel/boost/Makefile,v
> retrieving revision 1.89
> diff -u -p -r1.89 Makefile
> --- Makefile  9 Aug 2019 11:25:29 -0000       1.89
> +++ Makefile  4 Sep 2019 02:39:07 -0000
> @@ -17,7 +17,7 @@ EXTRACT_SUFX=       .tar.bz2
>  FIX_EXTRACT_PERMISSIONS =    Yes
>  
>  REVISION-main=       6
> -REVISION-md= 1
> +REVISION-md= 2
>  
>  SO_VERSION=  9.0
>  BOOST_LIBS=  boost_atomic-mt \
> Index: patches/patch-libs_context_build_Jamfile_v2
> ===================================================================
> RCS file: patches/patch-libs_context_build_Jamfile_v2
> diff -N patches/patch-libs_context_build_Jamfile_v2
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-libs_context_build_Jamfile_v2       4 Sep 2019 02:39:07 
> -0000
> @@ -0,0 +1,16 @@
> +$OpenBSD$
> +
> +The second "clang" should be "gcc".
> +
> +Index: libs/context/build/Jamfile.v2
> +--- libs/context/build/Jamfile.v2.orig
> ++++ libs/context/build/Jamfile.v2
> +@@ -326,7 +326,7 @@ alias asm_sources
> +      <address-model>32
> +      <architecture>power
> +      <binary-format>elf
> +-     <toolset>clang
> ++     <toolset>gcc
> +    ;
> + 
> + alias asm_sources
> Index: patches/patch-libs_context_src_asm_jump_ppc32_sysv_elf_gas_S
> ===================================================================
> RCS file: patches/patch-libs_context_src_asm_jump_ppc32_sysv_elf_gas_S
> diff -N patches/patch-libs_context_src_asm_jump_ppc32_sysv_elf_gas_S
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-libs_context_src_asm_jump_ppc32_sysv_elf_gas_S      4 Sep 
> 2019 02:39:07 -0000
> @@ -0,0 +1,66 @@
> +$OpenBSD$
> +
> +ELF systems other than Linux use a different convention to return a
> +small struct like transfer_t.
> +
> +Index: libs/context/src/asm/jump_ppc32_sysv_elf_gas.S
> +--- libs/context/src/asm/jump_ppc32_sysv_elf_gas.S.orig
> ++++ libs/context/src/asm/jump_ppc32_sysv_elf_gas.S
> +@@ -78,6 +78,9 @@
> + .align 2
> + .type jump_fcontext,@function
> + jump_fcontext:
> ++    # Linux: jump_fcontext( hidden transfer_t * %r3, %r4, %r5)
> ++    # Other: transfer_t %r3:%r4 = jump_fcontext( %r3, %r4)
> ++
> +     # reserve space on stack
> +     subi  %r1, %r1, 244
> + 
> +@@ -121,7 +124,9 @@ jump_fcontext:
> +     stw  %r29, 216(%r1)  # save R29
> +     stw  %r30, 220(%r1)  # save R30
> +     stw  %r31, 224(%r1)  # save R31
> ++#ifdef __Linux__
> +     stw  %r3,  228(%r1)  # save hidden
> ++#endif
> + 
> +     # save CR
> +     mfcr  %r0
> +@@ -135,8 +140,12 @@ jump_fcontext:
> +     # store RSP (pointing to context-data) in R6
> +     mr  %r6, %r1
> + 
> +-    # restore RSP (pointing to context-data) from R4
> ++    # restore RSP (pointing to context-data) from R4/R3
> ++#ifdef __Linux__
> +     mr  %r1, %r4
> ++#else
> ++    mr  %r1, %r3
> ++#endif
> + 
> +     lfd  %f14, 0(%r1)  # restore F14
> +     lfd  %f15, 8(%r1)  # restore F15
> +@@ -178,7 +187,9 @@ jump_fcontext:
> +     lwz  %r29, 216(%r1)  # restore R29
> +     lwz  %r30, 220(%r1)  # restore R30
> +     lwz  %r31, 224(%r1)  # restore R31
> ++#ifdef __Linux__
> +     lwz  %r3,  228(%r1)  # restore hidden
> ++#endif
> + 
> +     # restore CR
> +     lwz   %r0, 232(%r1)
> +@@ -195,8 +206,13 @@ jump_fcontext:
> +     addi  %r1, %r1, 244
> + 
> +     # return transfer_t 
> ++#ifdef __Linux__
> +     stw  %r6, 0(%r3)
> +     stw  %r5, 4(%r3)
> ++#else
> ++    mr   %r3, %r5
> ++    #    %r4, %r4
> ++#endif
> + 
> +     # jump to context
> +     bctr
> Index: patches/patch-libs_context_src_asm_make_ppc32_sysv_elf_gas_S
> ===================================================================
> RCS file: patches/patch-libs_context_src_asm_make_ppc32_sysv_elf_gas_S
> diff -N patches/patch-libs_context_src_asm_make_ppc32_sysv_elf_gas_S
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-libs_context_src_asm_make_ppc32_sysv_elf_gas_S      4 Sep 
> 2019 02:39:07 -0000
> @@ -0,0 +1,21 @@
> +$OpenBSD$
> +
> +ELF systems other than Linux use a different convention to return a
> +small struct like transfer_t.
> +
> +Index: libs/context/src/asm/make_ppc32_sysv_elf_gas.S
> +--- libs/context/src/asm/make_ppc32_sysv_elf_gas.S.orig
> ++++ libs/context/src/asm/make_ppc32_sysv_elf_gas.S
> +@@ -99,10 +99,12 @@ make_fcontext:
> +     mffs  %f0  # load FPSCR
> +     stfd  %f0, 144(%r3)  # save FPSCR
> + 
> ++#ifdef __Linux__
> +     # compute address of returned transfer_t
> +     addi  %r0, %r3, 252
> +     mr    %r4, %r0 
> +     stw   %r4, 228(%r3) 
> ++#endif
> + 
> +     # load LR
> +     mflr  %r0
> Index: patches/patch-libs_context_src_asm_ontop_ppc32_sysv_elf_gas_S
> ===================================================================
> RCS file: patches/patch-libs_context_src_asm_ontop_ppc32_sysv_elf_gas_S
> diff -N patches/patch-libs_context_src_asm_ontop_ppc32_sysv_elf_gas_S
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-libs_context_src_asm_ontop_ppc32_sysv_elf_gas_S     4 Sep 
> 2019 02:39:07 -0000
> @@ -0,0 +1,75 @@
> +$OpenBSD$
> +
> +ELF systems other than Linux use a different convention to return a
> +small struct like transfer_t.
> +
> +Index: libs/context/src/asm/ontop_ppc32_sysv_elf_gas.S
> +--- libs/context/src/asm/ontop_ppc32_sysv_elf_gas.S.orig
> ++++ libs/context/src/asm/ontop_ppc32_sysv_elf_gas.S
> +@@ -78,6 +78,9 @@
> + .align 2
> + .type ontop_fcontext,@function
> + ontop_fcontext:
> ++    # Linux: ontop_fcontext( hidden transfer_t * %r3, %r4, %r5, %r6)
> ++    # Other: transfer_t %r3:%r4 = ontop_fcontext( %r3, %r4, %r5)
> ++
> +     # reserve space on stack
> +     subi  %r1, %r1, 244
> + 
> +@@ -121,7 +124,9 @@ ontop_fcontext:
> +     stw  %r29, 216(%r1)  # save R29
> +     stw  %r30, 220(%r1)  # save R30
> +     stw  %r31, 224(%r1)  # save R31
> ++#ifdef __Linux__
> +     stw  %r3,  228(%r1)  # save hidden
> ++#endif
> + 
> +     # save CR
> +     mfcr  %r0
> +@@ -135,8 +140,12 @@ ontop_fcontext:
> +     # store RSP (pointing to context-data) in R7
> +     mr  %r7, %r1
> + 
> +-    # restore RSP (pointing to context-data) from R4
> ++    # restore RSP (pointing to context-data) from R4/R3
> ++#ifdef __Linux__
> +     mr  %r1, %r4
> ++#else
> ++    mr  %r1, %r3
> ++#endif
> + 
> +     lfd  %f14, 0(%r1)  # restore F14
> +     lfd  %f15, 8(%r1)  # restore F15
> +@@ -178,7 +187,9 @@ ontop_fcontext:
> +     lwz  %r29, 216(%r1)  # restore R29
> +     lwz  %r30, 220(%r1)  # restore R30
> +     lwz  %r31, 224(%r1)  # restore R31
> ++#ifdef __Linux__
> +     lwz  %r4,  228(%r1)  # restore hidden
> ++#endif
> + 
> +     # restore CR
> +     lwz   %r0, 232(%r1)
> +@@ -191,12 +202,21 @@ ontop_fcontext:
> +     # adjust stack
> +     addi  %r1, %r1, 244
> + 
> +-    # return transfer_t 
> ++    # return transfer_t
> ++#ifdef __Linux__
> +     stw  %r7, 0(%r4)
> +     stw  %r5, 4(%r4)
> ++#else
> ++    mr   %r3, %r7
> ++    #    %r4, %r4
> ++#endif
> + 
> +     # restore CTR
> ++#ifdef __Linux__
> +     mtctr %r6
> ++#else
> ++    mtctr %r5
> ++#endif
> + 
> +     # jump to ontop-function
> +     bctr

Reply via email to