no mmap for alsa
PATCH 1/1 no mmap for alsa
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
linux-user/mmap.c +14 -0
@@ -152,6 +152,9 @@ static int mmap_frag(target_ulong real_sreturn 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 ;
Oops, the patch did not compile. This is the updated version.
Alex
linux-user/mmap.c +14 -0
@@ -152,6 +152,9 @@ static int mmap_frag(target_ulong real_sreturn 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 ;