[linux-yocto] [PATCH 07/69] arch/arm/boot/fmboot: adding support for Fast Models
Paul Butler
butler.paul at gmail.com
Fri Jun 14 18:00:44 PDT 2013
Adding simple register setup assembly code and linker script
to add a kernel prefix needed for booting kernel in the
ARM Fast Models simulation environment.
Signed-off-by: Paul Butler <paul.butler at windriver.com>
---
arch/arm/boot/fmboot/Makefile | 25 +++++++++++++
arch/arm/boot/fmboot/fmboot.S | 80 +++++++++++++++++++++++++++++++++++++++++
arch/arm/boot/fmboot/fmboot.lds | 30 ++++++++++++++++
arch/arm/boot/fmboot/pack.py | 10 ++++++
4 files changed, 145 insertions(+)
create mode 100644 arch/arm/boot/fmboot/Makefile
create mode 100644 arch/arm/boot/fmboot/fmboot.S
create mode 100644 arch/arm/boot/fmboot/fmboot.lds
create mode 100644 arch/arm/boot/fmboot/pack.py
diff --git a/arch/arm/boot/fmboot/Makefile b/arch/arm/boot/fmboot/Makefile
new file mode 100644
index 0000000..9b2b42e
--- /dev/null
+++ b/arch/arm/boot/fmboot/Makefile
@@ -0,0 +1,25 @@
+# Build an image for Fast Models
+
+AS = $(CROSS_COMPILE)gcc -c
+LD = $(CROSS_COMPILE)ld
+
+DTC = ../../../../scripts/dtc/dtc
+DTS = ../dts/axm-sim.dts
+ZIMAGE = ../zImage
+
+all: clean linux.fm
+
+clean:
+ rm -f linux.fm fmboot.o zImage.fm axm-sim.dtb
+
+linux.fm: fmboot.o fmboot.lds zImage.fm
+ $(LD) -o $@ --script=fmboot.lds
+
+zImage.fm: $(ZIMAGE) axm-sim.dtb
+ python pack.py $(ZIMAGE) axm-sim.dtb > $@
+
+axm-sim.dtb: $(DTS)
+ $(DTC) -O dtb -o $@ $<
+
+fmboot.o: fmboot.S
+ $(AS) -o $@ $<
diff --git a/arch/arm/boot/fmboot/fmboot.S b/arch/arm/boot/fmboot/fmboot.S
new file mode 100644
index 0000000..cd52371
--- /dev/null
+++ b/arch/arm/boot/fmboot/fmboot.S
@@ -0,0 +1,80 @@
+/*
+ * boot.S - simple register setup code for stand-alone Linux booting
+ *
+ * Copyright (C) 2011 ARM Limited. All rights reserved.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE.txt file.
+ */
+
+#define SPIN_TABLE_BASE 0x10000000
+
+ .syntax unified
+ .text
+
+ .globl _start
+_start:
+ @
+ @ Program architected timer frequency
+ @
+ mrc p15, 0, r0, c0, c1, 1 @ CPUID_EXT_PFR1
+ lsr r0, r0, #16
+ ands r0, r0, #1 @ Check generic timer support
+ beq 1f
+ ldr r0, =100000000 @ 100MHz timer frequency
+ mcr p15, 0, r0, c14, c0, 0 @ CNTFRQ
+1:
+ @
+ @ CPU initialisation
+ @
+ mrc p15, 0, r0, c0, c0, 5 @ MPIDR (ARMv7 only)
+ and r0, r0, #15 @ CPU number
+ cmp r0, #0 @ primary CPU?
+ beq 2f
+
+ @
+ @ Secondary CPUs
+ @
+ ldr r1, =SPIN_TABLE_BASE
+ adr r2, 1f
+ ldmia r2, {r3 - r7} @ move the code to a location
+ stmia r1, {r3 - r7} @ less likely to be overridden
+ add r0, r1, #0x20 @ Entry point for secondary
+ @ CPUs @ SPIN_TABLE_BASE+0x20
+ mov r2, #0
+ str r2, [r0, #0] @ ensure initially zero
+ mov pc, r1 @ branch to the relocated code
+1:
+ wfe
+ ldr r1, [r0]
+ cmp r1, #0
+ beq 1b
+ mov pc, r1 @ branch to the given address
+
+ @
+ @ Kernel parameters
+ @
+2: mov r0, #0 @ Must be zero
+ mov r1, #0 @ Machine type (not needed)
+ adr r2, atags @ ATAGS pointer
+ mov r3, #0
+ ldr lr, =kernel
+ mov pc, lr @ jump to the kernel
+
+ .org 0x100
+atags:
+ @ ATAG_CORE
+ .long 2
+ .long 0x54410001
+
+ @ ATAG_CMDLINE
+ .long (1f - .) >> 2
+ .long 0x54410009
+ .asciz "root=/dev/mmcblk0 rootwait ip=none mem=1024M console=ttyAMA0"
+
+ .align 2
+1:
+
+ @ ATAG_NONE
+ .long 0
+ .long 0x00000000
diff --git a/arch/arm/boot/fmboot/fmboot.lds b/arch/arm/boot/fmboot/fmboot.lds
new file mode 100644
index 0000000..8cde9f8
--- /dev/null
+++ b/arch/arm/boot/fmboot/fmboot.lds
@@ -0,0 +1,30 @@
+/*
+ * fmboot.lds
+ *
+ * Copyright (C) 2011 ARM Limited. All rights reserved.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE.txt file.
+ */
+
+OUTPUT_FORMAT("elf32-littlearm")
+OUTPUT_ARCH(arm)
+TARGET(binary)
+
+INPUT(./fmboot.o)
+INPUT(./zImage.fm)
+
+PHYS_OFFSET = 0x00000000;
+
+SECTIONS
+{
+ . = PHYS_OFFSET;
+ .text : { fmboot.o }
+ . = PHYS_OFFSET + 0x8000 - 0x0;
+ kernel = . + 0x0;
+ .kernel : { ./zImage.fm }
+ . = PHYS_OFFSET + 0x00800000;
+ filesystem = .;
+ .data : { *(.data) }
+ .bss : { *(.bss) }
+}
diff --git a/arch/arm/boot/fmboot/pack.py b/arch/arm/boot/fmboot/pack.py
new file mode 100644
index 0000000..fe2ce70
--- /dev/null
+++ b/arch/arm/boot/fmboot/pack.py
@@ -0,0 +1,10 @@
+import sys
+
+while len(sys.argv) > 1:
+ f = open(sys.argv.pop(1), "rb")
+ f.seek(0, 2)
+ sz = f.tell()
+ f.seek(0,0)
+ pad = ((sz + 3) & ~3) - sz
+ sys.stdout.write(f.read() + '\0'*pad)
+ f.close()
--
1.8.3
More information about the linux-yocto
mailing list