It makes much more sense if you have ALL the relevant defines:
Code:
#ifdef CONFIG_X86_64
#define DECLARE_ARGS(val, low, high) unsigned low, high
#define EAX_EDX_VAL(val, low, high) ((low) | ((u64)(high) << 32))
#define EAX_EDX_ARGS(val, low, high) "a" (low), "d" (high)
#define EAX_EDX_RET(val, low, high) "=a" (low), "=d" (high)
#else
#define DECLARE_ARGS(val, low, high) unsigned long long val
#define EAX_EDX_VAL(val, low, high) (val)
#define EAX_EDX_ARGS(val, low, high) "A" (val)
#define EAX_EDX_RET(val, low, high) "=A" (val)
#endif
Since in x86_64, a long is 64 bits, and returned in ONE register (EAX), we need to make two unsigned (32-bit) values into a single 64-bit value. Meanwhile, in x86_32, each register holds 32 bits, so we need to return a 64-bit value as two registers (eax, edx). It just so happens also that msr's values are returned in eax, edx. The symbol A in inline assembler represents a 64-bit pair of EAX, EDX.
It is not something missing/extra in there, it's simply that the macros do not use all arguments earch time, instead they are using either val (as a 64-bit two-register integer) or low, high as two 32-bit values that get returned as a single register 64-bit value.
Which is a longer way of explaining what I said in the previous post. Is it because I posted a link to the source rather than typing it out that it was hard to understand this?
--
Mats