📄 gdb-cpu.c
字号:
//==========================================================================//// gdb-cpu.c//// CPU specific support for GDB stub.////==========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//==========================================================================//#####DESCRIPTIONBEGIN####//// Author(s): // Contributors: gthomas// Date: 1999-10-20// Purpose: CPU specific support for GDB stub.// Description: ARM is a Registered Trademark of Advanced RISC Machines// Limited.// Other Brands and Trademarks are the property of their// respective owners.////####DESCRIPTIONEND####////=========================================================================#include <bsp/cpu.h>#include <bsp/bsp.h>#include "insn.h"#include "gdb.h"/* * Return byte offset within the saved register area of the * given register. */intbsp_regbyte(int regno){ switch(regno) { case REG_R0: return (int)&(((ex_regs_t*)0)->_r0); break; case REG_R1: return (int)&(((ex_regs_t*)0)->_r1); break; case REG_R2: return (int)&(((ex_regs_t*)0)->_r2); break; case REG_R3: return (int)&(((ex_regs_t*)0)->_r3); break; case REG_R4: return (int)&(((ex_regs_t*)0)->_r4); break; case REG_R5: return (int)&(((ex_regs_t*)0)->_r5); break; case REG_R6: return (int)&(((ex_regs_t*)0)->_r6); break; case REG_R7: return (int)&(((ex_regs_t*)0)->_r7); break; case REG_R8: return (int)&(((ex_regs_t*)0)->_r8); break; case REG_R9: return (int)&(((ex_regs_t*)0)->_r9); break; case REG_R10: return (int)&(((ex_regs_t*)0)->_r10); break; case REG_R11: return (int)&(((ex_regs_t*)0)->_r11); break; case REG_R12: return (int)&(((ex_regs_t*)0)->_r12); break; case REG_SP: return (int)&(((ex_regs_t*)0)->_sp); break; case REG_LR: return (int)&(((ex_regs_t*)0)->_lr); break; case REG_PC: return (int)&(((ex_regs_t*)0)->_pc); break;#ifndef __ECOS__ case REG_F0: return (int)&(((ex_regs_t*)0)->_f0); break; case REG_F1: return (int)&(((ex_regs_t*)0)->_f1); break; case REG_F2: return (int)&(((ex_regs_t*)0)->_f2); break; case REG_F3: return (int)&(((ex_regs_t*)0)->_f3); break; case REG_F4: return (int)&(((ex_regs_t*)0)->_f4); break; case REG_F5: return (int)&(((ex_regs_t*)0)->_f5); break; case REG_F6: return (int)&(((ex_regs_t*)0)->_f6); break; case REG_F7: return (int)&(((ex_regs_t*)0)->_f7); break; case REG_FPS: return (int)&(((ex_regs_t*)0)->_fps); break;#endif case REG_CPSR: return (int)&(((ex_regs_t*)0)->_cpsr); break; case REG_SPSVC: return (int)&(((ex_regs_t*)0)->_spsvc); break; } return 0;}/* * Return size in bytes of given register. */intbsp_regsize(int regno){ switch(regno) { case REG_R0: return (sizeof (((ex_regs_t*)0)->_r0)); break; case REG_R1: return (sizeof (((ex_regs_t*)0)->_r1)); break; case REG_R2: return (sizeof (((ex_regs_t*)0)->_r2)); break; case REG_R3: return (sizeof (((ex_regs_t*)0)->_r3)); break; case REG_R4: return (sizeof (((ex_regs_t*)0)->_r4)); break; case REG_R5: return (sizeof (((ex_regs_t*)0)->_r5)); break; case REG_R6: return (sizeof (((ex_regs_t*)0)->_r6)); break; case REG_R7: return (sizeof (((ex_regs_t*)0)->_r7)); break; case REG_R8: return (sizeof (((ex_regs_t*)0)->_r8)); break; case REG_R9: return (sizeof (((ex_regs_t*)0)->_r9)); break; case REG_R10: return (sizeof (((ex_regs_t*)0)->_r10)); break; case REG_R11: return (sizeof (((ex_regs_t*)0)->_r11)); break; case REG_R12: return (sizeof (((ex_regs_t*)0)->_r12)); break; case REG_SP: return (sizeof (((ex_regs_t*)0)->_sp)); break; case REG_LR: return (sizeof (((ex_regs_t*)0)->_lr)); break; case REG_PC: return (sizeof (((ex_regs_t*)0)->_pc)); break;#ifndef __ECOS__ case REG_F0: return (sizeof (((ex_regs_t*)0)->_f0)); break; case REG_F1: return (sizeof (((ex_regs_t*)0)->_f1)); break; case REG_F2: return (sizeof (((ex_regs_t*)0)->_f2)); break; case REG_F3: return (sizeof (((ex_regs_t*)0)->_f3)); break; case REG_F4: return (sizeof (((ex_regs_t*)0)->_f4)); break; case REG_F5: return (sizeof (((ex_regs_t*)0)->_f5)); break; case REG_F6: return (sizeof (((ex_regs_t*)0)->_f6)); break; case REG_F7: return (sizeof (((ex_regs_t*)0)->_f7)); break; case REG_FPS: return (sizeof (((ex_regs_t*)0)->_fps)); break;#endif case REG_CPSR: return (sizeof (((ex_regs_t*)0)->_cpsr)); break; case REG_SPSVC: return (sizeof (((ex_regs_t*)0)->_spsvc)); break; } return 0;}/* * Given an exception number and a pointer to saved registers, * return a GDB signal value. */intbsp_get_signal(int exc_nr, void *saved_regs){ int sig = TARGET_SIGNAL_TRAP; ex_regs_t *regs = (ex_regs_t *)saved_regs; switch (exc_nr) { case BSP_CORE_EXC_UNDEFINED_INSTRUCTION: { union arm_insn inst; if (bsp_memory_read((void *)regs->_pc, 0, ARM_INST_SIZE * 8, 1, &(inst.word)) != 0) { /* * We were able to read this address. It must be a valid address. */ if (inst.word == BREAKPOINT_INSN) sig = TARGET_SIGNAL_TRAP; } else sig = TARGET_SIGNAL_ILL; } break; case BSP_CORE_EXC_SOFTWARE_INTERRUPT: sig = TARGET_SIGNAL_TRAP; break; case BSP_CORE_EXC_PREFETCH_ABORT: sig = TARGET_SIGNAL_BUS; break; case BSP_CORE_EXC_DATA_ABORT: sig = TARGET_SIGNAL_BUS; break; case BSP_CORE_EXC_ADDRESS_ERROR_26_BIT: sig = TARGET_SIGNAL_BUS; break; case BSP_CORE_EXC_IRQ: sig = TARGET_SIGNAL_INT; break; case BSP_CORE_EXC_FIQ: sig = TARGET_SIGNAL_INT; break; default: sig = TARGET_SIGNAL_TRAP; break; } return sig;}/* * Set the PC value in the saved registers. */voidbsp_set_pc(unsigned long pc, void *saved_regs){ ((ex_regs_t *)saved_regs)->_pc = pc;}/* * Get the PC value from the saved registers. */unsigned longbsp_get_pc(void *saved_regs){ return ((ex_regs_t *)saved_regs)->_pc;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -