> Date: Wed, 5 Jul 2017 09:34:59 +0300 > From: Artturi Alm <artturi....@gmail.com> > > 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
What are you trying to achieve heree? The current code quite deliberately does not create a cachable 1:1 mapping for the entire address space. Such a mapping is dangerous as the CPU might speculatively load from any valid mapping and that is a terrible idea for device mappings. > 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, > >