Ignore:
Timestamp:
Apr 29, 2011, 6:23:52 PM (9 years ago)
Author:
gb
Message:

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.)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/lisp-kernel/arm-exceptions.c

    r14655 r14754  
    16581658        */
    16591659      } else {
     1660        Boolean ok = false;
    16601661        update_bytes_allocated(tcr, (void *) ptr_from_lispobj(cur_allocptr + disp));
    16611662        xpGPR(xp, allocptr) = VOID_ALLOCPTR + disp;
    16621663        instr = program_counter[-1];
    1663         if (IS_COMPARE_ALLOCPTR_TO_RM(instr)){
    1664           xpGPR(xp,RM_field(instr)) = VOID_ALLOCPTR;
     1664        if (IS_BRANCH_AROUND_ALLOC_TRAP(instr)) {
     1665          instr = program_counter[-2];
     1666          if (IS_COMPARE_ALLOCPTR_TO_RM(instr)){
     1667            xpGPR(xp,RM_field(instr)) = VOID_ALLOCPTR;
     1668            ok = true;
     1669          }
     1670        }
     1671        if (ok) {
     1672        /* Clear the carry bit, so that the trap will be taken. */
     1673        xpPSR(xp) &= ~PSR_C_MASK;
    16651674        } else {
    16661675          Bug(NULL, "unexpected instruction preceding alloc trap.");
    16671676        }
    1668         /* Clear the carry bit, so that the trap will be taken. */
    1669         xpPSR(xp) &= ~PSR_C_MASK;
    16701677      }
    16711678    } else {
Note: See TracChangeset for help on using the changeset viewer.