lkml.org 
[lkml]   [2004]   [Jun]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patches in this message
    /
    Date
    From
    SubjectRe: __setup()'s not processed in bk-current
    On Mon, 28 Jun 2004, Ricky Beam wrote:
    >The linked kernel *looks* correct (x86_64 here):
    >Contents of section .init.data:
    > ffffffff8058d000 6e6f736d 70006d61 78637075 733d0070 nosmp.maxcpus=.p
    >
    >Contents of section .init.setup:
    > ffffffff80593510 00d05880 ffffffff 60125780 ffffffff ..X.....`.W.....
    > ffffffff80593520 00000000 00000000 00000000 00000000 ................
    > ffffffff80593530 06d05880 ffffffff 70125780 ffffffff ..X.....p.W.....
    > ffffffff80593540 00000000 00000000 00000000 00000000 ................
    >
    >Do I smell some bad pointer math? Yeap:
    >DEBUG: sizeof(obs_kernel_param): 24 (0x18)

    Ahh. Not bad pointer math. Bad kernel source :-) The compiler is not
    aware of the packing/alignment of the .init.setup section until link
    time which is too late. The .init.setup section is ALIGN(16)'d for
    almost all archs. (h8300 is 4 bytes.)

    There may be other instances like this that'll eventually bite us in the
    ass.

    (A) Fix... at least for x86_64.

    ===== include/linux/init.h 1.33 vs edited =====
    --- 1.33/include/linux/init.h 2004-06-27 03:19:38 -04:00
    +++ edited/include/linux/init.h 2004-06-28 18:39:37 -04:00
    @@ -107,11 +107,12 @@
    static initcall_t __initcall_##fn \
    __attribute_used__ __attribute__((__section__(".security_initcall.init"))) = fn

    +/* FIXME: not all arch's are aligned on a 16byte boundry */
    struct obs_kernel_param {
    const char *str;
    int (*setup_func)(char *);
    int early;
    -};
    +} __attribute__((aligned(16)));

    /* Only for really core code. See moduleparam.h for the normal way. */
    #define __setup_param(str, unique_id, fn, early) \
    ===== arch/x86_64/kernel/vmlinux.lds.S 1.23 vs edited =====
    --- 1.23/arch/x86_64/kernel/vmlinux.lds.S 2004-05-30 07:33:25 -04:00
    +++ edited/arch/x86_64/kernel/vmlinux.lds.S 2004-06-28 19:20:20 -04:00
    @@ -87,7 +87,7 @@
    _einittext = .;
    }
    .init.data : { *(.init.data) }
    - . = ALIGN(16);
    + . = ALIGN(32);
    __setup_start = .;
    .init.setup : { *(.init.setup) }
    __setup_end = .;
    (don't ask me why __setup_start is landing 16b less than it should)

    --Ricky


    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 14:04    [W:0.020 / U:0.032 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site