virtio: change memcpy to guest reads
When accessing the device specific virtio config space, we memcpy the data into a variable in QEMU. At that point we're basically pulling host endianness into the game which is a really bad idea. So instead, let's use the target specific load/store helpers for memory pointers which fetch things in target endianness. The whole array is already populated in target endianness anyways (see virtio-blk). Signed-off-by: Alexander Graf <agraf@suse.de> Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
		
							parent
							
								
									82afa58641
								
							
						
					
					
						commit
						06dbfc6f88
					
				
							
								
								
									
										12
									
								
								hw/virtio.c
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								hw/virtio.c
									
									
									
									
									
								
							| @ -539,7 +539,7 @@ uint32_t virtio_config_readb(VirtIODevice *vdev, uint32_t addr) | ||||
|     if (addr > (vdev->config_len - sizeof(val))) | ||||
|         return (uint32_t)-1; | ||||
| 
 | ||||
|     memcpy(&val, vdev->config + addr, sizeof(val)); | ||||
|     val = ldub_p(vdev->config + addr); | ||||
|     return val; | ||||
| } | ||||
| 
 | ||||
| @ -552,7 +552,7 @@ uint32_t virtio_config_readw(VirtIODevice *vdev, uint32_t addr) | ||||
|     if (addr > (vdev->config_len - sizeof(val))) | ||||
|         return (uint32_t)-1; | ||||
| 
 | ||||
|     memcpy(&val, vdev->config + addr, sizeof(val)); | ||||
|     val = lduw_p(vdev->config + addr); | ||||
|     return val; | ||||
| } | ||||
| 
 | ||||
| @ -565,7 +565,7 @@ uint32_t virtio_config_readl(VirtIODevice *vdev, uint32_t addr) | ||||
|     if (addr > (vdev->config_len - sizeof(val))) | ||||
|         return (uint32_t)-1; | ||||
| 
 | ||||
|     memcpy(&val, vdev->config + addr, sizeof(val)); | ||||
|     val = ldl_p(vdev->config + addr); | ||||
|     return val; | ||||
| } | ||||
| 
 | ||||
| @ -576,7 +576,7 @@ void virtio_config_writeb(VirtIODevice *vdev, uint32_t addr, uint32_t data) | ||||
|     if (addr > (vdev->config_len - sizeof(val))) | ||||
|         return; | ||||
| 
 | ||||
|     memcpy(vdev->config + addr, &val, sizeof(val)); | ||||
|     stb_p(vdev->config + addr, val); | ||||
| 
 | ||||
|     if (vdev->set_config) | ||||
|         vdev->set_config(vdev, vdev->config); | ||||
| @ -589,7 +589,7 @@ void virtio_config_writew(VirtIODevice *vdev, uint32_t addr, uint32_t data) | ||||
|     if (addr > (vdev->config_len - sizeof(val))) | ||||
|         return; | ||||
| 
 | ||||
|     memcpy(vdev->config + addr, &val, sizeof(val)); | ||||
|     stw_p(vdev->config + addr, val); | ||||
| 
 | ||||
|     if (vdev->set_config) | ||||
|         vdev->set_config(vdev, vdev->config); | ||||
| @ -602,7 +602,7 @@ void virtio_config_writel(VirtIODevice *vdev, uint32_t addr, uint32_t data) | ||||
|     if (addr > (vdev->config_len - sizeof(val))) | ||||
|         return; | ||||
| 
 | ||||
|     memcpy(vdev->config + addr, &val, sizeof(val)); | ||||
|     stl_p(vdev->config + addr, val); | ||||
| 
 | ||||
|     if (vdev->set_config) | ||||
|         vdev->set_config(vdev, vdev->config); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Alexander Graf
						Alexander Graf