[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH ARM v6 07/14] mini-os: arm: boot code



On 30 July 2014 12:26, Ian Campbell <Ian.Campbell@xxxxxxxxxx> wrote:
> On Wed, 2014-07-30 at 11:47 +0100, Thomas Leonard wrote:
>> On 17 July 2014 17:28, Ian Campbell <Ian.Campbell@xxxxxxxxxx> wrote:
>> > On Wed, 2014-07-16 at 12:07 +0100, Thomas Leonard wrote:
>> >> +     @ Enable MMU / SCTLR
>> >> +     @ We leave caches off for now because we're going to be changing the
>> >> +     @ TLB a lot and this avoids having to flush the caches each time.
>> >
>> > ARMv7 (or perhaps it was the virt extensions, either way you can rely on
>> > it here) makes the MMU cache coherent, so you don't need to flush the
>> > caches when doing a PTE write any more.
>>
>> I tried enabling the D-cache here, but then it frequently (but not
>> always) fails to boot, even with various dsb and isb instructions
>> scattered around.
>>
>> If I enable the D-cache immediately before the loop that writes the
>> translation table entries, it fails. Adding a dsb after the loop
>> doesn't help. But if I enable it after the loop then it's fine.
>>
>> I don't know what's going on there - any suggestions? Here's my
>> (failing) test-case (tested using Xen/stable-4.4 -
>> 4.4.1-rc1-28-gee81dda):
>>
>> https://github.com/talex5/xen/commit/adadfa7e483aa3f3a351c0aeca6a560614fcdead
>
> My guess would be that it is related to the lack of dsb before the
> initial write to SCTLR which turns on M. Try:
>         mrc     p15, 0, r1, c1, c0, 0   @ SCTLR
>         orr     r1, r1, #0x1 @ Enable MMU
>         dsb
>         mcr     p15, 0, r1, c1, c0, 0   @ SCTLR
>         isb
>
> Otherwise I worry that the dsb() involved when you turn on caching are
> causing differences it what you are seeing at this point depending on
> where you place it.

Doesn't help.

> Xen enables caches at the same time and MMU BTW.

Also doesn't help (actualy, I only split it out to narrow down the
problem a bit).

>> >> +       @ Enable MMU / SCTLR
>> >> +       @ We leave caches off for now because we're going to be changing 
>> >> the
>> >> +       @ TLB a lot and this avoids having to flush the caches each time.
>> >> +       mrc     p15, 0, r1, c1, c0, 0   @ SCTLR
>> >> +       orr     r1, r1, #0x1            @ Enable MMU
>> >
>> > I think you want a dsb here to ensure that any previous PTE write you
>> > did when setting up the PTs have actually occurred.
>>
>> Presumably this isn't needed in the current code, since the caches are off?
>
> The processor can still reorder writes and things like that, so I think
> it is still needed.

Ah, I'd assumed it would default everything to Strongly Ordered with
the MMU off, but I see it depends on how Xen sets the "Default
cacheable" bit.

>> >> +     bx      r1
>> >> +
>> >> +@ Called once the MMU is enabled. The boot code and the page table are 
>> >> mapped,
>> >> +@ but nothing else is yet.
>> >> +@
>> >> +@ => r2 -> dtb (physical)
>> >> +@    r7 = virtual address of page table
>> >> +@    r8 = section entry template (flags)
>> >> +@    r9 = desired physical - virtual offset
>> >> +@    pc -> somewhere in newly-mapped virtual code section
>> >> +stage2:
>> >
>> > I think you want another dsb around here somewhere to ensure that none
>> > of the PT updates you do in a moment float up and interfere with the
>> > mapping of the code between the write to SCTLR until the bx r1.
>>
>> How does that happen? Presumably the isb below will block that.
>
> I don't think it will, it's effectively just a pipeline flush but that
> doesn't necessarily mean there isn't a write from below already in that
> pipeline.
>
> (I think, I haven't actually gone back to the spec on this one...)
>
> In Xen we do dsb+isb before and after the TLB flush.

I've added these in various places, but no improvement:

https://github.com/talex5/xen/commit/39199da8493ad6e235849d7ecd51a1415d7d60a7

>> >> +     @ Invalidate TLB
>> >> +     mcr     p15, 0, r1, c8, c7, 0   @ TLBIALL
>> >> +     isb
>> >> +
>> >> +     @ The new mapping has now taken effect:
>> >> +     @ r7 -> page_dir
>> >> +
>> >> +     @ Fill in the whole top-level translation table (at page_dir).
>> >> +     @ Populate the whole pagedir with 1MB section descriptors.
>> >> +
>> >> +     mov     r1, r7                  @ r1 -> first section entry
>> >> +     add     r3, r1, #4*4*1024       @ limit (4 GB address space, 4 byte 
>> >> entries)
>> >> +     orr     r0, r8, r9              @ r0 = entry mapping section zero 
>> >> to start of physical RAM
>> >> +1:
>> >> +     str     r0, [r1],#4             @ write the section entry
>> >> +     add     r0, r0, #1 << 20        @ next physical page (wraps)
>> >> +     cmp     r1, r3
>> >> +     bne     1b
>> >
>> > dsb here to make sure those writes have actually occurred before you
>> > come to rely on them.
>> >
>> > If there is any chance of any of those writes going through a mapping
>> > which you are then changing at the same time then I worry that you might
>> > also need a dsb before each write.
>>
>> The mapping for the translation table itself doesn't change (its entry
>> will be written with the same value as previously).
>
> Phew!
>
>



-- 
Dr Thomas Leonard        http://0install.net/
GPG: 9242 9807 C985 3C07 44A6  8B9A AE07 8280 59A5 3CC1
GPG: DA98 25AE CAD0 8975 7CDA  BD8E 0713 3F96 CA74 D8BA

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.