From 252915a37ccb5a01e6d1fe9d281b671fae0d0221 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Mon, 31 Oct 2011 16:49:23 -0700 Subject: [PATCH] fix platform dependency in leaf-signal-handler --- basis/cpu/x86/bootstrap.factor | 4 +++- vm/cpu-x86.cpp | 8 ++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/basis/cpu/x86/bootstrap.factor b/basis/cpu/x86/bootstrap.factor index e0d1ef9bf7..f2c37abad9 100644 --- a/basis/cpu/x86/bootstrap.factor +++ b/basis/cpu/x86/bootstrap.factor @@ -114,6 +114,8 @@ big-endian off frame-size jit-signal-handler-epilog ] \ signal-handler define-sub-primitive +: leaf-frame-size ( -- n ) 4 bootstrap-cells ; + [| | jit-signal-handler-prolog :> frame-size jit-save-context @@ -121,7 +123,7 @@ big-endian off temp0 CALL frame-size jit-signal-handler-epilog ! Pop the fake leaf frame along with our return address - stack-frame-size cell - RET + leaf-frame-size cell - RET ] \ leaf-signal-handler define-sub-primitive [ diff --git a/vm/cpu-x86.cpp b/vm/cpu-x86.cpp index 0fc6bbfc41..d3a7bf0b15 100644 --- a/vm/cpu-x86.cpp +++ b/vm/cpu-x86.cpp @@ -53,10 +53,10 @@ void factor_vm::dispatch_signal_handler(cell *sp, cell *pc, cell handler) code_block *leaf_block = code->code_block_for_address(*pc); assert(leaf_block != NULL); - cell newsp = *sp - 32; - *(cell*)(newsp + 32 - sizeof(cell)) = 32; - *(cell*)(newsp + 32 - 2*sizeof(cell)) = (cell)leaf_block->entry_point(); - *(cell*) newsp = *pc; + cell newsp = *sp - 4*sizeof(cell); + *(cell*)(newsp + 3*sizeof(cell)) = 4*sizeof(cell); + *(cell*)(newsp + 2*sizeof(cell)) = (cell)leaf_block->entry_point(); + *(cell*) newsp = *pc; *sp = newsp; handler_word = tagged(special_objects[LEAF_SIGNAL_HANDLER_WORD]); }