From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
To: Supreeth Venkatesh <supreeth.venkatesh@arm.com>
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: Tue, 19 Sep 2017 13:14:45 -0700 [thread overview]
Message-ID: <CAKv+Gu-b8CMpp8TbxJkf8=MEiUjyx6_wCEjEsru_S0D2MzUYVg@mail.gmail.com> (raw)
In-Reply-To: <20170919195529.29176-1-supreeth.venkatesh@arm.com>
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.
> 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.
> + // 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.
> + 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}
?
> + // 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?
> + 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.
> + 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
> 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
> + 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
next prev parent reply other threads:[~2017-09-19 20:11 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 [this message]
2017-09-20 15:36 ` Supreeth Venkatesh
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='CAKv+Gu-b8CMpp8TbxJkf8=MEiUjyx6_wCEjEsru_S0D2MzUYVg@mail.gmail.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