On Tue, Jun 18, 2013 at 11:56:24PM +0800, 李春奇 <Arthur Chunqi Li> wrote: > On Tue, Jun 18, 2013 at 11:47 PM, Gleb Natapov <gleb@xxxxxxxxxx> wrote: > > On Tue, Jun 18, 2013 at 10:28:59PM +0800, Ê??Ê?•Â•? <Arthur Chunqi Li> wrote: > >> On Tue, Jun 18, 2013 at 8:45 PM, Gleb Natapov <gleb@xxxxxxxxxx> wrote: > >> > On Thu, Jun 13, 2013 at 05:30:03PM +0800, ÊùéÊò•Â•á <Arthur Chunqi Li> wrote: > >> >> Hi Gleb, > >> >> I'm trying to solve these problems in the past days and meet many > >> >> difficulties. You want to save all the general registers in calling > >> >> insn_page, so registers should be saved to (save) in insn_page. > >> >> Because all the instructions should be generated outside and copy to > >> >> insn_page, and the instructions generated outside is RIP-relative, so > >> >> inside insn_page (save) will be wrong pointed with RIP-relative code. > >> >> > >> > They do not have to be generated outside. You can write code into > >> > insn_page directly. Something like this outside of any functions: > >> > > >> > asm(".align 4096\n\t" > >> > ".global insn_page\n\t" > >> > ".global insn_page_end\n\t" > >> > ".global test_insn\n\t" > >> > ".global test_insn_end\n\t" > >> > "insn_page:" > >> > "mov %%rax, outregs \n\t" > >> > ... > >> > "test_insn:\n\t" > >> > "in (%ds), %al\n\t" > >> > ". = . + 31\n\t" > >> > "test_insn_end:\n\t" > >> > "mov outregs, %%rax\n\t" > >> > ... > >> > "ret\n\t" > >> > ".align 4096\n\t" > >> > "insn_page_end:\n\t"); > >> > > >> > Now you copy that into alt_insn_page, put instruction you want to test > >> > into test_insn offset and remap alt_insn_page into "insn_page" virtual address. > >> I used such codes: > >> > >> invlpg((void *)virt_to_phys(insn_page)); > > virt_to_phys? > This is a mistake, I changed it to "invlpg(insn_page)" but the result > is the same. > > > >> asm volatile("call *%0" : : "r"(insn_page)); > >> install_page(cr3, virt_to_phys(alt_insn_page), insn_page); > >> asm volatile("call *%0": : "r"(insn_page+1)); > > +1? > Here I put "ret" on the first byte of insn_page, so the first call of > "insn_page" can just return, and the second call of "insn_page+1“ will > directly call the second byte, which is the real content of insn_page. Send the code. -- Gleb. -- 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