#648: [PATCH] src/gc/system.c compile on HPUX
----------------------+-----------------------------------------------------
 Reporter:  rrauenza  |        Type:  bug   
   Status:  new       |    Priority:  normal
Milestone:            |   Component:  none  
  Version:  1.1.0     |    Severity:  medium
 Keywords:            |        Lang:        
    Patch:            |    Platform:        
----------------------+-----------------------------------------------------
 I'm not sure what to do with this code -- it looked incomplete to begin
 with -- why is getcontext() called and nothing done with it?  And how do I
 test it?

 Anyway, it wouldn't compile on HPUX and I realized the \_\_ia64\_\_
 section must be for a linux on ia64 compile.  So I reimplemented the code
 using inline assembly (I was also getting an undefined symbol for the
 flush_reg_store() function supposedly implemented in assembly somewhere
 else) and a more robust way of getting the bottom of the rsestack.

 I also added couple of headers to gc_private.h for the pstat call and the
 inline assembly.

 The inline assembly won't work under gcc.   HP C defines \_\_HP\_cc if we
 want to have a separate gcc implementation.  (I had to escape the
 underscores here!)


 {{{
 Index: src/gc/system.c
 ===================================================================
 --- src/gc/system.c     (revision 38492)
 +++ src/gc/system.c     (working copy)
 @@ -93,6 +93,34 @@

  #elif defined(__ia64__)

 +
 +#if defined(__hpux)
 +       /* This is untested, but should be functionally equivalent to the
 ia64
 +          code below, which must be IA64 Linux code?  It did not compile
 on HPUX. */
 +        ucontext_t ucp;
 +        void *current_regstore_top;
 +
 +        getcontext(&ucp);
 +        _Asm_flushrs();
 +
 +#if defined(_LP64)
 +        current_regstore_top =
 (void*)(uint64_t)_Asm_mov_from_ar(_AREG_BSP);
 +#else
 +        current_regstore_top =
 (void*)(uint32_t)_Asm_mov_from_ar(_AREG_BSP);
 +#endif
 +
 +        size_t base = 0;
 +        struct pst_vm_status buf;
 +        int i = 0;
 +
 +        while(pstat_getprocvm (&buf, sizeof(buf), 0, i++) == 1) {
 +           if (buf.pst_type == PS_RSESTACK) {
 +              base = (size_t)buf.pst_vaddr;
 +              break;
 +           }
 +        }
 +
 +#else /* is this code for ia64 linux?  This doesn't seem portable.  Is
 this better? http://www.mail-archive.com/[email protected]/msg01299.html
 */
          /* On IA64 systems, we use the function getcontext() to get the
 current
             processor context. This function is located in <ucontext.h>,
 included
             above. */
 @@ -110,8 +138,13 @@
             is separate from the normal system stack. The register backing
             stack starts at memory address 0x80000FFF80000000 and ends at
             current_regstore_top. */
 -        trace_mem_block(interp, 0x80000fff80000000,
 +        size_t base = 0x80000fff80000000;
 +
 +#endif
 +
 +        trace_mem_block(interp, base,
                  (size_t)current_regstore_top);
 +
  #else

  #  ifdef PARROT_HAS_HEADER_SETJMP
 Index: src/gc/gc_private.h
 ===================================================================
 --- src/gc/gc_private.h (revision 38492)
 +++ src/gc/gc_private.h (working copy)
 @@ -29,8 +29,13 @@
  extern void *flush_reg_store(void);
  #  define BACKING_STORE_BASE 0x80000fff80000000

 +#ifdef __hpux
 +#include <sys/pstat.h>
 +#include <ia64/sys/inline.h>
  #endif

 +#endif
 +
  /* We're using this here to add an additional pointer to a PObj without
     having to actually add an entire pointer to every PObj-alike structure
     in Parrot. Astute observers may notice that if the PObj is comprised
 of
 }}}

-- 
Ticket URL: <https://trac.parrot.org/parrot/ticket/648>
Parrot <https://trac.parrot.org/parrot/>
Parrot Development
_______________________________________________
parrot-tickets mailing list
[email protected]
http://lists.parrot.org/mailman/listinfo/parrot-tickets

Reply via email to