On 10.03.20 16:08, Jan Kiszka wrote:
> On 10.03.20 15:41, Philipp Rosenberger wrote:
>> Hi,
>>
>> I have managed to get virtio-ivshmem console and block running. But I
>> observed a strange behavior. I do the following:
>>
>> 1. Boot up the board.
>> 2. Enable the rootcell.
>> 3. echo "110a 4106 110a 4106 ffc002 ffffff" > \
>>    /sys/bus/pci/drivers/uio_ivshmem/new_id
>> 4. virtio-ivshmem-block /dev/uio0 /path/to/disk.image
>> 5. boot linux-inmate
>> 6. virtio-ivshmem 0000:00:0f.0: backend not ready
>> 7. kernel panic
>>
>> If I redo the sets 4 and 5 the inmates starts as expected and I can
>> access the disk.image via /dev/vda.
>>
>> I found, the the virtio-ivshmem-block tool waits for an interrupt if
>> 'state[peer_id] != VIRTIO_STATE_RESET'. But there is no interrupt.
> 
> The state memory should be zeroed, provided the peer is not running. You 
> will only get an interrupt during the peer setup when it switches it 
> state from (expected) RESET to READY. Maybe we miss some proper 
> initialization of the shared state memory in Jailhouse.
> 
> Can you confirm that the state memory is in a random state on first 
> startup? And that it changes as expected for the peer to READY once the 
> non-root Linux boots?

Does this help?

diff --git a/hypervisor/ivshmem.c b/hypervisor/ivshmem.c
index 22283a85..a5cdcf93 100644
--- a/hypervisor/ivshmem.c
+++ b/hypervisor/ivshmem.c
@@ -101,13 +101,8 @@ static void ivshmem_trigger_interrupt(struct 
ivshmem_endpoint *ive,
        spin_unlock(&ive->irq_lock);
 }
 
-static void ivshmem_write_state(struct ivshmem_endpoint *ive, u32 new_state)
+static u32 *ivshmem_map_state_table(struct ivshmem_endpoint *ive)
 {
-       const struct jailhouse_pci_device *dev_info = ive->device->info;
-       u32 *state_table = (u32 *)TEMPORARY_MAPPING_BASE;
-       struct ivshmem_endpoint *target_ive;
-       unsigned int id;
-
        /*
         * Cannot fail: upper levels of page table were already created by
         * paging_init, and we always map single pages, thus only update the
@@ -115,9 +110,20 @@ static void ivshmem_write_state(struct ivshmem_endpoint 
*ive, u32 new_state)
         */
        paging_create(&this_cpu_data()->pg_structs,
                      ive->shmem[0].phys_start, PAGE_SIZE,
-                     (unsigned long)state_table, PAGE_DEFAULT_FLAGS,
+                     TEMPORARY_MAPPING_BASE, PAGE_DEFAULT_FLAGS,
                      PAGING_NON_COHERENT | PAGING_NO_HUGE);
 
+       return (u32 *)TEMPORARY_MAPPING_BASE;
+}
+
+
+static void ivshmem_write_state(struct ivshmem_endpoint *ive, u32 new_state)
+{
+       const struct jailhouse_pci_device *dev_info = ive->device->info;
+       u32 *state_table = ivshmem_map_state_table(ive);
+       struct ivshmem_endpoint *target_ive;
+       unsigned int id;
+
        state_table[dev_info->shmem_dev_id] = new_state;
        memory_barrier();
 
@@ -435,12 +441,15 @@ int ivshmem_init(struct cell *cell, struct pci_device 
*device)
        }
 
        link->peers++;
-       ive = &link->eps[dev_info->shmem_dev_id];
+       ive = &link->eps[id];
 
        ive->device = device;
        ive->link = link;
        ive->shmem = jailhouse_cell_mem_regions(cell->config) +
                dev_info->shmem_regions_start;
+       if (link->peers == 1)
+               memset(ivshmem_map_state_table(ive), 0,
+                      dev_info->shmem_peers * sizeof(u32));
        device->ivshmem_endpoint = ive;
 
        device->cell = cell;

Jan

-- 
Siemens AG, Corporate Technology, CT RDA IOT SES-DE
Corporate Competence Center Embedded Linux

-- 
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jailhouse-dev/5f6ae796-572a-9dbd-93b3-223fbcf7d3a6%40siemens.com.

Reply via email to