Commit dae700f9 authored by Luca Barbieri's avatar Luca Barbieri Committed by Linus Torvalds

[PATCH] Fix sysenter iopl

This patch fixes the handling of IOPL when sysenter is used.

Currently when entering kernel mode, IOPL is not changed and it is not
presserved across context switches: thus, in the kernel, the IOPL value
is random.

This is not a problem when using iret, because it restores eflags, but
the sysexit code currently doesn't, which means that that IOPL becomes
random in user mode too which is of course not good.

This patch fixes the problem by saving eflags across context switches.
parent 1d0619c5
......@@ -12,7 +12,8 @@ struct task_struct; /* one of the stranger aspects of C forward declarations.. *
extern void FASTCALL(__switch_to(struct task_struct *prev, struct task_struct *next));
#define switch_to(prev,next,last) do { \
asm volatile("pushl %%esi\n\t" \
asm volatile("pushfl\n\t" \
"pushl %%esi\n\t" \
"pushl %%edi\n\t" \
"pushl %%ebp\n\t" \
"movl %%esp,%0\n\t" /* save ESP */ \
......@@ -24,6 +25,7 @@ extern void FASTCALL(__switch_to(struct task_struct *prev, struct task_struct *n
"popl %%ebp\n\t" \
"popl %%edi\n\t" \
"popl %%esi\n\t" \
"popfl\n\t" \
:"=m" (prev->thread.esp),"=m" (prev->thread.eip) \
:"m" (next->thread.esp),"m" (next->thread.eip), \
"a" (prev), "d" (next)); \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment