From: Cyrus H. <ch...@bo...> - 2006-02-22 23:16:51
|
One lingering question from the ppc/gengc port was what to do about reg_CTR? I wasn't sure if we should fix this up or not in scavenge_interrupt_context. I tried to fix this originally, but it didn't work so well. Here's another attempt that looks like it does the right thing, builds and runs and all tests pass. If anyone has a more authoritative answer as to whether or night this is the right thing to do, I'd love to hear it. Oh, and I just guessed on the libc 2.3.1 name for this register for linux. Thanks, Cyrus Index: src/runtime/gencgc.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/gencgc.c,v retrieving revision 1.98 diff -u -r1.98 gencgc.c --- src/runtime/gencgc.c 22 Feb 2006 12:11:27 -0000 1.98 +++ src/runtime/gencgc.c 22 Feb 2006 23:10:51 -0000 @@ -3700,6 +3700,9 @@ #ifdef ARCH_HAS_LINK_REGISTER unsigned long lr_code_offset; #endif +#ifdef ARCH_HAS_COUNT_REGISTER + unsigned long ctr_code_offset; +#endif #ifdef ARCH_HAS_NPC_REGISTER unsigned long npc_code_offset; #endif @@ -3746,6 +3749,12 @@ *os_context_register_addr(context, reg_CODE); #endif +#ifdef ARCH_HAS_COUNT_REGISTER + ctr_code_offset = + *os_context_ctr_addr(context) - + *os_context_register_addr(context, reg_CODE); +#endif + /* Scanvenge all boxed registers in the context. */ for (i = 0; i < (sizeof(boxed_registers) / sizeof(int)); i++) { int index; @@ -3789,6 +3798,15 @@ *os_context_register_addr(context, reg_CODE) + lr_code_offset; #endif +#ifdef ARCH_HAS_COUNT_REGISTER + /* Fix the CTR ditto; important if we're being called from + * an assembly routine that expects to return using btctr, otherwise + * harmless */ + if (from_space_p(*os_context_ctr_addr(context))) + *os_context_ctr_addr(context) = + *os_context_register_addr(context, reg_CODE) + ctr_code_offset; +#endif + #ifdef ARCH_HAS_NPC_REGISTER if (from_space_p(*os_context_npc_addr(context))) *os_context_npc_addr(context) = *os_context_register_addr (context, reg_CODE) + npc_code_offset; Index: src/runtime/os.h =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/os.h,v retrieving revision 1.13 diff -u -r1.13 os.h --- src/runtime/os.h 5 Feb 2006 22:03:00 -0000 1.13 +++ src/runtime/os.h 22 Feb 2006 23:10:51 -0000 @@ -126,6 +126,9 @@ #ifdef ARCH_HAS_LINK_REGISTER os_context_register_t *os_context_lr_addr(os_context_t *context); #endif +#ifdef ARCH_HAS_COUNT_REGISTER +os_context_register_t *os_context_ctr_addr(os_context_t *context); +#endif /* Given a signal context, return the address for storage of the * system stack pointer for that context. */ Index: src/runtime/ppc-arch.h =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/ppc-arch.h,v retrieving revision 1.4 diff -u -r1.4 ppc-arch.h --- src/runtime/ppc-arch.h 14 Jul 2005 15:41:21 -0000 1.4 +++ src/runtime/ppc-arch.h 22 Feb 2006 23:10:51 -0000 @@ -15,5 +15,6 @@ #define ARCH_HAS_LINK_REGISTER +#define ARCH_HAS_COUNT_REGISTER #endif /* _PPC_ARCH_H */ Index: src/runtime/ppc-darwin-os.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/ppc-darwin-os.c,v retrieving revision 1.5 diff -u -r1.5 ppc-darwin-os.c --- src/runtime/ppc-darwin-os.c 5 Feb 2006 22:03:00 -0000 1.5 +++ src/runtime/ppc-darwin-os.c 22 Feb 2006 23:10:51 -0000 @@ -107,6 +107,12 @@ return &context->uc_mcontext->ss.lr; } +os_context_register_t * +os_context_ctr_addr(os_context_t *context) +{ + return &context->uc_mcontext->ss.ctr; +} + void os_flush_icache(os_vm_address_t address, os_vm_size_t length) { Index: src/runtime/ppc-linux-os.c =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/runtime/ppc-linux-os.c,v retrieving revision 1.13 diff -u -r1.13 ppc-linux-os.c --- src/runtime/ppc-linux-os.c 14 Jul 2005 15:41:21 -0000 1.13 +++ src/runtime/ppc-linux-os.c 22 Feb 2006 23:10:51 -0000 @@ -77,6 +77,16 @@ #endif } +os_context_register_t * +os_context_lr_addr(os_context_t *context) +{ +#if defined(GLIBC231_STYLE_UCONTEXT) + return &((context->uc_mcontext.regs)->count); +#elif defined(GLIBC232_STYLE_UCONTEXT) + return &((context->uc_mcontext.uc_regs->gregs)[PT_CTR]); +#endif +} + sigset_t * os_context_sigmask_addr(os_context_t *context) { |