Hi,

First, I would question the use case and the reason for mapping a NS buffer passed from linux into EL3.
It would help if you explained the end goal. What will you want to achieve with this NS buffer?

The code snippet doesn't really tell what's wrong as it looks inconsistent.
What are ptr_virt_addr and virt_addr_el3?

How are you choosing the virtual address?
Can you try to identity map the physical address to the same virtual address?

Also for mapping memory dynamically I guess you'd need PLAT_XLAT_TABLES_DYNAMIC=1 on the TF-A command line.

Regards,
Olivier.





From: Ç®·Ç·² via TF-A <tf-a@lists.trustedfirmware.org>
Sent: 10 September 2024 10:36
To: tf-a@lists.trustedfirmware.org <tf-a@lists.trustedfirmware.org>
Subject: [TF-A] How to map a physical address using `mmap_add_dynamic_region_alloc_va`?
 
Hi experts,

     I tried to allocate a physical memory address in Linux Kernel, and
pass the memory address to tf-a using smc call. As I asked in previous
mails
(https://lists.trustedfirmware.org/archives/list/tf-a@lists.trustedfirmware.org/thread/R6SE5GJ2A4DLXKUKOZUTLR4HABAP3LTJ/),
tf-a can not access the physical memory address directly, so I try to
use the `mmap_add_dynamic_region_alloc_va` function in `xlat_table_v2`
Library, and map the physical memory in tf-a.

     After calling the function, It does return a new virtual memory
address, but I still failed to access the address, is there any details
I have missed? Here is the code:

```

     NOTICE("phys_addr: 0x%lx, virt_addr: 0x%lx\n", phys_addr, virt_addr);
     int rc = mmap_add_dynamic_region_alloc_va(phys_addr, ptr_virt_addr,
size, MT_NS | MT_RW_DATA);
     if (rc) {
         WARN("Failed to map memory at 0x%lx: %d\n", phys_addr, rc);
         return;
     }
     NOTICE("virt_addr_el3: 0x%lx\n", virt_addr_el3);
     NOTICE("virt_addr_el3[0] = 0x%x\n", *((uint32_t *)virt_addr_el3));

```

     Here is the output:

```

NOTICE:  phys_addr: 0x40f0000, virt_addr: 0xffff0000040f0000
NOTICE:  mm.base_va: 0
NOTICE:  mm.base_va: 100000000
NOTICE:  virt_addr_el3: 0x100000000
[   38.540464] rcu: INFO: rcu_preempt detected stalls on CPUs/tasks:
[   38.546584] rcu:     4-...0: (1 ticks this GP)
idle=4224/1/0x4000000000000000 softirq=125/125 fqs=2625
[   38.555651]  (detected by 0, t=5252 jiffies, g=-779, q=16 ncpus=8)
[   38.561843] Task dump for CPU 4:
[   38.565075] task:main            state:R  running task stack:0    
pid:195   ppid:181    flags:0x00000002
[   38.575015] Call trace:
[   38.577464]  __switch_to+0xe4/0x160
[   38.580975]  0x42

```

     I would be grateful for any advice or suggestions you may have.


Sincerely,

Feifan

--
TF-A mailing list -- tf-a@lists.trustedfirmware.org
To unsubscribe send an email to tf-a-leave@lists.trustedfirmware.org