On Wed, Apr 27, 2016 at 03:13:57PM +0200, Alexander Gordeev wrote: > Cc: Andrew Jones <drjones@xxxxxxxxxx> > Cc: Thomas Huth <thuth@xxxxxxxxxx> > Cc: Radim Krčmář <rkrcmar@xxxxxxxxxx> > Signed-off-by: Alexander Gordeev <agordeev@xxxxxxxxxx> > --- > lib/x86/asm/io.h | 3 +++ > lib/x86/io.c | 14 ++++++++++++++ > x86/vmexit.c | 10 ++-------- > 3 files changed, 19 insertions(+), 8 deletions(-) > > diff --git a/lib/x86/asm/io.h b/lib/x86/asm/io.h > index c37450f..d8c5dbd 100644 > --- a/lib/x86/asm/io.h > +++ b/lib/x86/asm/io.h > @@ -42,6 +42,9 @@ static inline void outl(unsigned int value, unsigned short port) > asm volatile("outl %0, %w1" : : "a"(value), "Nd"(port)); > } > > +#define ioremap ioremap > +void __iomem *ioremap(phys_addr_t phys_addr, size_t size); > + > #include <asm-generic/io.h> > > #endif > diff --git a/lib/x86/io.c b/lib/x86/io.c > index d396d42..a699509 100644 > --- a/lib/x86/io.c > +++ b/lib/x86/io.c > @@ -1,4 +1,5 @@ > #include "libcflat.h" > +#include "vm.h" > #include "smp.h" > #include "asm/io.h" > #ifndef USE_SERIAL > @@ -81,3 +82,16 @@ void exit(int code) > asm volatile("out %0, %1" : : "a"(code), "d"((short)0xf4)); > #endif > } > + > +void __iomem *ioremap(phys_addr_t phys_addr, size_t size) > +{ > + phys_addr_t base = ALIGN(phys_addr, PAGE_SIZE); ALIGN() aligns up, so base will be larger than phys_addr, and then... > + phys_addr_t off = phys_addr - base; ...here off is going to be some massive number. But then... > + ulong nr = ALIGN(off + size + (PAGE_SIZE - 1), PAGE_SIZE) / PAGE_SIZE; ...it probably gets small again here after adding size (PAGE_SIZE called from vmexit.c) and PAGE_SIZE-1. So you probably end up with nr=1 anyway. Also, since ALIGN() aligns up, you don't need the '+ (PAGE_SIZE - 1)' here. > + void *page = alloc_vpages(nr); > + > + install_page((void *)read_cr3(), base, page); > + > + return page + off; > +} > + > diff --git a/x86/vmexit.c b/x86/vmexit.c > index db7dbd8..c2e1e49 100644 > --- a/x86/vmexit.c > +++ b/x86/vmexit.c > @@ -371,8 +371,7 @@ int main(int ac, char **av) > { > struct fadt_descriptor_rev1 *fadt; > int i; > - unsigned long membar = 0, base, offset; > - void *m; > + unsigned long membar = 0; > pcidevaddr_t pcidev; > > smp_init(); > @@ -394,12 +393,7 @@ int main(int ac, char **av) > } > if (pci_bar_is_memory(pcidev, i)) { > membar = pci_bar_addr(pcidev, i); > - base = membar & ~4095; > - offset = membar - base; > - m = alloc_vpages(1); > - > - install_page((void *)read_cr3(), base, m); > - pci_test.memaddr = m + offset; > + pci_test.memaddr = ioremap(membar, PAGE_SIZE); > } else { > pci_test.iobar = pci_bar_addr(pcidev, i); > } > -- > 1.8.3.1 > Thanks, drew -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html