1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
|
#!/usr/bin/env python3
# SPDX-License-Identifier: MIT
import sys, pathlib
sys.path.append(str(pathlib.Path(__file__).resolve().parents[1]))
from m1n1.setup import *
from m1n1 import asm
ULCON = 0x235200000
UCON = 0x235200004
UFCON = 0x235200008
UTRSTAT = 0x235200010
AIC = 0x23b100000
AIC_RST = AIC + 0xc
AIC_CFG = AIC + 0x10
AIC_TB = 0x23b108000
AIC_TGT_DST = AIC + 0x3000
AIC_SW_GEN_SET = AIC + 0x4000
AIC_SW_GEN_CLR = AIC + 0x4080
AIC_MASK_SET = AIC + 0x4100
AIC_MASK_CLR = AIC + 0x4180
AIC_HW_STATE = AIC + 0x4200
AIC_INTERRUPT_ACK = AIC + 0x2004
AIC_IPI_SET = AIC + 0x2008
AIC_IPI_CLR = AIC + 0x200c
AIC_IPI_MASK_SET = AIC + 0x2024
AIC_IPI_MASK_CLR = AIC + 0x2028
daif = u.mrs(DAIF)
print("DAIF: %x" % daif)
daif &= ~0x3c0
#daif |= 0x3c0
u.msr(DAIF, daif)
print("DAIF: %x" % u.mrs(DAIF))
def cpoll():
mon.poll()
print("<")
mon.poll()
print(">")
p.write32(AIC + 0xc, 1)
p.write32(AIC + 0x10, 0xe0777971)
p.write32(AIC + 0x18, 0)
p.write32(AIC + 0x20, 0xffffffff)
p.write32(AIC + 0x24, 0xffffffff)
p.write32(AIC + 0x28, 0xffffffff)
p.write32(AIC + 0x2c, 0xffffffff)
p.write32(AIC + 0x30, 0xffffffff)
p.write32(AIC + 0x34, 0xffffffff)
p.write32(AIC + 0x38, 0xffffffff)
p.write32(AIC + 0x3c, 0xffffffff)
p.write32(AIC + 0x40, 0xffffffff)
p.write32(AIC + 0x38, 0xffffffff)
#p.write32(AIC + 0xc, 0)
p.memset32(AIC_MASK_SET, 0xffffffff, 0x80)
p.memset32(AIC_SW_GEN_CLR, 0xffffffff, 0x80)
p.memset32(AIC_TGT_DST, 0x1, 0x1000)
#p.memset32(AIC_MASK_CLR, 0xffffffff, 0x80)
#p.write32(AIC + 0x10, 0xe0777971)
mon.add(AIC + 0x0000, 0x1000)
mon.add(AIC + 0x2080, 0x040)
mon.add(AIC + 0x4000, 0x200)
mon.add(AIC + 0x5000, 0x080)
mon.add(AIC + 0x5080, 0x080)
mon.add(AIC + 0x5100, 0x080)
mon.add(AIC + 0x5180, 0x080)
mon.add(AIC + 0x5200, 0x080)
mon.add(AIC + 0x5280, 0x080)
mon.add(AIC + 0x5300, 0x080)
mon.add(AIC + 0x5380, 0x080)
#mon.add(AIC + 0x3000, 0x400)
#mon.add(AIC + 0x4000, 0x400)
#mon.add(AIC + 0x8000, 0x20)
#mon.add(AIC + 0x8030, 0xd0)
#mon.add(0x235200000, 0x20)
def test_ipi():
cpoll()
print("Set IPI")
p.write32(AIC_IPI_SET, 1)
cpoll()
cpoll()
print("Read ACK reg")
reason = p.read32(AIC_INTERRUPT_ACK)
print("reason: 0x%x" % reason)
cpoll()
print("Write reason")
p.write32(AIC_INTERRUPT_ACK, reason)
cpoll()
reason = p.read32(AIC_INTERRUPT_ACK)
print("reason: 0x%x" % reason)
cpoll()
print("Write ACK reg")
p.write32(AIC_INTERRUPT_ACK, reason)
cpoll()
print("Clear IPI")
p.write32(AIC_IPI_CLR, 1)
cpoll()
print("Read ACK reg")
reason = p.read32(AIC_INTERRUPT_ACK)
print("reason: 0x%x" % reason)
cpoll()
print("Write IPI ACK")
p.write32(AIC_IPI_MASK_CLR, 1)
cpoll()
def test_timer():
cpoll()
freq = u.mrs(CNTFRQ_EL0)
print("Timer freq: %d" % freq)
#u.msr(CNTP_CTL_EL0, 0)
#u.msr(CNTP_TVAL_EL0, freq * 2)
#u.msr(CNTP_CTL_EL0, 1)
#u.msr(CNTV_CTL_EL0, 0)
#u.msr(CNTV_TVAL_EL0, freq * 2)
#u.msr(CNTV_CTL_EL0, 1)
#u.msr(CNTHV_CTL_EL2, 0)
#u.msr(CNTHV_TVAL_EL2, freq * 2)
#u.msr(CNTHV_CTL_EL2, 1)
u.msr(CNTHP_CTL_EL2, 0)
u.msr(CNTHP_TVAL_EL2, freq * 2)
u.msr(CNTHP_CTL_EL2, 1)
iface.ttymode()
#while True:
#p.nop()
#time.sleep(0.3)
#print(". %x" % u.mrs(CNTP_CTL_EL0))
def get_irq_state(irq):
v = p.read32(AIC_HW_STATE + 4* (irq//32))
return bool(v & 1<<(irq%32))
def test_uart_irq():
cpoll()
#p.memset32(AIC_MASK_CLR, 0xffffffff, 0x80)
print("cleanup")
p.write32(UCON, 5)
p.write32(UFCON, 0x11)
p.write32(UTRSTAT, 0xfff)
cpoll()
for irq in range(600, 610):
#print("S: ", get_irq_state(irq))
p.write32(AIC_SW_GEN_CLR + 4* (irq//32), 1<<(irq%32))
#print("S: ", get_irq_state(irq))
#print("a")
#print("S: ", get_irq_state(irq))
p.write32(AIC_MASK_CLR + 4* (irq//32), 1<<(irq%32))
#print("S: ", get_irq_state(irq))
#print("b")
irq = 605
cpoll()
print("a")
print("S: ", get_irq_state(irq))
print("ucon: %x" %p.read32(UCON))
TX_IRQ_EN = 0x1000
RX_IRQ_ENABLE = 0x20000
RX_IRQ_UNMASK = 0x10000
RX_IRQ_ENA = 0x20000
RX_IRQ_MASK = 0x4000 # defer?
code = u.malloc(0x1000)
c = asm.ARMAsm("""
ldr x1, =0x235200000
ldr x3, =0xc000000
1:
subs x3, x3, #1
bne 1b
mov x2, 'A'
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
#str w2, [x1, #0x20]
mov x3, #0x3ff
str w3, [x1, #0x10]
#str w2, [x1, #0x20]
str w0, [x1, #4]
ldr w0, [x1, #0x10]
ldr x3, =0xc00000
1:
subs x3, x3, #1
bne 1b
#mov x3, #0x3ff
#str w3, [x1, #0x10]
#ldr w2, [x1, #4]
#mov x2, #0x205
#str w2, [x1, #4]
#str w0, [x1, #4]
##ldr w0, [x1, #0x10]
#ldr x3, =0xc00000
#1:
#subs x3, x3, #1
#bne 1b
ldr w0, [x1, #0x10]
#mov w0, w2
ret
""", code)
iface.writemem(code, c.data)
p.dc_cvau(code, len(c.data))
p.ic_ivau(code, len(c.data))
#RX_IRQ_
"""
UCON UTRSTAT
00200 TX FIFO thresh IRQ delivery enable
00080 0200 TX FIFO threshold IRQ unmask
20000 0100 RX IRQ unmask
10000 RX IRQ delivery enable
"""
# edge triggered
TX_FIFO_THRESH_CROSSED_IRQ_UNMASK = 0x2000
TX_IRQ_UNMASK = 0x200
TX_EVENT_ENABLE = 0x80
RX_EVENT_ENABLE = 0x20000
RX_IRQ_UNMASK = 0x10000
#flags = 0x7ffc0
crash = 0x180000
no_irqs = 0x21c5c0
instant_irqs = 0x3a00
#flags = no_irqs | 0x0000
#flags = 0x2e5c0
#flags = 0x2000
#flags = 0x30000
#flags = 0x80
flags = 0x7ff80
val = flags | 0x005
#print("ucon<-%x" % val)
#p.write32(UCON, val)
p.write32(UTRSTAT, 0xfff)
print("utrstat=%x" % p.read32(UTRSTAT))
ret = p.call(code, val)
print("utrstat::%x" % ret)
print("utrstat=%x" % p.read32(UTRSTAT))
time.sleep(0.5)
iface.dev.write(b'1')
#print(iface.dev.read(1))
time.sleep(0.1)
print("ucon: %x" %p.read32(UCON))
print("delay")
try:
p.udelay(500000)
except:
pass
iface.dev.write(bytes(64))
p.nop()
print("ucon: %x" %p.read32(UCON))
print("S: ", get_irq_state(irq))
#while True:
#print("S: ", get_irq_state(irq))
#p.write32(UTRSTAT, 0xfff)
#print("utrstat=%x" % p.read32(UTRSTAT))
#print("ucon: %x" %p.read32(UCON))
#print(">S: ", get_irq_state(irq))
#p.write32(UCON, flags | 0x005)
#print(">ucon: %x" %p.read32(UCON))
#time.sleep(0.1)
def test_smp_ipi():
p.smp_start_secondaries()
code = u.malloc(0x1000)
c = asm.ARMAsm("""
#define sys_reg(op0, op1, CRn, CRm, op2) s##op0##_##op1##_c##CRn##_c##CRm##_##op2
#define SYS_CYC_OVRD sys_reg(3, 5, 15, 5, 0)
msr DAIFClr, 7
ldr x1, =0x000000
msr SYS_CYC_OVRD, x1
mrs x0, SYS_CYC_OVRD
mov x1, #0x1000000
1:
subs x1, x1, #1
mrs x0, HCR_EL2
bne 1b
ret
""", code)
iface.writemem(code, c.data)
p.dc_cvau(code, len(c.data))
p.ic_ivau(code, len(c.data))
print("Enable IRQs on secondaries")
for i in range(1, 8):
ret = p.smp_call_sync(i, code)
print("0x%x"%ret)
#e0477971
#p.write32(AIC + 0x10, 0xe0777971)
#p.write32(AIC + 0x28, 0xffffffff)
cpoll()
print("Clear IPI")
p.write32(AIC_IPI_CLR, 0xffffffff)
p.write32(AIC_IPI_MASK_CLR, 0xffffffff)
for i in range(8):
p.write32(AIC_IPI_CLR+0x3000+i*0x80, 0xffffffff)
p.write32(AIC_IPI_MASK_CLR+0x3000+i*0x80, 0xffffffff)
cpoll()
print("Set IPI")
#p.write32(AIC_IPI_SET, 0x00000004)
#p.write32(AIC_IPI_SET, 0x00000000)
cpoll()
print("Clear IPI")
p.write32(AIC_IPI_CLR, 0xffffffff)
p.write32(AIC_IPI_MASK_CLR, 0xffffffff)
for i in range(8):
p.write32(AIC_IPI_CLR+0x3000+i*0x80, 1)
p.write32(AIC_IPI_MASK_CLR+0x3000+i*0x80, 1)
def test_smp_affinity():
p.write32(AIC_TGT_DST, 0x6)
p.write32(AIC_TGT_DST+4, 0xfe)
p.write32(AIC_TGT_DST+8, 0xfe)
p.write32(AIC_TGT_DST+12, 0x6)
p.write32(AIC_SW_GEN_SET,0x8);
p.write32(AIC_MASK_CLR,0x8);
#test_ipi()
#test_timer()
#test_uart_irq()
test_smp_ipi()
test_smp_affinity()
|