* So many patches have been posted recently on the mailing list and

because we were unable to find correct solution to compile on various
	linux distros (due to rpcgen incompatibilities), and because the coding
	style of rdbg was rather inconsistant among various pieces of code, I
	decided to:
	    1) make some cleaning regarding global coding style (using
	       indent + manual edits),
	    2) incorporate/review the paches send by various people
	       (S. Holford, T. Strauman),
	    3) Fix the bug due to varying rpcgen code generation
	       in remdeb_svc.c,
	    4) Remove some dead code,
	    5) Apply a patches enabling to call enterRdbg imediately
	       after rdbg initialization is done,

	NB : the paches is huge but it is mainly due to coding styke chnages.
	Only few lines of codes have been really changed and they do not impact
	rdbg functionnality (AFAIKT).

	* include/rdbg/servrpc.h, include/rdbg/i386/rdbg_f.h,
	include/rdbg/m68k/rdbg_f.h, include/rdbg/powerpc/rdbg_f.h,
	src/_servtgt.c, src/awk.svc, src/excep.c, src/ptrace.c, src/rdbg.c,
	src/remdeb.x, src/servbkpt.c, src/servcon.c, src/servrpc.c,
	src/servtgt.c, src/servtsp.c, src/servutil.c, src/i386/excep_f.c,
	src/i386/rdbg_f.c, src/i386/any/Makefile.am, src/i386/any/remdeb.h,
	src/i386/any/remdeb_svc.c, src/i386/any/remdeb_xdr.c,
	src/m68k/excep_f.c, src/m68k/rdbg_f.c, src/m68k/any/Makefile.am,
	src/m68k/any/remdeb.h, src/m68k/any/remdeb_svc.c,
	src/m68k/any/remdeb_xdr.c, src/powerpc/excep_f.c, src/powerpc/rdbg_f.c,
	src/powerpc/new_exception_processing/Makefile.am,
	src/powerpc/new_exception_processing/remdeb.h,
	src/powerpc/new_exception_processing/remdeb_svc.c,
	src/powerpc/new_exception_processing/remdeb_xdr.c: Modified.
This commit is contained in:
Joel Sherrill
2002-02-01 17:00:01 +00:00
parent 8e3caa52cd
commit 40cf43eab4
35 changed files with 5725 additions and 5455 deletions
+35
View File
@@ -1,3 +1,38 @@
* So many patches have been posted recently on the mailing list and
because we were unable to find correct solution to compile on various
linux distros (due to rpcgen incompatibilities), and because the coding
style of rdbg was rather inconsistant among various pieces of code, I
decided to:
1) make some cleaning regarding global coding style (using
indent + manual edits),
2) incorporate/review the paches send by various people
(S. Holford, T. Strauman),
3) Fix the bug due to varying rpcgen code generation
in remdeb_svc.c,
4) Remove some dead code,
5) Apply a patches enabling to call enterRdbg imediately
after rdbg initialization is done,
NB : the paches is huge but it is mainly due to coding styke chnages.
Only few lines of codes have been really changed and they do not impact
rdbg functionnality (AFAIKT).
* include/rdbg/servrpc.h, include/rdbg/i386/rdbg_f.h,
include/rdbg/m68k/rdbg_f.h, include/rdbg/powerpc/rdbg_f.h,
src/_servtgt.c, src/awk.svc, src/excep.c, src/ptrace.c, src/rdbg.c,
src/remdeb.x, src/servbkpt.c, src/servcon.c, src/servrpc.c,
src/servtgt.c, src/servtsp.c, src/servutil.c, src/i386/excep_f.c,
src/i386/rdbg_f.c, src/i386/any/Makefile.am, src/i386/any/remdeb.h,
src/i386/any/remdeb_svc.c, src/i386/any/remdeb_xdr.c,
src/m68k/excep_f.c, src/m68k/rdbg_f.c, src/m68k/any/Makefile.am,
src/m68k/any/remdeb.h, src/m68k/any/remdeb_svc.c,
src/m68k/any/remdeb_xdr.c, src/powerpc/excep_f.c, src/powerpc/rdbg_f.c,
src/powerpc/new_exception_processing/Makefile.am,
src/powerpc/new_exception_processing/remdeb.h,
src/powerpc/new_exception_processing/remdeb_svc.c,
src/powerpc/new_exception_processing/remdeb_xdr.c: Modified.
2002-01-18 Till Straumann <strauman@slac.stanford.edu>
* src/powerpc/excep_f.c: This patch addresses the following issues:
+1
View File
@@ -34,6 +34,7 @@ static inline int getExcNum(Exception_context *ctx)
}
extern void connect_rdbg_exception();
extern void disconnect_rdbg_exception();
#endif
+1
View File
@@ -32,6 +32,7 @@ static inline int getExcNum(Exception_context *ctx)
}
extern void connect_rdbg_exception();
extern void disconnect_rdbg_exception();
#endif
@@ -21,6 +21,7 @@ static inline int isRdbgException(Exception_context *ctx)
{
if (
ctx->ctx->_EXC_number != ASM_SYS_VECTOR &&
ctx->ctx->_EXC_number != ASM_PROG_VECTOR &&
ctx->ctx->_EXC_number != ASM_TRACE_VECTOR
) return 0;
else return 1;
@@ -31,6 +32,7 @@ static inline int getExcNum(Exception_context *ctx)
}
extern void connect_rdbg_exception();
extern void disconnect_rdbg_exception();
#endif
+1 -1
View File
@@ -23,7 +23,7 @@ extern int CONN_LIST_INC;
extern int PID_LIST_INC;
extern int TSP_RETRIES;
extern int BackPort;
extern char ActName[];
extern char taskName[];
extern int getId();
+168 -156
View File
@@ -5,16 +5,15 @@
============================================================================
*/
#include <string.h>
#include <string.h>
#include <rtems.h>
#include <rtems/error.h>
#include <rdbg/rdbg.h>
#include <rdbg/rdbg_f.h>
#include <rdbg/servrpc.h>
#include <rdbg/servrpc.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <assert.h>
#include <rtems/score/cpu.h>
@@ -29,6 +28,7 @@ extern int errno;
rtems_id eventTaskId;
rtems_id serializeSemId;
rtems_id wakeupEventSemId;
rtems_id debugId;
CPU_Exception_frame Idle_frame;
@@ -36,59 +36,56 @@ CPU_Exception_frame Idle_frame;
TgtRealPtrace - lowest level ptrace() wrapper
----------------------------------------------------------------- */
int
TgtRealPtrace(int req, PID aid, char* addr, int d, void* addr2)
int
TgtRealPtrace (int req, PID aid, char *addr, int d, void *addr2)
{
return ptrace(req, aid, addr, d, addr2);
return ptrace (req, aid, addr, d, addr2);
}
/* -----------------------------------------------------------------------
TgtChange() is called when the system stops.
It informs the generic layers must be informed of
that fact.
----------------------------------------------------------------------- */
static int
TgtChange (PID pid, CPU_Exception_frame* ctx, int status)
static int
TgtChange (PID pid, CPU_Exception_frame * ctx, int status)
{
if (TgtHandleChildChange (pid, &status, NULL, ctx)) {
TgtNotifyWaitChange (pid, status, -1);
}
if (TgtHandleChildChange (pid, &status, NULL, ctx)) {
TgtNotifyWaitChange (pid, status, -1);
}
return 0;
return 0;
}
/* -----------------------------------------------------------------------
eventTask
----------------------------------------------------------------------- */
rtems_task eventTask( rtems_task_argument pid)
rtems_task
eventTask (rtems_task_argument pid)
{
Exception_context *ctx;
DPRINTF (("event task: pid %d\n", pid));
/*
* we spend all our time waiting for a semaphore.
* If wait change, we send info
*/
for (;;){
for (;;) {
DPRINTF (("Event Task: wait event\n"));
rtems_semaphore_obtain(wakeupEventSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
rtems_semaphore_obtain (wakeupEventSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
DPRINTF (("Event Task: wake up !!!!!!!!!!!!!\n"));
errno = 0;
ctx = GetExceptCtx(currentTargetThread);
ctx = GetExceptCtx (currentTargetThread);
CheckForSingleStep(ctx->ctx);
CheckForSingleStep (ctx->ctx);
TgtChange(pid, ctx->ctx,STS_MAKESIG(ExcepToSig(ctx)));
TgtChange (pid, ctx->ctx, STS_MAKESIG (ExcepToSig (ctx)));
}
}
@@ -100,10 +97,11 @@ rtems_task eventTask( rtems_task_argument pid)
only to push a first valid context in the list
---------------------------------------------------------------------*/
rtems_task MyThreadIdle(rtems_task_argument argument)
rtems_task
MyThreadIdle (rtems_task_argument argument)
{
enterRdbg();
rtems_task_delete( RTEMS_SELF );
enterRdbg ();
rtems_task_delete (RTEMS_SELF);
}
/* -----------------------------------------------------------------------
@@ -114,192 +112,206 @@ rtems_task MyThreadIdle(rtems_task_argument argument)
process that we do not control now).
----------------------------------------------------------------------- */
Boolean TgtAttach(
int conn_idx, /* client that is requesting */
PID pid) /* process to attach to */
{
Boolean
TgtAttach (int conn_idx, /* client that is requesting */
PID pid)
{ /* process to attach to */
rtems_name task_name;
rtems_status_code status;
rtems_id debugId;
errno = 0;
DPRINTF (("TgtAttach pid=%d\n",pid));
Ptrace(RPT_ATTACH, pid, NULL, 0, NULL);
DPRINTF (("TgtAttach pid=%d\n", pid));
Ptrace (RPT_ATTACH, pid, NULL, 0, NULL);
if (errno)
return(False); /* failed */
return (False); /* failed */
TgtCreateNew(pid, conn_idx, 0, NULL, False);
TgtCreateNew (pid, conn_idx, 0, NULL, False);
connect_rdbg_exception ();
connect_rdbg_exception();
/*
* Create the attach debuger task
* Search for and remove debugging tasks / semaphores left over from
* a previous attach without a detach.
*/
task_name = rtems_build_name( 'E', 'v', 'n', 't' );
if ((status = rtems_task_create( task_name, 10, 24576,
RTEMS_INTERRUPT_LEVEL(0),
RTEMS_DEFAULT_ATTRIBUTES | RTEMS_SYSTEM_TASK,
&eventTaskId ))
!= RTEMS_SUCCESSFUL){
printf("status = %d\n",status);
if (rtems_task_ident (rtems_build_name ('E', 'v', 'n', 't'),
RTEMS_SEARCH_ALL_NODES,
&eventTaskId) == RTEMS_SUCCESSFUL)
rtems_task_delete (eventTaskId);
if (rtems_semaphore_ident (rtems_build_name ('D', 'B', 'G', 's'),
RTEMS_SEARCH_ALL_NODES,
&serializeSemId) == RTEMS_SUCCESSFUL)
rtems_semaphore_delete (serializeSemId);
if (rtems_semaphore_ident (rtems_build_name ('D', 'B', 'G', 'w'),
RTEMS_SEARCH_ALL_NODES,
&wakeupEventSemId) == RTEMS_SUCCESSFUL)
rtems_semaphore_delete (wakeupEventSemId);
/*
* Create the attach debugger task
*/
task_name = rtems_build_name ('E', 'v', 'n', 't');
if ((status = rtems_task_create (task_name, 10, 24576,
RTEMS_INTERRUPT_LEVEL (0),
RTEMS_DEFAULT_ATTRIBUTES |
RTEMS_SYSTEM_TASK, &eventTaskId))
!= RTEMS_SUCCESSFUL) {
printf ("status = %d\n", status);
rtems_panic ("Can't create task.\n");
}
status = rtems_task_start(eventTaskId, eventTask, pid);
status = rtems_semaphore_create (rtems_build_name('D', 'B', 'G', 's'),
1,
RTEMS_FIFO |
RTEMS_COUNTING_SEMAPHORE |
RTEMS_NO_INHERIT_PRIORITY |
RTEMS_NO_PRIORITY_CEILING |
RTEMS_LOCAL,
0,
&serializeSemId);
if (status != RTEMS_SUCCESSFUL)
rtems_panic ("Can't create serialize semaphore: `%s'\n",rtems_status_text(status));
status = rtems_task_start (eventTaskId, eventTask, pid);
status = rtems_semaphore_create (rtems_build_name('D', 'B', 'G', 'w'),
0,
RTEMS_FIFO |
RTEMS_COUNTING_SEMAPHORE |
RTEMS_NO_INHERIT_PRIORITY |
RTEMS_NO_PRIORITY_CEILING |
RTEMS_LOCAL,
0,
&wakeupEventSemId);
status = rtems_semaphore_create (rtems_build_name ('D', 'B', 'G', 's'),
1,
RTEMS_FIFO |
RTEMS_COUNTING_SEMAPHORE |
RTEMS_NO_INHERIT_PRIORITY |
RTEMS_NO_PRIORITY_CEILING |
RTEMS_LOCAL, 0, &serializeSemId);
if (status != RTEMS_SUCCESSFUL)
rtems_panic ("Can't create wakeup semaphore: `%s'\n",rtems_status_text(status));
rtems_panic ("Can't create serialize semaphore: `%s'\n",
rtems_status_text (status));
status = rtems_semaphore_create (rtems_build_name ('D', 'B', 'G', 'w'),
0,
RTEMS_FIFO |
RTEMS_COUNTING_SEMAPHORE |
RTEMS_NO_INHERIT_PRIORITY |
RTEMS_NO_PRIORITY_CEILING |
RTEMS_LOCAL, 0, &wakeupEventSemId);
if (status != RTEMS_SUCCESSFUL)
rtems_panic ("Can't create wakeup semaphore: `%s'\n",
rtems_status_text (status));
/*
* Create the MyThreadIdle task to init Exception mechanism
*/
task_name = rtems_build_name( 'R', 'i', 'n', 'i' );
if ((status = rtems_task_create( task_name, 10, 24576,
RTEMS_INTERRUPT_LEVEL(0),
RTEMS_DEFAULT_ATTRIBUTES,
&debugId ))
!= RTEMS_SUCCESSFUL){
printf("status = %d (%s)\n",status,rtems_status_text(status));
task_name = rtems_build_name ('R', 'i', 'n', 'i');
if ((status = rtems_task_create (task_name, 10, 24576,
RTEMS_INTERRUPT_LEVEL (0),
RTEMS_DEFAULT_ATTRIBUTES, &debugId))
!= RTEMS_SUCCESSFUL) {
printf ("status = %d (%s)\n", status, rtems_status_text (status));
rtems_panic ("Can't create task.\n");
}
status = rtems_task_start(debugId, MyThreadIdle, pid);
status = rtems_task_start (debugId, MyThreadIdle, pid);
return(True);
return (True);
}
/* -----------------------------------------------------------------------
TgtPtrace - handle ptrace requests for server.
----------------------------------------------------------------------- */
int TgtPtrace(
int req,
PID pid,
char *addr,
int data,
void *addr2)
int
TgtPtrace (int req, PID pid, char *addr, int data, void *addr2)
{
if ((req == RPT_SINGLESTEP || req == RPT_CONT)
&& addr2) /* clear then step */
{ /* addr2 is the old value */
int ret;
&& addr2) { /* clear then step *//* addr2 is the old value */
int ret;
errno = 0;
TgtBreakRestoreOrig (pid, addr, addr2);
ret = Ptrace(RPT_SINGLESTEP, pid, addr, data, NULL); /* step over */
if (ret) /* error, cannot single-step */
{
ret = Ptrace (RPT_SINGLESTEP, pid, addr, data, NULL); /* step over */
if (ret) { /* error, cannot single-step */
int pid_idx = FindPidEntry (pid);
TgtBreakCancelStep (&pid_list [pid_idx]);
TgtBreakCancelStep (&pid_list[pid_idx]);
}
return(ret); /* failed or done */
}
else
return(Ptrace(req, pid, addr, data, addr2)); /* normal call */
return (ret); /* failed or done */
} else
return (Ptrace (req, pid, addr, data, addr2)); /* normal call */
}
/* -----------------------------------------------------------------
TgtGetThreadName - get thread name
--------------------------------------------------------------- */
int TgtGetThreadName (
PID_LIST *plst, /* Process entry */
unsigned Id, /* Thread ID */
char *ThrName) /* Thread name */
{
int index;
unsigned name;
if ( Id <_Objects_Information_table[OBJECTS_RTEMS_TASKS]->maximum_id &&
Id >_Objects_Information_table[OBJECTS_RTEMS_TASKS]->minimum_id) {
int
TgtGetThreadName (PID_LIST * plst, /* Process entry */
unsigned Id, /* Thread ID */
char *ThrName)
{ /* Thread name */
int index;
unsigned name;
index = Id - _Objects_Information_table[OBJECTS_RTEMS_TASKS]->minimum_id;
name = *(unsigned*)(_Objects_Information_table[OBJECTS_RTEMS_TASKS]->local_table[1+index]->name);
ThrName[0] = (char)((name >> 24) & 0xFF );
ThrName[1] = (char)((name >> 16) & 0xFF );
ThrName[2] = (char)((name >> 8) & 0xFF );
ThrName[3] = (char)( name & 0xFF );
ThrName[4] = 0x0;
return 0;
}
if ( Id <_Objects_Information_table[OBJECTS_POSIX_THREADS]->maximum_id &&
Id >_Objects_Information_table[OBJECTS_POSIX_THREADS]->minimum_id) {
if (Id < _Objects_Information_table[OBJECTS_RTEMS_TASKS]->maximum_id &&
Id > _Objects_Information_table[OBJECTS_RTEMS_TASKS]->minimum_id) {
index = Id - _Objects_Information_table[OBJECTS_POSIX_THREADS]->minimum_id;
name = *(unsigned*)(_Objects_Information_table[OBJECTS_POSIX_THREADS]->local_table[1+index]->name);
ThrName[0] = (char)((name >> 24) & 0xFF );
ThrName[1] = (char)((name >> 16) & 0xFF );
ThrName[2] = (char)((name >> 8) & 0xFF );
ThrName[3] = (char)( name & 0xFF );
ThrName[4] = 0x0;
return 0;
}
return -1;
index = Id - _Objects_Information_table[OBJECTS_RTEMS_TASKS]->minimum_id;
name =
*(unsigned *) (_Objects_Information_table[OBJECTS_RTEMS_TASKS]->
local_table[1 + index]->name);
ThrName[0] = (char) ((name >> 24) & 0xFF);
ThrName[1] = (char) ((name >> 16) & 0xFF);
ThrName[2] = (char) ((name >> 8) & 0xFF);
ThrName[3] = (char) (name & 0xFF);
ThrName[4] = 0x0;
return 0;
}
if (Id < _Objects_Information_table[OBJECTS_POSIX_THREADS]->maximum_id &&
Id > _Objects_Information_table[OBJECTS_POSIX_THREADS]->minimum_id) {
index =
Id - _Objects_Information_table[OBJECTS_POSIX_THREADS]->minimum_id;
name =
*(unsigned *) (_Objects_Information_table[OBJECTS_POSIX_THREADS]->
local_table[1 + index]->name);
ThrName[0] = (char) ((name >> 24) & 0xFF);
ThrName[1] = (char) ((name >> 16) & 0xFF);
ThrName[2] = (char) ((name >> 8) & 0xFF);
ThrName[3] = (char) (name & 0xFF);
ThrName[4] = 0x0;
return 0;
}
return -1;
}
/* -----------------------------------------------------------------
TgtThreadList - return all the threads in the system
----------------------------------------------------------------- */
int
TgtThreadList (
PID_LIST* plst, /* Process entry */
unsigned* threads, /* Output buffer */
unsigned size) /* Output buffer size */
{
int curr = 0;
Objects_Id id;
unsigned index;
int
TgtThreadList (PID_LIST * plst, /* Process entry */
unsigned *threads, /* Output buffer */
unsigned size)
{ /* Output buffer size */
int curr = 0;
Objects_Id id;
unsigned index;
id = _Objects_Information_table[OBJECTS_RTEMS_TASKS]->minimum_id;
id = _Objects_Information_table[OBJECTS_RTEMS_TASKS]->minimum_id;
while (id < _Objects_Information_table[OBJECTS_RTEMS_TASKS]->maximum_id){
index = id - _Objects_Information_table[OBJECTS_RTEMS_TASKS]->minimum_id;
if ( _Objects_Information_table[OBJECTS_RTEMS_TASKS]->local_table[1+index] != NULL){
while (id < _Objects_Information_table[OBJECTS_RTEMS_TASKS]->maximum_id) {
index = id - _Objects_Information_table[OBJECTS_RTEMS_TASKS]->minimum_id;
if (_Objects_Information_table[OBJECTS_RTEMS_TASKS]->
local_table[1 + index] != NULL) {
threads[curr] = (unsigned) id;
curr++;
}
id ++;
}
id = _Objects_Information_table[OBJECTS_POSIX_THREADS]->minimum_id;
id++;
}
while (id < _Objects_Information_table[OBJECTS_POSIX_THREADS]->maximum_id){
index = id - _Objects_Information_table[OBJECTS_POSIX_THREADS]->minimum_id;
if ( _Objects_Information_table[OBJECTS_POSIX_THREADS]->local_table[1+index] != NULL){
id = _Objects_Information_table[OBJECTS_POSIX_THREADS]->minimum_id;
while (id < _Objects_Information_table[OBJECTS_POSIX_THREADS]->maximum_id) {
index =
id - _Objects_Information_table[OBJECTS_POSIX_THREADS]->minimum_id;
if (_Objects_Information_table[OBJECTS_POSIX_THREADS]->
local_table[1 + index] != NULL) {
threads[curr] = (unsigned) id;
curr++;
}
id ++;
}
return curr;
id++;
}
return curr;
}
+1 -1
View File
@@ -26,7 +26,7 @@ $1 ~ /^\/\*HEADER_START\*\/$/ {
printf("#include <bsp.h>\n");
printf("#include <rdbg/servrpc.h>\n");
printf("#include <rdbg/%s>\n", THEPROG);
printf("#define fprintf(a,b) printf(b)\n");
printf("#define fprintf(a,b,c) printf(b,c)\n");
}
$1 ~ /^\/\*HEADER_END\*\/$/ {
+55 -45
View File
@@ -24,30 +24,32 @@ Exception_context *LastCtx = NULL;
CPU_Exception_frame SavedContext;
/*
* Save an exception context at the end of a list
*/
/********* Save an exception context at the end of a list *****/
int PushExceptCtx ( Objects_Id Id, Objects_Id semId, CPU_Exception_frame *ctx ) {
int
PushExceptCtx (Objects_Id Id, Objects_Id semId, CPU_Exception_frame * ctx)
{
Exception_context *SaveCtx;
SaveCtx = (Exception_context *)malloc(sizeof(Exception_context));
SaveCtx = (Exception_context *) malloc (sizeof (Exception_context));
if (SaveCtx == NULL)
rtems_panic("Can't allocate memory to save Exception context");
rtems_panic ("Can't allocate memory to save Exception context");
SaveCtx->id = Id;
SaveCtx->ctx = ctx;
SaveCtx->semaphoreId = semId;
SaveCtx->previous = NULL;
SaveCtx->next = NULL;
if (FirstCtx == NULL){ /* initialization */
if (FirstCtx == NULL) { /* initialization */
FirstCtx = SaveCtx;
LastCtx = SaveCtx;
LastCtx = SaveCtx;
NbExceptCtx = 1;
}
else {
NbExceptCtx ++;
} else {
NbExceptCtx++;
LastCtx->next = SaveCtx;
SaveCtx->previous = LastCtx;
LastCtx = SaveCtx;
@@ -55,36 +57,41 @@ int PushExceptCtx ( Objects_Id Id, Objects_Id semId, CPU_Exception_frame *ctx )
return 0;
}
/********* Save an temporary exception context in a ******/
/********* global variable ******/
/*
* Save an temporary exception context in a global variable
*/
int PushSavedExceptCtx ( Objects_Id Id, CPU_Exception_frame *ctx ) {
memcpy (&(SavedContext), ctx, sizeof(CPU_Exception_frame));
int
PushSavedExceptCtx (Objects_Id Id, CPU_Exception_frame * ctx)
{
memcpy (&(SavedContext), ctx, sizeof (CPU_Exception_frame));
return 0;
}
/*
* Remove the context of the specified Id thread.
* If Id = -1, then return the first context
*/
/****** Remove the context of the specified Id thread *********/
/****** If Id = -1, then return the first context *********/
int PopExceptCtx ( Objects_Id Id ) {
int
PopExceptCtx (Objects_Id Id)
{
Exception_context *ExtractCtx;
if (FirstCtx == NULL) return -1;
if (Id == -1) {
if (FirstCtx == NULL)
return -1;
if (Id == -1) {
ExtractCtx = LastCtx;
LastCtx = LastCtx->previous;
free(ExtractCtx);
NbExceptCtx --;
free (ExtractCtx);
NbExceptCtx--;
return 0;
}
ExtractCtx = LastCtx;
while (ExtractCtx->id != Id && ExtractCtx != NULL) {
ExtractCtx = ExtractCtx->previous;
}
@@ -92,37 +99,40 @@ int PopExceptCtx ( Objects_Id Id ) {
if (ExtractCtx == NULL)
return -1;
if ( ExtractCtx->previous != NULL)
if (ExtractCtx->previous != NULL)
(ExtractCtx->previous)->next = ExtractCtx->next;
if ( ExtractCtx->next != NULL)
if (ExtractCtx->next != NULL)
(ExtractCtx->next)->previous = ExtractCtx->previous;
if (ExtractCtx == FirstCtx)
FirstCtx = FirstCtx->next;
else
if (ExtractCtx == LastCtx)
else if (ExtractCtx == LastCtx)
LastCtx = LastCtx->previous;
free(ExtractCtx);
NbExceptCtx --;
free (ExtractCtx);
NbExceptCtx--;
return 0;
}
/****** Return the context of the specified Id thread *********/
/****** If Id = -1, then return the first context *********/
/*
* Return the context of the specified Id thread.
* If Id = -1, then return the first context.
*/
Exception_context *GetExceptCtx ( Objects_Id Id ) {
Exception_context *
GetExceptCtx (Objects_Id Id)
{
Exception_context *ExtractCtx;
if (FirstCtx == NULL) return NULL;
if (Id == -1) {
if (FirstCtx == NULL)
return NULL;
if (Id == -1) {
return LastCtx;
}
ExtractCtx = LastCtx;
while (ExtractCtx->id != Id && ExtractCtx != NULL) {
+2
View File
@@ -71,6 +71,8 @@ if RPCTOOLS
-o i386/any/tmpSvc.c remdeb.x; \
$(AWK) -f ./awk.svc THEPROG="remdeb.h" i386/any/tmpSvc.c \
> i386/any/remdeb_svc.c; \
$(SED) -e 's/fprintf.*,/printf(/' i386/any/remdeb_svc.c > i386/any/remdeb_svc.tmp; \
mv i386/any/remdeb_svc.tmp i386/any/remdeb_svc.c; \
rm -f i386/any/tmpSvc.c )
endif
File diff suppressed because it is too large Load Diff
+95 -84
View File
@@ -22,101 +22,112 @@
* become too small if this value gets incremented.
*/
#ifndef XRY_MAX_CMD_STR
#endif /* REMDEB_H */
/* now open_connex() routine which establishes a connection to server */
#define DEBUGGER_IS_GDB 0x2 /* */
/* now close_connex() routine which detaches from server */
/* now send_signal() routine which sends signals to processes like kill(2) */
/* now wait_info() routine which returns results of polling the wait status
of a process/actor. It may return 0 if running, else pid or -1 */
/* now ptrace() routine. This matches the Sun UNIX ptrace as well as
some additions */
/* now define the actual calls we support */
const char* names [] = {
"NULLPROC", "OPEN_CONNEX", "SEND_SIGNAL", "name3",
"name4", "name5", "name6", "name7",
"name8", "name9", "CLOSE_CONNEX", "PTRACE",
"name12", "WAIT_INFO", "name14", "name15",
"name16", "GET_SIGNAL_NAMES", "name18"
#endif /* REMDEB_H */
/*
* now open_connex() routine which establishes a connection to server
*/
#define DEBUGGER_IS_GDB 0x2 /* */
/*
* now close_connex() routine which detaches from server
*/
/*
* now send_signal() routine which sends signals to processes like kill(2)
*/
/*
* now wait_info() routine which returns results of polling the wait status
* of a process/actor. It may return 0 if running, else pid or -1
*/
/*
* now ptrace() routine. This matches the Sun UNIX ptrace as well as
* some additions
*/
/*
* now define the actual calls we support
*/
const char *names[] = {
"NULLPROC", "OPEN_CONNEX", "SEND_SIGNAL", "name3",
"name4", "name5", "name6", "name7",
"name8", "name9", "CLOSE_CONNEX", "PTRACE",
"name12", "WAIT_INFO", "name14", "name15",
"name16", "GET_SIGNAL_NAMES", "name18"
};
void
remotedeb_2(struct svc_req *rqstp, register SVCXPRT *transp)
remotedeb_2 (struct svc_req *rqstp, register SVCXPRT * transp)
{
union {
open_in open_connex_2_arg;
signal_in send_signal_2_arg;
close_in close_connex_2_arg;
ptrace_in ptrace_2_arg;
wait_in wait_info_2_arg;
} argument;
char *result;
xdrproc_t _xdr_argument, _xdr_result;
char *(*local)(char *, struct svc_req *);
union {
open_in open_connex_2_arg;
signal_in send_signal_2_arg;
close_in close_connex_2_arg;
ptrace_in ptrace_2_arg;
wait_in wait_info_2_arg;
} argument;
char *result;
xdrproc_t _xdr_argument, _xdr_result;
char *(*local) (char *, struct svc_req *);
DPRINTF (("remotedeb_2: %s (%d)\n",
(unsigned) rqstp->rq_proc <
(unsigned) (sizeof names / sizeof names[0]) ?
names [rqstp->rq_proc] : "???",
(int) rqstp->rq_proc));
DPRINTF (("remotedeb_2: %s (%d)\n",
(unsigned) rqstp->rq_proc <
(unsigned) (sizeof names / sizeof names[0]) ?
names[rqstp->rq_proc] : "???", (int) rqstp->rq_proc));
switch (rqstp->rq_proc) {
case NULLPROC:
(void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL);
return;
switch (rqstp->rq_proc) {
case NULLPROC:
(void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *) NULL);
return;
case OPEN_CONNEX:
_xdr_argument = (xdrproc_t) xdr_open_in;
_xdr_result = (xdrproc_t) xdr_open_out;
local = (char *(*)(char *, struct svc_req *)) open_connex_2_svc;
break;
case OPEN_CONNEX:
_xdr_argument = (xdrproc_t) xdr_open_in;
_xdr_result = (xdrproc_t) xdr_open_out;
local = (char *(*)(char *, struct svc_req *)) open_connex_2_svc;
break;
case SEND_SIGNAL:
_xdr_argument = (xdrproc_t) xdr_signal_in;
_xdr_result = (xdrproc_t) xdr_signal_out;
local = (char *(*)(char *, struct svc_req *)) send_signal_2_svc;
break;
case SEND_SIGNAL:
_xdr_argument = (xdrproc_t) xdr_signal_in;
_xdr_result = (xdrproc_t) xdr_signal_out;
local = (char *(*)(char *, struct svc_req *)) send_signal_2_svc;
break;
case CLOSE_CONNEX:
_xdr_argument = (xdrproc_t) xdr_close_in;
_xdr_result = (xdrproc_t) xdr_void;
local = (char *(*)(char *, struct svc_req *)) close_connex_2_svc;
break;
case CLOSE_CONNEX:
_xdr_argument = (xdrproc_t) xdr_close_in;
_xdr_result = (xdrproc_t) xdr_void;
local = (char *(*)(char *, struct svc_req *)) close_connex_2_svc;
break;
case PTRACE:
_xdr_argument = (xdrproc_t) xdr_ptrace_in;
_xdr_result = (xdrproc_t) xdr_ptrace_out;
local = (char *(*)(char *, struct svc_req *)) ptrace_2_svc;
break;
case PTRACE:
_xdr_argument = (xdrproc_t) xdr_ptrace_in;
_xdr_result = (xdrproc_t) xdr_ptrace_out;
local = (char *(*)(char *, struct svc_req *)) ptrace_2_svc;
break;
case WAIT_INFO:
_xdr_argument = (xdrproc_t) xdr_wait_in;
_xdr_result = (xdrproc_t) xdr_wait_out;
local = (char *(*)(char *, struct svc_req *)) wait_info_2_svc;
break;
case WAIT_INFO:
_xdr_argument = (xdrproc_t) xdr_wait_in;
_xdr_result = (xdrproc_t) xdr_wait_out;
local = (char *(*)(char *, struct svc_req *)) wait_info_2_svc;
break;
case GET_SIGNAL_NAMES:
_xdr_argument = (xdrproc_t) xdr_void;
_xdr_result = (xdrproc_t) xdr_get_signal_names_out;
local = (char *(*)(char *, struct svc_req *)) get_signal_names_2_svc;
break;
case GET_SIGNAL_NAMES:
_xdr_argument = (xdrproc_t) xdr_void;
_xdr_result = (xdrproc_t) xdr_get_signal_names_out;
local = (char *(*)(char *, struct svc_req *)) get_signal_names_2_svc;
break;
default:
svcerr_noproc (transp);
return;
}
memset ((char *)&argument, 0, sizeof (argument));
if (!svc_getargs (transp, _xdr_argument, (caddr_t) &argument)) {
svcerr_decode (transp);
return;
}
result = (*local)((char *)&argument, rqstp);
if (result != NULL && !svc_sendreply(transp, _xdr_result, result)) {
svcerr_systemerr (transp);
}
if (!svc_freeargs (transp, _xdr_argument, (caddr_t) &argument)) {
fprintf (stderr, "unable to free arguments");
exit (1);
}
return;
default:
svcerr_noproc (transp);
return;
}
memset ((char *) &argument, 0, sizeof (argument));
if (!svc_getargs (transp, _xdr_argument, (caddr_t) & argument)) {
svcerr_decode (transp);
return;
}
result = (*local) ((char *) &argument, rqstp);
if (result != NULL && !svc_sendreply (transp, _xdr_result, result)) {
svcerr_systemerr (transp);
}
if (!svc_freeargs (transp, _xdr_argument, (caddr_t) & argument)) {
fprintf (stderr, "unable to free arguments");
exit (1);
}
return;
}
File diff suppressed because it is too large Load Diff
+73 -82
View File
@@ -22,43 +22,41 @@
It is identical to the one used by the PM and the AM.
----------------------------------------------------------------- */
int
ExcepToSig (Exception_context *ctx)
int
ExcepToSig (Exception_context * ctx)
{
int excep = getExcNum (ctx);
int excep = getExcNum (ctx);
switch (excep) {
case I386_EXCEPTION_MATH_COPROC_UNAVAIL:
case I386_EXCEPTION_I386_COPROC_SEG_ERR:
case I386_EXCEPTION_FLOAT_ERROR:
case I386_EXCEPTION_BOUND:
return SIGFPE;
switch (excep) {
case I386_EXCEPTION_DEBUG:
case I386_EXCEPTION_BREAKPOINT:
case I386_EXCEPTION_ENTER_RDBG:
return SIGTRAP;
case I386_EXCEPTION_MATH_COPROC_UNAVAIL:
case I386_EXCEPTION_I386_COPROC_SEG_ERR:
case I386_EXCEPTION_FLOAT_ERROR:
case I386_EXCEPTION_BOUND:
return SIGFPE;
case I386_EXCEPTION_OVERFLOW:
case I386_EXCEPTION_DIVIDE_BY_ZERO:
case I386_EXCEPTION_ILLEGAL_INSTR:
return SIGILL;
case I386_EXCEPTION_DEBUG:
case I386_EXCEPTION_BREAKPOINT:
case I386_EXCEPTION_ENTER_RDBG:
return SIGTRAP;
case I386_EXCEPTION_SEGMENT_NOT_PRESENT:
case I386_EXCEPTION_STACK_SEGMENT_FAULT:
case I386_EXCEPTION_GENERAL_PROT_ERR:
case I386_EXCEPTION_PAGE_FAULT:
return SIGSEGV;
case I386_EXCEPTION_OVERFLOW:
case I386_EXCEPTION_DIVIDE_BY_ZERO:
case I386_EXCEPTION_ILLEGAL_INSTR:
return SIGILL;
default:
break;
}
return SIGKILL;
case I386_EXCEPTION_SEGMENT_NOT_PRESENT:
case I386_EXCEPTION_STACK_SEGMENT_FAULT:
case I386_EXCEPTION_GENERAL_PROT_ERR:
case I386_EXCEPTION_PAGE_FAULT:
return SIGSEGV;
default:
break;
}
return SIGKILL;
}
/*----- Breakpoint Exception management -----*/
/*
@@ -66,88 +64,81 @@ ExcepToSig (Exception_context *ctx)
* software breakpoints.
*/
void
BreakPointExcHdl(CPU_Exception_frame *ctx)
void
BreakPointExcHdl (CPU_Exception_frame * ctx)
{
rtems_status_code status;
rtems_id continueSemId;
if ( (justSaveContext) && (ctx->idtIndex == I386_EXCEPTION_ENTER_RDBG) ) {
if ((justSaveContext) && (ctx->idtIndex == I386_EXCEPTION_ENTER_RDBG)) {
PushSavedExceptCtx (_Thread_Executing->Object.id, ctx);
justSaveContext = 0;
}
else {
if (ctx->idtIndex != I386_EXCEPTION_DEBUG){
} else {
if (ctx->idtIndex != I386_EXCEPTION_DEBUG) {
NbSerializedCtx++;
rtems_semaphore_obtain(serializeSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
rtems_semaphore_obtain (serializeSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
NbSerializedCtx--;
}
currentTargetThread = _Thread_Executing->Object.id;
#ifdef DDEBUG
printk("----------------------------------------------------------\n");
printk("Exception %d caught at PC %x by thread %d\n",
ctx->idtIndex,
ctx->eip,
_Thread_Executing->Object.id);
printk("----------------------------------------------------------\n");
printk("Processor execution context at time of the fault was :\n");
printk("----------------------------------------------------------\n");
printk(" EAX = %x EBX = %x ECX = %x EDX = %x\n",
ctx->eax, ctx->ebx, ctx->ecx, ctx->edx);
printk(" ESI = %x EDI = %x EBP = %x ESP = %x\n",
ctx->esi, ctx->edi, ctx->ebp, ctx->esp0);
printk("----------------------------------------------------------\n");
printk("Error code pushed by processor itself (if not 0) = %x\n",
ctx->faultCode);
printk("----------------------------------------------------------\n\n");
printk ("----------------------------------------------------------\n");
printk ("Exception %d caught at PC %x by thread %d\n",
ctx->idtIndex, ctx->eip, _Thread_Executing->Object.id);
printk ("----------------------------------------------------------\n");
printk ("Processor execution context at time of the fault was :\n");
printk ("----------------------------------------------------------\n");
printk (" EAX = %x EBX = %x ECX = %x EDX = %x\n",
ctx->eax, ctx->ebx, ctx->ecx, ctx->edx);
printk (" ESI = %x EDI = %x EBP = %x ESP = %x\n",
ctx->esi, ctx->edi, ctx->ebp, ctx->esp0);
printk ("----------------------------------------------------------\n");
printk ("Error code pushed by processor itself (if not 0) = %x\n",
ctx->faultCode);
printk ("----------------------------------------------------------\n\n");
#endif
status = rtems_semaphore_create (rtems_build_name('D', 'B', 'G', 'c'),
0,
RTEMS_FIFO |
RTEMS_COUNTING_SEMAPHORE |
RTEMS_NO_INHERIT_PRIORITY |
RTEMS_NO_PRIORITY_CEILING |
RTEMS_LOCAL,
0,
&continueSemId);
status = rtems_semaphore_create (rtems_build_name ('D', 'B', 'G', 'c'),
0,
RTEMS_FIFO |
RTEMS_COUNTING_SEMAPHORE |
RTEMS_NO_INHERIT_PRIORITY |
RTEMS_NO_PRIORITY_CEILING |
RTEMS_LOCAL, 0, &continueSemId);
if (status != RTEMS_SUCCESSFUL)
rtems_panic ("Can't create continue semaphore: `%s'\n",rtems_status_text(status));
rtems_panic ("Can't create continue semaphore: `%s'\n",
rtems_status_text (status));
PushExceptCtx (_Thread_Executing->Object.id, continueSemId, ctx);
switch (ctx->idtIndex){
switch (ctx->idtIndex) {
case I386_EXCEPTION_DEBUG:
DPRINTF((" DEBUG EXCEPTION !!!\n"));
DPRINTF ((" DEBUG EXCEPTION !!!\n"));
ctx->eflags &= ~EFLAGS_TF;
ExitForSingleStep-- ;
rtems_semaphore_release( wakeupEventSemId );
break;
ExitForSingleStep--;
rtems_semaphore_release (wakeupEventSemId);
break;
case I386_EXCEPTION_BREAKPOINT:
DPRINTF((" BREAKPOINT EXCEPTION !!!\n"));
rtems_semaphore_release( wakeupEventSemId );
break;
DPRINTF ((" BREAKPOINT EXCEPTION !!!\n"));
rtems_semaphore_release (wakeupEventSemId);
break;
case I386_EXCEPTION_ENTER_RDBG:
DPRINTF((" ENTER RDBG !!!\n"));
rtems_semaphore_release( wakeupEventSemId );
DPRINTF ((" ENTER RDBG !!!\n"));
rtems_semaphore_release (wakeupEventSemId);
break;
default:
DPRINTF((" OTHER EXCEPTION !!!\n"));
rtems_semaphore_release( wakeupEventSemId );
DPRINTF ((" OTHER EXCEPTION !!!\n"));
rtems_semaphore_release (wakeupEventSemId);
break;
}
rtems_semaphore_obtain(continueSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
rtems_semaphore_obtain (continueSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
PopExceptCtx (_Thread_Executing->Object.id);
rtems_semaphore_delete(continueSemId);
rtems_semaphore_delete (continueSemId);
}
}
+116 -103
View File
@@ -12,144 +12,157 @@
#include <assert.h>
#include <errno.h>
#include <rdbg/reg.h>
#include <rdbg/reg.h>
#include <rdbg/remdeb.h>
#include <rdbg/rdbg.h>
#include <rtems/score/cpu.h>
#include <rtems/score/thread.h>
#include <rtems/score/cpu.h>
#include <rtems/score/thread.h>
void
CtxToRegs (const CPU_Exception_frame* ctx, xdr_regs* regs)
void
CtxToRegs (const CPU_Exception_frame * ctx, xdr_regs * regs)
{
regs->tabreg [GS] = 0;
regs->tabreg [FS] = 0;
regs->tabreg [ES] = 0;
regs->tabreg [DS] = 0;
regs->tabreg [EDI] = ctx->edi;
regs->tabreg [ESI] = ctx->esi;
regs->tabreg [EBP] = ctx->ebp;
regs->tabreg [ESP] = ctx->esp0;
regs->tabreg [EBX] = ctx->ebx;
regs->tabreg [EDX] = ctx->edx;
regs->tabreg [ECX] = ctx->ecx;
regs->tabreg [EAX] = ctx->eax;
regs->tabreg [TRAPNO] = ctx->idtIndex;
regs->tabreg [ERR] = ctx->faultCode;
regs->tabreg [EIP] = ctx->eip;
regs->tabreg [CS] = ctx->cs & 0xFFFF;
regs->tabreg [EFL] = ctx->eflags;
regs->tabreg[GS] = 0;
regs->tabreg[FS] = 0;
regs->tabreg[ES] = 0;
regs->tabreg[DS] = 0;
regs->tabreg[EDI] = ctx->edi;
regs->tabreg[ESI] = ctx->esi;
regs->tabreg[EBP] = ctx->ebp;
regs->tabreg[ESP] = ctx->esp0;
regs->tabreg[EBX] = ctx->ebx;
regs->tabreg[EDX] = ctx->edx;
regs->tabreg[ECX] = ctx->ecx;
regs->tabreg[EAX] = ctx->eax;
regs->tabreg[TRAPNO] = ctx->idtIndex;
regs->tabreg[ERR] = ctx->faultCode;
regs->tabreg[EIP] = ctx->eip;
regs->tabreg[CS] = ctx->cs & 0xFFFF;
regs->tabreg[EFL] = ctx->eflags;
}
void
RegsToCtx (const xdr_regs* regs, CPU_Exception_frame* ctx)
void
RegsToCtx (const xdr_regs * regs, CPU_Exception_frame * ctx)
{
ctx->edi = regs->tabreg [EDI];
ctx->esi = regs->tabreg [ESI];
ctx->ebp = regs->tabreg [EBP];
ctx->esp0 = regs->tabreg [ESP];
ctx->ebx = regs->tabreg [EBX];
ctx->edx = regs->tabreg [EDX];
ctx->ecx = regs->tabreg [ECX];
ctx->eax = regs->tabreg [EAX];
ctx->idtIndex = regs->tabreg [TRAPNO];
ctx->faultCode = regs->tabreg [ERR];
ctx->eip = regs->tabreg [EIP];
ctx->cs = regs->tabreg [CS];
ctx->eflags = regs->tabreg [EFL];
ctx->edi = regs->tabreg[EDI];
ctx->esi = regs->tabreg[ESI];
ctx->ebp = regs->tabreg[EBP];
ctx->esp0 = regs->tabreg[ESP];
ctx->ebx = regs->tabreg[EBX];
ctx->edx = regs->tabreg[EDX];
ctx->ecx = regs->tabreg[ECX];
ctx->eax = regs->tabreg[EAX];
ctx->idtIndex = regs->tabreg[TRAPNO];
ctx->faultCode = regs->tabreg[ERR];
ctx->eip = regs->tabreg[EIP];
ctx->cs = regs->tabreg[CS];
ctx->eflags = regs->tabreg[EFL];
}
void
get_ctx_thread( Thread_Control *thread, CPU_Exception_frame* ctx)
void
get_ctx_thread (Thread_Control * thread, CPU_Exception_frame * ctx)
{
ctx->edi = thread->Registers.edi;
ctx->esi = thread->Registers.esi;
ctx->ebp = (unsigned32)(thread->Registers.ebp);
ctx->esp0 = (unsigned32)(thread->Registers.esp);
ctx->ebx = thread->Registers.ebx;
ctx->edx = 0;
ctx->ecx = 0;
ctx->eax = 0;
ctx->idtIndex = 0;
ctx->faultCode = 0;
ctx->eip = *(unsigned int*)(thread->Registers.esp);
ctx->cs = 0;
ctx->eflags = thread->Registers.eflags;
ctx->edi = thread->Registers.edi;
ctx->esi = thread->Registers.esi;
ctx->ebp = (unsigned32) (thread->Registers.ebp);
ctx->esp0 = (unsigned32) (thread->Registers.esp);
ctx->ebx = thread->Registers.ebx;
ctx->edx = 0;
ctx->ecx = 0;
ctx->eax = 0;
ctx->idtIndex = 0;
ctx->faultCode = 0;
ctx->eip = *(unsigned int *) (thread->Registers.esp);
ctx->cs = 0;
ctx->eflags = thread->Registers.eflags;
}
void
set_ctx_thread( Thread_Control *thread, CPU_Exception_frame* ctx)
void
set_ctx_thread (Thread_Control * thread, CPU_Exception_frame * ctx)
{
thread->Registers.edi = ctx->edi;
thread->Registers.esi = ctx->esi;
thread->Registers.ebp = (void*)(ctx->ebp);
thread->Registers.esp = (void*)(ctx->esp0);
thread->Registers.ebx = ctx->ebx;
thread->Registers.eflags = ctx->eflags;
thread->Registers.esi = ctx->esi;
thread->Registers.ebp = (void *) (ctx->ebp);
thread->Registers.esp = (void *) (ctx->esp0);
thread->Registers.ebx = ctx->ebx;
thread->Registers.eflags = ctx->eflags;
}
int
Single_Step(CPU_Exception_frame* ctx)
int
Single_Step (CPU_Exception_frame * ctx)
{
/* Check if not already set */
if ((ctx->eflags & EFLAGS_TF) != 0 || ExitForSingleStep != 0) {
/* Check coherency */
/*
* Check if not already set
*/
if ((ctx->eflags & EFLAGS_TF) != 0 || ExitForSingleStep != 0) {
/*
* Check coherency
*/
assert ((ctx->eflags & EFLAGS_TF) != 0);
assert (ExitForSingleStep != 0);
return 0;
}
ctx->eflags |= EFLAGS_TF; /* eflags */
ctx->eflags |= EFLAGS_TF; /* eflags */
++ExitForSingleStep;
return 0;
}
int
CheckForSingleStep (CPU_Exception_frame* ctx)
int
CheckForSingleStep (CPU_Exception_frame * ctx)
{
if (ExitForSingleStep) {
/*
* This functions can be called both from
* INT1 and INT3 handlers. In case it is
* called from INT3, need to clear TF.
*/
ctx->eflags &= ~EFLAGS_TF;
ExitForSingleStep = 0;
return 1;
}
return 0;
}
void
CancelSingleStep (CPU_Exception_frame* ctx)
{
/* Cancel scheduled SS */
if (ExitForSingleStep) {
/*
* This functions can be called both from
* INT1 and INT3 handlers. In case it is
* called from INT3, need to clear TF.
*/
ctx->eflags &= ~EFLAGS_TF;
ExitForSingleStep-- ;
ExitForSingleStep = 0;
return 1;
}
return 0;
}
cpuExcHandlerType old_currentExcHandler;
extern void rtems_exception_prologue_50();
void connect_rdbg_exception()
void
CancelSingleStep (CPU_Exception_frame * ctx)
{
interrupt_gate_descriptor *currentIdtEntry;
unsigned limit;
unsigned level;
/*
* Cancel scheduled SS
*/
ctx->eflags &= ~EFLAGS_TF;
ExitForSingleStep--;
}
static cpuExcHandlerType old_currentExcHandler;
extern void rtems_exception_prologue_50 ();
void
connect_rdbg_exception ()
{
interrupt_gate_descriptor *currentIdtEntry;
unsigned limit;
unsigned level;
/*
* Connect the Exception used to debug
*/
i386_get_info_from_IDTR (&currentIdtEntry, &limit);
_CPU_ISR_Disable(level);
create_interrupt_gate_descriptor (&currentIdtEntry[50], rtems_exception_prologue_50);
_CPU_ISR_Enable(level);
old_currentExcHandler = _currentExcHandler;
_currentExcHandler = BreakPointExcHdl ;
_CPU_ISR_Disable (level);
create_interrupt_gate_descriptor (&currentIdtEntry[50],
rtems_exception_prologue_50);
_CPU_ISR_Enable (level);
if (_currentExcHandler != BreakPointExcHdl) {
old_currentExcHandler = _currentExcHandler;
_currentExcHandler = BreakPointExcHdl;
}
}
void
disconnect_rdbg_exception ()
{
if (_currentExcHandler == BreakPointExcHdl) {
_currentExcHandler = old_currentExcHandler;
}
}
+2
View File
@@ -71,6 +71,8 @@ if RPCTOOLS
-o m68k/any/tmpSvc.c remdeb.x; \
$(AWK) -f ./awk.svc THEPROG="remdeb.h" m68k/any/tmpSvc.c \
> m68k/any/remdeb_svc.c; \
$(SED) -e 's/fprintf.*,/printf(/' m68k/any/remdeb_svc.c > m68k/any/remdeb_svc.tmp; \
mv m68k/any/remdeb_svc.tmp m68k/any/remdeb_svc.c; \
rm -f m68k/any/tmpSvc.c )
endif
File diff suppressed because it is too large Load Diff
+95 -84
View File
@@ -22,101 +22,112 @@
* become too small if this value gets incremented.
*/
#ifndef XRY_MAX_CMD_STR
#endif /* REMDEB_H */
/* now open_connex() routine which establishes a connection to server */
#define DEBUGGER_IS_GDB 0x2 /* */
/* now close_connex() routine which detaches from server */
/* now send_signal() routine which sends signals to processes like kill(2) */
/* now wait_info() routine which returns results of polling the wait status
of a process/actor. It may return 0 if running, else pid or -1 */
/* now ptrace() routine. This matches the Sun UNIX ptrace as well as
some additions */
/* now define the actual calls we support */
const char* names [] = {
"NULLPROC", "OPEN_CONNEX", "SEND_SIGNAL", "name3",
"name4", "name5", "name6", "name7",
"name8", "name9", "CLOSE_CONNEX", "PTRACE",
"name12", "WAIT_INFO", "name14", "name15",
"name16", "GET_SIGNAL_NAMES", "name18"
#endif /* REMDEB_H */
/*
* now open_connex() routine which establishes a connection to server
*/
#define DEBUGGER_IS_GDB 0x2 /* */
/*
* now close_connex() routine which detaches from server
*/
/*
* now send_signal() routine which sends signals to processes like kill(2)
*/
/*
* now wait_info() routine which returns results of polling the wait status
* of a process/actor. It may return 0 if running, else pid or -1
*/
/*
* now ptrace() routine. This matches the Sun UNIX ptrace as well as
* some additions
*/
/*
* now define the actual calls we support
*/
const char *names[] = {
"NULLPROC", "OPEN_CONNEX", "SEND_SIGNAL", "name3",
"name4", "name5", "name6", "name7",
"name8", "name9", "CLOSE_CONNEX", "PTRACE",
"name12", "WAIT_INFO", "name14", "name15",
"name16", "GET_SIGNAL_NAMES", "name18"
};
void
remotedeb_2(struct svc_req *rqstp, register SVCXPRT *transp)
remotedeb_2 (struct svc_req *rqstp, register SVCXPRT * transp)
{
union {
open_in open_connex_2_arg;
signal_in send_signal_2_arg;
close_in close_connex_2_arg;
ptrace_in ptrace_2_arg;
wait_in wait_info_2_arg;
} argument;
char *result;
xdrproc_t _xdr_argument, _xdr_result;
char *(*local)(char *, struct svc_req *);
union {
open_in open_connex_2_arg;
signal_in send_signal_2_arg;
close_in close_connex_2_arg;
ptrace_in ptrace_2_arg;
wait_in wait_info_2_arg;
} argument;
char *result;
xdrproc_t _xdr_argument, _xdr_result;
char *(*local) (char *, struct svc_req *);
DPRINTF (("remotedeb_2: %s (%d)\n",
(unsigned) rqstp->rq_proc <
(unsigned) (sizeof names / sizeof names[0]) ?
names [rqstp->rq_proc] : "???",
(int) rqstp->rq_proc));
DPRINTF (("remotedeb_2: %s (%d)\n",
(unsigned) rqstp->rq_proc <
(unsigned) (sizeof names / sizeof names[0]) ?
names[rqstp->rq_proc] : "???", (int) rqstp->rq_proc));
switch (rqstp->rq_proc) {
case NULLPROC:
(void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL);
return;
switch (rqstp->rq_proc) {
case NULLPROC:
(void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *) NULL);
return;
case OPEN_CONNEX:
_xdr_argument = (xdrproc_t) xdr_open_in;
_xdr_result = (xdrproc_t) xdr_open_out;
local = (char *(*)(char *, struct svc_req *)) open_connex_2_svc;
break;
case OPEN_CONNEX:
_xdr_argument = (xdrproc_t) xdr_open_in;
_xdr_result = (xdrproc_t) xdr_open_out;
local = (char *(*)(char *, struct svc_req *)) open_connex_2_svc;
break;
case SEND_SIGNAL:
_xdr_argument = (xdrproc_t) xdr_signal_in;
_xdr_result = (xdrproc_t) xdr_signal_out;
local = (char *(*)(char *, struct svc_req *)) send_signal_2_svc;
break;
case SEND_SIGNAL:
_xdr_argument = (xdrproc_t) xdr_signal_in;
_xdr_result = (xdrproc_t) xdr_signal_out;
local = (char *(*)(char *, struct svc_req *)) send_signal_2_svc;
break;
case CLOSE_CONNEX:
_xdr_argument = (xdrproc_t) xdr_close_in;
_xdr_result = (xdrproc_t) xdr_void;
local = (char *(*)(char *, struct svc_req *)) close_connex_2_svc;
break;
case CLOSE_CONNEX:
_xdr_argument = (xdrproc_t) xdr_close_in;
_xdr_result = (xdrproc_t) xdr_void;
local = (char *(*)(char *, struct svc_req *)) close_connex_2_svc;
break;
case PTRACE:
_xdr_argument = (xdrproc_t) xdr_ptrace_in;
_xdr_result = (xdrproc_t) xdr_ptrace_out;
local = (char *(*)(char *, struct svc_req *)) ptrace_2_svc;
break;
case PTRACE:
_xdr_argument = (xdrproc_t) xdr_ptrace_in;
_xdr_result = (xdrproc_t) xdr_ptrace_out;
local = (char *(*)(char *, struct svc_req *)) ptrace_2_svc;
break;
case WAIT_INFO:
_xdr_argument = (xdrproc_t) xdr_wait_in;
_xdr_result = (xdrproc_t) xdr_wait_out;
local = (char *(*)(char *, struct svc_req *)) wait_info_2_svc;
break;
case WAIT_INFO:
_xdr_argument = (xdrproc_t) xdr_wait_in;
_xdr_result = (xdrproc_t) xdr_wait_out;
local = (char *(*)(char *, struct svc_req *)) wait_info_2_svc;
break;
case GET_SIGNAL_NAMES:
_xdr_argument = (xdrproc_t) xdr_void;
_xdr_result = (xdrproc_t) xdr_get_signal_names_out;
local = (char *(*)(char *, struct svc_req *)) get_signal_names_2_svc;
break;
case GET_SIGNAL_NAMES:
_xdr_argument = (xdrproc_t) xdr_void;
_xdr_result = (xdrproc_t) xdr_get_signal_names_out;
local = (char *(*)(char *, struct svc_req *)) get_signal_names_2_svc;
break;
default:
svcerr_noproc (transp);
return;
}
memset ((char *)&argument, 0, sizeof (argument));
if (!svc_getargs (transp, _xdr_argument, (caddr_t) &argument)) {
svcerr_decode (transp);
return;
}
result = (*local)((char *)&argument, rqstp);
if (result != NULL && !svc_sendreply(transp, _xdr_result, result)) {
svcerr_systemerr (transp);
}
if (!svc_freeargs (transp, _xdr_argument, (caddr_t) &argument)) {
fprintf (stderr, "unable to free arguments");
exit (1);
}
return;
default:
svcerr_noproc (transp);
return;
}
memset ((char *) &argument, 0, sizeof (argument));
if (!svc_getargs (transp, _xdr_argument, (caddr_t) & argument)) {
svcerr_decode (transp);
return;
}
result = (*local) ((char *) &argument, rqstp);
if (result != NULL && !svc_sendreply (transp, _xdr_result, result)) {
svcerr_systemerr (transp);
}
if (!svc_freeargs (transp, _xdr_argument, (caddr_t) & argument)) {
fprintf (stderr, "unable to free arguments");
exit (1);
}
return;
}
File diff suppressed because it is too large Load Diff
+151 -106
View File
@@ -17,54 +17,107 @@
#include <rdbg/rdbg.h>
#include <rdbg/servrpc.h>
int
ExcepToSig (Exception_context *ctx)
int
ExcepToSig (Exception_context * ctx)
{
int excep = getExcNum (ctx);
switch (excep) {
case 2 : return 10; break; /* bus error */
case 3 : return 10; break; /* address error */
case 4 : return 4; break; /* illegal instruction */
case 5 : return 8; break; /* zero divide */
case 6 : return 8; break; /* chk instruction */
case 7 : return 8; break; /* trapv instruction */
case 8 : return 11; break; /* privilege violation */
case 9 : return 5; break; /* trace trap */
case 10: return 4; break; /* line 1010 emulator */
case 11: return 4; break; /* line 1111 emulator */
case 2:
return 10;
break; /* bus error */
case 3:
return 10;
break; /* address error */
case 4:
return 4;
break; /* illegal instruction */
case 5:
return 8;
break; /* zero divide */
case 6:
return 8;
break; /* chk instruction */
case 7:
return 8;
break; /* trapv instruction */
case 8:
return 11;
break; /* privilege violation */
case 9:
return 5;
break; /* trace trap */
case 10:
return 4;
break; /* line 1010 emulator */
case 11:
return 4;
break; /* line 1111 emulator */
/* Coprocessor protocol violation. Using a standard MMU or FPU
this cannot be triggered by software. Call it a SIGBUS. */
case 13: return 10; break;
/*
* Coprocessor protocol violation. Using a standard MMU or FPU
* this cannot be triggered by software. Call it a SIGBUS.
*/
case 13:
return 10;
break;
case 31: return 2; break; /* interrupt */
case 33: return 5; break; /* monitor breakpoint */
case 34: return 2; break; /* lets use this for SCC1 interrupt */
case 35: return 5; break; /* rdbg breakpoint */
case 36: return 2; break; /* enter RDBG */
/* This is a trap #8 instruction. Apparently it is someone's software
convention for some sort of SIGFPE condition. Whose? How many
people are being screwed by having this code the way it is?
Is there a clean solution? */
case 40: return 8; break; /* floating point err */
case 31:
return 2;
break; /* interrupt */
case 33:
return 5;
break; /* monitor breakpoint */
case 34:
return 2;
break; /* lets use this for SCC1 interrupt */
case 35:
return 5;
break; /* rdbg breakpoint */
case 36:
return 2;
break; /* enter RDBG */
/*
* This is a trap #8 instruction. Apparently it is someone's software
* convention for some sort of SIGFPE condition. Whose? How many
* people are being screwed by having this code the way it is?
* Is there a clean solution?
*/
case 40:
return 8;
break; /* floating point err */
case 47: return 5; break; /* rdbg breakpoint */
case 47:
return 5;
break; /* rdbg breakpoint */
case 48: return 8; break; /* floating point err */
case 49: return 8; break; /* floating point err */
case 50: return 8; break; /* zero divide */
case 51: return 8; break; /* underflow */
case 52: return 8; break; /* operand error */
case 53: return 8; break; /* overflow */
case 54: return 8; break; /* NAN */
default:
return 7; /* "software generated"*/
}
return SIGKILL;
case 48:
return 8;
break; /* floating point err */
case 49:
return 8;
break; /* floating point err */
case 50:
return 8;
break; /* zero divide */
case 51:
return 8;
break; /* underflow */
case 52:
return 8;
break; /* operand error */
case 53:
return 8;
break; /* overflow */
case 54:
return 8;
break; /* NAN */
default:
return 7; /* "software generated" */
}
return SIGKILL;
}
/*----- Breakpoint Exception management -----*/
/*
@@ -72,101 +125,93 @@ ExcepToSig (Exception_context *ctx)
* software breakpoints.
*/
void
BreakPointExcHdl(CPU_Exception_frame *ctx)
void
BreakPointExcHdl (CPU_Exception_frame * ctx)
{
rtems_status_code status;
rtems_id continueSemId;
connect_rdbg_exception(); /* monitor stub changes trace vector */
if ( (justSaveContext) && (ctx->vecnum == 47) ) { /* break */
connect_rdbg_exception (); /* monitor stub changes trace vector */
if ((justSaveContext) && (ctx->vecnum == 47)) { /* break */
PushSavedExceptCtx (_Thread_Executing->Object.id, ctx);
justSaveContext = 0;
}
else {
if (ctx->vecnum != 9) { /* trace */
} else {
if (ctx->vecnum != 9) { /* trace */
NbSerializedCtx++;
rtems_semaphore_obtain(serializeSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
rtems_semaphore_obtain (serializeSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
NbSerializedCtx--;
}
currentTargetThread = _Thread_Executing->Object.id;
#ifdef DDEBUG
printk("----------------------------------------------------------\n");
printk("Exception %d caught at PC %x by thread %d\n",
ctx->vecnum,
ctx->pc,
_Thread_Executing->Object.id);
printk("----------------------------------------------------------\n");
printk("Processor execution context at time of the fault was :\n");
printk("----------------------------------------------------------\n");
printk("\t A0 = %x\n", ctx->a0);
printk("\t A1 = %x\n", ctx->a1);
printk("\t A2 = %x\n", ctx->a2);
printk("\t A3 = %x\n", ctx->a3);
printk("\t A4 = %x\n", ctx->a4);
printk("\t A5 = %x\n", ctx->a5);
printk("\t A6 = %x\n", ctx->a6);
printk("\t A7 = %x\n", ctx->a7);
printk("\t D0 = %x\n", ctx->d0);
printk("\t D1 = %x\n", ctx->d1);
printk("\t D2 = %x\n", ctx->d2);
printk("\t D3 = %x\n", ctx->d3);
printk("\t D4 = %x\n", ctx->d4);
printk("\t D5 = %x\n", ctx->d5);
printk("\t D6 = %x\n", ctx->d6);
printk("\t D7 = %x\n", ctx->d7);
printk("\t SR = %x\n", ctx->sr);
printk ("----------------------------------------------------------\n");
printk ("Exception %d caught at PC %x by thread %d\n",
ctx->vecnum, ctx->pc, _Thread_Executing->Object.id);
printk ("----------------------------------------------------------\n");
printk ("Processor execution context at time of the fault was :\n");
printk ("----------------------------------------------------------\n");
printk ("\t A0 = %x\n", ctx->a0);
printk ("\t A1 = %x\n", ctx->a1);
printk ("\t A2 = %x\n", ctx->a2);
printk ("\t A3 = %x\n", ctx->a3);
printk ("\t A4 = %x\n", ctx->a4);
printk ("\t A5 = %x\n", ctx->a5);
printk ("\t A6 = %x\n", ctx->a6);
printk ("\t A7 = %x\n", ctx->a7);
printk ("\t D0 = %x\n", ctx->d0);
printk ("\t D1 = %x\n", ctx->d1);
printk ("\t D2 = %x\n", ctx->d2);
printk ("\t D3 = %x\n", ctx->d3);
printk ("\t D4 = %x\n", ctx->d4);
printk ("\t D5 = %x\n", ctx->d5);
printk ("\t D6 = %x\n", ctx->d6);
printk ("\t D7 = %x\n", ctx->d7);
printk ("\t SR = %x\n", ctx->sr);
#endif
status = rtems_semaphore_create (rtems_build_name('D', 'B', 'G', 'c'),
0,
RTEMS_FIFO |
RTEMS_COUNTING_SEMAPHORE |
RTEMS_NO_INHERIT_PRIORITY |
RTEMS_NO_PRIORITY_CEILING |
RTEMS_LOCAL,
0,
&continueSemId);
status = rtems_semaphore_create (rtems_build_name ('D', 'B', 'G', 'c'),
0,
RTEMS_FIFO |
RTEMS_COUNTING_SEMAPHORE |
RTEMS_NO_INHERIT_PRIORITY |
RTEMS_NO_PRIORITY_CEILING |
RTEMS_LOCAL, 0, &continueSemId);
if (status != RTEMS_SUCCESSFUL)
rtems_panic ("Can't create continue semaphore: `%s'\n",
rtems_status_text(status));
rtems_status_text (status));
PushExceptCtx (_Thread_Executing->Object.id, continueSemId, ctx);
switch (ctx->vecnum){
case 9 : /* trace */
DPRINTF((" TRACE EXCEPTION !!!\n"));
switch (ctx->vecnum) {
case 9: /* trace */
DPRINTF ((" TRACE EXCEPTION !!!\n"));
ctx->sr &= ~(1 << 15);
ExitForSingleStep-- ;
rtems_semaphore_release( wakeupEventSemId );
break;
ExitForSingleStep--;
rtems_semaphore_release (wakeupEventSemId);
break;
case 47 : /* trap #15 */
DPRINTF((" BREAKPOINT EXCEPTION !!!\n"));
rtems_semaphore_release( wakeupEventSemId );
break;
case 47: /* trap #15 */
DPRINTF ((" BREAKPOINT EXCEPTION !!!\n"));
rtems_semaphore_release (wakeupEventSemId);
break;
case 36 : /* trap #4 */
DPRINTF((" ENTER RDBG !!!\n"));
rtems_semaphore_release( wakeupEventSemId );
case 36: /* trap #4 */
DPRINTF ((" ENTER RDBG !!!\n"));
rtems_semaphore_release (wakeupEventSemId);
break;
default:
DPRINTF((" OTHER EXCEPTION !!!\n"));
rtems_semaphore_release( wakeupEventSemId );
DPRINTF ((" OTHER EXCEPTION !!!\n"));
rtems_semaphore_release (wakeupEventSemId);
break;
}
rtems_semaphore_obtain(continueSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
rtems_semaphore_obtain (continueSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
PopExceptCtx (_Thread_Executing->Object.id);
rtems_semaphore_delete(continueSemId);
rtems_semaphore_delete (continueSemId);
}
connect_rdbg_exception(); /* monitor stub changes trace vector */
connect_rdbg_exception (); /* monitor stub changes trace vector */
}
+83 -73
View File
@@ -12,14 +12,14 @@
#include <assert.h>
#include <errno.h>
#include <rdbg/reg.h>
#include <rdbg/reg.h>
#include <rdbg/remdeb.h>
#include <rdbg/rdbg.h>
#include <rtems/score/cpu.h>
#include <rtems/score/thread.h>
#include <rtems/score/cpu.h>
#include <rtems/score/thread.h>
void
CtxToRegs (const CPU_Exception_frame* ctx, xdr_regs* regs)
void
CtxToRegs (const CPU_Exception_frame * ctx, xdr_regs * regs)
{
regs->r_dreg[0] = ctx->d0;
regs->r_dreg[1] = ctx->d1;
@@ -44,8 +44,8 @@ CtxToRegs (const CPU_Exception_frame* ctx, xdr_regs* regs)
regs->r_vec = ctx->vecnum;
}
void
RegsToCtx (const xdr_regs* regs, CPU_Exception_frame* ctx)
void
RegsToCtx (const xdr_regs * regs, CPU_Exception_frame * ctx)
{
ctx->d0 = regs->r_dreg[0];
ctx->d1 = regs->r_dreg[1];
@@ -70,97 +70,107 @@ RegsToCtx (const xdr_regs* regs, CPU_Exception_frame* ctx)
ctx->vecnum = regs->r_vec;
}
void
get_ctx_thread( Thread_Control *thread, CPU_Exception_frame* ctx)
void
get_ctx_thread (Thread_Control * thread, CPU_Exception_frame * ctx)
{
unsigned int *ptr;
unsigned int i;
/*
/*
* ISR stores d0-d1/a0-a1, calls _Thread_Dispatch
* _Thread_Dispatch calls _Context_Switch == _CPU_Context_switch
* _CPU_Context_switch stores/restores sr,d2-d7,a2-a7
* so if my reasoning is correct, *sp points to a location in
* _Thread_Dispatch
*/
ctx->vecnum = 0xdeadbeef;
ctx->sr = thread->Registers.sr;
ctx->pc = *(unsigned32 *)thread->Registers.a7_msp;
ctx->d0 = 0xdeadbeef;
ctx->d1 = 0xdeadbeef;
ctx->a0 = 0xdeadbeef;
ctx->a1 = 0xdeadbeef;
ctx->a2 = (unsigned32)thread->Registers.a2;
ctx->a3 = (unsigned32)thread->Registers.a3;
ctx->a4 = (unsigned32)thread->Registers.a4;
ctx->a5 = (unsigned32)thread->Registers.a5;
ctx->a6 = (unsigned32)thread->Registers.a6;
ctx->a7 = (unsigned32)thread->Registers.a7_msp;
ctx->d2 = thread->Registers.d2;
ctx->d3 = thread->Registers.d3;
ctx->d4 = thread->Registers.d4;
ctx->d5 = thread->Registers.d5;
ctx->d6 = thread->Registers.d6;
ctx->d7 = thread->Registers.d7;
ctx->vecnum = 0xdeadbeef;
ctx->sr = thread->Registers.sr;
ctx->pc = *(unsigned32 *) thread->Registers.a7_msp;
ctx->d0 = 0xdeadbeef;
ctx->d1 = 0xdeadbeef;
ctx->a0 = 0xdeadbeef;
ctx->a1 = 0xdeadbeef;
ctx->a2 = (unsigned32) thread->Registers.a2;
ctx->a3 = (unsigned32) thread->Registers.a3;
ctx->a4 = (unsigned32) thread->Registers.a4;
ctx->a5 = (unsigned32) thread->Registers.a5;
ctx->a6 = (unsigned32) thread->Registers.a6;
ctx->a7 = (unsigned32) thread->Registers.a7_msp;
ctx->d2 = thread->Registers.d2;
ctx->d3 = thread->Registers.d3;
ctx->d4 = thread->Registers.d4;
ctx->d5 = thread->Registers.d5;
ctx->d6 = thread->Registers.d6;
ctx->d7 = thread->Registers.d7;
}
void
set_ctx_thread( Thread_Control *thread, CPU_Exception_frame* ctx)
void
set_ctx_thread (Thread_Control * thread, CPU_Exception_frame * ctx)
{
thread->Registers.sr = ctx->sr;
thread->Registers.d2 = ctx->d2;
thread->Registers.d3 = ctx->d3;
thread->Registers.d4 = ctx->d4;
thread->Registers.d5 = ctx->d5;
thread->Registers.d6 = ctx->d6;
thread->Registers.d7 = ctx->d7;
thread->Registers.a2 = (void *)ctx->a2;
thread->Registers.a3 = (void *)ctx->a3;
thread->Registers.a4 = (void *)ctx->a4;
thread->Registers.a5 = (void *)ctx->a5;
thread->Registers.a6 = (void *)ctx->a6;
thread->Registers.a7_msp = (void *)ctx->a7;
thread->Registers.sr = ctx->sr;
thread->Registers.d2 = ctx->d2;
thread->Registers.d3 = ctx->d3;
thread->Registers.d4 = ctx->d4;
thread->Registers.d5 = ctx->d5;
thread->Registers.d6 = ctx->d6;
thread->Registers.d7 = ctx->d7;
thread->Registers.a2 = (void *) ctx->a2;
thread->Registers.a3 = (void *) ctx->a3;
thread->Registers.a4 = (void *) ctx->a4;
thread->Registers.a5 = (void *) ctx->a5;
thread->Registers.a6 = (void *) ctx->a6;
thread->Registers.a7_msp = (void *) ctx->a7;
}
int
Single_Step(CPU_Exception_frame* ctx)
int
Single_Step (CPU_Exception_frame * ctx)
{
if ((ctx->sr & (1<<15)) != 0 || ExitForSingleStep != 0) {
/* Check coherency */
assert ((ctx->sr & (1<<15)) != 0);
if ((ctx->sr & (1 << 15)) != 0 || ExitForSingleStep != 0) {
/*
* Check coherency
*/
assert ((ctx->sr & (1 << 15)) != 0);
assert (ExitForSingleStep != 0);
return 0;
}
ctx->sr |= 1<<15;
ctx->sr |= 1 << 15;
++ExitForSingleStep;
return 0;
}
int
CheckForSingleStep (CPU_Exception_frame* ctx)
int
CheckForSingleStep (CPU_Exception_frame * ctx)
{
if (ExitForSingleStep) {
ctx->sr &= ~(1<<15);
ExitForSingleStep = 0;
return 1;
}
return 0;
if (ExitForSingleStep) {
ctx->sr &= ~(1 << 15);
ExitForSingleStep = 0;
return 1;
}
return 0;
}
void
CancelSingleStep (CPU_Exception_frame * ctx)
{
/*
* Cancel scheduled SS
*/
ctx->sr &= ~(1 << 15);
ExitForSingleStep--;
}
extern rtems_isr excHandler ();
void
connect_rdbg_exception (void)
{
set_vector (excHandler, 9, 0);
set_vector (excHandler, 47, 0);
set_vector (excHandler, 36, 0);
}
void
CancelSingleStep (CPU_Exception_frame* ctx)
disconnect_rdbg_exception (void)
{
/* Cancel scheduled SS */
ctx->sr &= ~(1<<15);
ExitForSingleStep-- ;
}
rtems_isr excHandler();
void connect_rdbg_exception(void)
{
set_vector(excHandler, 9, 0);
set_vector(excHandler, 47, 0);
set_vector(excHandler, 36, 0);
}
+113 -120
View File
@@ -17,32 +17,35 @@
#include <rdbg/rdbg.h>
#include <rdbg/servrpc.h>
int
ExcepToSig (Exception_context *ctx)
int
ExcepToSig (Exception_context * ctx)
{
int excep = getExcNum (ctx);
switch (excep) {
case ASM_FLOAT_VECTOR : return SIGFPE;
case ASM_TRACE_VECTOR :
case ASM_PROG_VECTOR :
case ASM_SYS_VECTOR : return SIGTRAP;
case ASM_ISI_VECTOR : return SIGSEGV;
case ASM_RESET_VECTOR :
case ASM_MACH_VECTOR :
case ASM_EXT_VECTOR :
case ASM_ALIGN_VECTOR : return SIGILL;
default:
break;
}
return SIGKILL;
case ASM_FLOAT_VECTOR:
return SIGFPE;
case ASM_TRACE_VECTOR:
case ASM_PROG_VECTOR:
case ASM_SYS_VECTOR:
return SIGTRAP;
case ASM_ISI_VECTOR:
return SIGSEGV;
case ASM_RESET_VECTOR:
case ASM_MACH_VECTOR:
case ASM_EXT_VECTOR:
case ASM_ALIGN_VECTOR:
return SIGILL;
default:
break;
}
return SIGKILL;
}
/*----- Breakpoint Exception management -----*/
/*
@@ -51,134 +54,124 @@ ExcepToSig (Exception_context *ctx)
*/
void
BreakPointExcHdl(CPU_Exception_frame *ctx)
BreakPointExcHdl (CPU_Exception_frame * ctx)
{
rtems_status_code status;
rtems_id continueSemId;
/* T. Straumann, 1/16/2002: we must re-enable the floating point engine
* if the interrupted thread is FP. Otherwise,
* the semaphore primitives may crash when they
* try to save FP context while switching this
* thread...
/*
* we must re-enable the floating point engine
* if the interrupted thread is FP. Otherwise,
* the semaphore primitives may crash when they
* try to save FP context while switching this
* thread... NB : deferred fp context switching
* would 1) avoid to have to save FP, make this code
* obsolete.
*/
if (ctx->EXC_SRR1 & 0x2000) {
register unsigned long msr;
__asm__ __volatile__("mfmsr %0":"=r"(msr));
__asm__ __volatile__("mtmsr %0"::"r"(msr|MSR_FP));
if (ctx->EXC_SRR1 & MSR_FP) {
register unsigned long msr;
__asm__ __volatile__ ("mfmsr %0":"=r" (msr));
__asm__ __volatile__ ("mtmsr %0"::"r" (msr | MSR_FP));
}
if ( (justSaveContext) && (ctx->_EXC_number == ASM_SYS_VECTOR) ) {
if ((justSaveContext) && (ctx->_EXC_number == ASM_SYS_VECTOR)) {
PushSavedExceptCtx (_Thread_Executing->Object.id, ctx);
justSaveContext = 0;
}
else {
if (ctx->_EXC_number != ASM_TRACE_VECTOR){
} else {
if (ctx->_EXC_number != ASM_TRACE_VECTOR) {
NbSerializedCtx++;
rtems_semaphore_obtain(serializeSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
rtems_semaphore_obtain (serializeSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
NbSerializedCtx--;
}
currentTargetThread = _Thread_Executing->Object.id;
#ifdef DDEBUG
printk("----------------------------------------------------------\n");
printk("Exception %d caught at PC %x by thread %d\n",
ctx->_EXC_number,
ctx->EXC_SRR0,
_Thread_Executing->Object.id);
printk("----------------------------------------------------------\n");
printk("Processor execution context at time of the fault was :\n");
printk("----------------------------------------------------------\n");
printk("\t R0 = %x\n", ctx->GPR0);
printk("\t R1 = %x\n", ctx->GPR1);
printk("\t R2 = %x\n", ctx->GPR2);
printk("\t R3 = %x\n", ctx->GPR3);
printk("\t R4 = %x\n", ctx->GPR4);
printk("\t R5 = %x\n", ctx->GPR5);
printk("\t R6 = %x\n", ctx->GPR6);
printk("\t R7 = %x\n", ctx->GPR7);
printk("\t R8 = %x\n", ctx->GPR8);
printk("\t R9 = %x\n", ctx->GPR9);
printk("\t R10 = %x\n", ctx->GPR10);
printk("\t R11 = %x\n", ctx->GPR11);
printk("\t R12 = %x\n", ctx->GPR12);
printk("\t R13 = %x\n", ctx->GPR13);
printk("\t R14 = %x\n", ctx->GPR14);
printk("\t R15 = %x\n", ctx->GPR15);
printk("\t R16 = %x\n", ctx->GPR16);
printk("\t R17 = %x\n", ctx->GPR17);
printk("\t R18 = %x\n", ctx->GPR18);
printk("\t R19 = %x\n", ctx->GPR19);
printk("\t R20 = %x\n", ctx->GPR20);
printk("\t R21 = %x\n", ctx->GPR21);
printk("\t R22 = %x\n", ctx->GPR22);
printk("\t R23 = %x\n", ctx->GPR23);
printk("\t R24 = %x\n", ctx->GPR24);
printk("\t R25 = %x\n", ctx->GPR25);
printk("\t R26 = %x\n", ctx->GPR26);
printk("\t R27 = %x\n", ctx->GPR27);
printk("\t R28 = %x\n", ctx->GPR28);
printk("\t R29 = %x\n", ctx->GPR29);
printk("\t R30 = %x\n", ctx->GPR30);
printk("\t R31 = %x\n", ctx->GPR31);
printk("\t CR = %x\n", ctx->EXC_CR);
printk("\t CTR = %x\n", ctx->EXC_CTR);
printk("\t XER = %x\n", ctx->EXC_XER);
printk("\t LR = %x\n", ctx->EXC_LR);
printk("\t MSR = %x\n", ctx->EXC_SRR1);
printk ("----------------------------------------------------------\n");
printk ("Exception %d caught at PC %x by thread %d\n",
ctx->_EXC_number, ctx->EXC_SRR0, _Thread_Executing->Object.id);
printk ("----------------------------------------------------------\n");
printk ("Processor execution context at time of the fault was :\n");
printk ("----------------------------------------------------------\n");
printk ("\t R0 = %x\n", ctx->GPR0);
printk ("\t R1 = %x\n", ctx->GPR1);
printk ("\t R2 = %x\n", ctx->GPR2);
printk ("\t R3 = %x\n", ctx->GPR3);
printk ("\t R4 = %x\n", ctx->GPR4);
printk ("\t R5 = %x\n", ctx->GPR5);
printk ("\t R6 = %x\n", ctx->GPR6);
printk ("\t R7 = %x\n", ctx->GPR7);
printk ("\t R8 = %x\n", ctx->GPR8);
printk ("\t R9 = %x\n", ctx->GPR9);
printk ("\t R10 = %x\n", ctx->GPR10);
printk ("\t R11 = %x\n", ctx->GPR11);
printk ("\t R12 = %x\n", ctx->GPR12);
printk ("\t R13 = %x\n", ctx->GPR13);
printk ("\t R14 = %x\n", ctx->GPR14);
printk ("\t R15 = %x\n", ctx->GPR15);
printk ("\t R16 = %x\n", ctx->GPR16);
printk ("\t R17 = %x\n", ctx->GPR17);
printk ("\t R18 = %x\n", ctx->GPR18);
printk ("\t R19 = %x\n", ctx->GPR19);
printk ("\t R20 = %x\n", ctx->GPR20);
printk ("\t R21 = %x\n", ctx->GPR21);
printk ("\t R22 = %x\n", ctx->GPR22);
printk ("\t R23 = %x\n", ctx->GPR23);
printk ("\t R24 = %x\n", ctx->GPR24);
printk ("\t R25 = %x\n", ctx->GPR25);
printk ("\t R26 = %x\n", ctx->GPR26);
printk ("\t R27 = %x\n", ctx->GPR27);
printk ("\t R28 = %x\n", ctx->GPR28);
printk ("\t R29 = %x\n", ctx->GPR29);
printk ("\t R30 = %x\n", ctx->GPR30);
printk ("\t R31 = %x\n", ctx->GPR31);
printk ("\t CR = %x\n", ctx->EXC_CR);
printk ("\t CTR = %x\n", ctx->EXC_CTR);
printk ("\t XER = %x\n", ctx->EXC_XER);
printk ("\t LR = %x\n", ctx->EXC_LR);
printk ("\t MSR = %x\n", ctx->EXC_SRR1);
#endif
status = rtems_semaphore_create (rtems_build_name('D', 'B', 'G', 'c'),
0,
RTEMS_FIFO |
RTEMS_COUNTING_SEMAPHORE |
RTEMS_NO_INHERIT_PRIORITY |
RTEMS_NO_PRIORITY_CEILING |
RTEMS_LOCAL,
0,
&continueSemId);
status = rtems_semaphore_create (rtems_build_name ('D', 'B', 'G', 'c'),
0,
RTEMS_FIFO |
RTEMS_COUNTING_SEMAPHORE |
RTEMS_NO_INHERIT_PRIORITY |
RTEMS_NO_PRIORITY_CEILING |
RTEMS_LOCAL, 0, &continueSemId);
if (status != RTEMS_SUCCESSFUL)
rtems_panic ("Can't create continue semaphore: `%s'\n",rtems_status_text(status));
rtems_panic ("Can't create continue semaphore: `%s'\n",
rtems_status_text (status));
PushExceptCtx (_Thread_Executing->Object.id, continueSemId, ctx);
switch (ctx->_EXC_number){
case ASM_TRACE_VECTOR :
DPRINTF((" TRACE EXCEPTION !!!\n"));
switch (ctx->_EXC_number) {
case ASM_TRACE_VECTOR:
DPRINTF ((" TRACE EXCEPTION !!!\n"));
ctx->EXC_SRR1 &= ~MSR_SE;
ExitForSingleStep-- ;
rtems_semaphore_release( wakeupEventSemId );
break;
ExitForSingleStep--;
rtems_semaphore_release (wakeupEventSemId);
break;
case ASM_PROG_VECTOR :
DPRINTF((" BREAKPOINT EXCEPTION !!!\n"));
rtems_semaphore_release( wakeupEventSemId );
break;
case ASM_PROG_VECTOR:
DPRINTF ((" BREAKPOINT EXCEPTION !!!\n"));
rtems_semaphore_release (wakeupEventSemId);
break;
case ASM_SYS_VECTOR :
DPRINTF((" ENTER RDBG !!!\n"));
rtems_semaphore_release( wakeupEventSemId );
case ASM_SYS_VECTOR:
DPRINTF ((" ENTER RDBG !!!\n"));
rtems_semaphore_release (wakeupEventSemId);
break;
default:
DPRINTF((" OTHER EXCEPTION !!!\n"));
#ifdef DDEBUG
{ extern void BSP_printStackTrace();
BSP_printStackTrace(ctx);
}
#endif
rtems_semaphore_release( wakeupEventSemId );
DPRINTF ((" OTHER EXCEPTION !!!\n"));
rtems_semaphore_release (wakeupEventSemId);
break;
}
rtems_semaphore_obtain(continueSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
rtems_semaphore_obtain (continueSemId, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
PopExceptCtx (_Thread_Executing->Object.id);
rtems_semaphore_delete(continueSemId);
rtems_semaphore_delete (continueSemId);
}
}
@@ -71,6 +71,8 @@ if RPCTOOLS
-o powerpc/new_exception_processing/tmpSvc.c remdeb.x; \
$(AWK) -f ./awk.svc THEPROG="remdeb.h" powerpc/new_exception_processing/tmpSvc.c \
> powerpc/new_exception_processing/remdeb_svc.c; \
$(SED) -e 's/fprintf.*,/printf(/' powerpc/new_exception_processing/remdeb_svc.c; > powerpc/new_exception_processing/remdeb_svc.tmp; \
mv powerpc/new_exception_processing/remdeb_svc.tmp powerpc/new_exception_processing/remdeb_svc.c; \
rm -f powerpc/new_exception_processing/tmpSvc.c )
endif
@@ -16,7 +16,7 @@ extern "C" {
#define RTEMS_PORT 2071
#define RTEMS_BACK_PORT 2073
#ifndef REMDEB_H
#define RPCGENSRVNAME(a) a
#define RPCGENSRVNAME(a) a
enum rpc_type {
SUNRPC = 0,
@@ -99,62 +99,62 @@ struct xdr_regs {
typedef struct xdr_regs xdr_regs;
/* now define register macros to apply to xdr_regs struct */
#define R_PC 0
#define R_MSR 1
#define R_EXCEPNB 2
#define R_R0 3
#define R_R1 (R_R0 + 1)
#define R_R2 (R_R0 + 2)
#define R_R3 (R_R0 + 3)
#define R_R4 (R_R0 + 4)
#define R_R5 (R_R0 + 5)
#define R_R6 (R_R0 + 6)
#define R_R7 (R_R0 + 7)
#define R_R8 (R_R0 + 8)
#define R_R9 (R_R0 + 9)
#define R_R10 (R_R0 + 10)
#define R_R11 (R_R0 + 11)
#define R_R12 (R_R0 + 12)
#define R_R13 (R_R0 + 13)
#define R_R14 (R_R0 + 14)
#define R_R15 (R_R0 + 15)
#define R_R16 (R_R0 + 16)
#define R_R17 (R_R0 + 17)
#define R_R18 (R_R0 + 18)
#define R_R19 (R_R0 + 19)
#define R_R20 (R_R0 + 20)
#define R_R21 (R_R0 + 21)
#define R_R22 (R_R0 + 22)
#define R_R23 (R_R0 + 23)
#define R_R24 (R_R0 + 24)
#define R_R25 (R_R0 + 25)
#define R_R26 (R_R0 + 26)
#define R_R27 (R_R0 + 27)
#define R_R28 (R_R0 + 28)
#define R_R29 (R_R0 + 29)
#define R_R30 (R_R0 + 30)
#define R_R31 (R_R0 + 31)
#define R_CR 35
#define R_CTR 36
#define R_XER 37
#define R_LR 38
#define R_MQ 39
#define R_PC 0
#define R_MSR 1
#define R_EXCEPNB 2
#define R_R0 3
#define R_R1 (R_R0 + 1)
#define R_R2 (R_R0 + 2)
#define R_R3 (R_R0 + 3)
#define R_R4 (R_R0 + 4)
#define R_R5 (R_R0 + 5)
#define R_R6 (R_R0 + 6)
#define R_R7 (R_R0 + 7)
#define R_R8 (R_R0 + 8)
#define R_R9 (R_R0 + 9)
#define R_R10 (R_R0 + 10)
#define R_R11 (R_R0 + 11)
#define R_R12 (R_R0 + 12)
#define R_R13 (R_R0 + 13)
#define R_R14 (R_R0 + 14)
#define R_R15 (R_R0 + 15)
#define R_R16 (R_R0 + 16)
#define R_R17 (R_R0 + 17)
#define R_R18 (R_R0 + 18)
#define R_R19 (R_R0 + 19)
#define R_R20 (R_R0 + 20)
#define R_R21 (R_R0 + 21)
#define R_R22 (R_R0 + 22)
#define R_R23 (R_R0 + 23)
#define R_R24 (R_R0 + 24)
#define R_R25 (R_R0 + 25)
#define R_R26 (R_R0 + 26)
#define R_R27 (R_R0 + 27)
#define R_R28 (R_R0 + 28)
#define R_R29 (R_R0 + 29)
#define R_R30 (R_R0 + 30)
#define R_R31 (R_R0 + 31)
#define R_CR 35
#define R_CTR 36
#define R_XER 37
#define R_LR 38
#define R_MQ 39
#include <libcpu/raw_exception.h>
#define REG_PC tabreg[R_PC] /* PC register offset */
#define REG_SP tabreg[R_R1] /* SP register offset */
#define REG_FP tabreg[R_R1] /* SP register offset (no FP on PPC) */
#define BREAK_SIZE 4 /* Breakpoint occupies 4 bytes */
#define BREAK_ADJ 0 /* Nothing to subtract from address after bp */
#define IS_BREAK(l) ((l) == 0x7d8d6808)
#define SET_BREAK(l) (0x7d8d6808)
#define REG_PC tabreg[R_PC] /* PC register offset */
#define REG_SP tabreg[R_R1] /* SP register offset */
#define REG_FP tabreg[R_R1] /* SP register offset (no FP on PPC) */
#define BREAK_SIZE 4 /* Breakpoint occupies 4 bytes */
#define BREAK_ADJ 0 /* Nothing to subtract from address after bp */
#define IS_BREAK(l) ((l) == 0x7d8d6808)
#define SET_BREAK(l) (0x7d8d6808)
#define ORG_BREAK(c,p) (p)
#define IS_STEP(regs) (regs.tabreg[R_EXCEPNB] == ASM_TRACE_VECTOR) /* Was step and not break */
#define TARGET_PROC_TYPE 3
#define IS_STEP(regs) (regs.tabreg[R_EXCEPNB] == ASM_TRACE_VECTOR) /* Was step and not break */
#define TARGET_PROC_TYPE 3
#define MAXDEBUGGEE 150
#define NAMEMAX 17
/*
/*
* Memory data for read/write text or data. The size is in data. The target
* addr is in the addr field.
* Be careful before modifying because this value goes into internal
@@ -250,40 +250,9 @@ typedef struct {
u_int CHAR_DATA_len;
char *CHAR_DATA_val;
} CHAR_DATA;
#define XRY_MAX_INST_BUFF 128
#define XRY_MAX_INSTANCES 16
#ifndef XRY_MAX_CMD_STR
#define XRY_MAX_CMD_STR 320
#endif /* REMDEB_H */
struct xry_inst {
u_char flags;
u_char type;
u_char sub_type;
u_char res_type;
u_long value;
u_long value2;
};
typedef struct xry_inst xry_inst;
struct instance {
struct xry_inst instances[XRY_MAX_INSTANCES];
u_char buffer[XRY_MAX_INST_BUFF];
};
typedef struct instance instance;
struct instance_union {
bool_t instances;
union {
instance inst;
char *buffer;
} instance_union_u;
};
typedef struct instance_union instance_union;
typedef char *one_arg;
#define XRY_MAX_OBJ_NAME 32
/* now open_connex() routine which establishes a connection to server */
/* now open_connex() routine which establishes a connection to server */
enum debug_type {
DEBTYP_PROCESS = 0,
@@ -292,7 +261,7 @@ enum debug_type {
DEBTYP_OTHER = 3,
};
typedef enum debug_type debug_type;
#define DEBUGGER_IS_GDB 0x2 /* */
#define DEBUGGER_IS_GDB 0x2 /* */
struct open_in {
u_char back_port[16];
@@ -312,7 +281,7 @@ struct open_out {
u_short server_vers;
};
typedef struct open_out open_out;
/* now close_connex() routine which detaches from server */
/* now close_connex() routine which detaches from server */
enum close_control {
CLOSE_IGNORE = 0,
@@ -325,7 +294,7 @@ struct close_in {
close_control control;
};
typedef struct close_in close_in;
/* now send_signal() routine which sends signals to processes like kill(2) */
/* now send_signal() routine which sends signals to processes like kill(2) */
struct signal_in {
int pid;
@@ -338,7 +307,7 @@ struct signal_out {
int errNo;
};
typedef struct signal_out signal_out;
/* now wait_info() routine which returns results of polling the wait status
/* now wait_info() routine which returns results of polling the wait status
of a process/actor. It may return 0 if running, else pid or -1 */
enum stop_code {
@@ -373,8 +342,8 @@ struct wait_out {
u_long thread;
};
typedef struct wait_out wait_out;
/* now ptrace() routine. This matches the Sun UNIX ptrace as well as
some additions */
/* now ptrace() routine. This matches the Sun UNIX ptrace as well as
some additions */
#define PTRFLG_FORCE 1
#define PTRFLG_NON_OWNER 2
#define PTRFLG_FREE 4
@@ -442,7 +411,7 @@ struct get_signal_names_out {
all_signals signals;
};
typedef struct get_signal_names_out get_signal_names_out;
/* now define the actual calls we support */
/* now define the actual calls we support */
#define REMDEB_H
#endif
@@ -508,9 +477,6 @@ extern bool_t xdr_thread_list (XDR *, thread_list*);
extern bool_t xdr_ptrace_addr_data_in (XDR *, ptrace_addr_data_in*);
extern bool_t xdr_ptrace_addr_data_out (XDR *, ptrace_addr_data_out*);
extern bool_t xdr_CHAR_DATA (XDR *, CHAR_DATA*);
extern bool_t xdr_xry_inst (XDR *, xry_inst*);
extern bool_t xdr_instance (XDR *, instance*);
extern bool_t xdr_instance_union (XDR *, instance_union*);
extern bool_t xdr_one_arg (XDR *, one_arg*);
extern bool_t xdr_debug_type (XDR *, debug_type*);
extern bool_t xdr_open_in (XDR *, open_in*);
@@ -547,9 +513,6 @@ extern bool_t xdr_thread_list ();
extern bool_t xdr_ptrace_addr_data_in ();
extern bool_t xdr_ptrace_addr_data_out ();
extern bool_t xdr_CHAR_DATA ();
extern bool_t xdr_xry_inst ();
extern bool_t xdr_instance ();
extern bool_t xdr_instance_union ();
extern bool_t xdr_one_arg ();
extern bool_t xdr_debug_type ();
extern bool_t xdr_open_in ();
@@ -6,7 +6,7 @@
#include <bsp.h>
#include <rdbg/servrpc.h>
#include <rdbg/remdeb.h>
#define fprintf(fp, ...) printf(__VA_ARGS__)
#define printf(c)
/*HEADER_START*/
#define RTEMS_PORT 2071
#define RTEMS_BACK_PORT 2073
@@ -14,30 +14,28 @@
* Sun request values for the remote ptrace system call
*/
/*
/*
* Memory data for read/write text or data. The size is in data. The target
* addr is in the addr field.
* Be careful before modifying because this value goes into internal
* pipes and is allocated on stack too. Pipes and/or the stack could
* become too small if this value gets incremented.
*/
#ifndef XRY_MAX_CMD_STR
#endif /* REMDEB_H */
/* now open_connex() routine which establishes a connection to server */
#define DEBUGGER_IS_GDB 0x2 /* */
/* now close_connex() routine which detaches from server */
/* now send_signal() routine which sends signals to processes like kill(2) */
/* now wait_info() routine which returns results of polling the wait status
/* now open_connex() routine which establishes a connection to server */
#define DEBUGGER_IS_GDB 0x2 /* */
/* now close_connex() routine which detaches from server */
/* now send_signal() routine which sends signals to processes like kill(2) */
/* now wait_info() routine which returns results of polling the wait status
of a process/actor. It may return 0 if running, else pid or -1 */
/* now ptrace() routine. This matches the Sun UNIX ptrace as well as
some additions */
/* now define the actual calls we support */
/* now ptrace() routine. This matches the Sun UNIX ptrace as well as
some additions */
/* now define the actual calls we support */
const char* names [] = {
"NULLPROC", "OPEN_CONNEX", "SEND_SIGNAL", "name3",
"name4", "name5", "name6", "name7",
"name8", "name9", "CLOSE_CONNEX", "PTRACE",
"name12", "WAIT_INFO", "name14", "name15",
"name16", "GET_SIGNAL_NAMES", "name18"
"NULLPROC", "OPEN_CONNEX", "SEND_SIGNAL", "name3",
"name4", "name5", "name6", "name7",
"name8", "name9", "CLOSE_CONNEX", "PTRACE",
"name12", "WAIT_INFO", "name14", "name15",
"name16", "GET_SIGNAL_NAMES", "name18"
};
void
@@ -115,7 +113,7 @@ remotedeb_2(struct svc_req *rqstp, register SVCXPRT *transp)
svcerr_systemerr (transp);
}
if (!svc_freeargs (transp, _xdr_argument, (caddr_t) &argument)) {
fprintf (stderr, "%s", "unable to free arguments");
printf( "unable to free arguments");
exit (1);
}
return;
@@ -97,7 +97,7 @@ xdr_xdr_regs (XDR *xdrs, xdr_regs *objp)
return FALSE;
return TRUE;
}
/*
/*
* Memory data for read/write text or data. The size is in data. The target
* addr is in the addr field.
* Be careful before modifying because this value goes into internal
@@ -105,16 +105,16 @@ xdr_xdr_regs (XDR *xdrs, xdr_regs *objp)
* become too small if this value gets incremented.
*/
bool_t xdr_xdr_mem(xdrs, objp)
XDR *xdrs;
struct xdr_mem *objp;
XDR *xdrs;
struct xdr_mem *objp;
{
if (!xdr_u_long(xdrs, &objp->addr)) {
return (FALSE);
}
if (!xdr_u_int(xdrs, &objp->dataNb)) {
return(FALSE);
}
return (xdr_opaque(xdrs, objp->data, objp->dataNb));
if (!xdr_u_long(xdrs, &objp->addr)) {
return (FALSE);
}
if (!xdr_u_int(xdrs, &objp->dataNb)) {
return(FALSE);
}
return (xdr_opaque(xdrs, objp->data, objp->dataNb));
}
bool_t
@@ -262,11 +262,11 @@ xdr_KernThread (XDR *xdrs, KernThread *objp)
return TRUE;
}
bool_t xdr_thread_list(xdrs, objp)
XDR *xdrs;
struct thread_list *objp;
XDR *xdrs;
struct thread_list *objp;
{
return (xdr_array(xdrs, (char**)&objp->threads, &objp->nbThread,
UTHREAD_MAX, sizeof(KernThread), xdr_KernThread));
return (xdr_array(xdrs, (char**)&objp->threads, &objp->nbThread,
UTHREAD_MAX, sizeof(KernThread), xdr_KernThread));
}
bool_t
@@ -386,65 +386,6 @@ xdr_CHAR_DATA (XDR *xdrs, CHAR_DATA *objp)
return FALSE;
return TRUE;
}
#ifndef XRY_MAX_CMD_STR
#endif /* REMDEB_H */
bool_t
xdr_xry_inst (XDR *xdrs, xry_inst *objp)
{
register int32_t *buf;
if (!xdr_u_char (xdrs, &objp->flags))
return FALSE;
if (!xdr_u_char (xdrs, &objp->type))
return FALSE;
if (!xdr_u_char (xdrs, &objp->sub_type))
return FALSE;
if (!xdr_u_char (xdrs, &objp->res_type))
return FALSE;
if (!xdr_u_long (xdrs, &objp->value))
return FALSE;
if (!xdr_u_long (xdrs, &objp->value2))
return FALSE;
return TRUE;
}
bool_t
xdr_instance (XDR *xdrs, instance *objp)
{
register int32_t *buf;
int i;
if (!xdr_vector (xdrs, (char *)objp->instances, XRY_MAX_INSTANCES,
sizeof (xry_inst), (xdrproc_t) xdr_xry_inst))
return FALSE;
if (!xdr_vector (xdrs, (char *)objp->buffer, XRY_MAX_INST_BUFF,
sizeof (u_char), (xdrproc_t) xdr_u_char))
return FALSE;
return TRUE;
}
bool_t
xdr_instance_union (XDR *xdrs, instance_union *objp)
{
register int32_t *buf;
if (!xdr_bool (xdrs, &objp->instances))
return FALSE;
switch (objp->instances) {
case TRUE:
if (!xdr_instance (xdrs, &objp->instance_union_u.inst))
return FALSE;
break;
case FALSE:
if (!xdr_string (xdrs, &objp->instance_union_u.buffer, XRY_MAX_CMD_STR))
return FALSE;
break;
default:
return FALSE;
}
return TRUE;
}
bool_t
xdr_one_arg (XDR *xdrs, one_arg *objp)
@@ -455,7 +396,7 @@ xdr_one_arg (XDR *xdrs, one_arg *objp)
return FALSE;
return TRUE;
}
/* now open_connex() routine which establishes a connection to server */
/* now open_connex() routine which establishes a connection to server */
bool_t
xdr_debug_type (XDR *xdrs, debug_type *objp)
@@ -466,7 +407,7 @@ xdr_debug_type (XDR *xdrs, debug_type *objp)
return FALSE;
return TRUE;
}
#define DEBUGGER_IS_GDB 0x2 /* */
#define DEBUGGER_IS_GDB 0x2 /* */
bool_t
xdr_open_in (XDR *xdrs, open_in *objp)
@@ -573,7 +514,7 @@ xdr_open_out (XDR *xdrs, open_out *objp)
return FALSE;
return TRUE;
}
/* now close_connex() routine which detaches from server */
/* now close_connex() routine which detaches from server */
bool_t
xdr_close_control (XDR *xdrs, close_control *objp)
@@ -594,7 +535,7 @@ xdr_close_in (XDR *xdrs, close_in *objp)
return FALSE;
return TRUE;
}
/* now send_signal() routine which sends signals to processes like kill(2) */
/* now send_signal() routine which sends signals to processes like kill(2) */
bool_t
xdr_signal_in (XDR *xdrs, signal_in *objp)
@@ -619,7 +560,7 @@ xdr_signal_out (XDR *xdrs, signal_out *objp)
return FALSE;
return TRUE;
}
/* now wait_info() routine which returns results of polling the wait status
/* now wait_info() routine which returns results of polling the wait status
of a process/actor. It may return 0 if running, else pid or -1 */
bool_t
@@ -744,8 +685,8 @@ xdr_wait_out (XDR *xdrs, wait_out *objp)
return FALSE;
return TRUE;
}
/* now ptrace() routine. This matches the Sun UNIX ptrace as well as
some additions */
/* now ptrace() routine. This matches the Sun UNIX ptrace as well as
some additions */
bool_t
xdr_ptrace_in (XDR *xdrs, ptrace_in *objp)
@@ -925,4 +866,4 @@ xdr_get_signal_names_out (XDR *xdrs, get_signal_names_out *objp)
return FALSE;
return TRUE;
}
/* now define the actual calls we support */
/* now define the actual calls we support */
+118 -98
View File
@@ -12,109 +12,108 @@
#include <assert.h>
#include <errno.h>
#include <rdbg/reg.h>
#include <rdbg/reg.h>
#include <rdbg/remdeb.h>
#include <rdbg/rdbg.h>
#include <rtems/score/cpu.h>
#include <rtems/score/thread.h>
#include <rtems/score/cpu.h>
#include <rtems/score/thread.h>
#include <libcpu/cpu.h>
void
CtxToRegs (const CPU_Exception_frame* ctx, xdr_regs* regs)
void
CtxToRegs (const CPU_Exception_frame * ctx, xdr_regs * regs)
{
* ((CPU_Exception_frame*) regs) = *ctx;
*((CPU_Exception_frame *) regs) = *ctx;
}
void
RegsToCtx (const xdr_regs* regs, CPU_Exception_frame* ctx)
void
RegsToCtx (const xdr_regs * regs, CPU_Exception_frame * ctx)
{
*ctx = * ((CPU_Exception_frame*) regs);
*ctx = *((CPU_Exception_frame *) regs);
}
void
get_ctx_thread( Thread_Control *thread, CPU_Exception_frame* ctx)
void
get_ctx_thread (Thread_Control * thread, CPU_Exception_frame * ctx)
{
unsigned int *ptr;
unsigned int i;
ctx->EXC_SRR0 = thread->Registers.pc;
ctx->EXC_SRR1 = thread->Registers.msr;
ctx->EXC_SRR0 = thread->Registers.pc;
ctx->EXC_SRR1 = thread->Registers.msr;
ctx->_EXC_number = 0xdeadbeef;
ctx->GPR1 = thread->Registers.gpr1;
ctx->GPR2 = thread->Registers.gpr2;
ctx->GPR1 = thread->Registers.gpr1;
ctx->GPR2 = thread->Registers.gpr2;
/*
* Fill with dummy values...
*/
ptr = &ctx->GPR3;
for (i = 0; i < 10; i++)
ptr [i] = 0xdeadbeef;
ctx->GPR13 = thread->Registers.gpr13;
ctx->GPR14 = thread->Registers.gpr14;
ctx->GPR15 = thread->Registers.gpr15;
ctx->GPR16 = thread->Registers.gpr16;
ctx->GPR17 = thread->Registers.gpr17;
ctx->GPR18 = thread->Registers.gpr18;
ctx->GPR19 = thread->Registers.gpr19;
ctx->GPR20 = thread->Registers.gpr20;
ctx->GPR21 = thread->Registers.gpr21;
ctx->GPR22 = thread->Registers.gpr22;
ctx->GPR23 = thread->Registers.gpr23;
ctx->GPR24 = thread->Registers.gpr24;
ctx->GPR25 = thread->Registers.gpr25;
ctx->GPR26 = thread->Registers.gpr26;
ctx->GPR27 = thread->Registers.gpr27;
ctx->GPR28 = thread->Registers.gpr28;
ctx->GPR29 = thread->Registers.gpr29;
ctx->GPR30 = thread->Registers.gpr30;
ctx->GPR31 = thread->Registers.gpr31;
ctx->EXC_CR = thread->Registers.cr;
ctx->EXC_CTR = 0xdeadbeef;
ctx->EXC_XER = 0xdeadbeef;
ctx->EXC_LR = 0xdeadbeef;
ctx->EXC_MSR = 0xdeadbeef;
ctx->EXC_DAR = 0xdeadbeef;
ptr[i] = 0xdeadbeef;
ctx->GPR13 = thread->Registers.gpr13;
ctx->GPR14 = thread->Registers.gpr14;
ctx->GPR15 = thread->Registers.gpr15;
ctx->GPR16 = thread->Registers.gpr16;
ctx->GPR17 = thread->Registers.gpr17;
ctx->GPR18 = thread->Registers.gpr18;
ctx->GPR19 = thread->Registers.gpr19;
ctx->GPR20 = thread->Registers.gpr20;
ctx->GPR21 = thread->Registers.gpr21;
ctx->GPR22 = thread->Registers.gpr22;
ctx->GPR23 = thread->Registers.gpr23;
ctx->GPR24 = thread->Registers.gpr24;
ctx->GPR25 = thread->Registers.gpr25;
ctx->GPR26 = thread->Registers.gpr26;
ctx->GPR27 = thread->Registers.gpr27;
ctx->GPR28 = thread->Registers.gpr28;
ctx->GPR29 = thread->Registers.gpr29;
ctx->GPR30 = thread->Registers.gpr30;
ctx->GPR31 = thread->Registers.gpr31;
ctx->EXC_CR = thread->Registers.cr;
ctx->EXC_CTR = 0xdeadbeef;
ctx->EXC_XER = 0xdeadbeef;
ctx->EXC_LR = 0xdeadbeef;
ctx->EXC_MSR = 0xdeadbeef;
ctx->EXC_DAR = 0xdeadbeef;
}
void
set_ctx_thread( Thread_Control *thread, CPU_Exception_frame* ctx)
void
set_ctx_thread (Thread_Control * thread, CPU_Exception_frame * ctx)
{
thread->Registers.gpr1 = ctx->GPR1;
thread->Registers.gpr2 = ctx->GPR2;
thread->Registers.gpr1 = ctx->GPR1;
thread->Registers.gpr2 = ctx->GPR2;
thread->Registers.gpr13 = ctx->GPR13;
thread->Registers.gpr14 = ctx->GPR14;
thread->Registers.gpr15 = ctx->GPR15;
thread->Registers.gpr16 = ctx->GPR16;
thread->Registers.gpr17 = ctx->GPR17;
thread->Registers.gpr18 = ctx->GPR18;
thread->Registers.gpr19 = ctx->GPR19;
thread->Registers.gpr20 = ctx->GPR20;
thread->Registers.gpr21 = ctx->GPR21;
thread->Registers.gpr22 = ctx->GPR22;
thread->Registers.gpr23 = ctx->GPR23;
thread->Registers.gpr24 = ctx->GPR24;
thread->Registers.gpr25 = ctx->GPR25;
thread->Registers.gpr26 = ctx->GPR26;
thread->Registers.gpr27 = ctx->GPR27;
thread->Registers.gpr28 = ctx->GPR28;
thread->Registers.gpr29 = ctx->GPR29;
thread->Registers.gpr30 = ctx->GPR30;
thread->Registers.gpr31 = ctx->GPR31;
thread->Registers.cr = ctx->EXC_CR;
thread->Registers.pc = ctx->EXC_SRR0;
thread->Registers.msr = ctx->EXC_SRR1;
thread->Registers.gpr13 = ctx->GPR13;
thread->Registers.gpr14 = ctx->GPR14;
thread->Registers.gpr15 = ctx->GPR15;
thread->Registers.gpr16 = ctx->GPR16;
thread->Registers.gpr17 = ctx->GPR17;
thread->Registers.gpr18 = ctx->GPR18;
thread->Registers.gpr19 = ctx->GPR19;
thread->Registers.gpr20 = ctx->GPR20;
thread->Registers.gpr21 = ctx->GPR21;
thread->Registers.gpr22 = ctx->GPR22;
thread->Registers.gpr23 = ctx->GPR23;
thread->Registers.gpr24 = ctx->GPR24;
thread->Registers.gpr25 = ctx->GPR25;
thread->Registers.gpr26 = ctx->GPR26;
thread->Registers.gpr27 = ctx->GPR27;
thread->Registers.gpr28 = ctx->GPR28;
thread->Registers.gpr29 = ctx->GPR29;
thread->Registers.gpr30 = ctx->GPR30;
thread->Registers.gpr31 = ctx->GPR31;
thread->Registers.cr = ctx->EXC_CR;
thread->Registers.pc = ctx->EXC_SRR0;
thread->Registers.msr = ctx->EXC_SRR1;
}
int
Single_Step(CPU_Exception_frame* ctx)
int
Single_Step (CPU_Exception_frame * ctx)
{
if ((ctx->EXC_SRR1 & MSR_SE) != 0 || ExitForSingleStep != 0) {
/* Check coherency */
if ((ctx->EXC_SRR1 & MSR_SE) != 0 || ExitForSingleStep != 0) {
/*
* Check coherency
*/
assert ((ctx->EXC_SRR1 & MSR_SE) != 0);
assert (ExitForSingleStep != 0);
return 0;
@@ -124,33 +123,54 @@ Single_Step(CPU_Exception_frame* ctx)
return 0;
}
int
CheckForSingleStep (CPU_Exception_frame* ctx)
int
CheckForSingleStep (CPU_Exception_frame * ctx)
{
if (ExitForSingleStep) {
/*
* This functions can be called both from
* INT1 and INT3 handlers. In case it is
* called from INT3, need to clear TF.
*/
ctx->EXC_SRR1 &= ~MSR_SE;
ExitForSingleStep = 0;
return 1;
}
return 0;
if (ExitForSingleStep) {
/*
* This functions can be called both from
* INT1 and INT3 handlers. In case it is
* called from INT3, need to clear TF.
*/
ctx->EXC_SRR1 &= ~MSR_SE;
ExitForSingleStep = 0;
return 1;
}
return 0;
}
void
CancelSingleStep (CPU_Exception_frame* ctx)
void
CancelSingleStep (CPU_Exception_frame * ctx)
{
/* Cancel scheduled SS */
/*
* Cancel scheduled SS
*/
ctx->EXC_SRR1 &= ~MSR_SE;
ExitForSingleStep-- ;
ExitForSingleStep--;
}
cpuExcHandlerType oldExcHandler;
void connect_rdbg_exception()
static cpuExcHandlerType oldExcHandler;
void
connect_rdbg_exception ()
{
oldExcHandler = globalExceptHdl;
globalExceptHdl = BreakPointExcHdl ;
/*
* test if rdbg already connected its exception handler
*/
if (globalExceptHdl != BreakPointExcHdl) {
oldExcHandler = globalExceptHdl;
globalExceptHdl = BreakPointExcHdl;
}
}
void
disconnect_rdbg_exception ()
{
/*
* test if current execption handler is rdbg's one
* and restore the original one in this case.
*/
if (globalExceptHdl == BreakPointExcHdl) {
globalExceptHdl = oldExcHandler;
}
}
+248 -253
View File
File diff suppressed because it is too large Load Diff
+84 -87
View File
@@ -3,7 +3,7 @@
*
* Component =
*
* Synopsis = rkdb/rkdb.c
* Synopsis = rdbg.c
*
* $Id$
*
@@ -21,131 +21,128 @@
#include <sys/socket.h>
#include <netinet/in.h>
u_short rtemsPort = RTEMS_PORT;
int BackPort = RTEMS_BACK_PORT;
int rtemsActive = 0;
SVCXPRT* rtemsXprt;
int rtemsSock;
char ActName[] = "RTEMS";
volatile int ExitForSingleStep = 0 ;
volatile int Continue;
volatile int justSaveContext;
volatile Objects_Id currentTargetThread;
volatile int CannotRestart = 0;
volatile int TotalReboot = 0;
u_short rtemsPort = RTEMS_PORT;
int BackPort = RTEMS_BACK_PORT;
int rtemsActive = 0;
SVCXPRT *rtemsXprt;
int rtemsSock;
char taskName[] = "RTEMS rdbg daemon";
volatile int ExitForSingleStep = 0;
volatile int Continue;
volatile int justSaveContext;
volatile Objects_Id currentTargetThread;
volatile int CannotRestart = 0;
volatile int TotalReboot = 0;
int CONN_LIST_INC = 3;
int PID_LIST_INC = 1;
int TSP_RETRIES = 10;
int PID_LIST_INC = 1;
int TSP_RETRIES = 10;
int
getId()
int
getId ()
{
rtems_id id;
rtems_task_ident(RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &id);
return (int)(id) ;
rtems_task_ident (RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &id);
return (int) (id);
}
static void
remotedeb_2_hook(struct svc_req *rqstp, register SVCXPRT *transp)
{
connect_rdbg_exception(); /* monitor stub changes trace vector */
remotedeb_2(rqstp, transp);
connect_rdbg_exception();
}
static int
static int
rdbgInit (void)
{
int sock;
struct sockaddr_in addr;
int sock;
struct sockaddr_in addr;
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock == -1) {
printf("%s: rkdbInit: cannot allocate socket\n", ActName);
return -1;
}
sock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock == -1) {
printf ("%s: rdbgInit: cannot allocate socket\n", taskName);
return -1;
}
bzero( (void *)&addr, sizeof(struct sockaddr_in));
addr.sin_port = htons(rtemsPort);
if ((bind(sock, (struct sockaddr*) &addr, sizeof(addr))) == -1) {
printf("%s: rkdbInit: cannot bind socket\n", ActName);
return -2;
}
rtemsXprt = svcudp_create(sock);
if (svcudp_enablecache(rtemsXprt, 1) == 0) {
printf("%s: rkdbInit: cannot enable rpc cache\n", ActName);
return -3;
}
rtemsSock = sock;
if (!svc_register(rtemsXprt, REMOTEDEB, REMOTEVERS, remotedeb_2, 0)) {
printf(stderr, "unable to register (REMOTEDEB, REMOTEVERS, udp).");
return -4;
}
bzero ((void *) &addr, sizeof (struct sockaddr_in));
addr.sin_port = htons (rtemsPort);
if ((bind (sock, (struct sockaddr *) &addr, sizeof (addr))) == -1) {
printf ("%s: rdbgInit: cannot bind socket\n", taskName);
return -2;
}
rtemsXprt = svcudp_create (sock);
if (svcudp_enablecache (rtemsXprt, 1) == 0) {
printf ("%s: rdbgInit: cannot enable rpc cache\n", taskName);
return -3;
}
rtemsSock = sock;
if (!svc_register (rtemsXprt, REMOTEDEB, REMOTEVERS, remotedeb_2, 0)) {
printf (stderr, "unable to register (REMOTEDEB, REMOTEVERS, udp).");
return -4;
}
connect_rdbg_exception ();
return 0;
return 0;
}
rtems_task
rtems_task
rdbgDaemon (rtems_task_argument argument)
{
svc_run();
svc_run ();
}
void
void
rtems_rdbg_initialize (void)
{
rtems_name task_name;
rtems_id tid;
rtems_name task_name;
rtems_id tid;
rtems_status_code status;
#ifdef DDEBUG
rdb_debug = 1; /* DPRINTF now will display */
rdb_debug = 1; /* DPRINTF now will display */
#endif
DPRINTF (("%s init starting\n", ActName));
DPRINTF (("%s init starting\n", taskName));
/* Print version string */
/*
* Print version string
*/
#ifdef DDEBUG
printk ("RDBG v.%d built on [%s %s]\n", SERVER_VERS, __DATE__, __TIME__);
printk ("RDBG v.%d built on [%s %s]\n", SERVER_VERS, __DATE__, __TIME__);
#else
printk ("RDBG v.%d\n", SERVER_VERS);
printk ("RDBG v.%d\n", SERVER_VERS);
#endif
/* Create socket and init UDP RPC server */
if (rdbgInit() != 0) goto error;
/*
* Create socket and init UDP RPC server
*/
if (rdbgInit () != 0)
goto error;
Continue = 1;
justSaveContext = 0;
currentTargetThread = 0;
task_name = rtems_build_name( 'R', 'D', 'B', 'G' );
if ((status = rtems_task_create( task_name, 5, 24576,
RTEMS_INTERRUPT_LEVEL(0),
RTEMS_DEFAULT_ATTRIBUTES | RTEMS_SYSTEM_TASK
, &tid ))
!= RTEMS_SUCCESSFUL){
printf("status = %d\n",status);
rtems_panic ("Can't create task.\n");
}
Continue = 1;
justSaveContext = 0;
currentTargetThread = 0;
status = rtems_task_start(tid, rdbgDaemon, 0);
task_name = rtems_build_name ('R', 'D', 'B', 'G');
if ((status = rtems_task_create (task_name, 5, 24576,
RTEMS_INTERRUPT_LEVEL (0),
RTEMS_DEFAULT_ATTRIBUTES |
RTEMS_SYSTEM_TASK, &tid))
!= RTEMS_SUCCESSFUL) {
printf ("status = %d\n", status);
rtems_panic ("Can't create task.\n");
}
return;
status = rtems_task_start (tid, rdbgDaemon, 0);
return;
error:
printf ("initialization failed.\n");
printf ("initialization failed.\n");
}
void
void
setErrno (int error)
{
errno = error;
errno = error;
}
int
getErrno()
int
getErrno ()
{
return errno;
return errno;
}
-35
View File
@@ -291,43 +291,8 @@ union ptrace_addr_data_out switch (ptracereq req) {
typedef opaque CHAR_DATA <NET_SAFE>; /* variable sized data */
const XRY_MAX_INST_BUFF = 128;
const XRY_MAX_INSTANCES = 16;
%#ifndef XRY_MAX_CMD_STR
const XRY_MAX_CMD_STR = 320; /* XRY_MAX_INST_BUFF+(XRY_MAX_INSTANCES*12) */
%#endif /* REMDEB_H */
struct xry_inst
{
unsigned char flags; /* value2 interp, etc. INFL_xxx */
unsigned char type; /* base type of data (str, val, etc) INST_xxx */
unsigned char sub_type; /* specific type (task, res, etc). This is
set and defined by the user defined instance
processor and not the auto-processor */
unsigned char res_type;
u_long value; /* pointer to value or value itself */
u_long value2; /* second value (optional - based on flags) */
};
struct instance
{
struct xry_inst instances[XRY_MAX_INSTANCES];
unsigned char buffer[XRY_MAX_INST_BUFF];
};
union instance_union switch (bool instances)
{
case TRUE:
instance inst;
case FALSE:
string buffer <XRY_MAX_CMD_STR>;
};
typedef string one_arg <NET_SAFE>;
const XRY_MAX_OBJ_NAME = 32; /* objname in some commands */
% /* now open_connex() routine which establishes a connection to server */
enum debug_type
File diff suppressed because it is too large Load Diff
+108 -91
View File
@@ -11,10 +11,10 @@
**************************************************************************
*/
#include <sys/errno.h>
#include <rdbg/rdbg.h>
#include <rdbg/servrpc.h>
#include <sys/errno.h>
#include <rdbg/rdbg.h>
#include <rdbg/servrpc.h>
/*
* ConnCreate - create a new connection entry for a client.
*
@@ -25,66 +25,74 @@
* the caller.
*/
int
ConnCreate (struct svc_req* rqstp, open_in* in)
int
ConnCreate (struct svc_req *rqstp, open_in * in)
{
NET_OPAQUE sender;
int idx;
CONN_LIST* clst;
setErrno (0);
NET_OPAQUE sender;
int idx;
CONN_LIST *clst;
/* Convert to valid Net address */
if (! TspTranslateRpcAddr (rqstp, &sender)) {
DPRINTF (("ConnCreate: TspTranslateRpcAddr failed\n"));
return -1;
}
if (! TspValidateAddr ((NET_OPAQUE*) in->back_port, &sender)) {
DPRINTF (("ConnCreate: TspValidateAddr failed\n"));
return -1; /* errno now setup with error */
setErrno (0);
/*
* Convert to valid Net address
*/
if (!TspTranslateRpcAddr (rqstp, &sender)) {
DPRINTF (("ConnCreate: TspTranslateRpcAddr failed\n"));
return -1;
}
if (!TspValidateAddr ((NET_OPAQUE *) in->back_port, &sender)) {
DPRINTF (("ConnCreate: TspValidateAddr failed\n"));
return -1; /* errno now setup with error */
}
/*
* look for an empty connection entry
*/
for (idx = 0; idx < conn_list_cnt; idx++) {
if (!conn_list[idx].in_use)
break; /* an empty one found */
}
if (idx >= conn_list_cnt) { /* no empties, create space */
CONN_LIST *tmp_conn_list = conn_list;
conn_list_cnt += CONN_LIST_INC;
if (conn_list) {
conn_list = (CONN_LIST *) Realloc (conn_list, /* extend */
conn_list_cnt * sizeof (CONN_LIST));
} else {
conn_list = (CONN_LIST *) Malloc (conn_list_cnt * sizeof (CONN_LIST));
}
/* look for an empty connection entry */
for (idx = 0; idx < conn_list_cnt; idx++) {
if (!conn_list[idx].in_use)
break; /* an empty one found */
if (!conn_list) { /* unable to get space */
if ((conn_list_cnt -= CONN_LIST_INC)) {
/*
* was realloc, restore space
*/
conn_list = tmp_conn_list;
}
return -1; /* errno set by failed alloc */
}
/*
* clear newly created memory
*/
memset (conn_list + idx, 0, CONN_LIST_INC * sizeof (CONN_LIST));
} else { /* clear new entry */
memset (conn_list + idx, 0, sizeof (CONN_LIST));
}
clst = conn_list + idx;
if (idx >= conn_list_cnt) { /* no empties, create space */
CONN_LIST* tmp_conn_list = conn_list;
clst->in_use = True; /* now in use */
clst->sender = sender;
memcpy (&clst->back_port, &in->back_port, sizeof (NET_OPAQUE));
memcpy (&clst->route, &in->destination, sizeof (NET_OPAQUE));
clst->debug_type = (UCHAR) in->debug_type;
clst->flags = in->flags;
strncpy (clst->user_name, in->user_name, NAMEMAX - 1);
clst->user_name[NAMEMAX - 1] = 0;
conn_list_cnt += CONN_LIST_INC;
if (conn_list) {
conn_list = (CONN_LIST *) Realloc (conn_list, /* extend */
conn_list_cnt * sizeof (CONN_LIST));
} else {
conn_list = (CONN_LIST *)Malloc(conn_list_cnt * sizeof(CONN_LIST));
}
if (!conn_list) { /* unable to get space */
if ((conn_list_cnt -= CONN_LIST_INC)) {
/* was realloc, restore space */
conn_list = tmp_conn_list;
}
return -1; /* errno set by failed alloc */
}
/* clear newly created memory */
memset (conn_list + idx, 0, CONN_LIST_INC * sizeof (CONN_LIST));
} else { /* clear new entry */
memset (conn_list + idx, 0, sizeof (CONN_LIST));
}
clst = conn_list + idx;
clst->in_use = True; /* now in use */
clst->sender = sender;
memcpy (&clst->back_port, &in->back_port, sizeof (NET_OPAQUE));
memcpy (&clst->route, &in->destination, sizeof (NET_OPAQUE));
clst->debug_type = (UCHAR) in->debug_type;
clst->flags = in->flags;
strncpy (clst->user_name, in->user_name, NAMEMAX-1);
clst->user_name [NAMEMAX-1] = 0;
return idx;
return idx;
}
/*
@@ -92,47 +100,56 @@ ConnCreate (struct svc_req* rqstp, open_in* in)
*
*/
void
ConnDelete (int conn, struct svc_req* rqstp, close_control control)
void
ConnDelete (int conn, struct svc_req *rqstp, close_control control)
{
CONN_LIST* clst = conn_list + conn;
int idx;
Boolean prim;
CONN_LIST *clst = conn_list + conn;
int idx;
Boolean prim;
if (! clst->in_use) return; /* not active */
if (!clst->in_use)
return; /* not active */
for (idx = 0; idx < pid_list_cnt; idx++) {
PID_LIST* plst = pid_list + idx;
for (idx = 0; idx < pid_list_cnt; idx++) {
PID_LIST *plst = pid_list + idx;
if (! PIDMAP_TEST (conn, idx)) continue;
if (!PIDMAP_TEST (conn, idx))
continue;
/* found a controlled pid */
prim = (plst->primary_conn == conn) ? True : False;
TgtDetachCon (conn, idx, True);
/*
* found a controlled pid
*/
prim = (plst->primary_conn == conn) ? True : False;
TgtDetachCon (conn, idx, True);
/* if still running or alive, we use close control on it */
if (! plst->pid)
continue; /* entry gone */
/*
* if still running or alive, we use close control on it
*/
if (!plst->pid)
continue; /* entry gone */
if (prim && control == CLOSE_KILL) {
/* kill off process */
TgtKillAndDelete (plst, rqstp, True);
} else if (! plst->owners) {
/* no owners left */
if (control == CLOSE_DETACH) {
TgtKillAndDelete (plst, rqstp, False);
}
if (control == CLOSE_DETACH || PROC_TERMINATED (plst)) {
TgtDelete (plst, conn, (control==CLOSE_DETACH) ?
BMSG_DETACH : 0);
}
}
if (prim && control == CLOSE_KILL) {
/*
* kill off process
*/
TgtKillAndDelete (plst, rqstp, True);
} else if (!plst->owners) {
/*
* no owners left
*/
if (control == CLOSE_DETACH) {
TgtKillAndDelete (plst, rqstp, False);
}
if (control == CLOSE_DETACH || PROC_TERMINATED (plst)) {
TgtDelete (plst, conn, (control == CLOSE_DETACH) ? BMSG_DETACH : 0);
}
}
if (clst->list) {
Free (clst->list); /* free allocated memory */
}
DPRINTF (("ConnDelete: Connection closed for port %u\n",
HL_W(*((UINT16*) &clst->back_port.c[2]))));
}
if (clst->list) {
Free (clst->list); /* free allocated memory */
}
DPRINTF (("ConnDelete: Connection closed for port %u\n",
HL_W (*((UINT16 *) & clst->back_port.c[2]))));
clst->in_use = False; /* free it back */
clst->in_use = False; /* free it back */
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+73 -70
View File
@@ -25,30 +25,32 @@
* list. The fields list, list_sz and list_alloc are affected.
*/
Boolean
ListAlloc(buff, clst)
Boolean
ListAlloc (buff, clst)
char *buff;
CONN_LIST *clst; /* place to copy it */
CONN_LIST *clst; /* place to copy it */
{
int tmp;
char* name;
int new_len;
int len;
int tmp;
char *name;
int new_len;
int len;
tmp = strlen(buff);
new_len = (int)clst->list_sz + 1 + tmp;
if (clst->list_alloc < (unsigned)new_len) {
/* need more space */
name = (char *)Realloc(clst->list, len = new_len + MAX_FILENAME);
if (name == NULL) {
return(False); /* failed, no space */
}
clst->list_alloc = len;
clst->list = name;
tmp = strlen (buff);
new_len = (int) clst->list_sz + 1 + tmp;
if (clst->list_alloc < (unsigned) new_len) {
/*
* need more space
*/
name = (char *) Realloc (clst->list, len = new_len + MAX_FILENAME);
if (name == NULL) {
return (False); /* failed, no space */
}
strcpy(clst->list + clst->list_sz, buff);
clst->list_sz += tmp;
return(True);
clst->list_alloc = len;
clst->list = name;
}
strcpy (clst->list + clst->list_sz, buff);
clst->list_sz += tmp;
return (True);
}
/*----- Management of processes -----*/
@@ -57,21 +59,22 @@ ListAlloc(buff, clst)
* FindPidEntry - locate pid_list entry from pid
*/
int
FindPidEntry (pid)
int pid; /* process identifier */
int
FindPidEntry (int pid) /* pid = process identifier */
{
int idx;
int idx;
/* pid 0 is invalid, and signals a free slot */
if (pid_list == NULL || pid == 0) {
return -1;
}
for (idx = 0; idx < pid_list_cnt; idx++) {
if (pid_list [idx].pid == pid )
return idx;
}
/*
* pid 0 is invalid, and signals a free slot
*/
if (pid_list == NULL || pid == 0) {
return -1;
}
for (idx = 0; idx < pid_list_cnt; idx++) {
if (pid_list[idx].pid == pid)
return idx;
}
return -1;
}
/*----- Debug suport -----*/
@@ -82,51 +85,51 @@ FindPidEntry (pid)
* Names of debug primitives
*/
const char* PtraceNames [] = {
const char *PtraceNames[] = {
"RPT_TRACEME", "RPT_PEEKTEXT", "RPT_PEEKDATA", "RPT_PEEKUSER",
"RPT_POKETEXT", "RPT_POKEDATA", "RPT_POKEUSER", "RPT_CONT",
"RPT_KILL", "RPT_SINGLESTEP", "RPT_ATTACH", "RPT_DETACH",
"RPT_GETREGS", "RPT_SETREGS", "RPT_GETFPREGS", "RPT_SETFPREGS",
"RPT_READDATA", "RPT_WRITEDATA", "RPT_READTEXT", "RPT_WRITETEXT",
"RPT_GETFPAREGS", "RPT_SETFPAREGS", "RPT_22", "RPT_23",
"RPT_SYSCALL", "RPT_DUMPCORE", "RPT_26", "RPT_27",
"RPT_28", "RPT_GETUCODE", "RPT_30", "RPT_31",
"RPT_32", "RPT_33", "RPT_34", "RPT_35",
"RPT_36", "RPT_37", "RPT_38", "RPT_39",
"RPT_40", "RPT_41", "RPT_42", "RPT_43",
"RPT_44", "RPT_45", "RPT_46", "RPT_47",
"RPT_48", "RPT_49", "RPT_GETTARGETTHREAD", "RPT_SETTARGETTHREAD",
"RPT_THREADSUSPEND", "RPT_THREADRESUME", "RPT_THREADLIST", "RPT_GETTHREADNAME",
"RPT_SETTHREADNAME", "RPT_SETTHREADREGS", "RPT_GETTHREADREGS",
"RPT_59",
"RPT_60", "RPT_61", "RPT_62", "RPT_63",
"RPT_64", "RPT_65", "RPT_66", "RPT_67",
"RPT_68", "RPT_69", "RPT_70", "RPT_71",
"RPT_72", "RPT_73", "RPT_74", "RPT_STEPRANGE",
"RPT_CONTTO", "RPT_SETBREAK", "RPT_CLRBREAK", "RPT_GETBREAK",
"RPT_GETNAME", "RPT_STOP",
"RPT_PGETREGS", "RPT_PSETREGS",
"RPT_PSETTHREADREGS", "RPT_PGETTHREADREGS"
"RPT_TRACEME", "RPT_PEEKTEXT", "RPT_PEEKDATA", "RPT_PEEKUSER",
"RPT_POKETEXT", "RPT_POKEDATA", "RPT_POKEUSER", "RPT_CONT",
"RPT_KILL", "RPT_SINGLESTEP", "RPT_ATTACH", "RPT_DETACH",
"RPT_GETREGS", "RPT_SETREGS", "RPT_GETFPREGS", "RPT_SETFPREGS",
"RPT_READDATA", "RPT_WRITEDATA", "RPT_READTEXT", "RPT_WRITETEXT",
"RPT_GETFPAREGS", "RPT_SETFPAREGS", "RPT_22", "RPT_23",
"RPT_SYSCALL", "RPT_DUMPCORE", "RPT_26", "RPT_27",
"RPT_28", "RPT_GETUCODE", "RPT_30", "RPT_31",
"RPT_32", "RPT_33", "RPT_34", "RPT_35",
"RPT_36", "RPT_37", "RPT_38", "RPT_39",
"RPT_40", "RPT_41", "RPT_42", "RPT_43",
"RPT_44", "RPT_45", "RPT_46", "RPT_47",
"RPT_48", "RPT_49", "RPT_GETTARGETTHREAD", "RPT_SETTARGETTHREAD",
"RPT_THREADSUSPEND", "RPT_THREADRESUME", "RPT_THREADLIST",
"RPT_GETTHREADNAME",
"RPT_SETTHREADNAME", "RPT_SETTHREADREGS", "RPT_GETTHREADREGS",
"RPT_59",
"RPT_60", "RPT_61", "RPT_62", "RPT_63",
"RPT_64", "RPT_65", "RPT_66", "RPT_67",
"RPT_68", "RPT_69", "RPT_70", "RPT_71",
"RPT_72", "RPT_73", "RPT_74", "RPT_STEPRANGE",
"RPT_CONTTO", "RPT_SETBREAK", "RPT_CLRBREAK", "RPT_GETBREAK",
"RPT_GETNAME", "RPT_STOP",
"RPT_PGETREGS", "RPT_PSETREGS",
"RPT_PSETTHREADREGS", "RPT_PGETTHREADREGS"
};
const char*
PtraceName(req)
int req;
const char *
PtraceName (int req)
{
static char bufret[40];
static char bufret[40];
if ((req < 0) || (req >= sizeof(PtraceNames)/sizeof(char*))) {
sprintf(bufret, "BAD_REQ_%d", req);
return bufret;
}
return PtraceNames[req];
if ((req < 0) || (req >= sizeof (PtraceNames) / sizeof (char *))) {
sprintf (bufret, "BAD_REQ_%d", req);
return bufret;
}
return PtraceNames[req];
}
const char* BmsgNames [] = {
"?", "WARM", "WAIT", "BREAK",
"EXEC_FAIL", "DETACH", "KILLED", "NOT_PRIM",
"NEW_PID"
const char *BmsgNames[] = {
"?", "WARM", "WAIT", "BREAK",
"EXEC_FAIL", "DETACH", "KILLED", "NOT_PRIM",
"NEW_PID"
};
#endif /* DDEBUG */