From patchwork Mon Oct 8 18:33:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Grall X-Patchwork-Id: 148431 Delivered-To: patch@linaro.org Received: by 2002:a2e:8595:0:0:0:0:0 with SMTP id b21-v6csp3982168lji; Mon, 8 Oct 2018 11:36:21 -0700 (PDT) X-Google-Smtp-Source: ACcGV61j/7pMt5HGGZaR6sx3LbTlq9bOUvxQRYVb33LcxwvIrDJuywcu0ZGDcnW8tgCI+2DtEzAk X-Received: by 2002:a02:b716:: with SMTP id g22-v6mr20007935jam.79.1539023781786; Mon, 08 Oct 2018 11:36:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1539023781; cv=none; d=google.com; s=arc-20160816; b=bKihuRbygHCOvd+LbMgMamNeQ206AfWiGJIYsRTt2j49TT+BsqUD8CLR5/xPB5EA7N pB/8sx/uG8q6Hoo4MWPdIhO58IDcMUawX6g+4yBFoSayI7usWUpPeUHx1IkyAFTnww+d lqdlFDwqePUwyLcQYsQT9D6bu+rBtdINFdIj3PSG2GP9JdFMYR/esgGP2wWoQ+9W0HxC thfjvSzd25SorT97cnpLlkTWiVsufG/FNFfNTvVFC4QNmq65jvSayvF+WZvi2EKi+Ka7 QOvnHoWSQYDFz08DPJJbwTGJecjZ8LUcZRyjdr2rRqD4L66aAcfE6OZJbSCegVuDOC8T OclA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc :list-subscribe:list-help:list-post:list-unsubscribe:list-id :precedence:subject:references:in-reply-to:message-id:date:to:from; bh=jo24vmXJfrxSf0Lxp5/U86EZTp5UgRGnA0GR1OHbQaI=; b=0fukyIKczqU+vCJizkts3mvwQF5YtMozg6fxBMtN01MF+iLxhT4c6xrieliRDB9GtN z7uCgnj8yhp1vGp27NJk5PKSBtTXFX/kI93pEGyrROwiMBFRQBaFSnev8tbc8pEC+HIc swAnAF4a+WbrDc8nWhpfh8PSlAuQYWwHnsnZgYwa0Va2qobPGDhZcaa/+dQqfdEW24MZ t2f8Xka0OvuRp6ZsfE/J/jmkzlXOc+c15nd6qGXl44IpVZNDQqx7zhy09nSbJTcvbHty o7xmEIojNLyDZM7X79E8xn0UsxAaZvN738rBC+BtMmMOiKl+7aV0v6bIg0tLcYa8uwU1 jOZg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org. [192.237.175.120]) by mx.google.com with ESMTPS id q6-v6si14329228jak.105.2018.10.08.11.36.21 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 08 Oct 2018 11:36:21 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1g9aM4-0005eh-29; Mon, 08 Oct 2018 18:34:08 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1g9aM2-0005eF-IG for xen-devel@lists.xen.org; Mon, 08 Oct 2018 18:34:06 +0000 X-Inumbo-ID: ea587156-cb28-11e8-a6a9-d7ebe60f679a Received: from foss.arm.com (unknown [217.140.101.70]) by us1-amaz-eas1.inumbo.com (Halon) with ESMTP id ea587156-cb28-11e8-a6a9-d7ebe60f679a; Mon, 08 Oct 2018 18:35:22 +0000 (UTC) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id A81701596; Mon, 8 Oct 2018 11:34:05 -0700 (PDT) Received: from e108454-lin.cambridge.arm.com (e108454-lin.cambridge.arm.com [10.1.196.50]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 9B06B3F5B3; Mon, 8 Oct 2018 11:34:04 -0700 (PDT) From: Julien Grall To: xen-devel@lists.xen.org Date: Mon, 8 Oct 2018 19:33:40 +0100 Message-Id: <20181008183352.16291-5-julien.grall@arm.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20181008183352.16291-1-julien.grall@arm.com> References: <20181008183352.16291-1-julien.grall@arm.com> Subject: [Xen-devel] [RFC 04/16] xen/arm: guest_walk_tables: Switch the return to bool X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Julien Grall , sstabellini@kernel.org, andre.przywara@linaro.org MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" At the moment, guest_walk_tables can either return 0, -EFAULT, -EINVAL. The use of the last 2 are not clearly defined and used inconsistently in the code. The current only caller does not care about the return value and the value of it seems very limited (no way to differentiate between the 15ish error paths). So switch to bool to simplify the return and make the developer life a bit easier. Signed-off-by: Julien Grall Reviewed-by: Stefano Stabellini --- This patch was originally sent separately and reviewed by Stefano. --- xen/arch/arm/guest_walk.c | 50 ++++++++++++++++++++-------------------- xen/arch/arm/mem_access.c | 2 +- xen/include/asm-arm/guest_walk.h | 8 +++---- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/xen/arch/arm/guest_walk.c b/xen/arch/arm/guest_walk.c index 4a1b4cf2c8..7db7a7321b 100644 --- a/xen/arch/arm/guest_walk.c +++ b/xen/arch/arm/guest_walk.c @@ -28,9 +28,9 @@ * page table on a different vCPU, the following registers would need to be * loaded: TCR_EL1, TTBR0_EL1, TTBR1_EL1, and SCTLR_EL1. */ -static int guest_walk_sd(const struct vcpu *v, - vaddr_t gva, paddr_t *ipa, - unsigned int *perms) +static bool guest_walk_sd(const struct vcpu *v, + vaddr_t gva, paddr_t *ipa, + unsigned int *perms) { int ret; bool disabled = true; @@ -79,7 +79,7 @@ static int guest_walk_sd(const struct vcpu *v, } if ( disabled ) - return -EFAULT; + return false; /* * The address of the L1 descriptor for the initial lookup has the @@ -97,12 +97,12 @@ static int guest_walk_sd(const struct vcpu *v, /* Access the guest's memory to read only one PTE. */ ret = access_guest_memory_by_ipa(d, paddr, &pte, sizeof(short_desc_t), false); if ( ret ) - return -EINVAL; + return false; switch ( pte.walk.dt ) { case L1DESC_INVALID: - return -EFAULT; + return false; case L1DESC_PAGE_TABLE: /* @@ -122,10 +122,10 @@ static int guest_walk_sd(const struct vcpu *v, /* Access the guest's memory to read only one PTE. */ ret = access_guest_memory_by_ipa(d, paddr, &pte, sizeof(short_desc_t), false); if ( ret ) - return -EINVAL; + return false; if ( pte.walk.dt == L2DESC_INVALID ) - return -EFAULT; + return false; if ( pte.pg.page ) /* Small page. */ { @@ -175,7 +175,7 @@ static int guest_walk_sd(const struct vcpu *v, *perms |= GV2M_EXEC; } - return 0; + return true; } /* @@ -355,9 +355,9 @@ static bool check_base_size(unsigned int output_size, uint64_t base) * page table on a different vCPU, the following registers would need to be * loaded: TCR_EL1, TTBR0_EL1, TTBR1_EL1, and SCTLR_EL1. */ -static int guest_walk_ld(const struct vcpu *v, - vaddr_t gva, paddr_t *ipa, - unsigned int *perms) +static bool guest_walk_ld(const struct vcpu *v, + vaddr_t gva, paddr_t *ipa, + unsigned int *perms) { int ret; bool disabled = true; @@ -442,7 +442,7 @@ static int guest_walk_ld(const struct vcpu *v, */ if ( (input_size > TCR_EL1_IPS_48_BIT_VAL) || (input_size < TCR_EL1_IPS_MIN_VAL) ) - return -EFAULT; + return false; } else { @@ -487,7 +487,7 @@ static int guest_walk_ld(const struct vcpu *v, } if ( disabled ) - return -EFAULT; + return false; /* * The starting level is the number of strides (grainsizes[gran] - 3) @@ -498,12 +498,12 @@ static int guest_walk_ld(const struct vcpu *v, /* Get the IPA output_size. */ ret = get_ipa_output_size(d, tcr, &output_size); if ( ret ) - return -EFAULT; + return false; /* Make sure the base address does not exceed its configured size. */ ret = check_base_size(output_size, ttbr); if ( !ret ) - return -EFAULT; + return false; /* * Compute the base address of the first level translation table that is @@ -523,12 +523,12 @@ static int guest_walk_ld(const struct vcpu *v, /* Access the guest's memory to read only one PTE. */ ret = access_guest_memory_by_ipa(d, paddr, &pte, sizeof(lpae_t), false); if ( ret ) - return -EFAULT; + return false; /* Make sure the base address does not exceed its configured size. */ ret = check_base_size(output_size, pfn_to_paddr(pte.walk.base)); if ( !ret ) - return -EFAULT; + return false; /* * If page granularity is 64K, make sure the address is aligned @@ -537,7 +537,7 @@ static int guest_walk_ld(const struct vcpu *v, if ( (output_size < TCR_EL1_IPS_52_BIT_VAL) && (gran == GRANULE_SIZE_INDEX_64K) && (pte.walk.base & 0xf) ) - return -EFAULT; + return false; /* * Break if one of the following conditions is true: @@ -567,7 +567,7 @@ static int guest_walk_ld(const struct vcpu *v, * maps a memory block at level 3 (PTE<1:0> == 01). */ if ( !lpae_is_valid(pte) || !lpae_is_mapping(pte, level) ) - return -EFAULT; + return false; /* Make sure that the lower bits of the PTE's base address are zero. */ mask = GENMASK_ULL(47, grainsizes[gran]); @@ -583,11 +583,11 @@ static int guest_walk_ld(const struct vcpu *v, if ( !pte.pt.xn && !xn_table ) *perms |= GV2M_EXEC; - return 0; + return true; } -int guest_walk_tables(const struct vcpu *v, vaddr_t gva, - paddr_t *ipa, unsigned int *perms) +bool guest_walk_tables(const struct vcpu *v, vaddr_t gva, + paddr_t *ipa, unsigned int *perms) { uint32_t sctlr = READ_SYSREG(SCTLR_EL1); register_t tcr = READ_SYSREG(TCR_EL1); @@ -595,7 +595,7 @@ int guest_walk_tables(const struct vcpu *v, vaddr_t gva, /* We assume that the domain is running on the currently active domain. */ if ( v != current ) - return -EFAULT; + return false; /* Allow perms to be NULL. */ perms = perms ?: &_perms; @@ -619,7 +619,7 @@ int guest_walk_tables(const struct vcpu *v, vaddr_t gva, /* Memory can be accessed without any restrictions. */ *perms = GV2M_READ|GV2M_WRITE|GV2M_EXEC; - return 0; + return true; } if ( is_32bit_domain(v->domain) && !(tcr & TTBCR_EAE) ) diff --git a/xen/arch/arm/mem_access.c b/xen/arch/arm/mem_access.c index ba4ec780fd..9239bdf323 100644 --- a/xen/arch/arm/mem_access.c +++ b/xen/arch/arm/mem_access.c @@ -125,7 +125,7 @@ p2m_mem_access_check_and_get_page(vaddr_t gva, unsigned long flag, * The software gva to ipa translation can still fail, e.g., if the gva * is not mapped. */ - if ( guest_walk_tables(v, gva, &ipa, &perms) < 0 ) + if ( !guest_walk_tables(v, gva, &ipa, &perms) ) return NULL; /* diff --git a/xen/include/asm-arm/guest_walk.h b/xen/include/asm-arm/guest_walk.h index 4ed8476e08..8768ac9894 100644 --- a/xen/include/asm-arm/guest_walk.h +++ b/xen/include/asm-arm/guest_walk.h @@ -2,10 +2,10 @@ #define _XEN_GUEST_WALK_H /* Walk the guest's page tables in software. */ -int guest_walk_tables(const struct vcpu *v, - vaddr_t gva, - paddr_t *ipa, - unsigned int *perms); +bool guest_walk_tables(const struct vcpu *v, + vaddr_t gva, + paddr_t *ipa, + unsigned int *perms); #endif /* _XEN_GUEST_WALK_H */