*/
#define switch_to(prev, next, last) \
do { \
- unsigned long esi, edi; \
+ /* \
+ * Context-switching clobbers all registers, so we clobber \
+ * them explicitly, via unused output variables. \
+ * (EAX and EBP is not listed because EBP is saved/restored \
+ * explicitly for wchan access and EAX is the return value of \
+ * __switch_to()) \
+ */ \
+ unsigned long ebx, ecx, edx, esi, edi; \
\
asm volatile( \
"pushfl \n\t" /* save flags */ \
"=a" (last), \
\
/* clobbered output registers: */ \
+ "=b" (ebx), "=c" (ecx), "=d" (edx), \
"=S" (esi), "=D" (edi) \
\
/* input parameters: */ \