21
21
#include "x86.h"
22
22
#include "lapic.h"
23
23
#include "ioapic.h"
24
+ #include "cpuid.h"
24
25
#include "hyperv.h"
25
26
26
27
#include <linux/cpu.h>
@@ -266,6 +267,123 @@ static int synic_set_msr(struct kvm_vcpu_hv_synic *synic,
266
267
return ret ;
267
268
}
268
269
270
+ static bool kvm_hv_is_syndbg_enabled (struct kvm_vcpu * vcpu )
271
+ {
272
+ struct kvm_cpuid_entry2 * entry ;
273
+
274
+ entry = kvm_find_cpuid_entry (vcpu ,
275
+ HYPERV_CPUID_SYNDBG_PLATFORM_CAPABILITIES ,
276
+ 0 );
277
+ if (!entry )
278
+ return false;
279
+
280
+ return entry -> eax & HV_X64_SYNDBG_CAP_ALLOW_KERNEL_DEBUGGING ;
281
+ }
282
+
283
+ static int kvm_hv_syndbg_complete_userspace (struct kvm_vcpu * vcpu )
284
+ {
285
+ struct kvm * kvm = vcpu -> kvm ;
286
+ struct kvm_hv * hv = & kvm -> arch .hyperv ;
287
+
288
+ if (vcpu -> run -> hyperv .u .syndbg .msr == HV_X64_MSR_SYNDBG_CONTROL )
289
+ hv -> hv_syndbg .control .status =
290
+ vcpu -> run -> hyperv .u .syndbg .status ;
291
+ return 1 ;
292
+ }
293
+
294
+ static void syndbg_exit (struct kvm_vcpu * vcpu , u32 msr )
295
+ {
296
+ struct kvm_hv_syndbg * syndbg = vcpu_to_hv_syndbg (vcpu );
297
+ struct kvm_vcpu_hv * hv_vcpu = & vcpu -> arch .hyperv ;
298
+
299
+ hv_vcpu -> exit .type = KVM_EXIT_HYPERV_SYNDBG ;
300
+ hv_vcpu -> exit .u .syndbg .msr = msr ;
301
+ hv_vcpu -> exit .u .syndbg .control = syndbg -> control .control ;
302
+ hv_vcpu -> exit .u .syndbg .send_page = syndbg -> control .send_page ;
303
+ hv_vcpu -> exit .u .syndbg .recv_page = syndbg -> control .recv_page ;
304
+ hv_vcpu -> exit .u .syndbg .pending_page = syndbg -> control .pending_page ;
305
+ vcpu -> arch .complete_userspace_io =
306
+ kvm_hv_syndbg_complete_userspace ;
307
+
308
+ kvm_make_request (KVM_REQ_HV_EXIT , vcpu );
309
+ }
310
+
311
+ static int syndbg_set_msr (struct kvm_vcpu * vcpu , u32 msr , u64 data , bool host )
312
+ {
313
+ struct kvm_hv_syndbg * syndbg = vcpu_to_hv_syndbg (vcpu );
314
+
315
+ if (!kvm_hv_is_syndbg_enabled (vcpu ) && !host )
316
+ return 1 ;
317
+
318
+ trace_kvm_hv_syndbg_set_msr (vcpu -> vcpu_id ,
319
+ vcpu_to_hv_vcpu (vcpu )-> vp_index , msr , data );
320
+ switch (msr ) {
321
+ case HV_X64_MSR_SYNDBG_CONTROL :
322
+ syndbg -> control .control = data ;
323
+ if (!host )
324
+ syndbg_exit (vcpu , msr );
325
+ break ;
326
+ case HV_X64_MSR_SYNDBG_STATUS :
327
+ syndbg -> control .status = data ;
328
+ break ;
329
+ case HV_X64_MSR_SYNDBG_SEND_BUFFER :
330
+ syndbg -> control .send_page = data ;
331
+ break ;
332
+ case HV_X64_MSR_SYNDBG_RECV_BUFFER :
333
+ syndbg -> control .recv_page = data ;
334
+ break ;
335
+ case HV_X64_MSR_SYNDBG_PENDING_BUFFER :
336
+ syndbg -> control .pending_page = data ;
337
+ if (!host )
338
+ syndbg_exit (vcpu , msr );
339
+ break ;
340
+ case HV_X64_MSR_SYNDBG_OPTIONS :
341
+ syndbg -> options = data ;
342
+ break ;
343
+ default :
344
+ break ;
345
+ }
346
+
347
+ return 0 ;
348
+ }
349
+
350
+ static int syndbg_get_msr (struct kvm_vcpu * vcpu , u32 msr , u64 * pdata , bool host )
351
+ {
352
+ struct kvm_hv_syndbg * syndbg = vcpu_to_hv_syndbg (vcpu );
353
+
354
+ if (!kvm_hv_is_syndbg_enabled (vcpu ) && !host )
355
+ return 1 ;
356
+
357
+ switch (msr ) {
358
+ case HV_X64_MSR_SYNDBG_CONTROL :
359
+ * pdata = syndbg -> control .control ;
360
+ break ;
361
+ case HV_X64_MSR_SYNDBG_STATUS :
362
+ * pdata = syndbg -> control .status ;
363
+ break ;
364
+ case HV_X64_MSR_SYNDBG_SEND_BUFFER :
365
+ * pdata = syndbg -> control .send_page ;
366
+ break ;
367
+ case HV_X64_MSR_SYNDBG_RECV_BUFFER :
368
+ * pdata = syndbg -> control .recv_page ;
369
+ break ;
370
+ case HV_X64_MSR_SYNDBG_PENDING_BUFFER :
371
+ * pdata = syndbg -> control .pending_page ;
372
+ break ;
373
+ case HV_X64_MSR_SYNDBG_OPTIONS :
374
+ * pdata = syndbg -> options ;
375
+ break ;
376
+ default :
377
+ break ;
378
+ }
379
+
380
+ trace_kvm_hv_syndbg_get_msr (vcpu -> vcpu_id ,
381
+ vcpu_to_hv_vcpu (vcpu )-> vp_index , msr ,
382
+ * pdata );
383
+
384
+ return 0 ;
385
+ }
386
+
269
387
static int synic_get_msr (struct kvm_vcpu_hv_synic * synic , u32 msr , u64 * pdata ,
270
388
bool host )
271
389
{
@@ -800,6 +918,8 @@ static bool kvm_hv_msr_partition_wide(u32 msr)
800
918
case HV_X64_MSR_REENLIGHTENMENT_CONTROL :
801
919
case HV_X64_MSR_TSC_EMULATION_CONTROL :
802
920
case HV_X64_MSR_TSC_EMULATION_STATUS :
921
+ case HV_X64_MSR_SYNDBG_OPTIONS :
922
+ case HV_X64_MSR_SYNDBG_CONTROL ... HV_X64_MSR_SYNDBG_PENDING_BUFFER :
803
923
r = true;
804
924
break ;
805
925
}
@@ -1061,6 +1181,9 @@ static int kvm_hv_set_msr_pw(struct kvm_vcpu *vcpu, u32 msr, u64 data,
1061
1181
if (!host )
1062
1182
return 1 ;
1063
1183
break ;
1184
+ case HV_X64_MSR_SYNDBG_OPTIONS :
1185
+ case HV_X64_MSR_SYNDBG_CONTROL ... HV_X64_MSR_SYNDBG_PENDING_BUFFER :
1186
+ return syndbg_set_msr (vcpu , msr , data , host );
1064
1187
default :
1065
1188
vcpu_unimpl (vcpu , "Hyper-V unhandled wrmsr: 0x%x data 0x%llx\n" ,
1066
1189
msr , data );
@@ -1190,7 +1313,8 @@ static int kvm_hv_set_msr(struct kvm_vcpu *vcpu, u32 msr, u64 data, bool host)
1190
1313
return 0 ;
1191
1314
}
1192
1315
1193
- static int kvm_hv_get_msr_pw (struct kvm_vcpu * vcpu , u32 msr , u64 * pdata )
1316
+ static int kvm_hv_get_msr_pw (struct kvm_vcpu * vcpu , u32 msr , u64 * pdata ,
1317
+ bool host )
1194
1318
{
1195
1319
u64 data = 0 ;
1196
1320
struct kvm * kvm = vcpu -> kvm ;
@@ -1227,6 +1351,9 @@ static int kvm_hv_get_msr_pw(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata)
1227
1351
case HV_X64_MSR_TSC_EMULATION_STATUS :
1228
1352
data = hv -> hv_tsc_emulation_status ;
1229
1353
break ;
1354
+ case HV_X64_MSR_SYNDBG_OPTIONS :
1355
+ case HV_X64_MSR_SYNDBG_CONTROL ... HV_X64_MSR_SYNDBG_PENDING_BUFFER :
1356
+ return syndbg_get_msr (vcpu , msr , pdata , host );
1230
1357
default :
1231
1358
vcpu_unimpl (vcpu , "Hyper-V unhandled rdmsr: 0x%x\n" , msr );
1232
1359
return 1 ;
@@ -1316,7 +1443,7 @@ int kvm_hv_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata, bool host)
1316
1443
int r ;
1317
1444
1318
1445
mutex_lock (& vcpu -> kvm -> arch .hyperv .hv_lock );
1319
- r = kvm_hv_get_msr_pw (vcpu , msr , pdata );
1446
+ r = kvm_hv_get_msr_pw (vcpu , msr , pdata , host );
1320
1447
mutex_unlock (& vcpu -> kvm -> arch .hyperv .hv_lock );
1321
1448
return r ;
1322
1449
} else
@@ -1795,6 +1922,9 @@ int kvm_vcpu_ioctl_get_hv_cpuid(struct kvm_vcpu *vcpu, struct kvm_cpuid2 *cpuid,
1795
1922
{ .function = HYPERV_CPUID_FEATURES },
1796
1923
{ .function = HYPERV_CPUID_ENLIGHTMENT_INFO },
1797
1924
{ .function = HYPERV_CPUID_IMPLEMENT_LIMITS },
1925
+ { .function = HYPERV_CPUID_SYNDBG_VENDOR_AND_MAX_FUNCTIONS },
1926
+ { .function = HYPERV_CPUID_SYNDBG_INTERFACE },
1927
+ { .function = HYPERV_CPUID_SYNDBG_PLATFORM_CAPABILITIES },
1798
1928
{ .function = HYPERV_CPUID_NESTED_FEATURES },
1799
1929
};
1800
1930
int i , nent = ARRAY_SIZE (cpuid_entries );
@@ -1820,7 +1950,7 @@ int kvm_vcpu_ioctl_get_hv_cpuid(struct kvm_vcpu *vcpu, struct kvm_cpuid2 *cpuid,
1820
1950
case HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS :
1821
1951
memcpy (signature , "Linux KVM Hv" , 12 );
1822
1952
1823
- ent -> eax = HYPERV_CPUID_NESTED_FEATURES ;
1953
+ ent -> eax = HYPERV_CPUID_SYNDBG_PLATFORM_CAPABILITIES ;
1824
1954
ent -> ebx = signature [0 ];
1825
1955
ent -> ecx = signature [1 ];
1826
1956
ent -> edx = signature [2 ];
@@ -1859,6 +1989,10 @@ int kvm_vcpu_ioctl_get_hv_cpuid(struct kvm_vcpu *vcpu, struct kvm_cpuid2 *cpuid,
1859
1989
ent -> edx |= HV_FEATURE_FREQUENCY_MSRS_AVAILABLE ;
1860
1990
ent -> edx |= HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE ;
1861
1991
1992
+ ent -> ebx |= HV_X64_DEBUGGING ;
1993
+ ent -> edx |= HV_X64_GUEST_DEBUGGING_AVAILABLE ;
1994
+ ent -> edx |= HV_FEATURE_DEBUG_MSRS_AVAILABLE ;
1995
+
1862
1996
/*
1863
1997
* Direct Synthetic timers only make sense with in-kernel
1864
1998
* LAPIC
@@ -1902,6 +2036,24 @@ int kvm_vcpu_ioctl_get_hv_cpuid(struct kvm_vcpu *vcpu, struct kvm_cpuid2 *cpuid,
1902
2036
1903
2037
break ;
1904
2038
2039
+ case HYPERV_CPUID_SYNDBG_VENDOR_AND_MAX_FUNCTIONS :
2040
+ memcpy (signature , "Linux KVM Hv" , 12 );
2041
+
2042
+ ent -> eax = 0 ;
2043
+ ent -> ebx = signature [0 ];
2044
+ ent -> ecx = signature [1 ];
2045
+ ent -> edx = signature [2 ];
2046
+ break ;
2047
+
2048
+ case HYPERV_CPUID_SYNDBG_INTERFACE :
2049
+ memcpy (signature , "VS#1\0\0\0\0\0\0\0\0" , 12 );
2050
+ ent -> eax = signature [0 ];
2051
+ break ;
2052
+
2053
+ case HYPERV_CPUID_SYNDBG_PLATFORM_CAPABILITIES :
2054
+ ent -> eax |= HV_X64_SYNDBG_CAP_ALLOW_KERNEL_DEBUGGING ;
2055
+ break ;
2056
+
1905
2057
default :
1906
2058
break ;
1907
2059
}
0 commit comments