summaryrefslogtreecommitdiffstats
path: root/c/src/librdbg/src/ptrace.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/librdbg/src/ptrace.c')
-rw-r--r--c/src/librdbg/src/ptrace.c537
1 files changed, 266 insertions, 271 deletions
diff --git a/c/src/librdbg/src/ptrace.c b/c/src/librdbg/src/ptrace.c
index bb6fc5a6b8..62a74d2135 100644
--- a/c/src/librdbg/src/ptrace.c
+++ b/c/src/librdbg/src/ptrace.c
@@ -19,52 +19,47 @@
extern rtems_id serializeSemId;
extern rtems_id wakeupEventSemId;
extern rtems_id eventTaskId;
+extern rtems_id debugId;
extern Exception_context *FirstCtx;
extern Exception_context *LastCtx;
extern CPU_Exception_frame SavedContext;
extern unsigned int NbExceptCtx;
+/*
+ * return a pointer to the Thread Control structure of the specified
+ * Id
+ */
-
-/* --------------------------------------------------------------------
- return a pointer to the Thread Control structure of the specified
- Id
- -------------------------------------------------------------------- */
-
-Thread_Control *Thread_Get_RDBG (
- Objects_Id Id
-)
+ Thread_Control *
+Thread_Get_RDBG (Objects_Id Id)
{
unsigned index;
- if ( Id <_Objects_Information_table[OBJECTS_RTEMS_TASKS]->maximum_id &&
- Id >_Objects_Information_table[OBJECTS_RTEMS_TASKS]->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_RTEMS_TASKS]->minimum_id;
- if ( _Objects_Information_table[OBJECTS_RTEMS_TASKS]->local_table[1+index] != NULL) {
- return (Thread_Control *)(_Objects_Information_table[OBJECTS_RTEMS_TASKS]->local_table[1+index]);
+ if (_Objects_Information_table[OBJECTS_RTEMS_TASKS]->local_table[1 + index] != NULL) {
+ return (Thread_Control*) (_Objects_Information_table[OBJECTS_RTEMS_TASKS]->local_table[1 + index]);
}
}
-
- 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_POSIX_THREADS]->maximum_id &&
+ Id > _Objects_Information_table[OBJECTS_POSIX_THREADS]->minimum_id) {
index = Id - _Objects_Information_table[OBJECTS_POSIX_THREADS]->minimum_id;
- if ( _Objects_Information_table[OBJECTS_POSIX_THREADS]->local_table[1+index] != NULL)
- return (Thread_Control *)(_Objects_Information_table[OBJECTS_POSIX_THREADS]->local_table[1+index]);
+ if (_Objects_Information_table[OBJECTS_POSIX_THREADS]->
+ local_table[1 + index] != NULL)
+ return (Thread_Control*) (_Objects_Information_table[OBJECTS_POSIX_THREADS]->local_table[1 + index]);
}
return 0;
}
-
-/* --------------------------------------------------------------------
- Memory read
- -------------------------------------------------------------------- */
-
-int
-safeMemRead(void *src, void *dest, int nbBytes){
+ int
+safeMemRead (void *src, void *dest, int nbBytes)
+{
/*
* safe because if it generates an exception,
@@ -72,261 +67,261 @@ safeMemRead(void *src, void *dest, int nbBytes){
* TBD
*/
- memcpy(dest, src, nbBytes);
+ memcpy (dest, src, nbBytes);
return 0;
}
-/* --------------------------------------------------------------------
- Memory write
- -------------------------------------------------------------------- */
-int
-safeMemWrite(void *src, void * dest, int nbBytes){
+ int
+safeMemWrite (void *src, void *dest, int nbBytes)
+{
/*
* safe because if it generates an exception,
* it must return normally
* TBD
*/
-
- memcpy(dest, src, nbBytes);
- return 0;
+
+ memcpy (dest, src, nbBytes);
+ return 0;
}
-/* --------------------------------------------------------------------
- Ptrace
- -------------------------------------------------------------------- */
-
-int
-ptrace (int request, int pid, char* addr, int data, char* addr2)
- {
- int diag;
- errno = 0 ;
- if (pid != 1) {
- errno = ESRCH;
- return -1;
- }
- switch (request) {
-
- case RPT_SINGLESTEP:{
- Exception_context *ctx;
-
- if (CannotRestart == 1){
- setErrno(EIO);
- return -1;
- }
-
- if ((ctx = GetExceptCtx (currentTargetThread)) != NULL) {
- Single_Step(ctx->ctx);
- rtems_semaphore_release( ctx->semaphoreId );
- return 0;
- }
- break;
- }
-
- case RPT_PEEKTEXT:
- case RPT_PEEKDATA: {
- diag = safeMemRead(addr, &data, sizeof data);
- if (diag == 0) return data;
- mem_error:
- return -1;
- }
-
- case RPT_POKETEXT: {
- diag = safeMemWrite(&data, addr, sizeof data);
-
- /*
- * We must flush the INSTR and DATA cache to be sure the
- * opcode modification is taken into account, because
- * the breakpoint opcode is written via the data cache
- * while execution code is fetched via the instruction
- * cache
- */
-
- if (diag == 0) {
- copyback_data_cache_and_invalidate_instr_cache(addr, sizeof data);
- return 0;
- }
- goto mem_error;
- }
- case RPT_POKEDATA: {
- diag = safeMemWrite(&data, addr, sizeof data);
- if (diag == 0) return 0;
- goto mem_error;
- }
- case RPT_CONT: {
- Exception_context *ctx;
-
- if (CannotRestart == 1){
- setErrno (EIO);
- return -1;
- }
-
- ctx = GetExceptCtx (currentTargetThread);
-
- if (!isRdbgException(ctx)) {
- CannotRestart = 1;
- setErrno (EIO);
- return -1;
- }
-
- assert (data == 0);
- assert (ExitForSingleStep == 0);
-
- rtems_semaphore_release( serializeSemId );
-
- if ((ctx = GetExceptCtx (currentTargetThread)) != NULL) {
- rtems_semaphore_release( ctx->semaphoreId );
- }
- return 0;
- }
-
- case RPT_ATTACH:
- return 0;
-
- case RPT_DETACH:{
- Exception_context *ctx;
-
- if (NbExceptCtx || NbSerializedCtx) {
- ctx = FirstCtx;
- rtems_task_delete(eventTaskId);
- rtems_semaphore_delete(serializeSemId);
- rtems_semaphore_delete(wakeupEventSemId);
- }
- return 0;
- }
-
- case RPT_GETREGS:{
- Exception_context *ctx;
-
- if ((ctx = GetExceptCtx (currentTargetThread)) != NULL) {
- CtxToRegs (ctx->ctx, (xdr_regs*) addr);
- return 0;
- }
- break;
- }
-
- case RPT_SETREGS:{
- Exception_context *ctx;
-
- if ((ctx = GetExceptCtx (currentTargetThread)) != NULL) {
- RegsToCtx ((xdr_regs*) addr, ctx->ctx);
- return 0;
- }
- break;
- }
-
- case RPT_READTEXT:
- case RPT_READDATA: {
- diag = safeMemRead(addr, addr2, data);
- if (diag == 0) return 0;
- goto mem_error;
- }
- case RPT_WRITETEXT:
- case RPT_WRITEDATA: {
- diag = safeMemWrite(addr2, addr, data);
- if (diag == 0) return 0;
- goto mem_error;
- }
-
- case RPT_GETTARGETTHREAD:
- if (!NbExceptCtx) {
- errno = EBUSY;
- return -1;
- }
- return currentTargetThread;
-
- case RPT_SETTARGETTHREAD:
- if (!NbExceptCtx) {
- errno = EBUSY;
- return -1;
- }
- currentTargetThread = data;
- return 0;
-
- case RPT_GETTHREADNAME: {
- return TgtGetThreadName (NULL, (unsigned)(data), (char *) addr);
- }
-
- case RPT_THREADLIST: {
- int count = TgtThreadList (NULL, (unsigned*) addr, UTHREAD_MAX
- * sizeof (unsigned));
- if (count < 0) {
- errno = EINVAL;
- return -1;
- }
- return count;
- }
-
- case RPT_SETTHREADREGS: {
- Exception_context *ctx;
- CPU_Exception_frame Ectx;
- Thread_Control *thread;
- rtems_id id;
-
- rtems_task_ident(RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &id);
- if (data == (unsigned)id)
- break;
-
- if ((ctx = GetExceptCtx (data)) != NULL) {
- RegsToCtx ((xdr_regs*) addr, ctx->ctx);
- return 0;
- }
- thread = Thread_Get_RDBG ((Objects_Id)(data));
- if (thread != NULL) {
- RegsToCtx ((xdr_regs*) addr, &Ectx);
- set_ctx_thread (thread, &Ectx);
- return 0;
- }
- break;
- }
-
- case RPT_GETTHREADREGS: {
- Exception_context *ctx;
- CPU_Exception_frame Ectx;
- Thread_Control *thread;
- rtems_id id;
-
- rtems_task_ident(RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &id);
- if (data == (unsigned)id){
- justSaveContext = 1;
- enterRdbg();
- CtxToRegs (&(SavedContext), (xdr_regs*) addr);
- return 0;
- }
-
- if ((ctx = GetExceptCtx (data)) != NULL) {
- CtxToRegs (ctx->ctx, (xdr_regs*) addr);
- return 0;
- }
- thread = Thread_Get_RDBG ((Objects_Id)(data));
- if (thread != NULL) {
- get_ctx_thread (thread, &Ectx);
- CtxToRegs (&Ectx, (xdr_regs*) addr);
- return 0;
- }
- break;
- }
-
- case RPT_KILL:
- TotalReboot = 1;
- return 0;
-
- case RPT_TRACEME:
- case RPT_PEEKUSER:
- case RPT_POKEUSER:
- case RPT_GETFPREGS:
- case RPT_SETFPREGS:
- case RPT_GETFPAREGS:
- case RPT_SETFPAREGS:
- case RPT_SYSCALL:
- case RPT_DUMPCORE:
- case RPT_GETUCODE:
- case RPT_THREADSUSPEND:
- case RPT_THREADRESUME:
- case RPT_SETTHREADNAME:
- default:
- break;
- }
- errno = EINVAL;
- return -1;
+ int
+ptrace (int request, int pid, char *addr, int data, char *addr2)
+{
+ int diag;
+ errno = 0;
+ if (pid != 1) {
+ errno = ESRCH;
+ return -1;
+ }
+ switch (request) {
+
+ case RPT_SINGLESTEP:{
+ Exception_context *ctx;
+
+ if (CannotRestart == 1) {
+ setErrno (EIO);
+ return -1;
+ }
+
+ if ((ctx = GetExceptCtx (currentTargetThread)) != NULL) {
+ Single_Step (ctx->ctx);
+ rtems_semaphore_release (ctx->semaphoreId);
+ return 0;
+ }
+ break;
+ }
+
+ case RPT_PEEKTEXT:
+ case RPT_PEEKDATA:{
+ diag = safeMemRead (addr, &data, sizeof data);
+ if (diag == 0)
+ return data;
+ mem_error:
+ return -1;
+ }
+
+ case RPT_POKETEXT:{
+ diag = safeMemWrite (&data, addr, sizeof data);
+
+ /*
+ * We must flush the INSTR and DATA cache to be sure the
+ * opcode modification is taken into account, because
+ * the breakpoint opcode is written via the data cache
+ * while execution code is fetched via the instruction
+ * cache
+ */
+
+ if (diag == 0) {
+ copyback_data_cache_and_invalidate_instr_cache (addr, sizeof data);
+ return 0;
+ }
+ goto mem_error;
+ }
+ case RPT_POKEDATA:{
+ diag = safeMemWrite (&data, addr, sizeof data);
+ if (diag == 0)
+ return 0;
+ goto mem_error;
+ }
+ case RPT_CONT:{
+ Exception_context *ctx;
+
+ if (CannotRestart == 1) {
+ setErrno (EIO);
+ return -1;
+ }
+
+ ctx = GetExceptCtx (currentTargetThread);
+ if (ctx == NULL)
+ ctx = GetExceptCtx (debugId);
+
+ if (ctx != NULL) {
+
+ if (!isRdbgException (ctx)) {
+ CannotRestart = 1;
+ setErrno (EIO);
+ return -1;
+ }
+
+ assert (data == 0);
+ assert (ExitForSingleStep == 0);
+
+ rtems_semaphore_release (ctx->semaphoreId);
+ }
+ rtems_semaphore_release (serializeSemId);
+ return 0;
+ }
+
+ case RPT_ATTACH:
+ return 0;
+
+ case RPT_DETACH:{
+ Exception_context *ctx;
+
+ if (NbExceptCtx || NbSerializedCtx) {
+ ctx = FirstCtx;
+ rtems_task_delete (eventTaskId);
+ rtems_semaphore_delete (serializeSemId);
+ rtems_semaphore_delete (wakeupEventSemId);
+ }
+ return 0;
+ }
+
+ case RPT_GETREGS:{
+ Exception_context *ctx;
+
+ if ((ctx = GetExceptCtx (currentTargetThread)) != NULL) {
+ CtxToRegs (ctx->ctx, (xdr_regs *) addr);
+ return 0;
+ }
+ break;
+ }
+
+ case RPT_SETREGS:{
+ Exception_context *ctx;
+
+ if ((ctx = GetExceptCtx (currentTargetThread)) != NULL) {
+ RegsToCtx ((xdr_regs *) addr, ctx->ctx);
+ return 0;
+ }
+ break;
+ }
+
+ case RPT_READTEXT:
+ case RPT_READDATA:{
+ diag = safeMemRead (addr, addr2, data);
+ if (diag == 0)
+ return 0;
+ goto mem_error;
+ }
+ case RPT_WRITETEXT:
+ case RPT_WRITEDATA:{
+ diag = safeMemWrite (addr2, addr, data);
+ if (diag == 0)
+ return 0;
+ goto mem_error;
+ }
+
+ case RPT_GETTARGETTHREAD:
+ if (!NbExceptCtx) {
+ errno = EBUSY;
+ return -1;
+ }
+ return currentTargetThread;
+
+ case RPT_SETTARGETTHREAD:
+ if (!NbExceptCtx) {
+ errno = EBUSY;
+ return -1;
+ }
+ currentTargetThread = data;
+ return 0;
+
+ case RPT_GETTHREADNAME:{
+ return TgtGetThreadName (NULL, (unsigned) (data), (char *) addr);
+ }
+
+ case RPT_THREADLIST:{
+ int count = TgtThreadList (NULL, (unsigned *) addr, UTHREAD_MAX
+ * sizeof (unsigned));
+ if (count < 0) {
+ errno = EINVAL;
+ return -1;
+ }
+ return count;
+ }
+
+ case RPT_SETTHREADREGS:{
+ Exception_context *ctx;
+ CPU_Exception_frame Ectx;
+ Thread_Control *thread;
+ rtems_id id;
+
+ rtems_task_ident (RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &id);
+ if (data == (unsigned) id)
+ break;
+
+ if ((ctx = GetExceptCtx (data)) != NULL) {
+ RegsToCtx ((xdr_regs *) addr, ctx->ctx);
+ return 0;
+ }
+ thread = Thread_Get_RDBG ((Objects_Id) (data));
+ if (thread != NULL) {
+ RegsToCtx ((xdr_regs *) addr, &Ectx);
+ set_ctx_thread (thread, &Ectx);
+ return 0;
+ }
+ break;
+ }
+
+ case RPT_GETTHREADREGS:{
+ Exception_context *ctx;
+ CPU_Exception_frame Ectx;
+ Thread_Control *thread;
+ rtems_id id;
+
+ rtems_task_ident (RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &id);
+ if (data == (unsigned) id) {
+ justSaveContext = 1;
+ enterRdbg ();
+ CtxToRegs (&(SavedContext), (xdr_regs *) addr);
+ return 0;
+ }
+
+ if ((ctx = GetExceptCtx (data)) != NULL) {
+ CtxToRegs (ctx->ctx, (xdr_regs *) addr);
+ return 0;
+ }
+ thread = Thread_Get_RDBG ((Objects_Id) (data));
+ if (thread != NULL) {
+ get_ctx_thread (thread, &Ectx);
+ CtxToRegs (&Ectx, (xdr_regs *) addr);
+ return 0;
+ }
+ break;
+ }
+
+ case RPT_KILL:
+ TotalReboot = 1;
+ return 0;
+
+ case RPT_TRACEME:
+ case RPT_PEEKUSER:
+ case RPT_POKEUSER:
+ case RPT_GETFPREGS:
+ case RPT_SETFPREGS:
+ case RPT_GETFPAREGS:
+ case RPT_SETFPAREGS:
+ case RPT_SYSCALL:
+ case RPT_DUMPCORE:
+ case RPT_GETUCODE:
+ case RPT_THREADSUSPEND:
+ case RPT_THREADRESUME:
+ case RPT_SETTHREADNAME:
+ default:
+ break;
+ }
+ errno = EINVAL;
+ return -1;
}