[U-Boot] [PATCH v3] arm64: Add SMC and HVC commands

Michalis Pappas mpappas at fastmail.fm
Wed Apr 11 09:35:13 UTC 2018


Sorry for the duplicate, for some reason I thought that v3 didn't make 
it into the list. Any news on this one btw?


On 04/11/2018 12:30 PM, Michalis Pappas wrote:
> This patch adds smc and hvc commands, that allow issuing Secure Monitor
> Calls and Hypervisor Calls conforming to the ARM SMC Calling Convention.
>
> Add Kconfig items to allow each command can be individually enabled.
>
> Signed-off-by: Michalis Pappas <mpappas at fastmail.fm>
> ---
>
>   cmd/Kconfig  | 14 ++++++++++
>   cmd/Makefile |  2 ++
>   cmd/smccc.c  | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>   3 files changed, 88 insertions(+)
>   create mode 100644 cmd/smccc.c
>
> diff --git a/cmd/Kconfig b/cmd/Kconfig
> index 136836d146..2176b98ccb 100644
> --- a/cmd/Kconfig
> +++ b/cmd/Kconfig
> @@ -1348,6 +1348,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 9a358e4801..5656a1a40a 100644
> --- a/cmd/Makefile
> +++ b/cmd/Makefile
> @@ -61,6 +61,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
> @@ -113,6 +114,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 0000000000..2fa7c23999
> --- /dev/null
> +++ b/cmd/smccc.c
> @@ -0,0 +1,72 @@
> +/*
> + * Copyright 2018
> + * Michalis Pappas <mpappas at fastmail.fm>
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +#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
> +
> --
> 2.17.0
>



More information about the U-Boot mailing list