Automatic merge with /usr/src/ntfs-2.6.git.
This commit is contained in:
commit
2a322e4c08
|
@ -138,6 +138,8 @@ java.txt
|
|||
- info on the in-kernel binary support for Java(tm).
|
||||
kbuild/
|
||||
- directory with info about the kernel build process.
|
||||
kdumpt.txt
|
||||
- mini HowTo on getting the crash dump code to work.
|
||||
kernel-doc-nano-HOWTO.txt
|
||||
- mini HowTo on generation and location of kernel documentation files.
|
||||
kernel-docs.txt
|
||||
|
|
|
@ -132,21 +132,6 @@ which require discussion or do not have a clear advantage should
|
|||
usually be sent first to linux-kernel. Only after the patch is
|
||||
discussed should the patch then be submitted to Linus.
|
||||
|
||||
For small patches you may want to CC the Trivial Patch Monkey
|
||||
trivial@rustcorp.com.au set up by Rusty Russell; which collects "trivial"
|
||||
patches. Trivial patches must qualify for one of the following rules:
|
||||
Spelling fixes in documentation
|
||||
Spelling fixes which could break grep(1).
|
||||
Warning fixes (cluttering with useless warnings is bad)
|
||||
Compilation fixes (only if they are actually correct)
|
||||
Runtime fixes (only if they actually fix things)
|
||||
Removing use of deprecated functions/macros (eg. check_region).
|
||||
Contact detail and documentation fixes
|
||||
Non-portable code replaced by portable code (even in arch-specific,
|
||||
since people copy, as long as it's trivial)
|
||||
Any fix by the author/maintainer of the file. (ie. patch monkey
|
||||
in re-transmission mode)
|
||||
|
||||
|
||||
|
||||
5) Select your CC (e-mail carbon copy) list.
|
||||
|
@ -299,7 +284,7 @@ can certify the below:
|
|||
|
||||
then you just add a line saying
|
||||
|
||||
Signed-off-by: Random J Developer <random@developer.org>
|
||||
Signed-off-by: Random J Developer <random@developer.example.org>
|
||||
|
||||
Some people also put extra tags at the end. They'll just be ignored for
|
||||
now, but you can do this to mark internal company procedures or just
|
||||
|
|
|
@ -419,6 +419,7 @@ into the file "track01":
|
|||
*/
|
||||
#include <stdio.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/types.h>
|
||||
#include <linux/cdrom.h>
|
||||
|
||||
static struct cdrom_tochdr hdr;
|
||||
|
@ -429,7 +430,7 @@ static int datafile, drive;
|
|||
static int i, j, limit, track, err;
|
||||
static char filename[32];
|
||||
|
||||
main(int argc, char *argv[])
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
/*
|
||||
* open /dev/cdrom
|
||||
|
@ -516,6 +517,7 @@ entry[track+1].cdte_addr.lba=entry[track].cdte_addr.lba+300;
|
|||
}
|
||||
arg.addr.lba++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/*===================== end program ========================================*/
|
||||
|
||||
|
@ -564,15 +566,16 @@ Appendix -- the "cdtester" utility:
|
|||
#include <stdio.h>
|
||||
#include <malloc.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/types.h>
|
||||
#include <linux/cdrom.h>
|
||||
|
||||
#ifdef AZT_PRIVATE_IOCTLS
|
||||
#include <linux/../../drivers/cdrom/aztcd.h>
|
||||
#endif AZT_PRIVATE_IOCTLS
|
||||
#endif /* AZT_PRIVATE_IOCTLS */
|
||||
#ifdef SBP_PRIVATE_IOCTLS
|
||||
#include <linux/../../drivers/cdrom/sbpcd.h>
|
||||
#include <linux/fs.h>
|
||||
#endif SBP_PRIVATE_IOCTLS
|
||||
#endif /* SBP_PRIVATE_IOCTLS */
|
||||
|
||||
struct cdrom_tochdr hdr;
|
||||
struct cdrom_tochdr tocHdr;
|
||||
|
@ -590,7 +593,7 @@ union
|
|||
struct cdrom_msf msf;
|
||||
unsigned char buf[CD_FRAMESIZE_RAW];
|
||||
} azt;
|
||||
#endif AZT_PRIVATE_IOCTLS
|
||||
#endif /* AZT_PRIVATE_IOCTLS */
|
||||
int i, i1, i2, i3, j, k;
|
||||
unsigned char sequence=0;
|
||||
unsigned char command[80];
|
||||
|
@ -738,7 +741,7 @@ void display(int size,unsigned char *buffer)
|
|||
}
|
||||
}
|
||||
|
||||
main(int argc, char *argv[])
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
printf("\nTesting tool for a CDROM driver's audio functions V0.1\n");
|
||||
printf("(C) 1995 Eberhard Moenkeberg <emoenke@gwdg.de>\n");
|
||||
|
@ -1046,12 +1049,13 @@ main(int argc, char *argv[])
|
|||
rc=ioctl(drive,CDROMAUDIOBUFSIZ,j);
|
||||
printf("%d frames granted.\n",rc);
|
||||
break;
|
||||
#endif SBP_PRIVATE_IOCTLS
|
||||
#endif /* SBP_PRIVATE_IOCTLS */
|
||||
default:
|
||||
printf("unknown command: \"%s\".\n",command);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/*==========================================================================*/
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
|
||||
|
||||
Dominik Brodowski <linux@brodo.de>
|
||||
some additions and corrections by Nico Golde <nico@ngolde.de>
|
||||
|
||||
|
||||
|
||||
|
@ -25,6 +26,7 @@ Contents:
|
|||
2.1 Performance
|
||||
2.2 Powersave
|
||||
2.3 Userspace
|
||||
2.4 Ondemand
|
||||
|
||||
3. The Governor Interface in the CPUfreq Core
|
||||
|
||||
|
@ -86,7 +88,7 @@ highest frequency within the borders of scaling_min_freq and
|
|||
scaling_max_freq.
|
||||
|
||||
|
||||
2.1 Powersave
|
||||
2.2 Powersave
|
||||
-------------
|
||||
|
||||
The CPUfreq governor "powersave" sets the CPU statically to the
|
||||
|
@ -94,7 +96,7 @@ lowest frequency within the borders of scaling_min_freq and
|
|||
scaling_max_freq.
|
||||
|
||||
|
||||
2.2 Userspace
|
||||
2.3 Userspace
|
||||
-------------
|
||||
|
||||
The CPUfreq governor "userspace" allows the user, or any userspace
|
||||
|
@ -103,6 +105,14 @@ by making a sysfs file "scaling_setspeed" available in the CPU-device
|
|||
directory.
|
||||
|
||||
|
||||
2.4 Ondemand
|
||||
------------
|
||||
|
||||
The CPUfreq govenor "ondemand" sets the CPU depending on the
|
||||
current usage. To do this the CPU must have the capability to
|
||||
switch the frequency very fast.
|
||||
|
||||
|
||||
|
||||
3. The Governor Interface in the CPUfreq Core
|
||||
=============================================
|
||||
|
|
|
@ -51,6 +51,14 @@ mems_allowed vector.
|
|||
|
||||
If a cpuset is cpu or mem exclusive, no other cpuset, other than a direct
|
||||
ancestor or descendent, may share any of the same CPUs or Memory Nodes.
|
||||
A cpuset that is cpu exclusive has a sched domain associated with it.
|
||||
The sched domain consists of all cpus in the current cpuset that are not
|
||||
part of any exclusive child cpusets.
|
||||
This ensures that the scheduler load balacing code only balances
|
||||
against the cpus that are in the sched domain as defined above and not
|
||||
all of the cpus in the system. This removes any overhead due to
|
||||
load balancing code trying to pull tasks outside of the cpu exclusive
|
||||
cpuset only to be prevented by the tasks' cpus_allowed mask.
|
||||
|
||||
User level code may create and destroy cpusets by name in the cpuset
|
||||
virtual file system, manage the attributes and permissions of these
|
||||
|
@ -84,6 +92,9 @@ This can be especially valuable on:
|
|||
and a database), or
|
||||
* NUMA systems running large HPC applications with demanding
|
||||
performance characteristics.
|
||||
* Also cpu_exclusive cpusets are useful for servers running orthogonal
|
||||
workloads such as RT applications requiring low latency and HPC
|
||||
applications that are throughput sensitive
|
||||
|
||||
These subsets, or "soft partitions" must be able to be dynamically
|
||||
adjusted, as the job mix changes, without impacting other concurrently
|
||||
|
@ -125,6 +136,8 @@ Cpusets extends these two mechanisms as follows:
|
|||
- A cpuset may be marked exclusive, which ensures that no other
|
||||
cpuset (except direct ancestors and descendents) may contain
|
||||
any overlapping CPUs or Memory Nodes.
|
||||
Also a cpu_exclusive cpuset would be associated with a sched
|
||||
domain.
|
||||
- You can list all the tasks (by pid) attached to any cpuset.
|
||||
|
||||
The implementation of cpusets requires a few, simple hooks
|
||||
|
@ -136,6 +149,9 @@ into the rest of the kernel, none in performance critical paths:
|
|||
allowed in that tasks cpuset.
|
||||
- in sched.c migrate_all_tasks(), to keep migrating tasks within
|
||||
the CPUs allowed by their cpuset, if possible.
|
||||
- in sched.c, a new API partition_sched_domains for handling
|
||||
sched domain changes associated with cpu_exclusive cpusets
|
||||
and related changes in both sched.c and arch/ia64/kernel/domain.c
|
||||
- in the mbind and set_mempolicy system calls, to mask the requested
|
||||
Memory Nodes by what's allowed in that tasks cpuset.
|
||||
- in page_alloc, to restrict memory to allowed nodes.
|
||||
|
|
|
@ -94,6 +94,7 @@ Your cooperation is appreciated.
|
|||
9 = /dev/urandom Faster, less secure random number gen.
|
||||
10 = /dev/aio Asyncronous I/O notification interface
|
||||
11 = /dev/kmsg Writes to this come out as printk's
|
||||
12 = /dev/oldmem Access to crash dump from kexec kernel
|
||||
1 block RAM disk
|
||||
0 = /dev/ram0 First RAM disk
|
||||
1 = /dev/ram1 Second RAM disk
|
||||
|
|
|
@ -44,26 +44,23 @@ TwinHan (dst) are loaded automatically by the dvb-bt8xx device driver.
|
|||
$ modprobe dst
|
||||
|
||||
The value 0x71 will override the PCI type detection for dvb-bt8xx,
|
||||
which is necessary for TwinHan cards.
|
||||
which is necessary for TwinHan cards.
|
||||
|
||||
If you're having an older card (blue color circuit) and card=0x71 locks
|
||||
your machine, try using 0x68, too. If that does not work, ask on the
|
||||
mailing list.
|
||||
|
||||
The DST module takes a couple of useful parameters.
|
||||
The DST module takes a couple of useful parameters:
|
||||
|
||||
verbose takes values 0 to 5. These values control the verbosity level.
|
||||
|
||||
debug takes values 0 and 1. You can either disable or enable debugging.
|
||||
|
||||
dst_addons takes values 0 and 0x20. A value of 0 means it is a FTA card.
|
||||
0x20 means it has a Conditional Access slot.
|
||||
|
||||
The autodected values are determined bythe cards 'response
|
||||
string' which you can see in your logs e.g.
|
||||
|
||||
dst_get_device_id: Recognise [DSTMCI]
|
||||
a. verbose takes values 0 to 5. These values control the verbosity level.
|
||||
b. debug takes values 0 and 1. You can either disable or enable debugging.
|
||||
c. dst_addons takes values 0 and 0x20:
|
||||
- A value of 0 means it is a FTA card.
|
||||
- A value of 0x20 means it has a Conditional Access slot.
|
||||
|
||||
The autodetected values are determined by the "response string"
|
||||
of the card, which you can see in your logs:
|
||||
e.g.: dst_get_device_id: Recognize [DSTMCI]
|
||||
|
||||
--
|
||||
Authors: Richard Walker, Jamie Honan, Michael Hunold, Manu Abraham
|
||||
Authors: Richard Walker, Jamie Honan, Michael Hunold, Manu Abraham, Uwe Bugla
|
||||
|
|
|
@ -43,6 +43,14 @@ Who: Randy Dunlap <rddunlap@osdl.org>
|
|||
|
||||
---------------------------
|
||||
|
||||
What: RAW driver (CONFIG_RAW_DRIVER)
|
||||
When: December 2005
|
||||
Why: declared obsolete since kernel 2.6.3
|
||||
O_DIRECT can be used instead
|
||||
Who: Adrian Bunk <bunk@stusta.de>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: register_ioctl32_conversion() / unregister_ioctl32_conversion()
|
||||
When: April 2005
|
||||
Why: Replaced by ->compat_ioctl in file_operations and other method
|
||||
|
|
179
Documentation/kdump/gdbmacros.txt
Normal file
179
Documentation/kdump/gdbmacros.txt
Normal file
|
@ -0,0 +1,179 @@
|
|||
#
|
||||
# This file contains a few gdb macros (user defined commands) to extract
|
||||
# useful information from kernel crashdump (kdump) like stack traces of
|
||||
# all the processes or a particular process and trapinfo.
|
||||
#
|
||||
# These macros can be used by copying this file in .gdbinit (put in home
|
||||
# directory or current directory) or by invoking gdb command with
|
||||
# --command=<command-file-name> option
|
||||
#
|
||||
# Credits:
|
||||
# Alexander Nyberg <alexn@telia.com>
|
||||
# V Srivatsa <vatsa@in.ibm.com>
|
||||
# Maneesh Soni <maneesh@in.ibm.com>
|
||||
#
|
||||
|
||||
define bttnobp
|
||||
set $tasks_off=((size_t)&((struct task_struct *)0)->tasks)
|
||||
set $pid_off=((size_t)&((struct task_struct *)0)->pids[1].pid_list.next)
|
||||
set $init_t=&init_task
|
||||
set $next_t=(((char *)($init_t->tasks).next) - $tasks_off)
|
||||
while ($next_t != $init_t)
|
||||
set $next_t=(struct task_struct *)$next_t
|
||||
printf "\npid %d; comm %s:\n", $next_t.pid, $next_t.comm
|
||||
printf "===================\n"
|
||||
set var $stackp = $next_t.thread.esp
|
||||
set var $stack_top = ($stackp & ~4095) + 4096
|
||||
|
||||
while ($stackp < $stack_top)
|
||||
if (*($stackp) > _stext && *($stackp) < _sinittext)
|
||||
info symbol *($stackp)
|
||||
end
|
||||
set $stackp += 4
|
||||
end
|
||||
set $next_th=(((char *)$next_t->pids[1].pid_list.next) - $pid_off)
|
||||
while ($next_th != $next_t)
|
||||
set $next_th=(struct task_struct *)$next_th
|
||||
printf "\npid %d; comm %s:\n", $next_t.pid, $next_t.comm
|
||||
printf "===================\n"
|
||||
set var $stackp = $next_t.thread.esp
|
||||
set var $stack_top = ($stackp & ~4095) + 4096
|
||||
|
||||
while ($stackp < $stack_top)
|
||||
if (*($stackp) > _stext && *($stackp) < _sinittext)
|
||||
info symbol *($stackp)
|
||||
end
|
||||
set $stackp += 4
|
||||
end
|
||||
set $next_th=(((char *)$next_th->pids[1].pid_list.next) - $pid_off)
|
||||
end
|
||||
set $next_t=(char *)($next_t->tasks.next) - $tasks_off
|
||||
end
|
||||
end
|
||||
document bttnobp
|
||||
dump all thread stack traces on a kernel compiled with !CONFIG_FRAME_POINTER
|
||||
end
|
||||
|
||||
define btt
|
||||
set $tasks_off=((size_t)&((struct task_struct *)0)->tasks)
|
||||
set $pid_off=((size_t)&((struct task_struct *)0)->pids[1].pid_list.next)
|
||||
set $init_t=&init_task
|
||||
set $next_t=(((char *)($init_t->tasks).next) - $tasks_off)
|
||||
while ($next_t != $init_t)
|
||||
set $next_t=(struct task_struct *)$next_t
|
||||
printf "\npid %d; comm %s:\n", $next_t.pid, $next_t.comm
|
||||
printf "===================\n"
|
||||
set var $stackp = $next_t.thread.esp
|
||||
set var $stack_top = ($stackp & ~4095) + 4096
|
||||
set var $stack_bot = ($stackp & ~4095)
|
||||
|
||||
set $stackp = *($stackp)
|
||||
while (($stackp < $stack_top) && ($stackp > $stack_bot))
|
||||
set var $addr = *($stackp + 4)
|
||||
info symbol $addr
|
||||
set $stackp = *($stackp)
|
||||
end
|
||||
|
||||
set $next_th=(((char *)$next_t->pids[1].pid_list.next) - $pid_off)
|
||||
while ($next_th != $next_t)
|
||||
set $next_th=(struct task_struct *)$next_th
|
||||
printf "\npid %d; comm %s:\n", $next_t.pid, $next_t.comm
|
||||
printf "===================\n"
|
||||
set var $stackp = $next_t.thread.esp
|
||||
set var $stack_top = ($stackp & ~4095) + 4096
|
||||
set var $stack_bot = ($stackp & ~4095)
|
||||
|
||||
set $stackp = *($stackp)
|
||||
while (($stackp < $stack_top) && ($stackp > $stack_bot))
|
||||
set var $addr = *($stackp + 4)
|
||||
info symbol $addr
|
||||
set $stackp = *($stackp)
|
||||
end
|
||||
set $next_th=(((char *)$next_th->pids[1].pid_list.next) - $pid_off)
|
||||
end
|
||||
set $next_t=(char *)($next_t->tasks.next) - $tasks_off
|
||||
end
|
||||
end
|
||||
document btt
|
||||
dump all thread stack traces on a kernel compiled with CONFIG_FRAME_POINTER
|
||||
end
|
||||
|
||||
define btpid
|
||||
set var $pid = $arg0
|
||||
set $tasks_off=((size_t)&((struct task_struct *)0)->tasks)
|
||||
set $pid_off=((size_t)&((struct task_struct *)0)->pids[1].pid_list.next)
|
||||
set $init_t=&init_task
|
||||
set $next_t=(((char *)($init_t->tasks).next) - $tasks_off)
|
||||
set var $pid_task = 0
|
||||
|
||||
while ($next_t != $init_t)
|
||||
set $next_t=(struct task_struct *)$next_t
|
||||
|
||||
if ($next_t.pid == $pid)
|
||||
set $pid_task = $next_t
|
||||
end
|
||||
|
||||
set $next_th=(((char *)$next_t->pids[1].pid_list.next) - $pid_off)
|
||||
while ($next_th != $next_t)
|
||||
set $next_th=(struct task_struct *)$next_th
|
||||
if ($next_th.pid == $pid)
|
||||
set $pid_task = $next_th
|
||||
end
|
||||
set $next_th=(((char *)$next_th->pids[1].pid_list.next) - $pid_off)
|
||||
end
|
||||
set $next_t=(char *)($next_t->tasks.next) - $tasks_off
|
||||
end
|
||||
|
||||
printf "\npid %d; comm %s:\n", $pid_task.pid, $pid_task.comm
|
||||
printf "===================\n"
|
||||
set var $stackp = $pid_task.thread.esp
|
||||
set var $stack_top = ($stackp & ~4095) + 4096
|
||||
set var $stack_bot = ($stackp & ~4095)
|
||||
|
||||
set $stackp = *($stackp)
|
||||
while (($stackp < $stack_top) && ($stackp > $stack_bot))
|
||||
set var $addr = *($stackp + 4)
|
||||
info symbol $addr
|
||||
set $stackp = *($stackp)
|
||||
end
|
||||
end
|
||||
document btpid
|
||||
backtrace of pid
|
||||
end
|
||||
|
||||
|
||||
define trapinfo
|
||||
set var $pid = $arg0
|
||||
set $tasks_off=((size_t)&((struct task_struct *)0)->tasks)
|
||||
set $pid_off=((size_t)&((struct task_struct *)0)->pids[1].pid_list.next)
|
||||
set $init_t=&init_task
|
||||
set $next_t=(((char *)($init_t->tasks).next) - $tasks_off)
|
||||
set var $pid_task = 0
|
||||
|
||||
while ($next_t != $init_t)
|
||||
set $next_t=(struct task_struct *)$next_t
|
||||
|
||||
if ($next_t.pid == $pid)
|
||||
set $pid_task = $next_t
|
||||
end
|
||||
|
||||
set $next_th=(((char *)$next_t->pids[1].pid_list.next) - $pid_off)
|
||||
while ($next_th != $next_t)
|
||||
set $next_th=(struct task_struct *)$next_th
|
||||
if ($next_th.pid == $pid)
|
||||
set $pid_task = $next_th
|
||||
end
|
||||
set $next_th=(((char *)$next_th->pids[1].pid_list.next) - $pid_off)
|
||||
end
|
||||
set $next_t=(char *)($next_t->tasks.next) - $tasks_off
|
||||
end
|
||||
|
||||
printf "Trapno %ld, cr2 0x%lx, error_code %ld\n", $pid_task.thread.trap_no, \
|
||||
$pid_task.thread.cr2, $pid_task.thread.error_code
|
||||
|
||||
end
|
||||
document trapinfo
|
||||
Run info threads and lookup pid of thread #1
|
||||
'trapinfo <pid>' will tell you by which trap & possibly
|
||||
addresthe kernel paniced.
|
||||
end
|
141
Documentation/kdump/kdump.txt
Normal file
141
Documentation/kdump/kdump.txt
Normal file
|
@ -0,0 +1,141 @@
|
|||
Documentation for kdump - the kexec-based crash dumping solution
|
||||
================================================================
|
||||
|
||||
DESIGN
|
||||
======
|
||||
|
||||
Kdump uses kexec to reboot to a second kernel whenever a dump needs to be taken.
|
||||
This second kernel is booted with very little memory. The first kernel reserves
|
||||
the section of memory that the second kernel uses. This ensures that on-going
|
||||
DMA from the first kernel does not corrupt the second kernel.
|
||||
|
||||
All the necessary information about Core image is encoded in ELF format and
|
||||
stored in reserved area of memory before crash. Physical address of start of
|
||||
ELF header is passed to new kernel through command line parameter elfcorehdr=.
|
||||
|
||||
On i386, the first 640 KB of physical memory is needed to boot, irrespective
|
||||
of where the kernel loads. Hence, this region is backed up by kexec just before
|
||||
rebooting into the new kernel.
|
||||
|
||||
In the second kernel, "old memory" can be accessed in two ways.
|
||||
|
||||
- The first one is through a /dev/oldmem device interface. A capture utility
|
||||
can read the device file and write out the memory in raw format. This is raw
|
||||
dump of memory and analysis/capture tool should be intelligent enough to
|
||||
determine where to look for the right information. ELF headers (elfcorehdr=)
|
||||
can become handy here.
|
||||
|
||||
- The second interface is through /proc/vmcore. This exports the dump as an ELF
|
||||
format file which can be written out using any file copy command
|
||||
(cp, scp, etc). Further, gdb can be used to perform limited debugging on
|
||||
the dump file. This method ensures methods ensure that there is correct
|
||||
ordering of the dump pages (corresponding to the first 640 KB that has been
|
||||
relocated).
|
||||
|
||||
SETUP
|
||||
=====
|
||||
|
||||
1) Download http://www.xmission.com/~ebiederm/files/kexec/kexec-tools-1.101.tar.gz
|
||||
and apply http://lse.sourceforge.net/kdump/patches/kexec-tools-1.101-kdump.patch
|
||||
and after that build the source.
|
||||
|
||||
2) Download and build the appropriate (latest) kexec/kdump (-mm) kernel
|
||||
patchset and apply it to the vanilla kernel tree.
|
||||
|
||||
Two kernels need to be built in order to get this feature working.
|
||||
|
||||
A) First kernel:
|
||||
a) Enable "kexec system call" feature (in Processor type and features).
|
||||
CONFIG_KEXEC=y
|
||||
b) This kernel's physical load address should be the default value of
|
||||
0x100000 (0x100000, 1 MB) (in Processor type and features).
|
||||
CONFIG_PHYSICAL_START=0x100000
|
||||
c) Enable "sysfs file system support" (in Pseudo filesystems).
|
||||
CONFIG_SYSFS=y
|
||||
d) Boot into first kernel with the command line parameter "crashkernel=Y@X".
|
||||
Use appropriate values for X and Y. Y denotes how much memory to reserve
|
||||
for the second kernel, and X denotes at what physical address the reserved
|
||||
memory section starts. For example: "crashkernel=64M@16M".
|
||||
|
||||
B) Second kernel:
|
||||
a) Enable "kernel crash dumps" feature (in Processor type and features).
|
||||
CONFIG_CRASH_DUMP=y
|
||||
b) Specify a suitable value for "Physical address where the kernel is
|
||||
loaded" (in Processor type and features). Typically this value
|
||||
should be same as X (See option d) above, e.g., 16 MB or 0x1000000.
|
||||
CONFIG_PHYSICAL_START=0x1000000
|
||||
c) Enable "/proc/vmcore support" (Optional, in Pseudo filesystems).
|
||||
CONFIG_PROC_VMCORE=y
|
||||
d) Disable SMP support and build a UP kernel (Until it is fixed).
|
||||
CONFIG_SMP=n
|
||||
e) Enable "Local APIC support on uniprocessors".
|
||||
CONFIG_X86_UP_APIC=y
|
||||
f) Enable "IO-APIC support on uniprocessors"
|
||||
CONFIG_X86_UP_IOAPIC=y
|
||||
|
||||
Note: i) Options a) and b) depend upon "Configure standard kernel features
|
||||
(for small systems)" (under General setup).
|
||||
ii) Option a) also depends on CONFIG_HIGHMEM (under Processor
|
||||
type and features).
|
||||
iii) Both option a) and b) are under "Processor type and features".
|
||||
|
||||
3) Boot into the first kernel. You are now ready to try out kexec-based crash
|
||||
dumps.
|
||||
|
||||
4) Load the second kernel to be booted using:
|
||||
|
||||
kexec -p <second-kernel> --crash-dump --args-linux --append="root=<root-dev>
|
||||
init 1 irqpoll"
|
||||
|
||||
Note: i) <second-kernel> has to be a vmlinux image. bzImage will not work,
|
||||
as of now.
|
||||
ii) By default ELF headers are stored in ELF32 format (for i386). This
|
||||
is sufficient to represent the physical memory up to 4GB. To store
|
||||
headers in ELF64 format, specifiy "--elf64-core-headers" on the
|
||||
kexec command line additionally.
|
||||
iii) Specify "irqpoll" as command line parameter. This reduces driver
|
||||
initialization failures in second kernel due to shared interrupts.
|
||||
|
||||
5) System reboots into the second kernel when a panic occurs. A module can be
|
||||
written to force the panic or "ALT-SysRq-c" can be used initiate a crash
|
||||
dump for testing purposes.
|
||||
|
||||
6) Write out the dump file using
|
||||
|
||||
cp /proc/vmcore <dump-file>
|
||||
|
||||
Dump memory can also be accessed as a /dev/oldmem device for a linear/raw
|
||||
view. To create the device, type:
|
||||
|
||||
mknod /dev/oldmem c 1 12
|
||||
|
||||
Use "dd" with suitable options for count, bs and skip to access specific
|
||||
portions of the dump.
|
||||
|
||||
Entire memory: dd if=/dev/oldmem of=oldmem.001
|
||||
|
||||
ANALYSIS
|
||||
========
|
||||
|
||||
Limited analysis can be done using gdb on the dump file copied out of
|
||||
/proc/vmcore. Use vmlinux built with -g and run
|
||||
|
||||
gdb vmlinux <dump-file>
|
||||
|
||||
Stack trace for the task on processor 0, register display, memory display
|
||||
work fine.
|
||||
|
||||
Note: gdb cannot analyse core files generated in ELF64 format for i386.
|
||||
|
||||
TODO
|
||||
====
|
||||
|
||||
1) Provide a kernel pages filtering mechanism so that core file size is not
|
||||
insane on systems having huge memory banks.
|
||||
2) Modify "crash" tool to make it recognize this dump.
|
||||
|
||||
CONTACT
|
||||
=======
|
||||
|
||||
Vivek Goyal (vgoyal@in.ibm.com)
|
||||
Maneesh Soni (maneesh@in.ibm.com)
|
|
@ -358,6 +358,10 @@ running once the system is up.
|
|||
cpia_pp= [HW,PPT]
|
||||
Format: { parport<nr> | auto | none }
|
||||
|
||||
crashkernel=nn[KMG]@ss[KMG]
|
||||
[KNL] Reserve a chunk of physical memory to
|
||||
hold a kernel to switch to with kexec on panic.
|
||||
|
||||
cs4232= [HW,OSS]
|
||||
Format: <io>,<irq>,<dma>,<dma2>,<mpuio>,<mpuirq>
|
||||
|
||||
|
@ -447,6 +451,10 @@ running once the system is up.
|
|||
Format: {"as"|"cfq"|"deadline"|"noop"}
|
||||
See Documentation/block/as-iosched.txt
|
||||
and Documentation/block/deadline-iosched.txt for details.
|
||||
elfcorehdr= [IA-32]
|
||||
Specifies physical address of start of kernel core image
|
||||
elf header.
|
||||
See Documentation/kdump.txt for details.
|
||||
|
||||
enforcing [SELINUX] Set initial enforcing status.
|
||||
Format: {"0" | "1"}
|
||||
|
@ -548,6 +556,9 @@ running once the system is up.
|
|||
|
||||
i810= [HW,DRM]
|
||||
|
||||
i8k.ignore_dmi [HW] Continue probing hardware even if DMI data
|
||||
indicates that the driver is running on unsupported
|
||||
hardware.
|
||||
i8k.force [HW] Activate i8k driver even if SMM BIOS signature
|
||||
does not match list of supported models.
|
||||
i8k.power_status
|
||||
|
|
|
@ -114,9 +114,7 @@ tuntap.txt
|
|||
vortex.txt
|
||||
- info on using 3Com Vortex (3c590, 3c592, 3c595, 3c597) Ethernet cards.
|
||||
wan-router.txt
|
||||
- Wan router documentation
|
||||
wanpipe.txt
|
||||
- WANPIPE(tm) Multiprotocol WAN Driver for Linux WAN Router
|
||||
- WAN router documentation
|
||||
wavelan.txt
|
||||
- AT&T GIS (nee NCR) WaveLAN card: An Ethernet-like radio transceiver
|
||||
x25.txt
|
||||
|
|
|
@ -1,622 +0,0 @@
|
|||
------------------------------------------------------------------------------
|
||||
Linux WAN Router Utilities Package
|
||||
------------------------------------------------------------------------------
|
||||
Version 2.2.1
|
||||
Mar 28, 2001
|
||||
Author: Nenad Corbic <ncorbic@sangoma.com>
|
||||
Copyright (c) 1995-2001 Sangoma Technologies Inc.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
INTRODUCTION
|
||||
|
||||
Wide Area Networks (WANs) are used to interconnect Local Area Networks (LANs)
|
||||
and/or stand-alone hosts over vast distances with data transfer rates
|
||||
significantly higher than those achievable with commonly used dial-up
|
||||
connections.
|
||||
|
||||
Usually an external device called `WAN router' sitting on your local network
|
||||
or connected to your machine's serial port provides physical connection to
|
||||
WAN. Although router's job may be as simple as taking your local network
|
||||
traffic, converting it to WAN format and piping it through the WAN link, these
|
||||
devices are notoriously expensive, with prices as much as 2 - 5 times higher
|
||||
then the price of a typical PC box.
|
||||
|
||||
Alternatively, considering robustness and multitasking capabilities of Linux,
|
||||
an internal router can be built (most routers use some sort of stripped down
|
||||
Unix-like operating system anyway). With a number of relatively inexpensive WAN
|
||||
interface cards available on the market, a perfectly usable router can be
|
||||
built for less than half a price of an external router. Yet a Linux box
|
||||
acting as a router can still be used for other purposes, such as fire-walling,
|
||||
running FTP, WWW or DNS server, etc.
|
||||
|
||||
This kernel module introduces the notion of a WAN Link Driver (WLD) to Linux
|
||||
operating system and provides generic hardware-independent services for such
|
||||
drivers. Why can existing Linux network device interface not be used for
|
||||
this purpose? Well, it can. However, there are a few key differences between
|
||||
a typical network interface (e.g. Ethernet) and a WAN link.
|
||||
|
||||
Many WAN protocols, such as X.25 and frame relay, allow for multiple logical
|
||||
connections (known as `virtual circuits' in X.25 terminology) over a single
|
||||
physical link. Each such virtual circuit may (and almost always does) lead
|
||||
to a different geographical location and, therefore, different network. As a
|
||||
result, it is the virtual circuit, not the physical link, that represents a
|
||||
route and, therefore, a network interface in Linux terms.
|
||||
|
||||
To further complicate things, virtual circuits are usually volatile in nature
|
||||
(excluding so called `permanent' virtual circuits or PVCs). With almost no
|
||||
time required to set up and tear down a virtual circuit, it is highly desirable
|
||||
to implement on-demand connections in order to minimize network charges. So
|
||||
unlike a typical network driver, the WAN driver must be able to handle multiple
|
||||
network interfaces and cope as multiple virtual circuits come into existence
|
||||
and go away dynamically.
|
||||
|
||||
Last, but not least, WAN configuration is much more complex than that of say
|
||||
Ethernet and may well amount to several dozens of parameters. Some of them
|
||||
are "link-wide" while others are virtual circuit-specific. The same holds
|
||||
true for WAN statistics which is by far more extensive and extremely useful
|
||||
when troubleshooting WAN connections. Extending the ifconfig utility to suit
|
||||
these needs may be possible, but does not seem quite reasonable. Therefore, a
|
||||
WAN configuration utility and corresponding application programmer's interface
|
||||
is needed for this purpose.
|
||||
|
||||
Most of these problems are taken care of by this module. Its goal is to
|
||||
provide a user with more-or-less standard look and feel for all WAN devices and
|
||||
assist a WAN device driver writer by providing common services, such as:
|
||||
|
||||
o User-level interface via /proc file system
|
||||
o Centralized configuration
|
||||
o Device management (setup, shutdown, etc.)
|
||||
o Network interface management (dynamic creation/destruction)
|
||||
o Protocol encapsulation/decapsulation
|
||||
|
||||
To ba able to use the Linux WAN Router you will also need a WAN Tools package
|
||||
available from
|
||||
|
||||
ftp.sangoma.com/pub/linux/current_wanpipe/wanpipe-X.Y.Z.tgz
|
||||
|
||||
where vX.Y.Z represent the wanpipe version number.
|
||||
|
||||
For technical questions and/or comments please e-mail to ncorbic@sangoma.com.
|
||||
For general inquiries please contact Sangoma Technologies Inc. by
|
||||
|
||||
Hotline: 1-800-388-2475 (USA and Canada, toll free)
|
||||
Phone: (905) 474-1990 ext: 106
|
||||
Fax: (905) 474-9223
|
||||
E-mail: dm@sangoma.com (David Mandelstam)
|
||||
WWW: http://www.sangoma.com
|
||||
|
||||
|
||||
INSTALLATION
|
||||
|
||||
Please read the WanpipeForLinux.pdf manual on how to
|
||||
install the WANPIPE tools and drivers properly.
|
||||
|
||||
|
||||
After installing wanpipe package: /usr/local/wanrouter/doc.
|
||||
On the ftp.sangoma.com : /linux/current_wanpipe/doc
|
||||
|
||||
|
||||
COPYRIGHT AND LICENSING INFORMATION
|
||||
|
||||
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, 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.
|
||||
|
||||
|
||||
|
||||
ACKNOWLEDGEMENTS
|
||||
|
||||
This product is based on the WANPIPE(tm) Multiprotocol WAN Router developed
|
||||
by Sangoma Technologies Inc. for Linux 2.0.x and 2.2.x. Success of the WANPIPE
|
||||
together with the next major release of Linux kernel in summer 1996 commanded
|
||||
adequate changes to the WANPIPE code to take full advantage of new Linux
|
||||
features.
|
||||
|
||||
Instead of continuing developing proprietary interface tied to Sangoma WAN
|
||||
cards, we decided to separate all hardware-independent code into a separate
|
||||
module and defined two levels of interfaces - one for user-level applications
|
||||
and another for kernel-level WAN drivers. WANPIPE is now implemented as a
|
||||
WAN driver compliant with the WAN Link Driver interface. Also a general
|
||||
purpose WAN configuration utility and a set of shell scripts was developed to
|
||||
support WAN router at the user level.
|
||||
|
||||
Many useful ideas concerning hardware-independent interface implementation
|
||||
were given by Mike McLagan <mike.mclagan@linux.org> and his implementation
|
||||
of the Frame Relay router and drivers for Sangoma cards (dlci/sdla).
|
||||
|
||||
With the new implementation of the APIs being incorporated into the WANPIPE,
|
||||
a special thank goes to Alan Cox in providing insight into BSD sockets.
|
||||
|
||||
Special thanks to all the WANPIPE users who performed field-testing, reported
|
||||
bugs and made valuable comments and suggestions that help us to improve this
|
||||
product.
|
||||
|
||||
|
||||
|
||||
NEW IN THIS RELEASE
|
||||
|
||||
o Updated the WANCFG utility
|
||||
Calls the pppconfig to configure the PPPD
|
||||
for async connections.
|
||||
|
||||
o Added the PPPCONFIG utility
|
||||
Used to configure the PPPD dameon for the
|
||||
WANPIPE Async PPP and standard serial port.
|
||||
The wancfg calls the pppconfig to configure
|
||||
the pppd.
|
||||
|
||||
o Fixed the PCI autodetect feature.
|
||||
The SLOT 0 was used as an autodetect option
|
||||
however, some high end PC's slot numbers start
|
||||
from 0.
|
||||
|
||||
o This release has been tested with the new backupd
|
||||
daemon release.
|
||||
|
||||
|
||||
PRODUCT COMPONENTS AND RELATED FILES
|
||||
|
||||
/etc: (or user defined)
|
||||
wanpipe1.conf default router configuration file
|
||||
|
||||
/lib/modules/X.Y.Z/misc:
|
||||
wanrouter.o router kernel loadable module
|
||||
af_wanpipe.o wanpipe api socket module
|
||||
|
||||
/lib/modules/X.Y.Z/net:
|
||||
sdladrv.o Sangoma SDLA support module
|
||||
wanpipe.o Sangoma WANPIPE(tm) driver module
|
||||
|
||||
/proc/net/wanrouter
|
||||
Config reads current router configuration
|
||||
Status reads current router status
|
||||
{name} reads WAN driver statistics
|
||||
|
||||
/usr/sbin:
|
||||
wanrouter wanrouter start-up script
|
||||
wanconfig wanrouter configuration utility
|
||||
sdladump WANPIPE adapter memory dump utility
|
||||
fpipemon Monitor for Frame Relay
|
||||
cpipemon Monitor for Cisco HDLC
|
||||
ppipemon Monitor for PPP
|
||||
xpipemon Monitor for X25
|
||||
wpkbdmon WANPIPE keyboard led monitor/debugger
|
||||
|
||||
/usr/local/wanrouter:
|
||||
README this file
|
||||
COPYING GNU General Public License
|
||||
Setup installation script
|
||||
Filelist distribution definition file
|
||||
wanrouter.rc meta-configuration file
|
||||
(used by the Setup and wanrouter script)
|
||||
|
||||
/usr/local/wanrouter/doc:
|
||||
wanpipeForLinux.pdf WAN Router User's Manual
|
||||
|
||||
/usr/local/wanrouter/patches:
|
||||
wanrouter-v2213.gz patch for Linux kernels 2.2.11 up to 2.2.13.
|
||||
wanrouter-v2214.gz patch for Linux kernel 2.2.14.
|
||||
wanrouter-v2215.gz patch for Linux kernels 2.2.15 to 2.2.17.
|
||||
wanrouter-v2218.gz patch for Linux kernels 2.2.18 and up.
|
||||
wanrouter-v240.gz patch for Linux kernel 2.4.0.
|
||||
wanrouter-v242.gz patch for Linux kernel 2.4.2 and up.
|
||||
wanrouter-v2034.gz patch for Linux kernel 2.0.34
|
||||
wanrouter-v2036.gz patch for Linux kernel 2.0.36 and up.
|
||||
|
||||
/usr/local/wanrouter/patches/kdrivers:
|
||||
Sources of the latest WANPIPE device drivers.
|
||||
These are used to UPGRADE the linux kernel to the newest
|
||||
version if the kernel source has already been pathced with
|
||||
WANPIPE drivers.
|
||||
|
||||
/usr/local/wanrouter/samples:
|
||||
interface sample interface configuration file
|
||||
wanpipe1.cpri CHDLC primary port
|
||||
wanpipe2.csec CHDLC secondary port
|
||||
wanpipe1.fr Frame Relay protocol
|
||||
wanpipe1.ppp PPP protocol )
|
||||
wanpipe1.asy CHDLC ASYNC protocol
|
||||
wanpipe1.x25 X25 protocol
|
||||
wanpipe1.stty Sync TTY driver (Used by Kernel PPPD daemon)
|
||||
wanpipe1.atty Async TTY driver (Used by Kernel PPPD daemon)
|
||||
wanrouter.rc sample meta-configuration file
|
||||
|
||||
/usr/local/wanrouter/util:
|
||||
* wan-tools utilities source code
|
||||
|
||||
/usr/local/wanrouter/api/x25:
|
||||
* x25 api sample programs.
|
||||
/usr/local/wanrouter/api/chdlc:
|
||||
* chdlc api sample programs.
|
||||
/usr/local/wanrouter/api/fr:
|
||||
* fr api sample programs.
|
||||
/usr/local/wanrouter/config/wancfg:
|
||||
wancfg WANPIPE GUI configuration program.
|
||||
Creates wanpipe#.conf files.
|
||||
/usr/local/wanrouter/config/cfgft1:
|
||||
cfgft1 GUI CSU/DSU configuration program.
|
||||
|
||||
/usr/include/linux:
|
||||
wanrouter.h router API definitions
|
||||
wanpipe.h WANPIPE API definitions
|
||||
sdladrv.h SDLA support module API definitions
|
||||
sdlasfm.h SDLA firmware module definitions
|
||||
if_wanpipe.h WANPIPE Socket definitions
|
||||
if_wanpipe_common.h WANPIPE Socket/Driver common definitions.
|
||||
sdlapci.h WANPIPE PCI definitions
|
||||
|
||||
|
||||
/usr/src/linux/net/wanrouter:
|
||||
* wanrouter source code
|
||||
|
||||
/var/log:
|
||||
wanrouter wanrouter start-up log (created by the Setup script)
|
||||
|
||||
/var/lock: (or /var/lock/subsys for RedHat)
|
||||
wanrouter wanrouter lock file (created by the Setup script)
|
||||
|
||||
/usr/local/wanrouter/firmware:
|
||||
fr514.sfm Frame relay firmware for Sangoma S508/S514 card
|
||||
cdual514.sfm Dual Port Cisco HDLC firmware for Sangoma S508/S514 card
|
||||
ppp514.sfm PPP Firmware for Sangoma S508 and S514 cards
|
||||
x25_508.sfm X25 Firmware for Sangoma S508 card.
|
||||
|
||||
|
||||
REVISION HISTORY
|
||||
|
||||
1.0.0 December 31, 1996 Initial version
|
||||
|
||||
1.0.1 January 30, 1997 Status and statistics can be read via /proc
|
||||
filesystem entries.
|
||||
|
||||
1.0.2 April 30, 1997 Added UDP management via monitors.
|
||||
|
||||
1.0.3 June 3, 1997 UDP management for multiple boards using Frame
|
||||
Relay and PPP
|
||||
Enabled continuous transmission of Configure
|
||||
Request Packet for PPP (for 508 only)
|
||||
Connection Timeout for PPP changed from 900 to 0
|
||||
Flow Control Problem fixed for Frame Relay
|
||||
|
||||
1.0.4 July 10, 1997 S508/FT1 monitoring capability in fpipemon and
|
||||
ppipemon utilities.
|
||||
Configurable TTL for UDP packets.
|
||||
Multicast and Broadcast IP source addresses are
|
||||
silently discarded.
|
||||
|
||||
1.0.5 July 28, 1997 Configurable T391,T392,N391,N392,N393 for Frame
|
||||
Relay in router.conf.
|
||||
Configurable Memory Address through router.conf
|
||||
for Frame Relay, PPP and X.25. (commenting this
|
||||
out enables auto-detection).
|
||||
Fixed freeing up received buffers using kfree()
|
||||
for Frame Relay and X.25.
|
||||
Protect sdla_peek() by calling save_flags(),
|
||||
cli() and restore_flags().
|
||||
Changed number of Trace elements from 32 to 20
|
||||
Added DLCI specific data monitoring in FPIPEMON.
|
||||
2.0.0 Nov 07, 1997 Implemented protection of RACE conditions by
|
||||
critical flags for FRAME RELAY and PPP.
|
||||
DLCI List interrupt mode implemented.
|
||||
IPX support in FRAME RELAY and PPP.
|
||||
IPX Server Support (MARS)
|
||||
More driver specific stats included in FPIPEMON
|
||||
and PIPEMON.
|
||||
|
||||
2.0.1 Nov 28, 1997 Bug Fixes for version 2.0.0.
|
||||
Protection of "enable_irq()" while
|
||||
"disable_irq()" has been enabled from any other
|
||||
routine (for Frame Relay, PPP and X25).
|
||||
Added additional Stats for Fpipemon and Ppipemon
|
||||
Improved Load Sharing for multiple boards
|
||||
|
||||
2.0.2 Dec 09, 1997 Support for PAP and CHAP for ppp has been
|
||||
implemented.
|
||||
|
||||
2.0.3 Aug 15, 1998 New release supporting Cisco HDLC, CIR for Frame
|
||||
relay, Dynamic IP assignment for PPP and Inverse
|
||||
Arp support for Frame-relay. Man Pages are
|
||||
included for better support and a new utility
|
||||
for configuring FT1 cards.
|
||||
|
||||
2.0.4 Dec 09, 1998 Dual Port support for Cisco HDLC.
|
||||
Support for HDLC (LAPB) API.
|
||||
Supports BiSync Streaming code for S502E
|
||||
and S503 cards.
|
||||
Support for Streaming HDLC API.
|
||||
Provides a BSD socket interface for
|
||||
creating applications using BiSync
|
||||
streaming.
|
||||
|
||||
2.0.5 Aug 04, 1999 CHDLC initializatin bug fix.
|
||||
PPP interrupt driven driver:
|
||||
Fix to the PPP line hangup problem.
|
||||
New PPP firmware
|
||||
Added comments to the startup SYSTEM ERROR messages
|
||||
Xpipemon debugging application for the X25 protocol
|
||||
New USER_MANUAL.txt
|
||||
Fixed the odd boundary 4byte writes to the board.
|
||||
BiSync Streaming code has been taken out.
|
||||
Available as a patch.
|
||||
Streaming HDLC API has been taken out.
|
||||
Available as a patch.
|
||||
|
||||
2.0.6 Aug 17, 1999 Increased debugging in statup scripts
|
||||
Fixed insallation bugs from 2.0.5
|
||||
Kernel patch works for both 2.2.10 and 2.2.11 kernels.
|
||||
There is no functional difference between the two packages
|
||||
|
||||
2.0.7 Aug 26, 1999 o Merged X25API code into WANPIPE.
|
||||
o Fixed a memeory leak for X25API
|
||||
o Updated the X25API code for 2.2.X kernels.
|
||||
o Improved NEM handling.
|
||||
|
||||
2.1.0 Oct 25, 1999 o New code for S514 PCI Card
|
||||
o New CHDLC and Frame Relay drivers
|
||||
o PPP and X25 are not supported in this release
|
||||
|
||||
2.1.1 Nov 30, 1999 o PPP support for S514 PCI Cards
|
||||
|
||||
2.1.3 Apr 06, 2000 o Socket based x25api
|
||||
o Socket based chdlc api
|
||||
o Socket based fr api
|
||||
o Dual Port Receive only CHDLC support.
|
||||
o Asynchronous CHDLC support (Secondary Port)
|
||||
o cfgft1 GUI csu/dsu configurator
|
||||
o wancfg GUI configuration file
|
||||
configurator.
|
||||
o Architectual directory changes.
|
||||
|
||||
beta-2.1.4 Jul 2000 o Dynamic interface configuration:
|
||||
Network interfaces reflect the state
|
||||
of protocol layer. If the protocol becomes
|
||||
disconnected, driver will bring down
|
||||
the interface. Once the protocol reconnects
|
||||
the interface will be brought up.
|
||||
|
||||
Note: This option is turned off by default.
|
||||
|
||||
o Dynamic wanrouter setup using 'wanconfig':
|
||||
wanconfig utility can be used to
|
||||
shutdown,restart,start or reconfigure
|
||||
a virtual circuit dynamically.
|
||||
|
||||
Frame Relay: Each DLCI can be:
|
||||
created,stopped,restarted and reconfigured
|
||||
dynamically using wanconfig.
|
||||
|
||||
ex: wanconfig card wanpipe1 dev wp1_fr16 up
|
||||
|
||||
o Wanrouter startup via command line arguments:
|
||||
wanconfig also supports wanrouter startup via command line
|
||||
arguments. Thus, there is no need to create a wanpipe#.conf
|
||||
configuration file.
|
||||
|
||||
o Socket based x25api update/bug fixes.
|
||||
Added support for LCN numbers greater than 255.
|
||||
Option to pass up modem messages.
|
||||
Provided a PCI IRQ check, so a single S514
|
||||
card is guaranteed to have a non-sharing interrupt.
|
||||
|
||||
o Fixes to the wancfg utility.
|
||||
o New FT1 debugging support via *pipemon utilities.
|
||||
o Frame Relay ARP support Enabled.
|
||||
|
||||
beta3-2.1.4 Jul 2000 o X25 M_BIT Problem fix.
|
||||
o Added the Multi-Port PPP
|
||||
Updated utilites for the Multi-Port PPP.
|
||||
|
||||
2.1.4 Aut 2000
|
||||
o In X25API:
|
||||
Maximum packet an application can send
|
||||
to the driver has been extended to 4096 bytes.
|
||||
|
||||
Fixed the x25 startup bug. Enable
|
||||
communications only after all interfaces
|
||||
come up. HIGH SVC/PVC is used to calculate
|
||||
the number of channels.
|
||||
Enable protocol only after all interfaces
|
||||
are enabled.
|
||||
|
||||
o Added an extra state to the FT1 config, kernel module.
|
||||
o Updated the pipemon debuggers.
|
||||
|
||||
o Blocked the Multi-Port PPP from running on kernels
|
||||
2.2.16 or greater, due to syncppp kernel module
|
||||
change.
|
||||
|
||||
beta1-2.1.5 Nov 15 2000
|
||||
o Fixed the MulitPort PPP Support for kernels 2.2.16 and above.
|
||||
2.2.X kernels only
|
||||
|
||||
o Secured the driver UDP debugging calls
|
||||
- All illegal netowrk debugging calls are reported to
|
||||
the log.
|
||||
- Defined a set of allowed commands, all other denied.
|
||||
|
||||
o Cpipemon
|
||||
- Added set FT1 commands to the cpipemon. Thus CSU/DSU
|
||||
configuraiton can be performed using cpipemon.
|
||||
All systems that cannot run cfgft1 GUI utility should
|
||||
use cpipemon to configure the on board CSU/DSU.
|
||||
|
||||
|
||||
o Keyboard Led Monitor/Debugger
|
||||
- A new utilty /usr/sbin/wpkbdmon uses keyboard leds
|
||||
to convey operatinal statistic information of the
|
||||
Sangoma WANPIPE cards.
|
||||
NUM_LOCK = Line State (On=connected, Off=disconnected)
|
||||
CAPS_LOCK = Tx data (On=transmitting, Off=no tx data)
|
||||
SCROLL_LOCK = Rx data (On=receiving, Off=no rx data
|
||||
|
||||
o Hardware probe on module load and dynamic device allocation
|
||||
- During WANPIPE module load, all Sangoma cards are probed
|
||||
and found information is printed in the /var/log/messages.
|
||||
- If no cards are found, the module load fails.
|
||||
- Appropriate number of devices are dynamically loaded
|
||||
based on the number of Sangoma cards found.
|
||||
|
||||
Note: The kernel configuraiton option
|
||||
CONFIG_WANPIPE_CARDS has been taken out.
|
||||
|
||||
o Fixed the Frame Relay and Chdlc network interfaces so they are
|
||||
compatible with libpcap libraries. Meaning, tcpdump, snort,
|
||||
ethereal, and all other packet sniffers and debuggers work on
|
||||
all WANPIPE netowrk interfaces.
|
||||
- Set the network interface encoding type to ARPHRD_PPP.
|
||||
This tell the sniffers that data obtained from the
|
||||
network interface is in pure IP format.
|
||||
Fix for 2.2.X kernels only.
|
||||
|
||||
o True interface encoding option for Frame Relay and CHDLC
|
||||
- The above fix sets the network interface encoding
|
||||
type to ARPHRD_PPP, however some customers use
|
||||
the encoding interface type to determine the
|
||||
protocol running. Therefore, the TURE ENCODING
|
||||
option will set the interface type back to the
|
||||
original value.
|
||||
|
||||
NOTE: If this option is used with Frame Relay and CHDLC
|
||||
libpcap library support will be broken.
|
||||
i.e. tcpdump will not work.
|
||||
Fix for 2.2.x Kernels only.
|
||||
|
||||
o Ethernet Bridgind over Frame Relay
|
||||
- The Frame Relay bridging has been developed by
|
||||
Kristian Hoffmann and Mark Wells.
|
||||
- The Linux kernel bridge is used to send ethernet
|
||||
data over the frame relay links.
|
||||
For 2.2.X Kernels only.
|
||||
|
||||
o Added extensive 2.0.X support. Most new features of
|
||||
2.1.5 for protocols Frame Relay, PPP and CHDLC are
|
||||
supported under 2.0.X kernels.
|
||||
|
||||
beta1-2.2.0 Dec 30 2000
|
||||
o Updated drivers for 2.4.X kernels.
|
||||
o Updated drivers for SMP support.
|
||||
o X25API is now able to share PCI interrupts.
|
||||
o Took out a general polling routine that was used
|
||||
only by X25API.
|
||||
o Added appropriate locks to the dynamic reconfiguration
|
||||
code.
|
||||
o Fixed a bug in the keyboard debug monitor.
|
||||
|
||||
beta2-2.2.0 Jan 8 2001
|
||||
o Patches for 2.4.0 kernel
|
||||
o Patches for 2.2.18 kernel
|
||||
o Minor updates to PPP and CHLDC drivers.
|
||||
Note: No functinal difference.
|
||||
|
||||
beta3-2.2.9 Jan 10 2001
|
||||
o I missed the 2.2.18 kernel patches in beta2-2.2.0
|
||||
release. They are included in this release.
|
||||
|
||||
Stable Release
|
||||
2.2.0 Feb 01 2001
|
||||
o Bug fix in wancfg GUI configurator.
|
||||
The edit function didn't work properly.
|
||||
|
||||
|
||||
bata1-2.2.1 Feb 09 2001
|
||||
o WANPIPE TTY Driver emulation.
|
||||
Two modes of operation Sync and Async.
|
||||
Sync: Using the PPPD daemon, kernel SyncPPP layer
|
||||
and the Wanpipe sync TTY driver: a PPP protocol
|
||||
connection can be established via Sangoma adapter, over
|
||||
a T1 leased line.
|
||||
|
||||
The 2.4.0 kernel PPP layer supports MULTILINK
|
||||
protocol, that can be used to bundle any number of Sangoma
|
||||
adapters (T1 lines) into one, under a single IP address.
|
||||
Thus, efficiently obtaining multiple T1 throughput.
|
||||
|
||||
NOTE: The remote side must also implement MULTILINK PPP
|
||||
protocol.
|
||||
|
||||
Async:Using the PPPD daemon, kernel AsyncPPP layer
|
||||
and the WANPIPE async TTY driver: a PPP protocol
|
||||
connection can be established via Sangoma adapter and
|
||||
a modem, over a telephone line.
|
||||
|
||||
Thus, the WANPIPE async TTY driver simulates a serial
|
||||
TTY driver that would normally be used to interface the
|
||||
MODEM to the linux kernel.
|
||||
|
||||
o WANPIPE PPP Backup Utility
|
||||
This utility will monitor the state of the PPP T1 line.
|
||||
In case of failure, a dial up connection will be established
|
||||
via pppd daemon, ether via a serial tty driver (serial port),
|
||||
or a WANPIPE async TTY driver (in case serial port is unavailable).
|
||||
|
||||
Furthermore, while in dial up mode, the primary PPP T1 link
|
||||
will be monitored for signs of life.
|
||||
|
||||
If the PPP T1 link comes back to life, the dial up connection
|
||||
will be shutdown and T1 line re-established.
|
||||
|
||||
|
||||
o New Setup installation script.
|
||||
Option to UPGRADE device drivers if the kernel source has
|
||||
already been patched with WANPIPE.
|
||||
|
||||
Option to COMPILE WANPIPE modules against the currently
|
||||
running kernel, thus no need for manual kernel and module
|
||||
re-compilatin.
|
||||
|
||||
o Updates and Bug Fixes to wancfg utility.
|
||||
|
||||
bata2-2.2.1 Feb 20 2001
|
||||
|
||||
o Bug fixes to the CHDLC device drivers.
|
||||
The driver had compilation problems under kernels
|
||||
2.2.14 or lower.
|
||||
|
||||
o Bug fixes to the Setup installation script.
|
||||
The device drivers compilation options didn't work
|
||||
properly.
|
||||
|
||||
o Update to the wpbackupd daemon.
|
||||
Optimized the cross-over times, between the primary
|
||||
link and the backup dialup.
|
||||
|
||||
beta3-2.2.1 Mar 02 2001
|
||||
o Patches for 2.4.2 kernel.
|
||||
|
||||
o Bug fixes to util/ make files.
|
||||
o Bug fixes to the Setup installation script.
|
||||
|
||||
o Took out the backupd support and made it into
|
||||
as separate package.
|
||||
|
||||
beta4-2.2.1 Mar 12 2001
|
||||
|
||||
o Fix to the Frame Relay Device driver.
|
||||
IPSAC sends a packet of zero length
|
||||
header to the frame relay driver. The
|
||||
driver tries to push its own 2 byte header
|
||||
into the packet, which causes the driver to
|
||||
crash.
|
||||
|
||||
o Fix the WANPIPE re-configuration code.
|
||||
Bug was found by trying to run the cfgft1 while the
|
||||
interface was already running.
|
||||
|
||||
o Updates to cfgft1.
|
||||
Writes a wanpipe#.cfgft1 configuration file
|
||||
once the CSU/DSU is configured. This file can
|
||||
holds the current CSU/DSU configuration.
|
||||
|
||||
|
||||
|
||||
>>>>>> END OF README <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||||
|
||||
|
|
@ -12,8 +12,7 @@ refrigerator. Code to do this looks like this:
|
|||
do {
|
||||
hub_events();
|
||||
wait_event_interruptible(khubd_wait, !list_empty(&hub_event_list));
|
||||
if (current->flags & PF_FREEZE)
|
||||
refrigerator(PF_FREEZE);
|
||||
try_to_freeze();
|
||||
} while (!signal_pending(current));
|
||||
|
||||
from drivers/usb/core/hub.c::hub_thread()
|
||||
|
|
|
@ -291,6 +291,44 @@ a request to enable wake events from D3, two calls should be made to
|
|||
pci_enable_wake (one for both D3hot and D3cold).
|
||||
|
||||
|
||||
A reference implementation
|
||||
-------------------------
|
||||
.suspend()
|
||||
{
|
||||
/* driver specific operations */
|
||||
|
||||
/* Disable IRQ */
|
||||
free_irq();
|
||||
/* If using MSI */
|
||||
pci_disable_msi();
|
||||
|
||||
pci_save_state();
|
||||
pci_enable_wake();
|
||||
/* Disable IO/bus master/irq router */
|
||||
pci_disable_device();
|
||||
pci_set_power_state(pci_choose_state());
|
||||
}
|
||||
|
||||
.resume()
|
||||
{
|
||||
pci_set_power_state(PCI_D0);
|
||||
pci_restore_state();
|
||||
/* device's irq possibly is changed, driver should take care */
|
||||
pci_enable_device();
|
||||
pci_set_master();
|
||||
|
||||
/* if using MSI, device's vector possibly is changed */
|
||||
pci_enable_msi();
|
||||
|
||||
request_irq();
|
||||
/* driver specific operations; */
|
||||
}
|
||||
|
||||
This is a typical implementation. Drivers can slightly change the order
|
||||
of the operations in the implementation, ignore some operations or add
|
||||
more deriver specific operations in it, but drivers should do something like
|
||||
this on the whole.
|
||||
|
||||
5. Resources
|
||||
~~~~~~~~~~~~
|
||||
|
||||
|
|
|
@ -164,11 +164,11 @@ place where the thread is safe to be frozen (no kernel semaphores
|
|||
should be held at that point and it must be safe to sleep there), and
|
||||
add:
|
||||
|
||||
if (current->flags & PF_FREEZE)
|
||||
refrigerator(PF_FREEZE);
|
||||
try_to_freeze();
|
||||
|
||||
If the thread is needed for writing the image to storage, you should
|
||||
instead set the PF_NOFREEZE process flag when creating the thread.
|
||||
instead set the PF_NOFREEZE process flag when creating the thread (and
|
||||
be very carefull).
|
||||
|
||||
|
||||
Q: What is the difference between between "platform", "shutdown" and
|
||||
|
@ -233,3 +233,81 @@ A: Try running
|
|||
cat `cat /proc/[0-9]*/maps | grep / | sed 's:.* /:/:' | sort -u` > /dev/null
|
||||
|
||||
after resume. swapoff -a; swapon -a may also be usefull.
|
||||
|
||||
Q: What happens to devices during swsusp? They seem to be resumed
|
||||
during system suspend?
|
||||
|
||||
A: That's correct. We need to resume them if we want to write image to
|
||||
disk. Whole sequence goes like
|
||||
|
||||
Suspend part
|
||||
~~~~~~~~~~~~
|
||||
running system, user asks for suspend-to-disk
|
||||
|
||||
user processes are stopped
|
||||
|
||||
suspend(PMSG_FREEZE): devices are frozen so that they don't interfere
|
||||
with state snapshot
|
||||
|
||||
state snapshot: copy of whole used memory is taken with interrupts disabled
|
||||
|
||||
resume(): devices are woken up so that we can write image to swap
|
||||
|
||||
write image to swap
|
||||
|
||||
suspend(PMSG_SUSPEND): suspend devices so that we can power off
|
||||
|
||||
turn the power off
|
||||
|
||||
Resume part
|
||||
~~~~~~~~~~~
|
||||
(is actually pretty similar)
|
||||
|
||||
running system, user asks for suspend-to-disk
|
||||
|
||||
user processes are stopped (in common case there are none, but with resume-from-initrd, noone knows)
|
||||
|
||||
read image from disk
|
||||
|
||||
suspend(PMSG_FREEZE): devices are frozen so that they don't interfere
|
||||
with image restoration
|
||||
|
||||
image restoration: rewrite memory with image
|
||||
|
||||
resume(): devices are woken up so that system can continue
|
||||
|
||||
thaw all user processes
|
||||
|
||||
Q: What is this 'Encrypt suspend image' for?
|
||||
|
||||
A: First of all: it is not a replacement for dm-crypt encrypted swap.
|
||||
It cannot protect your computer while it is suspended. Instead it does
|
||||
protect from leaking sensitive data after resume from suspend.
|
||||
|
||||
Think of the following: you suspend while an application is running
|
||||
that keeps sensitive data in memory. The application itself prevents
|
||||
the data from being swapped out. Suspend, however, must write these
|
||||
data to swap to be able to resume later on. Without suspend encryption
|
||||
your sensitive data are then stored in plaintext on disk. This means
|
||||
that after resume your sensitive data are accessible to all
|
||||
applications having direct access to the swap device which was used
|
||||
for suspend. If you don't need swap after resume these data can remain
|
||||
on disk virtually forever. Thus it can happen that your system gets
|
||||
broken in weeks later and sensitive data which you thought were
|
||||
encrypted and protected are retrieved and stolen from the swap device.
|
||||
To prevent this situation you should use 'Encrypt suspend image'.
|
||||
|
||||
During suspend a temporary key is created and this key is used to
|
||||
encrypt the data written to disk. When, during resume, the data was
|
||||
read back into memory the temporary key is destroyed which simply
|
||||
means that all data written to disk during suspend are then
|
||||
inaccessible so they can't be stolen later on. The only thing that
|
||||
you must then take care of is that you call 'mkswap' for the swap
|
||||
partition used for suspend as early as possible during regular
|
||||
boot. This asserts that any temporary key from an oopsed suspend or
|
||||
from a failed or aborted resume is erased from the swap device.
|
||||
|
||||
As a rule of thumb use encrypted swap to protect your data while your
|
||||
system is shut down or suspended. Additionally use the encrypted
|
||||
suspend image to prevent sensitive data from being stolen after
|
||||
resume.
|
||||
|
|
|
@ -83,8 +83,10 @@ Compaq Armada E500 - P3-700 none (1) (S1 also works OK)
|
|||
Compaq Evo N620c vga=normal, s3_bios (2)
|
||||
Dell 600m, ATI R250 Lf none (1), but needs xorg-x11-6.8.1.902-1
|
||||
Dell D600, ATI RV250 vga=normal and X, or try vbestate (6)
|
||||
Dell D610 vga=normal and X (possibly vbestate (6) too, but not tested)
|
||||
Dell Inspiron 4000 ??? (*)
|
||||
Dell Inspiron 500m ??? (*)
|
||||
Dell Inspiron 510m ???
|
||||
Dell Inspiron 600m ??? (*)
|
||||
Dell Inspiron 8200 ??? (*)
|
||||
Dell Inspiron 8500 ??? (*)
|
||||
|
@ -123,6 +125,7 @@ Toshiba Satellite 4030CDT s3_mode (3)
|
|||
Toshiba Satellite 4080XCDT s3_mode (3)
|
||||
Toshiba Satellite 4090XCDT ??? (*)
|
||||
Toshiba Satellite P10-554 s3_bios,s3_mode (4)(****)
|
||||
Toshiba M30 (2) xor X with nvidia driver using internal AGP
|
||||
Uniwill 244IIO ??? (*)
|
||||
|
||||
|
||||
|
|
|
@ -1,13 +1,16 @@
|
|||
This driver implement the ACPI Extensions For Display Adapters
|
||||
for integrated graphics devices on motherboard, as specified in
|
||||
ACPI 2.0 Specification, Appendix B, allowing to perform some basic
|
||||
control like defining the video POST device, retrieving EDID information
|
||||
or to setup a video output, etc. Note that this is an ref. implementation only.
|
||||
It may or may not work for your integrated video device.
|
||||
ACPI video extensions
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This driver implement the ACPI Extensions For Display Adapters for
|
||||
integrated graphics devices on motherboard, as specified in ACPI 2.0
|
||||
Specification, Appendix B, allowing to perform some basic control like
|
||||
defining the video POST device, retrieving EDID information or to
|
||||
setup a video output, etc. Note that this is an ref. implementation
|
||||
only. It may or may not work for your integrated video device.
|
||||
|
||||
Interfaces exposed to userland through /proc/acpi/video:
|
||||
|
||||
VGA/info : display the supported video bus device capability like ,Video ROM, CRT/LCD/TV.
|
||||
VGA/info : display the supported video bus device capability like Video ROM, CRT/LCD/TV.
|
||||
VGA/ROM : Used to get a copy of the display devices' ROM data (up to 4k).
|
||||
VGA/POST_info : Used to determine what options are implemented.
|
||||
VGA/POST : Used to get/set POST device.
|
||||
|
@ -15,7 +18,7 @@ VGA/DOS : Used to get/set ownership of output switching:
|
|||
Please refer ACPI spec B.4.1 _DOS
|
||||
VGA/CRT : CRT output
|
||||
VGA/LCD : LCD output
|
||||
VGA/TV : TV output
|
||||
VGA/TVO : TV output
|
||||
VGA/*/brightness : Used to get/set brightness of output device
|
||||
|
||||
Notify event through /proc/acpi/event:
|
||||
|
|
|
@ -12,8 +12,8 @@ where log records can be stored efficiently in memory, where each component
|
|||
One purpose of this is to inspect the debug logs after a production system crash
|
||||
in order to analyze the reason for the crash.
|
||||
If the system still runs but only a subcomponent which uses dbf failes,
|
||||
it is possible to look at the debug logs on a live system via the Linux proc
|
||||
filesystem.
|
||||
it is possible to look at the debug logs on a live system via the Linux
|
||||
debugfs filesystem.
|
||||
The debug feature may also very useful for kernel and driver development.
|
||||
|
||||
Design:
|
||||
|
@ -52,16 +52,18 @@ Each debug entry contains the following data:
|
|||
- Flag, if entry is an exception or not
|
||||
|
||||
The debug logs can be inspected in a live system through entries in
|
||||
the proc-filesystem. Under the path /proc/s390dbf there is
|
||||
the debugfs-filesystem. Under the toplevel directory "s390dbf" there is
|
||||
a directory for each registered component, which is named like the
|
||||
corresponding component.
|
||||
corresponding component. The debugfs normally should be mounted to
|
||||
/sys/kernel/debug therefore the debug feature can be accessed unter
|
||||
/sys/kernel/debug/s390dbf.
|
||||
|
||||
The content of the directories are files which represent different views
|
||||
to the debug log. Each component can decide which views should be
|
||||
used through registering them with the function debug_register_view().
|
||||
Predefined views for hex/ascii, sprintf and raw binary data are provided.
|
||||
It is also possible to define other views. The content of
|
||||
a view can be inspected simply by reading the corresponding proc file.
|
||||
a view can be inspected simply by reading the corresponding debugfs file.
|
||||
|
||||
All debug logs have an an actual debug level (range from 0 to 6).
|
||||
The default level is 3. Event and Exception functions have a 'level'
|
||||
|
@ -69,14 +71,14 @@ parameter. Only debug entries with a level that is lower or equal
|
|||
than the actual level are written to the log. This means, when
|
||||
writing events, high priority log entries should have a low level
|
||||
value whereas low priority entries should have a high one.
|
||||
The actual debug level can be changed with the help of the proc-filesystem
|
||||
through writing a number string "x" to the 'level' proc file which is
|
||||
The actual debug level can be changed with the help of the debugfs-filesystem
|
||||
through writing a number string "x" to the 'level' debugfs file which is
|
||||
provided for every debug log. Debugging can be switched off completely
|
||||
by using "-" on the 'level' proc file.
|
||||
by using "-" on the 'level' debugfs file.
|
||||
|
||||
Example:
|
||||
|
||||
> echo "-" > /proc/s390dbf/dasd/level
|
||||
> echo "-" > /sys/kernel/debug/s390dbf/dasd/level
|
||||
|
||||
It is also possible to deactivate the debug feature globally for every
|
||||
debug log. You can change the behavior using 2 sysctl parameters in
|
||||
|
@ -99,11 +101,11 @@ Kernel Interfaces:
|
|||
------------------
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
debug_info_t *debug_register(char *name, int pages_index, int nr_areas,
|
||||
debug_info_t *debug_register(char *name, int pages, int nr_areas,
|
||||
int buf_size);
|
||||
|
||||
Parameter: name: Name of debug log (e.g. used for proc entry)
|
||||
pages_index: 2^pages_index pages will be allocated per area
|
||||
Parameter: name: Name of debug log (e.g. used for debugfs entry)
|
||||
pages: number of pages, which will be allocated per area
|
||||
nr_areas: number of debug areas
|
||||
buf_size: size of data area in each debug entry
|
||||
|
||||
|
@ -134,7 +136,7 @@ Return Value: none
|
|||
Description: Sets new actual debug level if new_level is valid.
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
+void debug_stop_all(void);
|
||||
void debug_stop_all(void);
|
||||
|
||||
Parameter: none
|
||||
|
||||
|
@ -270,7 +272,7 @@ Parameter: id: handle for debug log
|
|||
Return Value: 0 : ok
|
||||
< 0: Error
|
||||
|
||||
Description: registers new debug view and creates proc dir entry
|
||||
Description: registers new debug view and creates debugfs dir entry
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
int debug_unregister_view (debug_info_t * id, struct debug_view *view);
|
||||
|
@ -281,7 +283,7 @@ Parameter: id: handle for debug log
|
|||
Return Value: 0 : ok
|
||||
< 0: Error
|
||||
|
||||
Description: unregisters debug view and removes proc dir entry
|
||||
Description: unregisters debug view and removes debugfs dir entry
|
||||
|
||||
|
||||
|
||||
|
@ -308,7 +310,7 @@ static int init(void)
|
|||
{
|
||||
/* register 4 debug areas with one page each and 4 byte data field */
|
||||
|
||||
debug_info = debug_register ("test", 0, 4, 4 );
|
||||
debug_info = debug_register ("test", 1, 4, 4 );
|
||||
debug_register_view(debug_info,&debug_hex_ascii_view);
|
||||
debug_register_view(debug_info,&debug_raw_view);
|
||||
|
||||
|
@ -343,7 +345,7 @@ static int init(void)
|
|||
/* register 4 debug areas with one page each and data field for */
|
||||
/* format string pointer + 2 varargs (= 3 * sizeof(long)) */
|
||||
|
||||
debug_info = debug_register ("test", 0, 4, sizeof(long) * 3);
|
||||
debug_info = debug_register ("test", 1, 4, sizeof(long) * 3);
|
||||
debug_register_view(debug_info,&debug_sprintf_view);
|
||||
|
||||
debug_sprintf_event(debug_info, 2 , "first event in %s:%i\n",__FILE__,__LINE__);
|
||||
|
@ -362,16 +364,16 @@ module_exit(cleanup);
|
|||
|
||||
|
||||
|
||||
ProcFS Interface
|
||||
Debugfs Interface
|
||||
----------------
|
||||
Views to the debug logs can be investigated through reading the corresponding
|
||||
proc-files:
|
||||
debugfs-files:
|
||||
|
||||
Example:
|
||||
|
||||
> ls /proc/s390dbf/dasd
|
||||
flush hex_ascii level raw
|
||||
> cat /proc/s390dbf/dasd/hex_ascii | sort +1
|
||||
> ls /sys/kernel/debug/s390dbf/dasd
|
||||
flush hex_ascii level pages raw
|
||||
> cat /sys/kernel/debug/s390dbf/dasd/hex_ascii | sort +1
|
||||
00 00974733272:680099 2 - 02 0006ad7e 07 ea 4a 90 | ....
|
||||
00 00974733272:682210 2 - 02 0006ade6 46 52 45 45 | FREE
|
||||
00 00974733272:682213 2 - 02 0006adf6 07 ea 4a 90 | ....
|
||||
|
@ -391,25 +393,36 @@ Changing the debug level
|
|||
Example:
|
||||
|
||||
|
||||
> cat /proc/s390dbf/dasd/level
|
||||
> cat /sys/kernel/debug/s390dbf/dasd/level
|
||||
3
|
||||
> echo "5" > /proc/s390dbf/dasd/level
|
||||
> cat /proc/s390dbf/dasd/level
|
||||
> echo "5" > /sys/kernel/debug/s390dbf/dasd/level
|
||||
> cat /sys/kernel/debug/s390dbf/dasd/level
|
||||
5
|
||||
|
||||
Flushing debug areas
|
||||
--------------------
|
||||
Debug areas can be flushed with piping the number of the desired
|
||||
area (0...n) to the proc file "flush". When using "-" all debug areas
|
||||
area (0...n) to the debugfs file "flush". When using "-" all debug areas
|
||||
are flushed.
|
||||
|
||||
Examples:
|
||||
|
||||
1. Flush debug area 0:
|
||||
> echo "0" > /proc/s390dbf/dasd/flush
|
||||
> echo "0" > /sys/kernel/debug/s390dbf/dasd/flush
|
||||
|
||||
2. Flush all debug areas:
|
||||
> echo "-" > /proc/s390dbf/dasd/flush
|
||||
> echo "-" > /sys/kernel/debug/s390dbf/dasd/flush
|
||||
|
||||
Changing the size of debug areas
|
||||
------------------------------------
|
||||
It is possible the change the size of debug areas through piping
|
||||
the number of pages to the debugfs file "pages". The resize request will
|
||||
also flush the debug areas.
|
||||
|
||||
Example:
|
||||
|
||||
Define 4 pages for the debug areas of debug feature "dasd":
|
||||
> echo "4" > /sys/kernel/debug/s390dbf/dasd/pages
|
||||
|
||||
Stooping the debug feature
|
||||
--------------------------
|
||||
|
@ -491,7 +504,7 @@ Defining views
|
|||
--------------
|
||||
|
||||
Views are specified with the 'debug_view' structure. There are defined
|
||||
callback functions which are used for reading and writing the proc files:
|
||||
callback functions which are used for reading and writing the debugfs files:
|
||||
|
||||
struct debug_view {
|
||||
char name[DEBUG_MAX_PROCF_LEN];
|
||||
|
@ -525,7 +538,7 @@ typedef int (debug_input_proc_t) (debug_info_t* id,
|
|||
The "private_data" member can be used as pointer to view specific data.
|
||||
It is not used by the debug feature itself.
|
||||
|
||||
The output when reading a debug-proc file is structured like this:
|
||||
The output when reading a debugfs file is structured like this:
|
||||
|
||||
"prolog_proc output"
|
||||
|
||||
|
@ -534,13 +547,13 @@ The output when reading a debug-proc file is structured like this:
|
|||
"header_proc output 3" "format_proc output 3"
|
||||
...
|
||||
|
||||
When a view is read from the proc fs, the Debug Feature calls the
|
||||
When a view is read from the debugfs, the Debug Feature calls the
|
||||
'prolog_proc' once for writing the prolog.
|
||||
Then 'header_proc' and 'format_proc' are called for each
|
||||
existing debug entry.
|
||||
|
||||
The input_proc can be used to implement functionality when it is written to
|
||||
the view (e.g. like with 'echo "0" > /proc/s390dbf/dasd/level).
|
||||
the view (e.g. like with 'echo "0" > /sys/kernel/debug/s390dbf/dasd/level).
|
||||
|
||||
For header_proc there can be used the default function
|
||||
debug_dflt_header_fn() which is defined in in debug.h.
|
||||
|
@ -602,7 +615,7 @@ debug_info = debug_register ("test", 0, 4, 4 ));
|
|||
debug_register_view(debug_info, &debug_test_view);
|
||||
for(i = 0; i < 10; i ++) debug_int_event(debug_info, 1, i);
|
||||
|
||||
> cat /proc/s390dbf/test/myview
|
||||
> cat /sys/kernel/debug/s390dbf/test/myview
|
||||
00 00964419734:611402 1 - 00 88042ca This error...........
|
||||
00 00964419734:611405 1 - 00 88042ca That error...........
|
||||
00 00964419734:611408 1 - 00 88042ca Problem..............
|
||||
|
|
|
@ -72,6 +72,8 @@ On all - write a character to /proc/sysrq-trigger. eg:
|
|||
'b' - Will immediately reboot the system without syncing or unmounting
|
||||
your disks.
|
||||
|
||||
'c' - Will perform a kexec reboot in order to take a crashdump.
|
||||
|
||||
'o' - Will shut your system off (if configured and supported).
|
||||
|
||||
's' - Will attempt to sync all mounted filesystems.
|
||||
|
@ -122,6 +124,9 @@ useful when you want to exit a program that will not let you switch consoles.
|
|||
re'B'oot is good when you're unable to shut down. But you should also 'S'ync
|
||||
and 'U'mount first.
|
||||
|
||||
'C'rashdump can be used to manually trigger a crashdump when the system is hung.
|
||||
The kernel needs to have been built with CONFIG_KEXEC enabled.
|
||||
|
||||
'S'ync is great when your system is locked up, it allows you to sync your
|
||||
disks and will certainly lessen the chance of data loss and fscking. Note
|
||||
that the sync hasn't taken place until you see the "OK" and "Done" appear
|
||||
|
|
21
MAINTAINERS
21
MAINTAINERS
|
@ -576,10 +576,9 @@ S: Supported
|
|||
|
||||
COMPUTONE INTELLIPORT MULTIPORT CARD
|
||||
P: Michael H. Warfield
|
||||
M: Michael H. Warfield <mhw@wittsend.com>
|
||||
M: mhw@wittsend.com
|
||||
W: http://www.wittsend.com/computone.html
|
||||
L: linux-computone@lazuli.wittsend.com
|
||||
S: Orphaned
|
||||
S: Maintained
|
||||
|
||||
COSA/SRP SYNC SERIAL DRIVER
|
||||
P: Jan "Yenya" Kasprzak
|
||||
|
@ -1330,6 +1329,16 @@ M: rml@novell.com
|
|||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
KEXEC
|
||||
P: Eric Biederman
|
||||
P: Randy Dunlap
|
||||
M: ebiederm@xmission.com
|
||||
M: rddunlap@osdl.org
|
||||
W: http://www.xmission.com/~ebiederm/files/kexec/
|
||||
L: linux-kernel@vger.kernel.org
|
||||
L: fastboot@osdl.org
|
||||
S: Maintained
|
||||
|
||||
LANMEDIA WAN CARD DRIVER
|
||||
P: Andrew Stanley-Jones
|
||||
M: asj@lanmedia.com
|
||||
|
@ -2115,9 +2124,7 @@ S: Maintained
|
|||
SOFTWARE SUSPEND:
|
||||
P: Pavel Machek
|
||||
M: pavel@suse.cz
|
||||
M: pavel@ucw.cz
|
||||
L: http://lister.fornax.hu/mailman/listinfo/swsusp
|
||||
W: http://swsusp.sf.net/
|
||||
L: linux-pm@osdl.org
|
||||
S: Maintained
|
||||
|
||||
SONIC NETWORK DRIVER
|
||||
|
@ -2594,7 +2601,7 @@ M: davidm@snapgear.com
|
|||
P: D. Jeff Dionne (created first uClinux port)
|
||||
M: jeff@uclinux.org
|
||||
W: http://www.uclinux.org/
|
||||
L: uclinux-dev@uclinux.org
|
||||
L: uclinux-dev@uclinux.org (subscribers-only)
|
||||
S: Maintained
|
||||
|
||||
UCLINUX FOR NEC V850
|
||||
|
|
2
Makefile
2
Makefile
|
@ -281,7 +281,7 @@ export quiet Q KBUILD_VERBOSE
|
|||
# See documentation in Documentation/kbuild/makefiles.txt
|
||||
|
||||
# cc-option
|
||||
# Usage: cflags-y += $(call gcc-option, -march=winchip-c6, -march=i586)
|
||||
# Usage: cflags-y += $(call cc-option, -march=winchip-c6, -march=i586)
|
||||
|
||||
cc-option = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \
|
||||
> /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)
|
||||
|
|
|
@ -157,7 +157,7 @@ config ARCH_RPC
|
|||
config ARCH_SA1100
|
||||
bool "SA1100-based"
|
||||
select ISA
|
||||
select DISCONTIGMEM
|
||||
select ARCH_DISCONTIGMEM_ENABLE
|
||||
|
||||
config ARCH_S3C2410
|
||||
bool "Samsung S3C2410"
|
||||
|
@ -346,6 +346,21 @@ config PREEMPT
|
|||
Say Y here if you are building a kernel for a desktop, embedded
|
||||
or real-time system. Say N if you are unsure.
|
||||
|
||||
config NO_IDLE_HZ
|
||||
bool "Dynamic tick timer"
|
||||
help
|
||||
Select this option if you want to disable continuous timer ticks
|
||||
and have them programmed to occur as required. This option saves
|
||||
power as the system can remain in idle state for longer.
|
||||
|
||||
By default dynamic tick is disabled during the boot, and can be
|
||||
manually enabled with:
|
||||
|
||||
echo 1 > /sys/devices/system/timer/timer0/dyn_tick
|
||||
|
||||
Alternatively, if you want dynamic tick automatically enabled
|
||||
during boot, pass "dyntick=enable" via the kernel command string.
|
||||
|
||||
config ARCH_DISCONTIGMEM_ENABLE
|
||||
bool
|
||||
default (ARCH_LH7A40X && !LH7A40X_CONTIGMEM)
|
||||
|
|
|
@ -1,14 +1,13 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.12-rc1-bk2
|
||||
# Sun Mar 27 22:08:24 2005
|
||||
# Linux kernel version: 2.6.12-git6
|
||||
# Sat Jun 25 00:57:29 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_UID16=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_IOMAP=y
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
|
@ -16,6 +15,7 @@ CONFIG_GENERIC_IOMAP=y
|
|||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_CLEAN_COMPILE=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
|
@ -35,6 +35,8 @@ CONFIG_EMBEDDED=y
|
|||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
|
@ -82,6 +84,7 @@ CONFIG_ARCH_IXP2000=y
|
|||
# CONFIG_ARCH_VERSATILE is not set
|
||||
# CONFIG_ARCH_IMX is not set
|
||||
# CONFIG_ARCH_H720X is not set
|
||||
# CONFIG_ARCH_AAEC2000 is not set
|
||||
CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y
|
||||
|
||||
#
|
||||
|
@ -96,6 +99,7 @@ CONFIG_ARCH_ENP2611=y
|
|||
# CONFIG_ARCH_IXDP2800 is not set
|
||||
# CONFIG_ARCH_IXDP2401 is not set
|
||||
# CONFIG_ARCH_IXDP2801 is not set
|
||||
# CONFIG_IXP2000_SUPPORT_BROKEN_PCI_IO is not set
|
||||
|
||||
#
|
||||
# Processor Type
|
||||
|
@ -106,7 +110,6 @@ CONFIG_CPU_32v5=y
|
|||
CONFIG_CPU_ABRT_EV5T=y
|
||||
CONFIG_CPU_CACHE_VIVT=y
|
||||
CONFIG_CPU_TLB_V4WBI=y
|
||||
CONFIG_CPU_MINICACHE=y
|
||||
|
||||
#
|
||||
# Processor Features
|
||||
|
@ -118,9 +121,11 @@ CONFIG_XSCALE_PMU=y
|
|||
#
|
||||
# Bus support
|
||||
#
|
||||
CONFIG_ISA_DMA_API=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_LEGACY_PROC=y
|
||||
CONFIG_PCI_NAMES=y
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
|
@ -130,7 +135,15 @@ CONFIG_PCI_NAMES=y
|
|||
#
|
||||
# Kernel Features
|
||||
#
|
||||
# CONFIG_SMP is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
|
||||
#
|
||||
|
@ -269,7 +282,6 @@ CONFIG_MTD_IXP2000=y
|
|||
#
|
||||
# Block devices
|
||||
#
|
||||
# CONFIG_BLK_DEV_FD is not set
|
||||
# CONFIG_BLK_CPQ_DA is not set
|
||||
# CONFIG_BLK_CPQ_CISS_DA is not set
|
||||
# CONFIG_BLK_DEV_DAC960 is not set
|
||||
|
@ -308,6 +320,7 @@ CONFIG_IOSCHED_CFQ=y
|
|||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_FUSION is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
|
@ -329,10 +342,11 @@ CONFIG_NET=y
|
|||
#
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_PACKET_MMAP=y
|
||||
# CONFIG_NETLINK_DEV is not set
|
||||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
# CONFIG_IP_FIB_TRIE is not set
|
||||
# CONFIG_IP_MULTICAST is not set
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_PNP=y
|
||||
|
@ -349,6 +363,17 @@ CONFIG_SYN_COOKIES=y
|
|||
# CONFIG_INET_TUNNEL is not set
|
||||
# CONFIG_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
|
||||
#
|
||||
# TCP congestion control
|
||||
#
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
CONFIG_TCP_CONG_WESTWOOD=m
|
||||
CONFIG_TCP_CONG_HTCP=m
|
||||
# CONFIG_TCP_CONG_HSTCP is not set
|
||||
# CONFIG_TCP_CONG_HYBLA is not set
|
||||
# CONFIG_TCP_CONG_VEGAS is not set
|
||||
# CONFIG_TCP_CONG_SCALABLE is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
|
@ -404,6 +429,7 @@ CONFIG_MII=y
|
|||
# CONFIG_SUNGEM is not set
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
# CONFIG_SMC91X is not set
|
||||
# CONFIG_DM9000 is not set
|
||||
|
||||
#
|
||||
# Tulip family network device support
|
||||
|
@ -440,9 +466,11 @@ CONFIG_EEPRO100=y
|
|||
# CONFIG_HAMACHI is not set
|
||||
# CONFIG_YELLOWFIN is not set
|
||||
# CONFIG_R8169 is not set
|
||||
# CONFIG_SKGE is not set
|
||||
# CONFIG_SK98LIN is not set
|
||||
# CONFIG_VIA_VELOCITY is not set
|
||||
# CONFIG_TIGON3 is not set
|
||||
# CONFIG_BNX2 is not set
|
||||
|
||||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
|
@ -464,6 +492,7 @@ CONFIG_EEPRO100=y
|
|||
# Wan interfaces
|
||||
#
|
||||
CONFIG_WAN=y
|
||||
# CONFIG_DSCC4 is not set
|
||||
# CONFIG_LANMEDIA is not set
|
||||
# CONFIG_SYNCLINK_SYNCPPP is not set
|
||||
CONFIG_HDLC=y
|
||||
|
@ -526,7 +555,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
|||
#
|
||||
# CONFIG_SERIO is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
CONFIG_SOUND_GAMEPORT=y
|
||||
|
||||
#
|
||||
# Character devices
|
||||
|
@ -547,6 +575,7 @@ CONFIG_SERIAL_8250_NR_UARTS=2
|
|||
#
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
# CONFIG_SERIAL_JSM is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=256
|
||||
|
@ -613,17 +642,18 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# CONFIG_I2C_AMD8111 is not set
|
||||
# CONFIG_I2C_I801 is not set
|
||||
# CONFIG_I2C_I810 is not set
|
||||
# CONFIG_I2C_PIIX4 is not set
|
||||
# CONFIG_I2C_ISA is not set
|
||||
# CONFIG_I2C_IXP2000 is not set
|
||||
# CONFIG_I2C_NFORCE2 is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_PIIX4 is not set
|
||||
# CONFIG_I2C_PROSAVAGE is not set
|
||||
# CONFIG_I2C_SAVAGE4 is not set
|
||||
# CONFIG_SCx200_ACB is not set
|
||||
# CONFIG_I2C_SIS5595 is not set
|
||||
# CONFIG_I2C_SIS630 is not set
|
||||
# CONFIG_I2C_SIS96X is not set
|
||||
# CONFIG_I2C_STUB is not set
|
||||
# CONFIG_I2C_VIA is not set
|
||||
# CONFIG_I2C_VIAPRO is not set
|
||||
# CONFIG_I2C_VOODOO3 is not set
|
||||
|
@ -637,7 +667,9 @@ CONFIG_I2C_SENSOR=y
|
|||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
# CONFIG_SENSORS_ADM1031 is not set
|
||||
# CONFIG_SENSORS_ADM9240 is not set
|
||||
# CONFIG_SENSORS_ASB100 is not set
|
||||
# CONFIG_SENSORS_ATXP1 is not set
|
||||
# CONFIG_SENSORS_DS1621 is not set
|
||||
# CONFIG_SENSORS_FSCHER is not set
|
||||
# CONFIG_SENSORS_FSCPOS is not set
|
||||
|
@ -653,6 +685,7 @@ CONFIG_I2C_SENSOR=y
|
|||
# CONFIG_SENSORS_LM85 is not set
|
||||
# CONFIG_SENSORS_LM87 is not set
|
||||
# CONFIG_SENSORS_LM90 is not set
|
||||
# CONFIG_SENSORS_LM92 is not set
|
||||
# CONFIG_SENSORS_MAX1619 is not set
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
|
@ -662,14 +695,19 @@ CONFIG_I2C_SENSOR=y
|
|||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
|
||||
#
|
||||
# Other I2C Chip support
|
||||
#
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
CONFIG_SENSORS_EEPROM=y
|
||||
# CONFIG_SENSORS_PCF8574 is not set
|
||||
# CONFIG_SENSORS_PCA9539 is not set
|
||||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_RTC8564 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
|
@ -723,6 +761,7 @@ CONFIG_EXT2_FS=y
|
|||
CONFIG_EXT2_FS_XATTR=y
|
||||
CONFIG_EXT2_FS_POSIX_ACL=y
|
||||
# CONFIG_EXT2_FS_SECURITY is not set
|
||||
# CONFIG_EXT2_FS_XIP is not set
|
||||
CONFIG_EXT3_FS=y
|
||||
CONFIG_EXT3_FS_XATTR=y
|
||||
CONFIG_EXT3_FS_POSIX_ACL=y
|
||||
|
@ -763,7 +802,6 @@ CONFIG_DNOTIFY=y
|
|||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_DEVFS_FS is not set
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_XATTR is not set
|
||||
|
@ -801,12 +839,14 @@ CONFIG_JFFS2_RTIME=y
|
|||
#
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
# CONFIG_NFS_V3_ACL is not set
|
||||
# CONFIG_NFS_V4 is not set
|
||||
# CONFIG_NFS_DIRECTIO is not set
|
||||
# CONFIG_NFSD is not set
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_LOCKD=y
|
||||
CONFIG_LOCKD_V4=y
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=y
|
||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
|
@ -891,3 +931,4 @@ CONFIG_CRC32=y
|
|||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
# CONFIG_TEXTSEARCH is not set
|
||||
|
|
|
@ -1,14 +1,13 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.12-rc1-bk2
|
||||
# Sun Mar 27 21:13:38 2005
|
||||
# Linux kernel version: 2.6.12-git6
|
||||
# Sat Jun 25 00:58:38 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_UID16=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_IOMAP=y
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
|
@ -16,6 +15,7 @@ CONFIG_GENERIC_IOMAP=y
|
|||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_CLEAN_COMPILE=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
|
@ -35,6 +35,8 @@ CONFIG_EMBEDDED=y
|
|||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
|
@ -82,6 +84,7 @@ CONFIG_ARCH_IXP2000=y
|
|||
# CONFIG_ARCH_VERSATILE is not set
|
||||
# CONFIG_ARCH_IMX is not set
|
||||
# CONFIG_ARCH_H720X is not set
|
||||
# CONFIG_ARCH_AAEC2000 is not set
|
||||
CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y
|
||||
|
||||
#
|
||||
|
@ -97,6 +100,7 @@ CONFIG_ARCH_IXDP2400=y
|
|||
CONFIG_ARCH_IXDP2X00=y
|
||||
# CONFIG_ARCH_IXDP2401 is not set
|
||||
# CONFIG_ARCH_IXDP2801 is not set
|
||||
# CONFIG_IXP2000_SUPPORT_BROKEN_PCI_IO is not set
|
||||
|
||||
#
|
||||
# Processor Type
|
||||
|
@ -107,7 +111,6 @@ CONFIG_CPU_32v5=y
|
|||
CONFIG_CPU_ABRT_EV5T=y
|
||||
CONFIG_CPU_CACHE_VIVT=y
|
||||
CONFIG_CPU_TLB_V4WBI=y
|
||||
CONFIG_CPU_MINICACHE=y
|
||||
|
||||
#
|
||||
# Processor Features
|
||||
|
@ -119,9 +122,11 @@ CONFIG_XSCALE_PMU=y
|
|||
#
|
||||
# Bus support
|
||||
#
|
||||
CONFIG_ISA_DMA_API=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_LEGACY_PROC=y
|
||||
CONFIG_PCI_NAMES=y
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
|
@ -131,7 +136,15 @@ CONFIG_PCI_NAMES=y
|
|||
#
|
||||
# Kernel Features
|
||||
#
|
||||
# CONFIG_SMP is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
|
||||
#
|
||||
|
@ -270,7 +283,6 @@ CONFIG_MTD_IXP2000=y
|
|||
#
|
||||
# Block devices
|
||||
#
|
||||
# CONFIG_BLK_DEV_FD is not set
|
||||
# CONFIG_BLK_CPQ_DA is not set
|
||||
# CONFIG_BLK_CPQ_CISS_DA is not set
|
||||
# CONFIG_BLK_DEV_DAC960 is not set
|
||||
|
@ -309,6 +321,7 @@ CONFIG_IOSCHED_CFQ=y
|
|||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_FUSION is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
|
@ -330,10 +343,11 @@ CONFIG_NET=y
|
|||
#
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_PACKET_MMAP=y
|
||||
# CONFIG_NETLINK_DEV is not set
|
||||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
# CONFIG_IP_FIB_TRIE is not set
|
||||
# CONFIG_IP_MULTICAST is not set
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_PNP=y
|
||||
|
@ -350,6 +364,17 @@ CONFIG_SYN_COOKIES=y
|
|||
# CONFIG_INET_TUNNEL is not set
|
||||
# CONFIG_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
|
||||
#
|
||||
# TCP congestion control
|
||||
#
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
CONFIG_TCP_CONG_WESTWOOD=m
|
||||
CONFIG_TCP_CONG_HTCP=m
|
||||
# CONFIG_TCP_CONG_HSTCP is not set
|
||||
# CONFIG_TCP_CONG_HYBLA is not set
|
||||
# CONFIG_TCP_CONG_VEGAS is not set
|
||||
# CONFIG_TCP_CONG_SCALABLE is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
|
@ -405,6 +430,7 @@ CONFIG_MII=y
|
|||
# CONFIG_SUNGEM is not set
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
# CONFIG_SMC91X is not set
|
||||
# CONFIG_DM9000 is not set
|
||||
|
||||
#
|
||||
# Tulip family network device support
|
||||
|
@ -441,9 +467,11 @@ CONFIG_EEPRO100=y
|
|||
# CONFIG_HAMACHI is not set
|
||||
# CONFIG_YELLOWFIN is not set
|
||||
# CONFIG_R8169 is not set
|
||||
# CONFIG_SKGE is not set
|
||||
# CONFIG_SK98LIN is not set
|
||||
# CONFIG_VIA_VELOCITY is not set
|
||||
# CONFIG_TIGON3 is not set
|
||||
# CONFIG_BNX2 is not set
|
||||
|
||||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
|
@ -465,6 +493,7 @@ CONFIG_EEPRO100=y
|
|||
# Wan interfaces
|
||||
#
|
||||
CONFIG_WAN=y
|
||||
# CONFIG_DSCC4 is not set
|
||||
# CONFIG_LANMEDIA is not set
|
||||
# CONFIG_SYNCLINK_SYNCPPP is not set
|
||||
CONFIG_HDLC=y
|
||||
|
@ -527,7 +556,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
|||
#
|
||||
# CONFIG_SERIO is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
CONFIG_SOUND_GAMEPORT=y
|
||||
|
||||
#
|
||||
# Character devices
|
||||
|
@ -548,6 +576,7 @@ CONFIG_SERIAL_8250_NR_UARTS=2
|
|||
#
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
# CONFIG_SERIAL_JSM is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=256
|
||||
|
@ -614,17 +643,18 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# CONFIG_I2C_AMD8111 is not set
|
||||
# CONFIG_I2C_I801 is not set
|
||||
# CONFIG_I2C_I810 is not set
|
||||
# CONFIG_I2C_PIIX4 is not set
|
||||
# CONFIG_I2C_ISA is not set
|
||||
# CONFIG_I2C_IXP2000 is not set
|
||||
# CONFIG_I2C_NFORCE2 is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_PIIX4 is not set
|
||||
# CONFIG_I2C_PROSAVAGE is not set
|
||||
# CONFIG_I2C_SAVAGE4 is not set
|
||||
# CONFIG_SCx200_ACB is not set
|
||||
# CONFIG_I2C_SIS5595 is not set
|
||||
# CONFIG_I2C_SIS630 is not set
|
||||
# CONFIG_I2C_SIS96X is not set
|
||||
# CONFIG_I2C_STUB is not set
|
||||
# CONFIG_I2C_VIA is not set
|
||||
# CONFIG_I2C_VIAPRO is not set
|
||||
# CONFIG_I2C_VOODOO3 is not set
|
||||
|
@ -638,7 +668,9 @@ CONFIG_I2C_SENSOR=y
|
|||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
# CONFIG_SENSORS_ADM1031 is not set
|
||||
# CONFIG_SENSORS_ADM9240 is not set
|
||||
# CONFIG_SENSORS_ASB100 is not set
|
||||
# CONFIG_SENSORS_ATXP1 is not set
|
||||
# CONFIG_SENSORS_DS1621 is not set
|
||||
# CONFIG_SENSORS_FSCHER is not set
|
||||
# CONFIG_SENSORS_FSCPOS is not set
|
||||
|
@ -654,6 +686,7 @@ CONFIG_I2C_SENSOR=y
|
|||
# CONFIG_SENSORS_LM85 is not set
|
||||
# CONFIG_SENSORS_LM87 is not set
|
||||
# CONFIG_SENSORS_LM90 is not set
|
||||
# CONFIG_SENSORS_LM92 is not set
|
||||
# CONFIG_SENSORS_MAX1619 is not set
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
|
@ -663,14 +696,19 @@ CONFIG_I2C_SENSOR=y
|
|||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
|
||||
#
|
||||
# Other I2C Chip support
|
||||
#
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
CONFIG_SENSORS_EEPROM=y
|
||||
# CONFIG_SENSORS_PCF8574 is not set
|
||||
# CONFIG_SENSORS_PCA9539 is not set
|
||||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_RTC8564 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
|
@ -724,6 +762,7 @@ CONFIG_EXT2_FS=y
|
|||
CONFIG_EXT2_FS_XATTR=y
|
||||
CONFIG_EXT2_FS_POSIX_ACL=y
|
||||
# CONFIG_EXT2_FS_SECURITY is not set
|
||||
# CONFIG_EXT2_FS_XIP is not set
|
||||
CONFIG_EXT3_FS=y
|
||||
CONFIG_EXT3_FS_XATTR=y
|
||||
CONFIG_EXT3_FS_POSIX_ACL=y
|
||||
|
@ -764,7 +803,6 @@ CONFIG_DNOTIFY=y
|
|||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_DEVFS_FS is not set
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_XATTR is not set
|
||||
|
@ -802,12 +840,14 @@ CONFIG_JFFS2_RTIME=y
|
|||
#
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
# CONFIG_NFS_V3_ACL is not set
|
||||
# CONFIG_NFS_V4 is not set
|
||||
# CONFIG_NFS_DIRECTIO is not set
|
||||
# CONFIG_NFSD is not set
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_LOCKD=y
|
||||
CONFIG_LOCKD_V4=y
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=y
|
||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
|
@ -892,3 +932,4 @@ CONFIG_CRC32=y
|
|||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
# CONFIG_TEXTSEARCH is not set
|
||||
|
|
|
@ -1,14 +1,13 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.12-rc1-bk2
|
||||
# Sun Mar 27 21:53:55 2005
|
||||
# Linux kernel version: 2.6.12-git6
|
||||
# Sat Jun 25 00:59:35 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_UID16=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_IOMAP=y
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
|
@ -16,6 +15,7 @@ CONFIG_GENERIC_IOMAP=y
|
|||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_CLEAN_COMPILE=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
|
@ -35,6 +35,8 @@ CONFIG_EMBEDDED=y
|
|||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
|
@ -82,6 +84,7 @@ CONFIG_ARCH_IXP2000=y
|
|||
# CONFIG_ARCH_VERSATILE is not set
|
||||
# CONFIG_ARCH_IMX is not set
|
||||
# CONFIG_ARCH_H720X is not set
|
||||
# CONFIG_ARCH_AAEC2000 is not set
|
||||
CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y
|
||||
|
||||
#
|
||||
|
@ -97,6 +100,7 @@ CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y
|
|||
CONFIG_ARCH_IXDP2401=y
|
||||
# CONFIG_ARCH_IXDP2801 is not set
|
||||
CONFIG_ARCH_IXDP2X01=y
|
||||
# CONFIG_IXP2000_SUPPORT_BROKEN_PCI_IO is not set
|
||||
|
||||
#
|
||||
# Processor Type
|
||||
|
@ -107,7 +111,6 @@ CONFIG_CPU_32v5=y
|
|||
CONFIG_CPU_ABRT_EV5T=y
|
||||
CONFIG_CPU_CACHE_VIVT=y
|
||||
CONFIG_CPU_TLB_V4WBI=y
|
||||
CONFIG_CPU_MINICACHE=y
|
||||
|
||||
#
|
||||
# Processor Features
|
||||
|
@ -119,9 +122,11 @@ CONFIG_XSCALE_PMU=y
|
|||
#
|
||||
# Bus support
|
||||
#
|
||||
CONFIG_ISA_DMA_API=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_LEGACY_PROC=y
|
||||
CONFIG_PCI_NAMES=y
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
|
@ -131,7 +136,15 @@ CONFIG_PCI_NAMES=y
|
|||
#
|
||||
# Kernel Features
|
||||
#
|
||||
# CONFIG_SMP is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
|
||||
#
|
||||
|
@ -270,7 +283,6 @@ CONFIG_MTD_IXP2000=y
|
|||
#
|
||||
# Block devices
|
||||
#
|
||||
# CONFIG_BLK_DEV_FD is not set
|
||||
# CONFIG_BLK_CPQ_DA is not set
|
||||
# CONFIG_BLK_CPQ_CISS_DA is not set
|
||||
# CONFIG_BLK_DEV_DAC960 is not set
|
||||
|
@ -309,6 +321,7 @@ CONFIG_IOSCHED_CFQ=y
|
|||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_FUSION is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
|
@ -330,10 +343,11 @@ CONFIG_NET=y
|
|||
#
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_PACKET_MMAP=y
|
||||
# CONFIG_NETLINK_DEV is not set
|
||||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
# CONFIG_IP_FIB_TRIE is not set
|
||||
# CONFIG_IP_MULTICAST is not set
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_PNP=y
|
||||
|
@ -350,6 +364,17 @@ CONFIG_SYN_COOKIES=y
|
|||
# CONFIG_INET_TUNNEL is not set
|
||||
CONFIG_IP_TCPDIAG=y
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
|
||||
#
|
||||
# TCP congestion control
|
||||
#
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
CONFIG_TCP_CONG_WESTWOOD=m
|
||||
CONFIG_TCP_CONG_HTCP=m
|
||||
# CONFIG_TCP_CONG_HSTCP is not set
|
||||
# CONFIG_TCP_CONG_HYBLA is not set
|
||||
# CONFIG_TCP_CONG_VEGAS is not set
|
||||
# CONFIG_TCP_CONG_SCALABLE is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
|
@ -405,6 +430,7 @@ CONFIG_MII=y
|
|||
# CONFIG_SUNGEM is not set
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
# CONFIG_SMC91X is not set
|
||||
# CONFIG_DM9000 is not set
|
||||
|
||||
#
|
||||
# Tulip family network device support
|
||||
|
@ -442,9 +468,11 @@ CONFIG_EEPRO100=y
|
|||
# CONFIG_HAMACHI is not set
|
||||
# CONFIG_YELLOWFIN is not set
|
||||
# CONFIG_R8169 is not set
|
||||
# CONFIG_SKGE is not set
|
||||
# CONFIG_SK98LIN is not set
|
||||
# CONFIG_VIA_VELOCITY is not set
|
||||
# CONFIG_TIGON3 is not set
|
||||
# CONFIG_BNX2 is not set
|
||||
|
||||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
|
@ -466,6 +494,7 @@ CONFIG_EEPRO100=y
|
|||
# Wan interfaces
|
||||
#
|
||||
CONFIG_WAN=y
|
||||
# CONFIG_DSCC4 is not set
|
||||
# CONFIG_LANMEDIA is not set
|
||||
# CONFIG_SYNCLINK_SYNCPPP is not set
|
||||
CONFIG_HDLC=y
|
||||
|
@ -528,7 +557,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
|||
#
|
||||
# CONFIG_SERIO is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
CONFIG_SOUND_GAMEPORT=y
|
||||
|
||||
#
|
||||
# Character devices
|
||||
|
@ -549,6 +577,7 @@ CONFIG_SERIAL_8250_NR_UARTS=2
|
|||
#
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
# CONFIG_SERIAL_JSM is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=256
|
||||
|
@ -615,17 +644,18 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# CONFIG_I2C_AMD8111 is not set
|
||||
# CONFIG_I2C_I801 is not set
|
||||
# CONFIG_I2C_I810 is not set
|
||||
# CONFIG_I2C_PIIX4 is not set
|
||||
# CONFIG_I2C_ISA is not set
|
||||
# CONFIG_I2C_IXP2000 is not set
|
||||
# CONFIG_I2C_NFORCE2 is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_PIIX4 is not set
|
||||
# CONFIG_I2C_PROSAVAGE is not set
|
||||
# CONFIG_I2C_SAVAGE4 is not set
|
||||
# CONFIG_SCx200_ACB is not set
|
||||
# CONFIG_I2C_SIS5595 is not set
|
||||
# CONFIG_I2C_SIS630 is not set
|
||||
# CONFIG_I2C_SIS96X is not set
|
||||
# CONFIG_I2C_STUB is not set
|
||||
# CONFIG_I2C_VIA is not set
|
||||
# CONFIG_I2C_VIAPRO is not set
|
||||
# CONFIG_I2C_VOODOO3 is not set
|
||||
|
@ -639,7 +669,9 @@ CONFIG_I2C_SENSOR=y
|
|||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
# CONFIG_SENSORS_ADM1031 is not set
|
||||
# CONFIG_SENSORS_ADM9240 is not set
|
||||
# CONFIG_SENSORS_ASB100 is not set
|
||||
# CONFIG_SENSORS_ATXP1 is not set
|
||||
# CONFIG_SENSORS_DS1621 is not set
|
||||
# CONFIG_SENSORS_FSCHER is not set
|
||||
# CONFIG_SENSORS_FSCPOS is not set
|
||||
|
@ -655,6 +687,7 @@ CONFIG_I2C_SENSOR=y
|
|||
# CONFIG_SENSORS_LM85 is not set
|
||||
# CONFIG_SENSORS_LM87 is not set
|
||||
# CONFIG_SENSORS_LM90 is not set
|
||||
# CONFIG_SENSORS_LM92 is not set
|
||||
# CONFIG_SENSORS_MAX1619 is not set
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
|
@ -664,14 +697,19 @@ CONFIG_I2C_SENSOR=y
|
|||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
|
||||
#
|
||||
# Other I2C Chip support
|
||||
#
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
CONFIG_SENSORS_EEPROM=y
|
||||
# CONFIG_SENSORS_PCF8574 is not set
|
||||
# CONFIG_SENSORS_PCA9539 is not set
|
||||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_RTC8564 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
|
@ -725,6 +763,7 @@ CONFIG_EXT2_FS=y
|
|||
CONFIG_EXT2_FS_XATTR=y
|
||||
CONFIG_EXT2_FS_POSIX_ACL=y
|
||||
# CONFIG_EXT2_FS_SECURITY is not set
|
||||
# CONFIG_EXT2_FS_XIP is not set
|
||||
CONFIG_EXT3_FS=y
|
||||
CONFIG_EXT3_FS_XATTR=y
|
||||
CONFIG_EXT3_FS_POSIX_ACL=y
|
||||
|
@ -765,7 +804,6 @@ CONFIG_DNOTIFY=y
|
|||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_DEVFS_FS is not set
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_XATTR is not set
|
||||
|
@ -803,12 +841,14 @@ CONFIG_JFFS2_RTIME=y
|
|||
#
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
# CONFIG_NFS_V3_ACL is not set
|
||||
# CONFIG_NFS_V4 is not set
|
||||
# CONFIG_NFS_DIRECTIO is not set
|
||||
# CONFIG_NFSD is not set
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_LOCKD=y
|
||||
CONFIG_LOCKD_V4=y
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=y
|
||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
|
@ -893,3 +933,4 @@ CONFIG_CRC32=y
|
|||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
# CONFIG_TEXTSEARCH is not set
|
||||
|
|
|
@ -1,14 +1,13 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.12-rc1-bk2
|
||||
# Sun Mar 27 22:15:23 2005
|
||||
# Linux kernel version: 2.6.12-git6
|
||||
# Sat Jun 25 01:00:27 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_UID16=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_IOMAP=y
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
|
@ -16,6 +15,7 @@ CONFIG_GENERIC_IOMAP=y
|
|||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_CLEAN_COMPILE=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
|
@ -35,6 +35,8 @@ CONFIG_EMBEDDED=y
|
|||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
|
@ -82,6 +84,7 @@ CONFIG_ARCH_IXP2000=y
|
|||
# CONFIG_ARCH_VERSATILE is not set
|
||||
# CONFIG_ARCH_IMX is not set
|
||||
# CONFIG_ARCH_H720X is not set
|
||||
# CONFIG_ARCH_AAEC2000 is not set
|
||||
CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y
|
||||
|
||||
#
|
||||
|
@ -97,6 +100,7 @@ CONFIG_ARCH_IXDP2800=y
|
|||
CONFIG_ARCH_IXDP2X00=y
|
||||
# CONFIG_ARCH_IXDP2401 is not set
|
||||
# CONFIG_ARCH_IXDP2801 is not set
|
||||
# CONFIG_IXP2000_SUPPORT_BROKEN_PCI_IO is not set
|
||||
|
||||
#
|
||||
# Processor Type
|
||||
|
@ -107,7 +111,6 @@ CONFIG_CPU_32v5=y
|
|||
CONFIG_CPU_ABRT_EV5T=y
|
||||
CONFIG_CPU_CACHE_VIVT=y
|
||||
CONFIG_CPU_TLB_V4WBI=y
|
||||
CONFIG_CPU_MINICACHE=y
|
||||
|
||||
#
|
||||
# Processor Features
|
||||
|
@ -119,9 +122,11 @@ CONFIG_XSCALE_PMU=y
|
|||
#
|
||||
# Bus support
|
||||
#
|
||||
CONFIG_ISA_DMA_API=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_LEGACY_PROC=y
|
||||
CONFIG_PCI_NAMES=y
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
|
@ -131,7 +136,15 @@ CONFIG_PCI_NAMES=y
|
|||
#
|
||||
# Kernel Features
|
||||
#
|
||||
# CONFIG_SMP is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
|
||||
#
|
||||
|
@ -270,7 +283,6 @@ CONFIG_MTD_IXP2000=y
|
|||
#
|
||||
# Block devices
|
||||
#
|
||||
# CONFIG_BLK_DEV_FD is not set
|
||||
# CONFIG_BLK_CPQ_DA is not set
|
||||
# CONFIG_BLK_CPQ_CISS_DA is not set
|
||||
# CONFIG_BLK_DEV_DAC960 is not set
|
||||
|
@ -309,6 +321,7 @@ CONFIG_IOSCHED_CFQ=y
|
|||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_FUSION is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
|
@ -330,10 +343,11 @@ CONFIG_NET=y
|
|||
#
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_PACKET_MMAP=y
|
||||
# CONFIG_NETLINK_DEV is not set
|
||||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
# CONFIG_IP_FIB_TRIE is not set
|
||||
# CONFIG_IP_MULTICAST is not set
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_PNP=y
|
||||
|
@ -350,6 +364,17 @@ CONFIG_SYN_COOKIES=y
|
|||
# CONFIG_INET_TUNNEL is not set
|
||||
# CONFIG_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
|
||||
#
|
||||
# TCP congestion control
|
||||
#
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
CONFIG_TCP_CONG_WESTWOOD=m
|
||||
CONFIG_TCP_CONG_HTCP=m
|
||||
# CONFIG_TCP_CONG_HSTCP is not set
|
||||
# CONFIG_TCP_CONG_HYBLA is not set
|
||||
# CONFIG_TCP_CONG_VEGAS is not set
|
||||
# CONFIG_TCP_CONG_SCALABLE is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
|
@ -405,6 +430,7 @@ CONFIG_MII=y
|
|||
# CONFIG_SUNGEM is not set
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
# CONFIG_SMC91X is not set
|
||||
# CONFIG_DM9000 is not set
|
||||
|
||||
#
|
||||
# Tulip family network device support
|
||||
|
@ -441,9 +467,11 @@ CONFIG_EEPRO100=y
|
|||
# CONFIG_HAMACHI is not set
|
||||
# CONFIG_YELLOWFIN is not set
|
||||
# CONFIG_R8169 is not set
|
||||
# CONFIG_SKGE is not set
|
||||
# CONFIG_SK98LIN is not set
|
||||
# CONFIG_VIA_VELOCITY is not set
|
||||
# CONFIG_TIGON3 is not set
|
||||
# CONFIG_BNX2 is not set
|
||||
|
||||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
|
@ -465,6 +493,7 @@ CONFIG_EEPRO100=y
|
|||
# Wan interfaces
|
||||
#
|
||||
CONFIG_WAN=y
|
||||
# CONFIG_DSCC4 is not set
|
||||
# CONFIG_LANMEDIA is not set
|
||||
# CONFIG_SYNCLINK_SYNCPPP is not set
|
||||
CONFIG_HDLC=y
|
||||
|
@ -527,7 +556,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
|||
#
|
||||
# CONFIG_SERIO is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
CONFIG_SOUND_GAMEPORT=y
|
||||
|
||||
#
|
||||
# Character devices
|
||||
|
@ -548,6 +576,7 @@ CONFIG_SERIAL_8250_NR_UARTS=2
|
|||
#
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
# CONFIG_SERIAL_JSM is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=256
|
||||
|
@ -614,17 +643,18 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# CONFIG_I2C_AMD8111 is not set
|
||||
# CONFIG_I2C_I801 is not set
|
||||
# CONFIG_I2C_I810 is not set
|
||||
# CONFIG_I2C_PIIX4 is not set
|
||||
# CONFIG_I2C_ISA is not set
|
||||
# CONFIG_I2C_IXP2000 is not set
|
||||
# CONFIG_I2C_NFORCE2 is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_PIIX4 is not set
|
||||
# CONFIG_I2C_PROSAVAGE is not set
|
||||
# CONFIG_I2C_SAVAGE4 is not set
|
||||
# CONFIG_SCx200_ACB is not set
|
||||
# CONFIG_I2C_SIS5595 is not set
|
||||
# CONFIG_I2C_SIS630 is not set
|
||||
# CONFIG_I2C_SIS96X is not set
|
||||
# CONFIG_I2C_STUB is not set
|
||||
# CONFIG_I2C_VIA is not set
|
||||
# CONFIG_I2C_VIAPRO is not set
|
||||
# CONFIG_I2C_VOODOO3 is not set
|
||||
|
@ -638,7 +668,9 @@ CONFIG_I2C_SENSOR=y
|
|||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
# CONFIG_SENSORS_ADM1031 is not set
|
||||
# CONFIG_SENSORS_ADM9240 is not set
|
||||
# CONFIG_SENSORS_ASB100 is not set
|
||||
# CONFIG_SENSORS_ATXP1 is not set
|
||||
# CONFIG_SENSORS_DS1621 is not set
|
||||
# CONFIG_SENSORS_FSCHER is not set
|
||||
# CONFIG_SENSORS_FSCPOS is not set
|
||||
|
@ -654,6 +686,7 @@ CONFIG_I2C_SENSOR=y
|
|||
# CONFIG_SENSORS_LM85 is not set
|
||||
# CONFIG_SENSORS_LM87 is not set
|
||||
# CONFIG_SENSORS_LM90 is not set
|
||||
# CONFIG_SENSORS_LM92 is not set
|
||||
# CONFIG_SENSORS_MAX1619 is not set
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
|
@ -663,14 +696,19 @@ CONFIG_I2C_SENSOR=y
|
|||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
|
||||
#
|
||||
# Other I2C Chip support
|
||||
#
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
CONFIG_SENSORS_EEPROM=y
|
||||
# CONFIG_SENSORS_PCF8574 is not set
|
||||
# CONFIG_SENSORS_PCA9539 is not set
|
||||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_RTC8564 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
|
@ -724,6 +762,7 @@ CONFIG_EXT2_FS=y
|
|||
CONFIG_EXT2_FS_XATTR=y
|
||||
CONFIG_EXT2_FS_POSIX_ACL=y
|
||||
# CONFIG_EXT2_FS_SECURITY is not set
|
||||
# CONFIG_EXT2_FS_XIP is not set
|
||||
CONFIG_EXT3_FS=y
|
||||
CONFIG_EXT3_FS_XATTR=y
|
||||
CONFIG_EXT3_FS_POSIX_ACL=y
|
||||
|
@ -764,7 +803,6 @@ CONFIG_DNOTIFY=y
|
|||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_DEVFS_FS is not set
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_XATTR is not set
|
||||
|
@ -802,12 +840,14 @@ CONFIG_JFFS2_RTIME=y
|
|||
#
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
# CONFIG_NFS_V3_ACL is not set
|
||||
# CONFIG_NFS_V4 is not set
|
||||
# CONFIG_NFS_DIRECTIO is not set
|
||||
# CONFIG_NFSD is not set
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_LOCKD=y
|
||||
CONFIG_LOCKD_V4=y
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=y
|
||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
|
@ -892,3 +932,4 @@ CONFIG_CRC32=y
|
|||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
# CONFIG_TEXTSEARCH is not set
|
||||
|
|
|
@ -1,14 +1,13 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.12-rc1-bk2
|
||||
# Sun Mar 27 22:39:19 2005
|
||||
# Linux kernel version: 2.6.12-git6
|
||||
# Sat Jun 25 01:01:18 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_UID16=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_IOMAP=y
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
|
@ -16,6 +15,7 @@ CONFIG_GENERIC_IOMAP=y
|
|||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_CLEAN_COMPILE=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
|
@ -35,6 +35,8 @@ CONFIG_EMBEDDED=y
|
|||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
|
@ -82,6 +84,7 @@ CONFIG_ARCH_IXP2000=y
|
|||
# CONFIG_ARCH_VERSATILE is not set
|
||||
# CONFIG_ARCH_IMX is not set
|
||||
# CONFIG_ARCH_H720X is not set
|
||||
# CONFIG_ARCH_AAEC2000 is not set
|
||||
CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y
|
||||
|
||||
#
|
||||
|
@ -97,6 +100,7 @@ CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y
|
|||
# CONFIG_ARCH_IXDP2401 is not set
|
||||
CONFIG_ARCH_IXDP2801=y
|
||||
CONFIG_ARCH_IXDP2X01=y
|
||||
# CONFIG_IXP2000_SUPPORT_BROKEN_PCI_IO is not set
|
||||
|
||||
#
|
||||
# Processor Type
|
||||
|
@ -107,7 +111,6 @@ CONFIG_CPU_32v5=y
|
|||
CONFIG_CPU_ABRT_EV5T=y
|
||||
CONFIG_CPU_CACHE_VIVT=y
|
||||
CONFIG_CPU_TLB_V4WBI=y
|
||||
CONFIG_CPU_MINICACHE=y
|
||||
|
||||
#
|
||||
# Processor Features
|
||||
|
@ -119,9 +122,11 @@ CONFIG_XSCALE_PMU=y
|
|||
#
|
||||
# Bus support
|
||||
#
|
||||
CONFIG_ISA_DMA_API=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_LEGACY_PROC=y
|
||||
CONFIG_PCI_NAMES=y
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
|
@ -131,7 +136,15 @@ CONFIG_PCI_NAMES=y
|
|||
#
|
||||
# Kernel Features
|
||||
#
|
||||
# CONFIG_SMP is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
|
||||
#
|
||||
|
@ -270,7 +283,6 @@ CONFIG_MTD_IXP2000=y
|
|||
#
|
||||
# Block devices
|
||||
#
|
||||
# CONFIG_BLK_DEV_FD is not set
|
||||
# CONFIG_BLK_CPQ_DA is not set
|
||||
# CONFIG_BLK_CPQ_CISS_DA is not set
|
||||
# CONFIG_BLK_DEV_DAC960 is not set
|
||||
|
@ -309,6 +321,7 @@ CONFIG_IOSCHED_CFQ=y
|
|||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_FUSION is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
|
@ -330,10 +343,11 @@ CONFIG_NET=y
|
|||
#
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_PACKET_MMAP=y
|
||||
# CONFIG_NETLINK_DEV is not set
|
||||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
# CONFIG_IP_FIB_TRIE is not set
|
||||
# CONFIG_IP_MULTICAST is not set
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_PNP=y
|
||||
|
@ -350,6 +364,17 @@ CONFIG_SYN_COOKIES=y
|
|||
# CONFIG_INET_TUNNEL is not set
|
||||
# CONFIG_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
|
||||
#
|
||||
# TCP congestion control
|
||||
#
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
CONFIG_TCP_CONG_WESTWOOD=m
|
||||
CONFIG_TCP_CONG_HTCP=m
|
||||
# CONFIG_TCP_CONG_HSTCP is not set
|
||||
# CONFIG_TCP_CONG_HYBLA is not set
|
||||
# CONFIG_TCP_CONG_VEGAS is not set
|
||||
# CONFIG_TCP_CONG_SCALABLE is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
|
@ -405,6 +430,7 @@ CONFIG_MII=y
|
|||
# CONFIG_SUNGEM is not set
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
# CONFIG_SMC91X is not set
|
||||
# CONFIG_DM9000 is not set
|
||||
|
||||
#
|
||||
# Tulip family network device support
|
||||
|
@ -442,9 +468,11 @@ CONFIG_EEPRO100=y
|
|||
# CONFIG_HAMACHI is not set
|
||||
# CONFIG_YELLOWFIN is not set
|
||||
# CONFIG_R8169 is not set
|
||||
# CONFIG_SKGE is not set
|
||||
# CONFIG_SK98LIN is not set
|
||||
# CONFIG_VIA_VELOCITY is not set
|
||||
# CONFIG_TIGON3 is not set
|
||||
# CONFIG_BNX2 is not set
|
||||
|
||||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
|
@ -466,6 +494,7 @@ CONFIG_EEPRO100=y
|
|||
# Wan interfaces
|
||||
#
|
||||
CONFIG_WAN=y
|
||||
# CONFIG_DSCC4 is not set
|
||||
# CONFIG_LANMEDIA is not set
|
||||
# CONFIG_SYNCLINK_SYNCPPP is not set
|
||||
CONFIG_HDLC=y
|
||||
|
@ -528,7 +557,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
|||
#
|
||||
# CONFIG_SERIO is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
CONFIG_SOUND_GAMEPORT=y
|
||||
|
||||
#
|
||||
# Character devices
|
||||
|
@ -549,6 +577,7 @@ CONFIG_SERIAL_8250_NR_UARTS=2
|
|||
#
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
# CONFIG_SERIAL_JSM is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=256
|
||||
|
@ -615,17 +644,18 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# CONFIG_I2C_AMD8111 is not set
|
||||
# CONFIG_I2C_I801 is not set
|
||||
# CONFIG_I2C_I810 is not set
|
||||
# CONFIG_I2C_PIIX4 is not set
|
||||
# CONFIG_I2C_ISA is not set
|
||||
# CONFIG_I2C_IXP2000 is not set
|
||||
# CONFIG_I2C_NFORCE2 is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_PIIX4 is not set
|
||||
# CONFIG_I2C_PROSAVAGE is not set
|
||||
# CONFIG_I2C_SAVAGE4 is not set
|
||||
# CONFIG_SCx200_ACB is not set
|
||||
# CONFIG_I2C_SIS5595 is not set
|
||||
# CONFIG_I2C_SIS630 is not set
|
||||
# CONFIG_I2C_SIS96X is not set
|
||||
# CONFIG_I2C_STUB is not set
|
||||
# CONFIG_I2C_VIA is not set
|
||||
# CONFIG_I2C_VIAPRO is not set
|
||||
# CONFIG_I2C_VOODOO3 is not set
|
||||
|
@ -639,7 +669,9 @@ CONFIG_I2C_SENSOR=y
|
|||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
# CONFIG_SENSORS_ADM1031 is not set
|
||||
# CONFIG_SENSORS_ADM9240 is not set
|
||||
# CONFIG_SENSORS_ASB100 is not set
|
||||
# CONFIG_SENSORS_ATXP1 is not set
|
||||
# CONFIG_SENSORS_DS1621 is not set
|
||||
# CONFIG_SENSORS_FSCHER is not set
|
||||
# CONFIG_SENSORS_FSCPOS is not set
|
||||
|
@ -655,6 +687,7 @@ CONFIG_I2C_SENSOR=y
|
|||
# CONFIG_SENSORS_LM85 is not set
|
||||
# CONFIG_SENSORS_LM87 is not set
|
||||
# CONFIG_SENSORS_LM90 is not set
|
||||
# CONFIG_SENSORS_LM92 is not set
|
||||
# CONFIG_SENSORS_MAX1619 is not set
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
|
@ -664,14 +697,19 @@ CONFIG_I2C_SENSOR=y
|
|||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
|
||||
#
|
||||
# Other I2C Chip support
|
||||
#
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
CONFIG_SENSORS_EEPROM=y
|
||||
# CONFIG_SENSORS_PCF8574 is not set
|
||||
# CONFIG_SENSORS_PCA9539 is not set
|
||||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_RTC8564 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
|
@ -725,6 +763,7 @@ CONFIG_EXT2_FS=y
|
|||
CONFIG_EXT2_FS_XATTR=y
|
||||
CONFIG_EXT2_FS_POSIX_ACL=y
|
||||
# CONFIG_EXT2_FS_SECURITY is not set
|
||||
# CONFIG_EXT2_FS_XIP is not set
|
||||
CONFIG_EXT3_FS=y
|
||||
CONFIG_EXT3_FS_XATTR=y
|
||||
CONFIG_EXT3_FS_POSIX_ACL=y
|
||||
|
@ -765,7 +804,6 @@ CONFIG_DNOTIFY=y
|
|||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_DEVFS_FS is not set
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_XATTR is not set
|
||||
|
@ -803,12 +841,14 @@ CONFIG_JFFS2_RTIME=y
|
|||
#
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
# CONFIG_NFS_V3_ACL is not set
|
||||
# CONFIG_NFS_V4 is not set
|
||||
# CONFIG_NFS_DIRECTIO is not set
|
||||
# CONFIG_NFSD is not set
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_LOCKD=y
|
||||
CONFIG_LOCKD_V4=y
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=y
|
||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
|
@ -893,3 +933,4 @@ CONFIG_CRC32=y
|
|||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
# CONFIG_TEXTSEARCH is not set
|
||||
|
|
|
@ -4,6 +4,10 @@
|
|||
* Copyright (C) 1992 Linus Torvalds
|
||||
* Modifications for ARM processor Copyright (C) 1995-2000 Russell King.
|
||||
*
|
||||
* Support for Dynamic Tick Timer Copyright (C) 2004-2005 Nokia Corporation.
|
||||
* Dynamic Tick Timer written by Tony Lindgren <tony@atomide.com> and
|
||||
* Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
|
@ -37,6 +41,7 @@
|
|||
#include <asm/irq.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/mach/irq.h>
|
||||
#include <asm/mach/time.h>
|
||||
|
||||
/*
|
||||
* Maximum IRQ count. Currently, this is arbitary. However, it should
|
||||
|
@ -329,6 +334,15 @@ __do_irq(unsigned int irq, struct irqaction *action, struct pt_regs *regs)
|
|||
|
||||
spin_unlock(&irq_controller_lock);
|
||||
|
||||
#ifdef CONFIG_NO_IDLE_HZ
|
||||
if (!(action->flags & SA_TIMER) && system_timer->dyn_tick != NULL) {
|
||||
write_seqlock(&xtime_lock);
|
||||
if (system_timer->dyn_tick->state & DYN_TICK_ENABLED)
|
||||
system_timer->dyn_tick->handler(irq, 0, regs);
|
||||
write_sequnlock(&xtime_lock);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!(action->flags & SA_INTERRUPT))
|
||||
local_irq_enable();
|
||||
|
||||
|
|
|
@ -697,7 +697,7 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall)
|
|||
if (!user_mode(regs))
|
||||
return 0;
|
||||
|
||||
if (try_to_freeze(0))
|
||||
if (try_to_freeze())
|
||||
goto no_signal;
|
||||
|
||||
if (current->ptrace & PT_SINGLESTEP)
|
||||
|
|
|
@ -381,6 +381,95 @@ static struct sysdev_class timer_sysclass = {
|
|||
.resume = timer_resume,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_NO_IDLE_HZ
|
||||
static int timer_dyn_tick_enable(void)
|
||||
{
|
||||
struct dyn_tick_timer *dyn_tick = system_timer->dyn_tick;
|
||||
unsigned long flags;
|
||||
int ret = -ENODEV;
|
||||
|
||||
if (dyn_tick) {
|
||||
write_seqlock_irqsave(&xtime_lock, flags);
|
||||
ret = 0;
|
||||
if (!(dyn_tick->state & DYN_TICK_ENABLED)) {
|
||||
ret = dyn_tick->enable();
|
||||
|
||||
if (ret == 0)
|
||||
dyn_tick->state |= DYN_TICK_ENABLED;
|
||||
}
|
||||
write_sequnlock_irqrestore(&xtime_lock, flags);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int timer_dyn_tick_disable(void)
|
||||
{
|
||||
struct dyn_tick_timer *dyn_tick = system_timer->dyn_tick;
|
||||
unsigned long flags;
|
||||
int ret = -ENODEV;
|
||||
|
||||
if (dyn_tick) {
|
||||
write_seqlock_irqsave(&xtime_lock, flags);
|
||||
ret = 0;
|
||||
if (dyn_tick->state & DYN_TICK_ENABLED) {
|
||||
ret = dyn_tick->disable();
|
||||
|
||||
if (ret == 0)
|
||||
dyn_tick->state &= ~DYN_TICK_ENABLED;
|
||||
}
|
||||
write_sequnlock_irqrestore(&xtime_lock, flags);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void timer_dyn_reprogram(void)
|
||||
{
|
||||
struct dyn_tick_timer *dyn_tick = system_timer->dyn_tick;
|
||||
unsigned long flags;
|
||||
|
||||
write_seqlock_irqsave(&xtime_lock, flags);
|
||||
if (dyn_tick->state & DYN_TICK_ENABLED)
|
||||
dyn_tick->reprogram(next_timer_interrupt() - jiffies);
|
||||
write_sequnlock_irqrestore(&xtime_lock, flags);
|
||||
}
|
||||
|
||||
static ssize_t timer_show_dyn_tick(struct sys_device *dev, char *buf)
|
||||
{
|
||||
return sprintf(buf, "%i\n",
|
||||
(system_timer->dyn_tick->state & DYN_TICK_ENABLED) >> 1);
|
||||
}
|
||||
|
||||
static ssize_t timer_set_dyn_tick(struct sys_device *dev, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
unsigned int enable = simple_strtoul(buf, NULL, 2);
|
||||
|
||||
if (enable)
|
||||
timer_dyn_tick_enable();
|
||||
else
|
||||
timer_dyn_tick_disable();
|
||||
|
||||
return count;
|
||||
}
|
||||
static SYSDEV_ATTR(dyn_tick, 0644, timer_show_dyn_tick, timer_set_dyn_tick);
|
||||
|
||||
/*
|
||||
* dyntick=enable|disable
|
||||
*/
|
||||
static char dyntick_str[4] __initdata = "";
|
||||
|
||||
static int __init dyntick_setup(char *str)
|
||||
{
|
||||
if (str)
|
||||
strlcpy(dyntick_str, str, sizeof(dyntick_str));
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("dyntick=", dyntick_setup);
|
||||
#endif
|
||||
|
||||
static int __init timer_init_sysfs(void)
|
||||
{
|
||||
int ret = sysdev_class_register(&timer_sysclass);
|
||||
|
@ -388,6 +477,20 @@ static int __init timer_init_sysfs(void)
|
|||
system_timer->dev.cls = &timer_sysclass;
|
||||
ret = sysdev_register(&system_timer->dev);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NO_IDLE_HZ
|
||||
if (ret == 0 && system_timer->dyn_tick) {
|
||||
ret = sysdev_create_file(&system_timer->dev, &attr_dyn_tick);
|
||||
|
||||
/*
|
||||
* Turn on dynamic tick after calibrate delay
|
||||
* for correct bogomips
|
||||
*/
|
||||
if (ret == 0 && dyntick_str[0] == 'e')
|
||||
ret = timer_dyn_tick_enable();
|
||||
}
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@ config ARCH_CLEP7312
|
|||
config ARCH_EDB7211
|
||||
bool "EDB7211"
|
||||
select ISA
|
||||
select DISCONTIGMEM
|
||||
select ARCH_DISCONTIGMEM_ENABLE
|
||||
help
|
||||
Say Y here if you intend to run this kernel on a Cirrus Logic EDB-7211
|
||||
evaluation board.
|
||||
|
|
|
@ -54,6 +54,14 @@ config ARCH_IXDP2X01
|
|||
depends on ARCH_IXDP2401 || ARCH_IXDP2801
|
||||
default y
|
||||
|
||||
config IXP2000_SUPPORT_BROKEN_PCI_IO
|
||||
bool "Support broken PCI I/O on older IXP2000s"
|
||||
default y
|
||||
help
|
||||
Say 'N' here if you only intend to run your kernel on an
|
||||
IXP2000 B0 or later model and do not need the PCI I/O
|
||||
byteswap workaround. Say 'Y' otherwise.
|
||||
|
||||
endmenu
|
||||
|
||||
endif
|
||||
|
|
|
@ -197,8 +197,23 @@ static struct platform_device enp2611_flash = {
|
|||
.resource = &enp2611_flash_resource,
|
||||
};
|
||||
|
||||
static struct ixp2000_i2c_pins enp2611_i2c_gpio_pins = {
|
||||
.sda_pin = ENP2611_GPIO_SDA,
|
||||
.scl_pin = ENP2611_GPIO_SCL,
|
||||
};
|
||||
|
||||
static struct platform_device enp2611_i2c_controller = {
|
||||
.name = "IXP2000-I2C",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &enp2611_i2c_gpio_pins
|
||||
},
|
||||
.num_resources = 0
|
||||
};
|
||||
|
||||
static struct platform_device *enp2611_devices[] __initdata = {
|
||||
&enp2611_flash
|
||||
&enp2611_flash,
|
||||
&enp2611_i2c_controller
|
||||
};
|
||||
|
||||
static void __init enp2611_init_machine(void)
|
||||
|
|
|
@ -42,6 +42,9 @@
|
|||
#include <asm/mach/flash.h>
|
||||
#include <asm/mach/arch.h>
|
||||
|
||||
#include <asm/arch/gpio.h>
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
* IXDP2x00 IRQ Initialization
|
||||
*************************************************************************/
|
||||
|
|
|
@ -198,6 +198,19 @@ clear_master_aborts(void)
|
|||
void __init
|
||||
ixp2000_pci_preinit(void)
|
||||
{
|
||||
#ifndef CONFIG_IXP2000_SUPPORT_BROKEN_PCI_IO
|
||||
/*
|
||||
* Configure the PCI unit to properly byteswap I/O transactions,
|
||||
* and verify that it worked.
|
||||
*/
|
||||
ixp2000_reg_write(IXP2000_PCI_CONTROL,
|
||||
(*IXP2000_PCI_CONTROL | PCI_CONTROL_IEE));
|
||||
|
||||
if ((*IXP2000_PCI_CONTROL & PCI_CONTROL_IEE) == 0)
|
||||
panic("IXP2000: PCI I/O is broken on this ixp model, and "
|
||||
"the needed workaround has not been configured in");
|
||||
#endif
|
||||
|
||||
hook_fault_code(16+6, ixp2000_pci_abort_handler, SIGBUS,
|
||||
"PCI config cycle to non-existent device");
|
||||
}
|
||||
|
|
|
@ -790,12 +790,10 @@ void __init setup_arch(char **cmdline_p)
|
|||
#ifndef CONFIG_GDBSTUB_UART0
|
||||
__reg(UART0_BASE + UART_IER * 8) = 0;
|
||||
early_serial_setup(&__frv_uart0);
|
||||
// register_serial(&__frv_uart0);
|
||||
#endif
|
||||
#ifndef CONFIG_GDBSTUB_UART1
|
||||
__reg(UART1_BASE + UART_IER * 8) = 0;
|
||||
early_serial_setup(&__frv_uart1);
|
||||
// register_serial(&__frv_uart1);
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CHR_DEV_FLASH) || defined(CONFIG_BLK_DEV_FLASH)
|
||||
|
|
|
@ -536,10 +536,8 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset)
|
|||
if (!user_mode(regs))
|
||||
return 1;
|
||||
|
||||
if (current->flags & PF_FREEZE) {
|
||||
refrigerator(0);
|
||||
if (try_to_freeze())
|
||||
goto no_signal;
|
||||
}
|
||||
|
||||
if (!oldset)
|
||||
oldset = ¤t->blocked;
|
||||
|
|
|
@ -517,10 +517,8 @@ asmlinkage int do_signal(struct pt_regs *regs, sigset_t *oldset)
|
|||
if ((regs->ccr & 0x10))
|
||||
return 1;
|
||||
|
||||
if (current->flags & PF_FREEZE) {
|
||||
refrigerator(0);
|
||||
if (try_to_freeze())
|
||||
goto no_signal;
|
||||
}
|
||||
|
||||
current->thread.esp0 = (unsigned long) regs;
|
||||
|
||||
|
|
|
@ -510,28 +510,7 @@ config SCHED_SMT
|
|||
cost of slightly increased overhead in some places. If unsure say
|
||||
N here.
|
||||
|
||||
config PREEMPT
|
||||
bool "Preemptible Kernel"
|
||||
help
|
||||
This option reduces the latency of the kernel when reacting to
|
||||
real-time or interactive events by allowing a low priority process to
|
||||
be preempted even if it is in kernel mode executing a system call.
|
||||
This allows applications to run more reliably even when the system is
|
||||
under load.
|
||||
|
||||
Say Y here if you are building a kernel for a desktop, embedded
|
||||
or real-time system. Say N if you are unsure.
|
||||
|
||||
config PREEMPT_BKL
|
||||
bool "Preempt The Big Kernel Lock"
|
||||
depends on PREEMPT
|
||||
default y
|
||||
help
|
||||
This option reduces the latency of the kernel by making the
|
||||
big kernel lock preemptible.
|
||||
|
||||
Say Y here if you are building a kernel for a desktop system.
|
||||
Say N if you are unsure.
|
||||
source "kernel/Kconfig.preempt"
|
||||
|
||||
config X86_UP_APIC
|
||||
bool "Local APIC support on uniprocessors"
|
||||
|
@ -963,6 +942,41 @@ config SECCOMP
|
|||
|
||||
source kernel/Kconfig.hz
|
||||
|
||||
config PHYSICAL_START
|
||||
hex "Physical address where the kernel is loaded" if EMBEDDED
|
||||
default "0x100000"
|
||||
help
|
||||
This gives the physical address where the kernel is loaded.
|
||||
Primarily used in the case of kexec on panic where the
|
||||
fail safe kernel needs to run at a different address than
|
||||
the panic-ed kernel.
|
||||
|
||||
Don't change this unless you know what you are doing.
|
||||
|
||||
config KEXEC
|
||||
bool "kexec system call (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
help
|
||||
kexec is a system call that implements the ability to shutdown your
|
||||
current kernel, and to start another kernel. It is like a reboot
|
||||
but it is indepedent of the system firmware. And like a reboot
|
||||
you can start any kernel with it, not just Linux.
|
||||
|
||||
The name comes from the similiarity to the exec system call.
|
||||
|
||||
It is an ongoing process to be certain the hardware in a machine
|
||||
is properly shutdown, so do not be surprised if this code does not
|
||||
initially work for you. It may help to enable device hotplugging
|
||||
support. As of this writing the exact hardware interface is
|
||||
strongly in flux, so no good recommendation can be made.
|
||||
|
||||
config CRASH_DUMP
|
||||
bool "kernel crash dumps (EXPERIMENTAL)"
|
||||
depends on EMBEDDED
|
||||
depends on EXPERIMENTAL
|
||||
depends on HIGHMEM
|
||||
help
|
||||
Generate crash dump after being started by kexec.
|
||||
endmenu
|
||||
|
||||
|
||||
|
@ -1250,6 +1264,15 @@ config SCx200
|
|||
This support is also available as a module. If compiled as a
|
||||
module, it will be called scx200.
|
||||
|
||||
config HOTPLUG_CPU
|
||||
bool "Support for hot-pluggable CPUs (EXPERIMENTAL)"
|
||||
depends on SMP && HOTPLUG && EXPERIMENTAL
|
||||
---help---
|
||||
Say Y here to experiment with turning CPUs off and on. CPUs
|
||||
can be controlled through /sys/devices/system/cpu.
|
||||
|
||||
Say N.
|
||||
|
||||
source "drivers/pcmcia/Kconfig"
|
||||
|
||||
source "drivers/pci/hotplug/Kconfig"
|
||||
|
|
|
@ -25,8 +25,8 @@ SVGA_MODE := -DSVGA_MODE=NORMAL_VGA
|
|||
|
||||
#RAMDISK := -DRAMDISK=512
|
||||
|
||||
targets := vmlinux.bin bootsect bootsect.o setup setup.o \
|
||||
zImage bzImage
|
||||
targets := vmlinux.bin bootsect bootsect.o \
|
||||
setup setup.o zImage bzImage
|
||||
subdir- := compressed
|
||||
|
||||
hostprogs-y := tools/build
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/segment.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
.globl startup_32
|
||||
|
||||
|
@ -74,7 +75,7 @@ startup_32:
|
|||
popl %esi # discard address
|
||||
popl %esi # real mode pointer
|
||||
xorl %ebx,%ebx
|
||||
ljmp $(__BOOT_CS), $0x100000
|
||||
ljmp $(__BOOT_CS), $__PHYSICAL_START
|
||||
|
||||
/*
|
||||
* We come here, if we were loaded high.
|
||||
|
@ -99,7 +100,7 @@ startup_32:
|
|||
popl %ecx # lcount
|
||||
popl %edx # high_buffer_start
|
||||
popl %eax # hcount
|
||||
movl $0x100000,%edi
|
||||
movl $__PHYSICAL_START,%edi
|
||||
cli # make sure we don't get interrupted
|
||||
ljmp $(__BOOT_CS), $0x1000 # and jump to the move routine
|
||||
|
||||
|
@ -124,5 +125,5 @@ move_routine_start:
|
|||
movsl
|
||||
movl %ebx,%esi # Restore setup pointer
|
||||
xorl %ebx,%ebx
|
||||
ljmp $(__BOOT_CS), $0x100000
|
||||
ljmp $(__BOOT_CS), $__PHYSICAL_START
|
||||
move_routine_end:
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <linux/vmalloc.h>
|
||||
#include <linux/tty.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
/*
|
||||
* gzip declarations
|
||||
|
@ -308,7 +309,7 @@ static void setup_normal_output_buffer(void)
|
|||
#else
|
||||
if ((RM_ALT_MEM_K > RM_EXT_MEM_K ? RM_ALT_MEM_K : RM_EXT_MEM_K) < 1024) error("Less than 2MB of memory");
|
||||
#endif
|
||||
output_data = (char *)0x100000; /* Points to 1M */
|
||||
output_data = (char *)__PHYSICAL_START; /* Normally Points to 1M */
|
||||
free_mem_end_ptr = (long)real_mode;
|
||||
}
|
||||
|
||||
|
@ -333,8 +334,8 @@ static void setup_output_buffer_if_we_run_high(struct moveparams *mv)
|
|||
low_buffer_size = low_buffer_end - LOW_BUFFER_START;
|
||||
high_loaded = 1;
|
||||
free_mem_end_ptr = (long)high_buffer_start;
|
||||
if ( (0x100000 + low_buffer_size) > ((ulg)high_buffer_start)) {
|
||||
high_buffer_start = (uch *)(0x100000 + low_buffer_size);
|
||||
if ( (__PHYSICAL_START + low_buffer_size) > ((ulg)high_buffer_start)) {
|
||||
high_buffer_start = (uch *)(__PHYSICAL_START + low_buffer_size);
|
||||
mv->hcount = 0; /* say: we need not to move high_buffer */
|
||||
}
|
||||
else mv->hcount = -1;
|
||||
|
@ -353,7 +354,6 @@ static void close_output_buffer_if_we_run_high(struct moveparams *mv)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
asmlinkage int decompress_kernel(struct moveparams *mv, void *rmode)
|
||||
{
|
||||
real_mode = rmode;
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* projects 1572D, 1484D, 1386D, 1226DT
|
||||
* disk signature read by Matt Domsch <Matt_Domsch@dell.com>
|
||||
* and Andrew Wilks <Andrew_Wilks@dell.com> September 2003, June 2004
|
||||
* legacy CHS retreival by Patrick J. LoPresti <patl@users.sourceforge.net>
|
||||
* legacy CHS retrieval by Patrick J. LoPresti <patl@users.sourceforge.net>
|
||||
* March 2004
|
||||
* Command line option parsing, Matt Domsch, November 2004
|
||||
*/
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
* Transcribed from Intel (as86) -> AT&T (gas) by Chris Noe, May 1999.
|
||||
* <stiker@northlink.com>
|
||||
*
|
||||
* Fix to work around buggy BIOSes which dont use carry bit correctly
|
||||
* Fix to work around buggy BIOSes which don't use carry bit correctly
|
||||
* and/or report extended memory in CX/DX for e801h memory size detection
|
||||
* call. As a result the kernel got wrong figures. The int15/e801h docs
|
||||
* from Ralf Brown interrupt list seem to indicate AX/BX should be used
|
||||
|
@ -357,7 +357,7 @@ bail820:
|
|||
|
||||
meme801:
|
||||
stc # fix to work around buggy
|
||||
xorw %cx,%cx # BIOSes which dont clear/set
|
||||
xorw %cx,%cx # BIOSes which don't clear/set
|
||||
xorw %dx,%dx # carry on pass/error of
|
||||
# e801h memory size call
|
||||
# or merely pass cx,dx though
|
||||
|
@ -847,7 +847,7 @@ flush_instr:
|
|||
#
|
||||
# but we yet haven't reloaded the CS register, so the default size
|
||||
# of the target offset still is 16 bit.
|
||||
# However, using an operand prefix (0x66), the CPU will properly
|
||||
# However, using an operand prefix (0x66), the CPU will properly
|
||||
# take our 48 bit far pointer. (INTeL 80386 Programmer's Reference
|
||||
# Manual, Mixing 16-bit and 32-bit code, page 16-6)
|
||||
|
||||
|
|
|
@ -1,6 +1,4 @@
|
|||
/*
|
||||
* $Id: build.c,v 1.5 1997/05/19 12:29:58 mj Exp $
|
||||
*
|
||||
* Copyright (C) 1991, 1992 Linus Torvalds
|
||||
* Copyright (C) 1997 Martin Mares
|
||||
*/
|
||||
|
@ -8,7 +6,8 @@
|
|||
/*
|
||||
* This file builds a disk-image from three different files:
|
||||
*
|
||||
* - bootsect: exactly 512 bytes of 8086 machine code, loads the rest
|
||||
* - bootsect: compatibility mbr which prints an error message if
|
||||
* someone tries to boot the kernel directly.
|
||||
* - setup: 8086 machine code, sets up system parm
|
||||
* - system: 80386 code for actual system
|
||||
*
|
||||
|
|
|
@ -59,7 +59,7 @@ struct aes_ctx {
|
|||
};
|
||||
|
||||
#define WPOLY 0x011b
|
||||
#define u32_in(x) le32_to_cpu(*(const u32 *)(x))
|
||||
#define u32_in(x) le32_to_cpup((const __le32 *)(x))
|
||||
#define bytes2word(b0, b1, b2, b3) \
|
||||
(((u32)(b3) << 24) | ((u32)(b2) << 16) | ((u32)(b1) << 8) | (b0))
|
||||
|
||||
|
|
|
@ -126,7 +126,6 @@ CONFIG_HAVE_DEC_LOCK=y
|
|||
#
|
||||
CONFIG_PM=y
|
||||
CONFIG_SOFTWARE_SUSPEND=y
|
||||
# CONFIG_PM_DISK is not set
|
||||
|
||||
#
|
||||
# ACPI (Advanced Configuration and Power Interface) Support
|
||||
|
|
|
@ -24,6 +24,7 @@ obj-$(CONFIG_X86_MPPARSE) += mpparse.o
|
|||
obj-$(CONFIG_X86_LOCAL_APIC) += apic.o nmi.o
|
||||
obj-$(CONFIG_X86_IO_APIC) += io_apic.o
|
||||
obj-$(CONFIG_X86_REBOOTFIXUPS) += reboot_fixups.o
|
||||
obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o crash.o
|
||||
obj-$(CONFIG_X86_NUMAQ) += numaq.o
|
||||
obj-$(CONFIG_X86_SUMMIT_NUMA) += summit.o
|
||||
obj-$(CONFIG_KPROBES) += kprobes.o
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include <linux/efi.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/dmi.h>
|
||||
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/io_apic.h>
|
||||
|
@ -815,6 +816,219 @@ acpi_process_madt(void)
|
|||
return;
|
||||
}
|
||||
|
||||
extern int acpi_force;
|
||||
|
||||
#ifdef __i386__
|
||||
|
||||
#ifdef CONFIG_ACPI_PCI
|
||||
static int __init disable_acpi_irq(struct dmi_system_id *d)
|
||||
{
|
||||
if (!acpi_force) {
|
||||
printk(KERN_NOTICE "%s detected: force use of acpi=noirq\n",
|
||||
d->ident);
|
||||
acpi_noirq_set();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init disable_acpi_pci(struct dmi_system_id *d)
|
||||
{
|
||||
if (!acpi_force) {
|
||||
printk(KERN_NOTICE "%s detected: force use of pci=noacpi\n",
|
||||
d->ident);
|
||||
acpi_disable_pci();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int __init dmi_disable_acpi(struct dmi_system_id *d)
|
||||
{
|
||||
if (!acpi_force) {
|
||||
printk(KERN_NOTICE "%s detected: acpi off\n",d->ident);
|
||||
disable_acpi();
|
||||
} else {
|
||||
printk(KERN_NOTICE
|
||||
"Warning: DMI blacklist says broken, but acpi forced\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Limit ACPI to CPU enumeration for HT
|
||||
*/
|
||||
static int __init force_acpi_ht(struct dmi_system_id *d)
|
||||
{
|
||||
if (!acpi_force) {
|
||||
printk(KERN_NOTICE "%s detected: force use of acpi=ht\n", d->ident);
|
||||
disable_acpi();
|
||||
acpi_ht = 1;
|
||||
} else {
|
||||
printk(KERN_NOTICE
|
||||
"Warning: acpi=force overrules DMI blacklist: acpi=ht\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* If your system is blacklisted here, but you find that acpi=force
|
||||
* works for you, please contact acpi-devel@sourceforge.net
|
||||
*/
|
||||
static struct dmi_system_id __initdata acpi_dmi_table[] = {
|
||||
/*
|
||||
* Boxes that need ACPI disabled
|
||||
*/
|
||||
{
|
||||
.callback = dmi_disable_acpi,
|
||||
.ident = "IBM Thinkpad",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "2629H1G"),
|
||||
},
|
||||
},
|
||||
|
||||
/*
|
||||
* Boxes that need acpi=ht
|
||||
*/
|
||||
{
|
||||
.callback = force_acpi_ht,
|
||||
.ident = "FSC Primergy T850",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "PRIMERGY T850"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = force_acpi_ht,
|
||||
.ident = "DELL GX240",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Dell Computer Corporation"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "OptiPlex GX240"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = force_acpi_ht,
|
||||
.ident = "HP VISUALIZE NT Workstation",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP VISUALIZE NT Workstation"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = force_acpi_ht,
|
||||
.ident = "Compaq Workstation W8000",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Workstation W8000"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = force_acpi_ht,
|
||||
.ident = "ASUS P4B266",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "P4B266"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = force_acpi_ht,
|
||||
.ident = "ASUS P2B-DS",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "P2B-DS"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = force_acpi_ht,
|
||||
.ident = "ASUS CUR-DLS",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "CUR-DLS"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = force_acpi_ht,
|
||||
.ident = "ABIT i440BX-W83977",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "ABIT <http://www.abit.com>"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "i440BX-W83977 (BP6)"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = force_acpi_ht,
|
||||
.ident = "IBM Bladecenter",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "IBM eServer BladeCenter HS20"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = force_acpi_ht,
|
||||
.ident = "IBM eServer xSeries 360",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "eServer xSeries 360"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = force_acpi_ht,
|
||||
.ident = "IBM eserver xSeries 330",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "eserver xSeries 330"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = force_acpi_ht,
|
||||
.ident = "IBM eserver xSeries 440",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "IBM"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "eserver xSeries 440"),
|
||||
},
|
||||
},
|
||||
|
||||
#ifdef CONFIG_ACPI_PCI
|
||||
/*
|
||||
* Boxes that need ACPI PCI IRQ routing disabled
|
||||
*/
|
||||
{
|
||||
.callback = disable_acpi_irq,
|
||||
.ident = "ASUS A7V",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "<A7V>"),
|
||||
/* newer BIOS, Revision 1011, does work */
|
||||
DMI_MATCH(DMI_BIOS_VERSION, "ASUS A7V ACPI BIOS Revision 1007"),
|
||||
},
|
||||
},
|
||||
|
||||
/*
|
||||
* Boxes that need ACPI PCI IRQ routing and PCI scan disabled
|
||||
*/
|
||||
{ /* _BBN 0 bug */
|
||||
.callback = disable_acpi_pci,
|
||||
.ident = "ASUS PR-DLS",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "PR-DLS"),
|
||||
DMI_MATCH(DMI_BIOS_VERSION, "ASUS PR-DLS ACPI BIOS Revision 1010"),
|
||||
DMI_MATCH(DMI_BIOS_DATE, "03/21/2003")
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = disable_acpi_pci,
|
||||
.ident = "Acer TravelMate 36x Laptop",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"),
|
||||
},
|
||||
},
|
||||
#endif
|
||||
{ }
|
||||
};
|
||||
|
||||
#endif /* __i386__ */
|
||||
|
||||
/*
|
||||
* acpi_boot_table_init() and acpi_boot_init()
|
||||
* called from setup_arch(), always.
|
||||
|
@ -843,6 +1057,10 @@ acpi_boot_table_init(void)
|
|||
{
|
||||
int error;
|
||||
|
||||
#ifdef __i386__
|
||||
dmi_check_system(acpi_dmi_table);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If acpi_disabled, bail out
|
||||
* One exception: acpi=ht continues far enough to enumerate LAPICs
|
||||
|
@ -870,8 +1088,6 @@ acpi_boot_table_init(void)
|
|||
*/
|
||||
error = acpi_blacklisted();
|
||||
if (error) {
|
||||
extern int acpi_force;
|
||||
|
||||
if (acpi_force) {
|
||||
printk(KERN_WARNING PREFIX "acpi=force override\n");
|
||||
} else {
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <asm/smp.h>
|
||||
#include <asm/tlbflush.h>
|
||||
|
||||
|
@ -91,3 +92,29 @@ static int __init acpi_sleep_setup(char *str)
|
|||
|
||||
|
||||
__setup("acpi_sleep=", acpi_sleep_setup);
|
||||
|
||||
|
||||
static __init int reset_videomode_after_s3(struct dmi_system_id *d)
|
||||
{
|
||||
acpi_video_flags |= 2;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __initdata struct dmi_system_id acpisleep_dmi_table[] = {
|
||||
{ /* Reset video mode after returning from ACPI S3 sleep */
|
||||
.callback = reset_videomode_after_s3,
|
||||
.ident = "Toshiba Satellite 4030cdt",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"),
|
||||
},
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
static int __init acpisleep_dmi_init(void)
|
||||
{
|
||||
dmi_check_system(acpisleep_dmi_table);
|
||||
return 0;
|
||||
}
|
||||
|
||||
core_initcall(acpisleep_dmi_init);
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <linux/mc146818rtc.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/cpu.h>
|
||||
|
||||
#include <asm/atomic.h>
|
||||
#include <asm/smp.h>
|
||||
|
@ -39,6 +40,11 @@
|
|||
|
||||
#include "io_ports.h"
|
||||
|
||||
/*
|
||||
* Knob to control our willingness to enable the local APIC.
|
||||
*/
|
||||
int enable_local_apic __initdata = 0; /* -1=force-disable, +1=force-enable */
|
||||
|
||||
/*
|
||||
* Debug level
|
||||
*/
|
||||
|
@ -205,7 +211,7 @@ void __init connect_bsp_APIC(void)
|
|||
enable_apic_mode();
|
||||
}
|
||||
|
||||
void disconnect_bsp_APIC(void)
|
||||
void disconnect_bsp_APIC(int virt_wire_setup)
|
||||
{
|
||||
if (pic_mode) {
|
||||
/*
|
||||
|
@ -219,6 +225,42 @@ void disconnect_bsp_APIC(void)
|
|||
outb(0x70, 0x22);
|
||||
outb(0x00, 0x23);
|
||||
}
|
||||
else {
|
||||
/* Go back to Virtual Wire compatibility mode */
|
||||
unsigned long value;
|
||||
|
||||
/* For the spurious interrupt use vector F, and enable it */
|
||||
value = apic_read(APIC_SPIV);
|
||||
value &= ~APIC_VECTOR_MASK;
|
||||
value |= APIC_SPIV_APIC_ENABLED;
|
||||
value |= 0xf;
|
||||
apic_write_around(APIC_SPIV, value);
|
||||
|
||||
if (!virt_wire_setup) {
|
||||
/* For LVT0 make it edge triggered, active high, external and enabled */
|
||||
value = apic_read(APIC_LVT0);
|
||||
value &= ~(APIC_MODE_MASK | APIC_SEND_PENDING |
|
||||
APIC_INPUT_POLARITY | APIC_LVT_REMOTE_IRR |
|
||||
APIC_LVT_LEVEL_TRIGGER | APIC_LVT_MASKED );
|
||||
value |= APIC_LVT_REMOTE_IRR | APIC_SEND_PENDING;
|
||||
value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_EXTINT);
|
||||
apic_write_around(APIC_LVT0, value);
|
||||
}
|
||||
else {
|
||||
/* Disable LVT0 */
|
||||
apic_write_around(APIC_LVT0, APIC_LVT_MASKED);
|
||||
}
|
||||
|
||||
/* For LVT1 make it edge triggered, active high, nmi and enabled */
|
||||
value = apic_read(APIC_LVT1);
|
||||
value &= ~(
|
||||
APIC_MODE_MASK | APIC_SEND_PENDING |
|
||||
APIC_INPUT_POLARITY | APIC_LVT_REMOTE_IRR |
|
||||
APIC_LVT_LEVEL_TRIGGER | APIC_LVT_MASKED);
|
||||
value |= APIC_LVT_REMOTE_IRR | APIC_SEND_PENDING;
|
||||
value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_NMI);
|
||||
apic_write_around(APIC_LVT1, value);
|
||||
}
|
||||
}
|
||||
|
||||
void disable_local_APIC(void)
|
||||
|
@ -363,7 +405,7 @@ void __init init_bsp_APIC(void)
|
|||
apic_write_around(APIC_LVT1, value);
|
||||
}
|
||||
|
||||
void __init setup_local_APIC (void)
|
||||
void __devinit setup_local_APIC(void)
|
||||
{
|
||||
unsigned long oldvalue, value, ver, maxlvt;
|
||||
|
||||
|
@ -634,7 +676,7 @@ static struct sys_device device_lapic = {
|
|||
.cls = &lapic_sysclass,
|
||||
};
|
||||
|
||||
static void __init apic_pm_activate(void)
|
||||
static void __devinit apic_pm_activate(void)
|
||||
{
|
||||
apic_pm_state.active = 1;
|
||||
}
|
||||
|
@ -665,26 +707,6 @@ static void apic_pm_activate(void) { }
|
|||
* Original code written by Keir Fraser.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Knob to control our willingness to enable the local APIC.
|
||||
*/
|
||||
int enable_local_apic __initdata = 0; /* -1=force-disable, +1=force-enable */
|
||||
|
||||
static int __init lapic_disable(char *str)
|
||||
{
|
||||
enable_local_apic = -1;
|
||||
clear_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability);
|
||||
return 0;
|
||||
}
|
||||
__setup("nolapic", lapic_disable);
|
||||
|
||||
static int __init lapic_enable(char *str)
|
||||
{
|
||||
enable_local_apic = 1;
|
||||
return 0;
|
||||
}
|
||||
__setup("lapic", lapic_enable);
|
||||
|
||||
static int __init apic_set_verbosity(char *str)
|
||||
{
|
||||
if (strcmp("debug", str) == 0)
|
||||
|
@ -855,7 +877,7 @@ fake_ioapic_page:
|
|||
* but we do not accept timer interrupts yet. We only allow the BP
|
||||
* to calibrate.
|
||||
*/
|
||||
static unsigned int __init get_8254_timer_count(void)
|
||||
static unsigned int __devinit get_8254_timer_count(void)
|
||||
{
|
||||
extern spinlock_t i8253_lock;
|
||||
unsigned long flags;
|
||||
|
@ -874,7 +896,7 @@ static unsigned int __init get_8254_timer_count(void)
|
|||
}
|
||||
|
||||
/* next tick in 8254 can be caught by catching timer wraparound */
|
||||
static void __init wait_8254_wraparound(void)
|
||||
static void __devinit wait_8254_wraparound(void)
|
||||
{
|
||||
unsigned int curr_count, prev_count;
|
||||
|
||||
|
@ -894,7 +916,7 @@ static void __init wait_8254_wraparound(void)
|
|||
* Default initialization for 8254 timers. If we use other timers like HPET,
|
||||
* we override this later
|
||||
*/
|
||||
void (*wait_timer_tick)(void) __initdata = wait_8254_wraparound;
|
||||
void (*wait_timer_tick)(void) __devinitdata = wait_8254_wraparound;
|
||||
|
||||
/*
|
||||
* This function sets up the local APIC timer, with a timeout of
|
||||
|
@ -930,7 +952,7 @@ static void __setup_APIC_LVTT(unsigned int clocks)
|
|||
apic_write_around(APIC_TMICT, clocks/APIC_DIVISOR);
|
||||
}
|
||||
|
||||
static void __init setup_APIC_timer(unsigned int clocks)
|
||||
static void __devinit setup_APIC_timer(unsigned int clocks)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
|
@ -1043,12 +1065,12 @@ void __init setup_boot_APIC_clock(void)
|
|||
local_irq_enable();
|
||||
}
|
||||
|
||||
void __init setup_secondary_APIC_clock(void)
|
||||
void __devinit setup_secondary_APIC_clock(void)
|
||||
{
|
||||
setup_APIC_timer(calibration_result);
|
||||
}
|
||||
|
||||
void __init disable_APIC_timer(void)
|
||||
void __devinit disable_APIC_timer(void)
|
||||
{
|
||||
if (using_apic_timer) {
|
||||
unsigned long v;
|
||||
|
|
|
@ -346,10 +346,10 @@ extern int (*console_blank_hook)(int);
|
|||
struct apm_user {
|
||||
int magic;
|
||||
struct apm_user * next;
|
||||
int suser: 1;
|
||||
int writer: 1;
|
||||
int reader: 1;
|
||||
int suspend_wait: 1;
|
||||
unsigned int suser: 1;
|
||||
unsigned int writer: 1;
|
||||
unsigned int reader: 1;
|
||||
unsigned int suspend_wait: 1;
|
||||
int suspend_result;
|
||||
int suspends_pending;
|
||||
int standbys_pending;
|
||||
|
|
|
@ -24,9 +24,9 @@ EXPORT_PER_CPU_SYMBOL(cpu_gdt_table);
|
|||
DEFINE_PER_CPU(unsigned char, cpu_16bit_stack[CPU_16BIT_STACK_SIZE]);
|
||||
EXPORT_PER_CPU_SYMBOL(cpu_16bit_stack);
|
||||
|
||||
static int cachesize_override __initdata = -1;
|
||||
static int disable_x86_fxsr __initdata = 0;
|
||||
static int disable_x86_serial_nr __initdata = 1;
|
||||
static int cachesize_override __devinitdata = -1;
|
||||
static int disable_x86_fxsr __devinitdata = 0;
|
||||
static int disable_x86_serial_nr __devinitdata = 1;
|
||||
|
||||
struct cpu_dev * cpu_devs[X86_VENDOR_NUM] = {};
|
||||
|
||||
|
@ -59,7 +59,7 @@ static int __init cachesize_setup(char *str)
|
|||
}
|
||||
__setup("cachesize=", cachesize_setup);
|
||||
|
||||
int __init get_model_name(struct cpuinfo_x86 *c)
|
||||
int __devinit get_model_name(struct cpuinfo_x86 *c)
|
||||
{
|
||||
unsigned int *v;
|
||||
char *p, *q;
|
||||
|
@ -89,7 +89,7 @@ int __init get_model_name(struct cpuinfo_x86 *c)
|
|||
}
|
||||
|
||||
|
||||
void __init display_cacheinfo(struct cpuinfo_x86 *c)
|
||||
void __devinit display_cacheinfo(struct cpuinfo_x86 *c)
|
||||
{
|
||||
unsigned int n, dummy, ecx, edx, l2size;
|
||||
|
||||
|
@ -130,7 +130,7 @@ void __init display_cacheinfo(struct cpuinfo_x86 *c)
|
|||
/* in particular, if CPUID levels 0x80000002..4 are supported, this isn't used */
|
||||
|
||||
/* Look up CPU names by table lookup. */
|
||||
static char __init *table_lookup_model(struct cpuinfo_x86 *c)
|
||||
static char __devinit *table_lookup_model(struct cpuinfo_x86 *c)
|
||||
{
|
||||
struct cpu_model_info *info;
|
||||
|
||||
|
@ -151,7 +151,7 @@ static char __init *table_lookup_model(struct cpuinfo_x86 *c)
|
|||
}
|
||||
|
||||
|
||||
void __init get_cpu_vendor(struct cpuinfo_x86 *c, int early)
|
||||
void __devinit get_cpu_vendor(struct cpuinfo_x86 *c, int early)
|
||||
{
|
||||
char *v = c->x86_vendor_id;
|
||||
int i;
|
||||
|
@ -202,7 +202,7 @@ static inline int flag_is_changeable_p(u32 flag)
|
|||
|
||||
|
||||
/* Probe for the CPUID instruction */
|
||||
static int __init have_cpuid_p(void)
|
||||
static int __devinit have_cpuid_p(void)
|
||||
{
|
||||
return flag_is_changeable_p(X86_EFLAGS_ID);
|
||||
}
|
||||
|
@ -249,7 +249,7 @@ static void __init early_cpu_detect(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
void __init generic_identify(struct cpuinfo_x86 * c)
|
||||
void __devinit generic_identify(struct cpuinfo_x86 * c)
|
||||
{
|
||||
u32 tfms, xlvl;
|
||||
int junk;
|
||||
|
@ -296,7 +296,7 @@ void __init generic_identify(struct cpuinfo_x86 * c)
|
|||
}
|
||||
}
|
||||
|
||||
static void __init squash_the_stupid_serial_number(struct cpuinfo_x86 *c)
|
||||
static void __devinit squash_the_stupid_serial_number(struct cpuinfo_x86 *c)
|
||||
{
|
||||
if (cpu_has(c, X86_FEATURE_PN) && disable_x86_serial_nr ) {
|
||||
/* Disable processor serial number */
|
||||
|
@ -324,7 +324,7 @@ __setup("serialnumber", x86_serial_nr_setup);
|
|||
/*
|
||||
* This does the hard work of actually picking apart the CPU stuff...
|
||||
*/
|
||||
void __init identify_cpu(struct cpuinfo_x86 *c)
|
||||
void __devinit identify_cpu(struct cpuinfo_x86 *c)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -432,10 +432,13 @@ void __init identify_cpu(struct cpuinfo_x86 *c)
|
|||
#ifdef CONFIG_X86_MCE
|
||||
mcheck_init(c);
|
||||
#endif
|
||||
if (c == &boot_cpu_data)
|
||||
sysenter_setup();
|
||||
enable_sep_cpu();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_HT
|
||||
void __init detect_ht(struct cpuinfo_x86 *c)
|
||||
void __devinit detect_ht(struct cpuinfo_x86 *c)
|
||||
{
|
||||
u32 eax, ebx, ecx, edx;
|
||||
int index_msb, tmp;
|
||||
|
@ -490,7 +493,7 @@ void __init detect_ht(struct cpuinfo_x86 *c)
|
|||
}
|
||||
#endif
|
||||
|
||||
void __init print_cpu_info(struct cpuinfo_x86 *c)
|
||||
void __devinit print_cpu_info(struct cpuinfo_x86 *c)
|
||||
{
|
||||
char *vendor = NULL;
|
||||
|
||||
|
@ -513,7 +516,7 @@ void __init print_cpu_info(struct cpuinfo_x86 *c)
|
|||
printk("\n");
|
||||
}
|
||||
|
||||
cpumask_t cpu_initialized __initdata = CPU_MASK_NONE;
|
||||
cpumask_t cpu_initialized __devinitdata = CPU_MASK_NONE;
|
||||
|
||||
/* This is hacky. :)
|
||||
* We're emulating future behavior.
|
||||
|
@ -560,7 +563,7 @@ void __init early_cpu_init(void)
|
|||
* and IDT. We reload them nevertheless, this function acts as a
|
||||
* 'CPU state barrier', nothing should get across.
|
||||
*/
|
||||
void __init cpu_init (void)
|
||||
void __devinit cpu_init(void)
|
||||
{
|
||||
int cpu = smp_processor_id();
|
||||
struct tss_struct * t = &per_cpu(init_tss, cpu);
|
||||
|
@ -648,3 +651,15 @@ void __init cpu_init (void)
|
|||
clear_used_math();
|
||||
mxcsr_feature_mask_init();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
void __devinit cpu_uninit(void)
|
||||
{
|
||||
int cpu = raw_smp_processor_id();
|
||||
cpu_clear(cpu, cpu_initialized);
|
||||
|
||||
/* lazy TLB state */
|
||||
per_cpu(cpu_tlbstate, cpu).state = 0;
|
||||
per_cpu(cpu_tlbstate, cpu).active_mm = &init_mm;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -648,9 +648,7 @@ static int powernow_cpu_exit (struct cpufreq_policy *policy) {
|
|||
}
|
||||
#endif
|
||||
|
||||
if (powernow_table)
|
||||
kfree(powernow_table);
|
||||
|
||||
kfree(powernow_table);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@ extern int trap_init_f00f_bug(void);
|
|||
struct movsl_mask movsl_mask;
|
||||
#endif
|
||||
|
||||
void __init early_intel_workaround(struct cpuinfo_x86 *c)
|
||||
void __devinit early_intel_workaround(struct cpuinfo_x86 *c)
|
||||
{
|
||||
if (c->x86_vendor != X86_VENDOR_INTEL)
|
||||
return;
|
||||
|
@ -43,7 +43,7 @@ void __init early_intel_workaround(struct cpuinfo_x86 *c)
|
|||
* This is called before we do cpu ident work
|
||||
*/
|
||||
|
||||
int __init ppro_with_ram_bug(void)
|
||||
int __devinit ppro_with_ram_bug(void)
|
||||
{
|
||||
/* Uses data from early_cpu_detect now */
|
||||
if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
|
||||
|
@ -61,7 +61,7 @@ int __init ppro_with_ram_bug(void)
|
|||
* P4 Xeon errata 037 workaround.
|
||||
* Hardware prefetcher may cause stale data to be loaded into the cache.
|
||||
*/
|
||||
static void __init Intel_errata_workarounds(struct cpuinfo_x86 *c)
|
||||
static void __devinit Intel_errata_workarounds(struct cpuinfo_x86 *c)
|
||||
{
|
||||
unsigned long lo, hi;
|
||||
|
||||
|
@ -80,7 +80,7 @@ static void __init Intel_errata_workarounds(struct cpuinfo_x86 *c)
|
|||
/*
|
||||
* find out the number of processor cores on the die
|
||||
*/
|
||||
static int __init num_cpu_cores(struct cpuinfo_x86 *c)
|
||||
static int __devinit num_cpu_cores(struct cpuinfo_x86 *c)
|
||||
{
|
||||
unsigned int eax;
|
||||
|
||||
|
@ -98,7 +98,7 @@ static int __init num_cpu_cores(struct cpuinfo_x86 *c)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static void __init init_intel(struct cpuinfo_x86 *c)
|
||||
static void __devinit init_intel(struct cpuinfo_x86 *c)
|
||||
{
|
||||
unsigned int l2 = 0;
|
||||
char *p = NULL;
|
||||
|
@ -204,7 +204,7 @@ static unsigned int intel_size_cache(struct cpuinfo_x86 * c, unsigned int size)
|
|||
return size;
|
||||
}
|
||||
|
||||
static struct cpu_dev intel_cpu_dev __initdata = {
|
||||
static struct cpu_dev intel_cpu_dev __devinitdata = {
|
||||
.c_vendor = "Intel",
|
||||
.c_ident = { "GenuineIntel" },
|
||||
.c_models = {
|
||||
|
|
|
@ -28,7 +28,7 @@ struct _cache_table
|
|||
};
|
||||
|
||||
/* all the cache descriptor types we care about (no TLB or trace cache entries) */
|
||||
static struct _cache_table cache_table[] __initdata =
|
||||
static struct _cache_table cache_table[] __devinitdata =
|
||||
{
|
||||
{ 0x06, LVL_1_INST, 8 }, /* 4-way set assoc, 32 byte line size */
|
||||
{ 0x08, LVL_1_INST, 16 }, /* 4-way set assoc, 32 byte line size */
|
||||
|
@ -160,7 +160,7 @@ static int __init find_num_cache_leaves(void)
|
|||
return retval;
|
||||
}
|
||||
|
||||
unsigned int __init init_intel_cacheinfo(struct cpuinfo_x86 *c)
|
||||
unsigned int __devinit init_intel_cacheinfo(struct cpuinfo_x86 *c)
|
||||
{
|
||||
unsigned int trace = 0, l1i = 0, l1d = 0, l2 = 0, l3 = 0; /* Cache sizes */
|
||||
unsigned int new_l1d = 0, new_l1i = 0; /* Cache sizes from cpuid(4) */
|
||||
|
|
|
@ -69,7 +69,7 @@ static fastcall void k7_machine_check(struct pt_regs * regs, long error_code)
|
|||
|
||||
|
||||
/* AMD K7 machine check is Intel like */
|
||||
void __init amd_mcheck_init(struct cpuinfo_x86 *c)
|
||||
void __devinit amd_mcheck_init(struct cpuinfo_x86 *c)
|
||||
{
|
||||
u32 l, h;
|
||||
int i;
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
#include "mce.h"
|
||||
|
||||
int mce_disabled __initdata = 0;
|
||||
int mce_disabled __devinitdata = 0;
|
||||
int nr_mce_banks;
|
||||
|
||||
EXPORT_SYMBOL_GPL(nr_mce_banks); /* non-fatal.o */
|
||||
|
@ -31,7 +31,7 @@ static fastcall void unexpected_machine_check(struct pt_regs * regs, long error_
|
|||
void fastcall (*machine_check_vector)(struct pt_regs *, long error_code) = unexpected_machine_check;
|
||||
|
||||
/* This has to be run for each processor */
|
||||
void __init mcheck_init(struct cpuinfo_x86 *c)
|
||||
void __devinit mcheck_init(struct cpuinfo_x86 *c)
|
||||
{
|
||||
if (mce_disabled==1)
|
||||
return;
|
||||
|
|
|
@ -78,7 +78,7 @@ fastcall void smp_thermal_interrupt(struct pt_regs *regs)
|
|||
}
|
||||
|
||||
/* P4/Xeon Thermal regulation detect and init */
|
||||
static void __init intel_init_thermal(struct cpuinfo_x86 *c)
|
||||
static void __devinit intel_init_thermal(struct cpuinfo_x86 *c)
|
||||
{
|
||||
u32 l, h;
|
||||
unsigned int cpu = smp_processor_id();
|
||||
|
@ -232,7 +232,7 @@ static fastcall void intel_machine_check(struct pt_regs * regs, long error_code)
|
|||
}
|
||||
|
||||
|
||||
void __init intel_p4_mcheck_init(struct cpuinfo_x86 *c)
|
||||
void __devinit intel_p4_mcheck_init(struct cpuinfo_x86 *c)
|
||||
{
|
||||
u32 l, h;
|
||||
int i;
|
||||
|
|
|
@ -29,7 +29,7 @@ static fastcall void pentium_machine_check(struct pt_regs * regs, long error_cod
|
|||
}
|
||||
|
||||
/* Set up machine check reporting for processors with Intel style MCE */
|
||||
void __init intel_p5_mcheck_init(struct cpuinfo_x86 *c)
|
||||
void __devinit intel_p5_mcheck_init(struct cpuinfo_x86 *c)
|
||||
{
|
||||
u32 l, h;
|
||||
|
||||
|
|
|
@ -80,7 +80,7 @@ static fastcall void intel_machine_check(struct pt_regs * regs, long error_code)
|
|||
}
|
||||
|
||||
/* Set up machine check reporting for processors with Intel style MCE */
|
||||
void __init intel_p6_mcheck_init(struct cpuinfo_x86 *c)
|
||||
void __devinit intel_p6_mcheck_init(struct cpuinfo_x86 *c)
|
||||
{
|
||||
u32 l, h;
|
||||
int i;
|
||||
|
|
|
@ -23,7 +23,7 @@ static fastcall void winchip_machine_check(struct pt_regs * regs, long error_cod
|
|||
}
|
||||
|
||||
/* Set up machine check reporting on the Winchip C6 series */
|
||||
void __init winchip_mcheck_init(struct cpuinfo_x86 *c)
|
||||
void __devinit winchip_mcheck_init(struct cpuinfo_x86 *c)
|
||||
{
|
||||
u32 lo, hi;
|
||||
machine_check_vector = winchip_machine_check;
|
||||
|
|
|
@ -70,8 +70,7 @@ void __init get_mtrr_state(void)
|
|||
/* Free resources associated with a struct mtrr_state */
|
||||
void __init finalize_mtrr_state(void)
|
||||
{
|
||||
if (mtrr_state.var_ranges)
|
||||
kfree(mtrr_state.var_ranges);
|
||||
kfree(mtrr_state.var_ranges);
|
||||
mtrr_state.var_ranges = NULL;
|
||||
}
|
||||
|
||||
|
|
223
arch/i386/kernel/crash.c
Normal file
223
arch/i386/kernel/crash.c
Normal file
|
@ -0,0 +1,223 @@
|
|||
/*
|
||||
* Architecture specific (i386) functions for kexec based crash dumps.
|
||||
*
|
||||
* Created by: Hariprasad Nellitheertha (hari@in.ibm.com)
|
||||
*
|
||||
* Copyright (C) IBM Corporation, 2004. All rights reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/kexec.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/elf.h>
|
||||
#include <linux/elfcore.h>
|
||||
|
||||
#include <asm/processor.h>
|
||||
#include <asm/hardirq.h>
|
||||
#include <asm/nmi.h>
|
||||
#include <asm/hw_irq.h>
|
||||
#include <asm/apic.h>
|
||||
#include <mach_ipi.h>
|
||||
|
||||
|
||||
note_buf_t crash_notes[NR_CPUS];
|
||||
/* This keeps a track of which one is crashing cpu. */
|
||||
static int crashing_cpu;
|
||||
|
||||
static u32 *append_elf_note(u32 *buf, char *name, unsigned type, void *data,
|
||||
size_t data_len)
|
||||
{
|
||||
struct elf_note note;
|
||||
|
||||
note.n_namesz = strlen(name) + 1;
|
||||
note.n_descsz = data_len;
|
||||
note.n_type = type;
|
||||
memcpy(buf, ¬e, sizeof(note));
|
||||
buf += (sizeof(note) +3)/4;
|
||||
memcpy(buf, name, note.n_namesz);
|
||||
buf += (note.n_namesz + 3)/4;
|
||||
memcpy(buf, data, note.n_descsz);
|
||||
buf += (note.n_descsz + 3)/4;
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
static void final_note(u32 *buf)
|
||||
{
|
||||
struct elf_note note;
|
||||
|
||||
note.n_namesz = 0;
|
||||
note.n_descsz = 0;
|
||||
note.n_type = 0;
|
||||
memcpy(buf, ¬e, sizeof(note));
|
||||
}
|
||||
|
||||
static void crash_save_this_cpu(struct pt_regs *regs, int cpu)
|
||||
{
|
||||
struct elf_prstatus prstatus;
|
||||
u32 *buf;
|
||||
|
||||
if ((cpu < 0) || (cpu >= NR_CPUS))
|
||||
return;
|
||||
|
||||
/* Using ELF notes here is opportunistic.
|
||||
* I need a well defined structure format
|
||||
* for the data I pass, and I need tags
|
||||
* on the data to indicate what information I have
|
||||
* squirrelled away. ELF notes happen to provide
|
||||
* all of that that no need to invent something new.
|
||||
*/
|
||||
buf = &crash_notes[cpu][0];
|
||||
memset(&prstatus, 0, sizeof(prstatus));
|
||||
prstatus.pr_pid = current->pid;
|
||||
elf_core_copy_regs(&prstatus.pr_reg, regs);
|
||||
buf = append_elf_note(buf, "CORE", NT_PRSTATUS, &prstatus,
|
||||
sizeof(prstatus));
|
||||
final_note(buf);
|
||||
}
|
||||
|
||||
static void crash_get_current_regs(struct pt_regs *regs)
|
||||
{
|
||||
__asm__ __volatile__("movl %%ebx,%0" : "=m"(regs->ebx));
|
||||
__asm__ __volatile__("movl %%ecx,%0" : "=m"(regs->ecx));
|
||||
__asm__ __volatile__("movl %%edx,%0" : "=m"(regs->edx));
|
||||
__asm__ __volatile__("movl %%esi,%0" : "=m"(regs->esi));
|
||||
__asm__ __volatile__("movl %%edi,%0" : "=m"(regs->edi));
|
||||
__asm__ __volatile__("movl %%ebp,%0" : "=m"(regs->ebp));
|
||||
__asm__ __volatile__("movl %%eax,%0" : "=m"(regs->eax));
|
||||
__asm__ __volatile__("movl %%esp,%0" : "=m"(regs->esp));
|
||||
__asm__ __volatile__("movw %%ss, %%ax;" :"=a"(regs->xss));
|
||||
__asm__ __volatile__("movw %%cs, %%ax;" :"=a"(regs->xcs));
|
||||
__asm__ __volatile__("movw %%ds, %%ax;" :"=a"(regs->xds));
|
||||
__asm__ __volatile__("movw %%es, %%ax;" :"=a"(regs->xes));
|
||||
__asm__ __volatile__("pushfl; popl %0" :"=m"(regs->eflags));
|
||||
|
||||
regs->eip = (unsigned long)current_text_addr();
|
||||
}
|
||||
|
||||
/* CPU does not save ss and esp on stack if execution is already
|
||||
* running in kernel mode at the time of NMI occurrence. This code
|
||||
* fixes it.
|
||||
*/
|
||||
static void crash_setup_regs(struct pt_regs *newregs, struct pt_regs *oldregs)
|
||||
{
|
||||
memcpy(newregs, oldregs, sizeof(*newregs));
|
||||
newregs->esp = (unsigned long)&(oldregs->esp);
|
||||
__asm__ __volatile__("xorl %eax, %eax;");
|
||||
__asm__ __volatile__ ("movw %%ss, %%ax;" :"=a"(newregs->xss));
|
||||
}
|
||||
|
||||
/* We may have saved_regs from where the error came from
|
||||
* or it is NULL if via a direct panic().
|
||||
*/
|
||||
static void crash_save_self(struct pt_regs *saved_regs)
|
||||
{
|
||||
struct pt_regs regs;
|
||||
int cpu;
|
||||
|
||||
cpu = smp_processor_id();
|
||||
if (saved_regs)
|
||||
crash_setup_regs(®s, saved_regs);
|
||||
else
|
||||
crash_get_current_regs(®s);
|
||||
crash_save_this_cpu(®s, cpu);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static atomic_t waiting_for_crash_ipi;
|
||||
|
||||
static int crash_nmi_callback(struct pt_regs *regs, int cpu)
|
||||
{
|
||||
struct pt_regs fixed_regs;
|
||||
|
||||
/* Don't do anything if this handler is invoked on crashing cpu.
|
||||
* Otherwise, system will completely hang. Crashing cpu can get
|
||||
* an NMI if system was initially booted with nmi_watchdog parameter.
|
||||
*/
|
||||
if (cpu == crashing_cpu)
|
||||
return 1;
|
||||
local_irq_disable();
|
||||
|
||||
if (!user_mode(regs)) {
|
||||
crash_setup_regs(&fixed_regs, regs);
|
||||
regs = &fixed_regs;
|
||||
}
|
||||
crash_save_this_cpu(regs, cpu);
|
||||
disable_local_APIC();
|
||||
atomic_dec(&waiting_for_crash_ipi);
|
||||
/* Assume hlt works */
|
||||
__asm__("hlt");
|
||||
for(;;);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* By using the NMI code instead of a vector we just sneak thru the
|
||||
* word generator coming out with just what we want. AND it does
|
||||
* not matter if clustered_apic_mode is set or not.
|
||||
*/
|
||||
static void smp_send_nmi_allbutself(void)
|
||||
{
|
||||
send_IPI_allbutself(APIC_DM_NMI);
|
||||
}
|
||||
|
||||
static void nmi_shootdown_cpus(void)
|
||||
{
|
||||
unsigned long msecs;
|
||||
|
||||
atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1);
|
||||
/* Would it be better to replace the trap vector here? */
|
||||
set_nmi_callback(crash_nmi_callback);
|
||||
/* Ensure the new callback function is set before sending
|
||||
* out the NMI
|
||||
*/
|
||||
wmb();
|
||||
|
||||
smp_send_nmi_allbutself();
|
||||
|
||||
msecs = 1000; /* Wait at most a second for the other cpus to stop */
|
||||
while ((atomic_read(&waiting_for_crash_ipi) > 0) && msecs) {
|
||||
mdelay(1);
|
||||
msecs--;
|
||||
}
|
||||
|
||||
/* Leave the nmi callback set */
|
||||
disable_local_APIC();
|
||||
}
|
||||
#else
|
||||
static void nmi_shootdown_cpus(void)
|
||||
{
|
||||
/* There are no cpus to shootdown */
|
||||
}
|
||||
#endif
|
||||
|
||||
void machine_crash_shutdown(struct pt_regs *regs)
|
||||
{
|
||||
/* This function is only called after the system
|
||||
* has paniced or is otherwise in a critical state.
|
||||
* The minimum amount of code to allow a kexec'd kernel
|
||||
* to run successfully needs to happen here.
|
||||
*
|
||||
* In practice this means shooting down the other cpus in
|
||||
* an SMP system.
|
||||
*/
|
||||
/* The kernel is broken so disable interrupts */
|
||||
local_irq_disable();
|
||||
|
||||
/* Make a note of crashing cpu. Will be used in NMI callback.*/
|
||||
crashing_cpu = smp_processor_id();
|
||||
nmi_shootdown_cpus();
|
||||
lapic_shutdown();
|
||||
#if defined(CONFIG_X86_IO_APIC)
|
||||
disable_IO_APIC();
|
||||
#endif
|
||||
crash_save_self(regs);
|
||||
}
|
|
@ -1,22 +1,15 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <asm/io.h>
|
||||
#include <linux/pm.h>
|
||||
#include <asm/system.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/bootmem.h>
|
||||
|
||||
|
||||
struct dmi_header
|
||||
{
|
||||
u8 type;
|
||||
u8 length;
|
||||
u16 handle;
|
||||
struct dmi_header {
|
||||
u8 type;
|
||||
u8 length;
|
||||
u16 handle;
|
||||
};
|
||||
|
||||
#undef DMI_DEBUG
|
||||
|
@ -29,15 +22,13 @@ struct dmi_header
|
|||
|
||||
static char * __init dmi_string(struct dmi_header *dm, u8 s)
|
||||
{
|
||||
u8 *bp=(u8 *)dm;
|
||||
bp+=dm->length;
|
||||
if(!s)
|
||||
u8 *bp = ((u8 *) dm) + dm->length;
|
||||
|
||||
if (!s)
|
||||
return "";
|
||||
s--;
|
||||
while(s>0 && *bp)
|
||||
{
|
||||
bp+=strlen(bp);
|
||||
bp++;
|
||||
while (s > 0 && *bp) {
|
||||
bp += strlen(bp) + 1;
|
||||
s--;
|
||||
}
|
||||
return bp;
|
||||
|
@ -47,16 +38,14 @@ static char * __init dmi_string(struct dmi_header *dm, u8 s)
|
|||
* We have to be cautious here. We have seen BIOSes with DMI pointers
|
||||
* pointing to completely the wrong place for example
|
||||
*/
|
||||
|
||||
static int __init dmi_table(u32 base, int len, int num, void (*decode)(struct dmi_header *))
|
||||
static int __init dmi_table(u32 base, int len, int num,
|
||||
void (*decode)(struct dmi_header *))
|
||||
{
|
||||
u8 *buf;
|
||||
struct dmi_header *dm;
|
||||
u8 *data;
|
||||
int i=0;
|
||||
u8 *buf, *data;
|
||||
int i = 0;
|
||||
|
||||
buf = bt_ioremap(base, len);
|
||||
if(buf==NULL)
|
||||
if (buf == NULL)
|
||||
return -1;
|
||||
|
||||
data = buf;
|
||||
|
@ -65,36 +54,34 @@ static int __init dmi_table(u32 base, int len, int num, void (*decode)(struct dm
|
|||
* Stop when we see all the items the table claimed to have
|
||||
* OR we run off the end of the table (also happens)
|
||||
*/
|
||||
|
||||
while(i<num && data-buf+sizeof(struct dmi_header)<=len)
|
||||
{
|
||||
dm=(struct dmi_header *)data;
|
||||
while ((i < num) && (data - buf + sizeof(struct dmi_header)) <= len) {
|
||||
struct dmi_header *dm = (struct dmi_header *)data;
|
||||
/*
|
||||
* We want to know the total length (formated area and strings)
|
||||
* before decoding to make sure we won't run off the table in
|
||||
* dmi_decode or dmi_string
|
||||
*/
|
||||
data+=dm->length;
|
||||
while(data-buf<len-1 && (data[0] || data[1]))
|
||||
data += dm->length;
|
||||
while ((data - buf < len - 1) && (data[0] || data[1]))
|
||||
data++;
|
||||
if(data-buf<len-1)
|
||||
if (data - buf < len - 1)
|
||||
decode(dm);
|
||||
data+=2;
|
||||
data += 2;
|
||||
i++;
|
||||
}
|
||||
bt_iounmap(buf, len);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
inline static int __init dmi_checksum(u8 *buf)
|
||||
static int __init dmi_checksum(u8 *buf)
|
||||
{
|
||||
u8 sum=0;
|
||||
u8 sum = 0;
|
||||
int a;
|
||||
|
||||
for(a=0; a<15; a++)
|
||||
sum+=buf[a];
|
||||
return (sum==0);
|
||||
for (a = 0; a < 15; a++)
|
||||
sum += buf[a];
|
||||
|
||||
return sum == 0;
|
||||
}
|
||||
|
||||
static int __init dmi_iterate(void (*decode)(struct dmi_header *))
|
||||
|
@ -110,28 +97,30 @@ static int __init dmi_iterate(void (*decode)(struct dmi_header *))
|
|||
p = ioremap(0xF0000, 0x10000);
|
||||
if (p == NULL)
|
||||
return -1;
|
||||
|
||||
for (q = p; q < p + 0x10000; q += 16) {
|
||||
memcpy_fromio(buf, q, 15);
|
||||
if(memcmp(buf, "_DMI_", 5)==0 && dmi_checksum(buf))
|
||||
{
|
||||
u16 num=buf[13]<<8|buf[12];
|
||||
u16 len=buf[7]<<8|buf[6];
|
||||
u32 base=buf[11]<<24|buf[10]<<16|buf[9]<<8|buf[8];
|
||||
if ((memcmp(buf, "_DMI_", 5) == 0) && dmi_checksum(buf)) {
|
||||
u16 num = (buf[13] << 8) | buf[12];
|
||||
u16 len = (buf[7] << 8) | buf[6];
|
||||
u32 base = (buf[11] << 24) | (buf[10] << 16) |
|
||||
(buf[9] << 8) | buf[8];
|
||||
|
||||
/*
|
||||
* DMI version 0.0 means that the real version is taken from
|
||||
* the SMBIOS version, which we don't know at this point.
|
||||
*/
|
||||
if(buf[14]!=0)
|
||||
if (buf[14] != 0)
|
||||
printk(KERN_INFO "DMI %d.%d present.\n",
|
||||
buf[14]>>4, buf[14]&0x0F);
|
||||
buf[14] >> 4, buf[14] & 0xF);
|
||||
else
|
||||
printk(KERN_INFO "DMI present.\n");
|
||||
|
||||
dmi_printk((KERN_INFO "%d structures occupying %d bytes.\n",
|
||||
num, len));
|
||||
dmi_printk((KERN_INFO "DMI table at 0x%08X.\n",
|
||||
base));
|
||||
if(dmi_table(base,len, num, decode)==0)
|
||||
dmi_printk((KERN_INFO "DMI table at 0x%08X.\n", base));
|
||||
|
||||
if (dmi_table(base,len, num, decode) == 0)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -143,298 +132,65 @@ static char *dmi_ident[DMI_STRING_MAX];
|
|||
/*
|
||||
* Save a DMI string
|
||||
*/
|
||||
|
||||
static void __init dmi_save_ident(struct dmi_header *dm, int slot, int string)
|
||||
{
|
||||
char *d = (char*)dm;
|
||||
char *p = dmi_string(dm, d[string]);
|
||||
if(p==NULL || *p == 0)
|
||||
|
||||
if (p == NULL || *p == 0)
|
||||
return;
|
||||
if (dmi_ident[slot])
|
||||
return;
|
||||
dmi_ident[slot] = alloc_bootmem(strlen(p)+1);
|
||||
|
||||
dmi_ident[slot] = alloc_bootmem(strlen(p) + 1);
|
||||
if(dmi_ident[slot])
|
||||
strcpy(dmi_ident[slot], p);
|
||||
else
|
||||
printk(KERN_ERR "dmi_save_ident: out of memory.\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* Ugly compatibility crap.
|
||||
*/
|
||||
#define dmi_blacklist dmi_system_id
|
||||
#define NO_MATCH { DMI_NONE, NULL}
|
||||
#define MATCH DMI_MATCH
|
||||
|
||||
/*
|
||||
* Toshiba keyboard likes to repeat keys when they are not repeated.
|
||||
*/
|
||||
|
||||
static __init int broken_toshiba_keyboard(struct dmi_blacklist *d)
|
||||
{
|
||||
printk(KERN_WARNING "Toshiba with broken keyboard detected. If your keyboard sometimes generates 3 keypresses instead of one, see http://davyd.ucc.asn.au/projects/toshiba/README\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_ACPI_SLEEP
|
||||
static __init int reset_videomode_after_s3(struct dmi_blacklist *d)
|
||||
{
|
||||
/* See acpi_wakeup.S */
|
||||
extern long acpi_video_flags;
|
||||
acpi_video_flags |= 2;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef CONFIG_ACPI_BOOT
|
||||
extern int acpi_force;
|
||||
|
||||
static __init __attribute__((unused)) int dmi_disable_acpi(struct dmi_blacklist *d)
|
||||
{
|
||||
if (!acpi_force) {
|
||||
printk(KERN_NOTICE "%s detected: acpi off\n",d->ident);
|
||||
disable_acpi();
|
||||
} else {
|
||||
printk(KERN_NOTICE
|
||||
"Warning: DMI blacklist says broken, but acpi forced\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Limit ACPI to CPU enumeration for HT
|
||||
*/
|
||||
static __init __attribute__((unused)) int force_acpi_ht(struct dmi_blacklist *d)
|
||||
{
|
||||
if (!acpi_force) {
|
||||
printk(KERN_NOTICE "%s detected: force use of acpi=ht\n", d->ident);
|
||||
disable_acpi();
|
||||
acpi_ht = 1;
|
||||
} else {
|
||||
printk(KERN_NOTICE
|
||||
"Warning: acpi=force overrules DMI blacklist: acpi=ht\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ACPI_PCI
|
||||
static __init int disable_acpi_irq(struct dmi_blacklist *d)
|
||||
{
|
||||
if (!acpi_force) {
|
||||
printk(KERN_NOTICE "%s detected: force use of acpi=noirq\n",
|
||||
d->ident);
|
||||
acpi_noirq_set();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
static __init int disable_acpi_pci(struct dmi_blacklist *d)
|
||||
{
|
||||
if (!acpi_force) {
|
||||
printk(KERN_NOTICE "%s detected: force use of pci=noacpi\n",
|
||||
d->ident);
|
||||
acpi_disable_pci();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Process the DMI blacklists
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* This will be expanded over time to force things like the APM
|
||||
* interrupt mask settings according to the laptop
|
||||
*/
|
||||
|
||||
static __initdata struct dmi_blacklist dmi_blacklist[]={
|
||||
|
||||
{ broken_toshiba_keyboard, "Toshiba Satellite 4030cdt", { /* Keyboard generates spurious repeats */
|
||||
MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"),
|
||||
NO_MATCH, NO_MATCH, NO_MATCH
|
||||
} },
|
||||
#ifdef CONFIG_ACPI_SLEEP
|
||||
{ reset_videomode_after_s3, "Toshiba Satellite 4030cdt", { /* Reset video mode after returning from ACPI S3 sleep */
|
||||
MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"),
|
||||
NO_MATCH, NO_MATCH, NO_MATCH
|
||||
} },
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ACPI_BOOT
|
||||
/*
|
||||
* If your system is blacklisted here, but you find that acpi=force
|
||||
* works for you, please contact acpi-devel@sourceforge.net
|
||||
*/
|
||||
|
||||
/*
|
||||
* Boxes that need ACPI disabled
|
||||
*/
|
||||
|
||||
{ dmi_disable_acpi, "IBM Thinkpad", {
|
||||
MATCH(DMI_BOARD_VENDOR, "IBM"),
|
||||
MATCH(DMI_BOARD_NAME, "2629H1G"),
|
||||
NO_MATCH, NO_MATCH }},
|
||||
|
||||
/*
|
||||
* Boxes that need acpi=ht
|
||||
*/
|
||||
|
||||
{ force_acpi_ht, "FSC Primergy T850", {
|
||||
MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
|
||||
MATCH(DMI_PRODUCT_NAME, "PRIMERGY T850"),
|
||||
NO_MATCH, NO_MATCH }},
|
||||
|
||||
{ force_acpi_ht, "DELL GX240", {
|
||||
MATCH(DMI_BOARD_VENDOR, "Dell Computer Corporation"),
|
||||
MATCH(DMI_BOARD_NAME, "OptiPlex GX240"),
|
||||
NO_MATCH, NO_MATCH }},
|
||||
|
||||
{ force_acpi_ht, "HP VISUALIZE NT Workstation", {
|
||||
MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
||||
MATCH(DMI_PRODUCT_NAME, "HP VISUALIZE NT Workstation"),
|
||||
NO_MATCH, NO_MATCH }},
|
||||
|
||||
{ force_acpi_ht, "Compaq Workstation W8000", {
|
||||
MATCH(DMI_SYS_VENDOR, "Compaq"),
|
||||
MATCH(DMI_PRODUCT_NAME, "Workstation W8000"),
|
||||
NO_MATCH, NO_MATCH }},
|
||||
|
||||
{ force_acpi_ht, "ASUS P4B266", {
|
||||
MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
|
||||
MATCH(DMI_BOARD_NAME, "P4B266"),
|
||||
NO_MATCH, NO_MATCH }},
|
||||
|
||||
{ force_acpi_ht, "ASUS P2B-DS", {
|
||||
MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
|
||||
MATCH(DMI_BOARD_NAME, "P2B-DS"),
|
||||
NO_MATCH, NO_MATCH }},
|
||||
|
||||
{ force_acpi_ht, "ASUS CUR-DLS", {
|
||||
MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
|
||||
MATCH(DMI_BOARD_NAME, "CUR-DLS"),
|
||||
NO_MATCH, NO_MATCH }},
|
||||
|
||||
{ force_acpi_ht, "ABIT i440BX-W83977", {
|
||||
MATCH(DMI_BOARD_VENDOR, "ABIT <http://www.abit.com>"),
|
||||
MATCH(DMI_BOARD_NAME, "i440BX-W83977 (BP6)"),
|
||||
NO_MATCH, NO_MATCH }},
|
||||
|
||||
{ force_acpi_ht, "IBM Bladecenter", {
|
||||
MATCH(DMI_BOARD_VENDOR, "IBM"),
|
||||
MATCH(DMI_BOARD_NAME, "IBM eServer BladeCenter HS20"),
|
||||
NO_MATCH, NO_MATCH }},
|
||||
|
||||
{ force_acpi_ht, "IBM eServer xSeries 360", {
|
||||
MATCH(DMI_BOARD_VENDOR, "IBM"),
|
||||
MATCH(DMI_BOARD_NAME, "eServer xSeries 360"),
|
||||
NO_MATCH, NO_MATCH }},
|
||||
|
||||
{ force_acpi_ht, "IBM eserver xSeries 330", {
|
||||
MATCH(DMI_BOARD_VENDOR, "IBM"),
|
||||
MATCH(DMI_BOARD_NAME, "eserver xSeries 330"),
|
||||
NO_MATCH, NO_MATCH }},
|
||||
|
||||
{ force_acpi_ht, "IBM eserver xSeries 440", {
|
||||
MATCH(DMI_BOARD_VENDOR, "IBM"),
|
||||
MATCH(DMI_PRODUCT_NAME, "eserver xSeries 440"),
|
||||
NO_MATCH, NO_MATCH }},
|
||||
|
||||
#endif // CONFIG_ACPI_BOOT
|
||||
|
||||
#ifdef CONFIG_ACPI_PCI
|
||||
/*
|
||||
* Boxes that need ACPI PCI IRQ routing disabled
|
||||
*/
|
||||
|
||||
{ disable_acpi_irq, "ASUS A7V", {
|
||||
MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC"),
|
||||
MATCH(DMI_BOARD_NAME, "<A7V>"),
|
||||
/* newer BIOS, Revision 1011, does work */
|
||||
MATCH(DMI_BIOS_VERSION, "ASUS A7V ACPI BIOS Revision 1007"),
|
||||
NO_MATCH }},
|
||||
|
||||
/*
|
||||
* Boxes that need ACPI PCI IRQ routing and PCI scan disabled
|
||||
*/
|
||||
{ disable_acpi_pci, "ASUS PR-DLS", { /* _BBN 0 bug */
|
||||
MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
|
||||
MATCH(DMI_BOARD_NAME, "PR-DLS"),
|
||||
MATCH(DMI_BIOS_VERSION, "ASUS PR-DLS ACPI BIOS Revision 1010"),
|
||||
MATCH(DMI_BIOS_DATE, "03/21/2003") }},
|
||||
|
||||
{ disable_acpi_pci, "Acer TravelMate 36x Laptop", {
|
||||
MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||
MATCH(DMI_PRODUCT_NAME, "TravelMate 360"),
|
||||
NO_MATCH, NO_MATCH
|
||||
} },
|
||||
|
||||
#endif
|
||||
|
||||
{ NULL, }
|
||||
};
|
||||
|
||||
/*
|
||||
* Process a DMI table entry. Right now all we care about are the BIOS
|
||||
* and machine entries. For 2.5 we should pull the smbus controller info
|
||||
* out of here.
|
||||
*/
|
||||
|
||||
static void __init dmi_decode(struct dmi_header *dm)
|
||||
{
|
||||
#ifdef DMI_DEBUG
|
||||
u8 *data = (u8 *)dm;
|
||||
#endif
|
||||
u8 *data __attribute__((__unused__)) = (u8 *)dm;
|
||||
|
||||
switch(dm->type)
|
||||
{
|
||||
case 0:
|
||||
dmi_printk(("BIOS Vendor: %s\n",
|
||||
dmi_string(dm, data[4])));
|
||||
dmi_save_ident(dm, DMI_BIOS_VENDOR, 4);
|
||||
dmi_printk(("BIOS Version: %s\n",
|
||||
dmi_string(dm, data[5])));
|
||||
dmi_save_ident(dm, DMI_BIOS_VERSION, 5);
|
||||
dmi_printk(("BIOS Release: %s\n",
|
||||
dmi_string(dm, data[8])));
|
||||
dmi_save_ident(dm, DMI_BIOS_DATE, 8);
|
||||
break;
|
||||
case 1:
|
||||
dmi_printk(("System Vendor: %s\n",
|
||||
dmi_string(dm, data[4])));
|
||||
dmi_save_ident(dm, DMI_SYS_VENDOR, 4);
|
||||
dmi_printk(("Product Name: %s\n",
|
||||
dmi_string(dm, data[5])));
|
||||
dmi_save_ident(dm, DMI_PRODUCT_NAME, 5);
|
||||
dmi_printk(("Version: %s\n",
|
||||
dmi_string(dm, data[6])));
|
||||
dmi_save_ident(dm, DMI_PRODUCT_VERSION, 6);
|
||||
dmi_printk(("Serial Number: %s\n",
|
||||
dmi_string(dm, data[7])));
|
||||
break;
|
||||
case 2:
|
||||
dmi_printk(("Board Vendor: %s\n",
|
||||
dmi_string(dm, data[4])));
|
||||
dmi_save_ident(dm, DMI_BOARD_VENDOR, 4);
|
||||
dmi_printk(("Board Name: %s\n",
|
||||
dmi_string(dm, data[5])));
|
||||
dmi_save_ident(dm, DMI_BOARD_NAME, 5);
|
||||
dmi_printk(("Board Version: %s\n",
|
||||
dmi_string(dm, data[6])));
|
||||
dmi_save_ident(dm, DMI_BOARD_VERSION, 6);
|
||||
break;
|
||||
switch(dm->type) {
|
||||
case 0:
|
||||
dmi_printk(("BIOS Vendor: %s\n", dmi_string(dm, data[4])));
|
||||
dmi_save_ident(dm, DMI_BIOS_VENDOR, 4);
|
||||
dmi_printk(("BIOS Version: %s\n", dmi_string(dm, data[5])));
|
||||
dmi_save_ident(dm, DMI_BIOS_VERSION, 5);
|
||||
dmi_printk(("BIOS Release: %s\n", dmi_string(dm, data[8])));
|
||||
dmi_save_ident(dm, DMI_BIOS_DATE, 8);
|
||||
break;
|
||||
case 1:
|
||||
dmi_printk(("System Vendor: %s\n", dmi_string(dm, data[4])));
|
||||
dmi_save_ident(dm, DMI_SYS_VENDOR, 4);
|
||||
dmi_printk(("Product Name: %s\n", dmi_string(dm, data[5])));
|
||||
dmi_save_ident(dm, DMI_PRODUCT_NAME, 5);
|
||||
dmi_printk(("Version: %s\n", dmi_string(dm, data[6])));
|
||||
dmi_save_ident(dm, DMI_PRODUCT_VERSION, 6);
|
||||
dmi_printk(("Serial Number: %s\n", dmi_string(dm, data[7])));
|
||||
dmi_save_ident(dm, DMI_PRODUCT_SERIAL, 7);
|
||||
break;
|
||||
case 2:
|
||||
dmi_printk(("Board Vendor: %s\n", dmi_string(dm, data[4])));
|
||||
dmi_save_ident(dm, DMI_BOARD_VENDOR, 4);
|
||||
dmi_printk(("Board Name: %s\n", dmi_string(dm, data[5])));
|
||||
dmi_save_ident(dm, DMI_BOARD_NAME, 5);
|
||||
dmi_printk(("Board Version: %s\n", dmi_string(dm, data[6])));
|
||||
dmi_save_ident(dm, DMI_BOARD_VERSION, 6);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void __init dmi_scan_machine(void)
|
||||
{
|
||||
int err = dmi_iterate(dmi_decode);
|
||||
if(err == 0)
|
||||
dmi_check_system(dmi_blacklist);
|
||||
else
|
||||
if (dmi_iterate(dmi_decode))
|
||||
printk(KERN_INFO "DMI not present.\n");
|
||||
}
|
||||
|
||||
|
@ -470,7 +226,6 @@ fail: d++;
|
|||
|
||||
return count;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(dmi_check_system);
|
||||
|
||||
/**
|
||||
|
@ -480,8 +235,8 @@ EXPORT_SYMBOL(dmi_check_system);
|
|||
* Returns one DMI data value, can be used to perform
|
||||
* complex DMI data checks.
|
||||
*/
|
||||
char * dmi_get_system_info(int field)
|
||||
char *dmi_get_system_info(int field)
|
||||
{
|
||||
return dmi_ident[field];
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(dmi_get_system_info);
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include <linux/ioport.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/efi.h>
|
||||
#include <linux/kexec.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/io.h>
|
||||
|
@ -598,6 +599,9 @@ efi_initialize_iomem_resources(struct resource *code_resource,
|
|||
if (md->type == EFI_CONVENTIONAL_MEMORY) {
|
||||
request_resource(res, code_resource);
|
||||
request_resource(res, data_resource);
|
||||
#ifdef CONFIG_KEXEC
|
||||
request_resource(res, &crashk_res);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -299,7 +299,6 @@ is386: movl $2,%ecx # set MP
|
|||
movl %eax,%cr0
|
||||
|
||||
call check_x87
|
||||
incb ready
|
||||
lgdt cpu_gdt_descr
|
||||
lidt idt_descr
|
||||
ljmp $(__KERNEL_CS),$1f
|
||||
|
@ -316,8 +315,9 @@ is386: movl $2,%ecx # set MP
|
|||
lldt %ax
|
||||
cld # gcc2 wants the direction flag cleared at all times
|
||||
#ifdef CONFIG_SMP
|
||||
movb ready, %cl
|
||||
cmpb $1,%cl
|
||||
movb ready, %cl
|
||||
movb $1, ready
|
||||
cmpb $0,%cl
|
||||
je 1f # the first CPU calls start_kernel
|
||||
# all other CPUs call initialize_secondary
|
||||
call initialize_secondary
|
||||
|
|
|
@ -268,10 +268,22 @@ static int i8259A_suspend(struct sys_device *dev, pm_message_t state)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int i8259A_shutdown(struct sys_device *dev)
|
||||
{
|
||||
/* Put the i8259A into a quiescent state that
|
||||
* the kernel initialization code can get it
|
||||
* out of.
|
||||
*/
|
||||
outb(0xff, 0x21); /* mask all of 8259A-1 */
|
||||
outb(0xff, 0xA1); /* mask all of 8259A-1 */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sysdev_class i8259_sysdev_class = {
|
||||
set_kset_name("i8259"),
|
||||
.suspend = i8259A_suspend,
|
||||
.resume = i8259A_resume,
|
||||
.shutdown = i8259A_shutdown,
|
||||
};
|
||||
|
||||
static struct sys_device device_i8259A = {
|
||||
|
|
|
@ -573,12 +573,14 @@ static int balanced_irq(void *unused)
|
|||
for ( ; ; ) {
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
time_remaining = schedule_timeout(time_remaining);
|
||||
try_to_freeze(PF_FREEZE);
|
||||
try_to_freeze();
|
||||
if (time_after(jiffies,
|
||||
prev_balance_time+balanced_irq_interval)) {
|
||||
preempt_disable();
|
||||
do_irq_balance();
|
||||
prev_balance_time = jiffies;
|
||||
time_remaining = balanced_irq_interval;
|
||||
preempt_enable();
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
@ -630,10 +632,8 @@ static int __init balanced_irq_init(void)
|
|||
printk(KERN_ERR "balanced_irq_init: failed to spawn balanced_irq");
|
||||
failed:
|
||||
for (i = 0; i < NR_CPUS; i++) {
|
||||
if(irq_cpu_data[i].irq_delta)
|
||||
kfree(irq_cpu_data[i].irq_delta);
|
||||
if(irq_cpu_data[i].last_irq)
|
||||
kfree(irq_cpu_data[i].last_irq);
|
||||
kfree(irq_cpu_data[i].irq_delta);
|
||||
kfree(irq_cpu_data[i].last_irq);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -1634,12 +1634,43 @@ static void __init enable_IO_APIC(void)
|
|||
*/
|
||||
void disable_IO_APIC(void)
|
||||
{
|
||||
int pin;
|
||||
/*
|
||||
* Clear the IO-APIC before rebooting:
|
||||
*/
|
||||
clear_IO_APIC();
|
||||
|
||||
disconnect_bsp_APIC();
|
||||
/*
|
||||
* If the i82559 is routed through an IOAPIC
|
||||
* Put that IOAPIC in virtual wire mode
|
||||
* so legacy interrups can be delivered.
|
||||
*/
|
||||
pin = find_isa_irq_pin(0, mp_ExtINT);
|
||||
if (pin != -1) {
|
||||
struct IO_APIC_route_entry entry;
|
||||
unsigned long flags;
|
||||
|
||||
memset(&entry, 0, sizeof(entry));
|
||||
entry.mask = 0; /* Enabled */
|
||||
entry.trigger = 0; /* Edge */
|
||||
entry.irr = 0;
|
||||
entry.polarity = 0; /* High */
|
||||
entry.delivery_status = 0;
|
||||
entry.dest_mode = 0; /* Physical */
|
||||
entry.delivery_mode = 7; /* ExtInt */
|
||||
entry.vector = 0;
|
||||
entry.dest.physical.physical_dest = 0;
|
||||
|
||||
|
||||
/*
|
||||
* Add it to the IO-APIC irq-routing table:
|
||||
*/
|
||||
spin_lock_irqsave(&ioapic_lock, flags);
|
||||
io_apic_write(0, 0x11+2*pin, *(((int *)&entry)+1));
|
||||
io_apic_write(0, 0x10+2*pin, *(((int *)&entry)+0));
|
||||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
}
|
||||
disconnect_bsp_APIC(pin != -1);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -15,6 +15,9 @@
|
|||
#include <linux/seq_file.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
DEFINE_PER_CPU(irq_cpustat_t, irq_stat) ____cacheline_maxaligned_in_smp;
|
||||
EXPORT_PER_CPU_SYMBOL(irq_stat);
|
||||
|
@ -153,6 +156,11 @@ void irq_ctx_init(int cpu)
|
|||
cpu,hardirq_ctx[cpu],softirq_ctx[cpu]);
|
||||
}
|
||||
|
||||
void irq_ctx_exit(int cpu)
|
||||
{
|
||||
hardirq_ctx[cpu] = NULL;
|
||||
}
|
||||
|
||||
extern asmlinkage void __do_softirq(void);
|
||||
|
||||
asmlinkage void do_softirq(void)
|
||||
|
@ -210,9 +218,8 @@ int show_interrupts(struct seq_file *p, void *v)
|
|||
|
||||
if (i == 0) {
|
||||
seq_printf(p, " ");
|
||||
for (j=0; j<NR_CPUS; j++)
|
||||
if (cpu_online(j))
|
||||
seq_printf(p, "CPU%d ",j);
|
||||
for_each_cpu(j)
|
||||
seq_printf(p, "CPU%d ",j);
|
||||
seq_putc(p, '\n');
|
||||
}
|
||||
|
||||
|
@ -225,9 +232,8 @@ int show_interrupts(struct seq_file *p, void *v)
|
|||
#ifndef CONFIG_SMP
|
||||
seq_printf(p, "%10u ", kstat_irqs(i));
|
||||
#else
|
||||
for (j = 0; j < NR_CPUS; j++)
|
||||
if (cpu_online(j))
|
||||
seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
|
||||
for_each_cpu(j)
|
||||
seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
|
||||
#endif
|
||||
seq_printf(p, " %14s", irq_desc[i].handler->typename);
|
||||
seq_printf(p, " %s", action->name);
|
||||
|
@ -240,16 +246,14 @@ skip:
|
|||
spin_unlock_irqrestore(&irq_desc[i].lock, flags);
|
||||
} else if (i == NR_IRQS) {
|
||||
seq_printf(p, "NMI: ");
|
||||
for (j = 0; j < NR_CPUS; j++)
|
||||
if (cpu_online(j))
|
||||
seq_printf(p, "%10u ", nmi_count(j));
|
||||
for_each_cpu(j)
|
||||
seq_printf(p, "%10u ", nmi_count(j));
|
||||
seq_putc(p, '\n');
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
seq_printf(p, "LOC: ");
|
||||
for (j = 0; j < NR_CPUS; j++)
|
||||
if (cpu_online(j))
|
||||
seq_printf(p, "%10u ",
|
||||
per_cpu(irq_stat,j).apic_timer_irqs);
|
||||
for_each_cpu(j)
|
||||
seq_printf(p, "%10u ",
|
||||
per_cpu(irq_stat,j).apic_timer_irqs);
|
||||
seq_putc(p, '\n');
|
||||
#endif
|
||||
seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
|
||||
|
@ -259,3 +263,45 @@ skip:
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
#include <mach_apic.h>
|
||||
|
||||
void fixup_irqs(cpumask_t map)
|
||||
{
|
||||
unsigned int irq;
|
||||
static int warned;
|
||||
|
||||
for (irq = 0; irq < NR_IRQS; irq++) {
|
||||
cpumask_t mask;
|
||||
if (irq == 2)
|
||||
continue;
|
||||
|
||||
cpus_and(mask, irq_affinity[irq], map);
|
||||
if (any_online_cpu(mask) == NR_CPUS) {
|
||||
printk("Breaking affinity for irq %i\n", irq);
|
||||
mask = map;
|
||||
}
|
||||
if (irq_desc[irq].handler->set_affinity)
|
||||
irq_desc[irq].handler->set_affinity(irq, mask);
|
||||
else if (irq_desc[irq].action && !(warned++))
|
||||
printk("Cannot set affinity for irq %i\n", irq);
|
||||
}
|
||||
|
||||
#if 0
|
||||
barrier();
|
||||
/* Ingo Molnar says: "after the IO-APIC masks have been redirected
|
||||
[note the nop - the interrupt-enable boundary on x86 is two
|
||||
instructions from sti] - to flush out pending hardirqs and
|
||||
IPIs. After this point nothing is supposed to reach this CPU." */
|
||||
__asm__ __volatile__("sti; nop; cli");
|
||||
barrier();
|
||||
#else
|
||||
/* That doesn't seem sufficient. Give it 1ms. */
|
||||
local_irq_enable();
|
||||
mdelay(1);
|
||||
local_irq_disable();
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
226
arch/i386/kernel/machine_kexec.c
Normal file
226
arch/i386/kernel/machine_kexec.c
Normal file
|
@ -0,0 +1,226 @@
|
|||
/*
|
||||
* machine_kexec.c - handle transition of Linux booting another kernel
|
||||
* Copyright (C) 2002-2005 Eric Biederman <ebiederm@xmission.com>
|
||||
*
|
||||
* This source code is licensed under the GNU General Public License,
|
||||
* Version 2. See the file COPYING for more details.
|
||||
*/
|
||||
|
||||
#include <linux/mm.h>
|
||||
#include <linux/kexec.h>
|
||||
#include <linux/delay.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/pgalloc.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/apic.h>
|
||||
#include <asm/cpufeature.h>
|
||||
|
||||
static inline unsigned long read_cr3(void)
|
||||
{
|
||||
unsigned long cr3;
|
||||
asm volatile("movl %%cr3,%0": "=r"(cr3));
|
||||
return cr3;
|
||||
}
|
||||
|
||||
#define PAGE_ALIGNED __attribute__ ((__aligned__(PAGE_SIZE)))
|
||||
|
||||
#define L0_ATTR (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY)
|
||||
#define L1_ATTR (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY)
|
||||
#define L2_ATTR (_PAGE_PRESENT)
|
||||
|
||||
#define LEVEL0_SIZE (1UL << 12UL)
|
||||
|
||||
#ifndef CONFIG_X86_PAE
|
||||
#define LEVEL1_SIZE (1UL << 22UL)
|
||||
static u32 pgtable_level1[1024] PAGE_ALIGNED;
|
||||
|
||||
static void identity_map_page(unsigned long address)
|
||||
{
|
||||
unsigned long level1_index, level2_index;
|
||||
u32 *pgtable_level2;
|
||||
|
||||
/* Find the current page table */
|
||||
pgtable_level2 = __va(read_cr3());
|
||||
|
||||
/* Find the indexes of the physical address to identity map */
|
||||
level1_index = (address % LEVEL1_SIZE)/LEVEL0_SIZE;
|
||||
level2_index = address / LEVEL1_SIZE;
|
||||
|
||||
/* Identity map the page table entry */
|
||||
pgtable_level1[level1_index] = address | L0_ATTR;
|
||||
pgtable_level2[level2_index] = __pa(pgtable_level1) | L1_ATTR;
|
||||
|
||||
/* Flush the tlb so the new mapping takes effect.
|
||||
* Global tlb entries are not flushed but that is not an issue.
|
||||
*/
|
||||
load_cr3(pgtable_level2);
|
||||
}
|
||||
|
||||
#else
|
||||
#define LEVEL1_SIZE (1UL << 21UL)
|
||||
#define LEVEL2_SIZE (1UL << 30UL)
|
||||
static u64 pgtable_level1[512] PAGE_ALIGNED;
|
||||
static u64 pgtable_level2[512] PAGE_ALIGNED;
|
||||
|
||||
static void identity_map_page(unsigned long address)
|
||||
{
|
||||
unsigned long level1_index, level2_index, level3_index;
|
||||
u64 *pgtable_level3;
|
||||
|
||||
/* Find the current page table */
|
||||
pgtable_level3 = __va(read_cr3());
|
||||
|
||||
/* Find the indexes of the physical address to identity map */
|
||||
level1_index = (address % LEVEL1_SIZE)/LEVEL0_SIZE;
|
||||
level2_index = (address % LEVEL2_SIZE)/LEVEL1_SIZE;
|
||||
level3_index = address / LEVEL2_SIZE;
|
||||
|
||||
/* Identity map the page table entry */
|
||||
pgtable_level1[level1_index] = address | L0_ATTR;
|
||||
pgtable_level2[level2_index] = __pa(pgtable_level1) | L1_ATTR;
|
||||
set_64bit(&pgtable_level3[level3_index],
|
||||
__pa(pgtable_level2) | L2_ATTR);
|
||||
|
||||
/* Flush the tlb so the new mapping takes effect.
|
||||
* Global tlb entries are not flushed but that is not an issue.
|
||||
*/
|
||||
load_cr3(pgtable_level3);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
static void set_idt(void *newidt, __u16 limit)
|
||||
{
|
||||
unsigned char curidt[6];
|
||||
|
||||
/* ia32 supports unaliged loads & stores */
|
||||
(*(__u16 *)(curidt)) = limit;
|
||||
(*(__u32 *)(curidt +2)) = (unsigned long)(newidt);
|
||||
|
||||
__asm__ __volatile__ (
|
||||
"lidt %0\n"
|
||||
: "=m" (curidt)
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
static void set_gdt(void *newgdt, __u16 limit)
|
||||
{
|
||||
unsigned char curgdt[6];
|
||||
|
||||
/* ia32 supports unaligned loads & stores */
|
||||
(*(__u16 *)(curgdt)) = limit;
|
||||
(*(__u32 *)(curgdt +2)) = (unsigned long)(newgdt);
|
||||
|
||||
__asm__ __volatile__ (
|
||||
"lgdt %0\n"
|
||||
: "=m" (curgdt)
|
||||
);
|
||||
};
|
||||
|
||||
static void load_segments(void)
|
||||
{
|
||||
#define __STR(X) #X
|
||||
#define STR(X) __STR(X)
|
||||
|
||||
__asm__ __volatile__ (
|
||||
"\tljmp $"STR(__KERNEL_CS)",$1f\n"
|
||||
"\t1:\n"
|
||||
"\tmovl $"STR(__KERNEL_DS)",%eax\n"
|
||||
"\tmovl %eax,%ds\n"
|
||||
"\tmovl %eax,%es\n"
|
||||
"\tmovl %eax,%fs\n"
|
||||
"\tmovl %eax,%gs\n"
|
||||
"\tmovl %eax,%ss\n"
|
||||
);
|
||||
#undef STR
|
||||
#undef __STR
|
||||
}
|
||||
|
||||
typedef asmlinkage NORET_TYPE void (*relocate_new_kernel_t)(
|
||||
unsigned long indirection_page,
|
||||
unsigned long reboot_code_buffer,
|
||||
unsigned long start_address,
|
||||
unsigned int has_pae) ATTRIB_NORET;
|
||||
|
||||
const extern unsigned char relocate_new_kernel[];
|
||||
extern void relocate_new_kernel_end(void);
|
||||
const extern unsigned int relocate_new_kernel_size;
|
||||
|
||||
/*
|
||||
* A architecture hook called to validate the
|
||||
* proposed image and prepare the control pages
|
||||
* as needed. The pages for KEXEC_CONTROL_CODE_SIZE
|
||||
* have been allocated, but the segments have yet
|
||||
* been copied into the kernel.
|
||||
*
|
||||
* Do what every setup is needed on image and the
|
||||
* reboot code buffer to allow us to avoid allocations
|
||||
* later.
|
||||
*
|
||||
* Currently nothing.
|
||||
*/
|
||||
int machine_kexec_prepare(struct kimage *image)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Undo anything leftover by machine_kexec_prepare
|
||||
* when an image is freed.
|
||||
*/
|
||||
void machine_kexec_cleanup(struct kimage *image)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* Do not allocate memory (or fail in any way) in machine_kexec().
|
||||
* We are past the point of no return, committed to rebooting now.
|
||||
*/
|
||||
NORET_TYPE void machine_kexec(struct kimage *image)
|
||||
{
|
||||
unsigned long page_list;
|
||||
unsigned long reboot_code_buffer;
|
||||
|
||||
relocate_new_kernel_t rnk;
|
||||
|
||||
/* Interrupts aren't acceptable while we reboot */
|
||||
local_irq_disable();
|
||||
|
||||
/* Compute some offsets */
|
||||
reboot_code_buffer = page_to_pfn(image->control_code_page)
|
||||
<< PAGE_SHIFT;
|
||||
page_list = image->head;
|
||||
|
||||
/* Set up an identity mapping for the reboot_code_buffer */
|
||||
identity_map_page(reboot_code_buffer);
|
||||
|
||||
/* copy it out */
|
||||
memcpy((void *)reboot_code_buffer, relocate_new_kernel,
|
||||
relocate_new_kernel_size);
|
||||
|
||||
/* The segment registers are funny things, they are
|
||||
* automatically loaded from a table, in memory wherever you
|
||||
* set them to a specific selector, but this table is never
|
||||
* accessed again you set the segment to a different selector.
|
||||
*
|
||||
* The more common model is are caches where the behide
|
||||
* the scenes work is done, but is also dropped at arbitrary
|
||||
* times.
|
||||
*
|
||||
* I take advantage of this here by force loading the
|
||||
* segments, before I zap the gdt with an invalid value.
|
||||
*/
|
||||
load_segments();
|
||||
/* The gdt & idt are now invalid.
|
||||
* If you want to load them you must set up your own idt & gdt.
|
||||
*/
|
||||
set_gdt(phys_to_virt(0),0);
|
||||
set_idt(phys_to_virt(0),0);
|
||||
|
||||
/* now call it */
|
||||
rnk = (relocate_new_kernel_t) reboot_code_buffer;
|
||||
(*rnk)(page_list, reboot_code_buffer, image->start, cpu_has_pae);
|
||||
}
|
|
@ -67,7 +67,6 @@ unsigned long mp_lapic_addr;
|
|||
|
||||
/* Processor that is doing the boot up */
|
||||
unsigned int boot_cpu_physical_apicid = -1U;
|
||||
unsigned int boot_cpu_logical_apicid = -1U;
|
||||
/* Internal processor count */
|
||||
static unsigned int __initdata num_processors;
|
||||
|
||||
|
@ -180,7 +179,6 @@ static void __init MP_processor_info (struct mpc_config_processor *m)
|
|||
if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) {
|
||||
Dprintk(" Bootup CPU\n");
|
||||
boot_cpu_physical_apicid = m->mpc_apicid;
|
||||
boot_cpu_logical_apicid = apicid;
|
||||
}
|
||||
|
||||
if (num_processors >= NR_CPUS) {
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/fs.h>
|
||||
|
@ -55,6 +56,9 @@
|
|||
#include <linux/irq.h>
|
||||
#include <linux/err.h>
|
||||
|
||||
#include <asm/tlbflush.h>
|
||||
#include <asm/cpu.h>
|
||||
|
||||
asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");
|
||||
|
||||
static int hlt_counter;
|
||||
|
@ -143,14 +147,42 @@ static void poll_idle (void)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
#include <asm/nmi.h>
|
||||
/* We don't actually take CPU down, just spin without interrupts. */
|
||||
static inline void play_dead(void)
|
||||
{
|
||||
/* This must be done before dead CPU ack */
|
||||
cpu_exit_clear();
|
||||
wbinvd();
|
||||
mb();
|
||||
/* Ack it */
|
||||
__get_cpu_var(cpu_state) = CPU_DEAD;
|
||||
|
||||
/*
|
||||
* With physical CPU hotplug, we should halt the cpu
|
||||
*/
|
||||
local_irq_disable();
|
||||
while (1)
|
||||
__asm__ __volatile__("hlt":::"memory");
|
||||
}
|
||||
#else
|
||||
static inline void play_dead(void)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
#endif /* CONFIG_HOTPLUG_CPU */
|
||||
|
||||
/*
|
||||
* The idle thread. There's no useful work to be
|
||||
* done, so just try to conserve power and have a
|
||||
* low exit latency (ie sit in a loop waiting for
|
||||
* somebody to say that they'd like to reschedule)
|
||||
*/
|
||||
void cpu_idle (void)
|
||||
void cpu_idle(void)
|
||||
{
|
||||
int cpu = raw_smp_processor_id();
|
||||
|
||||
/* endless idle loop with no priority at all */
|
||||
while (1) {
|
||||
while (!need_resched()) {
|
||||
|
@ -165,6 +197,9 @@ void cpu_idle (void)
|
|||
if (!idle)
|
||||
idle = default_idle;
|
||||
|
||||
if (cpu_is_offline(cpu))
|
||||
play_dead();
|
||||
|
||||
__get_cpu_var(irq_stat).idle_timestamp = jiffies;
|
||||
idle();
|
||||
}
|
||||
|
@ -223,7 +258,7 @@ static void mwait_idle(void)
|
|||
}
|
||||
}
|
||||
|
||||
void __init select_idle_routine(const struct cpuinfo_x86 *c)
|
||||
void __devinit select_idle_routine(const struct cpuinfo_x86 *c)
|
||||
{
|
||||
if (cpu_has(c, X86_FEATURE_MWAIT)) {
|
||||
printk("monitor/mwait feature present.\n");
|
||||
|
|
|
@ -26,7 +26,6 @@ static int reboot_mode;
|
|||
static int reboot_thru_bios;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
int reboot_smp = 0;
|
||||
static int reboot_cpu = -1;
|
||||
/* shamelessly grabbed from lib/vsprintf.c for readability */
|
||||
#define is_digit(c) ((c) >= '0' && (c) <= '9')
|
||||
|
@ -49,7 +48,6 @@ static int __init reboot_setup(char *str)
|
|||
break;
|
||||
#ifdef CONFIG_SMP
|
||||
case 's': /* "smp" reboot by executing reset on BSP or other CPU*/
|
||||
reboot_smp = 1;
|
||||
if (is_digit(*(str+1))) {
|
||||
reboot_cpu = (int) (*(str+1) - '0');
|
||||
if (is_digit(*(str+2)))
|
||||
|
@ -88,33 +86,9 @@ static int __init set_bios_reboot(struct dmi_system_id *d)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Some machines require the "reboot=s" commandline option, this quirk makes that automatic.
|
||||
*/
|
||||
static int __init set_smp_reboot(struct dmi_system_id *d)
|
||||
{
|
||||
#ifdef CONFIG_SMP
|
||||
if (!reboot_smp) {
|
||||
reboot_smp = 1;
|
||||
printk(KERN_INFO "%s series board detected. Selecting SMP-method for reboots.\n", d->ident);
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Some machines require the "reboot=b,s" commandline option, this quirk makes that automatic.
|
||||
*/
|
||||
static int __init set_smp_bios_reboot(struct dmi_system_id *d)
|
||||
{
|
||||
set_smp_reboot(d);
|
||||
set_bios_reboot(d);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct dmi_system_id __initdata reboot_dmi_table[] = {
|
||||
{ /* Handle problems with rebooting on Dell 1300's */
|
||||
.callback = set_smp_bios_reboot,
|
||||
.callback = set_bios_reboot,
|
||||
.ident = "Dell PowerEdge 1300",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
|
||||
|
@ -301,41 +275,32 @@ void machine_real_restart(unsigned char *code, int length)
|
|||
EXPORT_SYMBOL(machine_real_restart);
|
||||
#endif
|
||||
|
||||
void machine_restart(char * __unused)
|
||||
void machine_shutdown(void)
|
||||
{
|
||||
#ifdef CONFIG_SMP
|
||||
int cpuid;
|
||||
|
||||
cpuid = GET_APIC_ID(apic_read(APIC_ID));
|
||||
int reboot_cpu_id;
|
||||
|
||||
if (reboot_smp) {
|
||||
/* The boot cpu is always logical cpu 0 */
|
||||
reboot_cpu_id = 0;
|
||||
|
||||
/* check to see if reboot_cpu is valid
|
||||
if its not, default to the BSP */
|
||||
if ((reboot_cpu == -1) ||
|
||||
(reboot_cpu > (NR_CPUS -1)) ||
|
||||
!physid_isset(cpuid, phys_cpu_present_map))
|
||||
reboot_cpu = boot_cpu_physical_apicid;
|
||||
|
||||
reboot_smp = 0; /* use this as a flag to only go through this once*/
|
||||
/* re-run this function on the other CPUs
|
||||
it will fall though this section since we have
|
||||
cleared reboot_smp, and do the reboot if it is the
|
||||
correct CPU, otherwise it halts. */
|
||||
if (reboot_cpu != cpuid)
|
||||
smp_call_function((void *)machine_restart , NULL, 1, 0);
|
||||
/* See if there has been given a command line override */
|
||||
if ((reboot_cpu_id != -1) && (reboot_cpu < NR_CPUS) &&
|
||||
cpu_isset(reboot_cpu, cpu_online_map)) {
|
||||
reboot_cpu_id = reboot_cpu;
|
||||
}
|
||||
|
||||
/* if reboot_cpu is still -1, then we want a tradional reboot,
|
||||
and if we are not running on the reboot_cpu,, halt */
|
||||
if ((reboot_cpu != -1) && (cpuid != reboot_cpu)) {
|
||||
for (;;)
|
||||
__asm__ __volatile__ ("hlt");
|
||||
/* Make certain the cpu I'm rebooting on is online */
|
||||
if (!cpu_isset(reboot_cpu_id, cpu_online_map)) {
|
||||
reboot_cpu_id = smp_processor_id();
|
||||
}
|
||||
/*
|
||||
* Stop all CPUs and turn off local APICs and the IO-APIC, so
|
||||
* other OSs see a clean IRQ state.
|
||||
|
||||
/* Make certain I only run on the appropriate processor */
|
||||
set_cpus_allowed(current, cpumask_of_cpu(reboot_cpu_id));
|
||||
|
||||
/* O.K. Now that I'm on the appropriate processor, stop
|
||||
* all of the others, and disable their local APICs.
|
||||
*/
|
||||
|
||||
smp_send_stop();
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
|
@ -344,6 +309,11 @@ void machine_restart(char * __unused)
|
|||
#ifdef CONFIG_X86_IO_APIC
|
||||
disable_IO_APIC();
|
||||
#endif
|
||||
}
|
||||
|
||||
void machine_restart(char * __unused)
|
||||
{
|
||||
machine_shutdown();
|
||||
|
||||
if (!reboot_thru_bios) {
|
||||
if (efi_enabled) {
|
||||
|
|
120
arch/i386/kernel/relocate_kernel.S
Normal file
120
arch/i386/kernel/relocate_kernel.S
Normal file
|
@ -0,0 +1,120 @@
|
|||
/*
|
||||
* relocate_kernel.S - put the kernel image in place to boot
|
||||
* Copyright (C) 2002-2004 Eric Biederman <ebiederm@xmission.com>
|
||||
*
|
||||
* This source code is licensed under the GNU General Public License,
|
||||
* Version 2. See the file COPYING for more details.
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
|
||||
/*
|
||||
* Must be relocatable PIC code callable as a C function, that once
|
||||
* it starts can not use the previous processes stack.
|
||||
*/
|
||||
.globl relocate_new_kernel
|
||||
relocate_new_kernel:
|
||||
/* read the arguments and say goodbye to the stack */
|
||||
movl 4(%esp), %ebx /* page_list */
|
||||
movl 8(%esp), %ebp /* reboot_code_buffer */
|
||||
movl 12(%esp), %edx /* start address */
|
||||
movl 16(%esp), %ecx /* cpu_has_pae */
|
||||
|
||||
/* zero out flags, and disable interrupts */
|
||||
pushl $0
|
||||
popfl
|
||||
|
||||
/* set a new stack at the bottom of our page... */
|
||||
lea 4096(%ebp), %esp
|
||||
|
||||
/* store the parameters back on the stack */
|
||||
pushl %edx /* store the start address */
|
||||
|
||||
/* Set cr0 to a known state:
|
||||
* 31 0 == Paging disabled
|
||||
* 18 0 == Alignment check disabled
|
||||
* 16 0 == Write protect disabled
|
||||
* 3 0 == No task switch
|
||||
* 2 0 == Don't do FP software emulation.
|
||||
* 0 1 == Proctected mode enabled
|
||||
*/
|
||||
movl %cr0, %eax
|
||||
andl $~((1<<31)|(1<<18)|(1<<16)|(1<<3)|(1<<2)), %eax
|
||||
orl $(1<<0), %eax
|
||||
movl %eax, %cr0
|
||||
|
||||
/* clear cr4 if applicable */
|
||||
testl %ecx, %ecx
|
||||
jz 1f
|
||||
/* Set cr4 to a known state:
|
||||
* Setting everything to zero seems safe.
|
||||
*/
|
||||
movl %cr4, %eax
|
||||
andl $0, %eax
|
||||
movl %eax, %cr4
|
||||
|
||||
jmp 1f
|
||||
1:
|
||||
|
||||
/* Flush the TLB (needed?) */
|
||||
xorl %eax, %eax
|
||||
movl %eax, %cr3
|
||||
|
||||
/* Do the copies */
|
||||
movl %ebx, %ecx
|
||||
jmp 1f
|
||||
|
||||
0: /* top, read another word from the indirection page */
|
||||
movl (%ebx), %ecx
|
||||
addl $4, %ebx
|
||||
1:
|
||||
testl $0x1, %ecx /* is it a destination page */
|
||||
jz 2f
|
||||
movl %ecx, %edi
|
||||
andl $0xfffff000, %edi
|
||||
jmp 0b
|
||||
2:
|
||||
testl $0x2, %ecx /* is it an indirection page */
|
||||
jz 2f
|
||||
movl %ecx, %ebx
|
||||
andl $0xfffff000, %ebx
|
||||
jmp 0b
|
||||
2:
|
||||
testl $0x4, %ecx /* is it the done indicator */
|
||||
jz 2f
|
||||
jmp 3f
|
||||
2:
|
||||
testl $0x8, %ecx /* is it the source indicator */
|
||||
jz 0b /* Ignore it otherwise */
|
||||
movl %ecx, %esi /* For every source page do a copy */
|
||||
andl $0xfffff000, %esi
|
||||
|
||||
movl $1024, %ecx
|
||||
rep ; movsl
|
||||
jmp 0b
|
||||
|
||||
3:
|
||||
|
||||
/* To be certain of avoiding problems with self-modifying code
|
||||
* I need to execute a serializing instruction here.
|
||||
* So I flush the TLB, it's handy, and not processor dependent.
|
||||
*/
|
||||
xorl %eax, %eax
|
||||
movl %eax, %cr3
|
||||
|
||||
/* set all of the registers to known values */
|
||||
/* leave %esp alone */
|
||||
|
||||
xorl %eax, %eax
|
||||
xorl %ebx, %ebx
|
||||
xorl %ecx, %ecx
|
||||
xorl %edx, %edx
|
||||
xorl %esi, %esi
|
||||
xorl %edi, %edi
|
||||
xorl %ebp, %ebp
|
||||
ret
|
||||
relocate_new_kernel_end:
|
||||
|
||||
.globl relocate_new_kernel_size
|
||||
relocate_new_kernel_size:
|
||||
.long relocate_new_kernel_end - relocate_new_kernel
|
|
@ -43,7 +43,12 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/edd.h>
|
||||
#include <linux/nodemask.h>
|
||||
#include <linux/kexec.h>
|
||||
#include <linux/crash_dump.h>
|
||||
|
||||
#include <video/edid.h>
|
||||
|
||||
#include <asm/apic.h>
|
||||
#include <asm/e820.h>
|
||||
#include <asm/mpspec.h>
|
||||
#include <asm/setup.h>
|
||||
|
@ -55,12 +60,15 @@
|
|||
#include "setup_arch_pre.h"
|
||||
#include <bios_ebda.h>
|
||||
|
||||
/* Forward Declaration. */
|
||||
void __init find_max_pfn(void);
|
||||
|
||||
/* This value is set up by the early boot code to point to the value
|
||||
immediately after the boot time page tables. It contains a *physical*
|
||||
address, and must not be in the .bss segment! */
|
||||
unsigned long init_pg_tables_end __initdata = ~0UL;
|
||||
|
||||
int disable_pse __initdata = 0;
|
||||
int disable_pse __devinitdata = 0;
|
||||
|
||||
/*
|
||||
* Machine setup..
|
||||
|
@ -732,6 +740,15 @@ static void __init parse_cmdline_early (char ** cmdline_p)
|
|||
if (to != command_line)
|
||||
to--;
|
||||
if (!memcmp(from+7, "exactmap", 8)) {
|
||||
#ifdef CONFIG_CRASH_DUMP
|
||||
/* If we are doing a crash dump, we
|
||||
* still need to know the real mem
|
||||
* size before original memory map is
|
||||
* reset.
|
||||
*/
|
||||
find_max_pfn();
|
||||
saved_max_pfn = max_pfn;
|
||||
#endif
|
||||
from += 8+7;
|
||||
e820.nr_map = 0;
|
||||
userdef = 1;
|
||||
|
@ -835,6 +852,44 @@ static void __init parse_cmdline_early (char ** cmdline_p)
|
|||
#endif /* CONFIG_X86_LOCAL_APIC */
|
||||
#endif /* CONFIG_ACPI_BOOT */
|
||||
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
/* enable local APIC */
|
||||
else if (!memcmp(from, "lapic", 5))
|
||||
lapic_enable();
|
||||
|
||||
/* disable local APIC */
|
||||
else if (!memcmp(from, "nolapic", 6))
|
||||
lapic_disable();
|
||||
#endif /* CONFIG_X86_LOCAL_APIC */
|
||||
|
||||
#ifdef CONFIG_KEXEC
|
||||
/* crashkernel=size@addr specifies the location to reserve for
|
||||
* a crash kernel. By reserving this memory we guarantee
|
||||
* that linux never set's it up as a DMA target.
|
||||
* Useful for holding code to do something appropriate
|
||||
* after a kernel panic.
|
||||
*/
|
||||
else if (!memcmp(from, "crashkernel=", 12)) {
|
||||
unsigned long size, base;
|
||||
size = memparse(from+12, &from);
|
||||
if (*from == '@') {
|
||||
base = memparse(from+1, &from);
|
||||
/* FIXME: Do I want a sanity check
|
||||
* to validate the memory range?
|
||||
*/
|
||||
crashk_res.start = base;
|
||||
crashk_res.end = base + size - 1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#ifdef CONFIG_CRASH_DUMP
|
||||
/* elfcorehdr= specifies the location of elf core header
|
||||
* stored by the crashed kernel.
|
||||
*/
|
||||
else if (!memcmp(from, "elfcorehdr=", 11))
|
||||
elfcorehdr_addr = memparse(from+11, &from);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* highmem=size forces highmem to be exactly 'size' bytes.
|
||||
* This works even on boxes that have no highmem otherwise.
|
||||
|
@ -1113,8 +1168,8 @@ void __init setup_bootmem_allocator(void)
|
|||
* the (very unlikely) case of us accidentally initializing the
|
||||
* bootmem allocator with an invalid RAM area.
|
||||
*/
|
||||
reserve_bootmem(HIGH_MEMORY, (PFN_PHYS(min_low_pfn) +
|
||||
bootmap_size + PAGE_SIZE-1) - (HIGH_MEMORY));
|
||||
reserve_bootmem(__PHYSICAL_START, (PFN_PHYS(min_low_pfn) +
|
||||
bootmap_size + PAGE_SIZE-1) - (__PHYSICAL_START));
|
||||
|
||||
/*
|
||||
* reserve physical page 0 - it's a special BIOS page on many boxes,
|
||||
|
@ -1170,6 +1225,11 @@ void __init setup_bootmem_allocator(void)
|
|||
}
|
||||
}
|
||||
#endif
|
||||
#ifdef CONFIG_KEXEC
|
||||
if (crashk_res.start != crashk_res.end)
|
||||
reserve_bootmem(crashk_res.start,
|
||||
crashk_res.end - crashk_res.start + 1);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1223,6 +1283,9 @@ legacy_init_iomem_resources(struct resource *code_resource, struct resource *dat
|
|||
*/
|
||||
request_resource(res, code_resource);
|
||||
request_resource(res, data_resource);
|
||||
#ifdef CONFIG_KEXEC
|
||||
request_resource(res, &crashk_res);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -608,10 +608,8 @@ int fastcall do_signal(struct pt_regs *regs, sigset_t *oldset)
|
|||
if (!user_mode(regs))
|
||||
return 1;
|
||||
|
||||
if (current->flags & PF_FREEZE) {
|
||||
refrigerator(0);
|
||||
if (try_to_freeze())
|
||||
goto no_signal;
|
||||
}
|
||||
|
||||
if (!oldset)
|
||||
oldset = ¤t->blocked;
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <linux/mc146818rtc.h>
|
||||
#include <linux/cache.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <asm/mtrr.h>
|
||||
|
@ -164,7 +165,7 @@ void send_IPI_mask_bitmask(cpumask_t cpumask, int vector)
|
|||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
WARN_ON(mask & ~cpus_addr(cpu_online_map)[0]);
|
||||
/*
|
||||
* Wait for idle.
|
||||
*/
|
||||
|
@ -346,21 +347,21 @@ out:
|
|||
static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm,
|
||||
unsigned long va)
|
||||
{
|
||||
cpumask_t tmp;
|
||||
/*
|
||||
* A couple of (to be removed) sanity checks:
|
||||
*
|
||||
* - we do not send IPIs to not-yet booted CPUs.
|
||||
* - current CPU must not be in mask
|
||||
* - mask must exist :)
|
||||
*/
|
||||
BUG_ON(cpus_empty(cpumask));
|
||||
|
||||
cpus_and(tmp, cpumask, cpu_online_map);
|
||||
BUG_ON(!cpus_equal(cpumask, tmp));
|
||||
BUG_ON(cpu_isset(smp_processor_id(), cpumask));
|
||||
BUG_ON(!mm);
|
||||
|
||||
/* If a CPU which we ran on has gone down, OK. */
|
||||
cpus_and(cpumask, cpumask, cpu_online_map);
|
||||
if (cpus_empty(cpumask))
|
||||
return;
|
||||
|
||||
/*
|
||||
* i'm not happy about this global shared spinlock in the
|
||||
* MM hot path, but we'll see how contended it is.
|
||||
|
@ -476,6 +477,7 @@ void flush_tlb_all(void)
|
|||
*/
|
||||
void smp_send_reschedule(int cpu)
|
||||
{
|
||||
WARN_ON(cpu_is_offline(cpu));
|
||||
send_IPI_mask(cpumask_of_cpu(cpu), RESCHEDULE_VECTOR);
|
||||
}
|
||||
|
||||
|
@ -493,6 +495,16 @@ struct call_data_struct {
|
|||
int wait;
|
||||
};
|
||||
|
||||
void lock_ipi_call_lock(void)
|
||||
{
|
||||
spin_lock_irq(&call_lock);
|
||||
}
|
||||
|
||||
void unlock_ipi_call_lock(void)
|
||||
{
|
||||
spin_unlock_irq(&call_lock);
|
||||
}
|
||||
|
||||
static struct call_data_struct * call_data;
|
||||
|
||||
/*
|
||||
|
@ -516,10 +528,15 @@ int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
|
|||
*/
|
||||
{
|
||||
struct call_data_struct data;
|
||||
int cpus = num_online_cpus()-1;
|
||||
int cpus;
|
||||
|
||||
if (!cpus)
|
||||
/* Holding any lock stops cpus from going down. */
|
||||
spin_lock(&call_lock);
|
||||
cpus = num_online_cpus() - 1;
|
||||
if (!cpus) {
|
||||
spin_unlock(&call_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Can deadlock when called with interrupts disabled */
|
||||
WARN_ON(irqs_disabled());
|
||||
|
@ -531,7 +548,6 @@ int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
|
|||
if (wait)
|
||||
atomic_set(&data.finished, 0);
|
||||
|
||||
spin_lock(&call_lock);
|
||||
call_data = &data;
|
||||
mb();
|
||||
|
||||
|
|
|
@ -44,6 +44,9 @@
|
|||
#include <linux/smp_lock.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/percpu.h>
|
||||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/mc146818rtc.h>
|
||||
|
@ -56,18 +59,28 @@
|
|||
#include <smpboot_hooks.h>
|
||||
|
||||
/* Set if we find a B stepping CPU */
|
||||
static int __initdata smp_b_stepping;
|
||||
static int __devinitdata smp_b_stepping;
|
||||
|
||||
/* Number of siblings per CPU package */
|
||||
int smp_num_siblings = 1;
|
||||
#ifdef CONFIG_X86_HT
|
||||
EXPORT_SYMBOL(smp_num_siblings);
|
||||
#endif
|
||||
int phys_proc_id[NR_CPUS]; /* Package ID of each logical CPU */
|
||||
|
||||
/* Package ID of each logical CPU */
|
||||
int phys_proc_id[NR_CPUS] = {[0 ... NR_CPUS-1] = BAD_APICID};
|
||||
EXPORT_SYMBOL(phys_proc_id);
|
||||
int cpu_core_id[NR_CPUS]; /* Core ID of each logical CPU */
|
||||
|
||||
/* Core ID of each logical CPU */
|
||||
int cpu_core_id[NR_CPUS] = {[0 ... NR_CPUS-1] = BAD_APICID};
|
||||
EXPORT_SYMBOL(cpu_core_id);
|
||||
|
||||
cpumask_t cpu_sibling_map[NR_CPUS];
|
||||
EXPORT_SYMBOL(cpu_sibling_map);
|
||||
|
||||
cpumask_t cpu_core_map[NR_CPUS];
|
||||
EXPORT_SYMBOL(cpu_core_map);
|
||||
|
||||
/* bitmap of online cpus */
|
||||
cpumask_t cpu_online_map;
|
||||
EXPORT_SYMBOL(cpu_online_map);
|
||||
|
@ -77,6 +90,12 @@ cpumask_t cpu_callout_map;
|
|||
EXPORT_SYMBOL(cpu_callout_map);
|
||||
static cpumask_t smp_commenced_mask;
|
||||
|
||||
/* TSC's upper 32 bits can't be written in eariler CPU (before prescott), there
|
||||
* is no way to resync one AP against BP. TBD: for prescott and above, we
|
||||
* should use IA64's algorithm
|
||||
*/
|
||||
static int __devinitdata tsc_sync_disabled;
|
||||
|
||||
/* Per CPU bogomips and other parameters */
|
||||
struct cpuinfo_x86 cpu_data[NR_CPUS] __cacheline_aligned;
|
||||
EXPORT_SYMBOL(cpu_data);
|
||||
|
@ -96,13 +115,16 @@ static int trampoline_exec;
|
|||
|
||||
static void map_cpu_to_logical_apicid(void);
|
||||
|
||||
/* State of each CPU. */
|
||||
DEFINE_PER_CPU(int, cpu_state) = { 0 };
|
||||
|
||||
/*
|
||||
* Currently trivial. Write the real->protected mode
|
||||
* bootstrap into the page concerned. The caller
|
||||
* has made sure it's suitably aligned.
|
||||
*/
|
||||
|
||||
static unsigned long __init setup_trampoline(void)
|
||||
static unsigned long __devinit setup_trampoline(void)
|
||||
{
|
||||
memcpy(trampoline_base, trampoline_data, trampoline_end - trampoline_data);
|
||||
return virt_to_phys(trampoline_base);
|
||||
|
@ -132,7 +154,7 @@ void __init smp_alloc_memory(void)
|
|||
* a given CPU
|
||||
*/
|
||||
|
||||
static void __init smp_store_cpu_info(int id)
|
||||
static void __devinit smp_store_cpu_info(int id)
|
||||
{
|
||||
struct cpuinfo_x86 *c = cpu_data + id;
|
||||
|
||||
|
@ -326,7 +348,7 @@ extern void calibrate_delay(void);
|
|||
|
||||
static atomic_t init_deasserted;
|
||||
|
||||
static void __init smp_callin(void)
|
||||
static void __devinit smp_callin(void)
|
||||
{
|
||||
int cpuid, phys_id;
|
||||
unsigned long timeout;
|
||||
|
@ -411,16 +433,48 @@ static void __init smp_callin(void)
|
|||
/*
|
||||
* Synchronize the TSC with the BP
|
||||
*/
|
||||
if (cpu_has_tsc && cpu_khz)
|
||||
if (cpu_has_tsc && cpu_khz && !tsc_sync_disabled)
|
||||
synchronize_tsc_ap();
|
||||
}
|
||||
|
||||
static int cpucount;
|
||||
|
||||
static inline void
|
||||
set_cpu_sibling_map(int cpu)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (smp_num_siblings > 1) {
|
||||
for (i = 0; i < NR_CPUS; i++) {
|
||||
if (!cpu_isset(i, cpu_callout_map))
|
||||
continue;
|
||||
if (cpu_core_id[cpu] == cpu_core_id[i]) {
|
||||
cpu_set(i, cpu_sibling_map[cpu]);
|
||||
cpu_set(cpu, cpu_sibling_map[i]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
cpu_set(cpu, cpu_sibling_map[cpu]);
|
||||
}
|
||||
|
||||
if (current_cpu_data.x86_num_cores > 1) {
|
||||
for (i = 0; i < NR_CPUS; i++) {
|
||||
if (!cpu_isset(i, cpu_callout_map))
|
||||
continue;
|
||||
if (phys_proc_id[cpu] == phys_proc_id[i]) {
|
||||
cpu_set(i, cpu_core_map[cpu]);
|
||||
cpu_set(cpu, cpu_core_map[i]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
cpu_core_map[cpu] = cpu_sibling_map[cpu];
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Activate a secondary processor.
|
||||
*/
|
||||
static void __init start_secondary(void *unused)
|
||||
static void __devinit start_secondary(void *unused)
|
||||
{
|
||||
/*
|
||||
* Dont put anything before smp_callin(), SMP
|
||||
|
@ -443,7 +497,23 @@ static void __init start_secondary(void *unused)
|
|||
* the local TLBs too.
|
||||
*/
|
||||
local_flush_tlb();
|
||||
|
||||
/* This must be done before setting cpu_online_map */
|
||||
set_cpu_sibling_map(raw_smp_processor_id());
|
||||
wmb();
|
||||
|
||||
/*
|
||||
* We need to hold call_lock, so there is no inconsistency
|
||||
* between the time smp_call_function() determines number of
|
||||
* IPI receipients, and the time when the determination is made
|
||||
* for which cpus receive the IPI. Holding this
|
||||
* lock helps us to not include this cpu in a currently in progress
|
||||
* smp_call_function().
|
||||
*/
|
||||
lock_ipi_call_lock();
|
||||
cpu_set(smp_processor_id(), cpu_online_map);
|
||||
unlock_ipi_call_lock();
|
||||
per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE;
|
||||
|
||||
/* We can take interrupts now: we're officially "up". */
|
||||
local_irq_enable();
|
||||
|
@ -458,7 +528,7 @@ static void __init start_secondary(void *unused)
|
|||
* from the task structure
|
||||
* This function must not return.
|
||||
*/
|
||||
void __init initialize_secondary(void)
|
||||
void __devinit initialize_secondary(void)
|
||||
{
|
||||
/*
|
||||
* We don't actually need to load the full TSS,
|
||||
|
@ -572,7 +642,7 @@ static inline void __inquire_remote_apic(int apicid)
|
|||
* INIT, INIT, STARTUP sequence will reset the chip hard for us, and this
|
||||
* won't ... remember to clear down the APIC, etc later.
|
||||
*/
|
||||
static int __init
|
||||
static int __devinit
|
||||
wakeup_secondary_cpu(int logical_apicid, unsigned long start_eip)
|
||||
{
|
||||
unsigned long send_status = 0, accept_status = 0;
|
||||
|
@ -618,7 +688,7 @@ wakeup_secondary_cpu(int logical_apicid, unsigned long start_eip)
|
|||
#endif /* WAKE_SECONDARY_VIA_NMI */
|
||||
|
||||
#ifdef WAKE_SECONDARY_VIA_INIT
|
||||
static int __init
|
||||
static int __devinit
|
||||
wakeup_secondary_cpu(int phys_apicid, unsigned long start_eip)
|
||||
{
|
||||
unsigned long send_status = 0, accept_status = 0;
|
||||
|
@ -753,8 +823,43 @@ wakeup_secondary_cpu(int phys_apicid, unsigned long start_eip)
|
|||
#endif /* WAKE_SECONDARY_VIA_INIT */
|
||||
|
||||
extern cpumask_t cpu_initialized;
|
||||
static inline int alloc_cpu_id(void)
|
||||
{
|
||||
cpumask_t tmp_map;
|
||||
int cpu;
|
||||
cpus_complement(tmp_map, cpu_present_map);
|
||||
cpu = first_cpu(tmp_map);
|
||||
if (cpu >= NR_CPUS)
|
||||
return -ENODEV;
|
||||
return cpu;
|
||||
}
|
||||
|
||||
static int __init do_boot_cpu(int apicid)
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
static struct task_struct * __devinitdata cpu_idle_tasks[NR_CPUS];
|
||||
static inline struct task_struct * alloc_idle_task(int cpu)
|
||||
{
|
||||
struct task_struct *idle;
|
||||
|
||||
if ((idle = cpu_idle_tasks[cpu]) != NULL) {
|
||||
/* initialize thread_struct. we really want to avoid destroy
|
||||
* idle tread
|
||||
*/
|
||||
idle->thread.esp = (unsigned long)(((struct pt_regs *)
|
||||
(THREAD_SIZE + (unsigned long) idle->thread_info)) - 1);
|
||||
init_idle(idle, cpu);
|
||||
return idle;
|
||||
}
|
||||
idle = fork_idle(cpu);
|
||||
|
||||
if (!IS_ERR(idle))
|
||||
cpu_idle_tasks[cpu] = idle;
|
||||
return idle;
|
||||
}
|
||||
#else
|
||||
#define alloc_idle_task(cpu) fork_idle(cpu)
|
||||
#endif
|
||||
|
||||
static int __devinit do_boot_cpu(int apicid, int cpu)
|
||||
/*
|
||||
* NOTE - on most systems this is a PHYSICAL apic ID, but on multiquad
|
||||
* (ie clustered apic addressing mode), this is a LOGICAL apic ID.
|
||||
|
@ -763,16 +868,17 @@ static int __init do_boot_cpu(int apicid)
|
|||
{
|
||||
struct task_struct *idle;
|
||||
unsigned long boot_error;
|
||||
int timeout, cpu;
|
||||
int timeout;
|
||||
unsigned long start_eip;
|
||||
unsigned short nmi_high = 0, nmi_low = 0;
|
||||
|
||||
cpu = ++cpucount;
|
||||
++cpucount;
|
||||
|
||||
/*
|
||||
* We can't use kernel_thread since we must avoid to
|
||||
* reschedule the child.
|
||||
*/
|
||||
idle = fork_idle(cpu);
|
||||
idle = alloc_idle_task(cpu);
|
||||
if (IS_ERR(idle))
|
||||
panic("failed fork for CPU %d", cpu);
|
||||
idle->thread.eip = (unsigned long) start_secondary;
|
||||
|
@ -839,13 +945,16 @@ static int __init do_boot_cpu(int apicid)
|
|||
inquire_remote_apic(apicid);
|
||||
}
|
||||
}
|
||||
x86_cpu_to_apicid[cpu] = apicid;
|
||||
|
||||
if (boot_error) {
|
||||
/* Try to put things back the way they were before ... */
|
||||
unmap_cpu_to_logical_apicid(cpu);
|
||||
cpu_clear(cpu, cpu_callout_map); /* was set here (do_boot_cpu()) */
|
||||
cpu_clear(cpu, cpu_initialized); /* was set by cpu_init() */
|
||||
cpucount--;
|
||||
} else {
|
||||
x86_cpu_to_apicid[cpu] = apicid;
|
||||
cpu_set(cpu, cpu_present_map);
|
||||
}
|
||||
|
||||
/* mark "stuck" area as not stuck */
|
||||
|
@ -854,6 +963,75 @@ static int __init do_boot_cpu(int apicid)
|
|||
return boot_error;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
void cpu_exit_clear(void)
|
||||
{
|
||||
int cpu = raw_smp_processor_id();
|
||||
|
||||
idle_task_exit();
|
||||
|
||||
cpucount --;
|
||||
cpu_uninit();
|
||||
irq_ctx_exit(cpu);
|
||||
|
||||
cpu_clear(cpu, cpu_callout_map);
|
||||
cpu_clear(cpu, cpu_callin_map);
|
||||
cpu_clear(cpu, cpu_present_map);
|
||||
|
||||
cpu_clear(cpu, smp_commenced_mask);
|
||||
unmap_cpu_to_logical_apicid(cpu);
|
||||
}
|
||||
|
||||
struct warm_boot_cpu_info {
|
||||
struct completion *complete;
|
||||
int apicid;
|
||||
int cpu;
|
||||
};
|
||||
|
||||
static void __devinit do_warm_boot_cpu(void *p)
|
||||
{
|
||||
struct warm_boot_cpu_info *info = p;
|
||||
do_boot_cpu(info->apicid, info->cpu);
|
||||
complete(info->complete);
|
||||
}
|
||||
|
||||
int __devinit smp_prepare_cpu(int cpu)
|
||||
{
|
||||
DECLARE_COMPLETION(done);
|
||||
struct warm_boot_cpu_info info;
|
||||
struct work_struct task;
|
||||
int apicid, ret;
|
||||
|
||||
lock_cpu_hotplug();
|
||||
apicid = x86_cpu_to_apicid[cpu];
|
||||
if (apicid == BAD_APICID) {
|
||||
ret = -ENODEV;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
info.complete = &done;
|
||||
info.apicid = apicid;
|
||||
info.cpu = cpu;
|
||||
INIT_WORK(&task, do_warm_boot_cpu, &info);
|
||||
|
||||
tsc_sync_disabled = 1;
|
||||
|
||||
/* init low mem mapping */
|
||||
memcpy(swapper_pg_dir, swapper_pg_dir + USER_PGD_PTRS,
|
||||
sizeof(swapper_pg_dir[0]) * KERNEL_PGD_PTRS);
|
||||
flush_tlb_all();
|
||||
schedule_work(&task);
|
||||
wait_for_completion(&done);
|
||||
|
||||
tsc_sync_disabled = 0;
|
||||
zap_low_mappings();
|
||||
ret = 0;
|
||||
exit:
|
||||
unlock_cpu_hotplug();
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void smp_tune_scheduling (void)
|
||||
{
|
||||
unsigned long cachesize; /* kB */
|
||||
|
@ -895,13 +1073,6 @@ void *xquad_portio;
|
|||
EXPORT_SYMBOL(xquad_portio);
|
||||
#endif
|
||||
|
||||
cpumask_t cpu_sibling_map[NR_CPUS] __cacheline_aligned;
|
||||
#ifdef CONFIG_X86_HT
|
||||
EXPORT_SYMBOL(cpu_sibling_map);
|
||||
#endif
|
||||
cpumask_t cpu_core_map[NR_CPUS] __cacheline_aligned;
|
||||
EXPORT_SYMBOL(cpu_core_map);
|
||||
|
||||
static void __init smp_boot_cpus(unsigned int max_cpus)
|
||||
{
|
||||
int apicid, cpu, bit, kicked;
|
||||
|
@ -1013,7 +1184,7 @@ static void __init smp_boot_cpus(unsigned int max_cpus)
|
|||
if (max_cpus <= cpucount+1)
|
||||
continue;
|
||||
|
||||
if (do_boot_cpu(apicid))
|
||||
if (((cpu = alloc_cpu_id()) <= 0) || do_boot_cpu(apicid, cpu))
|
||||
printk("CPU #%d not responding - cannot use it.\n",
|
||||
apicid);
|
||||
else
|
||||
|
@ -1065,44 +1236,8 @@ static void __init smp_boot_cpus(unsigned int max_cpus)
|
|||
cpus_clear(cpu_core_map[cpu]);
|
||||
}
|
||||
|
||||
for (cpu = 0; cpu < NR_CPUS; cpu++) {
|
||||
struct cpuinfo_x86 *c = cpu_data + cpu;
|
||||
int siblings = 0;
|
||||
int i;
|
||||
if (!cpu_isset(cpu, cpu_callout_map))
|
||||
continue;
|
||||
|
||||
if (smp_num_siblings > 1) {
|
||||
for (i = 0; i < NR_CPUS; i++) {
|
||||
if (!cpu_isset(i, cpu_callout_map))
|
||||
continue;
|
||||
if (cpu_core_id[cpu] == cpu_core_id[i]) {
|
||||
siblings++;
|
||||
cpu_set(i, cpu_sibling_map[cpu]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
siblings++;
|
||||
cpu_set(cpu, cpu_sibling_map[cpu]);
|
||||
}
|
||||
|
||||
if (siblings != smp_num_siblings) {
|
||||
printk(KERN_WARNING "WARNING: %d siblings found for CPU%d, should be %d\n", siblings, cpu, smp_num_siblings);
|
||||
smp_num_siblings = siblings;
|
||||
}
|
||||
|
||||
if (c->x86_num_cores > 1) {
|
||||
for (i = 0; i < NR_CPUS; i++) {
|
||||
if (!cpu_isset(i, cpu_callout_map))
|
||||
continue;
|
||||
if (phys_proc_id[cpu] == phys_proc_id[i]) {
|
||||
cpu_set(i, cpu_core_map[cpu]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
cpu_core_map[cpu] = cpu_sibling_map[cpu];
|
||||
}
|
||||
}
|
||||
cpu_set(0, cpu_sibling_map[0]);
|
||||
cpu_set(0, cpu_core_map[0]);
|
||||
|
||||
smpboot_setup_io_apic();
|
||||
|
||||
|
@ -1119,6 +1254,9 @@ static void __init smp_boot_cpus(unsigned int max_cpus)
|
|||
who understands all this stuff should rewrite it properly. --RR 15/Jul/02 */
|
||||
void __init smp_prepare_cpus(unsigned int max_cpus)
|
||||
{
|
||||
smp_commenced_mask = cpumask_of_cpu(0);
|
||||
cpu_callin_map = cpumask_of_cpu(0);
|
||||
mb();
|
||||
smp_boot_cpus(max_cpus);
|
||||
}
|
||||
|
||||
|
@ -1126,23 +1264,98 @@ void __devinit smp_prepare_boot_cpu(void)
|
|||
{
|
||||
cpu_set(smp_processor_id(), cpu_online_map);
|
||||
cpu_set(smp_processor_id(), cpu_callout_map);
|
||||
cpu_set(smp_processor_id(), cpu_present_map);
|
||||
per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
static void
|
||||
remove_siblinginfo(int cpu)
|
||||
{
|
||||
int sibling;
|
||||
|
||||
for_each_cpu_mask(sibling, cpu_sibling_map[cpu])
|
||||
cpu_clear(cpu, cpu_sibling_map[sibling]);
|
||||
for_each_cpu_mask(sibling, cpu_core_map[cpu])
|
||||
cpu_clear(cpu, cpu_core_map[sibling]);
|
||||
cpus_clear(cpu_sibling_map[cpu]);
|
||||
cpus_clear(cpu_core_map[cpu]);
|
||||
phys_proc_id[cpu] = BAD_APICID;
|
||||
cpu_core_id[cpu] = BAD_APICID;
|
||||
}
|
||||
|
||||
int __cpu_disable(void)
|
||||
{
|
||||
cpumask_t map = cpu_online_map;
|
||||
int cpu = smp_processor_id();
|
||||
|
||||
/*
|
||||
* Perhaps use cpufreq to drop frequency, but that could go
|
||||
* into generic code.
|
||||
*
|
||||
* We won't take down the boot processor on i386 due to some
|
||||
* interrupts only being able to be serviced by the BSP.
|
||||
* Especially so if we're not using an IOAPIC -zwane
|
||||
*/
|
||||
if (cpu == 0)
|
||||
return -EBUSY;
|
||||
|
||||
/* We enable the timer again on the exit path of the death loop */
|
||||
disable_APIC_timer();
|
||||
/* Allow any queued timer interrupts to get serviced */
|
||||
local_irq_enable();
|
||||
mdelay(1);
|
||||
local_irq_disable();
|
||||
|
||||
remove_siblinginfo(cpu);
|
||||
|
||||
cpu_clear(cpu, map);
|
||||
fixup_irqs(map);
|
||||
/* It's now safe to remove this processor from the online map */
|
||||
cpu_clear(cpu, cpu_online_map);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __cpu_die(unsigned int cpu)
|
||||
{
|
||||
/* We don't do anything here: idle task is faking death itself. */
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < 10; i++) {
|
||||
/* They ack this in play_dead by setting CPU_DEAD */
|
||||
if (per_cpu(cpu_state, cpu) == CPU_DEAD) {
|
||||
printk ("CPU %d is now offline\n", cpu);
|
||||
return;
|
||||
}
|
||||
current->state = TASK_UNINTERRUPTIBLE;
|
||||
schedule_timeout(HZ/10);
|
||||
}
|
||||
printk(KERN_ERR "CPU %u didn't die...\n", cpu);
|
||||
}
|
||||
#else /* ... !CONFIG_HOTPLUG_CPU */
|
||||
int __cpu_disable(void)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
void __cpu_die(unsigned int cpu)
|
||||
{
|
||||
/* We said "no" in __cpu_disable */
|
||||
BUG();
|
||||
}
|
||||
#endif /* CONFIG_HOTPLUG_CPU */
|
||||
|
||||
int __devinit __cpu_up(unsigned int cpu)
|
||||
{
|
||||
/* This only works at boot for x86. See "rewrite" above. */
|
||||
if (cpu_isset(cpu, smp_commenced_mask)) {
|
||||
local_irq_enable();
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
/* In case one didn't come up */
|
||||
if (!cpu_isset(cpu, cpu_callin_map)) {
|
||||
printk(KERN_DEBUG "skipping cpu%d, didn't come online\n", cpu);
|
||||
local_irq_enable();
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
local_irq_enable();
|
||||
per_cpu(cpu_state, cpu) = CPU_UP_PREPARE;
|
||||
/* Unleash the CPU! */
|
||||
cpu_set(cpu, smp_commenced_mask);
|
||||
while (!cpu_isset(cpu, cpu_online_map))
|
||||
|
@ -1156,10 +1369,12 @@ void __init smp_cpus_done(unsigned int max_cpus)
|
|||
setup_ioapic_dest();
|
||||
#endif
|
||||
zap_low_mappings();
|
||||
#ifndef CONFIG_HOTPLUG_CPU
|
||||
/*
|
||||
* Disable executability of the SMP trampoline:
|
||||
*/
|
||||
set_kernel_exec((unsigned long)trampoline_base, trampoline_exec);
|
||||
#endif
|
||||
}
|
||||
|
||||
void __init smp_intr_init(void)
|
||||
|
|
|
@ -283,7 +283,7 @@ ENTRY(sys_call_table)
|
|||
.long sys_mq_timedreceive /* 280 */
|
||||
.long sys_mq_notify
|
||||
.long sys_mq_getsetattr
|
||||
.long sys_ni_syscall /* reserved for kexec */
|
||||
.long sys_kexec_load
|
||||
.long sys_waitid
|
||||
.long sys_ni_syscall /* 285 */ /* available */
|
||||
.long sys_add_key
|
||||
|
|
|
@ -21,11 +21,16 @@
|
|||
|
||||
extern asmlinkage void sysenter_entry(void);
|
||||
|
||||
void enable_sep_cpu(void *info)
|
||||
void enable_sep_cpu(void)
|
||||
{
|
||||
int cpu = get_cpu();
|
||||
struct tss_struct *tss = &per_cpu(init_tss, cpu);
|
||||
|
||||
if (!boot_cpu_has(X86_FEATURE_SEP)) {
|
||||
put_cpu();
|
||||
return;
|
||||
}
|
||||
|
||||
tss->ss1 = __KERNEL_CS;
|
||||
tss->esp1 = sizeof(struct tss_struct) + (unsigned long) tss;
|
||||
wrmsr(MSR_IA32_SYSENTER_CS, __KERNEL_CS, 0);
|
||||
|
@ -41,7 +46,7 @@ void enable_sep_cpu(void *info)
|
|||
extern const char vsyscall_int80_start, vsyscall_int80_end;
|
||||
extern const char vsyscall_sysenter_start, vsyscall_sysenter_end;
|
||||
|
||||
static int __init sysenter_setup(void)
|
||||
int __init sysenter_setup(void)
|
||||
{
|
||||
void *page = (void *)get_zeroed_page(GFP_ATOMIC);
|
||||
|
||||
|
@ -58,8 +63,5 @@ static int __init sysenter_setup(void)
|
|||
&vsyscall_sysenter_start,
|
||||
&vsyscall_sysenter_end - &vsyscall_sysenter_start);
|
||||
|
||||
on_each_cpu(enable_sep_cpu, NULL, 1, 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
__initcall(sysenter_setup);
|
||||
|
|
|
@ -50,7 +50,7 @@ static void hpet_writel(unsigned long d, unsigned long a)
|
|||
* comparator value and continue. Next tick can be caught by checking
|
||||
* for a change in the comparator value. Used in apic.c.
|
||||
*/
|
||||
static void __init wait_hpet_tick(void)
|
||||
static void __devinit wait_hpet_tick(void)
|
||||
{
|
||||
unsigned int start_cmp_val, end_cmp_val;
|
||||
|
||||
|
|
|
@ -86,7 +86,7 @@ bad_ctc:
|
|||
#define CALIBRATE_CNT_HPET (5 * hpet_tick)
|
||||
#define CALIBRATE_TIME_HPET (5 * KERNEL_TICK_USEC)
|
||||
|
||||
unsigned long __init calibrate_tsc_hpet(unsigned long *tsc_hpet_quotient_ptr)
|
||||
unsigned long __devinit calibrate_tsc_hpet(unsigned long *tsc_hpet_quotient_ptr)
|
||||
{
|
||||
unsigned long tsc_startlow, tsc_starthigh;
|
||||
unsigned long tsc_endlow, tsc_endhigh;
|
||||
|
|
|
@ -33,7 +33,7 @@ static struct timer_opts timer_tsc;
|
|||
|
||||
static inline void cpufreq_delayed_get(void);
|
||||
|
||||
int tsc_disable __initdata = 0;
|
||||
int tsc_disable __devinitdata = 0;
|
||||
|
||||
extern spinlock_t i8253_lock;
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include <linux/ptrace.h>
|
||||
#include <linux/utsname.h>
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/kexec.h>
|
||||
|
||||
#ifdef CONFIG_EISA
|
||||
#include <linux/ioport.h>
|
||||
|
@ -234,22 +235,22 @@ void show_registers(struct pt_regs *regs)
|
|||
* time of the fault..
|
||||
*/
|
||||
if (in_kernel) {
|
||||
u8 *eip;
|
||||
u8 __user *eip;
|
||||
|
||||
printk("\nStack: ");
|
||||
show_stack(NULL, (unsigned long*)esp);
|
||||
|
||||
printk("Code: ");
|
||||
|
||||
eip = (u8 *)regs->eip - 43;
|
||||
eip = (u8 __user *)regs->eip - 43;
|
||||
for (i = 0; i < 64; i++, eip++) {
|
||||
unsigned char c;
|
||||
|
||||
if (eip < (u8 *)PAGE_OFFSET || __get_user(c, eip)) {
|
||||
if (eip < (u8 __user *)PAGE_OFFSET || __get_user(c, eip)) {
|
||||
printk(" Bad EIP value.");
|
||||
break;
|
||||
}
|
||||
if (eip == (u8 *)regs->eip)
|
||||
if (eip == (u8 __user *)regs->eip)
|
||||
printk("<%02x> ", c);
|
||||
else
|
||||
printk("%02x ", c);
|
||||
|
@ -273,13 +274,13 @@ static void handle_BUG(struct pt_regs *regs)
|
|||
|
||||
if (eip < PAGE_OFFSET)
|
||||
goto no_bug;
|
||||
if (__get_user(ud2, (unsigned short *)eip))
|
||||
if (__get_user(ud2, (unsigned short __user *)eip))
|
||||
goto no_bug;
|
||||
if (ud2 != 0x0b0f)
|
||||
goto no_bug;
|
||||
if (__get_user(line, (unsigned short *)(eip + 2)))
|
||||
if (__get_user(line, (unsigned short __user *)(eip + 2)))
|
||||
goto bug;
|
||||
if (__get_user(file, (char **)(eip + 4)) ||
|
||||
if (__get_user(file, (char * __user *)(eip + 4)) ||
|
||||
(unsigned long)file < PAGE_OFFSET || __get_user(c, file))
|
||||
file = "<bad filename>";
|
||||
|
||||
|
@ -294,6 +295,9 @@ bug:
|
|||
printk("Kernel BUG\n");
|
||||
}
|
||||
|
||||
/* This is gone through when something in the kernel
|
||||
* has done something bad and is about to be terminated.
|
||||
*/
|
||||
void die(const char * str, struct pt_regs * regs, long err)
|
||||
{
|
||||
static struct {
|
||||
|
@ -341,6 +345,10 @@ void die(const char * str, struct pt_regs * regs, long err)
|
|||
bust_spinlocks(0);
|
||||
die.lock_owner = -1;
|
||||
spin_unlock_irq(&die.lock);
|
||||
|
||||
if (kexec_should_crash(current))
|
||||
crash_kexec(regs);
|
||||
|
||||
if (in_interrupt())
|
||||
panic("Fatal exception in interrupt");
|
||||
|
||||
|
@ -361,6 +369,10 @@ static inline void die_if_kernel(const char * str, struct pt_regs * regs, long e
|
|||
static void do_trap(int trapnr, int signr, char *str, int vm86,
|
||||
struct pt_regs * regs, long error_code, siginfo_t *info)
|
||||
{
|
||||
struct task_struct *tsk = current;
|
||||
tsk->thread.error_code = error_code;
|
||||
tsk->thread.trap_no = trapnr;
|
||||
|
||||
if (regs->eflags & VM_MASK) {
|
||||
if (vm86)
|
||||
goto vm86_trap;
|
||||
|
@ -371,9 +383,6 @@ static void do_trap(int trapnr, int signr, char *str, int vm86,
|
|||
goto kernel_trap;
|
||||
|
||||
trap_signal: {
|
||||
struct task_struct *tsk = current;
|
||||
tsk->thread.error_code = error_code;
|
||||
tsk->thread.trap_no = trapnr;
|
||||
if (info)
|
||||
force_sig_info(signr, info, tsk);
|
||||
else
|
||||
|
@ -486,6 +495,9 @@ fastcall void do_general_protection(struct pt_regs * regs, long error_code)
|
|||
}
|
||||
put_cpu();
|
||||
|
||||
current->thread.error_code = error_code;
|
||||
current->thread.trap_no = 13;
|
||||
|
||||
if (regs->eflags & VM_MASK)
|
||||
goto gp_in_vm86;
|
||||
|
||||
|
@ -570,6 +582,15 @@ void die_nmi (struct pt_regs *regs, const char *msg)
|
|||
console_silent();
|
||||
spin_unlock(&nmi_print_lock);
|
||||
bust_spinlocks(0);
|
||||
|
||||
/* If we are in kernel we are probably nested up pretty bad
|
||||
* and might aswell get out now while we still can.
|
||||
*/
|
||||
if (!user_mode(regs)) {
|
||||
current->thread.trap_no = 2;
|
||||
crash_kexec(regs);
|
||||
}
|
||||
|
||||
do_exit(SIGSEGV);
|
||||
}
|
||||
|
||||
|
@ -625,6 +646,14 @@ fastcall void do_nmi(struct pt_regs * regs, long error_code)
|
|||
nmi_enter();
|
||||
|
||||
cpu = smp_processor_id();
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
if (!cpu_online(cpu)) {
|
||||
nmi_exit();
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
++nmi_count(cpu);
|
||||
|
||||
if (!nmi_callback(regs, cpu))
|
||||
|
@ -872,9 +901,9 @@ fastcall void do_simd_coprocessor_error(struct pt_regs * regs,
|
|||
error_code);
|
||||
return;
|
||||
}
|
||||
die_if_kernel("cache flush denied", regs, error_code);
|
||||
current->thread.trap_no = 19;
|
||||
current->thread.error_code = error_code;
|
||||
die_if_kernel("cache flush denied", regs, error_code);
|
||||
force_sig(SIGSEGV, current);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,20 +2,23 @@
|
|||
* Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>;
|
||||
*/
|
||||
|
||||
#define LOAD_OFFSET __PAGE_OFFSET
|
||||
|
||||
#include <asm-generic/vmlinux.lds.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
|
||||
OUTPUT_ARCH(i386)
|
||||
ENTRY(startup_32)
|
||||
ENTRY(phys_startup_32)
|
||||
jiffies = jiffies_64;
|
||||
SECTIONS
|
||||
{
|
||||
. = __PAGE_OFFSET + 0x100000;
|
||||
. = __KERNEL_START;
|
||||
phys_startup_32 = startup_32 - LOAD_OFFSET;
|
||||
/* read-only */
|
||||
_text = .; /* Text and read-only data */
|
||||
.text : {
|
||||
.text : AT(ADDR(.text) - LOAD_OFFSET) {
|
||||
*(.text)
|
||||
SCHED_TEXT
|
||||
LOCK_TEXT
|
||||
|
@ -27,49 +30,55 @@ SECTIONS
|
|||
|
||||
. = ALIGN(16); /* Exception table */
|
||||
__start___ex_table = .;
|
||||
__ex_table : { *(__ex_table) }
|
||||
__ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { *(__ex_table) }
|
||||
__stop___ex_table = .;
|
||||
|
||||
RODATA
|
||||
|
||||
/* writeable */
|
||||
.data : { /* Data */
|
||||
.data : AT(ADDR(.data) - LOAD_OFFSET) { /* Data */
|
||||
*(.data)
|
||||
CONSTRUCTORS
|
||||
}
|
||||
|
||||
. = ALIGN(4096);
|
||||
__nosave_begin = .;
|
||||
.data_nosave : { *(.data.nosave) }
|
||||
.data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { *(.data.nosave) }
|
||||
. = ALIGN(4096);
|
||||
__nosave_end = .;
|
||||
|
||||
. = ALIGN(4096);
|
||||
.data.page_aligned : { *(.data.idt) }
|
||||
.data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) {
|
||||
*(.data.idt)
|
||||
}
|
||||
|
||||
. = ALIGN(32);
|
||||
.data.cacheline_aligned : { *(.data.cacheline_aligned) }
|
||||
.data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) {
|
||||
*(.data.cacheline_aligned)
|
||||
}
|
||||
|
||||
_edata = .; /* End of data section */
|
||||
|
||||
. = ALIGN(THREAD_SIZE); /* init_task */
|
||||
.data.init_task : { *(.data.init_task) }
|
||||
.data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) {
|
||||
*(.data.init_task)
|
||||
}
|
||||
|
||||
/* will be freed after init */
|
||||
. = ALIGN(4096); /* Init code and data */
|
||||
__init_begin = .;
|
||||
.init.text : {
|
||||
.init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
|
||||
_sinittext = .;
|
||||
*(.init.text)
|
||||
_einittext = .;
|
||||
}
|
||||
.init.data : { *(.init.data) }
|
||||
.init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { *(.init.data) }
|
||||
. = ALIGN(16);
|
||||
__setup_start = .;
|
||||
.init.setup : { *(.init.setup) }
|
||||
.init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) { *(.init.setup) }
|
||||
__setup_end = .;
|
||||
__initcall_start = .;
|
||||
.initcall.init : {
|
||||
.initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {
|
||||
*(.initcall1.init)
|
||||
*(.initcall2.init)
|
||||
*(.initcall3.init)
|
||||
|
@ -80,33 +89,41 @@ SECTIONS
|
|||
}
|
||||
__initcall_end = .;
|
||||
__con_initcall_start = .;
|
||||
.con_initcall.init : { *(.con_initcall.init) }
|
||||
.con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) {
|
||||
*(.con_initcall.init)
|
||||
}
|
||||
__con_initcall_end = .;
|
||||
SECURITY_INIT
|
||||
. = ALIGN(4);
|
||||
__alt_instructions = .;
|
||||
.altinstructions : { *(.altinstructions) }
|
||||
.altinstructions : AT(ADDR(.altinstructions) - LOAD_OFFSET) {
|
||||
*(.altinstructions)
|
||||
}
|
||||
__alt_instructions_end = .;
|
||||
.altinstr_replacement : { *(.altinstr_replacement) }
|
||||
.altinstr_replacement : AT(ADDR(.altinstr_replacement) - LOAD_OFFSET) {
|
||||
*(.altinstr_replacement)
|
||||
}
|
||||
/* .exit.text is discard at runtime, not link time, to deal with references
|
||||
from .altinstructions and .eh_frame */
|
||||
.exit.text : { *(.exit.text) }
|
||||
.exit.data : { *(.exit.data) }
|
||||
.exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) { *(.exit.text) }
|
||||
.exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) { *(.exit.data) }
|
||||
. = ALIGN(4096);
|
||||
__initramfs_start = .;
|
||||
.init.ramfs : { *(.init.ramfs) }
|
||||
.init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { *(.init.ramfs) }
|
||||
__initramfs_end = .;
|
||||
. = ALIGN(32);
|
||||
__per_cpu_start = .;
|
||||
.data.percpu : { *(.data.percpu) }
|
||||
.data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { *(.data.percpu) }
|
||||
__per_cpu_end = .;
|
||||
. = ALIGN(4096);
|
||||
__init_end = .;
|
||||
/* freed after init ends here */
|
||||
|
||||
__bss_start = .; /* BSS */
|
||||
.bss : {
|
||||
.bss.page_aligned : AT(ADDR(.bss.page_aligned) - LOAD_OFFSET) {
|
||||
*(.bss.page_aligned)
|
||||
}
|
||||
.bss : AT(ADDR(.bss) - LOAD_OFFSET) {
|
||||
*(.bss)
|
||||
}
|
||||
. = ALIGN(4);
|
||||
|
|
|
@ -10,6 +10,14 @@
|
|||
#include <asm/acpi.h>
|
||||
#include <asm/arch_hooks.h>
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
#define DEFAULT_SEND_IPI (1)
|
||||
#else
|
||||
#define DEFAULT_SEND_IPI (0)
|
||||
#endif
|
||||
|
||||
int no_broadcast=DEFAULT_SEND_IPI;
|
||||
|
||||
/**
|
||||
* pre_intr_init_hook - initialisation prior to setting up interrupt vectors
|
||||
*
|
||||
|
@ -104,3 +112,22 @@ void __init mca_nmi_hook(void)
|
|||
printk("NMI generated from unknown source!\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
static __init int no_ipi_broadcast(char *str)
|
||||
{
|
||||
get_option(&str, &no_broadcast);
|
||||
printk ("Using %s mode\n", no_broadcast ? "No IPI Broadcast" :
|
||||
"IPI Broadcast");
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("no_ipi_broadcast", no_ipi_broadcast);
|
||||
|
||||
static int __init print_ipi_mode(void)
|
||||
{
|
||||
printk ("Using IPI %s mode\n", no_broadcast ? "No-Shortcut" :
|
||||
"Shortcut");
|
||||
return 0;
|
||||
}
|
||||
|
||||
late_initcall(print_ipi_mode);
|
||||
|
|
|
@ -73,12 +73,11 @@ static int __init topology_init(void)
|
|||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MAX_NUMNODES; i++) {
|
||||
if (node_online(i))
|
||||
arch_register_node(i);
|
||||
}
|
||||
for (i = 0; i < NR_CPUS; i++)
|
||||
if (cpu_possible(i)) arch_register_cpu(i);
|
||||
for_each_online_node(i)
|
||||
arch_register_node(i);
|
||||
|
||||
for_each_cpu(i)
|
||||
arch_register_cpu(i);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -88,8 +87,8 @@ static int __init topology_init(void)
|
|||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NR_CPUS; i++)
|
||||
if (cpu_possible(i)) arch_register_cpu(i);
|
||||
for_each_cpu(i)
|
||||
arch_register_cpu(i);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -23,7 +23,6 @@ unsigned long mp_lapic_addr;
|
|||
|
||||
/* Processor that is doing the boot up */
|
||||
unsigned int boot_cpu_physical_apicid = -1U;
|
||||
unsigned int boot_cpu_logical_apicid = -1U;
|
||||
|
||||
/* Bitmask of physically existing CPUs */
|
||||
physid_mask_t phys_cpu_present_map;
|
||||
|
@ -52,10 +51,8 @@ static void __init MP_processor_info (struct mpc_config_processor *m)
|
|||
(m->mpc_cpufeature & CPU_MODEL_MASK) >> 4,
|
||||
m->mpc_apicver);
|
||||
|
||||
if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) {
|
||||
if (m->mpc_cpuflag & CPU_BOOTPROCESSOR)
|
||||
boot_cpu_physical_apicid = m->mpc_apicid;
|
||||
boot_cpu_logical_apicid = logical_apicid;
|
||||
}
|
||||
|
||||
ver = m->mpc_apicver;
|
||||
if ((ver >= 0x14 && m->mpc_apicid >= 0xff) || m->mpc_apicid >= 0xf) {
|
||||
|
|
|
@ -30,6 +30,8 @@
|
|||
#include <linux/initrd.h>
|
||||
#include <linux/nodemask.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kexec.h>
|
||||
|
||||
#include <asm/e820.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mmzone.h>
|
||||
|
|
|
@ -146,7 +146,7 @@ static int __is_prefetch(struct pt_regs *regs, unsigned long addr)
|
|||
|
||||
if (instr > limit)
|
||||
break;
|
||||
if (__get_user(opcode, (unsigned char *) instr))
|
||||
if (__get_user(opcode, (unsigned char __user *) instr))
|
||||
break;
|
||||
|
||||
instr_hi = opcode & 0xf0;
|
||||
|
@ -173,7 +173,7 @@ static int __is_prefetch(struct pt_regs *regs, unsigned long addr)
|
|||
scan_more = 0;
|
||||
if (instr > limit)
|
||||
break;
|
||||
if (__get_user(opcode, (unsigned char *) instr))
|
||||
if (__get_user(opcode, (unsigned char __user *) instr))
|
||||
break;
|
||||
prefetch = (instr_lo == 0xF) &&
|
||||
(opcode == 0x0D || opcode == 0x18);
|
||||
|
@ -463,6 +463,9 @@ no_context:
|
|||
printk(KERN_ALERT "*pte = %08lx\n", page);
|
||||
}
|
||||
#endif
|
||||
tsk->thread.cr2 = address;
|
||||
tsk->thread.trap_no = 14;
|
||||
tsk->thread.error_code = error_code;
|
||||
die("Oops", regs, error_code);
|
||||
bust_spinlocks(0);
|
||||
do_exit(SIGKILL);
|
||||
|
|
|
@ -75,6 +75,24 @@ void kunmap_atomic(void *kvaddr, enum km_type type)
|
|||
preempt_check_resched();
|
||||
}
|
||||
|
||||
/* This is the same as kmap_atomic() but can map memory that doesn't
|
||||
* have a struct page associated with it.
|
||||
*/
|
||||
void *kmap_atomic_pfn(unsigned long pfn, enum km_type type)
|
||||
{
|
||||
enum fixed_addresses idx;
|
||||
unsigned long vaddr;
|
||||
|
||||
inc_preempt_count();
|
||||
|
||||
idx = type + KM_TYPE_NR*smp_processor_id();
|
||||
vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
|
||||
set_pte(kmap_pte-idx, pfn_pte(pfn, kmap_prot));
|
||||
__flush_tlb_one(vaddr);
|
||||
|
||||
return (void*) vaddr;
|
||||
}
|
||||
|
||||
struct page *kmap_atomic_to_page(void *ptr)
|
||||
{
|
||||
unsigned long idx, vaddr = (unsigned long)ptr;
|
||||
|
|
|
@ -352,7 +352,7 @@ static void __init pagetable_init (void)
|
|||
#endif
|
||||
}
|
||||
|
||||
#if defined(CONFIG_PM_DISK) || defined(CONFIG_SOFTWARE_SUSPEND)
|
||||
#ifdef CONFIG_SOFTWARE_SUSPEND
|
||||
/*
|
||||
* Swap suspend & friends need this for resume because things like the intel-agp
|
||||
* driver might have split up a kernel 4MB mapping.
|
||||
|
|
|
@ -243,7 +243,7 @@ void iounmap(volatile void __iomem *addr)
|
|||
write_lock(&vmlist_lock);
|
||||
p = __remove_vm_area((void *) (PAGE_MASK & (unsigned long __force) addr));
|
||||
if (!p) {
|
||||
printk("iounmap: bad address %p\n", addr);
|
||||
printk(KERN_WARNING "iounmap: bad address %p\n", addr);
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
|
|
|
@ -32,9 +32,9 @@ void show_mem(void)
|
|||
unsigned long i;
|
||||
struct page_state ps;
|
||||
|
||||
printk("Mem-info:\n");
|
||||
printk(KERN_INFO "Mem-info:\n");
|
||||
show_free_areas();
|
||||
printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
|
||||
printk(KERN_INFO "Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
|
||||
for_each_pgdat(pgdat) {
|
||||
for (i = 0; i < pgdat->node_spanned_pages; ++i) {
|
||||
page = pgdat_page_nr(pgdat, i);
|
||||
|
@ -49,18 +49,18 @@ void show_mem(void)
|
|||
shared += page_count(page) - 1;
|
||||
}
|
||||
}
|
||||
printk("%d pages of RAM\n", total);
|
||||
printk("%d pages of HIGHMEM\n",highmem);
|
||||
printk("%d reserved pages\n",reserved);
|
||||
printk("%d pages shared\n",shared);
|
||||
printk("%d pages swap cached\n",cached);
|
||||
printk(KERN_INFO "%d pages of RAM\n", total);
|
||||
printk(KERN_INFO "%d pages of HIGHMEM\n", highmem);
|
||||
printk(KERN_INFO "%d reserved pages\n", reserved);
|
||||
printk(KERN_INFO "%d pages shared\n", shared);
|
||||
printk(KERN_INFO "%d pages swap cached\n", cached);
|
||||
|
||||
get_page_state(&ps);
|
||||
printk("%lu pages dirty\n", ps.nr_dirty);
|
||||
printk("%lu pages writeback\n", ps.nr_writeback);
|
||||
printk("%lu pages mapped\n", ps.nr_mapped);
|
||||
printk("%lu pages slab\n", ps.nr_slab);
|
||||
printk("%lu pages pagetables\n", ps.nr_page_table_pages);
|
||||
printk(KERN_INFO "%lu pages dirty\n", ps.nr_dirty);
|
||||
printk(KERN_INFO "%lu pages writeback\n", ps.nr_writeback);
|
||||
printk(KERN_INFO "%lu pages mapped\n", ps.nr_mapped);
|
||||
printk(KERN_INFO "%lu pages slab\n", ps.nr_slab);
|
||||
printk(KERN_INFO "%lu pages pagetables\n", ps.nr_page_table_pages);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -113,16 +113,16 @@ void set_pmd_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags)
|
|||
pmd_t *pmd;
|
||||
|
||||
if (vaddr & (PMD_SIZE-1)) { /* vaddr is misaligned */
|
||||
printk ("set_pmd_pfn: vaddr misaligned\n");
|
||||
printk(KERN_WARNING "set_pmd_pfn: vaddr misaligned\n");
|
||||
return; /* BUG(); */
|
||||
}
|
||||
if (pfn & (PTRS_PER_PTE-1)) { /* pfn is misaligned */
|
||||
printk ("set_pmd_pfn: pfn misaligned\n");
|
||||
printk(KERN_WARNING "set_pmd_pfn: pfn misaligned\n");
|
||||
return; /* BUG(); */
|
||||
}
|
||||
pgd = swapper_pg_dir + pgd_index(vaddr);
|
||||
if (pgd_none(*pgd)) {
|
||||
printk ("set_pmd_pfn: pgd_none\n");
|
||||
printk(KERN_WARNING "set_pmd_pfn: pgd_none\n");
|
||||
return; /* BUG(); */
|
||||
}
|
||||
pud = pud_offset(pgd, vaddr);
|
||||
|
|
|
@ -22,9 +22,11 @@
|
|||
#include <linux/device.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/acpi.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/acpi.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#include <asm/processor.h>
|
||||
|
||||
static struct saved_context saved_context;
|
||||
|
||||
|
@ -33,8 +35,6 @@ unsigned long saved_context_esp, saved_context_ebp;
|
|||
unsigned long saved_context_esi, saved_context_edi;
|
||||
unsigned long saved_context_eflags;
|
||||
|
||||
extern void enable_sep_cpu(void *);
|
||||
|
||||
void __save_processor_state(struct saved_context *ctxt)
|
||||
{
|
||||
kernel_fpu_begin();
|
||||
|
@ -44,7 +44,6 @@ void __save_processor_state(struct saved_context *ctxt)
|
|||
*/
|
||||
asm volatile ("sgdt %0" : "=m" (ctxt->gdt_limit));
|
||||
asm volatile ("sidt %0" : "=m" (ctxt->idt_limit));
|
||||
asm volatile ("sldt %0" : "=m" (ctxt->ldt));
|
||||
asm volatile ("str %0" : "=m" (ctxt->tr));
|
||||
|
||||
/*
|
||||
|
@ -107,7 +106,6 @@ static void fix_processor_context(void)
|
|||
|
||||
void __restore_processor_state(struct saved_context *ctxt)
|
||||
{
|
||||
|
||||
/*
|
||||
* control registers
|
||||
*/
|
||||
|
@ -116,6 +114,13 @@ void __restore_processor_state(struct saved_context *ctxt)
|
|||
asm volatile ("movl %0, %%cr2" :: "r" (ctxt->cr2));
|
||||
asm volatile ("movl %0, %%cr0" :: "r" (ctxt->cr0));
|
||||
|
||||
/*
|
||||
* now restore the descriptor tables to their proper values
|
||||
* ltr is done i fix_processor_context().
|
||||
*/
|
||||
asm volatile ("lgdt %0" :: "m" (ctxt->gdt_limit));
|
||||
asm volatile ("lidt %0" :: "m" (ctxt->idt_limit));
|
||||
|
||||
/*
|
||||
* segment registers
|
||||
*/
|
||||
|
@ -124,19 +129,11 @@ void __restore_processor_state(struct saved_context *ctxt)
|
|||
asm volatile ("movw %0, %%gs" :: "r" (ctxt->gs));
|
||||
asm volatile ("movw %0, %%ss" :: "r" (ctxt->ss));
|
||||
|
||||
/*
|
||||
* now restore the descriptor tables to their proper values
|
||||
* ltr is done i fix_processor_context().
|
||||
*/
|
||||
asm volatile ("lgdt %0" :: "m" (ctxt->gdt_limit));
|
||||
asm volatile ("lidt %0" :: "m" (ctxt->idt_limit));
|
||||
asm volatile ("lldt %0" :: "m" (ctxt->ldt));
|
||||
|
||||
/*
|
||||
* sysenter MSRs
|
||||
*/
|
||||
if (boot_cpu_has(X86_FEATURE_SEP))
|
||||
enable_sep_cpu(NULL);
|
||||
enable_sep_cpu();
|
||||
|
||||
fix_processor_context();
|
||||
do_fpu_end();
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
#include <linux/topology.h>
|
||||
#include <linux/nodemask.h>
|
||||
|
||||
#define SD_NODES_PER_DOMAIN 6
|
||||
#define SD_NODES_PER_DOMAIN 16
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
/**
|
||||
|
@ -27,7 +27,7 @@
|
|||
*
|
||||
* Should use nodemask_t.
|
||||
*/
|
||||
static int __devinit find_next_best_node(int node, unsigned long *used_nodes)
|
||||
static int find_next_best_node(int node, unsigned long *used_nodes)
|
||||
{
|
||||
int i, n, val, min_val, best_node = 0;
|
||||
|
||||
|
@ -66,7 +66,7 @@ static int __devinit find_next_best_node(int node, unsigned long *used_nodes)
|
|||
* should be one that prevents unnecessary balancing, but also spreads tasks
|
||||
* out optimally.
|
||||
*/
|
||||
static cpumask_t __devinit sched_domain_node_span(int node)
|
||||
static cpumask_t sched_domain_node_span(int node)
|
||||
{
|
||||
int i;
|
||||
cpumask_t span, nodemask;
|
||||
|
@ -96,7 +96,7 @@ static cpumask_t __devinit sched_domain_node_span(int node)
|
|||
#ifdef CONFIG_SCHED_SMT
|
||||
static DEFINE_PER_CPU(struct sched_domain, cpu_domains);
|
||||
static struct sched_group sched_group_cpus[NR_CPUS];
|
||||
static int __devinit cpu_to_cpu_group(int cpu)
|
||||
static int cpu_to_cpu_group(int cpu)
|
||||
{
|
||||
return cpu;
|
||||
}
|
||||
|
@ -104,7 +104,7 @@ static int __devinit cpu_to_cpu_group(int cpu)
|
|||
|
||||
static DEFINE_PER_CPU(struct sched_domain, phys_domains);
|
||||
static struct sched_group sched_group_phys[NR_CPUS];
|
||||
static int __devinit cpu_to_phys_group(int cpu)
|
||||
static int cpu_to_phys_group(int cpu)
|
||||
{
|
||||
#ifdef CONFIG_SCHED_SMT
|
||||
return first_cpu(cpu_sibling_map[cpu]);
|
||||
|
@ -125,44 +125,36 @@ static struct sched_group *sched_group_nodes[MAX_NUMNODES];
|
|||
static DEFINE_PER_CPU(struct sched_domain, allnodes_domains);
|
||||
static struct sched_group sched_group_allnodes[MAX_NUMNODES];
|
||||
|
||||
static int __devinit cpu_to_allnodes_group(int cpu)
|
||||
static int cpu_to_allnodes_group(int cpu)
|
||||
{
|
||||
return cpu_to_node(cpu);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Set up scheduler domains and groups. Callers must hold the hotplug lock.
|
||||
* Build sched domains for a given set of cpus and attach the sched domains
|
||||
* to the individual cpus
|
||||
*/
|
||||
void __devinit arch_init_sched_domains(void)
|
||||
void build_sched_domains(const cpumask_t *cpu_map)
|
||||
{
|
||||
int i;
|
||||
cpumask_t cpu_default_map;
|
||||
|
||||
/*
|
||||
* Setup mask for cpus without special case scheduling requirements.
|
||||
* For now this just excludes isolated cpus, but could be used to
|
||||
* exclude other special cases in the future.
|
||||
* Set up domains for cpus specified by the cpu_map.
|
||||
*/
|
||||
cpus_complement(cpu_default_map, cpu_isolated_map);
|
||||
cpus_and(cpu_default_map, cpu_default_map, cpu_online_map);
|
||||
|
||||
/*
|
||||
* Set up domains. Isolated domains just stay on the dummy domain.
|
||||
*/
|
||||
for_each_cpu_mask(i, cpu_default_map) {
|
||||
for_each_cpu_mask(i, *cpu_map) {
|
||||
int group;
|
||||
struct sched_domain *sd = NULL, *p;
|
||||
cpumask_t nodemask = node_to_cpumask(cpu_to_node(i));
|
||||
|
||||
cpus_and(nodemask, nodemask, cpu_default_map);
|
||||
cpus_and(nodemask, nodemask, *cpu_map);
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
if (num_online_cpus()
|
||||
> SD_NODES_PER_DOMAIN*cpus_weight(nodemask)) {
|
||||
sd = &per_cpu(allnodes_domains, i);
|
||||
*sd = SD_ALLNODES_INIT;
|
||||
sd->span = cpu_default_map;
|
||||
sd->span = *cpu_map;
|
||||
group = cpu_to_allnodes_group(i);
|
||||
sd->groups = &sched_group_allnodes[group];
|
||||
p = sd;
|
||||
|
@ -173,7 +165,7 @@ void __devinit arch_init_sched_domains(void)
|
|||
*sd = SD_NODE_INIT;
|
||||
sd->span = sched_domain_node_span(cpu_to_node(i));
|
||||
sd->parent = p;
|
||||
cpus_and(sd->span, sd->span, cpu_default_map);
|
||||
cpus_and(sd->span, sd->span, *cpu_map);
|
||||
#endif
|
||||
|
||||
p = sd;
|
||||
|
@ -190,7 +182,7 @@ void __devinit arch_init_sched_domains(void)
|
|||
group = cpu_to_cpu_group(i);
|
||||
*sd = SD_SIBLING_INIT;
|
||||
sd->span = cpu_sibling_map[i];
|
||||
cpus_and(sd->span, sd->span, cpu_default_map);
|
||||
cpus_and(sd->span, sd->span, *cpu_map);
|
||||
sd->parent = p;
|
||||
sd->groups = &sched_group_cpus[group];
|
||||
#endif
|
||||
|
@ -198,9 +190,9 @@ void __devinit arch_init_sched_domains(void)
|
|||
|
||||
#ifdef CONFIG_SCHED_SMT
|
||||
/* Set up CPU (sibling) groups */
|
||||
for_each_cpu_mask(i, cpu_default_map) {
|
||||
for_each_cpu_mask(i, *cpu_map) {
|
||||
cpumask_t this_sibling_map = cpu_sibling_map[i];
|
||||
cpus_and(this_sibling_map, this_sibling_map, cpu_default_map);
|
||||
cpus_and(this_sibling_map, this_sibling_map, *cpu_map);
|
||||
if (i != first_cpu(this_sibling_map))
|
||||
continue;
|
||||
|
||||
|
@ -213,7 +205,7 @@ void __devinit arch_init_sched_domains(void)
|
|||
for (i = 0; i < MAX_NUMNODES; i++) {
|
||||
cpumask_t nodemask = node_to_cpumask(i);
|
||||
|
||||
cpus_and(nodemask, nodemask, cpu_default_map);
|
||||
cpus_and(nodemask, nodemask, *cpu_map);
|
||||
if (cpus_empty(nodemask))
|
||||
continue;
|
||||
|
||||
|
@ -222,7 +214,7 @@ void __devinit arch_init_sched_domains(void)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
init_sched_build_groups(sched_group_allnodes, cpu_default_map,
|
||||
init_sched_build_groups(sched_group_allnodes, *cpu_map,
|
||||
&cpu_to_allnodes_group);
|
||||
|
||||
for (i = 0; i < MAX_NUMNODES; i++) {
|
||||
|
@ -233,12 +225,12 @@ void __devinit arch_init_sched_domains(void)
|
|||
cpumask_t covered = CPU_MASK_NONE;
|
||||
int j;
|
||||
|
||||
cpus_and(nodemask, nodemask, cpu_default_map);
|
||||
cpus_and(nodemask, nodemask, *cpu_map);
|
||||
if (cpus_empty(nodemask))
|
||||
continue;
|
||||
|
||||
domainspan = sched_domain_node_span(i);
|
||||
cpus_and(domainspan, domainspan, cpu_default_map);
|
||||
cpus_and(domainspan, domainspan, *cpu_map);
|
||||
|
||||
sg = kmalloc(sizeof(struct sched_group), GFP_KERNEL);
|
||||
sched_group_nodes[i] = sg;
|
||||
|
@ -266,7 +258,7 @@ void __devinit arch_init_sched_domains(void)
|
|||
int n = (i + j) % MAX_NUMNODES;
|
||||
|
||||
cpus_complement(notcovered, covered);
|
||||
cpus_and(tmp, notcovered, cpu_default_map);
|
||||
cpus_and(tmp, notcovered, *cpu_map);
|
||||
cpus_and(tmp, tmp, domainspan);
|
||||
if (cpus_empty(tmp))
|
||||
break;
|
||||
|
@ -293,7 +285,7 @@ void __devinit arch_init_sched_domains(void)
|
|||
#endif
|
||||
|
||||
/* Calculate CPU power for physical packages and nodes */
|
||||
for_each_cpu_mask(i, cpu_default_map) {
|
||||
for_each_cpu_mask(i, *cpu_map) {
|
||||
int power;
|
||||
struct sched_domain *sd;
|
||||
#ifdef CONFIG_SCHED_SMT
|
||||
|
@ -359,13 +351,35 @@ next_sg:
|
|||
cpu_attach_domain(sd, i);
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Set up scheduler domains and groups. Callers must hold the hotplug lock.
|
||||
*/
|
||||
void arch_init_sched_domains(const cpumask_t *cpu_map)
|
||||
{
|
||||
cpumask_t cpu_default_map;
|
||||
|
||||
void __devinit arch_destroy_sched_domains(void)
|
||||
/*
|
||||
* Setup mask for cpus without special case scheduling requirements.
|
||||
* For now this just excludes isolated cpus, but could be used to
|
||||
* exclude other special cases in the future.
|
||||
*/
|
||||
cpus_andnot(cpu_default_map, *cpu_map, cpu_isolated_map);
|
||||
|
||||
build_sched_domains(&cpu_default_map);
|
||||
}
|
||||
|
||||
void arch_destroy_sched_domains(const cpumask_t *cpu_map)
|
||||
{
|
||||
#ifdef CONFIG_NUMA
|
||||
int i;
|
||||
for (i = 0; i < MAX_NUMNODES; i++) {
|
||||
cpumask_t nodemask = node_to_cpumask(i);
|
||||
struct sched_group *oldsg, *sg = sched_group_nodes[i];
|
||||
|
||||
cpus_and(nodemask, nodemask, *cpu_map);
|
||||
if (cpus_empty(nodemask))
|
||||
continue;
|
||||
|
||||
if (sg == NULL)
|
||||
continue;
|
||||
sg = sg->next;
|
||||
|
|
|
@ -346,6 +346,7 @@ smp_callin (void)
|
|||
lock_ipi_calllock();
|
||||
cpu_set(cpuid, cpu_online_map);
|
||||
unlock_ipi_calllock();
|
||||
per_cpu(cpu_state, cpuid) = CPU_ONLINE;
|
||||
|
||||
smp_setup_percpu_timer();
|
||||
|
||||
|
@ -611,6 +612,7 @@ void __devinit smp_prepare_boot_cpu(void)
|
|||
{
|
||||
cpu_set(smp_processor_id(), cpu_online_map);
|
||||
cpu_set(smp_processor_id(), cpu_callin_map);
|
||||
per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -688,6 +690,7 @@ int __cpu_disable(void)
|
|||
return -EBUSY;
|
||||
|
||||
remove_siblinginfo(cpu);
|
||||
cpu_clear(cpu, cpu_online_map);
|
||||
fixup_irqs();
|
||||
local_flush_tlb_all();
|
||||
cpu_clear(cpu, cpu_callin_map);
|
||||
|
@ -774,6 +777,7 @@ __cpu_up (unsigned int cpu)
|
|||
if (cpu_isset(cpu, cpu_callin_map))
|
||||
return -EINVAL;
|
||||
|
||||
per_cpu(cpu_state, cpu) = CPU_UP_PREPARE;
|
||||
/* Processor goes to start_secondary(), sets online flag */
|
||||
ret = do_boot_cpu(sapicid, cpu);
|
||||
if (ret < 0)
|
||||
|
|
|
@ -87,7 +87,7 @@ struct xpc_rsvd_page {
|
|||
u8 partid; /* partition ID from SAL */
|
||||
u8 version;
|
||||
u8 pad[6]; /* pad to u64 align */
|
||||
u64 vars_pa;
|
||||
volatile u64 vars_pa;
|
||||
u64 part_nasids[XP_NASID_MASK_WORDS] ____cacheline_aligned;
|
||||
u64 mach_nasids[XP_NASID_MASK_WORDS] ____cacheline_aligned;
|
||||
};
|
||||
|
@ -138,7 +138,7 @@ struct xpc_vars {
|
|||
* occupies half a cacheline.
|
||||
*/
|
||||
struct xpc_vars_part {
|
||||
u64 magic;
|
||||
volatile u64 magic;
|
||||
|
||||
u64 openclose_args_pa; /* physical address of open and close args */
|
||||
u64 GPs_pa; /* physical address of Get/Put values */
|
||||
|
@ -185,8 +185,8 @@ struct xpc_vars_part {
|
|||
* Define a Get/Put value pair (pointers) used with a message queue.
|
||||
*/
|
||||
struct xpc_gp {
|
||||
s64 get; /* Get value */
|
||||
s64 put; /* Put value */
|
||||
volatile s64 get; /* Get value */
|
||||
volatile s64 put; /* Put value */
|
||||
};
|
||||
|
||||
#define XPC_GP_SIZE \
|
||||
|
@ -231,7 +231,7 @@ struct xpc_openclose_args {
|
|||
*/
|
||||
struct xpc_notify {
|
||||
struct semaphore sema; /* notify semaphore */
|
||||
u8 type; /* type of notification */
|
||||
volatile u8 type; /* type of notification */
|
||||
|
||||
/* the following two fields are only used if type == XPC_N_CALL */
|
||||
xpc_notify_func func; /* user's notify function */
|
||||
|
@ -439,7 +439,7 @@ struct xpc_partition {
|
|||
|
||||
/* XPC infrastructure referencing and teardown control */
|
||||
|
||||
u8 setup_state; /* infrastructure setup state */
|
||||
volatile u8 setup_state; /* infrastructure setup state */
|
||||
wait_queue_head_t teardown_wq; /* kthread waiting to teardown infra */
|
||||
atomic_t references; /* #of references to infrastructure */
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue