* Re: [alsa-cvslog] CVS: alsa-kernel/pci/emu10k1 emufx.c,1.59,1.60
[not found] <E1CNAGJ-000270-L7@sc8-pr-cvs1.sourceforge.net>
@ 2004-11-07 18:11 ` James Courtier-Dutton
2004-11-08 6:39 ` Jaroslav Kysela
0 siblings, 1 reply; 3+ messages in thread
From: James Courtier-Dutton @ 2004-11-07 18:11 UTC (permalink / raw)
To: Jaroslav Kysela; +Cc: Alsa-devel
Jaroslav Kysela wrote:
> Update of /cvsroot/alsa/alsa-kernel/pci/emu10k1
> In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7704/pci/emu10k1
>
> Modified Files:
> emufx.c
> Log Message:
> Summary: fixed emu10k1_fx8010_code_t structure to be less than 8192 bytes
>
> This patch fixes emu10k1_fx8010_code_t structure using indirect pointers
> to be less than 8192 bytes to follow the ioctl semantics.
>
>
>
> -static void snd_emu10k1_audigy_write_op(emu10k1_fx8010_code_t *icode, unsigned int *ptr,
> - u32 op, u32 r, u32 a, u32 x, u32 y)
> +static int snd_emu10k1_audigy_write_op(emu10k1_fx8010_code_t *icode, unsigned int *ptr,
> + u32 op, u32 r, u32 a, u32 x, u32 y)
> {
> snd_assert(*ptr < 1024, return);
> set_bit(*ptr, icode->code_valid);
> - icode->code[*ptr ][0] = ((x & 0x7ff) << 12) | (y & 0x7ff);
> - icode->code[(*ptr)++][1] = ((op & 0x0f) << 24) | ((r & 0x7ff) << 12) | (a & 0x7ff);
> + x = ((x & 0x7ff) << 12) | (y & 0x7ff);
> + y = ((op & 0x0f) << 24) | ((r & 0x7ff) << 12) | (a & 0x7ff);
> + a = *ptr++ * 2;
> + if (put_user(x, &icode->code[a + 0]) ||
> + put_user(y, &icode->code[a + 1]))
> + return -EFAULT;
> + return 0;
> }
>
> #define A_OP(icode, ptr, op, r, a, x, y) \
> @@ -501,83 +511,108 @@
This code breaks Audigy 1/2 support.
1)
+ a = *ptr++ * 2;
should be
+ a = (*ptr)++ * 2;
We want the integer to increase, not the pointer to the integer.
That bug causes the snd-emu10k1 driver to hang during modprobe.
2)
> + if (put_user(x, &icode->code[a + 0]) ||
> + put_user(y, &icode->code[a + 1]))
> + return -EFAULT;
Will always return -EFAULT on my system. I don't think that is what we
really want.
James
-------------------------------------------------------
This SF.Net email is sponsored by:
Sybase ASE Linux Express Edition - download now for FREE
LinuxWorld Reader's Choice Award Winner for best database on Linux.
http://ads.osdn.com/?ad_id=5588&alloc_id=12065&op=click
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [alsa-cvslog] CVS: alsa-kernel/pci/emu10k1 emufx.c,1.59,1.60
2004-11-07 18:11 ` [alsa-cvslog] CVS: alsa-kernel/pci/emu10k1 emufx.c,1.59,1.60 James Courtier-Dutton
@ 2004-11-08 6:39 ` Jaroslav Kysela
2004-11-09 0:12 ` James Courtier-Dutton
0 siblings, 1 reply; 3+ messages in thread
From: Jaroslav Kysela @ 2004-11-08 6:39 UTC (permalink / raw)
To: James Courtier-Dutton; +Cc: Jaroslav Kysela, Alsa-devel
On Sun, 7 Nov 2004, James Courtier-Dutton wrote:
> 2)
> > + if (put_user(x, &icode->code[a + 0]) ||
> > + put_user(y, &icode->code[a + 1]))
> > + return -EFAULT;
>
> Will always return -EFAULT on my system. I don't think that is what we
> really want.
Does this patch help?
Index: emufx.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/emu10k1/emufx.c,v
retrieving revision 1.61
diff -u -r1.61 emufx.c
--- emufx.c 30 Oct 2004 07:44:20 -0000 1.61
+++ emufx.c 8 Nov 2004 06:41:21 -0000
@@ -468,11 +468,11 @@
static int snd_emu10k1_write_op(emu10k1_fx8010_code_t *icode, unsigned int *ptr,
u32 op, u32 r, u32 a, u32 x, u32 y)
{
- snd_assert(*ptr < 512, return);
+ snd_assert(*ptr < 512, return -EINVAL);
set_bit(*ptr, icode->code_valid);
x = ((x & 0x3ff) << 10) | (y & 0x3ff);
y = ((op & 0x0f) << 20) | ((r & 0x3ff) << 10) | (a & 0x3ff);
- a = *ptr++ * 2;
+ a = (*ptr)++ * 2;
if (put_user(x, &icode->code[a + 0]) ||
put_user(y, &icode->code[a + 1]))
return -EFAULT;
@@ -485,11 +485,11 @@
static int snd_emu10k1_audigy_write_op(emu10k1_fx8010_code_t *icode, unsigned int *ptr,
u32 op, u32 r, u32 a, u32 x, u32 y)
{
- snd_assert(*ptr < 1024, return);
+ snd_assert(*ptr < 1024, return -EINVAL);
set_bit(*ptr, icode->code_valid);
x = ((x & 0x7ff) << 12) | (y & 0x7ff);
y = ((op & 0x0f) << 24) | ((r & 0x7ff) << 12) | (a & 0x7ff);
- a = *ptr++ * 2;
+ a = (*ptr)++ * 2;
if (put_user(x, &icode->code[a + 0]) ||
put_user(y, &icode->code[a + 1]))
return -EFAULT;
@@ -1010,7 +1010,7 @@
INIT_LIST_HEAD(&emu->fx8010.gpr_ctl);
if ((icode = kcalloc(1, sizeof(*icode), GFP_KERNEL)) == NULL ||
- (icode->gpr_map = kcalloc(512 + 256 + 256, sizeof(u_int32_t), GFP_KERNEL)) == NULL ||
+ (icode->gpr_map = kcalloc(512 + 256 + 256 + 2 * 1024, sizeof(u_int32_t), GFP_KERNEL)) == NULL ||
(controls = kcalloc(SND_EMU10K1_GPR_CONTROLS, sizeof(*controls), GFP_KERNEL)) == NULL) {
err = -ENOMEM;
goto __err;
@@ -1018,6 +1018,7 @@
icode->tram_data_map = icode->gpr_map + 512;
icode->tram_addr_map = icode->tram_data_map + 256;
+ icode->code = icode->tram_addr_map + 256;
/* clear free GPRs */
for (i = 0; i < 512; i++)
@@ -1460,7 +1461,7 @@
if ((icode = kcalloc(1, sizeof(*icode), GFP_KERNEL)) == NULL)
return -ENOMEM;
- if ((icode->gpr_map = kcalloc(256 + 160 + 160, sizeof(u_int32_t), GFP_KERNEL)) == NULL ||
+ if ((icode->gpr_map = kcalloc(256 + 160 + 160 + 2 * 512, sizeof(u_int32_t), GFP_KERNEL)) == NULL ||
(controls = kcalloc(SND_EMU10K1_GPR_CONTROLS, sizeof(emu10k1_fx8010_control_gpr_t), GFP_KERNEL)) == NULL ||
(ipcm = kcalloc(1, sizeof(*ipcm), GFP_KERNEL)) == NULL) {
err = -ENOMEM;
@@ -1469,6 +1470,7 @@
icode->tram_data_map = icode->gpr_map + 256;
icode->tram_addr_map = icode->tram_data_map + 160;
+ icode->code = icode->tram_addr_map + 160;
/* clear free GPRs */
for (i = 0; i < 256; i++)
Jaroslav
-----
Jaroslav Kysela <perex@suse.cz>
Linux Kernel Sound Maintainer
ALSA Project, SUSE Labs
-------------------------------------------------------
This SF.Net email is sponsored by:
Sybase ASE Linux Express Edition - download now for FREE
LinuxWorld Reader's Choice Award Winner for best database on Linux.
http://ads.osdn.com/?ad_id=5588&alloc_id=12065&op=click
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [alsa-cvslog] CVS: alsa-kernel/pci/emu10k1 emufx.c,1.59,1.60
2004-11-08 6:39 ` Jaroslav Kysela
@ 2004-11-09 0:12 ` James Courtier-Dutton
0 siblings, 0 replies; 3+ messages in thread
From: James Courtier-Dutton @ 2004-11-09 0:12 UTC (permalink / raw)
To: Jaroslav Kysela; +Cc: Jaroslav Kysela, Alsa-devel
Jaroslav Kysela wrote:
> On Sun, 7 Nov 2004, James Courtier-Dutton wrote:
>
>
>>2)
>> > + if (put_user(x, &icode->code[a + 0]) ||
>> > + put_user(y, &icode->code[a + 1]))
>> > + return -EFAULT;
>>
>>Will always return -EFAULT on my system. I don't think that is what we
>>really want.
>
>
> Does this patch help?
>
I have just tried the CVS, that includes your fixes.
Still returns -EFAULT.
At least the kernel module loads, but, no DSP code is installed.
James
-------------------------------------------------------
This SF.Net email is sponsored by:
Sybase ASE Linux Express Edition - download now for FREE
LinuxWorld Reader's Choice Award Winner for best database on Linux.
http://ads.osdn.com/?ad_id=5588&alloc_id=12065&op=click
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2004-11-09 0:12 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <E1CNAGJ-000270-L7@sc8-pr-cvs1.sourceforge.net>
2004-11-07 18:11 ` [alsa-cvslog] CVS: alsa-kernel/pci/emu10k1 emufx.c,1.59,1.60 James Courtier-Dutton
2004-11-08 6:39 ` Jaroslav Kysela
2004-11-09 0:12 ` James Courtier-Dutton
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.