On Tue, May 28, 2024 at 6:12 PM Chao Du <duc...@eswincomputing.com> wrote: > > This patch implements insert/remove software breakpoint process. > > For RISC-V, GDB treats single-step similarly to breakpoint: add a > breakpoint at the next step address, then continue. So this also > works for single-step debugging. > > Implement kvm_arch_update_guest_debug(): Set the control flag > when there are active breakpoints. This will help KVM to know > the status in the userspace. > > Add some stubs which are necessary for building, and will be > implemented later. > > Signed-off-by: Chao Du <duc...@eswincomputing.com>
Acked-by: Alistair Francis <alistair.fran...@wdc.com> Alistair > --- > target/riscv/kvm/kvm-cpu.c | 69 ++++++++++++++++++++++++++++++++++++++ > 1 file changed, 69 insertions(+) > > diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c > index 235e2cdaca..c50f058aff 100644 > --- a/target/riscv/kvm/kvm-cpu.c > +++ b/target/riscv/kvm/kvm-cpu.c > @@ -1969,3 +1969,72 @@ static const TypeInfo riscv_kvm_cpu_type_infos[] = { > }; > > DEFINE_TYPES(riscv_kvm_cpu_type_infos) > + > +static const uint32_t ebreak_insn = 0x00100073; > +static const uint16_t c_ebreak_insn = 0x9002; > + > +int kvm_arch_insert_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp) > +{ > + if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 2, 0)) { > + return -EINVAL; > + } > + > + if ((bp->saved_insn & 0x3) == 0x3) { > + if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 4, 0) > + || cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&ebreak_insn, 4, > 1)) { > + return -EINVAL; > + } > + } else { > + if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&c_ebreak_insn, 2, > 1)) { > + return -EINVAL; > + } > + } > + > + return 0; > +} > + > +int kvm_arch_remove_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp) > +{ > + uint32_t ebreak; > + uint16_t c_ebreak; > + > + if ((bp->saved_insn & 0x3) == 0x3) { > + if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&ebreak, 4, 0) || > + ebreak != ebreak_insn || > + cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 4, > 1)) { > + return -EINVAL; > + } > + } else { > + if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&c_ebreak, 2, 0) || > + c_ebreak != c_ebreak_insn || > + cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 2, > 1)) { > + return -EINVAL; > + } > + } > + > + return 0; > +} > + > +int kvm_arch_insert_hw_breakpoint(vaddr addr, vaddr len, int type) > +{ > + /* TODO; To be implemented later. */ > + return -EINVAL; > +} > + > +int kvm_arch_remove_hw_breakpoint(vaddr addr, vaddr len, int type) > +{ > + /* TODO; To be implemented later. */ > + return -EINVAL; > +} > + > +void kvm_arch_remove_all_hw_breakpoints(void) > +{ > + /* TODO; To be implemented later. */ > +} > + > +void kvm_arch_update_guest_debug(CPUState *cs, struct kvm_guest_debug *dbg) > +{ > + if (kvm_sw_breakpoints_active(cs)) { > + dbg->control |= KVM_GUESTDBG_ENABLE; > + } > +} > -- > 2.17.1 >