summaryrefslogtreecommitdiffstats
path: root/arch/i386
diff options
context:
space:
mode:
Diffstat (limited to 'arch/i386')
-rw-r--r--arch/i386/boot/compressed/misc.c1
-rw-r--r--arch/i386/defconfig7
-rw-r--r--arch/i386/kernel/apm.c2
-rw-r--r--arch/i386/kernel/dmi_scan.c50
-rw-r--r--arch/i386/kernel/head.S2
-rw-r--r--arch/i386/kernel/i386_ksyms.c1
-rw-r--r--arch/i386/kernel/i387.c4
-rw-r--r--arch/i386/kernel/i8259.c2
-rw-r--r--arch/i386/kernel/io_apic.c11
-rw-r--r--arch/i386/kernel/irq.c3
-rw-r--r--arch/i386/kernel/microcode.c2
-rw-r--r--arch/i386/kernel/mtrr.c2
-rw-r--r--arch/i386/kernel/pci-irq.c2
-rw-r--r--arch/i386/kernel/pci-pc.c63
-rw-r--r--arch/i386/kernel/process.c2
-rw-r--r--arch/i386/kernel/setup.c45
-rw-r--r--arch/i386/kernel/signal.c1
-rw-r--r--arch/i386/kernel/smp.c2
-rw-r--r--arch/i386/kernel/smpboot.c3
-rw-r--r--arch/i386/kernel/traps.c5
-rw-r--r--arch/i386/kernel/visws_apic.c2
-rw-r--r--arch/i386/mm/extable.c19
-rw-r--r--arch/i386/mm/fault.c2
23 files changed, 159 insertions, 74 deletions
diff --git a/arch/i386/boot/compressed/misc.c b/arch/i386/boot/compressed/misc.c
index abb382d8f..0baa87ea9 100644
--- a/arch/i386/boot/compressed/misc.c
+++ b/arch/i386/boot/compressed/misc.c
@@ -10,6 +10,7 @@
*/
#include <linux/vmalloc.h>
+#include <linux/tty.h>
#include <asm/io.h>
/*
* gzip declarations
diff --git a/arch/i386/defconfig b/arch/i386/defconfig
index 05a2e3725..875a84bf9 100644
--- a/arch/i386/defconfig
+++ b/arch/i386/defconfig
@@ -162,6 +162,11 @@ CONFIG_IP_MULTICAST=y
# CONFIG_BRIDGE is not set
#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
# Telephony Support
#
# CONFIG_PHONE is not set
@@ -628,6 +633,8 @@ CONFIG_SOUND=y
CONFIG_SOUND_ES1371=y
# CONFIG_SOUND_ESSSOLO1 is not set
# CONFIG_SOUND_MAESTRO is not set
+# CONFIG_SOUND_MAESTRO3 is not set
+# CONFIG_SOUND_ICH is not set
# CONFIG_SOUND_SONICVIBES is not set
# CONFIG_SOUND_TRIDENT is not set
# CONFIG_SOUND_MSNDCLAS is not set
diff --git a/arch/i386/kernel/apm.c b/arch/i386/kernel/apm.c
index 9703e3304..4e1ee2f83 100644
--- a/arch/i386/kernel/apm.c
+++ b/arch/i386/kernel/apm.c
@@ -176,7 +176,7 @@
#include <linux/stddef.h>
#include <linux/timer.h>
#include <linux/fcntl.h>
-#include <linux/malloc.h>
+#include <linux/slab.h>
#include <linux/stat.h>
#include <linux/proc_fs.h>
#include <linux/miscdevice.h>
diff --git a/arch/i386/kernel/dmi_scan.c b/arch/i386/kernel/dmi_scan.c
index 8d5a9efb3..4029a8d14 100644
--- a/arch/i386/kernel/dmi_scan.c
+++ b/arch/i386/kernel/dmi_scan.c
@@ -12,6 +12,8 @@ struct dmi_header
u16 handle;
};
+#define dmi_printk(x)
+
static char * __init dmi_string(struct dmi_header *dm, u8 s)
{
u8 *bp=(u8 *)dm;
@@ -73,13 +75,13 @@ int __init dmi_iterate(void (*decode)(struct dmi_header *))
u16 len=buf[7]<<8|buf[6];
u32 base=buf[11]<<24|buf[10]<<16|buf[9]<<8|buf[8];
- printk(KERN_INFO "DMI %d.%d present.\n",
- buf[14]>>4, buf[14]&0x0F);
- printk(KERN_INFO "%d structures occupying %d bytes.\n",
+ dmi_printk((KERN_INFO "DMI %d.%d present.\n",
+ buf[14]>>4, buf[14]&0x0F));
+ dmi_printk((KERN_INFO "%d structures occupying %d bytes.\n",
buf[13]<<8|buf[12],
- buf[7]<<8|buf[6]);
- printk(KERN_INFO "DMI table at 0x%08X.\n",
- buf[11]<<24|buf[10]<<16|buf[9]<<8|buf[8]);
+ buf[7]<<8|buf[6]));
+ dmi_printk((KERN_INFO "DMI table at 0x%08X.\n",
+ buf[11]<<24|buf[10]<<16|buf[9]<<8|buf[8]));
if(dmi_table(base,len, num, decode)==0)
return 0;
}
@@ -106,11 +108,11 @@ static void __init dmi_decode(struct dmi_header *dm)
if(*p && *p!=' ')
{
- printk("BIOS Vendor: %s\n", p);
- printk("BIOS Version: %s\n",
- dmi_string(dm, data[5]));
- printk("BIOS Release: %s\n",
- dmi_string(dm, data[8]));
+ dmi_printk(("BIOS Vendor: %s\n", p));
+ dmi_printk(("BIOS Version: %s\n",
+ dmi_string(dm, data[5])));
+ dmi_printk(("BIOS Release: %s\n",
+ dmi_string(dm, data[8])));
}
/*
@@ -144,13 +146,13 @@ static void __init dmi_decode(struct dmi_header *dm)
if(*p && *p!=' ')
{
- printk("System Vendor: %s.\n",p);
- printk("Product Name: %s.\n",
- dmi_string(dm, data[5]));
- printk("Version %s.\n",
- dmi_string(dm, data[6]));
- printk("Serial Number %s.\n",
- dmi_string(dm, data[7]));
+ dmi_printk(("System Vendor: %s.\n",p));
+ dmi_printk(("Product Name: %s.\n",
+ dmi_string(dm, data[5])));
+ dmi_printk(("Version %s.\n",
+ dmi_string(dm, data[6])));
+ dmi_printk(("Serial Number %s.\n",
+ dmi_string(dm, data[7])));
}
break;
case 2:
@@ -158,17 +160,17 @@ static void __init dmi_decode(struct dmi_header *dm)
if(*p && *p!=' ')
{
- printk("Board Vendor: %s.\n",p);
- printk("Board Name: %s.\n",
- dmi_string(dm, data[5]));
- printk("Board Version: %s.\n",
- dmi_string(dm, data[6]));
+ dmi_printk(("Board Vendor: %s.\n",p));
+ dmi_printk(("Board Name: %s.\n",
+ dmi_string(dm, data[5])));
+ dmi_printk(("Board Version: %s.\n",
+ dmi_string(dm, data[6])));
}
break;
case 3:
p=dmi_string(dm,data[8]);
if(*p && *p!=' ')
- printk("Asset Tag: %s.\n", p);
+ dmi_printk(("Asset Tag: %s.\n", p));
break;
}
}
diff --git a/arch/i386/kernel/head.S b/arch/i386/kernel/head.S
index c74b80135..400216f37 100644
--- a/arch/i386/kernel/head.S
+++ b/arch/i386/kernel/head.S
@@ -34,7 +34,7 @@
#define X86_HARD_MATH CPU_PARAMS+6
#define X86_CPUID CPU_PARAMS+8
#define X86_CAPABILITY CPU_PARAMS+12
-#define X86_VENDOR_ID CPU_PARAMS+16
+#define X86_VENDOR_ID CPU_PARAMS+28
/*
* swapper_pg_dir is the main page directory, address 0x00101000
diff --git a/arch/i386/kernel/i386_ksyms.c b/arch/i386/kernel/i386_ksyms.c
index 071b3991a..20bc14fc6 100644
--- a/arch/i386/kernel/i386_ksyms.c
+++ b/arch/i386/kernel/i386_ksyms.c
@@ -13,6 +13,7 @@
#include <linux/apm_bios.h>
#include <linux/kernel.h>
#include <linux/string.h>
+#include <linux/tty.h>
#include <asm/semaphore.h>
#include <asm/processor.h>
diff --git a/arch/i386/kernel/i387.c b/arch/i386/kernel/i387.c
index a3a526b4b..ba97ca4bc 100644
--- a/arch/i386/kernel/i387.c
+++ b/arch/i386/kernel/i387.c
@@ -216,7 +216,7 @@ void set_fpu_twd( struct task_struct *tsk, unsigned short twd )
void set_fpu_mxcsr( struct task_struct *tsk, unsigned short mxcsr )
{
if ( cpu_has_xmm ) {
- tsk->thread.i387.fxsave.mxcsr = mxcsr;
+ tsk->thread.i387.fxsave.mxcsr = (mxcsr & 0xffbf);
}
}
@@ -354,6 +354,8 @@ static inline int restore_i387_fxsave( struct _fpstate *buf )
if ( __copy_from_user( &tsk->thread.i387.fxsave, &buf->_fxsr_env[0],
sizeof(struct i387_fxsave_struct) ) )
return 1;
+ /* mxcsr bit 6 and 31-16 must be zero for security reasons */
+ tsk->thread.i387.fxsave.mxcsr &= 0xffbf;
return convert_fxsr_from_user( &tsk->thread.i387.fxsave, buf );
}
diff --git a/arch/i386/kernel/i8259.c b/arch/i386/kernel/i8259.c
index 570614282..ce8bc8737 100644
--- a/arch/i386/kernel/i8259.c
+++ b/arch/i386/kernel/i8259.c
@@ -6,7 +6,7 @@
#include <linux/ioport.h>
#include <linux/interrupt.h>
#include <linux/timex.h>
-#include <linux/malloc.h>
+#include <linux/slab.h>
#include <linux/random.h>
#include <linux/smp_lock.h>
#include <linux/init.h>
diff --git a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c
index b17f499b4..e7fe3957b 100644
--- a/arch/i386/kernel/io_apic.c
+++ b/arch/i386/kernel/io_apic.c
@@ -1509,15 +1509,16 @@ static inline void check_timer(void)
* - IRQ2 is the cascade IRQ, and cannot be a io-apic IRQ.
* Linux doesn't really care, as it's not actually used
* for any interrupt handling anyway.
- * - IRQ13 is the FPU error IRQ, and may be connected
- * directly from the FPU to the old PIC. Linux doesn't
- * really care, because Linux doesn't want to use IRQ13
- * anyway (exception 16 is the proper FPU error signal)
+ * - There used to be IRQ13 here as well, but all
+ * MPS-compliant must not use it for FPU coupling and we
+ * want to use exception 16 anyway. And there are
+ * systems who connect it to an I/O APIC for other uses.
+ * Thus we don't mark it special any longer.
*
* Additionally, something is definitely wrong with irq9
* on PIIX4 boards.
*/
-#define PIC_IRQS ((1<<2)|(1<<13))
+#define PIC_IRQS (1<<2)
void __init setup_IO_APIC(void)
{
diff --git a/arch/i386/kernel/irq.c b/arch/i386/kernel/irq.c
index cf6878787..2c935207a 100644
--- a/arch/i386/kernel/irq.c
+++ b/arch/i386/kernel/irq.c
@@ -25,7 +25,7 @@
#include <linux/ioport.h>
#include <linux/interrupt.h>
#include <linux/timex.h>
-#include <linux/malloc.h>
+#include <linux/slab.h>
#include <linux/random.h>
#include <linux/smp_lock.h>
#include <linux/init.h>
@@ -312,6 +312,7 @@ static inline void get_irqlock(int cpu)
/* Uhhuh.. Somebody else got it. Wait.. */
do {
do {
+ rep_nop();
} while (test_bit(0,&global_irq_lock));
} while (test_and_set_bit(0,&global_irq_lock));
}
diff --git a/arch/i386/kernel/microcode.c b/arch/i386/kernel/microcode.c
index f0a88c20e..0bc04116d 100644
--- a/arch/i386/kernel/microcode.c
+++ b/arch/i386/kernel/microcode.c
@@ -52,7 +52,7 @@
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/module.h>
-#include <linux/malloc.h>
+#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <linux/miscdevice.h>
#include <linux/devfs_fs_kernel.h>
diff --git a/arch/i386/kernel/mtrr.c b/arch/i386/kernel/mtrr.c
index 60764e3cd..7d85ce240 100644
--- a/arch/i386/kernel/mtrr.c
+++ b/arch/i386/kernel/mtrr.c
@@ -241,7 +241,7 @@
#include <linux/kernel.h>
#include <linux/wait.h>
#include <linux/string.h>
-#include <linux/malloc.h>
+#include <linux/slab.h>
#include <linux/ioport.h>
#include <linux/delay.h>
#include <linux/fs.h>
diff --git a/arch/i386/kernel/pci-irq.c b/arch/i386/kernel/pci-irq.c
index 8281e3f82..bc1dd9c7e 100644
--- a/arch/i386/kernel/pci-irq.c
+++ b/arch/i386/kernel/pci-irq.c
@@ -9,7 +9,7 @@
#include <linux/kernel.h>
#include <linux/pci.h>
#include <linux/init.h>
-#include <linux/malloc.h>
+#include <linux/slab.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
diff --git a/arch/i386/kernel/pci-pc.c b/arch/i386/kernel/pci-pc.c
index 258e63627..d2a8afbbb 100644
--- a/arch/i386/kernel/pci-pc.c
+++ b/arch/i386/kernel/pci-pc.c
@@ -843,30 +843,40 @@ static void __init pci_fixup_i450gx(struct pci_dev *d)
pcibios_last_bus = -1;
}
+/*
+ * ServerWorks host bridges -- Find and scan all secondary buses.
+ * Register 0x44 contains first, 0x45 last bus number routed there.
+ */
static void __init pci_fixup_serverworks(struct pci_dev *d)
{
- /*
- * ServerWorks host bridges -- Find and scan all secondary buses.
- * Register 0x44 contains first, 0x45 last bus number routed there.
- */
- u8 busno;
- pci_read_config_byte(d, 0x44, &busno);
- printk("PCI: ServerWorks host bridge: secondary bus %02x\n", busno);
- pci_scan_bus(busno, pci_root_ops, NULL);
- pcibios_last_bus = -1;
+ u8 busno1, busno2;
+
+ pci_read_config_byte(d, 0x44, &busno1);
+ pci_read_config_byte(d, 0x45, &busno2);
+ if (busno2 < busno1)
+ busno2 = busno1;
+ if (busno2 > pcibios_last_bus) {
+ pcibios_last_bus = busno2;
+ printk("PCI: ServerWorks host bridge: last bus %02x\n", pcibios_last_bus);
+ }
}
+/*
+ * Compaq host bridges -- Find and scan all secondary buses.
+ * This time registers 0xc8 and 0xc9.
+ */
static void __init pci_fixup_compaq(struct pci_dev *d)
{
- /*
- * Compaq host bridges -- Find and scan all secondary buses.
- * This time registers 0xc8 and 0xc9.
- */
- u8 busno;
- pci_read_config_byte(d, 0xc8, &busno);
- printk("PCI: Compaq host bridge: secondary bus %02x\n", busno);
- pci_scan_bus(busno, pci_root_ops, NULL);
- pcibios_last_bus = -1;
+ u8 busno1, busno2;
+
+ pci_read_config_byte(d, 0xc8, &busno1);
+ pci_read_config_byte(d, 0xc9, &busno2);
+ if (busno2 < busno1)
+ busno2 = busno1;
+ if (busno2 > pcibios_last_bus) {
+ pcibios_last_bus = busno2;
+ printk("PCI: Compaq host bridge: last bus %02x\n", busno2);
+ }
}
static void __init pci_fixup_umc_ide(struct pci_dev *d)
@@ -924,6 +934,22 @@ static void __init pci_fixup_latency(struct pci_dev *d)
pcibios_max_latency = 32;
}
+static void __init pci_fixup_vt8363(struct pci_dev *d)
+{
+ /*
+ * VIA VT8363 host bridge has broken feature 'PCI Master Read
+ * Caching'. It caches more than is good for it, sometimes
+ * serving the bus master with stale data. Some BIOSes enable
+ * it by default, so we disable it.
+ */
+ u8 tmp;
+ pci_read_config_byte(d, 0x70, &tmp);
+ if(tmp & 4) {
+ printk("PCI: Bus master read caching disabled\n");
+ pci_write_config_byte(d, 0x70, tmp & ~4);
+ }
+}
+
struct pci_fixup pcibios_fixups[] = {
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82451NX, pci_fixup_i450nx },
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82454GX, pci_fixup_i450gx },
@@ -936,6 +962,7 @@ struct pci_fixup pcibios_fixups[] = {
{ PCI_FIXUP_HEADER, PCI_ANY_ID, PCI_ANY_ID, pci_fixup_ide_bases },
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_5597, pci_fixup_latency },
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_5598, pci_fixup_latency },
+ { PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8363_0, pci_fixup_vt8363 },
{ 0 }
};
diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c
index 35f11f20f..65f517966 100644
--- a/arch/i386/kernel/process.c
+++ b/arch/i386/kernel/process.c
@@ -23,7 +23,7 @@
#include <linux/stddef.h>
#include <linux/unistd.h>
#include <linux/ptrace.h>
-#include <linux/malloc.h>
+#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <linux/user.h>
#include <linux/a.out.h>
diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c
index 2c3f61f7f..03eeabc2f 100644
--- a/arch/i386/kernel/setup.c
+++ b/arch/i386/kernel/setup.c
@@ -71,7 +71,7 @@
#include <linux/stddef.h>
#include <linux/unistd.h>
#include <linux/ptrace.h>
-#include <linux/malloc.h>
+#include <linux/slab.h>
#include <linux/user.h>
#include <linux/a.out.h>
#include <linux/tty.h>
@@ -1104,6 +1104,9 @@ static inline void do_cyrix_devid(unsigned char *dir0, unsigned char *dir1)
/*
* Cx86_dir0_msb is a HACK needed by check_cx686_cpuid/slop in bugs.h in
* order to identify the Cyrix CPU model after we're out of setup.c
+ *
+ * Actually since bugs.h doesnt even reference this perhaps someone should
+ * fix the documentation ???
*/
unsigned char Cx86_dir0_msb __initdata = 0;
@@ -1129,6 +1132,8 @@ static char cyrix_model_mult2[] __initdata = "12233445";
* Reset the slow-loop (SLOP) bit on the 686(L) which is set by some old
* BIOSes for compatability with DOS games. This makes the udelay loop
* work correctly, and improves performance.
+ *
+ * FIXME: our newer udelay uses the tsc. We dont need to frob with SLOP
*/
extern void calibrate_delay(void) __init;
@@ -1401,6 +1406,7 @@ static void __init init_centaur(struct cpuinfo_x86 *c)
wrmsr (0x1107, lo, hi);
set_bit(X86_FEATURE_CX8, &c->x86_capability);
+ set_bit(X86_FEATURE_3DNOW, &c->x86_capability);
get_model_name(c);
display_cacheinfo(c);
@@ -1565,12 +1571,10 @@ static void __init init_intel(struct cpuinfo_x86 *c)
case 4:
if ( c->x86 > 6 && dl ) {
/* P4 family */
- if ( dl ) {
- /* L3 cache */
- cs = 128 << (dl-1);
- l3 += cs;
- break;
- }
+ /* L3 cache */
+ cs = 128 << (dl-1);
+ l3 += cs;
+ break;
}
/* else same as 8 - fall through */
case 8:
@@ -1870,8 +1874,34 @@ static int __init id_and_try_enable_cpuid(struct cpuinfo_x86 *c)
/* Detect Cyrix with disabled CPUID */
if ( c->x86 == 4 && test_cyrix_52div() ) {
+ unsigned char dir0, dir1;
+
strcpy(c->x86_vendor_id, "CyrixInstead");
c->x86_vendor = X86_VENDOR_CYRIX;
+
+ /* Actually enable cpuid on the older cyrix */
+
+ /* Retrieve CPU revisions */
+
+ do_cyrix_devid(&dir0, &dir1);
+
+ dir0>>=4;
+
+ /* Check it is an affected model */
+
+ if (dir0 == 5 || dir0 == 3)
+ {
+ unsigned char ccr3, ccr4;
+
+ printk(KERN_INFO "Enabling CPUID on Cyrix processor.\n");
+ 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();
+ }
} else
/* Detect NexGen with old hypercode */
@@ -1914,7 +1944,6 @@ void __init identify_cpu(struct cpuinfo_x86 *c)
(int *)&c->x86_vendor_id[4]);
get_cpu_vendor(c);
-
/* Initialize the standard set of capabilities */
/* Note that the vendor-specific code below might override */
diff --git a/arch/i386/kernel/signal.c b/arch/i386/kernel/signal.c
index 7df9c875c..7b096279f 100644
--- a/arch/i386/kernel/signal.c
+++ b/arch/i386/kernel/signal.c
@@ -18,6 +18,7 @@
#include <linux/ptrace.h>
#include <linux/unistd.h>
#include <linux/stddef.h>
+#include <linux/tty.h>
#include <asm/ucontext.h>
#include <asm/uaccess.h>
#include <asm/i387.h>
diff --git a/arch/i386/kernel/smp.c b/arch/i386/kernel/smp.c
index 6607edf8a..6d6463542 100644
--- a/arch/i386/kernel/smp.c
+++ b/arch/i386/kernel/smp.c
@@ -4,7 +4,7 @@
* (c) 1995 Alan Cox, Building #3 <alan@redhat.com>
* (c) 1998-99, 2000 Ingo Molnar <mingo@redhat.com>
*
- * This code is released under the GNU public license version 2 or
+ * This code is released under the GNU General Public License version 2 or
* later.
*/
diff --git a/arch/i386/kernel/smpboot.c b/arch/i386/kernel/smpboot.c
index aab31e839..a16965ac5 100644
--- a/arch/i386/kernel/smpboot.c
+++ b/arch/i386/kernel/smpboot.c
@@ -11,7 +11,7 @@
* Pentium Pro and Pentium-II/Xeon MP machines.
* Original development of Linux SMP code supported by Caldera.
*
- * This code is released under the GNU public license version 2 or
+ * This code is released under the GNU General Public License version 2 or
* later.
*
* Fixes
@@ -389,6 +389,7 @@ void __init smp_callin(void)
*/
if (test_bit(cpuid, &cpu_callout_map))
break;
+ rep_nop();
}
if (!time_before(jiffies, timeout)) {
diff --git a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c
index 7c02813af..6fa43476a 100644
--- a/arch/i386/kernel/traps.c
+++ b/arch/i386/kernel/traps.c
@@ -127,6 +127,11 @@ void show_trace(unsigned long * stack)
printk("\n");
}
+void show_trace_task(struct task_struct *tsk)
+{
+ show_trace(&tsk->thread.esp);
+}
+
void show_stack(unsigned long * esp)
{
unsigned long *stack;
diff --git a/arch/i386/kernel/visws_apic.c b/arch/i386/kernel/visws_apic.c
index 017b8eb58..995d0cdcd 100644
--- a/arch/i386/kernel/visws_apic.c
+++ b/arch/i386/kernel/visws_apic.c
@@ -20,7 +20,7 @@
#include <linux/ioport.h>
#include <linux/interrupt.h>
#include <linux/timex.h>
-#include <linux/malloc.h>
+#include <linux/slab.h>
#include <linux/random.h>
#include <linux/smp.h>
#include <linux/smp_lock.h>
diff --git a/arch/i386/mm/extable.c b/arch/i386/mm/extable.c
index ba34c0395..2eb7ca6aa 100644
--- a/arch/i386/mm/extable.c
+++ b/arch/i386/mm/extable.c
@@ -4,6 +4,7 @@
#include <linux/config.h>
#include <linux/module.h>
+#include <linux/spinlock.h>
#include <asm/uaccess.h>
extern const struct exception_table_entry __start___ex_table[];
@@ -30,26 +31,32 @@ search_one_table(const struct exception_table_entry *first,
return 0;
}
+extern spinlock_t modlist_lock;
+
unsigned long
search_exception_table(unsigned long addr)
{
- unsigned long ret;
-
+ unsigned long ret = 0;
+ unsigned long flags;
+
#ifndef CONFIG_MODULES
/* There is only the kernel to search. */
ret = search_one_table(__start___ex_table, __stop___ex_table-1, addr);
- if (ret) return ret;
+ return ret;
#else
/* The kernel is the last "module" -- no need to treat it special. */
struct module *mp;
+
+ spin_lock_irqsave(&modlist_lock, flags);
for (mp = module_list; mp != NULL; mp = mp->next) {
if (mp->ex_table_start == NULL)
continue;
ret = search_one_table(mp->ex_table_start,
mp->ex_table_end - 1, addr);
- if (ret) return ret;
+ if (ret)
+ break;
}
+ spin_unlock_irqrestore(&modlist_lock, flags);
+ return ret;
#endif
-
- return 0;
}
diff --git a/arch/i386/mm/fault.c b/arch/i386/mm/fault.c
index e2a9ee9fe..ccbc5dce1 100644
--- a/arch/i386/mm/fault.c
+++ b/arch/i386/mm/fault.c
@@ -81,7 +81,7 @@ extern spinlock_t console_lock, timerlist_lock;
/*
* Unlock any spinlocks which will prevent us from getting the
- * message out (timerlist_lock is aquired through the
+ * message out (timerlist_lock is acquired through the
* console unblank code)
*/
void bust_spinlocks(void)