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
|
#!/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
FPCR_FZ = 1 << 24
ACTLR_DEFAULT = 0xc00
ACTLR_AFP = 1 << 5
AFPCR = (3,6,15,2,5)
AFPCR_DAZ = 1 << 0
AFPCR_FTZ = 1 << 1
code_buffer = p.malloc(0x1000)
data_buffer = p.malloc(0x1000)
code = asm.ARMAsm("""
ldr s0, [x0, #0]
ldr s1, [x0, #4]
fmul s0, s1, s0
str s0, [x0, #8]
ldr s0, [x0, #12]
ldr s1, [x0, #16]
fmul s0, s1, s0
str s0, [x0, #20]
# to test EL0 access
# mrs x0, s3_6_c15_c2_5
ret
""", code_buffer)
iface.writemem(code_buffer, code.data)
p.dc_cvau(code_buffer, code.len)
p.ic_ivau(code_buffer, code.len)
def test_denormals():
data = [
0x00400000, # a denormal
0x40000000, # 2
0,
0x00800000, # smallest non-denormal
0x3f000000, # 0.5
0,
]
iface.writemem(data_buffer, struct.pack("<%dI" % len(data), *data))
p.set_exc_guard(GUARD.SKIP)
ret = p.el0_call(code_buffer, data_buffer | REGION_RW_EL0)
p.set_exc_guard(GUARD.OFF)
v1 = p.read32(data_buffer + 8)
v2 = p.read32(data_buffer + 20)
print(" Input:", end=" ")
if v1 == 0:
print("FLUSH ", end=" ")
elif v1 == 0x00800000:
print("NORMAL", end=" ")
else:
print("0x08x?" % v1, end=" ")
print("Output:", end=" ")
if v2 == 0:
print("FLUSH ", end=" ")
elif v2 == 0x00400000:
print("NORMAL", end=" ")
else:
print("0x08x?" % v2, end=" ")
print("r = 0x%x" % ret)
print("Testing normal mode")
u.msr(ACTLR_EL1, ACTLR_DEFAULT)
u.msr(AFPCR, 0)
u.msr(FPCR, 0)
print("FPCR.FZ = 0")
test_denormals()
u.msr(FPCR, FPCR_FZ)
print("FPCR.FZ = 1")
test_denormals()
print()
print("Testing Apple mode")
u.msr(ACTLR_EL1, ACTLR_DEFAULT | ACTLR_AFP)
u.msr(AFPCR, 0)
u.msr(FPCR, 0)
print("FPCR.FZ = 0")
test_denormals()
u.msr(FPCR, FPCR_FZ)
print("FPCR.FZ = 1")
test_denormals()
u.msr(AFPCR, AFPCR_DAZ)
print("AFPCR.<FTZ, DAZ> = 0, 1")
test_denormals()
u.msr(AFPCR, AFPCR_FTZ)
print("AFPCR.<FTZ, DAZ> = 1, 0")
test_denormals()
u.msr(AFPCR, AFPCR_FTZ | AFPCR_DAZ)
print("AFPCR.<FTZ, DAZ> = 1, 1")
test_denormals()
|