summaryrefslogtreecommitdiffstats
path: root/arch/i386
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1997-06-17 13:20:30 +0000
committerRalf Baechle <ralf@linux-mips.org>1997-06-17 13:20:30 +0000
commit7acb77a6e7bddd4c4c5aa975bbf976927c013798 (patch)
tree4139829ec6edb85f73774bb95cdec376758bfc73 /arch/i386
parent64d58d4c8cd6a89ee218301ec0dc0ebfec91a4db (diff)
Merge with 2.1.43.
Diffstat (limited to 'arch/i386')
-rw-r--r--arch/i386/config.in2
-rw-r--r--arch/i386/defconfig5
-rw-r--r--arch/i386/kernel/head.S4
-rw-r--r--arch/i386/kernel/irq.c19
-rw-r--r--arch/i386/kernel/irq.h14
-rw-r--r--arch/i386/kernel/smp.c14
-rw-r--r--arch/i386/kernel/time.c2
-rw-r--r--arch/i386/kernel/traps.c2
8 files changed, 23 insertions, 39 deletions
diff --git a/arch/i386/config.in b/arch/i386/config.in
index f95590407..1612b614f 100644
--- a/arch/i386/config.in
+++ b/arch/i386/config.in
@@ -34,6 +34,7 @@ bool 'System V IPC' CONFIG_SYSVIPC
bool 'Sysctl support' CONFIG_SYSCTL
tristate 'Kernel support for a.out binaries' CONFIG_BINFMT_AOUT
tristate 'Kernel support for ELF binaries' CONFIG_BINFMT_ELF
+tristate 'Kernel support for MISC binaries' CONFIG_BINFMT_MISC
if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
tristate 'Kernel support for JAVA binaries' CONFIG_BINFMT_JAVA
fi
@@ -117,4 +118,5 @@ bool 'Kernel profiling support' CONFIG_PROFILE
if [ "$CONFIG_PROFILE" = "y" ]; then
int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
fi
+bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ
endmenu
diff --git a/arch/i386/defconfig b/arch/i386/defconfig
index a27b6ebce..ab30a25c8 100644
--- a/arch/i386/defconfig
+++ b/arch/i386/defconfig
@@ -25,6 +25,7 @@ CONFIG_SYSVIPC=y
CONFIG_SYSCTL=y
CONFIG_BINFMT_AOUT=y
CONFIG_BINFMT_ELF=y
+CONFIG_BINFMT_MISC=y
# CONFIG_M386 is not set
# CONFIG_M486 is not set
# CONFIG_M586 is not set
@@ -190,6 +191,9 @@ CONFIG_EEXPRESS_PRO100=y
# Filesystems
#
# CONFIG_QUOTA is not set
+# CONFIG_DCACHE_PRELOAD is not set
+# CONFIG_OMIRR is not set
+# CONFIG_TRANS_NAMES is not set
CONFIG_MINIX_FS=y
CONFIG_EXT2_FS=y
CONFIG_FAT_FS=y
@@ -241,3 +245,4 @@ CONFIG_82C710_MOUSE=y
# Kernel hacking
#
# CONFIG_PROFILE is not set
+# CONFIG_MAGIC_SYSRQ is not set
diff --git a/arch/i386/kernel/head.S b/arch/i386/kernel/head.S
index a42b87b1b..bd4bf56cf 100644
--- a/arch/i386/kernel/head.S
+++ b/arch/i386/kernel/head.S
@@ -532,8 +532,8 @@ ENTRY(gdt)
.quad 0x0000000000000000 /* not used */
.quad 0x00cf9a000000ffff /* 0x10 kernel 4GB code at 0x00000000 */
.quad 0x00cf92000000ffff /* 0x18 kernel 4GB data at 0x00000000 */
- .quad 0x00cbfa000000ffff /* 0x23 user 3GB code at 0x00000000 */
- .quad 0x00cbf2000000ffff /* 0x2b user 3GB data at 0x00000000 */
+ .quad 0x00cffa000000ffff /* 0x23 user 4GB code at 0x00000000 */
+ .quad 0x00cff2000000ffff /* 0x2b user 4GB data at 0x00000000 */
.quad 0x0000000000000000 /* not used */
.quad 0x0000000000000000 /* not used */
.fill 2*NR_TASKS,8,0 /* space for LDT's and TSS's etc */
diff --git a/arch/i386/kernel/irq.c b/arch/i386/kernel/irq.c
index e5fb5acb1..eedb1d0fe 100644
--- a/arch/i386/kernel/irq.c
+++ b/arch/i386/kernel/irq.c
@@ -142,21 +142,6 @@ void enable_irq(unsigned int irq_nr)
* the operations that are needed to keep the AT interrupt-controller
* happy. They are also written to be fast - and to disable interrupts
* as little as humanly possible.
- *
- * NOTE! These macros expand to three different handlers for each line: one
- * complete handler that does all the fancy stuff (including signal handling),
- * and one fast handler that is meant for simple IRQ's that want to be
- * atomic. The specific handler is chosen depending on the SA_INTERRUPT
- * flag when installing a handler. Finally, one "bad interrupt" handler, that
- * is used when no handler is present.
- *
- * The timer interrupt is handled specially to insure that the jiffies
- * variable is updated at all times. Specifically, the timer interrupt is
- * just like the complete handlers except that it is invoked with interrupts
- * disabled and should never re-enable them. If other interrupts were
- * allowed to be processed while the timer interrupt is active, then the
- * other interrupts would have to avoid using the jiffies variable for delay
- * and interval timing operations to avoid hanging the system.
*/
#if NR_IRQS != 16
@@ -539,6 +524,9 @@ asmlinkage void do_IRQ(struct pt_regs regs)
status = 0;
action = *(irq + irq_action);
if (action) {
+ if (!(action->flags & SA_INTERRUPT))
+ __sti();
+
do {
status |= action->flags;
action->handler(irq, action->dev_id, &regs);
@@ -546,7 +534,6 @@ asmlinkage void do_IRQ(struct pt_regs regs)
} while (action);
if (status & SA_SAMPLE_RANDOM)
add_interrupt_randomness(irq);
-
__cli();
spin_lock(&irq_controller_lock);
unmask_irq(irq);
diff --git a/arch/i386/kernel/irq.h b/arch/i386/kernel/irq.h
index 1f9e89399..7d70264ba 100644
--- a/arch/i386/kernel/irq.h
+++ b/arch/i386/kernel/irq.h
@@ -9,24 +9,10 @@
#ifdef __SMP__
-#undef INIT_STUCK
-#define INIT_STUCK 200000000
-
-#undef STUCK
-#define STUCK \
-if (!--stuck) {printk("irq_enter stuck (irq=%d, cpu=%d, global=%d)\n",irq,cpu,global_irq_holder); stuck = INIT_STUCK;}
-
static inline void irq_enter(int cpu, int irq)
{
- int stuck = INIT_STUCK;
-
hardirq_enter(cpu);
while (test_bit(0,&global_irq_lock)) {
- if ((unsigned char) cpu == global_irq_holder) {
- printk("BAD! Local interrupts enabled, global disabled\n");
- break;
- }
- STUCK;
/* nothing */;
}
}
diff --git a/arch/i386/kernel/smp.c b/arch/i386/kernel/smp.c
index 1dc615501..5a020b723 100644
--- a/arch/i386/kernel/smp.c
+++ b/arch/i386/kernel/smp.c
@@ -870,6 +870,8 @@ __initfunc(static void do_boot_cpu(int i))
*((volatile unsigned long *)phys_to_virt(8192)) = 0;
}
+unsigned int prof_multiplier[NR_CPUS];
+unsigned int prof_counter[NR_CPUS];
/*
* Cycle through the processors sending APIC IPI's to boot each.
@@ -912,8 +914,15 @@ __initfunc(void smp_boot_cpus(void))
* of here now!
*/
- if (!smp_found_config)
+ if (!smp_found_config) {
+ /*
+ * For SMP-simulation on one CPU to work, we must initialize these
+ * values for the single CPU here:
+ */
+ prof_counter[0] = prof_multiplier[0] = 1;
+
return;
+ }
/*
* Map the local APIC into kernel space
@@ -1302,9 +1311,6 @@ void smp_flush_tlb(void)
* value into /proc/profile.
*/
-unsigned int prof_multiplier[NR_CPUS];
-unsigned int prof_counter[NR_CPUS];
-
void smp_local_timer_interrupt(struct pt_regs * regs)
{
int cpu = smp_processor_id();
diff --git a/arch/i386/kernel/time.c b/arch/i386/kernel/time.c
index e45cc7279..a08c9c49c 100644
--- a/arch/i386/kernel/time.c
+++ b/arch/i386/kernel/time.c
@@ -515,7 +515,7 @@ unsigned long get_cmos_time(void)
return mktime(year, mon, day, hour, min, sec);
}
-static struct irqaction irq0 = { timer_interrupt, 0, 0, "timer", NULL, NULL};
+static struct irqaction irq0 = { timer_interrupt, SA_INTERRUPT, 0, "timer", NULL, NULL};
__initfunc(void time_init(void))
diff --git a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c
index 696e37004..b397fc76d 100644
--- a/arch/i386/kernel/traps.c
+++ b/arch/i386/kernel/traps.c
@@ -191,8 +191,6 @@ spinlock_t die_lock;
spin_lock_irq(&die_lock);
printk("%s: %04lx\n", str, err & 0xffff);
show_registers(regs);
-do { int i=2000000000; while (i) i--; } while (0);
-do { int i=2000000000; while (i) i--; } while (0);
spin_unlock_irq(&die_lock);
do_exit(SIGSEGV);
}