summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/Kconfig14
-rw-r--r--cmd/Makefile2
-rw-r--r--cmd/smccc.c71
3 files changed, 87 insertions, 0 deletions
diff --git a/cmd/Kconfig b/cmd/Kconfig
index 43240317cad..ae49b824715 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -1445,6 +1445,20 @@ config CMD_HASH
saved to memory or to an environment variable. It is also possible
to verify a hash against data in memory.
+config CMD_HVC
+ bool "Support the 'hvc' command"
+ depends on ARM_SMCCC
+ help
+ Allows issuing Hypervisor Calls (HVCs). Mostly useful for
+ development and testing.
+
+config CMD_SMC
+ bool "Support the 'smc' command"
+ depends on ARM_SMCCC
+ help
+ Allows issuing Secure Monitor Calls (SMCs). Mostly useful for
+ development and testing.
+
config HASH_VERIFY
bool "hash -v"
depends on CMD_HASH
diff --git a/cmd/Makefile b/cmd/Makefile
index 9695309cc2b..d7349023a44 100644
--- a/cmd/Makefile
+++ b/cmd/Makefile
@@ -60,6 +60,7 @@ obj-$(CONFIG_CMD_FS_GENERIC) += fs.o
obj-$(CONFIG_CMD_FUSE) += fuse.o
obj-$(CONFIG_CMD_GETTIME) += gettime.o
obj-$(CONFIG_CMD_GPIO) += gpio.o
+obj-$(CONFIG_CMD_HVC) += smccc.o
obj-$(CONFIG_CMD_I2C) += i2c.o
obj-$(CONFIG_CMD_IOTRACE) += iotrace.o
obj-$(CONFIG_CMD_HASH) += hash.o
@@ -112,6 +113,7 @@ obj-$(CONFIG_CMD_SHA1SUM) += sha1sum.o
obj-$(CONFIG_CMD_SETEXPR) += setexpr.o
obj-$(CONFIG_CMD_SPI) += spi.o
obj-$(CONFIG_CMD_STRINGS) += strings.o
+obj-$(CONFIG_CMD_SMC) += smccc.o
obj-$(CONFIG_CMD_TERMINAL) += terminal.o
obj-$(CONFIG_CMD_TIME) += time.o
obj-$(CONFIG_CMD_TRACE) += trace.o
diff --git a/cmd/smccc.c b/cmd/smccc.c
new file mode 100644
index 00000000000..8b1475c2fe0
--- /dev/null
+++ b/cmd/smccc.c
@@ -0,0 +1,71 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2018
+ * Michalis Pappas <mpappas@fastmail.fm>
+ */
+#include <asm/psci.h>
+#include <common.h>
+#include <command.h>
+#include <linux/arm-smccc.h>
+#include <linux/compiler.h>
+#include <linux/psci.h>
+
+static int do_call(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+ struct arm_smccc_res res;
+
+ unsigned long fid;
+
+ unsigned long a1;
+ unsigned long a2;
+ unsigned long a3;
+ unsigned long a4;
+ unsigned long a5;
+ unsigned long a6;
+ unsigned long a7;
+
+ if (argc < 2)
+ return CMD_RET_USAGE;
+
+ fid = simple_strtoul(argv[1], NULL, 16);
+
+ a1 = argc > 2 ? simple_strtoul(argv[2], NULL, 16) : 0;
+ a2 = argc > 3 ? simple_strtoul(argv[3], NULL, 16) : 0;
+ a3 = argc > 4 ? simple_strtoul(argv[4], NULL, 16) : 0;
+ a4 = argc > 5 ? simple_strtoul(argv[5], NULL, 16) : 0;
+ a5 = argc > 6 ? simple_strtoul(argv[6], NULL, 16) : 0;
+ a6 = argc > 7 ? simple_strtoul(argv[7], NULL, 16) : 0;
+ a7 = argc > 8 ? simple_strtoul(argv[8], NULL, 16) : 0;
+
+ if (!strcmp(argv[0], "smc"))
+ arm_smccc_smc(fid, a1, a2, a3, a4, a5, a6, a7, &res);
+ else
+ arm_smccc_hvc(fid, a1, a2, a3, a4, a5, a6, a7, &res);
+
+ printf("Res: %ld %ld %ld %ld\n", res.a0, res.a1, res.a2, res.a3);
+
+ return 0;
+}
+
+#ifdef CONFIG_CMD_SMC
+U_BOOT_CMD(
+ smc, 8, 2, do_call,
+ "Issue a Secure Monitor Call",
+ "<fid> [arg1 ... arg6] [id]\n"
+ " - fid Function ID\n"
+ " - arg SMC arguments, passed to X1-X6 (default to zero)\n"
+ " - id Secure OS ID / Session ID, passed to W7 (defaults to zero)\n"
+);
+#endif
+
+#ifdef CONFIG_CMD_HVC
+U_BOOT_CMD(
+ hvc, 8, 2, do_call,
+ "Issue a Hypervisor Call",
+ "<fid> [arg1...arg7] [id]\n"
+ " - fid Function ID\n"
+ " - arg HVC arguments, passed to X1-X6 (default to zero)\n"
+ " - id Session ID, passed to W7 (defaults to zero)\n"
+);
+#endif
+