decode.c

Go to the documentation of this file.
00001 /* 
00002  * decode.c for mdb -- decodes a Minix system call
00003  */
00004 #include "mdb.h"
00005 #ifdef SYSCALLS_SUPPORT
00006 #include <stdio.h>
00007 #include <stdlib.h>
00008 #include <string.h>
00009 #include <fcntl.h>
00010 #include <sys/stat.h>
00011 #define ptrace mdbtrace
00012 #include <sys/ptrace.h>
00013 #include <minix/type.h>
00014 #include <minix/callnr.h>
00015 #include "proto.h"
00016 
00017 FORWARD _PROTOTYPE( void get_message, (message *m, unsigned bx) );
00018 FORWARD _PROTOTYPE( void get_data, (char *s, unsigned bx, int cnt) );
00019 
00020 PRIVATE message sent;
00021 PRIVATE message recv;
00022 PRIVATE unsigned saved_addr;
00023 PRIVATE int last_call;
00024 
00025 #define NOSYS           0
00026 #define NOP             1
00027 
00028 #define _M1             0x0100
00029 #define _M2             0x0200
00030 #define _M3             0x0400
00031 #define _M4             0x0800
00032 
00033 #define _M13            0x0500
00034 
00035 #define M1_I1           (_M1|1)
00036 #define M1_I2           (_M1|2)
00037 #define M1_I3           (_M1|4)
00038 #define M1_P1           (_M1|8)
00039 #define M1_P2           (_M1|16)
00040 #define M1_P3           (_M1|32)
00041 
00042 #define M2_I1           (_M2|1)
00043 #define M2_I2           (_M2|2)
00044 #define M2_I3           (_M2|4)
00045 #define M2_L1           (_M2|8)
00046 #define M2_L2           (_M2|16)
00047 #define M2_P1           (_M2|32)
00048 
00049 #define M3_I1           (_M3|1)
00050 #define M3_I2           (_M3|2)
00051 #define M3_P1           (_M3|4)
00052 #define M3_C1           (_M3|8)
00053 
00054 #define M4_L1           (_M4|1)
00055 #define M4_L2           (_M4|2)
00056 #define M4_L3           (_M4|4)
00057 #define M4_L4           (_M4|8)
00058 #define M4_L5           (_M4|16)
00059 
00060 #define M13_OPEN        (_M13|1)
00061 
00062 #define M1_I12          (M1_I1|M1_I2)
00063 #define M1_NAME1        (M1_I1|M1_P1)
00064 #define M1_NAME2        (M1_I2|M1_P2)
00065 #define M1_2NAMES       (M1_I1|M1_P1|M1_I2|M1_P2)
00066 #define M1_SIGACTION    (M1_I2|M1_P1|M1_P2|M1_P3)
00067 
00068 #define M2_IOCTL        (M2_I1|M2_I3|M2_L1|M2_L2)
00069 #define M2_4P           (M2_I1|M2_I2|M2_L1|M2_L2)
00070 #define M2_SIGRETURN    (M2_I2|M2_L1|M2_P1)
00071 #define M2_SIGPROC      (M2_I1|M2_L1)
00072 #define M2_UTIME        (M2_I1|M2_I2|M2_L1|M2_L2|M2_P1)
00073 
00074 #define M3_LOAD         (M3_I1|M3_C1)
00075 
00076 struct decode_system {
00077         int syscall;
00078         unsigned int sflag;
00079         unsigned int rflag;
00080         char *name;
00081 } decode[NCALLS] = {    
00082         0,              NOSYS,          NOP,    NULL,
00083         EXIT,           M1_I1,          NOP,    "EXIT",
00084         FORK,           NOP,            NOP,    "FORK",
00085         READ,           M1_I12,         NOP,    "READ",
00086         WRITE,          M1_I12,         NOP,    "WRITE",
00087         OPEN,           M13_OPEN,       NOP,    "OPEN",
00088         CLOSE,          M1_I1,          NOP,    "CLOSE",
00089         WAIT,           NOP,            M2_I1,  "WAIT",
00090         CREAT,          M3_LOAD,        NOP,    "CREAT",
00091         LINK,           M1_2NAMES,      NOP,    "LINK",
00092         UNLINK,         M3_LOAD,        NOP,    "UNLINK",
00093         WAITPID,        M1_I1,          M2_I1,  "WAITPID",
00094         CHDIR,          M3_LOAD,        NOP,    "CHDIR",
00095         TIME,           NOP,            M2_L1,  "TIME",
00096         MKNOD,          M1_NAME1,       NOP,    "MKNOD",
00097         CHMOD,          M3_LOAD,        NOP,    "CHMOD",
00098         CHOWN,          M1_NAME1,       NOP,    "CHOWN",
00099         BRK,            M1_P1,          M2_P1,  "BRK",
00100         STAT,           M1_NAME1,       NOP,    "STAT",
00101         LSEEK,          M1_I1,          NOP,    "LSEEK",
00102         GETPID,         NOP,            NOP,    "GETPID",
00103         MOUNT,          M1_2NAMES,      NOP,    "MOUNT",
00104         UMOUNT,         M3_LOAD,        NOP,    "UMOUNT",
00105         SETUID,         M1_I1,          NOP,    "SETUID",
00106         GETUID,         NOP,            NOP,    "GETUID",
00107         STIME,          M2_L1,          NOP,    "STIME",
00108         PTRACE,         M2_4P,          NOP,    "PTRACE",
00109         ALARM,          M1_I1,          NOP,    "ALARM",
00110         FSTAT,          M1_I1,          NOP,    "FSTAT",
00111         PAUSE,          NOP,            NOP,    "PAUSE",
00112         UTIME,          M2_UTIME,       NOP,    "UTIME",
00113         31,             NOSYS,          NOP,    NULL,
00114         32,             NOSYS,          NOP,    NULL,
00115         ACCESS,         M3_LOAD,        NOP,    "ACCESS",
00116         34,             NOSYS,          NOP,    NULL,
00117         35,             NOSYS,          NOP,    NULL,
00118         SYNC,           NOP,            NOP,    "SYNC",
00119         KILL,           M1_I12,         NOP,    "KILL",
00120         RENAME,         M1_2NAMES,      NOP,    "RENAME",
00121         MKDIR,          M1_NAME1,       NOP,    "MKDIR",
00122         RMDIR,          M3_LOAD,        NOP,    "RMDIR",
00123         DUP,            NOP,            NOP,    "DUP",
00124         PIPE,           NOP,            M1_I12, "PIPE",
00125         TIMES,          M4_L5,          NOP,    "TIMES",
00126         44,             NOSYS,          NOP,    NULL,
00127         45,             NOSYS,          NOP,    NULL,
00128         SETGID,         M1_I1,          NOP,    "SETGID",
00129         GETGID,         NOP,            NOP,    "GETGID",
00130         SIGNAL,         NOP,            NOP,    "SIGNAL",
00131         49,             NOSYS,          NOP,    NULL,
00132         50,             NOSYS,          NOP,    NULL,
00133         51,             NOSYS,          NOP,    NULL,
00134         52,             NOSYS,          NOP,    NULL,
00135         53,             NOSYS,          NOP,    NULL,
00136         IOCTL,          M2_IOCTL,       M2_IOCTL,       "IOCTL",
00137         FCNTL,          M1_I12,         NOP,    "FCNTL",
00138 #if     ENABLE_SYMLINK
00139         RDLINK,         M1_NAME1,       NOP,    "RDLINK",
00140         SLINK,          M1_NAME1,       NOP,    "SLINK",
00141         LSTAT,          M1_NAME1,       NOP,    "LSTAT",
00142 #else
00143         56,             NOSYS,          NOP,    NULL,
00144         57,             NOSYS,          NOP,    NULL,
00145         58,             NOSYS,          NOP,    NULL,
00146 #endif
00147         EXEC,           M1_NAME1,       NOP,    "EXEC",
00148         UMASK,          M1_I1,          NOP,    "UMASK",
00149         CHROOT,         M3_LOAD,        NOP,    "CHROOT",
00150         SETSID,         NOP,            NOP,    "SETSID",
00151         GETPGRP,        NOP,            NOP,    "GETPGRP",
00152         KSIG,           NOSYS,          NOP,    "KSIG",
00153         UNPAUSE,        NOSYS,          NOP,    "UNPAUSE",
00154         66,             NOSYS,          NOP,    NULL,
00155         REVIVE,         NOSYS,          NOP,    "REVIVE",
00156         TASK_REPLY,     NOSYS,          NOP,    "TASK_REPLY",
00157         69,             NOSYS,          NOP,    NULL,
00158         70,             NOSYS,          NOP,    NULL,
00159         SIGACTION,      M1_SIGACTION,   NOP,    "SIGACTION",
00160         SIGSUSPEND,     M2_L1,          NOP,    "SIGSUSPEND",
00161         SIGPENDING,     NOP,            M2_L1,  "SIGPENDING",
00162         SIGPROCMASK,    M2_SIGPROC,     NOP,    "SIGPROCMASK",
00163         SIGRETURN,      M2_SIGRETURN,   NOP,    "SIGRETURN",
00164         REBOOT,         M1_I1,          NOP,    "REBOOT"
00165 };
00166 
00167 PRIVATE void get_message(m,bx)
00168 message *m;
00169 unsigned bx;
00170 {
00171   unsigned addr;
00172   int i;
00173   long buffer[ MESS_SIZE/4 + 1 ];
00174 
00175   addr = bx;  
00176   for (i = 0; i< sizeof(buffer)/4; i++)
00177         buffer[i] = ptrace(T_GETDATA,curpid,
00178                 (long) (addr+i*4) ,0L);
00179 
00180   memcpy(m,buffer,MESS_SIZE);
00181 
00182 }
00183 
00184 PRIVATE void get_data(s, bx, cnt)
00185 char *s;
00186 unsigned bx;
00187 int cnt;
00188 {
00189   unsigned addr;
00190   int i,nl;
00191   long buffer[PATH_MAX/4 + 1];
00192 
00193   addr = bx;
00194   nl = (cnt / 4) + 1;  
00195   for (i = 0; i< nl; i++)
00196         buffer[i] = ptrace(T_GETDATA, curpid, (long) (addr+i*4) ,0L);
00197 
00198   memcpy(s, buffer, cnt);
00199 }
00200 
00201 
00202 PUBLIC void decode_result()
00203 {
00204 
00205    /* Update message */
00206    get_message(&recv,saved_addr);
00207    Printf("result=%d\n", recv.m_type);
00208 
00209    if (last_call < 0 || last_call >NCALLS) {
00210         Printf("Bad call in decode_result\n");
00211         return;
00212    }     
00213 
00214    switch (decode[last_call].rflag) {
00215    case NOP:    
00216                 return; 
00217                 break;
00218    case M1_I12:
00219                 Printf("m1_l1=%d m1_i2=%d ",recv.m1_i1,recv.m1_i2);
00220                 break;
00221    case M2_IOCTL:
00222                 decode_ioctl('R',&recv);
00223                 break;
00224    case M2_P1:  
00225                 Printf("m2_p1=%lx ",(unsigned long)recv.m2_p1);
00226                 break;
00227    case M2_L1:  
00228                 Printf("m2_l1=%lx ",recv.m2_l1);
00229                 break;
00230    case M2_I1:
00231                 Printf("m2_i1=%x ",recv.m2_i1);
00232                 break;
00233    default:     
00234                 Printf("rflag=%d ",decode[last_call].rflag);
00235                 break;
00236    }
00237    Printf("\n");        
00238 }
00239 
00240 
00241 void decode_message(bx)
00242 unsigned bx;
00243 {
00244 int t; 
00245 int slen;
00246 unsigned int flag;
00247 char path[PATH_MAX];
00248 
00249    /* Save address of message */
00250    saved_addr = bx;
00251    get_message(&sent,bx);
00252 
00253    t = sent.m_type;
00254    
00255    if ( t <= 0 || t >= NCALLS ) {
00256         Printf("Bad call - not in range\n");
00257         last_call = 0;
00258         return;
00259    }
00260 
00261    flag = decode[t].sflag;
00262 
00263    if ( flag == NOSYS) {
00264         Printf("Bad call - not in system\n");
00265         last_call = 0;
00266         return;
00267    }
00268    else 
00269         last_call = t; 
00270 
00271    Printf(" type %s (%d) ", decode[last_call].name, last_call);
00272 
00273    switch (flag) {
00274    case NOP:    
00275                 break;
00276    case M1_I1:  
00277    case M1_I12: 
00278                 Printf("i1=%d ",sent.m1_i1);
00279                 if ( flag == M1_I1) break;
00280    case M1_I2:  
00281                 Printf("i2=%d ",sent.m1_i2);
00282                 break;
00283    case M1_P1:  
00284                 Printf("p1=%lx ",(unsigned long)sent.m1_p1);
00285                 break;
00286    case M1_NAME1:
00287    case M1_2NAMES:
00288                 slen = sent.m1_i1;
00289                 get_data(path, (unsigned long) sent.m1_p1, slen);
00290                 path[slen] = '\0';
00291                 Printf("s1=%s ",path);
00292                 if ( flag == M1_NAME1) break;
00293                 slen = sent.m1_i2;
00294                 get_data(path, (unsigned long) sent.m1_p2, slen);
00295                 path[slen] = '\0';
00296                 Printf("s2=%s ",path);
00297                 break;
00298    case M2_UTIME:
00299                 if ( sent.m2_i1 == 0 )
00300                         slen = sent.m2_i2;
00301                 else
00302                         slen = sent.m2_i1;
00303                 get_data(path, (unsigned long) sent.m2_p1, slen);
00304                 path[slen] = '\0';
00305                 Printf("p1=%s ",path);
00306                 if ( sent.m2_i1 != 0 )
00307                         Printf("l1=%lx l2=%lx ",sent.m2_l1,sent.m2_l2);
00308                 break;
00309    case M1_SIGACTION:
00310                 Printf("m1_i2=%d p1=%lx p2=%lx p3=%lx\n",
00311                         sent.m1_i2,
00312                         (unsigned long)sent.m1_p1,
00313                         (unsigned long)sent.m1_p2,
00314                         (unsigned long)sent.m1_p3);
00315                 break;
00316    case M2_4P:  Printf("m2_i1=%d m2_i2=%d m2_l1=%lx m2_l2=%lx ",
00317                         sent.m2_i1,sent.m2_i2,sent.m2_l1,sent.m2_l2);
00318                 break;
00319    case M2_L1:
00320                 Printf("m2_l1=%ld ",sent.m2_l1);
00321                 break;
00322    case M2_IOCTL:
00323                 decode_ioctl('S',&sent);
00324                 break;
00325    case M2_SIGRETURN:
00326                 Printf("m2_i2=%d l1=%lx p1=%lx ",
00327                         sent.m2_i2,sent.m2_l1,
00328                         (unsigned long)sent.m1_p1);
00329                 break;
00330    case M2_SIGPROC:
00331                 Printf("m2_i1=%d l1=%lx ", sent.m2_i1,sent.m2_l1);
00332                 break;
00333    case M13_OPEN:
00334                 if (sent.m1_i2 & O_CREAT) {
00335                         slen = sent.m1_i1;
00336                         get_data(path, (unsigned long) sent.m1_p1, slen);
00337                         path[slen] = '\0';
00338                         Printf("s1=%s ",path);
00339                         break;
00340                 }               
00341                 /* fall to M3_LOAD */
00342    case M3_LOAD:
00343                 slen = sent.m3_i1;
00344                 if ( slen <= M3_STRING) 
00345                         strncpy(path,sent.m3_ca1,M3_STRING);
00346                 else
00347                         get_data(path, (unsigned long) sent.m3_ca1, slen);
00348                 path[slen] = '\0';
00349                 Printf("m3_name=%s ",path);
00350                 break;
00351    case M4_L5:
00352                 Printf("m4_l5=%ld ",sent.m4_l5);
00353                 break;
00354    default:     Printf("sflag=%d ",decode[last_call].sflag);
00355                 break;
00356    }
00357    Printf("\n");
00358 }
00359 
00360 #endif /* SYSCALLS_SUPPORT */

Generated on Fri Apr 14 22:56:59 2006 for minix by  doxygen 1.4.6