Skip to content

Commit fe0ef00

Browse files
Nico Boehrfrankjaa
Nico Boehr
authored andcommitted
KVM: s390: sort out physical vs virtual pointers usage
Fix virtual vs physical address confusion (which currently are the same). Signed-off-by: Nico Boehr <[email protected]> Reviewed-by: Claudio Imbrenda <[email protected]> Link: https://lore.kernel.org/r/[email protected] Message-Id: <[email protected]> Signed-off-by: Janosch Frank <[email protected]>
1 parent 6b33e68 commit fe0ef00

File tree

4 files changed

+30
-22
lines changed

4 files changed

+30
-22
lines changed

arch/s390/include/asm/kvm_host.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@ struct kvm_s390_sie_block {
276276
#define ECB3_AES 0x04
277277
#define ECB3_RI 0x01
278278
__u8 ecb3; /* 0x0063 */
279+
#define ESCA_SCAOL_MASK ~0x3fU
279280
__u32 scaol; /* 0x0064 */
280281
__u8 sdf; /* 0x0068 */
281282
__u8 epdx; /* 0x0069 */

arch/s390/kvm/intercept.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ static int handle_itdb(struct kvm_vcpu *vcpu)
217217
return 0;
218218
if (current->thread.per_flags & PER_FLAG_NO_TE)
219219
return 0;
220-
itdb = (struct kvm_s390_itdb *)vcpu->arch.sie_block->itdba;
220+
itdb = phys_to_virt(vcpu->arch.sie_block->itdba);
221221
rc = write_guest_lc(vcpu, __LC_PGM_TDB, itdb, sizeof(*itdb));
222222
if (rc)
223223
return rc;

arch/s390/kvm/kvm-s390.c

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3329,28 +3329,30 @@ static void sca_del_vcpu(struct kvm_vcpu *vcpu)
33293329
static void sca_add_vcpu(struct kvm_vcpu *vcpu)
33303330
{
33313331
if (!kvm_s390_use_sca_entries()) {
3332-
struct bsca_block *sca = vcpu->kvm->arch.sca;
3332+
phys_addr_t sca_phys = virt_to_phys(vcpu->kvm->arch.sca);
33333333

33343334
/* we still need the basic sca for the ipte control */
3335-
vcpu->arch.sie_block->scaoh = (__u32)(((__u64)sca) >> 32);
3336-
vcpu->arch.sie_block->scaol = (__u32)(__u64)sca;
3335+
vcpu->arch.sie_block->scaoh = sca_phys >> 32;
3336+
vcpu->arch.sie_block->scaol = sca_phys;
33373337
return;
33383338
}
33393339
read_lock(&vcpu->kvm->arch.sca_lock);
33403340
if (vcpu->kvm->arch.use_esca) {
33413341
struct esca_block *sca = vcpu->kvm->arch.sca;
3342+
phys_addr_t sca_phys = virt_to_phys(sca);
33423343

3343-
sca->cpu[vcpu->vcpu_id].sda = (__u64) vcpu->arch.sie_block;
3344-
vcpu->arch.sie_block->scaoh = (__u32)(((__u64)sca) >> 32);
3345-
vcpu->arch.sie_block->scaol = (__u32)(__u64)sca & ~0x3fU;
3344+
sca->cpu[vcpu->vcpu_id].sda = virt_to_phys(vcpu->arch.sie_block);
3345+
vcpu->arch.sie_block->scaoh = sca_phys >> 32;
3346+
vcpu->arch.sie_block->scaol = sca_phys & ESCA_SCAOL_MASK;
33463347
vcpu->arch.sie_block->ecb2 |= ECB2_ESCA;
33473348
set_bit_inv(vcpu->vcpu_id, (unsigned long *) sca->mcn);
33483349
} else {
33493350
struct bsca_block *sca = vcpu->kvm->arch.sca;
3351+
phys_addr_t sca_phys = virt_to_phys(sca);
33503352

3351-
sca->cpu[vcpu->vcpu_id].sda = (__u64) vcpu->arch.sie_block;
3352-
vcpu->arch.sie_block->scaoh = (__u32)(((__u64)sca) >> 32);
3353-
vcpu->arch.sie_block->scaol = (__u32)(__u64)sca;
3353+
sca->cpu[vcpu->vcpu_id].sda = virt_to_phys(vcpu->arch.sie_block);
3354+
vcpu->arch.sie_block->scaoh = sca_phys >> 32;
3355+
vcpu->arch.sie_block->scaol = sca_phys;
33543356
set_bit_inv(vcpu->vcpu_id, (unsigned long *) &sca->mcn);
33553357
}
33563358
read_unlock(&vcpu->kvm->arch.sca_lock);
@@ -3381,6 +3383,7 @@ static int sca_switch_to_extended(struct kvm *kvm)
33813383
struct kvm_vcpu *vcpu;
33823384
unsigned long vcpu_idx;
33833385
u32 scaol, scaoh;
3386+
phys_addr_t new_sca_phys;
33843387

33853388
if (kvm->arch.use_esca)
33863389
return 0;
@@ -3389,8 +3392,9 @@ static int sca_switch_to_extended(struct kvm *kvm)
33893392
if (!new_sca)
33903393
return -ENOMEM;
33913394

3392-
scaoh = (u32)((u64)(new_sca) >> 32);
3393-
scaol = (u32)(u64)(new_sca) & ~0x3fU;
3395+
new_sca_phys = virt_to_phys(new_sca);
3396+
scaoh = new_sca_phys >> 32;
3397+
scaol = new_sca_phys & ESCA_SCAOL_MASK;
33943398

33953399
kvm_s390_vcpu_block_all(kvm);
33963400
write_lock(&kvm->arch.sca_lock);
@@ -3610,15 +3614,18 @@ static void kvm_s390_vcpu_crypto_setup(struct kvm_vcpu *vcpu)
36103614

36113615
void kvm_s390_vcpu_unsetup_cmma(struct kvm_vcpu *vcpu)
36123616
{
3613-
free_page(vcpu->arch.sie_block->cbrlo);
3617+
free_page((unsigned long)phys_to_virt(vcpu->arch.sie_block->cbrlo));
36143618
vcpu->arch.sie_block->cbrlo = 0;
36153619
}
36163620

36173621
int kvm_s390_vcpu_setup_cmma(struct kvm_vcpu *vcpu)
36183622
{
3619-
vcpu->arch.sie_block->cbrlo = get_zeroed_page(GFP_KERNEL_ACCOUNT);
3620-
if (!vcpu->arch.sie_block->cbrlo)
3623+
void *cbrlo_page = (void *)get_zeroed_page(GFP_KERNEL_ACCOUNT);
3624+
3625+
if (!cbrlo_page)
36213626
return -ENOMEM;
3627+
3628+
vcpu->arch.sie_block->cbrlo = virt_to_phys(cbrlo_page);
36223629
return 0;
36233630
}
36243631

@@ -3628,7 +3635,7 @@ static void kvm_s390_vcpu_setup_model(struct kvm_vcpu *vcpu)
36283635

36293636
vcpu->arch.sie_block->ibc = model->ibc;
36303637
if (test_kvm_facility(vcpu->kvm, 7))
3631-
vcpu->arch.sie_block->fac = (u32)(u64) model->fac_list;
3638+
vcpu->arch.sie_block->fac = virt_to_phys(model->fac_list);
36323639
}
36333640

36343641
static int kvm_s390_vcpu_setup(struct kvm_vcpu *vcpu)
@@ -3685,9 +3692,8 @@ static int kvm_s390_vcpu_setup(struct kvm_vcpu *vcpu)
36853692
VCPU_EVENT(vcpu, 3, "AIV gisa format-%u enabled for cpu %03u",
36863693
vcpu->arch.sie_block->gd & 0x3, vcpu->vcpu_id);
36873694
}
3688-
vcpu->arch.sie_block->sdnxo = ((unsigned long) &vcpu->run->s.regs.sdnx)
3689-
| SDNXC;
3690-
vcpu->arch.sie_block->riccbd = (unsigned long) &vcpu->run->s.regs.riccb;
3695+
vcpu->arch.sie_block->sdnxo = virt_to_phys(&vcpu->run->s.regs.sdnx) | SDNXC;
3696+
vcpu->arch.sie_block->riccbd = virt_to_phys(&vcpu->run->s.regs.riccb);
36913697

36923698
if (sclp.has_kss)
36933699
kvm_s390_set_cpuflags(vcpu, CPUSTAT_KSS);
@@ -3737,7 +3743,7 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu)
37373743
return -ENOMEM;
37383744

37393745
vcpu->arch.sie_block = &sie_page->sie_block;
3740-
vcpu->arch.sie_block->itdba = (unsigned long) &sie_page->itdb;
3746+
vcpu->arch.sie_block->itdba = virt_to_phys(&sie_page->itdb);
37413747

37423748
/* the real guest size will always be smaller than msl */
37433749
vcpu->arch.sie_block->mso = 0;

arch/s390/kvm/kvm-s390.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@
2323
/* Transactional Memory Execution related macros */
2424
#define IS_TE_ENABLED(vcpu) ((vcpu->arch.sie_block->ecb & ECB_TE))
2525
#define TDB_FORMAT1 1
26-
#define IS_ITDB_VALID(vcpu) ((*(char *)vcpu->arch.sie_block->itdba == TDB_FORMAT1))
26+
#define IS_ITDB_VALID(vcpu) \
27+
((*(char *)phys_to_virt((vcpu)->arch.sie_block->itdba) == TDB_FORMAT1))
2728

2829
extern debug_info_t *kvm_s390_dbf;
2930
extern debug_info_t *kvm_s390_dbf_uv;
@@ -233,7 +234,7 @@ static inline unsigned long kvm_s390_get_gfn_end(struct kvm_memslots *slots)
233234

234235
static inline u32 kvm_s390_get_gisa_desc(struct kvm *kvm)
235236
{
236-
u32 gd = (u32)(u64)kvm->arch.gisa_int.origin;
237+
u32 gd = virt_to_phys(kvm->arch.gisa_int.origin);
237238

238239
if (gd && sclp.has_gisaf)
239240
gd |= GISA_FORMAT1;

0 commit comments

Comments
 (0)