diff options
author | Andres Lagar-Cavilla <andres@lagarcavilla.org> | 2012-01-26 13:21:27 +0000 |
---|---|---|
committer | Andres Lagar-Cavilla <andres@lagarcavilla.org> | 2012-01-26 13:21:27 +0000 |
commit | be1ff5e8f0f71f0927ec2681ec7f51ac2efe50d9 (patch) | |
tree | 2471304b8998d8daca6ac50fd5bcfc7564d06378 /xen/arch/x86/hvm/stdvga.c | |
parent | 91279d9f230d7314e212a0e3aa0cee874edb6a3d (diff) | |
download | xen-be1ff5e8f0f71f0927ec2681ec7f51ac2efe50d9.tar.gz xen-be1ff5e8f0f71f0927ec2681ec7f51ac2efe50d9.tar.bz2 xen-be1ff5e8f0f71f0927ec2681ec7f51ac2efe50d9.zip |
x86/mm: clean use of p2m unlocked queries
Limit such queries only to p2m_query types. This is more compatible
with the name and intended semantics: perform only a lookup, and explicitly
in an unlocked way.
Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Acked-by: Tim Deegan <tim@xen.org>
Committed-by: Tim Deegan <tim@xen.org>
Diffstat (limited to 'xen/arch/x86/hvm/stdvga.c')
-rw-r--r-- | xen/arch/x86/hvm/stdvga.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/xen/arch/x86/hvm/stdvga.c b/xen/arch/x86/hvm/stdvga.c index c9ae70d111..ddbd9970f3 100644 --- a/xen/arch/x86/hvm/stdvga.c +++ b/xen/arch/x86/hvm/stdvga.c @@ -482,15 +482,19 @@ static int mmio_move(struct hvm_hw_stdvga *s, ioreq_t *p) if ( hvm_copy_to_guest_phys(data, &tmp, p->size) != HVMCOPY_okay ) { - (void)get_gfn_unlocked(d, data >> PAGE_SHIFT, &p2mt); + (void)get_gfn(d, data >> PAGE_SHIFT, &p2mt); /* * The only case we handle is vga_mem <-> vga_mem. * Anything else disables caching and leaves it to qemu-dm. */ if ( (p2mt != p2m_mmio_dm) || (data < VGA_MEM_BASE) || ((data + p->size) > (VGA_MEM_BASE + VGA_MEM_SIZE)) ) + { + put_gfn(d, data >> PAGE_SHIFT); return 0; + } stdvga_mem_write(data, tmp, p->size); + put_gfn(d, data >> PAGE_SHIFT); } data += sign * p->size; addr += sign * p->size; @@ -504,11 +508,15 @@ static int mmio_move(struct hvm_hw_stdvga *s, ioreq_t *p) if ( hvm_copy_from_guest_phys(&tmp, data, p->size) != HVMCOPY_okay ) { - (void)get_gfn_unlocked(d, data >> PAGE_SHIFT, &p2mt); + (void)get_gfn(d, data >> PAGE_SHIFT, &p2mt); if ( (p2mt != p2m_mmio_dm) || (data < VGA_MEM_BASE) || ((data + p->size) > (VGA_MEM_BASE + VGA_MEM_SIZE)) ) + { + put_gfn(d, data >> PAGE_SHIFT); return 0; + } tmp = stdvga_mem_read(data, p->size); + put_gfn(d, data >> PAGE_SHIFT); } stdvga_mem_write(addr, tmp, p->size); data += sign * p->size; |