[Openmcl-cvs-notifications] r14754 - /trunk/source/lisp-kernel/arm-exceptions.c

gb at clozure.com gb at clozure.com
Fri Apr 29 13:23:52 CDT 2011


Author: gb
Date: Fri Apr 29 13:23:52 2011
New Revision: 14754

Log:
In pc_luser_xp(), recognize that the alloc_trap is now immediately
preceded by a branch around it; the COMPARE_ALLOCPTR_TO_RM that we're
looking for precedes the branch.  Note that the LinuxARM heap image
in the trunk currently does things this way; older images may not.

This seems to fix ticket:855 (the test case from ticket:717 runs
to completion, and other things that cons hysterically while creating
threads for no apparent reason - like SLIME - will hopefully not
be affected by this.)

Modified:
    trunk/source/lisp-kernel/arm-exceptions.c

Modified: trunk/source/lisp-kernel/arm-exceptions.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/source/lisp-kernel/arm-exceptions.c (original)
+++ trunk/source/lisp-kernel/arm-exceptions.c Fri Apr 29 13:23:52 2011
@@ -1657,16 +1657,23 @@
            and the trap may or may not be taken.
         */
       } else {
+        Boolean ok =3D false;
         update_bytes_allocated(tcr, (void *) ptr_from_lispobj(cur_allocptr=
 + disp));
         xpGPR(xp, allocptr) =3D VOID_ALLOCPTR + disp;
         instr =3D program_counter[-1];
-        if (IS_COMPARE_ALLOCPTR_TO_RM(instr)){
-          xpGPR(xp,RM_field(instr)) =3D VOID_ALLOCPTR;
+        if (IS_BRANCH_AROUND_ALLOC_TRAP(instr)) {
+          instr =3D program_counter[-2];
+          if (IS_COMPARE_ALLOCPTR_TO_RM(instr)){
+            xpGPR(xp,RM_field(instr)) =3D VOID_ALLOCPTR;
+            ok =3D true;
+          }
+        }
+        if (ok) {
+        /* Clear the carry bit, so that the trap will be taken. */
+        xpPSR(xp) &=3D ~PSR_C_MASK;
         } else {
           Bug(NULL, "unexpected instruction preceding alloc trap.");
         }
-        /* Clear the carry bit, so that the trap will be taken. */
-        xpPSR(xp) &=3D ~PSR_C_MASK;
       }
     } else {
       /* we may be before or after the alloc trap.  If before, set



More information about the Openmcl-cvs-notifications mailing list