On 12/12/2011 08:14 PM, Sasha Levin wrote: > On Mon, 2011-12-12 at 17:59 +0200, Pekka Enberg wrote: > > On Mon, Dec 12, 2011 at 4:47 PM, Sasha Levin <levinsasha928@xxxxxxxxx> wrote: > > > + /* mmap the actual kernel */ > > > + kvm->bz_fd = dup(fd_kernel); > > > + kvm->bz_len = st.st_size; > > > + setup_end = ALIGN(setup_size - PAGE_SIZE, PAGE_SIZE); /* Need it aligned to PAGE_SIZE */ > > > + kvm->bz_start = mmap(NULL, kvm->bz_len, PROT_READ | PROT_WRITE, > > > + MAP_PRIVATE, kvm->bz_fd, setup_end); > > > > > > - while ((nr = read(fd_kernel, p, 65536)) > 0) > > > - p += nr; > > > + /* NOP everything before the kernel start */ > > > + memset(kvm->bz_start, 0x90, setup_size - setup_end); > > > > So what's the deal with this NOP thing? It really needs a comment that > > explains it all. > > Right, I'll explain it here and if it sounds right to you I'll add it > into the patch. > > Since the start of the actual kernel image is somewhere into the > bzImage, and is not aligned to anything, we can't mmap() directly to the > beginning of it. > > So what we do is mmap the kernel with <PAGE_SIZE bytes before it which > belong to the setup code. > > KVM expects page aligned pointers for both in-guest physical memory > start, and the corresponding userspace address. This means that we can't > simply pass an offset within the memory we mapped before since it won't > be page aligned. > > The solution is to NOP the bytes which belong to the setup code right > before the kernel starts. In practice it means <PAGE_SIZE NOPs before > actual kernel code starts running. Can't you just adjust rip to point to the starting code? -- error compiling committee.c: too many arguments to function -- 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