All of lore.kernel.org
 help / color / mirror / Atom feed
* va_list implementation on mips64 , with 32bit cross compiled
@ 2010-10-14  0:06 wilbur.chan
  2010-10-14  0:15 ` David Daney
  0 siblings, 1 reply; 2+ messages in thread
From: wilbur.chan @ 2010-10-14  0:06 UTC (permalink / raw)
  To: Linux MIPS Mailing List; +Cc: chelly wilbur

I am planning  to use va_list on a single module, however the
following code did not work properly.

typedef char *	va_list;
#define _INTSIZEOF(n)	( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define va_start(ap,v)	( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t)	( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap)	( ap = (va_list)0 )

void test_val_list()
{
unsigned long test=0x1234;
test_printk("test:0x%x OK\n",aaa);
}

void test_printk(const char *format, ...)
{
va_list args;
va_start(args, format);
unsigned int v1 = va_arg(args,unsigned long);
printk("v1 is 0x%x\n",v1);
unsigned int v2 = va_arg(args,unsigned long);
printk("v2 is 0x%x\n",v2);
}


The result is :

v1 is 0x00000013

v2 is 0x00000019

Why this happened ? shouldn't v1 be 0x1234 here?

Thank you

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

* Re: va_list implementation on mips64 , with 32bit cross compiled
  2010-10-14  0:06 va_list implementation on mips64 , with 32bit cross compiled wilbur.chan
@ 2010-10-14  0:15 ` David Daney
  0 siblings, 0 replies; 2+ messages in thread
From: David Daney @ 2010-10-14  0:15 UTC (permalink / raw)
  To: wilbur.chan; +Cc: Linux MIPS Mailing List

On 10/13/2010 05:06 PM, wilbur.chan wrote:
> I am planning  to use va_list on a single module, however the
> following code did not work properly.
>
> typedef char *	va_list;
> #define _INTSIZEOF(n)	( (sizeof(n) + sizeof(int) - 1)&  ~(sizeof(int) - 1) )
> #define va_start(ap,v)	( ap = (va_list)&v + _INTSIZEOF(v) )
> #define va_arg(ap,t)	( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
> #define va_end(ap)	( ap = (va_list)0 )
>

You cannot arbitrarily define those macros with garbage and expect 
anything to work.

Replace all the above code with #include <stdarg.h>

Then do: man stdarg

That documents how it works.

David Daney


> void test_val_list()
> {
> unsigned long test=0x1234;
> test_printk("test:0x%x OK\n",aaa);
> }
>
> void test_printk(const char *format, ...)
> {
> va_list args;
> va_start(args, format);
> unsigned int v1 = va_arg(args,unsigned long);
> printk("v1 is 0x%x\n",v1);
> unsigned int v2 = va_arg(args,unsigned long);
> printk("v2 is 0x%x\n",v2);
> }
>
>
> The result is :
>
> v1 is 0x00000013
>
> v2 is 0x00000019
>
> Why this happened ? shouldn't v1 be 0x1234 here?
>
> Thank you
>
>

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

end of thread, other threads:[~2010-10-14  0:15 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-10-14  0:06 va_list implementation on mips64 , with 32bit cross compiled wilbur.chan
2010-10-14  0:15 ` David Daney

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.