[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3/4] x86: move I/O emulation stubs off the stack
On 18/05/15 13:47, Jan Beulich wrote: > This is needed as stacks are going to become non-executable. > > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> > > --- a/xen/arch/x86/traps.c > +++ b/xen/arch/x86/traps.c > @@ -2006,7 +2006,7 @@ static int emulate_privileged_op(struct > ? (*(u32 *)®s->reg = (val)) \ > : (*(u16 *)®s->reg = (val))) > unsigned long code_base, code_limit; > - char io_emul_stub[32]; > + char *io_emul_stub = NULL; > void (*io_emul)(struct cpu_user_regs *) __attribute__((__regparm__(1))); > uint64_t val; > > @@ -2195,6 +2195,9 @@ static int emulate_privileged_op(struct > * GPR context. This is needed for some systems which (ab)use IN/OUT > * to communicate with BIOS code in system-management mode. > */ The comment (just out of context) needs tweaking. > + io_emul_stub = map_domain_page(this_cpu(stubs.mfn)) + > + (this_cpu(stubs.addr) & (PAGE_SIZE - 1)) + > + STUB_BUF_SIZE / 2; > /* movq $host_to_guest_gpr_switch,%rcx */ > io_emul_stub[0] = 0x48; > io_emul_stub[1] = 0xb9; > @@ -2212,7 +2215,7 @@ static int emulate_privileged_op(struct > io_emul_stub[15] = 0xc3; > > /* Handy function-typed pointer to the stub. */ > - io_emul = (void *)io_emul_stub; > + io_emul = (void *)(this_cpu(stubs.addr) + STUB_BUF_SIZE / 2); As an unrelated observation during review, the two gpr switch functions should probably gain some knowledge of TRAP_regs_partial ~Andrew > > if ( ioemul_handle_quirk ) > ioemul_handle_quirk(opcode, &io_emul_stub[12], regs); > @@ -2777,9 +2780,13 @@ static int emulate_privileged_op(struct > done: > instruction_done(regs, eip, bpmatch); > skip: > + if ( io_emul_stub ) > + unmap_domain_page(io_emul_stub); > return EXCRET_fault_fixed; > > fail: > + if ( io_emul_stub ) > + unmap_domain_page(io_emul_stub); > return 0; > } > > > > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |