[Top] [All Lists]

Re: va_list implementation on mips64 , with 32bit cross compiled

To: "wilbur.chan" <>
Subject: Re: va_list implementation on mips64 , with 32bit cross compiled
From: David Daney <>
Date: Wed, 13 Oct 2010 17:15:00 -0700
Cc: Linux MIPS Mailing List <>
In-reply-to: <>
Original-recipient: rfc822;
References: <>
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv: Gecko/20100907 Fedora/3.0.7-1.fc12 Thunderbird/3.0.7
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

<Prev in Thread] Current Thread [Next in Thread>