root/tools/gensig_vxworks.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. usage
  2. bits
  3. main

   1 #include <stdlib.h>
   2 #include <stdio.h>
   3 #include <stdint.h>
   4 #include <string.h>
   5 #include <unistd.h>
   6 
   7 
   8 typedef struct {
   9     uint32_t inst;
  10     uint32_t mask;
  11     uint32_t ignore;
  12     char cmd[8];
  13 } Instr;
  14 
  15 /*
  16 Cond    0 C     I       Opcode                          S       Rn      Rd      Operand2                
  17 Cond    0 0 0 0 0 0                                     A       S       Rd      Rn      Rs      1 0 0 1 Rm
  18 Cond    0 0 0 0 1                               U       A       S       RdHi    RdLo    Rs      1 0 0 1 Rm
  19 Cond    0 0 0 1 0                               B                       Rn      Rd      0 0 0 0 1 0 0 1 Rm
  20 Cond    0 1     I       P       U       B       W       L       Rn      Rd      Offset          
  21 Cond    1 0 0           P       U       S       W       L       Rn      Register List                   
  22 Cond    0 0 0           P       U       1       W       L       Rn      Rd      Offsetl 1 S H 1 Offset2
  23 Cond    0 0 0           P       U       0       W       L       Rn      Rd      0 0 0 0 1 S H 1 Rm
  24 Cond    1 0 1           L       Offset                                                          
  25 Cond    0 0 0 1                 0 0 1 0                         1111    1111    1111    0 0 0 1 Rn
  26 Cond    1 1 0           P       U       N       W       L       Rn      CRd     CPNum   Offset  
  27 Cond    1 1 1 0                 Opl                             CRn     CRd     CPNum   Op2  0  CRm
  28 Cond    1 1 1 0                 Opl                     L       CRn     Rd      CPNum   Op2  1  CRm
  29 Cond    1 1 1 1                 SWI Number                                                              
  30 */
  31 
  32     /* ARM instructions */ /*
  33     {0xe1a00000, 0xffffffff, "nop"},
  34     {0x012FFF10, 0x0ffffff0, "bx%c\t%0-3r"},
  35     {0x00000090, 0x0fe000f0, "mul%c%20's\t%16-19r, %0-3r, %8-11r"},
  36     {0x00200090, 0x0fe000f0, "mla%c%20's\t%16-19r, %0-3r, %8-11r, %12-15r"},
  37     {0x01000090, 0x0fb00ff0, "swp%c%22'b\t%12-15r, %0-3r, [%16-19r]"},
  38     {0x00800090, 0x0fa000f0, "%22?sumull%c%20's\t%12-15r, %16-19r, %0-3r, %8-11r"},
  39     {0x00a00090, 0x0fa000f0, "%22?sumlal%c%20's\t%12-15r, %16-19r, %0-3r, %8-11r"},
  40     {0x00000090, 0x0e100090, "str%c%6's%h\t%12-15r, %s"},
  41     {0x00100090, 0x0e100090, "ldr%c%6's%h\t%12-15r, %s"},
  42     {0x00000000, 0x0de00000, "and%c%20's\t%12-15r, %16-19r, %o"},
  43     {0x00200000, 0x0de00000, "eor%c%20's\t%12-15r, %16-19r, %o"},
  44     {0x00400000, 0x0de00000, "sub%c%20's\t%12-15r, %16-19r, %o"},
  45     {0x00600000, 0x0de00000, "rsb%c%20's\t%12-15r, %16-19r, %o"},
  46     {0x00800000, 0x0de00000, "add%c%20's\t%12-15r, %16-19r, %o"},
  47     {0x00a00000, 0x0de00000, "adc%c%20's\t%12-15r, %16-19r, %o"},
  48     {0x00c00000, 0x0de00000, "sbc%c%20's\t%12-15r, %16-19r, %o"},
  49     {0x00e00000, 0x0de00000, "rsc%c%20's\t%12-15r, %16-19r, %o"},
  50     {0x0120f000, 0x0db6f000, "msr%c\t%22?scpsr%C, %o"},
  51     {0x010f0000, 0x0fbf0fff, "mrs%c\t%12-15r, %22?scpsr"},
  52     {0x01000000, 0x0de00000, "tst%c%p\t%16-19r, %o"},
  53     {0x01200000, 0x0de00000, "teq%c%p\t%16-19r, %o"},
  54     {0x01400000, 0x0de00000, "cmp%c%p\t%16-19r, %o"},
  55     {0x01600000, 0x0de00000, "cmn%c%p\t%16-19r, %o"},
  56     {0x01800000, 0x0de00000, "orr%c%20's\t%12-15r, %16-19r, %o"},
  57     {0x01a00000, 0x0de00000, "mov%c%20's\t%12-15r, %o"},
  58     {0x01c00000, 0x0de00000, "bic%c%20's\t%12-15r, %16-19r, %o"},
  59     {0x01e00000, 0x0de00000, "mvn%c%20's\t%12-15r, %o"},
  60     {0x04000000, 0x0e100000, "str%c%22'b%t\t%12-15r, %a"},
  61     {0x06000000, 0x0e100ff0, "str%c%22'b%t\t%12-15r, %a"},
  62     {0x04000000, 0x0c100010, "str%c%22'b%t\t%12-15r, %a"},
  63     {0x06000010, 0x0e000010, "undefined"},
  64     {0x04100000, 0x0c100000, "ldr%c%22'b%t\t%12-15r, %a"},
  65     {0x08000000, 0x0e100000, "stm%c%23?id%24?ba\t%16-19r%21'!, %m%22'^"},
  66     {0x08100000, 0x0e100000, "ldm%c%23?id%24?ba\t%16-19r%21'!, %m%22'^"},
  67     {0x0a000000, 0x0e000000, "b%24'l%c\t%b"},
  68     {0x0f000000, 0x0f000000, "swi%c\t%0-23x"},
  69 */
  70 
  71 /*
  72 Instr instrs[] = {
  73 //    {0x00000000 , 0x00000000, 0x00000000 },   // adc
  74     {0x00800000 , 0x0df00000, 0x02000000 },     // add
  75     {0x00000000 , 0x0de00000, 0x02000000 },     // and
  76     {0x0a000000 , 0x0e000000, 0x00ffffff },     // b, bl
  77     {0x01c00000 , 0x0de00000, 0x02000000 },     // bic
  78 //    {0x00000000 , 0x00000000, 0x00000000 },   // bkpt
  79 //    {0x00000000 , 0x00000000, 0x00000000 },   // blx
  80 //    {0x00000000 , 0x00000000, 0x00000000 },   // blx
  81 //    {0x00000000 , 0x00000000, 0x00000000 },   // bx
  82 //    {0x00000000 , 0x00000000, 0x00000000 },   // cdp
  83 //    {0x00000000 , 0x00000000, 0x00000000 },   // clz
  84     {0x01700000 , 0x0df00000, 0x02000000 },     // cmn
  85     {0x01500000 , 0x0df00000, 0x02000000 },     // cmp
  86 //    {0x00000000 , 0x00000000, 0x00000000 },   // eor
  87 //    {0x00000000 , 0x00000000, 0x00000000 },   // ldc
  88 //    {0x00000000 , 0x00000000, 0x00000000 },   // ldm
  89 //    {0x00000000 , 0x00000000, 0x00000000 },   // ldm
  90 //    {0x00000000 , 0x00000000, 0x00000000 },   // ldm
  91 /// {0x00000000 , 0x00000000, 0x00000000 },     // ldr
  92 /// {0x00000000 , 0x00000000, 0x00000000 },     // ldrb
  93 /// {0x00000000 , 0x00000000, 0x00000000 },     // ldrbt
  94 /// {0x00000000 , 0x00000000, 0x00000000 },     // ldrh
  95 /// {0x00000000 , 0x00000000, 0x00000000 },     // ldrsb
  96 /// {0x00000000 , 0x00000000, 0x00000000 },     // ldrsh
  97 /// {0x00000000 , 0x00000000, 0x00000000 },     // ldrt
  98 //    {0x00000000 , 0x00000000, 0x00000000 },   // mcr
  99 //    {0x00000000 , 0x00000000, 0x00000000 },   // mla
 100     {0x01a00000 , 0x0de00000, 0x02000000 },     // mov
 101 //    {0x00000000 , 0x00000000, 0x00000000 },   // mrc
 102 //    {0x00000000 , 0x00000000, 0x00000000 },   // mrs
 103 //    {0x00000000 , 0x00000000, 0x00000000 },   // msr
 104 //    {0x00000000 , 0x00000000, 0x00000000 },   // mul
 105 //    {0x00000000 , 0x00000000, 0x00000000 },   // mvn
 106 //    {0x00000000 , 0x00000000, 0x00000000 },   // orr
 107 //    {0x00000000 , 0x00000000, 0x00000000 },   // rsb
 108 //    {0x00000000 , 0x00000000, 0x00000000 },   // rsc
 109 //    {0x00000000 , 0x00000000, 0x00000000 },   // scb
 110 //    {0x00000000 , 0x00000000, 0x00000000 },   // smlal
 111 //    {0x00000000 , 0x00000000, 0x00000000 },   // smull
 112 //    {0x00000000 , 0x00000000, 0x00000000 },   // src
 113 //    {0x00000000 , 0x00000000, 0x00000000 },   // stm
 114 //    {0x00000000 , 0x00000000, 0x00000000 },   // stm
 115 /// {0x00000000 , 0x00000000, 0x00000000 },     // str
 116 /// {0x00000000 , 0x00000000, 0x00000000 },     // strb
 117 /// {0x00000000 , 0x00000000, 0x00000000 },     // strbt
 118 /// {0x00000000 , 0x00000000, 0x00000000 },     // strh
 119 /// {0x00000000 , 0x00000000, 0x00000000 },     // strt
 120     {0x00400000 , 0x0de00000, 0x02000000 },     // sub
 121 //    {0x00000000 , 0x00000000, 0x00000000 },   // swi
 122 //    {0x00000000 , 0x00000000, 0x00000000 },   // swp
 123 //    {0x00000000 , 0x00000000, 0x00000000 },   // swpb
 124 //    {0x00000000 , 0x00000000, 0x00000000 },   // teq
 125     {0x01100000 , 0x0df00000, 0x02000000 },     // tst
 126 //    {0x00000000 , 0x00000000, 0x00000000 },   // umlal
 127 //    {0x00000000 , 0x00000000, 0x00000000 },   // umull
 128 
 129     { 0, 0, 0 }
 130 };
 131 // */
 132 
 133 /*
 134 Instr instrs[] = {
 135     {0x00a00000 , 0x0de00000, 0x02000fff, "adc" },
 136     {0x00800000 , 0x0de00000, 0x02000fff, "add" },
 137     {0x00000000 , 0x0de00000, 0x02000fff, "and" },
 138     {0x0a000000 , 0x0e000000, 0x00ffffff, "b, bl" },
 139     {0x01c00000 , 0x0de00000, 0x02000fff, "bic" },
 140     {0xe1200070 , 0xfff000f0, 0x000fff0f, "bkpt" },
 141     {0xfa000000 , 0xfe000000, 0x00ffffff, "blx" },
 142     {0x01200030 , 0x0ff000f0, 0x000fff00, "blx" },
 143     {0x01200010 , 0x0ff000f0, 0x000fff00, "bx" },
 144     {0x0e000000 , 0x0f000010, 0x00000000, "cdp" },
 145     {0x01600010 , 0x0ff000f0, 0x000f0f00, "clz" },
 146     {0x01700000 , 0x0df00000, 0x0200ffff, "cmn" },
 147     {0x01500000 , 0x0df00000, 0x0200ffff, "cmp" },
 148     {0x00200000 , 0x0de00000, 0x02000fff, "eor" },
 149     {0x0c100000 , 0x0e100000, 0x000000ff, "ldc" },
 150     {0x08100000 , 0x0e500000, 0x00000000, "ldm" },
 151     {0x08500000 , 0x0e708000, 0x00000000, "ldm" },
 152     {0x08508000 , 0x0e508000, 0x00000000, "ldm" },
 153     {0x04100000 , 0x0c500000, 0x02000fff, "ldr" },
 154     {0x04500000 , 0x0c500000, 0x02000fff, "ldrb" },
 155     {0x04700000 , 0x0f700000, 0x02000fff, "ldrbt" },
 156     {0x001000b0 , 0x0e1000f0, 0x00400f0f, "ldrh" },
 157     {0x001000d0 , 0x0e1000f0, 0x00400f0f, "ldrsb" },
 158     {0x001000f0 , 0x0e1000f0, 0x00400f0f, "ldrsh" },
 159     {0x04300000 , 0x0d700000, 0x02000fff, "ldrt" },
 160     {0x0e000010 , 0x0f100010, 0x00000000, "mcr" },
 161     {0x00200090 , 0x0fe000f0, 0x00000000, "mla" },
 162     {0x01a00000 , 0x0de00000, 0x020f0fff, "mov" },
 163     {0x0e100010 , 0x0f100010, 0x00000000, "mrc" },
 164     {0x01000000 , 0x0fb00000, 0x000f0fff, "mrs" },
 165     {0x03200000 , 0x0fb00000, 0x0000f000, "msr" },
 166     {0x01200000 , 0x0fb000f0, 0x0000ff00, "msr" },
 167     {0x00000090 , 0x0fe000f0, 0x0000f000, "mul" },
 168     {0x01e00000 , 0x0de00000, 0x020f0fff, "mvn" },
 169     {0x01800000 , 0x0de00000, 0x02000fff, "orr" },
 170     {0x00600000 , 0x0de00000, 0x02000fff, "rsb" },
 171     {0x00e00000 , 0x0de00000, 0x02000fff, "rsc" },
 172     {0x00c00000 , 0x0de00000, 0x02000fff, "sbc" },
 173     {0x00e00090 , 0x0fe000f0, 0x00000000, "smlal" },
 174     {0x00c00090 , 0x0fe000f0, 0x00000000, "smull" },
 175     {0x0c000000 , 0x0e100000, 0x000000ff, "stc" },
 176     {0x08000000 , 0x0e500000, 0x00000000, "stm" },
 177     {0x08400000 , 0x0e700000, 0x00000000, "stm" },
 178     {0x04000000 , 0x0c500000, 0x02000fff, "str" },
 179     {0x04400000 , 0x0c500000, 0x02000fff, "strb" },
 180     {0x04600000 , 0x0d700000, 0x02000fff, "strbt" },
 181     {0x000000b0 , 0x0e1000f0, 0x00400f0f, "strh" },
 182     {0x04200000 , 0x0d700000, 0x02000fff, "strt" },
 183     {0x00400000 , 0x0de00000, 0x02000fff, "sub" },
 184     {0x0f000000 , 0x0f000000, 0x00000000, "swi" },
 185     {0x01000090 , 0x0ff000f0, 0x00000f00, "swp" },
 186     {0x01400090 , 0x0ff000f0, 0x00000f00, "swpb" },
 187     {0x01300000 , 0x0df00000, 0x0200ffff, "teq" },
 188     {0x01100000 , 0x0df00000, 0x0200ffff, "tst" },
 189     {0x00a00090 , 0x0fe000f0, 0x00000000, "umlal" },
 190     {0x00800090 , 0x0fe000f0, 0x00000000, "umull" },
 191     { 0, 0, 0 , "" }
 192 };
 193 */
 194 
 195 //*
 196 Instr instrs[] = {
 197 //  {0x00a00000 , 0x0de00000, 0x02000000, "adc" },
 198     {0x00800000 , 0x0de00000, 0x02000000, "add" },
 199     {0x00000000 , 0x0de00000, 0x02000000, "and" },
 200     {0x0a000000 , 0x0e000000, 0x00ffffff, "b, bl" },
 201 //  {0x01c00000 , 0x0de00000, 0x02000000, "bic" },
 202 //  {0xe1200070 , 0xfff000f0, 0x00000000, "bkpt" },
 203 //  {0xfa000000 , 0xfe000000, 0x00ffffff, "blx" },
 204 //  {0x01200030 , 0x0ff000f0, 0x00000000, "blx" },
 205 //  {0x01200010 , 0x0ff000f0, 0x00000000, "bx" },
 206 //  {0x0e000000 , 0x0f000010, 0x00000000, "cdp" },
 207 //  {0x01600010 , 0x0ff000f0, 0x00000000, "clz" },
 208 //  {0x01700000 , 0x0df00000, 0x02000000, "cmn" },
 209     {0x01500000 , 0x0df00000, 0x02000000, "cmp" },
 210 //  {0x00200000 , 0x0de00000, 0x02000000, "eor" },
 211 //  {0x0c100000 , 0x0e100000, 0x00000000, "ldc" },
 212 //  {0x08100000 , 0x0e500000, 0x00000000, "ldm" },
 213 //  {0x08500000 , 0x0e708000, 0x00000000, "ldm" },
 214 //  {0x08508000 , 0x0e508000, 0x00000000, "ldm" },
 215     {0x04100000 , 0x0c500000, 0x02000000, "ldr" },
 216 //  {0x04500000 , 0x0c500000, 0x02000000, "ldrb" },
 217 //  {0x04700000 , 0x0f700000, 0x02000000, "ldrbt" },
 218 //  {0x001000b0 , 0x0e1000f0, 0x00400000, "ldrh" },
 219 //  {0x001000d0 , 0x0e1000f0, 0x00400000, "ldrsb" },
 220 //  {0x001000f0 , 0x0e1000f0, 0x00400000, "ldrsh" },
 221 //  {0x04300000 , 0x0d700000, 0x02000000, "ldrt" },
 222 //  {0x0e000010 , 0x0f100010, 0x00000000, "mcr" },
 223 //  {0x00200090 , 0x0fe000f0, 0x00000000, "mla" },
 224     {0x01a00000 , 0x0de00000, 0x02000000, "mov" },
 225 //  {0x0e100010 , 0x0f100010, 0x00000000, "mrc" },
 226 //  {0x01000000 , 0x0fb00000, 0x00000000, "mrs" },
 227 //  {0x03200000 , 0x0fb00000, 0x00000000, "msr" },
 228 //  {0x01200000 , 0x0fb000f0, 0x00000000, "msr" },
 229   {0x00000090 , 0x0fe000f0, 0x00000000, "mul" },
 230 //  {0x01e00000 , 0x0de00000, 0x02000000, "mvn" },
 231 //  {0x01800000 , 0x0de00000, 0x02000000, "orr" },
 232   {0x00600000 , 0x0de00000, 0x02000000, "rsb" },
 233   {0x00e00000 , 0x0de00000, 0x02000000, "rsc" },
 234 //  {0x00c00000 , 0x0de00000, 0x02000000, "sbc" },
 235 //  {0x00e00090 , 0x0fe000f0, 0x00000000, "smlal" },
 236 //  {0x00c00090 , 0x0fe000f0, 0x00000000, "smull" },
 237 //  {0x0c000000 , 0x0e100000, 0x00000000, "stc" },
 238 //  {0x08000000 , 0x0e500000, 0x00000000, "stm" },
 239 //  {0x08400000 , 0x0e700000, 0x00000000, "stm" },
 240     {0x04000000 , 0x0c500000, 0x02000000, "str" },
 241 //  {0x04400000 , 0x0c500000, 0x02000000, "strb" },
 242 //  {0x04600000 , 0x0d700000, 0x02000000, "strbt" },
 243 //  {0x000000b0 , 0x0e1000f0, 0x00400000, "strh" },
 244 //  {0x04200000 , 0x0d700000, 0x02000000, "strt" },
 245     {0x00400000 , 0x0de00000, 0x02000000, "sub" },
 246 //  {0x0f000000 , 0x0f000000, 0x00000000, "swi" },
 247 //  {0x01000090 , 0x0ff000f0, 0x00000000, "swp" },
 248 //  {0x01400090 , 0x0ff000f0, 0x00000000, "swpb" },
 249 //  {0x01300000 , 0x0df00000, 0x02000000, "teq" },
 250     {0x01100000 , 0x0df00000, 0x02000000, "tst" },
 251 //  {0x00a00090 , 0x0fe000f0, 0x00000000, "umlal" },
 252 //  {0x00800090 , 0x0fe000f0, 0x00000000, "umull" },
 253     { 0, 0, 0 , "" }
 254 };
 255 // */
 256 
 257 void usage()
 258 {
 259     printf("gensig <primary> <base> <proc_name> <proc_vaddr> <proc_size>\n");
 260     exit(1);
 261 }
 262 
 263 int bits (uint32_t v) {
 264         int i, res=0;
 265 
 266         for (i=0; i<32; ++i)
 267                 res+=(v>>i)&1;
 268 
 269         return res;
 270 }
 271 
 272 int main(int argc, char **argv)
 273 {
 274     char *proc_name;
 275     uint32_t buf[1024];
 276     FILE *f;
 277     uint32_t base;
 278     uint32_t pos;
 279     uint32_t size;
 280     int i,j;
 281     int wcount;
 282     char tbuf[1024];
 283     int finish;
 284 
 285     if (argc != 6)
 286         usage();
 287 
 288     f = fopen(argv[1], "r+b");
 289 
 290     if (f == NULL)
 291         usage();
 292 
 293     base = strtoul(argv[2], NULL, 0);
 294     proc_name = argv[3];
 295     pos = strtoul(argv[4], NULL, 0) - base;
 296     size = strtoul(argv[5], NULL, 0);
 297     wcount = 0;
 298 
 299     fseek(f, pos, SEEK_SET);
 300     i = fread(buf, 4, size, f);
 301 
 302     printf("static FuncSig func_sig_%s[] = {\n",proc_name);
 303 
 304     finish = 0;
 305     for (i=0;i<size;++i){
 306         tbuf[0]=0;
 307         for (j=0;instrs[j].inst | instrs[j].mask;j++){
 308             if ((buf[i] & instrs[j].mask) == instrs[j].inst){
 309                 if (!tbuf[0]) 
 310                     sprintf(tbuf, "\t{ %3d, 0x%08x, 0x%08x }, //", i, buf[i] & ~instrs[j].ignore, ~instrs[j].ignore);
 311                 sprintf(tbuf+strlen(tbuf), " %s:%d:0x%08X", instrs[j].cmd, bits(instrs[j].mask), buf[i]);
 312                 wcount++;
 313                 if ((buf[i] == 0xe1a0f00e) /* "mov pc,lr" aka "ret" */
 314                         && (size*100/wcount) > 75){
 315                     sprintf(tbuf+strlen(tbuf), "\t/* RET found, stopping... */");
 316                     finish = 1;
 317                 }
 318                         //break;
 319             }
 320         }
 321         if (tbuf[0]) 
 322             printf("%s\n", tbuf);
 323         if (finish)
 324             break;
 325     }
 326     printf("\t{ -1, -1, -1 },\n");
 327     printf("\t/* %d/%d */\n",wcount, size);
 328     printf("};\n\n");
 329 
 330     fclose(f);
 331     return 0;
 332 }
 333 

/* [<][>][^][v][top][bottom][index][help] */