Does someone knows how it will work?

  1. Some wine/proton wizardry
  2. Gaming VM with GPU passthrough
  • Mttw_@lemmy.dbzer0.com
    link
    fedilink
    English
    arrow-up
    32
    arrow-down
    1
    ·
    edit-2
    2 days ago

    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.

    • mecen@lemmy.caOP
      link
      fedilink
      English
      arrow-up
      12
      ·
      2 days ago

      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.

      • Mttw_@lemmy.dbzer0.com
        link
        fedilink
        English
        arrow-up
        4
        ·
        2 days ago

        yeah, more on that: linux kernel has support for cpuid faulting for supported intel cpus since 2017, while amd since only last year. Not sure why amd was slower on this.

    • kkj@lemmy.dbzer0.com
      link
      fedilink
      English
      arrow-up
      2
      ·
      2 days ago

      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.

      • Mttw_@lemmy.dbzer0.com
        link
        fedilink
        English
        arrow-up
        3
        ·
        2 days ago

        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.")
        
        • kkj@lemmy.dbzer0.com
          link
          fedilink
          English
          arrow-up
          1
          ·
          2 days ago

          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.