Re: [PATCH] bootwrapper: Drop now-obsolete SMC interface support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Sep 26, 2012 at 11:09 AM, Peter Maydell
<peter.maydell@xxxxxxxxxx> wrote:
> Now that the kernel supports simply being started in Hyp mode,
> we don't need to maintain the obsolete SMC interface for setting
> HVBAR and switching to NS mode. Drop monitor.S in favour of a
> much simpler special-purpose bit of code in boot.S which passes
> briefly through Monitor mode to set up HVBAR and drop into
> NS state. We also disable SMC in NS mode, so that inadvertent
> use of it will UNDEF rather than leaping back into the boot
> wrapper later on.
>
> Signed-off-by: Peter Maydell <peter.maydell@xxxxxxxxxx>
> ---
> This patch sits on top of Dave Martin's 3 patch set to defer
> entry into Hyp mode to just before we actually boot the kernel.
>  git://git.linaro.org/people/pmaydell/boot-wrapper.git drop-smc
> has those patches plus this one, if you want a convenient tree
> to test with.
>
> Dropping all the SMC code should have no effect except that anybody
> still running an ancient kernel that predates the Hyp-mode-entry
> changes will find it doesn't work any more...
>
>
>  Makefile    |    6 +---
>  boot.S      |   57 ++++++++++++++++++++++++-----------
>  model.lds.S |    2 --
>  monitor.S   |   95 -----------------------------------------------------------
>  4 files changed, 41 insertions(+), 119 deletions(-)
>  delete mode 100644 monitor.S
>
> diff --git a/Makefile b/Makefile
> index f8fc841..0997dcf 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -15,9 +15,8 @@ endif
>
>  LIBFDTOBJS      = libfdt/fdt.o libfdt/fdt_ro.o libfdt/fdt_wip.o \
>                   libfdt/fdt_sw.o libfdt/fdt_rw.o libfdt/fdt_strerror.o
> -MONITOR                = monitor.S
>  BOOTLOADER     = boot.S
> -OBJS           = boot.o c_start.o monitor.o semihosting.o string.o semi_loader.o $(LIBFDTOBJS)
> +OBJS           = boot.o c_start.o semihosting.o string.o semi_loader.o $(LIBFDTOBJS)
>  KERNEL         = uImage
>
>  IMAGE          = linux-system.axf
> @@ -53,9 +52,6 @@ $(SEMIIMG): $(OBJS) modelsemi.lds
>  boot.o: $(BOOTLOADER)
>         $(CC) $(CPPFLAGS) -DKCMD='$(KCMD)' -c -o $@ $<
>
> -monitor.o: $(MONITOR)
> -       $(CC) $(CPPFLAGS) -c -o $@ $<
> -
>  %.o: %.c
>         $(CC) $(CPPFLAGS) -O2 -ffreestanding -I. -Ilibfdt -c -o $@ $<
>
> diff --git a/boot.S b/boot.S
> index 22c9e7c..efac587 100644
> --- a/boot.S
> +++ b/boot.S
> @@ -13,20 +13,30 @@
>         .text
>
>  .macro enter_hyp
> -       @ We can't call hvc from secure mode, so drop down first.
> -       mov     r7, #0xffffffff
> -       smc     #0                              @ Change to NS-mode
> -
> -       @ This is how we enter hyp mode, for booting the next stage.
> +       @ We assume we're entered in Secure Supervisor mode. To
> +       @ get to Hyp mode we have to pass through Monitor mode
> +       @ and NS-Supervisor mode. Note that there is no way to
> +       @ return to the Secure world once we've done this.
> +       @
> +       @ This will trash r10 and r11.
> +       ldr     r10, =vectors
> +       mcr     p15, 0, r10, c12, c0, 1         @ Monitor vector base address
> +       @ Switch to monitor mode, which will set up the HVBAR and
> +       @ then return to us in NS-SVC
> +       smc     #0
> +       @ Now we're in NS-SVC, make a Hyp call to get into Hyp mode
>         hvc     #0
> +       @ We will end up here in NS-Hyp.
>  .endm
>
>  .align 5
> -/* Once we get rid of monitor.S, use these smc vectors too! */
> -hyp_vectors:
> +/* We use the same vector table for Hyp and Monitor mode, since
> + * we will only use each once and they don't overlap.
> + */
> +vectors:
>         .word 0 /* reset */
>         .word 0 /* undef */
> -       .word 0 /* svc */
> +       b       2f /* smc */
>         .word 0 /* pabt */
>         .word 0 /* dabt */
>         b       1f
> @@ -37,6 +47,28 @@ hyp_vectors:
>  1:     mrs     lr, elr_hyp
>         mov     pc, lr
>
> +/* In monitor mode, set up HVBAR and SCR then return to caller in NS-SVC. */
> +2:
> +       @ Set up HVBAR
> +       mrc     p15, 0, r10, c1, c1, 0          @ SCR
> +       @ Set SCR.NS=1 (needed for setting HVBAR and also returning to NS state)
> +       @        .IRQ,FIQ,EA=0 (don't take aborts/exceptions to Monitor mode)
> +       @        .FW,AW=1 (CPSR.A,F modifiable in NS state)
> +       @        .nET=0 (early termination OK)
> +       @        .SCD=1 (SMC in NS mode is UNDEF, so accidental SMCs don't
> +       @                cause us to leap back into this code confusingly)
> +       @        .HCE=1 (HVC does Hyp call)
> +       bic     r10, r10, #0x07f
> +       ldr     r11, =0x1b1
> +       orr     r10, r10, r11
> +       mcr     p15, 0, r11, c1, c1, 0
> +       isb
> +       ldr     r11, =vectors
> +       mcr     p15, 4, r11, c12, c0, 0         @ set HVBAR
> +       @ ...and return to calling code in NS state
> +       movs    pc, lr
> +
> +
>         .globl  start
>  start:
>  #ifdef SMP
> @@ -87,15 +119,6 @@ start:
>         orr     r0, r0, r1
>         mcr     p15, 0, r0, c1, c1, 2
>
> -       @ Leave monitor.S trap in place for the transition...
> -       mov     r0, #0xf0000000
> -       mcr     p15, 0, r0, c12, c0, 1          @ Monitor vector base address
> -
> -       @ Set up hvbar so hvc comes back here.
> -       ldr     r0, =hyp_vectors
> -       mov     r7, #0xfffffff0
> -       smc     #0                              @ Set HVBAR
> -
>         @ Check CPU nr again
>         mrc     p15, 0, r0, c0, c0, 5           @ MPIDR (ARMv7 only)
>         and     r0, r0, #15                     @ CPU number
> diff --git a/model.lds.S b/model.lds.S
> index 07fae8c..793df89 100644
> --- a/model.lds.S
> +++ b/model.lds.S
> @@ -47,8 +47,6 @@ SECTIONS
>
>
>   . = MON_OFFSET;
> - .monitor : { monitor.o }
> -
>   /* Put most of the actual boot loader code up in high memory
>    * where it won't get overwritten by kernel, initrd or atags.
>    */
> diff --git a/monitor.S b/monitor.S
> deleted file mode 100644
> index dea8551..0000000
> --- a/monitor.S
> +++ /dev/null
> @@ -1,95 +0,0 @@
> -/*
> - * monitor.S - simple monitor code to switch to NS state before executing kernel
> - *
> - * Copyright (C) 2011 Columbia University. All rights reserved.
> - *                   Christoffer Dall <cdall@xxxxxxxxxxxxxxx>
> - *
> - * Use of this source code is governed by a BSD-style license that can be
> - * found in the LICENSE.txt file.
> - */
> -
> -#.syntax       unified
> -       .section monitor, "x"
> -
> -       .word 0
> -       .word 0
> -       b       1f
> -       .word 0
> -       .word 0
> -       .word 0
> -       .word 0
> -       .word 0
> -
> -       @
> -       @ Secure Monitor Call
> -       @
> -1:
> -       ldr     sp, =_monitor_stack
> -       push    {r10-r12}
> -
> -       cmp     r7, #0xffffffff
> -       beq     _non_sec
> -
> -       @ Check smc number and VMID
> -       bic     r12, r7, #0xf
> -       cmp     r12, #0xfffffff0
> -       movnes  pc, lr
> -       and     r12, r7, #0xf
> -       cmp     r12, #0x0
> -       popgt   {r10-r12}
> -       movgts  pc, lr
> -
> -       @ Check the VMID is 0
> -       mrc     p15, 0, r10, c1, c1, 0          @ SCR
> -       orr     r11, r10, #1                    @ SCR.NS = 1
> -       mcr     p15, 0, r11, c1, c1, 0
> -       isb
> -       mrrc    p15, 6, r12, r11, c2
> -       mcr     p15, 0, r10, c1, c1, 0          @ Restore SCR
> -       lsr     r11, r11, #16
> -       and     r11, r11, #0xff
> -       cmp     r11, #0
> -       popne   {r10-r12}
> -       movnes  pc, lr
> -
> -       @ Jump to the right function
> -       and     r12, r7, #0xf
> -       adr     r11, _hyp_funcs
> -       add     r11, r11, r12, lsl #2
> -       ldr     pc, [r11]
> -
> -       @
> -       @ Jump table for the SMC hypervisor API calls
> -       @
> -_hyp_funcs:
> -       .long   _write_hvbar
> -
> -       @
> -       @ Switch to non-secure mode
> -       @
> -_non_sec:
> -       mrc     p15, 0, r12, c1, c1, 0          @ Secure configuration register
> -       bic     r12, r12, #0x07f
> -       ldr     r11, =0x131
> -       orr     r12, r12, r11
> -       mcr     p15, 0, r12, c1, c1, 0
> -       pop     {r10-r12}
> -       movs    pc, lr
> -
> -       @
> -       @ Read/Write HVBAR
> -       @
> -_write_hvbar:
> -       orr     r11, r10, #1                    @ SCR.NS = 1 (r10 already = SCR)
> -       mcr     p15, 0, r11, c1, c1, 0
> -       isb
> -       mcr     p15, 4, r0, c12, c0, 0
> -       mcr     p15, 0, r10, c1, c1, 0          @ Restore SCR
> -       pop     {r10-r12}
> -       movs    pc, lr
> -
> -       .ltorg
> -
> -       /* A bit of stack space for monitor mode */
> -       .align  12
> -_monitor_stack:
> --
> 1.7.9.5
>
looks good to me.

-Christoffer
_______________________________________________
kvmarm mailing list
kvmarm@xxxxxxxxxxxxxxxxxxxxx
https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm


[Index of Archives]     [Linux KVM]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux