qemu-discuss
[Top][All Lists]
Advanced

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

RE: What does soft-mmu mean? What happens when we set MMU registers? (aa


From: ckim
Subject: RE: What does soft-mmu mean? What happens when we set MMU registers? (aarch64)
Date: Wed, 10 Mar 2021 17:31:29 +0900

Hello, Peter Maydell,

I've added print in get_phys_addr at the entrance
'printf("address = %llx\n", address);'
And found actualy it's called not that many times. (3 or 4 times before this 
thing happens)
Right after I set sctlr_el3 register, this get_phys_addr is again called. And I 
get
        Address = 28c.
But when I see the objdump code, it is like 

   1027c:   d53ec002    mrs x2, vbar_el3
   10280:   d5380702    mrs x2, id_aa64mmfr0_el1
   10284:   d53e2042    mrs x2, tcr_el3
   10288:   d51e1000    msr sctlr_el3, x0   <=== trap seems to happen here
   1028c:   d51c1000    msr sctlr_el2, x0    <=== accessing virtual address 
28c, not 1028c.
   10290:   d5181000    msr sctlr_el1, x0
   10294:   d5034fff    msr daifclr, #0xf
   10298:   d53e1100    mrs x0, scr_el3
   1029c:   b27e0000    orr x0, x0, #0x4

The next command (msr sctlr_el2, x0) is at 0x1028c, but the get_phy_addr 
function was called with virtual address 0x28c. Is this normal? I don't know 
why there is this difference of 0x10000.(0x10000 is the start address of page 
table)

Could you advise me on this? Thanks!

Chan Kim

> -----Original Message-----
> From: ckim@etri.re.kr <ckim@etri.re.kr>
> Sent: Wednesday, March 10, 2021 5:12 PM
> To: 'Peter Maydell' <peter.maydell@linaro.org>
> Cc: 'qemu-discuss' <qemu-discuss@nongnu.org>
> Subject: RE: What does soft-mmu mean? What happens when we set MMU
> registers? (aarch64)
> 
> Hi, Peter Maydell,
> 
> Thank you again for the kind explanation.
> Yes, it seems like what you showed is correct.
> So I checked several registers and the page table, but couldn't find any
> strange data yet(I'll continue).
> Because I'm at EL3, I think the current translation regime is "Secure EL3
> translation regime", (single VA range, having a single stage translation)
> In the code, the ttbr0_el3 and ttbr0_el0 is set to ttb0_base (the first
> table address), and the first entry of ttb0_base is a pointer to the
> second table, The second table has many entries for 2MB blocks with
> attributes.
> (I couldn't find where this pgd->pte(for 2MB) configuration is shown
> possible in the document and asked at support@arm.) I also checked the
> pflag.img (for ROM) actually has the tables.
> I just found this link (with your answer,
> https://stackoverflow.com/questions/31187709/qemu-trace-mmu-operation )
> and will try adding some debug prints in get_phys_addr function
> (target/arm/helper.c) (there will be too many prints but I hope it be
> worth it) Thank you and best regards,
> 
> Chan Kim
> 
> > -----Original Message-----
> > From: Peter Maydell <peter.maydell@linaro.org>
> > Sent: Tuesday, March 9, 2021 7:31 PM
> > To: Chan Kim <ckim@etri.re.kr>
> > Cc: qemu-discuss <qemu-discuss@nongnu.org>
> > Subject: Re: What does soft-mmu mean? What happens when we set MMU
> > registers? (aarch64)
> >
> > On Tue, 9 Mar 2021 at 01:37, <ckim@etri.re.kr> wrote:
> > >
> > >
> > > I found If I turn off the 'M' bit (MMU on) of x0 before I write it
> > > to
> > sctrl_el3, sctrl_el2, and sctrl_el1, it doesn't cause exception.
> > > So it's related to MMU (not SMMU of course). And using the -d
> > int,exec,in_asm, the EC(exception class) was "“Instruction Abort taken
> > without a change in Exception level k”.
> > > Below is the debug output (from -d int,exec,in_asm), exception is
> > > caused
> > at "msr sctlr_el3, x0".
> > >
> > > IN:
> > > 0x0000024c:  d53e1000  mrs      x0, sctlr_el3
> > > 0x00000250:  b27e0000  orr      x0, x0, #4
> > > 0x00000254:  b2740000  orr      x0, x0, #0x1000
> > > 0x00000258:  b2400000  orr      x0, x0, #1
> > > 0x0000025c:  926cf800  and      x0, x0, #0xfffffffffff7ffff
> > > 0x00000260:  b27d0000  orr      x0, x0, #8
> > > 0x00000264:  927ef800  and      x0, x0, #0xfffffffffffffffd
> > > 0x00000268:  d53e1002  mrs      x2, sctlr_el3    <-- just to check
> initial
> > value
> > > 0x0000026c:  d53c1002  mrs      x2, sctlr_el2    <-- just to check
> initial
> > value
> > > 0x00000270:  d5381002  mrs      x2, sctlr_el1    <-- just to check
> initial
> > value
> > > 0x00000274:  d51e1000  msr      sctlr_el3, x0    <-- exception happens.
> > >
> > > Trace 0: 0x7f82e73844c0
> > > [0000000000000000/000000000000024c/0x8a100000]
> > > Taking exception 3 [Prefetch Abort]
> > > ...from EL3 to EL3
> > > ...with ESR 0x21/0x86000010
> > > ...with FAR 0x278
> > > ...with ELR 0x278
> > > ...to EL3 PC 0x1200 PSTATE 0x3cd
> > > Taking exception 3 [Prefetch Abort]
> > > ...from EL3 to EL3
> > > ...with ESR 0x21/0x86000010
> > > ...with FAR 0x1200
> > > ...with ELR 0x1200
> > > ...to EL3 PC 0x1200 PSTATE 0x3cd
> >
> > You're at EL3, with the MMU off. You turn on the MMU. The next
> > instruction fetch (for address 0x278) is therefore translated via your
> page tables.
> > Your page tables don't have a mapping for 0x278. We take a prefetch
> abort.
> > This means we try to load the insn at the start of the exception
> > handler, which is at 0x1200. The MMU is still on. There's no mapping
> > in your page tables for this either. We take another Prefetch Abort
> > (and again and
> > again...)
> >
> > When you turn on the MMU for the EL you are currently running at, you
> > need to ensure that the page tables you set up have a valid mapping
> > for the code you're executing (usually a 1:1 mapping) so that the
> > instruction fetches with the MMU on can load the insns.
> >
> > On real hardware you may find that the CPU continues to execute some
> > instructions after the write to SCTLR_EL3 because it had already
> > fetched them; QEMU makes the MMU-enablement take effect immediately.
> > The architecture permits either behaviour -- the only requirement is
> > that the system register write must have taken effect at the point
> > when the guest executes a subsequent barrier insn to force context
> synchronization.
> >
> > thanks
> > -- PMM







reply via email to

[Prev in Thread] Current Thread [Next in Thread]