public inbox for linux-ia64@vger.kernel.org
 help / color / mirror / Atom feed
* [Linux-ia64] cmpxchg patch
@ 2002-02-02 16:26 Ray Bryant
  2002-02-05  1:35 ` David Mosberger
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Ray Bryant @ 2002-02-02 16:26 UTC (permalink / raw)
  To: linux-ia64

[-- Attachment #1: Type: text/plain, Size: 1200 bytes --]

It seems to me that the size of the result of cmpxchg(ptr,old,new)
should depend on the size of *ptr and not the size of old.  For example,
see the following:


#include <stdio.h>
#define __SMP__
#define CONFIG_SMP 
#include <asm/system.h>
 
typedef unsigned long long uint64_t;
uint64_t  long lock=0xDEADBEEF00000000;
uint64_t  long result;
 
main()
{
        result = cmpxchg(&lock,0,1);
        if (result == 0) printf("failed!!\n");
        printf("sizeof(0)=%d sizeof(1)=%d\n",sizeof(0),sizeof(1));
        result = cmpxchg(&lock,(uint64_t)0,1);
        if (result != 0) printf("succeeded!!\n");
}

If you run this, you get 

failed!!
succeeded!!

The problem is that cmpxchg() returns 0xDEADBEEF00000000 but then gcc
generates a sxt4 to truncate the result down to an int, which is the
size of old.

This is incorrect as near as I can tell.

Attached is a patch to fix.

-- 
Best Regards,
Ray
-----------------------------------------------
Ray Bryant               SGI
512-453-9679 (work)      512-507-7807 (cell)
raybry@sgi.com           raybry@austin.rr.com
     Computers are like air conditioners.
   They stop working when you open Windows.
-----------------------------------------------

[-- Attachment #2: cmpxchg.diff --]
[-- Type: text/plain, Size: 382 bytes --]

--- ./include/asm-ia64/system.h	Sun Dec 23 02:58:36 2001
+++ /usr/people/raybry/tmp/system.h	Sat Feb  2 07:53:26 2002
@@ -345,7 +345,7 @@
 		_r_ = __cmpxchg_called_with_bad_pointer();				\
 		break;									\
 	}										\
-	(__typeof__(old)) _r_;								\
+	(__typeof__(*ptr)) _r_;								\
 })
 
 #define cmpxchg_acq(ptr,o,n)	ia64_cmpxchg("acq", (ptr), (o), (n), sizeof(*(ptr)))

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2002-02-05 19:22 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-02-02 16:26 [Linux-ia64] cmpxchg patch Ray Bryant
2002-02-05  1:35 ` David Mosberger
2002-02-05  7:13 ` Ray Bryant
2002-02-05 19:22 ` David Mosberger

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox