Hi, this is the last patch necessary to get pcm alsa running for i386-apps on ppc.
Alsa does some fancy magic with mmap to share information with the kernel. This is completely fine as long as we're talking about arch(kernel) == arch(userspace), which apparently is not the case when using qemu-user. As a more or less hacky workaround on that I just disabled the mmap calls alsa-lib uses to initiate communication with the kernel. If these fail, alsa reverts to other means of communication which get converted. Alex
Index: qemu/linux-user/mmap.c =================================================================== --- qemu.orig/linux-user/mmap.c +++ qemu/linux-user/mmap.c @@ -152,6 +152,9 @@ static int mmap_frag(target_ulong real_s return 0; } +#define SNDRV_PCM_MMAP_OFFSET_STATUS 0x80000000; +#define SNDRV_PCM_MMAP_OFFSET_CONTROL 0x81000000; + /* NOTE: all the constants are the HOST ones */ long target_mmap(target_ulong start, target_ulong len, int prot, int flags, int fd, target_ulong offset) @@ -192,6 +195,17 @@ long target_mmap(target_ulong start, tar } #endif + /* Alsa tries to communcate with the kernel via mmap. This usually + * is a good idea when user- and kernelspace are running on the + * same architecture but does not work out when not. To make alsa + * not to use mmap, we can just have it fail on the mmap calls that + * would initiate this. + */ + if(offset == SNDRV_PCM_MMAP_OFFSET_STATUS || offset == SNDRV_PCM_MMAP_OFFSET_CONTROL) { + errno = EINVAL; + return -1; + } + if (offset & ~TARGET_PAGE_MASK) { errno = EINVAL; return -1;