Skip to content

Commit 693ffc0

Browse files
Dominik Dingelborntraeger
authored andcommitted
KVM: s390: Don't enable skeys by default
The first invocation of storage key operations on a given cpu will be intercepted. On these intercepts we will enable storage keys for the guest and remove the previously added intercepts. Signed-off-by: Dominik Dingel <[email protected]> Acked-by: Martin Schwidefsky <[email protected]> Signed-off-by: Christian Borntraeger <[email protected]>
1 parent 934bc13 commit 693ffc0

File tree

5 files changed

+33
-1
lines changed

5 files changed

+33
-1
lines changed

arch/s390/include/asm/kvm_host.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ struct kvm_s390_sie_block {
8989
__u16 lctl; /* 0x0044 */
9090
__s16 icpua; /* 0x0046 */
9191
#define ICTL_LPSW 0x00400000
92+
#define ICTL_ISKE 0x00004000
93+
#define ICTL_SSKE 0x00002000
94+
#define ICTL_RRBE 0x00001000
9295
__u32 ictl; /* 0x0048 */
9396
__u32 eca; /* 0x004c */
9497
__u8 icptcode; /* 0x0050 */

arch/s390/include/asm/mmu_context.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ static inline int init_new_context(struct task_struct *tsk,
2323
mm->context.asce_bits |= _ASCE_TYPE_REGION3;
2424
#endif
2525
mm->context.has_pgste = 0;
26-
mm->context.use_skey = 1;
26+
mm->context.use_skey = 0;
2727
mm->context.asce_limit = STACK_TOP_MAX;
2828
crst_table_init((unsigned long *) mm->pgd, pgd_entry_type(mm));
2929
return 0;

arch/s390/kvm/kvm-s390.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,7 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
465465
vcpu->arch.sie_block->ecb2 = 8;
466466
vcpu->arch.sie_block->eca = 0xC1002001U;
467467
vcpu->arch.sie_block->fac = (int) (long) vfacilities;
468+
vcpu->arch.sie_block->ictl |= ICTL_ISKE | ICTL_SSKE | ICTL_RRBE;
468469
if (kvm_enabled_cmma()) {
469470
cbrl = alloc_page(GFP_KERNEL | __GFP_ZERO);
470471
if (cbrl) {

arch/s390/kvm/priv.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,21 @@ static int handle_store_cpu_address(struct kvm_vcpu *vcpu)
147147
return 0;
148148
}
149149

150+
static void __skey_check_enable(struct kvm_vcpu *vcpu)
151+
{
152+
if (!(vcpu->arch.sie_block->ictl & (ICTL_ISKE | ICTL_SSKE | ICTL_RRBE)))
153+
return;
154+
155+
s390_enable_skey();
156+
trace_kvm_s390_skey_related_inst(vcpu);
157+
vcpu->arch.sie_block->ictl &= ~(ICTL_ISKE | ICTL_SSKE | ICTL_RRBE);
158+
}
159+
160+
150161
static int handle_skey(struct kvm_vcpu *vcpu)
151162
{
163+
__skey_check_enable(vcpu);
164+
152165
vcpu->stat.instruction_storage_key++;
153166

154167
if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
@@ -618,6 +631,7 @@ static int handle_pfmf(struct kvm_vcpu *vcpu)
618631
}
619632

620633
if (vcpu->run->s.regs.gprs[reg1] & PFMF_SK) {
634+
__skey_check_enable(vcpu);
621635
if (set_guest_storage_key(current->mm, useraddr,
622636
vcpu->run->s.regs.gprs[reg1] & PFMF_KEY,
623637
vcpu->run->s.regs.gprs[reg1] & PFMF_NQ))

arch/s390/kvm/trace.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,20 @@
3030
TP_printk("%02d[%016lx-%016lx]: " p_str, __entry->id, \
3131
__entry->pswmask, __entry->pswaddr, p_args)
3232

33+
TRACE_EVENT(kvm_s390_skey_related_inst,
34+
TP_PROTO(VCPU_PROTO_COMMON),
35+
TP_ARGS(VCPU_ARGS_COMMON),
36+
37+
TP_STRUCT__entry(
38+
VCPU_FIELD_COMMON
39+
),
40+
41+
TP_fast_assign(
42+
VCPU_ASSIGN_COMMON
43+
),
44+
VCPU_TP_PRINTK("%s", "first instruction related to skeys on vcpu")
45+
);
46+
3347
TRACE_EVENT(kvm_s390_major_guest_pfault,
3448
TP_PROTO(VCPU_PROTO_COMMON),
3549
TP_ARGS(VCPU_ARGS_COMMON),

0 commit comments

Comments
 (0)