On Wed, Jul 05, 2017 at 02:27:46AM +0300, Artturi Alm wrote:
> Hi,
> 
> instead of messing w/bs_tags, use the fact pmap_kernel()->pm_refs is going
> to be 0 until pmap_bootstrap() has ran. tmp_bs_tag was unused, and
> bootstrap_bs_map doesn't need/use the void *t-arg when being ran indirectly
> via armv7_bs_map().
> 
> the whole existence of bootstrap_bs_map is another story, and the comment in
> /* Now, map the FDT area. */ is somewhat an stupid excuse, it's already mapped
> before initarm() w/VA=PA, and could well be _init()&_get_size()'d & memcpy'ed
> somewhere in reach within bootstrap KVA, guess diff might follow for that,
> too, if anyone has time for these simplifications.
> 

Ok, i was wrong ^there, and the bootstrap code before initarm() didn't fill
the L1 w/VA=PA anymore, for reasons i don't understand, so i 'fixed' it,
with diff below. tested to boot and eeprom -p normally on cubie2 and wandb.

i kept the diff minimal, to the point it does fdt_get_size() twice just like
before, which i don't like, nor the name of size-variable and what not, but
minimal it is. Would be the first step towards earlier physmem load :)

-Artturi


diff --git a/sys/arch/armv7/armv7/armv7_machdep.c 
b/sys/arch/armv7/armv7/armv7_machdep.c
index aa1c549b29b..3b860cc662f 100644
--- a/sys/arch/armv7/armv7/armv7_machdep.c
+++ b/sys/arch/armv7/armv7/armv7_machdep.c
@@ -379,7 +379,7 @@ initarm(void *arg0, void *arg1, void *arg2, paddr_t 
loadaddr)
        paddr_t memstart;
        psize_t memsize;
        paddr_t memend;
-       void *config;
+       void *config = arg2;
        size_t size;
        void *node;
        extern uint32_t esym; /* &_end if no symbols are loaded */
@@ -420,18 +420,8 @@ initarm(void *arg0, void *arg1, void *arg2, paddr_t 
loadaddr)
        tmp_bs_tag.bs_map = bootstrap_bs_map;
 
        /*
-        * Now, map the FDT area.
-        *
-        * As we don't know the size of a possible FDT, map the size of a
-        * typical bootstrap bs map.  The FDT might not be aligned, so this
-        * might take up to two L1_S_SIZEd mappings.
-        *
-        * XXX: There's (currently) no way to unmap a bootstrap mapping, so
-        * we might lose a bit of the bootstrap address space.
+        * Now, init the FDT @ PA, reloc and reinit to KVA later.
         */
-       bootstrap_bs_map(NULL, (bus_addr_t)arg2, L1_S_SIZE, 0,
-           (bus_space_handle_t *)&config);
-
        if (!fdt_init(config) || fdt_get_size(config) == 0)
                panic("initarm: no FDT");
 
@@ -572,11 +562,15 @@ initarm(void *arg0, void *arg1, void *arg2, paddr_t 
loadaddr)
 #endif
 
        /*
-        * Allocate pages for an FDT copy.
+        * Allocate pages for FDT, copy it there, and zero the original.
         */
        size = fdt_get_size(config);
        valloc_pages(fdt, round_page(size) / PAGE_SIZE);
        memcpy((void *)fdt.pv_pa, config, size);
+       memset(config, 0, size);
+
+       /* Now we must reinit the FDT, using the virtual address. */
+       fdt_init((void *)fdt.pv_va);
 
        /*
         * XXX Defer this to later so that we can reclaim the memory
@@ -726,9 +720,6 @@ initarm(void *arg0, void *arg1, void *arg2, paddr_t 
loadaddr)
        prefetch_abort_handler_address = (u_int)prefetch_abort_handler;
        undefined_handler_address = (u_int)undefinedinstruction_bounce;
 
-       /* Now we can reinit the FDT, using the virtual address. */
-       fdt_init((void *)fdt.pv_va);
-
        /* Initialise the undefined instruction handlers */
 #ifdef VERBOSE_INIT_ARM
        printf("undefined ");
diff --git a/sys/arch/armv7/armv7/locore0.S b/sys/arch/armv7/armv7/locore0.S
index 2a4e98cbe8c..5fc7d250cf5 100644
--- a/sys/arch/armv7/armv7/locore0.S
+++ b/sys/arch/armv7/armv7/locore0.S
@@ -127,19 +127,9 @@ _C_LABEL(bootstrap_start):
        bne     2b
 
        adr     r4, mmu_init_table
-
-       mov     r2, r9, lsr #18
-       ldr     r3, [r4, #8]
-       bic     r3, r3, #0xf0000000
-       orr     r3, r3, r9
-       str     r2, [r4, #4]
-       str     r3, [r4, #8]
-       str     r3, [r4, #0x14] // ram address for 0xc0000000
-
-       /*
-        * the first entry has two fields that need to be updated for
-        * specific ram configuration of this board.
-        */
+       ldr     r3, [r4, #(12+8)]       /* r3 = pte attributes */
+       orr     r3, r3, r9              /* r3 |= pa */
+       str     r3, [r4, #(12+8)]       /* ram address(PA) for 0xc0000000 */
        b       4f
 
 3:
@@ -186,7 +176,7 @@ Lstart:
 
 mmu_init_table:
        /* map SDRAM VA==PA, WT cacheable */
-       MMU_INIT(0x00000000, 0x00000000, 64,
+       MMU_INIT(0x00000000, 0x00000000, 4096,
                 L1_TYPE_S|L1_S_C|L1_S_V7_AP(AP_KRW)|L1_S_V7_AF)
        /* map VA 0xc0000000..0xc3ffffff to PA */
        MMU_INIT(0xc0000000, 0x00000000, 64,

Reply via email to