kgdb.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. /*
  2. * PowerPC backend to the KGDB stub.
  3. *
  4. * 1998 (c) Michael AK Tesch (tesch@cs.wisc.edu)
  5. * Copyright (C) 2003 Timesys Corporation.
  6. * Copyright (C) 2004-2006 MontaVista Software, Inc.
  7. * PPC64 Mods (C) 2005 Frank Rowand (frowand@mvista.com)
  8. * PPC32 support restored by Vitaly Wool <vwool@ru.mvista.com> and
  9. * Sergei Shtylyov <sshtylyov@ru.mvista.com>
  10. * Copyright (C) 2007-2008 Wind River Systems, Inc.
  11. *
  12. * This file is licensed under the terms of the GNU General Public License
  13. * version 2. This program as licensed "as is" without any warranty of any
  14. * kind, whether express or implied.
  15. */
  16. #include <linux/kernel.h>
  17. #include <linux/init.h>
  18. #include <linux/kgdb.h>
  19. #include <linux/smp.h>
  20. #include <linux/signal.h>
  21. #include <linux/ptrace.h>
  22. #include <linux/kdebug.h>
  23. #include <asm/current.h>
  24. #include <asm/processor.h>
  25. #include <asm/machdep.h>
  26. /*
  27. * This table contains the mapping between PowerPC hardware trap types, and
  28. * signals, which are primarily what GDB understands. GDB and the kernel
  29. * don't always agree on values, so we use constants taken from gdb-6.2.
  30. */
  31. static struct hard_trap_info
  32. {
  33. unsigned int tt; /* Trap type code for powerpc */
  34. unsigned char signo; /* Signal that we map this trap into */
  35. } hard_trap_info[] = {
  36. { 0x0100, 0x02 /* SIGINT */ }, /* system reset */
  37. { 0x0200, 0x0b /* SIGSEGV */ }, /* machine check */
  38. { 0x0300, 0x0b /* SIGSEGV */ }, /* data access */
  39. { 0x0400, 0x0b /* SIGSEGV */ }, /* instruction access */
  40. { 0x0500, 0x02 /* SIGINT */ }, /* external interrupt */
  41. { 0x0600, 0x0a /* SIGBUS */ }, /* alignment */
  42. { 0x0700, 0x05 /* SIGTRAP */ }, /* program check */
  43. { 0x0800, 0x08 /* SIGFPE */ }, /* fp unavailable */
  44. { 0x0900, 0x0e /* SIGALRM */ }, /* decrementer */
  45. { 0x0c00, 0x14 /* SIGCHLD */ }, /* system call */
  46. #if defined(CONFIG_40x) || defined(CONFIG_BOOKE)
  47. { 0x2002, 0x05 /* SIGTRAP */ }, /* debug */
  48. #if defined(CONFIG_FSL_BOOKE)
  49. { 0x2010, 0x08 /* SIGFPE */ }, /* spe unavailable */
  50. { 0x2020, 0x08 /* SIGFPE */ }, /* spe unavailable */
  51. { 0x2030, 0x08 /* SIGFPE */ }, /* spe fp data */
  52. { 0x2040, 0x08 /* SIGFPE */ }, /* spe fp data */
  53. { 0x2050, 0x08 /* SIGFPE */ }, /* spe fp round */
  54. { 0x2060, 0x0e /* SIGILL */ }, /* performance monitor */
  55. { 0x2900, 0x08 /* SIGFPE */ }, /* apu unavailable */
  56. { 0x3100, 0x0e /* SIGALRM */ }, /* fixed interval timer */
  57. { 0x3200, 0x02 /* SIGINT */ }, /* watchdog */
  58. #else /* ! CONFIG_FSL_BOOKE */
  59. { 0x1000, 0x0e /* SIGALRM */ }, /* prog interval timer */
  60. { 0x1010, 0x0e /* SIGALRM */ }, /* fixed interval timer */
  61. { 0x1020, 0x02 /* SIGINT */ }, /* watchdog */
  62. { 0x2010, 0x08 /* SIGFPE */ }, /* fp unavailable */
  63. { 0x2020, 0x08 /* SIGFPE */ }, /* ap unavailable */
  64. #endif
  65. #else /* ! (defined(CONFIG_40x) || defined(CONFIG_BOOKE)) */
  66. { 0x0d00, 0x05 /* SIGTRAP */ }, /* single-step */
  67. #if defined(CONFIG_8xx)
  68. { 0x1000, 0x04 /* SIGILL */ }, /* software emulation */
  69. #else /* ! CONFIG_8xx */
  70. { 0x0f00, 0x04 /* SIGILL */ }, /* performance monitor */
  71. { 0x0f20, 0x08 /* SIGFPE */ }, /* altivec unavailable */
  72. { 0x1300, 0x05 /* SIGTRAP */ }, /* instruction address break */
  73. #if defined(CONFIG_PPC64)
  74. { 0x1200, 0x05 /* SIGILL */ }, /* system error */
  75. { 0x1500, 0x04 /* SIGILL */ }, /* soft patch */
  76. { 0x1600, 0x04 /* SIGILL */ }, /* maintenance */
  77. { 0x1700, 0x08 /* SIGFPE */ }, /* altivec assist */
  78. { 0x1800, 0x04 /* SIGILL */ }, /* thermal */
  79. #else /* ! CONFIG_PPC64 */
  80. { 0x1400, 0x02 /* SIGINT */ }, /* SMI */
  81. { 0x1600, 0x08 /* SIGFPE */ }, /* altivec assist */
  82. { 0x1700, 0x04 /* SIGILL */ }, /* TAU */
  83. { 0x2000, 0x05 /* SIGTRAP */ }, /* run mode */
  84. #endif
  85. #endif
  86. #endif
  87. { 0x0000, 0x00 } /* Must be last */
  88. };
  89. static int computeSignal(unsigned int tt)
  90. {
  91. struct hard_trap_info *ht;
  92. for (ht = hard_trap_info; ht->tt && ht->signo; ht++)
  93. if (ht->tt == tt)
  94. return ht->signo;
  95. return SIGHUP; /* default for things we don't know about */
  96. }
  97. static int kgdb_call_nmi_hook(struct pt_regs *regs)
  98. {
  99. kgdb_nmicallback(raw_smp_processor_id(), regs);
  100. return 0;
  101. }
  102. #ifdef CONFIG_SMP
  103. void kgdb_roundup_cpus(unsigned long flags)
  104. {
  105. smp_send_debugger_break(MSG_ALL_BUT_SELF);
  106. }
  107. #endif
  108. /* KGDB functions to use existing PowerPC64 hooks. */
  109. static int kgdb_debugger(struct pt_regs *regs)
  110. {
  111. return !kgdb_handle_exception(1, computeSignal(TRAP(regs)),
  112. DIE_OOPS, regs);
  113. }
  114. static int kgdb_handle_breakpoint(struct pt_regs *regs)
  115. {
  116. if (user_mode(regs))
  117. return 0;
  118. if (kgdb_handle_exception(1, SIGTRAP, 0, regs) != 0)
  119. return 0;
  120. if (*(u32 *) (regs->nip) == *(u32 *) (&arch_kgdb_ops.gdb_bpt_instr))
  121. regs->nip += BREAK_INSTR_SIZE;
  122. return 1;
  123. }
  124. static int kgdb_singlestep(struct pt_regs *regs)
  125. {
  126. struct thread_info *thread_info, *exception_thread_info;
  127. if (user_mode(regs))
  128. return 0;
  129. /*
  130. * On Book E and perhaps other processsors, singlestep is handled on
  131. * the critical exception stack. This causes current_thread_info()
  132. * to fail, since it it locates the thread_info by masking off
  133. * the low bits of the current stack pointer. We work around
  134. * this issue by copying the thread_info from the kernel stack
  135. * before calling kgdb_handle_exception, and copying it back
  136. * afterwards. On most processors the copy is avoided since
  137. * exception_thread_info == thread_info.
  138. */
  139. thread_info = (struct thread_info *)(regs->gpr[1] & ~(THREAD_SIZE-1));
  140. exception_thread_info = current_thread_info();
  141. if (thread_info != exception_thread_info)
  142. memcpy(exception_thread_info, thread_info, sizeof *thread_info);
  143. kgdb_handle_exception(0, SIGTRAP, 0, regs);
  144. if (thread_info != exception_thread_info)
  145. memcpy(thread_info, exception_thread_info, sizeof *thread_info);
  146. return 1;
  147. }
  148. static int kgdb_iabr_match(struct pt_regs *regs)
  149. {
  150. if (user_mode(regs))
  151. return 0;
  152. if (kgdb_handle_exception(0, computeSignal(TRAP(regs)), 0, regs) != 0)
  153. return 0;
  154. return 1;
  155. }
  156. static int kgdb_dabr_match(struct pt_regs *regs)
  157. {
  158. if (user_mode(regs))
  159. return 0;
  160. if (kgdb_handle_exception(0, computeSignal(TRAP(regs)), 0, regs) != 0)
  161. return 0;
  162. return 1;
  163. }
  164. #define PACK64(ptr, src) do { *(ptr++) = (src); } while (0)
  165. #define PACK32(ptr, src) do { \
  166. u32 *ptr32; \
  167. ptr32 = (u32 *)ptr; \
  168. *(ptr32++) = (src); \
  169. ptr = (unsigned long *)ptr32; \
  170. } while (0)
  171. void pt_regs_to_gdb_regs(unsigned long *gdb_regs, struct pt_regs *regs)
  172. {
  173. unsigned long *ptr = gdb_regs;
  174. int reg;
  175. memset(gdb_regs, 0, NUMREGBYTES);
  176. for (reg = 0; reg < 32; reg++)
  177. PACK64(ptr, regs->gpr[reg]);
  178. #ifdef CONFIG_FSL_BOOKE
  179. #ifdef CONFIG_SPE
  180. for (reg = 0; reg < 32; reg++)
  181. PACK64(ptr, current->thread.evr[reg]);
  182. #else
  183. ptr += 32;
  184. #endif
  185. #else
  186. /* fp registers not used by kernel, leave zero */
  187. ptr += 32 * 8 / sizeof(long);
  188. #endif
  189. PACK64(ptr, regs->nip);
  190. PACK64(ptr, regs->msr);
  191. PACK32(ptr, regs->ccr);
  192. PACK64(ptr, regs->link);
  193. PACK64(ptr, regs->ctr);
  194. PACK32(ptr, regs->xer);
  195. BUG_ON((unsigned long)ptr >
  196. (unsigned long)(((void *)gdb_regs) + NUMREGBYTES));
  197. }
  198. void sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, struct task_struct *p)
  199. {
  200. struct pt_regs *regs = (struct pt_regs *)(p->thread.ksp +
  201. STACK_FRAME_OVERHEAD);
  202. unsigned long *ptr = gdb_regs;
  203. int reg;
  204. memset(gdb_regs, 0, NUMREGBYTES);
  205. /* Regs GPR0-2 */
  206. for (reg = 0; reg < 3; reg++)
  207. PACK64(ptr, regs->gpr[reg]);
  208. /* Regs GPR3-13 are caller saved, not in regs->gpr[] */
  209. ptr += 11;
  210. /* Regs GPR14-31 */
  211. for (reg = 14; reg < 32; reg++)
  212. PACK64(ptr, regs->gpr[reg]);
  213. #ifdef CONFIG_FSL_BOOKE
  214. #ifdef CONFIG_SPE
  215. for (reg = 0; reg < 32; reg++)
  216. PACK64(ptr, p->thread.evr[reg]);
  217. #else
  218. ptr += 32;
  219. #endif
  220. #else
  221. /* fp registers not used by kernel, leave zero */
  222. ptr += 32 * 8 / sizeof(long);
  223. #endif
  224. PACK64(ptr, regs->nip);
  225. PACK64(ptr, regs->msr);
  226. PACK32(ptr, regs->ccr);
  227. PACK64(ptr, regs->link);
  228. PACK64(ptr, regs->ctr);
  229. PACK32(ptr, regs->xer);
  230. BUG_ON((unsigned long)ptr >
  231. (unsigned long)(((void *)gdb_regs) + NUMREGBYTES));
  232. }
  233. #define UNPACK64(dest, ptr) do { dest = *(ptr++); } while (0)
  234. #define UNPACK32(dest, ptr) do { \
  235. u32 *ptr32; \
  236. ptr32 = (u32 *)ptr; \
  237. dest = *(ptr32++); \
  238. ptr = (unsigned long *)ptr32; \
  239. } while (0)
  240. void gdb_regs_to_pt_regs(unsigned long *gdb_regs, struct pt_regs *regs)
  241. {
  242. unsigned long *ptr = gdb_regs;
  243. int reg;
  244. for (reg = 0; reg < 32; reg++)
  245. UNPACK64(regs->gpr[reg], ptr);
  246. #ifdef CONFIG_FSL_BOOKE
  247. #ifdef CONFIG_SPE
  248. for (reg = 0; reg < 32; reg++)
  249. UNPACK64(current->thread.evr[reg], ptr);
  250. #else
  251. ptr += 32;
  252. #endif
  253. #else
  254. /* fp registers not used by kernel, leave zero */
  255. ptr += 32 * 8 / sizeof(int);
  256. #endif
  257. UNPACK64(regs->nip, ptr);
  258. UNPACK64(regs->msr, ptr);
  259. UNPACK32(regs->ccr, ptr);
  260. UNPACK64(regs->link, ptr);
  261. UNPACK64(regs->ctr, ptr);
  262. UNPACK32(regs->xer, ptr);
  263. BUG_ON((unsigned long)ptr >
  264. (unsigned long)(((void *)gdb_regs) + NUMREGBYTES));
  265. }
  266. void kgdb_arch_set_pc(struct pt_regs *regs, unsigned long pc)
  267. {
  268. regs->nip = pc;
  269. }
  270. /*
  271. * This function does PowerPC specific procesing for interfacing to gdb.
  272. */
  273. int kgdb_arch_handle_exception(int vector, int signo, int err_code,
  274. char *remcom_in_buffer, char *remcom_out_buffer,
  275. struct pt_regs *linux_regs)
  276. {
  277. char *ptr = &remcom_in_buffer[1];
  278. unsigned long addr;
  279. switch (remcom_in_buffer[0]) {
  280. /*
  281. * sAA..AA Step one instruction from AA..AA
  282. * This will return an error to gdb ..
  283. */
  284. case 's':
  285. case 'c':
  286. /* handle the optional parameter */
  287. if (kgdb_hex2long(&ptr, &addr))
  288. linux_regs->nip = addr;
  289. atomic_set(&kgdb_cpu_doing_single_step, -1);
  290. /* set the trace bit if we're stepping */
  291. if (remcom_in_buffer[0] == 's') {
  292. #ifdef CONFIG_PPC_ADV_DEBUG_REGS
  293. mtspr(SPRN_DBCR0,
  294. mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM);
  295. linux_regs->msr |= MSR_DE;
  296. #else
  297. linux_regs->msr |= MSR_SE;
  298. #endif
  299. kgdb_single_step = 1;
  300. atomic_set(&kgdb_cpu_doing_single_step,
  301. raw_smp_processor_id());
  302. }
  303. return 0;
  304. }
  305. return -1;
  306. }
  307. /*
  308. * Global data
  309. */
  310. struct kgdb_arch arch_kgdb_ops = {
  311. .gdb_bpt_instr = {0x7d, 0x82, 0x10, 0x08},
  312. };
  313. static int kgdb_not_implemented(struct pt_regs *regs)
  314. {
  315. return 0;
  316. }
  317. static void *old__debugger_ipi;
  318. static void *old__debugger;
  319. static void *old__debugger_bpt;
  320. static void *old__debugger_sstep;
  321. static void *old__debugger_iabr_match;
  322. static void *old__debugger_dabr_match;
  323. static void *old__debugger_fault_handler;
  324. int kgdb_arch_init(void)
  325. {
  326. old__debugger_ipi = __debugger_ipi;
  327. old__debugger = __debugger;
  328. old__debugger_bpt = __debugger_bpt;
  329. old__debugger_sstep = __debugger_sstep;
  330. old__debugger_iabr_match = __debugger_iabr_match;
  331. old__debugger_dabr_match = __debugger_dabr_match;
  332. old__debugger_fault_handler = __debugger_fault_handler;
  333. __debugger_ipi = kgdb_call_nmi_hook;
  334. __debugger = kgdb_debugger;
  335. __debugger_bpt = kgdb_handle_breakpoint;
  336. __debugger_sstep = kgdb_singlestep;
  337. __debugger_iabr_match = kgdb_iabr_match;
  338. __debugger_dabr_match = kgdb_dabr_match;
  339. __debugger_fault_handler = kgdb_not_implemented;
  340. return 0;
  341. }
  342. void kgdb_arch_exit(void)
  343. {
  344. __debugger_ipi = old__debugger_ipi;
  345. __debugger = old__debugger;
  346. __debugger_bpt = old__debugger_bpt;
  347. __debugger_sstep = old__debugger_sstep;
  348. __debugger_iabr_match = old__debugger_iabr_match;
  349. __debugger_dabr_match = old__debugger_dabr_match;
  350. __debugger_fault_handler = old__debugger_fault_handler;
  351. }