FreeCalypso > hg > freecalypso-reveng
annotate arm7dis/common.c @ 304:a46e191a980e
dsample-fw-disasm: Tx up/down functions located and analysed
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Sun, 06 Oct 2019 01:29:35 +0000 | 
| parents | c883e60df239 | 
| children | 
| rev | line source | 
|---|---|
| 
107
 
c883e60df239
arm7dis: README and header comments added
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents: 
87 
diff
changeset
 | 
1 /* | 
| 
 
c883e60df239
arm7dis: README and header comments added
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents: 
87 
diff
changeset
 | 
2 * Lean and mean ARM7TDMI disassembler | 
| 
 
c883e60df239
arm7dis: README and header comments added
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents: 
87 
diff
changeset
 | 
3 * Written by Spacefalcon the Outlaw | 
| 
 
c883e60df239
arm7dis: README and header comments added
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents: 
87 
diff
changeset
 | 
4 */ | 
| 
 
c883e60df239
arm7dis: README and header comments added
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents: 
87 
diff
changeset
 | 
5 | 
| 
86
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
6 #include <sys/types.h> | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
7 #include <sys/file.h> | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
8 #include <sys/stat.h> | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
9 #include <sys/mman.h> | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
10 #include <stdio.h> | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
11 #include <stdlib.h> | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
12 #include <unistd.h> | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
13 | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
14 char *binfilename; | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
15 u_char *filemap; | 
| 
87
 
f7fba8518fa2
armdis: skeleton compiles
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents: 
86 
diff
changeset
 | 
16 unsigned disasm_len, base_vma; | 
| 
86
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
17 | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
18 common_init(argc, argv, instr_size) | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
19 char **argv; | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
20 { | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
21 int fd; | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
22 struct stat st; | 
| 
87
 
f7fba8518fa2
armdis: skeleton compiles
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents: 
86 
diff
changeset
 | 
23 unsigned fileoff; | 
| 
86
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
24 | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
25 if (argc < 2 || argc > 5) { | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
26 fprintf(stderr, | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
27 "usage: %s binfile [file-offset [len [vaddr]]]\n", | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
28 argv[0]); | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
29 exit(1); | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
30 } | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
31 binfilename = argv[1]; | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
32 fd = open(binfilename, O_RDONLY); | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
33 if (fd < 0) { | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
34 perror(binfilename); | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
35 exit(1); | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
36 } | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
37 fstat(fd, &st); | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
38 if (!S_ISREG(st.st_mode)) { | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
39 fprintf(stderr, "error: %s is not a regular file\n", | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
40 binfilename); | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
41 exit(1); | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
42 } | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
43 if (argc > 2) | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
44 fileoff = strtoul(argv[2], 0, 0); | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
45 else | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
46 fileoff = 0; | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
47 if (fileoff > st.st_size) { | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
48 fprintf(stderr, | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
49 "error: specified file offset is past the end of file\n"); | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
50 exit(1); | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
51 } | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
52 if (argc > 3) { | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
53 disasm_len = strtoul(argv[3], 0, 0); | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
54 if (disasm_len > st.st_size - fileoff) { | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
55 fprintf(stderr, | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
56 "error: specified length is past the end of file\n"); | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
57 exit(1); | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
58 } | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
59 } else | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
60 disasm_len = st.st_size - fileoff; | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
61 if (disasm_len & (instr_size - 1)) { | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
62 fprintf(stderr, | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
63 "error: length of region to be disassembled must be a multiple of %d bytes\n", | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
64 instr_size); | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
65 exit(1); | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
66 } | 
| 
87
 
f7fba8518fa2
armdis: skeleton compiles
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents: 
86 
diff
changeset
 | 
67 filemap = mmap(NULL, (size_t) disasm_len, PROT_READ, MAP_PRIVATE, fd, | 
| 
 
f7fba8518fa2
armdis: skeleton compiles
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents: 
86 
diff
changeset
 | 
68 (off_t) fileoff); | 
| 
86
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
69 if (filemap == MAP_FAILED) { | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
70 perror("mmap"); | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
71 exit(1); | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
72 } | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
73 close(fd); | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
74 if (argc > 4) | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
75 base_vma = strtoul(argv[4], 0, 0); | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
76 else | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
77 base_vma = fileoff; | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
78 return(0); | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
79 } | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
80 | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
81 unsigned | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
82 get_u16(ptr) | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
83 u_char *ptr; | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
84 { | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
85 return ptr[0] | ptr[1] << 8; | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
86 } | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
87 | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
88 unsigned | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
89 get_u32(ptr) | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
90 u_char *ptr; | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
91 { | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
92 return ptr[0] | ptr[1] << 8 | ptr[2] << 16 | ptr[3] << 24; | 
| 
 
537cf2245d98
beginning of ARM7 disassembler
 
Michael Spacefalcon <msokolov@ivan.Harhan.ORG> 
parents:  
diff
changeset
 | 
93 } | 
