Skip to contentSkip to conversation

: 4/4GB:

PATCH In review Kirill Korotaev 2 participants 2 messages Nov 11, 2004 – Nov 12, 2004

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 : 4/4GB:

This patch fixes exception handling in RESTORE_ALL macro on returing
to user space. Incorrect values in %ds/%es can lead to incorrect behaivour and iret to kernel space address. This patch moves exception handler from .fixup section to .entry.text and makes it
to be between int80_ret_start_marker/int80_ret_end_marker markers.

Kirill

P.S. These 4GB split patches are against modified 2.6.8.1 kernel, but should be appliable to last Fedora kernels

arch/i386/kernel/entry.S renamed from arch/i386/kernel/entry.S.4gbrest +15 -3
@@ -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";   \
#1 lore raw
Quoted 24 lines · Kirill Korotaev

#define __RESTORE_REGS \

arch/i386/kernel/entry.S renamed from arch/i386/kernel/entry.S.4gbrest +7 -2
 	__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	\

arch/i386/kernel/entry.S int80_ret_end_marker: \ · line 237

Quoted 10 lines
arch/i386/kernel/entry.S renamed from arch/i386/kernel/entry.S.4gbrest +7 -0
+	__RESTORE_IRET
+
+#define __RESTORE_ALL_USER \
+	__RESTORE_REGS_USER \
+	__RESTORE_IRET
+
+#define __RESTORE_IRET	\
 	addl $4, %esp;	\
 333:	iret;		\
 .section .fixup,"ax";   \

looks fine and necessary. Fundamental bugs in this area tend to show up as instant reboots, so i'm sure if you broke this code you'll quickly notice it ...

Ingo