mirror of https://gitee.com/openkylin/qemu.git
cpu: move adjust_watchpoint_address to tcg_ops
commit 4061200059
("arm: Correctly handle watchpoints for BE32 CPUs")
introduced this ARM-specific, TCG-specific hack to adjust the address,
before checking it with cpu_check_watchpoint.
Make adjust_watchpoint_address optional and move it to tcg_ops.
Signed-off-by: Claudio Fontana <cfontana@suse.de>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20210204163931.7358-14-cfontana@suse.de>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
79fc8d4511
commit
9ea9087bb4
|
@ -383,11 +383,6 @@ static int64_t cpu_common_get_arch_id(CPUState *cpu)
|
||||||
return cpu->cpu_index;
|
return cpu->cpu_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
static vaddr cpu_adjust_watchpoint_address(CPUState *cpu, vaddr addr, int len)
|
|
||||||
{
|
|
||||||
return addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Property cpu_common_props[] = {
|
static Property cpu_common_props[] = {
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
/* Create a memory property for softmmu CPU object,
|
/* Create a memory property for softmmu CPU object,
|
||||||
|
@ -421,7 +416,6 @@ static void cpu_class_init(ObjectClass *klass, void *data)
|
||||||
k->gdb_write_register = cpu_common_gdb_write_register;
|
k->gdb_write_register = cpu_common_gdb_write_register;
|
||||||
k->virtio_is_big_endian = cpu_common_virtio_is_big_endian;
|
k->virtio_is_big_endian = cpu_common_virtio_is_big_endian;
|
||||||
k->debug_check_watchpoint = cpu_common_debug_check_watchpoint;
|
k->debug_check_watchpoint = cpu_common_debug_check_watchpoint;
|
||||||
k->adjust_watchpoint_address = cpu_adjust_watchpoint_address;
|
|
||||||
set_bit(DEVICE_CATEGORY_CPU, dc->categories);
|
set_bit(DEVICE_CATEGORY_CPU, dc->categories);
|
||||||
dc->realize = cpu_common_realizefn;
|
dc->realize = cpu_common_realizefn;
|
||||||
dc->unrealize = cpu_common_unrealizefn;
|
dc->unrealize = cpu_common_unrealizefn;
|
||||||
|
|
|
@ -136,6 +136,11 @@ typedef struct TcgCpuOperations {
|
||||||
void (*do_unaligned_access)(CPUState *cpu, vaddr addr,
|
void (*do_unaligned_access)(CPUState *cpu, vaddr addr,
|
||||||
MMUAccessType access_type,
|
MMUAccessType access_type,
|
||||||
int mmu_idx, uintptr_t retaddr);
|
int mmu_idx, uintptr_t retaddr);
|
||||||
|
/**
|
||||||
|
* @adjust_watchpoint_address: hack for cpu_check_watchpoint used by ARM
|
||||||
|
*/
|
||||||
|
vaddr (*adjust_watchpoint_address)(CPUState *cpu, vaddr addr, int len);
|
||||||
|
|
||||||
} TcgCpuOperations;
|
} TcgCpuOperations;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -244,7 +249,6 @@ struct CPUClass {
|
||||||
const char * (*gdb_get_dynamic_xml)(CPUState *cpu, const char *xmlname);
|
const char * (*gdb_get_dynamic_xml)(CPUState *cpu, const char *xmlname);
|
||||||
|
|
||||||
void (*disas_set_info)(CPUState *cpu, disassemble_info *info);
|
void (*disas_set_info)(CPUState *cpu, disassemble_info *info);
|
||||||
vaddr (*adjust_watchpoint_address)(CPUState *cpu, vaddr addr, int len);
|
|
||||||
|
|
||||||
const char *deprecation_note;
|
const char *deprecation_note;
|
||||||
/* Keep non-pointer data at the end to minimize holes. */
|
/* Keep non-pointer data at the end to minimize holes. */
|
||||||
|
|
|
@ -894,7 +894,10 @@ void cpu_check_watchpoint(CPUState *cpu, vaddr addr, vaddr len,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
addr = cc->adjust_watchpoint_address(cpu, addr, len);
|
if (cc->tcg_ops.adjust_watchpoint_address) {
|
||||||
|
/* this is currently used only by ARM BE32 */
|
||||||
|
addr = cc->tcg_ops.adjust_watchpoint_address(cpu, addr, len);
|
||||||
|
}
|
||||||
QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) {
|
QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) {
|
||||||
if (watchpoint_address_matches(wp, addr, len)
|
if (watchpoint_address_matches(wp, addr, len)
|
||||||
&& (wp->flags & flags)) {
|
&& (wp->flags & flags)) {
|
||||||
|
|
|
@ -2284,7 +2284,7 @@ static void arm_cpu_class_init(ObjectClass *oc, void *data)
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
cc->tcg_ops.do_transaction_failed = arm_cpu_do_transaction_failed;
|
cc->tcg_ops.do_transaction_failed = arm_cpu_do_transaction_failed;
|
||||||
cc->tcg_ops.do_unaligned_access = arm_cpu_do_unaligned_access;
|
cc->tcg_ops.do_unaligned_access = arm_cpu_do_unaligned_access;
|
||||||
cc->adjust_watchpoint_address = arm_adjust_watchpoint_address;
|
cc->tcg_ops.adjust_watchpoint_address = arm_adjust_watchpoint_address;
|
||||||
cc->tcg_ops.do_interrupt = arm_cpu_do_interrupt;
|
cc->tcg_ops.do_interrupt = arm_cpu_do_interrupt;
|
||||||
#endif /* CONFIG_TCG && !CONFIG_USER_ONLY */
|
#endif /* CONFIG_TCG && !CONFIG_USER_ONLY */
|
||||||
#endif /* CONFIG_TCG */
|
#endif /* CONFIG_TCG */
|
||||||
|
|
Loading…
Reference in New Issue