PageRenderTime 50ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 1ms

/kernel/debug/gdbstub.c

https://gitlab.com/LiquidSmooth-Devices/android_kernel_htc_msm8974
C | 998 lines | 796 code | 168 blank | 34 comment | 192 complexity | 9b9a9edcbc77855f9245cf6b4b35aa09 MD5 | raw file
Possible License(s): GPL-2.0
  1. /*
  2. * Kernel Debug Core
  3. *
  4. * Maintainer: Jason Wessel <jason.wessel@windriver.com>
  5. *
  6. * Copyright (C) 2000-2001 VERITAS Software Corporation.
  7. * Copyright (C) 2002-2004 Timesys Corporation
  8. * Copyright (C) 2003-2004 Amit S. Kale <amitkale@linsyssoft.com>
  9. * Copyright (C) 2004 Pavel Machek <pavel@ucw.cz>
  10. * Copyright (C) 2004-2006 Tom Rini <trini@kernel.crashing.org>
  11. * Copyright (C) 2004-2006 LinSysSoft Technologies Pvt. Ltd.
  12. * Copyright (C) 2005-2009 Wind River Systems, Inc.
  13. * Copyright (C) 2007 MontaVista Software, Inc.
  14. * Copyright (C) 2008 Red Hat, Inc., Ingo Molnar <mingo@redhat.com>
  15. *
  16. * Contributors at various stages not listed above:
  17. * Jason Wessel ( jason.wessel@windriver.com )
  18. * George Anzinger <george@mvista.com>
  19. * Anurekh Saxena (anurekh.saxena@timesys.com)
  20. * Lake Stevens Instrument Division (Glenn Engel)
  21. * Jim Kingdon, Cygnus Support.
  22. *
  23. * Original KGDB stub: David Grothe <dave@gcom.com>,
  24. * Tigran Aivazian <tigran@sco.com>
  25. *
  26. * This file is licensed under the terms of the GNU General Public License
  27. * version 2. This program is licensed "as is" without any warranty of any
  28. * kind, whether express or implied.
  29. */
  30. #include <linux/kernel.h>
  31. #include <linux/kgdb.h>
  32. #include <linux/kdb.h>
  33. #include <linux/reboot.h>
  34. #include <linux/uaccess.h>
  35. #include <asm/cacheflush.h>
  36. #include <asm/unaligned.h>
  37. #include "debug_core.h"
  38. #define KGDB_MAX_THREAD_QUERY 17
  39. static char remcom_in_buffer[BUFMAX];
  40. static char remcom_out_buffer[BUFMAX];
  41. static int gdbstub_use_prev_in_buf;
  42. static int gdbstub_prev_in_buf_pos;
  43. static unsigned long gdb_regs[(NUMREGBYTES +
  44. sizeof(unsigned long) - 1) /
  45. sizeof(unsigned long)];
  46. #ifdef CONFIG_KGDB_KDB
  47. static int gdbstub_read_wait(void)
  48. {
  49. int ret = -1;
  50. int i;
  51. if (unlikely(gdbstub_use_prev_in_buf)) {
  52. if (gdbstub_prev_in_buf_pos < gdbstub_use_prev_in_buf)
  53. return remcom_in_buffer[gdbstub_prev_in_buf_pos++];
  54. else
  55. gdbstub_use_prev_in_buf = 0;
  56. }
  57. while (ret < 0)
  58. for (i = 0; kdb_poll_funcs[i] != NULL; i++) {
  59. ret = kdb_poll_funcs[i]();
  60. if (ret > 0)
  61. break;
  62. }
  63. return ret;
  64. }
  65. #else
  66. static int gdbstub_read_wait(void)
  67. {
  68. int ret = dbg_io_ops->read_char();
  69. while (ret == NO_POLL_CHAR)
  70. ret = dbg_io_ops->read_char();
  71. return ret;
  72. }
  73. #endif
  74. static void get_packet(char *buffer)
  75. {
  76. unsigned char checksum;
  77. unsigned char xmitcsum;
  78. int count;
  79. char ch;
  80. do {
  81. while ((ch = (gdbstub_read_wait())) != '$')
  82. ;
  83. kgdb_connected = 1;
  84. checksum = 0;
  85. xmitcsum = -1;
  86. count = 0;
  87. while (count < (BUFMAX - 1)) {
  88. ch = gdbstub_read_wait();
  89. if (ch == '#')
  90. break;
  91. checksum = checksum + ch;
  92. buffer[count] = ch;
  93. count = count + 1;
  94. }
  95. if (ch == '#') {
  96. xmitcsum = hex_to_bin(gdbstub_read_wait()) << 4;
  97. xmitcsum += hex_to_bin(gdbstub_read_wait());
  98. if (checksum != xmitcsum)
  99. dbg_io_ops->write_char('-');
  100. else
  101. dbg_io_ops->write_char('+');
  102. if (dbg_io_ops->flush)
  103. dbg_io_ops->flush();
  104. }
  105. buffer[count] = 0;
  106. } while (checksum != xmitcsum);
  107. }
  108. static void put_packet(char *buffer)
  109. {
  110. unsigned char checksum;
  111. int count;
  112. char ch;
  113. while (1) {
  114. dbg_io_ops->write_char('$');
  115. checksum = 0;
  116. count = 0;
  117. while ((ch = buffer[count])) {
  118. dbg_io_ops->write_char(ch);
  119. checksum += ch;
  120. count++;
  121. }
  122. dbg_io_ops->write_char('#');
  123. dbg_io_ops->write_char(hex_asc_hi(checksum));
  124. dbg_io_ops->write_char(hex_asc_lo(checksum));
  125. if (dbg_io_ops->flush)
  126. dbg_io_ops->flush();
  127. ch = gdbstub_read_wait();
  128. if (ch == 3)
  129. ch = gdbstub_read_wait();
  130. if (ch == '+')
  131. return;
  132. if (ch == '$') {
  133. dbg_io_ops->write_char('-');
  134. if (dbg_io_ops->flush)
  135. dbg_io_ops->flush();
  136. return;
  137. }
  138. }
  139. }
  140. static char gdbmsgbuf[BUFMAX + 1];
  141. void gdbstub_msg_write(const char *s, int len)
  142. {
  143. char *bufptr;
  144. int wcount;
  145. int i;
  146. if (len == 0)
  147. len = strlen(s);
  148. gdbmsgbuf[0] = 'O';
  149. while (len > 0) {
  150. bufptr = gdbmsgbuf + 1;
  151. if ((len << 1) > (BUFMAX - 2))
  152. wcount = (BUFMAX - 2) >> 1;
  153. else
  154. wcount = len;
  155. for (i = 0; i < wcount; i++)
  156. bufptr = hex_byte_pack(bufptr, s[i]);
  157. *bufptr = '\0';
  158. s += wcount;
  159. len -= wcount;
  160. put_packet(gdbmsgbuf);
  161. }
  162. }
  163. char *kgdb_mem2hex(char *mem, char *buf, int count)
  164. {
  165. char *tmp;
  166. int err;
  167. tmp = buf + count;
  168. err = probe_kernel_read(tmp, mem, count);
  169. if (err)
  170. return NULL;
  171. while (count > 0) {
  172. buf = hex_byte_pack(buf, *tmp);
  173. tmp++;
  174. count--;
  175. }
  176. *buf = 0;
  177. return buf;
  178. }
  179. /*
  180. * Convert the hex array pointed to by buf into binary to be placed in
  181. * mem. Return a pointer to the character AFTER the last byte
  182. * written. May return an error.
  183. */
  184. int kgdb_hex2mem(char *buf, char *mem, int count)
  185. {
  186. char *tmp_raw;
  187. char *tmp_hex;
  188. tmp_raw = buf + count * 2;
  189. tmp_hex = tmp_raw - 1;
  190. while (tmp_hex >= buf) {
  191. tmp_raw--;
  192. *tmp_raw = hex_to_bin(*tmp_hex--);
  193. *tmp_raw |= hex_to_bin(*tmp_hex--) << 4;
  194. }
  195. return probe_kernel_write(mem, tmp_raw, count);
  196. }
  197. int kgdb_hex2long(char **ptr, unsigned long *long_val)
  198. {
  199. int hex_val;
  200. int num = 0;
  201. int negate = 0;
  202. *long_val = 0;
  203. if (**ptr == '-') {
  204. negate = 1;
  205. (*ptr)++;
  206. }
  207. while (**ptr) {
  208. hex_val = hex_to_bin(**ptr);
  209. if (hex_val < 0)
  210. break;
  211. *long_val = (*long_val << 4) | hex_val;
  212. num++;
  213. (*ptr)++;
  214. }
  215. if (negate)
  216. *long_val = -*long_val;
  217. return num;
  218. }
  219. static int kgdb_ebin2mem(char *buf, char *mem, int count)
  220. {
  221. int size = 0;
  222. char *c = buf;
  223. while (count-- > 0) {
  224. c[size] = *buf++;
  225. if (c[size] == 0x7d)
  226. c[size] = *buf++ ^ 0x20;
  227. size++;
  228. }
  229. return probe_kernel_write(mem, c, size);
  230. }
  231. #if DBG_MAX_REG_NUM > 0
  232. void pt_regs_to_gdb_regs(unsigned long *gdb_regs, struct pt_regs *regs)
  233. {
  234. int i;
  235. int idx = 0;
  236. char *ptr = (char *)gdb_regs;
  237. for (i = 0; i < DBG_MAX_REG_NUM; i++) {
  238. dbg_get_reg(i, ptr + idx, regs);
  239. idx += dbg_reg_def[i].size;
  240. }
  241. }
  242. void gdb_regs_to_pt_regs(unsigned long *gdb_regs, struct pt_regs *regs)
  243. {
  244. int i;
  245. int idx = 0;
  246. char *ptr = (char *)gdb_regs;
  247. for (i = 0; i < DBG_MAX_REG_NUM; i++) {
  248. dbg_set_reg(i, ptr + idx, regs);
  249. idx += dbg_reg_def[i].size;
  250. }
  251. }
  252. #endif
  253. static int write_mem_msg(int binary)
  254. {
  255. char *ptr = &remcom_in_buffer[1];
  256. unsigned long addr;
  257. unsigned long length;
  258. int err;
  259. if (kgdb_hex2long(&ptr, &addr) > 0 && *(ptr++) == ',' &&
  260. kgdb_hex2long(&ptr, &length) > 0 && *(ptr++) == ':') {
  261. if (binary)
  262. err = kgdb_ebin2mem(ptr, (char *)addr, length);
  263. else
  264. err = kgdb_hex2mem(ptr, (char *)addr, length);
  265. if (err)
  266. return err;
  267. if (CACHE_FLUSH_IS_SAFE)
  268. flush_icache_range(addr, addr + length);
  269. return 0;
  270. }
  271. return -EINVAL;
  272. }
  273. static void error_packet(char *pkt, int error)
  274. {
  275. error = -error;
  276. pkt[0] = 'E';
  277. pkt[1] = hex_asc[(error / 10)];
  278. pkt[2] = hex_asc[(error % 10)];
  279. pkt[3] = '\0';
  280. }
  281. #define BUF_THREAD_ID_SIZE 8
  282. static char *pack_threadid(char *pkt, unsigned char *id)
  283. {
  284. unsigned char *limit;
  285. int lzero = 1;
  286. limit = id + (BUF_THREAD_ID_SIZE / 2);
  287. while (id < limit) {
  288. if (!lzero || *id != 0) {
  289. pkt = hex_byte_pack(pkt, *id);
  290. lzero = 0;
  291. }
  292. id++;
  293. }
  294. if (lzero)
  295. pkt = hex_byte_pack(pkt, 0);
  296. return pkt;
  297. }
  298. static void int_to_threadref(unsigned char *id, int value)
  299. {
  300. put_unaligned_be32(value, id);
  301. }
  302. static struct task_struct *getthread(struct pt_regs *regs, int tid)
  303. {
  304. if (tid == 0 || tid == -1)
  305. tid = -atomic_read(&kgdb_active) - 2;
  306. if (tid < -1 && tid > -NR_CPUS - 2) {
  307. if (kgdb_info[-tid - 2].task)
  308. return kgdb_info[-tid - 2].task;
  309. else
  310. return idle_task(-tid - 2);
  311. }
  312. if (tid <= 0) {
  313. printk(KERN_ERR "KGDB: Internal thread select error\n");
  314. dump_stack();
  315. return NULL;
  316. }
  317. return find_task_by_pid_ns(tid, &init_pid_ns);
  318. }
  319. static inline int shadow_pid(int realpid)
  320. {
  321. if (realpid)
  322. return realpid;
  323. return -raw_smp_processor_id() - 2;
  324. }
  325. static void gdb_cmd_status(struct kgdb_state *ks)
  326. {
  327. dbg_remove_all_break();
  328. remcom_out_buffer[0] = 'S';
  329. hex_byte_pack(&remcom_out_buffer[1], ks->signo);
  330. }
  331. static void gdb_get_regs_helper(struct kgdb_state *ks)
  332. {
  333. struct task_struct *thread;
  334. void *local_debuggerinfo;
  335. int i;
  336. thread = kgdb_usethread;
  337. if (!thread) {
  338. thread = kgdb_info[ks->cpu].task;
  339. local_debuggerinfo = kgdb_info[ks->cpu].debuggerinfo;
  340. } else {
  341. local_debuggerinfo = NULL;
  342. for_each_online_cpu(i) {
  343. if (thread == kgdb_info[i].task)
  344. local_debuggerinfo = kgdb_info[i].debuggerinfo;
  345. }
  346. }
  347. if (local_debuggerinfo) {
  348. pt_regs_to_gdb_regs(gdb_regs, local_debuggerinfo);
  349. } else {
  350. sleeping_thread_to_gdb_regs(gdb_regs, thread);
  351. }
  352. }
  353. static void gdb_cmd_getregs(struct kgdb_state *ks)
  354. {
  355. gdb_get_regs_helper(ks);
  356. kgdb_mem2hex((char *)gdb_regs, remcom_out_buffer, NUMREGBYTES);
  357. }
  358. static void gdb_cmd_setregs(struct kgdb_state *ks)
  359. {
  360. kgdb_hex2mem(&remcom_in_buffer[1], (char *)gdb_regs, NUMREGBYTES);
  361. if (kgdb_usethread && kgdb_usethread != current) {
  362. error_packet(remcom_out_buffer, -EINVAL);
  363. } else {
  364. gdb_regs_to_pt_regs(gdb_regs, ks->linux_regs);
  365. strcpy(remcom_out_buffer, "OK");
  366. }
  367. }
  368. static void gdb_cmd_memread(struct kgdb_state *ks)
  369. {
  370. char *ptr = &remcom_in_buffer[1];
  371. unsigned long length;
  372. unsigned long addr;
  373. char *err;
  374. if (kgdb_hex2long(&ptr, &addr) > 0 && *ptr++ == ',' &&
  375. kgdb_hex2long(&ptr, &length) > 0) {
  376. err = kgdb_mem2hex((char *)addr, remcom_out_buffer, length);
  377. if (!err)
  378. error_packet(remcom_out_buffer, -EINVAL);
  379. } else {
  380. error_packet(remcom_out_buffer, -EINVAL);
  381. }
  382. }
  383. static void gdb_cmd_memwrite(struct kgdb_state *ks)
  384. {
  385. int err = write_mem_msg(0);
  386. if (err)
  387. error_packet(remcom_out_buffer, err);
  388. else
  389. strcpy(remcom_out_buffer, "OK");
  390. }
  391. #if DBG_MAX_REG_NUM > 0
  392. static char *gdb_hex_reg_helper(int regnum, char *out)
  393. {
  394. int i;
  395. int offset = 0;
  396. for (i = 0; i < regnum; i++)
  397. offset += dbg_reg_def[i].size;
  398. return kgdb_mem2hex((char *)gdb_regs + offset, out,
  399. dbg_reg_def[i].size);
  400. }
  401. static void gdb_cmd_reg_get(struct kgdb_state *ks)
  402. {
  403. unsigned long regnum;
  404. char *ptr = &remcom_in_buffer[1];
  405. kgdb_hex2long(&ptr, &regnum);
  406. if (regnum >= DBG_MAX_REG_NUM) {
  407. error_packet(remcom_out_buffer, -EINVAL);
  408. return;
  409. }
  410. gdb_get_regs_helper(ks);
  411. gdb_hex_reg_helper(regnum, remcom_out_buffer);
  412. }
  413. static void gdb_cmd_reg_set(struct kgdb_state *ks)
  414. {
  415. unsigned long regnum;
  416. char *ptr = &remcom_in_buffer[1];
  417. int i = 0;
  418. kgdb_hex2long(&ptr, &regnum);
  419. if (*ptr++ != '=' ||
  420. !(!kgdb_usethread || kgdb_usethread == current) ||
  421. !dbg_get_reg(regnum, gdb_regs, ks->linux_regs)) {
  422. error_packet(remcom_out_buffer, -EINVAL);
  423. return;
  424. }
  425. memset(gdb_regs, 0, sizeof(gdb_regs));
  426. while (i < sizeof(gdb_regs) * 2)
  427. if (hex_to_bin(ptr[i]) >= 0)
  428. i++;
  429. else
  430. break;
  431. i = i / 2;
  432. kgdb_hex2mem(ptr, (char *)gdb_regs, i);
  433. dbg_set_reg(regnum, gdb_regs, ks->linux_regs);
  434. strcpy(remcom_out_buffer, "OK");
  435. }
  436. #endif
  437. static void gdb_cmd_binwrite(struct kgdb_state *ks)
  438. {
  439. int err = write_mem_msg(1);
  440. if (err)
  441. error_packet(remcom_out_buffer, err);
  442. else
  443. strcpy(remcom_out_buffer, "OK");
  444. }
  445. static void gdb_cmd_detachkill(struct kgdb_state *ks)
  446. {
  447. int error;
  448. if (remcom_in_buffer[0] == 'D') {
  449. error = dbg_remove_all_break();
  450. if (error < 0) {
  451. error_packet(remcom_out_buffer, error);
  452. } else {
  453. strcpy(remcom_out_buffer, "OK");
  454. kgdb_connected = 0;
  455. }
  456. put_packet(remcom_out_buffer);
  457. } else {
  458. dbg_remove_all_break();
  459. kgdb_connected = 0;
  460. }
  461. }
  462. static int gdb_cmd_reboot(struct kgdb_state *ks)
  463. {
  464. if (strcmp(remcom_in_buffer, "R0") == 0) {
  465. printk(KERN_CRIT "Executing emergency reboot\n");
  466. strcpy(remcom_out_buffer, "OK");
  467. put_packet(remcom_out_buffer);
  468. machine_emergency_restart();
  469. kgdb_connected = 0;
  470. return 1;
  471. }
  472. return 0;
  473. }
  474. static void gdb_cmd_query(struct kgdb_state *ks)
  475. {
  476. struct task_struct *g;
  477. struct task_struct *p;
  478. unsigned char thref[BUF_THREAD_ID_SIZE];
  479. char *ptr;
  480. int i;
  481. int cpu;
  482. int finished = 0;
  483. switch (remcom_in_buffer[1]) {
  484. case 's':
  485. case 'f':
  486. if (memcmp(remcom_in_buffer + 2, "ThreadInfo", 10))
  487. break;
  488. i = 0;
  489. remcom_out_buffer[0] = 'm';
  490. ptr = remcom_out_buffer + 1;
  491. if (remcom_in_buffer[1] == 'f') {
  492. for_each_online_cpu(cpu) {
  493. ks->thr_query = 0;
  494. int_to_threadref(thref, -cpu - 2);
  495. ptr = pack_threadid(ptr, thref);
  496. *(ptr++) = ',';
  497. i++;
  498. }
  499. }
  500. do_each_thread(g, p) {
  501. if (i >= ks->thr_query && !finished) {
  502. int_to_threadref(thref, p->pid);
  503. ptr = pack_threadid(ptr, thref);
  504. *(ptr++) = ',';
  505. ks->thr_query++;
  506. if (ks->thr_query % KGDB_MAX_THREAD_QUERY == 0)
  507. finished = 1;
  508. }
  509. i++;
  510. } while_each_thread(g, p);
  511. *(--ptr) = '\0';
  512. break;
  513. case 'C':
  514. strcpy(remcom_out_buffer, "QC");
  515. ks->threadid = shadow_pid(current->pid);
  516. int_to_threadref(thref, ks->threadid);
  517. pack_threadid(remcom_out_buffer + 2, thref);
  518. break;
  519. case 'T':
  520. if (memcmp(remcom_in_buffer + 1, "ThreadExtraInfo,", 16))
  521. break;
  522. ks->threadid = 0;
  523. ptr = remcom_in_buffer + 17;
  524. kgdb_hex2long(&ptr, &ks->threadid);
  525. if (!getthread(ks->linux_regs, ks->threadid)) {
  526. error_packet(remcom_out_buffer, -EINVAL);
  527. break;
  528. }
  529. if ((int)ks->threadid > 0) {
  530. kgdb_mem2hex(getthread(ks->linux_regs,
  531. ks->threadid)->comm,
  532. remcom_out_buffer, 16);
  533. } else {
  534. static char tmpstr[23 + BUF_THREAD_ID_SIZE];
  535. sprintf(tmpstr, "shadowCPU%d",
  536. (int)(-ks->threadid - 2));
  537. kgdb_mem2hex(tmpstr, remcom_out_buffer, strlen(tmpstr));
  538. }
  539. break;
  540. #ifdef CONFIG_KGDB_KDB
  541. case 'R':
  542. if (strncmp(remcom_in_buffer, "qRcmd,", 6) == 0) {
  543. int len = strlen(remcom_in_buffer + 6);
  544. if ((len % 2) != 0) {
  545. strcpy(remcom_out_buffer, "E01");
  546. break;
  547. }
  548. kgdb_hex2mem(remcom_in_buffer + 6,
  549. remcom_out_buffer, len);
  550. len = len / 2;
  551. remcom_out_buffer[len++] = 0;
  552. kdb_parse(remcom_out_buffer);
  553. strcpy(remcom_out_buffer, "OK");
  554. }
  555. break;
  556. #endif
  557. }
  558. }
  559. static void gdb_cmd_task(struct kgdb_state *ks)
  560. {
  561. struct task_struct *thread;
  562. char *ptr;
  563. switch (remcom_in_buffer[1]) {
  564. case 'g':
  565. ptr = &remcom_in_buffer[2];
  566. kgdb_hex2long(&ptr, &ks->threadid);
  567. thread = getthread(ks->linux_regs, ks->threadid);
  568. if (!thread && ks->threadid > 0) {
  569. error_packet(remcom_out_buffer, -EINVAL);
  570. break;
  571. }
  572. kgdb_usethread = thread;
  573. ks->kgdb_usethreadid = ks->threadid;
  574. strcpy(remcom_out_buffer, "OK");
  575. break;
  576. case 'c':
  577. ptr = &remcom_in_buffer[2];
  578. kgdb_hex2long(&ptr, &ks->threadid);
  579. if (!ks->threadid) {
  580. kgdb_contthread = NULL;
  581. } else {
  582. thread = getthread(ks->linux_regs, ks->threadid);
  583. if (!thread && ks->threadid > 0) {
  584. error_packet(remcom_out_buffer, -EINVAL);
  585. break;
  586. }
  587. kgdb_contthread = thread;
  588. }
  589. strcpy(remcom_out_buffer, "OK");
  590. break;
  591. }
  592. }
  593. static void gdb_cmd_thread(struct kgdb_state *ks)
  594. {
  595. char *ptr = &remcom_in_buffer[1];
  596. struct task_struct *thread;
  597. kgdb_hex2long(&ptr, &ks->threadid);
  598. thread = getthread(ks->linux_regs, ks->threadid);
  599. if (thread)
  600. strcpy(remcom_out_buffer, "OK");
  601. else
  602. error_packet(remcom_out_buffer, -EINVAL);
  603. }
  604. static void gdb_cmd_break(struct kgdb_state *ks)
  605. {
  606. char *bpt_type = &remcom_in_buffer[1];
  607. char *ptr = &remcom_in_buffer[2];
  608. unsigned long addr;
  609. unsigned long length;
  610. int error = 0;
  611. if (arch_kgdb_ops.set_hw_breakpoint && *bpt_type >= '1') {
  612. if (*bpt_type > '4')
  613. return;
  614. } else {
  615. if (*bpt_type != '0' && *bpt_type != '1')
  616. return;
  617. }
  618. if (*bpt_type == '1' && !(arch_kgdb_ops.flags & KGDB_HW_BREAKPOINT))
  619. return;
  620. if (*(ptr++) != ',') {
  621. error_packet(remcom_out_buffer, -EINVAL);
  622. return;
  623. }
  624. if (!kgdb_hex2long(&ptr, &addr)) {
  625. error_packet(remcom_out_buffer, -EINVAL);
  626. return;
  627. }
  628. if (*(ptr++) != ',' ||
  629. !kgdb_hex2long(&ptr, &length)) {
  630. error_packet(remcom_out_buffer, -EINVAL);
  631. return;
  632. }
  633. if (remcom_in_buffer[0] == 'Z' && *bpt_type == '0')
  634. error = dbg_set_sw_break(addr);
  635. else if (remcom_in_buffer[0] == 'z' && *bpt_type == '0')
  636. error = dbg_remove_sw_break(addr);
  637. else if (remcom_in_buffer[0] == 'Z')
  638. error = arch_kgdb_ops.set_hw_breakpoint(addr,
  639. (int)length, *bpt_type - '0');
  640. else if (remcom_in_buffer[0] == 'z')
  641. error = arch_kgdb_ops.remove_hw_breakpoint(addr,
  642. (int) length, *bpt_type - '0');
  643. if (error == 0)
  644. strcpy(remcom_out_buffer, "OK");
  645. else
  646. error_packet(remcom_out_buffer, error);
  647. }
  648. static int gdb_cmd_exception_pass(struct kgdb_state *ks)
  649. {
  650. if (remcom_in_buffer[1] == '0' && remcom_in_buffer[2] == '9') {
  651. ks->pass_exception = 1;
  652. remcom_in_buffer[0] = 'c';
  653. } else if (remcom_in_buffer[1] == '1' && remcom_in_buffer[2] == '5') {
  654. ks->pass_exception = 1;
  655. remcom_in_buffer[0] = 'D';
  656. dbg_remove_all_break();
  657. kgdb_connected = 0;
  658. return 1;
  659. } else {
  660. gdbstub_msg_write("KGDB only knows signal 9 (pass)"
  661. " and 15 (pass and disconnect)\n"
  662. "Executing a continue without signal passing\n", 0);
  663. remcom_in_buffer[0] = 'c';
  664. }
  665. return -1;
  666. }
  667. int gdb_serial_stub(struct kgdb_state *ks)
  668. {
  669. int error = 0;
  670. int tmp;
  671. memset(remcom_out_buffer, 0, sizeof(remcom_out_buffer));
  672. kgdb_usethread = kgdb_info[ks->cpu].task;
  673. ks->kgdb_usethreadid = shadow_pid(kgdb_info[ks->cpu].task->pid);
  674. ks->pass_exception = 0;
  675. if (kgdb_connected) {
  676. unsigned char thref[BUF_THREAD_ID_SIZE];
  677. char *ptr;
  678. ptr = remcom_out_buffer;
  679. *ptr++ = 'T';
  680. ptr = hex_byte_pack(ptr, ks->signo);
  681. ptr += strlen(strcpy(ptr, "thread:"));
  682. int_to_threadref(thref, shadow_pid(current->pid));
  683. ptr = pack_threadid(ptr, thref);
  684. *ptr++ = ';';
  685. put_packet(remcom_out_buffer);
  686. }
  687. while (1) {
  688. error = 0;
  689. memset(remcom_out_buffer, 0, sizeof(remcom_out_buffer));
  690. get_packet(remcom_in_buffer);
  691. switch (remcom_in_buffer[0]) {
  692. case '?':
  693. gdb_cmd_status(ks);
  694. break;
  695. case 'g':
  696. gdb_cmd_getregs(ks);
  697. break;
  698. case 'G':
  699. gdb_cmd_setregs(ks);
  700. break;
  701. case 'm':
  702. gdb_cmd_memread(ks);
  703. break;
  704. case 'M':
  705. gdb_cmd_memwrite(ks);
  706. break;
  707. #if DBG_MAX_REG_NUM > 0
  708. case 'p':
  709. gdb_cmd_reg_get(ks);
  710. break;
  711. case 'P':
  712. gdb_cmd_reg_set(ks);
  713. break;
  714. #endif
  715. case 'X':
  716. gdb_cmd_binwrite(ks);
  717. break;
  718. case 'D':
  719. case 'k':
  720. gdb_cmd_detachkill(ks);
  721. goto default_handle;
  722. case 'R':
  723. if (gdb_cmd_reboot(ks))
  724. goto default_handle;
  725. break;
  726. case 'q':
  727. gdb_cmd_query(ks);
  728. break;
  729. case 'H':
  730. gdb_cmd_task(ks);
  731. break;
  732. case 'T':
  733. gdb_cmd_thread(ks);
  734. break;
  735. case 'z':
  736. case 'Z':
  737. gdb_cmd_break(ks);
  738. break;
  739. #ifdef CONFIG_KGDB_KDB
  740. case '3':
  741. if (remcom_in_buffer[1] == '\0') {
  742. gdb_cmd_detachkill(ks);
  743. return DBG_PASS_EVENT;
  744. }
  745. #endif
  746. case 'C':
  747. tmp = gdb_cmd_exception_pass(ks);
  748. if (tmp > 0)
  749. goto default_handle;
  750. if (tmp == 0)
  751. break;
  752. case 'c':
  753. case 's':
  754. if (kgdb_contthread && kgdb_contthread != current) {
  755. error_packet(remcom_out_buffer, -EINVAL);
  756. break;
  757. }
  758. dbg_activate_sw_breakpoints();
  759. default:
  760. default_handle:
  761. error = kgdb_arch_handle_exception(ks->ex_vector,
  762. ks->signo,
  763. ks->err_code,
  764. remcom_in_buffer,
  765. remcom_out_buffer,
  766. ks->linux_regs);
  767. if (error >= 0 || remcom_in_buffer[0] == 'D' ||
  768. remcom_in_buffer[0] == 'k') {
  769. error = 0;
  770. goto kgdb_exit;
  771. }
  772. }
  773. put_packet(remcom_out_buffer);
  774. }
  775. kgdb_exit:
  776. if (ks->pass_exception)
  777. error = 1;
  778. return error;
  779. }
  780. int gdbstub_state(struct kgdb_state *ks, char *cmd)
  781. {
  782. int error;
  783. switch (cmd[0]) {
  784. case 'e':
  785. error = kgdb_arch_handle_exception(ks->ex_vector,
  786. ks->signo,
  787. ks->err_code,
  788. remcom_in_buffer,
  789. remcom_out_buffer,
  790. ks->linux_regs);
  791. return error;
  792. case 's':
  793. case 'c':
  794. strcpy(remcom_in_buffer, cmd);
  795. return 0;
  796. case '$':
  797. strcpy(remcom_in_buffer, cmd);
  798. gdbstub_use_prev_in_buf = strlen(remcom_in_buffer);
  799. gdbstub_prev_in_buf_pos = 0;
  800. return 0;
  801. }
  802. dbg_io_ops->write_char('+');
  803. put_packet(remcom_out_buffer);
  804. return 0;
  805. }
  806. void gdbstub_exit(int status)
  807. {
  808. unsigned char checksum, ch, buffer[3];
  809. int loop;
  810. if (!kgdb_connected)
  811. return;
  812. kgdb_connected = 0;
  813. if (!dbg_io_ops || dbg_kdb_mode)
  814. return;
  815. buffer[0] = 'W';
  816. buffer[1] = hex_asc_hi(status);
  817. buffer[2] = hex_asc_lo(status);
  818. dbg_io_ops->write_char('$');
  819. checksum = 0;
  820. for (loop = 0; loop < 3; loop++) {
  821. ch = buffer[loop];
  822. checksum += ch;
  823. dbg_io_ops->write_char(ch);
  824. }
  825. dbg_io_ops->write_char('#');
  826. dbg_io_ops->write_char(hex_asc_hi(checksum));
  827. dbg_io_ops->write_char(hex_asc_lo(checksum));
  828. if (dbg_io_ops->flush)
  829. dbg_io_ops->flush();
  830. }