mirror of https://github.com/xemu-project/xemu.git
system: let qemu_map_ram_ptr() use qemu_ram_ptr_length()
qemu_map_ram_ptr() and qemu_ram_ptr_length() share quite some code, so modify qemu_ram_ptr_length() a little bit and use it for qemu_map_ram_ptr(), too. Signed-off-by: Juergen Gross <jgross@suse.com> Signed-off-by: Vikram Garhwal <vikram.garhwal@amd.com> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20240227223501.28475-4-vikram.garhwal@amd.com> Reviewed-by: Edgar E. Iglesias <edgar.iglesias@amd.com> Signed-off-by: Edgar E. Iglesias <edgar.iglesias@amd.com> Acked-by: David Hildenbrand <david@redhat.com> Reviewed-by: Peter Xu <peterx@redhat.com> Message-ID: <20240430164939.925307-2-edgar.iglesias@gmail.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
This commit is contained in:
parent
59272469bd
commit
a99dd3375c
|
@ -2189,43 +2189,17 @@ void qemu_ram_remap(ram_addr_t addr, ram_addr_t length)
|
|||
}
|
||||
#endif /* !_WIN32 */
|
||||
|
||||
/* Return a host pointer to ram allocated with qemu_ram_alloc.
|
||||
* This should not be used for general purpose DMA. Use address_space_map
|
||||
* or address_space_rw instead. For local memory (e.g. video ram) that the
|
||||
* device owns, use memory_region_get_ram_ptr.
|
||||
*
|
||||
* Called within RCU critical section.
|
||||
*/
|
||||
void *qemu_map_ram_ptr(RAMBlock *block, ram_addr_t addr)
|
||||
{
|
||||
if (block == NULL) {
|
||||
block = qemu_get_ram_block(addr);
|
||||
addr -= block->offset;
|
||||
}
|
||||
|
||||
if (xen_enabled() && block->host == NULL) {
|
||||
/* We need to check if the requested address is in the RAM
|
||||
* because we don't want to map the entire memory in QEMU.
|
||||
* In that case just map until the end of the page.
|
||||
*/
|
||||
if (block->offset == 0) {
|
||||
return xen_map_cache(addr, 0, 0, false);
|
||||
}
|
||||
|
||||
block->host = xen_map_cache(block->offset, block->max_length, 1, false);
|
||||
}
|
||||
return ramblock_ptr(block, addr);
|
||||
}
|
||||
|
||||
/* Return a host pointer to guest's ram. Similar to qemu_map_ram_ptr
|
||||
* but takes a size argument.
|
||||
/*
|
||||
* Return a host pointer to guest's ram.
|
||||
*
|
||||
* Called within RCU critical section.
|
||||
*/
|
||||
static void *qemu_ram_ptr_length(RAMBlock *block, ram_addr_t addr,
|
||||
hwaddr *size, bool lock)
|
||||
{
|
||||
if (*size == 0) {
|
||||
hwaddr len = 0;
|
||||
|
||||
if (size && *size == 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -2233,7 +2207,10 @@ static void *qemu_ram_ptr_length(RAMBlock *block, ram_addr_t addr,
|
|||
block = qemu_get_ram_block(addr);
|
||||
addr -= block->offset;
|
||||
}
|
||||
*size = MIN(*size, block->max_length - addr);
|
||||
if (size) {
|
||||
*size = MIN(*size, block->max_length - addr);
|
||||
len = *size;
|
||||
}
|
||||
|
||||
if (xen_enabled() && block->host == NULL) {
|
||||
/* We need to check if the requested address is in the RAM
|
||||
|
@ -2241,7 +2218,7 @@ static void *qemu_ram_ptr_length(RAMBlock *block, ram_addr_t addr,
|
|||
* In that case just map the requested area.
|
||||
*/
|
||||
if (block->offset == 0) {
|
||||
return xen_map_cache(addr, *size, lock, lock);
|
||||
return xen_map_cache(addr, len, lock, lock);
|
||||
}
|
||||
|
||||
block->host = xen_map_cache(block->offset, block->max_length, 1, lock);
|
||||
|
@ -2250,6 +2227,19 @@ static void *qemu_ram_ptr_length(RAMBlock *block, ram_addr_t addr,
|
|||
return ramblock_ptr(block, addr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return a host pointer to ram allocated with qemu_ram_alloc.
|
||||
* This should not be used for general purpose DMA. Use address_space_map
|
||||
* or address_space_rw instead. For local memory (e.g. video ram) that the
|
||||
* device owns, use memory_region_get_ram_ptr.
|
||||
*
|
||||
* Called within RCU critical section.
|
||||
*/
|
||||
void *qemu_map_ram_ptr(RAMBlock *ram_block, ram_addr_t addr)
|
||||
{
|
||||
return qemu_ram_ptr_length(ram_block, addr, NULL, false);
|
||||
}
|
||||
|
||||
/* Return the offset of a hostpointer within a ramblock */
|
||||
ram_addr_t qemu_ram_block_host_offset(RAMBlock *rb, void *host)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue