target/arm: Initialize debug capabilities only once
kvm_arm_init_debug() used to be called several times on a SMP system as
kvm_arch_init_vcpu() calls it. Move the call to kvm_arch_init() to make
sure it will be called only once; otherwise it will overwrite pointers
to memory allocated with the previous call and leak it.
Fixes: e4482ab7e3
("target-arm: kvm - add support for HW assisted debug")
Suggested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Message-id: 20230405153644.25300-1-akihiko.odaki@daynix.com
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
7a98c8377b
commit
ad5c6ddea3
@ -280,6 +280,8 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
|
||||
}
|
||||
}
|
||||
|
||||
kvm_arm_init_debug(s);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -74,24 +74,16 @@ GArray *hw_breakpoints, *hw_watchpoints;
|
||||
#define get_hw_bp(i) (&g_array_index(hw_breakpoints, HWBreakpoint, i))
|
||||
#define get_hw_wp(i) (&g_array_index(hw_watchpoints, HWWatchpoint, i))
|
||||
|
||||
/**
|
||||
* kvm_arm_init_debug() - check for guest debug capabilities
|
||||
* @cs: CPUState
|
||||
*
|
||||
* kvm_check_extension returns the number of debug registers we have
|
||||
* or 0 if we have none.
|
||||
*
|
||||
*/
|
||||
static void kvm_arm_init_debug(CPUState *cs)
|
||||
void kvm_arm_init_debug(KVMState *s)
|
||||
{
|
||||
have_guest_debug = kvm_check_extension(cs->kvm_state,
|
||||
have_guest_debug = kvm_check_extension(s,
|
||||
KVM_CAP_SET_GUEST_DEBUG);
|
||||
|
||||
max_hw_wps = kvm_check_extension(cs->kvm_state, KVM_CAP_GUEST_DEBUG_HW_WPS);
|
||||
max_hw_wps = kvm_check_extension(s, KVM_CAP_GUEST_DEBUG_HW_WPS);
|
||||
hw_watchpoints = g_array_sized_new(true, true,
|
||||
sizeof(HWWatchpoint), max_hw_wps);
|
||||
|
||||
max_hw_bps = kvm_check_extension(cs->kvm_state, KVM_CAP_GUEST_DEBUG_HW_BPS);
|
||||
max_hw_bps = kvm_check_extension(s, KVM_CAP_GUEST_DEBUG_HW_BPS);
|
||||
hw_breakpoints = g_array_sized_new(true, true,
|
||||
sizeof(HWBreakpoint), max_hw_bps);
|
||||
return;
|
||||
@ -920,8 +912,6 @@ int kvm_arch_init_vcpu(CPUState *cs)
|
||||
}
|
||||
cpu->mp_affinity = mpidr & ARM64_AFFINITY_MASK;
|
||||
|
||||
kvm_arm_init_debug(cs);
|
||||
|
||||
/* Check whether user space can specify guest syndrome value */
|
||||
kvm_arm_init_serror_injection(cs);
|
||||
|
||||
|
@ -18,6 +18,14 @@
|
||||
#define KVM_ARM_VGIC_V2 (1 << 0)
|
||||
#define KVM_ARM_VGIC_V3 (1 << 1)
|
||||
|
||||
/**
|
||||
* kvm_arm_init_debug() - initialize guest debug capabilities
|
||||
* @s: KVMState
|
||||
*
|
||||
* Should be called only once before using guest debug capabilities.
|
||||
*/
|
||||
void kvm_arm_init_debug(KVMState *s);
|
||||
|
||||
/**
|
||||
* kvm_arm_vcpu_init:
|
||||
* @cs: CPUState
|
||||
|
Loading…
Reference in New Issue
Block a user