Skip to content

Commit 67fc4e0

Browse files
committed
kdb: core for kgdb back end (2 of 2)
This patch contains the hooks and instrumentation into kernel which live outside the kernel/debug directory, which the kdb core will call to run commands like lsmod, dmesg, bt etc... CC: linux-arch@vger.kernel.org Signed-off-by: Jason Wessel <jason.wessel@windriver.com> Signed-off-by: Martin Hicks <mort@sgi.com>
1 parent 5d5314d commit 67fc4e0

9 files changed

Lines changed: 92 additions & 3 deletions

File tree

arch/arm/include/asm/kmap_types.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ enum km_type {
2020
KM_SOFTIRQ1,
2121
KM_L1_CACHE,
2222
KM_L2_CACHE,
23+
KM_KDB,
2324
KM_TYPE_NR
2425
};
2526

arch/powerpc/include/asm/kmap_types.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ enum km_type {
2626
KM_SOFTIRQ1,
2727
KM_PPC_SYNC_PAGE,
2828
KM_PPC_SYNC_ICACHE,
29+
KM_KDB,
2930
KM_TYPE_NR
3031
};
3132

include/asm-generic/kmap_types.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ KMAP_D(15) KM_UML_USERCOPY,
2828
KMAP_D(16) KM_IRQ_PTE,
2929
KMAP_D(17) KM_NMI,
3030
KMAP_D(18) KM_NMI_PTE,
31-
KMAP_D(19) KM_TYPE_NR
31+
KMAP_D(19) KM_KDB,
32+
KMAP_D(20) KM_TYPE_NR
3233
};
3334

3435
#undef KMAP_D

init/main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
#include <linux/sched.h>
6363
#include <linux/signal.h>
6464
#include <linux/idr.h>
65+
#include <linux/kdb.h>
6566
#include <linux/ftrace.h>
6667
#include <linux/async.h>
6768
#include <linux/kmemcheck.h>
@@ -675,6 +676,7 @@ asmlinkage void __init start_kernel(void)
675676
buffer_init();
676677
key_init();
677678
security_init();
679+
kdb_init(KDB_INIT_FULL);
678680
vfs_caches_init(totalram_pages);
679681
signals_init();
680682
/* rootfs populating might need page-writeback */

kernel/kallsyms.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <linux/init.h>
1717
#include <linux/seq_file.h>
1818
#include <linux/fs.h>
19+
#include <linux/kdb.h>
1920
#include <linux/err.h>
2021
#include <linux/proc_fs.h>
2122
#include <linux/sched.h> /* for cond_resched */
@@ -516,6 +517,26 @@ static int kallsyms_open(struct inode *inode, struct file *file)
516517
return ret;
517518
}
518519

520+
#ifdef CONFIG_KGDB_KDB
521+
const char *kdb_walk_kallsyms(loff_t *pos)
522+
{
523+
static struct kallsym_iter kdb_walk_kallsyms_iter;
524+
if (*pos == 0) {
525+
memset(&kdb_walk_kallsyms_iter, 0,
526+
sizeof(kdb_walk_kallsyms_iter));
527+
reset_iter(&kdb_walk_kallsyms_iter, 0);
528+
}
529+
while (1) {
530+
if (!update_iter(&kdb_walk_kallsyms_iter, *pos))
531+
return NULL;
532+
++*pos;
533+
/* Some debugging symbols have no name. Ignore them. */
534+
if (kdb_walk_kallsyms_iter.name[0])
535+
return kdb_walk_kallsyms_iter.name;
536+
}
537+
}
538+
#endif /* CONFIG_KGDB_KDB */
539+
519540
static const struct file_operations kallsyms_operations = {
520541
.open = kallsyms_open,
521542
.read = seq_read,

kernel/module.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,10 @@
7777
DEFINE_MUTEX(module_mutex);
7878
EXPORT_SYMBOL_GPL(module_mutex);
7979
static LIST_HEAD(modules);
80+
#ifdef CONFIG_KGDB_KDB
81+
struct list_head *kdb_modules = &modules; /* kdb needs the list of modules */
82+
#endif /* CONFIG_KGDB_KDB */
83+
8084

8185
/* Block module loading/unloading? */
8286
int modules_disabled = 0;

kernel/printk.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,22 @@ SYSCALL_DEFINE3(syslog, int, type, char __user *, buf, int, len)
413413
return do_syslog(type, buf, len, SYSLOG_FROM_CALL);
414414
}
415415

416+
#ifdef CONFIG_KGDB_KDB
417+
/* kdb dmesg command needs access to the syslog buffer. do_syslog()
418+
* uses locks so it cannot be used during debugging. Just tell kdb
419+
* where the start and end of the physical and logical logs are. This
420+
* is equivalent to do_syslog(3).
421+
*/
422+
void kdb_syslog_data(char *syslog_data[4])
423+
{
424+
syslog_data[0] = log_buf;
425+
syslog_data[1] = log_buf + log_buf_len;
426+
syslog_data[2] = log_buf + log_end -
427+
(logged_chars < log_buf_len ? logged_chars : log_buf_len);
428+
syslog_data[3] = log_buf + log_end;
429+
}
430+
#endif /* CONFIG_KGDB_KDB */
431+
416432
/*
417433
* Call the console drivers on a range of log_buf
418434
*/

kernel/sched.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7758,9 +7758,9 @@ void normalize_rt_tasks(void)
77587758

77597759
#endif /* CONFIG_MAGIC_SYSRQ */
77607760

7761-
#ifdef CONFIG_IA64
7761+
#if defined(CONFIG_IA64) || defined(CONFIG_KGDB_KDB)
77627762
/*
7763-
* These functions are only useful for the IA64 MCA handling.
7763+
* These functions are only useful for the IA64 MCA handling, or kdb.
77647764
*
77657765
* They can only be called when the whole system has been
77667766
* stopped - every CPU needs to be quiescent, and no scheduling
@@ -7780,6 +7780,9 @@ struct task_struct *curr_task(int cpu)
77807780
return cpu_curr(cpu);
77817781
}
77827782

7783+
#endif /* defined(CONFIG_IA64) || defined(CONFIG_KGDB_KDB) */
7784+
7785+
#ifdef CONFIG_IA64
77837786
/**
77847787
* set_curr_task - set the current task for a given cpu.
77857788
* @cpu: the processor in question.

kernel/signal.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2735,3 +2735,43 @@ void __init signals_init(void)
27352735
{
27362736
sigqueue_cachep = KMEM_CACHE(sigqueue, SLAB_PANIC);
27372737
}
2738+
2739+
#ifdef CONFIG_KGDB_KDB
2740+
#include <linux/kdb.h>
2741+
/*
2742+
* kdb_send_sig_info - Allows kdb to send signals without exposing
2743+
* signal internals. This function checks if the required locks are
2744+
* available before calling the main signal code, to avoid kdb
2745+
* deadlocks.
2746+
*/
2747+
void
2748+
kdb_send_sig_info(struct task_struct *t, struct siginfo *info)
2749+
{
2750+
static struct task_struct *kdb_prev_t;
2751+
int sig, new_t;
2752+
if (!spin_trylock(&t->sighand->siglock)) {
2753+
kdb_printf("Can't do kill command now.\n"
2754+
"The sigmask lock is held somewhere else in "
2755+
"kernel, try again later\n");
2756+
return;
2757+
}
2758+
spin_unlock(&t->sighand->siglock);
2759+
new_t = kdb_prev_t != t;
2760+
kdb_prev_t = t;
2761+
if (t->state != TASK_RUNNING && new_t) {
2762+
kdb_printf("Process is not RUNNING, sending a signal from "
2763+
"kdb risks deadlock\n"
2764+
"on the run queue locks. "
2765+
"The signal has _not_ been sent.\n"
2766+
"Reissue the kill command if you want to risk "
2767+
"the deadlock.\n");
2768+
return;
2769+
}
2770+
sig = info->si_signo;
2771+
if (send_sig_info(sig, info, t))
2772+
kdb_printf("Fail to deliver Signal %d to process %d.\n",
2773+
sig, t->pid);
2774+
else
2775+
kdb_printf("Signal %d is sent to process %d.\n", sig, t->pid);
2776+
}
2777+
#endif /* CONFIG_KGDB_KDB */

0 commit comments

Comments
 (0)