From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.7 required=3.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DC7B3C10F0E for ; Tue, 9 Apr 2019 14:46:35 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id ACEAA2084F for ; Tue, 9 Apr 2019 14:46:35 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="ruA9fY0b"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="FRaG/fPu" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org ACEAA2084F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:Message-Id:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To: References:List-Owner; bh=r8JZ9V9WTY2FOSQEtI7Q97weYNBPeNHLsxzBvV4IHL8=; b=ruA 9fY0bvL2uTmhItFmlQfDTQifg9F36I6wQnIHOH96ia/AD/OBKfI9cS/lFdCLlsaEgVQRsUjeJKBUt a0gu+rsc1NXTnDrSN0/SByRO+1OIe0adSA/cLMxTFZWjQ8X4/u9cDYhL3ds6BNqFtMzKWviKoBUsh 18rkDfG0ReOo8QQs/V7BKIBbO6B97AO0UysxEunzueLLG3y/FbpX36RwdcWk5cy4FrrL35PkTxr+d DJ/sL0e+uKRAD25MJ9hU5JvCXVbxXtJM5YOIpOK+1dz5bKrjBr/g+BUCYqUMs5DxLZ/V6NmlTGJwf XtM4yae1judZYjd80rqWnvTRSdtLRZg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1hDs15-0002oS-CN; Tue, 09 Apr 2019 14:46:27 +0000 Received: from mail-wr1-x442.google.com ([2a00:1450:4864:20::442]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1hDs12-0002nu-Kt for linux-arm-kernel@lists.infradead.org; Tue, 09 Apr 2019 14:46:26 +0000 Received: by mail-wr1-x442.google.com with SMTP id k17so21253883wrx.10 for ; Tue, 09 Apr 2019 07:46:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=OzD9h6yCwwKRtgcUYxF/WBfEg8IOGubw0e6xecgl3z4=; b=FRaG/fPu2e8PkQCrTZXhkcie7wlnVDaE9B9YaN3jNQ4x1SSoagbqWDv9vW29mAdllG 0e5KggaYOl0f0GGnZx8HWoVH+WeZLaFZkbb/CdecroNgVGVueMDyBNRfpseg7cDTJnEP 9utZf0DEhTPABbpZd6V+mNJG9/ovo2picbPBRrvypkAElsGAoFfOlLmdQyAcXWtszA67 rG+Ntulwdag2YMuFNDarLIgYii6i3pruIAmZlxMi08W8G+Nlnh71H1JOEFTDJkNhjEwZ iGdOWdulcVlZLhiPLxtln6LIFnu6hfxPcPdXgv8nlBNU9z5w9dfIlf9Iunr3ejY1OPvV Y5lg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=OzD9h6yCwwKRtgcUYxF/WBfEg8IOGubw0e6xecgl3z4=; b=RjzHUsxt+SF/6oFw/RRevm1ZalVQd5xw8H6EnHAp7aZATN5L+UE4c1icQpcs8gOPqD y/FzNNR/BlaiuU+peoGWAYaMMehLYwCnvOAG51VSBNb+O4EpOQ+pOVD9E4qWwo8vXUYL QZTrAac+BQViUdrY2tFBxmfY4LzQH1ZTQnBScPwijLrm8HALRh87FQdJb+VOOr7Adqvv zPGDFyA+qY3eM9mfslEZxL/g+RSdkci/71zc1+vtdK2U21sl9cZYmumRkVT1OdjzKD8R ftc25Ci+9azLhlsts5v7MSCXfApQMqP6hTD+5QbTDGAuUrsEyfmgSUqwqJycsv4EZyt8 T91A== X-Gm-Message-State: APjAAAVb6CwIdI02onTxT6xbsCB4lR7m1rsq38BjHRUTLIPb3yeY5BEb aDtKbge/2h8M+M6gqYv6LFCTAED9aRI= X-Google-Smtp-Source: APXvYqz0Hd4dHxCwnFtrRl1VuDIdxGucZUI2Qaf2OGEqm2/4kKC9KxFX0pbawAW5MbIPchSyOlr46A== X-Received: by 2002:a5d:698b:: with SMTP id g11mr23969358wru.65.1554821182403; Tue, 09 Apr 2019 07:46:22 -0700 (PDT) Received: from marek-VirtualBox.ccr.corp.intel.com ([78.133.233.210]) by smtp.gmail.com with ESMTPSA id u189sm18988734wme.25.2019.04.09.07.46.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 09 Apr 2019 07:46:21 -0700 (PDT) From: marek.bykowski@gmail.com To: linux-arm-kernel@lists.infradead.org Subject: [PATCH] drivers/firmware: arch64: Add SMC call testing module Date: Tue, 9 Apr 2019 16:46:01 +0200 Message-Id: <1554821161-4623-1-git-send-email-marek.bykowski@gmail.com> X-Mailer: git-send-email 2.7.4 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190409_074624_688678_4940E53B X-CRM114-Status: GOOD ( 20.57 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Marek Bykowski MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org From: Marek Bykowski The module measures the round-trip latency for both PSCI_VERSION and SMCCC_ARCH_WORKAROUND_1 conforming to SMC Calling Convention v1.0 and v1.1 respectively for each of the CPUs. Knowing these latencies is becoming critical in quantifying the performance impact resulting in from execution of the mitigation to CVE-2017-5715. Generally the module application can be extended into measuring an arbitrary SMC call duration. The sample results for a SoC based on ARM Cortex-A57 MPCore Processor running 16 CPUs is as follows: SMC_VARIANT(0): smc_call_v10 [smc_time] CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 CPU8 CPU9 CPU10 CPU11 CPU12 CPU13 CPU14 CPU15 4812 5140 5039 5199 5265 5242 4571 4715 4879 4891 4886 4910 4016 4215 4015 4051 SMC_VARIANT(1): smc_call_v11 [smc_time] CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 CPU8 CPU9 CPU10 CPU11 CPU12 CPU13 CPU14 CPU15 476 481 489 489 496 496 496 496 496 496 504 496 480 481 469 477 Signed-off-by: Marek Bykowski --- drivers/firmware/Kconfig | 9 ++ drivers/firmware/Makefile | 1 + drivers/firmware/smc_latency.c | 220 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 230 insertions(+) create mode 100644 drivers/firmware/smc_latency.c diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig index bca172d42c74..30777ac0ce1b 100644 --- a/drivers/firmware/Kconfig +++ b/drivers/firmware/Kconfig @@ -195,6 +195,15 @@ config QCOM_SCM depends on ARM || ARM64 select RESET_CONTROLLER +config SMC_LATENCY + tristate "Measure round-trip latency of the SMC calls" + depends on HAVE_ARM_SMCCC + default m + help + Say Y or M here to enable the measurement of the round-trip latency + for both PSCI_VERSION and SMCCC_ARCH_WORKAROUND_1 conforming to SMC + Calling Convention v1.0 and v1.1 respectively for each of the CPUs. + config QCOM_SCM_32 def_bool y depends on QCOM_SCM && ARM diff --git a/drivers/firmware/Makefile b/drivers/firmware/Makefile index 898ac41fa8b3..382bf01470f7 100644 --- a/drivers/firmware/Makefile +++ b/drivers/firmware/Makefile @@ -19,6 +19,7 @@ obj-$(CONFIG_FW_CFG_SYSFS) += qemu_fw_cfg.o obj-$(CONFIG_QCOM_SCM) += qcom_scm.o obj-$(CONFIG_QCOM_SCM_64) += qcom_scm-64.o obj-$(CONFIG_QCOM_SCM_32) += qcom_scm-32.o +obj-$(CONFIG_SMC_LATENCY) += smc_latency.o CFLAGS_qcom_scm-32.o :=$(call as-instr,.arch armv7-a\n.arch_extension sec,-DREQUIRES_SEC=1) -march=armv7-a obj-y += broadcom/ diff --git a/drivers/firmware/smc_latency.c b/drivers/firmware/smc_latency.c new file mode 100644 index 000000000000..fc3697697ed6 --- /dev/null +++ b/drivers/firmware/smc_latency.c @@ -0,0 +1,220 @@ +/* + * + * SMC testing module + * + * Copyright (C) 2019 Intel Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SMC_DEBUG 0 +#if SMC_DEBUG +#define smc_dbg(...) pr_info(__VA_ARGS__) +#define seq_printf(...) +#define seq_puts(...) +#else +#define smc_dbg(...) +#define seq_printf(arg0, ...) seq_printf(arg0, __VA_ARGS__) +#define seq_puts(arg0, ...) seq_puts(arg0, __VA_ARGS__) +#endif + +struct _pt_regs { + unsigned long elr; + unsigned long regs[31]; +}; + +typedef void (*smc_cb_t)(void *); + +static bool all_cpus; +module_param(all_cpus, bool, 0644); +MODULE_PARM_DESC(all_cpus, "Run smc call on executing or all cpus (default: all"); + +void smc_call_v10(void *arg); +void smc_call_v11(void *arg); + +smc_cb_t smc_call[] = { + smc_call_v10, + smc_call_v11 +}; + +#define SMC_VARIANTS ARRAY_SIZE(smc_call) +#define SMC_VARIANT(n) n +#define for_each_smc(smc) \ + for ((smc) = 0; (smc) < SMC_VARIANTS; (smc)++) + +unsigned long __percpu *time[SMC_VARIANTS]; + +/* SMCCC 1.0 */ +void smc_call_v10(void *arg) +{ + struct pt_regs _regs = {0}, *regs = &_regs; + int smc = *(unsigned int *)arg; + struct arm_smccc_res res; + ktime_t start, end; + + regs->regs[0] = PSCI_0_2_FN_PSCI_VERSION; + + start = ktime_get(); + arm_smccc_smc(regs->regs[0], regs->regs[1], regs->regs[2], + regs->regs[3], 0, 0, 0, 0, &res); + end = ktime_get(); + + this_cpu_write(*time[smc], ktime_to_ns(ktime_sub(end, start))); + smc_dbg("cpu%d %lu ns (ret %#lx)\n", + smc, + this_cpu_read(*time[smc]), + res.a0); +} + +/* SMCCC 1.1 */ +void smc_call_v11(void *arg) +{ + int smc = *(unsigned int *)arg; + ktime_t start, end; + + start = ktime_get(); + arm_smccc_1_1_smc(ARM_SMCCC_ARCH_WORKAROUND_1, NULL); + end = ktime_get(); + + this_cpu_write(*time[smc], ktime_to_ns(ktime_sub(end, start))); + smc_dbg("cpu%d %lu ns (ret %s)\n", + smc, + this_cpu_read(*time[smc]), + "RET0 in smc call"); +} + +void +zeroise_times(void) +{ + int cpu, smc; + + for_each_smc(smc) { + for_each_online_cpu(cpu) { + *per_cpu_ptr(time[smc], cpu) = 0; + } + } +} + +static void run_test(void) +{ + int smc; + + /* init the smc call regs before the next call round */ + zeroise_times(); + + switch (all_cpus) { + case true: + for_each_smc(smc) { + int cpu; + + for_each_online_cpu(cpu) { + int ret; + + ret = smp_call_function_single(cpu, smc_call[smc], + (void *)&smc, 1); + if (ret) + WARN_ON(ret); + } + } + break; + case false: + for_each_smc(smc) + smc_call[smc]((void *)&smc); + break; + } +} + + +static int proc_smc_show(struct seq_file *m, void *v) +{ + int smc; + + run_test(); + + for_each_smc(smc) { + int cpu; + + seq_printf(m, "SMC_VARIANT(%u): %pf\n", smc, smc_call[smc]); + for_each_online_cpu(cpu) + seq_printf(m, "CPU%-2d ", cpu); + seq_puts(m, "\n"); + for_each_online_cpu(cpu) + seq_printf(m, "%-5lu ", + *per_cpu_ptr(time[SMC_VARIANT(smc)], cpu)); + seq_puts(m, "\n"); + } + + return 0; +} + +static int proc_smc_open(struct inode *inode, struct file *file); +static const struct file_operations proc_smc_operations = { + .open = proc_smc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static int proc_smc_open(struct inode *inode, struct file *file) +{ + return single_open(file, proc_smc_show, NULL); +} + +static struct proc_dir_entry *procent; +static int __init proc_dma_init(void) +{ + procent = proc_create("axxia_smccall", 0444, NULL, + &proc_smc_operations); + return 0; +} + + +static int __init smctest_init(void) +{ + unsigned int smc; + + for_each_smc(smc) + time[smc] = alloc_percpu(unsigned long); + + zeroise_times(); + proc_dma_init(); + + return 0; +} +late_initcall(smctest_init); + +static void __exit dmatest_exit(void) +{ + unsigned int smc; + + for_each_smc(smc) + if (time[smc]) { + free_percpu(time[smc]); + time[smc] = NULL; + } + + if (procent) { + proc_remove(procent); + procent = NULL; + } +} + +module_exit(dmatest_exit); + +MODULE_AUTHOR("Marek Bykowski"); +MODULE_LICENSE("GPL v2"); -- 2.16.2 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel