From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Cooper Subject: Re: [PATCH 3/4] x86: move I/O emulation stubs off the stack Date: Tue, 19 May 2015 18:48:53 +0100 Message-ID: <555B7785.9050106@citrix.com> References: <5559DAFF020000780007AFE2@mail.emea.novell.com> <5559FB6E020000780007B19E@mail.emea.novell.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1YulhS-0002Ki-5h for xen-devel@lists.xenproject.org; Tue, 19 May 2015 17:53:06 +0000 In-Reply-To: <5559FB6E020000780007B19E@mail.emea.novell.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Jan Beulich , xen-devel Cc: Keir Fraser List-Id: xen-devel@lists.xenproject.org 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 > > --- 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; > } > > > >