From owner-svn-soc-all@FreeBSD.ORG Mon Jun 15 19:51:37 2015 Return-Path: Delivered-To: svn-soc-all@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 526EE424 for ; Mon, 15 Jun 2015 19:51:37 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 3F18F62D for ; Mon, 15 Jun 2015 19:51:37 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.14.9/8.14.9) with ESMTP id t5FJpb5i074560 for ; Mon, 15 Jun 2015 19:51:37 GMT (envelope-from mihai@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.14.9/8.14.9/Submit) id t5FJpWAE074039 for svn-soc-all@FreeBSD.org; Mon, 15 Jun 2015 19:51:32 GMT (envelope-from mihai@FreeBSD.org) Date: Mon, 15 Jun 2015 19:51:32 GMT Message-Id: <201506151951.t5FJpWAE074039@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to mihai@FreeBSD.org using -f From: mihai@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r287130 - in soc2015/mihai/boot-wrapper: . libfdt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 15 Jun 2015 19:51:37 -0000 Author: mihai Date: Mon Jun 15 19:51:31 2015 New Revision: 287130 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=287130 Log: soc2015: mihai: add boot-wrapper for fast-models Added: soc2015/mihai/boot-wrapper/ (props changed) soc2015/mihai/boot-wrapper/LICENSE.txt soc2015/mihai/boot-wrapper/Makefile soc2015/mihai/boot-wrapper/README.txt soc2015/mihai/boot-wrapper/boot.S soc2015/mihai/boot-wrapper/build_freebsd.sh (contents, props changed) soc2015/mihai/boot-wrapper/c_start.c soc2015/mihai/boot-wrapper/config-default.mk soc2015/mihai/boot-wrapper/libfdt/ (props changed) soc2015/mihai/boot-wrapper/libfdt/Makefile.libfdt soc2015/mihai/boot-wrapper/libfdt/fdt.c soc2015/mihai/boot-wrapper/libfdt/fdt.h soc2015/mihai/boot-wrapper/libfdt/fdt_ro.c soc2015/mihai/boot-wrapper/libfdt/fdt_rw.c soc2015/mihai/boot-wrapper/libfdt/fdt_strerror.c soc2015/mihai/boot-wrapper/libfdt/fdt_sw.c soc2015/mihai/boot-wrapper/libfdt/fdt_wip.c soc2015/mihai/boot-wrapper/libfdt/libfdt.h soc2015/mihai/boot-wrapper/libfdt/libfdt_env.h soc2015/mihai/boot-wrapper/libfdt/libfdt_internal.h soc2015/mihai/boot-wrapper/model.lds.S soc2015/mihai/boot-wrapper/semi_loader.c soc2015/mihai/boot-wrapper/semi_loader.h soc2015/mihai/boot-wrapper/semihosting.c soc2015/mihai/boot-wrapper/semihosting.h soc2015/mihai/boot-wrapper/string.c soc2015/mihai/boot-wrapper/string.h Added: soc2015/mihai/boot-wrapper/LICENSE.txt ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2015/mihai/boot-wrapper/LICENSE.txt Mon Jun 15 19:51:31 2015 (r287130) @@ -0,0 +1,28 @@ +Copyright (c) 2011, ARM Limited +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name of ARM nor the names of its contributors may be + used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Added: soc2015/mihai/boot-wrapper/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2015/mihai/boot-wrapper/Makefile Mon Jun 15 19:51:31 2015 (r287130) @@ -0,0 +1,78 @@ +# Makefile - build a kernel+filesystem image 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. + + +# Include config file (prefer config.mk, fall back to config-default.mk) +ifneq ($(wildcard config.mk),) +include config.mk +else +include config-default.mk +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 +BOOTLOADER = boot.S +OBJS = boot.o c_start.o semihosting.o string.o semi_loader.o $(LIBFDTOBJS) +KERNEL = uImage + +IMAGE = linux-system.axf +SEMIIMG = linux-system-semi.axf +LD_SCRIPT = model.lds.S + + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)ld + +# These are needed by the underlying kernel make +export CROSS_COMPILE ARCH + +# Build all wrappers +all: $(IMAGE) $(SEMIIMG) + +# Build just the semihosting wrapper +semi: $(SEMIIMG) + +clean distclean: + rm -f $(IMAGE) $(SEMIIMG) \ + model.lds modelsemi.lds $(OBJS) $(KERNEL) + +$(KERNEL): $(KERNEL_SRC)/arch/arm/boot/uImage + cp $< $@ + +$(IMAGE): $(OBJS) model.lds $(KERNEL) $(FILESYSTEM) Makefile + $(LD) -o $@ $(OBJS) --script=model.lds + +$(SEMIIMG): $(OBJS) modelsemi.lds + $(LD) -o $@ $(OBJS) --script=modelsemi.lds + +boot.o: $(BOOTLOADER) + $(CC) $(CPPFLAGS) -DKCMD='$(KCMD)' -c -o $@ $< + +%.o: %.c + $(CC) $(CPPFLAGS) -O2 -ffreestanding -I. -Ilibfdt -c -o $@ $< + +model.lds: $(LD_SCRIPT) Makefile + $(CC) $(CPPFLAGS) -E -P -C -o $@ $< + +modelsemi.lds: $(LD_SCRIPT) Makefile + $(CC) $(CPPFLAGS) -DSEMIHOSTING=1 -E -P -C -o $@ $< + +$(KERNEL_SRC)/arch/arm/boot/uImage: force + $(MAKE) -C $(KERNEL_SRC) -j4 uImage + +# Pass any target we don't know about through to the kernel makefile. +# This is a convenience rule so we can say 'make menuconfig' etc here. +# Note that any rules in this file must have a command or be marked as +# .PHONY. +%: force + $(MAKE) -C $(KERNEL_SRC) $@ + +force: ; + +Makefile: ; + +.PHONY: all semi clean distclean config.mk config-default.mk Added: soc2015/mihai/boot-wrapper/README.txt ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2015/mihai/boot-wrapper/README.txt Mon Jun 15 19:51:31 2015 (r287130) @@ -0,0 +1,74 @@ +boot-wrapper: Start Linux kernels under ARM Fast Models + +The boot-wrapper is a fairly simple implementation of a boot loader +intended to run under an ARM Fast Model and boot Linux. + +License +======= + +The boot-wrapper is generally under a 3 clause BSD license +(see LICENSE.txt for details). Note that some source files +are under similar but compatible licenses. In particular +libfdt is dual-license GPL/2-clause-BSD. + +Compilation +=========== + +The expected method of building is to cross-compile on an +x86 box. You'll need an ARM cross-compiler. On Ubuntu you +can get this by installing the packages: + gcc-4.6-arm-linux-gnueabi binutils-arm-linux-gnueabi + libc6-armel-cross linux-libc-dev-armel-cross gcc-arm-linux-gnueabi + libc6-dev-armel-cross cpp-arm-linux-gnueabi + +The boot-wrapper can be compiled in two ways: + (1) as a small standalone binary which uses the model's semihosting + ABI to load a kernel (and optionally initrd and flattened device tree) + when you run the model + (2) with a specific kernel and initrd compiled into the binary; + this is less flexible but may be useful in some situations + +For case (1) you can just run: + make CROSS_COMPILE=arm-linux-gnueabi- semi +which will build "linux-system-semi.axf". +(As with a Linux kernel cross-compile, the CROSS_COMPILE +variable is set to the prefix of the cross toolchain. +"arm-linux-gnueabi-" matches the prefix used by the Ubuntu +cross toolchain.) + +For case (2) you'll need a Linux kernel tree to hand; the +boot-wrapper makefile will automatically look into it to +extract the kernel. By default this tree is assumed to be in +"../linux-kvm-arm". Assuming you have that tree set up and +have built a kernel in it, you can run: + make CROSS_COMPILE=arm-linux-gnueabi- +which will build "linux-system.axf". + +You can configure the makefile system by copying config-default.mk +to config.mk and editing it. This is only likely to be useful for +case (2); see the comments in config-default.mk for more information. + +Running +======= + +To run a model with a linux-system-semi.axf: + +RTSM_VE_Cortex-A15x1 linux-system-semi.axf -C cluster.cpu0.semihosting-cmd_line="--kernel /path/to/zImage [--initrd /path/to/initrd] [--dtb /path/to/dtb] [-- kernel command line arguments]" + +The paths to the kernel, initrd and device tree blob should all be +host filesystem paths. The initrd and dtb are both optional. Any text +following '--' is passed to the kernel as its command line; this is +also optional. + +You may also want to pass other options to the model (for instance +to enable networking); these are not described here. See the Fast +Models documentation for more information. + +Running a linux-system.axf is the same, except that since all +the files are built in there's no need to pass a command line: + +RTSM_VE_Cortex-A15x1 linux-system.axf + +Passing a command line to linux-system.axf is allowed, and any +kernel/initrd/dtb/commandline specified will override the compiled-in +version. Added: soc2015/mihai/boot-wrapper/boot.S ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2015/mihai/boot-wrapper/boot.S Mon Jun 15 19:51:31 2015 (r287130) @@ -0,0 +1,216 @@ +/* + * 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. + */ + + .syntax unified + .arch_extension sec + .arch_extension virt + .text + +.macro enter_hyp + @ 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 +/* 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 */ + b 2f /* smc */ + .word 0 /* pabt */ + .word 0 /* dabt */ + b 1f + .word 0 /* irq */ + .word 0 /* fiq */ + +/* Return directly back to the caller without leaving Hyp mode: */ +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 +#ifdef VEXPRESS + @ + @ Program architected timer frequency + @ + mrc p15, 0, r0, c0, c1, 1 @ CPUID_EXT_PFR1 + lsr r0, r0, #16 + and r0, r0, #1 @ Check generic timer support + beq 1f + ldr r0, =24000000 @ 24MHz timer frequency + mcr p15, 0, r0, c14, c0, 0 @ CNTFRQ +1: +#endif + @ + @ CPU initialisation + @ + mrc p15, 0, r4, c0, c0, 5 @ MPIDR (ARMv7 only) + and r4, r4, #15 @ CPU number + + @ + @ Hypervisor / TrustZone initialization + @ + + @ Set all interrupts to be non-secure + ldr r0, =0x2c001000 @ Dist GIC base + ldr r1, [r0, #0x04] @ Type Register + cmp r4, #0 + andeq r1, r1, #0x1f + movne r1, #0 + add r2, r0, #0x080 @ Security Register 0 + mvn r3, #0 +2: str r3, [r2] + sub r1, r1, #1 + add r2, r2, #4 @ Next security register + cmp r1, #-1 + bne 2b + + @ Set GIC priority mask bit [7] = 1 + ldr r0, =0x2c002000 @ CPU GIC base + mov r1, #0x80 + str r1, [r0, #0x4] @ GIC ICCPMR + + @ Set NSACR to allow coprocessor access from non-secure + mrc p15, 0, r0, c1, c1, 2 + ldr r1, =0x43fff + orr r0, r0, r1 + mcr p15, 0, r0, c1, c1, 2 + + @ Check CPU nr again + mrc p15, 0, r0, c0, c0, 5 @ MPIDR (ARMv7 only) + bfc r0, #24, #8 @ CPU number, taking multicluster into account + cmp r0, #0 @ primary CPU? + beq 2f + + @ + @ Secondary CPUs (following the RealView SMP booting protocol) + @ + enter_hyp + + ldr r1, =fs_start - 0x100 + adr r2, 1f + ldmia r2, {r3 - r7} @ move the code to a location + stmia r1, {r3 - r7} @ less likely to be overridden +#ifdef VEXPRESS + ldr r0, =0x1c010030 @ VE SYS_FLAGS register +#else + ldr r0, =0x10000030 @ RealView SYS_FLAGS register +#endif + mov pc, r1 @ branch to the relocated code +1: +#ifdef VEXPRESS + wfe +#endif + ldr r1, [r0] + cmp r1, #0 + beq 1b + mov pc, r1 @ branch to the given address +#endif + +2: + @ + @ UART initialisation (38400 8N1) + @ +#ifdef MACH_MPS + ldr r0, =0x1f005000 @ UART3 base (MPS) +#elif defined (VEXPRESS) + ldr r0, =0x1c090000 @ UART base (Versatile Express) +#else + ldr r0, =0x10009000 @ UART base (RealView/EB) +#endif + mov r1, #0x10 @ ibrd + str r1, [r0, #0x24] + mov r1, #0xc300 + orr r1, #0x0001 @ cr + str r1, [r0, #0x30] + + @ Now we've got rid of the secondary CPUs, set up a stack + @ for CPU 0 so we can write most of this in C. + ldr sp, =stacktop + + @ And call the C entrypoint + bl c_start + @ Never reached +1: b 1b + + @ + @ Function for C code to make semihosting calls: + @ + .globl __semi_call +__semi_call: +#if defined(MACH_MPS) + @ M profile semihosting is via bpkt + bkpt 0xab +#elif defined(__thumb__) + @ Otherwise, different SVC numbers for ARM or Thumb mode + svc 0xab +#else + svc 0x123456 +#endif + mov pc, lr + +.globl __boot_kernel +__boot_kernel: + mov r4, r0 + stmfd sp!, {r1-r3} + ldmia sp, {r0-r3} + + enter_hyp + + bx r4 +.type __boot_kernel, %function + + @ + @ Data + @ + /* The kernel boot command line for builtin kernels is defined in the Make system */ + .globl kernel_cmd + .globl kernel_cmd_end +kernel_cmd: +#ifdef KCMD + .asciz KCMD +#endif +kernel_cmd_end: Added: soc2015/mihai/boot-wrapper/build_freebsd.sh ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2015/mihai/boot-wrapper/build_freebsd.sh Mon Jun 15 19:51:31 2015 (r287130) @@ -0,0 +1 @@ +gmake CROSS_COMPILE=arm-none-eabi- semi Added: soc2015/mihai/boot-wrapper/c_start.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2015/mihai/boot-wrapper/c_start.c Mon Jun 15 19:51:31 2015 (r287130) @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2012 Linaro Limited + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name of Linaro Limited nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + */ + +/* This file just contains a small glue function which fishes the + * location of kernel etc out of linker script defined symbols, and + * calls semi_loader functions to do the actual work of loading + * and booting the kernel. + */ + +#include +#include "semihosting.h" +#include "semi_loader.h" + +/* Linker script defined symbols for any preloaded kernel/initrd */ +extern uint8_t fs_start, fs_end, kernel_entry, kernel_start, kernel_end; +/* Symbols defined by boot.S */ +extern uint8_t kernel_cmd, kernel_cmd_end; + +static struct loader_info loader; + +#ifdef MACH_MPS +#define PLAT_ID 10000 /* MPS (temporary) */ +#elif defined (VEXPRESS) +#define PLAT_ID 2272 /* Versatile Express */ +#else +#define PLAT_ID 827 /* RealView/EB */ +#endif + +void c_start(void) +{ + /* Main C entry point */ + loader.kernel_size = (uint32_t)&kernel_end - (uint32_t)&kernel_start; + loader.initrd_start = (uint32_t)&fs_start; + loader.initrd_size = (uint32_t)&fs_end - (uint32_t)&fs_start; + loader.kernel_entry = (uint32_t)&kernel_entry; + if (loader.kernel_size) { + loader.cmdline_start = (uint32_t)&kernel_cmd; + loader.cmdline_size = &kernel_cmd_end - &kernel_cmd; + } + load_kernel(&loader); + + /* Start the kernel */ + if(loader.fdt_start) { + boot_kernel(&loader, 0, -1, loader.fdt_start, 0); + } else { + boot_kernel(&loader, 0, PLAT_ID, loader.atags_start, 0); + } + + semi_write0("[bootwrapper] ERROR: returned from boot_kernel\n"); +} Added: soc2015/mihai/boot-wrapper/config-default.mk ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2015/mihai/boot-wrapper/config-default.mk Mon Jun 15 19:51:31 2015 (r287130) @@ -0,0 +1,100 @@ +# Configuration file included in Makefile +# +# Copyright (C) 2011 Columbia University. All rights reserved. +# Christoffer Dall +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE.txt file. +# +# This is a sample configuration file. To make changes, copy this file to +# config.mk and modify that file. +# +# For all systems you can override USE_INITRD and KCMD from the command-line. +# + +########################################################################### +# Main options +# +CROSS_COMPILE ?= arm-unknown-eabi- +ARCH ?= arm +KERNEL_SRC ?= ../linux-kvm-arm + +# Select system: +# mps: MPS (Cortex-M3) +# realview_eb: RealViewPB, EB, etc. +# vexpress: Versatile Express +SYSTEM ?= vexpress + +########################################################################### +# Turn this on to use an initrd whose contents are in filesystem.cpio.gz +USE_INITRD ?= no +ifeq ($(USE_INITRD),yes) +CPPFLAGS += -DUSE_INITRD +FILESYSTEM ?= filesystem.cpio.gz +else +FILESYSTEM = +endif + +########################################################################### +# Default NFS root +NFS_ROOT ?= /srv/nfsroot +ifeq ($(origin NFS_SERVER), undefined) +NFS_SERVER := $(shell ip addr show scope global | \ + sed -ne '/inet/{s/ *inet \([^/]*\)\/.*/\1/p;q}') +endif + + +########################################################################### +# MPS (Cortex-M3) definitions +# +ifeq ($(SYSTEM),mps) +# C-flags +CPPFLAGS += -DMACH_MPS -DTHUMB2_KERNEL +CPPFLAGS += -march=armv7-m +CPPFLAGS += -mthumb -Wa,-mthumb -Wa,-mimplicit-it=always + +# Kernel command line +KCMD ?= "rdinit=/bin/sh console=ttyAMA3 mem=4M earlyprintk" +endif # SYSTEM = mps + + +########################################################################### +# EB, RealviewPB, etc +# +ifeq ($(SYSTEM),realview_eb) + +CPPFLAGS += -DSMP +CPPFLAGS += -march=armv7-a -marm +#CPPFLAGS += -DTHUMB2_KERNEL + +# Default kernel command line, using initrd: +ifeq ($(USE_INITRD),yes) + KCMD ?= "console=ttyAMA0 mem=256M earlyprintk" +endif +# +# Default kernel command line, without initrd: +ifneq ($(USE_INITRD),yes) + KCMD ?= "root=/dev/nfs nfsroot=$(NFS_HOST):$(NFS_ROOT) ip=dhcp console=ttyAMA0 mem=256M earlyprintk" +endif +endif # SYSTEM = realvire_eb + + +########################################################################### +# Versatile Express +# +ifeq ($(SYSTEM),vexpress) + +CPPFLAGS += -DSMP +CPPFLAGS += -march=armv7-a -marm +#CPPFLAGS += -DTHUMB2_KERNEL +CPPFLAGS += -DVEXPRESS + +# Default kernel command line, using initrd: +ifeq ($(USE_INITRD),yes) + KCMD ?= "console=ttyAMA0 mem=512M mem=512M@0x880000000 earlyprintk ip=dhcp" +endif +# +# Default kernel command line, without initrd: +ifneq ($(USE_INITRD),yes) + KCMD ?= "console=ttyAMA0 mem=512M mem=512M@0x880000000 earlyprintk root=/dev/nfs nfsroot=$(NFS_SERVER):$(NFS_ROOT),tcp rw ip=dhcp nfsrootdebug" +endif +endif # SYSTEM = vexpress Added: soc2015/mihai/boot-wrapper/libfdt/Makefile.libfdt ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2015/mihai/boot-wrapper/libfdt/Makefile.libfdt Mon Jun 15 19:51:31 2015 (r287130) @@ -0,0 +1,24 @@ +# Makefile.libfdt +# +# This is not a complete Makefile of itself. Instead, it is designed to +# be easily embeddable into other systems of Makefiles. +# +-include $(d)/*.d + +LIBFDT_CPPFLAGS += -I$(d) +LIBFDT_OBJS := \ + $(d)/fdt.o \ + $(d)/fdt_ro.o \ + $(d)/fdt_wip.o \ + $(d)/fdt_sw.o \ + $(d)/fdt_rw.o \ + $(d)/fdt_strerror.o + +CLEAN_SUBDIRS += $(d) + +OBJS-libfdt.a = $(LIBFDT_OBJS) +libfdt.a: $(OBJS-libfdt.a) + +$(d)/%.o: $(d)/%.c + @echo " CC[LIB] $<" + $(Q)$(CC) $(LIBFDT_CPPFLAGS) $(CPPFLAGS) $(CFLAGS) -o $@ -c $< Added: soc2015/mihai/boot-wrapper/libfdt/fdt.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2015/mihai/boot-wrapper/libfdt/fdt.c Mon Jun 15 19:51:31 2015 (r287130) @@ -0,0 +1,201 @@ +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + * + * libfdt is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * + * a) This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * Alternatively, + * + * b) Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * 1. Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "libfdt_env.h" + +#include +#include + +#include "libfdt_internal.h" + +int fdt_check_header(const void *fdt) +{ + if (fdt_magic(fdt) == FDT_MAGIC) { + /* Complete tree */ + if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION) + return -FDT_ERR_BADVERSION; + if (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION) + return -FDT_ERR_BADVERSION; + } else if (fdt_magic(fdt) == FDT_SW_MAGIC) { + /* Unfinished sequential-write blob */ + if (fdt_size_dt_struct(fdt) == 0) + return -FDT_ERR_BADSTATE; + } else { + return -FDT_ERR_BADMAGIC; + } + + return 0; +} + +const void *fdt_offset_ptr(const void *fdt, int offset, int len) +{ + const char *p; + + if (fdt_version(fdt) >= 0x11) + if (((offset + len) < offset) + || ((offset + len) > fdt_size_dt_struct(fdt))) + return NULL; + + p = _fdt_offset_ptr(fdt, offset); + + if (p + len < p) + return NULL; + return p; +} + +uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset) +{ + const uint32_t *tagp, *lenp; + uint32_t tag; + const char *p; + + if (offset % FDT_TAGSIZE) + return -1; + + tagp = fdt_offset_ptr(fdt, offset, FDT_TAGSIZE); + if (! tagp) + return FDT_END; /* premature end */ + tag = fdt32_to_cpu(*tagp); + offset += FDT_TAGSIZE; + + switch (tag) { + case FDT_BEGIN_NODE: + /* skip name */ + do { + p = fdt_offset_ptr(fdt, offset++, 1); + } while (p && (*p != '\0')); + if (! p) + return FDT_END; + break; + case FDT_PROP: + lenp = fdt_offset_ptr(fdt, offset, sizeof(*lenp)); + if (! lenp) + return FDT_END; + /* skip name offset, length and value */ + offset += 2*FDT_TAGSIZE + fdt32_to_cpu(*lenp); + break; + } + + if (nextoffset) + *nextoffset = FDT_TAGALIGN(offset); + + return tag; +} + +int _fdt_check_node_offset(const void *fdt, int offset) +{ + if ((offset < 0) || (offset % FDT_TAGSIZE) + || (fdt_next_tag(fdt, offset, &offset) != FDT_BEGIN_NODE)) + return -FDT_ERR_BADOFFSET; + + return offset; +} + +int fdt_next_node(const void *fdt, int offset, int *depth) +{ + int nextoffset = 0; + uint32_t tag; + + if (offset >= 0) + if ((nextoffset = _fdt_check_node_offset(fdt, offset)) < 0) + return nextoffset; + + do { + offset = nextoffset; + tag = fdt_next_tag(fdt, offset, &nextoffset); + + switch (tag) { + case FDT_PROP: + case FDT_NOP: + break; + + case FDT_BEGIN_NODE: + if (depth) + (*depth)++; + break; + + case FDT_END_NODE: + if (depth) + (*depth)--; + break; + + case FDT_END: + return -FDT_ERR_NOTFOUND; + + default: + return -FDT_ERR_BADSTRUCTURE; + } + } while (tag != FDT_BEGIN_NODE); + + return offset; +} + +const char *_fdt_find_string(const char *strtab, int tabsize, const char *s) +{ + int len = strlen(s) + 1; + const char *last = strtab + tabsize - len; + const char *p; + + for (p = strtab; p <= last; p++) + if (memcmp(p, s, len) == 0) + return p; + return NULL; +} + +int fdt_move(const void *fdt, void *buf, int bufsize) +{ + FDT_CHECK_HEADER(fdt); + + if (fdt_totalsize(fdt) > bufsize) + return -FDT_ERR_NOSPACE; + + memmove(buf, fdt, fdt_totalsize(fdt)); + return 0; +} Added: soc2015/mihai/boot-wrapper/libfdt/fdt.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2015/mihai/boot-wrapper/libfdt/fdt.h Mon Jun 15 19:51:31 2015 (r287130) @@ -0,0 +1,60 @@ +#ifndef _FDT_H +#define _FDT_H + +#ifndef __ASSEMBLY__ + +struct fdt_header { + uint32_t magic; /* magic word FDT_MAGIC */ + uint32_t totalsize; /* total size of DT block */ + uint32_t off_dt_struct; /* offset to structure */ + uint32_t off_dt_strings; /* offset to strings */ + uint32_t off_mem_rsvmap; /* offset to memory reserve map */ + uint32_t version; /* format version */ + uint32_t last_comp_version; /* last compatible version */ + + /* version 2 fields below */ + uint32_t boot_cpuid_phys; /* Which physical CPU id we're + booting on */ + /* version 3 fields below */ + uint32_t size_dt_strings; /* size of the strings block */ + + /* version 17 fields below */ + uint32_t size_dt_struct; /* size of the structure block */ +}; + +struct fdt_reserve_entry { + uint64_t address; + uint64_t size; +}; + +struct fdt_node_header { + uint32_t tag; + char name[0]; +}; + +struct fdt_property { + uint32_t tag; + uint32_t len; + uint32_t nameoff; + char data[0]; +}; + +#endif /* !__ASSEMBLY */ + +#define FDT_MAGIC 0xd00dfeed /* 4: version, 4: total size */ +#define FDT_TAGSIZE sizeof(uint32_t) + +#define FDT_BEGIN_NODE 0x1 /* Start node: full name */ +#define FDT_END_NODE 0x2 /* End node */ +#define FDT_PROP 0x3 /* Property: name off, + size, content */ +#define FDT_NOP 0x4 /* nop */ +#define FDT_END 0x9 + +#define FDT_V1_SIZE (7*sizeof(uint32_t)) +#define FDT_V2_SIZE (FDT_V1_SIZE + sizeof(uint32_t)) +#define FDT_V3_SIZE (FDT_V2_SIZE + sizeof(uint32_t)) +#define FDT_V16_SIZE FDT_V3_SIZE +#define FDT_V17_SIZE (FDT_V16_SIZE + sizeof(uint32_t)) + +#endif /* _FDT_H */ Added: soc2015/mihai/boot-wrapper/libfdt/fdt_ro.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2015/mihai/boot-wrapper/libfdt/fdt_ro.c Mon Jun 15 19:51:31 2015 (r287130) @@ -0,0 +1,469 @@ +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + * + * libfdt is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * + * a) This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * Alternatively, + * + * b) Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * 1. Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "libfdt_env.h" + +#include +#include + +#include "libfdt_internal.h" + +static int _fdt_nodename_eq(const void *fdt, int offset, + const char *s, int len) +{ + const char *p = fdt_offset_ptr(fdt, offset + FDT_TAGSIZE, len+1); + + if (! p) + /* short match */ + return 0; + + if (memcmp(p, s, len) != 0) + return 0; + + if (p[len] == '\0') + return 1; + else if (!memchr(s, '@', len) && (p[len] == '@')) + return 1; + else + return 0; +} + +const char *fdt_string(const void *fdt, int stroffset) +{ + return (const char *)fdt + fdt_off_dt_strings(fdt) + stroffset; +} + +int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size) +{ + FDT_CHECK_HEADER(fdt); + *address = fdt64_to_cpu(_fdt_mem_rsv(fdt, n)->address); + *size = fdt64_to_cpu(_fdt_mem_rsv(fdt, n)->size); + return 0; +} + +int fdt_num_mem_rsv(const void *fdt) +{ + int i = 0; + + while (fdt64_to_cpu(_fdt_mem_rsv(fdt, i)->size) != 0) + i++; + return i; +} + +int fdt_subnode_offset_namelen(const void *fdt, int offset, + const char *name, int namelen) +{ + int depth; + + FDT_CHECK_HEADER(fdt); + + for (depth = 0, offset = fdt_next_node(fdt, offset, &depth); + (offset >= 0) && (depth > 0); + offset = fdt_next_node(fdt, offset, &depth)) { + if (depth < 0) + return -FDT_ERR_NOTFOUND; + else if ((depth == 1) + && _fdt_nodename_eq(fdt, offset, name, namelen)) + return offset; + } + + if (offset < 0) + return offset; /* error */ + else + return -FDT_ERR_NOTFOUND; *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***