Updating:

I added 

.num_msix_vectors = 1,
.iommu = 1, 

to the root cell .pci_devices config, wrote a simple linux program to write to 
the shared memory (0x800500000) and a simple inmate cell code to read from the 
shared memory. It was able to read the values that were written.

The next step is how to generate interrupts among the cells. I tried to use the 
pci functions (the same used in the ivshmem-demo) on the arm64 but got an 
error. The lib/pci.c is not compiled by arm64.

How should I discover the pci device and send/receive interrupts on arm64?

Thanks
Giovani

> Thanks for the answers.
> 
> So, I have changed the config. In the root cell I have the following now:
> 
> /* IVSHMEM shared memory region for 00:00.0 */ {
>                       .phys_start = 0x800400000,
>                       .virt_start = 0x800400000,
>                       .size = 0x100000,
>                       .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | 
> JAILHOUSE_MEM_ROOTSHARED, //added MEM_ROOTSHARED
>               },
> 
> .pci_devices = {
>               /* 00:00.0 */ {
>                       .type = JAILHOUSE_PCI_TYPE_IVSHMEM,
>                       .bdf = 0 << 3,
>                       .bar_mask = {
>                               0xffffff00, 0xffffffff, 0x00000000,
>                               0x00000000, 0x00000000, 0x00000000,
>                       },
>                       .shmem_region = 3,
>                       .shmem_protocol = JAILHOUSE_SHMEM_PROTO_UNDEFINED, 
> //changed from JAILHOUSE_SHMEM_PROTO_VETH to JAILHOUSE_SHMEM_PROTO_UNDEFINED
>               },
>    },
> 
> In the inmate cell, I have the following:
> 
> .mem_regions = {
>               ......
>                 .....
>         /* IVSHMEM shared memory region for 00:00.0 */ {
>                       .phys_start = 0x800400000,
>                       .virt_start = 0x800400000,
>                       .size = 0x100000,
>                       .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | 
> JAILHOUSE_MEM_ROOTSHARED, //added JAILHOUSE_MEM_ROOTSHARED
>               },
>       },
> 
> Considering just the configuration of the cells, are they correct?
> 
> So correct me if I am wrong. I will need to write a driver in the root-cell 
> (Linux) to send and receive interrupts to/from the shared ivshmem region. The 
> mapped vpci region contains only the registers of the device:
> 
> 00:00.0 Unassigned class [ff00]: Red Hat, Inc Inter-VM shared memory
>         Subsystem: Red Hat, Inc Inter-VM shared memory
>         Flags: fast devsel, IRQ 38
>         Memory at fc100000 (64-bit, non-prefetchable) [size=256]
> 
> In this case, the address 0xfc100000.
> 
> Is the address (0x800400000) that I configured in the cell config file 
> actually the payload memory region?
> 
> Also, in the another inmate, how can I access the mapped region? I noticed 
> that there is an ivshmem-demo for x86, but there isn't for arm64. 
> 
> Thanks
> 
> > Hi,
> > 
> > what you see there are the registers of the ivshmem device, not the
> > payload memory region. You will have to map the paddr you have in your
> > cell-config. That paddr can be found in the config space as well, is
> > just not a regular PCI BAR.
> > 
> > I would suggest to write a uio driver and base it on
> > https://github.com/henning-schild-work/ivshmem-guest-code/tree/jailhouse
> > 
> > Here is the bit that finds the region
> > https://github.com/henning-schild-work/ivshmem-guest-code/blob/jailhouse/kernel_module/uio/uio_ivshmem.c#L96
> > 
> > Also see:
> > https://github.com/henning-schild-work/ivshmem-guest-code/blob/jailhouse/README.jailhouse
> > 
> > And you should not use JAILHOUSE_SHMEM_PROTO_VETH because you are not
> > running a network-device on top of your shmem. Use _UNDEFINED or
> > _CUSTOM instead.
> > 
> > Henning
> > 
> > Am Tue, 3 Apr 2018 10:47:31 -0700
> > schrieb Giovani Gracioli <>:
> > 
> > > Just another info, after enabling the root cell, I can see the
> > > virtual pci devices with lspci -v:
> > > 
> > > 00:00.0 Unassigned class [ff01]: Red Hat, Inc Inter-VM shared memory
> > >         Subsystem: Red Hat, Inc Inter-VM shared memory
> > >         Flags: fast devsel
> > >         Memory at fc100000 (64-bit, non-prefetchable) [disabled]
> > > [size=256] Memory at <unassigned> (64-bit, non-prefetchable)
> > > [disabled] Capabilities: [50] MSI-X: Enable- Count=1 Masked-
> > > 
> > > 00:01.0 Unassigned class [ff01]: Red Hat, Inc Inter-VM shared memory
> > >         Subsystem: Red Hat, Inc Inter-VM shared memory
> > >         Flags: fast devsel
> > >         Memory at fc100100 (64-bit, non-prefetchable) [disabled]
> > > [size=256]
> > > 
> > > 
> > > 
> > > > Hello,
> > > > 
> > > > I would like to share buffers among cells on arm64 (Xilinx
> > > > ultrascale+). The documentation suggests the use of the ivshmem.
> > > > 
> > > > In order to use ivshmem, I changed the root cell config as follows
> > > > (it is based on the zynqmp-zcu102.c original file):
> > > > 
> > > > - In the .mem_regions:
> > > > 
> > > > /* IVSHMEM shared memory region for 00:00.0 */ {
> > > >                         .phys_start = 0x800400000,
> > > >                         .virt_start = 0x800400000,
> > > >                         .size = 0x100000,
> > > >                         .flags = JAILHOUSE_MEM_READ |
> > > > JAILHOUSE_MEM_WRITE | JAILHOUSE_MEM_ROOTSHARED, //added
> > > > JAILHOUSE_MEM_ROOTSHARED },
> > > > 
> > > > - In the .pci_devices:
> > > > 
> > > > /* 00:00.0 */ {
> > > >                         .type = JAILHOUSE_PCI_TYPE_IVSHMEM,
> > > >                         .bdf = 0 << 3,
> > > >                         .bar_mask = {
> > > >                                 0xffffff00, 0xffffffff, 0x00000000,
> > > >                                 0x00000000, 0x00000000, 0x00000000,
> > > >                         },
> > > >                         .shmem_region = 3,
> > > >                         .shmem_protocol =
> > > > JAILHOUSE_SHMEM_PROTO_VETH, .num_msix_vectors = 1,
> > > >             .iommu = 1,
> > > >                 },
> > > > 
> > > > Then, I load the cell:
> > > > 
> > > > jailhouse enable zynqmp-zcu102-ivshmem.cell 
> > > > 
> > > > Initializing Jailhouse hypervisor v0.8 (37-g1fa9001) on CPU 1
> > > > Code location: 0x0000ffffc0200060
> > > > Page pool usage after early setup: mem 33/995, remap 64/131072
> > > > Initializing processors:
> > > >  CPU 1... OK
> > > >  CPU 2... OK
> > > >  CPU 0... OK
> > > >  CPU 3... OK
> > > > Adding virtual PCI device 00:00.0 to cell "ZynqMP-ZCU102"
> > > > Adding virtual PCI device 00:01.0 to cell "ZynqMP-ZCU102"
> > > > Page pool usage after late setup: mem 42/995, remap 69/131072
> > > > Activating hypervisor
> > > > 
> > > > Then, I wrote a simple user-space program that maps the virtual PCI
> > > > ivshmem region to user using mmap:
> > > > 
> > > > memfd = open("/dev/mem", O_RDWR | O_SYNC);
> > > > 
> > > > mapped_base = mmap(0, MEM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,
> > > > memfd, 0xfc100000 & ~MEM_MASK);
> > > > 
> > > > mapped_dev_base = mapped_base + (dev_base & MEM_MASK);
> > > > 
> > > > for(int i = 0; i < 8; i += 4) {
> > > >         *((volatile unsigned int *) (mapped_dev_base + i)) = 1;
> > > >         printf("Address: %p, Read valeu = %d\n", (void
> > > > *)(mapped_dev_base + i), *((unsigned int *) (mapped_dev_base +
> > > > i))); }
> > > > 
> > > > When I ran this program in the root cell, I got the following
> > > > Unhandled trap:
> > > > 
> > > > ./ivshmem_test 
> > > > /dev/mem opened.
> > > > Memory mapped at address 0x7f8dd87000.
> > > > Unhandled data write at 0xfc100000(4)
> > > > 
> > > > FATAL: unhandled trap (exception class 0x24)
> > > > Cell state before exception:
> > > >  pc: 0000000000400904   lr: 00000000004008d8 spsr: 80000000     EL0
> > > >  sp: 0000007fceff8df0  esr: 24 1 1810046
> > > >  x0: 0000007f8dd87000   x1: 0000000000000001   x2: 0000000000000001
> > > >  x3: 0000000000000000   x4: 0000000040100401   x5: 5404000000000000
> > > >  x6: 000000001aec1037   x7: 0000000000000000   x8: 0000000000000040
> > > >  x9: ffffff80ffffffc8  x10: 0000007fceff8df0  x11: 0000007fceff8df0
> > > > x12: 00000000000003f3  x13: 0000000000000000  x14: 0000000000000000
> > > > x15: 0000007f8dd8ecc0  x16: 0000000000000000  x17: 0000007f8dc53240
> > > > x18: 0000000000000a03  x19: 00000000004009a8  x20: 0000000000000000
> > > > x21: 0000000000000000  x22: 0000000000000000  x23: 0000000000000000
> > > > x24: 0000000000000000  x25: 0000000000000000  x26: 0000000000000000
> > > > x27: 0000000000000000  x28: 0000000000000000  x29: 0000007fceff8df0
> > > > 
> > > > Parking CPU 2 (Cell: "ZynqMP-ZCU102")
> > > > 
> > > > Does that make sense? Am I missing something in the root cell
> > > > config or the user-space program is wrong?
> > > > 
> > > > Best regards  
> > >

-- 
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to jailhouse-dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to