On 2013-12-16, 16:01 +0100, Lennart Poettering wrote: > On Mon, 16.12.13 15:50, Lennart Poettering (lenn...@poettering.net) wrote: > > > > diff --git a/src/libsystemd-bus/bus-control.c > > > b/src/libsystemd-bus/bus-control.c > > > index 0072c37..6b2790d 100644 > > > --- a/src/libsystemd-bus/bus-control.c > > > +++ b/src/libsystemd-bus/bus-control.c > > > @@ -207,7 +207,7 @@ _public_ int sd_bus_release_name(sd_bus *bus, const > > > char *name) { > > > } > > > > > > static int kernel_get_list(sd_bus *bus, uint64_t flags, char ***x) { > > > - struct kdbus_cmd_name_list cmd = {}; > > > + struct kdbus_cmd_name_list __attribute__ ((__aligned__(8))) > > > cmd = {}; > > > > Hmm, this feels a bit like this would be better part of the type rather > > than the variable. THus, kdbus.h should add this to all is structs, > > rather then we decorate the variables... > > > > Kay, would this make sense to you to add to kdbus.h? > > Hmm, so thinking about this: the kdbus_cmd_name_list structure contains > 64bit values anyway, so should naturally be aligned to 64bit boundaries > anyway... Or am I mistaken there and you are suggesting that on your > 32bit architecture (which one is it if I may ask?) 64bit values don't
I am doing tests in 32bit system. > have to be aligned on an even 8byte boundary, but instead because the > arch is 32bit anyway and thus 64bit values need to be read in two steps > alignment on 4 is done in the abi? I am getting a little more clearer about how gcc tries to make stack boundary aligned.. I am using this example test code: ------------------------8<------------------------ #include <stdio.h> #include <linux/types.h> struct kdbus_cmd_hello { __u64 size; __u64 conn_flags; __u64 attach_flags; __u64 bus_flags; __u64 id; __u64 bloom_size; __u64 pool_size; __u8 id128[16]; }; int main(int argc, char **argv) { struct kdbus_cmd_hello hello; int r; printf("hello addr: %08x\n", &hello); r = 1; return 0; } ------------------------>8------------------------ By default, gcc will *try* to make stack boundary 16 bytes aligned (pls refer to -mpreferred-stack-boundary=num in gcc mannual). struct kdbus_cmd_hello itself is 64bit aligned, yes. However, if you have a "int r" after the kdbus_cmd_hello, address of "hello" might be "16 bytes boundary" + 4 (so that after pushing "r", stack boundary will be 16 bytes aligned). $ ./test hello addr: bfe8d334 $ ./test hello addr: bf9aa9f4 $ ./test hello addr: bfe443c4 $ ./test hello addr: bfe8d334 $ ./test hello addr: bf9fdf24 Regards, Kangkai _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel