mirror of
				https://git.proxmox.com/git/qemu
				synced 2025-10-31 20:36:04 +00:00 
			
		
		
		
	 432d268c05
			
		
	
	
		432d268c05
		
	
	
	
	
		
			
			On IA32 host or IA32 PAE host, at present, generally, we can't create an HVM guest with more than 2G memory, because generally it's almost impossible for Qemu to find a large enough and consecutive virtual address space to map an HVM guest's whole physical address space. The attached patch fixes this issue using dynamic mapping based on little blocks of memory. Each call to qemu_get_ram_ptr makes a call to qemu_map_cache with the lock option, so mapcache will not unmap these ram_ptr. Blocks that do not belong to the RAM, but usually to a device ROM or to a framebuffer, are handled in a separate function. So the whole RAMBlock can be map. Signed-off-by: Jun Nakajima <jun.nakajima@intel.com> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Signed-off-by: Alexander Graf <agraf@suse.de>
		
			
				
	
	
		
			38 lines
		
	
	
		
			978 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			38 lines
		
	
	
		
			978 B
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright (C) 2011       Citrix Ltd.
 | |
|  *
 | |
|  * This work is licensed under the terms of the GNU GPL, version 2.  See
 | |
|  * the COPYING file in the top-level directory.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #ifndef XEN_MAPCACHE_H
 | |
| #define XEN_MAPCACHE_H
 | |
| 
 | |
| #include <sys/mman.h>
 | |
| #include "trace.h"
 | |
| 
 | |
| void     qemu_map_cache_init(void);
 | |
| uint8_t  *qemu_map_cache(target_phys_addr_t phys_addr, target_phys_addr_t size, uint8_t lock);
 | |
| void     qemu_map_cache_unlock(void *phys_addr);
 | |
| ram_addr_t qemu_ram_addr_from_mapcache(void *ptr);
 | |
| void     qemu_invalidate_entry(uint8_t *buffer);
 | |
| void     qemu_invalidate_map_cache(void);
 | |
| 
 | |
| uint8_t *xen_map_block(target_phys_addr_t phys_addr, target_phys_addr_t size);
 | |
| 
 | |
| static inline void xen_unmap_block(void *addr, ram_addr_t size)
 | |
| {
 | |
|     trace_xen_unmap_block(addr, size);
 | |
| 
 | |
|     if (munmap(addr, size) != 0) {
 | |
|         hw_error("xen_unmap_block: %s", strerror(errno));
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| #define mapcache_lock()   ((void)0)
 | |
| #define mapcache_unlock() ((void)0)
 | |
| 
 | |
| #endif /* !XEN_MAPCACHE_H */
 |