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 <dingel@linux.vnet.ibm.com> Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
This commit is contained in:
parent
934bc131ef
commit
693ffc0802
5 changed files with 33 additions and 1 deletions
|
@ -89,6 +89,9 @@ struct kvm_s390_sie_block {
|
||||||
__u16 lctl; /* 0x0044 */
|
__u16 lctl; /* 0x0044 */
|
||||||
__s16 icpua; /* 0x0046 */
|
__s16 icpua; /* 0x0046 */
|
||||||
#define ICTL_LPSW 0x00400000
|
#define ICTL_LPSW 0x00400000
|
||||||
|
#define ICTL_ISKE 0x00004000
|
||||||
|
#define ICTL_SSKE 0x00002000
|
||||||
|
#define ICTL_RRBE 0x00001000
|
||||||
__u32 ictl; /* 0x0048 */
|
__u32 ictl; /* 0x0048 */
|
||||||
__u32 eca; /* 0x004c */
|
__u32 eca; /* 0x004c */
|
||||||
__u8 icptcode; /* 0x0050 */
|
__u8 icptcode; /* 0x0050 */
|
||||||
|
|
|
@ -23,7 +23,7 @@ static inline int init_new_context(struct task_struct *tsk,
|
||||||
mm->context.asce_bits |= _ASCE_TYPE_REGION3;
|
mm->context.asce_bits |= _ASCE_TYPE_REGION3;
|
||||||
#endif
|
#endif
|
||||||
mm->context.has_pgste = 0;
|
mm->context.has_pgste = 0;
|
||||||
mm->context.use_skey = 1;
|
mm->context.use_skey = 0;
|
||||||
mm->context.asce_limit = STACK_TOP_MAX;
|
mm->context.asce_limit = STACK_TOP_MAX;
|
||||||
crst_table_init((unsigned long *) mm->pgd, pgd_entry_type(mm));
|
crst_table_init((unsigned long *) mm->pgd, pgd_entry_type(mm));
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -465,6 +465,7 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
|
||||||
vcpu->arch.sie_block->ecb2 = 8;
|
vcpu->arch.sie_block->ecb2 = 8;
|
||||||
vcpu->arch.sie_block->eca = 0xC1002001U;
|
vcpu->arch.sie_block->eca = 0xC1002001U;
|
||||||
vcpu->arch.sie_block->fac = (int) (long) vfacilities;
|
vcpu->arch.sie_block->fac = (int) (long) vfacilities;
|
||||||
|
vcpu->arch.sie_block->ictl |= ICTL_ISKE | ICTL_SSKE | ICTL_RRBE;
|
||||||
if (kvm_enabled_cmma()) {
|
if (kvm_enabled_cmma()) {
|
||||||
cbrl = alloc_page(GFP_KERNEL | __GFP_ZERO);
|
cbrl = alloc_page(GFP_KERNEL | __GFP_ZERO);
|
||||||
if (cbrl) {
|
if (cbrl) {
|
||||||
|
|
|
@ -147,8 +147,21 @@ static int handle_store_cpu_address(struct kvm_vcpu *vcpu)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __skey_check_enable(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
if (!(vcpu->arch.sie_block->ictl & (ICTL_ISKE | ICTL_SSKE | ICTL_RRBE)))
|
||||||
|
return;
|
||||||
|
|
||||||
|
s390_enable_skey();
|
||||||
|
trace_kvm_s390_skey_related_inst(vcpu);
|
||||||
|
vcpu->arch.sie_block->ictl &= ~(ICTL_ISKE | ICTL_SSKE | ICTL_RRBE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int handle_skey(struct kvm_vcpu *vcpu)
|
static int handle_skey(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
|
__skey_check_enable(vcpu);
|
||||||
|
|
||||||
vcpu->stat.instruction_storage_key++;
|
vcpu->stat.instruction_storage_key++;
|
||||||
|
|
||||||
if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
|
if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
|
||||||
|
@ -618,6 +631,7 @@ static int handle_pfmf(struct kvm_vcpu *vcpu)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vcpu->run->s.regs.gprs[reg1] & PFMF_SK) {
|
if (vcpu->run->s.regs.gprs[reg1] & PFMF_SK) {
|
||||||
|
__skey_check_enable(vcpu);
|
||||||
if (set_guest_storage_key(current->mm, useraddr,
|
if (set_guest_storage_key(current->mm, useraddr,
|
||||||
vcpu->run->s.regs.gprs[reg1] & PFMF_KEY,
|
vcpu->run->s.regs.gprs[reg1] & PFMF_KEY,
|
||||||
vcpu->run->s.regs.gprs[reg1] & PFMF_NQ))
|
vcpu->run->s.regs.gprs[reg1] & PFMF_NQ))
|
||||||
|
|
|
@ -30,6 +30,20 @@
|
||||||
TP_printk("%02d[%016lx-%016lx]: " p_str, __entry->id, \
|
TP_printk("%02d[%016lx-%016lx]: " p_str, __entry->id, \
|
||||||
__entry->pswmask, __entry->pswaddr, p_args)
|
__entry->pswmask, __entry->pswaddr, p_args)
|
||||||
|
|
||||||
|
TRACE_EVENT(kvm_s390_skey_related_inst,
|
||||||
|
TP_PROTO(VCPU_PROTO_COMMON),
|
||||||
|
TP_ARGS(VCPU_ARGS_COMMON),
|
||||||
|
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
VCPU_FIELD_COMMON
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_fast_assign(
|
||||||
|
VCPU_ASSIGN_COMMON
|
||||||
|
),
|
||||||
|
VCPU_TP_PRINTK("%s", "first instruction related to skeys on vcpu")
|
||||||
|
);
|
||||||
|
|
||||||
TRACE_EVENT(kvm_s390_major_guest_pfault,
|
TRACE_EVENT(kvm_s390_major_guest_pfault,
|
||||||
TP_PROTO(VCPU_PROTO_COMMON),
|
TP_PROTO(VCPU_PROTO_COMMON),
|
||||||
TP_ARGS(VCPU_ARGS_COMMON),
|
TP_ARGS(VCPU_ARGS_COMMON),
|
||||||
|
|
Loading…
Reference in a new issue