Does someone knows how it will work?

  1. Some wine/proton wizardry
  2. Gaming VM with GPU passthrough
you are viewing a single comment's thread
view the rest of the comments
[–] 58 points 5 months ago (15 children)

According to their now deleted Reddit account, it will use a custom Proton build on Intel and Zen 4 CPUs. For every other CPU you will need a kernel module.

  • source
  • hideshow 15 child comments
  • [–] 35 points 5 months ago* (3 children)

    you will need a kernel module.

    Yeah, Nah. That's a nope, especially given it can be done in proton. Also, updated Denuvo in 3.2.1...

    Denuvo, just say no.

  • source
  • parent
  • hideshow 3 child comments
  • [–] 22 points 5 months ago* (last edited 5 months ago)

    No it cannot be done with proton alone. Proton/wine is only a translation layer: if a program makes cpuid calls, proton/wine cannot intercept them because cpuid is executed directly on hardware silicon.

  • source
  • parent
  • [–] 34 points 5 months ago* (last edited 5 months ago) (6 children)

    Correction: usermode is only supported by zen4 (or newer) and intel Ivy Bridge (or newer).

    The reason is pretty simple: only from those generations onwards a new instruction was added (cpuid faulting) which is executed in the hardware itself, old generations simply lacks the silicon for it.

    cpu faulting is used to trap usermode cpuid calls and can be used to return spoofed values, without needing an hypervisor.

  • source
  • parent
  • hideshow 6 child comments
  • [–] [S] 14 points 5 months ago (1 child)

    If ivy bridge then from 3 gen which means pretty much any Intel made from 2012.

    But for AMD from 7000 series which means CPU from 2022.

    It sucks to be AMD user.

  • source
  • parent
  • hideshow 1 child comment
  • [–] 3 points 5 months ago (3 children)

    I wonder if the new 5800X3D will support it. I'd give it maybe a 1% chance. I doubt they changed all that much. Sure would be nice for people on AM4, though.

  • source
  • parent
  • hideshow 3 child comments
  • [–] 5 points 5 months ago (2 children)

    No, 5800x3d is zen3 sadly.

    But you can actually test it with a small python script:

    # docs: https://man.archlinux.org/man/arch_prctl.2
    import ctypes
    import errno
    import mmap
    import os
    import signal
    import subprocess
    import sys
    
    SYS_arch_prctl = 158
    ARCH_SET_CPUID = 0x1012
    
    libc = ctypes.CDLL(None, use_errno=True)
    libc.syscall.restype = ctypes.c_long
    
    def arch_set_cpuid(enabled: bool) -> None:
        rc = libc.syscall(SYS_arch_prctl, ARCH_SET_CPUID, 1 if enabled else 0)
        if rc != 0:
            e = ctypes.get_errno()
            raise OSError(e, os.strerror(e))
    
    def make_cpuid_stub():
        # push rbx
        # xor eax, eax
        # cpuid
        # pop rbx
        # ret
        code = b"\x53\x31\xc0\x0f\xa2\x5b\xc3"
        mm = mmap.mmap(
            -1,
            len(code),
            flags=mmap.MAP_PRIVATE | mmap.MAP_ANONYMOUS,
            prot=mmap.PROT_READ | mmap.PROT_WRITE | mmap.PROT_EXEC,
        )
        mm.write(code)
        addr = ctypes.addressof(ctypes.c_char.from_buffer(mm))
        func = ctypes.CFUNCTYPE(None)(addr)
        func._mm = mm
        return func
    
    def child():
        cpuid = make_cpuid_stub()
    
        print("Trying normal CPUID...")
        cpuid()
        print("Normal CPUID worked.")
    
        try:
            arch_set_cpuid(False)
        except OSError as e:
            if e.errno == errno.ENODEV:
                print("CPU does not support CPUID faulting.")
                return 2
            raise
    
        print("CPUID disabled for this thread. Calling CPUID again...")
        cpuid()  # should SIGSEGV -11 if faulting is supported
        print("Unexpected: CPUID did not fault.")
        return 0
    
    if __name__ == "__main__":
        if len(sys.argv) > 1 and sys.argv[1] == "child":
            raise SystemExit(child())
    
        p = subprocess.run([sys.executable, __file__, "child"], text=True)
        print(f"child exit code: {p.returncode}")
    
        if p.returncode == -signal.SIGSEGV:
            print("Result: CPUID faulting is supported and worked.")
        elif p.returncode == 2:
            print("Result: CPUID faulting is not supported by the hardware.")
        else:
            print("Result: test did not complete cleanly.")
    
  • source
  • parent
  • hideshow 2 child comments
  • [–] 1 point 5 months ago (1 child)

    I was referring to AMD bringing the 5800X3D out of retirement. They said that they redesigned it. It's probably just moving the cache under the CPU like on Zen5 3D, but I feel like there's a very slight chance.

  • source
  • parent
  • hideshow 1 child comment