blob: 3bfcb6a89d8c8dda82aea7859238dca3b518a9ad [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 = {}
17smcname = ""
18argnum = ""
19argname = ""
20
21def readsmclist(smclist,seq):
22 smclistfile = open(smclist, "r")
23 smclist_lines = smclistfile.readlines()
24 smclistfile.close()
25 for sline in smclist_lines:
26 lcon = 0
27 sl = sline.strip()
28 sinstr = re.search(r'^smc:\s*([a-zA-Z0-9_]+)$',sl)
29 if sinstr:
30 smcname = sinstr.group(1)
31 arglst[sinstr.group(1)] = []
32 argnumfield[sinstr.group(1)] = {}
33 argfieldname[sinstr.group(1)] = {}
34 argstartbit[sinstr.group(1)] = {}
35 argendbit[sinstr.group(1)] = {}
36 argdefval[sinstr.group(1)] = {}
37 lcon = 1
38 argoccupy = {}
39 if not seq:
40 seq = seq + 1
41 else:
42 if seq != 2:
43 print("Error: out of sequence for smc call",end=" ")
44 print(smcname)
45 sys.exit()
46 else:
47 seq = 1
48 sinstr = re.search(r'^arg(\d+)\s*:\s*([a-zA-Z0-9_]+)$',sl)
49 if sinstr:
50 if sinstr.group(1) in argoccupy:
51 print("Error: register already specified for SMC call",end=" ")
52 print(smcname,end=" ")
53 print("argument",end=" ")
54 print(sinstr.group(1))
55 sys.exit()
56 argnum = sinstr.group(1)
57 argname = sinstr.group(2)
58 arglst[smcname].append(argnum)
59 argnumfield[smcname][sinstr.group(2)] = {}
60 argfieldname[smcname][sinstr.group(2)] = []
61 argstartbit[smcname][sinstr.group(2)] = {}
62 argendbit[smcname][sinstr.group(2)] = {}
63 argdefval[smcname][sinstr.group(2)] = {}
64 lcon = 1
65 argoccupy[argnum] = 1
66 fieldoccupy = []
67 if seq != 1:
68 if seq != 2:
69 print("Error: out of sequence for arg(value)",end=" ")
70 print("arg",end=" ")
71 print(argnum,end=" ")
72 print("for argname",end=" ")
73 print(argname)
74 sys.exit()
75 else:
76 seq = 2
77 else:
78 seq = seq + 1
79
80 sinstr = re.search(r'^arg(\d+)\s*=\s*(0x[a-fA-F0-9]+|\d+)$',sl)
81 if sinstr:
82 if sinstr.group(1) in argoccupy:
83 print("Error: register already specified for SMC call",end=" ")
84 print(smcname,end=" ")
85 print("argument",end=" ")
86 print(sinstr.group(1))
87 sys.exit()
88 srange = sinstr.group(1)
89 argrangename = smcname + "_args_"+ sinstr.group(1)
90 argnum = srange
91 argname = smcname + "_arg_" + argnum
92 fieldnameargdef = smcname + "_arg_" + argnum + "_field"
93 arglst[smcname].append(argnum)
94 argnumfield[smcname][argname] = {}
95 argfieldname[smcname][argname] = []
96 argstartbit[smcname][argname] = {}
97 argendbit[smcname][argname] = {}
98 argdefval[smcname][argname] = {}
99 argnumfield[smcname][argname][fieldnameargdef] = argnum
100 argfieldname[smcname][argname].append(fieldnameargdef)
101 argstartbit[smcname][argname][fieldnameargdef] = str(0)
102 argendbit[smcname][argname][fieldnameargdef] = str(63)
103 argdefval[smcname][argname][fieldnameargdef] = sinstr.group(2)
104 lcon = 1
105 argoccupy[argnum] = 1
106 if seq != 1:
107 if seq != 2:
108 print("Error: out of sequence for arg(value)",end=" ")
109 print("arg",end=" ")
110 print(argnum,end=" ")
111 print("for argname",end=" ")
112 print(argname)
113 sys.exit()
114 else:
115 seq = seq + 1
116 sinstr = re.search(r'^arg(\d+)-arg(\d+)\s*=\s*(0x[a-fA-F0-9]+|\d+)$',sl)
117 if sinstr:
118 srange = int(sinstr.group(1))
119 erange = int(sinstr.group(2))
120 argrangename = smcname + "_args_"+ sinstr.group(1) + "_" + sinstr.group(2)
121 for i in range((erange - srange) + 1):
122 if str(srange + i) in argoccupy:
123 print("Error: register already specified for SMC call",end=" ")
124 print(smcname,end=" ")
125 print("argument",end=" ")
126 print(str(srange + i))
127 sys.exit()
128 argnum = srange + i
129 argname = smcname + "_arg_" + str(argnum)
130 fieldnameargdef = smcname + "_arg_" + str(argnum) + "_field"
131 arglst[smcname].append(argnum)
132 argnumfield[smcname][argname] = {}
133 argfieldname[smcname][argname] = []
134 argstartbit[smcname][argname] = {}
135 argendbit[smcname][argname] = {}
136 argdefval[smcname][argname] = {}
137 argnumfield[smcname][argname][fieldnameargdef] = str(argnum)
138 argfieldname[smcname][argname].append(fieldnameargdef)
139 argstartbit[smcname][argname][fieldnameargdef] = str(0)
140 argendbit[smcname][argname][fieldnameargdef] = str(63)
141 argdefval[smcname][argname][fieldnameargdef] = sinstr.group(3)
142 argoccupy[str(argnum)] = 1
143 lcon = 1
144 if seq != 1:
145 if seq != 2:
146 print("Error: out of sequence for arg(value)",end=" ")
147 print("arg",end=" ")
148 print(argnum,end=" ")
149 print("for argname",end=" ")
150 print(argname)
151 sys.exit()
152 else:
153 seq = 2
154 else:
155 seq = seq + 1
156 sinstr = re.search(r'^field:([a-zA-Z0-9_]+):\[(\d+),(\d+)\]\s*=\s*(0x[a-fA-F0-9]+|\d+)$',sl)
157 if sinstr:
158 for fs in fieldoccupy:
159 if(((fs[0] <= int(sinstr.group(3))) and (fs[0] >= int(sinstr.group(2)))) or
160 ((fs[1] <= int(sinstr.group(3))) and (fs[1] >= int(sinstr.group(2))))):
161 print("Error: field overlap",end=" ")
162 print(smcname,end=" ")
163 print(argname,end=" ")
164 print(sinstr.group(1),end=" ")
165 print(fs[0],end=" ")
166 print(fs[1],end=" ")
167 print(" with",end=" ")
168 print(sinstr.group(2),end=" ")
169 print(sinstr.group(3))
170 sys.exit()
171 argnumfield[smcname][argname][sinstr.group(1)] = argnum
172 argfieldname[smcname][argname].append(sinstr.group(1))
173 argstartbit[smcname][argname][sinstr.group(1)] = sinstr.group(2)
174 argendbit[smcname][argname][sinstr.group(1)] = sinstr.group(3)
175 argdefval[smcname][argname][sinstr.group(1)] = sinstr.group(4)
176 flist = []
177 flist.append(int(sinstr.group(2)))
178 flist.append(int(sinstr.group(3)))
179 fieldoccupy.append(flist)
180 lcon = 1
181 if seq != 2:
182 print("Error: out of sequence for field")
183 sys.exit()
184 if not lcon:
185 cline = re.search(r'^#',sl)
186 if not cline:
187 if sl:
188 print("Error: malformed line at",end=" ")
189 print(sl)
190 sys.exit()
191 if(seq != 2):
192 print("incorrect ending for smc specification")
193 sys.exit()