[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20150929150658.GJ3036@8bytes.org>
Date: Tue, 29 Sep 2015 17:06:58 +0200
From: Joerg Roedel <joro@...tes.org>
To: Alexander Holler <holler@...oftware.de>
Cc: linux-kernel@...r.kernel.org
Subject: Re: AMD-IOMMU and problem with __init(data)?
As expected it is no bug in the AMD IOMMU driver, but in your code.
On Wed, Sep 23, 2015 at 09:04:31PM +0200, Alexander Holler wrote:
> struct _annotated_initcall {
> initcall_t initcall;
> unsigned driver_id;
> unsigned *dependencies;
> struct device_driver *driver;
> };
This struct gets aligned on a 32 bytes boundary.
> +#define ANNOTATED_INITCALLS \
> + VMLINUX_SYMBOL(__annotated_initcall_start) = .; \
> + *(.annotated_initcall.init) \
> + VMLINUX_SYMBOL(__annotated_initcall_end) = .;
But this section does not.
> + ac = __annotated_initcall_start;
> + pr_info("ac %p ID %u\n", ac, ac->driver_id);
> + BUG_ON(ac->driver_id != 23);
So when you access __annotated_initcall_start here, you don't access the
first element of your array, but actually the zero padding before your
struct.
On my system the section was aligned on an 8 bytes boundary, which means
there were 24 bytes of padding before the symbol you try to access.
Joerg
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists