[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH] no mmap for alsa
From: |
Alexander Graf |
Subject: |
[Qemu-devel] [PATCH] no mmap for alsa |
Date: |
Tue, 03 Jul 2007 19:41:31 +0200 |
User-agent: |
Thunderbird 1.5.0.10 (X11/20060911) |
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;
- [Qemu-devel] [PATCH] no mmap for alsa,
Alexander Graf <=