--- ./arch/i386/kernel/entry.S.4gbrest 2004-11-10 11:21:32.000000000 +0300 +++ ./arch/i386/kernel/entry.S 2004-11-10 12:35:24.239613040 +0300 @@ -167,7 +167,7 @@ int80_ret_start_marker: \ movl %edx, %esp; \ movl %ecx, %cr3; \ \ - __RESTORE_ALL; \ + __RESTORE_ALL_USER; \ int80_ret_end_marker: \ 2: @@ -204,14 +204,19 @@ int80_ret_end_marker: \ #define __RESTORE_REGS \ __RESTORE_INT_REGS; \ + popl %ds; \ + popl %es; + +#define __RESTORE_REGS_USER \ + __RESTORE_INT_REGS; \ 111: popl %ds; \ 222: popl %es; \ -.section .fixup,"ax"; \ + jmp 666f; \ 444: movl $0,(%esp); \ jmp 111b; \ 555: movl $0,(%esp); \ jmp 222b; \ -.previous; \ +666: \ .section __ex_table,"a";\ .align 4; \ .long 111b,444b;\ @@ -220,6 +225,13 @@ int80_ret_end_marker: \ #define __RESTORE_ALL \ __RESTORE_REGS \ + __RESTORE_IRET + +#define __RESTORE_ALL_USER \ + __RESTORE_REGS_USER \ + __RESTORE_IRET + +#define __RESTORE_IRET \ addl $4, %esp; \ 333: iret; \ .section .fixup,"ax"; \