From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Jones Subject: [kvm-unit-tests PATCH v6 04/11] arm/arm64: add some delay routines Date: Mon, 14 Nov 2016 22:08:32 +0100 Message-ID: <1479157719-31021-5-git-send-email-drjones@redhat.com> References: <1479157719-31021-1-git-send-email-drjones@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Cc: marc.zyngier@arm.com, andre.przywara@arm.com, pbonzini@redhat.com To: kvm@vger.kernel.org, kvmarm@lists.cs.columbia.edu, qemu-devel@nongnu.org, qemu-arm@nongnu.org Return-path: In-Reply-To: <1479157719-31021-1-git-send-email-drjones@redhat.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kvmarm-bounces@lists.cs.columbia.edu Sender: kvmarm-bounces@lists.cs.columbia.edu List-Id: kvm.vger.kernel.org QWxsb3cgYSB0aHJlYWQgdG8gd2FpdCBzb21lIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZS4gQ2Fu CnNwZWNpZnkgaW4gY3ljbGVzLCB1c2VjcywgYW5kIG1zZWNzLgoKUmV2aWV3ZWQtYnk6IEFsZXgg QmVubsOpZSA8YWxleC5iZW5uZWVAbGluYXJvLm9yZz4KUmV2aWV3ZWQtYnk6IEVyaWMgQXVnZXIg PGVyaWMuYXVnZXJAcmVkaGF0LmNvbT4KU2lnbmVkLW9mZi1ieTogQW5kcmV3IEpvbmVzIDxkcmpv bmVzQHJlZGhhdC5jb20+Ci0tLQogbGliL2FybS9hc20vcHJvY2Vzc29yLmggICB8IDE5ICsrKysr KysrKysrKysrKysrKysKIGxpYi9hcm0vcHJvY2Vzc29yLmMgICAgICAgfCAxNSArKysrKysrKysr KysrKysKIGxpYi9hcm02NC9hc20vcHJvY2Vzc29yLmggfCAxOSArKysrKysrKysrKysrKysrKysr CiBsaWIvYXJtNjQvcHJvY2Vzc29yLmMgICAgIHwgMTUgKysrKysrKysrKysrKysrCiA0IGZpbGVz IGNoYW5nZWQsIDY4IGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9saWIvYXJtL2FzbS9wcm9j ZXNzb3IuaCBiL2xpYi9hcm0vYXNtL3Byb2Nlc3Nvci5oCmluZGV4IGVjZjViYmUxODI0YS4uYmM0 NmQxZjk4MGVlIDEwMDY0NAotLS0gYS9saWIvYXJtL2FzbS9wcm9jZXNzb3IuaAorKysgYi9saWIv YXJtL2FzbS9wcm9jZXNzb3IuaApAQCAtNSw3ICs1LDkgQEAKICAqCiAgKiBUaGlzIHdvcmsgaXMg bGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTEdQTCwgdmVyc2lvbiAyLgogICov CisjaW5jbHVkZSA8bGliY2ZsYXQuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVk ZSA8YXNtL2JhcnJpZXIuaD4KIAogZW51bSB2ZWN0b3IgewogCUVYQ1BUTl9SU1QsCkBAIC01MSw0 ICs1MywyMSBAQCBleHRlcm4gaW50IG1waWRyX3RvX2NwdSh1bnNpZ25lZCBsb25nIG1waWRyKTsK IGV4dGVybiB2b2lkIHN0YXJ0X3Vzcih2b2lkICgqZnVuYykodm9pZCAqYXJnKSwgdm9pZCAqYXJn LCB1bnNpZ25lZCBsb25nIHNwX3Vzcik7CiBleHRlcm4gYm9vbCBpc191c2VyKHZvaWQpOwogCitz dGF0aWMgaW5saW5lIHU2NCBnZXRfY250dmN0KHZvaWQpCit7CisJdTY0IHZjdDsKKwlpc2IoKTsK Kwlhc20gdm9sYXRpbGUoIm1ycmMgcDE1LCAxLCAlUTAsICVSMCwgYzE0IiA6ICI9ciIgKHZjdCkp OworCXJldHVybiB2Y3Q7Cit9CisKK2V4dGVybiB2b2lkIGRlbGF5KHU2NCBjeWNsZXMpOworZXh0 ZXJuIHZvaWQgdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpOworCitzdGF0aWMgaW5saW5lIHZv aWQgbWRlbGF5KHVuc2lnbmVkIGxvbmcgbXNlY3MpCit7CisJd2hpbGUgKG1zZWNzLS0pCisJCXVk ZWxheSgxMDAwKTsKK30KKwogI2VuZGlmIC8qIF9BU01BUk1fUFJPQ0VTU09SX0hfICovCmRpZmYg LS1naXQgYS9saWIvYXJtL3Byb2Nlc3Nvci5jIGIvbGliL2FybS9wcm9jZXNzb3IuYwppbmRleCA1 NGZkYjg3ZWYwMTkuLmMyZWUzNjBkZjY4OCAxMDA2NDQKLS0tIGEvbGliL2FybS9wcm9jZXNzb3Iu YworKysgYi9saWIvYXJtL3Byb2Nlc3Nvci5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGFz bS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3Ro cmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2JhcnJpZXIuaD4KIAogc3RhdGljIGNvbnN0IGNo YXIgKnByb2Nlc3Nvcl9tb2Rlc1tdID0gewogCSJVU0VSXzI2IiwgIkZJUV8yNiIgLCAiSVJRXzI2 IiAsICJTVkNfMjYiICwKQEAgLTE0MSwzICsxNDIsMTcgQEAgYm9vbCBpc191c2VyKHZvaWQpCiB7 CiAJcmV0dXJuIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZmxhZ3MgJiBUSUZfVVNFUl9NT0RFOwog fQorCit2b2lkIGRlbGF5KHU2NCBjeWNsZXMpCit7CisJdTY0IHN0YXJ0ID0gZ2V0X2NudHZjdCgp OworCXdoaWxlICgoZ2V0X2NudHZjdCgpIC0gc3RhcnQpIDwgY3ljbGVzKQorCQljcHVfcmVsYXgo KTsKK30KKwordm9pZCB1ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjKQoreworCXVuc2lnbmVkIGlu dCBmcnE7CisJYXNtIHZvbGF0aWxlKCJtcmMgcDE1LCAwLCAlMCwgYzE0LCBjMCwgMCIgOiAiPXIi IChmcnEpKTsKKwlkZWxheSgodTY0KXVzZWMgKiBmcnEgLyAxMDAwMDAwKTsKK30KZGlmZiAtLWdp dCBhL2xpYi9hcm02NC9hc20vcHJvY2Vzc29yLmggYi9saWIvYXJtNjQvYXNtL3Byb2Nlc3Nvci5o CmluZGV4IDdlNDQ4ZGM4MWE2YS4uOTRmN2NlMzViNjVjIDEwMDY0NAotLS0gYS9saWIvYXJtNjQv YXNtL3Byb2Nlc3Nvci5oCisrKyBiL2xpYi9hcm02NC9hc20vcHJvY2Vzc29yLmgKQEAgLTE3LDgg KzE3LDEwIEBACiAjZGVmaW5lIFNDVExSX0VMMV9NCSgxIDw8IDApCiAKICNpZm5kZWYgX19BU1NF TUJMWV9fCisjaW5jbHVkZSA8bGliY2ZsYXQuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAj aW5jbHVkZSA8YXNtL2Vzci5oPgorI2luY2x1ZGUgPGFzbS9iYXJyaWVyLmg+CiAKIGVudW0gdmVj dG9yIHsKIAlFTDFUX1NZTkMsCkBAIC04OSw1ICs5MSwyMiBAQCBleHRlcm4gaW50IG1waWRyX3Rv X2NwdSh1bnNpZ25lZCBsb25nIG1waWRyKTsKIGV4dGVybiB2b2lkIHN0YXJ0X3Vzcih2b2lkICgq ZnVuYykodm9pZCAqYXJnKSwgdm9pZCAqYXJnLCB1bnNpZ25lZCBsb25nIHNwX3Vzcik7CiBleHRl cm4gYm9vbCBpc191c2VyKHZvaWQpOwogCitzdGF0aWMgaW5saW5lIHU2NCBnZXRfY250dmN0KHZv aWQpCit7CisJdTY0IHZjdDsKKwlpc2IoKTsKKwlhc20gdm9sYXRpbGUoIm1ycyAlMCwgY250dmN0 X2VsMCIgOiAiPXIiICh2Y3QpKTsKKwlyZXR1cm4gdmN0OworfQorCitleHRlcm4gdm9pZCBkZWxh eSh1NjQgY3ljbGVzKTsKK2V4dGVybiB2b2lkIHVkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKTsK Kworc3RhdGljIGlubGluZSB2b2lkIG1kZWxheSh1bnNpZ25lZCBsb25nIG1zZWNzKQoreworCXdo aWxlIChtc2Vjcy0tKQorCQl1ZGVsYXkoMTAwMCk7Cit9CisKICNlbmRpZiAvKiAhX19BU1NFTUJM WV9fICovCiAjZW5kaWYgLyogX0FTTUFSTTY0X1BST0NFU1NPUl9IXyAqLwpkaWZmIC0tZ2l0IGEv bGliL2FybTY0L3Byb2Nlc3Nvci5jIGIvbGliL2FybTY0L3Byb2Nlc3Nvci5jCmluZGV4IGRlZWFi NGVjOWM4YS4uNTBmYTgzNWM2ZjFlIDEwMDY0NAotLS0gYS9saWIvYXJtNjQvcHJvY2Vzc29yLmMK KysrIGIvbGliL2FybTY0L3Byb2Nlc3Nvci5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGFz bS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3Ro cmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2JhcnJpZXIuaD4KIAogc3RhdGljIGNvbnN0IGNo YXIgKnZlY3Rvcl9uYW1lc1tdID0gewogCSJlbDF0X3N5bmMiLApAQCAtMjUzLDMgKzI1NCwxNyBA QCBib29sIGlzX3VzZXIodm9pZCkKIHsKIAlyZXR1cm4gY3VycmVudF90aHJlYWRfaW5mbygpLT5m bGFncyAmIFRJRl9VU0VSX01PREU7CiB9CisKK3ZvaWQgZGVsYXkodTY0IGN5Y2xlcykKK3sKKwl1 NjQgc3RhcnQgPSBnZXRfY250dmN0KCk7CisJd2hpbGUgKChnZXRfY250dmN0KCkgLSBzdGFydCkg PCBjeWNsZXMpCisJCWNwdV9yZWxheCgpOworfQorCit2b2lkIHVkZWxheSh1bnNpZ25lZCBsb25n IHVzZWMpCit7CisJdW5zaWduZWQgaW50IGZycTsKKwlhc20gdm9sYXRpbGUoIm1ycyAlMCwgY250 ZnJxX2VsMCIgOiAiPXIiIChmcnEpKTsKKwlkZWxheSgodTY0KXVzZWMgKiBmcnEgLyAxMDAwMDAw KTsKK30KLS0gCjIuNy40CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwprdm1hcm0gbWFpbGluZyBsaXN0Cmt2bWFybUBsaXN0cy5jcy5jb2x1bWJpYS5lZHUK aHR0cHM6Ly9saXN0cy5jcy5jb2x1bWJpYS5lZHUvbWFpbG1hbi9saXN0aW5mby9rdm1hcm0K From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45247) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c6OUv-0008WI-K3 for qemu-devel@nongnu.org; Mon, 14 Nov 2016 16:09:02 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c6OUu-0001wZ-GE for qemu-devel@nongnu.org; Mon, 14 Nov 2016 16:09:01 -0500 From: Andrew Jones Date: Mon, 14 Nov 2016 22:08:32 +0100 Message-Id: <1479157719-31021-5-git-send-email-drjones@redhat.com> In-Reply-To: <1479157719-31021-1-git-send-email-drjones@redhat.com> References: <1479157719-31021-1-git-send-email-drjones@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [kvm-unit-tests PATCH v6 04/11] arm/arm64: add some delay routines List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: kvm@vger.kernel.org, kvmarm@lists.cs.columbia.edu, qemu-devel@nongnu.org, qemu-arm@nongnu.org Cc: pbonzini@redhat.com, andre.przywara@arm.com, peter.maydell@linaro.org, alex.bennee@linaro.org, marc.zyngier@arm.com, eric.auger@redhat.com, christoffer.dall@linaro.org Allow a thread to wait some specified amount of time. Can specify in cycles, usecs, and msecs. Reviewed-by: Alex Benn=C3=A9e Reviewed-by: Eric Auger Signed-off-by: Andrew Jones --- lib/arm/asm/processor.h | 19 +++++++++++++++++++ lib/arm/processor.c | 15 +++++++++++++++ lib/arm64/asm/processor.h | 19 +++++++++++++++++++ lib/arm64/processor.c | 15 +++++++++++++++ 4 files changed, 68 insertions(+) diff --git a/lib/arm/asm/processor.h b/lib/arm/asm/processor.h index ecf5bbe1824a..bc46d1f980ee 100644 --- a/lib/arm/asm/processor.h +++ b/lib/arm/asm/processor.h @@ -5,7 +5,9 @@ * * This work is licensed under the terms of the GNU LGPL, version 2. */ +#include #include +#include =20 enum vector { EXCPTN_RST, @@ -51,4 +53,21 @@ extern int mpidr_to_cpu(unsigned long mpidr); extern void start_usr(void (*func)(void *arg), void *arg, unsigned long = sp_usr); extern bool is_user(void); =20 +static inline u64 get_cntvct(void) +{ + u64 vct; + isb(); + asm volatile("mrrc p15, 1, %Q0, %R0, c14" : "=3Dr" (vct)); + return vct; +} + +extern void delay(u64 cycles); +extern void udelay(unsigned long usecs); + +static inline void mdelay(unsigned long msecs) +{ + while (msecs--) + udelay(1000); +} + #endif /* _ASMARM_PROCESSOR_H_ */ diff --git a/lib/arm/processor.c b/lib/arm/processor.c index 54fdb87ef019..c2ee360df688 100644 --- a/lib/arm/processor.c +++ b/lib/arm/processor.c @@ -9,6 +9,7 @@ #include #include #include +#include =20 static const char *processor_modes[] =3D { "USER_26", "FIQ_26" , "IRQ_26" , "SVC_26" , @@ -141,3 +142,17 @@ bool is_user(void) { return current_thread_info()->flags & TIF_USER_MODE; } + +void delay(u64 cycles) +{ + u64 start =3D get_cntvct(); + while ((get_cntvct() - start) < cycles) + cpu_relax(); +} + +void udelay(unsigned long usec) +{ + unsigned int frq; + asm volatile("mrc p15, 0, %0, c14, c0, 0" : "=3Dr" (frq)); + delay((u64)usec * frq / 1000000); +} diff --git a/lib/arm64/asm/processor.h b/lib/arm64/asm/processor.h index 7e448dc81a6a..94f7ce35b65c 100644 --- a/lib/arm64/asm/processor.h +++ b/lib/arm64/asm/processor.h @@ -17,8 +17,10 @@ #define SCTLR_EL1_M (1 << 0) =20 #ifndef __ASSEMBLY__ +#include #include #include +#include =20 enum vector { EL1T_SYNC, @@ -89,5 +91,22 @@ extern int mpidr_to_cpu(unsigned long mpidr); extern void start_usr(void (*func)(void *arg), void *arg, unsigned long = sp_usr); extern bool is_user(void); =20 +static inline u64 get_cntvct(void) +{ + u64 vct; + isb(); + asm volatile("mrs %0, cntvct_el0" : "=3Dr" (vct)); + return vct; +} + +extern void delay(u64 cycles); +extern void udelay(unsigned long usecs); + +static inline void mdelay(unsigned long msecs) +{ + while (msecs--) + udelay(1000); +} + #endif /* !__ASSEMBLY__ */ #endif /* _ASMARM64_PROCESSOR_H_ */ diff --git a/lib/arm64/processor.c b/lib/arm64/processor.c index deeab4ec9c8a..50fa835c6f1e 100644 --- a/lib/arm64/processor.c +++ b/lib/arm64/processor.c @@ -9,6 +9,7 @@ #include #include #include +#include =20 static const char *vector_names[] =3D { "el1t_sync", @@ -253,3 +254,17 @@ bool is_user(void) { return current_thread_info()->flags & TIF_USER_MODE; } + +void delay(u64 cycles) +{ + u64 start =3D get_cntvct(); + while ((get_cntvct() - start) < cycles) + cpu_relax(); +} + +void udelay(unsigned long usec) +{ + unsigned int frq; + asm volatile("mrs %0, cntfrq_el0" : "=3Dr" (frq)); + delay((u64)usec * frq / 1000000); +} --=20 2.7.4