⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdb-cpu.c

📁 eCos操作系统源码
💻 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 + -