==================================================== OPEN GENGC BUGS ==================================================== 7. OPEN. This isn't really a GENGC bug, but, for completeness, we should fix ppc-vm.lisp so that the fixup can take an offset a la x86-64. This was done in generic.lisp, but needs corresponding changes in pcc-vm.lisp ==================================================== CLOSED GENGC BUGS ==================================================== 1. FIXED. Occasional inline allocation failures? I'm guessing that's what we're seeing here. Certain operations take a long time and involve a lot kernel_task CPU activity. It's possible that this is just I/O, but I don't think so. This seems to have gotten worse recently. Changing the allocation macro to not use a fixup with an offset fixes this. 2. FIXED. Purify fails. Running the core-test.sh test causes a BUS ERROR. The problem was that calling alien-callbacks loaded from a saved core was failing. See note in c-call.lisp/alien-assembler-callback-wrapper for details. 3. FIXED! cons-madly test (gc.impure.lisp) fails and drops into LDB. My hunch is that this is related to the allocation/moving of large objects in gencgc.c. 4. FIXED. PPC/Linux gencgc fails with a BUS ERROR (SIGSEGV maybe?) after the first GC. 5. FIXED. sb-md5 and cltl2 often (but not always) fail to build out of contrib. Latest gencgc fixes seem to have fixed this. Keep an eye out for it though. I think the allocation macro fixup changes fixed this one. 6. FIXED. finalize-test.sh fails. finalizers weren't being run properly. removed #ifdef LISP_FEATURE_X86[_64] in gencgc.c/scav_weak_pointer and now things seem to work. 8. NOT A BUG. In insts.lisp, we do a lis/addi to load the address of a fixup. This should really be lis/ori, but the ori instruction doesn't deal with fixups. This should be fixed, but doesn't seem to be rearing its ugly head at the moment. This is wrong. The fixup deals with adjusting the high word such that the the lis/addi sequence functions correctly here. 9. FIXED. x86-64 builds busted. they build ok, but then can't do a full rebuild of themselves. They die after the first purify. GENCGC_RUNS_1 works, GENCGC_CANDIDATE_1 breaks. Wrongly #ifdef'ed out an os_zero call in purify.c. Restoring this fixes things. ==================================================== CVS tag: ALLOCATION_CLEANUP_1 ==================================================== File: src/assembly/ppc/arith.lisp ================ * Fixed allocation for CONS-BIGNUM. Note that we now always cons 2 words instead of trying to fit into 1 word first File: src/compiler/ppc/alloc.lisp ================ * Fixed vop for list-or-list*. Uses the allocation macro instead of setting alloc-tn directly. Note that the (relatively) recent dynamic extent support should still work here. In this case, we directly allocate this by adjusting csp-tn. * Fixed vop for make-closure. See note above. Dynamic extent should still work. * TODO: [FUTURE] add stack allocation to the allocate macro. File: src/compiler/ppc/macros.lisp * Added allocation macro. Note that this is using king nato's version and may not do everything we need to do for GENCGC. * with-fixed-allocation changes. Now takes a keyword argument (:lowtag other-pointer-lowtag). Removed restriction on having a non-empty body as we can use this macro just for allocating data. Now uses the allocation macro instead of adjusting alloc-tn directly. * Removed the :extra keyword argument from pseudo-atomic. Don't use this for allocating memory anymore! Removed the corresponding gensym and let. This is still King Nato's pseudo-atomic. At some point we should better understand the differences between rtoy's version and king nato's version. File: move.lisp =============== * move-from-unsigned vop now uses with-fixed allocation instead of setting alloc-tn directly. We always allocate two words now instead of trying to get away with one first. ==================================================== CVS tag: ALLOCATION_CLEANUP_2 ==================================================== File: src/assembly/ppc/array.lisp ============================= * Fixed allocate-vector assembly-routine to use allocate macro instead of adjusting alloc-tn directly. File: src/compiler/ppc/array.lisp ============================= * make-array-header vop now uses allocation macro instead of setting alloc-tn directly File: src/compiler/ppc/call.lisp ============================ * listify-rest-args now uses the allocation macro instead of adjusting alloc-tn directly. For dynamic extent args, we still allocate directly by adjusting csp-tn. We should implement stack allocation in the allocation macro. ==================================================== CVS tag: BUILD_CLEANUP_1 ==================================================== File: src/code/ppc-vm.lisp * Add flag disabling scavenging of read-only space (to be used later) File: src/compiler/ppc/parms.lisp * Add gencgc-page-bytes variable. Currently 4096. Bump to 32k later. * Added dynamic-space-start and dynamic-space-end constants for linux and darwin #!+gencgc. Conditionalized dynamic-0 and dynamic-1 constants for#!-gencgc. * Added *restart-lisp-function*, *current-region-end-addr* and *scavenge-read-only-space* static-symbols. File: src/runtime/Config.ppc-darwin * Make GC_SRC shell commands that search for LISP_FEATURE_GENCGC in genesis/config.h and set GC_SRC to gencgc.c or cheneygc.c as appropriate File: src/runtime/Config.ppc-linux * Make GC_SRC shell commands that search for LISP_FEATURE_GENCGC in genesis/config.h and set GC_SRC to gencgc.c or cheneygc.c as appropriate ==================================================== CVS tag: GENCGC_PREP_1 ==================================================== File: src/runtime/arch.h * Moved extern fpu_save and fpu_restore defintions here File: src/runtime/cheneygc.c * removed static scavenge_interrupt_contexts prototype File: gc-common.c * Instead of #ifndef LISP_FEATURE_SPARC for scav_fdefn, use defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64) * Instead of #ifndef LISP_FEATURE_GENCGC for scav_fun_header and scav_return_pc_header scavtab entries, use #if !defined(LISP_FEATURE_X86) && !defined(LISP_FEATURE_X86_64) * set scav_tab[FDEFN_WIDETAG] to scav_fdefn on X86 and X86_64 and scav_boxed for everything else. File: gc-internal.h * added prototype for scavenge_interrupt_contexts ==================================================== CVS tag: GENCGC_PREP_2 ==================================================== File: gc-common.c * Reverted gc-common.c changes from GENCGC_PREP_1. The problem was that I was mimicing rtoy's FDEFN changes for PPC, superficially, without changing the underlying code. He changed the way fdefn's work on ppc to look more like they do on SPARC. I think we can get away with leaving this alone, at least for now. File: ppc-arch.c * Moved PSEUDO_ATOMIC_INTERRUPTED_BIAS to ppc-arch.h File: ppc-arch.h * Moved PSEUDO_ATOMIC_INTERRUPTED_BIAS to ppc-arch.h File: ppc-assem.S * Added do_pending_interrupt, fpu_save and fpu_restore. File: ppc-darwin-spacelist.h * Adjust spaces for #+gencgc and #-gencgc File: purify.c * #ifdef LISP_FEATURE_GENCGC -> X86{_64} File: gencgc.c * Remove fpu_save and fpu_restore prototypes ==================================================== CVS tag: GENCGC_PREP_3 ==================================================== File: src/runtime/gc.h * Added xxx_pseudo_atomic_xxx and xxx_alloc_pointer #defines File: src/runtime/alloc.c * Start using xxx_pseudo_atomic_xxx ==================================================== CVS tag: GENCGC_PREP_4 ==================================================== File: src/runtime/globals.c * Cleaning up GENCGC/X86[_64] ifdefs File: src/runtime/globals.h * Cleaning up GENCGC/X86[_64] ifdefs File: src/runtime/parse.c * Use get_alloc_pointer instead of arch specific ways of doing so ==================================================== CVS tag: PSEUDO_ATOMIC_REG_ALLOC ==================================================== File: compiler/ppc/macros.lisp * Pseudo-atomic now uses bits 3 and 1 of reg_ALLOC insetead of using reg_NL3 for the interrutped part. File: src/runtime/gc.h * Pseudo-atomic now uses bits 3 and 1 of reg_ALLOC insetead of using reg_NL3 for the interrutped part. File: src/runtime/ppc-arch.c * Pseudo-atomic now uses bits 3 and 1 of reg_ALLOC insetead of using reg_NL3 for the interrutped part. * Brought the allocation trap stuff along, but this is untested. File: src/runtime/ppc-assem.S * Pseudo-atomic now uses bits 3 and 1 of reg_ALLOC insetead of using reg_NL3 for the interrutped part. ==================================================== CVS tag: GENCGC_BUILDS_1 ==================================================== File: src/runtime/gencgc.c * The big kahuna... * Ok, lots of little changes to get things working. Had to fix up the allocation macro, the uses of it, etc... ==================================================== CVS tag: GENCGC_RUNS_1 ==================================================== * Ok, it runs now, but we seem to trap on every allocation. Trying to figure out why. Works -gencgc/ppc and works on x86-64. ==================================================== CVS tag: GENCGC_RUNS_INLINE_ALLOCATION_1 ==================================================== File: src/compiler/generic/genesis.lisp * do-cold-fixup now looks at the SI portion of PPC instructions in :ha and :l fixups and uses these as offsets in calculating the address. File: src/compiler/ppc/insts.lisp * in define-d-si-instruction we now stick the fikup-offset into the si portion of the opcode instead of always using 0. This allows us to pass this information on to do-cold-fixup in genesis.lisp. File: src/compiler/ppc/macros.lisp * gencgc allocation macro now uses fixups to boxed_region.free_pointer and boxed_region.end_addr to get these values instead of pulling them out of registers. This removes the need to keep these registers in sync with the C struct values. And it is more like what we will eventually need to do if we ever do PPC threads. File: src/runtime/gc.h * removed set_current_region_free, get_current_free, and set_current_region_end. File: src/runtime/gencgc.c * In gc_alloc_new_region, use page_address(last_page) + PAGE_BYTES to get the end_addr instead of start_addr + bytes_found. * removed set_current_region_end calls. File: src/runtime/ppc-arch.c * include gencgc-alloc-region.h * look back 3 instructions instead of 2 to match the new allocation macro * added end_addr variable for debugging. * no longer adjust dynamic_space_free_pointer ==================================================== CVS TAG: GENCGC_MOSTLY_WORKING_1 ==================================================== * Making purify and loading callbacks from cores work for ppc/gengc. * Remove *scavenge-read-only-space* File: src/compiler/ppc/c-call.lisp * Fixed alien-callback-assembler-wrapper to get the address for enter-alien-callback from the symbol-value slot of SB-ALIEN::*ENTER-ALIEN-CALLBACK* to ensure that this works even if the GC moves ENTER-ALIEN-CALLBACK. Thanks to JES for the suggestion on the fix. callback.impure.lisp now passes. File: src/runtime/gencgc.c * Removed #ifdef LISP_FEATURE_X86[_64] in gengcc.c/scav_weak_pointer. Definitely some OOAO violations here, but now finalize.test.sh passes. ==================================================== CVS TAG: GENCGC_MOSTLY_WORKING_2 ==================================================== * New allocation macro. Seems to make things better. ==================================================== CVS TAG: GENCGC_MOSTLY_WORKING_3 ==================================================== * Trying to undo damage done along the way. Lots of little changes. Please document these in the morning. ==================================================== CVS TAG: This stuff never got tagged. I backed it out before I tagged it. ==================================================== * Added ARCH_HAS_CTR_REGISTER and friends. Now we fixup the CTR in scavenge_interrupt_context. Whoops. Backed this out as it seemed to be messing things up. ==================================================== CVS TAG: GENCGC_ALL_TESTS_PASSED ==================================================== File: src/runtime/gc.h * set_alloc_pointer now just sets the high bits and leaves the p-a flags alone. File: src/runtime/interrupt.c * interrupt_handle_pending clears the p-a-interrupted flag * undo_fake_foreign_function_call doesn't zap the p-a bits in reg_ALLOC File: src/runtime/ppc-arch.c * handle_allocation_trap doesn't zap the p-a bits in reg_ALLOC ==================================================== CVS TAG: GENCGC_ALL_0_9_9_27_MERGE ==================================================== * Forward ported to 0.9.9.27 ==================================================== CVS TAG: GENCGC_CANDIDATE_1 ==================================================== File: src/runtime/ppc-assem.S * Massive props to Xophe for finding this. For a long time now, we had been using lis, addi to load the address of NIL. Turns out this fails when the high bit of the low word is set. I have no idea how we missed this for so long, but changing the instruction sequence to lis, ori fixes the problem of linux/ppc gencgc not working. File: src/runtime/ppc-arch.c * Turn off the address checking in arch_get_bad_addr. The pointer arithmetic was wrong and was causing problems. We don't really need this check (right?). File: src/code/toplevel.lisp * Fix the way we compute the end-of-stack in scrub-control-stack. File: src/runtime/bsd-os.c * Use arch_get_bad_addr to get fault address ==================================================== CVS TAG: GENCGC_SBCL_0_9_9_34_MERGE ==================================================== * Forward ported to 0.9.9.34 ==================================================== CVS TAG: GENCGC_CANDIDATE_2 ==================================================== File: src/compiler/ppc/macros.lisp * cleaned up comments for allocation macro * removed commented code that used to throw an error for empty allocation macro body. Now we call this for its side effect of allocating memory File: src/compiler/ppc/parms.lisp * gencgc-page-bytes -> 4096 * added pseudo-atomic-interrupted-flag and pseudo-atomic-flag File: src/runtime/alloc.c * clr_pseudo_atomic -> clear_pseudo_atomic File: src/runtime/gc.h * clr_pseudo_atomic -> clear_pseudo_atomic * PSEUDO_ATOMIC_[INTERRUPTED_]VALUE -> flag_PseudoAtomic[Interrupted] File: src/runtime/interrupt.c * clr_pseudo_atomic -> clear_pseudo_atomic File: src/runtime/ppc-arch.c * whitespace fix File: package-data-list.lisp-expr * added PSEUDO-ATOMIC-INTERRUPTED-FLAG and PSEUDO-ATOMIC-FLAG to sb-vm exports ==================================================== CVS TAG: GENCGC_SBCL_0_9_9_35_MERGE ==================================================== * Forward parted to 0.9.9.35 ==================================================== CVS TAG: GENCGC_CANDIDATE_3 ==================================================== NOTE: This includes the fix for the problem where x86-64 couldn't build itself. I erroneously removed an os_zero in purify.c. This has been restored. File: src/runtime/purify.c * remove ifndef GENCGC check around os_zero call * undo recent change to add back in a bit setting the dynamic_space_free_pointer on x86[_64]. I don't think we need this File: src/runtime/parse.c * dunamic_space_free_ptr -> dynamic_space_free_pointer File: src/runtime/ppc-arch.c * Fixing comment text in allocation_trap_p * arch_clr_pseudo_atomic_interrupted -> arch_clear_pseudo_atomic_interrupted File: src/runtime/gc-common.c * restore workaround behvaior for !GENCGC, not !X86[_64] * whitespace fix File :src/runtime/gencgc.c * undoing gratuitous spacing changes and fixing whitespace * remove bogus comment ==================================================== CVS TAG: GENCGC_CANDIDATE_4 ==================================================== File: src/runtime/purify.c * Use dynamic_space_purify_pointer instead of dynamic_space_free_pointer to mark the end of the dynamic_space that we purify * call gc_free_heap in purify when using GENCGC File: src/runtime/interrupt.c clear_psuedo_atomic_interrupted -> arch_clear_pseudo_atomic_interrupted ==================================================== CVS TAG: GENCGC_CANDIDATE_5 ** Note: not tagged, but patch made ==================================================== File: src/runtime/assembly/ppc/array.lisp * cleaning up comment File: src/code/ppc-vm.lisp * removed unused commented-out chunk File: src/compiler/generic/genesis.lisp * Added FIXME about ppc offset fixups only being half-done File: src/compiler/ppc/c-call.lisp * Comment cleanup File: src/compiler/ppc/macros.lisp * Allocation macro comment cleanup File: src/runtime/gc.h * Whitespace * #ifdef GENCGC for the p_a macros File: src/runtime/gencgc.c * whitespace * removed bogus comment * restore gc_assert for alignment check on PPC File: src/runtime/globals.h * updated comment about dyanmic_space_free_pointer File: src/runtime/interrupt.c * whitespace File: src/runtime/ppc-arch.c * Remove pc checking stuff * remove SIGILL handling and adjust comment * whitespace * updated comment aboud dynamic_space_free_pointer File: src/runtime/ppc-arch.h * removed bogus comment File: src/runtime/ppc-darwin-spacelist.h * removed extraneous space ==================================================== CVS TAG: GENCGC_CANDIDATE_6 ==================================================== File: src/runtime/ppc-arch.c * Removed enable_some_signals and call to it. We don't need these signals on when we call alloc, but CMUCL does. File: src/runtime/alloc.c * Put in Xophe's fix against GC moving a newly pointer from moving out from under us when we handle a pending interrupt. If the C stack is not scavenged during GC, result needs to be protected against not being referred to by any roots, so we push it onto the lisp control stack, and read it back off after any potential GC has finished ==================================================== CVS TAG: GENCGC_CANDIDATE_7 ==================================================== * Fix mismatched } and #endif in bsd-os.c/memory_fault_handler ==================================================== Untagged Changes ==================================================== ==================================================== Uncommited Changes ====================================================