xref: /aosp_15_r20/external/capstone/suite/fuzz/drivermc.c (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
1*9a0e4156SSadaf Ebrahimi #include <stdint.h>
2*9a0e4156SSadaf Ebrahimi #include <stdlib.h>
3*9a0e4156SSadaf Ebrahimi #include <stdio.h>
4*9a0e4156SSadaf Ebrahimi #include <string.h>
5*9a0e4156SSadaf Ebrahimi 
6*9a0e4156SSadaf Ebrahimi int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
7*9a0e4156SSadaf Ebrahimi 
8*9a0e4156SSadaf Ebrahimi #define MAX_INSTR_SIZE 64
9*9a0e4156SSadaf Ebrahimi #define MAX_LINE_SIZE 128
10*9a0e4156SSadaf Ebrahimi 
main(int argc,char ** argv)11*9a0e4156SSadaf Ebrahimi int main(int argc, char** argv)
12*9a0e4156SSadaf Ebrahimi {
13*9a0e4156SSadaf Ebrahimi     FILE * fp;
14*9a0e4156SSadaf Ebrahimi     uint8_t Data[MAX_INSTR_SIZE];
15*9a0e4156SSadaf Ebrahimi     char line[MAX_LINE_SIZE];
16*9a0e4156SSadaf Ebrahimi     size_t Size;
17*9a0e4156SSadaf Ebrahimi     char arch[MAX_LINE_SIZE];
18*9a0e4156SSadaf Ebrahimi     char mode[MAX_LINE_SIZE];
19*9a0e4156SSadaf Ebrahimi     unsigned int value;
20*9a0e4156SSadaf Ebrahimi     int i;
21*9a0e4156SSadaf Ebrahimi 
22*9a0e4156SSadaf Ebrahimi     if (argc < 2) {
23*9a0e4156SSadaf Ebrahimi         return 1;
24*9a0e4156SSadaf Ebrahimi     }
25*9a0e4156SSadaf Ebrahimi     for (i = 1; i < argc; i++) {
26*9a0e4156SSadaf Ebrahimi         //opens the file, get its size, and reads it into a buffer
27*9a0e4156SSadaf Ebrahimi         fp = fopen(argv[i], "rb");
28*9a0e4156SSadaf Ebrahimi         if (fp == NULL) {
29*9a0e4156SSadaf Ebrahimi             return 2;
30*9a0e4156SSadaf Ebrahimi         }
31*9a0e4156SSadaf Ebrahimi         printf("Trying %s\n", argv[i]);
32*9a0e4156SSadaf Ebrahimi         if (fgets(line, MAX_LINE_SIZE, fp) == NULL) {
33*9a0e4156SSadaf Ebrahimi             break;
34*9a0e4156SSadaf Ebrahimi         }
35*9a0e4156SSadaf Ebrahimi         if (line[0] == '#') {
36*9a0e4156SSadaf Ebrahimi             if (sscanf(line, "# %[^,], %[^,]", arch, mode) != 2) {
37*9a0e4156SSadaf Ebrahimi                 printf("Wrong mode %s\n", line);
38*9a0e4156SSadaf Ebrahimi                 return 1;
39*9a0e4156SSadaf Ebrahimi             }
40*9a0e4156SSadaf Ebrahimi             if (strcmp(arch, "CS_ARCH_X86") == 0 && strcmp(mode, "CS_MODE_32") == 0) {
41*9a0e4156SSadaf Ebrahimi                 Data[0] = 0;
42*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_X86") == 0 && strcmp(mode, "CS_MODE_64") == 0) {
43*9a0e4156SSadaf Ebrahimi                 Data[0] = 1;
44*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_ARM") == 0 && strcmp(mode, "CS_MODE_ARM") == 0) {
45*9a0e4156SSadaf Ebrahimi                 Data[0] = 2;
46*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_ARM") == 0 && strcmp(mode, "CS_MODE_THUMB") == 0) {
47*9a0e4156SSadaf Ebrahimi                 Data[0] = 3;
48*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_ARM") == 0 && strcmp(mode, "CS_MODE_ARM+CS_MODE_V8") == 0) {
49*9a0e4156SSadaf Ebrahimi                 Data[0] = 4;
50*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_ARM") == 0 && strcmp(mode, "CS_MODE_THUMB+CS_MODE_V8") == 0) {
51*9a0e4156SSadaf Ebrahimi                 Data[0] = 5;
52*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_ARM") == 0 && strcmp(mode, "CS_MODE_THUMB+CS_MODE_MCLASS") == 0) {
53*9a0e4156SSadaf Ebrahimi                 Data[0] = 6;
54*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_ARM64") == 0 && strcmp(mode, "0") == 0) {
55*9a0e4156SSadaf Ebrahimi                 Data[0] = 7;
56*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_MIPS") == 0 && strcmp(mode, "CS_MODE_MIPS32+CS_MODE_BIG_ENDIAN") == 0) {
57*9a0e4156SSadaf Ebrahimi                 Data[0] = 8;
58*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_MIPS") == 0 && strcmp(mode, "CS_MODE_MIPS32+CS_MODE_MICRO") == 0) {
59*9a0e4156SSadaf Ebrahimi                 Data[0] = 9;
60*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_MIPS") == 0 && strcmp(mode, "CS_MODE_MIPS64") == 0) {
61*9a0e4156SSadaf Ebrahimi                 Data[0] = 10;
62*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_MIPS") == 0 && strcmp(mode, "CS_MODE_MIPS32") == 0) {
63*9a0e4156SSadaf Ebrahimi                 Data[0] = 11;
64*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_MIPS") == 0 && strcmp(mode, "CS_MODE_MIPS64+CS_MODE_BIG_ENDIAN") == 0) {
65*9a0e4156SSadaf Ebrahimi                 Data[0] = 12;
66*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_MIPS") == 0 && strcmp(mode, "CS_MODE_MIPS32+CS_MODE_MICRO+CS_MODE_BIG_ENDIAN") == 0) {
67*9a0e4156SSadaf Ebrahimi                 Data[0] = 13;
68*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_MIPS") == 0 && strcmp(mode, "CS_MODE_MIPS32+CS_MODE_BIG_ENDIAN+CS_MODE_MICRO") == 0) {
69*9a0e4156SSadaf Ebrahimi                 Data[0] = 13;
70*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_PPC") == 0 && strcmp(mode, "CS_MODE_BIG_ENDIAN") == 0) {
71*9a0e4156SSadaf Ebrahimi                 Data[0] = 14;
72*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_SPARC") == 0 && strcmp(mode, "CS_MODE_BIG_ENDIAN") == 0) {
73*9a0e4156SSadaf Ebrahimi                 Data[0] = 15;
74*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_SPARC") == 0 && strcmp(mode, "CS_MODE_BIG_ENDIAN + CS_MODE_V9") == 0) {
75*9a0e4156SSadaf Ebrahimi                 Data[0] = 16;
76*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_SYSZ") == 0 && strcmp(mode, "0") == 0) {
77*9a0e4156SSadaf Ebrahimi                 Data[0] = 17;
78*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_XCORE") == 0 && strcmp(mode, "0") == 0) {
79*9a0e4156SSadaf Ebrahimi                 Data[0] = 18;
80*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_MIPS") == 0 && strcmp(mode, "CS_MODE_MIPS32R6+CS_MODE_BIG_ENDIAN") == 0) {
81*9a0e4156SSadaf Ebrahimi                 Data[0] = 19;
82*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_MIPS") == 0 && strcmp(mode, "CS_MODE_MIPS32R6+CS_MODE_MICRO+CS_MODE_BIG_ENDIAN") == 0) {
83*9a0e4156SSadaf Ebrahimi                 Data[0] = 20;
84*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_MIPS") == 0 && strcmp(mode, "CS_MODE_MIPS32R6") == 0) {
85*9a0e4156SSadaf Ebrahimi                 Data[0] = 21;
86*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_MIPS") == 0 && strcmp(mode, "CS_MODE_MIPS32R6+CS_MODE_MICRO") == 0) {
87*9a0e4156SSadaf Ebrahimi                 Data[0] = 22;
88*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_M68K") == 0 && strcmp(mode, "0") == 0) {
89*9a0e4156SSadaf Ebrahimi                 Data[0] = 23;
90*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_M680X") == 0 && strcmp(mode, "CS_MODE_M680X_6809") == 0) {
91*9a0e4156SSadaf Ebrahimi                 Data[0] = 24;
92*9a0e4156SSadaf Ebrahimi             } else if (strcmp(arch, "CS_ARCH_EVM") == 0 && strcmp(mode, "0") == 0) {
93*9a0e4156SSadaf Ebrahimi                 Data[0] = 25;
94*9a0e4156SSadaf Ebrahimi             } else {
95*9a0e4156SSadaf Ebrahimi                 printf("Unknown mode\n");
96*9a0e4156SSadaf Ebrahimi                 //fail instead of continue
97*9a0e4156SSadaf Ebrahimi                 return 1;
98*9a0e4156SSadaf Ebrahimi             }
99*9a0e4156SSadaf Ebrahimi         } else {
100*9a0e4156SSadaf Ebrahimi             printf("No mode\n");
101*9a0e4156SSadaf Ebrahimi             //fail instead of continue
102*9a0e4156SSadaf Ebrahimi             return 1;
103*9a0e4156SSadaf Ebrahimi         }
104*9a0e4156SSadaf Ebrahimi 
105*9a0e4156SSadaf Ebrahimi         while(1) {
106*9a0e4156SSadaf Ebrahimi             if (fgets(line, MAX_LINE_SIZE, fp) == NULL) {
107*9a0e4156SSadaf Ebrahimi                 break;
108*9a0e4156SSadaf Ebrahimi             }
109*9a0e4156SSadaf Ebrahimi             Size = 1;
110*9a0e4156SSadaf Ebrahimi             // we start line at offset 0 and Data buffer at offset 1
111*9a0e4156SSadaf Ebrahimi             // since Data[0] is option : arch + mode
112*9a0e4156SSadaf Ebrahimi             while (sscanf(line+(Size-1)*5, "0x%02x", &value) == 1) {
113*9a0e4156SSadaf Ebrahimi                 Data[Size] = value;
114*9a0e4156SSadaf Ebrahimi                 Size++;
115*9a0e4156SSadaf Ebrahimi                 if (line[(Size-1)*5-1] != ',') {
116*9a0e4156SSadaf Ebrahimi                     //end of pattern
117*9a0e4156SSadaf Ebrahimi                     break;
118*9a0e4156SSadaf Ebrahimi                 } else if (MAX_LINE_SIZE < (Size-1)*5) {
119*9a0e4156SSadaf Ebrahimi                     printf("Line overflow\n");
120*9a0e4156SSadaf Ebrahimi                     return 1;
121*9a0e4156SSadaf Ebrahimi                 }
122*9a0e4156SSadaf Ebrahimi             }
123*9a0e4156SSadaf Ebrahimi             //lauch fuzzer
124*9a0e4156SSadaf Ebrahimi             LLVMFuzzerTestOneInput(Data, Size);
125*9a0e4156SSadaf Ebrahimi         }
126*9a0e4156SSadaf Ebrahimi         fclose(fp);
127*9a0e4156SSadaf Ebrahimi     }
128*9a0e4156SSadaf Ebrahimi     return 0;
129*9a0e4156SSadaf Ebrahimi }
130*9a0e4156SSadaf Ebrahimi 
131