Skip to content

Commit 12bc5b4

Browse files
Maxim Levitskybonzini
Maxim Levitsky
authored andcommitted
gdbstub, kvm: let KVM report supported singlestep flags
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> [Extracted from Maxim's patch into a separate commit. - Paolo] Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20211111110604.207376-5-pbonzini@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
1 parent ecd39d6 commit 12bc5b4

File tree

3 files changed

+36
-1
lines changed

3 files changed

+36
-1
lines changed

accel/kvm/kvm-all.c

+12
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ bool kvm_vm_attributes_allowed;
168168
bool kvm_direct_msi_allowed;
169169
bool kvm_ioeventfd_any_length_allowed;
170170
bool kvm_msi_use_devid;
171+
bool kvm_has_guest_debug;
172+
int kvm_sstep_flags;
171173
static bool kvm_immediate_exit;
172174
static hwaddr kvm_max_slot_size = ~0;
173175

@@ -2564,6 +2566,16 @@ static int kvm_init(MachineState *ms)
25642566
kvm_ioeventfd_any_length_allowed =
25652567
(kvm_check_extension(s, KVM_CAP_IOEVENTFD_ANY_LENGTH) > 0);
25662568

2569+
#ifdef KVM_CAP_SET_GUEST_DEBUG
2570+
kvm_has_guest_debug =
2571+
(kvm_check_extension(s, KVM_CAP_SET_GUEST_DEBUG) > 0);
2572+
#endif
2573+
2574+
kvm_sstep_flags = 0;
2575+
if (kvm_has_guest_debug) {
2576+
kvm_sstep_flags = SSTEP_ENABLE;
2577+
}
2578+
25672579
kvm_state = s;
25682580

25692581
ret = kvm_arch_init(ms, s);

gdbstub.c

+9-1
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,8 @@ static void init_gdbserver_state(void)
391391
*/
392392
if (replay_mode != REPLAY_MODE_NONE) {
393393
gdbserver_state.supported_sstep_flags = SSTEP_ENABLE;
394+
} else if (kvm_enabled()) {
395+
gdbserver_state.supported_sstep_flags = kvm_get_supported_sstep_flags();
394396
} else {
395397
gdbserver_state.supported_sstep_flags =
396398
SSTEP_ENABLE | SSTEP_NOIRQ | SSTEP_NOTIMER;
@@ -400,7 +402,8 @@ static void init_gdbserver_state(void)
400402
* By default use no IRQs and no timers while single stepping so as to
401403
* make single stepping like an ICE HW step.
402404
*/
403-
gdbserver_state.sstep_flags = gdbserver_state.supported_sstep_flags;
405+
gdbserver_state.sstep_flags = SSTEP_ENABLE | SSTEP_NOIRQ | SSTEP_NOTIMER;
406+
gdbserver_state.sstep_flags &= gdbserver_state.supported_sstep_flags;
404407

405408
}
406409

@@ -3520,6 +3523,11 @@ int gdbserver_start(const char *device)
35203523
return -1;
35213524
}
35223525

3526+
if (kvm_enabled() && !kvm_supports_guest_debug()) {
3527+
error_report("gdbstub: KVM doesn't support guest debugging");
3528+
return -1;
3529+
}
3530+
35233531
if (!device)
35243532
return -1;
35253533
if (strcmp(device, "none") != 0) {

include/sysemu/kvm.h

+15
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ extern bool kvm_readonly_mem_allowed;
4646
extern bool kvm_direct_msi_allowed;
4747
extern bool kvm_ioeventfd_any_length_allowed;
4848
extern bool kvm_msi_use_devid;
49+
extern bool kvm_has_guest_debug;
50+
extern int kvm_sstep_flags;
4951

5052
#define kvm_enabled() (kvm_allowed)
5153
/**
@@ -167,6 +169,17 @@ extern bool kvm_msi_use_devid;
167169
*/
168170
#define kvm_msi_devid_required() (kvm_msi_use_devid)
169171

172+
/*
173+
* Does KVM support guest debugging
174+
*/
175+
#define kvm_supports_guest_debug() (kvm_has_guest_debug)
176+
177+
/*
178+
* kvm_supported_sstep_flags
179+
* Returns: SSTEP_* flags that KVM supports for guest debug
180+
*/
181+
#define kvm_get_supported_sstep_flags() (kvm_sstep_flags)
182+
170183
#else
171184

172185
#define kvm_enabled() (0)
@@ -184,6 +197,8 @@ extern bool kvm_msi_use_devid;
184197
#define kvm_direct_msi_enabled() (false)
185198
#define kvm_ioeventfd_any_length_enabled() (false)
186199
#define kvm_msi_devid_required() (false)
200+
#define kvm_supports_guest_debug() (false)
201+
#define kvm_get_supported_sstep_flags() (0)
187202

188203
#endif /* CONFIG_KVM_IS_POSSIBLE */
189204

0 commit comments

Comments
 (0)