Hello Stefano,
Hello Julien,

> OK I see the question is about the Xilinx Xen tree. In the logs below we
have:

I see. After the correction r2 to r1 CSU got aborted immediately.

(XEN) d0v0 Forwarding AES operation: 3254779951 136bb00000000000 ->
fffffffffffff000
Received exception
MSR: 0x200, EAR: 0x2F, EDR: 0x0, ESR: 0x861

I printed the value which I got after the expression which I provided in
the 1-st email executed.

So I may conclude that Xilinx's real physical address calculation scheme on
the xen CC is incorrect.

Could you suggest a correct one ?

Regards,
Oleg Nikitenko

пт, 29 сент. 2023 г. в 00:50, Stefano Stabellini <sstabell...@kernel.org>:

> On Thu, 28 Sep 2023, Oleg Nikitenko wrote:
> > Hello Julien,
> >
> > I am still fighting with xen Cache Coloring with aes.
> > When I sent a request to hardware aes after xen with CC started I got
> the mistake in CSU.
> > When I dumped structure contents on both sides I got the different data.
> > Xilinx related contact wrote to me.
> >
> > When cache coloring is enabled, Dom0 is not 1:1 mapped (guest physical
> addresses in Dom0 != physical addresses). If the Xilinx drivers in
> > Linux (xcsudma.c) issue EEMI calls with a guest physical address (for
> instance the address of a memory buffer allocated by Linux), then
> > this address is no longer a physical address and would need to be
> translated. EEMI calls always get forwarded to Xen first, then Xen issues
> > a corresponding EEMI call to the firmware (see
> xen/arch/arm/platforms/xilinx-eemi.c:xilinx_eemi). But Xen is probably
> passing the EEMI
> > calls parameters unmodified. Then PMU tries to read the address but
> since this is not a physical address, it fails. Basically we need to
> > add code to Xen xen/arch/arm/platforms/xilinx-eemi.c:xilinx_eemi to
> translate any guest physical addresses passed as EEMI calls arguments
> > into physical addresses before making the EEMI call to firmware.
> >
> > This is an example patch, which is translating the parameter on register
> x2 for the EEMI call 0xC200002F. I haven't checked the EEMI
> > protocol for this call but this just an example to show you how to
> translate parameters.
> >
> > diff --git a/xen/arch/arm/platforms/xilinx-eemi.c
> b/xen/arch/arm/platforms/xilinx-eemi.c index 500c86dc69..bff1b71196 100644
> ---
> > a/xen/arch/arm/platforms/xilinx-eemi.c +++
> b/xen/arch/arm/platforms/xilinx-eemi.c @@ -409,6 +409,30 @@ bool
> xilinx_eemi(struct
> > cpu_user_regs *regs, const uint32_t fid, } goto forward_to_fw;
> >
> >  *  case 0xC200002F:
> >  *  {
> >  *  uint64_t example_possible_address_param = get_user_reg(regs, 2);
> >  *  uint64_t translated_address =
> mfn_to_maddr(gfn_to_mfn(current->domain,
> >  *  gaddr_to_gfn(example_possible_address_param)));
> >  *  translated_address += example_possible_address_param & ~PAGE_MASK; +
> >  *  arm_smccc_1_1_smc(get_user_reg(regs, 0),
> >  *  get_user_reg(regs, 1),
> >  *  translated_address,
> >  *  get_user_reg(regs, 3),
> >  *  get_user_reg(regs, 4),
> >  *  get_user_reg(regs, 5),
> >  *  get_user_reg(regs, 6),
> >  *  get_user_reg(regs, 7),
> >  *  &res); +
> >  *  set_user_reg(regs, 0, res.a0);
> >  *  set_user_reg(regs, 1, res.a1);
> >  *  set_user_reg(regs, 2, res.a2);
> >  *  set_user_reg(regs, 3, res.a3);
> >  *  return true;
> >  *  }
> >
> > + default: if ( is_hardware_domain(current->domain) ) goto forward_to_fw;
> >
> > The aes request structure contains physical addresses of the source and
> destination.
> > These addresses are obtained via two calls dma_alloc_coherent.
> > The address of this structure is kept at x2 register.
>
> OK I see the question is about the Xilinx Xen tree. In the logs below we
> have:
>
> > (XEN) d0v1 Forwarding AES operation: 3254779951 r2 0 ->
> 11432000                                                        log from xen
>
> So it looks Linux passed 0 as address in x2, which cannot be right?
>
>
>
> > I applied the suggested scheme in xen for xilinx_eemi(...) function.
> >
> > case 0xC200002F:
> > {
> > uint64_t paramaddr = get_user_reg(regs, 2);
>
> It would seem that this is not read correctly? It should not be zero.
>
>
> > uint64_t phyaddr = mfn_to_maddr(gfn_to_mfn(current->domain,
> gaddr_to_gfn(paramaddr)));
> > phyaddr += (paramaddr & ~PAGE_MASK);
> > gprintk(XENLOG_DEBUG, "Forwarding AES operation: %u r2 %lx -> %lx\n",
> fid, paramaddr, phyaddr);
> > set_user_reg(regs, 2, phyaddr);
> > }
> > goto forward_to_fw;
> >
> > As a result I got the same issue as earlier.
> >
> > [   17.350086]
> >
> zynq_aes_gcm
> user
> > log
> >
> > [   17.350202] @ dma_alloc firmware:zynqmp-firmware:zynqmp-aes
> @                                                       kernel log from Dom0
> > [   17.353015] @@@ firmware:zynqmp-firmware:zynqmp-aes 0 @@@
> > [   17.358515] zynqmp_aes [0] ffffffc00910d000 2806000
> firmware:zynqmp-firmware:zynqmp-aes
> > [   17.366546] @ dma_alloc firmware:zynqmp-firmware:zynqmp-aes @
> > [   17.372347] @@@ firmware:zynqmp-firmware:zynqmp-aes 0 @@@
> > [   17.377775] zynqmp_aes [1] ffffffc009115000 42a14000 keytype 1
> > [   17.383660] zynqmp_aes [2] dump request align 1 ++
> > [   17.388501] 00 60 80 02 00 00 00 00
> > [   17.392032] 50 60 80 02 00 00 00 00
> > [   17.395583] 00 00 00 00 00 00 00 00
> > [   17.399117] 00 60 80 02 00 00 00 00
> > [   17.402664] 40 00 00 00 00 00 00 00
> > [   17.406226] 00 00 00 00 00 00 00 00
> > [   17.409755] 01 00 00 00 00 00 00 00
> > [   17.413311] zynqmp_aes [3] dump request --
> >
> > (XEN) d0v1 Forwarding AES operation: 3254779951 r2 0 ->
> 11432000                                                        log from xen
>
> Here
>
>
> > @ 000042A14000
> >
> @
> csu
> > log from aes
> > 04 E4 00 6F 05 E4 00 6F
> > 06 E4 00 6F 07 E4 00 6F
> > 10 E4 00 6F 11 E4 00 6F
> > 12 E4 00 6F 13 E4 00 6F
> > 14 E4 00 6F 15 E4 00 6F
> > 16 E4 00 6F 17 E4 00 6F
> > 18 E4 00 6F 19 E4 00 6F
> >
> > ERROR:   pm_aes_engine ### args 6 ret 0 addr 0 42a14000
> ###                                                                ATF log
> >
> > So the address of the structure was not changed.
> > This is the question.
> > How can I map this address to xen and change physical addresses there ?

Reply via email to