|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC v2 09/12] x86: enhance syscall stub to work in per-domain mapping
>>> On 22.01.18 at 13:32, <jgross@xxxxxxxx> wrote:
> --- a/xen/arch/x86/x86_64/traps.c
> +++ b/xen/arch/x86/x86_64/traps.c
> @@ -260,10 +260,11 @@ void do_double_fault(struct cpu_user_regs *regs)
> panic("DOUBLE FAULT -- system shutdown");
> }
>
> -static unsigned int write_stub_trampoline(
> - unsigned char *stub, unsigned long stub_va,
> - unsigned long stack_bottom, unsigned long target_va)
> +void write_stub_trampoline(unsigned char *stub, unsigned long stub_va,
> + unsigned long stack_bottom, unsigned long
> target_va)
Why does the static go away?
> @@ -282,24 +283,32 @@ static unsigned int write_stub_trampoline(
> /* pushq %rax */
> stub[23] = 0x50;
>
> - /* jmp target_va */
> - stub[24] = 0xe9;
> - *(int32_t *)&stub[25] = target_va - (stub_va + 29);
> -
> - /* Round up to a multiple of 16 bytes. */
> - return 32;
> + target_diff = target_va - (stub_va + 29);
> + if ( target_diff >> 31 == target_diff >> 63 )
> + {
> + /* jmp target_va */
> + stub[24] = 0xe9;
> + *(int32_t *)&stub[25] = target_diff;
> + }
> + else
> + {
> + /* movabs target_va, %rax */
> + stub[24] = 0x48;
> + stub[25] = 0xb8;
> + *(uint64_t *)&stub[26] = target_va;
> + /* jmpq *%rax */
> + stub[34] = 0xff;
> + stub[35] = 0xe0;
> + }
This clearly needs another solution, as you'd have to go through a
thunk now, and the thunk would be unreachable too.
> }
>
> DEFINE_PER_CPU(struct stubs, stubs);
> -void lstar_enter(void);
> -void cstar_enter(void);
Why do these move into a header?
> @@ -312,10 +321,9 @@ void subarch_percpu_traps_init(void)
> * start of the stubs.
> */
> wrmsrl(MSR_LSTAR, stub_va);
> - offset = write_stub_trampoline(stub_page + (stub_va & ~PAGE_MASK),
> - stub_va, stack_bottom,
> - (unsigned long)lstar_enter);
> - stub_va += offset;
> + write_stub_trampoline(stub_page + (stub_va & ~PAGE_MASK), stub_va,
> + stack_bottom, (unsigned long)lstar_enter);
> + stub_va += STUB_TRAMPOLINE_SIZE_PERCPU;
The function may have written more than 32 bytes now; you'd
notice the breakage if you put a suitable BUILD_BUG_ON() into
the function. Otherwise I recommend you stick to the current
"return number of bytes written" model.
> @@ -328,12 +336,11 @@ void subarch_percpu_traps_init(void)
>
> /* Trampoline for SYSCALL entry from compatibility mode. */
> wrmsrl(MSR_CSTAR, stub_va);
> - offset += write_stub_trampoline(stub_page + (stub_va & ~PAGE_MASK),
> - stub_va, stack_bottom,
> - (unsigned long)cstar_enter);
> + write_stub_trampoline(stub_page + (stub_va & ~PAGE_MASK), stub_va,
> + stack_bottom, (unsigned long)cstar_enter);
>
> /* Don't consume more than half of the stub space here. */
> - ASSERT(offset <= STUB_BUF_SIZE / 2);
> + ASSERT(2 * STUB_TRAMPOLINE_SIZE_PERCPU <= STUB_BUF_SIZE / 2);
BUILD_BUG_ON() for compile time constants.
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 |