mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
xen/wait: Remove indirect jump
There is no need for this to be an indirect jump at all. Execution always
returns to a specific location, so use a direct jump instead.
Use a named label for the jump. As both 1 and 2 have disappeared as labels,
rename 3 to skip to better describe its purpose.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
(cherry picked from commit f03567bd7e)
This commit is contained in:
1 parent
eb4b730ac6
commit
1e37e4d2c0
1 file changed
+8
-11
+8
-11
@@ -144,18 +144,16 @@ static void __prepare_to_wait(struct waitqueue_vcpu *wqv)
|
||||
"push %%r8; push %%r9; push %%r10; push %%r11;"
|
||||
"push %%r12; push %%r13; push %%r14; push %%r15;"
|
||||
|
||||
"call 1f;"
|
||||
"1: addq $2f-1b,(%%rsp);"
|
||||
"sub %%esp,%%ecx;"
|
||||
"cmp %3,%%ecx;"
|
||||
"ja 3f;"
|
||||
"ja .L_skip;"
|
||||
"mov %%rsp,%%rsi;"
|
||||
|
||||
/* check_wakeup_from_wait() longjmp()'s to this point. */
|
||||
"2: rep movsb;"
|
||||
".L_wq_resume: rep movsb;"
|
||||
"mov %%rsp,%%rsi;"
|
||||
"3: pop %%rax;"
|
||||
|
||||
".L_skip:"
|
||||
"pop %%r15; pop %%r14; pop %%r13; pop %%r12;"
|
||||
"pop %%r11; pop %%r10; pop %%r9; pop %%r8;"
|
||||
"pop %%rbp; pop %%rdx; pop %%rbx; pop %%rax"
|
||||
@@ -204,15 +202,14 @@ void check_wakeup_from_wait(void)
|
||||
}
|
||||
|
||||
/*
|
||||
* Hand-rolled longjmp(). Returns to the pointer on the top of
|
||||
* wqv->stack, and lands on a `rep movs` instruction. All other GPRs are
|
||||
* restored from the stack, so are available for use here.
|
||||
* Hand-rolled longjmp(). Returns to __prepare_to_wait(), and lands on a
|
||||
* `rep movs` instruction. All other GPRs are restored from the stack, so
|
||||
* are available for use here.
|
||||
*/
|
||||
asm volatile (
|
||||
"mov %1,%%"__OP"sp; INDIRECT_JMP %[ip]"
|
||||
"mov %1,%%"__OP"sp; jmp .L_wq_resume;"
|
||||
: : "S" (wqv->stack), "D" (wqv->esp),
|
||||
"c" ((char *)get_cpu_info() - (char *)wqv->esp),
|
||||
[ip] "r" (*(unsigned long *)wqv->stack)
|
||||
"c" ((char *)get_cpu_info() - (char *)wqv->esp)
|
||||
: "memory" );
|
||||
unreachable();
|
||||
}
|
||||
|
||||