X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fgc-common.c;h=96de1729b7fed83ad965c6c1d2b441ab7fbf970d;hb=71c5af561afd99e3bfe4cb76f492567b50893569;hp=c99afb7122c95029d43d151f7fb08a001481b2b4;hpb=ab9c6bbaaa409e815a1c9696885c9621b429aed6;p=sbcl.git diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index c99afb7..96de172 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -1885,7 +1885,7 @@ scav_lose(lispobj *where, lispobj object) { lose("no scavenge function for object 0x%08x (widetag 0x%x)\n", (unsigned long)object, - widetag_of(object)); + widetag_of(*where)); return 0; /* bogus return value to satisfy static type checking */ } @@ -1904,7 +1904,7 @@ size_lose(lispobj *where) { lose("no size function for object at 0x%08x (widetag 0x%x)\n", (unsigned long)where, - widetag_of(LOW_WORD(where))); + widetag_of(*where)); return 1; /* bogus return value to satisfy static type checking */ } @@ -1916,7 +1916,7 @@ size_lose(lispobj *where) void gc_init_tables(void) { - unsigned long i; + unsigned long i, j; /* Set default value in all slots of scavenge table. FIXME * replace this gnarly sizeof with something based on @@ -1931,11 +1931,14 @@ gc_init_tables(void) */ for (i = 0; i < (1<<(N_WIDETAG_BITS-N_LOWTAG_BITS)); i++) { - scavtab[EVEN_FIXNUM_LOWTAG|(i<= 0) { \ + ACCESS_INTERIOR_POINTER_##name = \ + (*os_context_register_addr(context, \ + name##_register_pair) \ + & ~LOWTAG_MASK) \ + + name##_offset; \ + } \ + } while (0) + + static void -scavenge_interrupt_context(os_context_t *context) +pair_interior_pointer(os_context_t *context, unsigned long pointer, + unsigned long *saved_offset, int *register_pair) { int i; -#ifdef reg_LIP - unsigned long lip; - unsigned long lip_offset; - int lip_register_pair; -#endif - unsigned long pc_code_offset; - -#ifdef ARCH_HAS_LINK_REGISTER - unsigned long lr_code_offset; -#endif -#ifdef ARCH_HAS_NPC_REGISTER - unsigned long npc_code_offset; -#endif -#ifdef DEBUG_SCAVENGE_VERBOSE - fprintf(stderr, "Scavenging interrupt context at 0x%x\n",context); -#endif - -#ifdef reg_LIP - /* Find the LIP's register pair and calculate its offset */ - /* before we scavenge the context. */ - /* * I (RLT) think this is trying to find the boxed register that is * closest to the LIP address, without going past it. Usually, it's * reg_CODE or reg_LRA. But sometimes, nothing can be found. */ - lip = *os_context_register_addr(context, reg_LIP); /* 0x7FFFFFFF on 32-bit platforms; 0x7FFFFFFFFFFFFFFF on 64-bit platforms */ - lip_offset = (((unsigned long)1) << (N_WORD_BITS - 1)) - 1; - lip_register_pair = -1; - for (i = 0; i < (int)(sizeof(boxed_registers) / sizeof(int)); i++) { + *saved_offset = (((unsigned long)1) << (N_WORD_BITS - 1)) - 1; + *register_pair = -1; + for (i = 0; i < (sizeof(boxed_registers) / sizeof(int)); i++) { unsigned long reg; - unsigned long offset; + long offset; int index; index = boxed_registers[i]; reg = *os_context_register_addr(context, index); - /* would be using PTR if not for integer length issues */ - if ((reg & ~((1L<uc_mcontext.gregs[2]. But gregs[2] is REG_nPC. Is - * that what we really want? My guess is that that is not what we - * want, so if lip_register_pair is -1, we don't touch reg_LIP at - * all. But maybe it doesn't really matter if LIP is trashed? - */ - if (lip_register_pair >= 0) { - *os_context_register_addr(context, reg_LIP) = - *os_context_register_addr(context, lip_register_pair) - + lip_offset; - } -#endif /* reg_LIP */ - - /* Fix the PC if it was in from space */ - if (from_space_p(*os_context_pc_addr(context))) - *os_context_pc_addr(context) = - *os_context_register_addr(context, reg_CODE) + pc_code_offset; - + FIXUP_INTERIOR_POINTER(lip); +#endif #ifdef ARCH_HAS_LINK_REGISTER - /* Fix the LR ditto; important if we're being called from - * an assembly routine that expects to return using blr, otherwise - * harmless */ - if (from_space_p(*os_context_lr_addr(context))) - *os_context_lr_addr(context) = - *os_context_register_addr(context, reg_CODE) + lr_code_offset; + FIXUP_INTERIOR_POINTER(lr); #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; -#endif /* ARCH_HAS_NPC_REGISTER */ + FIXUP_INTERIOR_POINTER(npc); +#endif +#ifdef LISP_FEATURE_PPC + FIXUP_INTERIOR_POINTER(ctr); +#endif } -void scavenge_interrupt_contexts(struct thread *th) +void +scavenge_interrupt_contexts(struct thread *th) { int i, index; os_context_t *context; index = fixnum_value(SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX,th)); -#ifdef DEBUG_SCAVENGE_VERBOSE - fprintf(stderr, "%d interrupt contexts to scan\n",index); +#if defined(DEBUG_PRINT_CONTEXT_INDEX) + printf("Number of active contexts: %d\n", index); #endif for (i = 0; i < index; i++) {