|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v8 02/17] x86: Support indirect thunks from assembly code
>>> On 12.01.18 at 19:00, <andrew.cooper3@xxxxxxxxxx> wrote:
> Introduce INDIRECT_CALL and INDIRECT_JMP which either degrade to a normal
> indirect branch, or dispatch to the __x86_indirect_thunk_* symbols.
>
> Update all the manual indirect branches in to use the new thunks. The
> indirect branches in the early boot and kexec path are left intact as we
> can't
> use the compiled-in thunks at those points.
>
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
with a couple of cosmetic remarks:
> --- a/xen/arch/x86/pv/emul-priv-op.c
> +++ b/xen/arch/x86/pv/emul-priv-op.c
> @@ -73,46 +73,63 @@ void (*pv_post_outb_hook)(unsigned int port, u8 value);
>
> typedef void io_emul_stub_t(struct cpu_user_regs *);
>
> +void __x86_indirect_thunk_rcx(void);
> +
> static io_emul_stub_t *io_emul_stub_setup(struct priv_op_ctxt *ctxt, u8
> opcode,
> unsigned int port, unsigned int
> bytes)
> {
> + struct stubs *this_stubs = &this_cpu(stubs);
> + unsigned long stub_va = this_stubs->addr + STUB_BUF_SIZE / 2;
> bool use_quirk_stub = false;
>
> if ( !ctxt->io_emul_stub )
> - ctxt->io_emul_stub = map_domain_page(_mfn(this_cpu(stubs.mfn))) +
> - (this_cpu(stubs.addr) &
> - ~PAGE_MASK) +
> - STUB_BUF_SIZE / 2;
> + ctxt->io_emul_stub =
> + map_domain_page(_mfn(this_stubs->mfn)) + (stub_va & ~PAGE_MASK);
>
> /* movq $host_to_guest_gpr_switch,%rcx */
> ctxt->io_emul_stub[0] = 0x48;
> ctxt->io_emul_stub[1] = 0xb9;
> *(void **)&ctxt->io_emul_stub[2] = (void *)host_to_guest_gpr_switch;
> +
> +#ifdef CONFIG_INDIRECT_THUNK
> + /* callq __x86_indirect_thunk_rcx */
> + ctxt->io_emul_stub[10] = 0xe8;
> + *(int32_t *)&ctxt->io_emul_stub[11] =
> + (unsigned long)__x86_indirect_thunk_rcx - (stub_va + 11 + 4);
Given the context I think a cast to signed long would be more
appropriate here.
> +
> +#else
> /* callq *%rcx */
Given the rest of the conditional you add, please either remove
the blank line above or add three more immediately inside the
preprocessor directives.
> ctxt->io_emul_stub[10] = 0xff;
> ctxt->io_emul_stub[11] = 0xd1;
>
> + /*
> + * 3 bytes of P6_NOPS.
> + * TODO: untangle ideal_nops from init/livepatch Kconfig options.
> + */
> + memcpy(&ctxt->io_emul_stub[12], "\x0f\x1f\x00", 3);
Perhaps better "P6_NOP3" in the comment? And perhaps
__stringify(P6_NOP3) in the memcpy() invocation, which may then
make unnecessary that part of the comment?
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |