Package: libwebkit2gtk-4.1-0 Version: 2.36.3-1 Followup-For: Bug #1012548 X-Debbugs-Cc: karogyoker2+deb...@gmail.com Control: tags -1 patch upstream
I think not many crashes surfaced because not many people are using real 32 bit CPUs meanwhile visiting websites with Web Audio API. All 32 bit CPUs are affected except newer models of Pentium 4. I'm attaching the proposed fix. -- System Information: Debian Release: bookworm/sid APT prefers testing-debug APT policy: (500, 'testing-debug'), (500, 'testing') Architecture: i386 (i686) Kernel: Linux 5.17.0-1-686-pae (SMP w/1 CPU thread; PREEMPT) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE=en_US:en Shell: /bin/sh linked to /usr/bin/dash Init: systemd (via /run/systemd/system) LSM: AppArmor: enabled Versions of packages libwebkit2gtk-4.1-0 depends on: ii bubblewrap 0.6.2-1 ii gstreamer1.0-plugins-base 1.20.2-2 ii gstreamer1.0-plugins-good 1.20.2-1 ii libatk1.0-0 2.38.0-1 ii libc6 2.33-7 ii libcairo2 1.16.0-5 ii libegl1 1.4.0-1 ii libenchant-2-2 2.3.2-1 ii libfontconfig1 2.13.1-4.4 ii libfreetype6 2.12.1+dfsg-2 ii libgcc-s1 12.1.0-2 ii libgcrypt20 1.10.1-2 ii libgdk-pixbuf-2.0-0 2.42.8+dfsg-1 ii libglib2.0-0 2.72.1-1 ii libglx0 1.4.0-1 ii libgstreamer-gl1.0-0 1.20.2-2 ii libgstreamer-plugins-base1.0-0 1.20.2-2 ii libgstreamer1.0-0 1.20.2-1 ii libgtk-3-0 3.24.34-1 ii libharfbuzz-icu0 2.7.4-1+b1 ii libharfbuzz0b 2.7.4-1+b1 ii libhyphen0 2.8.8-7 ii libicu71 71.1-3 ii libjavascriptcoregtk-4.1-0 2.36.3-1 ii libjpeg62-turbo 1:2.1.2-1 ii liblcms2-2 2.12~rc1-2 ii libmanette-0.2-0 0.2.6-3 ii libnotify4 0.7.12-1 ii libopengl0 1.4.0-1 ii libopenjp2-7 2.4.0-6 ii libpango-1.0-0 1.50.7+ds-1 ii libpng16-16 1.6.37-5 ii libseccomp2 2.5.4-1 ii libsecret-1-0 0.20.5-2 ii libsoup-3.0-0 3.0.6-1 ii libsqlite3-0 3.38.5-1 ii libstdc++6 12.1.0-2 ii libsystemd0 250.4-1 ii libtasn1-6 4.18.0-4 ii libwayland-client0 1.20.0-1 ii libwayland-egl1 1.20.0-1 ii libwayland-server0 1.20.0-1 ii libwebp7 1.2.2-2+b1 ii libwebpdemux2 1.2.2-2+b1 ii libwoff1 1.0.2-1+b1 ii libwpe-1.0-1 1.12.0-1 ii libwpebackend-fdo-1.0-1 1.12.0-1 ii libx11-6 2:1.7.5-1 ii libxcomposite1 1:0.4.5-1 ii libxdamage1 1:1.1.5-2 ii libxml2 2.9.14+dfsg-1 ii libxslt1.1 1.1.34-4 ii xdg-dbus-proxy 0.1.4-1 ii zlib1g 1:1.2.11.dfsg-4 Versions of packages libwebkit2gtk-4.1-0 recommends: ii gstreamer1.0-gl 1.20.2-2 ii gstreamer1.0-libav 1.20.2-1 ii gstreamer1.0-plugins-bad 1.20.2-1 ii libgl1-mesa-dri 22.0.5-1 ii xdg-desktop-portal-gtk 1.14.0-1 Versions of packages libwebkit2gtk-4.1-0 suggests: ii gstreamer1.0-alsa 1.20.2-2 -- no debconf information
diff --git a/Source/WebCore/platform/audio/DenormalDisabler.h b/Source/WebCore/platform/audio/DenormalDisabler.h index e0b3efd80f78..3ea2098099bb 100644 --- a/Source/WebCore/platform/audio/DenormalDisabler.h +++ b/Source/WebCore/platform/audio/DenormalDisabler.h @@ -26,6 +26,7 @@ #define DenormalDisabler_h #include <wtf/MathExtras.h> +#include <cinttypes> namespace WebCore { @@ -36,7 +37,7 @@ namespace WebCore { #define HAVE_DENORMAL #endif -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) +#if defined(__GNUC__) && defined(__SSE__) #define HAVE_DENORMAL #endif @@ -56,7 +57,7 @@ public: _controlfp_s(&unused, _DN_FLUSH, _MCW_DN); #else m_savedCSR = getCSR(); - setCSR(m_savedCSR | 0x8040); + setCSR(m_savedCSR | (isDAZSupported() ? 0x8040 : 0x8000)); #endif } @@ -83,7 +84,32 @@ public: #endif } private: -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) +#if defined(__GNUC__) && defined(__SSE__) + static inline bool isDAZSupported() + { +#if defined(__x86_64__) + return true; +#else + static bool s_isInited = false; + static bool s_isSupported = false; + if (s_isInited) + return s_isSupported; + + struct fxsaveResult { + uint8_t before[28]; + uint32_t CSRMask; + uint8_t after[480]; + } __attribute__ ((aligned (16))); + + fxsaveResult registerData; + memset(®isterData, 0, sizeof(fxsaveResult)); + asm volatile("fxsave %0" : "=m" (registerData)); + s_isSupported = registerData.CSRMask & 0x0040; + s_isInited = true; + return s_isSupported; +#endif + } + inline int getCSR() { int result;