diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/efi_loader/efi_disk.c | 24 | ||||
-rw-r--r-- | lib/tiny-printf.c | 102 |
2 files changed, 74 insertions, 52 deletions
diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c index c434c92250..d8ddcc9b42 100644 --- a/lib/efi_loader/efi_disk.c +++ b/lib/efi_loader/efi_disk.c @@ -31,6 +31,8 @@ struct efi_disk_obj { struct efi_device_path_file_path *dp; /* Offset into disk for simple partitions */ lbaint_t offset; + /* Internal block device */ + const struct blk_desc *desc; }; static efi_status_t efi_disk_open_block(void *handle, efi_guid_t *protocol, @@ -78,8 +80,7 @@ static efi_status_t EFIAPI efi_disk_rw_blocks(struct efi_block_io *this, unsigned long n; diskobj = container_of(this, struct efi_disk_obj, ops); - if (!(desc = blk_get_dev(diskobj->ifname, diskobj->dev_index))) - return EFI_EXIT(EFI_DEVICE_ERROR); + desc = (struct blk_desc *) diskobj->desc; blksz = desc->blksz; blocks = buffer_size / blksz; lba += diskobj->offset; @@ -201,6 +202,10 @@ static void efi_disk_add_dev(const char *name, struct efi_device_path_file_path *dp; int objlen = sizeof(*diskobj) + (sizeof(*dp) * 2); + /* Don't add empty devices */ + if (!desc->lba) + return; + diskobj = calloc(1, objlen); /* Fill in object data */ @@ -213,13 +218,14 @@ static void efi_disk_add_dev(const char *name, diskobj->ifname = if_typename; diskobj->dev_index = dev_index; diskobj->offset = offset; + diskobj->desc = desc; /* Fill in EFI IO Media info (for read/write callbacks) */ diskobj->media.removable_media = desc->removable; diskobj->media.media_present = 1; diskobj->media.block_size = desc->blksz; diskobj->media.io_align = desc->blksz; - diskobj->media.last_block = desc->lba; + diskobj->media.last_block = desc->lba - offset; diskobj->ops.media = &diskobj->media; /* Fill in device path */ @@ -240,7 +246,8 @@ static void efi_disk_add_dev(const char *name, static int efi_disk_create_eltorito(struct blk_desc *desc, const char *if_typename, - int diskid) + int diskid, + const char *pdevname) { int disks = 0; #ifdef CONFIG_ISO_PARTITION @@ -252,8 +259,8 @@ static int efi_disk_create_eltorito(struct blk_desc *desc, return 0; while (!part_get_info(desc, part, &info)) { - snprintf(devname, sizeof(devname), "%s%d:%d", if_typename, - diskid, part); + snprintf(devname, sizeof(devname), "%s:%d", pdevname, + part); efi_disk_add_dev(devname, if_typename, desc, diskid, info.start); part++; @@ -296,7 +303,7 @@ int efi_disk_register(void) * so let's create them here */ disks += efi_disk_create_eltorito(desc, if_typename, - desc->devnum); + desc->devnum, dev->name); } #else int i, if_type; @@ -331,7 +338,8 @@ int efi_disk_register(void) * El Torito images show up as block devices * in an EFI world, so let's create them here */ - disks += efi_disk_create_eltorito(desc, if_typename, i); + disks += efi_disk_create_eltorito(desc, if_typename, + i, devname); } } #endif diff --git a/lib/tiny-printf.c b/lib/tiny-printf.c index 1aa43aba44..30ac7596d3 100644 --- a/lib/tiny-printf.c +++ b/lib/tiny-printf.c @@ -13,29 +13,33 @@ #include <stdarg.h> #include <serial.h> -/* - * This code in here may execute before the DRAM is initialised, so - * we should make sure that it doesn't touch BSS, which some boards - * put in DRAM. - */ -static char *bf __attribute__ ((section(".data"))); -static char zs __attribute__ ((section(".data"))); +struct printf_info { + char *bf; /* Digit buffer */ + char zs; /* non-zero if a digit has been written */ + char *outstr; /* Next output position for sprintf() */ -/* Current position in sprintf() output string */ -static char *outstr __attribute__ ((section(".data"))); + /* Output a character */ + void (*putc)(struct printf_info *info, char ch); +}; -static void out(char c) +void putc_normal(struct printf_info *info, char ch) { - *bf++ = c; + putc(ch); } -static void out_dgt(char dgt) +static void out(struct printf_info *info, char c) { - out(dgt + (dgt < 10 ? '0' : 'a' - 10)); - zs = 1; + *info->bf++ = c; } -static void div_out(unsigned int *num, unsigned int div) +static void out_dgt(struct printf_info *info, char dgt) +{ + out(info, dgt + (dgt < 10 ? '0' : 'a' - 10)); + info->zs = 1; +} + +static void div_out(struct printf_info *info, unsigned int *num, + unsigned int div) { unsigned char dgt = 0; @@ -44,11 +48,11 @@ static void div_out(unsigned int *num, unsigned int div) dgt++; } - if (zs || dgt > 0) - out_dgt(dgt); + if (info->zs || dgt > 0) + out_dgt(info, dgt); } -int _vprintf(const char *fmt, va_list va, void (*putc)(const char ch)) +int _vprintf(struct printf_info *info, const char *fmt, va_list va) { char ch; char *p; @@ -58,7 +62,7 @@ int _vprintf(const char *fmt, va_list va, void (*putc)(const char ch)) while ((ch = *(fmt++))) { if (ch != '%') { - putc(ch); + info->putc(info, ch); } else { bool lz = false; int width = 0; @@ -76,9 +80,9 @@ int _vprintf(const char *fmt, va_list va, void (*putc)(const char ch)) ch = *fmt++; } } - bf = buf; - p = bf; - zs = 0; + info->bf = buf; + p = info->bf; + info->zs = 0; switch (ch) { case '\0': @@ -88,45 +92,45 @@ int _vprintf(const char *fmt, va_list va, void (*putc)(const char ch)) num = va_arg(va, unsigned int); if (ch == 'd' && (int)num < 0) { num = -(int)num; - out('-'); + out(info, '-'); } if (!num) { - out_dgt(0); + out_dgt(info, 0); } else { for (div = 1000000000; div; div /= 10) - div_out(&num, div); + div_out(info, &num, div); } break; case 'x': num = va_arg(va, unsigned int); if (!num) { - out_dgt(0); + out_dgt(info, 0); } else { for (div = 0x10000000; div; div /= 0x10) - div_out(&num, div); + div_out(info, &num, div); } break; case 'c': - out((char)(va_arg(va, int))); + out(info, (char)(va_arg(va, int))); break; case 's': p = va_arg(va, char*); break; case '%': - out('%'); + out(info, '%'); default: break; } - *bf = 0; - bf = p; - while (*bf++ && width > 0) + *info->bf = 0; + info->bf = p; + while (*info->bf++ && width > 0) width--; while (width-- > 0) - putc(lz ? '0' : ' '); + info->putc(info, lz ? '0' : ' '); if (p) { while ((ch = *p++)) - putc(ch); + info->putc(info, ch); } } } @@ -137,36 +141,44 @@ abort: int vprintf(const char *fmt, va_list va) { - return _vprintf(fmt, va, putc); + struct printf_info info; + + info.putc = putc_normal; + return _vprintf(&info, fmt, va); } int printf(const char *fmt, ...) { + struct printf_info info; + va_list va; int ret; + info.putc = putc_normal; va_start(va, fmt); - ret = _vprintf(fmt, va, putc); + ret = _vprintf(&info, fmt, va); va_end(va); return ret; } -static void putc_outstr(char ch) +static void putc_outstr(struct printf_info *info, char ch) { - *outstr++ = ch; + *info->outstr++ = ch; } int sprintf(char *buf, const char *fmt, ...) { + struct printf_info info; va_list va; int ret; va_start(va, fmt); - outstr = buf; - ret = _vprintf(fmt, va, putc_outstr); + info.outstr = buf; + info.putc = putc_outstr; + ret = _vprintf(&info, fmt, va); va_end(va); - *outstr = '\0'; + *info.outstr = '\0'; return ret; } @@ -174,14 +186,16 @@ int sprintf(char *buf, const char *fmt, ...) /* Note that size is ignored */ int snprintf(char *buf, size_t size, const char *fmt, ...) { + struct printf_info info; va_list va; int ret; va_start(va, fmt); - outstr = buf; - ret = _vprintf(fmt, va, putc_outstr); + info.outstr = buf; + info.putc = putc_outstr; + ret = _vprintf(&info, fmt, va); va_end(va); - *outstr = '\0'; + *info.outstr = '\0'; return ret; } |