X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fremote-udi.c;h=afe9dd4be8b5ccddc0e6c2d64021f1f4523aa2a4;hb=45dc9be38877cbb8218182b5c5ebd6e82e5ccd47;hp=20e8d262c570962a5ef3a9efe1803c4a8952788d;hpb=83f00e88d72d7ea9a1267b1c97e55d3273d67d76;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/remote-udi.c b/gdb/remote-udi.c index 20e8d262c5..afe9dd4be8 100644 --- a/gdb/remote-udi.c +++ b/gdb/remote-udi.c @@ -50,7 +50,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* access the register store directly, without going through the normal handler functions. This avoids an extra data copy. */ -static int kiodebug; extern int stop_soon_quietly; /* for wait_for_inferior */ extern struct value *call_function_by_hand(); static void udi_resume PARAMS ((int pid, int step, int sig)); @@ -68,22 +67,9 @@ static int udi_read_inferior_memory PARAMS ((CORE_ADDR memaddr, char *myaddr, int len)); static void download PARAMS ((char *load_arg_string, int from_tty)); char CoffFileName[100] = ""; -/* - * Processor types. - */ -#define TYPE_UNKNOWN 0 -#define TYPE_A29000 1 -#define TYPE_A29030 2 -#define TYPE_A29050 3 -static char *processor_name[] = { "Unknown", "Am29000", "Am29030", "Am29050" }; -static int processor_type=TYPE_UNKNOWN; -#define FREEZE_MODE (read_register(CPS_REGNUM) & 0x400) -#define USE_SHADOW_PC ((processor_type == TYPE_A29050) && FREEZE_MODE) -#define LLOG_FILE "udi.log" -#if defined (LOG_FILE) -FILE *log_file; -#endif +#define FREEZE_MODE (read_register(CPS_REGNUM) & 0x400) +#define USE_SHADOW_PC ((processor_type == a29k_freeze_mode) && FREEZE_MODE) static int timeout = 5; extern struct target_ops udi_ops; /* Forward declaration */ @@ -157,7 +143,7 @@ udi_create_inferior (execfile, args, env) if (udi_session_id < 0) { - printf("UDI connection not open yet.\n"); + printf_unfiltered("UDI connection not open yet.\n"); return; } @@ -181,14 +167,20 @@ udi_create_inferior (execfile, args, env) init_wait_for_inferior (); clear_proceed_status (); - proceed(-1,-1,0); + proceed (-1, TARGET_SIGNAL_DEFAULT, 0); } static void udi_mourn() { - pop_target (); /* Pop back to no-child state */ - generic_mourn_inferior (); +#if 0 + /* Requiring "target udi" each time you run is a major pain. I suspect + this was just blindy copied from remote.c, in which "target" and + "run" are combined. Having a udi target without an inferior seems + to work between "target udi" and "run", so why not now? */ + pop_target (); /* Pop back to no-child state */ +#endif + generic_mourn_inferior (); } /******************************************************************** UDI_OPEN @@ -236,11 +228,6 @@ udi_open (name, from_tty) push_target (&udi_ops); -#if defined (LOG_FILE) - log_file = fopen (LOG_FILE, "w"); - if (log_file == NULL) - error ("udi_open: fopen(%s) %s", LOG_FILE, safe_strerror(errno)); -#endif /* ** Initialize target configuration structure (global) */ @@ -248,13 +235,13 @@ udi_open (name, from_tty) ChipVersions, &NumberOfChips)) error ("UDIGetTargetConfig() failed"); if (NumberOfChips > 2) - fprintf(stderr,"Target has more than one processor\n"); + fprintf_unfiltered(gdb_stderr,"Target has more than one processor\n"); for (cnt=0; cnt < NumberOfRanges; cnt++) { switch(KnownMemory[cnt].Space) { default: - fprintf(stderr, "UDIGetTargetConfig() unknown memory space\n"); + fprintf_unfiltered(gdb_stderr, "UDIGetTargetConfig() unknown memory space\n"); break; case UDI29KCP_S: break; @@ -273,33 +260,10 @@ udi_open (name, from_tty) } } - /* Determine the processor revision level */ - prl = (unsigned int)read_register (CFG_REGNUM) >> 24; - if ((prl&0xe0) == 0) - { - fprintf_filtered (stderr, - "Remote debugging Am29000 rev %c\n",'A'+(prl&0x1f)); - processor_type = TYPE_A29000; - } - else if ((prl&0xe0) == 0x40) /* 29030 = 0x4* */ - { - fprintf_filtered (stderr, - "Remote debugging Am2903* rev %c\n",'A'+(prl&0x1f)); - processor_type = TYPE_A29030; - } - else if ((prl&0xe0) == 0x20) /* 29050 = 0x2* */ - { - fprintf_filtered (stderr, - "Remote debugging Am29050 rev %c\n",'A'+(prl&0x1f)); - processor_type = TYPE_A29050; - } - else - { - processor_type = TYPE_UNKNOWN; - fprintf_filtered (stderr,"WARNING: processor type unknown.\n"); - } + a29k_get_processor_type (); + if (UDICreateProcess (&PId)) - fprintf(stderr, "UDICreateProcess() failed\n"); + fprintf_unfiltered(gdb_stderr, "UDICreateProcess() failed\n"); /* Print out some stuff, letting the user now what's going on */ if (UDICapabilities (&TIPId, &TargetId, DFEId, DFE, &TIP, &DFEIPCId, @@ -307,9 +271,8 @@ udi_open (name, from_tty) error ("UDICapabilities() failed"); if (from_tty) { - printf_filtered ("Remote debugging an %s connected via UDI socket,\n\ + printf_filtered ("Connected via UDI socket,\n\ DFE-IPC version %x.%x.%x TIP-IPC version %x.%x.%x TIP version %x.%x.%x\n %s\n", - processor_name[processor_type], (DFEIPCId>>8)&0xf, (DFEIPCId>>4)&0xf, DFEIPCId&0xf, (TIPIPCId>>8)&0xf, (TIPIPCId>>4)&0xf, TIPIPCId&0xf, (TargetId>>8)&0xf, (TargetId>>4)&0xf, TargetId&0xf, @@ -338,13 +301,6 @@ udi_close (quitting) /*FIXME: how is quitting used */ udi_session_id = -1; inferior_pid = 0; -#if defined (LOG_FILE) - if (ferror (log_file)) - printf ("Error writing log file.\n"); - if (fclose (log_file) != 0) - printf ("Error closing log file.\n"); -#endif - printf_filtered (" Ending remote debugging\n"); } @@ -369,14 +325,14 @@ udi_attach (args, from_tty) error ("UDI connection not opened yet, use the 'target udi' command.\n"); if (from_tty) - printf ("Attaching to remote program %s...\n", prog_name); + printf_unfiltered ("Attaching to remote program %s...\n", prog_name); UDIStop(); From.Space = UDI29KSpecialRegs; From.Offset = 11; if (err = UDIRead(From, &PC_adds, Count, Size, &CountDone, HostEndian)) error ("UDIRead failed in udi_attach"); - printf ("Remote process is now halted, pc1 = 0x%x.\n", PC_adds); + printf_unfiltered ("Remote process is now halted, pc1 = 0x%x.\n", PC_adds); } /************************************************************* UDI_DETACH */ /* Terminate the open connection to the TIP process. @@ -396,7 +352,7 @@ udi_detach (args,from_tty) pop_target(); /* calls udi_close to do the real work */ if (from_tty) - printf ("Ending remote debugging\n"); + printf_unfiltered ("Ending remote debugging\n"); } @@ -405,7 +361,8 @@ udi_detach (args,from_tty) static void udi_resume (pid, step, sig) - int pid, step, sig; + int pid, step; + enum target_signal sig; { UDIError tip_error; UDIUInt32 Steps = 1; @@ -418,7 +375,7 @@ udi_resume (pid, step, sig) if (!tip_error) return; - fprintf (stderr, "UDIStep() error = %d\n", tip_error); + fprintf_unfiltered (gdb_stderr, "UDIStep() error = %d\n", tip_error); error ("failed in udi_resume"); } @@ -431,8 +388,9 @@ udi_resume (pid, step, sig) storing status in STATUS just as `wait' would. */ static int -udi_wait (status) - WAITTYPE *status; +udi_wait (pid, status) + int pid; + struct target_waitstatus *status; { UDIInt32 MaxTime; UDIPId PId; @@ -442,7 +400,8 @@ udi_wait (status) int old_immediate_quit = immediate_quit; int i; - WSETEXIT ((*status), 0); + status->kind = TARGET_WAITKIND_EXITED; + status->value.integer = 0; /* wait for message to arrive. It should be: If the target stops executing, udi_wait() should return. @@ -465,19 +424,31 @@ udi_wait (status) a whole bunch of output (more than SBUF_MAX, I would guess). It doesn't seem to happen with the simulator. */ warning ("UDIGetStdout() failed in udi_wait"); - fwrite (sbuf, 1, CountDone, stdout); - fflush(stdout); + fwrite (sbuf, 1, CountDone, gdb_stdout); + gdb_flush(gdb_stdout); continue; + case UDIStderrReady: UDIGetStderr (sbuf, (UDISizeT)SBUF_MAX, &CountDone); - fwrite (sbuf, 1, CountDone, stderr); - fflush(stderr); + fwrite (sbuf, 1, CountDone, gdb_stderr); + gdb_flush(gdb_stderr); continue; + case UDIStdinNeeded: - scanf ("%s", sbuf); - i = strlen (sbuf); - UDIPutStdin (sbuf, (UDISizeT)i, &CountDone); - continue; + { + int ch; + i = 0; + do + { + ch = getchar (); + if (ch == EOF) + break; + sbuf[i++] = ch; + } while (i < SBUF_MAX && ch != '\n'); + UDIPutStdin (sbuf, (UDISizeT)i, &CountDone); + continue; + } + case UDIRunning: /* In spite of the fact that we told UDIWait to wait forever, it will return spuriously sometimes. */ @@ -492,23 +463,28 @@ udi_wait (status) switch (StopReason & UDIGrossState) { case UDITrapped: - printf("Am290*0 received vector number %d\n", StopReason >> 24); + printf_unfiltered("Am290*0 received vector number %d\n", StopReason >> 24); switch (StopReason >> 8) { case 0: /* Illegal opcode */ - printf(" (break point)\n"); - WSETSTOP ((*status), SIGTRAP); + printf_unfiltered(" (break point)\n"); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_TRAP; break; case 1: /* Unaligned Access */ - WSETSTOP ((*status), SIGBUS); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_BUS; break; case 3: case 4: - WSETSTOP ((*status), SIGFPE); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_FPE; break; case 5: /* Protection Violation */ - WSETSTOP ((*status), SIGILL); + status->kind = TARGET_WAITKIND_STOPPED; + /* Why not SEGV? What is a Protection Violation? */ + status->value.sig = TARGET_SIGNAL_ILL; break; case 6: case 7: @@ -516,17 +492,21 @@ udi_wait (status) case 9: /* User Data Mapping Miss */ case 10: /* Supervisor Instruction Mapping Miss */ case 11: /* Supervisor Data Mapping Miss */ - WSETSTOP ((*status), SIGSEGV); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_SEGV; break; case 12: case 13: - WSETSTOP ((*status), SIGILL); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_ILL; break; case 14: /* Timer */ - WSETSTOP ((*status), SIGALRM); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_ALRM; break; case 15: /* Trace */ - WSETSTOP ((*status), SIGTRAP); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_TRAP; break; case 16: /* INTR0 */ case 17: /* INTR1 */ @@ -534,46 +514,107 @@ udi_wait (status) case 19: /* INTR3/Internal */ case 20: /* TRAP0 */ case 21: /* TRAP1 */ - WSETSTOP ((*status), SIGINT); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_INT; break; case 22: /* Floating-Point Exception */ - WSETSTOP ((*status), SIGILL); + status->kind = TARGET_WAITKIND_STOPPED; + /* Why not FPE? */ + status->value.sig = TARGET_SIGNAL_ILL; break; case 77: /* assert 77 */ - WSETSTOP ((*status), SIGTRAP); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_TRAP; break; default: - WSETEXIT ((*status), 0); + status->kind = TARGET_WAITKIND_EXITED; + status->value.integer = 0; } break; case UDINotExecuting: - WSETSTOP ((*status), SIGTERM); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_TERM; break; case UDIStopped: - WSETSTOP ((*status), SIGTSTP); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_TSTP; break; case UDIWarned: - WSETSTOP ((*status), SIGURG); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_URG; break; case UDIStepped: case UDIBreak: - WSETSTOP ((*status), SIGTRAP); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_TRAP; break; case UDIWaiting: - WSETSTOP ((*status), SIGSTOP); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_STOP; break; case UDIHalted: - WSETSTOP ((*status), SIGKILL); + status->kind = TARGET_WAITKIND_STOPPED; + status->value.sig = TARGET_SIGNAL_KILL; break; case UDIExited: default: - WSETEXIT ((*status), 0); + status->kind = TARGET_WAITKIND_EXITED; + status->value.integer = 0; } timeout = old_timeout; /* Restore original timeout value */ immediate_quit = old_immediate_quit; - return 0; + return inferior_pid; +} + +#if 0 +/* Handy for debugging */ +udi_pc() +{ + UDIResource From; + UDIUInt32 *To; + UDICount Count; + UDISizeT Size = 4; + UDICount CountDone; + UDIBool HostEndian = 0; + UDIError err; + int pc[2]; + unsigned long myregs[256]; + int i; + + From.Space = UDI29KPC; + From.Offset = 0; + To = (UDIUInt32 *)pc; + Count = 2; + + err = UDIRead(From, To, Count, Size, &CountDone, HostEndian); + + printf_unfiltered ("err = %d, CountDone = %d, pc[0] = 0x%x, pc[1] = 0x%x\n", + err, CountDone, pc[0], pc[1]); + + udi_fetch_registers(-1); + + printf_unfiltered("other pc1 = 0x%x, pc0 = 0x%x\n", *(int *)®isters[4 * PC_REGNUM], + *(int *)®isters[4 * NPC_REGNUM]); + + /* Now, read all the registers globally */ + + From.Space = UDI29KGlobalRegs; + From.Offset = 0; + err = UDIRead(From, myregs, 256, 4, &CountDone, HostEndian); + + printf ("err = %d, CountDone = %d\n", err, CountDone); + + printf("\n"); + + for (i = 0; i < 256; i += 2) + printf("%d:\t%#10x\t%11d\t%#10x\t%11d\n", i, myregs[i], myregs[i], + myregs[i+1], myregs[i+1]); + printf("\n"); + + return pc[0]; } +#endif /********************************************************** UDI_FETCH_REGISTERS * Read a remote register 'regno'. @@ -678,10 +719,10 @@ int regno; register_valid[i] = 1; } - if (kiodebug) + if (remote_debug) { - printf("Fetching all registers\n"); - printf("Fetching PC0 = 0x%x, PC1 = 0x%x, PC2 = 0x%x\n", + printf_unfiltered("Fetching all registers\n"); + printf_unfiltered("Fetching PC0 = 0x%x, PC1 = 0x%x, PC2 = 0x%x\n", read_register(NPC_REGNUM), read_register(PC_REGNUM), read_register(PC2_REGNUM)); } @@ -719,10 +760,10 @@ int regno; return; } - if (kiodebug) + if (remote_debug) { - printf("Storing all registers\n"); - printf("PC0 = 0x%x, PC1 = 0x%x, PC2 = 0x%x\n", read_register(NPC_REGNUM), + printf_unfiltered("Storing all registers\n"); + printf_unfiltered("PC0 = 0x%x, PC1 = 0x%x, PC2 = 0x%x\n", read_register(NPC_REGNUM), read_register(PC_REGNUM), read_register(PC2_REGNUM)); } @@ -788,6 +829,15 @@ int regno; if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian)) error("UDIWrite() failed in udi_store_regisetrs"); +/* PC1 via UDI29KPC */ + + From = (UDIUInt32 *)®isters[4 * PC_REGNUM]; + To.Space = UDI29KPC; + To.Offset = 0; /* PC1 */ + Count = 1; + if (UDIWrite (From, To, Count, Size, &CountDone, HostEndian)) + error ("UDIWrite() failed in udi_store_regisetrs"); + /* LRU and MMU */ From = (UDIUInt32 *)®isters[4 * SR_REGNUM(13)]; @@ -864,7 +914,7 @@ udi_xfer_inferior_memory (memaddr, myaddr, len, write) static void udi_files_info () { - printf ("\tAttached to UDI socket to %s and running program %s.\n", + printf_unfiltered ("\tAttached to UDI socket to %s and running program %s.\n", udi_config_id, prog_name); } @@ -942,7 +992,7 @@ just invoke udi_close, which seems to get things right. inferior_pid = 0; if (from_tty) - printf("Target has been stopped."); + printf_unfiltered("Target has been stopped."); #else udi_close(0); #endif @@ -1078,7 +1128,12 @@ download(load_arg_string, from_tty) section_size = bfd_section_size (pbfd, section); section_end = To.Offset + section_size; - printf("[Loading section %s at %x (%d bytes)]\n", + if (section_size == 0) + /* This is needed at least in the BSS case, where the code + below starts writing before it even checks the size. */ + continue; + + printf_unfiltered("[Loading section %s at %x (%d bytes)]\n", section_name, To.Offset, section_size); @@ -1139,6 +1194,8 @@ download(load_arg_string, from_tty) unsigned long zero = 0; /* Write a zero byte at the vma */ + /* FIXME: Broken for sections of 1-3 bytes (we test for + zero above). */ err = UDIWrite ((UDIHostMemPtr)&zero, /* From */ To, /* To */ (UDICount)1, /* Count */ @@ -1165,9 +1222,9 @@ download(load_arg_string, from_tty) xerr = UDIGetErrorMsg(err, 100, message, &Count); if (!xerr) - fprintf (stderr, "Error is %s\n", message); + fprintf_unfiltered (gdb_stderr, "Error is %s\n", message); else - fprintf (stderr, "xerr is %d\n", xerr); + fprintf_unfiltered (gdb_stderr, "xerr is %d\n", xerr); error ("UDICopy failed, error = %d", err); } } @@ -1337,8 +1394,8 @@ fetch_register (regno) supply_register(regno, (char *) &To); - if (kiodebug) - printf("Fetching register %s = 0x%x\n", reg_names[regno], To); + if (remote_debug) + printf_unfiltered("Fetching register %s = 0x%x\n", reg_names[regno], To); } /*****************************************************************************/ /* Store a single register indicated by 'regno'. @@ -1358,53 +1415,68 @@ store_register (regno) From = read_register (regno); /* get data value */ - if (kiodebug) - printf("Storing register %s = 0x%x\n", reg_names[regno], From); + if (remote_debug) + printf_unfiltered("Storing register %s = 0x%x\n", reg_names[regno], From); if (regno == GR1_REGNUM) - { To.Space = UDI29KGlobalRegs; - To.Offset = 1; - result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian); - /* Setting GR1 changes the numbers of all the locals, so invalidate the - * register cache. Do this *after* calling read_register, because we want - * read_register to return the value that write_register has just stuffed - * into the registers array, not the value of the register fetched from - * the inferior. - */ - registers_changed (); - } + { + To.Space = UDI29KGlobalRegs; + To.Offset = 1; + result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian); + /* Setting GR1 changes the numbers of all the locals, so invalidate the + * register cache. Do this *after* calling read_register, because we want + * read_register to return the value that write_register has just stuffed + * into the registers array, not the value of the register fetched from + * the inferior. + */ + registers_changed (); + } #if defined(GR64_REGNUM) else if (regno >= GR64_REGNUM && regno < GR64_REGNUM + 32 ) - { To.Space = UDI29KGlobalRegs; - To.Offset = (regno - GR64_REGNUM) + 64; - result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian); - } + { + To.Space = UDI29KGlobalRegs; + To.Offset = (regno - GR64_REGNUM) + 64; + result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian); + } #endif /* GR64_REGNUM */ else if (regno >= GR96_REGNUM && regno < GR96_REGNUM + 32) - { To.Space = UDI29KGlobalRegs; - To.Offset = (regno - GR96_REGNUM) + 96; - result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian); - } + { + To.Space = UDI29KGlobalRegs; + To.Offset = (regno - GR96_REGNUM) + 96; + result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian); + } else if (regno >= LR0_REGNUM && regno < LR0_REGNUM + 128) - { To.Space = UDI29KLocalRegs; - To.Offset = (regno - LR0_REGNUM); - result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian); - } - else if (regno>=FPE_REGNUM && regno<=EXO_REGNUM) - { + { + To.Space = UDI29KLocalRegs; + To.Offset = (regno - LR0_REGNUM); + result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian); + } + else if (regno >= FPE_REGNUM && regno <= EXO_REGNUM) return 0; /* Pretend Success */ - } + else if (regno == PC_REGNUM) + { + /* PC1 via UDI29KPC */ + + To.Space = UDI29KPC; + To.Offset = 0; /* PC1 */ + result = UDIWrite (&From, To, Count, Size, &CountDone, HostEndian); + + /* Writing to this loc actually changes the values of pc0 & pc1 */ + + register_valid[PC_REGNUM] = 0; /* pc1 */ + register_valid[NPC_REGNUM] = 0; /* pc0 */ + } else /* An unprotected or protected special register */ - { To.Space = UDI29KSpecialRegs; - To.Offset = regnum_to_srnum(regno); - result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian); - } + { + To.Space = UDI29KSpecialRegs; + To.Offset = regnum_to_srnum(regno); + result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian); + } - if(result) - { result = -1; + if (result != 0) error("UDIWrite() failed in store_registers"); - } - return result; + + return 0; } /********************************************************** REGNUM_TO_SRNUM */ /* @@ -1478,9 +1550,17 @@ CORE_ADDR addr; void convert16() {;} void convert32() {;} -FILE* EchoFile = 0; /* used for debugging */ +GDB_FILE * EchoFile = 0; /* used for debugging */ int QuietMode = 0; /* used for debugging */ +#ifdef NO_HIF_SUPPORT +service_HIF(msg) + union msg_t *msg; +{ + return(0); /* Emulate a failure */ +} +#endif + /* Target_ops vector. Not static because there does not seem to be any portable way to do a forward declaration of a static variable. The RS/6000 doesn't like "extern" followed by "static"; SunOS @@ -1545,22 +1625,8 @@ Arguments are\n\ OPS_MAGIC, /* Always the last thing */ }; -void _initialize_remote_udi() +void +_initialize_remote_udi () { add_target (&udi_ops); - add_show_from_set ( - add_set_cmd ("remotedebug", no_class, var_boolean, - (char *)&kiodebug, - "Set debugging of UDI I/O.\n\ -When enabled, debugging info is displayed.", - &setlist), - &showlist); } - -#ifdef NO_HIF_SUPPORT -service_HIF(msg) -union msg_t *msg; -{ - return(0); /* Emulate a failure */ -} -#endif