From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44044) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZAkWH-0002kT-1x for qemu-devel@nongnu.org; Thu, 02 Jul 2015 15:51:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZAkW8-0000HT-U0 for qemu-devel@nongnu.org; Thu, 02 Jul 2015 15:51:36 -0400 Received: from aserp1040.oracle.com ([141.146.126.69]:29212) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZAkW8-0000Gz-NX for qemu-devel@nongnu.org; Thu, 02 Jul 2015 15:51:28 -0400 From: Konrad Rzeszutek Wilk Date: Thu, 2 Jul 2015 15:51:15 -0400 Message-Id: <1435866681-18468-5-git-send-email-konrad.wilk@oracle.com> In-Reply-To: <1435866681-18468-1-git-send-email-konrad.wilk@oracle.com> References: <1435866681-18468-1-git-send-email-konrad.wilk@oracle.com> Subject: [Qemu-devel] [PATCH v1 04/10] xen/pt: Use xen_host_pci_get_[byte, word, long] instead of xen_host_pci_get_long List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: stefano.stabellini@eu.citrix.com, xen-devel@lists.xenproject.org, qemu-devel@nongnu.org, JBeulich@suse.com Cc: Konrad Rzeszutek Wilk Otherwise we get: xen_pt_config_reg_init: Offset 0x0004 mismatch! Emulated=0x0000, host=0x2300017, syncing to 0x2300014. xen_pt_config_reg_init: Error: Offset 0x0004:0x2300014 expands past register size(2)! which is not surprising. We read the value as an 32-bit (from host), then operate it as a 16-bit - and the remainder is left unchanged. We end up writting the value as 16-bit (so 0014) to dev.config (as we use proper xen_set_host_[byte,word,long] so we don't spill to other registers) but in XenPTReg->data it is as 32-bit (0x2300014)! It is harmless as the read/write functions end up using an size mask and never modify the bits past 16-bit (reg->size is 2). This patch fixes the warnings by reading the value using the proper size. Note that the check for size is still left in-case the developer sets bits past the reg->size in the ->init routines. Signed-off-by: Konrad Rzeszutek Wilk --- hw/xen/xen_pt_config_init.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/hw/xen/xen_pt_config_init.c b/hw/xen/xen_pt_config_init.c index 09309ba..e597993 100644 --- a/hw/xen/xen_pt_config_init.c +++ b/hw/xen/xen_pt_config_init.c @@ -1876,7 +1876,12 @@ static int xen_pt_config_reg_init(XenPCIPassthroughState *s, offset = reg_grp->base_offset + reg->offset; size_mask = 0xFFFFFFFF >> ((4 - reg->size) << 3); - rc = xen_host_pci_get_long(&s->real_device, offset, &val); + switch (reg->size) { + case 1: rc = xen_host_pci_get_byte(&s->real_device, offset, (uint8_t *)&val);break; + case 2: rc = xen_host_pci_get_word(&s->real_device, offset, (uint16_t *)&val);break; + case 4: rc = xen_host_pci_get_long(&s->real_device, offset, &val);break; + default: assert(1); + } if (rc) { /* Serious issues when we cannot read the host values! */ g_free(reg_entry); -- 2.1.0