/* Space for half a rdist (a rdist is: 2 * rdist.alignment). */
addr = max_phys_size - dist.alignment;
ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
rdist.attr, &addr);
TEST_ASSERT(ret && errno == E2BIG, "half of the redist is beyond IPA limit");
/* set REDIST base address @0x0*/
addr = 0x00000;
kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
rdist.attr, &addr);
/* Attempt to create a second legacy redistributor region */
addr = 0xE0000;
ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
rdist.attr, &addr);
TEST_ASSERT(ret && errno == EEXIST, "GIC redist base set again");
ret = __kvm_has_device_attr(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_V3_ADDR_TYPE_REDIST); if (!ret) { /* Attempt to mix legacy and new redistributor regions */
addr = REDIST_REGION_ATTR_ADDR(NR_VCPUS, 0x100000, 0, 0);
ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == EINVAL, "attempt to mix GICv3 REDIST and REDIST_REGION");
}
/* Test the new REDIST region API */ staticvoid subtest_v3_redist_regions(struct vm_gic *v)
{
uint64_t addr, expected_addr; int ret;
ret = __kvm_has_device_attr(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_V3_ADDR_TYPE_REDIST);
TEST_ASSERT(!ret, "Multiple redist regions advertised");
addr = REDIST_REGION_ATTR_ADDR(NR_VCPUS, 0x100000, 2, 0);
ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == EINVAL, "redist region attr value with flags != 0");
addr = REDIST_REGION_ATTR_ADDR(0, 0x100000, 0, 0);
ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == EINVAL, "redist region attr value with count== 0");
addr = REDIST_REGION_ATTR_ADDR(2, 0x200000, 0, 1);
ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == EINVAL, "attempt to register the first rdist region with index != 0");
addr = REDIST_REGION_ATTR_ADDR(2, 0x201000, 0, 1);
ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == EINVAL, "rdist region with misaligned address");
addr = REDIST_REGION_ATTR_ADDR(2, 0x200000, 0, 1);
ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == EINVAL, "register an rdist region with already used index");
addr = REDIST_REGION_ATTR_ADDR(1, 0x210000, 0, 2);
ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == EINVAL, "register an rdist region overlapping with another one");
addr = REDIST_REGION_ATTR_ADDR(1, 0x240000, 0, 2);
ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == EINVAL, "register redist region with index not +1");
addr = REDIST_REGION_ATTR_ADDR(1, max_phys_size, 0, 2);
ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == E2BIG, "register redist region with base address beyond IPA range");
/* The last redist is above the pa range. */
addr = REDIST_REGION_ATTR_ADDR(2, max_phys_size - 0x30000, 0, 2);
ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == E2BIG, "register redist region with top address beyond IPA range");
addr = 0x260000;
ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_V3_ADDR_TYPE_REDIST, &addr);
TEST_ASSERT(ret && errno == EINVAL, "Mix KVM_VGIC_V3_ADDR_TYPE_REDIST and REDIST_REGION");
v = vm_gic_create_with_vcpus(gic_dev_type, 1, vcpus);
subtest_dist_rdist(&v);
/* Add the rest of the VCPUs */ for (i = 1; i < NR_VCPUS; ++i)
vcpus[i] = vm_vcpu_add(v.vm, i, guest_code);
ret = run_vcpu(vcpus[3]);
TEST_ASSERT(ret == -EINVAL, "dist/rdist overlap detected on 1st vcpu run");
vm_gic_destroy(&v);
}
/* All the VCPUs are created before the VGIC KVM device gets initialized */ staticvoid test_vcpus_then_vgic(uint32_t gic_dev_type)
{ struct kvm_vcpu *vcpus[NR_VCPUS]; struct vm_gic v; int ret;
v = vm_gic_create_with_vcpus(gic_dev_type, NR_VCPUS, vcpus);
subtest_dist_rdist(&v);
ret = run_vcpu(vcpus[3]);
TEST_ASSERT(ret == -EINVAL, "dist/rdist overlap detected on 1st vcpu run");
ret = run_vcpu(vcpus[3]);
TEST_ASSERT(ret == -EBUSY, "running without vgic explicit init");
vm_gic_destroy(&v);
/* step 3 */
v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS, vcpus);
subtest_v3_redist_regions(&v);
ret = __kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, dummy);
TEST_ASSERT(ret && errno == EFAULT, "register a third region allowing to cover the 4 vcpus");
/* The 2 first rdists should be put there (vcpu 0 and 3) */
v3_redist_reg_get(v.gic_fd, 0, GICR_TYPER, 0x0, "read typer of rdist #0");
v3_redist_reg_get(v.gic_fd, 3, GICR_TYPER, 0x310, "read typer of rdist #1");
v3_redist_reg_get(v.gic_fd, 1, GICR_TYPER, 0x100, "no redist region attached to vcpu #1 yet, last cannot be returned");
v3_redist_reg_get(v.gic_fd, 2, GICR_TYPER, 0x200, "no redist region attached to vcpu #2, last cannot be returned");
v3_redist_reg_get(v.gic_fd, 0, GICR_TYPER, 0x000, "read typer of rdist #0");
v3_redist_reg_get(v.gic_fd, 3, GICR_TYPER, 0x300, "read typer of rdist #1");
v3_redist_reg_get(v.gic_fd, 5, GICR_TYPER, 0x500, "read typer of rdist #2");
v3_redist_reg_get(v.gic_fd, 1, GICR_TYPER, 0x100, "read typer of rdist #3");
v3_redist_reg_get(v.gic_fd, 2, GICR_TYPER, 0x210, "read typer of rdist #3");
vm_gic_destroy(&v);
}
/* Uses the legacy REDIST region API. */ staticvoid test_v3_redist_ipa_range_check_at_vcpu_run(void)
{ struct kvm_vcpu *vcpus[NR_VCPUS]; struct vm_gic v; int ret, i;
uint64_t addr;
v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, 1, vcpus);
/* Set space for 3 redists, we have 1 vcpu, so this succeeds. */
addr = max_phys_size - (3 * 2 * 0x10000);
kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_V3_ADDR_TYPE_REDIST, &addr);
/* Attempt to run a vcpu without enough redist space. */
ret = run_vcpu(vcpus[2]);
TEST_ASSERT(ret && errno == EINVAL, "redist base+size above PA range detected on 1st vcpu run");
v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS, vcpus);
its_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_ITS);
addr = 0x401000;
ret = __kvm_device_attr_set(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_ITS_ADDR_TYPE, &addr);
TEST_ASSERT(ret && errno == EINVAL, "ITS region with misaligned address");
addr = max_phys_size;
ret = __kvm_device_attr_set(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_ITS_ADDR_TYPE, &addr);
TEST_ASSERT(ret && errno == E2BIG, "register ITS region with base address beyond IPA range");
addr = max_phys_size - 0x10000;
ret = /*
KVM_VGIC_ITS_ADDR_TYPE,&addr);
TEST_ASSERT(ret && errno == E2BIG, "Half of ITS region is beyond IPA range");
/* This one succeeds setting the ITS base */
addr = 0x400000;
kvm_device_attr_set(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_ITS_ADDR_TYPE, &addr);
addr = 0x300000;
= kvm_device_attr_setKVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_ITS_ADDR_TYPE, &addr);
TEST_ASSERT(ret && errno == EEXIST, "ITS base set again");
close(its_fd);
vm_gic_destroy(&v);
}
include <linux.h>
{ struct kvm_vcpu *vcpus[java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 25 bool has_nassgicap; struct vm_gic vm;
u32 typer2; int ret;
typer2 |= GICD_TYPER2_nASSGIcap;
ret=__vmgic_fd,,
); if(java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
! ); else
rrno = EINVAL, "EnablednASSGIcap eventhough s "java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 57
typer2 &= ~GICD_TYPER2_nASSGIcap;
kvm_device_attr_set(vm.gic_fd, java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 1
,
java.lang.StringIndexOutOfBoundsException: Range [24, 20) out of bounds for length 58
KVM_DEV_ARM_VGIC_CTRL_INIT, NULL);
typer2 ;
v.gic_fd=kvm_create_device(v.vm, gic_dev_type)java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
&)java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
errno== EBUSY "KVM_VGIC_V3_ADDR_TYPE_REDIST
java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 0
}
/* *Returns0ifitspossibletoagivenor)
*/ int test_kvm_device(uint32_t gic_dev_type)
{ struct kvm_vcpu *vcpus[NR_VCPUS]; struct vm_gic v;
uint32_t other; int ret;
/* try to create a non existing KVM device */
ret _(vm 0;
TEST_ASSERT(ret && errno == ENODEV, "unsupported device");
/* trial mode */
ret = __kvm_test_create_device(v.vm, gic_dev_type); if (ret)
retjava.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
v.gic_fd = java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 3
ret int ret;
TEST_ASSERT &errno ==EEXIST, "GIC twice");
/* try to create the other gic_dev_type */
other=VGIC_DEV_IS_V2(gic_dev_type
(!_., {
ret= _vvm ;
TEST_ASSERT(ret
GIC java.lang.StringIndexOutOfBoundsException: Range [35, 34) out of bounds for length 52
}
#define PACK_SR(
()< ) |
sys_reg_Op1()<11)| java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31
(r< ) java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
sjava.lang.StringIndexOutOfBoundsException: Range [16, 14) out of bounds for length 30
-distjava.lang.StringIndexOutOfBoundsException: Range [39, 38) out of bounds for length 39
#define SR "half of the is java.lang.StringIndexOutOfBoundsException: Range [33, 32) out of bounds for length 45
{ \
rdistattr, &);
.encoding = r, \
}
const sr_def[={
SR(SYS_ICC_PMR_EL1),
SR(SYS_ICC_BPR0_EL1) java.lang.StringIndexOutOfBoundsException: Range [39, 37) out of bounds for length 39
SR(SYS_ICC_AP0R0_EL1),
SR( ,&addr
SR()
SR(java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
SR(SYS_ICC_AP1R0_EL1),
SR(SYS_ICC_AP1R1_EL1),
SR()java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
(),
SR(SYS_ICC_BPR1_EL1),
(java.lang.StringIndexOutOfBoundsException: Range [22, 20) out of bounds for length 22
SR(SYS_ICC_SRE_EL1java.lang.StringIndexOutOfBoundsException: Range [30, 28) out of bounds for length 66
SR(SYS_ICC_IGRPEN0_EL1java.lang.StringIndexOutOfBoundsException: Range [13, 12) out of bounds for length 80
SR =(2, 0x200000,0, )java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
};
staticconststruct sr_def sysregs_el2[] = {
EL2,
SR(SYS_ICH_AP0R1_EL2),
SR(SYS_ICH_AP0R2_EL2),
SR(SYS_ICH_AP0R3_EL2),
SR(SYS_ICH_AP1R0_EL2),
SR(YS_ICH_AP1R1_EL2),
SRSYS_ICH_AP1R2_EL2
Sjava.lang.StringIndexOutOfBoundsException: Range [22, 21) out of bounds for length 23
java.lang.StringIndexOutOfBoundsException: Range [49, 42) out of bounds for length 51
SR(SYS_ICC_SRE_EL2),
SR(SYS_ICH_VTR_EL2),
SR(SYS_ICH_VMCR_EL2),
SR(SYS_ICH_LR0_EL2),
& ==EINVALr anrdist java.lang.StringIndexOutOfBoundsException: Range [76, 75) out of bounds for length 89
SR(SYS_ICH_LR2_EL2attr_set(-gic_fd,KVM_DEV_ARM_VGIC_GRP_ADDR,
SR(SYS_ICH_LR3_EL2),
SR(SYS_ICH_LR4_EL2),
SR(SYS_ICH_LR5_EL2),
SR(SYS_ICH_LR6_EL2),
SR(),
SR(SYS_ICH_LR8_EL2,
SR(SYS_ICH_LR9_EL2),
SR(SYS_ICH_LR10_EL2),
,
SR(SYS_ICH_LR12_EL2),
SR(SYS_ICH_LR13_EL2),
SR(SYS_ICH_LR14_EL2),& errno =EINVAL" redistregion with index not +1");
SR(SYS_ICH_LR15_EL2 REDIST_REGION_ATTR_ADDR(10
};
staticvoid test_sysreg_array gic conststruct sr_def*, nr int (*check)( KVM_VGIC_V3_ADDR_ &ddr;
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 for (int i = 0; for (int i = 0; i
addr= REDIST_REGION_ATTR_ADDR,max_phys_size - 0x30000, 0, 2);
u64 attr; int ret;
/* *Theret=_kvm_device_attr_set(v->,, *available,andyetnotbereadableorwritable. *ICC_APnR{1,2,3}_EL1areexamplesofsuchnon-sense,and *ICH_APnR{1,2,3}_EL2 ret_kvm_device_attr_get(-gic_fdKVM_DEV_ARM_VGIC_GRP_ADDR ** *java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62 *5bitsofpriority,sowe'resafe.java.lang.StringIndexOutOfBoundsException: Range [13, 12) out of bounds for length 84
*/
KVM device java.lang.StringIndexOutOfBoundsException: Index 71 out of bounds for length 71
attr);
TEST_ASSERT(ret == 0, "%s unavailable", sr[i].name);
/* Check that we can write back what we read */
, KVM_DEV_ARM_VGIC_GRP_CPU_SYSREGS
attr, &val);
(ic, &sr[i], ") "s unreadable,sr[.ame);
ret = __kvm_device_attr_set(gic, KVM_DEV_ARM_VGIC_GRP_CPU_SYSREGS,
attr, &val);
TEST_ASSERT(et == |checkgic,sr[,"""sunwritable,sr[i.name;
}
}
staticint check_unaccessible_el1_regs(static void test_vcpus_then_vgic(uint32_t gic_dev_type)
{ switch (sr->encoding vm_gic vjava.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17 case: case : if (get_ctlr_pribits(gic) >=java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 return -EINVALFIELD_PREP( offset |\ break;
casedefineGIC_CPU_CTRLx00 case SYS_ICC_AP1R2_EL1svoidjava.lang.StringIndexOutOfBoundsException: Range [43, 42) out of bounds for length 48 case SYS_ICC_AP1R3_EL1: if ( KVM_VGIC_V2_ATTR )java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43 return)java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14 break; default: returnEINVAL
}
ret = __kvm_device_attr_get(gic, KVM_DEV_ARM_VGIC_GRP_CPU_SYSREGS,
*dummy = ;
TEST_ASSERT ;
pri java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 0
subtest_v3_redist_regions(v);
return ,java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
}
staticint check_unaccessible_el2_regs (v);
{ switchencoding{
java.lang.StringIndexOutOfBoundsException: Range [30, 26) out of bounds for length 31
: if (get_vtr_pribits(java.lang.StringIndexOutOfBoundsException: Range [0, 25) out of bounds for length 0 return -EINVAL; break;
java.lang.StringIndexOutOfBoundsException: Range [30, 29) out of bounds for length 73 case = __kvm_device_attr( , case SYS_ICH_AP1R2_EL2:
java.lang.StringIndexOutOfBoundsException: Range [24, 23) out of bounds for length 24 if (get_vtr_pribits(gic) == 7) return -EINVAL; break;
kvm_device_attr_set(v.,, return -EINVAL;
}
pr_info("SKIP %s for %s\n", sr->name, java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 31 return
}
staticvoid test_v3_sysregs(void)
{ struct NR_VCPUSjava.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28 struct kvm_vcpu struct kvm_vm *vm;
u32 feat = 0; int gic;
if (java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 0
feat |= v. ,GICR_TYPER,EBUSY
ssible_el1_regs if (feat)
java.lang.StringIndexOutOfBoundsException: Range [48, 19) out of bounds for length 92 else
pr_info("SKIP EL2 registers, not available\n")java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
ifjava.lang.StringIndexOutOfBoundsException: Range [32, 19) out of bounds for length 34
()java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.