[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 2/5] xen/wait: Extend the description of how this logic actually works
- To: Xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxxx>
- From: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
- Date: Mon, 18 Jul 2022 08:18:22 +0100
- Authentication-results: esa2.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none
- Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Jan Beulich <JBeulich@xxxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>, Wei Liu <wl@xxxxxxx>
- Delivery-date: Mon, 18 Jul 2022 07:18:57 +0000
- Ironport-data: A9a23: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
- List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
CC: Jan Beulich <JBeulich@xxxxxxxx>
CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
CC: Wei Liu <wl@xxxxxxx>
---
xen/common/wait.c | 29 +++++++++++++++++++++++++----
1 file changed, 25 insertions(+), 4 deletions(-)
diff --git a/xen/common/wait.c b/xen/common/wait.c
index 3ebb884fe738..4dcfa17a8a3f 100644
--- a/xen/common/wait.c
+++ b/xen/common/wait.c
@@ -137,7 +137,19 @@ static void __prepare_to_wait(struct waitqueue_vcpu *wqv)
do_softirq();
}
- /* Hand-rolled setjmp(). */
+ /*
+ * Hand-rolled setjmp().
+ *
+ * __prepare_to_wait() is the leaf of a deep calltree. Preserve the GPRs,
+ * bounds check what we want to stash in wqv->stack, copy the active stack
+ * (up to cpu_info) into wqv->stack, then return normally. Our caller
+ * will shortly schedule() and discard the current context.
+ *
+ * The copy out is performed with a rep movsb. When
+ * check_wakeup_from_wait() longjmp()'s back into us, %rsp is pre-adjusted
+ * to be suitable and %rsi/%rdi are swapped, so the rep movsb instead
+ * copies in from wqv->stack over the active stack.
+ */
asm volatile (
"push %%rax; push %%rbx; push %%rdx; push %%rbp;"
"push %%r8; push %%r9; push %%r10; push %%r11;"
@@ -199,9 +211,18 @@ void check_wakeup_from_wait(void)
}
/*
- * 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.
+ * Hand-rolled longjmp().
+ *
+ * check_wakeup_from_wait() is always called with a shallow stack,
+ * immediately after the vCPU has been rescheduled.
+ *
+ * Adjust %rsp to be the correct depth for the (deeper) stack we want to
+ * restore, then prepare %rsi, %rdi and %rcx such that when we intercept
+ * the rep movs in __prepare_to_wait(), it copies from wqv->stack over the
+ * active stack.
+ *
+ * All other GPRs are available for use; they're either restored from
+ * wqv->stack or explicitly clobbered.
*/
asm volatile (
"mov %1,%%"__OP"sp; jmp .L_wq_resume;"
--
2.11.0
|