CHDK_DE Vorschauversion  Trunk Rev. 6014
 Alle Datenstrukturen Dateien Funktionen Variablen Typdefinitionen Aufzählungen Aufzählungswerte Makrodefinitionen
gensig_vxworks.c-Dateireferenz
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
+ Include-Abhängigkeitsdiagramm für gensig_vxworks.c:

gehe zum Quellcode dieser Datei

Datenstrukturen

struct  Instr
 

Funktionen

void usage ()
 
int bits (uint32_t v)
 
int main (int argc, char **argv)
 

Variablen

Instr instrs []
 

Dokumentation der Funktionen

int bits ( uint32_t  v)

Definiert in Zeile 263 der Datei gensig_vxworks.c.

263  {
264  int i, res=0;
265 
266  for (i=0; i<32; ++i)
267  res+=(v>>i)&1;
268 
269  return res;
270 }
int main ( int  argc,
char **  argv 
)

Definiert in Zeile 272 der Datei gensig_vxworks.c.

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<(int)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 }
void usage ( void  )

Definiert in Zeile 257 der Datei gensig_vxworks.c.

258 {
259  printf("gensig <primary> <base> <proc_name> <proc_vaddr> <proc_size>\n");
260  exit(1);
261 }

Variablen-Dokumentation

Instr instrs[]

Definiert in Zeile 196 der Datei gensig_vxworks.c.