Ticket #648 (closed bug: fixed)
[PATCH] src/gc/system.c compile on HPUX
Reported by: | rrauenza | Owned by: | Infinoid |
---|---|---|---|
Priority: | normal | Milestone: | |
Component: | none | Version: | 1.1.0 |
Severity: | medium | Keywords: | |
Cc: | Language: | ||
Patch status: | applied | Platform: |
Description
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/guile-devel@gnu.org/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