From cfdc13f37f3fa3c7d8c11848f58cfc18a98e37a4 Mon Sep 17 00:00:00 2001 From: Kevin O'Connor Date: Sun, 14 Feb 2010 13:07:54 -0500 Subject: [PATCH] Introduce standard warnings for allocation failures and timeouts. There is no need for custom warnings for many common failures. Introduce a common warning which is consistent and more visible. --- src/acpi.c | 21 ++++++++++----------- src/ata.c | 8 ++++---- src/block.c | 2 +- src/bregs.h | 23 ----------------------- src/coreboot.c | 12 ++++++------ src/disk.c | 10 +++------- src/memmap.c | 2 +- src/mptable.c | 4 ++-- src/optionroms.c | 2 +- src/output.c | 15 +++++++++++++++ src/paravirt.c | 4 ++-- src/ps2port.c | 10 ++++++---- src/ramdisk.c | 2 +- src/smbios.c | 4 ++-- src/usb-ohci.c | 6 +++--- src/usb-uhci.c | 3 ++- src/util.h | 38 ++++++++++++++++++++++++++++++++------ 17 files changed, 91 insertions(+), 75 deletions(-) diff --git a/src/acpi.c b/src/acpi.c index 651f3a2..0559443 100644 --- a/src/acpi.c +++ b/src/acpi.c @@ -303,7 +303,7 @@ build_fadt(int bdf) void *dsdt = malloc_high(sizeof(AmlCode)); if (!fadt || !facs || !dsdt) { - dprintf(1, "Not enough memory for fadt!\n"); + warn_noalloc(); return NULL; } @@ -353,7 +353,7 @@ build_madt(void) + sizeof(struct madt_intsrcovr) * 16); struct multiple_apic_table *madt = malloc_high(madt_size); if (!madt) { - dprintf(1, "Not enough memory for madt!\n"); + warn_noalloc(); return NULL; } memset(madt, 0, madt_size); @@ -418,7 +418,7 @@ build_ssdt(void) int length = sizeof(struct acpi_table_header) + 3 + cpu_length; u8 *ssdt = malloc_high(length); if (! ssdt) { - dprintf(1, "No space for ssdt!\n"); + warn_noalloc(); return NULL; } @@ -473,7 +473,7 @@ build_hpet(void) { struct acpi_20_hpet *hpet = malloc_high(sizeof(*hpet)); if (!hpet) { - dprintf(1, "Not enough memory for hpet!\n"); + warn_noalloc(); return NULL; } @@ -514,7 +514,7 @@ build_srat(void) u64 *numadata = malloc_tmphigh(sizeof(u64) * (MaxCountCPUs + nb_numa_nodes)); if (!numadata) { - dprintf(1, "Not enough memory for read numa data from VM!\n"); + warn_noalloc(); return NULL; } @@ -527,7 +527,7 @@ build_srat(void) srat = malloc_high(srat_size); if (!srat) { - dprintf(1, "Not enough memory for srat table!\n"); + warn_noalloc(); free(numadata); return NULL; } @@ -620,7 +620,7 @@ acpi_bios_init(void) // Create initial rsdt table struct rsdp_descriptor *rsdp = malloc_fseg(sizeof(*rsdp)); if (!rsdp) { - dprintf(1, "Not enough memory for acpi rsdp table!\n"); + warn_noalloc(); return; } @@ -646,13 +646,12 @@ acpi_bios_init(void) u16 len = qemu_cfg_next_acpi_table_len(); void *addr = malloc_high(len); if (!addr) { - dprintf(1, "Not enough memory for ext acpi table of size %d!\n" - , len); + warn_noalloc(); continue; } ACPI_INIT_TABLE(qemu_cfg_next_acpi_table_load(addr, len)); if (tbl_idx == MAX_ACPI_TABLES) { - dprintf(1, "Too many external tables!\n"); + warn_noalloc(); break; } } @@ -662,7 +661,7 @@ acpi_bios_init(void) rsdt = malloc_high(rsdt_len); if (!rsdt) { - dprintf(1, "Not enough memory for acpi rsdt table!\n"); + warn_noalloc(); return; } memset(rsdt, 0, rsdt_len); diff --git a/src/ata.c b/src/ata.c index ceb08f2..ed7ef28 100644 --- a/src/ata.c +++ b/src/ata.c @@ -37,7 +37,7 @@ await_ide(u8 mask, u8 flags, u16 base, u16 timeout) if ((status & mask) == flags) return status; if (check_time(end)) { - dprintf(1, "IDE time out\n"); + warn_timeout(); return -1; } yield(); @@ -109,7 +109,7 @@ ata_reset(struct drive_s *drive_g) break; // Change drive request failed to take effect - retry. if (check_time(end)) { - dprintf(1, "ata_reset slave time out\n"); + warn_timeout(); goto done; } } @@ -458,7 +458,7 @@ ata_dma_transfer(struct disk_op_s *op) // Transfer in progress if (check_time(end)) { // Timeout. - dprintf(1, "IDE DMA timeout\n"); + warn_timeout(); break; } yield(); @@ -883,7 +883,7 @@ powerup_await_non_bsy(u16 base) return orstatus; } if (check_time(SpinupEnd)) { - dprintf(1, "powerup IDE time out\n"); + warn_timeout(); return -1; } yield(); diff --git a/src/block.c b/src/block.c index 01aa84a..3a9a68d 100644 --- a/src/block.c +++ b/src/block.c @@ -224,7 +224,7 @@ static void add_ordered_drive(u8 *idmap, u8 *count, struct drive_s *drive_g) { if (*count >= ARRAY_SIZE(Drives.idmap[0])) { - dprintf(1, "No room to map drive %p\n", drive_g); + warn_noalloc(); return; } u8 *pos = &idmap[*count]; diff --git a/src/bregs.h b/src/bregs.h index 0cdd016..9a381d0 100644 --- a/src/bregs.h +++ b/src/bregs.h @@ -91,29 +91,6 @@ set_code_invalid_silent(struct bregs *regs, u8 code) set_cf(regs, 1); } -#define warn_invalid(regs) \ - __warn_invalid((regs), __LINE__, __func__) -#define set_invalid(regs) \ - __set_invalid((regs), __LINE__, __func__) -#define set_code_invalid(regs, code) \ - __set_code_invalid((regs), (code) | (__LINE__ << 8), __func__) - -#define warn_unimplemented(regs) \ - __warn_unimplemented((regs), __LINE__, __func__) -#define set_unimplemented(regs) \ - __set_unimplemented((regs), __LINE__, __func__) -#define set_code_unimplemented(regs, code) \ - __set_code_unimplemented((regs), (code) | (__LINE__ << 8), __func__) - -// output.c -void __warn_invalid(struct bregs *regs, int lineno, const char *fname); -void __warn_unimplemented(struct bregs *regs, int lineno, const char *fname); -void __set_invalid(struct bregs *regs, int lineno, const char *fname); -void __set_unimplemented(struct bregs *regs, int lineno, const char *fname); -void __set_code_invalid(struct bregs *regs, u32 linecode, const char *fname); -void __set_code_unimplemented(struct bregs *regs, u32 linecode - , const char *fname); - #endif // !__ASSEMBLY__ #endif // bregs.h diff --git a/src/coreboot.c b/src/coreboot.c index 7ad46ce..9887752 100644 --- a/src/coreboot.c +++ b/src/coreboot.c @@ -209,7 +209,7 @@ copy_pir(void *pos) return; void *newpos = malloc_fseg(p->size); if (!newpos) { - dprintf(1, "No room to copy PIR table!\n"); + warn_noalloc(); return; } dprintf(1, "Copying PIR from %p to %p\n", pos, newpos); @@ -231,7 +231,7 @@ copy_mptable(void *pos) u16 mpclength = ((struct mptable_config_s *)p->physaddr)->length; struct mptable_floating_s *newpos = malloc_fseg(length + mpclength); if (!newpos) { - dprintf(1, "No room to copy MPTABLE!\n"); + warn_noalloc(); return; } dprintf(1, "Copying MPTABLE from %p/%x to %p\n", pos, p->physaddr, newpos); @@ -259,7 +259,7 @@ copy_acpi_rsdp(void *pos) } void *newpos = malloc_fseg(length); if (!newpos) { - dprintf(1, "No room to copy ACPI RSDP table!\n"); + warn_noalloc(); return; } dprintf(1, "Copying ACPI RSDP from %p to %p\n", pos, newpos); @@ -375,8 +375,8 @@ cbfs_setup(void) CBHDR = *(void **)CBFS_HEADPTR_ADDR; if (CBHDR->magic != htonl(CBFS_HEADER_MAGIC)) { - dprintf(1, "Unable to find CBFS (got %x not %x)\n" - , CBHDR->magic, htonl(CBFS_HEADER_MAGIC)); + dprintf(1, "Unable to find CBFS (ptr=%p; got %x not %x)\n" + , CBHDR, CBHDR->magic, htonl(CBFS_HEADER_MAGIC)); CBHDR = NULL; return; } @@ -524,7 +524,7 @@ cbfs_copyfile(struct cbfs_file *file, void *dst, u32 maxlen) // Not compressed. dprintf(3, "Copying data %d@%p to %d@%p\n", size, src, maxlen, dst); if (size > maxlen) { - dprintf(1, "File too big to copy\n"); + warn_noalloc(); return -1; } iomemcpy(dst, src, size); diff --git a/src/disk.c b/src/disk.c index 4457ea9..eb68e87 100644 --- a/src/disk.c +++ b/src/disk.c @@ -88,8 +88,7 @@ basic_access(struct bregs *regs, struct drive_s *drive_g, u16 command) u16 head = regs->dh; if (count > 128 || count == 0 || sector == 0) { - dprintf(1, "int13_harddisk: function %02x, parameter out of range!\n" - , regs->ah); + warn_invalid(regs); disk_ret(regs, DISK_RET_EPARAM); return; } @@ -100,9 +99,7 @@ basic_access(struct bregs *regs, struct drive_s *drive_g, u16 command) // sanity check on cyl heads, sec if (cylinder >= nlc || head >= nlh || sector > nlspt) { - dprintf(1, "int13_harddisk: function %02x, parameters out of" - " range %04x/%04x/%04x!\n" - , regs->ah, cylinder, head, sector); + warn_invalid(regs); disk_ret(regs, DISK_RET_EPARAM); return; } @@ -130,8 +127,7 @@ extended_access(struct bregs *regs, struct drive_s *drive_g, u16 command) dop.command = command; dop.drive_g = drive_g; if (dop.lba >= GET_GLOBAL(drive_g->sectors)) { - dprintf(1, "int13_harddisk: function %02x. LBA out of range\n" - , regs->ah); + warn_invalid(regs); disk_ret(regs, DISK_RET_EPARAM); return; } diff --git a/src/memmap.c b/src/memmap.c index aa69503..8770bbc 100644 --- a/src/memmap.c +++ b/src/memmap.c @@ -27,7 +27,7 @@ static void insert_e820(int i, u64 start, u64 size, u32 type) { if (e820_count >= CONFIG_MAX_E820) { - dprintf(1, "Overflowed e820 list!\n"); + warn_noalloc(); return; } diff --git a/src/mptable.c b/src/mptable.c index 0fd4737..0e0e1a0 100644 --- a/src/mptable.c +++ b/src/mptable.c @@ -23,7 +23,7 @@ mptable_init(void) // Config structure in temp area. struct mptable_config_s *config = malloc_tmphigh(32*1024); if (!config) { - dprintf(1, "No space for temp mptable\n"); + warn_noalloc(); return; } memset(config, 0, sizeof(*config)); @@ -186,7 +186,7 @@ mptable_init(void) struct mptable_config_s *finalconfig = malloc_fseg(length); struct mptable_floating_s *floating = malloc_fseg(sizeof(*floating)); if (!finalconfig || !floating) { - dprintf(1, "No room for MPTABLE!\n"); + warn_noalloc(); free(config); free(finalconfig); free(floating); diff --git a/src/optionroms.c b/src/optionroms.c index ace0c0e..47f5808 100644 --- a/src/optionroms.c +++ b/src/optionroms.c @@ -185,7 +185,7 @@ copy_rom(struct rom_header *rom) u32 romsize = rom->size * 512; if (RomEnd + romsize > max_rom()) { // Option rom doesn't fit. - dprintf(1, "Option rom %p doesn't fit.\n", rom); + warn_noalloc(); return NULL; } dprintf(4, "Copying option rom (size %d) from %p to %x\n" diff --git a/src/output.c b/src/output.c index 3de565a..ae105fb 100644 --- a/src/output.c +++ b/src/output.c @@ -485,6 +485,21 @@ __warn_unimplemented(struct bregs *regs, int lineno, const char *fname) } } +// Report on an allocation failure. +void +__warn_noalloc(int lineno, const char *fname) +{ + dprintf(1, "WARNING - Unable to allocate resource at %s:%d!\n" + , fname, lineno); +} + +// Report on a timeout exceeded. +void +__warn_timeout(int lineno, const char *fname) +{ + dprintf(1, "WARNING - Timeout at %s:%d!\n", fname, lineno); +} + // Report a handler reporting an invalid parameter to the caller. void __set_invalid(struct bregs *regs, int lineno, const char *fname) diff --git a/src/paravirt.c b/src/paravirt.c index 7171bac..fc0cbfe 100644 --- a/src/paravirt.c +++ b/src/paravirt.c @@ -211,7 +211,7 @@ int qemu_cfg_smbios_load_external(int type, char **p, unsigned *nr_structs, } if (end - *p < sizeof(struct smbios_structure_header)) { - dprintf(1, "No more memory for additional smbios tables\n"); + warn_noalloc(); break; } @@ -233,7 +233,7 @@ int qemu_cfg_smbios_load_external(int type, char **p, unsigned *nr_structs, /* Read the rest and terminate the entry */ if (end - *p < table.header.length) { - dprintf(1, "No memory for smbios table %d\n", header->type); + warn_noalloc(); *p -= sizeof(struct smbios_structure_header); continue; } diff --git a/src/ps2port.c b/src/ps2port.c index 4cfff28..49bf551 100644 --- a/src/ps2port.c +++ b/src/ps2port.c @@ -32,7 +32,7 @@ i8042_wait_read(void) return 0; udelay(50); } - dprintf(1, "i8042 timeout on wait read\n"); + warn_timeout(); return -1; } @@ -47,7 +47,7 @@ i8042_wait_write(void) return 0; udelay(50); } - dprintf(1, "i8042 timeout on wait write\n"); + warn_timeout(); return -1; } @@ -65,7 +65,7 @@ i8042_flush(void) dprintf(7, "i8042 flushed %x (status=%x)\n", data, status); } - dprintf(1, "i8042 timeout on flush\n"); + warn_timeout(); return -1; } @@ -189,7 +189,9 @@ ps2_recvbyte(int aux, int needack, int timeout) } if (check_time(end)) { - dprintf(1, "ps2_recvbyte timeout\n"); + // Don't warn on second byte of a reset + if (timeout > 100) + warn_timeout(); return -1; } yield(); diff --git a/src/ramdisk.c b/src/ramdisk.c index 16c8b25..641d87e 100644 --- a/src/ramdisk.c +++ b/src/ramdisk.c @@ -37,7 +37,7 @@ ramdisk_setup(void) // Allocate ram for image. void *pos = memalign_tmphigh(PAGE_SIZE, size); if (!pos) { - dprintf(3, "Not enough memory for ramdisk\n"); + warn_noalloc(); return; } add_e820((u32)pos, size, E820_RESERVED); diff --git a/src/smbios.c b/src/smbios.c index 870afbe..f948d78 100644 --- a/src/smbios.c +++ b/src/smbios.c @@ -19,7 +19,7 @@ smbios_entry_point_init(u16 max_structure_size, struct smbios_entry_point *ep = malloc_fseg(sizeof(*ep)); void *finaltable = malloc_high(structure_table_length); if (!ep || !finaltable) { - dprintf(1, "No space for smbios tables!\n"); + warn_noalloc(); free(ep); free(finaltable); return; @@ -378,7 +378,7 @@ smbios_init(void) char *start = malloc_tmphigh(TEMPSMBIOSSIZE); if (! start) { - dprintf(1, "No memory for temp smbios table\n"); + warn_noalloc(); return; } diff --git a/src/usb-ohci.c b/src/usb-ohci.c index 8ebd340..421c19b 100644 --- a/src/usb-ohci.c +++ b/src/usb-ohci.c @@ -35,7 +35,7 @@ start_ohci(struct usb_s *cntl, struct ohci_hcca *hcca) if (! status & OHCI_HCR) break; if (check_time(end)) { - dprintf(1, "Timeout on ohci software reset\n"); + warn_timeout(); return -1; } } @@ -153,7 +153,7 @@ ohci_init(void *data) struct ohci_ed *intr_ed = malloc_high(sizeof(*intr_ed)); struct ohci_ed *control_ed = malloc_high(sizeof(*control_ed)); if (!hcca || !intr_ed || !control_ed) { - dprintf(1, "No ram for ohci init\n"); + warn_noalloc(); goto free; } memset(hcca, 0, sizeof(*hcca)); @@ -192,7 +192,7 @@ wait_ed(struct ohci_ed *ed) if (ed->hwHeadP == ed->hwTailP) return 0; if (check_time(end)) { - dprintf(1, "Timeout on wait_ed %p\n", ed); + warn_timeout(); return -1; } yield(); diff --git a/src/usb-uhci.c b/src/usb-uhci.c index b09b17a..b7ff394 100644 --- a/src/usb-uhci.c +++ b/src/usb-uhci.c @@ -40,12 +40,12 @@ configure_uhci(struct usb_s *cntl) struct uhci_qh *data_qh = malloc_high(sizeof(*data_qh)); struct uhci_qh *term_qh = malloc_high(sizeof(*term_qh)); if (!term_td || !fl || !intr_qh || !data_qh || !term_qh) { + warn_noalloc(); free(term_td); free(fl); free(intr_qh); free(data_qh); free(term_qh); - dprintf(1, "No ram for uhci init\n"); return; } @@ -169,6 +169,7 @@ wait_qh(struct usb_s *cntl, struct uhci_qh *qh) if (qh->element & UHCI_PTR_TERM) return 0; if (check_time(end)) { + warn_timeout(); struct uhci_td *td = (void*)(qh->element & ~UHCI_PTR_BITS); dprintf(1, "Timeout on wait_qh %p (td=%p s=%x c=%x/%x)\n" , qh, td, td->status diff --git a/src/util.h b/src/util.h index 429590c..4228904 100644 --- a/src/util.h +++ b/src/util.h @@ -203,17 +203,28 @@ void panic(const char *fmt, ...) __attribute__ ((format (printf, 1, 2))) __noreturn; void printf(const char *fmt, ...) __attribute__ ((format (printf, 1, 2))); -void __dprintf(const char *fmt, ...) - __attribute__ ((format (printf, 1, 2))); int snprintf(char *str, size_t size, const char *fmt, ...) __attribute__ ((format (printf, 3, 4))); +void __dprintf(const char *fmt, ...) + __attribute__ ((format (printf, 1, 2))); +void __debug_enter(struct bregs *regs, const char *fname); +void __debug_isr(const char *fname); +void __debug_stub(struct bregs *regs, int lineno, const char *fname); +void __warn_invalid(struct bregs *regs, int lineno, const char *fname); +void __warn_unimplemented(struct bregs *regs, int lineno, const char *fname); +void __warn_noalloc(int lineno, const char *fname); +void __warn_timeout(int lineno, const char *fname); +void __set_invalid(struct bregs *regs, int lineno, const char *fname); +void __set_unimplemented(struct bregs *regs, int lineno, const char *fname); +void __set_code_invalid(struct bregs *regs, u32 linecode, const char *fname); +void __set_code_unimplemented(struct bregs *regs, u32 linecode + , const char *fname); +void hexdump(const void *d, int len); + #define dprintf(lvl, fmt, args...) do { \ if (CONFIG_DEBUG_LEVEL && (lvl) <= CONFIG_DEBUG_LEVEL) \ __dprintf((fmt) , ##args ); \ } while (0) -void __debug_enter(struct bregs *regs, const char *fname); -void __debug_stub(struct bregs *regs, int lineno, const char *fname); -void __debug_isr(const char *fname); #define debug_enter(regs, lvl) do { \ if ((lvl) && (lvl) <= CONFIG_DEBUG_LEVEL) \ __debug_enter((regs), __func__); \ @@ -224,7 +235,22 @@ void __debug_isr(const char *fname); } while (0) #define debug_stub(regs) \ __debug_stub((regs), __LINE__, __func__) -void hexdump(const void *d, int len); +#define warn_invalid(regs) \ + __warn_invalid((regs), __LINE__, __func__) +#define warn_unimplemented(regs) \ + __warn_unimplemented((regs), __LINE__, __func__) +#define warn_noalloc() \ + __warn_noalloc(__LINE__, __func__) +#define warn_timeout() \ + __warn_timeout(__LINE__, __func__) +#define set_invalid(regs) \ + __set_invalid((regs), __LINE__, __func__) +#define set_code_invalid(regs, code) \ + __set_code_invalid((regs), (code) | (__LINE__ << 8), __func__) +#define set_unimplemented(regs) \ + __set_unimplemented((regs), __LINE__, __func__) +#define set_code_unimplemented(regs, code) \ + __set_code_unimplemented((regs), (code) | (__LINE__ << 8), __func__) // kbd.c void kbd_setup(void); -- 2.25.1