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.
static void
handle_15530b(struct bregs *regs)
{
- set_code_fail_silent(regs, RET_ENOEVENT);
+ set_code_invalid_silent(regs, RET_ENOEVENT);
}
// APM Driver Version
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;
}
}
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__
handle_1a02(struct bregs *regs)
{
if (rtc_updating()) {
- set_fail(regs);
+ set_invalid(regs);
return;
}
{
regs->ah = 0;
if (rtc_updating()) {
- set_fail(regs);
+ set_invalid(regs);
return;
}
regs->cl = inb_cmos(CMOS_RTC_YEAR);
// My assumption: RegB = (RegB & 01111111b)
if (rtc_updating()) {
init_rtc();
- set_fail(regs);
+ set_invalid(regs);
return;
}
outb_cmos(regs->cl, CMOS_RTC_YEAR);
regs->ax = 0;
if (val8 & RTC_B_AIE) {
// Alarm interrupt enabled already
- set_fail(regs);
+ set_invalid(regs);
return;
}
if (rtc_updating()) {
static void
handle_1aXX(struct bregs *regs)
{
- set_fail(regs);
+ set_unimplemented(regs);
}
// INT 1Ah Time-of-day Service Entry Point
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)
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);
}
static void
handle_1583XX(struct bregs *regs)
{
- set_code_fail(regs, RET_EUNSUPPORTED);
+ set_code_unimplemented(regs, RET_EUNSUPPORTED);
regs->al--;
}
#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
#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
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);
}
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
disk_ret(regs, DISK_RET_SUCCESS);
return;
}
- set_fail(regs);
+ set_invalid(regs);
// always send changed ??
regs->ah = DISK_RET_ECHANGED;
}
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
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__)
/****************************************************************
static void
handle_16XX(struct bregs *regs)
{
- debug_stub(regs);
+ warn_unimplemented(regs);
}
static void
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);
}
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;
}
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);
}
static void
mouse_15c200XX(struct bregs *regs)
{
- set_code_fail(regs, RET_EINVFUNCTION);
+ set_code_unimplemented(regs, RET_EINVFUNCTION);
}
// Disable/Enable Mouse
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];
{
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);
}
// 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);
}
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];
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();
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];
{
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);
}
{
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);
}
static void
mouse_15c206XX(struct bregs *regs)
{
- set_code_fail(regs, RET_EINVFUNCTION);
+ set_code_unimplemented(regs, RET_EINVFUNCTION);
}
// Return Status & Set Scaling Factor...
static void
mouse_15c2XX(struct bregs *regs)
{
- set_code_fail(regs, RET_EINVFUNCTION);
+ set_code_unimplemented(regs, RET_EINVFUNCTION);
}
void
//debug_stub(regs);
if (! CONFIG_MOUSE) {
- set_code_fail(regs, RET_EUNSUPPORTED);
+ set_code_invalid(regs, RET_EUNSUPPORTED);
return;
}
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);
}
set_code_success(regs);
return;
}
- set_code_fail(regs, RET_DEVICE_NOT_FOUND);
+ set_code_invalid(regs, RET_DEVICE_NOT_FOUND);
}
// find class code
set_code_success(regs);
return;
}
- set_code_fail(regs, RET_DEVICE_NOT_FOUND);
+ set_code_invalid(regs, RET_DEVICE_NOT_FOUND);
}
// read configuration byte
{
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;
}
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;
}
static void
handle_1ab1XX(struct bregs *regs)
{
- set_code_fail(regs, RET_FUNC_NOT_SUPPORTED);
+ set_code_unimplemented(regs, RET_FUNC_NOT_SUPPORTED);
}
void
//debug_stub(regs);
if (! CONFIG_PCIBIOS) {
- set_fail(regs);
+ set_invalid(regs);
return;
}
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;
}
static void
handle_14XX(struct bregs *regs)
{
- // Unsupported
- set_fail(regs);
+ set_unimplemented(regs);
}
// INT 14h Serial Communications Service Entry Point
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;
}
static void
handle_17XX(struct bregs *regs)
{
- // Unsupported
- set_fail(regs);
+ set_unimplemented(regs);
}
// INT17h : Printer Service Entry Point
static void
handle_1524XX(struct bregs *regs)
{
- set_code_fail(regs, RET_EUNSUPPORTED);
+ set_code_unimplemented(regs, RET_EUNSUPPORTED);
}
static void
static void
handle_154f(struct bregs *regs)
{
- set_fail_silent(regs);
+ set_invalid_silent(regs);
}
static void
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;
}
static void
handle_15e8XX(struct bregs *regs)
{
- set_code_fail(regs, RET_EUNSUPPORTED);
+ set_code_unimplemented(regs, RET_EUNSUPPORTED);
}
static void
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
//
// 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
static void
handle_155fXX(struct bregs *regs)
{
- set_code_fail(regs, RET_EUNSUPPORTED);
+ set_code_unimplemented(regs, RET_EUNSUPPORTED);
}
done:
if (fbsize < 0 || ramspeed < 0) {
- set_code_fail(regs, RET_EUNSUPPORTED);
+ set_code_invalid(regs, RET_EUNSUPPORTED);
return;
}
regs->eax = 0x5f;
static void
via_155f19(struct bregs *regs)
{
- set_fail_silent(regs);
+ set_invalid_silent(regs);
}
static void