Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 18 Sep 2008 14:44:26 -0400
From:      John Baldwin <jhb@freebsd.org>
To:        freebsd-hackers@freebsd.org, stevefranks@ieee.org
Subject:   Re: proper types for printf()-ing pointers on amd64 that won't break i386?
Message-ID:  <200809181444.26895.jhb@freebsd.org>
In-Reply-To: <539c60b90809181041n658d2823y89e42bb0ccfa6d06@mail.gmail.com>
References:  <539c60b90809181041n658d2823y89e42bb0ccfa6d06@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thursday 18 September 2008 01:41:42 pm Steve Franks wrote:
> Hi,
> 
> I'm trying to correct some warnings in a port marked
> ONLY_FOR_ARCHS=i386.  They stem from casting a pointer (which I assume
> is a 64-bit unsigned) to "unsigned int" which is apparently 32 bits?
> I sort of thought int was supposed to be the atomic register size, but
> no doubt that would break more than it would help, so it's 32-bits.
> Anyways, what's the right way to fix this?  The port actually works
> fine as-is on amd64, so I can only assume something was fixed for 7.1,
> or someone was being extra cautious with the i386 tag.
> 
> The code:
> 
>    typedef unsigned int cardinal;
>    ...
>    fprintf(stderr, "Mode Table Offset: $C0000 + $%x\n",
> ((cardinal)map->mode_table) - ((cardinal)map->bios_ptr));
> 
> Can I just ditch the cast+%x and use %p?  I don't have an i386 system
> to test on, and I don't want to break anything if I submit a patch...

If mode_table and bios_ptr are pointers, then their difference is not a 
pointer, but a ptrdiff_t.  You can use %tx to print one of those in hex.  
Note, however, that subtracting pointers only works if they are of the same 
type, and it will return different results in this case unless they are char 
* pointers.  Probably better is to do something like this:

	fprintf(stderr, "Mode Table Offset: $C0000 + $%x\n",
	    (int)((uintptr_t)map->mode_table - (uintptr_t)map->bios_ptr));

Note that %p will include a '0x' prefix for non-NULL pointers which you 
probably don't want.

-- 
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200809181444.26895.jhb>