qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [BUG]QEMU jump into interrupt when single-stepping on aarch64
@ 2022-04-06 14:30 Shuai Xue
  2022-04-06 16:57 ` Richard Henderson
  0 siblings, 1 reply; 4+ messages in thread
From: Shuai Xue @ 2022-04-06 14:30 UTC (permalink / raw)
  To: qemu-devel

Dear, folks,

I try to debug Linux kernel with QEMU in single-stepping mode on aarch64 platform,
the added breakpoint hits but after I type `step`, the gdb always jumps into interrupt.

My env:

	gdb-10.2
	qemu-6.2.0
	host kernel: 5.10.84
	VM kernel: 5.10.84

The steps to reproduce:
	# host console: run a VM with only one core, the import arg: <qemu:arg value='-s'/>
	# details can be found here: https://www.redhat.com/en/blog/debugging-kernel-qemulibvirt
	virsh create dev_core0.xml
	
	# run gdb client
	gdb ./vmlinux

	# gdb client on host console
	(gdb) dir ./usr/src/debug/kernel-5.10.84/linux-5.10.84-004.alpha.ali5000.alios7.aarch64
	(gdb) target remote localhost:1234
	(gdb) info b
	Num     Type           Disp Enb Address            What
	1       breakpoint     keep y   <MULTIPLE>
	1.1                         y   0xffff800010361444 mm/memory-failure.c:1318
	1.2                         y   0xffff800010361450 in memory_failure
                                                   at mm/memory-failure.c:1488
	(gdb) c
	Continuing.

	# console in VM, use madvise to inject a hwposion at virtual address vaddr,
	# which will hit the b inmemory_failur: madvise(vaddr, pagesize, MADV_HWPOISON);
	# and the VM pause
	./run_madvise.c

	# gdb client on host console
	(gdb)
	Continuing.
	Breakpoint 1, 0xffff800010361444 in memory_failure () at mm/memory-failure.c:1318
	1318                    res = -EHWPOISON;
	(gdb) n
	vectors () at arch/arm64/kernel/entry.S:552
	552             kernel_ventry   1, irq                          // IRQ EL1h
	(gdb) n
	(gdb) n
	(gdb) n
	(gdb) n
	gic_handle_irq (regs=0xffff8000147c3b80) at drivers/irqchip/irq-gic-v3.c:721
	# after several step, I got the irqnr
	(gdb) p irqnr
	$5 = 8262

Sometimes, the irqnr is 27, which is used for arch_timer.

I was wondering do you have any comments on this? And feedback are welcomed.

Thank you.

Best Regards.
Shuai
	
	


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [BUG]QEMU jump into interrupt when single-stepping on aarch64
  2022-04-06 14:30 [BUG]QEMU jump into interrupt when single-stepping on aarch64 Shuai Xue
@ 2022-04-06 16:57 ` Richard Henderson
  2022-04-07  4:10   ` Shuai Xue
  0 siblings, 1 reply; 4+ messages in thread
From: Richard Henderson @ 2022-04-06 16:57 UTC (permalink / raw)
  To: Shuai Xue, qemu-devel

On 4/6/22 09:30, Shuai Xue wrote:
> Dear, folks,
> 
> I try to debug Linux kernel with QEMU in single-stepping mode on aarch64 platform,
> the added breakpoint hits but after I type `step`, the gdb always jumps into interrupt.
> 
> My env:
> 
> 	gdb-10.2
> 	qemu-6.2.0
> 	host kernel: 5.10.84
> 	VM kernel: 5.10.84
> 
> The steps to reproduce:
> 	# host console: run a VM with only one core, the import arg: <qemu:arg value='-s'/>
> 	# details can be found here: https://www.redhat.com/en/blog/debugging-kernel-qemulibvirt
> 	virsh create dev_core0.xml
> 	
> 	# run gdb client
> 	gdb ./vmlinux
> 
> 	# gdb client on host console
> 	(gdb) dir ./usr/src/debug/kernel-5.10.84/linux-5.10.84-004.alpha.ali5000.alios7.aarch64
> 	(gdb) target remote localhost:1234
> 	(gdb) info b
> 	Num     Type           Disp Enb Address            What
> 	1       breakpoint     keep y   <MULTIPLE>
> 	1.1                         y   0xffff800010361444 mm/memory-failure.c:1318
> 	1.2                         y   0xffff800010361450 in memory_failure
>                                                     at mm/memory-failure.c:1488
> 	(gdb) c
> 	Continuing.
> 
> 	# console in VM, use madvise to inject a hwposion at virtual address vaddr,
> 	# which will hit the b inmemory_failur: madvise(vaddr, pagesize, MADV_HWPOISON);
> 	# and the VM pause
> 	./run_madvise.c
> 
> 	# gdb client on host console
> 	(gdb)
> 	Continuing.
> 	Breakpoint 1, 0xffff800010361444 in memory_failure () at mm/memory-failure.c:1318
> 	1318                    res = -EHWPOISON;
> 	(gdb) n
> 	vectors () at arch/arm64/kernel/entry.S:552
> 	552             kernel_ventry   1, irq                          // IRQ EL1h

The 'n' command is not a single-step: use stepi, which will suppress interrupts.
Anyway, not a bug.

r~


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [BUG]QEMU jump into interrupt when single-stepping on aarch64
  2022-04-06 16:57 ` Richard Henderson
@ 2022-04-07  4:10   ` Shuai Xue
  2022-04-12 12:32     ` Shuai Xue
  0 siblings, 1 reply; 4+ messages in thread
From: Shuai Xue @ 2022-04-07  4:10 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel

在 2022/4/7 AM12:57, Richard Henderson 写道:
> On 4/6/22 09:30, Shuai Xue wrote:
>> Dear, folks,
>>
>> I try to debug Linux kernel with QEMU in single-stepping mode on aarch64 platform,
>> the added breakpoint hits but after I type `step`, the gdb always jumps into interrupt.
>>
>> My env:
>>
>>     gdb-10.2
>>     qemu-6.2.0
>>     host kernel: 5.10.84
>>     VM kernel: 5.10.84
>>
>> The steps to reproduce:
>>     # host console: run a VM with only one core, the import arg: <qemu:arg value='-s'/>
>>     # details can be found here: https://www.redhat.com/en/blog/debugging-kernel-qemulibvirt
>>     virsh create dev_core0.xml
>>     
>>     # run gdb client
>>     gdb ./vmlinux
>>
>>     # gdb client on host console
>>     (gdb) dir ./usr/src/debug/kernel-5.10.84/linux-5.10.84-004.alpha.ali5000.alios7.aarch64
>>     (gdb) target remote localhost:1234
>>     (gdb) info b
>>     Num     Type           Disp Enb Address            What
>>     1       breakpoint     keep y   <MULTIPLE>
>>     1.1                         y   0xffff800010361444 mm/memory-failure.c:1318
>>     1.2                         y   0xffff800010361450 in memory_failure
>>                                                     at mm/memory-failure.c:1488
>>     (gdb) c
>>     Continuing.
>>
>>     # console in VM, use madvise to inject a hwposion at virtual address vaddr,
>>     # which will hit the b inmemory_failur: madvise(vaddr, pagesize, MADV_HWPOISON);
>>     # and the VM pause
>>     ./run_madvise.c
>>
>>     # gdb client on host console
>>     (gdb)
>>     Continuing.
>>     Breakpoint 1, 0xffff800010361444 in memory_failure () at mm/memory-failure.c:1318
>>     1318                    res = -EHWPOISON;
>>     (gdb) n
>>     vectors () at arch/arm64/kernel/entry.S:552
>>     552             kernel_ventry   1, irq                          // IRQ EL1h
> 
> The 'n' command is not a single-step: use stepi, which will suppress interrupts.
> Anyway, not a bug.
> 
> r~

Hi, Richard,

Thank you for your quick reply, I also try `stepi`, but it does NOT work either.

	(gdb) c
	Continuing.

	Breakpoint 1, memory_failure (pfn=1273982, flags=1) at mm/memory-failure.c:1488
	1488    {
	(gdb) stepi
	vectors () at arch/arm64/kernel/entry.S:552
	552             kernel_ventry   1, irq                          // IRQ EL1h

According to QEMU doc[1]: the default single stepping behavior is step with the IRQs
and timer service routines off. I checked the MASK bits used to control the single
stepping IE on my machine as bellow:

	# gdb client on host (x86 plafrom)
	(gdb) maintenance packet qqemu.sstepbits
	sending: "qqemu.sstepbits"
	received: "ENABLE=1,NOIRQ=2,NOTIMER=4"

The sstep MASK looks as expected, but does not work as expected.

I also try the same kernel and qemu version on X86 platform:
>>     gdb-10.2
>>     qemu-6.2.0
>>     host kernel: 5.10.84
>>     VM kernel: 5.10.84


The command `n` jumps to the next instruction.

	# gdb client on host (x86 plafrom)
	(gdb) b memory-failure.c:1488
	Breakpoint 1, memory_failure (pfn=1128931, flags=1) at mm/memory-failure.c:1488
	1488    {
	(gdb) n
	1497            if (!sysctl_memory_failure_recovery)
	(gdb) stepi
	0xffffffff812efdbc      1497            if (!sysctl_memory_failure_recovery)
	(gdb) stepi
	0xffffffff812efdbe      1497            if (!sysctl_memory_failure_recovery)
	(gdb) n
	1500            p = pfn_to_online_page(pfn);
	(gdb) l
	1496
	1497            if (!sysctl_memory_failure_recovery)
	1498                    panic("Memory failure on page %lx", pfn);
	1499
	1500            p = pfn_to_online_page(pfn);
	1501            if (!p) {

Best Regrades,
Shuai


[1] https://github.com/qemu/qemu/blob/master/docs/system/gdb.rst


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [BUG]QEMU jump into interrupt when single-stepping on aarch64
  2022-04-07  4:10   ` Shuai Xue
@ 2022-04-12 12:32     ` Shuai Xue
  0 siblings, 0 replies; 4+ messages in thread
From: Shuai Xue @ 2022-04-12 12:32 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel

在 2022/4/7 PM12:10, Shuai Xue 写道:
> 在 2022/4/7 AM12:57, Richard Henderson 写道:
>> On 4/6/22 09:30, Shuai Xue wrote:
>>> Dear, folks,
>>>
>>> I try to debug Linux kernel with QEMU in single-stepping mode on aarch64 platform,
>>> the added breakpoint hits but after I type `step`, the gdb always jumps into interrupt.
>>>
>>> My env:
>>>
>>>     gdb-10.2
>>>     qemu-6.2.0
>>>     host kernel: 5.10.84
>>>     VM kernel: 5.10.84
>>>
>>> The steps to reproduce:
>>>     # host console: run a VM with only one core, the import arg: <qemu:arg value='-s'/>
>>>     # details can be found here: https://www.redhat.com/en/blog/debugging-kernel-qemulibvirt
>>>     virsh create dev_core0.xml
>>>     
>>>     # run gdb client
>>>     gdb ./vmlinux
>>>
>>>     # gdb client on host console
>>>     (gdb) dir ./usr/src/debug/kernel-5.10.84/linux-5.10.84-004.alpha.ali5000.alios7.aarch64
>>>     (gdb) target remote localhost:1234
>>>     (gdb) info b
>>>     Num     Type           Disp Enb Address            What
>>>     1       breakpoint     keep y   <MULTIPLE>
>>>     1.1                         y   0xffff800010361444 mm/memory-failure.c:1318
>>>     1.2                         y   0xffff800010361450 in memory_failure
>>>                                                     at mm/memory-failure.c:1488
>>>     (gdb) c
>>>     Continuing.
>>>
>>>     # console in VM, use madvise to inject a hwposion at virtual address vaddr,
>>>     # which will hit the b inmemory_failur: madvise(vaddr, pagesize, MADV_HWPOISON);
>>>     # and the VM pause
>>>     ./run_madvise.c
>>>
>>>     # gdb client on host console
>>>     (gdb)
>>>     Continuing.
>>>     Breakpoint 1, 0xffff800010361444 in memory_failure () at mm/memory-failure.c:1318
>>>     1318                    res = -EHWPOISON;
>>>     (gdb) n
>>>     vectors () at arch/arm64/kernel/entry.S:552
>>>     552             kernel_ventry   1, irq                          // IRQ EL1h
>>
>> The 'n' command is not a single-step: use stepi, which will suppress interrupts.
>> Anyway, not a bug.
>>
>> r~
> 
> Hi, Richard,
> 
> Thank you for your quick reply, I also try `stepi`, but it does NOT work either.
> 
> 	(gdb) c
> 	Continuing.
> 
> 	Breakpoint 1, memory_failure (pfn=1273982, flags=1) at mm/memory-failure.c:1488
> 	1488    {
> 	(gdb) stepi
> 	vectors () at arch/arm64/kernel/entry.S:552
> 	552             kernel_ventry   1, irq                          // IRQ EL1h
> 
> According to QEMU doc[1]: the default single stepping behavior is step with the IRQs
> and timer service routines off. I checked the MASK bits used to control the single
> stepping IE on my machine as bellow:
> 
> 	# gdb client on host (x86 plafrom)
> 	(gdb) maintenance packet qqemu.sstepbits
> 	sending: "qqemu.sstepbits"
> 	received: "ENABLE=1,NOIRQ=2,NOTIMER=4"
> 
> The sstep MASK looks as expected, but does not work as expected.
> 
> I also try the same kernel and qemu version on X86 platform:
>>>     gdb-10.2
>>>     qemu-6.2.0
>>>     host kernel: 5.10.84
>>>     VM kernel: 5.10.84
> 
> 
> The command `n` jumps to the next instruction.
> 
> 	# gdb client on host (x86 plafrom)
> 	(gdb) b memory-failure.c:1488
> 	Breakpoint 1, memory_failure (pfn=1128931, flags=1) at mm/memory-failure.c:1488
> 	1488    {
> 	(gdb) n
> 	1497            if (!sysctl_memory_failure_recovery)
> 	(gdb) stepi
> 	0xffffffff812efdbc      1497            if (!sysctl_memory_failure_recovery)
> 	(gdb) stepi
> 	0xffffffff812efdbe      1497            if (!sysctl_memory_failure_recovery)
> 	(gdb) n
> 	1500            p = pfn_to_online_page(pfn);
> 	(gdb) l
> 	1496
> 	1497            if (!sysctl_memory_failure_recovery)
> 	1498                    panic("Memory failure on page %lx", pfn);
> 	1499
> 	1500            p = pfn_to_online_page(pfn);
> 	1501            if (!p) {
> 
> Best Regrades,
> Shuai
> 
> 
> [1] https://github.com/qemu/qemu/blob/master/docs/system/gdb.rst

Hi, Richard,

I was wondering that do you have any comments to this?

Best Regrades,
Shuai


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2022-04-12 12:55 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-04-06 14:30 [BUG]QEMU jump into interrupt when single-stepping on aarch64 Shuai Xue
2022-04-06 16:57 ` Richard Henderson
2022-04-07  4:10   ` Shuai Xue
2022-04-12 12:32     ` Shuai Xue

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).