00001
00002
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
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
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
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