diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2010-12-29 21:41:19 -0500 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2010-12-29 21:41:19 -0500 |
commit | ca2bc1c0cd65796589a55728fb0837e5e64e5a74 (patch) | |
tree | fa9d554ce1772ca302bc4af092ae279b50866ac3 /src | |
parent | f13a18090d291f0c7cca6fab61e3ff563ab9400c (diff) | |
download | seabios-ca2bc1c0cd65796589a55728fb0837e5e64e5a74.tar.gz |
Remove drive->desc field.
The description field is only available during the POST phase - it is
confusing to have it live in a structure available through all phases.
The description was only used by the boot menu code - pass each drive
description directly to the bootlist code.
Add a helper (znprintf) to automatically malloc_tmp the required
space.
Also, fixup ramdisk handling - it was using an incorrect floppy
priority.
Diffstat (limited to 'src')
-rw-r--r-- | src/ahci.c | 36 | ||||
-rw-r--r-- | src/ata.c | 38 | ||||
-rw-r--r-- | src/boot.c | 14 | ||||
-rw-r--r-- | src/boot.h | 6 | ||||
-rw-r--r-- | src/coreboot.c | 5 | ||||
-rw-r--r-- | src/disk.h | 3 | ||||
-rw-r--r-- | src/floppy.c | 28 | ||||
-rw-r--r-- | src/output.c | 26 | ||||
-rw-r--r-- | src/ramdisk.c | 10 | ||||
-rw-r--r-- | src/usb-msc.c | 29 | ||||
-rw-r--r-- | src/util.h | 2 | ||||
-rw-r--r-- | src/virtio-blk.c | 11 |
12 files changed, 114 insertions, 94 deletions
@@ -347,11 +347,6 @@ ahci_port_init(struct ahci_ctrl_s *ctrl, u32 pnr) port->drive.type = DTYPE_AHCI; port->drive.cntl_id = pnr; port->drive.removable = (buffer[0] & 0x80) ? 1 : 0; - port->drive.desc = malloc_tmp(MAXDESCSIZE); - if (!port->drive.desc) { - warn_noalloc(); - return NULL; - } if (!port->atapi) { // found disk (ata) @@ -372,32 +367,33 @@ ahci_port_init(struct ahci_ctrl_s *ctrl, u32 pnr) adjsize >>= 10; adjprefix = 'G'; } - snprintf(port->drive.desc, MAXDESCSIZE - , "AHCI/%d: %s ATA-%d Hard-Disk (%u %ciBytes)" - , port->pnr - , ata_extract_model(model, MAXMODEL, buffer) - , ata_extract_version(buffer) - , (u32)adjsize, adjprefix); + char *desc = znprintf(MAXDESCSIZE + , "AHCI/%d: %s ATA-%d Hard-Disk (%u %ciBytes)" + , port->pnr + , ata_extract_model(model, MAXMODEL, buffer) + , ata_extract_version(buffer) + , (u32)adjsize, adjprefix); + dprintf(1, "%s\n", desc); // Register with bcv system. - boot_add_hd(&port->drive, -1); + boot_add_hd(&port->drive, desc, -1); } else { // found cdrom (atapi) port->drive.blksize = CDROM_SECTOR_SIZE; port->drive.sectors = (u64)-1; u8 iscd = ((buffer[0] >> 8) & 0x1f) == 0x05; - snprintf(port->drive.desc, MAXDESCSIZE - , "DVD/CD [AHCI/%d: %s ATAPI-%d %s]" - , port->pnr - , ata_extract_model(model, MAXMODEL, buffer) - , ata_extract_version(buffer) - , (iscd ? "DVD/CD" : "Device")); + char *desc = znprintf(MAXDESCSIZE + , "DVD/CD [AHCI/%d: %s ATAPI-%d %s]" + , port->pnr + , ata_extract_model(model, MAXMODEL, buffer) + , ata_extract_version(buffer) + , (iscd ? "DVD/CD" : "Device")); + dprintf(1, "%s\n", desc); // fill cdidmap if (iscd) - boot_add_cd(&port->drive, -1); + boot_add_cd(&port->drive, desc, -1); } - dprintf(1, "%s\n", port->drive.desc); return port; @@ -739,16 +739,12 @@ ata_extract_model(char *model, u32 size, u16 *buffer) static struct atadrive_s * init_atadrive(struct atadrive_s *dummy, u16 *buffer) { - char *desc = malloc_tmp(MAXDESCSIZE); struct atadrive_s *adrive_g = malloc_fseg(sizeof(*adrive_g)); - if (!adrive_g || !desc) { + if (!adrive_g) { warn_noalloc(); - free(desc); - free(adrive_g); return NULL; } memset(adrive_g, 0, sizeof(*adrive_g)); - adrive_g->drive.desc = desc; adrive_g->chan_gf = dummy->chan_gf; adrive_g->slave = dummy->slave; adrive_g->drive.cntl_id = adrive_g->chan_gf->chanid * 2 + dummy->slave; @@ -774,20 +770,20 @@ init_drive_atapi(struct atadrive_s *dummy, u16 *buffer) adrive_g->drive.sectors = (u64)-1; u8 iscd = ((buffer[0] >> 8) & 0x1f) == 0x05; char model[MAXMODEL+1]; - snprintf(adrive_g->drive.desc, MAXDESCSIZE - , "DVD/CD [ata%d-%d: %s ATAPI-%d %s]" - , adrive_g->chan_gf->chanid, adrive_g->slave - , ata_extract_model(model, MAXMODEL, buffer) - , ata_extract_version(buffer) - , (iscd ? "DVD/CD" : "Device")); - dprintf(1, "%s\n", adrive_g->drive.desc); + char *desc = znprintf(MAXDESCSIZE + , "DVD/CD [ata%d-%d: %s ATAPI-%d %s]" + , adrive_g->chan_gf->chanid, adrive_g->slave + , ata_extract_model(model, MAXMODEL, buffer) + , ata_extract_version(buffer) + , (iscd ? "DVD/CD" : "Device")); + dprintf(1, "%s\n", desc); // fill cdidmap if (iscd) { int prio = bootprio_find_ata_device(adrive_g->chan_gf->pci_bdf, adrive_g->chan_gf->chanid, adrive_g->slave); - boot_add_cd(&adrive_g->drive, prio); + boot_add_cd(&adrive_g->drive, desc, prio); } return adrive_g; @@ -826,19 +822,19 @@ init_drive_ata(struct atadrive_s *dummy, u16 *buffer) adjprefix = 'G'; } char model[MAXMODEL+1]; - snprintf(adrive_g->drive.desc, MAXDESCSIZE - , "ata%d-%d: %s ATA-%d Hard-Disk (%u %ciBytes)" - , adrive_g->chan_gf->chanid, adrive_g->slave - , ata_extract_model(model, MAXMODEL, buffer) - , ata_extract_version(buffer) - , (u32)adjsize, adjprefix); - dprintf(1, "%s\n", adrive_g->drive.desc); + char *desc = znprintf(MAXDESCSIZE + , "ata%d-%d: %s ATA-%d Hard-Disk (%u %ciBytes)" + , adrive_g->chan_gf->chanid, adrive_g->slave + , ata_extract_model(model, MAXMODEL, buffer) + , ata_extract_version(buffer) + , (u32)adjsize, adjprefix); + dprintf(1, "%s\n", desc); int prio = bootprio_find_ata_device(adrive_g->chan_gf->pci_bdf, adrive_g->chan_gf->chanid, adrive_g->slave); // Register with bcv system. - boot_add_hd(&adrive_g->drive, prio); + boot_add_hd(&adrive_g->drive, desc, prio); return adrive_g; } @@ -166,7 +166,7 @@ bootentry_add(int type, int prio, u32 data, const char *desc) be->type = type; be->priority = prio; be->data = data; - be->description = desc; + be->description = desc ?: "?"; // Add entry in sorted order. struct bootentry_s **pprev; @@ -215,24 +215,24 @@ boot_add_bcv(u16 seg, u16 ip, u16 desc, int prio) } void -boot_add_floppy(struct drive_s *drive_g, int prio) +boot_add_floppy(struct drive_s *drive_g, const char *desc, int prio) { bootentry_add(IPL_TYPE_FLOPPY, defPrio(prio, DefaultFloppyPrio) - , (u32)drive_g, drive_g->desc); + , (u32)drive_g, desc); } void -boot_add_hd(struct drive_s *drive_g, int prio) +boot_add_hd(struct drive_s *drive_g, const char *desc, int prio) { bootentry_add(IPL_TYPE_HARDDISK, defPrio(prio, DefaultHDPrio) - , (u32)drive_g, drive_g->desc); + , (u32)drive_g, desc); } void -boot_add_cd(struct drive_s *drive_g, int prio) +boot_add_cd(struct drive_s *drive_g, const char *desc, int prio) { bootentry_add(IPL_TYPE_CDROM, defPrio(prio, DefaultCDPrio) - , (u32)drive_g, drive_g->desc); + , (u32)drive_g, desc); } // Add a CBFS payload entry @@ -8,9 +8,9 @@ void boot_setup(void); void boot_add_bev(u16 seg, u16 bev, u16 desc, int prio); void boot_add_bcv(u16 seg, u16 ip, u16 desc, int prio); struct drive_s; -void boot_add_floppy(struct drive_s *drive_g, int prio); -void boot_add_hd(struct drive_s *drive_g, int prio); -void boot_add_cd(struct drive_s *drive_g, int prio); +void boot_add_floppy(struct drive_s *drive_g, const char *desc, int prio); +void boot_add_hd(struct drive_s *drive_g, const char *desc, int prio); +void boot_add_cd(struct drive_s *drive_g, const char *desc, int prio); void boot_add_cbfs(void *data, const char *desc, int prio); void boot_prep(void); int bootprio_find_pci_device(int bdf); diff --git a/src/coreboot.c b/src/coreboot.c index 503a6d27..b4dfd8ab 100644 --- a/src/coreboot.c +++ b/src/coreboot.c @@ -604,10 +604,7 @@ register_cbfs_payload(void) if (!file) break; const char *filename = cbfs_filename(file); - char *desc = malloc_tmp(MAXDESCSIZE); - if (!desc) - break; - snprintf(desc, MAXDESCSIZE, "Payload [%s]", &filename[4]); + char *desc = znprintf(MAXDESCSIZE, "Payload [%s]", &filename[4]); boot_add_cbfs(file, desc, -1); } } @@ -177,7 +177,6 @@ struct drive_s { u8 floppy_type; // Type of floppy (only for floppy drives). struct chs_s lchs; // Logical CHS u64 sectors; // Total sectors count - char *desc; // Drive description (only available during POST) u32 cntl_id; // Unique id for a given driver type. u8 removable; // Is media removable (currently unused) @@ -232,7 +231,7 @@ int send_disk_op(struct disk_op_s *op); // floppy.c extern struct floppy_ext_dbt_s diskette_param_table2; void floppy_setup(void); -struct drive_s *addFloppy(int floppyid, int ftype, int driver); +struct drive_s *init_floppy(int floppyid, int ftype); int find_floppy_type(u32 size); int process_floppy_op(struct disk_op_s *op); void floppy_tick(void); diff --git a/src/floppy.c b/src/floppy.c index bfca63fd..edc675d8 100644 --- a/src/floppy.c +++ b/src/floppy.c @@ -92,38 +92,40 @@ struct floppyinfo_s FloppyInfo[] VAR16VISIBLE = { }; struct drive_s * -addFloppy(int floppyid, int ftype, int driver) +init_floppy(int floppyid, int ftype) { if (ftype <= 0 || ftype >= ARRAY_SIZE(FloppyInfo)) { dprintf(1, "Bad floppy type %d\n", ftype); return NULL; } - char *desc = malloc_tmp(MAXDESCSIZE); struct drive_s *drive_g = malloc_fseg(sizeof(*drive_g)); - if (!drive_g || !desc) { + if (!drive_g) { warn_noalloc(); - free(desc); - free(drive_g); return NULL; } memset(drive_g, 0, sizeof(*drive_g)); drive_g->cntl_id = floppyid; - drive_g->type = driver; + drive_g->type = DTYPE_FLOPPY; drive_g->blksize = DISK_SECTOR_SIZE; drive_g->floppy_type = ftype; drive_g->sectors = (u64)-1; - drive_g->desc = desc; - snprintf(desc, MAXDESCSIZE, "Floppy [drive %c]", 'A' + floppyid); memcpy(&drive_g->lchs, &FloppyInfo[ftype].chs , sizeof(FloppyInfo[ftype].chs)); + return drive_g; +} +static void +addFloppy(int floppyid, int ftype) +{ + struct drive_s *drive_g = init_floppy(floppyid, ftype); + if (!drive_g) + return; + char *desc = znprintf(MAXDESCSIZE, "Floppy [drive %c]", 'A' + floppyid); int bdf = pci_find_class(PCI_CLASS_BRIDGE_ISA); /* isa-to-pci bridge */ int prio = bootprio_find_fdc_device(bdf, PORT_FD_BASE, floppyid); - - boot_add_floppy(drive_g, prio); - return drive_g; + boot_add_floppy(drive_g, desc, prio); } void @@ -138,9 +140,9 @@ floppy_setup(void) } else { u8 type = inb_cmos(CMOS_FLOPPY_DRIVE_TYPE); if (type & 0xf0) - addFloppy(0, type >> 4, DTYPE_FLOPPY); + addFloppy(0, type >> 4); if (type & 0x0f) - addFloppy(1, type & 0x0f, DTYPE_FLOPPY); + addFloppy(1, type & 0x0f); } outb(0x02, PORT_DMA1_MASK_REG); diff --git a/src/output.c b/src/output.c index 936d3d85..4c9f95b0 100644 --- a/src/output.c +++ b/src/output.c @@ -148,6 +148,8 @@ putc(struct putcinfo *action, char c) static void puts(struct putcinfo *action, const char *s) { + if (!MODESEGMENT && !s) + s = "(NULL)"; for (; *s; s++) putc(action, *s); } @@ -407,6 +409,30 @@ snprintf(char *str, size_t size, const char *fmt, ...) return end - str; } +// Build a formatted string - malloc'ing the memory. +char * +znprintf(size_t size, const char *fmt, ...) +{ + ASSERT32FLAT(); + if (!size) + return NULL; + char *str = malloc_tmp(size); + if (!str) { + warn_noalloc(); + return NULL; + } + struct snprintfinfo sinfo = { { putc_str }, str, str + size }; + va_list args; + va_start(args, fmt); + bvprintf(&sinfo.info, fmt, args); + va_end(args); + char *end = sinfo.str; + if (end >= sinfo.end) + end = sinfo.end - 1; + *end = '\0'; + return str; +} + /**************************************************************** * Misc helpers diff --git a/src/ramdisk.c b/src/ramdisk.c index be1de56c..53913762 100644 --- a/src/ramdisk.c +++ b/src/ramdisk.c @@ -9,6 +9,7 @@ #include "memmap.h" // add_e820 #include "biosvar.h" // GET_GLOBAL #include "bregs.h" // struct bregs +#include "boot.h" // boot_add_floppy void ramdisk_setup(void) @@ -40,10 +41,13 @@ ramdisk_setup(void) cbfs_copyfile(file, pos, size); // Setup driver. - dprintf(1, "Mapping CBFS floppy %s to addr %p\n", cbfs_filename(file), pos); - struct drive_s *drive_g = addFloppy((u32)pos, ftype, DTYPE_RAMDISK); + struct drive_s *drive_g = init_floppy((u32)pos, ftype); if (!drive_g) - strtcpy(drive_g->desc, cbfs_filename(file), MAXDESCSIZE); + return; + drive_g->type = DTYPE_RAMDISK; + dprintf(1, "Mapping CBFS floppy %s to addr %p\n", cbfs_filename(file), pos); + char *desc = znprintf(MAXDESCSIZE, "Ramdisk [%s]", cbfs_filename(file)); + boot_add_floppy(drive_g, desc, -1); } static int diff --git a/src/usb-msc.c b/src/usb-msc.c index 877ece47..d5fe7bad 100644 --- a/src/usb-msc.c +++ b/src/usb-msc.c @@ -139,16 +139,16 @@ process_usb_op(struct disk_op_s *op) ****************************************************************/ static int -setup_drive_cdrom(struct disk_op_s *op) +setup_drive_cdrom(struct disk_op_s *op, char *desc) { op->drive_g->blksize = CDROM_SECTOR_SIZE; op->drive_g->sectors = (u64)-1; - boot_add_cd(op->drive_g, -1); + boot_add_cd(op->drive_g, desc, -1); return 0; } static int -setup_drive_hd(struct disk_op_s *op) +setup_drive_hd(struct disk_op_s *op, char *desc) { struct cdbres_read_capacity info; int ret = cdb_read_capacity(op, &info); @@ -159,7 +159,7 @@ setup_drive_hd(struct disk_op_s *op) u32 blksize = ntohl(info.blksize), sectors = ntohl(info.sectors); if (blksize != DISK_SECTOR_SIZE) { if (blksize == CDROM_SECTOR_SIZE) - return setup_drive_cdrom(op); + return setup_drive_cdrom(op, desc); dprintf(1, "Unsupported USB MSC block size %d\n", blksize); return -1; } @@ -168,7 +168,7 @@ setup_drive_hd(struct disk_op_s *op) dprintf(1, "USB MSC blksize=%d sectors=%d\n", blksize, sectors); // Register with bcv system. - boot_add_hd(op->drive_g, -1); + boot_add_hd(op->drive_g, desc, -1); return 0; } @@ -192,9 +192,8 @@ usb_msc_init(struct usb_pipe *pipe } // Allocate drive structure. - char *desc = malloc_tmphigh(MAXDESCSIZE); struct usbdrive_s *udrive_g = malloc_fseg(sizeof(*udrive_g)); - if (!udrive_g || !desc) { + if (!udrive_g) { warn_noalloc(); goto fail; } @@ -232,20 +231,22 @@ usb_msc_init(struct usb_pipe *pipe , strtcpy(rev, data.rev, sizeof(rev)) , pdt, removable); udrive_g->drive.removable = removable; - snprintf(desc, MAXDESCSIZE, "USB Drive %s %s %s", vendor, product, rev); - udrive_g->drive.desc = desc; - if (pdt == USB_MSC_TYPE_CDROM) - ret = setup_drive_cdrom(&dop); - else - ret = setup_drive_hd(&dop); + if (pdt == USB_MSC_TYPE_CDROM) { + char *desc = znprintf(MAXDESCSIZE, "DVD/CD [USB Drive %s %s %s]" + , vendor, product, rev); + ret = setup_drive_cdrom(&dop, desc); + } else { + char *desc = znprintf(MAXDESCSIZE, "USB Drive %s %s %s" + , vendor, product, rev); + ret = setup_drive_hd(&dop, desc); + } if (ret) goto fail; return 0; fail: dprintf(1, "Unable to configure USB MSC device.\n"); - free(desc); free(udrive_g); return -1; } @@ -237,6 +237,8 @@ void printf(const char *fmt, ...) __attribute__ ((format (printf, 1, 2))); int snprintf(char *str, size_t size, const char *fmt, ...) __attribute__ ((format (printf, 3, 4))); +char * znprintf(size_t size, const char *fmt, ...) + __attribute__ ((format (printf, 2, 3))); void __dprintf(const char *fmt, ...) __attribute__ ((format (printf, 1, 2))); void __debug_enter(struct bregs *regs, const char *fname); diff --git a/src/virtio-blk.c b/src/virtio-blk.c index 6b491641..bd9e2ad7 100644 --- a/src/virtio-blk.c +++ b/src/virtio-blk.c @@ -101,10 +101,9 @@ init_virtio_blk(u16 bdf) { dprintf(1, "found virtio-blk at %x:%x\n", pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf)); - char *desc = malloc_tmphigh(MAXDESCSIZE); struct virtiodrive_s *vdrive_g = malloc_fseg(sizeof(*vdrive_g)); struct vring_virtqueue *vq = memalign_low(PAGE_SIZE, sizeof(*vq)); - if (!vdrive_g || !desc || !vq) { + if (!vdrive_g || !vq) { warn_noalloc(); goto fail; } @@ -151,11 +150,10 @@ init_virtio_blk(u16 bdf) vdrive_g->drive.pchs.cylinders = cfg.cylinders; vdrive_g->drive.pchs.heads = cfg.heads; vdrive_g->drive.pchs.spt = cfg.sectors; - snprintf(desc, MAXDESCSIZE, "Virtio disk PCI:%x:%x", - pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf)); - vdrive_g->drive.desc = desc; + char *desc = znprintf(MAXDESCSIZE, "Virtio disk PCI:%x:%x", + pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf)); - boot_add_hd(&vdrive_g->drive, bootprio_find_pci_device(bdf)); + boot_add_hd(&vdrive_g->drive, desc, bootprio_find_pci_device(bdf)); vp_set_status(ioaddr, VIRTIO_CONFIG_S_ACKNOWLEDGE | VIRTIO_CONFIG_S_DRIVER | VIRTIO_CONFIG_S_DRIVER_OK); @@ -163,7 +161,6 @@ init_virtio_blk(u16 bdf) fail: free(vdrive_g); - free(desc); free(vq); } |