mirror of https://github.com/xemu-project/xemu.git
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…
Reference in New Issue