Commit 6b6e62fd authored by Linus Torvalds's avatar Linus Torvalds

pre-2.1.99-3

There's a new pre-patch on ftp.kernel.org, that does:

 - the networking fixes that didn't get into 98 due to various mess-ups
 - mtrr patches are there by default
 - all the irq fixes we know of to date are there (and hopefully even the
   ne2000 things should work with the SELF-IPI change)
 - various documentation updates and bugfixes (the best way to know that a
   stable kernel is approaching is to notice that somebody starts to
   spellcheck the kernel - it has so far never failed)

in short, all known bugs should be fixed, but hey, what else is new?

                Linus
parent 25eaf06c
......@@ -568,6 +568,7 @@ N: Richard E. Gooch
E: rgooch@atnf.csiro.au
D: parent process death signal to children
D: prctl() syscall
D: /proc/mtrr support to manipulate MTRRs on Pentium Pro's
S: CSIRO Australia Telescope National Facility
S: P.O. Box 76, Epping
S: N.S.W., 2121
......
......@@ -19,7 +19,8 @@ need to bother doing so in the form of a diff, as this is generated by
texinfo so a diff is useless anyway (though I can incorporate one by
hand if you insist upon sending it that way ;-).
Check out http://www.cviog.uga.edu/Misc/info/LinuxBleed.html for an
Check out
http://www.mindspring.com/~nunez/info/linux/LinuxBleed.html for an
HTML-ized shopping list.
For those of you in Europe,
......@@ -32,7 +33,7 @@ http://cyberbuzz.gatech.edu/kaboom/linux/ as well.
Also, don't forget http://www.linuxhq.com/ for all your Linux kernel
needs.
Last updated: March 16. 1998
Last updated: April 27, 1998
Current Author: Chris Ricker (kaboom@gatech.edu).
Current Minimal Requirements
......@@ -46,14 +47,14 @@ running, the suggested command should tell you.
- Gnu C 2.7.2.3 ; gcc --version
- Binutils 2.8.1.0.1 ; ld -v
- Linux C Library 5.4.44 ; ls -l /lib/libc.so.*
- Dynamic Linker (ld.so) 1.9.5 ; ldd -v
- Dynamic Linker (ld.so) 1.9.5 ; ldd --version
- Linux C++ Library 2.7.2.8 ; ls -l /usr/lib/libg++.so.*
- Procps 1.2.5 ; ps --version
- Procinfo 0.13 ; procinfo -v
- Procinfo 13 ; procinfo -v
- Mount 2.7l ; mount --version
- Net-tools 1.41 ; hostname -V
- Loadlin 1.6a
- Sh-utils 1.16 ; expr --v
- Sh-utils 1.16 ; basename --v
- Autofs 0.3.11 ; automount --version
- NFS 0.4.21 ; showmount --version
- Bash 1.14.7 ; bash -version
......@@ -137,7 +138,11 @@ your system, you don't have to upgrade just so the kernel will work
Note that the latest compilers (egcs, pgcc, gcc 2.8) may do Bad
Things while compiling your kernel, particularly if absurd
optimizations (like -O9) are used. Caveat emptor.
optimizations (like -O9) are used. Caveat emptor. Currently, the only
C compiler available in a binary distribution is egcs. Version 1.0.2
seems okay; if you have to have a binary, you may be successful using
that. In general, however, gcc-2.7.2.3 is known to be stable, while
egcs and others have not been as thoroughly tested yet.
Networking Changes
==================
......@@ -163,8 +168,14 @@ presence.
To run bootpd, you'll need to issue the following command: echo 1
>/proc/sys/net/ipv4/ip_boot_agent
Similar procedures are necessary to turn on other features. If
something appears broken, check the /proc/sys/net/ipv4/ directory. "1"
generally denotes enabled, while "0" generally denotes disabled.
For support for new features like IPv6, upgrade to the latest
net-tools.
net-tools. This will also fix other problems. For example, the format
of /proc/net/dev changed; as a result, an older ifconfig will
incorrectly report errors.
Memory
======
......@@ -257,11 +268,11 @@ Binutils
========
The 2.8.1.0.1 release:
ftp://tsx-11.mit.edu/pub/linux/packages/GCC/binutils-2.8.1.0.1.bin.tar.gz
ftp://sunsite.unc.edu/pub/Linux/GCC/binutils-2.8.1.0.1.bin.tar.gz
ftp://tsx-11.mit.edu/pub/linux/packages/GCC/binutils-2.8.1.0.23.bin.tar.gz
ftp://sunsite.unc.edu/pub/Linux/GCC/binutils-2.8.1.0.23.bin.tar.gz
Installation notes:
ftp://tsx-11.mit.edu/pub/linux/packages/GCC/release.binutils-2.8.1.0.1
ftp://sunsite.unc.edu/pub/Linux/GCC/release.binutils-2.8.1.0.1
ftp://tsx-11.mit.edu/pub/linux/packages/GCC/release.binutils-2.8.1.0.23
ftp://sunsite.unc.edu/pub/Linux/GCC/release.binutils-2.8.1.0.23
Gnu C
=====
......@@ -273,13 +284,26 @@ Installation notes:
ftp://tsx-11.mit.edu/pub/linux/packages/GCC/release.gcc-2.7.2.3
ftp://sunsite.unc.edu/pub/Linux/GCC/release.gcc-2.7.2.3
The egcs-1.0.2 release:
ftp://tsx-11.mit.edu/pub/linux/packages/GCC/egcs-1.0.2-glibc.x86.tar.gz
ftp://tsx-11.mit.edu/pub/linux/packages/GCC/egcs-1.0.2-libc5.x86.tar.gz
ftp://sunsite.unc.edu/pub/Linux/GCC/egcs-1.0.2-glibc.x86.tar.gz
ftp://sunsite.unc.edu/pub/Linux/GCC/egcs-1.0.2-libc5.x86.tar.gz
Installation notes:
ftp://tsx-11.mit.edu/pub/linux/packages/GCC/release.egcs-1.0.2
ftp://sunsite.unc.edu/pub/Linux/GCC/release.egcs-1.0.2
Gnu C 2.7.2.3 source:
ftp://prep.ai.mit.edu/pub/gnu/gcc-2.7.2.3.tar.gz
ftp://sunsite.unc.edu/pub/gnu/gcc-2.7.2.3.tar.gz
Linux C Library
===============
The 5.4.44 release:
ftp://tsx-11.mit.edu/pub/linux/packages/GCC/libc-5.4.44.bin.tar.gz
ftp://sunsite.unc.edu/pub/Linux/GCC/libc-5.4.44.bin.tar.gz
Installation notes for 5.4.38:
Installation notes for 5.4.44:
ftp://tsx-11.mit.edu/pub/linux/packages/GCC/release.libc-5.4.44
ftp://sunsite.unc.edu/pub/Linux/GCC/release.libc-5.4.44
......@@ -304,21 +328,20 @@ Modules utilities
=================
The 2.1.85 release:
ftp://ftp.redhat.com/pub/alphabits/modutils/modutils-2.1.85.tar.gz
ftp://ftp.kernel.org/pub/linux/kernel/v2.1/modutils-2.1.85.tar.gz
Procps utilities
================
The 1.2 release:
ftp://tsx-11.mit.edu/pub/linux/sources/usr.bin/procps-1.2.5.tar.gz
ftp://sunsite.unc.edu/pub/Linux/system/status/ps/procps-1.2.5.tgz
ftp://tsx-11.mit.edu/pub/linux/sources/usr.bin/procps-1.2.7.tar.gz
ftp://sunsite.unc.edu/pub/Linux/system/status/ps/procps-1.2.7.tgz
Procinfo utilities
==================
The 0.11 release:
ftp://ftp.cistron.nl/pub/people/svm/procinfo-0.13.tar.gz
The 13 release:
ftp://ftp.cistron.nl/pub/people/svm/procinfo-13.tar.gz
RPM utilities
=============
......@@ -337,8 +360,7 @@ DOSEMU
======
The 0.66.7 release:
ftp://tsx-11.mit.edu/pub/linux/ALPHA/dosemu/dosemu0.66.7.tgz
ftp://sunsite.unc.edu/pub/Linux/system/emulators/dosemu0.66.7.tgz
ftp://tsx-11.mit.edu/pub/linux/ALPHA/dosemu/dosemu-0.66.7.tgz
Loadlin
=======
......@@ -376,8 +398,9 @@ ftp://linux.nrao.edu/pub/people/okir/linux-nfs-0.4.21.tar.gz
Net-tools
=========
The 1.432 release:
ftp://ftp.cs-ipv6.lancs.ac.uk/pub/Code/Linux/Net_Tools/net-tools-1.432.tar.gz
The 1.45 release:
ftp://ftp.cs-ipv6.lancs.ac.uk/pub/Code/Linux/Net_Tools/net-tools-1.45.tar.gz
http://www.tazenda.demon.co.uk/phil/net-tools/net-tools-1.45.tar.gz
Ypbind
======
......@@ -396,7 +419,6 @@ Ncpfs
The 2.1.1 release:
ftp://ftp.gwdg.de/pub/linux/misc/ncpfs/ncpfs-2.1.1.tgz
ftp://sunsite.unc.edu/pub/Linux/system/Filesystems/ncpfs/ncpfs-2.1.1.tgz
Pcmcia-cs
=========
......
......@@ -1031,6 +1031,12 @@ CONFIG_PCI_DIRECT
works. If both PCI BIOS and direct PCI access are enabled, the use
of BIOS is preferred. If unsure, say Y.
PCI quirks
CONFIG_PCI_QUIRKS
If you have a broken BIOS, it may fail to set up the PCI bus in a
correct or optimal fashion. If your BIOS is fine you can say N here
for a very slightly smaller kernel. If unsure, say Y.
PCI bridge optimization (experimental)
CONFIG_PCI_OPTIMIZE
This can improve access times for some hardware devices if you have
......@@ -6436,6 +6442,28 @@ CONFIG_FT_FDC_MAX_RATE
speed. If unsure, leave this disabled, i.e. leave it at 2000
bits/sec.
MTRR control and configuration
CONFIG_MTRR
On Intel Pentium Pro systems the Memory Type Range Registers (MTRRs)
may be used to control processor access to memory ranges. This is
most useful when you have a video (VGA) card on the PCI
bus. Enabling write-combining allows PCI write transfers to be
combined into a larger transfer before bursting over the PCI
bus. This can increase performance of image write operations 2.5
times or more.
This option creates a /proc/mtrr file which may be used to manipulate
your MTRRs. Typically the X server should use this. This should have
a reasonably generic interface so that similar control registers on
other processors can be easily supported.
This option also fixes a problem with buggy SMP BIOSes which only
set the MTRRs for the boot CPU and not the secondary CPUs. This can
lead to all sorts of problems.
In general you should compile this into the kernel, rather than as a
loadable module, because the BIOS fix needs to be done early in the
boot sequence. If you compile this as a module, the BIOS fix will be
delayed until when you load the module. You do this at your own risk.
See Documentation/mtrr.txt for more information.
Main CPU frequency, only for DEC alpha machine
CONFIG_FT_ALPHA_CLOCK
On some DEC Alpha machines the CPU clock frequency cannot be
......
MTRR (Memory Type Range Register) control
17 Dec 1997
Richard Gooch
<rgooch@atnf.csiro.au>
On Intel Pentium Pro systems the Memory Type Range Registers (MTRRs)
may be used to control processor access to memory ranges. This is
most useful when you have a video (VGA) card on the PCI
bus. Enabling write-combining allows PCI write transfers to be
combined into a larger transfer before bursting over the PCI
bus. This can increase performance of image write operations 2.5
times or more.
The CONFIG_MTRR option creates a /proc/mtrr file which may be used
to manipulate your MTRRs. Typically the X server should use
this. This should have a reasonably generic interface so that
similar control registers on other processors can be easily
supported.
There are two interfaces to /proc/mtrr: one is an ASCII interface
which allows you to read and write. The other is an ioctl()
interface. The ASCII interface is meant for administration. The
ioctl() interface is meant for C programmes (i.e. the X server). The
interfaces are described below, with sample commands and C code.
===============================================================================
Reading MTRRs from the shell:
% cat /proc/mtrr
reg00: base=0x00000000 ( 0MB), size= 128MB: write-back, count=1
reg01: base=0x08000000 ( 128MB), size= 64MB: write-back, count=1
reg05: base=0x80000000 (2048MB), size= 4MB: write-combining, count=1
===============================================================================
Creating MTRRs from the shell:
% echo "base=0x80000000 size=0x400000 type=write-combining" >! /proc/mtrr
===============================================================================
Removing MTRRs from the shell:
% echo "disable=5" >! /proc/mtrr
===============================================================================
Reading MTRRs from a C programme using ioctl()'s:
/* mtrr-show.c
Source file for mtrr-show (example programme to show MTRRs using ioctl()'s)
Copyright (C) 1997 Richard Gooch
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
Richard Gooch may be reached by email at rgooch@atnf.csiro.au
The postal address is:
Richard Gooch, c/o ATNF, P. O. Box 76, Epping, N.S.W., 2121, Australia.
*/
/*
This programme will use an ioctl() on /proc/mtrr to show the current MTRR
settings. This is an alternative to reading /proc/mtrr.
Written by Richard Gooch 17-DEC-1997
Last updated by Richard Gooch 17-DEC-1997
*/
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <errno.h>
#define MTRR_NEED_STRINGS
#include <linux/mtrr.h>
#define TRUE 1
#define FALSE 0
#define ERRSTRING strerror (errno)
int main ()
{
int fd;
struct mtrr_gentry gentry;
if ( ( fd = open ("/proc/mtrr", O_RDONLY, 0) ) == -1 )
{
if (errno == ENOENT)
{
fputs ("/proc/mtrr not found: not supported or you don't have a PPro?\n",
stderr);
exit (1);
}
fprintf (stderr, "Error opening /proc/mtrr\t%s\n", ERRSTRING);
exit (2);
}
for (gentry.regnum = 0; ioctl (fd, MTRRIOC_GET_ENTRY, &gentry) == 0;
++gentry.regnum)
{
if (gentry.size < 1)
{
fprintf (stderr, "Register: %u disabled\n", gentry.regnum);
continue;
}
fprintf (stderr, "Register: %u base: 0x%lx size: 0x%lx type: %s\n",
gentry.regnum, gentry.base, gentry.size,
mtrr_strings[gentry.type]);
}
if (errno == EINVAL) exit (0);
fprintf (stderr, "Error doing ioctl(2) on /dev/mtrr\t%s\n", ERRSTRING);
exit (3);
} /* End Function main */
===============================================================================
Creating MTRRs from a C programme using ioctl()'s:
/* mtrr-add.c
Source file for mtrr-add (example programme to add an MTRRs using ioctl())
Copyright (C) 1997 Richard Gooch
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
Richard Gooch may be reached by email at rgooch@atnf.csiro.au
The postal address is:
Richard Gooch, c/o ATNF, P. O. Box 76, Epping, N.S.W., 2121, Australia.
*/
/*
This programme will use an ioctl() on /proc/mtrr to add an entry. The first
available mtrr is used. This is an alternative to writing /proc/mtrr.
Written by Richard Gooch 17-DEC-1997
Last updated by Richard Gooch 17-DEC-1997
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <errno.h>
#define MTRR_NEED_STRINGS
#include <linux/mtrr.h>
#define TRUE 1
#define FALSE 0
#define ERRSTRING strerror (errno)
int main (int argc, char **argv)
{
int fd;
struct mtrr_sentry sentry;
if (argc != 4)
{
fprintf (stderr, "Usage:\tmtrr-add base size type\n");
exit (1);
}
sentry.base = strtoul (argv[1], NULL, 0);
sentry.size = strtoul (argv[2], NULL, 0);
for (sentry.type = 0; sentry.type < MTRR_NUM_TYPES; ++sentry.type)
{
if (strcmp (argv[3], mtrr_strings[sentry.type]) == 0) break;
}
if (sentry.type >= MTRR_NUM_TYPES)
{
fprintf (stderr, "Illegal type: \"%s\"\n", argv[3]);
exit (2);
}
if ( ( fd = open ("/proc/mtrr", O_WRONLY, 0) ) == -1 )
{
if (errno == ENOENT)
{
fputs ("/proc/mtrr not found: not supported or you don't have a PPro?\n",
stderr);
exit (3);
}
fprintf (stderr, "Error opening /proc/mtrr\t%s\n", ERRSTRING);
exit (4);
}
if (ioctl (fd, MTRRIOC_ADD_ENTRY, &sentry) == -1)
{
fprintf (stderr, "Error doing ioctl(2) on /dev/mtrr\t%s\n", ERRSTRING);
exit (5);
}
fprintf (stderr, "Sleeping for 5 seconds so you can see the new entry\n");
sleep (5);
close (fd);
fputs ("I've just closed /proc/mtrr so now the new entry should be gone\n",
stderr);
} /* End Function main */
===============================================================================
......@@ -176,7 +176,8 @@ if [ "$CONFIG_PCI" = "y" ]; then
# if [ "$CONFIG_TGA_CONSOLE" = "y" ]; then
# bool 'VGA Console Support' CONFIG_VGA_CONSOLE
# fi
if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
bool 'PCI quirks' CONFIG_PCI_QUIRKS
if [ "$CONFIG_PCI_QUIRKS" = "y" -a "$CONFIG_EXPERIMENTAL" = "y" ]; then
bool 'PCI bridge optimization (experimental)' CONFIG_PCI_OPTIMIZE
fi
bool 'Backward-compatible /proc/pci' CONFIG_PCI_OLD_PROC
......
......@@ -37,6 +37,27 @@ unsigned short int csum_tcpudp_magic(unsigned long saddr,
((unsigned long) proto << 8));
}
unsigned int csum_tcpudp_nofold(unsigned long saddr,
unsigned long daddr,
unsigned short len,
unsigned short proto,
unsigned int sum)
{
unsigned long result;
result = (saddr + daddr + sum +
((unsigned long) ntohs(len) << 16) +
((unsigned long) proto << 8));
/* Fold down to 32-bits so we don't loose in the typedef-less
network stack. */
/* 64 to 33 */
result = (result & 0xffffffff) + (result >> 32);
/* 33 to 32 */
result = (result & 0xffffffff) + (result >> 32);
return result;
}
/*
* Do a 64-bit checksum on an arbitrary memory area..
*
......
......@@ -364,6 +364,12 @@ csum_partial_copy_from_user(const char *src, char *dst, int len,
return do_csum_partial_copy_from_user(src, dst, len, sum, errp);
}
unsigned int
csum_partial_copy_nocheck(const char *src, char *dst, int len, unsigned int sum)
{
return do_csum_partial_copy_from_user(src, dst, len, sum, NULL);
}
unsigned int
csum_partial_copy (const char *src, char *dst, int len, unsigned int sum)
{
......
......@@ -17,6 +17,9 @@ choice 'Processor family' \
Pentium/K5/5x86/6x86 CONFIG_M586 \
PPro/K6/6x86MX CONFIG_M686" Pentium
bool 'Math emulation' CONFIG_MATH_EMULATION
if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
bool 'MTRR (Memory Type Range Register) support' CONFIG_MTRR
fi
endmenu
mainmenu_option next_comment
......@@ -36,7 +39,8 @@ bool 'PCI support' CONFIG_PCI
if [ "$CONFIG_PCI" = "y" ]; then
bool ' PCI BIOS support' CONFIG_PCI_BIOS
bool ' PCI direct access support' CONFIG_PCI_DIRECT
if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
bool ' PCI quirks' CONFIG_PCI_QUIRKS
if [ "$CONFIG_PCI_QUIRKS" = "y" -a "$CONFIG_EXPERIMENTAL" = "y" ]; then
bool ' PCI bridge optimization (experimental)' CONFIG_PCI_OPTIMIZE
fi
bool ' Backward-compatible /proc/pci' CONFIG_PCI_OLD_PROC
......
......@@ -15,7 +15,6 @@
CONFIG_M586=y
# CONFIG_M686 is not set
# CONFIG_MATH_EMULATION is not set
CONFIG_MAX_MEMSIZE=1024
#
# Loadable module support
......@@ -31,6 +30,7 @@ CONFIG_NET=y
CONFIG_PCI=y
CONFIG_PCI_BIOS=y
CONFIG_PCI_DIRECT=y
CONFIG_PCI_QUIRKS=y
CONFIG_PCI_OLD_PROC=y
# CONFIG_MCA is not set
CONFIG_SYSVIPC=y
......
......@@ -21,6 +21,7 @@ O_TARGET := kernel.o
O_OBJS := process.o signal.o entry.o traps.o irq.o vm86.o \
ptrace.o ioport.o ldt.o setup.o time.o sys_i386.o
OX_OBJS := i386_ksyms.o
MX_OBJS :=
ifdef CONFIG_PCI
O_OBJS += bios32.o
......@@ -30,6 +31,14 @@ ifdef CONFIG_MCA
O_OBJS += mca.o
endif
ifeq ($(CONFIG_MTRR),y)
OX_OBJS += mtrr.o
else
ifeq ($(CONFIG_MTRR),m)
MX_OBJS += mtrr.o
endif
endif
ifdef SMP
......
......@@ -82,6 +82,8 @@ EXPORT_SYMBOL(__global_cli);
EXPORT_SYMBOL(__global_sti);
EXPORT_SYMBOL(__global_save_flags);
EXPORT_SYMBOL(__global_restore_flags);
EXPORT_SYMBOL(smp_message_pass);
EXPORT_SYMBOL(mtrr_hook);
#endif
#ifdef CONFIG_MCA
......
......@@ -240,6 +240,7 @@ BUILD_IRQ(23)
BUILD_SMP_INTERRUPT(reschedule_interrupt)
BUILD_SMP_INTERRUPT(invalidate_interrupt)
BUILD_SMP_INTERRUPT(stop_cpu_interrupt)
BUILD_SMP_INTERRUPT(mtrr_interrupt)
/*
* every pentium local APIC has two 'local interrupts', with a
......@@ -1106,6 +1107,9 @@ __initfunc(void init_IRQ(void))
/* self generated IPI for local APIC timer */
set_intr_gate(0x41, apic_timer_interrupt);
/* IPI for MTRR control */
set_intr_gate(0x50, mtrr_interrupt);
#endif
request_region(0x20,0x20,"pic1");
request_region(0xa0,0x20,"pic2");
......
This diff is collapsed.
......@@ -47,6 +47,10 @@
#include <asm/smp.h>
#include <asm/io.h>
#ifdef CONFIG_MTRR
# include <asm/mtrr.h>
#endif
#define __KERNEL_SYSCALLS__
#include <linux/unistd.h>
......@@ -669,6 +673,10 @@ extern int cpu_idle(void * unused);
*/
__initfunc(int start_secondary(void *unused))
{
#ifdef CONFIG_MTRR
/* Must be done before calibration delay is computed */
mtrr_init_secondary_cpu ();
#endif
smp_callin();
while (!smp_commenced)
barrier();
......@@ -729,7 +737,7 @@ __initfunc(static void do_boot_cpu(int i))
/* start_eip had better be page-aligned! */
start_eip = setup_trampoline();
printk("Booting processor %d eip %lx: ", i, start_eip); /* So we see what's up */
printk("Booting processor %d eip %lx\n", i, start_eip); /* So we see what's up */
stack_start.esp = (void *) (1024 + PAGE_SIZE + (char *)idle);
/*
......@@ -908,6 +916,10 @@ __initfunc(void smp_boot_cpus(void))
int i;
unsigned long cfg;
#ifdef CONFIG_MTRR
/* Must be done before other processors booted */
mtrr_init_boot_cpu ();
#endif
/*
* Initialize the logical to physical cpu number mapping
* and the per-CPU profiling counter/multiplier
......@@ -940,7 +952,7 @@ __initfunc(void smp_boot_cpus(void))
{
printk(KERN_NOTICE "SMP motherboard not detected. Using dummy APIC emulation.\n");
io_apic_irqs = 0;
return;
goto smp_done;
}
/*
......@@ -1099,6 +1111,12 @@ __initfunc(void smp_boot_cpus(void))
* go and set it up:
*/
setup_IO_APIC();
smp_done:
#ifdef CONFIG_MTRR
/* Must be done after other processors booted */
mtrr_init ();
#endif
}
......@@ -1189,6 +1207,10 @@ void smp_message_pass(int target, int msg, unsigned long data, int wait)
irq = 0x40;
break;
case MSG_MTRR_CHANGE:
irq = 0x50;
break;
default:
printk("Unknown SMP message %d\n", msg);
return;
......@@ -1487,6 +1509,14 @@ asmlinkage void smp_stop_cpu_interrupt(void)
for (;;) ;
}
void (*mtrr_hook) (void) = NULL;
asmlinkage void smp_mtrr_interrupt(void)
{
ack_APIC_irq ();
if (mtrr_hook) (*mtrr_hook) ();
}
/*
* This part sets up the APIC 32 bit clock in LVTT1, with HZ interrupts
* per second. We assume that the caller has already set up the local
......
......@@ -48,7 +48,10 @@ else
define_bool CONFIG_PCI y
fi
if [ "$CONFIG_PREP" = "y" ]; then
bool 'PCI bridge optimization' CONFIG_PCI_OPTIMIZE
bool 'PCI quirks' CONFIG_PCI_QUIRKS
if [ "$CONFIG_PCI_QUIRKS" = "y" ]; then
bool ' PCI bridge optimization' CONFIG_PCI_OPTIMIZE
fi
fi
bool 'Backward-compatible /proc/pci' CONFIG_PCI_OLD_PROC
bool 'Networking support' CONFIG_NET
......
......@@ -23,6 +23,7 @@ CONFIG_MODULES=y
CONFIG_MODVERSIONS=y
CONFIG_KERNELD=y
CONFIG_PCI=y
# CONFIG_PCI_QUIRKS is not set
# CONFIG_PCI_OPTIMIZE is not set
CONFIG_PCI_OLD_PROC=y
CONFIG_NET=y
......
......@@ -28,7 +28,7 @@ L_OBJS += oldproc.o
endif
endif
ifdef CONFIG_PCI_OPTIMIZE
ifdef CONFIG_PCI_QUIRKS
L_OBJS += quirks.o
endif
......
......@@ -319,7 +319,7 @@ __initfunc(void pci_init(void))
/* give BIOS a chance to apply platform specific fixes: */
pcibios_fixup();
#ifdef CONFIG_PCI_OPTIMIZE
#ifdef CONFIG_PCI_QUIRKS
pci_quirks_init();
#endif
......
......@@ -19,6 +19,8 @@
#undef DEBUG
#ifdef CONFIG_PCI_OPTIMIZE
/*
* The PCI Bridge Optimization -- Some BIOS'es are too lazy
* and are unable to turn on several features which can burst
......@@ -103,35 +105,87 @@ __initfunc(static void quirk_bridge(struct pci_dev *dev, int pos))
}
}
#endif
/* Deal with broken BIOS'es that neglect to enable passive release,
which can cause problems in combination with the 82441FX/PPro MTRRs */
__initfunc(static void quirk_passive_release(struct pci_dev *dev, int arg))
{
struct pci_dev *piix3;
unsigned char dlc;
/* We have to make sure a particular bit is set in the PIIX3
ISA bridge, so we have to go out and find it. */
for (piix3 = pci_devices; ; piix3 = piix3->next) {
if (!piix3)
return;
if (piix3->vendor == PCI_VENDOR_ID_INTEL
&& piix3->device == PCI_DEVICE_ID_INTEL_82371SB_0)
break;
}
pcibios_read_config_byte(piix3->bus->number, piix3->devfn, 0x82, &dlc);
if (!(dlc & 1<<1)) {
printk("PIIX3: Enabling Passive Release\n");
dlc |= 1<<1;
pcibios_write_config_byte(piix3->bus->number, piix3->devfn,
0x82, dlc);
}
}
typedef void (*quirk_handler)(struct pci_dev *, int);
/*
* Table of quirk handler functions
* Mpping from quirk handler functions to names.
*/
#define Q_BRIDGE 0
struct quirk_type {
void (*handler)(struct pci_dev *, int);
struct quirk_name {
quirk_handler handler;
char *name;
};
static struct quirk_type quirk_types[] __initdata = {
static struct quirk_name quirk_names[] __initdata = {
#ifdef CONFIG_PCI_OPTIMIZE
{ quirk_bridge, "Bridge optimization" },
#endif
{ quirk_passive_release, "Passive release enable" },
};
static inline char *get_quirk_name(quirk_handler handler)
{
int i;
for (i = 0; i < sizeof(quirk_names)/sizeof(quirk_names[0]); i++)
if (handler == quirk_names[i].handler)
return quirk_names[i].name;
return NULL;
}
/*
* Mapping from PCI vendor/device ID pairs to quirk function types and arguments
*/
struct quirk_info {
unsigned short vendor, device;
unsigned short quirk, arg;
quirk_handler handler;
unsigned short arg;
};
static struct quirk_info quirk_list[] __initdata = {
{ PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_BRD, Q_BRIDGE, 0x00 },
{ PCI_VENDOR_ID_UMC, PCI_DEVICE_ID_UMC_UM8891A, Q_BRIDGE, 0x01 },
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82424, Q_BRIDGE, 0x00 },
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82434, Q_BRIDGE, 0x00 }
#ifdef CONFIG_PCI_OPTIMIZE
{ PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_BRD, quirk_bridge, 0x00 },
{ PCI_VENDOR_ID_UMC, PCI_DEVICE_ID_UMC_UM8891A, quirk_bridge, 0x01 },
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82424, quirk_bridge, 0x00 },
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82434, quirk_bridge, 0x00 },
#endif
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82441, quirk_passive_release, 0x00 },
};
__initfunc(void pci_quirks_init(void))
......@@ -146,11 +200,10 @@ __initfunc(void pci_quirks_init(void))
for(i=0; i<sizeof(quirk_list)/sizeof(quirk_list[0]); i++) {
struct quirk_info *q = quirk_list + i;
if (q->vendor == d->vendor && q->device == d->device) {
struct quirk_type *t = quirk_types + q->quirk;
printk("PCI: %02x:%02x [%04x/%04x]: %s (%02x)\n",
d->bus->number, d->devfn, d->vendor, d->device,
t->name, q->arg);
t->handler(d, q->arg);
get_quirk_name(q->handler), q->arg);
q->handler(d, q->arg);
}
}
}
......
......@@ -18,6 +18,10 @@ extern unsigned short int csum_tcpudp_magic(unsigned long saddr,
unsigned short proto,
unsigned int sum);
unsigned int csum_tcpudp_nofold(unsigned long saddr, unsigned long daddr,
unsigned short len, unsigned short proto,
unsigned int sum);
/*
* computes the checksum of a memory block at buff, length len,
* and adds in "sum" (32-bit)
......@@ -55,6 +59,9 @@ unsigned int csum_partial_copy(const char *src, char *dst, int len, unsigned int
*/
unsigned int csum_partial_copy_from_user(const char *src, char *dst, int len, unsigned int sum, int *errp);
unsigned int csum_partial_copy_nocheck(const char *src, char *dst, int len, unsigned int sum);
/*
* this routine is used for miscellaneous IP-like checksums, mainly
* in icmp.c
......
......@@ -14,6 +14,10 @@
#include <linux/config.h>
#include <asm/processor.h>
#ifdef CONFIG_MTRR
# include <asm/mtrr.h>
#endif
#define CONFIG_BUGi386
__initfunc(static void no_halt(char *s, int *ints))
......@@ -236,4 +240,10 @@ __initfunc(static void check_bugs(void))
check_amd_k6();
check_pentium_f00f();
system_utsname.machine[1] = '0' + boot_cpu_data.x86;
#if !defined(__SMP__) && defined(CONFIG_MTRR)
/* Must be done after other processors booted: at this point we are
called before SMP initialisation, so this is for the non-SMP case
only. The SMP case is handled in arch/i386/kernel/smp.c */
mtrr_init ();
#endif
}
#ifndef _I386_CHECKSUM_H
#define _I386_CHECKSUM_H
/*
* computes the checksum of a memory block at buff, length len,
* and adds in "sum" (32-bit)
......@@ -44,6 +45,12 @@ unsigned int csum_partial_copy_from_user ( const char *src, char *dst,
return csum_partial_copy_generic ( src, dst, len, sum, err_ptr, dst_err_ptr);
}
#if 0
/* Not used at the moment. It is difficult to imagine for what purpose
it can be used :-) Please, do not forget to verify_area before it --ANK
*/
/*
* This combination is currently not used, but possible:
*/
......@@ -56,6 +63,7 @@ unsigned int csum_partial_copy_to_user ( const char *src, char *dst,
return csum_partial_copy_generic ( src, dst, len, sum, src_err_ptr, err_ptr);
}
#endif
/*
* These are the old (and unsafe) way of doing checksums, a warning message will be
......@@ -121,16 +129,12 @@ static inline unsigned int csum_fold(unsigned int sum)
return (~sum) >> 16;
}
/*
* computes the checksum of the TCP/UDP pseudo-header
* returns a 16-bit checksum, already complemented
*/
static inline unsigned short int csum_tcpudp_magic(unsigned long saddr,
static inline unsigned long csum_tcpudp_nofold(unsigned long saddr,
unsigned long daddr,
unsigned short len,
unsigned short proto,
unsigned int sum) {
unsigned int sum)
{
__asm__("
addl %1, %0
adcl %2, %0
......@@ -139,8 +143,22 @@ static inline unsigned short int csum_tcpudp_magic(unsigned long saddr,
"
: "=r" (sum)
: "g" (daddr), "g"(saddr), "g"((ntohs(len)<<16)+proto*256), "0"(sum));
return csum_fold(sum);
return sum;
}
/*
* computes the checksum of the TCP/UDP pseudo-header
* returns a 16-bit checksum, already complemented
*/
static inline unsigned short int csum_tcpudp_magic(unsigned long saddr,
unsigned long daddr,
unsigned short len,
unsigned short proto,
unsigned int sum)
{
return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum));
}
/*
* this routine is used for miscellaneous IP-like checksums, mainly
* in icmp.c
......
/* Generic MTRR (Memory Type Range Register) ioctls.
Copyright (C) 1997-1998 Richard Gooch
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
Richard Gooch may be reached by email at rgooch@atnf.csiro.au
The postal address is:
Richard Gooch, c/o ATNF, P. O. Box 76, Epping, N.S.W., 2121, Australia.
*/
#ifndef _LINUX_MTRR_H
#define _LINUX_MTRR_H
#include <linux/ioctl.h>
#define MTRR_IOCTL_BASE 'M'
struct mtrr_sentry
{
unsigned long base; /* Base address */
unsigned long size; /* Size of region */
unsigned int type; /* Type of region */
};
struct mtrr_gentry
{
unsigned int regnum; /* Register number */
unsigned long base; /* Base address */
unsigned long size; /* Size of region */
unsigned int type; /* Type of region */
};
/* These are the various ioctls */
#define MTRRIOC_ADD_ENTRY _IOW(MTRR_IOCTL_BASE, 0, struct mtrr_sentry)
#define MTRRIOC_SET_ENTRY _IOW(MTRR_IOCTL_BASE, 1, struct mtrr_sentry)
#define MTRRIOC_DEL_ENTRY _IOW(MTRR_IOCTL_BASE, 2, struct mtrr_sentry)
#define MTRRIOC_GET_ENTRY _IOWR(MTRR_IOCTL_BASE, 3, struct mtrr_gentry)
/* These are the region types */
#define MTRR_TYPE_UNCACHABLE 0
#define MTRR_TYPE_WRCOMB 1
/*#define MTRR_TYPE_ 2*/
/*#define MTRR_TYPE_ 3*/
#define MTRR_TYPE_WRTHROUGH 4
#define MTRR_TYPE_WRPROT 5
#define MTRR_TYPE_WRBACK 6
#define MTRR_NUM_TYPES 7
#ifdef MTRR_NEED_STRINGS
static char *mtrr_strings[MTRR_NUM_TYPES] =
{
"uncachable", /* 0 */
"write-combining", /* 1 */
"?", /* 2 */
"?", /* 3 */
"write-through", /* 4 */
"write-protect", /* 5 */
"write-back", /* 6 */
};
#endif
#ifdef __KERNEL__
/* The following functions are for use by other drivers */
# if defined(CONFIG_MTRR) || defined(CONFIG_MTRR_MODULE)
extern int mtrr_add (unsigned long base, unsigned long size,
unsigned int type, char increment);
extern int mtrr_del (int reg, unsigned long base, unsigned long size);
# else
static __inline__ int mtrr_add (unsigned long base, unsigned long size,
unsigned int type, char increment)
{
return -ENODEV;
}
static __inline__ mtrr_del (int reg, unsigned long base, unsigned long size)
{
return -ENODEV;
}
# endif
/* The following functions are for initialisation: don't use them! */
extern int mtrr_init (void);
# if defined(__SMP__) && defined(CONFIG_MTRR)
extern void mtrr_init_boot_cpu (void);
extern void mtrr_init_secondary_cpu (void);
# endif
#endif
#endif /* _LINUX_MTRR_H */
......@@ -168,6 +168,7 @@ extern void smp_reschedule_irq(int cpl, struct pt_regs *regs);
extern unsigned long ipi_count;
extern void smp_invalidate_rcv(void); /* Process an NMI */
extern void smp_local_timer_interrupt(struct pt_regs * regs);
extern void (*mtrr_hook) (void);
extern void setup_APIC_clock (void);
extern volatile int __cpu_logical_map[NR_CPUS];
extern inline int cpu_logical_map(int cpu)
......
......@@ -87,8 +87,8 @@ static inline unsigned int csum_fold(unsigned int sum)
* returns a 16-bit checksum, already complemented
*/
static inline unsigned short int
csum_tcpudp_magic(unsigned long saddr, unsigned long daddr, unsigned short len,
static inline unsigned int
csum_tcpudp_nofold(unsigned long saddr, unsigned long daddr, unsigned short len,
unsigned short proto, unsigned int sum)
{
__asm__ ("addl %1,%0\n\t"
......@@ -99,7 +99,14 @@ csum_tcpudp_magic(unsigned long saddr, unsigned long daddr, unsigned short len,
: "=&d" (sum), "=&d" (saddr)
: "0" (daddr), "1" (saddr), "d" (len + proto),
"d"(sum));
return csum_fold(sum);
return sum;
}
static inline unsigned short int
csum_tcpudp_magic(unsigned long saddr, unsigned long daddr, unsigned short len,
unsigned short proto, unsigned int sum)
{
return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum));
}
/*
......
......@@ -34,6 +34,9 @@ extern unsigned int csum_partial_copy_generic(const char *src, char *dst,
#define csum_partial_copy_from_user(src, dst, len, sum, errp) \
csum_partial_copy_generic((src), (dst), (len), (sum), (errp), 0)
/* FIXME: this needs to be written to really do no check -- Cort */
#define csum_partial_copy_nocheck(src, dst, len, sum) \
csum_partial_copy_generic((src), (dst), (len), (sum), 0, 0)
/*
* Old versions which ignore errors.
*/
......@@ -69,6 +72,27 @@ static inline unsigned short ip_compute_csum(unsigned char * buff, int len)
return csum_fold(csum_partial(buff, len, 0));
}
/*
* FIXME: I swiped this one from the sparc and made minor modifications.
* It may not be correct. -- Cort
*/
static inline unsigned long csum_tcpudp_nofold(unsigned long saddr,
unsigned long daddr,
unsigned short len,
unsigned short proto,
unsigned int sum)
{
__asm__("
add %0,%0,%1
add %0,%0,%2
add %0,%0,%0
addi %0,%0,0
"
: "=r" (sum)
: "r" (daddr), "r"(saddr), "r"((ntohs(len)<<16)+proto*256), "0"(sum));
return sum;
}
/*
* This is a version of ip_compute_csum() optimized for IP headers,
* which always checksum on 4 octet boundaries. ihl is the number
......
/* $Id: checksum.h,v 1.27 1997/04/11 00:42:18 davem Exp $ */
/* $Id: checksum.h,v 1.28 1998/04/17 02:37:25 davem Exp $ */
#ifndef __SPARC_CHECKSUM_H
#define __SPARC_CHECKSUM_H
......@@ -158,10 +158,22 @@ extern __inline__ unsigned short ip_fast_csum(__const__ unsigned char *iph,
return sum;
}
/* computes the checksum of the TCP/UDP pseudo-header
* returns a 16-bit checksum, already complemented
*/
extern __inline__ unsigned short csum_tcpudp_magic(unsigned long saddr,
/* Fold a partial checksum without adding pseudo headers. */
extern __inline__ unsigned int csum_fold(unsigned int sum)
{
unsigned int tmp;
__asm__ __volatile__("addcc\t%0, %1, %1\n\t"
"srl\t%1, 16, %1\n\t"
"addx\t%1, %%g0, %1\n\t"
"xnor\t%%g0, %1, %0"
: "=&r" (sum), "=r" (tmp)
: "0" (sum), "1" (sum<<16)
: "cc");
return sum;
}
extern __inline__ unsigned long csum_tcpudp_nofold(unsigned long saddr,
unsigned long daddr,
unsigned int len,
unsigned short proto,
......@@ -171,11 +183,6 @@ extern __inline__ unsigned short csum_tcpudp_magic(unsigned long saddr,
"addxcc\t%2, %0, %0\n\t"
"addxcc\t%3, %0, %0\n\t"
"addx\t%0, %%g0, %0\n\t"
"sll\t%0, 16, %1\n\t"
"addcc\t%1, %0, %0\n\t"
"srl\t%0, 16, %0\n\t"
"addx\t%0, %%g0, %0\n\t"
"xnor\t%%g0, %0, %0"
: "=r" (sum), "=r" (saddr)
: "r" (daddr), "r" ((proto<<16)+len), "0" (sum),
"1" (saddr)
......@@ -183,19 +190,17 @@ extern __inline__ unsigned short csum_tcpudp_magic(unsigned long saddr,
return sum;
}
/* Fold a partial checksum without adding pseudo headers. */
extern __inline__ unsigned int csum_fold(unsigned int sum)
/*
* computes the checksum of the TCP/UDP pseudo-header
* returns a 16-bit checksum, already complemented
*/
static inline unsigned short int csum_tcpudp_magic(unsigned long saddr,
unsigned long daddr,
unsigned short len,
unsigned short proto,
unsigned int sum)
{
unsigned int tmp;
__asm__ __volatile__("addcc\t%0, %1, %1\n\t"
"srl\t%1, 16, %1\n\t"
"addx\t%1, %%g0, %1\n\t"
"xnor\t%%g0, %1, %0"
: "=&r" (sum), "=r" (tmp)
: "0" (sum), "1" (sum<<16)
: "cc");
return sum;
return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum));
}
#define _HAVE_ARCH_IPV6_CSUM
......
/* $Id: checksum.h,v 1.10 1997/08/09 18:09:03 jj Exp $ */
/* $Id: checksum.h,v 1.11 1998/04/17 02:37:22 davem Exp $ */
#ifndef __SPARC64_CHECKSUM_H
#define __SPARC64_CHECKSUM_H
......@@ -116,10 +116,23 @@ extern __inline__ unsigned short ip_fast_csum(__const__ unsigned char *iph,
return sum;
}
/* computes the checksum of the TCP/UDP pseudo-header
* returns a 16-bit checksum, already complemented
*/
extern __inline__ unsigned short csum_tcpudp_magic(unsigned long saddr,
/* Fold a partial checksum without adding pseudo headers. */
extern __inline__ unsigned short csum_fold(unsigned int sum)
{
unsigned int tmp;
__asm__ __volatile__("
addcc %0, %1, %1
srl %1, 16, %1
addc %1, %%g0, %1
xnor %%g0, %1, %0
" : "=&r" (sum), "=r" (tmp)
: "0" (sum), "1" (sum<<16)
: "cc");
return (sum & 0xffff);
}
extern __inline__ unsigned long csum_tcpudp_nofold(unsigned long saddr,
unsigned long daddr,
unsigned int len,
unsigned short proto,
......@@ -130,31 +143,23 @@ extern __inline__ unsigned short csum_tcpudp_magic(unsigned long saddr,
addccc %2, %0, %0
addccc %3, %0, %0
addc %0, %%g0, %0
sll %0, 16, %1
addcc %1, %0, %0
srl %0, 16, %0
addc %0, %%g0, %0
xnor %%g0, %0, %0
" : "=r" (sum), "=r" (saddr)
: "r" (daddr), "r" ((proto<<16)+len), "0" (sum), "1" (saddr)
: "cc");
return (sum & 0xffff);
return sum;
}
/* Fold a partial checksum without adding pseudo headers. */
extern __inline__ unsigned short csum_fold(unsigned int sum)
/*
* computes the checksum of the TCP/UDP pseudo-header
* returns a 16-bit checksum, already complemented
*/
static inline unsigned short int csum_tcpudp_magic(unsigned long saddr,
unsigned long daddr,
unsigned short len,
unsigned short proto,
unsigned int sum)
{
unsigned int tmp;
__asm__ __volatile__("
addcc %0, %1, %1
srl %1, 16, %1
addc %1, %%g0, %1
xnor %%g0, %1, %0
" : "=&r" (sum), "=r" (tmp)
: "0" (sum), "1" (sum<<16)
: "cc");
return (sum & 0xffff);
return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum));
}
#define _HAVE_ARCH_IPV6_CSUM
......
......@@ -49,7 +49,8 @@ enum root_directory_inos {
PROC_SLABINFO,
PROC_PARPORT,
PROC_PPC_HTAB,
PROC_SOUND
PROC_SOUND,
PROC_MTRR, /* whether enabled or not */
};
enum pid_directory_inos {
......
......@@ -47,7 +47,8 @@ extern volatile int smp_msg_id;
#define MSG_STOP_CPU 0x0002 /* Sent to shut down slave CPU's
* when rebooting
*/
#define MSG_RESCHEDULE 0x0003 /* Reschedule request from master CPU */
#define MSG_RESCHEDULE 0x0003 /* Reschedule request from master CPU*/
#define MSG_MTRR_CHANGE 0x0004 /* Change MTRR */
#else
......
......@@ -41,17 +41,13 @@ use_init_file_context(void) {
current->fs = task_init->fs;
current->fs->count++;
/* don't use the user's files, use init's files instead */
exit_files(current); /* current->files->count--; */
current->files = task_init->files;
current->files->count++;
unlock_kernel();
}
static int exec_modprobe(void * module_name)
{
char *argv[] = { modprobe_path, "-s", "-k", (char*)module_name, NULL};
int i;
use_init_file_context();
......@@ -66,6 +62,10 @@ static int exec_modprobe(void * module_name)
flush_signal_handlers(current);
spin_unlock_irq(&current->sigmask_lock);
for (i = 0; i < current->files->max_fds; i++ ) {
if (current->files->fd[i]) close(i);
}
set_fs(KERNEL_DS); /* Allow execve args to be in kernel space. */
current->uid = current->euid = 0;
if (execve(modprobe_path, argv, envp) < 0) {
......@@ -87,7 +87,7 @@ int request_module(const char * module_name)
int waitpid_result;
pid = kernel_thread(exec_modprobe, (void*) module_name,
CLONE_FS | CLONE_FILES | SIGCHLD);
CLONE_FS | SIGCHLD);
if (pid < 0) {
printk(KERN_ERR "kmod: fork failed, errno %d\n", -pid);
return pid;
......
......@@ -894,11 +894,11 @@ static void tcp_v4_send_reset(struct sk_buff *skb)
memset(&arg, 0, sizeof arg);
arg.iov[0].iov_base = (unsigned char *)&rth;
arg.iov[0].iov_len = sizeof rth;
arg.csum = csum_tcpudp_magic(skb->nh.iph->daddr,
skb->nh.iph->saddr, /*XXX*/
sizeof(struct tcphdr),
IPPROTO_TCP,
0);
arg.csum = csum_tcpudp_nofold(skb->nh.iph->daddr,
skb->nh.iph->saddr, /*XXX*/
sizeof(struct tcphdr),
IPPROTO_TCP,
0);
arg.n_iov = 1;
arg.csumoffset = offsetof(struct tcphdr, check) / sizeof(u16);
......
......@@ -17,6 +17,7 @@
#include <net/neighbour.h>
#include <net/snmp.h>
#ifdef CONFIG_INET
#include <linux/ip.h>
#include <linux/etherdevice.h>
#include <linux/fddidevice.h>
......@@ -34,7 +35,6 @@
#include <linux/mroute.h>
#include <linux/igmp.h>
#ifdef CONFIG_INET
extern struct net_proto_family inet_family_ops;
#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
......@@ -421,14 +421,12 @@ EXPORT_SYMBOL(ip_acct_output);
EXPORT_SYMBOL(dev_base);
EXPORT_SYMBOL(dev_close);
EXPORT_SYMBOL(dev_mc_add);
EXPORT_SYMBOL(arp_find);
EXPORT_SYMBOL(n_tty_ioctl);
EXPORT_SYMBOL(tty_register_ldisc);
EXPORT_SYMBOL(kill_fasync);
#ifdef CONFIG_INET
EXPORT_SYMBOL(arp_find);
EXPORT_SYMBOL(ip_rcv);
EXPORT_SYMBOL(arp_rcv);
#endif
EXPORT_SYMBOL(dev_mc_delete);
EXPORT_SYMBOL(if_port_text);
......@@ -444,14 +442,13 @@ EXPORT_SYMBOL(dlci_ioctl_hook);
#endif
/* Packet scheduler modules want these. */
#ifdef CONFIG_NET_SCHED
EXPORT_SYMBOL(qdisc_destroy);
EXPORT_SYMBOL(qdisc_reset);
EXPORT_SYMBOL(qdisc_restart);
EXPORT_SYMBOL(qdisc_head);
EXPORT_SYMBOL(qdisc_create_dflt);
EXPORT_SYMBOL(pfifo_qdisc_ops);
EXPORT_SYMBOL(noop_qdisc);
#ifdef CONFIG_NET_SCHED
EXPORT_SYMBOL(register_qdisc);
EXPORT_SYMBOL(unregister_qdisc);
EXPORT_SYMBOL(qdisc_get_rtab);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment