blob: d351552dd8843ebd45699e926b0623649f3a6446 [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
7import re
8import copy
9import sys
10
11arglst = {}
12argnumfield = {}
13argfieldname = {}
14argstartbit = {}
15argendbit = {}
16argdefval = {}
Mark Dykesf41d8ee2025-07-10 16:41:28 -050017smcid = {}
18defval = {}
19sdef = {}
Mark Dykes50297972024-03-15 12:49:22 -050020smcname = ""
21argnum = ""
22argname = ""
23
24def readsmclist(smclist,seq):
25 smclistfile = open(smclist, "r")
26 smclist_lines = smclistfile.readlines()
27 smclistfile.close()
28 for sline in smclist_lines:
Mark Dykesf41d8ee2025-07-10 16:41:28 -050029 svar = 0
Mark Dykes50297972024-03-15 12:49:22 -050030 lcon = 0
31 sl = sline.strip()
Mark Dykesf41d8ee2025-07-10 16:41:28 -050032 sinstr = re.search(r'^smc:\s*([a-zA-Z0-9_]+)\s*0x([a-fA-F0-9]+)\s*$',sl)
33 if sinstr:
34 smcname = sinstr.group(1)
35 arglst[sinstr.group(1)] = []
36 argnumfield[sinstr.group(1)] = {}
37 argfieldname[sinstr.group(1)] = {}
38 argstartbit[sinstr.group(1)] = {}
39 argendbit[sinstr.group(1)] = {}
40 argdefval[sinstr.group(1)] = {}
41 smcid[sinstr.group(2)] = sinstr.group(1)
42 svar = 1
43 lcon = 1
44 argoccupy = {}
45 if not seq:
46 seq = seq + 1
47 else:
48 if seq != 2:
49 print("Error: out of sequence for smc call",end=" ")
50 print(smcname)
51 sys.exit()
52 else:
53 seq = 1
54 sinstr = re.search(r'^smc:\s*([a-zA-Z0-9_]+)\s*([a-zA-Z0-9_]+)\s*$',sl)
55 if sinstr and (svar == 0):
56 smcname = sinstr.group(1)
57 arglst[sinstr.group(1)] = []
58 argnumfield[sinstr.group(1)] = {}
59 argfieldname[sinstr.group(1)] = {}
60 argstartbit[sinstr.group(1)] = {}
61 argendbit[sinstr.group(1)] = {}
62 argdefval[sinstr.group(1)] = {}
63 sdef[sinstr.group(1)] = sinstr.group(2)
64 smcid[sinstr.group(2)] = sinstr.group(1)
65 lcon = 1
66 argoccupy = {}
67 if not seq:
68 seq = seq + 1
69 else:
70 if seq != 2:
71 print("Error: out of sequence for smc call",end=" ")
72 print(smcname)
73 sys.exit()
74 else:
75 seq = 1
76 sinstr = re.search(r'^smc:\s*([a-zA-Z0-9_]+)\s*$',sl)
Mark Dykes50297972024-03-15 12:49:22 -050077 if sinstr:
78 smcname = sinstr.group(1)
79 arglst[sinstr.group(1)] = []
80 argnumfield[sinstr.group(1)] = {}
81 argfieldname[sinstr.group(1)] = {}
82 argstartbit[sinstr.group(1)] = {}
83 argendbit[sinstr.group(1)] = {}
84 argdefval[sinstr.group(1)] = {}
85 lcon = 1
86 argoccupy = {}
87 if not seq:
88 seq = seq + 1
89 else:
90 if seq != 2:
91 print("Error: out of sequence for smc call",end=" ")
92 print(smcname)
93 sys.exit()
94 else:
95 seq = 1
96 sinstr = re.search(r'^arg(\d+)\s*:\s*([a-zA-Z0-9_]+)$',sl)
97 if sinstr:
98 if sinstr.group(1) in argoccupy:
99 print("Error: register already specified for SMC call",end=" ")
100 print(smcname,end=" ")
101 print("argument",end=" ")
102 print(sinstr.group(1))
103 sys.exit()
104 argnum = sinstr.group(1)
105 argname = sinstr.group(2)
106 arglst[smcname].append(argnum)
107 argnumfield[smcname][sinstr.group(2)] = {}
108 argfieldname[smcname][sinstr.group(2)] = []
109 argstartbit[smcname][sinstr.group(2)] = {}
110 argendbit[smcname][sinstr.group(2)] = {}
111 argdefval[smcname][sinstr.group(2)] = {}
112 lcon = 1
113 argoccupy[argnum] = 1
114 fieldoccupy = []
115 if seq != 1:
116 if seq != 2:
117 print("Error: out of sequence for arg(value)",end=" ")
118 print("arg",end=" ")
119 print(argnum,end=" ")
120 print("for argname",end=" ")
121 print(argname)
122 sys.exit()
123 else:
124 seq = 2
125 else:
126 seq = seq + 1
127
128 sinstr = re.search(r'^arg(\d+)\s*=\s*(0x[a-fA-F0-9]+|\d+)$',sl)
129 if sinstr:
130 if sinstr.group(1) in argoccupy:
131 print("Error: register already specified for SMC call",end=" ")
132 print(smcname,end=" ")
133 print("argument",end=" ")
134 print(sinstr.group(1))
135 sys.exit()
136 srange = sinstr.group(1)
137 argrangename = smcname + "_args_"+ sinstr.group(1)
138 argnum = srange
139 argname = smcname + "_arg_" + argnum
140 fieldnameargdef = smcname + "_arg_" + argnum + "_field"
141 arglst[smcname].append(argnum)
142 argnumfield[smcname][argname] = {}
143 argfieldname[smcname][argname] = []
144 argstartbit[smcname][argname] = {}
145 argendbit[smcname][argname] = {}
146 argdefval[smcname][argname] = {}
147 argnumfield[smcname][argname][fieldnameargdef] = argnum
148 argfieldname[smcname][argname].append(fieldnameargdef)
149 argstartbit[smcname][argname][fieldnameargdef] = str(0)
150 argendbit[smcname][argname][fieldnameargdef] = str(63)
151 argdefval[smcname][argname][fieldnameargdef] = sinstr.group(2)
152 lcon = 1
153 argoccupy[argnum] = 1
154 if seq != 1:
155 if seq != 2:
156 print("Error: out of sequence for arg(value)",end=" ")
157 print("arg",end=" ")
158 print(argnum,end=" ")
159 print("for argname",end=" ")
160 print(argname)
161 sys.exit()
162 else:
163 seq = seq + 1
164 sinstr = re.search(r'^arg(\d+)-arg(\d+)\s*=\s*(0x[a-fA-F0-9]+|\d+)$',sl)
165 if sinstr:
166 srange = int(sinstr.group(1))
167 erange = int(sinstr.group(2))
168 argrangename = smcname + "_args_"+ sinstr.group(1) + "_" + sinstr.group(2)
169 for i in range((erange - srange) + 1):
170 if str(srange + i) in argoccupy:
171 print("Error: register already specified for SMC call",end=" ")
172 print(smcname,end=" ")
173 print("argument",end=" ")
174 print(str(srange + i))
175 sys.exit()
176 argnum = srange + i
177 argname = smcname + "_arg_" + str(argnum)
178 fieldnameargdef = smcname + "_arg_" + str(argnum) + "_field"
179 arglst[smcname].append(argnum)
180 argnumfield[smcname][argname] = {}
181 argfieldname[smcname][argname] = []
182 argstartbit[smcname][argname] = {}
183 argendbit[smcname][argname] = {}
184 argdefval[smcname][argname] = {}
185 argnumfield[smcname][argname][fieldnameargdef] = str(argnum)
186 argfieldname[smcname][argname].append(fieldnameargdef)
187 argstartbit[smcname][argname][fieldnameargdef] = str(0)
188 argendbit[smcname][argname][fieldnameargdef] = str(63)
189 argdefval[smcname][argname][fieldnameargdef] = sinstr.group(3)
190 argoccupy[str(argnum)] = 1
191 lcon = 1
192 if seq != 1:
193 if seq != 2:
194 print("Error: out of sequence for arg(value)",end=" ")
195 print("arg",end=" ")
196 print(argnum,end=" ")
197 print("for argname",end=" ")
198 print(argname)
199 sys.exit()
200 else:
201 seq = 2
202 else:
203 seq = seq + 1
204 sinstr = re.search(r'^field:([a-zA-Z0-9_]+):\[(\d+),(\d+)\]\s*=\s*(0x[a-fA-F0-9]+|\d+)$',sl)
205 if sinstr:
206 for fs in fieldoccupy:
207 if(((fs[0] <= int(sinstr.group(3))) and (fs[0] >= int(sinstr.group(2)))) or
208 ((fs[1] <= int(sinstr.group(3))) and (fs[1] >= int(sinstr.group(2))))):
209 print("Error: field overlap",end=" ")
210 print(smcname,end=" ")
211 print(argname,end=" ")
212 print(sinstr.group(1),end=" ")
213 print(fs[0],end=" ")
214 print(fs[1],end=" ")
215 print(" with",end=" ")
216 print(sinstr.group(2),end=" ")
217 print(sinstr.group(3))
218 sys.exit()
219 argnumfield[smcname][argname][sinstr.group(1)] = argnum
220 argfieldname[smcname][argname].append(sinstr.group(1))
221 argstartbit[smcname][argname][sinstr.group(1)] = sinstr.group(2)
222 argendbit[smcname][argname][sinstr.group(1)] = sinstr.group(3)
223 argdefval[smcname][argname][sinstr.group(1)] = sinstr.group(4)
224 flist = []
225 flist.append(int(sinstr.group(2)))
226 flist.append(int(sinstr.group(3)))
227 fieldoccupy.append(flist)
228 lcon = 1
229 if seq != 2:
230 print("Error: out of sequence for field")
231 sys.exit()
Mark Dykesf41d8ee2025-07-10 16:41:28 -0500232 sinstr = re.search(r'^define ([a-zA-Z0-9_]+)\s*=\s*0x([a-fA-F0-9]+|\d+)$',sl)
233 if sinstr:
234 defval[sinstr.group(1)] = sinstr.group(2)
235 lcon = 1
Mark Dykes50297972024-03-15 12:49:22 -0500236 if not lcon:
237 cline = re.search(r'^#',sl)
238 if not cline:
239 if sl:
240 print("Error: malformed line at",end=" ")
241 print(sl)
242 sys.exit()
243 if(seq != 2):
244 print("incorrect ending for smc specification")
245 sys.exit()
Mark Dykesf41d8ee2025-07-10 16:41:28 -0500246
247 for smccal,dval in sdef.items():
248 if dval in defval:
249 smcid[defval[dval]] = smccal
250 else:
251 print("Error: cannot find define value",end=" ")
252 print(dval)
253 sys.exit()