diff options
author | marcel <marcel@FreeBSD.org> | 2008-02-23 17:56:17 +0000 |
---|---|---|
committer | marcel <marcel@FreeBSD.org> | 2008-02-23 17:56:17 +0000 |
commit | 8b1e9609cad9bdf4aeb8812f3935dc2bee900270 (patch) | |
tree | 74c8c8e3534ed7c9577df5a0afd4e9322b643f1d | |
parent | 5012ebc1b9e697321d488f1d26a96656148aa870 (diff) | |
download | FreeBSD-src-8b1e9609cad9bdf4aeb8812f3935dc2bee900270.zip FreeBSD-src-8b1e9609cad9bdf4aeb8812f3935dc2bee900270.tar.gz |
o Build libuboot with -msoft-float like everything else.
o Move the API prototypes to a separate header (glue.h)
o Allow the platform to hint libuboot about where to look
for the API signature. The uboot_address variable is
expected to be defined by the platform.
-rw-r--r-- | sys/boot/uboot/lib/Makefile | 2 | ||||
-rw-r--r-- | sys/boot/uboot/lib/glue.c | 59 | ||||
-rw-r--r-- | sys/boot/uboot/lib/glue.h | 77 |
3 files changed, 88 insertions, 50 deletions
diff --git a/sys/boot/uboot/lib/Makefile b/sys/boot/uboot/lib/Makefile index 0a0c484..564177d 100644 --- a/sys/boot/uboot/lib/Makefile +++ b/sys/boot/uboot/lib/Makefile @@ -11,7 +11,7 @@ CFLAGS+= -I${.CURDIR}/../../../../lib/libstand/ # Pick up the bootstrap header for some interface items CFLAGS+= -I${.CURDIR}/../../common -I${.CURDIR}/../../.. -I. -CFLAGS+= -ffreestanding +CFLAGS+= -ffreestanding -msoft-float .ifdef(BOOT_DISK_DEBUG) # Make the disk code more talkative diff --git a/sys/boot/uboot/lib/glue.c b/sys/boot/uboot/lib/glue.c index 03c713b..f7d9e32 100644 --- a/sys/boot/uboot/lib/glue.c +++ b/sys/boot/uboot/lib/glue.c @@ -29,9 +29,10 @@ __FBSDID("$FreeBSD$"); #include <stand.h> #include "api_public.h" +#include "glue.h" -#undef DEBUG #define DEBUG +#undef DEBUG #ifdef DEBUG #define debugf(fmt, args...) do { printf("%s(): ", __func__); printf(fmt,##args); } while (0) @@ -39,38 +40,8 @@ __FBSDID("$FreeBSD$"); #define debugf(fmt, args...) #endif -/* console */ -int ub_getc(void); -int ub_tstc(void); -void ub_putc(char c); -void ub_puts(const char *s); - -/* system */ -void ub_reset(void); -struct sys_info * ub_get_sys_info(void); - -/* time */ -void ub_udelay(unsigned long); -unsigned long ub_get_timer(unsigned long); - -/* env vars */ -char * ub_env_get(const char *name); -void ub_env_set(const char *name, char *value); -const char * ub_env_enum(const char *last); - -/* devices */ -int ub_dev_enum(void); -int ub_dev_open(int handle); -int ub_dev_close(int handle); -int ub_dev_read(int handle, void *buf, - lbasize_t len, lbastart_t start); -int ub_dev_send(int handle, void *buf, int len); -int ub_dev_recv(int handle, void *buf, int len); - -int api_search_sig(struct api_signature **sig); - -extern int syscall(int, int *, ...); - +/* Some random address used by U-Boot. */ +extern long uboot_address; /* crc32 stuff stolen from lib/libdisk/write_ia64_disk.c */ static uint32_t crc32_tab[] = { @@ -158,10 +129,6 @@ static int valid_sig(struct api_signature *sig) return 1; } -#define API_SEARCH_START (255*1024*1024) /* start at 1MB below the RAM top */ -//#define API_SEARCH_START 0 -#define API_SEARCH_END (256 * 1024 * 1024 - 1) /* ...and search to the end */ - /* * Searches for the U-Boot API signature * @@ -169,14 +136,17 @@ static int valid_sig(struct api_signature *sig) */ int api_search_sig(struct api_signature **sig) { - unsigned char *sp; + unsigned char *sp, *spend; if (sig == NULL) return 0; - sp = (unsigned char *)API_SEARCH_START; + if (uboot_address == 0) + uboot_address = 255 * 1024 * 1024; - while ((sp + (int)API_SIG_MAGLEN) < (unsigned char *)API_SEARCH_END) { + sp = (void *)(uboot_address & ~0x000fffff); + spend = sp + 0x00100000 - API_SIG_MAGLEN; + while (sp < spend) { if (!bcmp(sp, API_SIG_MAGIC, API_SIG_MAGLEN)) { *sig = (struct api_signature *)sp; if (valid_sig(*sig)) @@ -189,15 +159,6 @@ int api_search_sig(struct api_signature **sig) { return 0; } - -/* - * NOTICE: ub_ library calls are part of the application, not U-Boot code! - * They are front-end wrappers that are used by the consumer application: they - * prepare arguments for particular syscall and jump to the low level - * syscall() - * - */ - /**************************************** * * console diff --git a/sys/boot/uboot/lib/glue.h b/sys/boot/uboot/lib/glue.h new file mode 100644 index 0000000..b079415 --- /dev/null +++ b/sys/boot/uboot/lib/glue.h @@ -0,0 +1,77 @@ +/*- + * Copyright (c) 2008 Semihalf, Rafal Jaworowski <raj@semihalf.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +/* + * This is the header file for conveniency wrapper routines (API glue) + */ + +#ifndef _API_GLUE_H_ +#define _API_GLUE_H_ + +int syscall(int, int *, ...); +void * syscall_ptr; + +int api_search_sig(struct api_signature **sig); + +/* + * The ub_ library calls are part of the application, not U-Boot code! They + * are front-end wrappers that are used by the consumer application: they + * prepare arguments for particular syscall and jump to the low level + * syscall() + */ + +/* console */ +int ub_getc(void); +int ub_tstc(void); +void ub_putc(char c); +void ub_puts(const char *s); + +/* system */ +void ub_reset(void); +struct sys_info * ub_get_sys_info(void); + +/* time */ +void ub_udelay(unsigned long); +unsigned long ub_get_timer(unsigned long); + +/* env vars */ +char * ub_env_get(const char *name); +void ub_env_set(const char *name, char *value); +const char * ub_env_enum(const char *last); + +/* devices */ +int ub_dev_enum(void); +int ub_dev_open(int handle); +int ub_dev_close(int handle); +int ub_dev_read(int handle, void *buf, + lbasize_t len, lbastart_t start); +int ub_dev_send(int handle, void *buf, int len); +int ub_dev_recv(int handle, void *buf, int len); +struct device_info * ub_dev_get(int); + +#endif /* _API_GLUE_H_ */ |