FreeCalypso > hg > freecalypso-reveng
annotate arm7dis/common.c @ 403:50c0fac9a4a8
compal/boot/c118-dfboot.disasm: new analysis
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Sun, 15 Jan 2023 00:54:33 +0000 | 
| parents | c883e60df239 | 
| children | 
| rev | line source | 
|---|---|
| 107 
c883e60df239
arm7dis: README and header comments added
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
87diff
changeset | 1 /* | 
| 
c883e60df239
arm7dis: README and header comments added
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
87diff
changeset | 2 * Lean and mean ARM7TDMI disassembler | 
| 
c883e60df239
arm7dis: README and header comments added
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
87diff
changeset | 3 * Written by Spacefalcon the Outlaw | 
| 
c883e60df239
arm7dis: README and header comments added
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
87diff
changeset | 4 */ | 
| 
c883e60df239
arm7dis: README and header comments added
 Michael Spacefalcon <msokolov@ivan.Harhan.ORG> parents: 
87diff
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: 
86diff
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: 
86diff
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: 
86diff
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: 
86diff
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 } | 
