|
@@ -288,11 +288,15 @@ return_from_SYSCALL_64:
|
|
|
jne opportunistic_sysret_failed
|
|
|
|
|
|
/*
|
|
|
- * SYSRET can't restore RF. SYSRET can restore TF, but unlike IRET,
|
|
|
- * restoring TF results in a trap from userspace immediately after
|
|
|
- * SYSRET. This would cause an infinite loop whenever #DB happens
|
|
|
- * with register state that satisfies the opportunistic SYSRET
|
|
|
- * conditions. For example, single-stepping this user code:
|
|
|
+ * SYSCALL clears RF when it saves RFLAGS in R11 and SYSRET cannot
|
|
|
+ * restore RF properly. If the slowpath sets it for whatever reason, we
|
|
|
+ * need to restore it correctly.
|
|
|
+ *
|
|
|
+ * SYSRET can restore TF, but unlike IRET, restoring TF results in a
|
|
|
+ * trap from userspace immediately after SYSRET. This would cause an
|
|
|
+ * infinite loop whenever #DB happens with register state that satisfies
|
|
|
+ * the opportunistic SYSRET conditions. For example, single-stepping
|
|
|
+ * this user code:
|
|
|
*
|
|
|
* movq $stuck_here, %rcx
|
|
|
* pushfq
|