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.
This commit is contained in:
parent
5012ebc1b9
commit
8b1e9609ca
@ -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
|
||||
|
@ -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
|
||||
|
77
sys/boot/uboot/lib/glue.h
Normal file
77
sys/boot/uboot/lib/glue.h
Normal file
@ -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_ */
|
Loading…
Reference in New Issue
Block a user