Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-15-SP3:Update
xen
xsa456-0f.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File xsa456-0f.patch of Package xen
# Commit f03567bd7e8efc0f667a67905862e6047babdb7a # Date 2021-11-29 13:53:05 +0000 # Author Andrew Cooper <andrew.cooper3@citrix.com> # Committer Andrew Cooper <andrew.cooper3@citrix.com> 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> --- a/xen/common/wait.c +++ b/xen/common/wait.c @@ -144,18 +144,16 @@ static void __prepare_to_wait(struct wai "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(); }
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor