From: Supreeth Venkatesh <supreeth.venkatesh@arm.com>
To: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: "edk2-devel@lists.01.org" <edk2-devel@lists.01.org>,
Leif Lindholm <leif.lindholm@linaro.org>
Subject: Re: [PATCH 1/1] ArmPkg/ArmSvcLib: Add ArmSvcLib implementation.
Date: Wed, 20 Sep 2017 10:36:05 -0500 [thread overview]
Message-ID: <1505921765.2959.9.camel@arm.com> (raw)
In-Reply-To: <CAKv+Gu-b8CMpp8TbxJkf8=MEiUjyx6_wCEjEsru_S0D2MzUYVg@mail.gmail.com>
On Tue, 2017-09-19 at 13:14 -0700, Ard Biesheuvel wrote:
> Hi Supreeth,
>
> On 19 September 2017 at 12:55, Supreeth Venkatesh
> <supreeth.venkatesh@arm.com> wrote:
> >
> > This patch adds a library that enables invocation of SVCs from
> > Exception
> > Level EL0. It will be used by the Standalone MM environment to
> > request
> > services from a software running in a privileged EL e.g. ARM
> > Trusted
> > Firmware. The library is a derived directly from Arm SMC Library.
> >
> > Contributed-under: TianoCore Contribution Agreement 1.1
> > Signed-off-by: Achin Gupta <achin.gupta@arm.com>
> > Signed-off-by: Supreeth Venkatesh <supreeth.venkatesh@arm.com>
> > ---
> > ArmPkg/Library/ArmSvcLib/AArch64/ArmSvc.S | 41
> > ++++++++++++++++++++++++
> > ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.S | 52
> > +++++++++++++++++++++++++++++++
> > ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.asm | 51
> > ++++++++++++++++++++++++++++++
> > ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf | 31 ++++++++++++++++++
> Please add this library to the [Components] section of ArmPkg.dsc so
> it gets built when we build that package.
>
> Also, it appears the header file is missing, although I suppose it
> could be part of a separate patch. However, this is 1/1 and it's
> missing from this patch.
Ard,
Thank you for reviewing it.
I intended to send ArmPkg.dsc and header changes as a separate patch.
However, if you want it as part of this series, I can do that as well.
>
>
> >
> > 4 files changed, 175 insertions(+)
> > create mode 100644 ArmPkg/Library/ArmSvcLib/AArch64/ArmSvc.S
> > create mode 100644 ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.S
> > create mode 100644 ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.asm
> > create mode 100644 ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf
> >
> > diff --git a/ArmPkg/Library/ArmSvcLib/AArch64/ArmSvc.S
> > b/ArmPkg/Library/ArmSvcLib/AArch64/ArmSvc.S
> > new file mode 100644
> > index 0000000000..70122bbb0e
> > --- /dev/null
> > +++ b/ArmPkg/Library/ArmSvcLib/AArch64/ArmSvc.S
> > @@ -0,0 +1,41 @@
> > +//
> > +// Copyright (c) 2012 - 2017, ARM Limited. All rights reserved.
> > +//
> > +// This program and the accompanying materials
> > +// are licensed and made available under the terms and conditions
> > of the BSD License
> > +// which accompanies this distribution. The full text of the
> > license may be found at
> > +// http://opensource.org/licenses/bsd-license.php
> > +//
> > +// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > BASIS,
> > +// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> > EXPRESS OR IMPLIED.
> > +//
> > +//
> > +
> > +.text
> > +.align 3
> > +
> > +GCC_ASM_EXPORT(ArmCallSvc)
> > +
> > +ASM_PFX(ArmCallSvc):
> > + // Push x0 on the stack - The stack must always be quad-word
> > aligned
> > + str x0, [sp, #-16]!
> > +
> Please create a proper stackframe here, by pushing the frame pointer
> and return address to the stack as well. You should always do that
> when you use the stack, even if the return address and frame pointer
> are not corrupted by this function.
Can do. However, this is a direct replica of ArmSmcLib. Let me know if
you want me to send a patch to reflect the above changes in ArmSmcLib
as well.
>
> >
> > + // Load the SVC arguments values into the appropriate registers
> > + ldp x6, x7, [x0, #48]
> > + ldp x4, x5, [x0, #32]
> > + ldp x2, x3, [x0, #16]
> > + ldp x0, x1, [x0, #0]
> > +
> > + svc #0
> > +
> > + // Pop the ARM_SVC_ARGS structure address from the stack into x9
> > + ldr x9, [sp], #16
> > +
> > + // Store the SVC returned values into the ARM_SVC_ARGS
> > structure.
> > + // A SVC call can return up to 4 values - we do not need to
> > store back x4-x7.
> > + stp x2, x3, [x9, #16]
> > + stp x0, x1, [x9, #0]
> > +
> Nit: no reason to do the stores in opposite order here.
Agree. Can change it to reflect ascending register order.
>
> >
> > + mov x0, x9
> > +
> > + ret
> > diff --git a/ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.S
> > b/ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.S
> > new file mode 100644
> > index 0000000000..a7ac2966c3
> > --- /dev/null
> > +++ b/ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.S
> > @@ -0,0 +1,52 @@
> > +//
> > +// Copyright (c) 2016 - 2017, ARM Limited. All rights reserved.
> > +//
> > +// This program and the accompanying materials
> > +// are licensed and made available under the terms and conditions
> > of the BSD License
> > +// which accompanies this distribution. The full text of the
> > license may be found at
> > +// http://opensource.org/licenses/bsd-license.php
> > +//
> > +// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > BASIS,
> > +// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> > EXPRESS OR IMPLIED.
> > +//
> > +//
> > +
> > +.text
> > +.align 3
> > +.arch_extension sec
> > +
> > +GCC_ASM_EXPORT(ArmCallSvc)
> > +
> > +ASM_PFX(ArmCallSvc):
> > + push {r4-r8}
> > + // r0 will be popped just after the SVC call
> > + push {r0}
> > +
> I'd prefer it if this didn't leave the stack misaligned between the
> two instructions. Is there anything wrong with
>
> push {r0, r4-r8}
>
> ?
Can do. However, this is a direct replica of ArmSmcLib. Let me know if
you want me to send a patch to reflect the above changes in ArmSmcLib
as well. (May be few weeks later, if needed)
>
> >
> > + // Load the SVC arguments values into the appropriate
> > registers
> > + ldr r7, [r0, #28]
> > + ldr r6, [r0, #24]
> > + ldr r5, [r0, #20]
> > + ldr r4, [r0, #16]
> > + ldr r3, [r0, #12]
> > + ldr r2, [r0, #8]
> > + ldr r1, [r0, #4]
> > + ldr r0, [r0, #0]
> > +
> Does
>
> ldm r0, {r0-r7}
>
> not work here?
Should work. Will test it and update the patch. However, this is a
direct replica of ArmSmcLib. Let me know if you want me to send a patch
to reflect the above changes in ArmSmcLib as well. (May be few weeks
later, if needed)
>
> >
> > + svc #0
> > +
> > + // Pop the ARM_SVC_ARGS structure address from the stack into
> > r8
> > + pop {r8}
> > +
> > + // Load the SVC returned values into the appropriate registers
> > + // A SVC call can return up to 4 values - we do not need to
> > store back r4-r7.
> > + str r3, [r8, #12]
> > + str r2, [r8, #8]
> > + str r1, [r8, #4]
> > + str r0, [r8, #0]
> > +
> > + mov r0, r8
> > +
> > + // Restore the registers r4-r8
> > + pop {r4-r8}
> > +
> Same here. Please find a way to pop the stack in a single operation.
I guess "stm" can be used. Will test it and send an updated patch.
Same Comment regarding ArmSmcLib.
>
> >
> > + bx lr
> > diff --git a/ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.asm
> > b/ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.asm
> > new file mode 100644
> > index 0000000000..25edbf1939
> > --- /dev/null
> > +++ b/ArmPkg/Library/ArmSvcLib/Arm/ArmSvc.asm
> > @@ -0,0 +1,51 @@
> > +//
> > +// Copyright (c) 2016 - 2017, ARM Limited. All rights reserved.
> > +//
> > +// This program and the accompanying materials
> > +// are licensed and made available under the terms and conditions
> > of the BSD License
> > +// which accompanies this distribution. The full text of the
> > license may be found at
> > +// http://opensource.org/licenses/bsd-license.php
> > +//
> > +// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > BASIS,
> > +// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> > EXPRESS OR IMPLIED.
> > +//
> > +//
> > +
> > +
> > + INCLUDE AsmMacroExport.inc
> > +
> > + RVCT_ASM_EXPORT ArmCallSvc
> > + push {r4-r8}
> > + // r0 will be popped just after the SVC call
> > + push {r0}
> > +
> > + // Load the SVC arguments values into the appropriate
> > registers
> > + ldr r7, [r0, #28]
> > + ldr r6, [r0, #24]
> > + ldr r5, [r0, #20]
> > + ldr r4, [r0, #16]
> > + ldr r3, [r0, #12]
> > + ldr r2, [r0, #8]
> > + ldr r1, [r0, #4]
> > + ldr r0, [r0, #0]
> > +
> > + svc #0
> > +
> > + // Pop the ARM_SVC_ARGS structure address from the stack into
> > r8
> > + pop {r8}
> > +
> > + // Load the SVC returned values into the appropriate registers
> > + // A SVC call can return up to 4 values - we do not need to
> > store back r4-r7.
> > + str r3, [r8, #12]
> > + str r2, [r8, #8]
> > + str r1, [r8, #4]
> > + str r0, [r8, #0]
> > +
> > + mov r0, r8
> > +
> > + // Restore the registers r4-r8
> > + pop {r4-r8}
> > +
> > + bx lr
> > +
> > + END
> Same comments as above
Ditto.
>
> >
> > diff --git a/ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf
> > b/ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf
> > new file mode 100644
> > index 0000000000..0c41eaec9a
> > --- /dev/null
> > +++ b/ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf
> > @@ -0,0 +1,31 @@
> > +#/** @file
> > +#
> > +# Copyright (c) 2016 - 2017, ARM Ltd. All rights reserved.<BR>
> > +# This program and the accompanying materials
> > +# are licensed and made available under the terms and conditions
> > of the BSD License
> > +# which accompanies this distribution. The full text of the
> > license may be found at
> > +# http://opensource.org/licenses/bsd-license.php
> > +#
> > +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> > BASIS,
> > +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> > EXPRESS OR IMPLIED.
> > +#
> > +#**/
> > +
> > +[Defines]
> > + INF_VERSION = 0x00010005
> This should be 1.26 IIRC? (0x0001001A)
>
> >
> > + BASE_NAME = ArmSvcLib
> > + FILE_GUID = eb3f17d5-a3cc-4eac-8912-
> > 84162d0f79da
> $ git grep -i eb3f17d5
> ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf: FILE_GUID
> = eb3f17d5-a3cc-4eac-8912-84162d0f79da
>
Thanks for pointing it out. Thats what happens, if I blindly replicate
ArmSmcLib :(.
> >
> > + MODULE_TYPE = BASE
> > + VERSION_STRING = 1.0
> > + LIBRARY_CLASS = ArmSvcLib
> > +
> > +[Sources.ARM]
> > + Arm/ArmSvc.asm | RVCT
> > + Arm/ArmSvc.S | GCC
> > +
> > +[Sources.AARCH64]
> > + AArch64/ArmSvc.S
> > +
> > +[Packages]
> > + ArmPkg/ArmPkg.dec
> > + MdePkg/MdePkg.dec
> > --
> > 2.14.1
> >
> > _______________________________________________
> > edk2-devel mailing list
> > edk2-devel@lists.01.org
> > https://lists.01.org/mailman/listinfo/edk2-devel
prev parent reply other threads:[~2017-09-20 15:33 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-19 19:55 [PATCH 1/1] ArmPkg/ArmSvcLib: Add ArmSvcLib implementation Supreeth Venkatesh
2017-09-19 20:14 ` Ard Biesheuvel
2017-09-20 15:36 ` Supreeth Venkatesh [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1505921765.2959.9.camel@arm.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox