From patchwork Wed Feb 22 22:52:50 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rusty Russell X-Patchwork-Id: 6891 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id 2FBF523EA8 for ; Wed, 22 Feb 2012 22:53:41 +0000 (UTC) Received: from mail-iy0-f180.google.com (mail-iy0-f180.google.com [209.85.210.180]) by fiordland.canonical.com (Postfix) with ESMTP id C5DB0A1875D for ; Wed, 22 Feb 2012 22:53:40 +0000 (UTC) Received: by iabz7 with SMTP id z7so956892iab.11 for ; Wed, 22 Feb 2012 14:53:40 -0800 (PST) Received: from mr.google.com ([10.43.52.74]) by 10.43.52.74 with SMTP id vl10mr34758672icb.55.1329951220278 (num_hops = 1); Wed, 22 Feb 2012 14:53:40 -0800 (PST) Received: by 10.43.52.74 with SMTP id vl10mr27942037icb.55.1329951220057; Wed, 22 Feb 2012 14:53:40 -0800 (PST) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.231.11.10 with SMTP id r10csp147322ibr; Wed, 22 Feb 2012 14:53:39 -0800 (PST) Received: by 10.68.219.98 with SMTP id pn2mr5491663pbc.161.1329951218335; Wed, 22 Feb 2012 14:53:38 -0800 (PST) Received: from ozlabs.org (ozlabs.org. [203.10.76.45]) by mx.google.com with ESMTPS id j8si30644803pbk.338.2012.02.22.14.53.37 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 22 Feb 2012 14:53:38 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of rusty@ozlabs.org designates 203.10.76.45 as permitted sender) client-ip=203.10.76.45; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of rusty@ozlabs.org designates 203.10.76.45 as permitted sender) smtp.mail=rusty@ozlabs.org Received: by ozlabs.org (Postfix, from userid 1011) id 496BAB6FA8; Thu, 23 Feb 2012 09:53:35 +1100 (EST) From: Rusty Russell To: Dave Martin Cc: Peter Maydell , patches@linaro.org, Marc Zyngier Subject: Re: [PULL] boot-wrappe: boot kernel in Hyp mode In-Reply-To: References: <1329330098-31636-1-git-send-email-dave.martin@linaro.org> <1329330098-31636-2-git-send-email-dave.martin@linaro.org> <87boou8l7g.fsf@rustcorp.com.au> <874nuk7rmf.fsf@rustcorp.com.au> <20120221091923.GA2488@linaro.org> <87hayj616t.fsf@rustcorp.com.au> User-Agent: Notmuch/0.6.1-1 (http://notmuchmail.org) Emacs/23.3.1 (i686-pc-linux-gnu) Date: Thu, 23 Feb 2012 09:22:50 +1030 Message-ID: <877gze5vlp.fsf@rustcorp.com.au> MIME-Version: 1.0 X-Gm-Message-State: ALoCoQmWhnGHPBpbOoJNw23ch+cW4YKTWTY7G1rC1jkuoAgdZsUBGdrEgqXE+sduwdgo3xwgtTTq On Wed, 22 Feb 2012 09:14:42 +0000, Dave Martin wrote: > > So I think this is needed for the moment? > > I should have clarified -- the compiler doesn't understand that > option. (For 'hyp', did you mean 'hvc'?) Oops. Yeah, that works. OK, final result is below, and pushed to github again: The following changes since commit 14dcbbd384abc25d475fd2021db3007a22383e46: boot-wrapper: Support reading kernel/initrd via semihosting (2012-02-05 13:07:07 -0500) are available in the git repository at: git://github.com/rustyrussell/boot-wrapper.git rusty-wip Rusty Russell (1): Boot kernel in hyp mode. boot.S | 26 ++++++++++++++++++++++++-- config-default.mk | 3 ++- monitor.S | 19 ++++++++++++++----- 3 files changed, 40 insertions(+), 8 deletions(-) Thanks, Rusty. diff --git a/boot.S b/boot.S index cf8bdb0..ef444dc 100644 --- a/boot.S +++ b/boot.S @@ -104,12 +104,34 @@ _start: orr r0, r0, r1 mcr p15, 0, r0, c1, c1, 2 - @ Change to NS-mode + @ 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, =vectors + mov r7, #0xfffffff0 + smc #0 @ Set HVBAR + + @ 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. + hvc #0 + +/* Once we get rid of monitor.S, use these smc vectors too! */ +vectors: + .word 0 /* reset */ + .word 0 /* undef */ + .word 0 /* svc */ + .word 0 /* pabt */ + .word 0 /* dabt */ + b into_hyp_mode /* hvc */ + .word 0 /* irq */ + .word 0 /* fiq */ + +into_hyp_mode: @ Check CPU nr again mrc p15, 0, r0, c0, c0, 5 @ MPIDR (ARMv7 only) and r0, r0, #15 @ CPU number @@ -485,7 +507,7 @@ sh_cmdline: @ Semihosting command line will be written here #else /* not SEMIHOSTING */ - .org 0x100 + .org 0x200 @ Static ATAGS for when kernel/etc are compiled into the ELF file atags: @ ATAG_CORE diff --git a/config-default.mk b/config-default.mk index 6c73934..8786c62 100644 --- a/config-default.mk +++ b/config-default.mk @@ -84,7 +84,8 @@ endif # SYSTEM = realvire_eb ifeq ($(SYSTEM),vexpress) CPPFLAGS += -DSMP -CPPFLAGS += -march=armv7-a -marm +# GAS needs armv7-a+virt to understand 'hvc'. +CPPFLAGS += -march=armv7-a -Wa,-march=armv7-a+virt -marm #CPPFLAGS += -DTHUMB2_KERNEL CPPFLAGS += -DVEXPRESS diff --git a/monitor.S b/monitor.S index 052ab1e..dea8551 100644 --- a/monitor.S +++ b/monitor.S @@ -25,7 +25,7 @@ @ 1: ldr sp, =_monitor_stack - push {r11, r12} + push {r10-r12} cmp r7, #0xffffffff beq _non_sec @@ -36,15 +36,20 @@ movnes pc, lr and r12, r7, #0xf cmp r12, #0x0 - popgt {r11, r12} + 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 {r11, r12} + popne {r10-r12} movnes pc, lr @ Jump to the right function @@ -68,15 +73,19 @@ _non_sec: ldr r11, =0x131 orr r12, r12, r11 mcr p15, 0, r12, c1, c1, 0 - pop {r11, r12} + 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 - pop {r11, r12} + mcr p15, 0, r10, c1, c1, 0 @ Restore SCR + pop {r10-r12} movs pc, lr .ltorg