[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 *)&regs->reg = (val)) \
>                             : (*(u16 *)&regs->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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.