[Common-dev] Resend: CR-Client - AMD 64 patches
Dean Collins dcollins at real.comI don't see why the common/include/atomicbase.h changes are part of this diff, I already implemented this and checked it in some time ago. The diff looks like the exact code I wrote. It has been tested pretty heavily at this point on a dual-proc AMD64 system. BTW, the server at least builds natively for AMD64 (though it doesn't really run yet). > dbg/oggfformat_libs.a: could not read symbols: Bad value > collect2: ld returned 1 exit status > make: *** [dbg/oggfformat.so] Error 1 I had weird intermittent errors like this as well a while back, which with the help of AMD we traced back to buggy pre-production hardware. By moving to a newer AMD64 system the problems went away and it builds just fine. Dean On Thu, Sep 30, 2004 at 09:35:03AM -0700, Rob Lanphier wrote: > > -----Forwarded Message----- > From: Robert M. Stockmann <stock at stokkie.net> > To: common-dev at helixcommunity.org > Subject: [Common-dev] CR-Client > Date: Fri, 24 Sep 2004 00:28:49 +0200 > > > Dear Developers, > > Please find attached a patch for the common-dev subproject to be submitted > into the Helix project for peer review, as well as a README.txt with > more detailed info. > > Patch details : > =============== > > Modified by: Robert M. Stockmann > Reviewed by: Rob Lanphier > Date: Thu Sep 23 23:50:45 CEST 2004 > Project: player > > Synopsis: > Fix: add/activate amd64 as platform > Files Modified: common/import/gecko-sdk/nspr/include/prcpucfg.h > common/include/atomicbase.h > Files Added: > > Image Size and Heap Use impact: > Platforms and Profiles Build Verified: amd64 > Platforms and Profiles Functionality verified: failure : > > $ export HX_DEBUGLEVEL=2 > $ hxplay > HX_ASSERT failed: (GetSize() == ulLength)... File hxbuffer.cpp, Line 309 > HX_ASSERT failed: (GetSize() == ulLength)... File hxbuffer.cpp, Line 309 > > GLib-ERROR **: gmem.c:140: failed to allocate 17149707381026848842 bytes > aborting... > Aborted > > Branch: common > Copyright assignment: I agree to assign to RealNetworks full copyright > ownership of the code represented by the attached patch. I warrant that > I am legally entitled to grant the copyright assignment and that my > contribution does not violate any law or breach any contract. I > understand that RealNetworks may license this code under RPSL, RCSL, > and/or any other license at RealNetworks' sole discretion. > QA Instructions: > > Regards, > > Robert > > Hi, > > After some tweaking and brute-force hacking i managed to build > a 64bit clean x86_64/amd64 RPM for Mandrake 10.0 amd64. > Here's how i did it, which code changes i needed and which already > installed library RPMS needed to be rebuild. Who said again that a > clean build doesn't mean anything? Well thats right, because the > x86_64 source/binaries contain some errors. > > HOWTO BUILD a X86_64/AMD64/Opteron HelixPlayer amd64.rpm : > ========================================================== > > 1. I downloaded the following SRPM from the Fedora DEV page : > > http://redhat.secsup.org/fedora/core/development/x86_64/SRPMS/HelixPlayer-1.0.gold-3.src.rpm > > 2. Just install/unpack it on disk : > > # rpm -i HelixPlayer-1.0.gold-3.src.rpm > > 3. Adjust the HelixPlayer .spec file : > > # vi /usr/src/RPM/SPECS/HelixPlayer.spec > > and make the following adjustments : > > #ExcludeArch: ppc64 x86_64 ppc s390 s390x ia64 <=== allow x86_64/amd64 to build > ExcludeArch: ppc64 i586 ppc s390 s390x ia64 <=== exclude i586 to build > > > #%patch3 -p1 -b filechooser <=== Comment out if you don't have Gtk2.2 > > add : > > Patch5: helix-amd64-platform.patch.bz2 <== add this as extra patch. > > %patch5 -p1 -b amd64 <== execute Patch5 during a RPM build > > 4. Build the binary amd64 RPM : > > # cd /usr/src/RPM/SPECS > # rpm -v -ba HelixPlayer.spec > > .... > Wrote: /usr/src/RPM/SRPMS/HelixPlayer-1.0.gold-3.src.rpm > Wrote: /usr/src/RPM/RPMS/amd64/HelixPlayer-1.0.gold-3.amd64.rpm > Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.53193 > > > However when trying to execute/run it i get this : > > $ hxplay > HX_ASSERT failed: (GetSize() == ulLength)... File hxbuffer.cpp, Line 309 > Aborted > $ > $ export HX_DEBUGLEVEL=2 > $ hxplay > HX_ASSERT failed: (GetSize() == ulLength)... File hxbuffer.cpp, Line 309 > HX_ASSERT failed: (GetSize() == ulLength)... File hxbuffer.cpp, Line 309 > > GLib-ERROR **: gmem.c:140: failed to allocate 17149707381026848842 bytes > aborting... > Aborted > $ > > NOTES on HOWTO BUILD a AMD64 RPM : > ================================== > > A. Sometimes the following error is occuring during compiling : > > UNIXCompile(datatype/text/realtext/renderer): making copy > leaving directory /usr/src/RPM/BUILD/hxplay-1.0.0.298/./datatype/text/realtext/renderer > from directory /usr/src/RPM/BUILD/hxplay-1.0.0.298 > entering directory datatype/ogg/fileformat > UNIXCompile(datatype/ogg/fileformat): generating makefiles > UMAKE: Umakefil -> Makefile in datatype/ogg/fileformat > UMAKE: Applying profile /usr/src/RPM/BUILD/hxplay-1.0.0.298/build/umakepf/helix-client-all-defines-free.pf > UNIXCompile(datatype/ogg/fileformat): making depend > UNIXCompile(datatype/ogg/fileformat): making all > ERROR: UNIXCompile(datatype/ogg/fileformat) ERROR: Make failed. > > --- Build System Error ------------------------------------ > Make failed. > ----------------------------------------------------------- > > From /usr/src/RPM/BUILD/hxplay-1.0.0.298/build.out we see this make error : > > g++ -shared oggfformat.exp -o dbg/oggfformat.so -u RMACreateInstance dbg/obj/oggfformat.o dbg/obj/ogg_page_reader.o dbg/obj/page2packet.o dbg/obj/vorbis_page2pkt.o dbg/obj/theora_page2pkt.o dbg/obj/base_page2pkt.o dbg/obj/strm_group.o dbg/obj/oggutil.o dbg/oggfformat_libs.a -L/usr/lib64 -L/usr/X11R6/lib64 -lstdc++ > /usr/bin/ld: dbg/oggfformat_libs.a(libogg.framing.o): relocation R_X86_64_32S can not be used when making a shared object; recompile with -fPIC > dbg/oggfformat_libs.a: could not read symbols: Bad value > collect2: ld returned 1 exit status > make: *** [dbg/oggfformat.so] Error 1 > Time used: 1.18 seconds > ERROR: UNIXCompile(datatype/ogg/fileformat) ERROR: Make failed. > > --- Build System Error ------------------------------------ > Make failed. > ----------------------------------------------------------- > > It seems that /usr/lib64/libogg.a (framing.o) is somehow being detected > as a 32bit object file. But thats of course not the case. Just make sure, > as is correctly suggested above, that everyting is compiled with -fPIC. > To do that inside a RPM .SPEC file one can add this line inside libogg.spec : > > %define optflags -O2 -pipe %{debugcflags} -fPIC -DPIC > > This was for me also needed for libvorbis.spec. It turns out that X86_64 > wants for all its dynamic libraries a global ofset, needed when linking > 64bit binaries : > > # nm /usr/lib64/libvorbis.a | more > > mdct.o: > U free > U _GLOBAL_OFFSET_TABLE_ <== needed for linking on amd64 > 0000000000000000 r .LC1 > 0000000000000018 r .LC10 > 0000000000000020 r .LC11 > 0000000000000010 r .LC12 > 0000000000000014 r .LC13 > 0000000000000018 r .LC14 > > The vanilla installed ogg and vorbis libs on mandrake am64 didn't have a > _GLOBAL_OFFSET_TABLE_ inside. Recompiling your SRPM with -fPIC -DPIC thus > indeed gets rid of the "relocation R_X86_64_32S can not be used" error. > > B. Some remarks are to be made about the helix-amd64-platform.patch.bz2 > which was created through trial and error. > the common/import/gecko-sdk/nspr/include/prcpucfg.h diff was retrieved > from CVS somehow. Google found that one for me. And of course > common/include/atomicbase.h needs still to be checked so i read on the > Helix website. The %rax pointer seems to be not quite ok. AMD64 assembly > seems straight forward, but i have my doubts . > > C. The adjustments ( helix-amd64-platform.patch.bz2 ) as well as the binary > and source RPM's can be be found on : > > http://crashrecovery.org/helixp/ > > Thanks > best regards, > > Robert > -- > Robert M. Stockmann - RHCE > Network Engineer - UNIX/Linux Specialist > crashrecovery.org stock at stokkie.net > diff -u -r hxplay-1.0.0.298/common/import/gecko-sdk/nspr/include/prcpucfg.h hxplay-1.0.0.298.amd64/common/import/gecko-sdk/nspr/include/prcpucfg.h > --- hxplay-1.0.0.298/common/import/gecko-sdk/nspr/include/prcpucfg.h 2003-12-16 20:48:05.000000000 +0100 > +++ hxplay-1.0.0.298.amd64/common/import/gecko-sdk/nspr/include/prcpucfg.h 2004-09-16 06:07:34.894345016 +0200 > @@ -182,6 +182,52 @@ > #define PR_BYTES_PER_WORD_LOG2 3 > #define PR_BYTES_PER_DWORD_LOG2 3 > > +#elif defined(__amd64__) > + > +#define IS_LITTLE_ENDIAN 1 > +#undef IS_BIG_ENDIAN > +#define IS_64 > + > +#define PR_BYTES_PER_BYTE 1 > +#define PR_BYTES_PER_SHORT 2 > +#define PR_BYTES_PER_INT 4 > +#define PR_BYTES_PER_INT64 8 > +#define PR_BYTES_PER_LONG 8 > +#define PR_BYTES_PER_FLOAT 4 > +#define PR_BYTES_PER_DOUBLE 8 > +#define PR_BYTES_PER_WORD 8 > +#define PR_BYTES_PER_DWORD 8 > + > +#define PR_BITS_PER_BYTE 8 > +#define PR_BITS_PER_SHORT 16 > +#define PR_BITS_PER_INT 32 > +#define PR_BITS_PER_INT64 64 > +#define PR_BITS_PER_LONG 64 > +#define PR_BITS_PER_FLOAT 32 > +#define PR_BITS_PER_DOUBLE 64 > +#define PR_BITS_PER_WORD 64 > + > +#define PR_BITS_PER_BYTE_LOG2 3 > +#define PR_BITS_PER_SHORT_LOG2 4 > +#define PR_BITS_PER_INT_LOG2 5 > +#define PR_BITS_PER_INT64_LOG2 6 > +#define PR_BITS_PER_LONG_LOG2 6 > +#define PR_BITS_PER_FLOAT_LOG2 5 > +#define PR_BITS_PER_DOUBLE_LOG2 6 > +#define PR_BITS_PER_WORD_LOG2 6 > + > +#define PR_ALIGN_OF_SHORT 2 > +#define PR_ALIGN_OF_INT 4 > +#define PR_ALIGN_OF_LONG 8 > +#define PR_ALIGN_OF_INT64 8 > +#define PR_ALIGN_OF_FLOAT 4 > +#define PR_ALIGN_OF_DOUBLE 8 > +#define PR_ALIGN_OF_POINTER 8 > +#define PR_ALIGN_OF_WORD 8 > + > +#define PR_BYTES_PER_WORD_LOG2 3 > +#define PR_BYTES_PER_DWORD_LOG2 3 > + > #elif defined(__mc68000__) > > #undef IS_LITTLE_ENDIAN > diff -u -r hxplay-1.0.0.298/common/include/atomicbase.h hxplay-1.0.0.298.amd64/common/include/atomicbase.h > --- hxplay-1.0.0.298/common/include/atomicbase.h 2004-07-09 03:45:08.000000000 +0200 > +++ hxplay-1.0.0.298.amd64/common/include/atomicbase.h 2004-09-16 06:07:34.895344864 +0200 > @@ -532,7 +532,7 @@ > > > /*********************************************************************** > - * Intel x86 (gcc) / Unix -- i486 and higher > + * Intel x86 (gcc) / Unix -- i486 and higher - 32-bit > * > * Implementation Notes: > * 'xadd' is only available in the 486 series and later, not the 386. > @@ -672,6 +672,136 @@ > > > /*********************************************************************** > + * Intel x86/amd64/x86_64 (gcc) / Unix -- 64-bit > + * > + * Implementation Notes: > + * > + */ > +#elif defined(__GNUC__) && (defined (__amd64__) || defined (__x86_64__)) > + > +/* Increment by 1 */ > +static __inline__ void > +HXAtomicIncUINT32(UINT32* pNum) > +{ > + __asm__ __volatile__( > + "lock incl (%%rax);" // atomically add 1 to *pNum > + : /* no output */ > + : "a" (pNum) > + : "cc", "memory" > + ); > +} > + > +/* Decrement by 1 */ > +static __inline__ void > +HXAtomicDecUINT32(UINT32* pNum) > +{ > + __asm__ __volatile__( > + "lock decl (%%rax);" // atomically add -1 to *pNum > + : /* no output */ > + : "a" (pNum) > + : "cc", "memory" > + ); > +} > + > +/* Increment by 1 and return new value */ > +static __inline__ UINT32 > +HXAtomicIncRetUINT32(UINT32* pNum) > +{ > + volatile UINT32 ulRet; > + __asm__ __volatile__( > + "lock xaddl %%ebx, (%%rax);" // atomically add 1 to *pNum > + " incl %%ebx;" // old value in %%ebx, increment it > + : "=b" (ulRet) > + : "a" (pNum), "b" (0x1) > + : "cc", "memory" > + ); > + return ulRet; > +} > + > +/* Decrement by 1 and return new value */ > +static __inline__ UINT32 > +HXAtomicDecRetUINT32(UINT32* pNum) > +{ > + volatile UINT32 ulRet; > + __asm__ __volatile__( > + "lock xaddl %%ebx, (%%rax);" // atomically add -1 to *pNum > + " decl %%ebx;" // old value in %%ebx, decrement it > + : "=b" (ulRet) > + : "a" (pNum), "b" (-1) > + : "cc", "memory" > + ); > + return ulRet; > +} > + > +/* Add n */ > +static __inline__ void > +HXAtomicAddUINT32(UINT32* pNum, UINT32 ulNum) > +{ > + __asm__ __volatile__( > + "lock addl %%ebx, (%%rax);" // atomically add ulNum to *pNum > + : /* no output */ > + : "a" (pNum), "b" (ulNum) > + : "cc", "memory" > + ); > +} > + > +/* Subtract n */ > +static __inline__ void > +HXAtomicSubUINT32(UINT32* pNum, UINT32 ulNum) > +{ > + __asm__ __volatile__( > + "lock subl %%ebx, (%%rax);" // atomically add ulNum to *pNum > + : /* no output */ > + : "a" (pNum), "b" (ulNum) > + : "cc", "memory" > + ); > +} > + > +/* Add n and return new value */ > +static __inline__ UINT32 > +HXAtomicAddRetUINT32(UINT32* pNum, UINT32 ulNum) > +{ > + volatile UINT32 ulRet; > + __asm__ __volatile__( > + " movl %%ebx, %%ecx;" // copy ulNum into %0 > + "lock xaddl %%ecx, (%%rax);" // atomically add ulNum to *pNum > + " addl %%ebx, %%ecx;" // old value in %%ecx, add ulNum > + : "=c" (ulRet) > + : "a" (pNum), "b" (ulNum), "c" (0) > + : "cc", "memory" > + ); > + return ulRet; > +} > + > +/* Subtract n and return new value */ > +static __inline__ UINT32 > +HXAtomicSubRetUINT32(UINT32* pNum, UINT32 ulNum) > +{ > + volatile UINT32 ulRet; > + __asm__ __volatile__( > + " subl %%ebx, %%ecx;" // negate ulNum, saving in %0 > + "lock xaddl %%ecx, (%%rax);" // atomically add -(ulNum) to *pNum > + " subl %%ebx, %%ecx;" // old value in %%ecx, subtract ulNum > + : "=c" (ulRet) > + : "a" (pNum), "b" (ulNum), "c" (0) > + : "cc", "memory" > + ); > + return ulRet; > +} > + > + > +static __inline__ void HXAtomicIncINT32(INT32* p) { HXAtomicIncUINT32((UINT32*)p); } > +static __inline__ void HXAtomicDecINT32(INT32* p) { HXAtomicDecUINT32((UINT32*)p); } > +static __inline__ void HXAtomicAddINT32(INT32* p, INT32 n) { HXAtomicAddUINT32((UINT32*)p, (UINT32)n); } > +static __inline__ void HXAtomicSubINT32(INT32* p, INT32 n) { HXAtomicSubUINT32((UINT32*)p, (UINT32)n); } > +static __inline__ INT32 HXAtomicIncRetINT32(INT32* p) { return HXAtomicIncRetUINT32((UINT32*)p); } > +static __inline__ INT32 HXAtomicDecRetINT32(INT32* p) { return HXAtomicDecRetUINT32((UINT32*)p); } > +static __inline__ INT32 HXAtomicAddRetINT32(INT32* p, INT32 n) { return HXAtomicAddRetUINT32((UINT32*)p, (UINT32)n); } > +static __inline__ INT32 HXAtomicSubRetINT32(INT32* p, INT32 n) { return HXAtomicSubRetUINT32((UINT32*)p, (UINT32)n); } > + > + > + > +/*********************************************************************** > * HP-UX / IA64 (Native compiler) > * > * Implementation Notes: > _______________________________________________ > Common-dev mailing list > Common-dev at lists.helixcommunity.org > http://lists.helixcommunity.org/mailman/listinfo/common-dev -- Dean Collins Server Technical Lead, RealNetworks, Inc. -- http://www.realnetworks.com Helix Server Project Owner -- http://helix-server.helixcommunity.org