1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
|
/****************************************************************
* *
* Copyright (c) 2001-2017 Fidelity National Information *
* Services, Inc. and/or its subsidiaries. All rights reserved. *
* *
* This source code contains the intellectual property *
* of its copyright holder(s), and is made available *
* under a license. If you do not know the terms of *
* the license, please stop and do not read further. *
* *
****************************************************************/
#include "mdef.h"
#include "zstep.h"
#include <rtnhdr.h>
#include "stack_frame.h"
#include "xfer_enum.h"
#include "indir_enum.h"
#include "op.h"
#include "fix_xfer_entry.h"
GBLREF xfer_entry_t xfer_table[];
GBLREF stack_frame *frame_pointer;
GBLDEF unsigned char *zstep_level;
GBLREF mval zstep_action;
GBLREF bool neterr_pending;
GBLREF int4 outofband;
GBLREF int iott_write_error;
IA64_ONLY(int function_type(char*);)
void op_zstep(uint4 code, mval *action)
{
stack_frame *fp;
int4 status;
DCL_THREADGBL_ACCESS;
SETUP_THREADGBL_ACCESS;
if (!action)
zstep_action = TREF(dollar_zstep);
else
{ op_commarg(action,indir_linetail);
op_unwind();
zstep_action = *action;
}
switch(code)
{
case ZSTEP_INTO:
if (!neterr_pending && 0 == outofband && 0 == iott_write_error)
{
FIX_XFER_ENTRY(xf_linefetch, op_zstepfetch);
FIX_XFER_ENTRY(xf_linestart, op_zstepstart);
FIX_XFER_ENTRY(xf_zbfetch, op_zstzbfetch);
FIX_XFER_ENTRY(xf_zbstart, op_zstzbstart);
}
break;
case ZSTEP_OVER:
case ZSTEP_OUTOF:
fp = frame_pointer;
for (fp = frame_pointer; fp ; fp = fp->old_frame_pointer)
{ if (fp->type & SFT_COUNT)
{ break;
}
}
zstep_level = (unsigned char *) fp;
if (!neterr_pending && 0 == outofband && 0 == iott_write_error)
{
if (code == ZSTEP_OVER)
{
FIX_XFER_ENTRY(xf_linefetch, op_zst_fet_over);
FIX_XFER_ENTRY(xf_linestart, op_zst_st_over);
FIX_XFER_ENTRY(xf_zbfetch, op_zstzb_fet_over);
FIX_XFER_ENTRY(xf_zbstart, op_zstzb_st_over);
}
else
{
FIX_XFER_ENTRY(xf_ret, opp_zstepret);
FIX_XFER_ENTRY(xf_retarg, opp_zstepretarg);
FIX_XFER_ENTRY(xf_linefetch, op_linefetch);
FIX_XFER_ENTRY(xf_linestart, op_linestart);
FIX_XFER_ENTRY(xf_zbfetch, op_zbfetch);
FIX_XFER_ENTRY(xf_zbstart, op_zbstart);
}
}
break;
default:
assertpro(FALSE && code);
}
}
|