From df132b9d7854507f7501b20d7134dd18c0c63f2b Mon Sep 17 00:00:00 2001 From: Jean-Christophe PLAGNIOL-VILLARD Date: Tue, 22 Jan 2013 15:40:43 +0100 Subject: introduce common bootstrap code This will allow to have a generic code to create different bootstrap As example Barebox as TI Xloader Barebox as AT91 Bootstrap Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD Signed-off-by: Sascha Hauer --- lib/Kconfig | 2 + lib/Makefile | 1 + lib/bootstrap/Kconfig | 13 ++++++ lib/bootstrap/Makefile | 3 ++ lib/bootstrap/common.c | 24 ++++++++++ lib/bootstrap/devfs.c | 118 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/bootstrap/disk.c | 37 ++++++++++++++++ 7 files changed, 198 insertions(+) create mode 100644 lib/bootstrap/Kconfig create mode 100644 lib/bootstrap/Makefile create mode 100644 lib/bootstrap/common.c create mode 100644 lib/bootstrap/devfs.c create mode 100644 lib/bootstrap/disk.c (limited to 'lib') diff --git a/lib/Kconfig b/lib/Kconfig index db8a6ad7a2..457835316b 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -52,4 +52,6 @@ config LIBMTD source lib/gui/Kconfig +source lib/bootstrap/Kconfig + endmenu diff --git a/lib/Makefile b/lib/Makefile index 85f4ec97b6..43f6ea3632 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -1,3 +1,4 @@ +obj-$(CONFIG_BOOTSTRAP) += bootstrap/ obj-y += ctype.o obj-y += rbtree.o obj-y += display_options.o diff --git a/lib/bootstrap/Kconfig b/lib/bootstrap/Kconfig new file mode 100644 index 0000000000..558da00c7b --- /dev/null +++ b/lib/bootstrap/Kconfig @@ -0,0 +1,13 @@ +menuconfig BOOTSTRAP + bool "Library bootstrap routines " + depends on SHELL_NONE + +if BOOTSTRAP + +config BOOTSTRAP_DEVFS + bool "devfs support" + +config BOOTSTRAP_DISK + bool "disk support" + +endif diff --git a/lib/bootstrap/Makefile b/lib/bootstrap/Makefile new file mode 100644 index 0000000000..cbaa49f9d9 --- /dev/null +++ b/lib/bootstrap/Makefile @@ -0,0 +1,3 @@ +obj-y += common.o +obj-$(CONFIG_BOOTSTRAP_DEVFS) += devfs.o +obj-$(CONFIG_BOOTSTRAP_DISK) += disk.o diff --git a/lib/bootstrap/common.c b/lib/bootstrap/common.c new file mode 100644 index 0000000000..38ec272129 --- /dev/null +++ b/lib/bootstrap/common.c @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2011 Sascha Hauer, Pengutronix + * Copyright (C) 2012 Jean-Christophe PLAGNIOL-VILLARD + * + * Under GPLv2 + */ + +#include +#include +#include + +void bootstrap_boot(int (*func)(void), bool barebox) +{ + if (!func) + return; + + if (barebox && !is_barebox_head((void*)func)) + return; + + shutdown_barebox(); + func(); + + while (1); +} diff --git a/lib/bootstrap/devfs.c b/lib/bootstrap/devfs.c new file mode 100644 index 0000000000..25d07c761c --- /dev/null +++ b/lib/bootstrap/devfs.c @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2011 Sascha Hauer, Pengutronix + * Copyright (C) 2012 Jean-Christophe PLAGNIOL-VILLARD + * + * Under GPLv2 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(CONFIG_ARM) || defined(CONFIG_MIPS) +#if defined(CONFIG_ARM) +#define BAREBOX_HEAD_SIZE ARM_HEAD_SIZE +#define BAREBOX_HEAD_SIZE_OFFSET ARM_HEAD_SIZE_OFFSET +#elif defined(CONFIG_MIPS) +#define BAREBOX_HEAD_SIZE MIPS_HEAD_SIZE +#define BAREBOX_HEAD_SIZE_OFFSET MIPS_HEAD_SIZE_OFFSET +#endif + +static void *read_image_head(const char *name) +{ + void *header = xmalloc(BAREBOX_HEAD_SIZE); + struct cdev *cdev; + int ret; + + cdev = cdev_open(name, O_RDONLY); + if (!cdev) { + bootstrap_err("failed to open partition\n"); + return NULL; + } + + ret = cdev_read(cdev, header, BAREBOX_HEAD_SIZE, 0, 0); + cdev_close(cdev); + + if (ret != BAREBOX_HEAD_SIZE) { + bootstrap_err("failed to read from partition\n"); + return NULL; + } + + return header; +} + +static unsigned int get_image_size(void *head) +{ + unsigned int ret = 0; + unsigned int *psize = head + BAREBOX_HEAD_SIZE_OFFSET; + + if (is_barebox_head(head)) + ret = *psize; + debug("Detected barebox image size %u\n", ret); + + return ret; +} +#else +static void *read_image_head(const char *name) +{ + return NULL; +} + +static unsigned int get_image_size(void *head) +{ + return 0; +} +#endif + +void* bootstrap_read_devfs(char *devname, bool use_bb, int offset, + int default_size, int max_size) +{ + int ret; + int size = 0; + void *to, *header; + struct cdev *cdev; + char *partname = "x"; + + devfs_add_partition(devname, offset, max_size, DEVFS_PARTITION_FIXED, partname); + if (use_bb) { + dev_add_bb_dev(partname, "bbx"); + partname = "bbx"; + } + + header = read_image_head(partname); + if (header) { + size = get_image_size(header); + if (!size) + bootstrap_err("%s: failed to get image size\n", devname); + } + + if (!size) { + size = default_size; + bootstrap_err("%s: failed to detect barebox and it's image size so use %d\n", + devname, size); + } + + to = xmalloc(size); + + cdev = cdev_open(partname, O_RDONLY); + if (!cdev) { + bootstrap_err("%s: failed to open %s\n", devname, partname); + return NULL; + } + + ret = cdev_read(cdev, to, size, 0, 0); + if (ret != size) { + bootstrap_err("%s: failed to read from %s\n", devname, partname); + return NULL; + } + + return to; +} diff --git a/lib/bootstrap/disk.c b/lib/bootstrap/disk.c new file mode 100644 index 0000000000..879d3315e8 --- /dev/null +++ b/lib/bootstrap/disk.c @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2011 Sascha Hauer, Pengutronix + * Copyright (C) 2012 Jean-Christophe PLAGNIOL-VILLARD + * + * Under GPLv2 + */ + +#include +#include +#include +#include +#include +#include +#include + +void* bootstrap_read_disk(char *dev, char *fstype) +{ + int ret; + void *buf; + int len; + char *path = "/"; + + ret = mount(dev, fstype, path); + if (ret) { + bootstrap_err("mounting %s failed with %d\n", dev, ret); + return NULL; + } + + buf = read_file("/barebox.bin", &len); + if (!buf) { + bootstrap_err("could not read barebox.bin from %s\n", dev); + umount(path); + return NULL; + } + + return buf; +} -- cgit v1.2.3