comparison arm7dis/common.c @ 86:537cf2245d98

beginning of ARM7 disassembler
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Fri, 28 Mar 2014 07:01:27 +0000
parents
children f7fba8518fa2
comparison
equal deleted inserted replaced
85:3c420895f68f 86:537cf2245d98
1 #include <sys/types.h>
2 #include <sys/file.h>
3 #include <sys/stat.h>
4 #include <sys/mman.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <unistd.h>
8
9 char *binfilename;
10 u_char *filemap;
11 u_long disasm_len, base_vma;
12
13 common_init(argc, argv, instr_size)
14 char **argv;
15 {
16 int fd;
17 struct stat st;
18 u_long fileoff;
19
20 if (argc < 2 || argc > 5) {
21 fprintf(stderr,
22 "usage: %s binfile [file-offset [len [vaddr]]]\n",
23 argv[0]);
24 exit(1);
25 }
26 binfilename = argv[1];
27 fd = open(binfilename, O_RDONLY);
28 if (fd < 0) {
29 perror(binfilename);
30 exit(1);
31 }
32 fstat(fd, &st);
33 if (!S_ISREG(st.st_mode)) {
34 fprintf(stderr, "error: %s is not a regular file\n",
35 binfilename);
36 exit(1);
37 }
38 if (argc > 2)
39 fileoff = strtoul(argv[2], 0, 0);
40 else
41 fileoff = 0;
42 if (fileoff > st.st_size) {
43 fprintf(stderr,
44 "error: specified file offset is past the end of file\n");
45 exit(1);
46 }
47 if (argc > 3) {
48 disasm_len = strtoul(argv[3], 0, 0);
49 if (disasm_len > st.st_size - fileoff) {
50 fprintf(stderr,
51 "error: specified length is past the end of file\n");
52 exit(1);
53 }
54 } else
55 disasm_len = st.st_size - fileoff;
56 if (disasm_len & (instr_size - 1)) {
57 fprintf(stderr,
58 "error: length of region to be disassembled must be a multiple of %d bytes\n",
59 instr_size);
60 exit(1);
61 }
62 filemap = mmap(NULL, disasm_len, PROT_READ, MAP_PRIVATE, fd, fileoff);
63 if (filemap == MAP_FAILED) {
64 perror("mmap");
65 exit(1);
66 }
67 close(fd);
68 if (argc > 4)
69 base_vma = strtoul(argv[4], 0, 0);
70 else
71 base_vma = fileoff;
72 return(0);
73 }
74
75 unsigned
76 get_u16(ptr)
77 u_char *ptr;
78 {
79 return ptr[0] | ptr[1] << 8;
80 }
81
82 unsigned
83 get_u32(ptr)
84 u_char *ptr;
85 {
86 return ptr[0] | ptr[1] << 8 | ptr[2] << 16 | ptr[3] << 24;
87 }