X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=payloads%2Flibpayload%2Finclude%2Flibpayload.h;h=488ad488f8cfb7b33795a4e1960c1d48a632f331;hb=56f468d29b4beab59f5a751d8d30364962298328;hp=3ef05f2b3c574e70e524bea7b3e7aa80ec255916;hpb=3a48bdcd361c2ee1c822e07b0db97a61eddc8572;p=coreboot.git diff --git a/payloads/libpayload/include/libpayload.h b/payloads/libpayload/include/libpayload.h index 3ef05f2b3..488ad488f 100644 --- a/payloads/libpayload/include/libpayload.h +++ b/payloads/libpayload/include/libpayload.h @@ -27,7 +27,9 @@ * SUCH DAMAGE. */ -/** @mainpage +/** + * @mainpage + * * @section intro Introduction * libpayload is a small BSD-licensed static library (a lightweight * implementation of common and useful functions) intended to be used @@ -36,21 +38,26 @@ * @section example Example * Here is an example of a very simple payload: * @include sample/hello.c - * */ - #ifndef _LIBPAYLOAD_H #define _LIBPAYLOAD_H +#include +#include #include +#include +#include +#include +#include #include #include #include #include -#include -#include #include +#ifdef CONFIG_LAR +#include +#endif #define MIN(a,b) ((a) < (b) ? (a) : (b)) #define MAX(a,b) ((a) > (b) ? (a) : (b)) @@ -64,42 +71,45 @@ #define RAND_MAX 0x7fffffff -/* Payload information parameters - these are used to pass information - * to the entity loading the payload - * Usage: PAYLOAD_INFO(key, value) - * Example: PAYLOAD_INFO(name, "CoreInfo!") - */ +#define MAX_ARGC_COUNT 10 +/* + * Payload information parameters - these are used to pass information + * to the entity loading the payload. + * Usage: PAYLOAD_INFO(key, value) + * Example: PAYLOAD_INFO(name, "CoreInfo!") + */ #define _pstruct(key) __pinfo_ ##key #define PAYLOAD_INFO(key, value) \ static const char _pstruct(key)[] \ __attribute__((__used__)) \ __attribute__((section(".note.pinfo"),unused)) = #key "=" value -/* Some NVRAM byte definitions */ -#define NVRAM_RTC_SECONDS 0 -#define NVRAM_RTC_MINUTES 2 -#define NVRAM_RTC_HOURS 4 -#define NVRAM_RTC_DAY 7 -#define NVRAM_RTC_MONTH 8 -#define NVRAM_RTC_YEAR 9 -#define NVRAM_RTC_FREQ_SELECT 10 -#define NVRAM_RTC_UIP 0x80 - /** * @defgroup nvram NVRAM and RTC functions * @{ */ + +#define NVRAM_RTC_SECONDS 0 /**< RTC Seconds offset in CMOS */ +#define NVRAM_RTC_MINUTES 2 /**< RTC Minutes offset in CMOS */ +#define NVRAM_RTC_HOURS 4 /**< RTC Hours offset in CMOS */ +#define NVRAM_RTC_DAY 7 /**< RTC Days offset in CMOS */ +#define NVRAM_RTC_MONTH 8 /**< RTC Month offset in CMOS */ +#define NVRAM_RTC_YEAR 9 /**< RTC Year offset in CMOS */ +#define NVRAM_RTC_FREQ_SELECT 10 /**< RTC Update Status Register */ +#define NVRAM_RTC_UIP 0x80 + +/** Broken down time structure */ struct tm { - int tm_sec; - int tm_min; - int tm_hour; - int tm_mday; - int tm_mon; - int tm_year; - int tm_wday; - int tm_yday; - int tm_isdst; + int tm_sec; /**< Number of seconds after the minute */ + int tm_min; /**< Number of minutes after the hour */ + int tm_hour; /**< Number of hours past midnight */ + int tm_mday; /**< The day of the month */ + int tm_mon; /**< The month of the year */ + int tm_year; /**< The number of years since 1900 */ + int tm_wday; /**< The day of the week */ + int tm_yday; /**< The number of days since January 1 */ + int tm_isdst; /**< A flag indicating daylight savings time */ }; u8 nvram_read(u8 addr); @@ -108,11 +118,24 @@ int nvram_updating(void); void rtc_read_clock(struct tm *tm); /** @} */ +/** + * @defgroup usb USB functions + * @{ + */ +int usb_initialize(void); +int usb_exit (void); +int usbhid_havechar(void); +int usbhid_getchar(void); +/** @} */ + /** * @defgroup input Device functions * @{ @} */ +extern void (*reset_handler)(void); +int add_reset_handler(void (*new_handler)(void)); + /** * @defgroup keyboard Keyboard functions * @ingroup input @@ -122,6 +145,7 @@ void keyboard_init(void); int keyboard_havechar(void); unsigned char keyboard_get_scancode(void); int keyboard_getchar(void); +int keyboard_set_layout(char *country); /** @} */ /** @@ -130,15 +154,18 @@ int keyboard_getchar(void); * @{ */ void serial_init(void); -void serial_putchar(unsigned char c); +void serial_putchar(unsigned int c); int serial_havechar(void); int serial_getchar(void); - void serial_clear(void); void serial_start_bold(void); void serial_end_bold(void); +void serial_start_reverse(void); +void serial_end_reverse(void); void serial_start_altcharset(void); void serial_end_altcharset(void); +void serial_set_color(short fg, short bg); +void serial_cursor_enable(int state); void serial_set_cursor(int y, int x); /** @} */ @@ -167,14 +194,32 @@ void video_console_set_cursor(unsigned int cursorx, unsigned int cursory); /** @} */ /* drivers/option.c */ +struct nvram_accessor { + u8 (*read)(u8 reg); + void (*write)(u8 val, u8 reg); +}; + +extern u8 *mem_accessor_base; +extern struct nvram_accessor *use_nvram, *use_mem; + +struct cb_cmos_option_table *get_system_option_table(void); +int options_checksum_valid(const struct nvram_accessor *nvram); +void fix_options_checksum_with(const struct nvram_accessor *nvram); +void fix_options_checksum(void); +int get_option_with(const struct nvram_accessor *nvram, struct cb_cmos_option_table *option_table, void *dest, char *name); +int get_option_from(struct cb_cmos_option_table *option_table, void *dest, char *name); int get_option(void *dest, char *name); +int set_option_with(const struct nvram_accessor *nvram, struct cb_cmos_option_table *option_table, void *value, char *name); +int set_option(void *value, char *name); +int get_option_as_string(const struct nvram_accessor *nvram, struct cb_cmos_option_table *option_table, char **dest, char *name); +int set_option_from_string(const struct nvram_accessor *nvram, struct cb_cmos_option_table *option_table, char *value, char *name); /** * @defgroup console Console functions * @{ */ void console_init(void); -int putchar(int c); +int putchar(unsigned int c); int puts(const char *s); int havekey(void); int getchar(void); @@ -182,56 +227,42 @@ int getchar_timeout(int *ms); extern int last_putchar; -#define havechar havekey -/** @} */ +struct console_input_driver; +struct console_input_driver { + struct console_input_driver *next; + int (*havekey) (void); + int (*getchar) (void); +}; -/** - * @defgroup ctype Character Type Functions - * @{ - */ -int isalnum(int c); -int isalpha(int c); -int isascii(int c); -int isblank(int c); -int iscntrl(int c); -int isdigit(int c); -int isgraph(int c); -int islower(int c); -int isprint(int c); -int ispunct(int c); -int isspace(int c); -int isupper(int c); -int isxdigit(int c); -int tolower(int c); -int toupper(int c); +struct console_output_driver; +struct console_output_driver { + struct console_output_driver *next; + void (*putchar) (unsigned int); +}; + +void console_add_output_driver(struct console_output_driver *out); +void console_add_input_driver(struct console_input_driver *in); + +#define havechar havekey /** @} */ /** - * @defgroup ipchecksum IP Checksum Functions + * @defgroup ipchecksum IP checksum functions * @{ */ unsigned short ipchksum(const void *ptr, unsigned long nbytes); /** @} */ -/** - * @defgroup malloc Memory Allocation Functions - * @{ - */ -void free(void *ptr); -void *malloc(size_t size); -void *calloc(size_t nmemb, size_t size); -void *realloc(void *ptr, size_t size); -/** @} */ /** - * @defgroup exec Execution Functions + * @defgroup exec Execution functions * @{ */ int exec(long addr, int argc, char **argv); /** @} */ /** - * @defgroup misc Misc Functions + * @defgroup misc Misc functions * @{ */ int bcd2dec(int b); @@ -241,41 +272,12 @@ long int labs(long int j); long long int llabs(long long int j); u8 bin2hex(u8 b); u8 hex2bin(u8 h); +void fatal(const char *msg) __attribute__ ((noreturn)); /** @} */ -/** - * @defgroup memory Memory Manipulation Functions - * @{ - */ -void *memset(void *s, int c, size_t n); -void *memcpy(void *dst, const void *src, size_t n); -void *memmove(void *dst, const void *src, size_t n); -int memcmp(const void *s1, const void *s2, size_t len); -/** @} */ - -/** - * @defgroup printf Print Functions - * @{ - */ -int snprintf(char *str, size_t size, const char *fmt, ...); -int sprintf(char *str, const char *fmt, ...); -int vsnprintf(char *str, size_t size, const char *fmt, va_list ap); -int vsprintf(char *str, const char *fmt, va_list ap); -int printf(const char *fmt, ...); -int vprintf(const char *fmt, va_list ap); -/** @} */ /** - * @defgroup rand Random Number Generator Functions - * @{ - */ -int rand_r(unsigned int *seed); -int rand(void); -void srand(unsigned int seed); -/** @} */ - -/** - * @defgroup hash Hashing Functions + * @defgroup hash Hashing functions * @{ */ #define SHA1_BLOCK_LENGTH 64 @@ -288,72 +290,65 @@ typedef struct { void SHA1Init(SHA1_CTX *context); void SHA1Transform(u32 state[5], const u8 buffer[SHA1_BLOCK_LENGTH]); void SHA1Update(SHA1_CTX *context, const u8 *data, size_t len); +void SHA1Pad(SHA1_CTX *context); void SHA1Final(u8 digest[SHA1_DIGEST_LENGTH], SHA1_CTX *context); u8 *sha1(const u8 *data, size_t len, u8 *buf); /** @} */ /** - * @defgroup string String Functions + * @defgroup time Time functions * @{ */ -size_t strnlen(const char *str, size_t maxlen); -size_t strlen(const char *str); -int strcmp(const char *s1, const char *s2); -int strncmp(const char *s1, const char *s2, size_t maxlen); -char *strncpy(char *d, const char *s, size_t n); -char *strcpy(char *d, const char *s); -char *strncat(char *d, const char *s, size_t n); -char *strchr(const char *s, int c); -char *strdup(const char *s); -char *strstr(const char *h, const char *n); -/** @} */ -/** - * @defgroup time Time Functions - * @{ - */ +/** System time structure */ struct timeval { - time_t tv_sec; - suseconds_t tv_usec; + time_t tv_sec; /**< Seconds */ + suseconds_t tv_usec; /**< Microseconds */ }; int gettimeofday(struct timeval *tv, void *tz); /** @} */ +#ifdef CONFIG_LAR /** - * @defgroup lar LAR Functions + * @defgroup lar LAR functions * @{ */ + +/** LAR file header */ struct LAR { - void * start; - int cindex; - int count; - int alloc; - int eof; - void **headers; + void *start; /**< Location of the LAR in memory */ + int cindex; /**< Next file to return in readlar() */ + int count; /**< Number of entries in the header cache */ + int alloc; /**< Number of slots in the header cache */ + int eof; /**< Last entry in the header cache */ + void **headers; /**< Pointer to the header cache */ }; +/** A structure representing the next LAR entry */ struct larent { - u8 name[LAR_MAX_PATHLEN]; + u8 name[LAR_MAX_PATHLEN]; /**< The name of the next LAR entry */ }; +/** A structure containing information about a LAR file */ struct larstat { - u32 len; - u32 reallen; - u32 checksum; - u32 compchecksum; - u32 offset; - u32 compression; - u64 entry; - u64 loadaddress; + u32 len; /**< Length of the file in the LAR */ + u32 reallen; /**< Length of the uncompressed file */ + u32 checksum; /**< Checksum of the uncompressed file */ + u32 compchecksum; /**< Checksum of the compressed file in the LAR */ + u32 offset; /**< Offset of the file in the LAR */ + u32 compression; /**< Compression type of the file */ + u64 entry; /**< Entry point of the file for executables */ + u64 loadaddress; /**< Address in memory to put the uncompressed file */ }; +/** A structure representing a LAR file */ struct LFILE { - struct LAR *lar; - struct lar_header *header; - u32 size; - void *start; - u32 offset; + struct LAR *lar; /**< Pointer to the LAR struct */ + struct lar_header *header; /**< Pointer to the header struct */ + u32 size; /**< Size of the file */ + void *start; /**< Start of the file in memory */ + u32 offset; /**< Offset of the file in the LAR */ }; struct LAR *openlar(void *addr); @@ -363,24 +358,33 @@ void rewindlar(struct LAR *lar); int larstat(struct LAR *lar, const char *path, struct larstat *buf); void *larfptr(struct LAR *lar, const char *filename); int lfverify(struct LAR *lar, const char *filename); -struct LFILE * lfopen(struct LAR *lar, const char *filename); +struct LFILE *lfopen(struct LAR *lar, const char *filename); int lfread(void *ptr, size_t size, size_t nmemb, struct LFILE *stream); -#define SEEK_SET 0 -#define SEEK_CUR 1 -#define SEEK_END 2 - int lfseek(struct LFILE *stream, long offset, int whence); int lfclose(struct LFILE *file); /** @} */ +#endif /** - * @defgroup arch Architecture Specific Functions + * @defgroup info System information functions + * This module contains functions that return information about the system + * @{ + */ + +int sysinfo_have_multiboot(unsigned long *addr); +/** @} */ + +/** + * @defgroup arch Architecture specific functions + * This module contains global architecture specific functions. + * All architectures are expected to define these functions. * @{ */ int get_coreboot_info(struct sysinfo_t *info); +int get_multiboot_info(struct sysinfo_t *info); -void lib_get_sysinfo(void); +int lib_get_sysinfo(void); /* Timer functions - defined by each architecture. */ unsigned int get_cpu_speed(void); @@ -389,16 +393,13 @@ void udelay(unsigned int n); void mdelay(unsigned int n); void delay(unsigned int n); -#define abort() halt() -void halt(void) __attribute__ ((noreturn)); -void fatal(const char* msg) __attribute__ ((noreturn)); -/** @} */ - /** - * @defgroup readline Readline Functions + * @defgroup readline Readline functions + * This interface provides a simple implementation of the standard readline() + * and getline() functions. They read a line of input from the console. * @{ */ -char * readline(const char * prompt); +char *readline(const char *prompt); int getline(char *buffer, int len); /** @} */