@@ -348,6 +348,16 @@ static inline int plo_test_bit(unsigned char nr)
348
348
return cc == 0 ;
349
349
}
350
350
351
+ static __always_inline void pfcr_query (u8 (* query )[16 ])
352
+ {
353
+ asm volatile (
354
+ " lghi 0,0\n"
355
+ " .insn rsy,0xeb0000000016,0,0,%[query]\n"
356
+ : [query ] "=QS" (* query )
357
+ :
358
+ : "cc" , "0" );
359
+ }
360
+
351
361
static __always_inline void __sortl_query (u8 (* query )[32 ])
352
362
{
353
363
asm volatile (
@@ -429,6 +439,9 @@ static void __init kvm_s390_cpu_feat_init(void)
429
439
if (test_facility (151 )) /* DFLTCC */
430
440
__dfltcc_query (& kvm_s390_available_subfunc .dfltcc );
431
441
442
+ if (test_facility (201 )) /* PFCR */
443
+ pfcr_query (& kvm_s390_available_subfunc .pfcr );
444
+
432
445
if (MACHINE_HAS_ESOP )
433
446
allow_cpu_feat (KVM_S390_VM_CPU_FEAT_ESOP );
434
447
/*
@@ -1543,6 +1556,9 @@ static int kvm_s390_set_processor_subfunc(struct kvm *kvm,
1543
1556
((unsigned long * ) & kvm -> arch .model .subfuncs .dfltcc )[1 ],
1544
1557
((unsigned long * ) & kvm -> arch .model .subfuncs .dfltcc )[2 ],
1545
1558
((unsigned long * ) & kvm -> arch .model .subfuncs .dfltcc )[3 ]);
1559
+ VM_EVENT (kvm , 3 , "GET: guest PFCR subfunc 0x%16.16lx.%16.16lx" ,
1560
+ ((unsigned long * ) & kvm_s390_available_subfunc .pfcr )[0 ],
1561
+ ((unsigned long * ) & kvm_s390_available_subfunc .pfcr )[1 ]);
1546
1562
1547
1563
return 0 ;
1548
1564
}
@@ -1757,6 +1773,9 @@ static int kvm_s390_get_processor_subfunc(struct kvm *kvm,
1757
1773
((unsigned long * ) & kvm -> arch .model .subfuncs .dfltcc )[1 ],
1758
1774
((unsigned long * ) & kvm -> arch .model .subfuncs .dfltcc )[2 ],
1759
1775
((unsigned long * ) & kvm -> arch .model .subfuncs .dfltcc )[3 ]);
1776
+ VM_EVENT (kvm , 3 , "GET: guest PFCR subfunc 0x%16.16lx.%16.16lx" ,
1777
+ ((unsigned long * ) & kvm_s390_available_subfunc .pfcr )[0 ],
1778
+ ((unsigned long * ) & kvm_s390_available_subfunc .pfcr )[1 ]);
1760
1779
1761
1780
return 0 ;
1762
1781
}
@@ -1825,6 +1844,9 @@ static int kvm_s390_get_machine_subfunc(struct kvm *kvm,
1825
1844
((unsigned long * ) & kvm_s390_available_subfunc .dfltcc )[1 ],
1826
1845
((unsigned long * ) & kvm_s390_available_subfunc .dfltcc )[2 ],
1827
1846
((unsigned long * ) & kvm_s390_available_subfunc .dfltcc )[3 ]);
1847
+ VM_EVENT (kvm , 3 , "GET: host PFCR subfunc 0x%16.16lx.%16.16lx" ,
1848
+ ((unsigned long * ) & kvm_s390_available_subfunc .pfcr )[0 ],
1849
+ ((unsigned long * ) & kvm_s390_available_subfunc .pfcr )[1 ]);
1828
1850
1829
1851
return 0 ;
1830
1852
}
0 commit comments