PageRenderTime 63ms CodeModel.GetById 31ms RepoModel.GetById 1ms app.codeStats 0ms

/qwaqvm/processors/ARM/skyeye/utils/debugger/gdbserver.c

http://openqwaq.googlecode.com/
C | 1278 lines | 1002 code | 143 blank | 133 comment | 187 complexity | 6a107674605d974003baf923b15ce131 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1, LGPL-2.0, BSD-3-Clause
  1. /* debugger: Remote server for GDB.
  2. This program is free software; you can redistribute it and/or modify
  3. it under the terms of the GNU General Public License as published by
  4. the Free Software Foundation; either version 2 of the License, or
  5. (at your option) any later version.
  6. This program is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  9. GNU General Public License for more details.
  10. You should have received a copy of the GNU General Public License
  11. along with this program; if not, write to the Free Software
  12. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
  13. #include "skyeye2gdb.h"
  14. #include "skyeye_types.h"
  15. #include <setjmp.h>
  16. #include <stdio.h>
  17. #include <string.h>
  18. #include <sys/file.h>
  19. #ifdef __BEOS__
  20. #include <BeBuild.h>
  21. #endif
  22. //koodailar remove it for mingw 2005.12.18--------------------------------------
  23. #ifndef __MINGW32__
  24. // Anthony Lee 2007-02-02 : for BeOS R5.0.x
  25. #if (defined(__BEOS__) && B_BEOS_VERSION < 0x510)
  26. #include <net/socket.h>
  27. #define PF_INET AF_INET
  28. #else
  29. #include <sys/select.h>
  30. #include <netinet/in.h>
  31. #include <sys/socket.h>
  32. #include <netdb.h>
  33. #include <netinet/tcp.h>
  34. #include <sys/ioctl.h>
  35. #endif
  36. #endif
  37. //end --------------------------------------------------------------------------
  38. #include <signal.h>
  39. #include <fcntl.h>
  40. // Anthony Lee 2006-08-22 : for WinSock2
  41. #ifdef __MINGW32__
  42. #undef WORD
  43. #undef byte
  44. #include <windows.h>
  45. #endif
  46. #if (defined(__MINGW32__) || (defined(__BEOS__) && B_BEOS_VERSION < 0x510))
  47. #define Read(a, b, c) recv(a, b, c, 0)
  48. #define Write(a, b, c) send(a, b, c, 0)
  49. #define Close(a) closesocket(a)
  50. #else
  51. #define Read(a, b, c) read(a, b, c)
  52. #define Write(a, b, c) write(a, b, c)
  53. #define Close(a) close(a)
  54. #endif
  55. #undef DEBUG_RDI
  56. //#define DEBUG_RDI
  57. #ifdef DEBUG_RDI
  58. #define DBG_RDI(args...) printf(args)
  59. #else
  60. #define DBG_RDI(args...)
  61. #endif
  62. extern register_defs_t *current_reg_type;
  63. typedef unsigned long CORE_ADDR;
  64. #ifdef DEBUG_RDI
  65. int remote_debug = 1;
  66. #else
  67. int remote_debug = 0;
  68. #endif
  69. static int remote_desc;
  70. jmp_buf toplevel;
  71. int extended_protocol;
  72. int general_thread;
  73. int cont_thread;
  74. unsigned char *registers;
  75. struct SkyEye_ICE skyeye_ice;
  76. /* Open a connection to a remote debugger.
  77. NAME is the filename used for communication. */
  78. void
  79. remote_open (char *name)
  80. {
  81. int save_fcntl_flags;
  82. char *port_str;
  83. int port;
  84. struct sockaddr_in sockaddr;
  85. int tmp;
  86. struct protoent *protoent;
  87. int tmp_desc;
  88. port_str = strchr (name, ':');
  89. port = atoi (port_str + 1);
  90. #ifndef __MINGW32__
  91. if ((tmp_desc = socket (PF_INET, SOCK_STREAM, 0)) < 0) perror ("Can't open socket");
  92. #else
  93. if ((tmp_desc = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) perror("Can't open socket");
  94. #endif
  95. /* Allow rapid reuse of this port. */
  96. tmp = 1;
  97. setsockopt (tmp_desc, SOL_SOCKET, SO_REUSEADDR, (char *) &tmp,
  98. sizeof (tmp));
  99. sockaddr.sin_family = PF_INET;
  100. sockaddr.sin_port = htons (port);
  101. sockaddr.sin_addr.s_addr = INADDR_ANY;
  102. if (bind (tmp_desc, (struct sockaddr *) &sockaddr, sizeof (sockaddr))
  103. || listen (tmp_desc, 1))
  104. perror ("Can't bind address");
  105. tmp = sizeof (sockaddr);
  106. remote_desc = accept (tmp_desc, (struct sockaddr *) &sockaddr, &tmp);
  107. if (remote_desc == -1)
  108. perror ("Accept failed");
  109. /* 2007-02-02 disabled on BeOS R5.0.x by Anthony Lee */
  110. #if !(defined(__BEOS__) && B_BEOS_VERSION < 0x510)
  111. /* Enable TCP keep alive process. */
  112. tmp = 1;
  113. setsockopt (tmp_desc, SOL_SOCKET, SO_KEEPALIVE, (char *) &tmp,
  114. sizeof (tmp));
  115. /* Tell TCP not to delay small packets. This greatly speeds up
  116. interactive response. */
  117. tmp = 1;
  118. setsockopt (remote_desc, 6 /* PROTO_TCP */ , TCP_NODELAY,
  119. (char *) &tmp, sizeof (tmp));
  120. #endif
  121. Close (tmp_desc); /* No longer need this */
  122. #ifndef __MINGW32__
  123. signal (SIGPIPE, SIG_IGN); /* If we don't do this, then gdbserver simply
  124. exits when the remote side dies. */
  125. #endif
  126. #if 0 //chy 20050729-------------------
  127. #if defined(F_SETFL) && defined (FASYNC)
  128. save_fcntl_flags = fcntl (remote_desc, F_GETFL, 0);
  129. fcntl (remote_desc, F_SETFL, save_fcntl_flags | FASYNC);
  130. disable_async_io ();
  131. #endif /* FASYNC */
  132. #endif //chy 20050729-------------------
  133. fprintf (stderr, "Remote debugging using %s\n", name);
  134. }
  135. void
  136. remote_close ()
  137. {
  138. Close (remote_desc);
  139. }
  140. /* Convert hex digit A to a number. */
  141. static int
  142. fromhex (int a)
  143. {
  144. if (a >= '0' && a <= '9')
  145. return a - '0';
  146. else if (a >= 'a' && a <= 'f')
  147. return a - 'a' + 10;
  148. else if (a >= 'A' && a <= 'F')
  149. return a - 'A' + 10;
  150. else
  151. perror ("Reply contains invalid hex digit");
  152. }
  153. /* Convert number NIB to a hex digit. */
  154. static int
  155. tohex (int nib)
  156. {
  157. if (nib < 10)
  158. return '0' + nib;
  159. else
  160. return 'a' + nib - 10;
  161. }
  162. /* Send a packet to the remote machine, with error checking.
  163. The data of the packet is in BUF. Returns >= 0 on success, -1 otherwise. */
  164. int
  165. putpkt (char *buf)
  166. {
  167. int i;
  168. unsigned char csum = 0;
  169. char buf2[2000];
  170. char buf3[1];
  171. int cnt = strlen (buf);
  172. char *p;
  173. /* Copy the packet into buffer BUF2, encapsulating it
  174. and giving it a checksum. */
  175. p = buf2;
  176. *p++ = '$';
  177. for (i = 0; i < cnt; i++) {
  178. csum += buf[i];
  179. *p++ = buf[i];
  180. }
  181. *p++ = '#';
  182. *p++ = tohex ((csum >> 4) & 0xf);
  183. *p++ = tohex (csum & 0xf);
  184. *p = '\0';
  185. /* Send it over and over until we get a positive ack. */
  186. do {
  187. int cc;
  188. if (Write (remote_desc, buf2, p - buf2) != p - buf2) {
  189. perror ("putpkt(write)");
  190. return -1;
  191. }
  192. if (remote_debug)
  193. DBG_RDI ("putpkt (\"%s\"); [looking for ack]\n", buf2);
  194. cc = Read (remote_desc, buf3, 1);
  195. if (remote_debug)
  196. DBG_RDI ("[received '%c' (0x%x)]\n", buf3[0], buf3[0]);
  197. if (cc <= 0) {
  198. if (cc == 0)
  199. fprintf (stderr, "putpkt(read): Got EOF\n");
  200. else
  201. perror ("putpkt(read)");
  202. return -1;
  203. }
  204. }
  205. while (buf3[0] != '+');
  206. return 1; /* Success! */
  207. }
  208. /* 2007-02-02 disabled by Anthony Lee : not used */
  209. #if 0
  210. /* Come here when we get an input interrupt from the remote side. This
  211. interrupt should only be active while we are waiting for the child to do
  212. something. About the only thing that should come through is a ^C, which
  213. will cause us to send a SIGINT to the child. */
  214. static void
  215. input_interrupt ()
  216. {
  217. int cc;
  218. char c;
  219. cc = Read (remote_desc, &c, 1);
  220. if (cc != 1 || c != '\003') {
  221. fprintf (stderr, "input_interrupt, cc = %d c = %d\n", cc, c);
  222. return;
  223. }
  224. DBG_RDI ("SkyEye debugger: input_interrupt: get a ctrl-c\n");
  225. skyeye_exit (-1);
  226. //kill (inferior_pid, SIGINT);
  227. }
  228. void
  229. enable_async_io ()
  230. {
  231. signal (SIGIO, input_interrupt);
  232. }
  233. void
  234. disable_async_io ()
  235. {
  236. signal (SIGIO, SIG_IGN);
  237. }
  238. #endif
  239. /* Returns next char from remote GDB. -1 if error. */
  240. static int
  241. readchar ()
  242. {
  243. static char buf[BUFSIZ];
  244. static int bufcnt = 0;
  245. static char *bufp;
  246. if (bufcnt-- > 0)
  247. return *bufp++ & 0x7f;
  248. bufcnt = Read (remote_desc, buf, sizeof (buf));
  249. if (bufcnt <= 0) {
  250. if (bufcnt == 0)
  251. fprintf (stderr, "readchar: Got EOF\n");
  252. else
  253. perror ("readchar");
  254. return -1;
  255. }
  256. bufp = buf;
  257. bufcnt--;
  258. return *bufp++ & 0x7f;
  259. }
  260. /* Read a packet from the remote machine, with error checking,
  261. and store it in BUF. Returns length of packet, or negative if error. */
  262. int
  263. getpkt (char *buf)
  264. {
  265. char *bp;
  266. unsigned char csum, c1, c2;
  267. int c;
  268. while (1) {
  269. csum = 0;
  270. while (1) {
  271. c = readchar ();
  272. if (c == '$')
  273. break;
  274. if (remote_debug)
  275. DBG_RDI ("[getpkt: discarding char '%c']\n",
  276. c);
  277. if (c < 0)
  278. return -1;
  279. }
  280. bp = buf;
  281. while (1) {
  282. c = readchar ();
  283. if (c < 0)
  284. return -1;
  285. if (c == '#')
  286. break;
  287. *bp++ = c;
  288. csum += c;
  289. }
  290. *bp = 0;
  291. c1 = fromhex (readchar ());
  292. c2 = fromhex (readchar ());
  293. if (csum == (c1 << 4) + c2)
  294. break;
  295. fprintf (stderr,
  296. "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
  297. (c1 << 4) + c2, csum, buf);
  298. Write (remote_desc, "-", 1);
  299. }
  300. if (remote_debug)
  301. DBG_RDI ("getpkt (\"%s\"); [sending ack] \n", buf);
  302. Write (remote_desc, "+", 1);
  303. if (remote_debug)
  304. DBG_RDI ("[sent ack]\n");
  305. return bp - buf;
  306. }
  307. void
  308. write_ok (char *buf)
  309. {
  310. buf[0] = 'O';
  311. buf[1] = 'K';
  312. buf[2] = '\0';
  313. }
  314. void
  315. write_enn (char *buf)
  316. {
  317. buf[0] = 'E';
  318. buf[1] = '0';
  319. buf[2] = '1';
  320. buf[3] = '\0';
  321. }
  322. static void
  323. convert_int_to_ascii (char *from, char *to, int n)
  324. {
  325. int nib;
  326. char ch;
  327. while (n--) {
  328. ch = *from++;
  329. nib = ((ch & 0xf0) >> 4) & 0x0f;
  330. *to++ = tohex (nib);
  331. nib = ch & 0x0f;
  332. *to++ = tohex (nib);
  333. }
  334. *to++ = 0;
  335. }
  336. static void
  337. convert_ascii_to_int (char *from, char *to, int n)
  338. {
  339. int nib1, nib2;
  340. while (n--) {
  341. nib1 = fromhex (*from++);
  342. nib2 = fromhex (*from++);
  343. *to++ = (((nib1 & 0x0f) << 4) & 0xf0) | (nib2 & 0x0f);
  344. }
  345. }
  346. static char *
  347. outreg (int regno, char *buf)
  348. {
  349. int regsize = current_reg_type->register_raw_size(regno);
  350. *buf++ = tohex (regno >> 4);
  351. *buf++ = tohex (regno & 0xf);
  352. *buf++ = ':';
  353. convert_int_to_ascii (&registers[current_reg_type->register_byte (regno)], buf,
  354. regsize);
  355. buf += 2 * regsize;
  356. *buf++ = ';';
  357. return buf;
  358. }
  359. void
  360. prepare_resume_reply (char *buf, char status, unsigned char signo)
  361. {
  362. int nib;
  363. *buf++ = status;
  364. /* FIXME! Should be converting this signal number (numbered
  365. according to the signal numbering of the system we are running on)
  366. to the signal numbers used by the gdb protocol (see enum target_signal
  367. in gdb/target.h). */
  368. nib = ((signo & 0xf0) >> 4);
  369. *buf++ = tohex (nib);
  370. nib = signo & 0x0f;
  371. *buf++ = tohex (nib);
  372. if (status == 'T') {
  373. buf = outreg (current_reg_type->pc_regnum, buf);
  374. buf = outreg (current_reg_type->fp_regnum, buf);
  375. buf = outreg (current_reg_type->sp_regnum, buf);
  376. }
  377. /* For W and X, we're done. */
  378. *buf++ = 0;
  379. }
  380. static void
  381. decode_m_packet (char *from, CORE_ADDR * mem_addr_ptr, unsigned int *len_ptr)
  382. {
  383. int i = 0, j = 0;
  384. char ch;
  385. *mem_addr_ptr = *len_ptr = 0;
  386. while ((ch = from[i++]) != ',') {
  387. *mem_addr_ptr = *mem_addr_ptr << 4;
  388. *mem_addr_ptr |= fromhex (ch) & 0x0f;
  389. }
  390. for (j = 0; j < 4; j++) {
  391. if ((ch = from[i++]) == 0)
  392. break;
  393. *len_ptr = *len_ptr << 4;
  394. *len_ptr |= fromhex (ch) & 0x0f;
  395. }
  396. }
  397. static void
  398. decode_M_packet (char *from, CORE_ADDR * mem_addr_ptr, unsigned int *len_ptr,
  399. char *to)
  400. {
  401. int i = 0;
  402. char ch;
  403. *mem_addr_ptr = *len_ptr = 0;
  404. while ((ch = from[i++]) != ',') {
  405. *mem_addr_ptr = *mem_addr_ptr << 4;
  406. *mem_addr_ptr |= fromhex (ch) & 0x0f;
  407. }
  408. while ((ch = from[i++]) != ':') {
  409. *len_ptr = *len_ptr << 4;
  410. *len_ptr |= fromhex (ch) & 0x0f;
  411. }
  412. convert_ascii_to_int (&from[i++], to, *len_ptr);
  413. }
  414. static void
  415. decode_DP_playload (char * buffer, int tp_id, action *parent_action)
  416. {
  417. int i=0;
  418. char ch;
  419. action* current_action;
  420. unsigned int remaining_step;
  421. unsigned int pass_count,remaining_pass;
  422. unsigned int mask;
  423. unsigned offset, length;
  424. int base_reg;
  425. switch (buffer[i])
  426. {
  427. case 'E':
  428. {
  429. i=i+2;
  430. remaining_step=0;
  431. while ((ch = buffer[i++]) != ':')
  432. {
  433. remaining_step = remaining_step << 4;
  434. remaining_step |= fromhex (ch) & 0x0f;
  435. }
  436. pass_count=0;
  437. while (((ch = buffer[i]) != '-') &&((ch = buffer[i]) != '\0'))
  438. {
  439. pass_count = pass_count << 4;
  440. pass_count |= fromhex (ch) & 0x0f;
  441. i++;
  442. }
  443. set_tracepoint_status(tp_id, TRACEPOINT_ENABLED);
  444. set_tracepoint_remaining_step(tp_id, remaining_step );
  445. set_tracepoint_pass_count(tp_id, pass_count );
  446. set_tracepoint_remaining_pass(tp_id, pass_count );
  447. }
  448. break;
  449. case 'D':
  450. {
  451. i=i+2;
  452. remaining_step=0;
  453. while ((ch = buffer[i++]) != ':')
  454. {
  455. remaining_step = remaining_step << 4;
  456. remaining_step |= fromhex (ch) & 0x0f;
  457. }
  458. pass_count=0;
  459. while (((ch = buffer[i]) != '-') &&((ch = buffer[i]) != '\0'))
  460. {
  461. pass_count = pass_count << 4;
  462. pass_count |= fromhex (ch) & 0x0f;
  463. i++;
  464. }
  465. set_tracepoint_status(tp_id, TRACEPOINT_DISABLED);
  466. set_tracepoint_remaining_step(tp_id, remaining_step );
  467. set_tracepoint_pass_count(tp_id, pass_count );
  468. set_tracepoint_remaining_pass(tp_id, pass_count );
  469. }
  470. break;
  471. case 'R':
  472. {
  473. i++;
  474. mask=0;
  475. while (((ch = buffer[i]) != '-') &&((ch = buffer[i]) != '\0'))
  476. {
  477. mask = mask << 4;
  478. mask |= fromhex (ch) & 0x0f;
  479. i++;
  480. }
  481. current_action = prepare_action(tp_id, parent_action);
  482. set_action_type (current_action, ACTION_COLLECT);
  483. set_action_data_type(current_action,COLLECT_REGISTERS);
  484. set_rc_action_mask(current_action, mask);
  485. }
  486. break;
  487. case 'M':
  488. {
  489. i++;
  490. //get base_reg
  491. if (buffer[i]=='-')
  492. {
  493. base_reg=-1;
  494. while ((ch = buffer[i++]) != ',');
  495. }
  496. else
  497. {
  498. base_reg=0;
  499. i++;
  500. while (((ch = buffer[i]) != ',') &&((ch = buffer[i]) != '\0'))
  501. {
  502. base_reg = base_reg << 4;
  503. base_reg |= fromhex (ch) & 0x0f;
  504. i++;
  505. }
  506. }
  507. //get offset
  508. offset=0;
  509. while (((ch = buffer[i]) != ',') &&((ch = buffer[i]) != '\0'))
  510. {
  511. offset = offset << 4;
  512. offset |= fromhex (ch) & 0x0f;
  513. i++;
  514. }
  515. //get_length
  516. length=0;
  517. i++;
  518. while (((ch = buffer[i]) != '-') &&((ch = buffer[i]) != '\0'))
  519. {
  520. length = length << 4;
  521. length |= fromhex (ch) & 0x0f;
  522. i++;
  523. }
  524. current_action = prepare_action(tp_id, parent_action);
  525. set_action_type (current_action, ACTION_COLLECT);
  526. set_action_data_type(current_action,COLLECT_MEMORY);
  527. set_mc_action_base_reg(current_action,base_reg);
  528. set_mc_action_offset(current_action,offset);
  529. set_mc_action_length(current_action,length);
  530. }
  531. break;
  532. case 'X':
  533. break;
  534. case 'S':
  535. {
  536. i++;
  537. current_action = prepare_action(tp_id, parent_action);
  538. set_action_type (current_action, ACTION_WHILE);
  539. set_wa_step_count(current_action,get_tracepoint_remaining_step(tp_id));
  540. set_wa_remaining_steps(current_action,get_tracepoint_remaining_step(tp_id));
  541. decode_DP_playload (&buffer[i], tp_id, current_action);
  542. }
  543. break;
  544. default :;
  545. }
  546. }
  547. static void
  548. decode_DP_packet(char * buffer, char * response)
  549. {
  550. int i=0;
  551. int cont=0;
  552. char ch;
  553. unsigned int tp_number =0;
  554. unsigned int tp_address=0;
  555. int tp_id=-1; //tp_id is the position of the tracepoint on the skyeye_ice.tps array
  556. if (buffer [0]=='-')
  557. {
  558. i=1;
  559. cont= 1;
  560. }
  561. //getting tp_number
  562. while ((ch = buffer[i++]) != ':')
  563. {
  564. tp_number = tp_number << 4;
  565. tp_number |= fromhex (ch) & 0x0f;
  566. }
  567. //getting tp_address
  568. while ((ch = buffer[i++]) != ':')
  569. {
  570. tp_address = tp_address << 4;
  571. tp_address |= fromhex (ch) & 0x0f;
  572. }
  573. if ((tp_id=find_tp_id (tp_number,tp_address))!=-1)
  574. {
  575. }
  576. else
  577. {
  578. tp_id=add_tracepoint (tp_number,tp_address);
  579. }
  580. decode_DP_playload (&buffer[i], tp_id, NULL);
  581. return;
  582. }
  583. static void
  584. decode_Frame_packet(char *buffer, char* response)
  585. {
  586. int i;
  587. char ch;
  588. unsigned int frame_number;
  589. unsigned int tracepoint_number;
  590. start_trace_focusing ();
  591. switch (buffer[0])
  592. {
  593. case 'p': //pc
  594. {
  595. i=3;
  596. }
  597. break;
  598. case 't': //tdp
  599. {
  600. i=4;
  601. tracepoint_number=0;
  602. while ((ch = buffer[i]) != '\0')
  603. {
  604. tracepoint_number = tracepoint_number << 4;
  605. tracepoint_number |= fromhex (ch) & 0x0f;
  606. i++;
  607. }
  608. if (select_frame_buffer_by_tpn (tracepoint_number,&frame_number))
  609. {
  610. sprintf (response,"F%xT%x",frame_number,tracepoint_number);
  611. }
  612. else
  613. {
  614. sprintf (response,"F-1");
  615. }
  616. }
  617. break;
  618. case 'r': //range
  619. {
  620. i=6;
  621. }
  622. break;
  623. case 'o': //outside
  624. {
  625. i=8;
  626. }
  627. break;
  628. default: //a frame number or an error
  629. {
  630. i=0;
  631. frame_number=0;
  632. while ((ch = buffer[i]) != '\0')
  633. {
  634. frame_number = frame_number << 4;
  635. frame_number |= fromhex (ch) & 0x0f;
  636. i++;
  637. }
  638. //is it a tfind start none?
  639. if (frame_number==0xFFFFFFFF)
  640. {
  641. stop_trace_focusing ();
  642. sprintf (response,"OK");
  643. }else
  644. {
  645. if (select_frame_buffer_by_fn (&tracepoint_number,frame_number))
  646. {
  647. sprintf (response,"F%xT%x",frame_number,tracepoint_number);
  648. }
  649. else
  650. {
  651. sprintf (response,"F-1");
  652. }
  653. }
  654. }
  655. }
  656. }
  657. static void
  658. decode_ro_packet (char *buffer,char *response)
  659. {
  660. char ch;
  661. int i;
  662. unsigned int *address;
  663. unsigned int start_address;
  664. unsigned int end_address;
  665. i=0;
  666. start_address=0;
  667. end_address=0;
  668. address = &start_address;
  669. while ((ch = buffer[i]) != '\0')
  670. {
  671. switch (ch)
  672. {
  673. case ',':
  674. {
  675. address=&end_address;
  676. i++;
  677. }
  678. break;
  679. case ':':
  680. {
  681. address = &start_address;
  682. add_ro_region(start_address, end_address);
  683. start_address=0;
  684. end_address=0;
  685. address=&start_address;
  686. i++;
  687. }
  688. break;
  689. default :
  690. {
  691. *address = *address << 4;
  692. *address |= fromhex (ch) & 0x0f;
  693. i++;
  694. }
  695. }
  696. }
  697. if ((ch==0)&&((start_address!=0)||(end_address!=0)))
  698. {
  699. add_ro_region(start_address, end_address);
  700. }
  701. sprintf(response,"OK");
  702. }
  703. static int
  704. decode_Q_packet (char *buffer, char *response)
  705. {
  706. int i=0;
  707. //init
  708. if (buffer [i] !='T') //a valid trace request
  709. {
  710. return (0);
  711. }else
  712. {
  713. i=1;
  714. }
  715. switch (buffer [i])
  716. {
  717. case 'i'://init
  718. {
  719. init_tracepoints();
  720. write_ok (response);
  721. return (1);
  722. };
  723. case 'S'://start or stop
  724. {
  725. if (buffer [i+2]=='a') //start
  726. {
  727. start_trace_recording();
  728. write_ok (response);
  729. return (1);
  730. }else
  731. if (buffer [i+2]=='o') //stop
  732. {
  733. stop_trace_recording();
  734. write_ok (response);
  735. return (1);
  736. }else
  737. {
  738. return (0);
  739. }
  740. };
  741. break;
  742. case 'D'://DP
  743. {
  744. decode_DP_packet (&(buffer[i+3]),response);
  745. write_ok (response);
  746. return (1);
  747. }
  748. break;
  749. case 'F'://frame
  750. {
  751. decode_Frame_packet(&(buffer[i+6]),response);
  752. return (1);
  753. }
  754. break;
  755. case 'r': //ro
  756. {
  757. decode_ro_packet (&(buffer[i+3]),response);
  758. return (1);
  759. }
  760. default :
  761. {
  762. return (0);
  763. }
  764. }
  765. return (0);
  766. }
  767. void
  768. fetch_inferior_registers (int regno, unsigned char *memory)
  769. {
  770. if (regno == -1 || regno == 0)
  771. for (regno = 0; regno < current_reg_type->num_regs; regno++)
  772. current_reg_type->fetch_register (regno,
  773. &memory[current_reg_type->register_byte (regno)]);
  774. else
  775. current_reg_type->fetch_register (regno, &(memory[current_reg_type->register_byte (regno)]));
  776. }
  777. static void
  778. store_inferior_registers (int regno, unsigned char *memory)
  779. {
  780. if (regno == -1 || regno == 0)
  781. for (regno = 0; regno < current_reg_type->num_regs; regno++)
  782. current_reg_type->store_register (regno,
  783. &(memory[current_reg_type->register_byte (regno)]));
  784. else
  785. current_reg_type->store_register (regno, &(memory[current_reg_type->register_byte (regno)]));
  786. }
  787. int
  788. sim_debug ()
  789. {
  790. static char own_buf[8000], mem_buf[8000];
  791. char *p;
  792. char ch, status;
  793. int i = 0;
  794. unsigned char signal;
  795. unsigned int len,addr;
  796. CORE_ADDR mem_addr;
  797. int type,size;
  798. registers = (unsigned char *)malloc(current_reg_type->register_bytes);
  799. //chy 2006-04-12 init skyeye_ice
  800. skyeye_ice.num_bps=0;
  801. if (setjmp (toplevel)) {
  802. fprintf (stderr, "Exiting\n");
  803. skyeye_exit (1);
  804. }
  805. while (1) {
  806. remote_open ("host:12345");
  807. restart:
  808. setjmp (toplevel);
  809. while (getpkt (own_buf) > 0) {
  810. unsigned char sig;
  811. i = 0;
  812. ch = own_buf[i++];
  813. switch (ch) {
  814. case 'd':
  815. remote_debug = !remote_debug;
  816. break;
  817. #if 0 // chy 2005-07-30
  818. case '!':
  819. extended_protocol = 1;
  820. prepare_resume_reply (own_buf, status,
  821. signal);
  822. break;
  823. #endif //chy
  824. case '?':
  825. status = 'S';
  826. signal = 5;
  827. prepare_resume_reply (own_buf, status,
  828. signal);
  829. break;
  830. #if 0 // chy 2005-07-30
  831. case 'H':
  832. switch (own_buf[1]) {
  833. case 'g':
  834. general_thread =
  835. strtol (&own_buf[2], NULL,
  836. 16);
  837. write_ok (own_buf);
  838. fetch_inferior_registers (0);
  839. break;
  840. case 'c':
  841. cont_thread =
  842. strtol (&own_buf[2], NULL,
  843. 16);
  844. write_ok (own_buf);
  845. break;
  846. default:
  847. /* Silently ignore it so that gdb can extend the protocol
  848. without compatibility headaches. */
  849. own_buf[0] = '\0';
  850. break;
  851. }
  852. break;
  853. #endif //chy 2005-07-30
  854. case 'g':
  855. if (get_trace_status() == TRACE_FOCUSING)
  856. trace_fetch_registers (-1, registers);
  857. else
  858. fetch_inferior_registers (-1, registers);
  859. convert_int_to_ascii (registers, own_buf,
  860. current_reg_type->register_bytes);
  861. break;
  862. case 'G':
  863. convert_ascii_to_int (&own_buf[1], registers,
  864. current_reg_type->register_bytes);
  865. store_inferior_registers (-1, registers);
  866. write_ok (own_buf);
  867. break;
  868. case 'm':
  869. decode_m_packet (&own_buf[1], &mem_addr,
  870. &len);
  871. if ((get_trace_status() == TRACE_FOCUSING) && (is_in_ro_region(mem_addr,len) == 0))
  872. size = trace_read (mem_addr, mem_buf, len);
  873. else
  874. size = sim_read (mem_addr, mem_buf, len);
  875. if(size!=-1)
  876. convert_int_to_ascii (mem_buf, own_buf, len);
  877. else
  878. write_enn (own_buf);
  879. break;
  880. case 'M':
  881. decode_M_packet (&own_buf[1], &mem_addr, &len,
  882. mem_buf);
  883. //chy 2005-07-30 ARM_BREAKPOINT 0xe7ffdefe
  884. //bp_opcode_conv( (unsigned int) mem_addr, (unsigned int*)mem_buf );
  885. //chy 2006-04-12 debug
  886. //printf("SKYEYE, debugger M addr 0x%x, word 0x%x, len 0x%x\n", mem_addr, *((unsigned int *)mem_buf), len);
  887. if (sim_write (mem_addr, mem_buf, len) == len)
  888. write_ok (own_buf);
  889. else
  890. write_enn (own_buf);
  891. break;
  892. case 'Q':
  893. if (decode_Q_packet (&own_buf[1], own_buf) == 0) own_buf[0] = '\0';
  894. break;
  895. case 'q':
  896. switch (own_buf[1]) {
  897. case 'T':
  898. //Status
  899. if (get_trace_status() == TRACE_STARTED)
  900. {
  901. own_buf[0] = 'T';
  902. own_buf[1] = '1';
  903. own_buf[2] = '\0';
  904. } else {
  905. own_buf[0] = 'T';
  906. own_buf[1] = '0';
  907. own_buf[2] = '\0';
  908. }
  909. break;
  910. default:
  911. own_buf[0] = '\0';
  912. break;
  913. }
  914. break;
  915. /* chy 2005-07-28
  916. case 'q':
  917. switch (own_buf[1]) {
  918. case 'C':
  919. own_buf[0] = '\0';
  920. break;
  921. case 'O':
  922. send_area(own_buf);
  923. break;
  924. default:
  925. own_buf[0] = '\0';
  926. break;
  927. }
  928. break;
  929. case 'C':
  930. convert_ascii_to_int (own_buf + 1, &sig, 1);
  931. myresume (0, sig);
  932. signal = mywait (&status);
  933. prepare_resume_reply (own_buf, status, signal);
  934. break;
  935. case 'S':
  936. convert_ascii_to_int (own_buf + 1, &sig, 1);
  937. myresume (1, sig);
  938. signal = mywait (&status);
  939. prepare_resume_reply (own_buf, status, signal);
  940. break;
  941. chy */
  942. case 'c':
  943. //chy 2005-07-30
  944. //ARMul_DoProg (state);
  945. //sim_resume(0);
  946. gdbserver_cont();
  947. prepare_resume_reply (own_buf, status,
  948. signal);
  949. break;
  950. case 's':
  951. //chy 2005-07-30
  952. //sim_resume(1);
  953. //sim_step_debug();
  954. //myresume (1, 0);
  955. //signal = mywait (&status);
  956. gdbserver_step();
  957. prepare_resume_reply (own_buf, status,
  958. signal);
  959. break;
  960. case 'z':
  961. {
  962. p=&(own_buf[1]);
  963. type = strtoul(p, (char **)&p, 16);
  964. if (*p == ',')
  965. p++;
  966. addr = strtoul(p, (char **)&p, 16);
  967. if (*p == ',')
  968. p++;
  969. len = strtoul(p, (char **)&p, 16);
  970. //printf("SKYEYE:gdbserver z, type %d, addr %x, len %x\n",type, addr,len);
  971. if (type == 0 || type == 1) {
  972. if (sim_ice_breakpoint_remove(addr) < 0)
  973. goto remove_breakpoint_error;
  974. write_ok(own_buf);
  975. } else {
  976. remove_breakpoint_error:
  977. write_enn(own_buf);
  978. }
  979. }
  980. break;
  981. case 'Z':
  982. {
  983. p=&(own_buf[1]);
  984. type = strtoul(p, (char **)&p, 16);
  985. if (*p == ',')
  986. p++;
  987. addr = strtoul(p, (char **)&p, 16);
  988. if (*p == ',')
  989. p++;
  990. len = strtoul(p, (char **)&p, 16);
  991. //printf("SKYEYE:gdbserver Z, type %d, addr %x, len %x\n",type, addr,len);
  992. if (type == 0 || type == 1) {
  993. if (sim_ice_breakpoint_insert(addr) < 0)
  994. goto insert_breakpoint_error;
  995. write_ok(own_buf);
  996. } else {
  997. insert_breakpoint_error:
  998. write_enn(own_buf);
  999. }
  1000. }
  1001. break;
  1002. #if 0 // chy 2005-07-30
  1003. case 'k':
  1004. fprintf (stderr, "Killing inferior\n");
  1005. kill_inferior ();
  1006. /* When using the extended protocol, we start up a new
  1007. debugging session. The traditional protocol will
  1008. exit instead. */
  1009. if (extended_protocol) {
  1010. write_ok (own_buf);
  1011. fprintf (stderr,
  1012. "GDBserver restarting\n");
  1013. /* Wait till we are at 1st instruction in prog. */
  1014. //chy 20050729 go to restart
  1015. //signal = start_inferior (&argv[2], &status);
  1016. goto restart;
  1017. break;
  1018. }
  1019. else {
  1020. exit (0);
  1021. break;
  1022. }
  1023. case 'T':
  1024. if (mythread_alive
  1025. (strtol (&own_buf[1], NULL, 16)))
  1026. write_ok (own_buf);
  1027. else
  1028. write_enn (own_buf);
  1029. break;
  1030. case 'R':
  1031. /* Restarting the inferior is only supported in the
  1032. extended protocol. */
  1033. if (extended_protocol) {
  1034. kill_inferior ();
  1035. write_ok (own_buf);
  1036. fprintf (stderr,
  1037. "GDBserver restarting\n");
  1038. /* Wait till we are at 1st instruction in prog. */
  1039. //chy 20050729 go to restart
  1040. //signal = start_inferior (&argv[2], &status);
  1041. goto restart;
  1042. break;
  1043. }
  1044. else {
  1045. /* It is a request we don't understand. Respond with an
  1046. empty packet so that gdb knows that we don't support this
  1047. request. */
  1048. own_buf[0] = '\0';
  1049. break;
  1050. }
  1051. #endif //chy 2005-07-30
  1052. default:
  1053. /* It is a request we don't understand. Respond with an
  1054. empty packet so that gdb knows that we don't support this
  1055. request. */
  1056. DBG_RDI(stderr,"unknown command: %c\n",ch);
  1057. own_buf[0] = '\0';
  1058. break;
  1059. }
  1060. putpkt (own_buf);
  1061. if (status == 'W')
  1062. fprintf (stderr,
  1063. "\nChild exited with status %d\n",
  1064. sig);
  1065. if (status == 'X')
  1066. fprintf (stderr,
  1067. "\nChild terminated with signal = 0x%x\n",
  1068. sig);
  1069. if (status == 'W' || status == 'X') {
  1070. if (extended_protocol) {
  1071. //chy 2005-07-30
  1072. fprintf (stderr,
  1073. "CHY SkyEye: not Killing inferior\n");
  1074. //kill_inferior ();
  1075. write_ok (own_buf);
  1076. fprintf (stderr,
  1077. "GDBserver restarting\n");
  1078. /* Wait till we are at 1st instruction in prog. */
  1079. //chy 20050729 go to restart
  1080. //signal = start_inferior (&argv[2], &status);
  1081. goto restart;
  1082. break;
  1083. }
  1084. else {
  1085. fprintf (stderr,
  1086. "GDBserver exiting\n");
  1087. skyeye_exit (0);
  1088. }
  1089. }
  1090. }
  1091. /* We come here when getpkt fails.
  1092. For the extended remote protocol we exit (and this is the only
  1093. way we gracefully exit!).
  1094. For the traditional remote protocol close the connection,
  1095. and re-open it at the top of the loop. */
  1096. if (extended_protocol) {
  1097. remote_close ();
  1098. skyeye_exit (0);
  1099. }
  1100. else {
  1101. fprintf (stderr,
  1102. "Remote side has terminated connection. GDBserver will reopen the connection.\n");
  1103. remote_close ();
  1104. }
  1105. }
  1106. }
  1107. /*
  1108. * stop when press Ctrl+c
  1109. */
  1110. int remote_interrupt()
  1111. {
  1112. static fd_set rfds;
  1113. static struct timeval tv;
  1114. tv.tv_sec = 0;
  1115. tv.tv_usec = 0;
  1116. FD_ZERO( &rfds );
  1117. FD_SET( remote_desc, &rfds );
  1118. if (select( remote_desc+1, &rfds, NULL, NULL, &tv ) == 1 )
  1119. {
  1120. int n;
  1121. static char buf[100];
  1122. n = Read( remote_desc, buf, sizeof(buf) );
  1123. if ( n > 0 )
  1124. DBG_RDI("Got async char");
  1125. if ( buf[0] == '\003' )
  1126. DBG_RDI(":Ctrl+C, interrupted.\n");
  1127. return 1;
  1128. }
  1129. return 0;
  1130. }