1 /*- 2 * Copyright (c) 2004 The FreeBSD Project 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27 #include <sys/cdefs.h> 28 __FBSDID("$FreeBSD$"); 29 30 #include "opt_kdb.h" 31 #include "opt_stack.h" 32 33 #include <sys/param.h> 34 #include <sys/systm.h> 35 #include <sys/kdb.h> 36 #include <sys/kernel.h> 37 #include <sys/malloc.h> 38 #include <sys/pcpu.h> 39 #include <sys/proc.h> 40 #include <sys/sbuf.h> 41 #include <sys/smp.h> 42 #include <sys/stack.h> 43 #include <sys/sysctl.h> 44 45 #include <machine/kdb.h> 46 #include <machine/pcb.h> 47 48 #ifdef SMP 49 #include <machine/smp.h> 50 #endif 51 52 int kdb_active = 0; 53 static void *kdb_jmpbufp = NULL; 54 struct kdb_dbbe *kdb_dbbe = NULL; 55 static struct pcb kdb_pcb; 56 struct pcb *kdb_thrctx = NULL; 57 struct thread *kdb_thread = NULL; 58 struct trapframe *kdb_frame = NULL; 59 60 #ifdef BREAK_TO_DEBUGGER 61 #define KDB_BREAK_TO_DEBUGGER 1 62 #else 63 #define KDB_BREAK_TO_DEBUGGER 0 64 #endif 65 66 #ifdef ALT_BREAK_TO_DEBUGGER 67 #define KDB_ALT_BREAK_TO_DEBUGGER 1 68 #else 69 #define KDB_ALT_BREAK_TO_DEBUGGER 0 70 #endif 71 72 static int kdb_break_to_debugger = KDB_BREAK_TO_DEBUGGER; 73 static int kdb_alt_break_to_debugger = KDB_ALT_BREAK_TO_DEBUGGER; 74 75 KDB_BACKEND(null, NULL, NULL, NULL); 76 SET_DECLARE(kdb_dbbe_set, struct kdb_dbbe); 77 78 static int kdb_sysctl_available(SYSCTL_HANDLER_ARGS); 79 static int kdb_sysctl_current(SYSCTL_HANDLER_ARGS); 80 static int kdb_sysctl_enter(SYSCTL_HANDLER_ARGS); 81 static int kdb_sysctl_panic(SYSCTL_HANDLER_ARGS); 82 static int kdb_sysctl_trap(SYSCTL_HANDLER_ARGS); 83 static int kdb_sysctl_trap_code(SYSCTL_HANDLER_ARGS); 84 85 static SYSCTL_NODE(_debug, OID_AUTO, kdb, CTLFLAG_RW, NULL, "KDB nodes"); 86 87 SYSCTL_PROC(_debug_kdb, OID_AUTO, available, CTLTYPE_STRING | CTLFLAG_RD, NULL, 88 0, kdb_sysctl_available, "A", "list of available KDB backends"); 89 90 SYSCTL_PROC(_debug_kdb, OID_AUTO, current, CTLTYPE_STRING | CTLFLAG_RW, NULL, 91 0, kdb_sysctl_current, "A", "currently selected KDB backend"); 92 93 SYSCTL_PROC(_debug_kdb, OID_AUTO, enter, 94 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_SECURE, NULL, 0, 95 kdb_sysctl_enter, "I", "set to enter the debugger"); 96 97 SYSCTL_PROC(_debug_kdb, OID_AUTO, panic, 98 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_SECURE, NULL, 0, 99 kdb_sysctl_panic, "I", "set to panic the kernel"); 100 101 SYSCTL_PROC(_debug_kdb, OID_AUTO, trap, 102 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_SECURE, NULL, 0, 103 kdb_sysctl_trap, "I", "set to cause a page fault via data access"); 104 105 SYSCTL_PROC(_debug_kdb, OID_AUTO, trap_code, 106 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_SECURE, NULL, 0, 107 kdb_sysctl_trap_code, "I", "set to cause a page fault via code access"); 108 109 SYSCTL_INT(_debug_kdb, OID_AUTO, break_to_debugger, 110 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_TUN | CTLFLAG_SECURE, 111 &kdb_break_to_debugger, 0, "Enable break to debugger"); 112 TUNABLE_INT("debug.kdb.break_to_debugger", &kdb_break_to_debugger); 113 114 SYSCTL_INT(_debug_kdb, OID_AUTO, alt_break_to_debugger, 115 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_TUN | CTLFLAG_SECURE, 116 &kdb_alt_break_to_debugger, 0, "Enable alternative break to debugger"); 117 TUNABLE_INT("debug.kdb.alt_break_to_debugger", &kdb_alt_break_to_debugger); 118 119 /* 120 * Flag to indicate to debuggers why the debugger was entered. 121 */ 122 const char * volatile kdb_why = KDB_WHY_UNSET; 123 124 static int 125 kdb_sysctl_available(SYSCTL_HANDLER_ARGS) 126 { 127 struct kdb_dbbe **iter; 128 struct sbuf sbuf; 129 int error; 130 131 sbuf_new_for_sysctl(&sbuf, NULL, 64, req); 132 SET_FOREACH(iter, kdb_dbbe_set) { 133 if ((*iter)->dbbe_active == 0) 134 sbuf_printf(&sbuf, "%s ", (*iter)->dbbe_name); 135 } 136 error = sbuf_finish(&sbuf); 137 sbuf_delete(&sbuf); 138 return (error); 139 } 140 141 static int 142 kdb_sysctl_current(SYSCTL_HANDLER_ARGS) 143 { 144 char buf[16]; 145 int error; 146 147 if (kdb_dbbe != NULL) 148 strlcpy(buf, kdb_dbbe->dbbe_name, sizeof(buf)); 149 else 150 *buf = '\0'; 151 error = sysctl_handle_string(oidp, buf, sizeof(buf), req); 152 if (error != 0 || req->newptr == NULL) 153 return (error); 154 if (kdb_active) 155 return (EBUSY); 156 return (kdb_dbbe_select(buf)); 157 } 158 159 static int 160 kdb_sysctl_enter(SYSCTL_HANDLER_ARGS) 161 { 162 int error, i; 163 164 error = sysctl_wire_old_buffer(req, sizeof(int)); 165 if (error == 0) { 166 i = 0; 167 error = sysctl_handle_int(oidp, &i, 0, req); 168 } 169 if (error != 0 || req->newptr == NULL) 170 return (error); 171 if (kdb_active) 172 return (EBUSY); 173 kdb_enter(KDB_WHY_SYSCTL, "sysctl debug.kdb.enter"); 174 return (0); 175 } 176 177 static int 178 kdb_sysctl_panic(SYSCTL_HANDLER_ARGS) 179 { 180 int error, i; 181 182 error = sysctl_wire_old_buffer(req, sizeof(int)); 183 if (error == 0) { 184 i = 0; 185 error = sysctl_handle_int(oidp, &i, 0, req); 186 } 187 if (error != 0 || req->newptr == NULL) 188 return (error); 189 panic("kdb_sysctl_panic"); 190 return (0); 191 } 192 193 static int 194 kdb_sysctl_trap(SYSCTL_HANDLER_ARGS) 195 { 196 int error, i; 197 int *addr = (int *)0x10; 198 199 error = sysctl_wire_old_buffer(req, sizeof(int)); 200 if (error == 0) { 201 i = 0; 202 error = sysctl_handle_int(oidp, &i, 0, req); 203 } 204 if (error != 0 || req->newptr == NULL) 205 return (error); 206 return (*addr); 207 } 208 209 static int 210 kdb_sysctl_trap_code(SYSCTL_HANDLER_ARGS) 211 { 212 int error, i; 213 void (*fp)(u_int, u_int, u_int) = (void *)0xdeadc0de; 214 215 error = sysctl_wire_old_buffer(req, sizeof(int)); 216 if (error == 0) { 217 i = 0; 218 error = sysctl_handle_int(oidp, &i, 0, req); 219 } 220 if (error != 0 || req->newptr == NULL) 221 return (error); 222 (*fp)(0x11111111, 0x22222222, 0x33333333); 223 return (0); 224 } 225 226 void 227 kdb_panic(const char *msg) 228 { 229 230 printf("KDB: panic\n"); 231 panic("%s", msg); 232 } 233 234 void 235 kdb_reboot(void) 236 { 237 238 printf("KDB: reboot requested\n"); 239 shutdown_nice(0); 240 } 241 242 /* 243 * Solaris implements a new BREAK which is initiated by a character sequence 244 * CR ~ ^b which is similar to a familiar pattern used on Sun servers by the 245 * Remote Console. 246 * 247 * Note that this function may be called from almost anywhere, with interrupts 248 * disabled and with unknown locks held, so it must not access data other than 249 * its arguments. Its up to the caller to ensure that the state variable is 250 * consistent. 251 */ 252 253 #define KEY_CR 13 /* CR '\r' */ 254 #define KEY_TILDE 126 /* ~ */ 255 #define KEY_CRTLB 2 /* ^B */ 256 #define KEY_CRTLP 16 /* ^P */ 257 #define KEY_CRTLR 18 /* ^R */ 258 259 /* States of th KDB "alternate break sequence" detecting state machine. */ 260 enum { 261 KDB_ALT_BREAK_SEEN_NONE, 262 KDB_ALT_BREAK_SEEN_CR, 263 KDB_ALT_BREAK_SEEN_CR_TILDE, 264 }; 265 266 int 267 kdb_break(void) 268 { 269 270 if (!kdb_break_to_debugger) 271 return (0); 272 kdb_enter(KDB_WHY_BREAK, "Break to debugger"); 273 return (KDB_REQ_DEBUGGER); 274 } 275 276 static int 277 kdb_alt_break_state(int key, int *state) 278 { 279 int brk; 280 281 /* All states transition to KDB_ALT_BREAK_SEEN_CR on a CR. */ 282 if (key == KEY_CR) { 283 *state = KDB_ALT_BREAK_SEEN_CR; 284 return (0); 285 } 286 287 brk = 0; 288 switch (*state) { 289 case KDB_ALT_BREAK_SEEN_CR: 290 *state = KDB_ALT_BREAK_SEEN_NONE; 291 if (key == KEY_TILDE) 292 *state = KDB_ALT_BREAK_SEEN_CR_TILDE; 293 break; 294 case KDB_ALT_BREAK_SEEN_CR_TILDE: 295 *state = KDB_ALT_BREAK_SEEN_NONE; 296 if (key == KEY_CRTLB) 297 brk = KDB_REQ_DEBUGGER; 298 else if (key == KEY_CRTLP) 299 brk = KDB_REQ_PANIC; 300 else if (key == KEY_CRTLR) 301 brk = KDB_REQ_REBOOT; 302 break; 303 case KDB_ALT_BREAK_SEEN_NONE: 304 default: 305 *state = KDB_ALT_BREAK_SEEN_NONE; 306 break; 307 } 308 return (brk); 309 } 310 311 static int 312 kdb_alt_break_internal(int key, int *state, int force_gdb) 313 { 314 int brk; 315 316 if (!kdb_alt_break_to_debugger) 317 return (0); 318 brk = kdb_alt_break_state(key, state); 319 switch (brk) { 320 case KDB_REQ_DEBUGGER: 321 if (force_gdb) 322 kdb_dbbe_select("gdb"); 323 kdb_enter(KDB_WHY_BREAK, "Break to debugger"); 324 break; 325 326 case KDB_REQ_PANIC: 327 if (force_gdb) 328 kdb_dbbe_select("gdb"); 329 kdb_panic("Panic sequence on console"); 330 break; 331 332 case KDB_REQ_REBOOT: 333 kdb_reboot(); 334 break; 335 } 336 return (0); 337 } 338 339 int 340 kdb_alt_break(int key, int *state) 341 { 342 343 return (kdb_alt_break_internal(key, state, 0)); 344 } 345 346 /* 347 * This variation on kdb_alt_break() is used only by dcons, which has its own 348 * configuration flag to force GDB use regardless of the global KDB 349 * configuration. 350 */ 351 int 352 kdb_alt_break_gdb(int key, int *state) 353 { 354 355 return (kdb_alt_break_internal(key, state, 1)); 356 } 357 358 /* 359 * Print a backtrace of the calling thread. The backtrace is generated by 360 * the selected debugger, provided it supports backtraces. If no debugger 361 * is selected or the current debugger does not support backtraces, this 362 * function silently returns. 363 */ 364 365 void 366 kdb_backtrace(void) 367 { 368 369 if (kdb_dbbe != NULL && kdb_dbbe->dbbe_trace != NULL) { 370 printf("KDB: stack backtrace:\n"); 371 kdb_dbbe->dbbe_trace(); 372 } 373 #ifdef STACK 374 else { 375 struct stack st; 376 377 printf("KDB: stack backtrace:\n"); 378 stack_save(&st); 379 stack_print_ddb(&st); 380 } 381 #endif 382 } 383 384 /* 385 * Set/change the current backend. 386 */ 387 388 int 389 kdb_dbbe_select(const char *name) 390 { 391 struct kdb_dbbe *be, **iter; 392 393 SET_FOREACH(iter, kdb_dbbe_set) { 394 be = *iter; 395 if (be->dbbe_active == 0 && strcmp(be->dbbe_name, name) == 0) { 396 kdb_dbbe = be; 397 return (0); 398 } 399 } 400 return (EINVAL); 401 } 402 403 /* 404 * Enter the currently selected debugger. If a message has been provided, 405 * it is printed first. If the debugger does not support the enter method, 406 * it is entered by using breakpoint(), which enters the debugger through 407 * kdb_trap(). The 'why' argument will contain a more mechanically usable 408 * string than 'msg', and is relied upon by DDB scripting to identify the 409 * reason for entering the debugger so that the right script can be run. 410 */ 411 void 412 kdb_enter(const char *why, const char *msg) 413 { 414 415 if (kdb_dbbe != NULL && kdb_active == 0) { 416 if (msg != NULL) 417 printf("KDB: enter: %s\n", msg); 418 kdb_why = why; 419 breakpoint(); 420 kdb_why = KDB_WHY_UNSET; 421 } 422 } 423 424 /* 425 * Initialize the kernel debugger interface. 426 */ 427 428 void 429 kdb_init(void) 430 { 431 struct kdb_dbbe *be, **iter; 432 int cur_pri, pri; 433 434 kdb_active = 0; 435 kdb_dbbe = NULL; 436 cur_pri = -1; 437 SET_FOREACH(iter, kdb_dbbe_set) { 438 be = *iter; 439 pri = (be->dbbe_init != NULL) ? be->dbbe_init() : -1; 440 be->dbbe_active = (pri >= 0) ? 0 : -1; 441 if (pri > cur_pri) { 442 cur_pri = pri; 443 kdb_dbbe = be; 444 } 445 } 446 if (kdb_dbbe != NULL) { 447 printf("KDB: debugger backends:"); 448 SET_FOREACH(iter, kdb_dbbe_set) { 449 be = *iter; 450 if (be->dbbe_active == 0) 451 printf(" %s", be->dbbe_name); 452 } 453 printf("\n"); 454 printf("KDB: current backend: %s\n", 455 kdb_dbbe->dbbe_name); 456 } 457 } 458 459 /* 460 * Handle contexts. 461 */ 462 463 void * 464 kdb_jmpbuf(jmp_buf new) 465 { 466 void *old; 467 468 old = kdb_jmpbufp; 469 kdb_jmpbufp = new; 470 return (old); 471 } 472 473 void 474 kdb_reenter(void) 475 { 476 477 if (!kdb_active || kdb_jmpbufp == NULL) 478 return; 479 480 longjmp(kdb_jmpbufp, 1); 481 /* NOTREACHED */ 482 } 483 484 /* 485 * Thread related support functions. 486 */ 487 488 struct pcb * 489 kdb_thr_ctx(struct thread *thr) 490 { 491 #if defined(SMP) && defined(KDB_STOPPEDPCB) 492 struct pcpu *pc; 493 #endif 494 495 if (thr == curthread) 496 return (&kdb_pcb); 497 498 #if defined(SMP) && defined(KDB_STOPPEDPCB) 499 STAILQ_FOREACH(pc, &cpuhead, pc_allcpu) { 500 if (pc->pc_curthread == thr && 501 CPU_ISSET(pc->pc_cpuid, &stopped_cpus)) 502 return (KDB_STOPPEDPCB(pc)); 503 } 504 #endif 505 return (thr->td_pcb); 506 } 507 508 struct thread * 509 kdb_thr_first(void) 510 { 511 struct proc *p; 512 struct thread *thr; 513 514 p = LIST_FIRST(&allproc); 515 while (p != NULL) { 516 if (p->p_flag & P_INMEM) { 517 thr = FIRST_THREAD_IN_PROC(p); 518 if (thr != NULL) 519 return (thr); 520 } 521 p = LIST_NEXT(p, p_list); 522 } 523 return (NULL); 524 } 525 526 struct thread * 527 kdb_thr_from_pid(pid_t pid) 528 { 529 struct proc *p; 530 531 p = LIST_FIRST(&allproc); 532 while (p != NULL) { 533 if (p->p_flag & P_INMEM && p->p_pid == pid) 534 return (FIRST_THREAD_IN_PROC(p)); 535 p = LIST_NEXT(p, p_list); 536 } 537 return (NULL); 538 } 539 540 struct thread * 541 kdb_thr_lookup(lwpid_t tid) 542 { 543 struct thread *thr; 544 545 thr = kdb_thr_first(); 546 while (thr != NULL && thr->td_tid != tid) 547 thr = kdb_thr_next(thr); 548 return (thr); 549 } 550 551 struct thread * 552 kdb_thr_next(struct thread *thr) 553 { 554 struct proc *p; 555 556 p = thr->td_proc; 557 thr = TAILQ_NEXT(thr, td_plist); 558 do { 559 if (thr != NULL) 560 return (thr); 561 p = LIST_NEXT(p, p_list); 562 if (p != NULL && (p->p_flag & P_INMEM)) 563 thr = FIRST_THREAD_IN_PROC(p); 564 } while (p != NULL); 565 return (NULL); 566 } 567 568 int 569 kdb_thr_select(struct thread *thr) 570 { 571 if (thr == NULL) 572 return (EINVAL); 573 kdb_thread = thr; 574 kdb_thrctx = kdb_thr_ctx(thr); 575 return (0); 576 } 577 578 /* 579 * Enter the debugger due to a trap. 580 */ 581 582 int 583 kdb_trap(int type, int code, struct trapframe *tf) 584 { 585 #ifdef SMP 586 cpuset_t other_cpus; 587 #endif 588 struct kdb_dbbe *be; 589 register_t intr; 590 int handled; 591 #ifdef SMP 592 int did_stop_cpus; 593 #endif 594 595 be = kdb_dbbe; 596 if (be == NULL || be->dbbe_trap == NULL) 597 return (0); 598 599 /* We reenter the debugger through kdb_reenter(). */ 600 if (kdb_active) 601 return (0); 602 603 intr = intr_disable(); 604 605 #ifdef SMP 606 if (!SCHEDULER_STOPPED()) { 607 other_cpus = all_cpus; 608 CPU_CLR(PCPU_GET(cpuid), &other_cpus); 609 stop_cpus_hard(other_cpus); 610 did_stop_cpus = 1; 611 } else 612 did_stop_cpus = 0; 613 #endif 614 615 kdb_active++; 616 617 kdb_frame = tf; 618 619 /* Let MD code do its thing first... */ 620 kdb_cpu_trap(type, code); 621 622 makectx(tf, &kdb_pcb); 623 kdb_thr_select(curthread); 624 625 for (;;) { 626 handled = be->dbbe_trap(type, code); 627 if (be == kdb_dbbe) 628 break; 629 be = kdb_dbbe; 630 if (be == NULL || be->dbbe_trap == NULL) 631 break; 632 printf("Switching to %s back-end\n", be->dbbe_name); 633 } 634 635 kdb_active--; 636 637 #ifdef SMP 638 if (did_stop_cpus) 639 restart_cpus(stopped_cpus); 640 #endif 641 642 intr_restore(intr); 643 644 return (handled); 645 } 646