diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Kconfig | 5 | ||||
-rw-r--r-- | lib/bootstrap/devfs.c | 11 | ||||
-rw-r--r-- | lib/bootstrap/disk.c | 5 | ||||
-rw-r--r-- | lib/cmdlinepart.c | 7 | ||||
-rw-r--r-- | lib/string.c | 13 | ||||
-rw-r--r-- | lib/vsprintf.c | 64 |
6 files changed, 73 insertions, 32 deletions
diff --git a/lib/Kconfig b/lib/Kconfig index 90552f3c27..e5831ecdb9 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -111,7 +111,7 @@ config LIBFDT config RATP select CRC_ITU_T - select COMPILE_MEMORY + select DEV_MEM select COMMAND_SUPPORT select POLLER depends on CONSOLE_FULL @@ -182,6 +182,9 @@ config ARCH_HAS_STACK_DUMP config ARCH_HAS_DATA_ABORT_MASK bool +config ARCH_HAS_ZERO_PAGE + bool + config HAVE_EFFICIENT_UNALIGNED_ACCESS bool diff --git a/lib/bootstrap/devfs.c b/lib/bootstrap/devfs.c index 6a3dd76cdd..6d28b1cb4d 100644 --- a/lib/bootstrap/devfs.c +++ b/lib/bootstrap/devfs.c @@ -80,8 +80,8 @@ static unsigned int get_image_size(void *head) } #endif -void* bootstrap_read_devfs(const char *devname, bool use_bb, int offset, - int default_size, int max_size) +void* bootstrap_read_devfs(char *devname, bool use_bb, int offset, + int default_size, int max_size, size_t *bufsize) { int ret; int size = 0; @@ -133,10 +133,13 @@ void* bootstrap_read_devfs(const char *devname, bool use_bb, int offset, ret = cdev_read(cdev, to, size, 0, 0); cdev_close(cdev); - if (ret != size) + if (ret != size) { bootstrap_err("%s: failed to read from %s\n", devname, partname); - else + } else { result = to; + if (bufsize) + *bufsize = size; + } free_memory: free(header); diff --git a/lib/bootstrap/disk.c b/lib/bootstrap/disk.c index fd016166e6..ed8b1aa407 100644 --- a/lib/bootstrap/disk.c +++ b/lib/bootstrap/disk.c @@ -14,7 +14,7 @@ #include <libfile.h> #include <bootstrap.h> -void* bootstrap_read_disk(const char *dev, const char *fstype) +void* bootstrap_read_disk(const char *dev, char *fstype, size_t *bufsize) { int ret; void *buf; @@ -34,5 +34,8 @@ void* bootstrap_read_disk(const char *dev, const char *fstype) return NULL; } + if (bufsize) + *bufsize = len; + return buf; } diff --git a/lib/cmdlinepart.c b/lib/cmdlinepart.c index 5a16462874..5e95760bae 100644 --- a/lib/cmdlinepart.c +++ b/lib/cmdlinepart.c @@ -30,7 +30,6 @@ int cmdlinepart_do_parse_one(const char *devname, const char *partstr, char *end; char buf[PATH_MAX] = {}; unsigned long flags = 0; - int ret = 0; struct cdev *cdev; memset(buf, 0, PATH_MAX); @@ -85,11 +84,11 @@ int cmdlinepart_do_parse_one(const char *devname, const char *partstr, cdev = devfs_add_partition(devname, *offset, size, flags, buf); if (IS_ERR(cdev)) { - ret = PTR_ERR(cdev); - printf("cannot create %s: %s\n", buf, strerror(-ret)); + printf("cannot create %s: %pe\n", buf, cdev); + return PTR_ERR(cdev); } - return ret; + return 0; } int cmdlinepart_do_parse(const char *devname, const char *parts, loff_t devsize, diff --git a/lib/string.c b/lib/string.c index 2d0a99eab7..b63041c5fb 100644 --- a/lib/string.c +++ b/lib/string.c @@ -100,6 +100,19 @@ char * strcpy(char * dest,const char *src) #endif EXPORT_SYMBOL(strcpy); +/** + * stpcpy - Copy a %NUL terminated string, but return pointer to %NUL + * @dest: Where to copy the string to + * @src: Where to copy the string from + */ +char *stpcpy(char *dest, const char *src) +{ + while ((*dest++ = *src++) != '\0') + /* nothing */; + return dest - 1; +} +EXPORT_SYMBOL(stpcpy); + #ifndef __HAVE_ARCH_STRNCPY /** * strncpy - Copy a length-limited, %NUL-terminated string diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 6fe0283e84..4834501ff1 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -41,7 +41,8 @@ static int skip_atoi(const char **s) #define SMALL 32 /* Must be 32 == 0x20 */ #define SPECIAL 64 /* 0x */ -static char *number(char *buf, char *end, unsigned long long num, int base, int size, int precision, int type) +static char *number(char *buf, const char *end, unsigned long long num, int base, int size, + int precision, int type) { /* we are called with base 8, 10 or 16, only, thus don't need "G..." */ static const char digits[16] = "0123456789ABCDEF"; /* "GHIJKLMNOPQRSTUVWXYZ"; */ @@ -146,7 +147,8 @@ static char *number(char *buf, char *end, unsigned long long num, int base, int #define PAGE_SIZE 4096 #endif -static char *string(char *buf, char *end, char *s, int field_width, int precision, int flags) +static char *string(char *buf, const char *end, const char *s, int field_width, + int precision, int flags) { int len, i; @@ -175,8 +177,20 @@ static char *string(char *buf, char *end, char *s, int field_width, int precisio return buf; } +static char *raw_pointer(char *buf, const char *end, const void *ptr, int field_width, + int precision, int flags) +{ + flags |= SMALL; + if (field_width == -1) { + field_width = 2*sizeof(void *); + flags |= ZEROPAD; + } + return number(buf, end, (unsigned long) ptr, 16, field_width, precision, flags); +} + #ifndef __PBL__ -static char *symbol_string(char *buf, char *end, void *ptr, int field_width, int precision, int flags) +static char *symbol_string(char *buf, const char *end, const void *ptr, int field_width, + int precision, int flags) { unsigned long value = (unsigned long) ptr; #ifdef CONFIG_KALLSYMS @@ -191,7 +205,7 @@ static char *symbol_string(char *buf, char *end, void *ptr, int field_width, int } static noinline_for_stack -char *ip4_addr_string(char *buf, char *end, const u8 *addr, int field_width, +char *ip4_addr_string(char *buf, const char *end, const u8 *addr, int field_width, int precision, int flags, const char *fmt) { char ip4_addr[sizeof("255.255.255.255")]; @@ -211,9 +225,19 @@ char *ip4_addr_string(char *buf, char *end, const u8 *addr, int field_width, return string(buf, end, ip4_addr, field_width, precision, flags); } +static +char *error_string(char *buf, const char *end, const u8 *errptr, int field_width, + int precision, int flags, const char *fmt) +{ + if (!IS_ERR(errptr)) + return raw_pointer(buf, end, errptr, field_width, precision, flags); + + return string(buf, end, strerror(-PTR_ERR(errptr)), field_width, precision, flags); +} + static noinline_for_stack -char *uuid_string(char *buf, char *end, const u8 *addr, int field_width, - int precision, int flags, const char *fmt) +char *uuid_string(char *buf, const char *end, const u8 *addr, int field_width, + int precision, int flags, const char *fmt) { char uuid[sizeof("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]; char *p = uuid; @@ -259,8 +283,8 @@ char *uuid_string(char *buf, char *end, const u8 *addr, int field_width, } static noinline_for_stack -char *address_val(char *buf, char *end, const void *addr, - int field_width, int precision, int flags, const char *fmt) +char *address_val(char *buf, const char *end, const void *addr, + int field_width, int precision, int flags, const char *fmt) { unsigned long long num; @@ -314,7 +338,8 @@ char *address_val(char *buf, char *end, const void *addr, * function pointers are really function descriptors, which contain a * pointer to the real address. */ -static char *pointer(const char *fmt, char *buf, char *end, void *ptr, int field_width, int precision, int flags) +static char *pointer(const char *fmt, char *buf, const char *end, const void *ptr, + int field_width, int precision, int flags) { switch (*fmt) { case 'S': @@ -341,23 +366,18 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr, int field return ip4_addr_string(buf, end, ptr, field_width, precision, flags, fmt); } break; + case 'e': + return error_string(buf, end, ptr, field_width, precision, flags, fmt); } - flags |= SMALL; - if (field_width == -1) { - field_width = 2*sizeof(void *); - flags |= ZEROPAD; - } - return number(buf, end, (unsigned long) ptr, 16, field_width, precision, flags); + + return raw_pointer(buf, end, ptr, field_width, precision, flags); } + #else -static char *pointer(const char *fmt, char *buf, char *end, void *ptr, int field_width, int precision, int flags) +static char *pointer(const char *fmt, char *buf, const char *end, const void *ptr, + int field_width, int precision, int flags) { - flags |= SMALL; - if (field_width == -1) { - field_width = 2*sizeof(void *); - flags |= ZEROPAD; - } - return number(buf, end, (unsigned long) ptr, 16, field_width, precision, flags); + return raw_pointer(buf, end, ptr, field_width, precision, flags); } #endif |