#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include "dbg_msg.h"
#include "jt_arm.h"
#include "jt_cortex.h"
#include "jt_mmu.h"
#include "jt_instr.h"
ARM7TDMI,ARM9TDMI and ARM Cortex-M3 Interface
Note: We support ARM7TDMI, ARM9TDMI and ARM Cortex-M3 only.
The ARM7TDMI core uses scan chain 1 with a wide of 33 bits to send instructions and exchange data values to the debug unit.
The ARM9TDMI core uses scan chain 1 with a wide of 67 bits (32 bit instr. 32 bit data and 3 bit control).
The ARM10TDMI core does not have this kind of unit at chain 1. (It's using a different mechanism.)
The ARM Cortex-M3 core not uses a scan chain.
It is using the 35 bit Debug Port and the 35 bit Access Port.
void jtag_arm_ReadCpuRegs | ( | int | reset_inst_counter | ) |
Read out ARM CPU core registers R0..R15 and CPSR.
The values are stored inside of the global structure named CPU.
reset_inst_counter | try to reset the PC (maybe useful, maybe not) |
References arm_info::core_number, DBG_LEVEL_GDB_ARM_WARN, dbgPrintf(), error_exit_code, ICERT_REG_DEBUG_STATUS, ice_state::ignore_stepbug, instr_intest, INTEST, ice_state::is_debugrequest, ice_state::is_step_mode, jtag_arm7_ReadCpuRegs(), jtag_arm9_ReadCpuRegs(), jtag_arm_IceRT_RegRead(), jtag_arm_set_chain(), jtag_cortex_core_ReadCpuRegs(), and jtag_send_instr().
Referenced by gdb_check_thumb_support(), gdb_main_loop(), gdb_monitor_Rcmd(), gdb_restart(), and jtag_test().
void jtag_arm_DumpCPUregs | ( | void | ) |
Dump global CPU registers to the screen (or stdout of our server).
- |
References reg_set::RegExt::RegV7mExt::cfsr, reg_set::RegExt::RegV7mExt::control, arm_info::core_number, ice_state::cortex, reg_set::CPSR, CPU, DBG_LEVEL_GDB_ARM_INFO, ice_state::cortex::dfsr, reg_set::ext, reg_set::RegExt::RegV7mExt::icsr, IF_DBG, ice_state::is_watchpoint, jtag_arm_mmu_check_high_vectors(), reg_set::RegExt::RegV4Ext::lr_usr, reg_set::Regs::r, reg_set::RegExt::RegV4Ext::r10_usr, reg_set::RegExt::RegV4Ext::r11_usr, reg_set::RegExt::RegV4Ext::r12_usr, reg_set::RegExt::RegV4Ext::r8_usr, reg_set::RegExt::RegV4Ext::r9_usr, reg_set::regs, reg_set::RegExt::RegV7mExt::shcsr, reg_set::RegExt::RegV7mExt::sp_main, reg_set::RegExt::RegV7mExt::sp_process, reg_set::RegExt::RegV4Ext::sp_usr, reg_set::RegExt::RegV4Ext::SPSR, reg_set::RegExt::v4, reg_set::RegExt::v7m, reg_set::RegExt::RegV7mExt::vtor, and reg_set::RegExt::RegV7mExt::xPSR.
Referenced by gdb_main_loop(), gdb_monitor_Rcmd(), and jtag_test().
void jtag_arm_WriteCpuRegs | ( | void | ) |
Write back the stored CPU register to the ARM core.
(This function is used for test only.)
- |
References arm_info::core_number, error_exit_code, instr_intest, INTEST, jtag_arm7_WriteCpuRegs(), jtag_arm9_WriteCpuRegs(), jtag_arm_set_chain(), jtag_cortex_core_WriteCpuRegs(), jtag_send_instr(), and scan_chain.
Referenced by jtag_test().
void jtag_arm_PrepareEnterDebug | ( | void | ) |
Prepare to enter Debug Mode.
(or make sure it will be entered soon.)
- |
References arm_info::core_number, error_exit_code, jtag_arm_IceRT_PutAnyBreakPoint(), jtag_cortex_dwt_ClearAnyWatchPoint(), jtag_cortex_fpb_ClearAnyHWBreakPoint(), and jtag_cortex_PrepareEnterDebugHalt().
Referenced by gdb_main_loop(), gdb_restart(), and jtag_test().
void jtag_arm_ClearAnyBreakPoint | ( | void | ) |
Disable any enabled breakpoint
- |
References arm_info::core_number, DBG_LEVEL_GDB_ARM_INFO, dbgPrintf(), error_exit_code, jtag_arm_IceRT_ClearAnyBreakPoint(), jtag_cortex_dwt_ClearAnyWatchPoint(), and jtag_cortex_fpb_ClearAnyHWBreakPoint().
Referenced by gdb_main_loop().
void jtag_arm_PrepareExitDebug | ( | void | ) |
Write back the stored CPU register to the ARM core and restart execution to continue the current program.
Also cleanup BreakPoints (if necesary)
-- note on exit we messed up the PC so we can't access the Memory within the debug state.
But we can correct this next time we read out the CPU register
- |
References arm_info::core_number, CPU, DBG_LEVEL_GDB_ARM_INFO, dbgPrintf(), error_exit_code, reg_set::ext, instr_intest, INTEST, ice_state::is_debugrequest, jtag_arm7_PrepareExitDebug(), jtag_arm9_PrepareExitDebug(), jtag_arm_IceRT_ClearAnyBreakPoint(), jtag_arm_set_chain(), jtag_cortex_core_PrepareExitDebug(), jtag_send_instr(), reg_set::RegExt::RegV4Ext::prev_CPSR, scan_chain, and reg_set::RegExt::v4.
Referenced by gdb_action_continue(), gdb_main_loop(), and jtag_test().
void jtag_arm_FinalExitDebug | ( | void | ) |
Finalize to exit debug state
place RESTART into Jtag - IR
enter Jtag - Tap state RUN/IDLE
- |
References arm_info::core_number, error_exit_code, ICERT_REG_DEBUG_CONTROL, instr_restart, ice_state::is_debugrequest, jtag_arm_IceRT_RegWrite(), jtag_cortex_core_FinalExitDebug(), jtag_eos(), jtag_send_instr(), and RESTART.
Referenced by gdb_action_continue(), gdb_main_loop(), and jtag_test().
void jtag_arm_Step | ( | uint32_t | next_instr | ) |
Single step
Write back the stored CPU register to the ARM core and execute one instruction.
The instruction has to be executed is given in next_instr.
next_instr | ARM or THUMB instruction to execute |
References arm_info::core_number, reg_set::CPSR, CPU, CPU_CPSR_FLAG_THUMB, DBG_LEVEL_GDB_ARM_INFO, DBG_LEVEL_JTAG_ICERT, dbgPrintf(), error_exit_code, reg_set::ext, ICERT_REG_DEBUG_STATUS, instr_intest, instr_restart, INTEST, is_arm_load_banked_regs_instr(), ice_state::is_debugrequest, ice_state::is_step_mode, jtag_arm7_Step(), jtag_arm9_Step(), jtag_arm_IceRT_RegRead(), jtag_arm_set_chain(), jtag_cortex_core_Step(), jtag_eos(), jtag_send_instr(), reg_set::RegExt::RegV4Ext::prev_CPSR, RESTART, scan_chain, and reg_set::RegExt::v4.
Referenced by gdb_action_step(), gdb_check_thumb_support(), and jtag_test().
void jtag_arm_ResynchStep | ( | void | ) |
Resynchronize step in ARM mode.
Write back some of the stored CPU register to the ARM core and execute one "b ." instruction.
- |
References arm_info::core_number, DBG_LEVEL_JTAG_ICERT, dbgPrintf(), error_exit_code, ICERT_REG_DEBUG_STATUS, instr_intest, INTEST, jtag_arm7_ResynchStep(), jtag_arm9_ResynchStep(), jtag_arm_chain1_sysspeed_restart(), jtag_arm_IceRT_RegRead(), jtag_arm_set_chain(), jtag_send_instr(), and scan_chain.
void jtag_arm_ReadWordMemory | ( | uint32_t | address, | |
int | howmanywords, | |||
uint32_t * | buf | |||
) |
Read out word memory into the given buffer.
address | target machine address (memory at ARM side) | |
howmanywords | number of words to read | |
buf | pointer to destination read buffer (memory at server side) |
References arm_info::core_number, DBG_LEVEL_GDB_ARM_WARN, DBG_LEVEL_JTAG_ARM_LOW, dbgPrintf(), error_exit_code, instr_intest, INTEST, ice_state::is_debugrequest, jtag_arm7_ReadWordMemory(), jtag_arm9_ReadWordMemory(), jtag_arm_set_chain(), jtag_cortex_AHB_ReadWordMemory(), jtag_send_instr(), and scan_chain.
Referenced by gdb_read_memory_block(), jtag_test(), and useWorkspace().
uint32_t jtag_arm_ReadWord | ( | uint32_t | address | ) |
32 Bit Word Read
CPU must be in debug state
address | target machine address (memory at ARM side) |
References arm_info::core_number, DBG_LEVEL_GDB_ARM_WARN, dbgPrintf(), error_exit_code, instr_intest, INTEST, ice_state::is_debugrequest, jtag_arm7_ReadWord(), jtag_arm9_ReadWord(), jtag_arm_set_chain(), jtag_cortex_AHB_ReadWord(), jtag_send_instr(), and scan_chain.
Referenced by atmelFlashGetStatus(), doCmdSequence(), gdb_check_endian_at_reset_vector(), gdb_check_memory_block(), gdbLookupArmInstr(), InsertBreakpoint(), jt_amdflashEraseSectorWord(), jt_amdflashGetInfoWord(), jt_amdflashProgWord(), jt_amdflashReadResetWord(), jt_atmelflashGetInfo(), jt_intelflashEraseSectorWord(), jt_intelflashEraseSectorWord_dual(), jt_intelflashEraseSectorWord_quad(), jt_intelflashProgWord(), jt_intelflashProgWord_dual(), jt_intelflashProgWord_quad(), jt_intelflashUnlockSectorWord(), jt_intelflashUnlockSectorWord_dual(), jt_intelflashUnlockSectorWord_quad(), jt_stflashGetInfo(), jt_stm32f10xflashEraseSector(), jt_stm32f10xSetupACR(), jtag_test(), stm32f10xOptionByteflashEraseSector(), stm32FlashProgram(), and useWorkspace().
uint32_t jtag_arm_ReadHalfword | ( | uint32_t | address | ) |
16 Bit Halfword Read
address | target machine address (memory at ARM side) |
References arm_info::core_number, DBG_LEVEL_GDB_ARM_WARN, dbgPrintf(), error_exit_code, instr_intest, INTEST, ice_state::is_debugrequest, jtag_arm7_ReadHalfword(), jtag_arm9_ReadHalfword(), jtag_arm_set_chain(), jtag_cortex_AHB_ReadHalfword(), jtag_send_instr(), and scan_chain.
Referenced by doCmdSequence(), gdbLookupThumbInstr(), InsertBreakpoint(), jt_amdflashEraseSectorHalfword(), jt_amdflashGetInfoHalfword(), jt_amdflashProgHalfword(), jt_amdflashReadResetHalfword(), jt_intelflashEraseSectorHalfword(), jt_intelflashEraseSectorHalfword_dual(), jt_intelflashGetInfoHalfword(), jt_intelflashProgHalfword(), jt_intelflashProgHalfword_dual(), jt_intelflashUnlockSectorHalfword(), jt_intelflashUnlockSectorHalfword_dual(), jt_stflashGetInfo(), and jtag_test().
uint32_t jtag_arm_ReadByte | ( | uint32_t | address | ) |
8 Bit Byte Read
address | target machine address (memory at ARM side) |
References arm_info::core_number, DBG_LEVEL_GDB_ARM_WARN, dbgPrintf(), error_exit_code, instr_intest, INTEST, ice_state::is_debugrequest, jtag_arm7_ReadByte(), jtag_arm9_ReadByte(), jtag_arm_set_chain(), jtag_cortex_AHB_ReadByte(), jtag_send_instr(), and scan_chain.
Referenced by doCmdSequence(), gdb_check_endian_at_reset_vector(), jt_amdflashEraseSectorByte(), jt_amdflashGetInfoByte(), jt_amdflashProgByte(), jt_amdflashReadResetByte(), jt_intelflashEraseSectorByte(), jt_intelflashGetInfoByte(), jt_intelflashProgByte(), and jt_intelflashUnlockSectorByte().
void jtag_arm_WriteWord | ( | uint32_t | address, | |
uint32_t | value | |||
) |
32-bit memory write
address | target machine address (memory at ARM side) | |
value | 32 bit value to write |
References arm_info::core_number, DBG_LEVEL_GDB_ARM_WARN, DBG_LEVEL_JTAG_ARM_LOW, dbgPrintf(), error_exit_code, instr_intest, INTEST, ice_state::is_debugrequest, jtag_arm7_WriteWord(), jtag_arm9_WriteWord(), jtag_arm_set_chain(), jtag_cortex_AHB_WriteWord(), jtag_send_instr(), and scan_chain.
Referenced by doCmdSequence(), gdb_check_memory_block(), gdb_writeback_Ram(), gdb_writeback_RamWorkspace(), jt_amdflashEraseSectorWord(), jt_amdflashGetInfoWord(), jt_amdflashProgWord(), jt_amdflashProgWord_faster(), jt_amdflashReadResetWord(), jt_amdflashResetWord(), jt_intelflashEraseSectorWord(), jt_intelflashEraseSectorWord_dual(), jt_intelflashEraseSectorWord_quad(), jt_intelflashProgWord(), jt_intelflashProgWord_dual(), jt_intelflashProgWord_quad(), jt_intelflashUnlockSectorWord(), jt_intelflashUnlockSectorWord_dual(), jt_intelflashUnlockSectorWord_quad(), jt_stm32f10xflashEraseSector(), jt_stm32f10xSetupACR(), jtag_test(), stm32f10xOptionByteflashEraseSector(), stm32FlashProgram(), and useWorkspace().
void jtag_arm_WriteHalfword | ( | uint32_t | address, | |
uint16_t | value | |||
) |
16-bit memory write
address | target machine address (memory at ARM side) | |
value | 16 bit value to write |
References arm_info::core_number, DBG_LEVEL_GDB_ARM_WARN, DBG_LEVEL_JTAG_ARM_LOW, dbgPrintf(), error_exit_code, instr_intest, INTEST, ice_state::is_debugrequest, jtag_arm7_WriteHalfword(), jtag_arm9_WriteHalfword(), jtag_arm_set_chain(), jtag_cortex_AHB_WriteHalfword(), jtag_send_instr(), and scan_chain.
Referenced by doCmdSequence(), gdb_writeback_Ram(), gdb_writeback_RamWorkspace(), jt_amdflashEraseSectorHalfword(), jt_amdflashGetInfoHalfword(), jt_amdflashProgHalfword(), jt_amdflashProgHalfword_faster(), jt_amdflashReadResetHalfword(), jt_amdflashResetHalfword(), jt_intelflashEraseSectorHalfword(), jt_intelflashEraseSectorHalfword_dual(), jt_intelflashGetInfoHalfword(), jt_intelflashProgHalfword(), jt_intelflashProgHalfword_dual(), jt_intelflashUnlockSectorHalfword(), jt_intelflashUnlockSectorHalfword_dual(), jtag_test(), and str9FlashProgram().
void jtag_arm_WriteByte | ( | uint32_t | address, | |
uint16_t | value | |||
) |
8-bit memory write
address | target machine address (memory at ARM side) | |
value | 8 bit value to write |
References arm_info::core_number, DBG_LEVEL_GDB_ARM_WARN, DBG_LEVEL_JTAG_ARM_LOW, dbgPrintf(), error_exit_code, instr_intest, INTEST, ice_state::is_debugrequest, jtag_arm7_WriteByte(), jtag_arm9_WriteByte(), jtag_arm_set_chain(), jtag_cortex_AHB_WriteByte(), jtag_send_instr(), and scan_chain.
Referenced by doCmdSequence(), gdb_writeback_Ram(), gdb_writeback_RamWorkspace(), jt_amdflashEraseSectorByte(), jt_amdflashGetInfoByte(), jt_amdflashProgByte(), jt_amdflashProgByte_faster(), jt_amdflashReadResetByte(), jt_amdflashResetByte(), jt_intelflashEraseSectorByte(), jt_intelflashGetInfoByte(), jt_intelflashProgByte(), and jt_intelflashUnlockSectorByte().
void jtag_arm_WriteMemoryBuf | ( | uint32_t | address, | |
int | howmanywords, | |||
uint32_t * | buf | |||
) |
Write back word memory from the given buffer.
address | target machine address (memory at ARM side) | |
howmanywords | number of words to read | |
buf | pointer to source write buffer (memory at server side) |
References arm_info::core_number, DBG_LEVEL_GDB_ARM_WARN, DBG_LEVEL_JTAG_ARM_LOW, dbgPrintf(), error_exit_code, instr_intest, INTEST, ice_state::is_debugrequest, jtag_arm7_WriteMemoryBuf(), jtag_arm9_WriteMemoryBuf(), jtag_arm_set_chain(), jtag_cortex_AHB_WriteMemoryBuf(), jtag_send_instr(), and scan_chain.
Referenced by gdb_writeback_memory_block(), gdb_writeback_RamWorkspace(), jtag_test(), stm32FlashProgram(), and useWorkspace().
void jtag_arm_RunProgram | ( | uint32_t | address | ) |
Start execution of a program at a given address.
address | target machine address (memory at ARM side) |
References arm_info::core_number, CPU, DBG_LEVEL_JTAG_ARM_LOW, dbgPrintf(), error_exit_code, reg_set::ext, instr_intest, instr_restart, INTEST, jtag_arm7_RunProgram(), jtag_arm9_RunProgram(), jtag_arm_IceRT_ClearAnyBreakPoint(), jtag_arm_set_chain(), jtag_cortex_core_RunProgram(), jtag_cortex_dwt_ClearAnyWatchPoint(), jtag_cortex_fpb_ClearAnyHWBreakPoint(), jtag_eos(), jtag_send_instr(), reg_set::RegExt::RegV4Ext::prev_CPSR, RESTART, scan_chain, and reg_set::RegExt::v4.
Referenced by atmelFlashClearGPNVM(), atmelFlashErase(), atmelFlashEraseAndProgram(), atmelFlashLock(), atmelFlashProgramOnly(), atmelFlashSetGPNVM(), atmelFlashUnlock(), gdb_check_memory_block(), gdb_dcc_dummy(), gdb_read_memory_block(), gdb_writeback_memory_block(), jtag_test(), philipsFlashEraseAllUnlocked(), philipsFlashLock(), philipsFlashProgram(), philipsFlashUnlock(), prog_flash_amd16(), prog_flash_amd32(), prog_flash_amd8(), stm32f10xOptionByteflashEraseSector(), stm32FlashProgram(), str7FlashErase(), str7FlashProgram(), str9FlashErase(), and str9FlashProgram().
unsigned int jtag_arm_PollDbgState | ( | void | ) |
Poll debug state
0 | CPU is running | |
1 | CPU is in debug state |
References arm_info::core_number, error_exit_code, jtag_arm_iceRT_PollDbgState(), and jtag_cortex_core_PollDbgState().
Referenced by atmelFlashClearGPNVM(), atmelFlashErase(), atmelFlashEraseAndProgram(), atmelFlashLock(), atmelFlashProgramOnly(), atmelFlashSetGPNVM(), atmelFlashUnlock(), gdb_check_memory_block(), gdb_check_thumb_support(), gdb_dcc_dummy(), gdb_main_loop(), gdb_read_memory_block(), gdb_restart(), gdb_writeback_memory_block(), jtag_test(), philipsFlashEraseAllUnlocked(), philipsFlashLock(), philipsFlashProgram(), philipsFlashUnlock(), prog_flash_amd16(), prog_flash_amd32(), prog_flash_amd8(), str7FlashErase(), str7FlashProgram(), str9FlashErase(), and str9FlashProgram().
int scan_chain = -1 |
scan chain 0 (113 bits) - Macrocell Scan Test
scan chain 1 ( 33 bits) - Debug at ARM7TDMI
scan chain 1 ( 67 bits) - Debug at ARM9TDMI
scan chain 2 ( 38 bits) - Embedded ICE logic
n\ (note: ARM Cortex-M3 dose not have scan chains like this)
Referenced by gdb_restart(), jt_amdflashProgByte_faster(), jt_amdflashProgHalfword_faster(), jt_amdflashProgWord_faster(), jt_str91xflash_EraseSector(), jt_str91xflash_GetConfig(), jt_str91xflash_ReadSector(), jt_str91xflash_SectorBlankCheck(), jt_str91xflash_WriteSector(), jtag_arm720_CP15DataExchange(), jtag_arm720_CP15InstrReg(), jtag_arm7_mov_chain1_data(), jtag_arm920_CP15Interpret(), jtag_arm920_CP15PhysRegRead(), jtag_arm920_CP15PhysRegWrite(), jtag_arm926_CP15RegRead(), jtag_arm926_CP15RegWrite(), jtag_arm966_CP15RegRead(), jtag_arm966_CP15RegWrite(), jtag_arm9_mov_chain1_data(), jtag_arm_chain1_sysspeed_restart(), jtag_arm_IceRT_RegRead(), jtag_arm_IceRT_RegRead_Once(), jtag_arm_IceRT_RegWrite(), jtag_arm_IceRT_RegWrite_getPrevData(), jtag_arm_PrepareExitDebug(), jtag_arm_ReadByte(), jtag_arm_ReadHalfword(), jtag_arm_ReadWord(), jtag_arm_ReadWordMemory(), jtag_arm_ResynchStep(), jtag_arm_RunProgram(), jtag_arm_set_chain(), jtag_arm_Step(), jtag_arm_WriteByte(), jtag_arm_WriteCpuRegs(), jtag_arm_WriteHalfword(), jtag_arm_WriteMemoryBuf(), jtag_arm_WriteWord(), and jtag_test().
Referenced by arm_emu_opcode(), arm_step_emu(), arm_update_flags(), gdb_action_continue(), gdb_action_step(), gdb_check_memory_block(), gdb_check_thumb_support(), gdb_main_loop(), gdb_monitor_Rcmd(), is_arm_load_banked_regs_instr(), jt_arm_condition_pass(), jt_arm_instr_bx_workaround(), jt_thumb_instr_bx_workaround(), jtag_arm7_PrepareExitDebug(), jtag_arm7_ReadCpuRegs(), jtag_arm7_ResynchStep(), jtag_arm7_RunProgram(), jtag_arm7_Step(), jtag_arm7_WriteCpuRegs(), jtag_arm9_PrepareExitDebug(), jtag_arm9_ReadCpuRegs(), jtag_arm9_ResynchStep(), jtag_arm9_RunProgram(), jtag_arm9_Step(), jtag_arm9_WriteCpuRegs(), jtag_arm_DumpCPUregs(), jtag_arm_PrepareExitDebug(), jtag_arm_RunProgram(), jtag_arm_Step(), jtag_cortex_core_BusFaultAddress_ReadRegister(), jtag_cortex_core_MemManageAddress_ReadRegister(), jtag_cortex_core_ReadCpuRegs(), jtag_cortex_core_restart(), jtag_cortex_core_RunProgram(), jtag_cortex_core_WriteCpuRegs(), jtag_test(), stm32f10xOptionByteflashEraseSector(), stm32FlashProgram(), and thumb_step_emu().
struct ice_state ice_state = {0,0,0,0,0,0,{0,0,{0},0,0,{0}},{0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0}} |