From: Kevin O'Connor Date: Sun, 13 Dec 2009 18:04:17 +0000 (-0500) Subject: Distinguish between debug reports for unimplemented vs invalid calls. X-Git-Tag: rel-0.5.0~5 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=dfefeb543866eb74e0668fdec1fe496bb9ffb860;p=seabios.git Distinguish between debug reports for unimplemented vs invalid calls. Don't use "fail" in the debug output - as this confuses users. When reporting on an invalid parameter - use the word "invalid". When reporting on an unimplemented call - state it is unimplemented. Add separate debug levels for unimplemented vs invalid calls. Also, increase the debug level of several entry points. --- diff --git a/src/apm.c b/src/apm.c index 2ca2c64..86d5051 100644 --- a/src/apm.c +++ b/src/apm.c @@ -155,7 +155,7 @@ handle_15530a(struct bregs *regs) static void handle_15530b(struct bregs *regs) { - set_code_fail_silent(regs, RET_ENOEVENT); + set_code_invalid_silent(regs, RET_ENOEVENT); } // APM Driver Version @@ -186,14 +186,14 @@ handle_155310(struct bregs *regs) static void handle_1553XX(struct bregs *regs) { - set_fail(regs); + set_unimplemented(regs); } void VISIBLE16 handle_1553(struct bregs *regs) { if (! CONFIG_APMBIOS) { - set_code_fail(regs, RET_EUNSUPPORTED); + set_code_invalid(regs, RET_EUNSUPPORTED); return; } diff --git a/src/bregs.h b/src/bregs.h index 3042ab2..0cdd016 100644 --- a/src/bregs.h +++ b/src/bregs.h @@ -79,26 +79,40 @@ set_code_success(struct bregs *regs) } static inline void -set_fail_silent(struct bregs *regs) +set_invalid_silent(struct bregs *regs) { set_cf(regs, 1); } static inline void -set_code_fail_silent(struct bregs *regs, u8 code) +set_code_invalid_silent(struct bregs *regs, u8 code) { regs->ah = code; set_cf(regs, 1); } -#define set_fail(regs) \ - __set_fail((regs), __LINE__, __func__) -#define set_code_fail(regs, code) \ - __set_code_fail((regs), (code) | (__LINE__ << 8), __func__) +#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 __set_fail(struct bregs *regs, int lineno, const char *fname); -void __set_code_fail(struct bregs *regs, u32 linecode, 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 __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__ diff --git a/src/clock.c b/src/clock.c index 6706e5c..6b4acb9 100644 --- a/src/clock.c +++ b/src/clock.c @@ -253,7 +253,7 @@ static void handle_1a02(struct bregs *regs) { if (rtc_updating()) { - set_fail(regs); + set_invalid(regs); return; } @@ -302,7 +302,7 @@ handle_1a04(struct bregs *regs) { regs->ah = 0; if (rtc_updating()) { - set_fail(regs); + set_invalid(regs); return; } regs->cl = inb_cmos(CMOS_RTC_YEAR); @@ -336,7 +336,7 @@ handle_1a05(struct bregs *regs) // My assumption: RegB = (RegB & 01111111b) if (rtc_updating()) { init_rtc(); - set_fail(regs); + set_invalid(regs); return; } outb_cmos(regs->cl, CMOS_RTC_YEAR); @@ -370,7 +370,7 @@ handle_1a06(struct bregs *regs) regs->ax = 0; if (val8 & RTC_B_AIE) { // Alarm interrupt enabled already - set_fail(regs); + set_invalid(regs); return; } if (rtc_updating()) { @@ -411,7 +411,7 @@ handle_1a07(struct bregs *regs) static void handle_1aXX(struct bregs *regs) { - set_fail(regs); + set_unimplemented(regs); } // INT 1Ah Time-of-day Service Entry Point @@ -527,7 +527,7 @@ handle_1586(struct bregs *regs) u32 count = (regs->cx << 16) | regs->dx; int ret = set_usertimer(count, GET_SEG(SS), (u32)&statusflag); if (ret) { - set_code_fail(regs, RET_ECLOCKINUSE); + set_code_invalid(regs, RET_ECLOCKINUSE); return; } while (!statusflag) @@ -542,7 +542,7 @@ handle_158300(struct bregs *regs) int ret = set_usertimer((regs->cx << 16) | regs->dx, regs->es, regs->bx); if (ret) // Interval already set. - set_code_fail(regs, RET_EUNSUPPORTED); + set_code_invalid(regs, RET_EUNSUPPORTED); else set_success(regs); } @@ -558,7 +558,7 @@ handle_158301(struct bregs *regs) static void handle_1583XX(struct bregs *regs) { - set_code_fail(regs, RET_EUNSUPPORTED); + set_code_unimplemented(regs, RET_EUNSUPPORTED); regs->al--; } diff --git a/src/config.h b/src/config.h index 3881cc4..91e322d 100644 --- a/src/config.h +++ b/src/config.h @@ -172,13 +172,13 @@ #define DEBUG_ISR_09 9 #define DEBUG_ISR_0e 9 #define DEBUG_HDL_10 20 -#define DEBUG_HDL_11 1 -#define DEBUG_HDL_12 1 +#define DEBUG_HDL_11 2 +#define DEBUG_HDL_12 2 #define DEBUG_HDL_13 10 -#define DEBUG_HDL_14 1 +#define DEBUG_HDL_14 2 #define DEBUG_HDL_15 9 #define DEBUG_HDL_16 9 -#define DEBUG_HDL_17 1 +#define DEBUG_HDL_17 2 #define DEBUG_HDL_18 1 #define DEBUG_HDL_19 1 #define DEBUG_HDL_1a 9 @@ -191,6 +191,9 @@ #define DEBUG_ISR_hwpic2 5 #define DEBUG_HDL_pnp 1 #define DEBUG_HDL_pmm 1 + +#define DEBUG_unimplemented 2 +#define DEBUG_invalid 3 #define DEBUG_thread 2 #endif // config.h diff --git a/src/disk.c b/src/disk.c index ef4866f..4b09d71 100644 --- a/src/disk.c +++ b/src/disk.c @@ -28,15 +28,26 @@ __disk_ret(struct bregs *regs, u32 linecode, const char *fname) else SET_BDA(disk_last_status, code); if (code) - __set_code_fail(regs, linecode, fname); + __set_code_invalid(regs, linecode, fname); else set_code_success(regs); } +void +__disk_ret_unimplemented(struct bregs *regs, u32 linecode, const char *fname) +{ + u8 code = linecode; + if (regs->dl < EXTSTART_HD) + SET_BDA(floppy_last_status, code); + else + SET_BDA(disk_last_status, code); + __set_code_unimplemented(regs, linecode, fname); +} + static void __disk_stub(struct bregs *regs, int lineno, const char *fname) { - __debug_stub(regs, lineno, fname); + __warn_unimplemented(regs, lineno, fname); __disk_ret(regs, DISK_RET_SUCCESS | (lineno << 8), fname); } @@ -426,7 +437,7 @@ disk_134502(struct bregs *regs, struct drive_s *drive_g) static void disk_1345XX(struct bregs *regs, struct drive_s *drive_g) { - disk_ret(regs, DISK_RET_EPARAM); + disk_ret_unimplemented(regs, DISK_RET_EPARAM); } // IBM/MS lock/unlock drive @@ -648,7 +659,7 @@ disk_1349(struct bregs *regs, struct drive_s *drive_g) disk_ret(regs, DISK_RET_SUCCESS); return; } - set_fail(regs); + set_invalid(regs); // always send changed ?? regs->ah = DISK_RET_ECHANGED; } @@ -699,7 +710,7 @@ disk_134e(struct bregs *regs, struct drive_s *drive_g) static void disk_13XX(struct bregs *regs, struct drive_s *drive_g) { - disk_ret(regs, DISK_RET_EPARAM); + disk_ret_unimplemented(regs, DISK_RET_EPARAM); } static void diff --git a/src/disk.h b/src/disk.h index 832bf9b..7feb9af 100644 --- a/src/disk.h +++ b/src/disk.h @@ -101,6 +101,10 @@ struct bregs; void __disk_ret(struct bregs *regs, u32 linecode, const char *fname); #define disk_ret(regs, code) \ __disk_ret((regs), (code) | (__LINE__ << 8), __func__) +void __disk_ret_unimplemented(struct bregs *regs, u32 linecode + , const char *fname); +#define disk_ret_unimplemented(regs, code) \ + __disk_ret_unimplemented((regs), (code) | (__LINE__ << 8), __func__) /**************************************************************** diff --git a/src/kbd.c b/src/kbd.c index e5ffa33..39294a7 100644 --- a/src/kbd.c +++ b/src/kbd.c @@ -216,7 +216,7 @@ handle_16a2(struct bregs *regs) static void handle_16XX(struct bregs *regs) { - debug_stub(regs); + warn_unimplemented(regs); } static void diff --git a/src/mouse.c b/src/mouse.c index ca581a8..ac37cc0 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -46,7 +46,7 @@ mouse_15c20000(struct bregs *regs) u16 ebda_seg = get_ebda_seg(); int ret = disable_mouse(ebda_seg); if (ret) - set_code_fail(regs, RET_ENEEDRESEND); + set_code_invalid(regs, RET_ENEEDRESEND); else set_code_success(regs); } @@ -58,7 +58,7 @@ mouse_15c20001(struct bregs *regs) u16 ebda_seg = get_ebda_seg(); u8 mouse_flags_2 = GET_EBDA2(ebda_seg, mouse_flag2); if ((mouse_flags_2 & 0x80) == 0) { - set_code_fail(regs, RET_ENOHANDLER); + set_code_invalid(regs, RET_ENOHANDLER); return; } @@ -69,7 +69,7 @@ mouse_15c20001(struct bregs *regs) int ret = aux_command(PSMOUSE_CMD_ENABLE, NULL); if (ret) - set_code_fail(regs, RET_ENEEDRESEND); + set_code_invalid(regs, RET_ENEEDRESEND); else set_code_success(regs); } @@ -77,7 +77,7 @@ mouse_15c20001(struct bregs *regs) static void mouse_15c200XX(struct bregs *regs) { - set_code_fail(regs, RET_EINVFUNCTION); + set_code_unimplemented(regs, RET_EINVFUNCTION); } // Disable/Enable Mouse @@ -98,7 +98,7 @@ mouse_15c201(struct bregs *regs) u8 param[2]; int ret = aux_command(PSMOUSE_CMD_RESET_BAT, param); if (ret) { - set_code_fail(regs, RET_ENEEDRESEND); + set_code_invalid(regs, RET_ENEEDRESEND); return; } regs->bl = param[0]; @@ -112,13 +112,13 @@ mouse_15c202(struct bregs *regs) { static u8 VAR16 sample_rates[7] = {10, 20, 40, 60, 80, 100, 200}; if (regs->bh >= ARRAY_SIZE(sample_rates)) { - set_code_fail(regs, RET_EINVINPUT); + set_code_invalid(regs, RET_EINVINPUT); return; } u8 mouse_data1 = GET_GLOBAL(sample_rates[regs->bh]); int ret = aux_command(PSMOUSE_CMD_SETRATE, &mouse_data1); if (ret) - set_code_fail(regs, RET_ENEEDRESEND); + set_code_invalid(regs, RET_ENEEDRESEND); else set_code_success(regs); } @@ -133,13 +133,13 @@ mouse_15c203(struct bregs *regs) // 2 = 100 dpi, 4 counts per millimeter // 3 = 200 dpi, 8 counts per millimeter if (regs->bh >= 4) { - set_code_fail(regs, RET_EINVINPUT); + set_code_invalid(regs, RET_EINVINPUT); return; } u8 param = regs->bh; int ret = aux_command(PSMOUSE_CMD_SETRES, ¶m); if (ret) - set_code_fail(regs, RET_ENEEDRESEND); + set_code_invalid(regs, RET_ENEEDRESEND); else set_code_success(regs); } @@ -151,7 +151,7 @@ mouse_15c204(struct bregs *regs) u8 param[2]; int ret = aux_command(PSMOUSE_CMD_GETID, param); if (ret) { - set_code_fail(regs, RET_ENEEDRESEND); + set_code_invalid(regs, RET_ENEEDRESEND); return; } regs->bh = param[0]; @@ -163,7 +163,7 @@ static void mouse_15c205(struct bregs *regs) { if (regs->bh != 3) { - set_code_fail(regs, RET_EINTERFACE); + set_code_invalid(regs, RET_EINTERFACE); return; } u16 ebda_seg = get_ebda_seg(); @@ -181,7 +181,7 @@ mouse_15c20600(struct bregs *regs) u8 param[3]; int ret = aux_command(PSMOUSE_CMD_GETINFO, param); if (ret) { - set_code_fail(regs, RET_ENEEDRESEND); + set_code_invalid(regs, RET_ENEEDRESEND); return; } regs->bl = param[0]; @@ -196,7 +196,7 @@ mouse_15c20601(struct bregs *regs) { int ret = aux_command(PSMOUSE_CMD_SETSCALE11, NULL); if (ret) - set_code_fail(regs, RET_ENEEDRESEND); + set_code_invalid(regs, RET_ENEEDRESEND); else set_code_success(regs); } @@ -207,7 +207,7 @@ mouse_15c20602(struct bregs *regs) { int ret = aux_command(PSMOUSE_CMD_SETSCALE21, NULL); if (ret) - set_code_fail(regs, RET_ENEEDRESEND); + set_code_invalid(regs, RET_ENEEDRESEND); else set_code_success(regs); } @@ -215,7 +215,7 @@ mouse_15c20602(struct bregs *regs) static void mouse_15c206XX(struct bregs *regs) { - set_code_fail(regs, RET_EINVFUNCTION); + set_code_unimplemented(regs, RET_EINVFUNCTION); } // Return Status & Set Scaling Factor... @@ -255,7 +255,7 @@ mouse_15c207(struct bregs *regs) static void mouse_15c2XX(struct bregs *regs) { - set_code_fail(regs, RET_EINVFUNCTION); + set_code_unimplemented(regs, RET_EINVFUNCTION); } void @@ -264,7 +264,7 @@ handle_15c2(struct bregs *regs) //debug_stub(regs); if (! CONFIG_MOUSE) { - set_code_fail(regs, RET_EUNSUPPORTED); + set_code_invalid(regs, RET_EUNSUPPORTED); return; } diff --git a/src/output.c b/src/output.c index 7e91bfe..e49010d 100644 --- a/src/output.c +++ b/src/output.c @@ -463,25 +463,61 @@ __debug_stub(struct bregs *regs, int lineno, const char *fname) dump_regs(regs); } -// Report on a handler returning a failure notification to the caller. +// Report on an invalid parameter. void -__set_fail(struct bregs *regs, int lineno, const char *fname) +__warn_invalid(struct bregs *regs, int lineno, const char *fname) { - dprintf(1, "fail %s:%d:\n", fname, lineno); - dump_regs(regs); - set_fail_silent(regs); + if (CONFIG_DEBUG_LEVEL >= DEBUG_invalid) { + dprintf(1, "invalid %s:%d:\n", fname, lineno); + dump_regs(regs); + } +} + +// Report on an unimplemented feature. +void +__warn_unimplemented(struct bregs *regs, int lineno, const char *fname) +{ + if (CONFIG_DEBUG_LEVEL >= DEBUG_unimplemented) { + dprintf(1, "unimplemented %s:%d:\n", fname, lineno); + dump_regs(regs); + } +} + +// Report a handler reporting an invalid parameter to the caller. +void +__set_invalid(struct bregs *regs, int lineno, const char *fname) +{ + __warn_invalid(regs, lineno, fname); + set_invalid_silent(regs); } -// Report on a handler returning a failure code to the caller. Note, -// the lineno and return code are encoded in the same parameter as gcc -// does a better job of scheduling function calls when there are 3 or -// less parameters. +// Report a call of an unimplemented function. void -__set_code_fail(struct bregs *regs, u32 linecode, const char *fname) +__set_unimplemented(struct bregs *regs, int lineno, const char *fname) +{ + __warn_unimplemented(regs, lineno, fname); + set_invalid_silent(regs); +} + +// Report a handler reporting an invalid parameter code to the +// caller. Note, the lineno and return code are encoded in the same +// parameter as gcc does a better job of scheduling function calls +// when there are 3 or less parameters. +void +__set_code_invalid(struct bregs *regs, u32 linecode, const char *fname) { u8 code = linecode; u32 lineno = linecode >> 8; - dprintf(1, "fail %s:%d(%x):\n", fname, lineno, code); - dump_regs(regs); - set_code_fail_silent(regs, code); + __warn_invalid(regs, lineno, fname); + set_code_invalid_silent(regs, code); +} + +// Report a call of an unimplemented function. +void +__set_code_unimplemented(struct bregs *regs, u32 linecode, const char *fname) +{ + u8 code = linecode; + u32 lineno = linecode >> 8; + __warn_unimplemented(regs, lineno, fname); + set_code_invalid_silent(regs, code); } diff --git a/src/pcibios.c b/src/pcibios.c index 5da079a..6fb7d9e 100644 --- a/src/pcibios.c +++ b/src/pcibios.c @@ -52,7 +52,7 @@ handle_1ab102(struct bregs *regs) set_code_success(regs); return; } - set_code_fail(regs, RET_DEVICE_NOT_FOUND); + set_code_invalid(regs, RET_DEVICE_NOT_FOUND); } // find class code @@ -72,7 +72,7 @@ handle_1ab103(struct bregs *regs) set_code_success(regs); return; } - set_code_fail(regs, RET_DEVICE_NOT_FOUND); + set_code_invalid(regs, RET_DEVICE_NOT_FOUND); } // read configuration byte @@ -129,7 +129,7 @@ handle_1ab10e(struct bregs *regs) { struct pir_header *pirtable_g = (void*)(GET_GLOBAL(PirOffset) + 0); if (! pirtable_g) { - set_code_fail(regs, RET_FUNC_NOT_SUPPORTED); + set_code_invalid(regs, RET_FUNC_NOT_SUPPORTED); return; } @@ -144,7 +144,7 @@ handle_1ab10e(struct bregs *regs) u16 pirsize = GET_GLOBAL(pirtable_g->size) - sizeof(struct pir_header); SET_FARVAR(regs->es, param_far->size, pirsize); if (bufsize < pirsize) { - set_code_fail(regs, RET_BUFFER_TOO_SMALL); + set_code_invalid(regs, RET_BUFFER_TOO_SMALL); return; } @@ -165,7 +165,7 @@ handle_1ab10e(struct bregs *regs) static void handle_1ab1XX(struct bregs *regs) { - set_code_fail(regs, RET_FUNC_NOT_SUPPORTED); + set_code_unimplemented(regs, RET_FUNC_NOT_SUPPORTED); } void @@ -174,7 +174,7 @@ handle_1ab1(struct bregs *regs) //debug_stub(regs); if (! CONFIG_PCIBIOS) { - set_fail(regs); + set_invalid(regs); return; } diff --git a/src/serial.c b/src/serial.c index 19e39ca..493d421 100644 --- a/src/serial.c +++ b/src/serial.c @@ -79,12 +79,12 @@ static u16 getComAddr(struct bregs *regs) { if (regs->dx >= 4) { - set_fail(regs); + set_invalid(regs); return 0; } u16 addr = GET_BDA(port_com[regs->dx]); if (! addr) - set_fail(regs); + set_invalid(regs); return addr; } @@ -178,8 +178,7 @@ handle_1403(struct bregs *regs) static void handle_14XX(struct bregs *regs) { - // Unsupported - set_fail(regs); + set_unimplemented(regs); } // INT 14h Serial Communications Service Entry Point @@ -245,12 +244,12 @@ static u16 getLptAddr(struct bregs *regs) { if (regs->dx >= 3) { - set_fail(regs); + set_invalid(regs); return 0; } u16 addr = GET_BDA(port_lpt[regs->dx]); if (! addr) - set_fail(regs); + set_invalid(regs); return addr; } @@ -319,8 +318,7 @@ handle_1702(struct bregs *regs) static void handle_17XX(struct bregs *regs) { - // Unsupported - set_fail(regs); + set_unimplemented(regs); } // INT17h : Printer Service Entry Point diff --git a/src/system.c b/src/system.c index e8ed5a7..ffcced9 100644 --- a/src/system.c +++ b/src/system.c @@ -58,7 +58,7 @@ handle_152403(struct bregs *regs) static void handle_1524XX(struct bregs *regs) { - set_code_fail(regs, RET_EUNSUPPORTED); + set_code_unimplemented(regs, RET_EUNSUPPORTED); } static void @@ -198,7 +198,7 @@ handle_1591(struct bregs *regs) static void handle_154f(struct bregs *regs) { - set_fail_silent(regs); + set_invalid_silent(regs); } static void @@ -256,7 +256,7 @@ handle_15e820(struct bregs *regs) int count = GET_GLOBAL(e820_count); if (regs->edx != 0x534D4150 || regs->bx >= count || regs->ecx < sizeof(e820_list[0])) { - set_code_fail(regs, RET_EUNSUPPORTED); + set_code_invalid(regs, RET_EUNSUPPORTED); return; } @@ -275,7 +275,7 @@ handle_15e820(struct bregs *regs) static void handle_15e8XX(struct bregs *regs) { - set_code_fail(regs, RET_EUNSUPPORTED); + set_code_unimplemented(regs, RET_EUNSUPPORTED); } static void @@ -291,7 +291,7 @@ handle_15e8(struct bregs *regs) static void handle_15XX(struct bregs *regs) { - set_code_fail(regs, RET_EUNSUPPORTED); + set_code_unimplemented(regs, RET_EUNSUPPORTED); } // INT 15h System Services Entry Point diff --git a/src/vgahooks.c b/src/vgahooks.c index 701e83c..ef33be5 100644 --- a/src/vgahooks.c +++ b/src/vgahooks.c @@ -4,7 +4,7 @@ // // This file may be distributed under the terms of the GNU LGPLv3 license. -#include "bregs.h" // set_code_fail +#include "bregs.h" // set_code_invalid #include "biosvar.h" // GET_GLOBAL #include "pci.h" // pci_find_device #include "pci_regs.h" // PCI_VENDOR_ID @@ -20,7 +20,7 @@ int CBmainboard VAR16VISIBLE; static void handle_155fXX(struct bregs *regs) { - set_code_fail(regs, RET_EUNSUPPORTED); + set_code_unimplemented(regs, RET_EUNSUPPORTED); } @@ -127,7 +127,7 @@ via_155f18(struct bregs *regs) done: if (fbsize < 0 || ramspeed < 0) { - set_code_fail(regs, RET_EUNSUPPORTED); + set_code_invalid(regs, RET_EUNSUPPORTED); return; } regs->eax = 0x5f; @@ -139,7 +139,7 @@ done: static void via_155f19(struct bregs *regs) { - set_fail_silent(regs); + set_invalid_silent(regs); } static void