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

Blue Swirl blauwirbel at gmail.com
Mon Apr 4 23:15:15 CEST 2011


On Mon, Apr 4, 2011 at 10:44 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 |   14 ++++++++++++--
>  1 files changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/openbios-devel/arch/sparc32/lib.c b/openbios-devel/arch/sparc32/lib.c
> index 5b41dff..0219a19 100644
> --- a/openbios-devel/arch/sparc32/lib.c
> +++ b/openbios-devel/arch/sparc32/lib.c
> @@ -351,9 +351,19 @@ char *obp_dumb_memalloc(char *va, unsigned int size)
>  {
>     phys_addr_t phys;
>     ucell virt;
> -
> +    unsigned int align;
> +
> +    /* 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. */

Awesome work!

> +
> +    /* Enforce a minimum alignment of CONFIG_OFMEM_MALLOC_ALIGN, and also ensure that
> +       only the MSB is set for the alignment value. This prevents spurious
> +       "bad alignment" warnings from OFMEM when running with CONFIG_DEBUG_OFMEM. */
> +    align = (size + CONFIG_OFMEM_MALLOC_ALIGN - 1) & ~(size - 1);

What happens if size is not a power of 2?



More information about the OpenBIOS mailing list