dbgArchLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:163k
源码类别:

VxWorks

开发平台:

C/C++

  1.     {
  2.     return (getOneReg (taskId, R_REG_OFFSET(3))); 
  3.     }
  4. int r4  (int taskId) { return (getOneReg (taskId, R_REG_OFFSET(4))); }
  5. int r5  (int taskId) { return (getOneReg (taskId, R_REG_OFFSET(5))); }
  6. int r6  (int taskId) { return (getOneReg (taskId, R_REG_OFFSET(6))); }
  7. int r7  (int taskId) { return (getOneReg (taskId, R_REG_OFFSET(7))); }
  8. int r8  (int taskId) { return (getOneReg (taskId, R_REG_OFFSET(8))); }
  9. int r9  (int taskId) { return (getOneReg (taskId, R_REG_OFFSET(9))); }
  10. int r10 (int taskId) { return (getOneReg (taskId, R_REG_OFFSET(10))); }
  11. int r11 (int taskId) { return (getOneReg (taskId, R_REG_OFFSET(11))); }
  12. int r12 (int taskId) { return (getOneReg (taskId, R_REG_OFFSET(12))); }
  13. int r13 (int taskId) { return (getOneReg (taskId, R_REG_OFFSET(13))); }
  14. int r14 (int taskId) { return (getOneReg (taskId, R_REG_OFFSET(14))); }
  15. int r15 (int taskId) { return (getOneReg (taskId, R_REG_OFFSET(15))); }
  16. /*******************************************************************************
  17. *
  18. * g0 - return the contents of register `g0' (also `g1' - `g14') (i960)
  19. *
  20. * This command extracts the contents of register `g0' from the TCB of a
  21. * specified task.
  22. * If <taskId> is omitted or 0, the current default task is assumed.
  23. *
  24. * Routines are provided for all global registers (`g0' - `g14'):
  25. * g0() - g14().
  26. *
  27. * RETURNS: The contents of the `g0' register (or the requested register).
  28. *
  29. * SEE ALSO:
  30. * .pG "Target Shell"
  31. *
  32. * INTERNAL
  33. * Although this routine is hereby marked NOMANUAL, it actually gets
  34. * published from arch/doc/dbgArchLib.c.
  35. * ...not any more -- i960 no longer supported.
  36. *
  37. * NOMANUAL
  38. */
  39. int g0
  40.     (
  41.     int taskId /* task ID, 0 means default task */
  42.     )
  43.     
  44.     {
  45.     return (getOneReg (taskId, G_REG_OFFSET(0))); 
  46.     }
  47. int g1  (int taskId) { return (getOneReg (taskId, G_REG_OFFSET(1))); }
  48. int g2  (int taskId) { return (getOneReg (taskId, G_REG_OFFSET(2))); }
  49. int g3  (int taskId) { return (getOneReg (taskId, G_REG_OFFSET(3))); }
  50. int g4  (int taskId) { return (getOneReg (taskId, G_REG_OFFSET(4))); }
  51. int g5  (int taskId) { return (getOneReg (taskId, G_REG_OFFSET(5))); }
  52. int g6  (int taskId) { return (getOneReg (taskId, G_REG_OFFSET(6))); }
  53. int g7  (int taskId) { return (getOneReg (taskId, G_REG_OFFSET(7))); }
  54. int g8  (int taskId) { return (getOneReg (taskId, G_REG_OFFSET(8))); }
  55. int g9  (int taskId) { return (getOneReg (taskId, G_REG_OFFSET(9))); }
  56. int g10 (int taskId) { return (getOneReg (taskId, G_REG_OFFSET(10))); }
  57. int g11 (int taskId) { return (getOneReg (taskId, G_REG_OFFSET(11))); }
  58. int g12 (int taskId) { return (getOneReg (taskId, G_REG_OFFSET(12))); }
  59. int g13 (int taskId) { return (getOneReg (taskId, G_REG_OFFSET(13))); }
  60. int g14 (int taskId) { return (getOneReg (taskId, G_REG_OFFSET(14))); }
  61. /*******************************************************************************
  62. *
  63. * fp - return the contents of register `fp' (i960)
  64. *
  65. * This command extracts the contents of register `fp', the frame pointer,
  66. * from the TCB of a specified task.
  67. * If <taskId> is omitted or 0, the current default task is assumed.
  68. *
  69. * RETURNS: The contents of the `fp' register.
  70. *
  71. * SEE ALSO:
  72. * .pG "Target Shell"
  73. *
  74. * NOMANUAL
  75. */
  76. int fp
  77.     (
  78.     int taskId /* task ID, 0 means default task */
  79.     )
  80.     
  81.     {
  82.     return (getOneReg (taskId, FP_OFFSET)); 
  83.     }
  84. #if CPU==I960KB
  85. /*******************************************************************************
  86. *
  87. * fp0 - return the contents of register `fp0' (also `fp1' - `fp3') (i960KB, i960SB)
  88. *
  89. * This command extracts the contents of the floating-point register `fp0' from
  90. * the TCB of a specified task.
  91. * If <taskId> is omitted or 0, the current default task is assumed.
  92. *
  93. * Routines are provided for the floating-point registers `fp0' - `fp3':
  94. * fp0() - fp3().
  95. *
  96. * RETURNS: The contents of the `fp0' register (or the requested register).
  97. *
  98. * SEE ALSO:
  99. * .pG "Target Shell"
  100. *
  101. * NOMANUAL
  102. */
  103. double fp0
  104.     (
  105.     volatile int taskId /* task ID, 0 means default task */
  106.     ) 
  107.     
  108.     { 
  109.     return (getOneFPReg (taskId, FPX_0)); 
  110.     }
  111. double fp1 (volatile int taskId) { return (getOneFPReg (taskId, FPX_1)); }
  112. double fp2 (volatile int taskId) { return (getOneFPReg (taskId, FPX_2)); }
  113. double fp3 (volatile int taskId) { return (getOneFPReg (taskId, FPX_3)); }
  114. #endif /* CPU==I960KB */
  115. /*******************************************************************************
  116. *
  117. * pcw - return the contents of the `pcw' register (i960)
  118. *
  119. * This command extracts the contents of the `pcw' register from the TCB of a
  120. * specified task.
  121. * If <taskId> is omitted or 0, the current default task is assumed.
  122. *
  123. * RETURNS: The contents of the `pcw' register.
  124. *
  125. * SEE ALSO:
  126. * .pG "Target Shell"
  127. *
  128. * NOMANUAL
  129. */
  130. int pcw
  131.     (
  132.     int taskId  /* task ID, 0 means default task */
  133.     )
  134.     {
  135.     return (getOneReg (taskId, PCW_OFFSET));
  136.     }
  137. /*******************************************************************************
  138. *
  139. * tcw - return the contents of the `tcw' register (i960)
  140. *
  141. * This command extracts the contents of the `tcw' register from the TCB of a
  142. * specified task.
  143. * If <taskId> is omitted or 0, the current default task is assumed.
  144. *
  145. * RETURNS: The contents of the `tcw' register.
  146. *
  147. * SEE ALSO:
  148. * .pG "Target Shell"
  149. *
  150. * NOMANUAL
  151. */
  152. int tcw
  153.     (
  154.     int taskId  /* task ID, 0 means default task */
  155.     )
  156.     {
  157.     return (getOneReg (taskId, TCW_OFFSET));
  158.     }
  159. /*******************************************************************************
  160. *
  161. * acw - return the contents of the `acw' register (i960)
  162. *
  163. * This command extracts the contents of the `acw' register from the TCB of a
  164. * specified task.
  165. * If <taskId> is omitted or 0, the current default task is assumed.
  166. *
  167. * RETURNS: The contents of the `acw' register.
  168. *
  169. * SEE ALSO:
  170. * .pG "Target Shell"
  171. *
  172. * NOMANUAL
  173. */
  174. int acw
  175.     (
  176.     int taskId /* task ID, 0 means default task */
  177.     )
  178.     {
  179.     return (getOneReg (taskId, ACW_OFFSET));
  180.     }
  181. /* dbgArchLib.c - MIPS architecture dependent debugger library */
  182.   
  183. /* Copyright 1984-2001 Wind River Systems, Inc. */
  184. #include "copyright_wrs.h"
  185. /*
  186.  * This file has been developed or significantly modified by the
  187.  * MIPS Center of Excellence Dedicated Engineering Staff.
  188.  * This notice is as per the MIPS Center of Excellence Master Partner
  189.  * Agreement, do not remove this notice without checking first with
  190.  * WR/Platforms MIPS Center of Excellence engineering management.
  191.  */
  192. /*
  193. modification history
  194. --------------------
  195. 01r,16jul01,ros  add CofE comment
  196. 01q,20dec00,pes  Update for MIPS32/MIPS64 target combinations.
  197. 01p,22sep99,myz  added CW4000_16 support.
  198. 01o,29jul99,alp  added CW4000 and CW4010 support.
  199. 01n,18jan99,elg  Authorize breakpoints on branch delay slot (SPR 24356).
  200. 01m,08jan98,dbt  modified for new breakpoint scheme
  201. 01l,14oct96,kkk  added R4650 support.
  202. 01k,10feb95,jdi  doc tweaks.
  203. 01j,27jan95,rhp  doc cleanup.
  204. 01i,19oct93,cd   added R4000 support
  205. 01h,29sep93,caf  undid fix of SPR #2359.
  206. 01g,07jul93,yao  fixed to preserve parity error bit of status
  207.  register (SPR #2359).  changed copyright notice.
  208. 01f,01oct92,ajm  added dynamically bound handlers, general cleanup
  209. 01e,23aug92,jcf  made filename consistant.
  210. 01d,22jul92,yao  fixed bug when adding a temporary breakpoint at a branch 
  211.  instruction in _dbgStepAdd().
  212. 01c,06jul92,yao  removed dbgCacheClear().  made user uncallable globals
  213.  started with '_'.
  214. 01b,04jul92,jcf  scalable/ANSI/cleanup effort.
  215. 01a,16jun92,yao  written based on mips dbgLib.c ver01k.
  216. */
  217. /*
  218. DESCRIPTION
  219. NOMANUAL
  220. */
  221. #include "vxWorks.h"
  222. #include "private/dbgLibP.h"
  223. #include "private/taskLibP.h"
  224. #include "taskArchLib.h"
  225. #include "intLib.h"
  226. #include "excLib.h"
  227. #include "regs.h"
  228. #include "iv.h"
  229. #include "cacheLib.h"
  230. #include "ioLib.h"
  231. #include "dsmLib.h"
  232. #include "vxLib.h"
  233. #include "stdio.h"
  234. #include "wdb/wdbDbgLib.h"
  235. #include "dbgLib.h"
  236. /* externals */
  237. IMPORT int  dsmInst (FAST long * binInst, int address, FUNCPTR prtAddress);
  238. IMPORT FUNCPTR wdbDbgArchHandler[8];
  239. IMPORT int      dsmNbytes (ULONG);
  240. IMPORT BOOL mips16Instructions(ULONG);
  241. /* globals */
  242. char * _archHelp_msg =  /* help message */
  243. #if     (DBG_HARDWARE_BP)
  244.     "bh addr[,access[,task[,count[,quiet]]]] Set hardware breakpointn"
  245.     "        access :      1 - write            2 - readn"
  246.     "                      3 - read/write"
  247.     "        For R4650 processors:n"
  248.     "        access :      0 - instruction      1 - writen"
  249.     "                      2 - read             3 - read/write"
  250. #endif /* (DBG_HARDWARE_BP) */
  251.     "n";
  252. /*******************************************************************************
  253. *
  254. * _dbgArchInit - architecture dependent initialization routine
  255. *
  256. * This routine initialize global function pointers that are specific for 
  257. * MIPS architecture.
  258. *
  259. * RETURNS:N/A
  260. * NOMANUAL
  261. */
  262. void _dbgArchInit (void)
  263.     {
  264.     _dbgDsmInstRtn = (FUNCPTR) dsmInst;
  265.     }
  266. /*******************************************************************************
  267. *
  268. * _dbgInstSizeGet - set up breakpoint instruction
  269. *
  270. * RETURNS: size of the instruction at specified location.
  271. * NOMANUAL
  272. */
  273. int _dbgInstSizeGet
  274.     (
  275.     INSTR * brkInst /* pointer to hold breakpoint instruction */
  276.     )
  277.     {
  278.     return (2);
  279.     }
  280. /*******************************************************************************
  281. *
  282. * _dbgRetAdrsGet - get return address for current routine
  283. *
  284. * RETURNS: return address for current routine.
  285. * NOMANUAL
  286. */
  287. INSTR * _dbgRetAdrsGet
  288.     (
  289.     REG_SET * pRegSet /* pointer to register set */
  290.     )
  291.     {
  292. #if FALSE
  293.     INSTR * scanpc; /* instruction scan pc pointer */
  294.     /*
  295.     * scan instructions forward. If we find a "sw ra,x(sp)" or a "jr ra"
  296.     * then the return address in already in register "ra".  If we find
  297.     * a "lw ra,x(sp)" then the return address is saved in offset "x"
  298.     * on the stack. If the instruction space is corrupted, could get
  299.     * a bus error eventually or could find a return address for a
  300.     * neighboring subprogram.
  301.     */
  302.     for (scanpc = pRegSet->pc; TRUE; scanpc++)
  303. {
  304. /* match "sw ra,x(sp)" or "jr ra" means return address in ra */
  305. if (INST_CMP(scanpc,(SW_INSTR|RA<<RT_POS|SP<<BASE_POS),
  306. (GENERAL_OPCODE_MASK|RT_MASK|BASE_MASK)) ||
  307.     INST_CMP(scanpc,(SPECIAL|JR_INSTR|RA<<RS_POS),
  308. (GENERAL_OPCODE_MASK|SPECIAL_MASK|RS_MASK)))
  309.     {
  310.     return ((INSTR *) pRegSet->raReg);
  311.     }
  312. /* match "lw ra, x(sp)" means return address is on the stack */
  313. if (INST_CMP(scanpc,(LW_INSTR|RA<<RT_POS|SP<<BASE_POS),
  314. (GENERAL_OPCODE_MASK|RT_MASK|BASE_MASK)))
  315.     {
  316.     /* Note that the "C" compiler treats "short" as the lower
  317.      * 16 bits of the word and automatically performs the sign
  318.      * extend when the "short" is converted to a "long"
  319.      */
  320.     return ((INSTR *)(*(INSTR **) (pRegSet->spReg + (short) *scanpc)));
  321.     }
  322. }
  323.     return (NULL);
  324. #endif /* FALSE */
  325.     return ((INSTR *) ERROR);
  326.     }
  327. /*******************************************************************************
  328. *
  329. * _dbgFuncCallCheck - check next instruction
  330. *
  331. * This routine checks to see if the next instruction is a JAL or BAL.
  332. * If it is, it returns TRUE, otherwise, returns FALSE.
  333. *
  334. * RETURNS: TRUE if next instruction is JAL or BAL, or FALSE otherwise.
  335. * NOMANUAL
  336. */
  337. BOOL _dbgFuncCallCheck
  338.     (
  339.     INSTR * addr /* pointer to instruction */
  340.     )
  341.     {
  342.     if (mips16Instructions((ULONG)addr))
  343. {
  344. /* mips16 jal, jalr instructions */
  345.         if ( (M16_INSTR_OPCODE(*(UINT16 *)addr) == M16_JALNX_INSTR)||
  346.      (((*(UINT16 *)addr) & 0xf81f) == 0xe800) )  /* j(al)r */
  347.      return (TRUE);
  348.         else
  349.      return(FALSE);
  350.         }
  351.     return (INST_CMP (addr, JAL_INSTR, GENERAL_OPCODE_MASK) || 
  352. #ifdef _WRS_MIPS16
  353. #define JALX_INSTR  0x74000000
  354.     INST_CMP (addr, JALX_INSTR, GENERAL_OPCODE_MASK) ||
  355. #endif
  356.     INST_CMP (addr, (SPECIAL|JALR_INSTR), 
  357. (GENERAL_OPCODE_MASK | SPECIAL_MASK)) ||
  358.     INST_CMP (addr, (BCOND|BLTZAL_INSTR), 
  359. (GENERAL_OPCODE_MASK | BCOND_MASK)) ||
  360.     INST_CMP (addr, (BCOND | BGEZAL_INSTR), 
  361. (GENERAL_OPCODE_MASK | BCOND_MASK)) ||
  362.     INST_CMP (addr, (BCOND | BLTZALL_INSTR), 
  363. (GENERAL_OPCODE_MASK | BCOND_MASK)) ||
  364.     INST_CMP (addr, (BCOND | BGEZALL_INSTR), 
  365. (GENERAL_OPCODE_MASK | BCOND_MASK))
  366.     );
  367.     }
  368. /*******************************************************************************
  369. *
  370. * _dbgTaskPCGet - get task's pc
  371. *
  372. * RETURNS:task's program counter
  373. * NOMANUAL
  374. */
  375. INSTR * _dbgTaskPCGet
  376.     (
  377.     int tid /* task's id */
  378.     )
  379.     {
  380.     REG_SET regSet;
  381.     (void) taskRegsGet (tid, &regSet);
  382. #ifdef _WRS_MIPS16
  383.     /* mask off possible mips16 function indicator */
  384.     return((INSTR *)((int)(regSet.pc) & ~0x1));
  385. #else
  386.     return ((INSTR *) regSet.pc);
  387. #endif
  388.     }
  389. /*******************************************************************************
  390. *
  391. * _dbgTaskPCSet - set task's pc
  392. *
  393. * RETURNS:N/A
  394. *
  395. * NOMANUAL
  396. */
  397. void _dbgTaskPCSet
  398.     (
  399.     int tid, /* task id */
  400.     INSTR * pc, /* task's pc */
  401.     INSTR * npc /* task's npc */
  402.     )
  403.     {
  404.     REG_SET regSet; /* task's register set */
  405.     if (taskRegsGet (tid, &regSet) != OK)
  406. return;
  407.     regSet.pc = pc;
  408.     taskRegsSet (tid, &regSet);
  409.     }
  410. /*******************************************************************************
  411. *
  412. * dbgBpTypeBind - bind a breakpoint handler to a breakpoint type (MIPS R3000, R4000, R4650)
  413. * Dynamically bind a breakpoint handler to breakpoints of type 0 - 7.
  414. * By default only breakpoints of type zero are handled with the
  415. * vxWorks breakpoint handler (see dbgLib).  Other types may be used for
  416. * Ada stack overflow or other such functions.  The installed handler
  417. * must take the same parameters as excExcHandle() (see excLib).
  418. *
  419. * RETURNS:
  420. * OK, or
  421. * ERROR if <bpType> is out of bounds.
  422. * SEE ALSO
  423. * dbgLib, excLib
  424. */
  425. STATUS dbgBpTypeBind
  426.     (
  427.     int bpType, /* breakpoint type */
  428.     FUNCPTR routine /* function to bind */
  429.     )
  430.     {
  431.     if ((bpType > 7) || (bpType < 0))
  432. {
  433. return (ERROR);
  434. }
  435.     else
  436. {
  437. wdbDbgArchHandler[bpType] = routine;
  438. return (OK);
  439. }
  440.     }
  441. #if (DBG_HARDWARE_BP)
  442. /******************************************************************************
  443. *
  444. * _dbgBrkDisplayHard - print hardware breakpoint
  445. *
  446. * This routine print hardware breakpoint.
  447. *
  448. * NOMANUAL
  449. */
  450. void _dbgBrkDisplayHard
  451.     (
  452.     BRKPT * pBp /* breakpoint table entry */
  453.     )
  454.     {
  455.     int type;
  456.     if ((pBp->bp_flags & BRK_HARDWARE) == 0)
  457. return;
  458.     type = pBp->bp_flags & BRK_HARDMASK;
  459.     printf (" (hard-");
  460.     switch (type)
  461. {
  462. case BRK_INST:
  463.     printf ("inst.)");
  464.     break;
  465. case BRK_READ:
  466.     printf ("data read)");
  467.     break;
  468. case BRK_WRITE:
  469.     printf ("data write)");
  470.     break;
  471. case BRK_RW:
  472.     printf ("data r/w)");
  473.     break;
  474. default:
  475.     printf ("unknown)");
  476.     break;
  477. }
  478.     }
  479. #endif  /* DBG_HARDWARE_BP */
  480. /* dbgArchLib.c - i80x86 architecture-specific debugging facilities */
  481. /* Copyright 1984-2001 Wind River Systems, Inc. */
  482. #include "copyright_wrs.h"
  483. /*
  484. modification history
  485. --------------------
  486. 01h,20nov01,hdn  doc clean up for 5.5.  revived edi() - eflags().
  487. 01g,08jan98,dbt  modified for new breakpoint scheme
  488. 01f,10feb95,jdi  doc tweak for 5.2.
  489. 01e,14dec93,hdn  added _archHelp_msg.
  490. 01d,29nov93,hdn  added eax() - eflags().
  491. 01c,27aug93,hdn  added _dbgTaskPCSet().
  492. 01b,16jun93,hdn  updated to 5.1.
  493.   - changed functions to ansi style
  494.   - changed VOID to void
  495.   - changed copyright notice
  496. 01a,08jul92,hdn  written based on tron/dbgLib.c.
  497. */
  498. /*
  499. DESCRIPTION
  500. This module provides the architecture dependent support functions for
  501. dbgLib. 
  502. x86 including P5(Pentium), P6(PentiumPro, II, III), and P7(Pentium4) family
  503. processors have four breakpoint registers and the following types of 
  504. hardware breakpoint:
  505. .CS
  506.    BRK_INST             /@ instruction hardware breakpoint @/
  507.    BRK_DATAW1           /@ data write 1 byte breakpoint @/
  508.    BRK_DATAW2           /@ data write 2 byte breakpoint @/
  509.    BRK_DATAW4           /@ data write 4 byte breakpoint @/
  510.    BRK_DATARW1          /@ data read-write 1 byte breakpoint @/
  511.    BRK_DATARW2          /@ data read-write 2 byte breakpoint @/
  512.    BRK_DATARW4          /@ data read-write 4 byte breakpoint @/
  513. .CE
  514. NOMANUAL
  515. */
  516. /* LINTLIBRARY */
  517. #include "vxWorks.h"
  518. #include "taskLib.h"
  519. #include "taskArchLib.h"
  520. #include "intLib.h"
  521. #include "regs.h"
  522. #include "iv.h"
  523. #include "cacheLib.h"
  524. #include "ioLib.h"
  525. #include "dsmLib.h"
  526. #include "vxLib.h"
  527. #include "usrLib.h"
  528. #include "stdio.h"
  529. #include "dbgLib.h"
  530. /* defines */
  531. #define DSM(addr,inst,mask)     ((*(addr) & (mask)) == (inst))
  532. /* externs */
  533. IMPORT int  dsmInst ();
  534. /* globals */
  535. char * _archHelp_msg = 
  536. #ifdef  DBG_HARDWARE_BP
  537.     "bh addr[,access[,task[,count[,quiet]]]] Set hardware breakpointn"
  538.     "         access :      0 - instruction        1 - write 1 byten"
  539.     "                       3 - read/write 1 byte  5 - write 2 bytesn"
  540.     "                       7 - read/write 2 bytes d - write 4 bytesn"
  541.     "                       f - read/write 4 bytes"
  542. #endif /* DBG_HARDWARE_BP */
  543.     "n";
  544. /* forward declarations */
  545. LOCAL int getOneReg (int taskId, int regCode);
  546. /*******************************************************************************
  547. *
  548. * _dbgArchInit - architecture dependent initialization routine
  549. *
  550. * This routine initialize global function pointers that are architecture 
  551. * specific.
  552. *
  553. * RETURNS: N/A
  554. *
  555. * NOMANUAL
  556. */
  557. void _dbgArchInit (void)
  558.     {
  559.     _dbgDsmInstRtn = (FUNCPTR) dsmInst;
  560.     }
  561. /*******************************************************************************
  562. *
  563. * _dbgRetAdrsGet - get a next instruction for cret ()
  564. *
  565. * if next instruction is a ENTER or RET, return address is on top of stack.
  566. * otherwise it follows saved frame pointer.
  567. *
  568. *
  569. * NOMANUAL
  570. */
  571. INSTR * _dbgRetAdrsGet
  572.     (
  573.     REG_SET * pRegSet /* register set */
  574.     )
  575.     {
  576.     INSTR *returnAddress;
  577.     if (DSM(pRegSet->pc,   PUSH_EBP, PUSH_EBP_MASK) && 
  578. DSM(pRegSet->pc+1, MOV_ESP0, MOV_ESP0_MASK) &&
  579. DSM(pRegSet->pc+2, MOV_ESP1, MOV_ESP1_MASK))
  580. {
  581. returnAddress = *(INSTR **)pRegSet->spReg;
  582. }
  583.     else if (DSM(pRegSet->pc-1, PUSH_EBP, PUSH_EBP_MASK) && 
  584.      DSM(pRegSet->pc,   MOV_ESP0, MOV_ESP0_MASK) &&
  585.      DSM(pRegSet->pc+1, MOV_ESP1, MOV_ESP1_MASK))
  586. {
  587. returnAddress = *((INSTR **)pRegSet->spReg + 1);
  588. }
  589.     else if (DSM(pRegSet->pc, ENTER, ENTER_MASK))
  590. {
  591. returnAddress = *(INSTR **)pRegSet->spReg;
  592. }
  593.     else if ((DSM(pRegSet->pc, RET,    RET_MASK)) ||
  594.      (DSM(pRegSet->pc, RETADD, RETADD_MASK)))
  595. {
  596. returnAddress = *(INSTR **)pRegSet->spReg;
  597. }
  598.     else
  599. {
  600. returnAddress = *((INSTR **)pRegSet->fpReg + 1);
  601. }
  602.     return (returnAddress);
  603.     }
  604. /*******************************************************************************
  605. *
  606. * _dbgFuncCallCheck - check next instruction
  607. *
  608. * This routine checks to see if the next instruction is a CALL
  609. * If it is, it returns TRUE, otherwise, returns FALSE.
  610. *
  611. * RETURNS: TRUE if next instruction is a CALL, or FALSE otherwise.
  612. *
  613. * NOMANUAL
  614. */
  615. BOOL _dbgFuncCallCheck
  616.     (
  617.     INSTR * addr /* pointer to instruction */
  618.     )
  619.     {
  620.     return ((DSM (addr, CALL_INDIR0, CALL_INDIR0_MASK) &&
  621.      DSM (addr + 1, CALL_INDIR1, CALL_INDIR1_MASK)) || 
  622.     (DSM (addr, CALL_DIR, CALL_DIR_MASK)));
  623.     }
  624. /*******************************************************************************
  625. *
  626. * _dbgInstSizeGet - set up the breakpoint instruction
  627. *
  628. * RETURNS: size of the instruction at specified location.
  629. *
  630. * NOMANUAL
  631. */
  632. int _dbgInstSizeGet
  633.     (
  634.     INSTR * pBrkInst /* pointer to hold breakpoint instruction */
  635.     )
  636.     {
  637.     return (dsmNbytes (pBrkInst));
  638.     }
  639. /*******************************************************************************
  640. *
  641. * _dbgTaskPCGet - get task's program counter PC
  642. *
  643. * RETURNS:task's program counter
  644. *
  645. * NOMANUAL
  646. */
  647. INSTR * _dbgTaskPCGet
  648.     (
  649.     int tid /* task's id */
  650.     )
  651.     {
  652.     REG_SET regSet;
  653.     (void) taskRegsGet (tid, &regSet);
  654.     return ((INSTR *) regSet.pc);
  655.     }
  656. /*******************************************************************************
  657. *
  658. * _dbgTaskPCSet - set task's program counter PC
  659. *
  660. * RETURNS: N/A
  661. *
  662. * NOMANUAL
  663. */
  664. void _dbgTaskPCSet
  665.     (
  666.     int task, /* task id */
  667.     INSTR * pc, /* new PC */
  668.     INSTR * npc /* not supported on I80X86 */
  669.     )
  670.     {
  671.     REG_SET regSet;
  672.     if (taskRegsGet (task, &regSet) != OK)
  673.         return;
  674.     regSet.pc = pc;
  675.     (void)taskRegsSet (task, &regSet);
  676.     }
  677. #ifdef DBG_HARDWARE_BP
  678. /*******************************************************************************
  679. *
  680. * _dbgBrkDisplayHard - display a hardware breakpoint
  681. *
  682. * This routine displays a hardware breakpoint.
  683. *
  684. * NOMANUAL
  685. */
  686. void _dbgBrkDisplayHard
  687.     (
  688.     BRKPT * pBp /* breakpoint table entry */
  689.     )
  690.     {
  691.     int type;
  692.     if ((pBp->bp_flags & BRK_HARDWARE) == 0)
  693. return;
  694.     type = pBp->bp_flags & BRK_HARDMASK;
  695.     printf (" (hard-");
  696.     switch (type)
  697. {
  698. case BRK_INST:
  699.     printf ("inst)");
  700.     break;
  701. case BRK_DATAW1:
  702.     printf ("dataw1)");
  703. break;
  704. case BRK_DATAW2:
  705.     printf ("dataw2)");
  706.     break;
  707. case BRK_DATAW4:
  708.     printf ("dataw4)");
  709.     break;
  710. case BRK_DATARW1:
  711.     printf ("datarw1)");
  712.     break;
  713. case BRK_DATARW2:
  714.     printf ("datarw2)");
  715.     break;
  716. case BRK_DATARW4:
  717.     printf ("datarw4)");
  718.     break;
  719. default:
  720.     printf ("unknown)");
  721.     break;
  722. }
  723.     }
  724. #endif /* DBG_HARDWARE_BP */
  725. /*******************************************************************************
  726. *
  727. * getOneReg - return the contents of one register
  728. *
  729. * Given a task's ID, this routine returns the contents of the register
  730. * specified by the register code.  This routine is used by eax, edx, etc.
  731. * The register codes are defined in dbgI86Lib.h.
  732. *
  733. * RETURNS: register contents, or ERROR.
  734. */
  735. LOCAL int getOneReg (taskId, regCode)
  736.     int taskId; /* task's id, 0 means default task */
  737.     int regCode; /* code for specifying register */
  738.     {
  739.     REG_SET regSet; /* get task's regs into here */
  740.     taskId = taskIdFigure (taskId); /* translate super name to id */
  741.     if (taskId == ERROR) /* couldn't figure out super name */
  742. return (ERROR);
  743.     taskId = taskIdDefault (taskId); /* set the default id */
  744.     if (taskRegsGet (taskId, &regSet) != OK)
  745. return (ERROR);
  746.     switch (regCode)
  747. {
  748. case EDI: return (regSet.edi);
  749. case ESI: return (regSet.esi);
  750. case EBP: return (regSet.ebp);
  751. case ESP: return (regSet.esp);
  752. case EBX: return (regSet.ebx);
  753. case EDX: return (regSet.edx);
  754. case ECX: return (regSet.ecx);
  755. case EAX: return (regSet.eax);
  756. case EFLAGS: return (regSet.eflags);
  757. }
  758.     return (ERROR); /* unknown regCode */
  759.     }
  760. /*******************************************************************************
  761. *
  762. * edi - return the contents of register `edi' (also `esi' - `eax') (x86)
  763. *
  764. * This command extracts the contents of register `edi' from the TCB of a
  765. * specified task.  If <taskId> is omitted or zero, the last task
  766. * referenced is assumed.
  767. *
  768. * Similar routines are provided for all general registers (`edi' - `eax'):
  769. * edi() - eax().
  770. *
  771. * The stack pointer is accessed via eax().
  772. *
  773. * RETURNS: The contents of register `edi' (or the requested register).
  774. *
  775. * SEE ALSO:
  776. * .pG "Debugging"
  777. */
  778. int edi
  779.     (
  780.     int taskId /* task ID, 0 means default task */
  781.     )
  782.     {
  783.     return (getOneReg (taskId, EDI));
  784.     }
  785. int esi (taskId) int taskId; { return (getOneReg (taskId, ESI)); }
  786. int ebp (taskId) int taskId; { return (getOneReg (taskId, EBP)); }
  787. int esp (taskId) int taskId; { return (getOneReg (taskId, ESP)); }
  788. int ebx (taskId) int taskId; { return (getOneReg (taskId, EBX)); }
  789. int edx (taskId) int taskId; { return (getOneReg (taskId, EDX)); }
  790. int ecx (taskId) int taskId; { return (getOneReg (taskId, ECX)); }
  791. int eax (taskId) int taskId; { return (getOneReg (taskId, EAX)); }
  792. /*******************************************************************************
  793. *
  794. * eflags - return the contents of the status register (x86)
  795. *
  796. * This command extracts the contents of the status register from the TCB of a
  797. * specified task.  If <taskId> is omitted or zero, the last task referenced is
  798. * assumed.
  799. *
  800. * RETURNS: The contents of the status register.
  801. *
  802. * SEE ALSO:
  803. * .pG "Debugging"
  804. */
  805. int eflags
  806.     (
  807.     int taskId /* task ID, 0 means default task */
  808.     )
  809.     {
  810.     return (getOneReg (taskId, EFLAGS));
  811.     }
  812. /* dbgArchLib.c - ARM-dependent debugger library */
  813. /* Copyright 1996-1997 Wind River Systems, Inc. */
  814. #include "copyright_wrs.h"
  815. /*
  816. modification history
  817. --------------------
  818. 01b,20feb97,jpd  Tidied comments/documentation.
  819. 01a,18jul96,jpd  written, based on 680x0 version 01h.
  820. */
  821. /*
  822. DESCRIPTION
  823. This module provides the Advanced Risc Machines Ltd, ARM-specific support
  824. functions for dbgLib. Note that no support is provided here (yet) for Thumb
  825. state code or for the EmbeddedICE hardware debugging facilities.
  826. NOMANUAL
  827. */
  828. #include "vxWorks.h"
  829. #include "private/dbgLibP.h"
  830. #include "taskLib.h"
  831. #include "regs.h"
  832. #include "dsmLib.h"
  833. #include "usrLib.h"
  834. #include "arch/arm/arm.h"
  835. #include "stdio.h"
  836. #include "string.h"
  837. /* externals */
  838. /* architecture-independent breakpoint handling routine from dbgLib.c */
  839. IMPORT STATUS dbgBreakpoint (BREAK_ESF *pInfo, int * Regs);
  840. /* architecture-depdendent instruction decoding routines from dbgArmLib.c */
  841. IMPORT INSTR * armGetNpc (INSTR, REG_SET *);
  842. IMPORT BOOL armInstrChangesPc (INSTR *);
  843. /* globals */
  844. extern char * _archHelp_msg;
  845. char * _archHelp_msg =
  846.     "r0-r14    [task]                Display a register of a taskn"
  847.     "cpsr      [task]                Display cpsr of a taskn"
  848.     "psrShow   value                 Display meaning of psr valuen";
  849. /* locals */
  850. /* forward declarations */
  851. LOCAL void armBreakpoint(ESF *pEsf, REG_SET * pRegs);
  852. /* pseudo-register num to pass to getOneReg() to get CPSR, local to this file */
  853. #define ARM_REG_CPSR 16
  854. /*******************************************************************************
  855. *
  856. * _dbgArchInit - architecture dependent initialization routine
  857. *
  858. * This routine initialises global function pointers that are architecture
  859. * specific.
  860. *
  861. * RETURNS: N/A
  862. *
  863. * NOMANUAL
  864. */
  865. void _dbgArchInit (void)
  866.     {
  867.     /* Install the ARM disassembler from dsmLib.c */
  868.     _dbgDsmInstRtn = dsmInst;
  869.     /*
  870.      * The ARM undefined instruction exception handler will check that the
  871.      * undefined instruction is the breakpoint instruction and pass control
  872.      * to an installed breakpoint handler via a function pointer. So, install
  873.      * our handler.
  874.      */
  875.     _func_excBreakpoint = armBreakpoint;
  876.     }
  877. /*******************************************************************************
  878. *
  879. * _dbgVecInit - insert new breakpoint and trace vectors
  880. *
  881. * NOTE
  882. * Does nothing, since neither hardware breakpoints nor trace mode are
  883. * supported on the ARM and the breakpoint handler has been installed in
  884. * _dbgArchInit() above.
  885. *
  886. * RETURNS: N/A
  887. *
  888. * NOMANUAL
  889. */
  890. void _dbgVecInit (void)
  891.     {
  892.     }
  893. /*******************************************************************************
  894. *
  895. * _dbgInstSizeGet - get size of breakpoint instruction
  896. *
  897. * NOTE
  898. * In contrast to the Architecture Porting Guidelines, this routine should not
  899. * return the size in units of 16-bit words. It should return the size in units
  900. * of sizeof(INSTR). The only place this routine is called from, is in so(), in
  901. * dbgLib.c which uses this to add a breakpoint at:
  902. * (INSTR *)(pc + _dbgInstSizeGet(pc).
  903. *
  904. * RETURNS: size of the instruction at specified location.
  905. *
  906. * NOMANUAL
  907. */
  908. int _dbgInstSizeGet
  909.     (
  910.     INSTR * pBrkInst /* pointer to hold breakpoint instruction */
  911.     )
  912.     {
  913.     return dsmNbytes (pBrkInst) / sizeof(INSTR);
  914.     }
  915. /*******************************************************************************
  916. *
  917. * _dbgRetAdrsGet - get return address for current routine
  918. *
  919. * This routine is used by the cret() routine to set a breakpoint at the return
  920. * address of the current subroutine.
  921. *
  922. * NOTE
  923. * In order to find the return address, a number of assumptions are made.
  924. * In general, it will work for all C language routines and for assembly
  925. * language routines that start with a standard entry sequence i.e.
  926. *    MOV   ip,sp
  927. *    STMDB sp!,{..fp,ip,lr,pc}
  928. *    SUB   fp,ip,#4
  929. *
  930. * This will need extending for Thumb.
  931. *
  932. * Most VxWorks assembly language routines establish a stack frame in this
  933. * fashion for exactly this reason. However, routines written in other
  934. * languages, strange entries into routines, or tasks with corrupted stacks
  935. * can confuse this routine
  936. *
  937. * RETURNS: return address for current routine.
  938. *
  939. * NOMANUAL
  940. */
  941. INSTR * _dbgRetAdrsGet
  942.     (
  943.     REG_SET * pRegSet /* pointer to register set */
  944.     )
  945.     {
  946.     int i; /* an index */
  947.     INSTR instr; /* next instruction */
  948.     FAST INSTR *pc = pRegSet->pc; /* pointer to instruction */
  949.     /*
  950.      * If the current routine doesn't have a stack frame, then we will have
  951.      * to guess that the return address is in the link register.
  952.      * We KNOW we don't have a stack frame in a few restricted but useful
  953.      * cases:
  954.      *  1) we are in the entry sequence of a routine which establishes the
  955.      *     stack frame. We try to cope with this.
  956.      *  2) we are in a routine which doesn't create a stack frame. We cannot
  957.      *     do much about this.
  958.      */
  959.     instr = *pc;
  960.     /*
  961.      * look for the first instruction of the entry sequence which can be up
  962.      * to two instructions before the current pc
  963.      */
  964.     for (i = 0; i >= -2 ; --i)
  965. if (INSTR_IS(pc[i], MOV_IP_SP))
  966.     break;
  967.     /*
  968.      * If either the frame pointer is 0 or we are in the entry sequence of the
  969.      * routine, use lr.
  970.      */
  971.     if ((pRegSet->fpReg == 0) ||
  972.         ((i >= -2) &&
  973. INSTR_IS(pc[i + 1], STMDB_SPP_FP_IP_LR_PC) &&
  974. INSTR_IS(pc[i + 2], SUB_FP_IP_4)))
  975. return (INSTR *)pRegSet->r[14];
  976.     else
  977. return *(((INSTR **)(pRegSet->fpReg)) - 1);
  978.     }
  979. /*******************************************************************************
  980. *
  981. * _dbgSStepClear - clear single step mode
  982. *
  983. * RETURNS: N/A
  984. *
  985. * NOMANUAL
  986. *
  987. * We believe that this routine can be null on the ARM which has no Single-Step
  988. * processor mode.
  989. *
  990. */
  991. void _dbgSStepClear (void)
  992.     {
  993.     }
  994. /*******************************************************************************
  995. *
  996. * _dbgSStepSet - set single step mode
  997. *
  998. * RETURNS: N/A
  999. *
  1000. * NOMANUAL
  1001. *
  1002. * I believe that this routine can be null on the ARM which has no Single-Step
  1003. * processor mode. The SPARC architecture, sets a temporary breakpoint using
  1004. * _dbgStepAdd(), but I believe that this is redundant, as such a temporary
  1005. * breakpoint has already been set by dbgBreakpoint() in dbgLib.c which calls
  1006. * this routine.
  1007. *
  1008. */
  1009. void _dbgSStepSet
  1010.     (
  1011.     BREAK_ESF * pInfo /* pointer to info saved on stack */
  1012.     )
  1013.     {
  1014.     }
  1015. /******************************************************************************
  1016. *
  1017. * _dbgTaskSStepSet - set single step mode of task
  1018. *
  1019. * NOTE
  1020. * Does nothing since trace mode are not supported and temporary breakpoint
  1021. * is added in c() or s().
  1022. *
  1023. * RETURNS:N/A
  1024. *
  1025. * NOMANUAL
  1026. */
  1027. void _dbgTaskSStepSet
  1028.     (
  1029.     int tid /* task's id */
  1030.     )
  1031.     {
  1032.     }
  1033. /******************************************************************************
  1034. *
  1035. * _dbgTaskBPModeSet - set breakpoint mode of task
  1036. *
  1037. * NOMANUAL
  1038. *
  1039. * It has been suggested by WRS that it may be necessary to lock interrupts in
  1040. * this routine on some architectures to protect dbgTaskSwitch().
  1041. *
  1042. */
  1043. void _dbgTaskBPModeSet
  1044.     (
  1045.     int tid /* task's id */
  1046.     )
  1047.     {
  1048.     }
  1049. /******************************************************************************
  1050. *
  1051. * _dbgTaskBPModeClear - clear breakpoint mode of task
  1052. *
  1053. * NOMANUAL
  1054. *
  1055. * It has been suggested by WRS that it may be necessary to unlock interrupts in
  1056. * this routine on some architectures.
  1057. *
  1058. */
  1059. void _dbgTaskBPModeClear
  1060.     (
  1061.     int tid
  1062.     )
  1063.     {
  1064.     }
  1065. /*******************************************************************************
  1066. *
  1067. * _dbgFuncCallCheck - check if instruction calls a function
  1068. *
  1069. * This routine checks to see if the instruction calls a function.
  1070. * On the ARM, many classes of instruction could be used to do this. We check to
  1071. * see if the instruction is a BL, or if it changes the PC and the previous
  1072. * instruction is a MOV lr, pc instruction.
  1073. *
  1074. * This will need extending for Thumb.
  1075. *
  1076. * RETURNS: TRUE if next instruction calls a function, FALSE otherwise.
  1077. *
  1078. * NOMANUAL
  1079. */
  1080. BOOL _dbgFuncCallCheck
  1081.     (
  1082.     INSTR * addr /* pointer to instruction */
  1083.     )
  1084.     {
  1085.     return (INSTR_IS (*addr, BL) ||
  1086. (INSTR_IS (*(addr - 1), MOVXX_LR_PC) &&
  1087. armInstrChangesPc (addr)));
  1088.     }
  1089. /*******************************************************************************
  1090. *
  1091. * _dbgRegsAdjust - set register set
  1092. *
  1093. * Comments from Am29k version:
  1094. *
  1095. * This routine restores the task's registers. It uses the register set stored
  1096. * in the task's memory stack to update the task's regSet.
  1097. *
  1098. * INTERNAL
  1099. * This routine is required since the breakpoint/trace ISR never returns in
  1100. * the breakpoint/trace stub (except when the breakpoint is ignored). So,
  1101. * excExit() cannot generally be used to re-fill the task's TCB with the
  1102. * register set saved in the ESF.
  1103. * RETURNS: N/A
  1104. *
  1105. * NOMANUAL
  1106. */
  1107. void _dbgRegsAdjust
  1108.     (
  1109.     FAST int   tid, /* id of task that hit breakpoint */
  1110.     TRACE_ESF * pInfo, /* pointer to esf info saved on stack */
  1111.     int *       pRegs, /* pointer to buf containing saved regs */
  1112.     BOOL stepBreakFlag /* TRUE if this was a trace exception */
  1113. /* FALSE if this was a SO or CRET breakpoint */
  1114.     )
  1115.     {
  1116.     /*
  1117.      * In the ARM implementation, may reload the task regSet using the pointer
  1118.      * on this saved regSet.
  1119.      */
  1120.     taskRegsSet (tid, (REG_SET *) pRegs);
  1121.     }
  1122. /*******************************************************************************
  1123. *
  1124. * _dbgIntrInfoSave  - save information when breakpoints are hit at interrupt
  1125. *                     level
  1126. *
  1127. * RETURNS: N/A
  1128. *
  1129. * NOMANUAL
  1130. *
  1131. * On advice from philm, this pair of routines can be null on the ARM as there
  1132. * is no trace or step-specific bit to save.
  1133. *
  1134. */
  1135. void _dbgIntrInfoSave
  1136.     (
  1137.     BREAK_ESF * pInfo /* pointer to info saved on stack */
  1138.     )
  1139.     {
  1140.     }
  1141. /******************************************************************************
  1142. *
  1143. * _dbgIntrInfoRestore - restore the info saved by dbgIntrInfoSave
  1144. *
  1145. * NOMANUAL
  1146. */
  1147. void _dbgIntrInfoRestore
  1148.     (
  1149.     TRACE_ESF * pInfo /* pointer to execption frame */
  1150.     )
  1151.     {
  1152.     }
  1153. /******************************************************************************
  1154. *
  1155. * _dbgInstPtrAlign - align pointer to appropriate boundary
  1156. *
  1157. * REUTRNS: align given instruction pointer to appropriate boundary
  1158. *
  1159. * NOMANUAL
  1160. */
  1161. INSTR * _dbgInstPtrAlign
  1162.     (
  1163.     INSTR * addr /* instruction pointer */
  1164.     )
  1165.     {
  1166.     addr = (INSTR *) ((int)addr & ~(0x03)); /* force address to a long
  1167.  * word boundary.
  1168.  */
  1169.    /* This will need extending for Thumb */
  1170.     return addr;
  1171.     }
  1172. /*******************************************************************************
  1173. *
  1174. * _dbgInfoPCGet - get pc
  1175. *
  1176. * RETURNS: value of pc saved on stack
  1177. *
  1178. * NOMANUAL
  1179. */
  1180. INSTR * _dbgInfoPCGet
  1181.     (
  1182.     BREAK_ESF * pInfo /* pointer to info saved on stack */
  1183.     )
  1184.     {
  1185.     return pInfo->pc;
  1186.     }
  1187. /*******************************************************************************
  1188. *
  1189. * _dbgTaskPCSet - set task's pc
  1190. *
  1191. * RETURNS: N/A
  1192. *
  1193. * NOMANUAL
  1194. */
  1195. void _dbgTaskPCSet
  1196.     (
  1197.     int    tid, /* task id */
  1198.     INSTR* pc, /* task's pc */
  1199.     INSTR* npc /* next pc, not supported on ARM */
  1200.     )
  1201.     {
  1202.     REG_SET regSet; /* task's register set */
  1203.     if (taskRegsGet (tid, &regSet) != OK)
  1204.         return;
  1205.     regSet.pc = pc;
  1206.     taskRegsSet (tid, &regSet);
  1207.     }
  1208. /*******************************************************************************
  1209. *
  1210. * _dbgTaskPCGet - restore register set
  1211. *
  1212. * RETURNS: N/A
  1213. *
  1214. * NOMANUAL
  1215. */
  1216. INSTR * _dbgTaskPCGet
  1217.     (
  1218.     int tid /* task id */
  1219.     )
  1220.     {
  1221.     REG_SET regSet; /* task's register set */
  1222.     taskRegsGet (tid, &regSet);
  1223.     return regSet.pc;
  1224.     }
  1225. /*******************************************************************************
  1226. *
  1227. * _dbgTraceDisable - disable trace mode
  1228. *
  1229. * NOMANUAL
  1230. *
  1231. * Can be a null routine on the ARM which has no trace mode.
  1232. */
  1233. void _dbgTraceDisable (void)
  1234.     {
  1235.     }
  1236. /*******************************************************************************
  1237. *
  1238. * getOneReg - return the contents of one register
  1239. *
  1240. * Given a task's ID, this routine returns the contents of the register
  1241. * specified by the register code.  This routine is used by `a1', `cpsr', etc.
  1242. *
  1243. * RETURNS: register contents, or ERROR.
  1244. */
  1245. LOCAL int getOneReg (taskId, regCode)
  1246.     int taskId; /* task's id, 0 means default task */
  1247.     int regCode; /* code for specifying register */
  1248.     {
  1249.     REG_SET regSet; /* get task's regs into here */
  1250.     taskId = taskIdFigure (taskId); /* translate super name to id */
  1251.     if (taskId == ERROR) /* couldn't figure out super name */
  1252. return ERROR;
  1253.     taskId = taskIdDefault (taskId); /* set the default id */
  1254.     if (taskRegsGet (taskId, &regSet) != OK)
  1255. return ERROR;
  1256.     switch (regCode)
  1257. {
  1258. case 0:  return regSet.r[0]; /* general registers */
  1259. case 1:  return regSet.r[1];
  1260. case 2:  return regSet.r[2];
  1261. case 3:  return regSet.r[3];
  1262. case 4:  return regSet.r[4];
  1263. case 5:  return regSet.r[5];
  1264. case 6:  return regSet.r[6];
  1265. case 7:  return regSet.r[7];
  1266. case 8:  return regSet.r[8];
  1267. case 9:  return regSet.r[9];
  1268. case 10: return regSet.r[10];
  1269. case 11: return regSet.r[11];
  1270. case 12: return regSet.r[12];
  1271. case 13: return regSet.r[13];
  1272. case 14: return regSet.r[14];
  1273. case 15: return (int) regSet.pc;
  1274. case ARM_REG_CPSR: return regSet.cpsr;
  1275. }
  1276.     return ERROR; /* unknown regCode */
  1277.     }
  1278. /*******************************************************************************
  1279. *
  1280. * r0 - return the contents of register `r0' (also `r1' - `r14') (ARM)
  1281. *
  1282. * This command extracts the contents of register `r0' from the TCB of a
  1283. * specified task.  If <taskId> is omitted or zero, the last task referenced is
  1284. * assumed.
  1285. *
  1286. * Similar routines are provided for registers (`r1' - `r14'):
  1287. * r1() - r14().
  1288. *
  1289. * RETURNS: The contents of register `r0' (or the requested register).
  1290. *
  1291. * SEE ALSO:
  1292. * .pG "Debugging"
  1293. */
  1294. int r0
  1295.     (
  1296.     int taskId /* task ID, 0 means default task */
  1297.     )
  1298.     {
  1299.     return getOneReg (taskId, 0);
  1300.     }
  1301. int r1  (taskId) int taskId; { return getOneReg (taskId, 1); }
  1302. int r2  (taskId) int taskId; { return getOneReg (taskId, 2); }
  1303. int r3  (taskId) int taskId; { return getOneReg (taskId, 3); }
  1304. int r4  (taskId) int taskId; { return getOneReg (taskId, 4); }
  1305. int r5  (taskId) int taskId; { return getOneReg (taskId, 5); }
  1306. int r6  (taskId) int taskId; { return getOneReg (taskId, 6); }
  1307. int r7  (taskId) int taskId; { return getOneReg (taskId, 7); }
  1308. int r8  (taskId) int taskId; { return getOneReg (taskId, 8); }
  1309. int r9  (taskId) int taskId; { return getOneReg (taskId, 9); }
  1310. int r10 (taskId) int taskId; { return getOneReg (taskId, 10); }
  1311. int r11 (taskId) int taskId; { return getOneReg (taskId, 11); }
  1312. int r12 (taskId) int taskId; { return getOneReg (taskId, 12); }
  1313. int r13 (taskId) int taskId; { return getOneReg (taskId, 13); }
  1314. int r14 (taskId) int taskId; { return getOneReg (taskId, 14); }
  1315. /*******************************************************************************
  1316. *
  1317. * cpsr - return the contents of the current processor status register (ARM)
  1318. *
  1319. * This command extracts the contents of the status register from the TCB of a
  1320. * specified task.  If <taskId> is omitted or zero, the last task referenced is
  1321. * assumed.
  1322. *
  1323. * RETURNS: The contents of the current processor status register.
  1324. *
  1325. * SEE ALSO:
  1326. * .pG "Debugging"
  1327. */
  1328. int cpsr
  1329.     (
  1330.     int taskId /* task ID, 0 means default task */
  1331.     )
  1332.     {
  1333.     return getOneReg (taskId, ARM_REG_CPSR);
  1334.     }
  1335. /*******************************************************************************
  1336. *
  1337. * psrShow - display the meaning of a specified PSR value, symbolically (ARM)
  1338. *
  1339. * This routine displays the meaning of all fields in a specified PSR value,
  1340. * symbolically.
  1341. *
  1342. * RETURNS: OK, always.
  1343. *
  1344. */
  1345. STATUS psrShow
  1346.     (
  1347.     UINT32 psrval /* psr value to show */
  1348.     )
  1349.     {
  1350.     char str[16]; /* NZVCIFTSYSTEM32 */
  1351.     strcpy(str, "nzcvift");
  1352.     if (psrval & N_BIT)
  1353. str[0] = 'N';
  1354.     if (psrval & Z_BIT)
  1355. str[1] = 'Z';
  1356.     if (psrval & C_BIT)
  1357. str[2] = 'C';
  1358.     if (psrval & V_BIT)
  1359. str[3] = 'V';
  1360.     if (psrval & I_BIT)
  1361. str[4] = 'I';
  1362.     if (psrval & F_BIT)
  1363. str[5] = 'F';
  1364.     if (psrval & T_BIT)
  1365. str[6] = 'T';
  1366.     switch (psrval & 0x1F)
  1367. {
  1368. case MODE_USER32:
  1369.     strcat(str, "USER32");
  1370.     break;
  1371. case MODE_FIQ32:
  1372.     strcat(str, "FIQ32");
  1373.     break;
  1374. case MODE_IRQ32:
  1375.     strcat(str, "IRQ32");
  1376.     break;
  1377. case MODE_SVC32:
  1378.     strcat(str, "SVC32");
  1379.     break;
  1380. case MODE_ABORT32:
  1381.     strcat(str, "ABORT32");
  1382.     break;
  1383. case MODE_UNDEF32:
  1384.     strcat(str, "UNDEF32");
  1385.     break;
  1386. case MODE_SYSTEM32:
  1387.     strcat(str, "SYSTEM32");
  1388.     break;
  1389. default:
  1390.     strcat(str, "------");
  1391.     break;
  1392.     }
  1393.     printf("%sn", str);
  1394.     return OK;
  1395.     }
  1396. /*******************************************************************************
  1397. *
  1398. * armBreakpoint - handle breakpoint
  1399. *
  1400. * This routine is installed via a function pointer into the exception handling
  1401. * code. It handles the breakpoint exception and chains on to the
  1402. * architecture-independent breakpoint handling code from dbgLib.c.
  1403. * Note that this and wdbArchLib cannot be used at the same time as they
  1404. * use the same mechanism.
  1405. *
  1406. * RETURNS: N/A
  1407. *
  1408. */
  1409. LOCAL void armBreakpoint
  1410.     (
  1411.     ESF * pInfo, /* pointer to info saved on stack */
  1412.     REG_SET *pRegs /* pointer to saved registers */
  1413.     )
  1414.     {
  1415. dbgBreakpoint ((BREAK_ESF *)pInfo, (int *)pRegs);
  1416.     }
  1417. /*******************************************************************************
  1418. *
  1419. * _dbgStepAdd - add a breakpoint
  1420. *
  1421. * NOMANUAL
  1422. *
  1423. * This requirement for this routine appears to be to set a single-stepping
  1424. * breakpoint at the "next" instruction. Branches and so on must be predicted
  1425. * and we are allowed to put breakpoints at all possible "next" instructions.
  1426. * Deciding all possible next instructions on the ARM is sufficiently complex
  1427. * that in fact, we might as well work out exactly where the next instruction
  1428. * will be and put only one breakpoint there.
  1429. *
  1430. * RETURNS: status of adding breakpoints
  1431. *
  1432. */
  1433. STATUS _dbgStepAdd
  1434.     (
  1435.     int task, /* task for which breakpoint is to be set */
  1436.     int type, /* breakpoint type (either BRK_STEP or BRK_TEMP) */
  1437.     BREAK_ESF * pEsf,
  1438.     int *  pRegs
  1439.     )
  1440.     {
  1441.     REG_SET regSet; /* task's register set */
  1442.     /* It appears to be the case that if the pointer to the ESF is null, then
  1443.      * there will be no regs either, so get them */
  1444.     if (pEsf == NULL)
  1445. (void) taskRegsGet (task, &regSet);
  1446.     else
  1447. regSet.pc = _dbgInfoPCGet (pEsf);
  1448.     /* find the next instruction to be executed and set a breakpoint there */
  1449.     return dbgBrkAdd (armGetNpc (*(regSet.pc), &regSet), task, 0, type);
  1450.     }
  1451. /* dbgArchLib.c - SH-dependent debugger library */
  1452.   
  1453. /* Copyright 1984-2001 Wind River Systems, Inc. */
  1454. #include "copyright_wrs.h"
  1455. /*
  1456. modification history
  1457. --------------------
  1458. 02t,24oct01,zl   fixes for doc builds.
  1459. 02s,15nov00,zl   fixed _dbgInstSizeGet().
  1460. 02r,06sep00,zl   simplified CPU conditionals. Updated _archHelp_msg.
  1461. 02q,03may00,rsh  fix instruction mask error and add some better documentation
  1462. 02p,21apr00,rsh  implement cret
  1463. 02o,19apr00,frf  Modified dbgHelp and dbgBrkDisplayHard functions
  1464. 02n,13apr00,frf  Removed BRKENTRY and HWBP
  1465. 02m,27mar00,frf  Add SH support for T2: dbg API updated
  1466. 02l,11mar99,hk   changed TBH_ to TSH_BH_, simplified CPU conditionals.
  1467.                  merged _archHelp_msg for all SH CPUs.
  1468. 02k,09mar99,hk   changed to include CPU specific header for UBC register defs.
  1469. 02j,09mar99,hk   changed macro prefix BH_ to TBH_, to recover target shell tool.
  1470. 02i,02mar99,hk   retrieved _archHelp_msg for non-SENS branch.
  1471. 02h,09oct98,hk   code review: sorted CPU conditionals. fixed dBRCR for SH7750.
  1472. 02g,07oct98,st   changed BBRA,BBRB default setting for SH7750 from
  1473.                  BBR_BREAK_AT_INST_OR_DATA_ACCESS to BBR_BREAK_AT_INST_FETCH.
  1474. 02f,16jul98,st   added support for SH7750.
  1475. 02g,15oct98,kab  removed obsolete archHelp_msg.
  1476. 02f,08may97,jmc  added support for SH-DSP and SH3-DSP.
  1477. 02e,23apr98,hk   fixed _dbgStepAdd() against slot instr exception by s().
  1478. 02d,25apr97,hk   changed SH704X to SH7040.
  1479. 02c,09feb97,hk   renamed excBpHandle/excBpHwHandle to dbgBpStub/dbgHwBpStub.
  1480. 02b,08aug96,hk   code layout review. changed some #if (CPU==SH7xxx) controls.
  1481. 02a,24jul96,ja   added support for SH7700.
  1482. 01z,21may96,hk   workarounded for SH7700 build.
  1483. 01y,10may96,hk   added support for SH7700 (first phase).
  1484. 01x,19dec95,hk   added support for SH704X.
  1485. 01w,08aug95,sa   fixed _dbgStepAdd().
  1486. 01v,28jun95,hk   rewrote _dbgBranchDelay().
  1487. 01u,27jun95,hk   deleted _dbgBranchDelay().
  1488. 01t,16mar95,hk   added bypass to the delay slot checking in _dbgBranchDelay().
  1489. 01s,28feb95,hk   changed _dbgVecInit() to conform ivSh.h 01e.
  1490. 01r,22feb95,hk   added SH7000 support. moved printBbr(), printBrcr() to sysLib.
  1491. 01q,21feb95,hk   obsoleted bh(,4), more refinements, wrote some docs.
  1492. 01p,20feb95,hk   limited data break setup only for ch.B.
  1493. 01o,17feb95,hk   added bh(,4) to allow parameter customization.
  1494. 01n,15feb95,hk   debugging bh() problem.
  1495. 01m,07feb95,hk   copyright year 1995. more rewriting.
  1496. 01l,11jan95,hk   rewriting h/w breakpoint stuff.
  1497. 01k,25dec94,hk   fixed _archHelp_msg, clean-up. added _dbgBranchDelay().
  1498.  fixed _dbgInstSizeGet(), so() now functional.
  1499. 01j,23dec94,hk   changing macro names.
  1500. 01i,21dec94,hk   working on UBC code. adding sequence diagram.
  1501. 01h,18dec94,hk   writing UBC support code.
  1502. 01g,15dec94,hk   adding hardware breakpoint function prototypes from i960 01t.
  1503. 01f,15dec94,hk   use SR_BIT_T.
  1504. 01e,15dec94,hk   more fixing. Now s() command is functional.
  1505. 01d,06dec94,hk   fixing.
  1506. 01c,01dec94,hk   included archPortKit notes. wrote most routines.
  1507. 01b,26nov94,hk   wrote _dbgArchInit body.
  1508. 01a,09oct94,hk   written based on sparc 01i.
  1509. */
  1510. /*
  1511. DESCRIPTION
  1512. This module provides the SH specific support functions for dbgLib.
  1513. NOMANUAL
  1514. INTERNAL
  1515. This architecture-dependent debugger library contains some simple routines
  1516. that support the architecture-independent dbgLib.c. The complex portions of
  1517. the debugger have been abstracted. 
  1518. */
  1519. #include "vxWorks.h"
  1520. #include "private/dbgLibP.h"
  1521. #include "taskLib.h"
  1522. #include "fppLib.h"
  1523. #include "taskArchLib.h"
  1524. #include "intLib.h"
  1525. #include "regs.h"
  1526. #include "iv.h"
  1527. #include "cacheLib.h"
  1528. #include "ioLib.h"
  1529. #include "dsmLib.h"
  1530. #include "vxLib.h"
  1531. #include "stdio.h"
  1532. #include "usrLib.h"
  1533. IMPORT int    dsmNbytes ();
  1534. IMPORT int    dsmInst ();
  1535. IMPORT INST * dsmCheck ();
  1536. /* globals */
  1537. /* _archHelp_msg
  1538.  *
  1539.  * INTERNAL
  1540.  * Architecture-specific help routines for the debugger are summarized in this
  1541.  * string. The routine syntax is added to the end of the architecture-indepent
  1542.  * routines displayed by dbgHelp(). The register display routines comprise the
  1543.  * minimal set, and it should include any additional functionality that may be
  1544.  * useful for debugging. [Arch port kit]
  1545.  */
  1546. char * _archHelp_msg =
  1547.  "bh        addr[,access[,task[,count[,quiet]]]] Set hardware breakpointn"
  1548.  "                access values:n"
  1549.  "                 - Break on any access         (              00)n"
  1550.  "                 - Break on instruction fetch  (              01)n"
  1551.  "                 - Break on data access        (              10)n"
  1552.  "                 - Bus cycle any               (            00  )n"
  1553.  "                 - Bus cycle read              (            01  )n"
  1554.  "                 - Bus cycle write             (            10  )n"
  1555.  "                 - Operand size any            (          00    )n"
  1556.  "                 - Operand size byte           (          01    )n"
  1557.  "                 - Operand size word           (          10    )n"
  1558.  "                 - Operand size long           (          11    )n"
  1559.  "                 - CPU access                  (        00      )n"
  1560.  "                 - DMAC access                 (        01      )n"
  1561.  "                 - CPU or DMAC access          (        10      )n"
  1562.  "                 - IBUS                        (      00        )n"
  1563.  "                 - XBUS                        (      01        )n"
  1564.  "                 - YBUS                        (      10        )n"
  1565.  "   *Not all access combinations are supported by all SuperH CPUs.n"
  1566.  "    Use of an invalid combination is not always reported as an error.n"
  1567.  "r0-r15,sr,gbr,vbr,mach,macl,pr,pc [task]       Get a register of a taskn";
  1568. /* forward declarations */
  1569. /*******************************************************************************
  1570. *
  1571. * _dbgArchInit - architecture dependent initialization routine
  1572. *
  1573. * This routine initialize global function pointers that are architecture 
  1574. * specific.
  1575. *
  1576. * NOMANUAL
  1577. *
  1578. * INTERNAL
  1579. * This function is identical for all architectures. It is used to link the
  1580. * architecture-specific routines in this file to the architecture-independent
  1581. * debugger support. The generic function call attaches the new processor's
  1582. * debugger library support. [Arch port kit]
  1583. *
  1584. * NOTE
  1585. * This routine is called from dbgInit() only.
  1586. */
  1587. void _dbgArchInit (void)
  1588.     {
  1589.     _dbgDsmInstRtn   = (FUNCPTR)  dsmInst;
  1590.     }
  1591. /*******************************************************************************
  1592. *
  1593. * _dbgInstSizeGet - set up breakpoint instruction
  1594. *
  1595. * RETURNS: size of the instruction at specified location.
  1596. *
  1597. * NOMANUAL
  1598. *
  1599. * INTERNAL
  1600. * This routine currently returns the number of 16-bit words needed to implement
  1601. * the breakpoint instruction at the specified address. It returns 16-bit words,
  1602. * instead of bytes, for compatibility with the original 68K debugger design;
  1603. * this does not make much sense for other architectures. In some future release
  1604. * the return value will be more architecture-independent, in other words, in
  1605. * bytes. [Arch port kit]
  1606. *
  1607. * NOTE
  1608. * This routine is called from so() only.  Any SH instruction is 16-bit length,
  1609. * but we treat a delayed branch instruction as 32-bit.  Otherwise we may insert
  1610. * the trapa instruction in a delay slot and gets an illegal slot exception.
  1611. */
  1612. int _dbgInstSizeGet
  1613.     (
  1614.     INSTR * pBrkInst /* pointer to hold breakpoint instruction */
  1615.     )
  1616.     {
  1617.     return (dsmNbytes (pBrkInst) / sizeof (INSTR));
  1618.     }
  1619. /*******************************************************************************
  1620. *
  1621. * _dbgRetAdrsGet - get return address for current routine
  1622. *
  1623. * RETURNS: return address for current routine.
  1624. *
  1625. * NOMANUAL
  1626. *
  1627. * INTERNAL
  1628. * A pointer to a REG_SET is passed to this routine. It returns the adress of the
  1629. * instruction in the calling routine that will be executed when this function
  1630. * returns. Depending on the processor's function call mechanism and pipelining,
  1631. * the calling routine's program counter may have to be adjusted to create the
  1632. * return address. [Arch port kit]
  1633. *
  1634. * INTERNAL
  1635. * While executing a leaf procedure, the pr register always holds the correct
  1636. * return address.  In case of a non-leaf procedure, this is not always true.
  1637. * After returning from a subroutine, pr keeps holding a return address of the
  1638. * subroutine.  The correct return address of non-leaf procedure is on stack.
  1639. *
  1640. * ex. proc: <<< pr valid >>>
  1641. *      :
  1642. * 4f22      sts.l  pr, @-sp
  1643. *      :
  1644. *     mov.l  &subr,r0
  1645. *     jsr    @r0              
  1646. *     nop
  1647. *      :
  1648. *     <<< pr invalid >>>  ---> pr contains the return adrs of "subr".
  1649. *      :
  1650. * 4f26      lds.l  @sp+,pr    ---> return adrs of "proc" is popped at here.
  1651. *      :
  1652. * 000b      rts
  1653. *     nop
  1654. *
  1655. * NOTE
  1656. * This routine currently only detects #imm adjustment of the stack. Consequently,
  1657. * it will not find the correct frame pointer adjustment in functions which have
  1658. * greater than 127 (7 #imm bits) bytes of parameters and local data. A search
  1659. * through usrConfig.o indicates such a case only occurs once. For Beta, this
  1660. * should be sufficient.
  1661. *
  1662. */
  1663. INSTR * _dbgRetAdrsGet
  1664.     (
  1665.     REG_SET * pRegSet
  1666.     )
  1667.     {
  1668.     INSTR * scanpc;        /* instruction scan pc pointer for forward scan */
  1669.     UINT16 immed;
  1670.     INT32 offset;
  1671.     void * fp;
  1672.     /*
  1673.     * scan instructions forward. If we find a "sts.l pr,@-sp" or a "jsr @rm"
  1674.     * then the return address in already in the link register.  If we
  1675.     * find a "lds.l @sp+,pr" then the return address is saved on the
  1676.     * stack. We need to search back to find the offset. 
  1677.     * If we find "rts" without encountering the above instructions, it is
  1678.     * a leaf function and the return address is in register "pr".
  1679.     */
  1680.  
  1681.  
  1682.     for (scanpc = pRegSet->pc; TRUE; scanpc++)
  1683.         {
  1684.         /* 
  1685.          * if inst is "sts.l pr,@-sp" we are in the prolog.
  1686.          * if inst is "rts" we are in a leaf proceedure. Note that
  1687.          * this assumes you cannot break in the epilog, which would be
  1688.          * true for c code, but not necessarily for assembly.
  1689.          * Either way, the TCB's pr value is valid. 
  1690.          */
  1691.         if ((INST_CMP(scanpc, INST_PUSH_PR, 0xffff)) ||
  1692.             (INST_CMP(scanpc, INST_RTS, 0xffff)))
  1693.             {
  1694.             return (pRegSet->pr);
  1695.             }
  1696.         /*
  1697.          * we are somewhere in the function body of a non-leaf
  1698.          * routine and the pr may have been modified by a previous
  1699.          * function call. The correct pr is on the stack and must
  1700.          * be retrieved. Break from here and enter the search backwards
  1701.          * loop.
  1702.          */
  1703.         else if (INST_CMP(scanpc, INST_POP_PR, 0xffff))
  1704.             {
  1705.             break;
  1706.             }
  1707.         }
  1708.     /* if we arrive here, we are inside the function body and the current
  1709.      * tcb's pr value may be invalid (i.e. we may have called a subroutine
  1710.      * within the current function body which would have modified pr). 
  1711.      * Consequently, we'll need to search backwards to find 1) the current
  1712.      * frame pointer (stored in r14) and 2) the offset from the current
  1713.      * frame pointer back to the pr location on the stack. The sh compiler
  1714.      * sets the frame pointer to the stack location of the last parameter
  1715.      * or local allocation so that we have a variable offset back to the
  1716.      * pr location.
  1717.      */
  1718.     scanpc = pRegSet->pc;
  1719.     /* search back until we have the SET_FP instruction (mov.l sp,r14) */
  1720.     while (!(INST_CMP(scanpc, INST_SET_FP, 0xffff)))
  1721.         {
  1722.         scanpc--;
  1723.         }
  1724.     /* search back until the PUSH_PR instruction looking for a frame
  1725.      * adjustment instruction that modifies r15 before storing to r14.
  1726.      * (add #imm,sp). The #imm argument 
  1727.      */
  1728.     while (!(INST_CMP(scanpc, INST_PUSH_PR, 0xffff)))
  1729.         {
  1730.         if (INST_CMP(scanpc, INST_ADD_IMM_SP, MASK_ADD_IMM_SP)) 
  1731.             {
  1732.             immed = *(scanpc) & 0x00ff;
  1733.             /* "add #imm,sp" instruction sign extends #imm. Since this instruction
  1734.              * descremented the sp, #imm will be a negative value. sign extend
  1735.              * it to get it's proper negative value. And then reverse the sign.
  1736.              */
  1737.             offset = (0xffffff00 | (long) immed);   /* negative offset */
  1738.             offset = 0 - (offset);
  1739.             /* add offset to frame pointer */ 
  1740.             (ULONG *) fp = pRegSet->fpReg;
  1741.             (char *) fp += offset;
  1742.             /* retrieve and return pr */
  1743.             return ((INSTR *) *((ULONG *) fp));
  1744.             }
  1745.         scanpc--;
  1746.         }
  1747.     /* if we get here, then the offset is zero, so just return the value
  1748.      * held in r14 (the frame pointer).
  1749.      */
  1750.     return ((INSTR *) *((ULONG *) pRegSet->fpReg));
  1751. #if FALSE
  1752.     return ((INSTR *) ERROR);
  1753. #endif
  1754.     }
  1755. /*******************************************************************************
  1756. *
  1757. * _dbgFuncCallCheck - check next instruction
  1758. *
  1759. * This routine checks to see if the next instruction is a JSR or BSR.
  1760. * If it is, it returns TRUE, otherwise, returns FALSE.
  1761. *
  1762. * RETURNS: TRUE if next instruction is JSR or BSR, or FALSE otherwise.
  1763. *
  1764. * NOMANUAL
  1765. *
  1766. * INTERNAL
  1767. * This routine checks the instruction pointed to by the input argument to
  1768. * determine if it is an instruction that is used to implement a function call.
  1769. * If so, the function returns TRUE, otherwise the return value is FALSE.
  1770. * Note the use of the INST_CMP macro defined in dbgLib.h. [Arch port kit]
  1771. *
  1772. * NOTE
  1773. * This routine is called from so() only.
  1774. */
  1775. BOOL _dbgFuncCallCheck
  1776.     (
  1777.     INSTR * addr
  1778.     )
  1779.     {
  1780.     /* SH JSR and BSR instructions:
  1781.      * 
  1782.      * JSR @Rn 0100nnnn00001011 itAtOneReg  - 2/3
  1783.      * BSRF Rn 0000nnnn00000011 itBraDispRn - 2/2
  1784.      * BSR disp 1011dddddddddddd itBraDisp12 - 2/2
  1785.      */
  1786.     return (INST_CMP (addr, 0x400b, 0xf0ff) /* JSR  */
  1787. ||  INST_CMP (addr, 0x0003, 0xf0ff) /* BSRF */
  1788. ||  INST_CMP (addr, 0xb000, 0xf000) /* BSR  */ );
  1789.     }
  1790. /*******************************************************************************
  1791. *
  1792. * _dbgInfoPCGet - get pc from stack
  1793. *
  1794. * RETURNS: value of pc saved on stack
  1795. *
  1796. * NOMANUAL
  1797. *
  1798. * INTERNAL
  1799. * This routine returns a pointer to the instruction addressed by the program
  1800. * counter. The input argument is a pointer to the breakpoint stack frame. The
  1801. * return value is the program counter element of that structure, whose type
  1802. * should be an INSTR*. [Arch port kit]
  1803. *
  1804. * NOTE
  1805. * This routine is called from dbgBreakpoint() only.
  1806. */
  1807. INSTR * _dbgInfoPCGet
  1808.     (
  1809.     BREAK_ESF * pInfo
  1810.     )
  1811.     {
  1812.     return (pInfo->pc);
  1813.     }
  1814. /*******************************************************************************
  1815. *
  1816. * _dbgTaskPCSet - set task's pc
  1817. *
  1818. * NOMANUAL
  1819. *
  1820. * INTERNAL
  1821. * The task identification and the program counter(s) are passed to this
  1822. * function which will set new program counter(s) for the specified task.
  1823. * A local copy of REG_SET is filled by the call to taskRegsGet(), the program
  1824. * counter(s) set, and then copied back to the task's TCB by taskRegsSet().
  1825. * This routine is similar for all architectures. [Arch port kit]
  1826. *
  1827. * NOTE
  1828. * This routine is called from c() and s().
  1829. */
  1830. void _dbgTaskPCSet
  1831.     (
  1832.     int     tid,
  1833.     INSTR * pc, /* task's pc                        */
  1834.     INSTR * npc /* task's npc (not supported by SH) */
  1835.     )
  1836.     {
  1837.     REG_SET regSet;
  1838.     if (taskRegsGet (tid, &regSet) != OK)
  1839. return;
  1840.     regSet.pc = pc;
  1841.     taskRegsSet (tid, &regSet);
  1842.     }
  1843. /*******************************************************************************
  1844. *
  1845. * _dbgTaskPCGet - get task's pc
  1846. *
  1847. * RETURNS: specified task's program counter
  1848. *
  1849. * NOMANUAL
  1850. *
  1851. * INTERNAL
  1852. * This routine returns a pointer to the instruction addressed by the program
  1853. * counter. The input argument is the task identifier used with taskRegsGet().
  1854. * The return value is the program counter element of that structure, whose
  1855. * type should be an INSTR*. [Arch port kit]
  1856. *
  1857. * NOTE
  1858. * This routine is called from c(), so(), dbgTlSnglStep(), and dbgTaskSwitch().
  1859. */
  1860. INSTR * _dbgTaskPCGet
  1861.     (
  1862.     int     tid
  1863.     )
  1864.     {
  1865.     REG_SET regSet;
  1866.     (void) taskRegsGet (tid, &regSet);
  1867.     return ((INSTR *) regSet.pc);
  1868.     }
  1869. /*******************************************************************************
  1870. *
  1871. * getOneReg - return the contents of one register
  1872. *
  1873. * Given a task's ID, this routine returns the contents of the register
  1874. * specified by the register code.  This routine is used by r0, sr, etc.
  1875. * The register codes are defined in regsSh.h.
  1876. *
  1877. * NOMANUAL
  1878. *
  1879. * RETURNS: register contents, or ERROR.
  1880. *
  1881. * INTERNAL
  1882. * This routine gets the contents of a specific register in the REG_SET based on
  1883. * the task identifier and the register index. A call is made to taskIdFigure(),
  1884. * and the return value checked for an ERROR. taskIdDefault() and taskRegsGer()
  1885. * are called to fill a local copy of REG_SET. The index is used to return the
  1886. * contents of the register. [Arch port kit]
  1887. *
  1888. */
  1889. LOCAL int getOneReg
  1890.     (
  1891.     int     taskId, /* task ID, 0 means default task */
  1892.     int     regCode /* code for specifying register */
  1893.     )
  1894.     {
  1895.     REG_SET regSet; /* get task's regs into here */
  1896.     taskId = taskIdFigure (taskId); /* translate super name to ID */
  1897.     if (taskId == ERROR) /* couldn't figure out super name */
  1898. return (ERROR);
  1899.     taskId = taskIdDefault (taskId); /* set the default ID */
  1900.     if (taskRegsGet (taskId, &regSet) != OK)
  1901. return (ERROR);
  1902.     return (*(int *)((int)&regSet + regCode));
  1903.     }
  1904. /*******************************************************************************
  1905. *
  1906. * r0 - return the contents of general register `r0' (also `r1'-`r15') (SH)
  1907. *
  1908. * This command extracts the contents of register `r0' from the TCB of a specified
  1909. * task.  If <taskId> is omitted or zero, the last task referenced is assumed.
  1910. *
  1911. * Similar routines are provided for all general registers (`r1' - `r15'):
  1912. * r1() - r15().
  1913. *
  1914. * RETURNS: The contents of register r0 (or the requested register).
  1915. *
  1916. * SEE ALSO:
  1917. * .pG "Debugging"
  1918. *
  1919. * INTERNAL
  1920. * Each control and general-purpose register should have a routine to display
  1921. * its contents in the REG_SET structure in the TCB. The task identifier and
  1922. * a register index is passed to the hidden (local) function getOneReg() which
  1923. * returns the contents. [Arch port kit]
  1924. */
  1925. int r0
  1926.     (
  1927.     int taskId /* task ID, 0 means default task */
  1928.     )
  1929.     {
  1930.     return (getOneReg (taskId, REG_SET_R0  ));
  1931.     }
  1932. int r1  (int taskId) { return (getOneReg (taskId, REG_SET_R1  )); }
  1933. int r2  (int taskId) { return (getOneReg (taskId, REG_SET_R2  )); }
  1934. int r3  (int taskId) { return (getOneReg (taskId, REG_SET_R3  )); }
  1935. int r4  (int taskId) { return (getOneReg (taskId, REG_SET_R4  )); }
  1936. int r5  (int taskId) { return (getOneReg (taskId, REG_SET_R5  )); }
  1937. int r6  (int taskId) { return (getOneReg (taskId, REG_SET_R6  )); }
  1938. int r7  (int taskId) { return (getOneReg (taskId, REG_SET_R7  )); }
  1939. int r8  (int taskId) { return (getOneReg (taskId, REG_SET_R8  )); }
  1940. int r9  (int taskId) { return (getOneReg (taskId, REG_SET_R9  )); }
  1941. int r10 (int taskId) { return (getOneReg (taskId, REG_SET_R10 )); }
  1942. int r11 (int taskId) { return (getOneReg (taskId, REG_SET_R11 )); }
  1943. int r12 (int taskId) { return (getOneReg (taskId, REG_SET_R12 )); }
  1944. int r13 (int taskId) { return (getOneReg (taskId, REG_SET_R13 )); }
  1945. int r14 (int taskId) { return (getOneReg (taskId, REG_SET_R14 )); }
  1946. int r15 (int taskId) { return (getOneReg (taskId, REG_SET_R15 )); }
  1947. /*******************************************************************************
  1948. *
  1949. * sr - return the contents of control register `sr' (also `gbr', `vbr') (SH)
  1950. *
  1951. * This command extracts the contents of register sr from the TCB of a specified
  1952. * task.  If <taskId> is omitted or zero, the last task referenced is assumed.
  1953. *
  1954. * Similar routines are provided for all control registers (`gbr', `vbr'):
  1955. * gbr(), vbr().
  1956. *
  1957. * RETURNS: The contents of register sr (or the requested control register).
  1958. *
  1959. * SEE ALSO:
  1960. * .pG "Debugging"
  1961. *
  1962. * INTERNAL
  1963. * Each control and general-purpose register should have a routine to display
  1964. * its contents in the REG_SET structure in the TCB. The task identifier and
  1965. * a register index is passed to the hidden (local) function getOneReg() which
  1966. * returns the contents. [Arch port kit]
  1967. */
  1968. int sr
  1969.     (
  1970.     int taskId /* task ID, 0 means default task */
  1971.     )
  1972.     {
  1973.     return (getOneReg (taskId, REG_SET_SR  ));
  1974.     }
  1975. int gbr (int taskId) { return (getOneReg (taskId, REG_SET_GBR )); }
  1976. int vbr (int taskId) { return (getOneReg (taskId, REG_SET_VBR )); }
  1977. /*******************************************************************************
  1978. *
  1979. * mach - return the contents of system register `mach' (also `macl', `pr') (SH)
  1980. *
  1981. * This command extracts the contents of register mach from the TCB of
  1982. * a specified task.  If <taskId> is omitted or zero, the last task referenced
  1983. * is assumed.
  1984. *
  1985. * Similar routines are provided for other system registers (`macl', `pr'):
  1986. * macl(), pr().  Note that pc() is provided by usrLib.c.
  1987. *
  1988. * RETURNS: The contents of register mach (or the requested system register).
  1989. *
  1990. * SEE ALSO:
  1991. * .pG "Debugging"
  1992. *
  1993. * INTERNAL
  1994. * Each control and general-purpose register should have a routine to display
  1995. * its contents in the REG_SET structure in the TCB. The task identifier and
  1996. * a register index is passed to the hidden (local) function getOneReg() which
  1997. * returns the contents. [Arch port kit]
  1998. */
  1999. int mach
  2000.     (
  2001.     int taskId /* task ID, 0 means default task */
  2002.     )
  2003.     {
  2004.     return (getOneReg (taskId, REG_SET_MACH));
  2005.     }
  2006. int macl(int taskId) { return (getOneReg (taskId, REG_SET_MACL)); }
  2007. int pr  (int taskId) { return (getOneReg (taskId, REG_SET_PR  )); }
  2008. #if FALSE
  2009. int pc  (int taskId) { return (getOneReg (taskId, REG_SET_PC  )); }
  2010. #endif /* FALSE, usrLib provides this. */
  2011. #if DBG_HARDWARE_BP   /* TO THE END OF THIS FILE */
  2012. /******************************************************************************
  2013. *
  2014. * _dbgBrkDisplayHard - display a hardware breakpoint
  2015. *
  2016. * NOMANUAL
  2017. *
  2018. * NOTE
  2019. * This routine is called from dbgBrkDisplay() only.
  2020. */
  2021. void _dbgBrkDisplayHard
  2022.     (
  2023.     BRKPT * pBp            /* breakpoint table entry */
  2024.     )
  2025.     {
  2026.     int type;
  2027.     if ((pBp->bp_flags & BRK_HARDWARE) == 0) 
  2028.         return;
  2029.     type = pBp->bp_flags & BRK_HARDMASK;
  2030.     printf ("n            UBC");
  2031.     switch (type & BH_BREAK_MASK)
  2032. {
  2033. /* HW breakpoint on bus... */
  2034. case BH_BREAK_INSN:  printf(" INST"); break; /* istruction access */
  2035. case BH_BREAK_DATA:  printf(" DATA"); break; /* data access */
  2036. default:             printf(" I/D"); break; /* any */
  2037. }
  2038.     switch (type & BH_CYCLE_MASK)
  2039. {
  2040.         /* HW breakpoint on bus cycle... */
  2041. case BH_CYCLE_READ:  printf(" READ"); break; /* read  */
  2042. case BH_CYCLE_WRITE: printf(" WRITE"); break; /* write */
  2043. default:             printf(" R/W"); break;  /* any */
  2044. }
  2045.     switch (type & BH_SIZE_MASK)
  2046. {
  2047. /* HW breakpoint on operand size */
  2048. case BH_8:           printf(" BYTE"); break; /*  8 bit */
  2049. case BH_16:          printf(" WORD"); break; /* 16 bit */
  2050. case BH_32:          printf(" LONG"); break; /* 32 bit */
  2051. }
  2052.     switch (type & BH_CPU_MASK)
  2053. {
  2054.         /* HW breakpoint on bus cycle... */
  2055. case BH_CPU:      printf(" CPU"); break; /* CPU */
  2056. case BH_DMAC:      printf(" DMA"); break; /* DMA ctrl */
  2057. case BH_DMAC_CPU:    printf(" DMA/CPU");break; /* DMA/CPU */
  2058. }
  2059.     switch (type & BH_BUS_MASK)
  2060. {
  2061.         /* HW breakpoint on bus cycle... */
  2062. case BH_XBUS:        printf(" XBUS"); break; /* XBUS, DSP only */
  2063. case BH_YBUS:        printf(" YBUS"); break; /* YBUS, DSP only */
  2064. }
  2065.     }
  2066. #endif /* DBG_HARDWARE_BP */
  2067. /* dbgArchLib.c - solaris simulator debugger library */
  2068. /* Copyright 1993-2001 Wind River Systems, Inc. */
  2069. #include "copyright_wrs.h"
  2070. /*
  2071. modification history
  2072. --------------------
  2073. 02e,13nov01,hbh  Fixed return address in _dbgRetAdrsGet and updated comments.
  2074. 02d,30apr98,dbt  removed unused _dbgInfoPCGet() routine.
  2075. 02c,09jan98,dbt  modified for new breakpoint scheme.
  2076. 02b,26jan96,ism  cleaned up
  2077. 02a,07jun95,ism  converted to simsolaris
  2078. 01f,26jan94,gae  minor improvement to exception display.
  2079. 01e,17dec93,gae  fixed "Segmentaion" spelling.
  2080. 01d,23aug93,rrr  fixup of trcStack and excShow routines.
  2081. 01c,14jul93,gae  trcStack prints not supported; excShowInit() installs routines.
  2082. 01b,09jul93,rrr  added trap handling.
  2083. 01a,19jun93,rrr  written.
  2084. */
  2085. /*
  2086. DESCRIPTION
  2087. This module provides the simsolaris specific support
  2088. functions for dbgLib.c.
  2089. */
  2090. #include "vxWorks.h"
  2091. #include "private/dbgLibP.h"
  2092. #include "taskLib.h"
  2093. #include "taskArchLib.h"
  2094. #include "intLib.h"
  2095. #include "ioLib.h"
  2096. #include "iv.h"
  2097. #include "dsmLib.h"
  2098. #include "regs.h"
  2099. #include "stdio.h"
  2100. #include "usrLib.h"
  2101. /* externs */
  2102. IMPORT int dsmNbytes ();
  2103. IMPORT int dsmInst ();
  2104. /* defines */
  2105. #undef pc
  2106. /* globals */
  2107. char * _archHelp_msg =
  2108.     "i0-i7,l0-l7,o0-o7,g1-g7,n"
  2109.     "pc,npc,psr,wim,y  [task]        Display a register of a taskn"
  2110.     "psrShow   value                 Display meaning of psr valuen";
  2111. /*******************************************************************************
  2112. *
  2113. * _dbgArchInit - architecture dependent initialization routine
  2114. *
  2115. * This routine initialize global function pointers that are architecture 
  2116. * specific.
  2117. *
  2118. * RETURNS: N/A
  2119. *
  2120. * NOMANUAL
  2121. */
  2122. void _dbgArchInit (void)
  2123.     {
  2124.     _dbgDsmInstRtn = (FUNCPTR) dsmInst;
  2125.     }
  2126. /*******************************************************************************
  2127. *
  2128. * _dbgInstSizeGet - set up breakpoint instruction
  2129. *
  2130. * RETURNS: size of the instruction at specified location.
  2131. *
  2132. * NOMANUAL
  2133. */
  2134. int _dbgInstSizeGet
  2135.     (
  2136.     INSTR * pBrkInst /* pointer to hold breakpoint instruction */
  2137.     )
  2138.     {
  2139.     return ((2 * sizeof (INSTR)) / sizeof (INSTR));
  2140.     }
  2141. /*******************************************************************************
  2142. *
  2143. * _dbgRetAdrsGet - get return address for current routine
  2144. *
  2145. * RETURNS: return address for current routine.
  2146. *
  2147. * NOMANUAL
  2148. */
  2149. INSTR * _dbgRetAdrsGet
  2150.     (
  2151.     REG_SET * pRegSet /* pointer to register set */
  2152.     )
  2153.     {
  2154.     int *sp = (int *) pRegSet->spReg;
  2155.     /* 
  2156.      * check if the following instruction is like :
  2157.      * 9de3bxxx save %sp, 0xffffffxx, %sp
  2158.      * if yes, then return address is in o7 register not in i7
  2159.      */
  2160.     if (INST_CMP (((INSTR *) (pRegSet->reg_pc)),INST_SAV,INST_SAV_MASK))
  2161.         return ((INSTR *) ((pRegSet->reg_out[7]) + 8));
  2162.     if (I7_CONTENTS (sp) != 0)
  2163.      {
  2164.      if (INST_CMP (I7_CONTENTS (sp), INST_CALL, INST_CALL_MASK) ||
  2165.             INST_CMP (I7_CONTENTS (sp), JMPL_o7, JMPL_o7_MASK))
  2166.             {
  2167.             return ((INSTR *) (I7_CONTENTS(sp) + 2));
  2168.             }
  2169. }
  2170.     return (NULL);
  2171.     }
  2172. /*******************************************************************************
  2173. *
  2174. * _dbgFuncCallCheck - check next instruction
  2175. *
  2176. * This routine checks to see if the next instruction is a JSR or BSR.
  2177. * If it is, it returns TRUE, otherwise, returns FALSE.
  2178. *
  2179. * RETURNS: TRUE if next instruction is JSR or BSR, or FALSE otherwise.
  2180. *
  2181. * NOMANUAL
  2182. */
  2183. BOOL _dbgFuncCallCheck
  2184.     (
  2185.     INSTR * addr /* pointer to instruction */
  2186.     )
  2187.     {
  2188.     return (INST_CMP (addr, INST_CALL, INST_CALL_MASK) ||
  2189.             INST_CMP (addr, JMPL_o7, JMPL_o7_MASK));
  2190.     }
  2191. /*******************************************************************************
  2192. *
  2193. * _dbgTaskPCSet - set task's pc
  2194. *
  2195. * RETURNS: N/A
  2196. *
  2197. * NOMANUAL
  2198. */
  2199. void _dbgTaskPCSet
  2200.     (
  2201.     int     tid, /* task id */
  2202.     INSTR * pc, /* task's pc */
  2203.     INSTR * npc /* task's npc */
  2204.     )
  2205.     {
  2206.     REG_SET regSet; /* task's register set */
  2207.     taskRegsGet (tid, &regSet);
  2208.     regSet.reg_pc = pc;
  2209.     if (npc == NULL)
  2210. regSet.reg_npc = pc + 1;
  2211.     else
  2212. regSet.reg_npc = npc;
  2213.     taskRegsSet (tid, &regSet);
  2214.     }
  2215. /*******************************************************************************
  2216. *
  2217. * _dbgTaskPCGet - get task's pc
  2218. *
  2219. * RETURNS: N/A
  2220. *
  2221. * NOMANUAL
  2222. */
  2223. INSTR * _dbgTaskPCGet
  2224.     (
  2225.     int tid /* task's id */
  2226.     )
  2227.     {
  2228.     REG_SET regSet;
  2229.     taskRegsGet (tid, &regSet);
  2230.     return ((INSTR *) regSet.reg_pc);
  2231.     }
  2232. /*******************************************************************************
  2233. *
  2234. * getOneReg - return the contents of one register
  2235. *
  2236. * Given a task's ID, this routine returns the contents of the register
  2237. * specified by the register code.  This routine is used by g0, i0, psr, etc.
  2238. * The register codes are defined in regsSimsolaris.h.
  2239. *
  2240. * RETURNS: register contents, or ERROR.
  2241. */
  2242. LOCAL int getOneReg
  2243.     (
  2244.     int taskId, /* task ID, 0 means default task */
  2245.     int regCode /* code for specifying register */
  2246.     )
  2247.     {
  2248.     REG_SET regSet; /* get task's regs into here */
  2249.     taskId = taskIdFigure (taskId); /* translate super name to ID */
  2250.     if (taskId == ERROR) /* couldn't figure out super name */
  2251. return (ERROR);
  2252.     taskId = taskIdDefault (taskId); /* set the default ID */
  2253.     if (taskRegsGet (taskId, &regSet) != OK)
  2254. return (ERROR);
  2255.     return (*(int *)((int)&regSet + regCode));
  2256.     }
  2257. /*******************************************************************************
  2258. *
  2259. * g0 - return the contents of register g0 (also g1-g7) (SimSolaris)
  2260. *
  2261. * This command extracts the contents of global register g0 from the TCB of a
  2262. * specified task.  If <taskId> is omitted or 0, the current default task is
  2263. * assumed.
  2264. *
  2265. * Similar routines are provided for all global registers (g0 - g7):
  2266. * g0() - g7().
  2267. *
  2268. * RETURNS: The contents of register g0 (or the requested register).
  2269. *
  2270. * SEE ALSO:
  2271. * .pG "Debugging"
  2272. *
  2273. * INTERNAL
  2274. * Although this routine is hereby marked NOMANUAL, it actually gets
  2275. * published, but from arch/doc/dbgArchLib.c.
  2276. */
  2277. int g0
  2278.     (
  2279.     int taskId /* task ID, 0 means default task */
  2280.     )
  2281.     
  2282.     {
  2283.     return (getOneReg (taskId, REG_SET_GLOBAL(0)));
  2284.     }
  2285. int g1 (int taskId) { return (getOneReg (taskId, REG_SET_GLOBAL(1))); }
  2286. int g2 (int taskId) { return (getOneReg (taskId, REG_SET_GLOBAL(2))); }
  2287. int g3 (int taskId) { return (getOneReg (taskId, REG_SET_GLOBAL(3))); }
  2288. int g4 (int taskId) { return (getOneReg (taskId, REG_SET_GLOBAL(4))); }
  2289. int g5 (int taskId) { return (getOneReg (taskId, REG_SET_GLOBAL(5))); }
  2290. int g6 (int taskId) { return (getOneReg (taskId, REG_SET_GLOBAL(6))); }
  2291. int g7 (int taskId) { return (getOneReg (taskId, REG_SET_GLOBAL(7))); }
  2292. /*******************************************************************************
  2293. *
  2294. * o0 - return the contents of register o0 (also o1-o7) (SimSolaris)
  2295. *
  2296. * This command extracts the contents of out register o0 from the TCB of a
  2297. * specified task.  If <taskId> is omitted or 0, the current default task is
  2298. * assumed.
  2299. *
  2300. * Similar routines are provided for all out registers (o0 - o7):
  2301. * o0() - o7().
  2302. *
  2303. * The stack pointer is accessed via o6.
  2304. *
  2305. * RETURNS: The contents of register o0 (or the requested register).
  2306. *
  2307. * SEE ALSO:
  2308. * .pG "Debugging"
  2309. */
  2310. int o0
  2311.     (
  2312.     int taskId /* task ID, 0 means default task */
  2313.     )
  2314.     
  2315.     {
  2316.     return (getOneReg (taskId, REG_SET_OUT(0)));
  2317.     }
  2318. int o1 (int taskId) { return (getOneReg (taskId, REG_SET_OUT(1))); }
  2319. int o2 (int taskId) { return (getOneReg (taskId, REG_SET_OUT(2))); }
  2320. int o3 (int taskId) { return (getOneReg (taskId, REG_SET_OUT(3))); }
  2321. int o4 (int taskId) { return (getOneReg (taskId, REG_SET_OUT(4))); }
  2322. int o5 (int taskId) { return (getOneReg (taskId, REG_SET_OUT(5))); }
  2323. int o6 (int taskId) { return (getOneReg (taskId, REG_SET_OUT(6))); }
  2324. int o7 (int taskId) { return (getOneReg (taskId, REG_SET_OUT(7))); }
  2325. /*******************************************************************************
  2326. *
  2327. * l0 - return the contents of register l0 (also l1-l7) (SimSolaris)
  2328. *
  2329. * This command extracts the contents of local register l0 from the TCB of a
  2330. * specified task.  If <taskId> is omitted or 0, the current default task is
  2331. * assumed.
  2332. *
  2333. * Similar routines are provided for all local registers (l0 - l7):
  2334. * l0() - l7().
  2335. *
  2336. * RETURNS: The contents of register l0 (or the requested register).
  2337. *
  2338. * SEE ALSO:
  2339. * .pG "Debugging"
  2340. */
  2341. int l0
  2342.     (
  2343.     int taskId /* task ID, 0 means default task */
  2344.     )
  2345.     
  2346.     {
  2347.     return (getOneReg (taskId, REG_SET_LOCAL(0)));
  2348.     }
  2349. int l1 (int taskId) { return (getOneReg (taskId, REG_SET_LOCAL(1))); }
  2350. int l2 (int taskId) { return (getOneReg (taskId, REG_SET_LOCAL(2))); }
  2351. int l3 (int taskId) { return (getOneReg (taskId, REG_SET_LOCAL(3))); }
  2352. int l4 (int taskId) { return (getOneReg (taskId, REG_SET_LOCAL(4))); }
  2353. int l5 (int taskId) { return (getOneReg (taskId, REG_SET_LOCAL(5))); }
  2354. int l6 (int taskId) { return (getOneReg (taskId, REG_SET_LOCAL(6))); }
  2355. int l7 (int taskId) { return (getOneReg (taskId, REG_SET_LOCAL(7))); }
  2356. /*******************************************************************************
  2357. *
  2358. * i0 - return the contents of register i0 (also i1-i7) (SimSolaris)
  2359. *
  2360. * This command extracts the contents of in register i0 from the TCB of a
  2361. * specified task.  If <taskId> is omitted or 0, the current default task is
  2362. * assumed.
  2363. *
  2364. * Similar routines are provided for all in registers (i0 - i7):
  2365. * i0() - i7().
  2366. *
  2367. * The frame pointer is accessed via i6.
  2368. *
  2369. * RETURNS: The contents of register i0 (or the requested register).
  2370. *
  2371. * SEE ALSO:
  2372. * .pG "Debugging"
  2373. */
  2374. int i0
  2375.     (
  2376.     int taskId /* task ID, 0 means default task */
  2377.     )
  2378.     
  2379.     {
  2380.     return (getOneReg (taskId, REG_SET_IN(0)));
  2381.     }
  2382. int i1 (int taskId) { return (getOneReg (taskId, REG_SET_IN(1))); }
  2383. int i2 (int taskId) { return (getOneReg (taskId, REG_SET_IN(2))); }
  2384. int i3 (int taskId) { return (getOneReg (taskId, REG_SET_IN(3))); }
  2385. int i4 (int taskId) { return (getOneReg (taskId, REG_SET_IN(4))); }
  2386. int i5 (int taskId) { return (getOneReg (taskId, REG_SET_IN(5))); }
  2387. int i6 (int taskId) { return (getOneReg (taskId, REG_SET_IN(6))); }
  2388. int i7 (int taskId) { return (getOneReg (taskId, REG_SET_IN(7))); }
  2389. /*******************************************************************************
  2390. *
  2391. * npc - return the contents of the next program counter (SimSolaris)
  2392. *
  2393. * This command extracts the contents of the next program counter from the TCB
  2394. * of a specified task.  If <taskId> is omitted or 0, the current default
  2395. * task is assumed.
  2396. *
  2397. * RETURNS: The contents of the next program counter.
  2398. *
  2399. * SEE ALSO: ti()
  2400. */
  2401. int npc
  2402.     (
  2403.     int taskId                 /* task ID, 0 means default task */
  2404.     )
  2405.     {
  2406.     return (getOneReg (taskId, REG_SET_NPC));
  2407.     }
  2408. /*******************************************************************************
  2409. *
  2410. * psr - return the contents of the processor status register (SimSolaris)
  2411. *
  2412. * This command extracts the contents of the processor status register from
  2413. * the TCB of a specified task.  If <taskId> is omitted or 0, the default
  2414. * task is assumed.
  2415. *
  2416. * RETURNS: The contents of the processor status register.
  2417. *
  2418. * SEE ALSO: 
  2419. * .pG "Debugging"
  2420. */
  2421. int psr
  2422.     (
  2423.     int taskId /* task ID, 0 means default task */
  2424.     )
  2425.     {
  2426.     return (getOneReg (taskId, REG_SET_PSR));
  2427.     }
  2428. /*******************************************************************************
  2429. *
  2430. * wim - return the contents of the window invalid mask register (SimSolaris)
  2431. *
  2432. * This command extracts the contents of the window invalid mask register from
  2433. * the TCB of a specified task.  If <taskId> is omitted or 0, the default
  2434. * task is assumed.
  2435. *
  2436. * RETURNS: The contents of the window invalid mask register.
  2437. *
  2438. * SEE ALSO:
  2439. * .pG "Debugging"
  2440. */
  2441. int wim
  2442.     (
  2443.     int taskId  /* task ID, 0 means default task */
  2444.     )
  2445.     {
  2446.     return (getOneReg (taskId, REG_SET_WIM));
  2447.     }
  2448. /*******************************************************************************
  2449. *
  2450. * y - return the contents of the y register (SimSolaris)
  2451. *
  2452. * This command extracts the contents of the y register from the TCB of a
  2453. * specified task.  If <taskId> is omitted or 0, the default task is assumed.
  2454. *
  2455. * RETURNS: The contents of the y register.
  2456. *
  2457. * SEE ALSO:
  2458. * .pG "Debugging"
  2459. */
  2460. int y
  2461.     (
  2462.     int taskId  /* task ID, 0 means default task */
  2463.     )
  2464.     {
  2465.     return (getOneReg (taskId, REG_SET_Y));
  2466.     }
  2467. /* dbgArchLib.c - windows NT debugger library */
  2468. /* Copyright 1993-1998 Wind River Systems, Inc. */
  2469. #include "copyright_wrs.h"
  2470. /*
  2471. modification history
  2472. --------------------
  2473. 01c,23jul98,dbt  code cleanup
  2474. 01b,19feb98,jmb  fix typo in symbol name and switch to dbgLibNew header.
  2475. 01a,13jan98,cym  written.
  2476. */
  2477. /*
  2478. DESCRIPTION
  2479. This module provides the windows specific support
  2480. functions for dbgLib.c.
  2481. */
  2482. #include "vxWorks.h"
  2483. #include "dbgLib.h"
  2484. #include "taskLib.h"
  2485. #include "fppLib.h"
  2486. #include "taskArchLib.h"
  2487. #include "intLib.h"
  2488. #include "ioLib.h"
  2489. #include "iv.h"
  2490. #include "dsmLib.h"
  2491. #include "regs.h"
  2492. #include "vxLib.h"
  2493. #include "logLib.h"
  2494. #include "fioLib.h"
  2495. #include "stdio.h"
  2496. #include "usrLib.h"
  2497. /* interrupt driver routines from dsmLib.c */
  2498. IMPORT int dsmNbytes ();
  2499. IMPORT int dsmInst ();
  2500. /* globals */
  2501. char * _archHelp_msg =
  2502.     "Sorry, no help yetn";
  2503. LOCAL oldIntLevel; /* old interrupt level */
  2504. /*******************************************************************************
  2505. *
  2506. * _dbgArchInit - architecture dependent initialization routine
  2507. *
  2508. * This routine initialize global function pointers that are architecture 
  2509. * specific.
  2510. *
  2511. * RETURNS: N/A
  2512. *
  2513. * NOMANUAL
  2514. */
  2515. void _dbgArchInit (void)
  2516.     {
  2517.     _dbgDsmInstRtn = (FUNCPTR) dsmInst;
  2518.     }
  2519. /*******************************************************************************
  2520. *
  2521. * _dbgInstSizeGet - set up breakpoint instruction
  2522. *
  2523. * RETURNS: size of the instruction at specified location.
  2524. *
  2525. * NOMANUAL
  2526. */
  2527. int _dbgInstSizeGet
  2528.     (
  2529.     INSTR * pBrkInst /* pointer to hold breakpoint instruction */
  2530.     )
  2531.     {
  2532.     return (dsmNbytes(pBrkInst));
  2533.     }
  2534. /*******************************************************************************
  2535. *
  2536. * _dbgRetAdrsGet - get return address for current routine
  2537. *
  2538. * RETURNS: return address for current routine.
  2539. *
  2540. * NOMANUAL
  2541. */
  2542. INSTR * _dbgRetAdrsGet
  2543.     (
  2544.     REG_SET * pRegSet /* pointer to register set */
  2545.     )
  2546.     {
  2547.     INSTR *returnAddress;
  2548. #if FALSE
  2549.     if (DSM(pRegSet->pc,   PUSH_EBP, PUSH_EBP_MASK) &&
  2550.         DSM(pRegSet->pc+1, MOV_ESP0, MOV_ESP0_MASK) &&
  2551.         DSM(pRegSet->pc+2, MOV_ESP1, MOV_ESP1_MASK))
  2552.         {
  2553.         returnAddress = *(INSTR **)pRegSet->spReg;
  2554.         }
  2555.     else if (DSM(pRegSet->pc-1, PUSH_EBP, PUSH_EBP_MASK) &&
  2556.              DSM(pRegSet->pc,   MOV_ESP0, MOV_ESP0_MASK) &&
  2557.              DSM(pRegSet->pc+1, MOV_ESP1, MOV_ESP1_MASK))
  2558.         {
  2559.         returnAddress = *((INSTR **)pRegSet->spReg + 1);
  2560.         }
  2561.     else if (DSM(pRegSet->pc, ENTER, ENTER_MASK))
  2562.         {
  2563.         returnAddress = *(INSTR **)pRegSet->spReg;
  2564.         }
  2565.     else if ((DSM(pRegSet->pc, RET,    RET_MASK)) ||
  2566.              (DSM(pRegSet->pc, RETADD, RETADD_MASK)))
  2567.         {
  2568.         returnAddress = *(INSTR **)pRegSet->spReg;
  2569.         }
  2570.     else
  2571.         {
  2572.         returnAddress = *((INSTR **)pRegSet->fpReg + 1);
  2573.         }
  2574. #endif
  2575.     return (returnAddress);
  2576.     }
  2577. /*******************************************************************************
  2578. *
  2579. * _dbgFuncCallCheck - check next instruction
  2580. *
  2581. * This routine checks to see if the next instruction is a JSR or BSR.
  2582. * If it is, it returns TRUE, otherwise, returns FALSE.
  2583. *
  2584. * RETURNS: TRUE if next instruction is JSR or BSR, or FALSE otherwise.
  2585. *
  2586. * NOMANUAL
  2587. */
  2588. BOOL _dbgFuncCallCheck
  2589.     (
  2590.     INSTR * addr /* pointer to instruction */
  2591.     )
  2592.     {
  2593. #if FALSE
  2594.     return (INST_CMP (addr, INST_CALL, INST_CALL_MASK) ||
  2595.             INST_CMP (addr, JMPL_o7, JMPL_o7_MASK));
  2596. #else
  2597. return 0; /* XXX Change me!!! */
  2598. #endif 
  2599.     }
  2600. /*******************************************************************************
  2601. *
  2602. * _dbgTaskPCSet - set task's pc
  2603. *
  2604. * RETURNS: N/A
  2605. *
  2606. * NOMANUAL
  2607. */
  2608. void _dbgTaskPCSet
  2609.     (
  2610.     int task,           /* task id */
  2611.     INSTR *pc,          /* new PC */
  2612.     INSTR *npc          /* not supported on I80X86 */
  2613.     )
  2614.     {
  2615.     REG_SET regSet;
  2616.     if (taskRegsGet (task, &regSet) != OK)
  2617.         return;
  2618.     regSet.pc = pc;
  2619.     (void)taskRegsSet (task, &regSet);
  2620.     }
  2621. /*******************************************************************************
  2622. *
  2623. * _dbgTaskPCGet - get task's pc
  2624. *
  2625. * RETURNS: N/A
  2626. *
  2627. * NOMANUAL
  2628. */
  2629. INSTR * _dbgTaskPCGet
  2630.     (
  2631.     int tid /* task's id */
  2632.     )
  2633.     {
  2634.     REG_SET regSet;
  2635.     taskRegsGet (tid, &regSet);
  2636.     return ((INSTR *) regSet.pc);
  2637.     }
  2638. /*******************************************************************************
  2639. *
  2640. * getOneReg - return the contents of one register
  2641. *
  2642. * Given a task's ID, this routine returns the contents of the register
  2643. * specified by the register code.  This routine is used by eax, edx, etc.
  2644. * The register codes are defined in dbgI86Lib.h.
  2645. *
  2646. * RETURNS: register contents, or ERROR.
  2647. */
  2648. LOCAL int getOneReg (taskId, regCode)
  2649.     int taskId; /* task's id, 0 means default task */
  2650.     int regCode; /* code for specifying register */
  2651.     {
  2652.     REG_SET regSet; /* get task's regs into here */
  2653.     taskId = taskIdFigure (taskId); /* translate super name to id */
  2654.     if (taskId == ERROR) /* couldn't figure out super name */
  2655. return (ERROR);
  2656.     taskId = taskIdDefault (taskId); /* set the default id */
  2657.     if (taskRegsGet (taskId, &regSet) != OK)
  2658. return (ERROR);
  2659.     switch (regCode)
  2660. {
  2661. case EDI: return (regSet.edi);
  2662. case ESI: return (regSet.esi);
  2663. case EBP: return (regSet.ebp);
  2664. case ESP: return (regSet.esp);
  2665. case EBX: return (regSet.ebx);
  2666. case EDX: return (regSet.edx);
  2667. case ECX: return (regSet.ecx);
  2668. case EAX: return (regSet.eax);
  2669. case EFLAGS: return (regSet.eflags);
  2670. }
  2671.     return (ERROR); /* unknown regCode */
  2672.     }
  2673. /*******************************************************************************
  2674. *
  2675. * edi - return the contents of register `edi' (also `esi' - `eax') (x86/SimNT)
  2676. *
  2677. * This command extracts the contents of register `edi' from the TCB of a
  2678. * specified task.  If <taskId> is omitted or zero, the last task
  2679. * referenced is assumed.
  2680. *
  2681. * Similar routines are provided for all address registers (`edi' - `eax'):
  2682. * edi() - eax().
  2683. *
  2684. * The stack pointer is accessed via eax().
  2685. *
  2686. * RETURNS: The contents of register `edi' (or the requested register).
  2687. *
  2688. * SEE ALSO:
  2689. * .pG "Debugging"
  2690. */
  2691. int edi
  2692.     (
  2693.     int taskId /* task ID, 0 means default task */
  2694.     )
  2695.     {
  2696.     return (getOneReg (taskId, EDI));
  2697.     }
  2698. int esi (taskId) int taskId; { return (getOneReg (taskId, ESI)); }
  2699. int ebp (taskId) int taskId; { return (getOneReg (taskId, EBP)); }
  2700. int esp (taskId) int taskId; { return (getOneReg (taskId, ESP)); }
  2701. int ebx (taskId) int taskId; { return (getOneReg (taskId, EBX)); }
  2702. int edx (taskId) int taskId; { return (getOneReg (taskId, EDX)); }
  2703. int ecx (taskId) int taskId; { return (getOneReg (taskId, ECX)); }
  2704. int eax (taskId) int taskId; { return (getOneReg (taskId, EAX)); }
  2705. /*******************************************************************************
  2706. *
  2707. * eflags - return the contents of the status register (x86/SimNT)
  2708. *
  2709. * This command extracts the contents of the status register from the TCB of a
  2710. * specified task.  If <taskId> is omitted or zero, the last task referenced is
  2711. * assumed.
  2712. *
  2713. * RETURNS: The contents of the status register.
  2714. *
  2715. * SEE ALSO:
  2716. * .pG "Debugging"
  2717. */
  2718. int eflags
  2719.     (
  2720.     int taskId /* task ID, 0 means default task */
  2721.     )
  2722.     {
  2723.     return (getOneReg (taskId, EFLAGS));
  2724.     }