124 lines
2.4 KiB
Python
124 lines
2.4 KiB
Python
import re
|
|
|
|
from cpuinfo import get_cpu_info
|
|
from os import access, R_OK, W_OK
|
|
|
|
|
|
def cpu_trap_flag(self, cpu_vm):
|
|
if cpu_vm not in ("kvm", "emulated"):
|
|
raise ValueError('invalid argument')
|
|
|
|
if cpu_vm == "kvm" and not access("/dev/kvm", W_OK|R_OK):
|
|
self.skipTest("requires KVM")
|
|
|
|
config = """
|
|
$_hdimage = "dXXXXs/c:hdtype1 +1"
|
|
$_floppy_a = ""
|
|
$_cpu_vm = "%s"
|
|
""" % cpu_vm
|
|
|
|
self.mkfile("testit.bat", """\
|
|
c:\\cputrapf
|
|
rem end
|
|
""", newline="\r\n")
|
|
|
|
# compile sources
|
|
self.mkcom_with_nasm("cputrapf", r"""
|
|
|
|
bits 16
|
|
cpu 386
|
|
|
|
org 100h
|
|
|
|
section .text
|
|
|
|
push cs
|
|
pop ds
|
|
|
|
mov ax, 2501h
|
|
mov dx, int1
|
|
int 21h
|
|
|
|
mov ax, 14h
|
|
mov bx, 1
|
|
int 0xe6
|
|
|
|
push 3003h
|
|
push 3303h
|
|
popf
|
|
popf
|
|
nop
|
|
|
|
mov ax, 14h
|
|
mov bx, 0
|
|
int 0xe6
|
|
|
|
mov ah, 9 ; print string
|
|
mov dx, result
|
|
int 21h
|
|
|
|
exit:
|
|
mov ax, 4c00h
|
|
int 21h
|
|
ret
|
|
|
|
int1:
|
|
inc byte [cs:result.cnt]
|
|
iret
|
|
|
|
section .data
|
|
|
|
result:
|
|
db "Result is ("
|
|
.cnt:
|
|
db '0'
|
|
db ')',13,10,'$'
|
|
""")
|
|
|
|
results = self.runDosemu("testit.bat", config=config)
|
|
|
|
# Extract the result value
|
|
r1 = re.compile(r'Result is \((\d+)\)')
|
|
self.assertRegex(results, r1)
|
|
t = r1.search(results)
|
|
rval = int(t.group(1), 10)
|
|
|
|
# Some unknown error in the test
|
|
self.assertNotEqual(rval, 0, results)
|
|
|
|
if cpu_vm != 'kvm':
|
|
self.assertEqual(rval, 1, results)
|
|
return
|
|
|
|
# check for fixup
|
|
fixupmsg = "KVM: not applying TF fixup"
|
|
knownbad = (
|
|
'AMD FX(tm)-8350 Eight-Core Processor',
|
|
'AMD A10-7870K Radeon R7, 12 Compute Cores 4C+8G',
|
|
'AMD Ryzen 5 5600U with Radeon Graphics',
|
|
'AMD EPYC 7763 64-Core Processor',
|
|
)
|
|
|
|
# get log content
|
|
logcontents = 'Missing'
|
|
with open(self.logfiles['log'][0], "r") as f:
|
|
logcontents = f.read()
|
|
|
|
cpu = get_cpu_info()
|
|
try:
|
|
name = cpu['brand']
|
|
except KeyError:
|
|
try:
|
|
name = cpu['brand_raw']
|
|
except KeyError:
|
|
name = str(cpu)
|
|
|
|
if rval == 1:
|
|
if name in knownbad:
|
|
self.fail("Unexpected success with cpu '%s'" % name)
|
|
elif rval > 1 or fixupmsg in results or fixupmsg in logcontents:
|
|
if name in knownbad:
|
|
self.setMessage("known bad cpu '%s'" % name)
|
|
else:
|
|
self.fail("Fail with unknown cpu '%s'" % name)
|