Path: blob/master/tools/testing/selftests/kvm/arm64/no-vgic-v3.c
38237 views
// SPDX-License-Identifier: GPL-2.012// Check that, on a GICv3 system, not configuring GICv3 correctly3// results in all of the sysregs generating an UNDEF exception.45#include <test_util.h>6#include <kvm_util.h>7#include <processor.h>89static volatile bool handled;1011#define __check_sr_read(r) \12({ \13uint64_t val; \14\15handled = false; \16dsb(sy); \17val = read_sysreg_s(SYS_ ## r); \18val; \19})2021#define __check_sr_write(r) \22do { \23handled = false; \24dsb(sy); \25write_sysreg_s(0, SYS_ ## r); \26isb(); \27} while(0)2829/* Fatal checks */30#define check_sr_read(r) \31do { \32__check_sr_read(r); \33__GUEST_ASSERT(handled, #r " no read trap"); \34} while(0)3536#define check_sr_write(r) \37do { \38__check_sr_write(r); \39__GUEST_ASSERT(handled, #r " no write trap"); \40} while(0)4142#define check_sr_rw(r) \43do { \44check_sr_read(r); \45check_sr_write(r); \46} while(0)4748static void guest_code(void)49{50uint64_t val;5152/*53* Check that we advertise that ID_AA64PFR0_EL1.GIC == 0, having54* hidden the feature at runtime without any other userspace action.55*/56__GUEST_ASSERT(FIELD_GET(ID_AA64PFR0_EL1_GIC,57read_sysreg(id_aa64pfr0_el1)) == 0,58"GICv3 wrongly advertised");5960/*61* Access all GICv3 registers, and fail if we don't get an UNDEF.62* Note that we happily access all the APxRn registers without63* checking their existance, as all we want to see is a failure.64*/65check_sr_rw(ICC_PMR_EL1);66check_sr_read(ICC_IAR0_EL1);67check_sr_write(ICC_EOIR0_EL1);68check_sr_rw(ICC_HPPIR0_EL1);69check_sr_rw(ICC_BPR0_EL1);70check_sr_rw(ICC_AP0R0_EL1);71check_sr_rw(ICC_AP0R1_EL1);72check_sr_rw(ICC_AP0R2_EL1);73check_sr_rw(ICC_AP0R3_EL1);74check_sr_rw(ICC_AP1R0_EL1);75check_sr_rw(ICC_AP1R1_EL1);76check_sr_rw(ICC_AP1R2_EL1);77check_sr_rw(ICC_AP1R3_EL1);78check_sr_write(ICC_DIR_EL1);79check_sr_read(ICC_RPR_EL1);80check_sr_write(ICC_SGI1R_EL1);81check_sr_write(ICC_ASGI1R_EL1);82check_sr_write(ICC_SGI0R_EL1);83check_sr_read(ICC_IAR1_EL1);84check_sr_write(ICC_EOIR1_EL1);85check_sr_rw(ICC_HPPIR1_EL1);86check_sr_rw(ICC_BPR1_EL1);87check_sr_rw(ICC_CTLR_EL1);88check_sr_rw(ICC_IGRPEN0_EL1);89check_sr_rw(ICC_IGRPEN1_EL1);9091/*92* ICC_SRE_EL1 may not be trappable, as ICC_SRE_EL2.Enable can93* be RAO/WI. Engage in non-fatal accesses, starting with a94* write of 0 to try and disable SRE, and let's see if it95* sticks.96*/97__check_sr_write(ICC_SRE_EL1);98if (!handled)99GUEST_PRINTF("ICC_SRE_EL1 write not trapping (OK)\n");100101val = __check_sr_read(ICC_SRE_EL1);102if (!handled) {103__GUEST_ASSERT((val & BIT(0)),104"ICC_SRE_EL1 not trapped but ICC_SRE_EL1.SRE not set\n");105GUEST_PRINTF("ICC_SRE_EL1 read not trapping (OK)\n");106}107108GUEST_DONE();109}110111static void guest_undef_handler(struct ex_regs *regs)112{113/* Success, we've gracefully exploded! */114handled = true;115regs->pc += 4;116}117118static void test_run_vcpu(struct kvm_vcpu *vcpu)119{120struct ucall uc;121122do {123vcpu_run(vcpu);124125switch (get_ucall(vcpu, &uc)) {126case UCALL_ABORT:127REPORT_GUEST_ASSERT(uc);128break;129case UCALL_PRINTF:130printf("%s", uc.buffer);131break;132case UCALL_DONE:133break;134default:135TEST_FAIL("Unknown ucall %lu", uc.cmd);136}137} while (uc.cmd != UCALL_DONE);138}139140static void test_guest_no_gicv3(void)141{142struct kvm_vcpu *vcpu;143struct kvm_vm *vm;144145/* Create a VM without a GICv3 */146vm = vm_create_with_one_vcpu(&vcpu, guest_code);147148vm_init_descriptor_tables(vm);149vcpu_init_descriptor_tables(vcpu);150151vm_install_sync_handler(vm, VECTOR_SYNC_CURRENT,152ESR_ELx_EC_UNKNOWN, guest_undef_handler);153154test_run_vcpu(vcpu);155156kvm_vm_free(vm);157}158159int main(int argc, char *argv[])160{161struct kvm_vcpu *vcpu;162struct kvm_vm *vm;163uint64_t pfr0;164165test_disable_default_vgic();166167vm = vm_create_with_one_vcpu(&vcpu, NULL);168pfr0 = vcpu_get_reg(vcpu, KVM_ARM64_SYS_REG(SYS_ID_AA64PFR0_EL1));169__TEST_REQUIRE(FIELD_GET(ID_AA64PFR0_EL1_GIC, pfr0),170"GICv3 not supported.");171kvm_vm_free(vm);172173test_guest_no_gicv3();174175return 0;176}177178179