Op dinsdag 7 juni 2005 19:05, schreef Igor Kovalenko: > Takashi Iwai wrote: > > At Tue, 7 Jun 2005 17:16:02 +0200, > > > > Alien wrote: > >>[1 ] > >> > >>Op dinsdag 7 juni 2005 17:05, schreef Raymond: > >>>The patch (diff11.diff) cause segmenation fault on my 32bit machine > >>>during /etc/init.d/alsasound start > >>> > >>>http://savannah.nongnu.org/patch/?func=detailitem&item_id=3948 > >>> > >>>Do anyone know why readl() and writel() behave different in i386 > >>>(32bits) and AMD64 (64bits) ? > >>> > >>>http://sourceforge.net/mailarchive/message.php?msg_id=10773530 > >>> > >>> > >>>#ifndef CONFIG_X86_64 > >>> > >>>#define hwread(x,y) readl((x)+((y)>>2)) > >>>#define hwwrite(x,y,z) writel((z),(x)+((y)>>2)) > >>> > >>>#else > >>> > >>>#define hwread(x,y) readl((x)+(y)) > >>>#define hwwrite(x,y,z) writel((z),(x)+(y)) > >>> > >>>#endif > >> > >>that doesn't look good, unless the mmio is void* in 32bit and unsigned > >> long* in x86_64... > >> > >>'unsigned long* mmio' should be preferred and together with '#define > >>hwread(x,y) readl((x)+(y))' , this works for both platforms > > > > I guess using "unsigned long" for both architectures is broken, too. > > Should be "u32" to be arch-independent. > > I strongly believe readl() and writel() on x86_64 does 32 bit reads/writes. > (checked linux-2.6.12-rc5). Therefore reads/writes are of correct size with > that patch - should be something different. i know that does not work! when i started doing this, i got segfaults because of the >>2 . readl and writel do long operations as evidenced by the 'l' i know this seems weird, but this is memory-mapped, and appearantly it's memory mapped to long, anyway; when i do 'unsigned long* mmio' and i use readl and writel without any bitshifts, it works... you may believe what you want, but i _know_ that on x86_64, i _NEED_ unsigned long* mmio and no bitshifting to get this to work. maybe the problem lies with writel and readl to begin with, maybe if you wrote an int, it would work... AL13N