From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by mx.groups.io with SMTP id smtpd.web09.9624.1634915317030152176 for ; Fri, 22 Oct 2021 08:08:37 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=gZ54AEkK; spf=pass (domain: kernel.org, ip: 198.145.29.99, mailfrom: ardb@kernel.org) Received: by mail.kernel.org (Postfix) with ESMTPSA id 59850611CB for ; Fri, 22 Oct 2021 15:08:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1634915316; bh=Pu0N+t1++jtnOCTQCOdq0WcMSBc02+BBv3D2Yt0B6Dw=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=gZ54AEkKZTyOQnwkJAMzH72MEiON4TvIE0b/MceXMtbfJJMf4wVAsS/N/poxcx74o T18l31C0Z2RoLdESPEnPo+aolQ6I2AQ+f9uzo8xMjtim3zgYXhyEM6JpLcwxaKumRz duAtXYWyhXUVWF426QC0Ss14zr9mXH0CJkCeLVsESudAFTzLQreMhSmzTF3dRtj95y Tn1Ni9bdt6Wd3QIwFDoKDxjg1LBUnDvBPoH4X4yfoXARjrUdVk/Oly32feB4dctNCO tkZs9tas92dpusqtCepQCBYplnrRuh8cOr5Alxh9/kmt7Py1YNFOZpKB9BlzH26iU5 APpSEXWS7uPKw== Received: by mail-ot1-f44.google.com with SMTP id b4-20020a9d7544000000b00552ab826e3aso4762939otl.4 for ; Fri, 22 Oct 2021 08:08:36 -0700 (PDT) X-Gm-Message-State: AOAM531nwBjRa4vafxQEuFeREmCEc2A7mA19se0Dzp1kVilv6JdPzVe5 QWSVBqDEF186SFb7Lmw9oDiak/Y8GS6GhFIEURE= X-Google-Smtp-Source: ABdhPJz4uQgrXG+1vC75G+JJHdKoXSHjwWXv7+HhN81ySg/ypJGS6L+ruFlWOZRa73s+RRv7F+yxliy4BWYeXH5A3r8= X-Received: by 2002:a05:6830:1018:: with SMTP id a24mr404671otp.112.1634915315555; Fri, 22 Oct 2021 08:08:35 -0700 (PDT) MIME-Version: 1.0 References: <20211019203543.5471-1-rebecca@nuviainc.com> In-Reply-To: <20211019203543.5471-1-rebecca@nuviainc.com> From: "Ard Biesheuvel" Date: Fri, 22 Oct 2021 17:08:24 +0200 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH 1/1] ArmPkg: Add SMC helper functions To: Rebecca Cran Cc: Sami Mujawar , Ard Biesheuvel , Gerd Hoffmann , Samer El-Haj-Mahmoud , Leif Lindholm , edk2-devel-groups-io Content-Type: text/plain; charset="UTF-8" Hi Rebecca, On Tue, 19 Oct 2021 at 22:35, Rebecca Cran wrote: > > Add functions ArmCallSmc0/1/2/3 to do SMC calls with 0, 1, 2 or 3 > arguments. > The functions return up to 3 values. > This is a lot of code to do something we already do in our code. Care to elaborate what the use case is here? In any case, we generally try to avoid submitting helper libraries like this without the user, to avoid merging code that is already dead. > Signed-off-by: Rebecca Cran > --- > ArmPkg/Include/Library/ArmSmcLib.h | 73 ++++++++++++ > ArmPkg/Library/ArmSmcLib/ArmSmc.c | 122 ++++++++++++++++++++ > ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf | 3 + > ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c | 85 ++++++++++++++ > 4 files changed, 283 insertions(+) > > diff --git a/ArmPkg/Include/Library/ArmSmcLib.h b/ArmPkg/Include/Library/ArmSmcLib.h > index ced60b3c1147..343ae7f40ad2 100644 > --- a/ArmPkg/Include/Library/ArmSmcLib.h > +++ b/ArmPkg/Include/Library/ArmSmcLib.h > @@ -1,5 +1,6 @@ > /** @file > * > +* Copyright (c) 2021, NUVIA Inc. All rights reserved.
> * Copyright (c) 2012-2014, ARM Limited. All rights reserved. > * > * SPDX-License-Identifier: BSD-2-Clause-Patent > @@ -37,4 +38,76 @@ ArmCallSmc ( > IN OUT ARM_SMC_ARGS *Args > ); > > +/** Trigger an SMC call with 3 arguments. > + > + @param Function The SMC function. > + @param Arg1 Argument/result. > + @param Arg2 Argument/result. > + @param Arg3 Argument/result. > + > + @return The SMC error code. > + > +**/ > +UINTN > +ArmCallSmc3 ( > + IN UINTN Function, > + IN OUT UINTN *Arg1, > + IN OUT UINTN *Arg2, > + IN OUT UINTN *Arg3 > + ); > + > +/** Trigger an SMC call with 2 arguments. > + > + @param Function The SMC function. > + @param Arg1 Argument/result. > + @param Arg2 Argument/result. > + @param Arg3 Result. > + > + @return The SMC error code. > + > +**/ > +UINTN > +ArmCallSmc2 ( > + IN UINTN Function, > + IN OUT UINTN *Arg1, > + IN OUT UINTN *Arg2, > + OUT UINTN *Arg3 > + ); > + > +/** Trigger an SMC call with 1 argument. > + > + @param Function The SMC function. > + @param Arg1 Argument/result. > + @param Arg2 Result. > + @param Arg3 Result. > + > + @return The SMC error code. > + > +**/ > +UINTN > +ArmCallSmc1 ( > + IN UINTN Function, > + IN OUT UINTN *Arg1, > + OUT UINTN *Arg2, > + OUT UINTN *Arg3 > + ); > + > +/** Trigger an SMC call with 0 arguments. > + > + @param Function The SMC function. > + @param Arg1 Result. > + @param Arg2 Result. > + @param Arg3 Result. > + > + @return The SMC error code. > + > +**/ > +UINTN > +ArmCallSmc0 ( > + IN UINTN Function, > + OUT UINTN *Arg1, > + OUT UINTN *Arg2, > + OUT UINTN *Arg3 > + ); > + > #endif // ARM_SMC_LIB_H_ > diff --git a/ArmPkg/Library/ArmSmcLib/ArmSmc.c b/ArmPkg/Library/ArmSmcLib/ArmSmc.c > new file mode 100644 > index 000000000000..d596003a857e > --- /dev/null > +++ b/ArmPkg/Library/ArmSmcLib/ArmSmc.c > @@ -0,0 +1,122 @@ > +/** @file > + SMC helper functions. > + > + Copyright (c) 2021, NUVIA Inc. All rights reserved.
> + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include > + > +/** Triggers an SMC call with 3 arguments. > + > + @param Function The SMC function. > + @param Arg1 Argument/result. > + @param Arg2 Argument/result. > + @param Arg3 Argument/result. > + > + @return The SMC error code. > +**/ > +UINTN > +ArmCallSmc3 ( > + IN UINTN Function, > + IN OUT UINTN *Arg1, > + IN OUT UINTN *Arg2, > + IN OUT UINTN *Arg3 > + ) > +{ > + ARM_SMC_ARGS Args; > + UINTN ErrorCode; > + > + Args.Arg0 = Function; > + > + if (Arg1 != NULL) { > + Args.Arg1 = *Arg1; > + } > + if (Arg2 != NULL) { > + Args.Arg2 = *Arg2; > + } > + if (Arg3 != NULL) { > + Args.Arg3 = *Arg3; > + } > + > + ArmCallSmc (&Args); > + > + ErrorCode = Args.Arg0; > + > + if (Arg1 != NULL) { > + *Arg1 = Args.Arg1; > + } > + if (Arg2 != NULL) { > + *Arg2 = Args.Arg2; > + } > + if (Arg3 != NULL) { > + *Arg3 = Args.Arg3; > + } > + > + return ErrorCode; > +} > + > +/** Trigger an SMC call with 2 arguments. > + > + @param Function The SMC function. > + @param Arg1 Argument/result. > + @param Arg2 Argument/result. > + @param Arg3 Result. > + > + @return The SMC error code. > + > +**/ > +UINTN > +ArmCallSmc2 ( > + IN UINTN Function, > + IN OUT UINTN *Arg1, > + IN OUT UINTN *Arg2, > + OUT UINTN *Arg3 > + ) > +{ > + return ArmCallSmc3 (Function, Arg1, Arg2, Arg3); > +} > + > +/** Trigger an SMC call with 1 argument. > + > + @param Function The SMC function. > + @param Arg1 Argument/result. > + @param Arg2 Result. > + @param Arg3 Result. > + > + @return The SMC error code. > + > +**/ > +UINTN > +ArmCallSmc1 ( > + IN UINTN Function, > + IN OUT UINTN *Arg1, > + OUT UINTN *Arg2, > + OUT UINTN *Arg3 > + ) > +{ > + return ArmCallSmc3 (Function, Arg1, Arg2, Arg3); > +} > + > +/** Trigger an SMC call with 0 arguments. > + > + @param Function The SMC function. > + @param Arg1 Result. > + @param Arg2 Result. > + @param Arg3 Result. > + > + @return The SMC error code. > + > +**/ > +UINTN > +ArmCallSmc0 ( > + IN UINTN Function, > + OUT UINTN *Arg1, > + OUT UINTN *Arg2, > + OUT UINTN *Arg3 > + ) > +{ > + return ArmCallSmc3 (Function, Arg1, Arg2, Arg3); > +} > diff --git a/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf b/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf > index 4f4b09f4528a..a89f9203fb7e 100644 > --- a/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf > +++ b/ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf > @@ -20,6 +20,9 @@ > [Sources.AARCH64] > AArch64/ArmSmc.S > > +[Sources] > + ArmSmc.c > + > [Packages] > MdePkg/MdePkg.dec > ArmPkg/ArmPkg.dec > diff --git a/ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c b/ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c > index 2d79aadaf1fa..ca1b8830a119 100644 > --- a/ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c > +++ b/ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.c > @@ -1,4 +1,5 @@ > // > +// Copyright (c) 2021, NUVIA Inc. All rights reserved. > // Copyright (c) 2016, Linaro Limited. All rights reserved. > // > // SPDX-License-Identifier: BSD-2-Clause-Patent > @@ -7,6 +8,7 @@ > > #include > #include > +#include > > VOID > ArmCallSmc ( > @@ -14,3 +16,86 @@ ArmCallSmc ( > ) > { > } > + > +/** Triggers an SMC call with 3 arguments. > + > + @param Function The SMC function. > + @param Arg1 Argument/result. > + @param Arg2 Argument/result. > + @param Arg3 Argument/result. > + > + @return The SMC error code. > +**/ > +UINTN > +ArmCallSmc3 ( > + IN UINTN Function, > + IN OUT UINTN *Arg1, > + IN OUT UINTN *Arg2, > + IN OUT UINTN *Arg3 > + ) > +{ > + return SMC_ARCH_CALL_NOT_SUPPORTED; > +} > + > +/** Trigger an SMC call with 2 arguments. > + > + @param Function The SMC function. > + @param Arg1 Argument/result. > + @param Arg2 Argument/result. > + @param Arg3 Result. > + > + @return The SMC error code. > + > +**/ > +UINTN > +ArmCallSmc2 ( > + IN UINTN Function, > + IN OUT UINTN *Arg1, > + IN OUT UINTN *Arg2, > + OUT UINTN *Arg3 > + ) > +{ > + return SMC_ARCH_CALL_NOT_SUPPORTED; > +} > + > +/** Trigger an SMC call with 1 argument. > + > + @param Function The SMC function. > + @param Arg1 Argument/result. > + @param Arg2 Result. > + @param Arg3 Result. > + > + @return The SMC error code. > + > +**/ > +UINTN > +ArmCallSmc1 ( > + IN UINTN Function, > + IN OUT UINTN *Arg1, > + OUT UINTN *Arg2, > + OUT UINTN *Arg3 > + ) > +{ > + return SMC_ARCH_CALL_NOT_SUPPORTED; > +} > + > +/** Trigger an SMC call with 0 arguments. > + > + @param Function The SMC function. > + @param Arg1 Result. > + @param Arg2 Result. > + @param Arg3 Result. > + > + @return The SMC error code. > + > +**/ > +UINTN > +ArmCallSmc0 ( > + IN UINTN Function, > + OUT UINTN *Arg1, > + OUT UINTN *Arg2, > + OUT UINTN *Arg3 > + ) > +{ > + return SMC_ARCH_CALL_NOT_SUPPORTED; > +} > -- > 2.31.1 >