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

Michalis Pappas mpappas at fastmail.fm
Wed May 2 07:54:32 UTC 2018


On 04/25/2018 03:54 PM, Michalis Pappas wrote:
> On 04/13/2018 10:40 AM, 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>
>> ---
>>
>> Changes for v2:
>>    - Update help message with additional information on usefulness
>>    - Remove default=n from Kconfig
>>
>> Changes for v3:
>>    - Replace dependency on ARM64 with ARM_SMCCC in Kconfig
>>
>> Changes for v4:
>>    - Add list of changes
>>
>>   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
>>
>
> Hi,
>
> all review comments have been satsified, happy to merge this one?
>
> Thanks,
>
> Michalis

Hi, any news on this one?



More information about the U-Boot mailing list