summaryrefslogtreecommitdiff
path: root/tools/proxyclient/experiments/fptest.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/proxyclient/experiments/fptest.py')
-rwxr-xr-xtools/proxyclient/experiments/fptest.py114
1 files changed, 114 insertions, 0 deletions
diff --git a/tools/proxyclient/experiments/fptest.py b/tools/proxyclient/experiments/fptest.py
new file mode 100755
index 0000000..6c45bdc
--- /dev/null
+++ b/tools/proxyclient/experiments/fptest.py
@@ -0,0 +1,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()