[OpenBIOS] [PATCH] ppc: make sure that we correctly map loader RAM at load-base
Mark Cave-Ayland
mark.cave-ayland at ilande.co.uk
Fri Aug 31 12:30:50 CEST 2018
On 26/08/18 15:45, Mark Cave-Ayland wrote:
> An error in the logic related to FREE_BASE meant that instead of mapping the
> RAM for the loader at load-base, a small section was being mapped at the
> bottom of RAM instead.
>
> Fix this by deferring the mapping of the load-base RAM to arch_init() when
> we can access the load-base variable and map 8MB RAM with a 1:1 phys to
> virt mapping.
>
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk>
> ---
> arch/ppc/qemu/init.c | 8 ++++++++
> arch/ppc/qemu/ofmem.c | 12 ------------
> 2 files changed, 8 insertions(+), 12 deletions(-)
>
> diff --git a/arch/ppc/qemu/init.c b/arch/ppc/qemu/init.c
> index af15682..f5acf87 100644
> --- a/arch/ppc/qemu/init.c
> +++ b/arch/ppc/qemu/init.c
> @@ -844,6 +844,7 @@ arch_of_init(void)
> uint32_t temp = 0;
> char *boot_device;
> ofmem_t *ofmem = ofmem_arch_get_private();
> + ucell load_base;
>
> openbios_init();
> modules_init();
> @@ -1105,4 +1106,11 @@ arch_of_init(void)
>
> bind_func("platform-boot", boot);
> bind_func("(arch-go)", arch_go);
> +
> + /* Allocate 8MB memory at load-base */
> + fword("load-base");
> + load_base = POP();
> + ofmem_claim_phys(load_base, 0x800000, 0);
> + ofmem_claim_virt(load_base, 0x800000, 0);
> + ofmem_map(load_base, load_base, 0x800000, 0);
> }
> diff --git a/arch/ppc/qemu/ofmem.c b/arch/ppc/qemu/ofmem.c
> index 7b8ced0..7a78a1e 100644
> --- a/arch/ppc/qemu/ofmem.c
> +++ b/arch/ppc/qemu/ofmem.c
> @@ -46,7 +46,6 @@ extern void setup_mmu(unsigned long code_base);
> *
> */
>
> -#define FREE_BASE 0x00004000UL
> #define OF_CODE_START 0xfff00000UL
> #define OF_CODE_SIZE 0x00100000
> #define IO_BASE 0x80000000UL
> @@ -81,12 +80,6 @@ get_ram_top(void)
> return get_hash_base() - (32 + 64 + 64) * 1024 - OFMEM_SIZE;
> }
>
> -static unsigned long
> -get_ram_bottom(void)
> -{
> - return FREE_BASE;
> -}
> -
> static unsigned long get_heap_top(void)
> {
> return get_hash_base() - (32 + 64 + 64) * 1024;
> @@ -578,11 +571,6 @@ ofmem_init(void)
> {
> ofmem_t *ofmem = ofmem_arch_get_private();
>
> - /* Map the memory (don't map page 0 to allow catching of NULL dereferences) */
> - ofmem_claim_phys(PAGE_SIZE, get_ram_bottom() - PAGE_SIZE, 0);
> - ofmem_claim_virt(PAGE_SIZE, get_ram_bottom() - PAGE_SIZE, 0);
> - ofmem_map(PAGE_SIZE, PAGE_SIZE, get_ram_bottom() - PAGE_SIZE, 0);
> -
> /* Mark the first page as non-free */
> ofmem_claim_phys(0, PAGE_SIZE, 0);
> ofmem_claim_virt(0, PAGE_SIZE, 0);
>
Applied to master.
ATB,
Mark.
More information about the OpenBIOS
mailing list