Index | Thread | Search

From:
Kirill A. Korinsky <kirill@korins.ky>
Subject:
Re: ffmpeg: ILL_BTCFI in ff_vp9_idct_4x4_internal_avx2() via tdesktop
To:
Klemens Nanni <kn@openbsd.org>
Cc:
ports <ports@openbsd.org>, Brad Smith <brad@comstyle.com>
Date:
Sat, 13 Jun 2026 02:17:07 +0200

Download raw body.

Thread
On Fri, 12 Jun 2026 21:48:56 +0200,
Klemens Nanni <kn@openbsd.org> wrote:
> 
> Yesterday I updated my packages and built new tdesktop,
> now it crashes when opening chats;  no reproducer yet.
> 
> ffmpeg-8.1.1v1      audio/video converter and streamer
> tdesktop-6.9.1      Telegram Desktop messenger
> 
>  81826 Telegram PSIG  SIGILL SIG_DFL code=ILL_BTCFI addr=0x397a1703911 trapno=21
> 
> Core was generated by `Telegram'.
> Program terminated with signal SIGILL, Illegal instruction.
> #0  0x00000397a1703911 in ff_vp9_idct_4x4_internal_avx2.pass2 () from /usr/local/lib/libavcodec.so.27.2
> [Current thread is 1 (process 317345)]
> #0  0x00000397a1703911 in ff_vp9_idct_4x4_internal_avx2.pass2 () from /usr/local/lib/libavcodec.so.27.2
> #1  0x00000397a14c1cee in ff_vp9_intra_recon_8bpp () from /usr/local/lib/libavcodec.so.27.2
> #2  0x00000397a1450b10 in ff_vp9_decode_block () from /usr/local/lib/libavcodec.so.27.2
> #3  0x00000397a1447ac1 in decode_sb () from /usr/local/lib/libavcodec.so.27.2
> #4  0x00000397a1447f39 in decode_sb () from /usr/local/lib/libavcodec.so.27.2
> #5  0x00000397a1447e9b in decode_sb () from /usr/local/lib/libavcodec.so.27.2
> #6  0x00000397a1447e9b in decode_sb () from /usr/local/lib/libavcodec.so.27.2
> #7  0x00000397a1440d12 in vp9_decode_frame () from /usr/local/lib/libavcodec.so.27.2
> #8  0x00000397a0defe41 in ff_decode_receive_frame_internal () from /usr/local/lib/libavcodec.so.27.2
> #9  0x00000397a0df0573 in decode_receive_frame_internal () from /usr/local/lib/libavcodec.so.27.2
> #10 0x00000397a0df04f2 in avcodec_send_packet () from /usr/local/lib/libavcodec.so.27.2
> #11 0x000003973e8583eb in try_decode_frame () from /usr/local/lib/libavformat.so.24.2
> #12 0x000003973e856477 in avformat_find_stream_info () from /usr/local/lib/libavformat.so.24.2
> #13 0x00000394c50e89f6 in ?? ()
> #14 0x00000394c50ea4e7 in ?? ()
> #15 0x00000394c763a009 in ?? ()
> #16 0x00000394cba638f1 in ?? ()
> #17 0x00000396e40ba5d5 in _dispatch_worker_thread () from /usr/local/lib/libdispatch.so.0.0
> #18 0x0000039707398c92 in _rthread_start (v=0x397a0b431e0 <pw_m8423x2>) at /usr/src/lib/librthread/rthread.c:99
> #19 0x00000396e8237eca in __tfork_thread () at /usr/src/lib/libc/arch/amd64/sys/tfork_thread.S:87
> 
> cpu0 at mainbus0: apid 0 (boot processor)
> cpu0: 12th Gen Intel(R) Core(TM) i7-1270P, 2095.31 MHz, 06-9a-03, patch 0000043b
> cpu0: cpuid 1 edx=bfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE> ecx=77fafbff<SSE3,PCLMUL,DTES64,MWAIT,DS-CPL,VMX,SMX,EST,TM2,SSSE3,SDBG,FMA3,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,x2APIC,MOVBE,POPCNT,DEADLINE,AES,XSAVE,AVX,F16C,RDRAND>
> cpu0: cpuid 6 eax=df8ff7<SENSOR,ARAT,PTS> ecx=409<EFFFREQ>
> cpu0: cpuid 7.0 ebx=239c27eb<FSGSBASE,TSC_ADJUST,BMI1,AVX2,SMEP,BMI2,ERMS,INVPCID,RDSEED,ADX,SMAP,CLFLUSHOPT,CLWB,PT,SHA> ecx=98c027ac<UMIP,PKU,WAITPKG,PKS> edx=fc1cc410<MD_CLEAR,IBT,IBRS,IBPB,STIBP,L1DF,SSBD>
> 

May I ask you to test this diff?

I think I had found all needed places for IBT/BTI.

Index: Makefile
===================================================================
RCS file: /home/cvs/ports/graphics/ffmpeg/Makefile,v
diff -u -p -r1.258 Makefile
--- Makefile	21 May 2026 16:24:15 -0000	1.258
+++ Makefile	13 Jun 2026 00:13:28 -0000
@@ -2,6 +2,7 @@ COMMENT=	audio/video converter and strea
 
 # keep it synced with x11/mplayer
 V=		8.1.1
+REVISION=	0
 DISTNAME=	ffmpeg-${V}
 CATEGORIES=	graphics multimedia
 SITES=		https://ffmpeg.org/releases/
Index: patches/patch-libavcodec_x86_vp9itxfm_16bpp_avx512_asm
===================================================================
RCS file: patches/patch-libavcodec_x86_vp9itxfm_16bpp_avx512_asm
diff -N patches/patch-libavcodec_x86_vp9itxfm_16bpp_avx512_asm
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-libavcodec_x86_vp9itxfm_16bpp_avx512_asm	13 Jun 2026 00:08:12 -0000
@@ -0,0 +1,19 @@
+Index: libavcodec/x86/vp9itxfm_16bpp_avx512.asm
+--- libavcodec/x86/vp9itxfm_16bpp_avx512.asm.orig
++++ libavcodec/x86/vp9itxfm_16bpp_avx512.asm
+@@ -375,6 +375,7 @@ cglobal vp9_idct_16x16_internal_10, 0, 7, 22, dst, str
+     TRANSPOSE_4D          4,  5,  6,  7, 16
+     jmp                tx2q
+ .pass2:
++    _CET_ENDBR
+     test               eobd, eobd
+     jl .pass2_fast
+     call .main_part1
+@@ -603,6 +604,7 @@ cglobal vp9_iadst_16x16_internal_10, 0, 7, 22, dst, st
+     WRAP_YMM IADST16_PASS1_END
+     jmp m(vp9_idct_16x16_internal_10).pass1_fast_end
+ .pass2:
++    _CET_ENDBR
+     test               eobd, eobd
+     jl .pass2_fast
+     call .main_part1
Index: patches/patch-libavcodec_x86_vp9itxfm_avx2_asm
===================================================================
RCS file: patches/patch-libavcodec_x86_vp9itxfm_avx2_asm
diff -N patches/patch-libavcodec_x86_vp9itxfm_avx2_asm
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-libavcodec_x86_vp9itxfm_avx2_asm	13 Jun 2026 00:08:12 -0000
@@ -0,0 +1,51 @@
+Index: libavcodec/x86/vp9itxfm_avx2.asm
+--- libavcodec/x86/vp9itxfm_avx2.asm.orig
++++ libavcodec/x86/vp9itxfm_avx2.asm
+@@ -336,6 +336,7 @@ cglobal vp9_idct_4x4_internal, 0, 5, 6, dst, stride, c
+     pshufb               m1, m3, m2
+     jmp                tx2q
+ .pass2:
++    _CET_ENDBR
+     call .main
+ .pass2_end:
+     vpbroadcastd         m2, [o(pw_2048)]
+@@ -382,6 +383,7 @@ cglobal vp9_iadst_4x4_internal, 0, 5, 6, dst, stride, 
+     call .main
+     jmp m(vp9_idct_4x4_internal).pass1_end
+ .pass2:
++    _CET_ENDBR
+     call .main
+     jmp m(vp9_idct_4x4_internal).pass2_end
+ ALIGN function_align
+@@ -481,6 +483,7 @@ cglobal vp9_idct_8x8_internal, 0, 5, 8, dst, stride, c
+     vperm2i128           m3, m5, m3, 0x31
+     jmp                tx2q
+ .pass2:
++    _CET_ENDBR
+     call .main
+     vpbroadcastd         m4, [o(pw_1024)]
+     vpermq               m1, m1, q2031
+@@ -553,6 +556,7 @@ cglobal vp9_iadst_8x8_internal, 0, 5, 8, dst, stride, 
+     vinserti128          m1, m4, xm1, 1
+     jmp                tx2q
+ .pass2:
++    _CET_ENDBR
+     pshufd               m4, m0, q1032
+     pshufd               m5, m1, q1032
+     call .main
+@@ -923,6 +927,7 @@ cglobal vp9_idct_16x16_internal, 0, 5, 16, 32*6, dst, 
+     call .transpose_8x8
+     jmp                tx2q
+ .pass2:
++    _CET_ENDBR
+     test               eobd, eobd
+     jl .pass2_fast
+     call .main
+@@ -1039,6 +1044,7 @@ cglobal vp9_iadst_16x16_internal, 0, 5, 16, 32*6, dst,
+     mova                xm0, [rsp+32*0]
+     jmp m(vp9_idct_16x16_internal).pass1_fast_end
+ .pass2:
++    _CET_ENDBR
+     test               eobd, eobd
+     jl .pass2_fast
+     call .main
Index: patches/patch-libavcodec_x86_vp9itxfm_avx512_asm
===================================================================
RCS file: patches/patch-libavcodec_x86_vp9itxfm_avx512_asm
diff -N patches/patch-libavcodec_x86_vp9itxfm_avx512_asm
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-libavcodec_x86_vp9itxfm_avx512_asm	13 Jun 2026 00:08:12 -0000
@@ -0,0 +1,19 @@
+Index: libavcodec/x86/vp9itxfm_avx512.asm
+--- libavcodec/x86/vp9itxfm_avx512.asm.orig
++++ libavcodec/x86/vp9itxfm_avx512.asm
+@@ -524,6 +524,7 @@ cglobal vp9_idct_16x16_internal, 0, 5, 16, dst, stride
+     punpckldq            m0, m4     ; 0-1
+     jmp                tx2q
+ .pass2:
++    _CET_ENDBR
+     test               eobd, eobd
+     jl .pass2_fast
+     call .main
+@@ -771,6 +772,7 @@ cglobal vp9_iadst_16x16_internal, 0, 5, 16, dst, strid
+     vpermt2q             m3, m5, m4
+     jmp                tx2q
+ .pass2:
++    _CET_ENDBR
+     pshufd               m1, m1, q1032
+     pshufd               m3, m3, q1032
+     test               eobd, eobd
Index: patches/patch-libavcodec_x86_vvc_mc_asm
===================================================================
RCS file: patches/patch-libavcodec_x86_vvc_mc_asm
diff -N patches/patch-libavcodec_x86_vvc_mc_asm
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-libavcodec_x86_vvc_mc_asm	13 Jun 2026 00:08:12 -0000
@@ -0,0 +1,69 @@
+Index: libavcodec/x86/vvc/mc.asm
+--- libavcodec/x86/vvc/mc.asm.orig
++++ libavcodec/x86/vvc/mc.asm
+@@ -41,7 +41,7 @@ SECTION_RODATA
+     %xdefine %%prefix mangle(private_prefix %+ _vvc_%1_%3_%4)
+     %%table:
+     %rep %0 - 4
+-        dd %%prefix %+ .w%5 - %%base
++        dd %%prefix %+ .w%5_ibt - %%base
+         %rotate 1
+     %endrep
+ %endmacro
+@@ -75,6 +75,8 @@ SECTION .text
+ 
+ %if %3
+ INIT_XMM cpuname
++.w2_ibt:
++    _CET_ENDBR
+ .w2:
+     movd                xm0, [src0q]
+     pinsrd              xm0, [src0q + AVG_SRC_STRIDE], 1
+@@ -84,6 +86,8 @@ INIT_XMM cpuname
+     AVG_SAVE_W2          %1
+     AVG_LOOP_END        .w2
+ 
++.w4_ibt:
++    _CET_ENDBR
+ .w4:
+     movq                xm0, [src0q]
+     pinsrq              xm0, [src0q + AVG_SRC_STRIDE], 1
+@@ -95,6 +99,8 @@ INIT_XMM cpuname
+     AVG_LOOP_END        .w4
+ 
+ INIT_YMM cpuname
++.w8_ibt:
++    _CET_ENDBR
+ .w8:
+     movu               xm0, [src0q]
+     movu               xm1, [src1q]
+@@ -105,21 +111,29 @@ INIT_YMM cpuname
+ 
+     AVG_LOOP_END       .w8
+ 
++.w16_ibt:
++    _CET_ENDBR
+ .w16:
+     AVG_W16_FN          %1, %2, 1
+ 
+     AVG_LOOP_END       .w16
+ 
++.w32_ibt:
++    _CET_ENDBR
+ .w32:
+     AVG_W16_FN          %1, %2, 2
+ 
+     AVG_LOOP_END       .w32
+ 
++.w64_ibt:
++    _CET_ENDBR
+ .w64:
+     AVG_W16_FN          %1, %2, 4
+ 
+     AVG_LOOP_END       .w64
+ 
++.w128_ibt:
++    _CET_ENDBR
+ .w128:
+     AVG_W16_FN          %1, %2, 8
+ 
Index: patches/patch-libswscale_x86_ops_int_asm
===================================================================
RCS file: patches/patch-libswscale_x86_ops_int_asm
diff -N patches/patch-libswscale_x86_ops_int_asm
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-libswscale_x86_ops_int_asm	13 Jun 2026 00:08:12 -0000
@@ -0,0 +1,11 @@
+Index: libswscale/x86/ops_int.asm
+--- libswscale/x86/ops_int.asm.orig
++++ libswscale/x86/ops_int.asm
+@@ -106,6 +106,7 @@ IF %1 > 3,  mov out3q, [execq + SwsOpExec.out3]
+ %endif
+ align function_align
+ current_function %+ _return:
++    _CET_ENDBR
+ 
+             ; op chain always returns back here
+             mov implq, [rsp + 8]


-- 
wbr, Kirill