Re: PROBLEM: [2.4.6] kernel BUG at softirq.c:206!

From: Andrew Morton (andrewm@uow.edu.au)
Date: Thu Jul 05 2001 - 11:11:23 EST


Alan Cox wrote:
>
> > My money is on the unconditional sti()'s in the cyrix code.
>
> Possibly but the diff is wrong

But it'll still work :)

--- linux-2.4.6/init/main.c Wed Jul 4 18:21:32 2001
+++ lk-ext3/init/main.c Fri Jul 6 02:06:12 2001
@@ -523,8 +523,8 @@ asmlinkage void __init start_kernel(void
         trap_init();
         init_IRQ();
         sched_init();
- time_init();
         softirq_init();
+ time_init();
 
         /*
          * HACK ALERT! This is early. We're enabling the console before
--- linux-2.4.6/arch/i386/kernel/setup.c Mon May 28 13:31:46 2001
+++ lk-ext3/arch/i386/kernel/setup.c Fri Jul 6 01:59:37 2001
@@ -1243,11 +1255,13 @@ static int __init init_amd(struct cpuinf
 /*
  * Read Cyrix DEVID registers (DIR) to get more detailed info. about the CPU
  */
-static inline void do_cyrix_devid(unsigned char *dir0, unsigned char *dir1)
+static void do_cyrix_devid(unsigned char *dir0, unsigned char *dir1)
 {
         unsigned char ccr2, ccr3;
+ unsigned long flags;
 
         /* we test for DEVID by checking whether CCR3 is writable */
+ save_flags(flags);
         cli();
         ccr3 = getCx86(CX86_CCR3);
         setCx86(CX86_CCR3, ccr3 ^ 0x80);
@@ -1272,7 +1286,7 @@ static inline void do_cyrix_devid(unsign
                 *dir0 = getCx86(CX86_DIR0);
                 *dir1 = getCx86(CX86_DIR1);
         }
- sti();
+ restore_flags(flags);
 }
 
 /*
@@ -1316,7 +1330,9 @@ static void __init check_cx686_slop(stru
 {
         if (Cx86_dir0_msb == 3) {
                 unsigned char ccr3, ccr5;
+ unsigned long flags;
 
+ save_flags(flags);
                 cli();
                 ccr3 = getCx86(CX86_CCR3);
                 setCx86(CX86_CCR3, (ccr3 & 0x0f) | 0x10); /* enable MAPEN */
@@ -1324,7 +1340,7 @@ static void __init check_cx686_slop(stru
                 if (ccr5 & 2)
                         setCx86(CX86_CCR5, ccr5 & 0xfd); /* reset SLOP */
                 setCx86(CX86_CCR3, ccr3); /* disable MAPEN */
- sti();
+ restore_flags(flags);
 
                 if (ccr5 & 2) { /* possible wrong calibration done */
                         printk(KERN_INFO "Recalibrating delay loop with SLOP bit reset\n");
@@ -2092,15 +2108,17 @@ static int __init id_and_try_enable_cpui
                    if (dir0 == 5 || dir0 == 3)
                    {
                         unsigned char ccr3, ccr4;
+ unsigned long flags;
 
                         printk(KERN_INFO "Enabling CPUID on Cyrix processor.\n");
+ save_flags(flags);
                         cli();
                         ccr3 = getCx86(CX86_CCR3);
                         setCx86(CX86_CCR3, (ccr3 & 0x0f) | 0x10); /* enable MAPEN */
                         ccr4 = getCx86(CX86_CCR4);
                         setCx86(CX86_CCR4, ccr4 | 0x80); /* enable cpuid */
                         setCx86(CX86_CCR3, ccr3); /* disable MAPEN */
- sti();
+ restore_flags(flags);
                 }
         } else
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sat Jul 07 2001 - 21:00:16 EST