Alien wrote: > 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 <text/plain; iso-8859-1 (quoted-printable)>] >>>> >>>>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
OK, then let's put it this way: change to void* and removal of shifts is to make address operations correct. That is the address itself is at the same offset on all arches. Then readl/writel just do 32 bit read/write which is what we need. May be it is the mapping is wrong? Please check if you applied the patch correctly - I suspect you used different kernel version and patch may have missed some points... BTW the segfault (oops) report would be handy. -- Kind regards, Igor V. Kovalenko _______________________________________________ Openvortex-dev mailing list [email protected] http://lists.nongnu.org/mailman/listinfo/openvortex-dev
