@@ -382,14 +382,20 @@ void kvm_s390_prepare_debug_exit(struct kvm_vcpu *vcpu)
382
382
vcpu -> guest_debug &= ~KVM_GUESTDBG_EXIT_PENDING ;
383
383
}
384
384
385
+ #define PER_CODE_MASK (PER_EVENT_MASK >> 24)
386
+ #define PER_CODE_BRANCH (PER_EVENT_BRANCH >> 24)
387
+ #define PER_CODE_IFETCH (PER_EVENT_IFETCH >> 24)
388
+ #define PER_CODE_STORE (PER_EVENT_STORE >> 24)
389
+ #define PER_CODE_STORE_REAL (PER_EVENT_STORE_REAL >> 24)
390
+
385
391
#define per_bp_event (code ) \
386
- (code & (PER_EVENT_IFETCH | PER_EVENT_BRANCH ))
392
+ (code & (PER_CODE_IFETCH | PER_CODE_BRANCH ))
387
393
#define per_write_wp_event (code ) \
388
- (code & (PER_EVENT_STORE | PER_EVENT_STORE_REAL ))
394
+ (code & (PER_CODE_STORE | PER_CODE_STORE_REAL ))
389
395
390
396
static int debug_exit_required (struct kvm_vcpu * vcpu )
391
397
{
392
- u32 perc = ( vcpu -> arch .sie_block -> perc << 24 ) ;
398
+ u8 perc = vcpu -> arch .sie_block -> perc ;
393
399
struct kvm_debug_exit_arch * debug_exit = & vcpu -> run -> debug .arch ;
394
400
struct kvm_hw_wp_info_arch * wp_info = NULL ;
395
401
struct kvm_hw_bp_info_arch * bp_info = NULL ;
@@ -444,7 +450,7 @@ int kvm_s390_handle_per_ifetch_icpt(struct kvm_vcpu *vcpu)
444
450
const u8 ilen = kvm_s390_get_ilen (vcpu );
445
451
struct kvm_s390_pgm_info pgm_info = {
446
452
.code = PGM_PER ,
447
- .per_code = PER_EVENT_IFETCH >> 24 ,
453
+ .per_code = PER_CODE_IFETCH ,
448
454
.per_address = __rewind_psw (vcpu -> arch .sie_block -> gpsw , ilen ),
449
455
};
450
456
@@ -458,33 +464,33 @@ int kvm_s390_handle_per_ifetch_icpt(struct kvm_vcpu *vcpu)
458
464
459
465
static void filter_guest_per_event (struct kvm_vcpu * vcpu )
460
466
{
461
- u32 perc = vcpu -> arch .sie_block -> perc << 24 ;
467
+ const u8 perc = vcpu -> arch .sie_block -> perc ;
462
468
u64 peraddr = vcpu -> arch .sie_block -> peraddr ;
463
469
u64 addr = vcpu -> arch .sie_block -> gpsw .addr ;
464
470
u64 cr9 = vcpu -> arch .sie_block -> gcr [9 ];
465
471
u64 cr10 = vcpu -> arch .sie_block -> gcr [10 ];
466
472
u64 cr11 = vcpu -> arch .sie_block -> gcr [11 ];
467
473
/* filter all events, demanded by the guest */
468
- u32 guest_perc = perc & cr9 & PER_EVENT_MASK ;
474
+ u8 guest_perc = perc & ( cr9 >> 24 ) & PER_CODE_MASK ;
469
475
470
476
if (!guest_per_enabled (vcpu ))
471
477
guest_perc = 0 ;
472
478
473
479
/* filter "successful-branching" events */
474
- if (guest_perc & PER_EVENT_BRANCH &&
480
+ if (guest_perc & PER_CODE_BRANCH &&
475
481
cr9 & PER_CONTROL_BRANCH_ADDRESS &&
476
482
!in_addr_range (addr , cr10 , cr11 ))
477
- guest_perc &= ~PER_EVENT_BRANCH ;
483
+ guest_perc &= ~PER_CODE_BRANCH ;
478
484
479
485
/* filter "instruction-fetching" events */
480
- if (guest_perc & PER_EVENT_IFETCH &&
486
+ if (guest_perc & PER_CODE_IFETCH &&
481
487
!in_addr_range (peraddr , cr10 , cr11 ))
482
- guest_perc &= ~PER_EVENT_IFETCH ;
488
+ guest_perc &= ~PER_CODE_IFETCH ;
483
489
484
490
/* All other PER events will be given to the guest */
485
491
/* TODO: Check altered address/address space */
486
492
487
- vcpu -> arch .sie_block -> perc = guest_perc >> 24 ;
493
+ vcpu -> arch .sie_block -> perc = guest_perc ;
488
494
489
495
if (!guest_perc )
490
496
vcpu -> arch .sie_block -> iprcc &= ~PGM_PER ;
0 commit comments