qxl: factor out qxl_get_check_slot_offset
New helper function which translates a qxl physical address into memory slot and offset. Also applies sanity checks. Factored out from qxl_phys2virt. No functional change. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Message-id: 1466597244-5938-1-git-send-email-kraxel@redhat.com
This commit is contained in:
		
							parent
							
								
									2f5ae772c6
								
							
						
					
					
						commit
						726bdf653a
					
				@ -1338,36 +1338,53 @@ static void qxl_reset_surfaces(PCIQXLDevice *d)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* can be also called from spice server thread context */
 | 
					/* can be also called from spice server thread context */
 | 
				
			||||||
void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL pqxl, int group_id)
 | 
					static bool qxl_get_check_slot_offset(PCIQXLDevice *qxl, QXLPHYSICAL pqxl,
 | 
				
			||||||
 | 
					                                      uint32_t *s, uint64_t *o)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    uint64_t phys   = le64_to_cpu(pqxl);
 | 
					    uint64_t phys   = le64_to_cpu(pqxl);
 | 
				
			||||||
    uint32_t slot   = (phys >> (64 -  8)) & 0xff;
 | 
					    uint32_t slot   = (phys >> (64 -  8)) & 0xff;
 | 
				
			||||||
    uint64_t offset = phys & 0xffffffffffff;
 | 
					    uint64_t offset = phys & 0xffffffffffff;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (group_id) {
 | 
					 | 
				
			||||||
    case MEMSLOT_GROUP_HOST:
 | 
					 | 
				
			||||||
        return (void *)(intptr_t)offset;
 | 
					 | 
				
			||||||
    case MEMSLOT_GROUP_GUEST:
 | 
					 | 
				
			||||||
    if (slot >= NUM_MEMSLOTS) {
 | 
					    if (slot >= NUM_MEMSLOTS) {
 | 
				
			||||||
        qxl_set_guest_bug(qxl, "slot too large %d >= %d", slot,
 | 
					        qxl_set_guest_bug(qxl, "slot too large %d >= %d", slot,
 | 
				
			||||||
                          NUM_MEMSLOTS);
 | 
					                          NUM_MEMSLOTS);
 | 
				
			||||||
            return NULL;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (!qxl->guest_slots[slot].active) {
 | 
					    if (!qxl->guest_slots[slot].active) {
 | 
				
			||||||
        qxl_set_guest_bug(qxl, "inactive slot %d\n", slot);
 | 
					        qxl_set_guest_bug(qxl, "inactive slot %d\n", slot);
 | 
				
			||||||
            return NULL;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (offset < qxl->guest_slots[slot].delta) {
 | 
					    if (offset < qxl->guest_slots[slot].delta) {
 | 
				
			||||||
        qxl_set_guest_bug(qxl,
 | 
					        qxl_set_guest_bug(qxl,
 | 
				
			||||||
                          "slot %d offset %"PRIu64" < delta %"PRIu64"\n",
 | 
					                          "slot %d offset %"PRIu64" < delta %"PRIu64"\n",
 | 
				
			||||||
                          slot, offset, qxl->guest_slots[slot].delta);
 | 
					                          slot, offset, qxl->guest_slots[slot].delta);
 | 
				
			||||||
            return NULL;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    offset -= qxl->guest_slots[slot].delta;
 | 
					    offset -= qxl->guest_slots[slot].delta;
 | 
				
			||||||
    if (offset > qxl->guest_slots[slot].size) {
 | 
					    if (offset > qxl->guest_slots[slot].size) {
 | 
				
			||||||
        qxl_set_guest_bug(qxl,
 | 
					        qxl_set_guest_bug(qxl,
 | 
				
			||||||
                          "slot %d offset %"PRIu64" > size %"PRIu64"\n",
 | 
					                          "slot %d offset %"PRIu64" > size %"PRIu64"\n",
 | 
				
			||||||
                          slot, offset, qxl->guest_slots[slot].size);
 | 
					                          slot, offset, qxl->guest_slots[slot].size);
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    *s = slot;
 | 
				
			||||||
 | 
					    *o = offset;
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* can be also called from spice server thread context */
 | 
				
			||||||
 | 
					void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL pqxl, int group_id)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint64_t offset;
 | 
				
			||||||
 | 
					    uint32_t slot;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (group_id) {
 | 
				
			||||||
 | 
					    case MEMSLOT_GROUP_HOST:
 | 
				
			||||||
 | 
					        offset = le64_to_cpu(pqxl) & 0xffffffffffff;
 | 
				
			||||||
 | 
					        return (void *)(intptr_t)offset;
 | 
				
			||||||
 | 
					    case MEMSLOT_GROUP_GUEST:
 | 
				
			||||||
 | 
					        if (!qxl_get_check_slot_offset(qxl, pqxl, &slot, &offset)) {
 | 
				
			||||||
            return NULL;
 | 
					            return NULL;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return qxl->guest_slots[slot].ptr + offset;
 | 
					        return qxl->guest_slots[slot].ptr + offset;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user