[PATCH] bootwrapper: Turn on CCI snoops when CCI exists

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

 



Turn on CCI snoops. Data abort exception is captured and handled
for implementations where CCI is not integrated.

Signed-off-by: Guodong Xu <guodong.xu@xxxxxxxxxx>
---
 Makefile    |    6 +++++-
 boot.S      |   41 ++++++++++++++++++++++++++++++++++++++---
 model.lds.S |    4 ++++
 secure.S    |   28 ++++++++++++++++++++++++++++
 4 files changed, 75 insertions(+), 4 deletions(-)
 create mode 100644 secure.S

diff --git a/Makefile b/Makefile
index 995fd8f..f3cdee3 100644
--- a/Makefile
+++ b/Makefile
@@ -15,9 +15,10 @@ 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
+SECURE 		= secure.S
 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 monitor.o secure.o semihosting.o string.o semi_loader.o $(LIBFDTOBJS)
 KERNEL		= uImage
 
 IMAGE		= linux-system.axf
@@ -53,6 +54,9 @@ $(SEMIIMG): $(OBJS) modelsemi.lds
 boot.o: $(BOOTLOADER)
 	$(CC) $(CPPFLAGS) -DKCMD='$(KCMD)' -c -o $@ $<
 
+secure.o: $(SECURE)
+	$(CC) $(CPPFLAGS) -c -o $@ $<
+
 monitor.o: $(MONITOR)
 	$(CC) $(CPPFLAGS) -c -o $@ $<
 
diff --git a/boot.S b/boot.S
index 61cd93f..a5f3f20 100644
--- a/boot.S
+++ b/boot.S
@@ -67,14 +67,49 @@ start:
 	mov	r0, #0xf0000000
 	mcr	p15, 0, r0, c12, c0, 1		@ Monitor vector base address
 
-	@ Set up hvbar so hvc comes back here.
+	@ Load secure.S, Secure Vector Table
+	add	r0, r0, #0x4000			@ SEC_OFFSET
+	mcr	p15, 0, r0, c12, c0, 0		@ VBR Secure vector base address
+
+	@ Check CPU nr again
+	mrc	p15, 0, r0, c0, c0, 5		@ MPIDR (ARMv7 only)
+	bfc	r0, #24, #8                     @ CPU number and cluster
+	cmp	r0, #0				@ primary CPU?
+	bne	4f
+
+	@ primary CPU
+
+	@
+	@ Turn on CCI snoops
+	@
+	ldr     r4, =0x2c090000
+	ldr     r3, [r4, #0xc]          @ status reg
+	@
+	@ If CCI doesn't exist, access to it can cause data abort exception.
+	@ Data abort handling routine marks r4
+	@
+	nop
+	nop
+	cmp 	r4, #0xba
+	beq	4f			@ no CCI, skip
+
+	mov     r3, #3
+	mov     r5, #0x4000             @ A15
+	str     r3, [r4, r5]
+	mov     r5, #0x5000             @ A7
+	str     r3, [r4, r5]
+3:	ldr     r3, [r4, #0xc]          @ status reg
+	tst     r3, #1
+	bne     3b
+
+4:	@ 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 
+	smc	#0				@ Change to NS-mode
 
 	@ This is how we enter hyp mode, for booting the next stage.
 	hvc	#0
@@ -93,7 +128,7 @@ vectors:
 into_hyp_mode:
 	@ Check CPU nr again
 	mrc	p15, 0, r0, c0, c0, 5		@ MPIDR (ARMv7 only)
-	and	r0, r0, #15			@ CPU number
+	bfc	r0, #24, #8                     @ CPU number and cluster
 	cmp	r0, #0				@ primary CPU?
 	beq	2f
 
diff --git a/model.lds.S b/model.lds.S
index 07fae8c..aa7d3b8 100644
--- a/model.lds.S
+++ b/model.lds.S
@@ -22,6 +22,7 @@ INPUT(./uImage)
 
 PHYS_OFFSET = 0x80000000;
 MON_OFFSET  = 0xf0000000;
+SEC_OFFSET  = 0xf0004000;
 STACKTOP = 0xff000000;
 
 
@@ -49,6 +50,9 @@ SECTIONS
  . = MON_OFFSET;
  .monitor : { monitor.o }
 
+ . = SEC_OFFSET;
+ .secure : { secure.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/secure.S b/secure.S
new file mode 100644
index 0000000..681e212
--- /dev/null
+++ b/secure.S
@@ -0,0 +1,28 @@
+/*
+ * secure.S - simple monitor code to switch to NS state before executing kernel
+ *
+ * Copyright (C) 2012 Linaro - http://www.linaro.org. All rights reserved.
+ * 		      Guodong Xu <guodong.xu@xxxxxxxxxx>
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE.txt file.
+ */
+
+#.syntax	unified
+	.section secure, "x"
+
+	.word 0 /* reset */
+	.word 0 /* undefined instruction */
+	.word 0 /* supervisor call */
+	.word 0 /* prefetch abort */
+	b	1f /* data abort */
+	.word 0 /* not useed */
+	.word 0 /* IRQ */
+	.word 0 /* FIQ */
+
+1:	@
+	@ data abort handling
+	@
+	/* do nothing, just return */
+	mov 	r4, #0xba		@ mark r4
+	subs 	pc, lr, #0		@ return where from
-- 
1.7.4.1

_______________________________________________
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