Skip to contentSkip to conversation

do_general_protection doesn't disable irq

cleanup Andrea Arcangeli 3 participants 4 messages Jul 30, 2004

lore
Share & tools
lore
#0 lore raw

A trap gate shouldn't affect the irq status at all.

This should be a valid cleanup that removes a slightly confusing noop:

Index: linux-2.5/arch/i386/kernel/traps.c
===================================================================
RCS file: /home/andrea/crypto/cvs/linux-2.5/arch/i386/kernel/traps.c,v retrieving revision 1.77

arch/i386/kernel/traps.c +0 -3
diff -u -p -r1.77 traps.c
@@ -431,9 +431,6 @@ DO_ERROR_INFO(17, SIGBUS, "alignment che
 
 asmlinkage void do_general_protection(struct pt_regs * regs, long error_code)
 {
-	if (regs->eflags & X86_EFLAGS_IF)
-		local_irq_enable();
- 
 	if (regs->eflags & VM_MASK)
 		goto gp_in_vm86;
 

Thanks to Karsten for noticing a trap gate doesn't actually enable irq by default either (offtopic issue with the above patch, but while reading the 2.6 code I found the above bit which just confused me more since it's a noop, either that or you meant to use set_intr_gate, not set_trap_gate on the do_general_protection handler, but it seems not needed to use a trap gate since a trap gate shouldn't enable irqs by default). Please correct me if wrong.

thanks.

#1 lore raw
Quoted 22 lines · Andrea Arcangeli

A trap gate shouldn't affect the irq status at all.

This should be a valid cleanup that removes a slightly confusing noop:

Index: linux-2.5/arch/i386/kernel/traps.c
===================================================================
RCS file: /home/andrea/crypto/cvs/linux-2.5/arch/i386/kernel/traps.c,v retrieving revision 1.77
diff -u -p -r1.77 traps.c

arch/i386/kernel/traps.c +0 -3
@@ -431,9 +431,6 @@ DO_ERROR_INFO(17, SIGBUS, "alignment che
 
 asmlinkage void do_general_protection(struct pt_regs * regs, long error_code)
 {
-	if (regs->eflags & X86_EFLAGS_IF)
-		local_irq_enable();
- 
 	if (regs->eflags & VM_MASK)
 		goto gp_in_vm86;
 
Quoted 7 lines

Thanks to Karsten for noticing a trap gate doesn't actually enable irq by default either (offtopic issue with the above patch, but while reading the 2.6 code I found the above bit which just confused me more since it's a noop, either that or you meant to use set_intr_gate, not set_trap_gate on the do_general_protection handler, but it seems not needed to use a trap gate since a trap gate shouldn't enable irqs by default). Please correct me if wrong.

This is there for vm86 mode. See http://tinyurl.com/3m5nr

--
Brian Gerst

#2 lore raw
Quoted 25 lines · Brian Gerst
Quoted 24 lines · Andrea Arcangeli

A trap gate shouldn't affect the irq status at all.

This should be a valid cleanup that removes a slightly confusing noop:

Index: linux-2.5/arch/i386/kernel/traps.c
===================================================================
RCS file: /home/andrea/crypto/cvs/linux-2.5/arch/i386/kernel/traps.c,v retrieving revision 1.77
diff -u -p -r1.77 traps.c
--- linux-2.5/arch/i386/kernel/traps.c 13 Jul 2004 18:02:33 -0000
1.77
+++ linux-2.5/arch/i386/kernel/traps.c 30 Jul 2004 02:44:23 -0000

(quoted diff) +0 -0
@@ -431,9 +431,6 @@ DO_ERROR_INFO(17, SIGBUS, "alignment che
 

asmlinkage void do_general_protection(struct pt_regs * regs, long error_code)
{

arch/i386/kernel/traps.c +0 -3
-	if (regs->eflags & X86_EFLAGS_IF)
-		local_irq_enable();
- 
	if (regs->eflags & VM_MASK)
		goto gp_in_vm86;
Quoted 9 lines
Quoted 7 lines

Thanks to Karsten for noticing a trap gate doesn't actually enable irq by default either (offtopic issue with the above patch, but while reading the 2.6 code I found the above bit which just confused me more since it's a noop, either that or you meant to use set_intr_gate, not set_trap_gate on the do_general_protection handler, but it seems not needed to use a trap gate since a trap gate shouldn't enable irqs by default). Please correct me if wrong.

This is there for vm86 mode. See http://tinyurl.com/3m5nr

and the one for vm86 mode is still there, this was the only needed bit from the tinyurl you quoted:

gp_in_vm86:
+ local_irq_enable();

the regs->eflags & X86_EFLAGS_IF I removed is still a noop and in turn it cannot help vm86 as far as I can tell.

#3 lore raw
In reply to Brian Gerst
Quoted 25 lines · Brian Gerst
Quoted 24 lines · Andrea Arcangeli

A trap gate shouldn't affect the irq status at all.

This should be a valid cleanup that removes a slightly confusing noop:

Index: linux-2.5/arch/i386/kernel/traps.c
===================================================================
RCS file: /home/andrea/crypto/cvs/linux-2.5/arch/i386/kernel/traps.c,v retrieving revision 1.77
diff -u -p -r1.77 traps.c
--- linux-2.5/arch/i386/kernel/traps.c 13 Jul 2004 18:02:33 -0000
1.77
+++ linux-2.5/arch/i386/kernel/traps.c 30 Jul 2004 02:44:23 -0000

(quoted diff) +0 -0
@@ -431,9 +431,6 @@ DO_ERROR_INFO(17, SIGBUS, "alignment che
 

asmlinkage void do_general_protection(struct pt_regs * regs, long error_code)
{

arch/i386/kernel/traps.c +0 -3
-	if (regs->eflags & X86_EFLAGS_IF)
-		local_irq_enable();
- 
	if (regs->eflags & VM_MASK)
		goto gp_in_vm86;
Quoted 10 lines
Quoted 7 lines

Thanks to Karsten for noticing a trap gate doesn't actually enable irq by default either (offtopic issue with the above patch, but while reading the 2.6 code I found the above bit which just confused me more since it's a noop, either that or you meant to use set_intr_gate, not set_trap_gate on the do_general_protection handler, but it seems not needed to use a trap gate since a trap gate shouldn't enable irqs by default). Please correct me if wrong.

This is there for vm86 mode. See http://tinyurl.com/3m5nr

It makes also no sense, if the GP comes from VM86 mode, what you need there is the second hunk in the patch which does local_irq_enable(); if it was from VM86. Note: the trap gate do not touch X86_EFLAGS_IF bit, so the saved value in regs->eflags is the same as in the CPU EFLAGS register.

Signature · 3 lines
Karsten Keil
SuSE Labs
ISDN development