[OpenBIOS] [PATCH] OFMEM: change ofmem_claim() to always allocate addresses where phys == virt

BALATON Zoltan balaton at eik.bme.hu
Sat Sep 13 14:34:21 CEST 2014


On Sat, 13 Sep 2014, Mark Cave-Ayland wrote:
> The wording of the IEEE1275 specification for the CIF claim and release words
> contains the following:
>
> claim
> IN: [address] virt, size, align
> OUT: [address] baseaddr
>
> Allocates size bytes of memory. If align is zero, the allocated range begins
> at the virtual address virt.... The range of physical memory and virtual addresses
> affected by this operation will be unavailable for subsequent mapping or allocation
> operations until freed by release.
>
> release
> IN: [address] virt, size
> OUT: none
>
> Frees size bytes of physical memory starting at virtual address virt, making that
> physical memory and the corresponding range of virtual address space available for
> later use. That memory must have been previously allocated by claim.
>
> Even though the claim word mentions virtual addresses, the implication from the
> release word mentioning physical memory is that allocations made by claim must
> have phys == virt. So change ofmem_claim() to ensure that addresses allocated via
> the CIF claim word always have phys == virt.
>
> This fixes a bug in MorphOS boot where different physical and virtual addresses
> cause mixed accesses by the bootloader to fail.
>
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk>

Reported-by: BALATON Zoltan <balaton at eik.bme.hu>
Tested-by: BALATON Zoltan <balaton at eik.bme.hu>

> ---
> openbios-devel/libopenbios/ofmem_common.c |    4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/openbios-devel/libopenbios/ofmem_common.c b/openbios-devel/libopenbios/ofmem_common.c
> index 157ca87..3b8ca15 100644
> --- a/openbios-devel/libopenbios/ofmem_common.c
> +++ b/openbios-devel/libopenbios/ofmem_common.c
> @@ -634,8 +634,8 @@ ucell ofmem_claim( ucell addr, ucell size, ucell align )
> 	} else {
> 		if( align < PAGE_SIZE )
> 			align = PAGE_SIZE;
> -		phys = ofmem_claim_phys_( addr, size, align, 0, ofmem_arch_get_phys_top(), 1 /* reverse */ );
> -		virt = ofmem_claim_virt_( addr, size, align, 0, get_ram_size(), 1 /* reverse */ );
> +		phys = ofmem_claim_phys_( -1, size, align, 0, ofmem_arch_get_phys_top(), 1 /* reverse */ );
> +		virt = ofmem_claim_virt_( phys, size, 0, 0, 0, 0 );
> 		if( phys == -1 || virt == -1 ) {
> 			OFMEM_TRACE("ofmem_claim failed\n");
> 			return -1;
> -- 
> 1.7.10.4
>
>



More information about the OpenBIOS mailing list