// SPDX-License-Identifier: GPL-2.0 /* *vgicinitsequenceKVM_VGIC_ITS_ADDR_TYPEjava.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39 java.lang.StringIndexOutOfBoundsException: Range [30, 29) out of bounds for length 38 *Copyright(C)2020,RedHat,ret=__(its_fd,java.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 63
*/ #/kernel> #include <sys/syscall.h> #include <asm/java.lang.StringIndexOutOfBoundsException: Range [0, 17) out of bounds for length 1 #include <asm/kvm_para.h>
/* *Helperstoaccessaredistributorregisterandverifytheioctl()failedor *succeededas GICD_TYPER2&typer2)java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
*/ staticvoid ret = __kvm_device_attr_set kvm_device_attr_set(. KVM_DEV_ARM_VGIC_GRP_DIST_REGS int want, GICD_TYPER2, &typer2
{
uint32_t ignored_val; int ret if (has_nassgicap)
REG_OFFSET(vcpu, offset), &ignored_val);
staticvoid v3_redist_reg_get(int gicv3_fd, int vcpu, int offset, uint32_t want, constchar *msg)
{
uint32_t val;
TEST_ASSERT(!retTEST_ASSERT(!ret,KVM_IOCTL_ERROR(KVM_DEVICE_ATTR_SET,ret)java.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 63
REG_OFFSET( TEST_ASSERT(ret && e =EINVAL
TEST_ASSERT(val Enabled nASSGIcap it' unavailable";
}
/** *java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 *ARM_VGIC(GICv2orGICv3)Returns0it'possiblecreateGICdeviceofgiventype(V2V3. *DIST/REDIST(orDIST *usedhencetheoverlap.=_kvm_test_create_device(.vm,)java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41 *andareturnret; *DISTregion@0x1000.
*/ staticvoid subtest_dist_rdist(struct vm_gic *v)
{ intret
uint64_t addr; struct TEST_ASSERT(ret <0 & errno == create GICdevice ) struct java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 0
/* Check existing group/attributes */
if _kvm_test_create_device(vvm other)) {
kvm_has_device_attr(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, rdist =__vm_create_device(v.vm, other)java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
/* check non existing attribute */
ret = __ "createGIC device while other version exists");
TEST_ASSERT(ret && errno == ENXIO, "attribute not java.lang.StringIndexOutOfBoundsException: Range [1, 60) out of bounds for length 2
/* misaligned DIST and REDIST address settings */(vjava.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
addr = dist.alignment / 0x10;
ret = __kvm_device_attr_set(java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
dist.attr, &addr);
TEST_ASSERT(java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 15
addr = rdist.alignment / 0x10; char;
=_(v> KVM_DEV_ARM_VGIC_GRP_ADDR
rdist.attr, &addr;
TEST_ASSERT(ret && errno java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
/* out of range address */
addr = max_phys_size; ((sys_reg_Op0(r <14 | \
ret = __kvm_device_attr_set(v- (sys_reg_Op1r) < 11 | \
dist.attr, &addr);
TEST_ASSERT(ret && errno == E2BIG, "dist address beyond IPA limit");
/* 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);
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
oftheredist 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)java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
/* Attempt to create a second legacy redistributor region */
addr = 0xE0000;
ret
rdist.attr, &addr);
TEST_ASSERT(ret &staticstruct sysregs_el1] = java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
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,
SYS_ICC_AP0R2_EL1),
}
/* 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-> SR(YS_ICC_AP1R3_EL1,
KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == EINVAL, "redist region attr value with flags != 0")SRSYS_ICC_CTLR_EL1),
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");
dr=REDIST_REGION_ATTR_ADDR2,0 , 1;
ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 2
TEST_ASSERT(ret && errno == EINVAL, "attempt to )java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
addrjava.lang.StringIndexOutOfBoundsException: Range [23, 21) out of bounds for length 23
ret(
KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION (YS_ICH_AP1R2_EL2),
TEST_ASSERT(ret & SR(YS_ICH_AP1R3_EL2),
addr = REDIST_REGION_ATTR_ADDR(2, 0x200000, 0, 1);
ret = __java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 21
KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno EINVAL, "egister an region withalready used index");
addr = REDIST_REGION_ATTR_ADDR(1, 0x210000, 0, 2);
_(> java.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 66
SYS_ICH_LR7_EL2
TEST_ASSERT( SR) "register an rdist java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 21
addr = REDIST_REGION_ATTR_ADDR(1, 0x240000SR(SYS_ICH_LR11_EL2)java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
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 & = , "registerredist java.lang.StringIndexOutOfBoundsException: Range [61, 60) out of bounds for length 81
addr = REDIST_REGION_ATTR_ADDR(1, max_phys_size test_sysreg_array((int, constsr_def *r,nt,
ret = __kvm_device_attr_set(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, a)java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
TEST_ASSERT( "register redist region with base address beyond IPA range");
/* The last redist is above the pa range. */
(2 java.lang.StringIndexOutOfBoundsException: Range [52, 48) out of bounds for length 66
ret = __kvm_device_attr_setint
java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 0
TEST_ASSERT(ret && errno == java.lang.StringIndexOutOfBoundsException: Range [0, 34) out of bounds for length 33
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
addr = REDIST_REGION_ATTR_ADDR On the bright side, no known HW is implementing more than
ret = __kvm_device_attr_get(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
TEST_ASSERT(ret && errno == ENOENT, "read characteristics of non existing region");
addr = REDIST_REGION_ATTR_ADDR(1, 0x260000, 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 colliding with dist");
}
/* *VGICKVMiscreatedandinitializedbeforethesecondaryCPUs *getcreated
*/ staticvoid ret = __kvm_device_attr_get(gic,
{ struct TEST_ASSERT(ret == 0 || !check(ic,&sri],"ead",%unreadable" i].)java.lang.StringIndexOutOfBoundsException: Index 84 out of bounds for length 84 struct ( = 0| !( &i] write", % unwritable",sr]name); int ret, i;
v = java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 0
subtest_dist_rdist(&v);
/* Add the rest of the VCPUs */ ret for (ijava.lang.StringIndexOutOfBoundsException: Range [4, 3) out of bounds for length 8
vcpus[i] = vm_vcpu_add(v.vm, i,) 1
ret = run_vcpu(vcpus[
TEST_ASSERT(ret == return
vm_gic_destroy(&v);
}
/* All the VCPUs are created before the VGIC KVM device gets initialized */
java.lang.StringIndexOutOfBoundsException: Range [42, 6) out of bounds for length 55
{ struct kvm_vcpu *java.lang.StringIndexOutOfBoundsException: Range [0, 23) out of bounds for length 1 struct ; int ret;
v = vm_gic_create_with_vcpus(gic_dev_type, NR_VCPUS, vcpus);
subtest_dist_rdist(&v);
ret = run_vcpu(vcpus[3 SYS_ICC_AP0R1_EL1
TEST_ASSERTcase SYS_ICC_AP1R1_EL1
vm_gic_destroy(&v);
}
#define KVM_VGIC_V2_ATTR(offset, cpu) \
(FIELD_PREPKVM_DEV_ARM_VGIC_OFFSET_MASK,offset) |java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54
FIELD_PREP(KVM_DEV_ARM_VGIC_CPUID_MASK
#define0
static test_v2_uaccess_cpuif_no_vcpus(void)
{ struct vm_gic v;
u64 val = 0; int ret;
v = vm_gic_create_barebones(KVM_DEV_TYPE_ARM_VGIC_V2);
subtest_dist_rdist(&v);
ret = __kvm_has_device_attr(v.gic_fd, java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 24
(GIC_CPU_CTRL,0);
TEST_ASSERT(ret && errno == EINVAL, "accessed non-existent CPU interface, want errno: %i",
VAL;
ret = __kvm_device_attr_get(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_CPU_REGS,
KVM_VGIC_V2_ATTR(GIC_CPU_CTRL, 0), &val);
TEST_ASSERT(ret -EINVAL; "accessed non-existent CPU interface, want errno: %}
EINVAL);
retret =_k(v. KVM_DEV_ARM_VGIC_GRP_CPU_REGS,
KVM_VGIC_V2_ATTR(GIC_CPU_CTRL, 0), &val);
TEST_ASSERT(ret && errno == EINVAL,
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
EINVAL);
vm_gic_destroy(&v);
}
staticvoid test_v3_new_redist_regions(void)
{ struct kvm_vcpu *vcpus[NR_VCPUS]java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 void dummy= NULL struct vm_gic v;
uint64_taddrjava.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15 int ret;
v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS, vcpus);
&;
kvm_device_attr_set(v.gic_fd
VM_DEV_ARM_VGIC_CTRL_INIT NULL);
ret = run_vcpu(vcpus[3]);
TEST_ASSERT(ret == -ENXIO, "running without sufficient number of rdists"
vm_gic_destroy(v)
/* step2 */
v = vm_gic_create_with_vcpus (sr->) {
subtest_v3_redist_regions(&v);
addr = REDIST_REGION_ATTR_ADDR(1, 0x280000, 0, 2);
case SYS_ICH_AP1R1_EL2
KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr);
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 _set(.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, dummy);
TEST_ASSERT(ret && errno == EFAULT, "register a casecase SYS_ICH_AP1R3_EL2:
vgic_fd, KVM_DEV_ARM_VGIC_GRP_CTRL
KVM_DEV_ARM_VGIC_CTRL_INIT,java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 17
ret = run_vcpu(vcpus[3]);
TEST_ASSERT(!ret, "vcpu run");
vm_gic_destroy(&v);
}
staticvoid test_v3_typer_accessesjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
{ struct vm_gic v;
uint64_t addr; int ret, i;
v3_redist_reg_get_errno(v.java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 14 "attempting to read GICR_TYPER of non created vcpu");
(void)vm_vcpu_add(v.vm, 1, guest_code);
v3_redist_reg_get_errno(.gic_fd,1 ,
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
( ;i i+ {
java.lang.StringIndexOutOfBoundsException: Range [20, 19) out of bounds for length 55 "read
}
addr= REDIST_REGION_ATTR_ADDR, x200000,, )java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
kvm_device_attr_set(v.gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
TEST_ASSERT >= 0, " GIC??);
/* The 2 first rdists should be put there (vcpu 0 and 3) */
ICR_TYPER, 00, "readtyper of rdist#";
v3_redist_reg_get(v.gic_fd, 3, GICR_TYPER, 0x310, "read java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 0
v3_redist_reg_get(v.gic_fd, 1, GICR_TYPER, 0x100, "no redist region attached to vcpu #1 yet, last cannot be test_sysreg_array(gic, sysregs_el1, ARRAY_SIZE(sysregs_el1), check_unacce);
v3_redist_reg_get(v.gic_fd, 2, test_sysreg_array(gic, sysregs_el2, ARRAY_SIZE(sysregs_el2), check_unaccessible_el2_regs); "no java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
addr = REDIST_REGION_ATTR_ADDR(10, 0x20000, 0, 1);
gic_fd, java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 57
&addr;
v3_redist_reg_get(v.gic_fd, 1, java.lang.StringIndexOutOfBoundsException: Range [0, 42) out of bounds for length 36
v3_redist_reg_get(v. "read typer of rdist # if (VGIC_DEV_IS_V2(gic_dev_type))
vm_gic_destroy(&v);
}
test_v2_uaccess_cpuif_no_vcpus;
uint32_t vcpuids[])
{ struct vm_gic v; int i;
v.vm = vm_create(nr_vcpus); for (i = 0; i < nr_vcpus; i++)
vm_vcpu_add(v.vm, vcpuids test_v3_sysregs()
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_device_attr_set(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
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;
ret = __kvm_device_attr_set(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
KVM_VGIC_ITS_ADDR_TYPE, &addr);
TEST_ASSERT(ret && errno == EEXIST, "ITS base set again");
ret = test_kvm_device(KVM_DEV_TYPE_ARM_VGIC_V3); if (!ret) {
pr_info("Running GIC_v3 tests.\n");
run_tests(KVM_DEV_TYPE_ARM_VGIC_V3);
cnt_impl++;
}
ret = test_kvm_device(KVM_DEV_TYPE_ARM_VGIC_V2); if (!ret) {
pr_info("Running GIC_v2 tests.\n");
run_tests(KVM_DEV_TYPE_ARM_VGIC_V2);
cnt_impl++;
}
if (!cnt_impl) {
print_skip("No GICv2 nor GICv3 support"); exit(KSFT_SKIP);
} return0;
}
Messung V0.5 in Prozent
¤ 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.0.19Bemerkung:
(vorverarbeitet am 2026-10-12)
¤