blob: 86eff316cc908b83c46dc7c94caec89ec654846b [file] [log] [blame]
Mark Dykes50297972024-03-15 12:49:22 -05001#
2# Copyright (c) 2025 Arm Limited. All rights reserved.
3#
4# SPDX-License-Identifier: BSD-3-Clause
5#
6
7def gen_field_specification(fsname,argfieldname,argendbit,argstartbit,argdefval,argnumfield):
8 faafile = open(fsname, "w")
9 hline = "struct fuzzer_arg_def {\n"
10 hline += " int regnum;\n"
11 hline += " char smcname[FUZZ_MAX_NAME_SIZE];\n"
12 hline += " char smcargname[FUZZ_MAX_NAME_SIZE];\n"
13 hline += " int bitw;\n"
14 hline += " int bitst;\n"
15 hline += " char bnames[FUZZ_MAX_NAME_SIZE];\n"
16 hline += " uint64_t defval;\n"
17 hline += " uint64_t **contval;\n"
18 hline += " int *contvallen;\n"
19 hline += " int contlen;\n"
20 hline += " int *conttype;\n"
21 hline += " int genvalues;\n"
22 hline += "};\n\n"
23 hline += "struct fuzzer_arg_arange {\n"
24 hline += " int arg_span[2];\n"
25 hline += "};\n"
26 faafile.write(hline)
27 hline = "struct fuzzer_arg_def fuzzer_arg_array[] = {\n"
28 faafile.write(hline)
29 ifield = 1
30 for sn in argfieldname:
31 for an in argfieldname[sn]:
32 for fn in argfieldname[sn][an]:
33 if not ifield:
34 hline = ",\n"
35 hline += "{ .bitw = "
36 else:
37 hline = "{ .bitw = "
38 hline += str((int(argendbit[sn][an][fn]) - int(argstartbit[sn][an][fn])) + 1)
39 hline += ", .bitst = " + argstartbit[sn][an][fn] + ", .bnames = \""
40 hline += fn + "\", .defval = " + argdefval[sn][an][fn] + ", .regnum = "
41 hline += argnumfield[sn][an][fn] + ", .smcname = \"" + sn + "\", .smcargname = \""
42 hline += an + "\" }"
43 ifield = 0
44 faafile.write(hline)
45 hline = " };\n\n"
46 faafile.write(hline)
47 lc = 0
48 hline = "struct fuzzer_arg_arange fuzzer_arg_array_lst[] = {" + "\n"
49 faafile.write(hline)
50 ifield = 1
51 for sn in argfieldname:
52 for ag in argfieldname[sn]:
53 if not ifield:
54 hline = ",\n"
55 hline += "{ .arg_span = {" + str(lc) + "," + str(len(argfieldname[sn][ag]) - 1 + lc) + "} }"
56 else :
57 hline = "{ .arg_span = {" + str(lc) + "," + str(len(argfieldname[sn][ag]) - 1 + lc) + "} }"
58 ifield = 0
59 faafile.write(hline)
60 lc = lc + len(argfieldname[sn][ag])
61 hline = " };\n\n"
62 faafile.write(hline)
63 hline = "int fuzzer_arg_array_range[] = {" + "\n"
64 faafile.write(hline)
65 lc = 0
66 ifield = 1
67 hline = ""
68 for sn in argfieldname:
69 if not ifield:
70 hline += ","
71 hline += str(len(argfieldname[sn]))
72 else:
73 hline += str(len(argfieldname[sn]))
74 lc = lc + 1
75 ifield = 0
76 if lc == 20:
77 hline += "\n"
78 lc = 0
79 hline += "};\n\n"
80 faafile.write(hline)
81 hline = "int fuzzer_arg_array_start[] = {" + "\n"
82 faafile.write(hline)
83 lc = 0
84 ifield = 1
85 cargs = 0
86 hline = ""
87 for sn in argfieldname:
88 if not ifield:
89 hline += ","
90 hline += str(cargs)
91 else:
92 hline += str(cargs)
93 cargs = cargs + len(argfieldname[sn])
94 lc = lc + 1
95 ifield = 0
96 if lc == 20:
97 hline += "\n"
98 lc = 0
99 hline += "};\n\n"
100 faafile.write(hline)
101 hline = "int fuzzer_fieldarg[] = {" + "\n"
102 faafile.write(hline)
103 blist = 1
104 hline = "\t"
105 for sn in argnumfield:
106 for ag in argnumfield[sn]:
107 for fn in argnumfield[sn][ag]:
108 if not blist:
109 hline += ",\n\t"
110 blist = 0
111 hline += sn + "_ARG" + str(argnumfield[sn][ag][fn])
112 faafile.write(hline)
113 hline = ""
114 hline = "\n};"
115 faafile.write(hline)
116 hline = "\n\n"
117 faafile.write(hline)
118 hline = "int fuzzer_fieldcall[] = {" + "\n"
119 faafile.write(hline)
120 blist = 1
121 hline = "\t"
122 for sn in argnumfield:
123 for ag in argnumfield[sn]:
124 for fn in argnumfield[sn][ag]:
125 if not blist:
126 hline += ",\n\t"
127 blist = 0
128 hline += sn
129 faafile.write(hline)
130 hline = ""
131 hline = "\n};"
132 faafile.write(hline)
133 hline = "\n\n"
134 faafile.write(hline)
135 hline = "int fuzzer_fieldfld[] = {" + "\n"
136 faafile.write(hline)
137 blist = 1
138 hline = "\t"
139 for sn in argnumfield:
140 for ag in argnumfield[sn]:
141 for fn in argnumfield[sn][ag]:
142 if not blist:
143 hline += ",\n\t"
144 blist = 0
145 hline += sn + "_ARG" + str(argnumfield[sn][ag][fn]) + "_" + fn.upper() + "_CNT"
146 faafile.write(hline)
147 hline = ""
148 hline = "\n};"
149
150 faafile.write(hline)
151
152 faafile.close()