]> Zhao Yanbai Git Server - minix.git/commitdiff
Message type for PM_PTRACE
authorLionel Sambuc <lionel@minix3.org>
Tue, 13 May 2014 08:07:12 +0000 (10:07 +0200)
committerLionel Sambuc <lionel@minix3.org>
Mon, 28 Jul 2014 15:05:35 +0000 (17:05 +0200)
Change-Id: I19bbd5faa5c7511cda0239109b2ac55869c47b96

include/minix/callnr.h
include/minix/ipc.h
lib/libc/sys-minix/ptrace.c
servers/pm/forkexit.c
servers/pm/trace.c

index 8bcea61a160977a0faa3ad88476892d69821205c..5f15e58ff52e27aa90f1bb4838a1bcc0a5394bb7 100644 (file)
 /* Field names for the exit(2) call. */
 #define PM_EXIT_STATUS         m1_i1   /* int */
 
-/* Field names for the ptrace(2) call. */
-#define PM_PTRACE_PID          m2_i1   /* pid_t */
-#define PM_PTRACE_REQ          m2_i2   /* int */
-#define PM_PTRACE_ADDR         m2_l1   /* long */
-#define PM_PTRACE_DATA         m2_l2   /* long */
-
 /* Field names for the sysuname(2) call. */
 #define PM_SYSUNAME_REQ                m1_i1   /* int */
 #define PM_SYSUNAME_FIELD      m1_i2   /* int */
index 532b344087ef496534dcfc806988f7b8ae8a9319..f3f1075afa8e8878080c24f1ec6de111816ec53c 100644 (file)
@@ -154,6 +154,23 @@ typedef struct {
 } mess_lc_pm_itimer;
 _ASSERT_MSG_SIZE(mess_lc_pm_itimer);
 
+typedef struct {
+       pid_t pid;
+       int req;
+       vir_bytes addr;
+       long data;
+
+       uint8_t padding[40];
+} mess_lc_pm_ptrace;
+_ASSERT_MSG_SIZE(mess_lc_pm_ptrace);
+
+typedef struct {
+       long data;
+
+       uint8_t padding[52];
+} mess_pm_lc_ptrace;
+_ASSERT_MSG_SIZE(mess_pm_lc_ptrace);
+
 typedef struct {
        time_t sec;
 
@@ -932,6 +949,7 @@ typedef struct {
                mess_fs_vfs_readwrite   m_fs_vfs_readwrite;
 
                mess_lc_pm_itimer       m_lc_pm_itimer;
+               mess_lc_pm_ptrace       m_lc_pm_ptrace;
                mess_lc_pm_time         m_lc_pm_time;
                mess_lc_pm_waitpid      m_lc_pm_waitpid;
 
@@ -967,6 +985,7 @@ typedef struct {
                mess_lsys_vfs_copyfd    m_lsys_vfs_copyfd;
                mess_lsys_vfs_mapdriver m_lsys_vfs_mapdriver;
 
+               mess_pm_lc_ptrace       m_pm_lc_ptrace;
                mess_pm_lc_time         m_pm_lc_time;
                mess_pm_lc_waitpid      m_pm_lc_waitpid;
 
index 77d8279eaf809727f94f5fa7e0f0d408d616e7b6..9dd63a9d3aa3e301a3f530fbe74db840aa39f77a 100644 (file)
@@ -10,16 +10,16 @@ int ptrace(int req, pid_t pid, void *addr, int data)
   message m;
 
   memset(&m, 0, sizeof(m));
-  m.PM_PTRACE_PID = pid;
-  m.PM_PTRACE_REQ = req;
-  m.PM_PTRACE_ADDR = addr;
-  m.PM_PTRACE_DATA = data;
+  m.m_lc_pm_ptrace.pid = pid;
+  m.m_lc_pm_ptrace.req = req;
+  m.m_lc_pm_ptrace.addr = addr;
+  m.m_lc_pm_ptrace.data = data;
   if (_syscall(PM_PROC_NR, PM_PTRACE, &m) < 0) return(-1);
 
   /* There was no error, but -1 is a legal return value.  Clear errno if
    * necessary to distinguish this case.  _syscall has set errno to nonzero
    * for the error case.
    */
-  if (m.PM_PTRACE_DATA == -1) errno = 0;
-  return(m.PM_PTRACE_DATA);
+  if (m.m_pm_lc_ptrace.data == -1) errno = 0;
+  return(m.m_pm_lc_ptrace.data);
 }
index 93f6dd032ef78474849d35a00cc54b18fd759eae..85ffb6f361d4f4f76d2ad29f32b5fa502b68226b 100644 (file)
@@ -437,7 +437,7 @@ int dump_core;                      /* flag indicating whether to dump core */
   if (rmp->mp_flags & TRACE_EXIT)
   {
        /* Wake up the tracer, completing the ptrace(T_EXIT) call */
-       mproc[rmp->mp_tracer].mp_reply.PM_PTRACE_DATA = 0;
+       mproc[rmp->mp_tracer].mp_reply.m_pm_lc_ptrace.data = 0;
        reply(rmp->mp_tracer, OK);
   }
 
index 850b16acb0c249901e581812f9c86a7b920a8105..6d11a4762fc15e98f932837bdbdd7baeb8bfe03b 100644 (file)
@@ -44,7 +44,7 @@ int do_trace()
   struct ptrace_range pr;
   int i, r, req;
 
-  req = m_in.PM_PTRACE_REQ;
+  req = m_in.m_lc_pm_ptrace.req;
 
   /* The T_OK call is made by the child fork of the debugger before it execs
    * the process to be traced. The T_ATTACH call is made by the debugger itself
@@ -55,11 +55,11 @@ int do_trace()
        if (mp->mp_tracer != NO_TRACER) return(EBUSY);
 
        mp->mp_tracer = mp->mp_parent;
-       mp->mp_reply.PM_PTRACE_DATA = 0;
+       mp->mp_reply.m_pm_lc_ptrace.data = 0;
        return(OK);
 
   case T_ATTACH:       /* attach to an existing process */
-       if ((child = find_proc(m_in.PM_PTRACE_PID)) == NULL) return(ESRCH);
+       if ((child = find_proc(m_in.m_lc_pm_ptrace.pid)) == NULL) return(ESRCH);
        if (child->mp_flags & EXITING) return(ESRCH);
 
        /* For non-root processes, user and group ID must match. */
@@ -88,7 +88,7 @@ int do_trace()
 
        sig_proc(child, SIGSTOP, TRUE /*trace*/, FALSE /* ksig */);
 
-       mp->mp_reply.PM_PTRACE_DATA = 0;
+       mp->mp_reply.m_pm_lc_ptrace.data = 0;
        return(OK);
 
   case T_STOP:         /* stop the process */
@@ -99,19 +99,19 @@ int do_trace()
 
   case T_READB_INS:    /* special hack for reading text segments */
        if (mp->mp_effuid != SUPER_USER) return(EPERM);
-       if ((child = find_proc(m_in.PM_PTRACE_PID)) == NULL) return(ESRCH);
+       if ((child = find_proc(m_in.m_lc_pm_ptrace.pid)) == NULL) return(ESRCH);
        if (child->mp_flags & EXITING) return(ESRCH);
 
-       r = sys_trace(req, child->mp_endpoint, m_in.PM_PTRACE_ADDR,
-               &m_in.PM_PTRACE_DATA);
+       r = sys_trace(req, child->mp_endpoint, m_in.m_lc_pm_ptrace.addr,
+               &m_in.m_lc_pm_ptrace.data);
        if (r != OK) return(r);
 
-       mp->mp_reply.PM_PTRACE_DATA = m_in.PM_PTRACE_DATA;
+       mp->mp_reply.m_pm_lc_ptrace.data = m_in.m_lc_pm_ptrace.data;
        return(OK);
 
   case T_WRITEB_INS:   /* special hack for patching text segments */
        if (mp->mp_effuid != SUPER_USER) return(EPERM);
-       if ((child = find_proc(m_in.PM_PTRACE_PID)) == NULL) return(ESRCH);
+       if ((child = find_proc(m_in.m_lc_pm_ptrace.pid)) == NULL) return(ESRCH);
        if (child->mp_flags & EXITING) return(ESRCH);
 
 #if 0
@@ -125,18 +125,18 @@ int do_trace()
        child->mp_ctime = 0;
 #endif
 
-       r = sys_trace(req, child->mp_endpoint, m_in.PM_PTRACE_ADDR,
-               &m_in.PM_PTRACE_DATA);
+       r = sys_trace(req, child->mp_endpoint, m_in.m_lc_pm_ptrace.addr,
+               &m_in.m_lc_pm_ptrace.data);
        if (r != OK) return(r);
 
-       mp->mp_reply.PM_PTRACE_DATA = m_in.PM_PTRACE_DATA;
+       mp->mp_reply.m_pm_lc_ptrace.data = m_in.m_lc_pm_ptrace.data;
        return(OK);
   }
 
   /* All the other calls are made by the tracing process to control execution
    * of the child. For all these calls, the child must be stopped.
    */
-  if ((child = find_proc(m_in.PM_PTRACE_PID)) == NULL) return(ESRCH);
+  if ((child = find_proc(m_in.m_lc_pm_ptrace.pid)) == NULL) return(ESRCH);
   if (child->mp_flags & EXITING) return(ESRCH);
   if (child->mp_tracer != who_p) return(ESRCH);
   if (!(child->mp_flags & TRACE_STOPPED)) return(EBUSY);
@@ -147,9 +147,9 @@ int do_trace()
 
        /* Defer the exit if the traced process has an VFS call pending. */
        if (child->mp_flags & VFS_CALL)
-               child->mp_exitstatus = (int) m_in.PM_PTRACE_DATA; /* save it */
+               child->mp_exitstatus = m_in.m_lc_pm_ptrace.data; /* save it */
        else
-               exit_proc(child, (int) m_in.PM_PTRACE_DATA,
+               exit_proc(child, m_in.m_lc_pm_ptrace.data,
                        FALSE /*dump_core*/);
 
        /* Do not reply to the caller until VFS has processed the exit
@@ -158,15 +158,15 @@ int do_trace()
        return(SUSPEND);
 
   case T_SETOPT:       /* set trace options */
-       child->mp_trace_flags = m_in.PM_PTRACE_DATA;
+       child->mp_trace_flags = m_in.m_lc_pm_ptrace.data;
 
-       mp->mp_reply.PM_PTRACE_DATA = 0;
+       mp->mp_reply.m_pm_lc_ptrace.data = 0;
        return(OK);
 
   case T_GETRANGE:
   case T_SETRANGE:     /* get/set range of values */
-       r = sys_datacopy(who_e, (vir_bytes) m_in.PM_PTRACE_ADDR,
-                       SELF, (vir_bytes) &pr, (phys_bytes) sizeof(pr));
+       r = sys_datacopy(who_e, m_in.m_lc_pm_ptrace.addr, SELF, (vir_bytes)&pr,
+               (phys_bytes)sizeof(pr));
        if (r != OK) return(r);
 
        if (pr.pr_space != TS_INS && pr.pr_space != TS_DATA) return(EINVAL);
@@ -183,11 +183,11 @@ int do_trace()
 
        if (r != OK) return(r);
 
-       mp->mp_reply.PM_PTRACE_DATA = 0;
+       mp->mp_reply.m_pm_lc_ptrace.data = 0;
        return(OK);
 
   case T_DETACH:       /* detach from traced process */
-       if (m_in.PM_PTRACE_DATA < 0 || m_in.PM_PTRACE_DATA >= _NSIG)
+       if (m_in.m_lc_pm_ptrace.data < 0 || m_in.m_lc_pm_ptrace.data >= _NSIG)
                return(EINVAL);
 
        child->mp_tracer = NO_TRACER;
@@ -200,8 +200,8 @@ int do_trace()
                }
        }
 
-       if (m_in.PM_PTRACE_DATA > 0) {          /* issue signal */
-               sig_proc(child, (int) m_in.PM_PTRACE_DATA, TRUE /*trace*/,
+       if (m_in.m_lc_pm_ptrace.data > 0) {             /* issue signal */
+               sig_proc(child, m_in.m_lc_pm_ptrace.data, TRUE /*trace*/,
                        FALSE /* ksig */);
        }
 
@@ -216,11 +216,11 @@ int do_trace()
   case T_RESUME: 
   case T_STEP:
   case T_SYSCALL:      /* resume execution */
-       if (m_in.PM_PTRACE_DATA < 0 || m_in.PM_PTRACE_DATA >= _NSIG)
+       if (m_in.m_lc_pm_ptrace.data < 0 || m_in.m_lc_pm_ptrace.data >= _NSIG)
                return(EINVAL);
 
-       if (m_in.PM_PTRACE_DATA > 0) {          /* issue signal */
-               sig_proc(child, (int) m_in.PM_PTRACE_DATA, FALSE /*trace*/,
+       if (m_in.m_lc_pm_ptrace.data > 0) {             /* issue signal */
+               sig_proc(child, m_in.m_lc_pm_ptrace.data, FALSE /*trace*/,
                        FALSE /* ksig */);
        }
 
@@ -229,7 +229,7 @@ int do_trace()
         */
        for (i = 1; i < _NSIG; i++) {
                if (sigismember(&child->mp_sigtrace, i)) {
-                       mp->mp_reply.PM_PTRACE_DATA = 0;
+                       mp->mp_reply.m_pm_lc_ptrace.data = 0;
                        return(OK);
                }
        }
@@ -240,11 +240,11 @@ int do_trace()
 
        break;
   }
-  r = sys_trace(req, child->mp_endpoint, m_in.PM_PTRACE_ADDR,
-       &m_in.PM_PTRACE_DATA);
+  r = sys_trace(req, child->mp_endpoint, m_in.m_lc_pm_ptrace.addr,
+       &m_in.m_lc_pm_ptrace.data);
   if (r != OK) return(r);
 
-  mp->mp_reply.PM_PTRACE_DATA = m_in.PM_PTRACE_DATA;
+  mp->mp_reply.m_pm_lc_ptrace.data = m_in.m_lc_pm_ptrace.data;
   return(OK);
 }