1/* 2 * Copyright 2005, Ingo Weinhold, bonefish@users.sf.net. 3 * Copyright 2012, Alex Smith, alex@alex-smith.me.uk. 4 * Distributed under the terms of the MIT License. 5 */ 6 7 8#include <debug_support.h> 9 10#include "arch_debug_support.h" 11 12 13struct stack_frame { 14 struct stack_frame *previous; 15 void *return_address; 16}; 17 18 19status_t 20arch_debug_get_instruction_pointer(debug_context *context, thread_id thread, 21 void **ip, void **stackFrameAddress) 22{ 23 // get the CPU state 24 debug_cpu_state cpuState; 25 status_t error = debug_get_cpu_state(context, thread, NULL, &cpuState); 26 if (error != B_OK) 27 return error; 28 29 *ip = (void*)cpuState.pc; 30 *stackFrameAddress = (void*)cpuState.x[7]; 31 32 return B_OK; 33} 34 35 36status_t 37arch_debug_get_stack_frame(debug_context *context, void *stackFrameAddress, 38 debug_stack_frame_info *stackFrameInfo) 39{ 40 stack_frame stackFrame; 41 ssize_t bytesRead = debug_read_memory(context, 42 (uint8*)stackFrameAddress - sizeof(stackFrame), 43 &stackFrame, sizeof(stackFrame)); 44 45 if (bytesRead < B_OK) 46 return bytesRead; 47 if (bytesRead != sizeof(stackFrame)) 48 return B_ERROR; 49 50 stackFrameInfo->frame = stackFrameAddress; 51 stackFrameInfo->parent_frame = stackFrame.previous; 52 stackFrameInfo->return_address = stackFrame.return_address; 53 54 return B_OK; 55} 56