Date: Wed, 02 Jan 2019 15:27:27 +0000 From: bugzilla-noreply@freebsd.org To: multimedia@FreeBSD.org Subject: [Bug 234574] audio/jack: jackd dies with SIGBUS using 24 bit OSS devices Message-ID: <bug-234574-12827@https.bugs.freebsd.org/bugzilla/>
next in thread | raw e-mail | index | archive | help
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=234574 Bug ID: 234574 Summary: audio/jack: jackd dies with SIGBUS using 24 bit OSS devices Product: Ports & Packages Version: Latest Hardware: amd64 OS: Any Status: New Severity: Affects Only Me Priority: --- Component: Individual Port(s) Assignee: multimedia@FreeBSD.org Reporter: dev@submerge.ch Flags: maintainer-feedback?(multimedia@FreeBSD.org) Assignee: multimedia@FreeBSD.org Attachment #200715 text/plain mime type: Created attachment 200715 --> https://bugs.freebsd.org/bugzilla/attachment.cgi?id=200715&action=edit Round up internal buffer sizes to make buffer offsets 16 byte aligned. When starting jackd on an OSS device with 24 bit sample resolution, jackd may just crash with SIGBUS as soon as it is exercised by some client like ardour. How to reproduce: 1. Install audio/jack and audio/ardour5 with default options (DYNSIMD=on) on a machine that supports SSE instructions. 2. Make sure the OSS device processes 24 bit samples, e.g. using vchan set sysctl dev.pcm.2.play.vchanformat=s24le:2.0 sysctl dev.pcm.2.rec.vchanformat=s24le:2.0 3. Start jackd with 24 bit samples on that OSS device, e.g. jackd -r -doss -r44100 -p1024 -n3 -w24 --capture /dev/dsp2 --playback /dev/dsp2 4. Create a new recording project in ardour5, jackd should crash as soon as the jack busses are initialized by Ardour. Workaround: Compile audio/jack with port option DYNSIMD disabled (DYNSIMD=off). Analysis: The jackd server crashes in x86_sse_copyf(...) found in libjack/simd.c, where it tries to process a misaligned buffer with SIMD instructions. These instructions require the buffer to be 16-byte aligned, which it is not. As far as I understand, the OSS part of jackd will reset the internal buffer size according to the number of samples that fit into the system device buffer. A standard system buffer of 8kB then contains 8192 bytes / 2 channels / 3 bytes per sample = 1365 samples. The jackd internal 4-byte float sample buffers will then be reset to size 1365 * 4 = 5460 which is not 16-byte aligned. For testing, this procedure and the buffer sizes are printed when starting jackd in verbose mode (-v). 16 bit and 32 bit samples on the OSS side usually do not exhibit this bug, because they tend to result in a number of buffered samples that is a multiple of 4. This may depend on buffer size and number of channels though. Patch: The patch provided can be added to audio/jack/files/ and inserts some padding to the internal buffers of the jack server to make them 16-byte aligned. It should only affect cases of misaligned buffer sizes when SIMD instructions are enabled. -- You are receiving this mail because: You are the assignee for the bug.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?bug-234574-12827>
