1/* dbg_rdi.h -- ARMulator RDI interface: ARM6 Instruction Emulator. 2 Copyright (C) 1994 Advanced RISC Machines Ltd. 3 4 This program is free software; you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation; either version 2 of the License, or 7 (at your option) any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program; if not, write to the Free Software 16 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ 17 18#ifndef dbg_rdi__h 19#define dbg_rdi__h 20 21/***************************************************************************\ 22* Error Codes * 23\***************************************************************************/ 24 25#define RDIError_NoError 0 26 27#define RDIError_Reset 1 28#define RDIError_UndefinedInstruction 2 29#define RDIError_SoftwareInterrupt 3 30#define RDIError_PrefetchAbort 4 31#define RDIError_DataAbort 5 32#define RDIError_AddressException 6 33#define RDIError_IRQ 7 34#define RDIError_FIQ 8 35#define RDIError_Error 9 36#define RDIError_BranchThrough0 10 37 38#define RDIError_NotInitialised 128 39#define RDIError_UnableToInitialise 129 40#define RDIError_WrongByteSex 130 41#define RDIError_UnableToTerminate 131 42#define RDIError_BadInstruction 132 43#define RDIError_IllegalInstruction 133 44#define RDIError_BadCPUStateSetting 134 45#define RDIError_UnknownCoPro 135 46#define RDIError_UnknownCoProState 136 47#define RDIError_BadCoProState 137 48#define RDIError_BadPointType 138 49#define RDIError_UnimplementedType 139 50#define RDIError_BadPointSize 140 51#define RDIError_UnimplementedSize 141 52#define RDIError_NoMorePoints 142 53#define RDIError_BreakpointReached 143 54#define RDIError_WatchpointAccessed 144 55#define RDIError_NoSuchPoint 145 56#define RDIError_ProgramFinishedInStep 146 57#define RDIError_UserInterrupt 147 58#define RDIError_CantSetPoint 148 59#define RDIError_IncompatibleRDILevels 149 60 61#define RDIError_CantLoadConfig 150 62#define RDIError_BadConfigData 151 63#define RDIError_NoSuchConfig 152 64#define RDIError_BufferFull 153 65#define RDIError_OutOfStore 154 66#define RDIError_NotInDownload 155 67#define RDIError_PointInUse 156 68#define RDIError_BadImageFormat 157 69#define RDIError_TargetRunning 158 70 71#define RDIError_LittleEndian 240 72#define RDIError_BigEndian 241 73#define RDIError_SoftInitialiseError 242 74 75#define RDIError_InsufficientPrivilege 253 76#define RDIError_UnimplementedMessage 254 77#define RDIError_UndefinedMessage 255 78 79/***************************************************************************\ 80* RDP Message Numbers * 81\***************************************************************************/ 82 83#define RDP_Start (unsigned char)0x0 84#define RDP_End (unsigned char)0x1 85#define RDP_Read (unsigned char)0x2 86#define RDP_Write (unsigned char)0x3 87#define RDP_CPUread (unsigned char)0x4 88#define RDP_CPUwrite (unsigned char)0x5 89#define RDP_CPread (unsigned char)0x6 90#define RDP_CPwrite (unsigned char)0x7 91#define RDP_SetBreak (unsigned char)0xa 92#define RDP_ClearBreak (unsigned char)0xb 93#define RDP_SetWatch (unsigned char)0xc 94#define RDP_ClearWatch (unsigned char)0xd 95#define RDP_Execute (unsigned char)0x10 96#define RDP_Step (unsigned char)0x11 97#define RDP_Info (unsigned char)0x12 98#define RDP_OSOpReply (unsigned char)0x13 99 100#define RDP_AddConfig (unsigned char)0x14 101#define RDP_LoadConfigData (unsigned char)0x15 102#define RDP_SelectConfig (unsigned char)0x16 103#define RDP_LoadAgent (unsigned char)0x17 104 105#define RDP_Stopped (unsigned char)0x20 106#define RDP_OSOp (unsigned char)0x21 107#define RDP_Fatal (unsigned char)0x5e 108#define RDP_Return (unsigned char)0x5f 109#define RDP_Reset (unsigned char)0x7f 110 111/***************************************************************************\ 112* Other RDI values * 113\***************************************************************************/ 114 115#define RDISex_Little 0 /* the byte sex of the debuggee */ 116#define RDISex_Big 1 117#define RDISex_DontCare 2 118 119#define RDIPoint_EQ 0 /* the different types of break/watchpoints */ 120#define RDIPoint_GT 1 121#define RDIPoint_GE 2 122#define RDIPoint_LT 3 123#define RDIPoint_LE 4 124#define RDIPoint_IN 5 125#define RDIPoint_OUT 6 126#define RDIPoint_MASK 7 127 128#define RDIPoint_Inquiry 64 /* ORRed with point type in extended RDP */ 129#define RDIPoint_Handle 128 /* messages */ 130 131#define RDIWatch_ByteRead 1 /* types of data accesses to watch for */ 132#define RDIWatch_HalfRead 2 133#define RDIWatch_WordRead 4 134#define RDIWatch_ByteWrite 8 135#define RDIWatch_HalfWrite 16 136#define RDIWatch_WordWrite 32 137 138#define RDIReg_R15 (1L << 15) /* mask values for CPU */ 139#define RDIReg_PC (1L << 16) 140#define RDIReg_CPSR (1L << 17) 141#define RDIReg_SPSR (1L << 18) 142#define RDINumCPURegs 19 143 144#define RDINumCPRegs 10 /* current maximum */ 145 146#define RDIMode_Curr 255 147 148/* Bits set in return value from RDIInfo_Target */ 149#define RDITarget_LogSpeed 0x0f 150#define RDITarget_HW 0x10 /* else emulator */ 151#define RDITarget_AgentMaxLevel 0xe0 152#define RDITarget_AgentLevelShift 5 153#define RDITarget_DebuggerMinLevel 0x700 154#define RDITarget_DebuggerLevelShift 8 155#define RDITarget_CanReloadAgent 0x800 156#define RDITarget_CanInquireLoadSize 0x1000 157 158/* Bits set in return value from RDIInfo_Step */ 159#define RDIStep_Multiple 1 160#define RDIStep_PCChange 2 161#define RDIStep_Single 4 162 163/* Bits set in return value from RDIInfo_Points */ 164#define RDIPointCapability_Comparison 1 165#define RDIPointCapability_Range 2 166/* 4 to 128 are RDIWatch_xx{Read,Write} left-shifted by two */ 167#define RDIPointCapability_Mask 256 168#define RDIPointCapability_Status 512 /* Point status enquiries available */ 169 170/* RDI_Info subcodes */ 171#define RDIInfo_Target 0 172#define RDIInfo_Points 1 173#define RDIInfo_Step 2 174#define RDIInfo_MMU 3 175#define RDIInfo_DownLoad 4 /* Inquires whether configuration download 176 and selection is available. 177 */ 178#define RDIInfo_SemiHosting 5 /* Inquires whether RDISemiHosting_* RDI_Info 179 calls are available. 180 */ 181#define RDIInfo_CoPro 6 /* Inquires whether CoPro RDI_Info calls are 182 available. 183 */ 184#define RDIInfo_Icebreaker 7 185 186/* The next two are only to be used if the value returned by RDIInfo_Points */ 187/* has RDIPointCapability_Status set. */ 188#define RDIPointStatus_Watch 0x80 189#define RDIPointStatus_Break 0x81 190 191#define RDISignal_Stop 0x100 192 193#define RDIVector_Catch 0x180 194 195/* The next four are only to be used if RDIInfo_Semihosting returned no error */ 196#define RDISemiHosting_SetState 0x181 197#define RDISemiHosting_GetState 0x182 198#define RDISemiHosting_SetVector 0x183 199#define RDISemiHosting_GetVector 0x184 200 201/* The next two are only to be used if RDIInfo_Icebreaker returned no error */ 202#define RDIIcebreaker_GetLocks 0x185 203#define RDIIcebreaker_SetLocks 0x186 204 205/* Only if RDIInfo_Target returned RDITarget_CanInquireLoadSize */ 206#define RDIInfo_GetLoadSize 0x187 207 208#define RDICycles 0x200 209#define RDICycles_Size 48 210#define RDIErrorP 0x201 211 212#define RDISet_Cmdline 0x300 213#define RDISet_RDILevel 0x301 214#define RDISet_Thread 0x302 215 216/* The next two are only to be used if RDIInfo_CoPro returned no error */ 217#define RDIInfo_DescribeCoPro 0x400 218#define RDIInfo_RequestCoProDesc 0x401 219 220#define RDIInfo_Log 0x800 221#define RDIInfo_SetLog 0x801 222 223typedef unsigned long PointHandle; 224typedef unsigned long ThreadHandle; 225#define RDINoPointHandle ((PointHandle)-1L) 226#define RDINoHandle ((ThreadHandle)-1L) 227 228struct Dbg_ConfigBlock; 229struct Dbg_HostosInterface; 230struct Dbg_MCState; 231typedef int rdi_open_proc (unsigned type, 232 struct Dbg_ConfigBlock const *config, 233 struct Dbg_HostosInterface const *i, 234 struct Dbg_MCState *dbg_state); 235typedef int rdi_close_proc (void); 236typedef int rdi_read_proc (ARMword source, void *dest, unsigned *nbytes); 237typedef int rdi_write_proc (const void *source, ARMword dest, 238 unsigned *nbytes); 239typedef int rdi_CPUread_proc (unsigned mode, unsigned long mask, 240 ARMword * state); 241typedef int rdi_CPUwrite_proc (unsigned mode, unsigned long mask, 242 ARMword const *state); 243typedef int rdi_CPread_proc (unsigned CPnum, unsigned long mask, 244 ARMword * state); 245typedef int rdi_CPwrite_proc (unsigned CPnum, unsigned long mask, 246 ARMword const *state); 247typedef int rdi_setbreak_proc (ARMword address, unsigned type, ARMword bound, 248 PointHandle * handle); 249typedef int rdi_clearbreak_proc (PointHandle handle); 250typedef int rdi_setwatch_proc (ARMword address, unsigned type, 251 unsigned datatype, ARMword bound, 252 PointHandle * handle); 253typedef int rdi_clearwatch_proc (PointHandle handle); 254typedef int rdi_execute_proc (PointHandle * handle); 255typedef int rdi_step_proc (unsigned ninstr, PointHandle * handle); 256typedef int rdi_info_proc (unsigned type, ARMword * arg1, ARMword * arg2); 257typedef int rdi_pointinq_proc (ARMword * address, unsigned type, 258 unsigned datatype, ARMword * bound); 259 260typedef enum 261{ 262 RDI_ConfigCPU, 263 RDI_ConfigSystem 264} 265RDI_ConfigAspect; 266 267typedef enum 268{ 269 RDI_MatchAny, 270 RDI_MatchExactly, 271 RDI_MatchNoEarlier 272} 273RDI_ConfigMatchType; 274 275typedef int rdi_addconfig_proc (unsigned long nbytes); 276typedef int rdi_loadconfigdata_proc (unsigned long nbytes, char const *data); 277typedef int rdi_selectconfig_proc (RDI_ConfigAspect aspect, char const *name, 278 RDI_ConfigMatchType matchtype, 279 unsigned versionreq, unsigned *versionp); 280 281typedef char *getbufferproc (void *getbarg, unsigned long *sizep); 282typedef int rdi_loadagentproc (ARMword dest, unsigned long size, 283 getbufferproc * getb, void *getbarg); 284 285typedef struct 286{ 287 int itemmax; 288 char const *const *names; 289} 290RDI_NameList; 291 292typedef RDI_NameList const *rdi_namelistproc (void); 293 294typedef int rdi_errmessproc (char *buf, int buflen, int errno); 295 296struct RDIProcVec 297{ 298 char rditypename[12]; 299 300 rdi_open_proc *open; 301 rdi_close_proc *close; 302 rdi_read_proc *read; 303 rdi_write_proc *write; 304 rdi_CPUread_proc *CPUread; 305 rdi_CPUwrite_proc *CPUwrite; 306 rdi_CPread_proc *CPread; 307 rdi_CPwrite_proc *CPwrite; 308 rdi_setbreak_proc *setbreak; 309 rdi_clearbreak_proc *clearbreak; 310 rdi_setwatch_proc *setwatch; 311 rdi_clearwatch_proc *clearwatch; 312 rdi_execute_proc *execute; 313 rdi_step_proc *step; 314 rdi_info_proc *info; 315 /* V2 RDI */ 316 rdi_pointinq_proc *pointinquiry; 317 318 /* These three useable only if RDIInfo_DownLoad returns no error */ 319 rdi_addconfig_proc *addconfig; 320 rdi_loadconfigdata_proc *loadconfigdata; 321 rdi_selectconfig_proc *selectconfig; 322 323 rdi_namelistproc *drivernames; 324 rdi_namelistproc *cpunames; 325 326 rdi_errmessproc *errmess; 327 328 /* Only if RDIInfo_Target returns a value with RDITarget_LoadAgent set */ 329 rdi_loadagentproc *loadagent; 330}; 331 332#endif 333 334extern unsigned int swi_mask; 335 336#define SWI_MASK_DEMON (1 << 0) 337#define SWI_MASK_ANGEL (1 << 1) 338#define SWI_MASK_REDBOOT (1 << 2) 339