[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