[OpenBIOS] [PATCH] Enforce physical alignment based upon size for the SPARC32 romvec obp_dumb_memalloc() function.

Blue Swirl blauwirbel at gmail.com
Tue Apr 5 20:13:04 CEST 2011


On Tue, Apr 5, 2011 at 2:47 PM, Mark Cave-Ayland
<mark.cave-ayland at siriusit.co.uk> wrote:
> It appears that Solaris assumes that the resulting memory is physically aligned based upon the
> value of size. Make sure we also respect this alignment, so that memory allocated using this
> interface can be correctly used for the Solaris IOMMU page tables.
>
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at siriusit.co.uk>
> ---
>  openbios-devel/arch/sparc32/lib.c |   20 +++++++++++++++++++-
>  1 files changed, 19 insertions(+), 1 deletions(-)
>
> diff --git a/openbios-devel/arch/sparc32/lib.c b/openbios-devel/arch/sparc32/lib.c
> index 5b41dff..59cd23b 100644
> --- a/openbios-devel/arch/sparc32/lib.c
> +++ b/openbios-devel/arch/sparc32/lib.c
> @@ -351,9 +351,27 @@ char *obp_dumb_memalloc(char *va, unsigned int size)
>  {
>     phys_addr_t phys;
>     ucell virt;
> +    unsigned int align, i;
> +
> +    /* Solaris seems to assume that the returned value is physically aligned to size. For
> +       example, not having this here causes the Solaris 8 kernel to fault because the
> +       IOMMU page table base address is calculated incorrectly. */
> +
> +    /* Enforce a minimum alignment of CONFIG_OFMEM_MALLOC_ALIGN, and choose an alignment
> +       which is the next power of 2 higher than the specified size */
> +    align = size;
> +    if (align < CONFIG_OFMEM_MALLOC_ALIGN) {

Since size or alignment of CONFIG_OFMEM_MALLOC_ALIGN (4 or 8) may be
common, I'd change '<' to '<=' to avoid the loop.

> +        align = CONFIG_OFMEM_MALLOC_ALIGN;
> +    } else {
> +        align--;
> +        for (i = 1; i < sizeof(unsigned int) * 8; i<<=1) {

This should probably be sizeof(unsigned long) instead, so >4GB sizes
on 64 bit targets are properly aligned ;-).

> +            align = align | align >> i;

align |= align >> i?



More information about the OpenBIOS mailing list