[U-Boot] [RFC PATCH v2 0/20] New 'sandbox' test architecture for U-Boot

This patch set points towards a possible way to improve the test infrastructure in U-Boot. The goal is to have a test suite that can run in a minute or two on a Linux PC and test all non-platform code.
This RFC aims to be just enough boot to U-Boot to a command prompt. You can type help; anything else will probably segfault :-) Press Ctrl-C to exit.
This patch set does not include some other code I have been playing around with, like a SPI flash driver and sandbox 'state' (so the state can be examined and modified to test failure modes and the like).
$ ./u-boot
U-Boot 2011.09-rc1-00041-ge50de7d-dirty (Sep 17 2011 - 08:17:40)
DRAM: 128 MiB Using default environment
In: serial Out: serial Err: serial
Detail ====== We can break the U-Boot code base into two parts:
1. Platform code, which is SOC-specifc. At present this is the CPU init (arch/xxx/cpu/...) and SOC-specific drivers (mostly in the drivers directory). There is also a small amount of generic CPU code in arch/xxx/lib and some board-specific code/drivers (e.g. drivers not within the SOC).
2. Portable/Generic U-Boot code, which is cross-platform. This includes many drivers, the various commands, file system support, things like the MMC, USB and network stacks, etc.
My focus in this patch set is the second part of the code base - all the code which is not platform-specific, but can still have bugs.
Proposal ======== To a large extent, testing of this part of the code base could simply be built on one or more of the available platforms. We could then run the tests on that platform, and announce that the code base works fine on that platform. Obviously the platform needs to support all possible features of U-Boot.
However, this approach fails to take advantage of two useful properties of this code:
- It is cross-platform, and even runs on x86 - It is standalone, requiring no OS libraries to run
For speed, debugging and convenience, it would be nice to run U-Boot under a generic Linux environment on a workstation, and test all the generic non-platform code. The basic problem with this is that the non-platform code requires the platform code to operate. Even the x86 platform code is designed for standalone operation on a particular x86 board, and is not suitable for running under x86 Linux.
To get around this I propose that we create a new ‘sandbox’ architecture. We write code in ‘arch/sandbox’ which can run under Linux. Since all the non-platform code will happily run under this new ‘architecture’, we can then write tests which run quickly under x86 Linux (or another Linux for that matter). This U-Boot 'architecture' should build natively on any 32/64-bit Linux machine since it just uses standard Linux system calls. Calls to Linux would be entirely within this arch/sandbox subdirectory.
Benefit ======= What will this buy us? Well we can do things like:
- Create a test SPI flash device, which is file-backed. Use this to write a test of the cmd_sf layer by issuing a series of commands and making sure that the correct SPI flash contents is obtained
- Create a test MMC or IDE device, backed by a file. Use this to issue ext2 and fat commands to manipulate the filesystem. Then loopback mount the file and check from Linux that U-Boot did the right thing
- Create a test Ethernet device with a mocked remote host attached. Use this to issue network commands like bootp and tftp and check that the correct results are obtained.
Ultimately (one day) we might have a set of unit tests for U-Boot which can run to very quickly check that a patch does not break the core U-Boot code.
Building ========
make ARCH=sandbox sandbox_config make ARCH=sandbox all
(The lds script is targeted for bfd and might not work with the gold linker)
Comments ======== Comments are welcome and I have cc'd those who showed an interest to my initial email. My goal is to create a real patch set in the next few weeks.
Please excuse the checkpatch violations, many of which seem to be less than useful. This code is a bit rough in places, but I want comments on it before polishing. There are a few strange things needed in the build as well, which I hope to improve.
Changes in v2: - Rebase to master - Tidy top-level Makefile to minimise changes - Try to avoid needing __attribute__((unused)) by assigning to an existing var - Remove CONFIG_SYS_SDRAM_BASE which is always 0 for sandbox boards - Fix #define<tab> - Remove CONFIG_LMB - Move os layer into arch/sandbox - Remove clean and dist-clean targets from Makefile - Try and fail to remove the global -I/usr/include - Fix cast of int to pointer instead of just removing the code - Move lds script out of the board directory - Fix commit message typo, sadly - Remove ARM cruft from Makefile - Remove version_string and make display_banner() call display_options() - Tidy up DRAM logic (but I think it is still needed to fit in with U-Boot) - Remove use of CONFIG_SYS_NO_FLASH - Make board_init_f() call board_init_r() for now - Make board_init_r() call main_loop() for now - Remove setting of LDSCRIPT (top level Makefile does this anyway) - Add comment to do_reset() to justify the sandbox implementation - Move lds script into cpu/sandbox - Update commit message to remove 'temporary' - Allow __WORDSIZE to be defined in Makefile / elsewhere - Split this change out from 'Add architecture image support' - Removed unneeded clock.h - Moved gpio.h to asm-generic, removed GPIO_COUNT - Removed kernel cruft from posix_types.h - Removed dummy field from struct pt_regs - Remove contents of string.h; instead include linux/string.h - Remove unneeded functions in u-boot-sandbox.h - Remove contents of unaligned.h; instead include asm-generic/unaligned.h
Simon Glass (20): sandbox: Add architecture header files Fix use of int as pointer in image.c sandbox: Add architecture image support sandbox: Add compiler defines to support a 64-bit x86_64 platform sandbox: Add cpu files sandbox: Add architecture lib files sandbox: Add sandbox board sandbox: Add board info for architecture sandbox: Add bootm support sandbox: Disable built-in malloc sandbox: Disable standalone/API support sandbox: Force command sections to be 4-byte aligned sandbox: Add OS dependent layer sandbox: Add board_init() sandbox: Add main program sandbox: Add serial uart sandbox: Add basic config file Remove unused variable warnings in cmd_mem, cmd_nvedit Use uintptr_t for 32/64-bit compatibility sandbox: Makefile changes to build sandbox architecture
Makefile | 23 ++- arch/sandbox/config.mk | 23 +++ arch/sandbox/cpu/sandbox/Makefile | 52 +++++ arch/sandbox/cpu/sandbox/cpu.c | 59 ++++++ arch/sandbox/cpu/sandbox/os.c | 49 +++++ arch/sandbox/cpu/sandbox/u-boot.lds | 34 ++++ arch/sandbox/include/asm/bitops.h | 162 ++++++++++++++++ arch/sandbox/include/asm/byteorder.h | 40 ++++ arch/sandbox/include/asm/config.h | 26 +++ arch/sandbox/include/asm/global_data.h | 68 +++++++ arch/sandbox/include/asm/io.h | 41 ++++ arch/sandbox/include/asm/posix_types.h | 57 ++++++ arch/sandbox/include/asm/ptrace.h | 38 ++++ arch/sandbox/include/asm/string.h | 23 +++ arch/sandbox/include/asm/system.h | 36 ++++ arch/sandbox/include/asm/types.h | 72 +++++++ arch/sandbox/include/asm/u-boot-sandbox.h | 38 ++++ arch/sandbox/include/asm/u-boot.h | 61 ++++++ arch/sandbox/include/asm/unaligned.h | 23 +++ arch/sandbox/lib/Makefile | 51 +++++ arch/sandbox/lib/board.c | 288 +++++++++++++++++++++++++++++ arch/sandbox/lib/interrupts.c | 39 ++++ board/sandbox/common/Makefile | 41 ++++ board/sandbox/common/board.c | 25 +++ board/sandbox/common/main.c | 33 ++++ board/sandbox/sandbox/Makefile | 44 +++++ board/sandbox/sandbox/sandbox.c | 54 ++++++ boards.cfg | 1 + common/Makefile | 2 + common/cmd_bdinfo.c | 34 +++- common/cmd_bootm.c | 9 +- common/cmd_mem.c | 10 +- common/cmd_nvedit.c | 3 +- common/fdt_support.c | 8 +- common/image.c | 4 +- doc/README.sandbox | 47 +++++ drivers/serial/Makefile | 1 + drivers/serial/sandbox.c | 67 +++++++ include/asm-generic/gpio.h | 25 +++ include/command.h | 16 ++- include/common.h | 3 + include/compiler.h | 12 +- include/configs/sandbox.h | 77 ++++++++ include/image.h | 3 + include/linux/string.h | 2 + include/os.h | 27 +++ 46 files changed, 1821 insertions(+), 30 deletions(-) create mode 100644 arch/sandbox/config.mk create mode 100644 arch/sandbox/cpu/sandbox/Makefile create mode 100644 arch/sandbox/cpu/sandbox/cpu.c create mode 100644 arch/sandbox/cpu/sandbox/os.c create mode 100644 arch/sandbox/cpu/sandbox/u-boot.lds create mode 100644 arch/sandbox/include/asm/bitops.h create mode 100644 arch/sandbox/include/asm/byteorder.h create mode 100644 arch/sandbox/include/asm/config.h create mode 100644 arch/sandbox/include/asm/global_data.h create mode 100644 arch/sandbox/include/asm/io.h create mode 100644 arch/sandbox/include/asm/posix_types.h create mode 100644 arch/sandbox/include/asm/ptrace.h create mode 100644 arch/sandbox/include/asm/string.h create mode 100644 arch/sandbox/include/asm/system.h create mode 100644 arch/sandbox/include/asm/types.h create mode 100644 arch/sandbox/include/asm/u-boot-sandbox.h create mode 100644 arch/sandbox/include/asm/u-boot.h create mode 100644 arch/sandbox/include/asm/unaligned.h create mode 100644 arch/sandbox/lib/Makefile create mode 100644 arch/sandbox/lib/board.c create mode 100644 arch/sandbox/lib/interrupts.c create mode 100644 board/sandbox/common/Makefile create mode 100644 board/sandbox/common/board.c create mode 100644 board/sandbox/common/main.c create mode 100644 board/sandbox/sandbox/Makefile create mode 100644 board/sandbox/sandbox/sandbox.c create mode 100644 doc/README.sandbox create mode 100644 drivers/serial/sandbox.c create mode 100644 include/asm-generic/gpio.h create mode 100644 include/configs/sandbox.h create mode 100644 include/os.h

This adds required header files for the sandbox architecture, and a basic description of what sandbox is (README.sandbox).
Signed-off-by: Simon Glass sjg@chromium.org --- Changes in v2: - Removed unneeded clock.h - Moved gpio.h to asm-generic, removed GPIO_COUNT - Removed kernel cruft from posix_types.h - Removed dummy field from struct pt_regs - Remove contents of string.h; instead include linux/string.h - Remove unneeded functions in u-boot-sandbox.h - Remove contents of unaligned.h; instead include asm-generic/unaligned.h
arch/sandbox/include/asm/bitops.h | 162 +++++++++++++++++++++++++++++ arch/sandbox/include/asm/byteorder.h | 40 +++++++ arch/sandbox/include/asm/config.h | 26 +++++ arch/sandbox/include/asm/global_data.h | 68 ++++++++++++ arch/sandbox/include/asm/io.h | 41 +++++++ arch/sandbox/include/asm/posix_types.h | 57 ++++++++++ arch/sandbox/include/asm/ptrace.h | 38 +++++++ arch/sandbox/include/asm/string.h | 23 ++++ arch/sandbox/include/asm/system.h | 36 +++++++ arch/sandbox/include/asm/types.h | 72 +++++++++++++ arch/sandbox/include/asm/u-boot-sandbox.h | 38 +++++++ arch/sandbox/include/asm/u-boot.h | 61 +++++++++++ arch/sandbox/include/asm/unaligned.h | 23 ++++ doc/README.sandbox | 47 +++++++++ include/asm-generic/gpio.h | 25 +++++ include/common.h | 3 + include/linux/string.h | 2 + 17 files changed, 762 insertions(+), 0 deletions(-) create mode 100644 arch/sandbox/include/asm/bitops.h create mode 100644 arch/sandbox/include/asm/byteorder.h create mode 100644 arch/sandbox/include/asm/config.h create mode 100644 arch/sandbox/include/asm/global_data.h create mode 100644 arch/sandbox/include/asm/io.h create mode 100644 arch/sandbox/include/asm/posix_types.h create mode 100644 arch/sandbox/include/asm/ptrace.h create mode 100644 arch/sandbox/include/asm/string.h create mode 100644 arch/sandbox/include/asm/system.h create mode 100644 arch/sandbox/include/asm/types.h create mode 100644 arch/sandbox/include/asm/u-boot-sandbox.h create mode 100644 arch/sandbox/include/asm/u-boot.h create mode 100644 arch/sandbox/include/asm/unaligned.h create mode 100644 doc/README.sandbox create mode 100644 include/asm-generic/gpio.h
diff --git a/arch/sandbox/include/asm/bitops.h b/arch/sandbox/include/asm/bitops.h new file mode 100644 index 0000000..87a4527 --- /dev/null +++ b/arch/sandbox/include/asm/bitops.h @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * + * Copyright 1995, Russell King. + * Various bits and pieces copyrights include: + * Linus Torvalds (test_bit). + * + * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1). + * + * Please note that the code in this file should never be included + * from user space. Many of these are not implemented in assembler + * since they would be too costly. Also, they require priviledged + * instructions (which are not available from user mode) to ensure + * that they are atomic. + */ + +#ifndef __ASM_SANDBOX_BITOPS_H +#define __ASM_SANDBOX_BITOPS_H + +#include <asm/system.h> + +#ifdef __KERNEL__ + +#define smp_mb__before_clear_bit() do { } while (0) +#define smp_mb__after_clear_bit() do { } while (0) + +/* + * Function prototypes to keep gcc -Wall happy. + */ +extern void set_bit(int nr, volatile void *addr); + +extern void clear_bit(int nr, volatile void *addr); + +extern void change_bit(int nr, volatile void *addr); + +static inline void __change_bit(int nr, volatile void *addr) +{ + unsigned long mask = BIT_MASK(nr); + unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); + + *p ^= mask; +} + +static inline int __test_and_set_bit(int nr, volatile void *addr) +{ + unsigned long mask = BIT_MASK(nr); + unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); + unsigned long old = *p; + + *p = old | mask; + return (old & mask) != 0; +} + +static inline int test_and_set_bit(int nr, volatile void *addr) +{ + unsigned long flags; + int out; + + local_irq_save(flags); + out = __test_and_set_bit(nr, addr); + local_irq_restore(flags); + + return out; +} + +static inline int __test_and_clear_bit(int nr, volatile void *addr) +{ + unsigned long mask = BIT_MASK(nr); + unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); + unsigned long old = *p; + + *p = old & ~mask; + return (old & mask) != 0; +} + +static inline int test_and_clear_bit(int nr, volatile void *addr) +{ + unsigned long flags; + int out; + + local_irq_save(flags); + out = __test_and_clear_bit(nr, addr); + local_irq_restore(flags); + + return out; +} + +extern int test_and_change_bit(int nr, volatile void *addr); + +static inline int __test_and_change_bit(int nr, volatile void *addr) +{ + unsigned long mask = BIT_MASK(nr); + unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); + unsigned long old = *p; + + *p = old ^ mask; + return (old & mask) != 0; +} + +extern int find_first_zero_bit(void *addr, unsigned size); +extern int find_next_zero_bit(void *addr, int size, int offset); + +/* + * This routine doesn't need to be atomic. + */ +static inline int test_bit(int nr, const void *addr) +{ + return ((unsigned char *) addr)[nr >> 3] & (1U << (nr & 7)); +} + +/* + * ffz = Find First Zero in word. Undefined if no zero exists, + * so code should check against ~0UL first.. + */ +static inline unsigned long ffz(unsigned long word) +{ + int k; + + word = ~word; + k = 31; + if (word & 0x0000ffff) { + k -= 16; word <<= 16; + } + if (word & 0x00ff0000) { + k -= 8; word <<= 8; + } + if (word & 0x0f000000) { + k -= 4; word <<= 4; + } + if (word & 0x30000000) { + k -= 2; word <<= 2; + } + if (word & 0x40000000) + k -= 1; + return k; +} + +/* + * hweightN: returns the hamming weight (i.e. the number + * of bits set) of a N-bit word + */ + +#define hweight32(x) generic_hweight32(x) +#define hweight16(x) generic_hweight16(x) +#define hweight8(x) generic_hweight8(x) + +#define ext2_set_bit test_and_set_bit +#define ext2_clear_bit test_and_clear_bit +#define ext2_test_bit test_bit +#define ext2_find_first_zero_bit find_first_zero_bit +#define ext2_find_next_zero_bit find_next_zero_bit + +/* Bitmap functions for the minix filesystem. */ +#define minix_test_and_set_bit(nr, addr) test_and_set_bit(nr, addr) +#define minix_set_bit(nr, addr) set_bit(nr, addr) +#define minix_test_and_clear_bit(nr, addr) test_and_clear_bit(nr, addr) +#define minix_test_bit(nr, addr) test_bit(nr, addr) +#define minix_find_first_zero_bit(addr, size) find_first_zero_bit(addr, size) + +#endif /* __KERNEL__ */ + +#endif /* _ARM_BITOPS_H */ diff --git a/arch/sandbox/include/asm/byteorder.h b/arch/sandbox/include/asm/byteorder.h new file mode 100644 index 0000000..ff87284 --- /dev/null +++ b/arch/sandbox/include/asm/byteorder.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#ifndef __ASM_SANDBOX_BYTEORDER_H +#define __ASM_SANDBOX_BYTEORDER_H + + +#include <asm/types.h> + +#if !defined(__STRICT_ANSI__) || defined(__KERNEL__) +# define __BYTEORDER_HAS_U64__ +# define __SWAB_64_THRU_32__ +#endif + +#ifdef CONFIG_SANDBOX_BIG_ENDIAN +#include <linux/byteorder/big_endian.h> +#else +#include <linux/byteorder/little_endian.h> +#endif + +#endif diff --git a/arch/sandbox/include/asm/config.h b/arch/sandbox/include/asm/config.h new file mode 100644 index 0000000..2ef0564 --- /dev/null +++ b/arch/sandbox/include/asm/config.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + */ + +#ifndef _ASM_CONFIG_H_ +#define _ASM_CONFIG_H_ + +#define CONFIG_SANDBOX_ARCH + +#endif diff --git a/arch/sandbox/include/asm/global_data.h b/arch/sandbox/include/asm/global_data.h new file mode 100644 index 0000000..4bfe38d --- /dev/null +++ b/arch/sandbox/include/asm/global_data.h @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * + * (C) Copyright 2002-2010 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#ifndef __ASM_GBL_DATA_H +#define __ASM_GBL_DATA_H +/* + * The following data structure is placed in some memory wich is + * available very early after boot (like DPRAM on MPC8xx/MPC82xx, or + * some locked parts of the data cache) to allow for a minimum set of + * global variables during system initialization (until we have set + * up the memory controller so that we can use RAM). + * + * Keep it *SMALL* and remember to set GENERATED_GBL_DATA_SIZE > sizeof(gd_t) + */ + +typedef struct global_data { + bd_t *bd; + unsigned long flags; + unsigned long baudrate; + unsigned long have_console; /* serial_init() was called */ + unsigned long env_addr; /* Address of Environment struct */ + unsigned long env_valid; /* Checksum of Environment valid? */ + unsigned long fb_base; /* base address of frame buffer */ + u8 *ram_buf; /* emulated RAM buffer */ + phys_size_t ram_size; /* RAM size */ + unsigned long mon_len; /* monitor len */ + void **jt; /* jump table */ + char env_buf[32]; /* buffer for getenv() before reloc. */ +} gd_t; + +/* + * Global Data Flags + */ +#define GD_FLG_RELOC 0x00001 /* Code was relocated to RAM */ +#define GD_FLG_DEVINIT 0x00002 /* Devices have been initialized */ +#define GD_FLG_SILENT 0x00004 /* Silent mode */ +#define GD_FLG_POSTFAIL 0x00008 /* Critical POST test failed */ +#define GD_FLG_POSTSTOP 0x00010 /* POST seqeunce aborted */ +#define GD_FLG_LOGINIT 0x00020 /* Log Buffer has been initialized */ +#define GD_FLG_DISABLE_CONSOLE 0x00040 /* Disable console (in & out) */ +#define GD_FLG_ENV_READY 0x00080 /* Env. imported into hash table */ + +#define XTRN_DECLARE_GLOBAL_DATA_PTR extern +#define DECLARE_GLOBAL_DATA_PTR XTRN_DECLARE_GLOBAL_DATA_PTR gd_t *gd + +#endif /* __ASM_GBL_DATA_H */ diff --git a/arch/sandbox/include/asm/io.h b/arch/sandbox/include/asm/io.h new file mode 100644 index 0000000..0392d21 --- /dev/null +++ b/arch/sandbox/include/asm/io.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +/* + * Given a physical address and a length, return a virtual address + * that can be used to access the memory range with the caching + * properties specified by "flags". + */ +#define MAP_NOCACHE (0) +#define MAP_WRCOMBINE (0) +#define MAP_WRBACK (0) +#define MAP_WRTHROUGH (0) + +void *map_physmem(phys_addr_t paddr, unsigned long len, unsigned long flags); + +/* + * Take down a mapping set up by map_physmem(). + */ +static inline void unmap_physmem(void *vaddr, unsigned long flags) +{ + +} diff --git a/arch/sandbox/include/asm/posix_types.h b/arch/sandbox/include/asm/posix_types.h new file mode 100644 index 0000000..ec18ed7 --- /dev/null +++ b/arch/sandbox/include/asm/posix_types.h @@ -0,0 +1,57 @@ +/* + * linux/include/asm-arm/posix_types.h + * + * Copyright (C) 1996-1998 Russell King. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Changelog: + * 27-06-1996 RMK Created + */ +#ifndef __ARCH_ARM_POSIX_TYPES_H +#define __ARCH_ARM_POSIX_TYPES_H + +/* + * This file is generally used by user-level software, so you need to + * be a little careful about namespace pollution etc. Also, we cannot + * assume GCC is being used. + */ + +typedef unsigned short __kernel_dev_t; +typedef unsigned long __kernel_ino_t; +typedef unsigned short __kernel_mode_t; +typedef unsigned short __kernel_nlink_t; +typedef long __kernel_off_t; +typedef int __kernel_pid_t; +typedef unsigned short __kernel_ipc_pid_t; +typedef unsigned short __kernel_uid_t; +typedef unsigned short __kernel_gid_t; +#if CONFIG_SANDBOX_BITS_PER_LONG == 32 +typedef unsigned int __kernel_size_t; +typedef int __kernel_ssize_t; +typedef int __kernel_ptrdiff_t; +#else +typedef unsigned long __kernel_size_t; +typedef long __kernel_ssize_t; +typedef long __kernel_ptrdiff_t; +#endif +typedef long __kernel_time_t; +typedef long __kernel_suseconds_t; +typedef long __kernel_clock_t; +typedef int __kernel_daddr_t; +typedef char *__kernel_caddr_t; +typedef unsigned short __kernel_uid16_t; +typedef unsigned short __kernel_gid16_t; +typedef unsigned int __kernel_uid32_t; +typedef unsigned int __kernel_gid32_t; + +typedef unsigned short __kernel_old_uid_t; +typedef unsigned short __kernel_old_gid_t; + +#ifdef __GNUC__ +typedef long long __kernel_loff_t; +#endif + +#endif diff --git a/arch/sandbox/include/asm/ptrace.h b/arch/sandbox/include/asm/ptrace.h new file mode 100644 index 0000000..613d459 --- /dev/null +++ b/arch/sandbox/include/asm/ptrace.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#ifndef __ASM_SANDBOX_PTRACE_H +#define __ASM_SANDBOX_PTRACE_H + +#ifndef __ASSEMBLY__ +/* This is not used in the sandbox architecture, but required by U-Boot */ +struct pt_regs { +}; + +#ifdef __KERNEL__ +extern void show_regs(struct pt_regs *); + +#endif + +#endif /* __ASSEMBLY__ */ + +#endif diff --git a/arch/sandbox/include/asm/string.h b/arch/sandbox/include/asm/string.h new file mode 100644 index 0000000..89b7f06 --- /dev/null +++ b/arch/sandbox/include/asm/string.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <linux/string.h> diff --git a/arch/sandbox/include/asm/system.h b/arch/sandbox/include/asm/system.h new file mode 100644 index 0000000..78cdc9fa8 --- /dev/null +++ b/arch/sandbox/include/asm/system.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#ifndef __ASM_SANDBOX_SYSTEM_H +#define __ASM_SANDBOX_SYSTEM_H + +/* Define this as nops for sandbox architecture */ +static inline void local_irq_save(unsigned flags __attribute__((unused))) +{ +} + +#define local_irq_enable() +#define local_irq_disable() +#define local_save_flags(x) +#define local_irq_restore(x) + +#endif diff --git a/arch/sandbox/include/asm/types.h b/arch/sandbox/include/asm/types.h new file mode 100644 index 0000000..2316c2d --- /dev/null +++ b/arch/sandbox/include/asm/types.h @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#ifndef __ASM_SANDBOX_TYPES_H +#define __ASM_SANDBOX_TYPES_H + +typedef unsigned short umode_t; + +/* + * __xx is ok: it doesn't pollute the POSIX namespace. Use these in the + * header files exported to user space + */ + +typedef __signed__ char __s8; +typedef unsigned char __u8; + +typedef __signed__ short __s16; +typedef unsigned short __u16; + +typedef __signed__ int __s32; +typedef unsigned int __u32; + +#if defined(__GNUC__) +__extension__ typedef __signed__ long long __s64; +__extension__ typedef unsigned long long __u64; +#endif + +/* + * These aren't exported outside the kernel to avoid name space clashes + */ +#ifdef __KERNEL__ + +typedef signed char s8; +typedef unsigned char u8; + +typedef signed short s16; +typedef unsigned short u16; + +typedef signed int s32; +typedef unsigned int u32; + +typedef signed long long s64; +typedef unsigned long long u64; + +#define BITS_PER_LONG CONFIG_SANDBOX_BITS_PER_LONG + +typedef unsigned long dma_addr_t; +typedef unsigned long phys_addr_t; +typedef unsigned long phys_size_t; + +#endif /* __KERNEL__ */ + +#endif diff --git a/arch/sandbox/include/asm/u-boot-sandbox.h b/arch/sandbox/include/asm/u-boot-sandbox.h new file mode 100644 index 0000000..236b4ee --- /dev/null +++ b/arch/sandbox/include/asm/u-boot-sandbox.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * + * (C) Copyright 2002 + * Sysgo Real-Time Solutions, GmbH <www.elinos.com> + * Marius Groeger mgroeger@sysgo.de + * + * (C) Copyright 2002 + * Sysgo Real-Time Solutions, GmbH <www.elinos.com> + * Alex Zuepke azu@sysgo.de + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#ifndef _U_BOOT_SANDBOX_H_ +#define _U_BOOT_SANDBOX_H_ + +/* board/.../... */ +int board_init(void); +int dram_init(void); + +#endif /* _U_BOOT_SANDBOX_H_ */ diff --git a/arch/sandbox/include/asm/u-boot.h b/arch/sandbox/include/asm/u-boot.h new file mode 100644 index 0000000..7d91847 --- /dev/null +++ b/arch/sandbox/include/asm/u-boot.h @@ -0,0 +1,61 @@ +/* + * (C) Copyright 2002 + * Sysgo Real-Time Solutions, GmbH <www.elinos.com> + * Marius Groeger mgroeger@sysgo.de + * + * (C) Copyright 2002 + * Sysgo Real-Time Solutions, GmbH <www.elinos.com> + * Alex Zuepke azu@sysgo.de + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ******************************************************************** + * NOTE: This header file defines an interface to U-Boot. Including + * this (unmodified) header file in another file is considered normal + * use of U-Boot, and does *not* fall under the heading of "derived + * work". + ******************************************************************** + */ + +#ifndef _U_BOOT_H_ +#define _U_BOOT_H_ 1 + +typedef struct bd_info { + unsigned long bi_memstart; /* start of DRAM memory */ + phys_size_t bi_memsize; /* size of DRAM memory in bytes */ + unsigned long bi_flashstart; /* start of FLASH memory */ + unsigned long bi_flashsize; /* size of FLASH memory */ + unsigned long bi_flashoffset; /* reserved area for startup monitor */ + unsigned long bi_sramstart; /* start of SRAM memory */ + unsigned long bi_sramsize; /* size of SRAM memory */ + unsigned long bi_bootflags; /* boot / reboot flag (for LynxOS) */ + unsigned long bi_ip_addr; /* IP Address */ + unsigned short bi_ethspeed; /* Ethernet speed in Mbps */ + unsigned long bi_intfreq; /* Internal Freq, in MHz */ + unsigned long bi_busfreq; /* Bus Freq, in MHz */ + unsigned int bi_baudrate; /* Console Baudrate */ + unsigned long bi_boot_params; /* where this board expects params */ + struct /* RAM configuration */ + { + ulong start; + ulong size; + } bi_dram[CONFIG_NR_DRAM_BANKS]; +} bd_t; + +#endif /* _U_BOOT_H_ */ diff --git a/arch/sandbox/include/asm/unaligned.h b/arch/sandbox/include/asm/unaligned.h new file mode 100644 index 0000000..6cf9780 --- /dev/null +++ b/arch/sandbox/include/asm/unaligned.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <asm-generic/unaligned.h> diff --git a/doc/README.sandbox b/doc/README.sandbox new file mode 100644 index 0000000..58f3883 --- /dev/null +++ b/doc/README.sandbox @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +Native Execution of U-Boot +========================== + +The 'sandbox' architecture is designed to allow U-Boot to run under Linux on +almost any hardware. To achieve this it builds U-Boot (so far as possible) +as a normal C application with a main() and normal C libraries. + +All of U-Boot's architecture-specific code therefore cannot be built as part +of the sandbox U-Boot. The purpose of running U-Boot under Linux is to test +all the generic code, not specific to any one architecture. The idea is to +create unit tests which we can run to test this upper level code. + +CONFIG_SANDBOX is defined when building a native board. + +The chosen vendor and board names are also 'sandbox', so there is a single +board in board/sandbox/sandbox. + +CONFIG_SANDBOX_BIG_ENDIAN should be defined when running on big-endian +machines. + + +Tests +----- + +So far we have no tests, but when we do these will be documented here. diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h new file mode 100644 index 0000000..316b34c --- /dev/null +++ b/include/asm-generic/gpio.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +int gpio_direction_input(int gp); +int gpio_direction_output(int gp, int value); +int gpio_get_value(int gp); +void gpio_set_value(int gp, int value); diff --git a/include/common.h b/include/common.h index d244bd4..2a39df3 100644 --- a/include/common.h +++ b/include/common.h @@ -302,6 +302,9 @@ int setenv (const char *, const char *); #ifdef CONFIG_X86 /* x86 version to be fixed! */ # include <asm/u-boot-x86.h> #endif /* CONFIG_X86 */ +#ifdef CONFIG_SANDBOX +# include <asm/u-boot-sandbox.h> /* TODO(sjg) what needs to be fixed? */ +#endif
#ifdef CONFIG_AUTO_COMPLETE int env_complete(char *var, int maxv, char *cmdv[], int maxsz, char *buf); diff --git a/include/linux/string.h b/include/linux/string.h index 6239039..3cd06a8 100644 --- a/include/linux/string.h +++ b/include/linux/string.h @@ -1,6 +1,8 @@ #ifndef _LINUX_STRING_H_ #define _LINUX_STRING_H_
+#include <linux/string.h> + #include <linux/types.h> /* for size_t */ #include <linux/stddef.h> /* for NULL */

It is better to use %p in this case.
Signed-off-by: Simon Glass sjg@chromium.org --- Changes in v2: - Split this change out from 'Add architecture image support'
common/image.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/common/image.c b/common/image.c index d38ce4a..fc475cd 100644 --- a/common/image.c +++ b/common/image.c @@ -1581,7 +1581,7 @@ int boot_get_fdt (int flag, int argc, char * const argv[], bootm_headers_t *imag goto error; }
- printf (" Booting using the fdt blob at 0x%x\n", (int)fdt_blob); + printf(" Booting using the fdt blob at 0x%p\n", fdt_blob);
} else if (images->legacy_hdr_valid && image_check_type (&images->legacy_hdr_os_copy, IH_TYPE_MULTI)) { @@ -1600,7 +1600,7 @@ int boot_get_fdt (int flag, int argc, char * const argv[], bootm_headers_t *imag if (fdt_len) {
fdt_blob = (char *)fdt_data; - printf (" Booting using the fdt at 0x%x\n", (int)fdt_blob); + printf(" Booting using the fdt at 0x%p\n", fdt_blob);
if (fdt_check_header (fdt_blob) != 0) { fdt_error ("image is not a fdt");

Acked-by: Mike Frysinger vapier@gentoo.org -mike

Hi,
On Sun, Sep 25, 2011 at 10:00 PM, Mike Frysinger vapier@gentoo.org wrote:
Acked-by: Mike Frysinger vapier@gentoo.org -mike
Thanks - quick question: I want to move this from RFC to normal patch in the next version - should I start at version 3 or version 1 for the header?
Regards, Simon

On Monday, September 26, 2011 12:51:42 Simon Glass wrote:
Thanks - quick question: I want to move this from RFC to normal patch in the next version - should I start at version 3 or version 1 for the header?
just keep upreving the ver number -mike

We won't actually load an image with this architecture, but we still need to define it.
Signed-off-by: Simon Glass sjg@chromium.org --- include/image.h | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/include/image.h b/include/image.h index 352e4a0..c7fbb88 100644 --- a/include/image.h +++ b/include/image.h @@ -106,6 +106,7 @@ #define IH_ARCH_BLACKFIN 16 /* Blackfin */ #define IH_ARCH_AVR32 17 /* AVR32 */ #define IH_ARCH_ST200 18 /* STMicroelectronics ST200 */ +#define IH_ARCH_SANDBOX 19 /* Sandbox architecture (test only) */
/* * Image Types @@ -506,6 +507,8 @@ static inline int image_check_target_arch (const image_header_t *hdr) if (!image_check_arch (hdr, IH_ARCH_SH)) #elif defined(__sparc__) if (!image_check_arch (hdr, IH_ARCH_SPARC)) +#elif defined(CONFIG_SANDBOX_ARCH) + if (0) #else # error Unknown CPU type #endif

On Friday, September 23, 2011 12:22:05 Simon Glass wrote:
#elif defined(__sparc__) if (!image_check_arch (hdr, IH_ARCH_SPARC)) +#elif defined(CONFIG_SANDBOX_ARCH)
- if (0)
#else # error Unknown CPU type #endif
i wonder if this could be useful ... wouldn't it allow some testing of uImages if we had image_check_arch(hdr, IN_ARCH_SANDBOX) ? -mike

Hi Mike,
On Sun, Sep 25, 2011 at 10:01 PM, Mike Frysinger vapier@gentoo.org wrote:
On Friday, September 23, 2011 12:22:05 Simon Glass wrote:
#elif defined(__sparc__) if (!image_check_arch (hdr, IH_ARCH_SPARC)) +#elif defined(CONFIG_SANDBOX_ARCH)
- if (0)
#else # error Unknown CPU type #endif
i wonder if this could be useful ... wouldn't it allow some testing of uImages if we had image_check_arch(hdr, IN_ARCH_SANDBOX) ?
Possibly - it is a bit odd since we can't get the architecture from the compiler. it would need to go first in the list since sandbox can be built on any platform. I will take a look.
Regards, Simon
-mike

On Monday, September 26, 2011 15:39:28 Simon Glass wrote:
On Sun, Sep 25, 2011 at 10:01 PM, Mike Frysinger wrote:
On Friday, September 23, 2011 12:22:05 Simon Glass wrote:
#elif defined(__sparc__) if (!image_check_arch (hdr, IH_ARCH_SPARC)) +#elif defined(CONFIG_SANDBOX_ARCH)
if (0)
#else # error Unknown CPU type #endif
i wonder if this could be useful ... wouldn't it allow some testing of uImages if we had image_check_arch(hdr, IN_ARCH_SANDBOX) ?
Possibly - it is a bit odd since we can't get the architecture from the compiler. it would need to go first in the list since sandbox can be built on any platform. I will take a look.
you want to be able to test other uImage formats ? -mike

Hi Mike,
On Mon, Sep 26, 2011 at 1:19 PM, Mike Frysinger vapier@gentoo.org wrote:
On Monday, September 26, 2011 15:39:28 Simon Glass wrote:
On Sun, Sep 25, 2011 at 10:01 PM, Mike Frysinger wrote:
On Friday, September 23, 2011 12:22:05 Simon Glass wrote:
#elif defined(__sparc__) if (!image_check_arch (hdr, IH_ARCH_SPARC)) +#elif defined(CONFIG_SANDBOX_ARCH)
- if (0)
#else # error Unknown CPU type #endif
i wonder if this could be useful ... wouldn't it allow some testing of uImages if we had image_check_arch(hdr, IN_ARCH_SANDBOX) ?
Possibly - it is a bit odd since we can't get the architecture from the compiler. it would need to go first in the list since sandbox can be built on any platform. I will take a look.
you want to be able to test other uImage formats ? -mike
Not sure yet, let's say no for now. Some of that code is in 'inaccessible' arch-specific directories anyway.
Regards, Simon

This sets __WORDSIZE to 8 correctly on 64-bit machines.
Signed-off-by: Simon Glass sjg@chromium.org --- Changes in v2: - Update commit message to remove 'temporary' - Allow __WORDSIZE to be defined in Makefile / elsewhere
include/compiler.h | 12 +++++++++++- 1 files changed, 11 insertions(+), 1 deletions(-)
diff --git a/include/compiler.h b/include/compiler.h index 4e047c7..dc1a259 100644 --- a/include/compiler.h +++ b/include/compiler.h @@ -111,11 +111,21 @@ typedef unsigned int uint; #include <linux/types.h> #include <asm/byteorder.h>
+#if __SIZEOF_LONG__ == 8 +# define __WORDSIZE 64 +#elif __SIZEOF_LONG__ == 4 +# define __WORDSIZE 32 +#elif !defined __WORDSIZE +#error "__SIZEOF_LONG__ has unexpected value" +#endif + /* Types for `void *' pointers. */ #if __WORDSIZE == 64 typedef unsigned long int uintptr_t; -#else +#elif __WORDSIZE == 32 typedef unsigned int uintptr_t; +#else +#error "__WORDSIZE has unexpected value" #endif
#endif

This is an initial implementation with all functions defined but not working.
The lds file is very simple since we can mostly rely on the linker defaults.
Signed-off-by: Simon Glass sjg@chromium.org --- Changes in v2: - Remove setting of LDSCRIPT (top level Makefile does this anyway) - Add comment to do_reset() to justify the sandbox implementation - Move lds script into cpu/sandbox
arch/sandbox/config.mk | 20 ++++++++++++ arch/sandbox/cpu/sandbox/Makefile | 47 +++++++++++++++++++++++++++ arch/sandbox/cpu/sandbox/cpu.c | 59 +++++++++++++++++++++++++++++++++++ arch/sandbox/cpu/sandbox/u-boot.lds | 34 ++++++++++++++++++++ include/command.h | 13 +++++++- 5 files changed, 172 insertions(+), 1 deletions(-) create mode 100644 arch/sandbox/config.mk create mode 100644 arch/sandbox/cpu/sandbox/Makefile create mode 100644 arch/sandbox/cpu/sandbox/cpu.c create mode 100644 arch/sandbox/cpu/sandbox/u-boot.lds
diff --git a/arch/sandbox/config.mk b/arch/sandbox/config.mk new file mode 100644 index 0000000..ab33026 --- /dev/null +++ b/arch/sandbox/config.mk @@ -0,0 +1,20 @@ +# Copyright (c) 2011 The Chromium OS Authors. +# See file CREDITS for list of people who contributed to this +# project. +# +# This program 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 program 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 program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA + +PLATFORM_CPPFLAGS += -DCONFIG_SANDBOX -D__SANDBOX__ diff --git a/arch/sandbox/cpu/sandbox/Makefile b/arch/sandbox/cpu/sandbox/Makefile new file mode 100644 index 0000000..8dfa828 --- /dev/null +++ b/arch/sandbox/cpu/sandbox/Makefile @@ -0,0 +1,47 @@ +# +# Copyright (c) 2011 The Chromium OS Authors. +# +# (C) Copyright 2000-2003 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program 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 program 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 program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# + +include $(TOPDIR)/config.mk + +LIB = $(obj)lib$(CPU).o + +COBJS := cpu.o + +SRCS := $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS)) + +all: $(obj).depend $(LIB) + +$(LIB): $(OBJS) + $(call cmd_link_o_target, $(OBJS)) + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/arch/sandbox/cpu/sandbox/cpu.c b/arch/sandbox/cpu/sandbox/cpu.c new file mode 100644 index 0000000..fd4ff1d --- /dev/null +++ b/arch/sandbox/cpu/sandbox/cpu.c @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> + +DECLARE_GLOBAL_DATA_PTR; + +int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + return -1; +} + +/* delay x useconds */ +void __udelay(unsigned long usec) +{ + /* Ignore this for now */ +} + +unsigned long timer_get_us(void) +{ + return 0; +} + +int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images) +{ + return -1; +} + +int cleanup_before_linux(void) +{ + return 0; +} + +void *map_physmem(phys_addr_t paddr, unsigned long len, unsigned long flags) +{ + return (void *)(gd->ram_buf + paddr); +} + +void flush_dcache_range(unsigned long start, unsigned long stop) +{ +} diff --git a/arch/sandbox/cpu/sandbox/u-boot.lds b/arch/sandbox/cpu/sandbox/u-boot.lds new file mode 100644 index 0000000..2d2e50f --- /dev/null +++ b/arch/sandbox/cpu/sandbox/u-boot.lds @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +SECTIONS +{ + __u_boot_cmd_start = .; + .u_boot_cmd : { *(.u_boot_cmd) } + __u_boot_cmd_end = .; + __bss_start = .; + +} + +INSERT BEFORE .data; diff --git a/include/command.h b/include/command.h index f1accd0..377e201 100644 --- a/include/command.h +++ b/include/command.h @@ -107,7 +107,18 @@ static inline int bootm_maybe_autostart(cmd_tbl_t *cmdtp, const char *cmd) return 0; } #endif -extern int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); + +/** + * Reset the board, if possible + * + * @param cmdtp Pointer to command table entry of cmd being executed + * @param flag Flags (CMD_FLAG_...) + * @param argc Number of arguments + * @param argv Array of arguments + * @return -1 if a reset is not possible, otherwise this function will + * obviously not return. + */ +extern int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]);
#endif /* __ASSEMBLY__ */

These files are taken from the ARM board implementation and then reduced to remove unneeded cruft.
Ideally we would work towards unifying arch/xxx/lib files, particularly board.c.
Signed-off-by: Simon Glass sjg@chromium.org --- Changes in v2: - Fix commit message typo, sadly - Remove ARM cruft from Makefile - Remove version_string and make display_banner() call display_options() - Tidy up DRAM logic (but I think it is still needed to fit in with U-Boot) - Remove use of CONFIG_SYS_NO_FLASH - Make board_init_f() call board_init_r() for now - Make board_init_r() call main_loop() for now
arch/sandbox/lib/Makefile | 51 +++++++ arch/sandbox/lib/board.c | 288 +++++++++++++++++++++++++++++++++++++++++ arch/sandbox/lib/interrupts.c | 39 ++++++ 3 files changed, 378 insertions(+), 0 deletions(-) create mode 100644 arch/sandbox/lib/Makefile create mode 100644 arch/sandbox/lib/board.c create mode 100644 arch/sandbox/lib/interrupts.c
diff --git a/arch/sandbox/lib/Makefile b/arch/sandbox/lib/Makefile new file mode 100644 index 0000000..fbe579b --- /dev/null +++ b/arch/sandbox/lib/Makefile @@ -0,0 +1,51 @@ +# +# Copyright (c) 2011 The Chromium OS Authors. +# +# (C) Copyright 2002-2006 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program 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 program 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 program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# + +include $(TOPDIR)/config.mk + +LIB = $(obj)lib$(ARCH).o + +COBJS-y += board.o +COBJS-y += interrupts.o + +SRCS := $(COBJS-y:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS-y)) + +# Always build libsandbox.o +TARGETS := $(LIB) + +all: $(TARGETS) + +$(LIB): $(obj).depend $(OBJS) + $(call cmd_link_o_target, $(OBJS)) + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/arch/sandbox/lib/board.c b/arch/sandbox/lib/board.c new file mode 100644 index 0000000..4e61e9c --- /dev/null +++ b/arch/sandbox/lib/board.c @@ -0,0 +1,288 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * + * (C) Copyright 2002-2006 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * (C) Copyright 2002 + * Sysgo Real-Time Solutions, GmbH <www.elinos.com> + * Marius Groeger mgroeger@sysgo.de + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +/* + * This file was taken from ARM and changed to remove things we don't + * need. This is most of it, so have tried to avoid being over-zealous! + * For example, we want to have an emulation of the 'DRAM' used by + * U-Boot. + * + * has been talk upstream of unifying the architectures w.r.t board.c, + * so the less change here the better. + */ + +#include <common.h> +#include <command.h> +#include <malloc.h> +#include <stdio_dev.h> +#include <timestamp.h> +#include <version.h> +#include <serial.h> + +DECLARE_GLOBAL_DATA_PTR; + +/************************************************************************ + * Init Utilities * + ************************************************************************ + * Some of this code should be moved into the core functions, + * or dropped completely, + * but let's get it working (again) first... + */ + +static int display_banner(void) +{ + display_options(); + debug("U-Boot code: %08lX -> %08lX BSS: -> %08lX\n", + _TEXT_BASE, + _bss_start_ofs+_TEXT_BASE, _bss_end_ofs+_TEXT_BASE); + + return 0; +} + +/** + * Configure and report on the DRAM configuration, which in our case is + * fairly simple. + */ +static int display_dram_config(void) +{ + ulong size = 0; + int i; + + debug("RAM Configuration:\n"); + + for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { +#ifdef DEBUG + printf("Bank #%d: %08lx ", i, gd->bd->bi_dram[i].start); + print_size(gd->bd->bi_dram[i].size, "\n"); +#endif + size += gd->bd->bi_dram[i].size; + } + puts("DRAM: "); + print_size(size, "\n"); + return 0; +} + +/* + * Breathe some life into the board... + * + * Initialize a serial port as console, and carry out some hardware + * tests. + * + * The first part of initialization is running from Flash memory; + * its main purpose is to initialize the RAM so that we + * can relocate the monitor code to RAM. + */ + +/* + * All attempts to come up with a "common" initialization sequence + * that works for all boards and architectures failed: some of the + * requirements are just _too_ different. To get rid of the resulting + * mess of board dependent #ifdef'ed code we now make the whole + * initialization sequence configurable to the user. + * + * The requirements for any new initalization function is simple: it + * receives a pointer to the "global data" structure as it's only + * argument, and returns an integer return code, where 0 means + * "continue" and != 0 means "fatal error, hang the system". + */ +typedef int (init_fnc_t) (void); + +void __dram_init_banksize(void) +{ + gd->bd->bi_dram[0].start = 0; + gd->bd->bi_dram[0].size = gd->ram_size; +} + +void dram_init_banksize(void) + __attribute__((weak, alias("__dram_init_banksize"))); + +init_fnc_t *init_sequence[] = { +#if defined(CONFIG_ARCH_CPU_INIT) + arch_cpu_init, /* basic arch cpu dependent setup */ +#endif +#if defined(CONFIG_BOARD_EARLY_INIT_F) + board_early_init_f, +#endif + timer_init, /* initialize timer */ + env_init, /* initialize environment */ + serial_init, /* serial communications setup */ + console_init_f, /* stage 1 init of console */ + display_banner, /* say that we are here */ +#if defined(CONFIG_DISPLAY_CPUINFO) + print_cpuinfo, /* display cpu info (and speed) */ +#endif +#if defined(CONFIG_DISPLAY_BOARDINFO) + checkboard, /* display board info */ +#endif + dram_init, /* configure available RAM banks */ + NULL, +}; + +void board_init_f(ulong bootflag) +{ + init_fnc_t **init_fnc_ptr; + uchar *mem; + unsigned long addr_sp, addr, size; + + gd = malloc(sizeof(gd_t)); + assert(gd); + + memset((void *)gd, 0, sizeof(gd_t)); + + gd->mon_len = 0; /* _bss_end_ofs;*/ + + for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { + if ((*init_fnc_ptr)() != 0) + hang(); + } + + size = 128 * 1024 * 1024; + mem = malloc(size); + assert(mem); + gd->ram_buf = mem; + addr = (ulong)(mem + size); + + /* + * reserve memory for malloc() arena + */ + addr_sp = addr - TOTAL_MALLOC_LEN; + debug("Reserving %dk for malloc() at: %08lx\n", + TOTAL_MALLOC_LEN >> 10, addr_sp); + /* + * (permanently) allocate a Board Info struct + * and a permanent copy of the "global" data + */ + addr_sp -= sizeof(bd_t); + gd->bd = (bd_t *) addr_sp; + debug("Reserving %zu Bytes for Board Info at: %08lx\n", + sizeof(bd_t), addr_sp); + +#ifdef CONFIG_POST + post_bootmode_init(); + post_run(NULL, POST_ROM | post_bootmode_get(0)); +#endif + + /* Ram ist board specific, so move it to board code ... */ + dram_init_banksize(); + display_dram_config(); /* and display it */ + + /* We don't relocate, so just run the post-relocation code */ + board_init_r(NULL, 0); + + /* NOTREACHED - no way out of command loop except booting */ +} + +/************************************************************************ + * + * This is the next part if the initialization sequence: we are now + * running from RAM and have a "normal" C environment, i. e. global + * data can be written, BSS has been cleared, the stack size in not + * that critical any more, etc. + * + ************************************************************************ + */ + +void board_init_r(gd_t *id, ulong dest_addr) +{ + + if (id) + gd = id; + + gd->flags |= GD_FLG_RELOC; /* tell others: relocation done */ + + board_init(); /* Setup chipselects */ + +#ifdef CONFIG_SERIAL_MULTI + serial_initialize(); +#endif + +#ifdef CONFIG_POST + post_output_backlog(); +#endif + +#if 0 /* Sandbox uses system malloc for now */ + /* The Malloc area is immediately below the monitor copy in DRAM */ + malloc_start = dest_addr - TOTAL_MALLOC_LEN; + mem_malloc_init(malloc_start, TOTAL_MALLOC_LEN); +#endif + + /* initialize environment */ + env_relocate(); + + /* IP Address */ + gd->bd->bi_ip_addr = getenv_IPaddr("ipaddr"); + + stdio_init(); /* get the devices list going. */ + + jumptable_init(); + + console_init_r(); /* fully init console as a device */ + +#if defined(CONFIG_DISPLAY_BOARDINFO_LATE) + checkboard(); +#endif + +#if defined(CONFIG_ARCH_MISC_INIT) + /* miscellaneous arch dependent initialisations */ + arch_misc_init(); +#endif +#if defined(CONFIG_MISC_INIT_R) + /* miscellaneous platform dependent initialisations */ + misc_init_r(); +#endif + + /* set up exceptions */ + interrupt_init(); + /* enable exceptions */ + enable_interrupts(); + +#ifdef BOARD_LATE_INIT + board_late_init(); +#endif + +#ifdef CONFIG_POST + post_run(NULL, POST_RAM | post_bootmode_get(0)); +#endif + + /* + * For now, run the main loop. Later we might let this be done + * in the main program. + */ + while (1) + main_loop(); + + /* NOTREACHED - no way out of command loop except booting */ +} + +void hang(void) +{ + puts("### ERROR ### Please RESET the board ###\n"); + for (;;) + ; +} diff --git a/arch/sandbox/lib/interrupts.c b/arch/sandbox/lib/interrupts.c new file mode 100644 index 0000000..d350108 --- /dev/null +++ b/arch/sandbox/lib/interrupts.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> + +int interrupt_init(void) +{ + return 0; +} + +void enable_interrupts(void) +{ + return; +} +int disable_interrupts(void) +{ + return 0; +}

This adds basic files for the sandbox board. The lds file is very simple since we can rely mostly on the linker defaults.
Signed-off-by: Simon Glass sjg@chromium.org --- Changes in v2: - Remove clean and dist-clean targets from Makefile - Move lds script out of the board directory
board/sandbox/sandbox/Makefile | 44 +++++++++++++++++++++++++++++++ board/sandbox/sandbox/sandbox.c | 54 +++++++++++++++++++++++++++++++++++++++ boards.cfg | 1 + 3 files changed, 99 insertions(+), 0 deletions(-) create mode 100644 board/sandbox/sandbox/Makefile create mode 100644 board/sandbox/sandbox/sandbox.c
diff --git a/board/sandbox/sandbox/Makefile b/board/sandbox/sandbox/Makefile new file mode 100644 index 0000000..985ee2c --- /dev/null +++ b/board/sandbox/sandbox/Makefile @@ -0,0 +1,44 @@ +# +# Copyright (c) 2011 The Chromium OS Authors. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program 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 Foundatio; either version 2 of +# the License, or (at your option) any later version. +# +# This program 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 program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# + +include $(TOPDIR)/config.mk + +$(shell mkdir -p $(obj)../common) + +LIB = $(obj)lib$(BOARD).o + +COBJS := $(BOARD).o + +SRCS := $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS)) + +$(LIB): $(obj).depend $(OBJS) + $(AR) $(ARFLAGS) $@ $(OBJS) + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/board/sandbox/sandbox/sandbox.c b/board/sandbox/sandbox/sandbox.c new file mode 100644 index 0000000..c12c231 --- /dev/null +++ b/board/sandbox/sandbox/sandbox.c @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> + +/* + * Pointer to initial global data area + * + * Here we initialize it. + */ +#undef XTRN_DECLARE_GLOBAL_DATA_PTR +#define XTRN_DECLARE_GLOBAL_DATA_PTR /* empty = allocate here */ +DECLARE_GLOBAL_DATA_PTR; + +gd_t *gd; + + +void flush_cache(unsigned long start, unsigned long size) +{ +} + +ulong get_timer(ulong base) +{ + return 0; +} + +int timer_init(void) +{ + return 0; +} + +int dram_init(void) +{ + gd->ram_size = CONFIG_DRAM_SIZE; + return 0; +} diff --git a/boards.cfg b/boards.cfg index 8a5bfc1..2af8473 100644 --- a/boards.cfg +++ b/boards.cfg @@ -259,6 +259,7 @@ tcm-bf518 blackfin blackfin tcm-bf537 blackfin blackfin eNET x86 x86 eNET - sc520 eNET:SYS_TEXT_BASE=0x38040000 eNET_SRAM x86 x86 eNET - sc520 eNET:SYS_TEXT_BASE=0x19000000 +sandbox sandbox sandbox sandbox sandbox - idmr m68k mcf52x2 TASREG m68k mcf52x2 tasreg esd M5208EVBE m68k mcf52x2 m5208evbe freescale

This is required for the bdinfo command to work.
This also cleans up the #ifdef mess for ethernet and lnum a little.
Signed-off-by: Simon Glass sjg@chromium.org --- common/cmd_bdinfo.c | 34 ++++++++++++++++++++++++++++++---- 1 files changed, 30 insertions(+), 4 deletions(-)
diff --git a/common/cmd_bdinfo.c b/common/cmd_bdinfo.c index 6051120..0faca6f 100644 --- a/common/cmd_bdinfo.c +++ b/common/cmd_bdinfo.c @@ -31,11 +31,14 @@ DECLARE_GLOBAL_DATA_PTR;
static void print_num(const char *, ulong);
-#if !(defined(CONFIG_ARM) || defined(CONFIG_M68K)) || defined(CONFIG_CMD_NET) +#if !(defined(CONFIG_ARM) || defined(CONFIG_M68K) || defined(CONFIG_SANDBOX)) + || defined(CONFIG_CMD_NET) +#define HAVE_PRINT_ETH static void print_eth(int idx); #endif
-#if (!defined(CONFIG_ARM) && !defined(CONFIG_X86)) +#if (!defined(CONFIG_ARM) && !defined(CONFIG_X86) && !defined(CONFIG_SANDBOX)) +#define HAVE_PRINT_LNUM static void print_lnum(const char *, u64); #endif
@@ -413,6 +416,29 @@ int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) return 0; }
+#elif defined(CONFIG_SANDBOX) + +int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + int i; + bd_t *bd = gd->bd; + + print_num("boot_params", (ulong)bd->bi_boot_params); + + for (i = 0; i < CONFIG_NR_DRAM_BANKS; ++i) { + print_num("DRAM bank", i); + print_num("-> start", bd->bi_dram[i].start); + print_num("-> size", bd->bi_dram[i].size); + } + +#if defined(CONFIG_CMD_NET) + print_eth(0); + printf("ip_addr = %pI4\n", &bd->bi_ip_addr); +#endif + print_num("FB base ", gd->fb_base); + return 0; +} + #else #error "a case for this architecture does not exist!" #endif @@ -422,7 +448,7 @@ static void print_num(const char *name, ulong value) printf("%-12s= 0x%08lX\n", name, value); }
-#if !(defined(CONFIG_ARM) || defined(CONFIG_M68K)) || defined(CONFIG_CMD_NET) +#ifdef HAVE_PRINT_ETH static void print_eth(int idx) { char name[10], *val; @@ -437,7 +463,7 @@ static void print_eth(int idx) } #endif
-#if (!defined(CONFIG_ARM) && !defined(CONFIG_X86)) +#ifdef HAVE_PRINT_LNUM static void print_lnum(const char *name, u64 value) { printf("%-12s= 0x%.8llX\n", name, value);

This adds sandbox architecture support to bootm, although it is probably not useful to load sandbox code into the address space and execute it.
This change at least make the file build correctly on 64-bit machines.
Signed-off-by: Simon Glass sjg@chromium.org --- Changes in v2: - Fix cast of int to pointer instead of just removing the code
common/cmd_bootm.c | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index 8909ee7..47bd505 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -187,6 +187,8 @@ void arch_preboot_os(void) __attribute__((weak, alias("__arch_preboot_os"))); #define IH_INITRD_ARCH IH_ARCH_SH #elif defined(__sparc__) #define IH_INITRD_ARCH IH_ARCH_SPARC +#elif defined(CONFIG_SANDBOX_ARCH) + #define IH_INITRD_ARCH IH_ARCH_SANDBOX #else # error Unknown CPU type #endif @@ -462,9 +464,8 @@ static int bootm_start_standalone(ulong iflag, int argc, char * const argv[]) setenv("filesize", buf); return 0; } - appl = (int (*)(int, char * const []))ntohl(images.ep); + appl = (int (*)(int, char * const []))(ulong)ntohl(images.ep); (*appl)(argc-1, &argv[1]); - return 0; }
@@ -488,14 +489,14 @@ static cmd_tbl_t cmd_bootm_sub[] = { int do_bootm_subcommand (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { int ret = 0; - int state; + long state; cmd_tbl_t *c; boot_os_fn *boot_fn;
c = find_cmd_tbl(argv[1], &cmd_bootm_sub[0], ARRAY_SIZE(cmd_bootm_sub));
if (c) { - state = (int)c->cmd; + state = (long)c->cmd;
/* treat start special since it resets the state machine */ if (state == BOOTM_STATE_START) {

We prefer to U-Boot's malloc but for now it is easier to use the C library's version.
Signed-off-by: Simon Glass sjg@chromium.org --- common/Makefile | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/common/Makefile b/common/Makefile index 2edbd71..8d17a54 100644 --- a/common/Makefile +++ b/common/Makefile @@ -29,7 +29,9 @@ LIB = $(obj)libcommon.o ifndef CONFIG_SPL_BUILD COBJS-y += main.o COBJS-y += command.o +ifndef CONFIG_SANDBOX COBJS-y += dlmalloc.o +endif COBJS-y += exports.o COBJS-$(CONFIG_SYS_HUSH_PARSER) += hush.o COBJS-y += image.o

This is not useful on the sandbox architecture since we can simply link all our code with U-Boot. Also, loading native code doesn't make a lot of sense.
Signed-off-by: Simon Glass sjg@chromium.org --- Makefile | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/Makefile b/Makefile index e9ba6a4..672b5cd 100644 --- a/Makefile +++ b/Makefile @@ -137,9 +137,7 @@ unexport CDPATH
# The "tools" are needed early, so put this first # Don't include stuff already done in $(LIBS) -SUBDIRS = tools \ - examples/standalone \ - examples/api +SUBDIRS = tools
.PHONY : $(SUBDIRS) $(VERSION_FILE)
@@ -156,6 +154,11 @@ sinclude $(obj)include/autoconf.mk include $(obj)include/config.mk export ARCH CPU BOARD VENDOR SOC
+ifndef CONFIG_SANDBOX +SUBDIRS += examples/standalone \ + examples/api +endif + # set default to nothing for native builds ifeq ($(HOSTARCH),$(ARCH)) CROSS_COMPILE ?=

By default sections are 16-byte aligned on some architectures, but the command name structure (struct cmd_tbl_s) does not have padding to 16 bytes. This change reduces the alignment to 4-bytes so that the command table can be accessed correctly on any architecture.
(Note: this needs doing properly)
Signed-off-by: Simon Glass sjg@chromium.org --- include/command.h | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/include/command.h b/include/command.h index 377e201..6f8b29a 100644 --- a/include/command.h +++ b/include/command.h @@ -128,7 +128,8 @@ extern int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]); #define CMD_FLAG_REPEAT 0x0001 /* repeat last command */ #define CMD_FLAG_BOOTD 0x0002 /* command is from bootd */
-#define Struct_Section __attribute__ ((unused,section (".u_boot_cmd"))) +#define Struct_Section __attribute__((unused, section(".u_boot_cmd"), \ + aligned(4)))
#ifdef CONFIG_AUTO_COMPLETE # define _CMD_COMPLETE(x) x,

We want to keep all OS-dependent code in once place, with a simple interface to U-Boot. For now, this is that place.
Signed-off-by: Simon Glass sjg@chromium.org --- Changes in v2: - Move os layer into arch/sandbox - Remove clean and dist-clean targets from Makefile - Try and fail to remove the global -I/usr/include
arch/sandbox/config.mk | 3 ++ arch/sandbox/cpu/sandbox/Makefile | 7 ++++- arch/sandbox/cpu/sandbox/os.c | 49 +++++++++++++++++++++++++++++++++++++ include/os.h | 27 ++++++++++++++++++++ 4 files changed, 85 insertions(+), 1 deletions(-) create mode 100644 arch/sandbox/cpu/sandbox/os.c create mode 100644 include/os.h
diff --git a/arch/sandbox/config.mk b/arch/sandbox/config.mk index ab33026..8aa5b3c 100644 --- a/arch/sandbox/config.mk +++ b/arch/sandbox/config.mk @@ -18,3 +18,6 @@ # MA 02111-1307 USA
PLATFORM_CPPFLAGS += -DCONFIG_SANDBOX -D__SANDBOX__ + +# Use this until we get cpu/sandbox/Makefile doing its job +PLATFORM_CPPFLAGS += -I/usr/include diff --git a/arch/sandbox/cpu/sandbox/Makefile b/arch/sandbox/cpu/sandbox/Makefile index 8dfa828..71360a5 100644 --- a/arch/sandbox/cpu/sandbox/Makefile +++ b/arch/sandbox/cpu/sandbox/Makefile @@ -23,11 +23,16 @@ # MA 02111-1307 USA #
+# I want to do this, but it doesn't seem to work +CFLAGS_arch/sandbox/cpu/sandbox/os.o += -I/usr/include +# does the config.mk line only work with board/ ? +# BCURDIR = $(subst $(SRCTREE)/,,$(CURDIR:$(obj)%=%)) + include $(TOPDIR)/config.mk
LIB = $(obj)lib$(CPU).o
-COBJS := cpu.o +COBJS := cpu.o os.o
SRCS := $(COBJS:.o=.c) OBJS := $(addprefix $(obj),$(COBJS)) diff --git a/arch/sandbox/cpu/sandbox/os.c b/arch/sandbox/cpu/sandbox/os.c new file mode 100644 index 0000000..8df7b7e --- /dev/null +++ b/arch/sandbox/cpu/sandbox/os.c @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <fcntl.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> + +#include <os.h> + +/* Operating System Interface */ + +ssize_t os_read(int fd, void *buf, size_t count) +{ + return read(fd, buf, count); +} + +ssize_t os_write(int fd, const void *buf, size_t count) +{ + return write(fd, buf, count); +} + +int os_open(const char *pathname, int flags) +{ + return open(pathname, flags); +} + +int os_close(int fd) +{ + return close(fd); +} diff --git a/include/os.h b/include/os.h new file mode 100644 index 0000000..3010920 --- /dev/null +++ b/include/os.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +/* Operating System Interface */ + +ssize_t os_read(int fd, void *buf, size_t count); +ssize_t os_write(int fd, const void *buf, size_t count); +int os_open(const char *pathname, int flags); +int os_close(int fd);

On Friday, September 23, 2011 12:22:15 Simon Glass wrote:
arch/sandbox/cpu/sandbox/Makefile | 7 ++++- arch/sandbox/cpu/sandbox/os.c | 49
you don't need to follow the "SoC" convention. arch/sandbox/cpu/*.c should work fine ...
--- a/arch/sandbox/cpu/sandbox/Makefile +++ b/arch/sandbox/cpu/sandbox/Makefile
+# I want to do this, but it doesn't seem to work +CFLAGS_arch/sandbox/cpu/sandbox/os.o += -I/usr/include
seems to work for me ... CFLAGS_arch/blackfin/lib/board.o = -ffoo
if you edit config.mk like so, does that help you figure out what is wrong ?
--- a/config.mk +++ b/config.mk @@ -280,6 +280,8 @@ $(obj)%.s: %.S $(CPP) $(ALL_AFLAGS) -o $@ $< $(obj)%.o: %.S + echo $(BCURDIR)/$(@F) + echo $(ALL_CFLAGS) $(CC) $(ALL_AFLAGS) -o $@ $< -c $(obj)%.o: %.c $(CC) $(ALL_CFLAGS) -o $@ $< -c
--- /dev/null +++ b/arch/sandbox/cpu/sandbox/os.c
+int os_open(const char *pathname, int flags) +{
- return open(pathname, flags);
+}
i guess since u-boot can't really create files, we don't need to support the 3rd arg (mode) ... what about creating file-backed flash devices on the fly ? -mike

Hi Mike,
On Sun, Sep 25, 2011 at 10:16 PM, Mike Frysinger vapier@gentoo.org wrote:
On Friday, September 23, 2011 12:22:15 Simon Glass wrote:
arch/sandbox/cpu/sandbox/Makefile | 7 ++++- arch/sandbox/cpu/sandbox/os.c | 49
you don't need to follow the "SoC" convention. arch/sandbox/cpu/*.c should work fine ...
OK, will do.
--- a/arch/sandbox/cpu/sandbox/Makefile +++ b/arch/sandbox/cpu/sandbox/Makefile
+# I want to do this, but it doesn't seem to work +CFLAGS_arch/sandbox/cpu/sandbox/os.o += -I/usr/include
seems to work for me ... CFLAGS_arch/blackfin/lib/board.o = -ffoo
That is not a -I flag, though. If you try -I I think you will get a failure. Looking a bit closer it is because the dependency stuff uses CPPFLAGS which doesn't support per file/dir flags.
if you edit config.mk like so, does that help you figure out what is wrong ?
--- a/config.mk +++ b/config.mk @@ -280,6 +280,8 @@ $(obj)%.s: %.S $(CPP) $(ALL_AFLAGS) -o $@ $< $(obj)%.o: %.S
- echo $(BCURDIR)/$(@F)
- echo $(ALL_CFLAGS)
$(CC) $(ALL_AFLAGS) -o $@ $< -c $(obj)%.o: %.c $(CC) $(ALL_CFLAGS) -o $@ $< -c
--- /dev/null +++ b/arch/sandbox/cpu/sandbox/os.c
+int os_open(const char *pathname, int flags) +{
- return open(pathname, flags);
+}
i guess since u-boot can't really create files, we don't need to support the 3rd arg (mode) ... what about creating file-backed flash devices on the fly ? -mike
Who would ever want that? :-) Even if we do it's not clear that we want to set the mode, so would prefer to leave this bit for now.
Regards, Simon

On Monday, September 26, 2011 17:04:49 Simon Glass wrote:
On Sun, Sep 25, 2011 at 10:16 PM, Mike Frysinger wrote:
On Friday, September 23, 2011 12:22:15 Simon Glass wrote:
--- a/arch/sandbox/cpu/sandbox/Makefile +++ b/arch/sandbox/cpu/sandbox/Makefile
+# I want to do this, but it doesn't seem to work +CFLAGS_arch/sandbox/cpu/sandbox/os.o += -I/usr/include
seems to work for me ... CFLAGS_arch/blackfin/lib/board.o = -ffoo
That is not a -I flag, though. If you try -I I think you will get a failure. Looking a bit closer it is because the dependency stuff uses CPPFLAGS which doesn't support per file/dir flags.
OK, if it's the dependency step, that's a different story. untested patch:
--- a/config.mk +++ b/config.mk @@ -277,6 +277,8 @@ BCURDIR = $(subst $(SRCTREE)/,,$(CURDIR:$(obj)%=%)) ALL_AFLAGS = $(AFLAGS) $(AFLAGS_$(BCURDIR)/$(@F)) $(AFLAGS_$(BCURDIR)) ALL_CFLAGS = $(CFLAGS) $(CFLAGS_$(BCURDIR)/$(@F)) $(CFLAGS_$(BCURDIR)) +EXTRA_CPPFLAGS = $(CPPFLAGS_$(BCURDIR)/$(@F)) $(CPPFLAGS_$(BCURDIR)) +ALL_CFLAGS += $(EXTRA_CPPFLAGS) $(obj)%.s: %.S $(CPP) $(ALL_AFLAGS) -o $@ $< $(obj)%.o: %.S --- a/rules.mk +++ b/rules.mk @@ -30,7 +30,7 @@ @touch $@ @for f in $(SRCS); do \ g=`basename $$f | sed -e 's/(.*).[[:alnum:]_]/\1.o/'`; \ - $(CC) -M $(CPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; \ + $(CC) -M $(CPPFLAGS) $(EXTRA_CPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; \ done @for f in $(HOSTSRCS); do \ g=`basename $$f | sed -e 's/(.*).[[:alnum:]_]/\1.o/'`; \
-mike

Hi Mike,
On Mon, Sep 26, 2011 at 2:19 PM, Mike Frysinger vapier@gentoo.org wrote:
On Monday, September 26, 2011 17:04:49 Simon Glass wrote:
On Sun, Sep 25, 2011 at 10:16 PM, Mike Frysinger wrote:
On Friday, September 23, 2011 12:22:15 Simon Glass wrote:
--- a/arch/sandbox/cpu/sandbox/Makefile +++ b/arch/sandbox/cpu/sandbox/Makefile
+# I want to do this, but it doesn't seem to work +CFLAGS_arch/sandbox/cpu/sandbox/os.o += -I/usr/include
seems to work for me ... CFLAGS_arch/blackfin/lib/board.o = -ffoo
That is not a -I flag, though. If you try -I I think you will get a failure. Looking a bit closer it is because the dependency stuff uses CPPFLAGS which doesn't support per file/dir flags.
OK, if it's the dependency step, that's a different story. untested patch:
--- a/config.mk +++ b/config.mk @@ -277,6 +277,8 @@ BCURDIR = $(subst $(SRCTREE)/,,$(CURDIR:$(obj)%=%)) ALL_AFLAGS = $(AFLAGS) $(AFLAGS_$(BCURDIR)/$(@F)) $(AFLAGS_$(BCURDIR)) ALL_CFLAGS = $(CFLAGS) $(CFLAGS_$(BCURDIR)/$(@F)) $(CFLAGS_$(BCURDIR)) +EXTRA_CPPFLAGS = $(CPPFLAGS_$(BCURDIR)/$(@F)) $(CPPFLAGS_$(BCURDIR)) +ALL_CFLAGS += $(EXTRA_CPPFLAGS) $(obj)%.s: %.S $(CPP) $(ALL_AFLAGS) -o $@ $< $(obj)%.o: %.S --- a/rules.mk +++ b/rules.mk @@ -30,7 +30,7 @@ @touch $@ @for f in $(SRCS); do \ g=`basename $$f | sed -e 's/(.*).[[:alnum:]_]/\1.o/'`; \
- $(CC) -M $(CPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; \
- $(CC) -M $(CPPFLAGS) $(EXTRA_CPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; \
done @for f in $(HOSTSRCS); do \ g=`basename $$f | sed -e 's/(.*).[[:alnum:]_]/\1.o/'`; \
-mike
Thanks - have been playing with this a bit. The problem is that rules.mk goes through the files in the directory one by one in a shell 'for' loop, so $(@F) isn't relevant. I am wondering in fact where I need to replace the dependency file generation with something which creates separate .deps for each file, and then concats them in a separate rule.
Regards, Simon

On Mon, Sep 26, 2011 at 3:03 PM, Simon Glass sjg@chromium.org wrote:
Hi Mike,
On Mon, Sep 26, 2011 at 2:19 PM, Mike Frysinger vapier@gentoo.org wrote:
On Monday, September 26, 2011 17:04:49 Simon Glass wrote:
On Sun, Sep 25, 2011 at 10:16 PM, Mike Frysinger wrote:
On Friday, September 23, 2011 12:22:15 Simon Glass wrote:
--- a/arch/sandbox/cpu/sandbox/Makefile +++ b/arch/sandbox/cpu/sandbox/Makefile
+# I want to do this, but it doesn't seem to work +CFLAGS_arch/sandbox/cpu/sandbox/os.o += -I/usr/include
seems to work for me ... CFLAGS_arch/blackfin/lib/board.o = -ffoo
That is not a -I flag, though. If you try -I I think you will get a failure. Looking a bit closer it is because the dependency stuff uses CPPFLAGS which doesn't support per file/dir flags.
OK, if it's the dependency step, that's a different story. untested patch:
--- a/config.mk +++ b/config.mk @@ -277,6 +277,8 @@ BCURDIR = $(subst $(SRCTREE)/,,$(CURDIR:$(obj)%=%)) ALL_AFLAGS = $(AFLAGS) $(AFLAGS_$(BCURDIR)/$(@F)) $(AFLAGS_$(BCURDIR)) ALL_CFLAGS = $(CFLAGS) $(CFLAGS_$(BCURDIR)/$(@F)) $(CFLAGS_$(BCURDIR)) +EXTRA_CPPFLAGS = $(CPPFLAGS_$(BCURDIR)/$(@F)) $(CPPFLAGS_$(BCURDIR)) +ALL_CFLAGS += $(EXTRA_CPPFLAGS) $(obj)%.s: %.S $(CPP) $(ALL_AFLAGS) -o $@ $< $(obj)%.o: %.S --- a/rules.mk +++ b/rules.mk @@ -30,7 +30,7 @@ @touch $@ @for f in $(SRCS); do \ g=`basename $$f | sed -e 's/(.*).[[:alnum:]_]/\1.o/'`; \
- $(CC) -M $(CPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; \
- $(CC) -M $(CPPFLAGS) $(EXTRA_CPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; \
done @for f in $(HOSTSRCS); do \ g=`basename $$f | sed -e 's/(.*).[[:alnum:]_]/\1.o/'`; \
-mike
Thanks - have been playing with this a bit. The problem is that rules.mk goes through the files in the directory one by one in a shell 'for' loop, so $(@F) isn't relevant. I am wondering in fact where I need to replace the dependency file generation with something which creates separate .deps for each file, and then concats them in a separate rule.
Just to follow up on this - I was not able to get this to work within the existing .depend generation, because it happens within a shell script with no access to make variables. I have added a patch to change this and will wait for the screams :-)
Regards, Simon

Create a basic empty board_init() to get us running.
Signed-off-by: Simon Glass sjg@chromium.org --- board/sandbox/common/Makefile | 41 +++++++++++++++++++++++++++++++++++++++++ board/sandbox/common/board.c | 25 +++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 0 deletions(-) create mode 100644 board/sandbox/common/Makefile create mode 100644 board/sandbox/common/board.c
diff --git a/board/sandbox/common/Makefile b/board/sandbox/common/Makefile new file mode 100644 index 0000000..8a282e8 --- /dev/null +++ b/board/sandbox/common/Makefile @@ -0,0 +1,41 @@ +# Copyright (c) 2011 The Chromium OS Authors. +# See file CREDITS for list of people who contributed to this +# project. +# +# This program 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 program 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 program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA + +include $(TOPDIR)/config.mk + +LIB = $(obj)lib$(VENDOR).o + +COBJS-y += board.o + +COBJS := $(COBJS-y) +SRCS := $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS)) + +all: $(LIB) + +$(LIB): $(obj).depend $(OBJS) + $(call cmd_link_o_target, $(OBJS)) + +######################################################################### +# This is for $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/board/sandbox/common/board.c b/board/sandbox/common/board.c new file mode 100644 index 0000000..de3cf06 --- /dev/null +++ b/board/sandbox/common/board.c @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +void board_init(void) +{ + /* Nothing to do here for the moment */ +}

Add a main program so that we can run U-Boot.
Signed-off-by: Simon Glass sjg@chromium.org --- board/sandbox/common/Makefile | 2 +- board/sandbox/common/main.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletions(-) create mode 100644 board/sandbox/common/main.c
diff --git a/board/sandbox/common/Makefile b/board/sandbox/common/Makefile index 8a282e8..3d03405 100644 --- a/board/sandbox/common/Makefile +++ b/board/sandbox/common/Makefile @@ -21,7 +21,7 @@ include $(TOPDIR)/config.mk
LIB = $(obj)lib$(VENDOR).o
-COBJS-y += board.o +COBJS-y += board.o main.o
COBJS := $(COBJS-y) SRCS := $(COBJS:.o=.c) diff --git a/board/sandbox/common/main.c b/board/sandbox/common/main.c new file mode 100644 index 0000000..685793e --- /dev/null +++ b/board/sandbox/common/main.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> + +int main(int argc, char *argv[]) +{ + /* + * Do pre- and post-relocation init, then start up U-Boot. This will + * never return. + */ + board_init_f(0); + + return 0; +}

This uart simply writes to stdout and reads from stdin. We might imagine instead buffering the data so that a test interface can check output and inject input.
Signed-off-by: Simon Glass sjg@chromium.org --- drivers/serial/Makefile | 1 + drivers/serial/sandbox.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 0 deletions(-) create mode 100644 drivers/serial/sandbox.c
diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile index 1dcc1c7..6309549 100644 --- a/drivers/serial/Makefile +++ b/drivers/serial/Makefile @@ -53,6 +53,7 @@ COBJS-$(CONFIG_SA1100_SERIAL) += serial_sa1100.o COBJS-$(CONFIG_S3C24X0_SERIAL) += serial_s3c24x0.o COBJS-$(CONFIG_S3C44B0_SERIAL) += serial_s3c44b0.o COBJS-$(CONFIG_XILINX_UARTLITE) += serial_xuartlite.o +COBJS-$(CONFIG_SANDBOX_SERIAL) += sandbox.o COBJS-$(CONFIG_SCIF_CONSOLE) += serial_sh.o COBJS-$(CONFIG_TEGRA2) += serial_tegra2.o
diff --git a/drivers/serial/sandbox.c b/drivers/serial/sandbox.c new file mode 100644 index 0000000..7c4b11b --- /dev/null +++ b/drivers/serial/sandbox.c @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +/* + * This provide a test serial port. It provides an emulated serial port where + * a test program and read out the serial output and inject serial input for + * U-Boot. + */ + +#include <common.h> +#include <os.h> + +int serial_init(void) +{ + return 0; +} + +void serial_exit(void) +{ +} + +void serial_setbrg(void) +{ +} + +void serial_putc(const char ch) +{ + os_write(1, &ch, 1); +} + +void serial_puts(const char *str) +{ + while (*str) + serial_putc(*str++); +} + +int serial_getc(void) +{ + char buf; + int count; + + count = os_read(0, &buf, 1); + return count == 1 ? buf : 0; +} + +int serial_tstc(void) +{ + return 0; +}

This basic provides required features along with a basic command set.
Signed-off-by: Simon Glass sjg@chromium.org --- Changes in v2: - Remove CONFIG_SYS_SDRAM_BASE which is always 0 for sandbox boards - Fix #define<tab> - Remove CONFIG_LMB
include/configs/sandbox.h | 77 +++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 77 insertions(+), 0 deletions(-) create mode 100644 include/configs/sandbox.h
diff --git a/include/configs/sandbox.h b/include/configs/sandbox.h new file mode 100644 index 0000000..0d678f6 --- /dev/null +++ b/include/configs/sandbox.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * See file CREDITS for list of people who contributed to this + * project. + * + * This program 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 program 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 program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#define CONFIG_NR_DRAM_BANKS 1 +#define CONFIG_DRAM_SIZE (128 << 20) + +/* Number of bits in a C 'long' on this architecture */ +#define CONFIG_SANDBOX_BITS_PER_LONG 64 + +/* + * Size of malloc() pool, although we don't actually use this yet. + */ +#define CONFIG_SYS_MALLOC_LEN (4 << 20) /* 4MB */ + +#define CONFIG_SYS_PROMPT "=>" /* Command Prompt */ +#define CONFIG_SYS_HUSH_PARSER +#define CONFIG_SYS_PROMPT_HUSH_PS2 "> " +#define CONFIG_SYS_LONGHELP /* #undef to save memory */ +#define CONFIG_SYS_CBSIZE 1024 /* Console I/O Buffer Size */ + +/* Print Buffer Size */ +#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16) +#define CONFIG_SYS_MAXARGS 16 + +/* turn on command-line edit/c/auto */ +#define CONFIG_CMDLINE_EDITING +#define CONFIG_COMMAND_HISTORY +#define CONFIG_AUTOCOMPLETE + +#define CONFIG_ENV_SIZE 8192 +#define CONFIG_ENV_IS_NOWHERE + +#define CONFIG_SYS_HZ 1000 + +/* Memory things - we don't really want a memory test */ +#define CONFIG_SYS_LOAD_ADDR 0x10000000 +#define CONFIG_SYS_MEMTEST_START 0x10000000 +#define CONFIG_SYS_MEMTEST_END (CONFIG_SYS_MEMTEST_START + 0x1000) +#define CONFIG_PHYS_64BIT + +#define CONFIG_BAUDRATE 115200 +#define CONFIG_SYS_BAUDRATE_TABLE {4800, 9600, 19200, 38400, 57600,\ + 115200} +#define CONFIG_SANDBOX_SERIAL + +#define CONFIG_SYS_NO_FLASH + +/* include default commands */ +#include <config_cmd_default.h> + +/* We don't have networking support yet */ +#undef CONFIG_CMD_NET +#undef CONFIG_CMD_NFS + +#define CONFIG_BOOTARGS "" + +#define CONFIG_EXTRA_ENV_SETTINGS "stdin=serial\0" \ + "stdout=serial\0" \ + "stderr=serial\0"

There are a few variables set but not used - this marks these as unused for the compiler.
Signed-off-by: Simon Glass sjg@chromium.org --- Changes in v2: - Try to avoid needing __attribute__((unused)) by assigning to an existing var
common/cmd_mem.c | 8 ++++---- common/cmd_nvedit.c | 3 +-- 2 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/common/cmd_mem.c b/common/cmd_mem.c index 4daa1b3..d6965e2 100644 --- a/common/cmd_mem.c +++ b/common/cmd_mem.c @@ -471,7 +471,7 @@ int do_mem_base (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
int do_mem_loop (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { - ulong addr, length, i, junk; + ulong addr, length, i; int size; volatile uint *longp; volatile ushort *shortp; @@ -518,7 +518,7 @@ int do_mem_loop (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) longp = (uint *)addr; i = length; while (i-- > 0) - junk = *longp++; + size = *longp++; } } if (size == 2) { @@ -526,14 +526,14 @@ int do_mem_loop (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) shortp = (ushort *)addr; i = length; while (i-- > 0) - junk = *shortp++; + size = *shortp++; } } for (;;) { cp = (u_char *)addr; i = length; while (i-- > 0) - junk = *cp++; + size = *cp++; } }
diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c index e8b116d..101bc49 100644 --- a/common/cmd_nvedit.c +++ b/common/cmd_nvedit.c @@ -460,7 +460,6 @@ int do_env_edit(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { char buffer[CONFIG_SYS_CBSIZE]; char *init_val; - int len;
if (argc < 2) return cmd_usage(cmdtp); @@ -468,7 +467,7 @@ int do_env_edit(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) /* Set read buffer to initial value or empty sting */ init_val = getenv(argv[1]); if (init_val) - len = sprintf(buffer, "%s", init_val); + sprintf(buffer, "%s", init_val); else buffer[0] = '\0';

This fixes a few problems when building on 64-bit machines.
Signed-off-by: Simon Glass sjg@chromium.org --- common/cmd_mem.c | 2 +- common/fdt_support.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/common/cmd_mem.c b/common/cmd_mem.c index d6965e2..badec21 100644 --- a/common/cmd_mem.c +++ b/common/cmd_mem.c @@ -937,7 +937,7 @@ int do_mem_mtest (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if (readback != val) { printf ("\nMem error @ 0x%08X: " "found %08lX, expected %08lX\n", - (uint)addr, readback, val); + (uint)(uintptr_t)addr, readback, val); errs++; if (ctrlc()) { putc ('\n'); diff --git a/common/fdt_support.c b/common/fdt_support.c index 19b2ef6..9bed3ce 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -495,7 +495,7 @@ int fdt_resize(void *blob) total = fdt_num_mem_rsv(blob); for (i = 0; i < total; i++) { fdt_get_mem_rsv(blob, i, &addr, &size); - if (addr == (uint64_t)(u32)blob) { + if (addr == (uintptr_t)blob) { fdt_del_mem_rsv(blob, i); break; } @@ -511,14 +511,14 @@ int fdt_resize(void *blob) fdt_size_dt_strings(blob) + 5 * sizeof(struct fdt_reserve_entry);
/* Make it so the fdt ends on a page boundary */ - actualsize = ALIGN(actualsize + ((uint)blob & 0xfff), 0x1000); - actualsize = actualsize - ((uint)blob & 0xfff); + actualsize = ALIGN(actualsize + ((uintptr_t)blob & 0xfff), 0x1000); + actualsize = actualsize - ((uintptr_t)blob & 0xfff);
/* Change the fdt header to reflect the correct size */ fdt_set_totalsize(blob, actualsize);
/* Add the new reservation */ - ret = fdt_add_mem_rsv(blob, (uint)blob, actualsize); + ret = fdt_add_mem_rsv(blob, (uintptr_t)blob, actualsize); if (ret < 0) return ret;

At this point U-Boot will build and run on x86 under Linux.
The idea is to define a new architecture called 'sandbox', alongside ARM and x86. This runs natively on Linux to suit the host machine. All hardware access is either omitted or emulated.
The purpose of this system is to test the bulk of the non-hardware-specific U-Boot code. We can mock the SPI flash, GPIOs, UART and keyboard, then test that U-Boot behaves as we wish.
Signed-off-by: Simon Glass sjg@chromium.org --- Changes in v2: - Rebase to master - Tidy top-level Makefile to minimise changes
Makefile | 14 +++++++++++--- 1 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/Makefile b/Makefile index 672b5cd..47f6103 100644 --- a/Makefile +++ b/Makefile @@ -199,8 +199,9 @@ endif
######################################################################### # U-Boot objects....order is important (i.e. start must be first) - +ifneq ($(CPU),sandbox) OBJS = $(CPUDIR)/start.o +endif ifeq ($(CPU),x86) OBJS += $(CPUDIR)/start16.o OBJS += $(CPUDIR)/resetvec.o @@ -401,12 +402,19 @@ $(obj)u-boot.ubl: $(obj)u-boot-nand.bin $(obj)tools/mkimage -n $(UBL_CONFIG) -T ublimage \ -e $(CONFIG_SYS_TEXT_BASE) -d $< $@
+ifeq ($(CONFIG_SANDBOX),y) +GEN_UBOOT = \ + cd $(LNDIR) && $(CC) $(SYMS) -T $(obj)u-boot.lds \ + -Wl,--start-group $(__LIBS) -Wl,--end-group \ + $(PLATFORM_LIBS) -Wl,-Map -Wl,u-boot.map -o u-boot +else GEN_UBOOT = \ - UNDEF_SYM=`$(OBJDUMP) -x $(LIBBOARD) $(LIBS) | \ - sed -n -e 's/.*($(SYM_PREFIX)__u_boot_cmd_.*)/-u\1/p'|sort|uniq`;\ + UNDEF_SYM=`$(UNDEF)`; \ cd $(LNDIR) && $(LD) $(LDFLAGS) $(LDFLAGS_$(@F)) $$UNDEF_SYM $(__OBJS) \ --start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \ -Map u-boot.map -o u-boot +endif + $(obj)u-boot: depend \ $(SUBDIRS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) $(obj)u-boot.lds $(GEN_UBOOT)

On Friday, September 23, 2011 12:22:02 Simon Glass wrote:
This patch set points towards a possible way to improve the test infrastructure in U-Boot. The goal is to have a test suite that can run in a minute or two on a Linux PC and test all non-platform code.
do you have this in a public git tree ? -mike

Hi Mike,
On Sun, Sep 25, 2011 at 9:59 PM, Mike Frysinger vapier@gentoo.org wrote:
On Friday, September 23, 2011 12:22:02 Simon Glass wrote:
This patch set points towards a possible way to improve the test infrastructure in U-Boot. The goal is to have a test suite that can run in a minute or two on a Linux PC and test all non-platform code.
do you have this in a public git tree ? -mike
No I don't sorry. The Chromium tree is a bit behind master so if I push there I will create a flood of commits. Is there an easy way to create a branch on the U-Boot server? If not, I will figure something out.
Regards, Simon

On Monday, September 26, 2011 20:07:34 Simon Glass wrote:
On Sun, Sep 25, 2011 at 9:59 PM, Mike Frysinger wrote:
On Friday, September 23, 2011 12:22:02 Simon Glass wrote:
This patch set points towards a possible way to improve the test infrastructure in U-Boot. The goal is to have a test suite that can run in a minute or two on a Linux PC and test all non-platform code.
do you have this in a public git tree ?
No I don't sorry. The Chromium tree is a bit behind master so if I push there I will create a flood of commits. Is there an easy way to create a branch on the U-Boot server? If not, I will figure something out.
if you don't have a dedicated tree already, then i don't think so. easiest thing after that is probably just to push your own branch to the u-boot repo on git.chromium.org. you can push stuff directly to that without going through gerrit right ? -mike
participants (2)
-
Mike Frysinger
-
Simon Glass