diff options
author | Stu Grossman <grossman@cygnus> | 1992-05-07 17:47:36 +0000 |
---|---|---|
committer | Stu Grossman <grossman@cygnus> | 1992-05-07 17:47:36 +0000 |
commit | d0b04c6a38747e1b84b36b341e1a9036519ef89a (patch) | |
tree | bc5e24604911cbc1c3628f8a4d565c984aed905c /gdb/remote-udi.c | |
parent | d24fbb206e83b60f17aa145ebc5196a9127715e6 (diff) | |
download | gdb-d0b04c6a38747e1b84b36b341e1a9036519ef89a.zip gdb-d0b04c6a38747e1b84b36b341e1a9036519ef89a.tar.gz gdb-d0b04c6a38747e1b84b36b341e1a9036519ef89a.tar.bz2 |
* am29k-pinsn.c: Use new opcode table in "opcode/a29k.h".
* am29k-tdep.c: Update to latest code from AMD.
(get_saved_register) don't crap out if no frame.
* remote-udi.c: Set/clear inferior_pid as appropriate.
(udi_open) call target_preopen, don't close fd 0!!!, clean up
error handling. Fixup end-of-debugging messages.
(udi_fetch_registers) clean up big time, mainly don't multiply
register_valid indices by 4, and use proper Offset when reading
gr96-gr127. (udi_store_registers) general cleanup.
(fetch_register) cleanup, simplify. (regnum_to_srnum)
INT_REGNUM->INTE_REGNUM.
* tm-29k.h: Upgrade to latest code from AMD.
* 29k-share/udi/udip2soc.c: Get rid of useless errmsg_m macro.
(UDIConnect) Clean up error processing (like, don't do exit() if
execlp fails), make code restartable, make more attractive.
(UDIStop) Use SIGINT instead of SIGUSR1, as isstip won't stop
otherwise.
Diffstat (limited to 'gdb/remote-udi.c')
-rw-r--r-- | gdb/remote-udi.c | 210 |
1 files changed, 118 insertions, 92 deletions
diff --git a/gdb/remote-udi.c b/gdb/remote-udi.c index 95613ed..0030047 100644 --- a/gdb/remote-udi.c +++ b/gdb/remote-udi.c @@ -184,6 +184,8 @@ udi_create_inferior (execfile, args, env) return; } + inferior_pid = 40000; + #if defined(ULTRA3) && defined(KERNEL_DEBUGGING) /* On ultra3 (NYU) we assume the kernel is already running so there is * no file to download @@ -221,6 +223,8 @@ udi_mourn() '<udi_udi_config_id> [progname]' for example. */ +/* XXX - need cleanups for udiconnect for various failures!!! */ + static char *udi_config_id; static void udi_open (name, from_tty) @@ -239,6 +243,8 @@ udi_open (name, from_tty) DENTER("udi_open()"); + target_preopen(from_tty); + /* Find the first whitespace character, it separates udi_config_id from prog_name. */ if(!name) goto erroid; @@ -248,6 +254,7 @@ udi_open (name, from_tty) if (*p == '\0') erroid: error("Usage: target udi config_id progname, where config_id appears in udi_soc file"); + udi_config_id = (char*)malloc (p - name + 1); strncpy (udi_config_id, name, p - name); udi_config_id[p - name] = '\0'; @@ -260,11 +267,9 @@ erroid: free (prog_name); prog_name = savestring (p, strlen (p)); - if (udi_session_id >= 0) - close (udi_session_id); + if (UDIConnect(udi_config_id, &udi_session_id)) + error("UDIConnect() failed: %s\n", dfe_errmsg); - if(UDIConnect(udi_config_id, &udi_session_id)) - fprintf(stderr, "UDIConnect() failed: %s\n", dfe_errmsg); push_target (&udi_ops); #ifndef HAVE_TERMIO @@ -272,18 +277,18 @@ erroid: /* Cause SIGALRM's to make reads fail with EINTR instead of resuming the read. */ if (siginterrupt (SIGALRM, 1) != 0) - perror ("udi_open: error in siginterrupt"); + error ("udi_open: siginterrupt() %s", safe_strerror(errno)); #endif /* Set up read timeout timer. */ if ((void (*)) signal (SIGALRM, udi_timer) == (void (*)) -1) - perror ("udi_open: error in signal"); + error ("udi_open: signal() %s", safe_strerror(errno)); #endif #if defined (LOG_FILE) log_file = fopen (LOG_FILE, "w"); if (log_file == NULL) - perror (LOG_FILE); + error ("udi_open: fopen(%s) %s", LOG_FILE, safe_strerror(errno)); #endif /* ** Initialize target configuration structure (global) @@ -386,6 +391,7 @@ udi_close (quitting) /*FIXME: how is quitting used */ /* Do not try to close udi_session_id again, later in the program. */ udi_session_id = -1; + inferior_pid = 0; #if defined (LOG_FILE) if (ferror (log_file)) @@ -394,7 +400,7 @@ udi_close (quitting) /*FIXME: how is quitting used */ printf ("Error closing log file.\n"); #endif - printf ("Ending remote debugging\n"); + printf_filtered (" Ending remote debugging\n"); DEXIT("udi_close()"); } @@ -633,89 +639,99 @@ int regno; int i; if (regno >= 0) { - fetch_register(regno); - return; + fetch_register(regno); + return; } - DENTER("udi_fetch_registers()"); /* Gr1/rsp */ + From.Space = UDI29KGlobalRegs; From.Offset = 1; - To = (UDIUInt32*)®isters[4 * GR1_REGNUM]; + To = (UDIUInt32 *)®isters[4 * GR1_REGNUM]; Count = 1; - if(UDIRead(From, To, Count, Size, &CountDone, HostEndian)) + if (UDIRead(From, To, Count, Size, &CountDone, HostEndian)) error("UDIRead() failed in udi_fetch_registers"); - else register_valid[4 * GR1_REGNUM] = 1; + + register_valid[GR1_REGNUM] = 1; #if defined(GR64_REGNUM) /* Read gr64-127 */ + /* Global Registers gr64-gr95 */ + From.Space = UDI29KGlobalRegs; From.Offset = 64; - To = ®isters[4 * GR64_REGNUM]; + To = (UDIUInt32 *)®isters[4 * GR64_REGNUM]; Count = 32; - if(UDIRead(From, To, Count, Size, &CountDone, HostEndian)) + if (UDIRead(From, To, Count, Size, &CountDone, HostEndian)) error("UDIRead() failed in udi_fetch_registers"); - else for(i = 4 * GR64_REGNUM; i < 4*GR64_REGNUM + 32; i++) + + for (i = GR64_REGNUM; i < GR64_REGNUM + 32; i++) + register_valid[i] = 1; + #endif /* GR64_REGNUM */ /* Global Registers gr96-gr127 */ + From.Space = UDI29KGlobalRegs; - From.Offset = 64; - To = (UDIUInt32*)®isters[4 * GR96_REGNUM]; + From.Offset = 96; + To = (UDIUInt32 *)®isters[4 * GR96_REGNUM]; Count = 32; - if(UDIRead(From, To, Count, Size, &CountDone, HostEndian)) + if (UDIRead(From, To, Count, Size, &CountDone, HostEndian)) error("UDIRead() failed in udi_fetch_registers"); - else for(i = 4 * GR96_REGNUM; i < 4*GR96_REGNUM + 32; i++) - register_valid[i] = 1; -/* Local Registers */ + for (i = GR96_REGNUM; i < GR96_REGNUM + 32; i++) + register_valid[i] = 1; + +/* Local Registers */ + From.Space = UDI29KLocalRegs; From.Offset = 0; - To = (UDIUInt32*)®isters[4 * LR0_REGNUM]; + To = (UDIUInt32 *)®isters[4 * LR0_REGNUM]; Count = 128; - if(UDIRead(From, To, Count, Size, &CountDone, HostEndian)) + if (UDIRead(From, To, Count, Size, &CountDone, HostEndian)) error("UDIRead() failed in udi_fetch_registers"); - else for(i = 4 * LR0_REGNUM; i < 4*LR0_REGNUM + 128; i++) - register_valid[i] = 1; -/* Protected Special Registers */ + for (i = LR0_REGNUM; i < LR0_REGNUM + 128; i++) + register_valid[i] = 1; + +/* Protected Special Registers */ + From.Space = UDI29KSpecialRegs; From.Offset = 0; - To = (UDIUInt32*)®isters[4 * SR_REGNUM(0)]; + To = (UDIUInt32 *)®isters[4 * SR_REGNUM(0)]; Count = 15; - if(UDIRead(From, To, Count, Size, &CountDone, HostEndian)) + if (UDIRead(From, To, Count, Size, &CountDone, HostEndian)) error("UDIRead() failed in udi_fetch_registers"); - else for(i = 4 * SR_REGNUM(0); i < 4*SR_REGNUM(0) + 15; i++) - register_valid[i] = 1; + + for (i = SR_REGNUM(0); i < SR_REGNUM(0) + 15; i++) + register_valid[i] = 1; if (USE_SHADOW_PC) { /* Let regno_to_srnum() handle the register number */ - fetch_register(NPC_REGNUM); - fetch_register(PC_REGNUM); - fetch_register(PC2_REGNUM); - } + fetch_register(NPC_REGNUM); + fetch_register(PC_REGNUM); + fetch_register(PC2_REGNUM); -/* Unprotected Special Registers sr128-sr135*/ - if (USE_SHADOW_PC) /* Let regno_to_srnum() handle the register number */ - { From.Space = UDI29KSpecialRegs; +/* Unprotected Special Registers sr128-sr135 */ + + From.Space = UDI29KSpecialRegs; From.Offset = 128; - To = (UDIUInt32*)®isters[4 * SR_REGNUM(128)]; - Count = 135-128 +1; - if(UDIRead(From, To, Count, Size, &CountDone, HostEndian)) + To = (UDIUInt32 *)®isters[4 * SR_REGNUM(128)]; + Count = 135-128 + 1; + if (UDIRead(From, To, Count, Size, &CountDone, HostEndian)) error("UDIRead() failed in udi_fetch_registers"); - else for(i = 4 * SR_REGNUM(128); i < 4*SR_REGNUM(128) + 135-128+1; i++) - register_valid[i] = 1; + + for (i = SR_REGNUM(128); i < SR_REGNUM(128) + 135-128+1; i++) + register_valid[i] = 1; } /* There doesn't seem to be any way to get these. */ { int val = -1; supply_register (FPE_REGNUM, (char *) &val); - supply_register (INT_REGNUM, (char *) &val); + supply_register (INTE_REGNUM, (char *) &val); supply_register (FPS_REGNUM, (char *) &val); supply_register (EXO_REGNUM, (char *) &val); } - - DEXIT("udi_fetch_registerS()"); } @@ -741,10 +757,9 @@ int regno; return; } - DENTER("udi_store_registers()"); - /* Gr1/rsp */ - From = (UDIUInt32*)®isters[4 * GR1_REGNUM]; + + From = (UDIUInt32 *)®isters[4 * GR1_REGNUM]; To.Space = UDI29KGlobalRegs; To.Offset = 1; Count = 1; @@ -752,17 +767,21 @@ int regno; error("UDIWrite() failed in udi_store_regisetrs"); #if defined(GR64_REGNUM) + /* Global registers gr64-gr95 */ - From = (UDIUInt32*)®isters[4 * GR64_REGNUM]; + + From = (UDIUInt32 *)®isters[4 * GR64_REGNUM]; To.Space = UDI29KGlobalRegs; To.Offset = 64; Count = 32; if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian)) error("UDIWrite() failed in udi_store_regisetrs"); + #endif /* GR64_REGNUM */ /* Global registers gr96-gr127 */ - From = (UDIUInt32*)®isters[4 * GR96_REGNUM]; + + From = (UDIUInt32 *)®isters[4 * GR96_REGNUM]; To.Space = UDI29KGlobalRegs; To.Offset = 96; Count = 32; @@ -770,7 +789,8 @@ int regno; error("UDIWrite() failed in udi_store_regisetrs"); /* Local Registers */ - From = (UDIUInt32*)®isters[4 * LR0_REGNUM]; + + From = (UDIUInt32 *)®isters[4 * LR0_REGNUM]; To.Space = UDI29KLocalRegs; To.Offset = 0; Count = 128; @@ -779,15 +799,17 @@ int regno; /* Protected Special Registers */ /* VAB through TMR */ - From = (UDIUInt32*)®isters[4 * SR_REGNUM(0)]; + + From = (UDIUInt32 *)®isters[4 * SR_REGNUM(0)]; To.Space = UDI29KSpecialRegs; To.Offset = 0; Count = 10; if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian)) error("UDIWrite() failed in udi_store_regisetrs"); - /* PC0, PC1, PC2 possibly as shadow registers */ - From = (UDIUInt32*)®isters[4 * SR_REGNUM(10)]; +/* PC0, PC1, PC2 possibly as shadow registers */ + + From = (UDIUInt32 *)®isters[4 * SR_REGNUM(10)]; To.Space = UDI29KSpecialRegs; Count = 3; if (USE_SHADOW_PC) @@ -798,7 +820,8 @@ int regno; error("UDIWrite() failed in udi_store_regisetrs"); /* LRU and MMU */ - From = (UDIUInt32*)®isters[4 * SR_REGNUM(13)]; + + From = (UDIUInt32 *)®isters[4 * SR_REGNUM(13)]; To.Space = UDI29KSpecialRegs; To.Offset = 13; Count = 2; @@ -806,7 +829,8 @@ int regno; error("UDIWrite() failed in udi_store_regisetrs"); /* Unprotected Special Registers */ - From = (UDIUInt32*)®isters[4 * SR_REGNUM(128)]; + + From = (UDIUInt32 *)®isters[4 * SR_REGNUM(128)]; To.Space = UDI29KSpecialRegs; To.Offset = 128; Count = 135-128 +1; @@ -814,7 +838,6 @@ int regno; error("UDIWrite() failed in udi_store_regisetrs"); registers_changed (); - DEXIT("udi_store_registers() failed in udi_store_regisetrs"); } /****************************************************** UDI_PREPARE_TO_STORE */ @@ -944,11 +967,12 @@ int from_tty; #if defined(ULTRA3) && defined(KERNEL_DEBUGGING) /* We don't ever kill the kernel */ if (from_tty) { - printf("Kernel not killed, but left in current state.\n"); - printf("Use detach to leave kernel running.\n"); + printf_filtered("Kernel not killed, but left in current state.\n"); + printf_filtered("Use detach to leave kernel running.\n"); } #else UDIStop(); + inferior_pid = 0; if (from_tty) { printf("Target has been stopped."); } @@ -1113,45 +1137,47 @@ fetch_register (regno) UDIBool HostEndian = 0; int result; - DENTER("udi_fetch_register()"); - if (regno == GR1_REGNUM) - { From.Space = UDI29KGlobalRegs; - From.Offset = 1; - result = UDIRead(From, &To, Count, Size, &CountDone, HostEndian); - } + { + From.Space = UDI29KGlobalRegs; + From.Offset = 1; + } else if (regno >= GR96_REGNUM && regno < GR96_REGNUM + 32) - { From.Space = UDI29KGlobalRegs; - From.Offset = (regno - GR96_REGNUM) + 96;; - result = UDIRead(From, &To, Count, Size, &CountDone, HostEndian); - } + { + From.Space = UDI29KGlobalRegs; + From.Offset = (regno - GR96_REGNUM) + 96;; + } + #if defined(GR64_REGNUM) + else if (regno >= GR64_REGNUM && regno < GR64_REGNUM + 32 ) - { From.Space = UDI29KGlobalRegs; - From.Offset = (regno - GR64_REGNUM) + 64; - result = UDIRead(From, &To, Count, Size, &CountDone, HostEndian); - } + { + From.Space = UDI29KGlobalRegs; + From.Offset = (regno - GR64_REGNUM) + 64; + } + #endif /* GR64_REGNUM */ + else if (regno >= LR0_REGNUM && regno < LR0_REGNUM + 128) - { From.Space = UDI29KLocalRegs; - From.Offset = (regno - LR0_REGNUM); - result = UDIRead(From, &To, Count, Size, &CountDone, HostEndian); - } + { + From.Space = UDI29KLocalRegs; + From.Offset = (regno - LR0_REGNUM); + } else if (regno>=FPE_REGNUM && regno<=EXO_REGNUM) - { int val = -1; - supply_register(160 + (regno - FPE_REGNUM),(char *) &val); - return 0; /* Pretend Success */ - } + { + int val = -1; + supply_register(160 + (regno - FPE_REGNUM),(char *) &val); + return 0; /* Pretend Success */ + } else - { From.Space = UDI29KSpecialRegs; - From.Offset = regnum_to_srnum(regno); - result = UDIRead(From, &To, Count, Size, &CountDone, HostEndian); - } - DEXIT("udi_fetch_register()"); - if(result) - { result = -1; + { + From.Space = UDI29KSpecialRegs; + From.Offset = regnum_to_srnum(regno); + } + + if (UDIRead(From, &To, Count, Size, &CountDone, HostEndian)) error("UDIRead() failed in udi_fetch_registers"); - } + supply_register(regno, (char *) &To); return result; } @@ -1253,7 +1279,7 @@ int regno; case FC_REGNUM: return(134); case CR_REGNUM: return(135); case FPE_REGNUM: return(160); - case INT_REGNUM: return(161); + case INTE_REGNUM: return(161); case FPS_REGNUM: return(162); case EXO_REGNUM:return(164); default: |