File tree 3 files changed +36
-1
lines changed
3 files changed +36
-1
lines changed Original file line number Diff line number Diff line change @@ -168,6 +168,8 @@ bool kvm_vm_attributes_allowed;
168
168
bool kvm_direct_msi_allowed ;
169
169
bool kvm_ioeventfd_any_length_allowed ;
170
170
bool kvm_msi_use_devid ;
171
+ bool kvm_has_guest_debug ;
172
+ int kvm_sstep_flags ;
171
173
static bool kvm_immediate_exit ;
172
174
static hwaddr kvm_max_slot_size = ~0 ;
173
175
@@ -2564,6 +2566,16 @@ static int kvm_init(MachineState *ms)
2564
2566
kvm_ioeventfd_any_length_allowed =
2565
2567
(kvm_check_extension (s , KVM_CAP_IOEVENTFD_ANY_LENGTH ) > 0 );
2566
2568
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
+
2567
2579
kvm_state = s ;
2568
2580
2569
2581
ret = kvm_arch_init (ms , s );
Original file line number Diff line number Diff line change @@ -391,6 +391,8 @@ static void init_gdbserver_state(void)
391
391
*/
392
392
if (replay_mode != REPLAY_MODE_NONE ) {
393
393
gdbserver_state .supported_sstep_flags = SSTEP_ENABLE ;
394
+ } else if (kvm_enabled ()) {
395
+ gdbserver_state .supported_sstep_flags = kvm_get_supported_sstep_flags ();
394
396
} else {
395
397
gdbserver_state .supported_sstep_flags =
396
398
SSTEP_ENABLE | SSTEP_NOIRQ | SSTEP_NOTIMER ;
@@ -400,7 +402,8 @@ static void init_gdbserver_state(void)
400
402
* By default use no IRQs and no timers while single stepping so as to
401
403
* make single stepping like an ICE HW step.
402
404
*/
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 ;
404
407
405
408
}
406
409
@@ -3520,6 +3523,11 @@ int gdbserver_start(const char *device)
3520
3523
return -1 ;
3521
3524
}
3522
3525
3526
+ if (kvm_enabled () && !kvm_supports_guest_debug ()) {
3527
+ error_report ("gdbstub: KVM doesn't support guest debugging" );
3528
+ return -1 ;
3529
+ }
3530
+
3523
3531
if (!device )
3524
3532
return -1 ;
3525
3533
if (strcmp (device , "none" ) != 0 ) {
Original file line number Diff line number Diff line change @@ -46,6 +46,8 @@ extern bool kvm_readonly_mem_allowed;
46
46
extern bool kvm_direct_msi_allowed ;
47
47
extern bool kvm_ioeventfd_any_length_allowed ;
48
48
extern bool kvm_msi_use_devid ;
49
+ extern bool kvm_has_guest_debug ;
50
+ extern int kvm_sstep_flags ;
49
51
50
52
#define kvm_enabled () (kvm_allowed)
51
53
/**
@@ -167,6 +169,17 @@ extern bool kvm_msi_use_devid;
167
169
*/
168
170
#define kvm_msi_devid_required () (kvm_msi_use_devid)
169
171
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
+
170
183
#else
171
184
172
185
#define kvm_enabled () (0)
@@ -184,6 +197,8 @@ extern bool kvm_msi_use_devid;
184
197
#define kvm_direct_msi_enabled () (false)
185
198
#define kvm_ioeventfd_any_length_enabled () (false)
186
199
#define kvm_msi_devid_required () (false)
200
+ #define kvm_supports_guest_debug () (false)
201
+ #define kvm_get_supported_sstep_flags () (0)
187
202
188
203
#endif /* CONFIG_KVM_IS_POSSIBLE */
189
204
You can’t perform that action at this time.
0 commit comments