[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