From 518b5e5b1c71259ce0badc29f98db46a73c59442 Mon Sep 17 00:00:00 2001 From: Ali Saidi Date: Fri, 1 Oct 2010 16:02:46 -0500 Subject: Debug: Implement getArgument() and function skipping for ARM. In the process make add skipFuction() to handle isa specific function skipping instead of ifdefs and other ugliness. For almost all ABIs, 64 bit arguments can only start in even registers. Size is now passed to getArgument() so that 32 bit systems can make decisions about register selection for 64 bit arguments. The number argument is now passed by reference because getArgument() will need to change it based on the size of the argument and the current argument number. For ARM, if the argument number is odd and a 64-bit register is requested the number must first be incremented to because all 64 bit arguments are passed in an even argument register. Then the number will be incremented again to access both halves of the argument. --- src/arch/alpha/utility.cc | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'src/arch/alpha/utility.cc') diff --git a/src/arch/alpha/utility.cc b/src/arch/alpha/utility.cc index 0d865e520..80ec360b7 100644 --- a/src/arch/alpha/utility.cc +++ b/src/arch/alpha/utility.cc @@ -40,7 +40,7 @@ namespace AlphaISA { uint64_t -getArgument(ThreadContext *tc, int number, bool fp) +getArgument(ThreadContext *tc, int &number, uint8_t size, bool fp) { #if FULL_SYSTEM const int NumArgumentRegs = 6; @@ -96,5 +96,14 @@ copyMiscRegs(ThreadContext *src, ThreadContext *dest) copyIprs(src, dest); } +void +skipFunction(ThreadContext *tc) +{ + Addr newpc = tc->readIntReg(ReturnAddressReg); + tc->setPC(newpc); + tc->setNextPC(tc->readPC() + sizeof(TheISA::MachInst)); +} + + } // namespace AlphaISA -- cgit v1.2.3