On 17/04/16 20:42, Mark Kettenis wrote:

> Ran into an interesting problem with the sparc64 pmap bootstrapping
> code.  Early on, we ask the firmware what physical memory is
> available.  Later we use this memory to set up the kernel page tables,
> kernel stack and per-cpu data structures.  We explicitly tell the
> firmware about the mappings of these data structure as the firmware is
> handling page faults for us at this stage.  To store these mappings
> the firmware may need to allocate more memory.  And if it happens to
> allocate memory that we're using for some other purpose, bad things
> will happen.  In my case dmesg stopped working because its mappings
> were messed up.
> 
> The following diff attempts to fix this issue by telling the firmware
> which pages we're stealing.  It's not perfect as it doesn't prevent us
> from allocating the same pages as the firmware is allocating.
> 
> Tests on a wide variety of  sparc64 hardware would be welcome.
> 
> 
> Index: pmap.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/sparc64/sparc64/pmap.c,v
> retrieving revision 1.96
> diff -u -p -r1.96 pmap.c
> --- pmap.c    27 Nov 2015 15:34:01 -0000      1.96
> +++ pmap.c    17 Apr 2016 19:17:45 -0000
> @@ -2869,6 +2869,7 @@ pmap_get_page(paddr_t *pa, const char *w
>               *pa = VM_PAGE_TO_PHYS(pg);
>       } else {
>               uvm_page_physget(pa);
> +             prom_claim_phys(*pa, PAGE_SIZE);
>               pmap_zero_phys(*pa);
>       }

This patch feels wrong - essentially it is just hiding the fact there is
a missing prom_claim_phys() or prom_alloc_phys() somewhere at the point
of allocation. Can you give more information about the particular case
you describe above?


ATB,

Mark.

Reply via email to