Re: byteorder helpers and void * (was: Re: [PATCH 01/21] lib: add byteorder helpers for the aligned case)
- From: Geert Uytterhoeven <Geert.Uytterhoeven@xxxxxxxxxxx>
- Date: Wed, 25 Jun 2008 13:20:16 +0200 (CEST)
On Tue, 24 Jun 2008, Harvey Harrison wrote:
On Tue, 2008-06-24 at 14:54 +0200, Geert Uytterhoeven wrote:
Document the fact that void * passed in needs to be 16-bit aligned?
Why not let it just take a __le16 *? Because in many use-cases the pointer just
points to an array of bytes?
For the unaligned case, e.g. get_unaligned_le16(), I can understand a bit the
rationale about using void * (a typical use-case is accessing a little endian
16-bit value in the middle of an arrays of bytes).
However, a disadvantage is that you remove the ability of the compiler to check
for using the wrong accessor in a (packed for the unaligned case) struct, e.g.
struct {
u8 pad;
__le16 val; /* 16-bit value */
} __attribute ((packed)) s;
x = get_unaligned_le32(&s.val); /* oops, 32-bit access */
I'm starting to come around to the typechecking argument. This would
also be a chance to fix the argument ordering in put_analigned_XXXX
that was noticed by others. As there are already some existing users
in-tree, we could transition gradually by:
1) Introduce typed versions of get/put_unaligned_XXXX, that implies the
byteswap better:
u16 load_unaligned_le16(__le16 *)
void store_unaligned_le16(__le16 *, u16)
OK
Then the aligned helpers could be:
le16_to_cpup -> aligned equivalent of load_unaligned_le16
store_le16(__le16 *, u16)
Implemented as (to allow constant folding)
#define store_le16(ptr, val) (*(__le16 *)(ptr) = cpu_to_le16((u16)(val)))
Again, no typechecking in store_le16(), due to the explicit cast.
I noticed there's also a __get_unaligned_le(), which uses compile-time
detection of the pointer time, to make sure the correct accessor is used.
Do you intend this to be used by generic code? It's function name starts
with double underscore, indicating otherwise.
It is not meant for generic use, it is just there as a helper for each
arch to wire up it's get_unaligned() macro depending on its endianness,
so each arch doesn't wire up its own version that may or may not have
the size checking.
With kind regards,
Geert Uytterhoeven
Software Architect
Sony Techsoft Centre
The Corporate Village · Da Vincilaan 7-D1 · B-1935 Zaventem · Belgium
Phone: +32 (0)2 700 8453
Fax: +32 (0)2 700 8622
E-mail: Geert.Uytterhoeven@xxxxxxxxxxx
Internet: http://www.sony-europe.com/
Sony Technology and Software Centre Europe
A division of Sony Service Centre (Europe) N.V.
Registered office: Technologielaan 7 · B-1840 Londerzeel · Belgium
VAT BE 0413.825.160 · RPR Brussels
Fortis 293-0376800-10 GEBA-BE-BB
- References:
- Prev by Date: Re: Small cleanups
- Next by Date: Re: [PATCH] IDE: Fix HDIO_DRIVE_RESET handling
- Previous by thread: Re: byteorder helpers and void * (was: Re: [PATCH 01/21] lib: add byteorder helpers for the aligned case)
- Next by thread: [WATCHDOG] hpwdt - remove CFLAGS
- Index(es):
Relevant Pages
|