CV-Bowen opened a new pull request, #18491:
URL: https://github.com/apache/nuttx/pull/18491
## Summary
Add support for `VIRTIO_RPMSG_F_BUFADDR` feature bit in rpmsg virtio,
allowing the host and remote sides to specify buffer physical addresses through
the resource table config space.
In some multi-core systems, the shared memory pool needs to be split into
separate regions for host-to-remote and remote-to-host buffers. This is useful
when the TX and RX buffers must reside at specific physical addresses (e.g.,
different memory banks or regions with different cache/access attributes). The
`VIRTIO_RPMSG_F_BUFADDR` feature allows this configuration to be communicated
through the standard resource table mechanism.
## Impact
- No impact on existing configurations — the feature is only activated when
both sides negotiate `VIRTIO_RPMSG_F_BUFADDR`
- Backward compatible: the reserved field shrinks but total struct size is
preserved via PACKED layout
- No breaking changes to existing rpmsg virtio users
## Testing
Build test with `qemu-armv8a:v8a_server` and `qemu-armv8a:v8a_proxy`
configurations:
```bash
cmake -B cmake_out/v8a_server -DBOARD_CONFIG=qemu-armv8a:v8a_server -GNinja
cmake --build cmake_out/v8a_server
cmake -B cmake_out/v8a_proxy -DBOARD_CONFIG=qemu-armv8a:v8a_proxy -GNinja
cmake --build cmake_out/v8a_proxy
```
```log
❯ qemu-system-aarch64 -cpu cortex-a53 -nographic \
-machine virt,virtualization=on,gic-version=3 \
-chardev stdio,id=con,mux=on -serial chardev:con \
-object
memory-backend-file,discard-data=on,id=shmmem-shmem0,mem-path=/dev/shm/my_shmem0,size=4194304,share=yes
\
-device ivshmem-plain,id=shmem0,memdev=shmmem-shmem0,addr=0xb \
-device virtio-serial-device,bus=virtio-mmio-bus.0 \
-chardev socket,path=/tmp/rpmsg_port_uart_socket,server=on,wait=off,id=foo \
-device virtconsole,chardev=foo \
-mon chardev=con,mode=readline -kernel ./cmake_out/v8a_server/nuttx \
-gdb tcp::7775
[ 0.000000] [ 0] [ INFO] [server] pci_register_rptun_ivshmem_driver:
Register ivshmem driver, id=0, cpuname=proxy, master=1
[ 0.000000] [ 3] [ INFO] [server] pci_scan_bus: pci_scan_bus for bus 0
[ 0.000000] [ 3] [ INFO] [server] pci_scan_bus: class = 00000600,
hdr_type = 00000000
[ 0.000000] [ 3] [ INFO] [server] pci_scan_bus: 00:00 [1b36:0008]
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar0 set bad mask
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar1 set bad mask
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar2 set bad mask
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar3 set bad mask
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar4 set bad mask
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar5 set bad mask
[ 0.000000] [ 3] [ INFO] [server] pci_scan_bus: class = 00000200,
hdr_type = 00000000
[ 0.000000] [ 3] [ INFO] [server] pci_scan_bus: 00:08 [1af4:1000]
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar0:
mask64=fffffffe 32bytes
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar1:
mask64=fffffff0 4096bytes
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar2 set bad mask
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar3 set bad mask
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar4:
mask64=fffffffffffffff0 16384bytes
[ 0.000000] [ 3] [ INFO] [server] pci_scan_bus: class = 00000500,
hdr_type = 00000000
[ 0.000000] [ 3] [ INFO] [server] pci_scan_bus: 00:58 [1af4:1110]
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar0:
mask64=fffffff0 256bytes
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar1 set bad mask
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar2:
mask64=fffffffffffffff0 4194304bytes
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar4 set bad mask
[ 0.000000] [ 3] [ INFO] [server] pci_setup_device: pbar5 set bad mask
[ 0.000000] [ 3] [ INFO] [server] ivshmem_probe: shmem addr=0x8000400000
size=4194304 reg=0x10001000
[ 0.000000] [ 3] [ INFO] [server] rptun_ivshmem_probe: shmem
addr=0x8000400000 size=4194304
NuttShell (NSH) NuttX-12.12.0
server> [ 0.000000] [ 0] [ INFO] [proxy]
pci_register_rptun_ivshmem_driver: Register ivshmem driver, id=0,
cpuname=server, master=0
[ 0.000000] [ 3] [ INFO] [proxy] pci_scan_bus: pci_scan_bus for bus 0
[ 0.000000] [ 3] [ INFO] [proxy] pci_scan_bus: class = 00000600,
hdr_type = 00000000
[ 0.000000] [ 3] [ INFO] [proxy] pci_scan_bus: 00:00 [1b36:0008]
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar0 set bad mask
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar1 set bad mask
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar2 set bad mask
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar3 set bad mask
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar4 set bad mask
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar5 set bad mask
[ 0.000000] [ 3] [ INFO] [proxy] pci_scan_bus: class = 00000200,
hdr_type = 00000000
[ 0.000000] [ 3] [ INFO] [proxy] pci_scan_bus: 00:08 [1af4:1000]
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar0:
mask64=fffffffe 32bytes
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar1:
mask64=fffffff0 4096bytes
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar2 set bad mask
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar3 set bad mask
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar4:
mask64=fffffffffffffff0 16384bytes
[ 0.000000] [ 3] [ INFO] [proxy] pci_scan_bus: class = 00000500,
hdr_type = 00000000
[ 0.000000] [ 3] [ INFO] [proxy] pci_scan_bus: 00:58 [1af4:1110]
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar0:
mask64=fffffff0 256bytes
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar1 set bad mask
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar2:
mask64=fffffffffffffff0 4194304bytes
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar4 set bad mask
[ 0.000000] [ 3] [ INFO] [proxy] pci_setup_device: pbar5 set bad mask
[ 0.000000] [ 3] [ INFO] [proxy] ivshmem_probe: shmem addr=0x8000400000
size=4194304 reg=0x10001000
[ 0.000000] [ 3] [ INFO] [proxy] rptun_ivshmem_probe: shmem
addr=0x8000400000 size=4194304
[ 0.000000] [ 3] [ INFO] [proxy] rptun_ivshmem_probe: Start the wdog
server>
server>
server>
server> rpmsg ping all 1 1 1 1
[ 14.991300] [ 7] [ EMERG] [server] ping times: 1
[ 14.992000] [ 7] [ EMERG] [server] buffer_len: 1520, send_len: 17
[ 14.993500] [ 7] [ EMERG] [server] avg: 0 s, 92999840 ns
[ 14.994500] [ 7] [ EMERG] [server] min: 0 s, 92999840 ns
[ 14.995400] [ 7] [ EMERG] [server] max: 0 s, 92999840 ns
[ 14.996600] [ 7] [ EMERG] [server] rate: 0.001462 Mbits/sec
[ 15.004500] [ 7] [ EMERG] [server] ping times: 1
[ 15.005200] [ 7] [ EMERG] [server] buffer_len: 2008, send_len: 17
[ 15.006200] [ 7] [ EMERG] [server] avg: 0 s, 77037968 ns
[ 15.007100] [ 7] [ EMERG] [server] min: 0 s, 77037968 ns
[ 15.008000] [ 7] [ EMERG] [server] max: 0 s, 77037968 ns
[ 15.008900] [ 7] [ EMERG] [server] rate: 0.001765 Mbits/sec
server>
server> uname -a
NuttX server 12.12.0 e9cf314c221-dirty Mar 4 2026 20:27:46 arm64 qemu-armv8a
server> rpmsg dump all
[ 18.381900] [ 7] [ EMERG] [server] Local: server Remote: proxy Headrx 8
[ 18.384300] [ 7] [ EMERG] [server] Dump rpmsg info between cpu (master:
yes)server <==> proxy:
[ 18.385800] [ 7] [ EMERG] [server] rpmsg vq RX:
[ 18.387000] [ 7] [ EMERG] [server] VQ: rx_vq - size=8; free=0; queued=0;
desc_head_idx=32768; available_idx=0; avail.idx=16; used_cons_idx=8;
used.idx=8; avail.flags=0x0; used.flags=0x1
[ 18.389800] [ 7] [ EMERG] [server] rpmsg vq TX:
[ 18.390500] [ 7] [ EMERG] [server] VQ: tx_vq - size=8; free=6; queued=0;
desc_head_idx=2; available_idx=0; avail.idx=6; used_cons_idx=4; used.idx=6;
avail.flags=0x1; used.flags=0x0
[ 18.393100] [ 7] [ EMERG] [server] rpmsg ept list:
[ 18.394200] [ 7] [ EMERG] [server] ept NS
[ 18.394900] [ 7] [ EMERG] [server] ept rpmsg-sensor
[ 18.395700] [ 7] [ EMERG] [server] ept rpmsg-ping
[ 18.396500] [ 7] [ EMERG] [server] ept rpmsg-syslog
[ 18.397300] [ 7] [ EMERG] [server] rpmsg buffer list:
[ 18.398600] [ 7] [ EMERG] [server] RX buffer, total 8, pending 0
[ 18.400300] [ 7] [ EMERG] [server] TX buffer, total 8, pending 0
[ 18.403100] [ 7] [ EMERG] [server] Remote: proxy2 state: 1
[ 18.404200] [ 7] [ EMERG] [server] ept NS
[ 18.404900] [ 7] [ EMERG] [server] ept rpmsg-sensor
[ 18.405700] [ 7] [ EMERG] [server] ept rpmsg-ping
[ 18.406600] [ 7] [ EMERG] [server] rpmsg_port queue RX: {used: 0, avail:
8}
[ 18.406600] [ 7] [ EMERG] [server] rpmsg buffer list:
[ 18.408800] [ 7] [ EMERG] [server] rpmsg_port queue TX: {used: 0, avail:
8}
[ 18.408800] [ 7] [ EMERG] [server] rpmsg buffer list:
[ 18.413600] [ 7] [ ALERT] [server] sched_dumpstack: backtrace| 5:
0x00000000402a8a20 0x00000000402aa4e8 0x000000004029c1c8 0x000000004028cc54
0x00000000402e4328 0x00000000402e43d8 0x00000000402bd054 0x00000000402bd4dc
[ 18.416500] [ 7] [ ALERT] [server] sched_dumpstack: backtrace| 5:
0x00000000402ad390
[ 18.418300] [ 7] [ ALERT] [server] sched_dumpstack: backtrace| 6:
0x00000000402a8e40 0x00000000402f6474 0x00000000402bc428 0x00000000402bd5c4
0x00000000402ad390
server>
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]