|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] Debugging Dom0 kernel over serial
Thank you! I am using 3.3.6, but by manually applying your patch, I got it to work. I've attached a patch for 3.3.6 in case anyone would find it useful. -- Jim Attachment:
hvc.patch
-- Jim
On Jun 6, 2012, at 3:54 PM, Ben Guthro wrote:
> What kernel version?
>
> Below is a patch against 3.2.y that allows for debug using kdb over hvc
>
> Some bits of this were recently upstreamed as part of some perf-tools
> work in pvops...but the debug_core.c, and hvc_console.c didn't make
> it.
>
> With this patch, you can add the kernel parameter
> kgdboc=hvc0
>
> Alternately, at runtime by doing the following:
> echo hvc0 > /sys/module/kgdboc/parameters/kgdboc
>
> To break into the debugger, you need to press the magic SysRq key
> sequence "Alt+SysRq+g"
>
> While you are in the debugger, you are in "polling" console mode. As
> such, there seems to be a limitation on how fast you can type
> commands. I found that when I typed two letters too fast, it just
> printed the help text again.
>
>
>
> diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
> index d5e0e0a..88815a1 100644
> --- a/arch/x86/xen/enlighten.c
> +++ b/arch/x86/xen/enlighten.c
> @@ -65,6 +65,7 @@
>
> #include "xen-ops.h"
> #include "mmu.h"
> +#include "smp.h"
> #include "multicalls.h"
>
> EXPORT_SYMBOL_GPL(hypercall_page);
> @@ -768,6 +769,12 @@ static void set_xen_basic_apic_ops(void)
> apic->icr_write = xen_apic_icr_write;
> apic->wait_icr_idle = xen_apic_wait_icr_idle;
> apic->safe_wait_icr_idle = xen_safe_apic_wait_icr_idle;
> +
> + apic->send_IPI_allbutself = xen_send_IPI_allbutself;
> + apic->send_IPI_mask_allbutself = xen_send_IPI_mask_allbutself;
> + apic->send_IPI_mask = xen_send_IPI_mask;
> + apic->send_IPI_all = xen_send_IPI_all;
> + apic->send_IPI_self = xen_send_IPI_self;
> }
>
> #endif
> diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
> index 3061244..d8928a1 100644
> --- a/arch/x86/xen/smp.c
> +++ b/arch/x86/xen/smp.c
> @@ -436,8 +436,8 @@ static void xen_smp_send_reschedule(int cpu)
> xen_send_IPI_one(cpu, XEN_RESCHEDULE_VECTOR);
> }
>
> -static void xen_send_IPI_mask(const struct cpumask *mask,
> - enum ipi_vector vector)
> +void xen_send_IPI_mask(const struct cpumask *mask,
> + int vector)
> {
> unsigned cpu;
>
> @@ -466,6 +466,39 @@ static void xen_smp_send_call_function_single_ipi(int
> cpu)
> XEN_CALL_FUNCTION_SINGLE_VECTOR);
> }
>
> +void xen_send_IPI_all(int vector)
> +{
> + xen_send_IPI_mask(cpu_online_mask, vector);
> +}
> +
> +void xen_send_IPI_self(int vector)
> +{
> + xen_send_IPI_one(smp_processor_id(), vector);
> +}
> +
> +void xen_send_IPI_mask_allbutself(const struct cpumask *mask,
> + int vector)
> +{
> + unsigned cpu;
> + unsigned int this_cpu = smp_processor_id();
> +
> + if (!(num_online_cpus() > 1))
> + return;
> +
> + for_each_cpu_and(cpu, mask, cpu_online_mask) {
> + if (this_cpu == cpu)
> + continue;
> +
> + xen_smp_send_call_function_single_ipi(cpu);
> + }
> +}
> +
> +void xen_send_IPI_allbutself(int vector)
> +{
> + xen_send_IPI_mask_allbutself(cpu_online_mask, vector);
> +}
> +
> +
> static irqreturn_t xen_call_function_interrupt(int irq, void *dev_id)
> {
> irq_enter();
> diff --git a/arch/x86/xen/smp.h b/arch/x86/xen/smp.h
> new file mode 100644
> index 0000000..8981a76
> --- /dev/null
> +++ b/arch/x86/xen/smp.h
> @@ -0,0 +1,12 @@
> +#ifndef _XEN_SMP_H
> +
> +extern void xen_send_IPI_mask(const struct cpumask *mask,
> + int vector);
> +extern void xen_send_IPI_mask_allbutself(const struct cpumask *mask,
> + int vector);
> +extern void xen_send_IPI_allbutself(int vector);
> +extern void physflat_send_IPI_allbutself(int vector);
> +extern void xen_send_IPI_all(int vector);
> +extern void xen_send_IPI_self(int vector);
> +
> +#endif
> diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c
> index 58ca7ce..4addc80 100644
> --- a/drivers/tty/hvc/hvc_console.c
> +++ b/drivers/tty/hvc/hvc_console.c
> @@ -754,13 +754,10 @@ int hvc_poll_init(struct tty_driver *driver, int
> line, char *options)
>
> static int hvc_poll_get_char(struct tty_driver *driver, int line)
> {
> - struct tty_struct *tty = driver->ttys[0];
> - struct hvc_struct *hp = tty->driver_data;
> int n;
> char ch;
>
> - n = hp->ops->get_chars(hp->vtermno, &ch, 1);
> -
> + n = cons_ops[last_hvc]->get_chars(vtermnos[last_hvc], &ch, 1);
> if (n == 0)
> return NO_POLL_CHAR;
>
> @@ -769,12 +766,10 @@ static int hvc_poll_get_char(struct tty_driver
> *driver, int line)
>
> static void hvc_poll_put_char(struct tty_driver *driver, int line, char ch)
> {
> - struct tty_struct *tty = driver->ttys[0];
> - struct hvc_struct *hp = tty->driver_data;
> int n;
>
> do {
> - n = hp->ops->put_chars(hp->vtermno, &ch, 1);
> + n = cons_ops[last_hvc]->put_chars(vtermnos[last_hvc], &ch, 1);
> } while (n <= 0);
> }
> #endif
> diff --git a/kernel/debug/debug_core.c b/kernel/debug/debug_core.c
> index cefd4a1..df904a5 100644
> --- a/kernel/debug/debug_core.c
> +++ b/kernel/debug/debug_core.c
> @@ -581,12 +581,14 @@ return_normal:
> kgdb_roundup_cpus(flags);
> #endif
>
> +#ifndef CONFIG_XEN
> /*
> * Wait for the other CPUs to be notified and be waiting for us:
> */
> while (kgdb_do_roundup && (atomic_read(&masters_in_kgdb) +
> atomic_read(&slaves_in_kgdb)) != online_cpus)
> cpu_relax();
> +#endif
>
> /*
> * At this point the primary processor is completely
>
>
>
>
>
> On Wed, Jun 6, 2012 at 3:55 PM, James Paton <paton@xxxxxxxxxxx> wrote:
>>
>> Thanks everyone for your help.
>>
>> I tried the suggestion of leaving ttyS1 out of the Xen boot options and
>> using that. I confirmed that I can echo things back and forth through that
>> connection from the host OS. I compiled a custom version of gdb to target
>> x86_64-linux-gnu so I could do remote debugging from the host. No luck. I
>> also tried setting console=ttyS1 for the dom0 kernel -- same outcome.
>>
>> Next, using exactly the same settings, I booted the dom0 kernel bare (no Xen
>> this time) and tried the same thing. This time, it worked. I can connect the
>> debugger and it breaks as expected. So I'm thinking debugging while running
>> Xen over serial is a dead end, unless I figure out a way to do it over hvc.
>> I think for now I'll just use printk.
>>
>> -- Jim
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@xxxxxxxxxxxxx
>> http://lists.xen.org/xen-devel
_______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |