提交 3505d1a9 编写于 作者: D David S. Miller

Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6

Conflicts:
	drivers/net/sfc/sfe4001.c
	drivers/net/wireless/libertas/cmd.c
	drivers/staging/Kconfig
	drivers/staging/Makefile
	drivers/staging/rtl8187se/Kconfig
	drivers/staging/rtl8192e/Kconfig

要显示的变更太多。

To preserve performance only 1000 of 1000+ files are displayed.
What: /sys/class/usb_host/usb_hostN/wusb_chid What: /sys/class/uwb_rc/uwbN/wusbhc/wusb_chid
Date: July 2008 Date: July 2008
KernelVersion: 2.6.27 KernelVersion: 2.6.27
Contact: David Vrabel <david.vrabel@csr.com> Contact: David Vrabel <david.vrabel@csr.com>
...@@ -9,7 +9,7 @@ Description: ...@@ -9,7 +9,7 @@ Description:
Set an all zero CHID to stop the host controller. Set an all zero CHID to stop the host controller.
What: /sys/class/usb_host/usb_hostN/wusb_trust_timeout What: /sys/class/uwb_rc/uwbN/wusbhc/wusb_trust_timeout
Date: July 2008 Date: July 2008
KernelVersion: 2.6.27 KernelVersion: 2.6.27
Contact: David Vrabel <david.vrabel@csr.com> Contact: David Vrabel <david.vrabel@csr.com>
......
What: /sys/devices/system/cpu/cpu*/cache/index*/cache_disable_X
Date: August 2008
KernelVersion: 2.6.27
Contact: mark.langsdorf@amd.com
Description: These files exist in every cpu's cache index directories.
There are currently 2 cache_disable_# files in each
directory. Reading from these files on a supported
processor will return that cache disable index value
for that processor and node. Writing to one of these
files will cause the specificed cache index to be disabled.
Currently, only AMD Family 10h Processors support cache index
disable, and only for their L3 caches. See the BIOS and
Kernel Developer's Guide at
http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/31116-Public-GH-BKDG_3.20_2-4-09.pdf
for formatting information and other details on the
cache index disable.
Users: joachim.deguara@amd.com
What: /sys/devices/system/cpu/
Date: pre-git history
Contact: Linux kernel mailing list <linux-kernel@vger.kernel.org>
Description:
A collection of both global and individual CPU attributes
Individual CPU attributes are contained in subdirectories
named by the kernel's logical CPU number, e.g.:
/sys/devices/system/cpu/cpu#/
What: /sys/devices/system/cpu/sched_mc_power_savings
/sys/devices/system/cpu/sched_smt_power_savings
Date: June 2006
Contact: Linux kernel mailing list <linux-kernel@vger.kernel.org>
Description: Discover and adjust the kernel's multi-core scheduler support.
Possible values are:
0 - No power saving load balance (default value)
1 - Fill one thread/core/package first for long running threads
2 - Also bias task wakeups to semi-idle cpu package for power
savings
sched_mc_power_savings is dependent upon SCHED_MC, which is
itself architecture dependent.
sched_smt_power_savings is dependent upon SCHED_SMT, which
is itself architecture dependent.
The two files are independent of each other. It is possible
that one file may be present without the other.
Introduced by git commit 5c45bf27.
What: /sys/devices/system/cpu/kernel_max
/sys/devices/system/cpu/offline
/sys/devices/system/cpu/online
/sys/devices/system/cpu/possible
/sys/devices/system/cpu/present
Date: December 2008
Contact: Linux kernel mailing list <linux-kernel@vger.kernel.org>
Description: CPU topology files that describe kernel limits related to
hotplug. Briefly:
kernel_max: the maximum cpu index allowed by the kernel
configuration.
offline: cpus that are not online because they have been
HOTPLUGGED off or exceed the limit of cpus allowed by the
kernel configuration (kernel_max above).
online: cpus that are online and being scheduled.
possible: cpus that have been allocated resources and can be
brought online if they are present.
present: cpus that have been identified as being present in
the system.
See Documentation/cputopology.txt for more information.
What: /sys/devices/system/cpu/cpu#/node
Date: October 2009
Contact: Linux memory management mailing list <linux-mm@kvack.org>
Description: Discover NUMA node a CPU belongs to
When CONFIG_NUMA is enabled, a symbolic link that points
to the corresponding NUMA node directory.
For example, the following symlink is created for cpu42
in NUMA node 2:
/sys/devices/system/cpu/cpu42/node2 -> ../../node/node2
What: /sys/devices/system/cpu/cpu#/topology/core_id
/sys/devices/system/cpu/cpu#/topology/core_siblings
/sys/devices/system/cpu/cpu#/topology/core_siblings_list
/sys/devices/system/cpu/cpu#/topology/physical_package_id
/sys/devices/system/cpu/cpu#/topology/thread_siblings
/sys/devices/system/cpu/cpu#/topology/thread_siblings_list
Date: December 2008
Contact: Linux kernel mailing list <linux-kernel@vger.kernel.org>
Description: CPU topology files that describe a logical CPU's relationship
to other cores and threads in the same physical package.
One cpu# directory is created per logical CPU in the system,
e.g. /sys/devices/system/cpu/cpu42/.
Briefly, the files above are:
core_id: the CPU core ID of cpu#. Typically it is the
hardware platform's identifier (rather than the kernel's).
The actual value is architecture and platform dependent.
core_siblings: internal kernel map of cpu#'s hardware threads
within the same physical_package_id.
core_siblings_list: human-readable list of the logical CPU
numbers within the same physical_package_id as cpu#.
physical_package_id: physical package id of cpu#. Typically
corresponds to a physical socket number, but the actual value
is architecture and platform dependent.
thread_siblings: internel kernel map of cpu#'s hardware
threads within the same core as cpu#
thread_siblings_list: human-readable list of cpu#'s hardware
threads within the same core as cpu#
See Documentation/cputopology.txt for more information.
What: /sys/devices/system/cpu/cpuidle/current_driver
/sys/devices/system/cpu/cpuidle/current_governer_ro
Date: September 2007
Contact: Linux kernel mailing list <linux-kernel@vger.kernel.org>
Description: Discover cpuidle policy and mechanism
Various CPUs today support multiple idle levels that are
differentiated by varying exit latencies and power
consumption during idle.
Idle policy (governor) is differentiated from idle mechanism
(driver)
current_driver: displays current idle mechanism
current_governor_ro: displays current idle policy
See files in Documentation/cpuidle/ for more information.
What: /sys/devices/system/cpu/cpu*/cache/index*/cache_disable_X
Date: August 2008
KernelVersion: 2.6.27
Contact: mark.langsdorf@amd.com
Description: These files exist in every cpu's cache index directories.
There are currently 2 cache_disable_# files in each
directory. Reading from these files on a supported
processor will return that cache disable index value
for that processor and node. Writing to one of these
files will cause the specificed cache index to be disabled.
Currently, only AMD Family 10h Processors support cache index
disable, and only for their L3 caches. See the BIOS and
Kernel Developer's Guide at
http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/31116-Public-GH-BKDG_3.20_2-4-09.pdf
for formatting information and other details on the
cache index disable.
Users: joachim.deguara@amd.com
...@@ -227,7 +227,14 @@ as the path relative to the root of the cgroup file system. ...@@ -227,7 +227,14 @@ as the path relative to the root of the cgroup file system.
Each cgroup is represented by a directory in the cgroup file system Each cgroup is represented by a directory in the cgroup file system
containing the following files describing that cgroup: containing the following files describing that cgroup:
- tasks: list of tasks (by pid) attached to that cgroup - tasks: list of tasks (by pid) attached to that cgroup. This list
is not guaranteed to be sorted. Writing a thread id into this file
moves the thread into this cgroup.
- cgroup.procs: list of tgids in the cgroup. This list is not
guaranteed to be sorted or free of duplicate tgids, and userspace
should sort/uniquify the list if this property is required.
Writing a tgid into this file moves all threads with that tgid into
this cgroup.
- notify_on_release flag: run the release agent on exit? - notify_on_release flag: run the release agent on exit?
- release_agent: the path to use for release notifications (this file - release_agent: the path to use for release notifications (this file
exists in the top cgroup only) exists in the top cgroup only)
...@@ -374,7 +381,7 @@ Now you want to do something with this cgroup. ...@@ -374,7 +381,7 @@ Now you want to do something with this cgroup.
In this directory you can find several files: In this directory you can find several files:
# ls # ls
notify_on_release tasks cgroup.procs notify_on_release tasks
(plus whatever files added by the attached subsystems) (plus whatever files added by the attached subsystems)
Now attach your shell to this cgroup: Now attach your shell to this cgroup:
......
Export cpu topology info via sysfs. Items (attributes) are similar Export CPU topology info via sysfs. Items (attributes) are similar
to /proc/cpuinfo. to /proc/cpuinfo.
1) /sys/devices/system/cpu/cpuX/topology/physical_package_id: 1) /sys/devices/system/cpu/cpuX/topology/physical_package_id:
represent the physical package id of cpu X;
physical package id of cpuX. Typically corresponds to a physical
socket number, but the actual value is architecture and platform
dependent.
2) /sys/devices/system/cpu/cpuX/topology/core_id: 2) /sys/devices/system/cpu/cpuX/topology/core_id:
represent the cpu core id to cpu X;
the CPU core ID of cpuX. Typically it is the hardware platform's
identifier (rather than the kernel's). The actual value is
architecture and platform dependent.
3) /sys/devices/system/cpu/cpuX/topology/thread_siblings: 3) /sys/devices/system/cpu/cpuX/topology/thread_siblings:
represent the thread siblings to cpu X in the same core;
internel kernel map of cpuX's hardware threads within the same
core as cpuX
4) /sys/devices/system/cpu/cpuX/topology/core_siblings: 4) /sys/devices/system/cpu/cpuX/topology/core_siblings:
represent the thread siblings to cpu X in the same physical package;
internal kernel map of cpuX's hardware threads within the same
physical_package_id.
To implement it in an architecture-neutral way, a new source file, To implement it in an architecture-neutral way, a new source file,
drivers/base/topology.c, is to export the 4 attributes. drivers/base/topology.c, is to export the 4 attributes.
...@@ -32,32 +45,32 @@ not defined by include/asm-XXX/topology.h: ...@@ -32,32 +45,32 @@ not defined by include/asm-XXX/topology.h:
3) thread_siblings: just the given CPU 3) thread_siblings: just the given CPU
4) core_siblings: just the given CPU 4) core_siblings: just the given CPU
Additionally, cpu topology information is provided under Additionally, CPU topology information is provided under
/sys/devices/system/cpu and includes these files. The internal /sys/devices/system/cpu and includes these files. The internal
source for the output is in brackets ("[]"). source for the output is in brackets ("[]").
kernel_max: the maximum cpu index allowed by the kernel configuration. kernel_max: the maximum CPU index allowed by the kernel configuration.
[NR_CPUS-1] [NR_CPUS-1]
offline: cpus that are not online because they have been offline: CPUs that are not online because they have been
HOTPLUGGED off (see cpu-hotplug.txt) or exceed the limit HOTPLUGGED off (see cpu-hotplug.txt) or exceed the limit
of cpus allowed by the kernel configuration (kernel_max of CPUs allowed by the kernel configuration (kernel_max
above). [~cpu_online_mask + cpus >= NR_CPUS] above). [~cpu_online_mask + cpus >= NR_CPUS]
online: cpus that are online and being scheduled [cpu_online_mask] online: CPUs that are online and being scheduled [cpu_online_mask]
possible: cpus that have been allocated resources and can be possible: CPUs that have been allocated resources and can be
brought online if they are present. [cpu_possible_mask] brought online if they are present. [cpu_possible_mask]
present: cpus that have been identified as being present in the present: CPUs that have been identified as being present in the
system. [cpu_present_mask] system. [cpu_present_mask]
The format for the above output is compatible with cpulist_parse() The format for the above output is compatible with cpulist_parse()
[see <linux/cpumask.h>]. Some examples follow. [see <linux/cpumask.h>]. Some examples follow.
In this example, there are 64 cpus in the system but cpus 32-63 exceed In this example, there are 64 CPUs in the system but cpus 32-63 exceed
the kernel max which is limited to 0..31 by the NR_CPUS config option the kernel max which is limited to 0..31 by the NR_CPUS config option
being 32. Note also that cpus 2 and 4-31 are not online but could be being 32. Note also that CPUs 2 and 4-31 are not online but could be
brought online as they are both present and possible. brought online as they are both present and possible.
kernel_max: 31 kernel_max: 31
...@@ -67,8 +80,8 @@ brought online as they are both present and possible. ...@@ -67,8 +80,8 @@ brought online as they are both present and possible.
present: 0-31 present: 0-31
In this example, the NR_CPUS config option is 128, but the kernel was In this example, the NR_CPUS config option is 128, but the kernel was
started with possible_cpus=144. There are 4 cpus in the system and cpu2 started with possible_cpus=144. There are 4 CPUs in the system and cpu2
was manually taken offline (and is the only cpu that can be brought was manually taken offline (and is the only CPU that can be brought
online.) online.)
kernel_max: 127 kernel_max: 127
...@@ -78,4 +91,4 @@ online.) ...@@ -78,4 +91,4 @@ online.)
present: 0-3 present: 0-3
See cpu-hotplug.txt for the possible_cpus=NUM kernel start parameter See cpu-hotplug.txt for the possible_cpus=NUM kernel start parameter
as well as more information on the various cpumask's. as well as more information on the various cpumasks.
...@@ -64,14 +64,14 @@ be used to view the printk buffer of a remote machine, even with live update. ...@@ -64,14 +64,14 @@ be used to view the printk buffer of a remote machine, even with live update.
Bernhard Kaindl enhanced firescope to support accessing 64-bit machines Bernhard Kaindl enhanced firescope to support accessing 64-bit machines
from 32-bit firescope and vice versa: from 32-bit firescope and vice versa:
- ftp://ftp.suse.de/private/bk/firewire/tools/firescope-0.2.2.tar.bz2 - http://halobates.de/firewire/firescope-0.2.2.tar.bz2
and he implemented fast system dump (alpha version - read README.txt): and he implemented fast system dump (alpha version - read README.txt):
- ftp://ftp.suse.de/private/bk/firewire/tools/firedump-0.1.tar.bz2 - http://halobates.de/firewire/firedump-0.1.tar.bz2
There is also a gdb proxy for firewire which allows to use gdb to access There is also a gdb proxy for firewire which allows to use gdb to access
data which can be referenced from symbols found by gdb in vmlinux: data which can be referenced from symbols found by gdb in vmlinux:
- ftp://ftp.suse.de/private/bk/firewire/tools/fireproxy-0.33.tar.bz2 - http://halobates.de/firewire/fireproxy-0.33.tar.bz2
The latest version of this gdb proxy (fireproxy-0.34) can communicate (not The latest version of this gdb proxy (fireproxy-0.34) can communicate (not
yet stable) with kgdb over an memory-based communication module (kgdbom). yet stable) with kgdb over an memory-based communication module (kgdbom).
...@@ -178,7 +178,7 @@ Step-by-step instructions for using firescope with early OHCI initialization: ...@@ -178,7 +178,7 @@ Step-by-step instructions for using firescope with early OHCI initialization:
Notes Notes
----- -----
Documentation and specifications: ftp://ftp.suse.de/private/bk/firewire/docs Documentation and specifications: http://halobates.de/firewire/
FireWire is a trademark of Apple Inc. - for more information please refer to: FireWire is a trademark of Apple Inc. - for more information please refer to:
http://en.wikipedia.org/wiki/FireWire http://en.wikipedia.org/wiki/FireWire
...@@ -418,6 +418,14 @@ When: 2.6.33 ...@@ -418,6 +418,14 @@ When: 2.6.33
Why: Should be implemented in userspace, policy daemon. Why: Should be implemented in userspace, policy daemon.
Who: Johannes Berg <johannes@sipsolutions.net> Who: Johannes Berg <johannes@sipsolutions.net>
---------------------------
What: CONFIG_INOTIFY
When: 2.6.33
Why: last user (audit) will be converted to the newer more generic
and more easily maintained fsnotify subsystem
Who: Eric Paris <eparis@redhat.com>
---------------------------- ----------------------------
What: lock_policy_rwsem_* and unlock_policy_rwsem_* will not be What: lock_policy_rwsem_* and unlock_policy_rwsem_* will not be
...@@ -451,3 +459,33 @@ Why: OSS sound_core grabs all legacy minors (0-255) of SOUND_MAJOR ...@@ -451,3 +459,33 @@ Why: OSS sound_core grabs all legacy minors (0-255) of SOUND_MAJOR
will also allow making ALSA OSS emulation independent of will also allow making ALSA OSS emulation independent of
sound_core. The dependency will be broken then too. sound_core. The dependency will be broken then too.
Who: Tejun Heo <tj@kernel.org> Who: Tejun Heo <tj@kernel.org>
----------------------------
What: Support for VMware's guest paravirtuliazation technique [VMI] will be
dropped.
When: 2.6.37 or earlier.
Why: With the recent innovations in CPU hardware acceleration technologies
from Intel and AMD, VMware ran a few experiments to compare these
techniques to guest paravirtualization technique on VMware's platform.
These hardware assisted virtualization techniques have outperformed the
performance benefits provided by VMI in most of the workloads. VMware
expects that these hardware features will be ubiquitous in a couple of
years, as a result, VMware has started a phased retirement of this
feature from the hypervisor. We will be removing this feature from the
Kernel too. Right now we are targeting 2.6.37 but can retire earlier if
technical reasons (read opportunity to remove major chunk of pvops)
arise.
Please note that VMI has always been an optimization and non-VMI kernels
still work fine on VMware's platform.
Latest versions of VMware's product which support VMI are,
Workstation 7.0 and VSphere 4.0 on ESX side, future maintainence
releases for these products will continue supporting VMI.
For more details about VMI retirement take a look at this,
http://blogs.vmware.com/guestosguide/2009/09/vmi-retirement.html
Who: Alok N Kataria <akataria@vmware.com>
----------------------------
...@@ -123,10 +123,18 @@ resuid=n The user ID which may use the reserved blocks. ...@@ -123,10 +123,18 @@ resuid=n The user ID which may use the reserved blocks.
sb=n Use alternate superblock at this location. sb=n Use alternate superblock at this location.
quota quota These options are ignored by the filesystem. They
noquota noquota are used only by quota tools to recognize volumes
grpquota grpquota where quota should be turned on. See documentation
usrquota usrquota in the quota-tools package for more details
(http://sourceforge.net/projects/linuxquota).
jqfmt=<quota type> These options tell filesystem details about quota
usrjquota=<file> so that quota information can be properly updated
grpjquota=<file> during journal replay. They replace the above
quota options. See documentation in the quota-tools
package for more details
(http://sourceforge.net/projects/linuxquota).
bh (*) ext3 associates buffer heads to data pages to bh (*) ext3 associates buffer heads to data pages to
nobh (a) cache disk block mapping information nobh (a) cache disk block mapping information
......
...@@ -134,9 +134,15 @@ ro Mount filesystem read only. Note that ext4 will ...@@ -134,9 +134,15 @@ ro Mount filesystem read only. Note that ext4 will
mount options "ro,noload" can be used to prevent mount options "ro,noload" can be used to prevent
writes to the filesystem. writes to the filesystem.
journal_checksum Enable checksumming of the journal transactions.
This will allow the recovery code in e2fsck and the
kernel to detect corruption in the kernel. It is a
compatible change and will be ignored by older kernels.
journal_async_commit Commit block can be written to disk without waiting journal_async_commit Commit block can be written to disk without waiting
for descriptor blocks. If enabled older kernels cannot for descriptor blocks. If enabled older kernels cannot
mount the device. mount the device. This will enable 'journal_checksum'
internally.
journal=update Update the ext4 file system's journal to the current journal=update Update the ext4 file system's journal to the current
format. format.
......
Using flexible arrays in the kernel Using flexible arrays in the kernel
Last updated for 2.6.31 Last updated for 2.6.32
Jonathan Corbet <corbet@lwn.net> Jonathan Corbet <corbet@lwn.net>
Large contiguous memory allocations can be unreliable in the Linux kernel. Large contiguous memory allocations can be unreliable in the Linux kernel.
...@@ -40,6 +40,13 @@ argument is passed directly to the internal memory allocation calls. With ...@@ -40,6 +40,13 @@ argument is passed directly to the internal memory allocation calls. With
the current code, using flags to ask for high memory is likely to lead to the current code, using flags to ask for high memory is likely to lead to
notably unpleasant side effects. notably unpleasant side effects.
It is also possible to define flexible arrays at compile time with:
DEFINE_FLEX_ARRAY(name, element_size, total);
This macro will result in a definition of an array with the given name; the
element size and total will be checked for validity at compile time.
Storing data into a flexible array is accomplished with a call to: Storing data into a flexible array is accomplished with a call to:
int flex_array_put(struct flex_array *array, unsigned int element_nr, int flex_array_put(struct flex_array *array, unsigned int element_nr,
...@@ -76,16 +83,30 @@ particular element has never been allocated. ...@@ -76,16 +83,30 @@ particular element has never been allocated.
Note that it is possible to get back a valid pointer for an element which Note that it is possible to get back a valid pointer for an element which
has never been stored in the array. Memory for array elements is allocated has never been stored in the array. Memory for array elements is allocated
one page at a time; a single allocation could provide memory for several one page at a time; a single allocation could provide memory for several
adjacent elements. The flexible array code does not know if a specific adjacent elements. Flexible array elements are normally initialized to the
element has been written; it only knows if the associated memory is value FLEX_ARRAY_FREE (defined as 0x6c in <linux/poison.h>), so errors
present. So a flex_array_get() call on an element which was never stored involving that number probably result from use of unstored array entries.
in the array has the potential to return a pointer to random data. If the Note that, if array elements are allocated with __GFP_ZERO, they will be
caller does not have a separate way to know which elements were actually initialized to zero and this poisoning will not happen.
stored, it might be wise, at least, to add GFP_ZERO to the flags argument
to ensure that all elements are zeroed. Individual elements in the array can be cleared with:
There is no way to remove a single element from the array. It is possible, int flex_array_clear(struct flex_array *array, unsigned int element_nr);
though, to remove all elements with a call to:
This function will set the given element to FLEX_ARRAY_FREE and return
zero. If storage for the indicated element is not allocated for the array,
flex_array_clear() will return -EINVAL instead. Note that clearing an
element does not release the storage associated with it; to reduce the
allocated size of an array, call:
int flex_array_shrink(struct flex_array *array);
The return value will be the number of pages of memory actually freed.
This function works by scanning the array for pages containing nothing but
FLEX_ARRAY_FREE bytes, so (1) it can be expensive, and (2) it will not work
if the array's pages are allocated with __GFP_ZERO.
It is possible to remove all elements of an array with a call to:
void flex_array_free_parts(struct flex_array *array); void flex_array_free_parts(struct flex_array *array);
......
...@@ -353,10 +353,20 @@ power[1-*]_average Average power use ...@@ -353,10 +353,20 @@ power[1-*]_average Average power use
Unit: microWatt Unit: microWatt
RO RO
power[1-*]_average_interval Power use averaging interval power[1-*]_average_interval Power use averaging interval. A poll
notification is sent to this file if the
hardware changes the averaging interval.
Unit: milliseconds Unit: milliseconds
RW RW
power[1-*]_average_interval_max Maximum power use averaging interval
Unit: milliseconds
RO
power[1-*]_average_interval_min Minimum power use averaging interval
Unit: milliseconds
RO
power[1-*]_average_highest Historical average maximum power use power[1-*]_average_highest Historical average maximum power use
Unit: microWatt Unit: microWatt
RO RO
...@@ -365,6 +375,18 @@ power[1-*]_average_lowest Historical average minimum power use ...@@ -365,6 +375,18 @@ power[1-*]_average_lowest Historical average minimum power use
Unit: microWatt Unit: microWatt
RO RO
power[1-*]_average_max A poll notification is sent to
power[1-*]_average when power use
rises above this value.
Unit: microWatt
RW
power[1-*]_average_min A poll notification is sent to
power[1-*]_average when power use
sinks below this value.
Unit: microWatt
RW
power[1-*]_input Instantaneous power use power[1-*]_input Instantaneous power use
Unit: microWatt Unit: microWatt
RO RO
...@@ -381,6 +403,39 @@ power[1-*]_reset_history Reset input_highest, input_lowest, ...@@ -381,6 +403,39 @@ power[1-*]_reset_history Reset input_highest, input_lowest,
average_highest and average_lowest. average_highest and average_lowest.
WO WO
power[1-*]_accuracy Accuracy of the power meter.
Unit: Percent
RO
power[1-*]_alarm 1 if the system is drawing more power than the
cap allows; 0 otherwise. A poll notification is
sent to this file when the power use exceeds the
cap. This file only appears if the cap is known
to be enforced by hardware.
RO
power[1-*]_cap If power use rises above this limit, the
system should take action to reduce power use.
A poll notification is sent to this file if the
cap is changed by the hardware. The *_cap
files only appear if the cap is known to be
enforced by hardware.
Unit: microWatt
RW
power[1-*]_cap_hyst Margin of hysteresis built around capping and
notification.
Unit: microWatt
RW
power[1-*]_cap_max Maximum cap that can be set.
Unit: microWatt
RO
power[1-*]_cap_min Minimum cap that can be set.
Unit: microWatt
RO
********** **********
* Energy * * Energy *
********** **********
......
...@@ -8,7 +8,7 @@ Supported adapters: ...@@ -8,7 +8,7 @@ Supported adapters:
Datasheet: Only available via NDA from ServerWorks Datasheet: Only available via NDA from ServerWorks
* ATI IXP200, IXP300, IXP400, SB600, SB700 and SB800 southbridges * ATI IXP200, IXP300, IXP400, SB600, SB700 and SB800 southbridges
Datasheet: Not publicly available Datasheet: Not publicly available
* AMD SB900 * AMD Hudson-2
Datasheet: Not publicly available Datasheet: Not publicly available
* Standard Microsystems (SMSC) SLC90E66 (Victory66) southbridge * Standard Microsystems (SMSC) SLC90E66 (Victory66) southbridge
Datasheet: Publicly available at the SMSC website http://www.smsc.com Datasheet: Publicly available at the SMSC website http://www.smsc.com
......
...@@ -128,8 +128,8 @@ Setting IsSM Capability Bit ...@@ -128,8 +128,8 @@ Setting IsSM Capability Bit
To create the appropriate character device files automatically with To create the appropriate character device files automatically with
udev, a rule like udev, a rule like
KERNEL="umad*", NAME="infiniband/%k" KERNEL=="umad*", NAME="infiniband/%k"
KERNEL="issm*", NAME="infiniband/%k" KERNEL=="issm*", NAME="infiniband/%k"
can be used. This will create device nodes named can be used. This will create device nodes named
......
...@@ -58,7 +58,7 @@ Memory pinning ...@@ -58,7 +58,7 @@ Memory pinning
To create the appropriate character device files automatically with To create the appropriate character device files automatically with
udev, a rule like udev, a rule like
KERNEL="uverbs*", NAME="infiniband/%k" KERNEL=="uverbs*", NAME="infiniband/%k"
can be used. This will create device nodes named can be used. This will create device nodes named
......
...@@ -671,6 +671,7 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -671,6 +671,7 @@ and is between 256 and 4096 characters. It is defined in the file
earlyprintk= [X86,SH,BLACKFIN] earlyprintk= [X86,SH,BLACKFIN]
earlyprintk=vga earlyprintk=vga
earlyprintk=serial[,ttySn[,baudrate]] earlyprintk=serial[,ttySn[,baudrate]]
earlyprintk=ttySn[,baudrate]
earlyprintk=dbgp[debugController#] earlyprintk=dbgp[debugController#]
Append ",keep" to not disable it when the real console Append ",keep" to not disable it when the real console
......
...@@ -42,7 +42,6 @@ ...@@ -42,7 +42,6 @@
#include <signal.h> #include <signal.h>
#include "linux/lguest_launcher.h" #include "linux/lguest_launcher.h"
#include "linux/virtio_config.h" #include "linux/virtio_config.h"
#include <linux/virtio_ids.h>
#include "linux/virtio_net.h" #include "linux/virtio_net.h"
#include "linux/virtio_blk.h" #include "linux/virtio_blk.h"
#include "linux/virtio_console.h" #include "linux/virtio_console.h"
......
...@@ -3,6 +3,25 @@ HIGHPOINT ROCKETRAID 3xxx/4xxx ADAPTER DRIVER (hptiop) ...@@ -3,6 +3,25 @@ HIGHPOINT ROCKETRAID 3xxx/4xxx ADAPTER DRIVER (hptiop)
Controller Register Map Controller Register Map
------------------------- -------------------------
For RR44xx Intel IOP based adapters, the controller IOP is accessed via PCI BAR0 and BAR2:
BAR0 offset Register
0x11C5C Link Interface IRQ Set
0x11C60 Link Interface IRQ Clear
BAR2 offset Register
0x10 Inbound Message Register 0
0x14 Inbound Message Register 1
0x18 Outbound Message Register 0
0x1C Outbound Message Register 1
0x20 Inbound Doorbell Register
0x24 Inbound Interrupt Status Register
0x28 Inbound Interrupt Mask Register
0x30 Outbound Interrupt Status Register
0x34 Outbound Interrupt Mask Register
0x40 Inbound Queue Port
0x44 Outbound Queue Port
For Intel IOP based adapters, the controller IOP is accessed via PCI BAR0: For Intel IOP based adapters, the controller IOP is accessed via PCI BAR0:
BAR0 offset Register BAR0 offset Register
...@@ -93,7 +112,7 @@ The driver exposes following sysfs attributes: ...@@ -93,7 +112,7 @@ The driver exposes following sysfs attributes:
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
Copyright (C) 2006-2007 HighPoint Technologies, Inc. All Rights Reserved. Copyright (C) 2006-2009 HighPoint Technologies, Inc. All Rights Reserved.
This file is distributed in the hope that it will be useful, This file is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
......
...@@ -522,7 +522,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. ...@@ -522,7 +522,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
pcm_devs - Number of PCM devices assigned to each card pcm_devs - Number of PCM devices assigned to each card
(default = 1, up to 4) (default = 1, up to 4)
pcm_substreams - Number of PCM substreams assigned to each PCM pcm_substreams - Number of PCM substreams assigned to each PCM
(default = 8, up to 16) (default = 8, up to 128)
hrtimer - Use hrtimer (=1, default) or system timer (=0) hrtimer - Use hrtimer (=1, default) or system timer (=0)
fake_buffer - Fake buffer allocations (default = 1) fake_buffer - Fake buffer allocations (default = 1)
......
...@@ -359,6 +359,7 @@ STAC9227/9228/9229/927x ...@@ -359,6 +359,7 @@ STAC9227/9228/9229/927x
5stack-no-fp D965 5stack without front panel 5stack-no-fp D965 5stack without front panel
dell-3stack Dell Dimension E520 dell-3stack Dell Dimension E520
dell-bios Fixes with Dell BIOS setup dell-bios Fixes with Dell BIOS setup
volknob Fixes with volume-knob widget 0x24
auto BIOS setup (default) auto BIOS setup (default)
STAC92HD71B* STAC92HD71B*
......
Generic Thermal Sysfs driver How To Generic Thermal Sysfs driver How To
========================= ===================================
Written by Sujith Thomas <sujith.thomas@intel.com>, Zhang Rui <rui.zhang@intel.com> Written by Sujith Thomas <sujith.thomas@intel.com>, Zhang Rui <rui.zhang@intel.com>
...@@ -10,20 +10,20 @@ Copyright (c) 2008 Intel Corporation ...@@ -10,20 +10,20 @@ Copyright (c) 2008 Intel Corporation
0. Introduction 0. Introduction
The generic thermal sysfs provides a set of interfaces for thermal zone devices (sensors) The generic thermal sysfs provides a set of interfaces for thermal zone
and thermal cooling devices (fan, processor...) to register with the thermal management devices (sensors) and thermal cooling devices (fan, processor...) to register
solution and to be a part of it. with the thermal management solution and to be a part of it.
This how-to focuses on enabling new thermal zone and cooling devices to participate This how-to focuses on enabling new thermal zone and cooling devices to
in thermal management. participate in thermal management.
This solution is platform independent and any type of thermal zone devices and This solution is platform independent and any type of thermal zone devices
cooling devices should be able to make use of the infrastructure. and cooling devices should be able to make use of the infrastructure.
The main task of the thermal sysfs driver is to expose thermal zone attributes as well The main task of the thermal sysfs driver is to expose thermal zone attributes
as cooling device attributes to the user space. as well as cooling device attributes to the user space.
An intelligent thermal management application can make decisions based on inputs An intelligent thermal management application can make decisions based on
from thermal zone attributes (the current temperature and trip point temperature) inputs from thermal zone attributes (the current temperature and trip point
and throttle appropriate devices. temperature) and throttle appropriate devices.
[0-*] denotes any positive number starting from 0 [0-*] denotes any positive number starting from 0
[1-*] denotes any positive number starting from 1 [1-*] denotes any positive number starting from 1
...@@ -31,77 +31,77 @@ and throttle appropriate devices. ...@@ -31,77 +31,77 @@ and throttle appropriate devices.
1. thermal sysfs driver interface functions 1. thermal sysfs driver interface functions
1.1 thermal zone device interface 1.1 thermal zone device interface
1.1.1 struct thermal_zone_device *thermal_zone_device_register(char *name, int trips, 1.1.1 struct thermal_zone_device *thermal_zone_device_register(char *name,
void *devdata, struct thermal_zone_device_ops *ops) int trips, void *devdata, struct thermal_zone_device_ops *ops)
This interface function adds a new thermal zone device (sensor) to This interface function adds a new thermal zone device (sensor) to
/sys/class/thermal folder as thermal_zone[0-*]. /sys/class/thermal folder as thermal_zone[0-*]. It tries to bind all the
It tries to bind all the thermal cooling devices registered at the same time. thermal cooling devices registered at the same time.
name: the thermal zone name. name: the thermal zone name.
trips: the total number of trip points this thermal zone supports. trips: the total number of trip points this thermal zone supports.
devdata: device private data devdata: device private data
ops: thermal zone device call-backs. ops: thermal zone device call-backs.
.bind: bind the thermal zone device with a thermal cooling device. .bind: bind the thermal zone device with a thermal cooling device.
.unbind: unbind the thermal zone device with a thermal cooling device. .unbind: unbind the thermal zone device with a thermal cooling device.
.get_temp: get the current temperature of the thermal zone. .get_temp: get the current temperature of the thermal zone.
.get_mode: get the current mode (user/kernel) of the thermal zone. .get_mode: get the current mode (user/kernel) of the thermal zone.
"kernel" means thermal management is done in kernel. - "kernel" means thermal management is done in kernel.
"user" will prevent kernel thermal driver actions upon trip points - "user" will prevent kernel thermal driver actions upon trip points
so that user applications can take charge of thermal management. so that user applications can take charge of thermal management.
.set_mode: set the mode (user/kernel) of the thermal zone. .set_mode: set the mode (user/kernel) of the thermal zone.
.get_trip_type: get the type of certain trip point. .get_trip_type: get the type of certain trip point.
.get_trip_temp: get the temperature above which the certain trip point .get_trip_temp: get the temperature above which the certain trip point
will be fired. will be fired.
1.1.2 void thermal_zone_device_unregister(struct thermal_zone_device *tz) 1.1.2 void thermal_zone_device_unregister(struct thermal_zone_device *tz)
This interface function removes the thermal zone device. This interface function removes the thermal zone device.
It deletes the corresponding entry form /sys/class/thermal folder and unbind all It deletes the corresponding entry form /sys/class/thermal folder and
the thermal cooling devices it uses. unbind all the thermal cooling devices it uses.
1.2 thermal cooling device interface 1.2 thermal cooling device interface
1.2.1 struct thermal_cooling_device *thermal_cooling_device_register(char *name, 1.2.1 struct thermal_cooling_device *thermal_cooling_device_register(char *name,
void *devdata, struct thermal_cooling_device_ops *) void *devdata, struct thermal_cooling_device_ops *)
This interface function adds a new thermal cooling device (fan/processor/...) to This interface function adds a new thermal cooling device (fan/processor/...)
/sys/class/thermal/ folder as cooling_device[0-*]. to /sys/class/thermal/ folder as cooling_device[0-*]. It tries to bind itself
It tries to bind itself to all the thermal zone devices register at the same time. to all the thermal zone devices register at the same time.
name: the cooling device name. name: the cooling device name.
devdata: device private data. devdata: device private data.
ops: thermal cooling devices call-backs. ops: thermal cooling devices call-backs.
.get_max_state: get the Maximum throttle state of the cooling device. .get_max_state: get the Maximum throttle state of the cooling device.
.get_cur_state: get the Current throttle state of the cooling device. .get_cur_state: get the Current throttle state of the cooling device.
.set_cur_state: set the Current throttle state of the cooling device. .set_cur_state: set the Current throttle state of the cooling device.
1.2.2 void thermal_cooling_device_unregister(struct thermal_cooling_device *cdev) 1.2.2 void thermal_cooling_device_unregister(struct thermal_cooling_device *cdev)
This interface function remove the thermal cooling device. This interface function remove the thermal cooling device.
It deletes the corresponding entry form /sys/class/thermal folder and unbind It deletes the corresponding entry form /sys/class/thermal folder and
itself from all the thermal zone devices using it. unbind itself from all the thermal zone devices using it.
1.3 interface for binding a thermal zone device with a thermal cooling device 1.3 interface for binding a thermal zone device with a thermal cooling device
1.3.1 int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz, 1.3.1 int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz,
int trip, struct thermal_cooling_device *cdev); int trip, struct thermal_cooling_device *cdev);
This interface function bind a thermal cooling device to the certain trip point This interface function bind a thermal cooling device to the certain trip
of a thermal zone device. point of a thermal zone device.
This function is usually called in the thermal zone device .bind callback. This function is usually called in the thermal zone device .bind callback.
tz: the thermal zone device tz: the thermal zone device
cdev: thermal cooling device cdev: thermal cooling device
trip: indicates which trip point the cooling devices is associated with trip: indicates which trip point the cooling devices is associated with
in this thermal zone. in this thermal zone.
1.3.2 int thermal_zone_unbind_cooling_device(struct thermal_zone_device *tz, 1.3.2 int thermal_zone_unbind_cooling_device(struct thermal_zone_device *tz,
int trip, struct thermal_cooling_device *cdev); int trip, struct thermal_cooling_device *cdev);
This interface function unbind a thermal cooling device from the certain trip point This interface function unbind a thermal cooling device from the certain
of a thermal zone device. trip point of a thermal zone device. This function is usually called in
This function is usually called in the thermal zone device .unbind callback. the thermal zone device .unbind callback.
tz: the thermal zone device tz: the thermal zone device
cdev: thermal cooling device cdev: thermal cooling device
trip: indicates which trip point the cooling devices is associated with trip: indicates which trip point the cooling devices is associated with
in this thermal zone. in this thermal zone.
2. sysfs attributes structure 2. sysfs attributes structure
...@@ -114,153 +114,166 @@ if hwmon is compiled in or built as a module. ...@@ -114,153 +114,166 @@ if hwmon is compiled in or built as a module.
Thermal zone device sys I/F, created once it's registered: Thermal zone device sys I/F, created once it's registered:
/sys/class/thermal/thermal_zone[0-*]: /sys/class/thermal/thermal_zone[0-*]:
|-----type: Type of the thermal zone |---type: Type of the thermal zone
|-----temp: Current temperature |---temp: Current temperature
|-----mode: Working mode of the thermal zone |---mode: Working mode of the thermal zone
|-----trip_point_[0-*]_temp: Trip point temperature |---trip_point_[0-*]_temp: Trip point temperature
|-----trip_point_[0-*]_type: Trip point type |---trip_point_[0-*]_type: Trip point type
Thermal cooling device sys I/F, created once it's registered: Thermal cooling device sys I/F, created once it's registered:
/sys/class/thermal/cooling_device[0-*]: /sys/class/thermal/cooling_device[0-*]:
|-----type : Type of the cooling device(processor/fan/...) |---type: Type of the cooling device(processor/fan/...)
|-----max_state: Maximum cooling state of the cooling device |---max_state: Maximum cooling state of the cooling device
|-----cur_state: Current cooling state of the cooling device |---cur_state: Current cooling state of the cooling device
These two dynamic attributes are created/removed in pairs. Then next two dynamic attributes are created/removed in pairs. They represent
They represent the relationship between a thermal zone and its associated cooling device. the relationship between a thermal zone and its associated cooling device.
They are created/removed for each They are created/removed for each successful execution of
thermal_zone_bind_cooling_device/thermal_zone_unbind_cooling_device successful execution. thermal_zone_bind_cooling_device/thermal_zone_unbind_cooling_device.
/sys/class/thermal/thermal_zone[0-*] /sys/class/thermal/thermal_zone[0-*]:
|-----cdev[0-*]: The [0-*]th cooling device in the current thermal zone |---cdev[0-*]: [0-*]th cooling device in current thermal zone
|-----cdev[0-*]_trip_point: Trip point that cdev[0-*] is associated with |---cdev[0-*]_trip_point: Trip point that cdev[0-*] is associated with
Besides the thermal zone device sysfs I/F and cooling device sysfs I/F, Besides the thermal zone device sysfs I/F and cooling device sysfs I/F,
the generic thermal driver also creates a hwmon sysfs I/F for each _type_ of the generic thermal driver also creates a hwmon sysfs I/F for each _type_
thermal zone device. E.g. the generic thermal driver registers one hwmon class device of thermal zone device. E.g. the generic thermal driver registers one hwmon
and build the associated hwmon sysfs I/F for all the registered ACPI thermal zones. class device and build the associated hwmon sysfs I/F for all the registered
ACPI thermal zones.
/sys/class/hwmon/hwmon[0-*]: /sys/class/hwmon/hwmon[0-*]:
|-----name: The type of the thermal zone devices. |---name: The type of the thermal zone devices
|-----temp[1-*]_input: The current temperature of thermal zone [1-*]. |---temp[1-*]_input: The current temperature of thermal zone [1-*]
|-----temp[1-*]_critical: The critical trip point of thermal zone [1-*]. |---temp[1-*]_critical: The critical trip point of thermal zone [1-*]
Please read Documentation/hwmon/sysfs-interface for additional information. Please read Documentation/hwmon/sysfs-interface for additional information.
*************************** ***************************
* Thermal zone attributes * * Thermal zone attributes *
*************************** ***************************
type Strings which represent the thermal zone type. type
This is given by thermal zone driver as part of registration. Strings which represent the thermal zone type.
Eg: "acpitz" indicates it's an ACPI thermal device. This is given by thermal zone driver as part of registration.
In order to keep it consistent with hwmon sys attribute, E.g: "acpitz" indicates it's an ACPI thermal device.
this should be a short, lowercase string, In order to keep it consistent with hwmon sys attribute; this should
not containing spaces nor dashes. be a short, lowercase string, not containing spaces nor dashes.
RO RO, Required
Required
temp
temp Current temperature as reported by thermal zone (sensor) Current temperature as reported by thermal zone (sensor).
Unit: millidegree Celsius Unit: millidegree Celsius
RO RO, Required
Required
mode
mode One of the predefined values in [kernel, user] One of the predefined values in [kernel, user].
This file gives information about the algorithm This file gives information about the algorithm that is currently
that is currently managing the thermal zone. managing the thermal zone. It can be either default kernel based
It can be either default kernel based algorithm algorithm or user space application.
or user space application. kernel = Thermal management in kernel thermal zone driver.
RW user = Preventing kernel thermal zone driver actions upon
Optional trip points so that user application can take full
kernel = Thermal management in kernel thermal zone driver. charge of the thermal management.
user = Preventing kernel thermal zone driver actions upon RW, Optional
trip points so that user application can take full
charge of the thermal management. trip_point_[0-*]_temp
The temperature above which trip point will be fired.
trip_point_[0-*]_temp The temperature above which trip point will be fired Unit: millidegree Celsius
Unit: millidegree Celsius RO, Optional
RO
Optional trip_point_[0-*]_type
Strings which indicate the type of the trip point.
trip_point_[0-*]_type Strings which indicate the type of the trip point E.g. it can be one of critical, hot, passive, active[0-*] for ACPI
E.g. it can be one of critical, hot, passive, thermal zone.
active[0-*] for ACPI thermal zone. RO, Optional
RO
Optional cdev[0-*]
Sysfs link to the thermal cooling device node where the sys I/F
cdev[0-*] Sysfs link to the thermal cooling device node where the sys I/F for cooling device throttling control represents.
for cooling device throttling control represents. RO, Optional
RO
Optional cdev[0-*]_trip_point
The trip point with which cdev[0-*] is associated in this thermal
cdev[0-*]_trip_point The trip point with which cdev[0-*] is associated in this thermal zone zone; -1 means the cooling device is not associated with any trip
-1 means the cooling device is not associated with any trip point. point.
RO RO, Optional
Optional
passive
****************************** Attribute is only present for zones in which the passive cooling
* Cooling device attributes * policy is not supported by native thermal driver. Default is zero
****************************** and can be set to a temperature (in millidegrees) to enable a
passive trip point for the zone. Activation is done by polling with
type String which represents the type of device an interval of 1 second.
eg: For generic ACPI: this should be "Fan", Unit: millidegrees Celsius
"Processor" or "LCD" RW, Optional
eg. For memory controller device on intel_menlow platform:
this should be "Memory controller" *****************************
RO * Cooling device attributes *
Required *****************************
max_state The maximum permissible cooling state of this cooling device. type
RO String which represents the type of device, e.g:
Required - for generic ACPI: should be "Fan", "Processor" or "LCD"
- for memory controller device on intel_menlow platform:
cur_state The current cooling state of this cooling device. should be "Memory controller".
the value can any integer numbers between 0 and max_state, RO, Required
cur_state == 0 means no cooling
cur_state == max_state means the maximum cooling. max_state
RW The maximum permissible cooling state of this cooling device.
Required RO, Required
cur_state
The current cooling state of this cooling device.
The value can any integer numbers between 0 and max_state:
- cur_state == 0 means no cooling
- cur_state == max_state means the maximum cooling.
RW, Required
3. A simple implementation 3. A simple implementation
ACPI thermal zone may support multiple trip points like critical/hot/passive/active. ACPI thermal zone may support multiple trip points like critical, hot,
If an ACPI thermal zone supports critical, passive, active[0] and active[1] at the same time, passive, active. If an ACPI thermal zone supports critical, passive,
it may register itself as a thermal_zone_device (thermal_zone1) with 4 trip points in all. active[0] and active[1] at the same time, it may register itself as a
It has one processor and one fan, which are both registered as thermal_cooling_device. thermal_zone_device (thermal_zone1) with 4 trip points in all.
If the processor is listed in _PSL method, and the fan is listed in _AL0 method, It has one processor and one fan, which are both registered as
the sys I/F structure will be built like this: thermal_cooling_device.
If the processor is listed in _PSL method, and the fan is listed in _AL0
method, the sys I/F structure will be built like this:
/sys/class/thermal: /sys/class/thermal:
|thermal_zone1: |thermal_zone1:
|-----type: acpitz |---type: acpitz
|-----temp: 37000 |---temp: 37000
|-----mode: kernel |---mode: kernel
|-----trip_point_0_temp: 100000 |---trip_point_0_temp: 100000
|-----trip_point_0_type: critical |---trip_point_0_type: critical
|-----trip_point_1_temp: 80000 |---trip_point_1_temp: 80000
|-----trip_point_1_type: passive |---trip_point_1_type: passive
|-----trip_point_2_temp: 70000 |---trip_point_2_temp: 70000
|-----trip_point_2_type: active0 |---trip_point_2_type: active0
|-----trip_point_3_temp: 60000 |---trip_point_3_temp: 60000
|-----trip_point_3_type: active1 |---trip_point_3_type: active1
|-----cdev0: --->/sys/class/thermal/cooling_device0 |---cdev0: --->/sys/class/thermal/cooling_device0
|-----cdev0_trip_point: 1 /* cdev0 can be used for passive */ |---cdev0_trip_point: 1 /* cdev0 can be used for passive */
|-----cdev1: --->/sys/class/thermal/cooling_device3 |---cdev1: --->/sys/class/thermal/cooling_device3
|-----cdev1_trip_point: 2 /* cdev1 can be used for active[0]*/ |---cdev1_trip_point: 2 /* cdev1 can be used for active[0]*/
|cooling_device0: |cooling_device0:
|-----type: Processor |---type: Processor
|-----max_state: 8 |---max_state: 8
|-----cur_state: 0 |---cur_state: 0
|cooling_device3: |cooling_device3:
|-----type: Fan |---type: Fan
|-----max_state: 2 |---max_state: 2
|-----cur_state: 0 |---cur_state: 0
/sys/class/hwmon: /sys/class/hwmon:
|hwmon0: |hwmon0:
|-----name: acpitz |---name: acpitz
|-----temp1_input: 37000 |---temp1_input: 37000
|-----temp1_crit: 100000 |---temp1_crit: 100000
...@@ -1231,6 +1231,7 @@ something like this simple program: ...@@ -1231,6 +1231,7 @@ something like this simple program:
#include <sys/stat.h> #include <sys/stat.h>
#include <fcntl.h> #include <fcntl.h>
#include <unistd.h> #include <unistd.h>
#include <string.h>
#define _STR(x) #x #define _STR(x) #x
#define STR(x) _STR(x) #define STR(x) _STR(x)
...@@ -1265,6 +1266,7 @@ const char *find_debugfs(void) ...@@ -1265,6 +1266,7 @@ const char *find_debugfs(void)
return NULL; return NULL;
} }
strcat(debugfs, "/tracing/");
debugfs_found = 1; debugfs_found = 1;
return debugfs; return debugfs;
......
What is hwpoison?
Upcoming Intel CPUs have support for recovering from some memory errors
(``MCA recovery''). This requires the OS to declare a page "poisoned",
kill the processes associated with it and avoid using it in the future.
This patchkit implements the necessary infrastructure in the VM.
To quote the overview comment:
* High level machine check handler. Handles pages reported by the
* hardware as being corrupted usually due to a 2bit ECC memory or cache
* failure.
*
* This focusses on pages detected as corrupted in the background.
* When the current CPU tries to consume corruption the currently
* running process can just be killed directly instead. This implies
* that if the error cannot be handled for some reason it's safe to
* just ignore it because no corruption has been consumed yet. Instead
* when that happens another machine check will happen.
*
* Handles page cache pages in various states. The tricky part
* here is that we can access any page asynchronous to other VM
* users, because memory failures could happen anytime and anywhere,
* possibly violating some of their assumptions. This is why this code
* has to be extremely careful. Generally it tries to use normal locking
* rules, as in get the standard locks, even if that means the
* error handling takes potentially a long time.
*
* Some of the operations here are somewhat inefficient and have non
* linear algorithmic complexity, because the data structures have not
* been optimized for this case. This is in particular the case
* for the mapping from a vma to a process. Since this case is expected
* to be rare we hope we can get away with this.
The code consists of a the high level handler in mm/memory-failure.c,
a new page poison bit and various checks in the VM to handle poisoned
pages.
The main target right now is KVM guests, but it works for all kinds
of applications. KVM support requires a recent qemu-kvm release.
For the KVM use there was need for a new signal type so that
KVM can inject the machine check into the guest with the proper
address. This in theory allows other applications to handle
memory failures too. The expection is that near all applications
won't do that, but some very specialized ones might.
---
There are two (actually three) modi memory failure recovery can be in:
vm.memory_failure_recovery sysctl set to zero:
All memory failures cause a panic. Do not attempt recovery.
(on x86 this can be also affected by the tolerant level of the
MCE subsystem)
early kill
(can be controlled globally and per process)
Send SIGBUS to the application as soon as the error is detected
This allows applications who can process memory errors in a gentle
way (e.g. drop affected object)
This is the mode used by KVM qemu.
late kill
Send SIGBUS when the application runs into the corrupted page.
This is best for memory error unaware applications and default
Note some pages are always handled as late kill.
---
User control:
vm.memory_failure_recovery
See sysctl.txt
vm.memory_failure_early_kill
Enable early kill mode globally
PR_MCE_KILL
Set early/late kill mode/revert to system default
arg1: PR_MCE_KILL_CLEAR: Revert to system default
arg1: PR_MCE_KILL_SET: arg2 defines thread specific mode
PR_MCE_KILL_EARLY: Early kill
PR_MCE_KILL_LATE: Late kill
PR_MCE_KILL_DEFAULT: Use system global default
PR_MCE_KILL_GET
return current mode
---
Testing:
madvise(MADV_POISON, ....)
(as root)
Poison a page in the process for testing
hwpoison-inject module through debugfs
/sys/debug/hwpoison/corrupt-pfn
Inject hwpoison fault at PFN echoed into this file
Architecture specific MCE injector
x86 has mce-inject, mce-test
Some portable hwpoison test programs in mce-test, see blow.
---
References:
http://halobates.de/mce-lc09-2.pdf
Overview presentation from LinuxCon 09
git://git.kernel.org/pub/scm/utils/cpu/mce/mce-test.git
Test suite (hwpoison specific portable tests in tsrc)
git://git.kernel.org/pub/scm/utils/cpu/mce/mce-inject.git
x86 specific injector
---
Limitations:
- Not all page types are supported and never will. Most kernel internal
objects cannot be recovered, only LRU pages for now.
- Right now hugepage support is missing.
---
Andi Kleen, Oct 2009
...@@ -52,15 +52,15 @@ The KSM daemon is controlled by sysfs files in /sys/kernel/mm/ksm/, ...@@ -52,15 +52,15 @@ The KSM daemon is controlled by sysfs files in /sys/kernel/mm/ksm/,
readable by all but writable only by root: readable by all but writable only by root:
max_kernel_pages - set to maximum number of kernel pages that KSM may use max_kernel_pages - set to maximum number of kernel pages that KSM may use
e.g. "echo 2000 > /sys/kernel/mm/ksm/max_kernel_pages" e.g. "echo 100000 > /sys/kernel/mm/ksm/max_kernel_pages"
Value 0 imposes no limit on the kernel pages KSM may use; Value 0 imposes no limit on the kernel pages KSM may use;
but note that any process using MADV_MERGEABLE can cause but note that any process using MADV_MERGEABLE can cause
KSM to allocate these pages, unswappable until it exits. KSM to allocate these pages, unswappable until it exits.
Default: 2000 (chosen for demonstration purposes) Default: quarter of memory (chosen to not pin too much)
pages_to_scan - how many present pages to scan before ksmd goes to sleep pages_to_scan - how many present pages to scan before ksmd goes to sleep
e.g. "echo 200 > /sys/kernel/mm/ksm/pages_to_scan" e.g. "echo 100 > /sys/kernel/mm/ksm/pages_to_scan"
Default: 200 (chosen for demonstration purposes) Default: 100 (chosen for demonstration purposes)
sleep_millisecs - how many milliseconds ksmd should sleep before next scan sleep_millisecs - how many milliseconds ksmd should sleep before next scan
e.g. "echo 20 > /sys/kernel/mm/ksm/sleep_millisecs" e.g. "echo 20 > /sys/kernel/mm/ksm/sleep_millisecs"
...@@ -70,7 +70,8 @@ run - set 0 to stop ksmd from running but keep merged pages, ...@@ -70,7 +70,8 @@ run - set 0 to stop ksmd from running but keep merged pages,
set 1 to run ksmd e.g. "echo 1 > /sys/kernel/mm/ksm/run", set 1 to run ksmd e.g. "echo 1 > /sys/kernel/mm/ksm/run",
set 2 to stop ksmd and unmerge all pages currently merged, set 2 to stop ksmd and unmerge all pages currently merged,
but leave mergeable areas registered for next run but leave mergeable areas registered for next run
Default: 1 (for immediate use by apps which register) Default: 0 (must be changed to 1 to activate KSM,
except if CONFIG_SYSFS is disabled)
The effectiveness of KSM and MADV_MERGEABLE is shown in /sys/kernel/mm/ksm/: The effectiveness of KSM and MADV_MERGEABLE is shown in /sys/kernel/mm/ksm/:
...@@ -86,4 +87,4 @@ pages_volatile embraces several different kinds of activity, but a high ...@@ -86,4 +87,4 @@ pages_volatile embraces several different kinds of activity, but a high
proportion there would also indicate poor use of madvise MADV_MERGEABLE. proportion there would also indicate poor use of madvise MADV_MERGEABLE.
Izik Eidus, Izik Eidus,
Hugh Dickins, 30 July 2009 Hugh Dickins, 24 Sept 2009
...@@ -2,7 +2,10 @@ ...@@ -2,7 +2,10 @@
* page-types: Tool for querying page flags * page-types: Tool for querying page flags
* *
* Copyright (C) 2009 Intel corporation * Copyright (C) 2009 Intel corporation
* Copyright (C) 2009 Wu Fengguang <fengguang.wu@intel.com> *
* Authors: Wu Fengguang <fengguang.wu@intel.com>
*
* Released under the General Public License (GPL).
*/ */
#define _LARGEFILE64_SOURCE #define _LARGEFILE64_SOURCE
...@@ -69,7 +72,9 @@ ...@@ -69,7 +72,9 @@
#define KPF_COMPOUND_TAIL 16 #define KPF_COMPOUND_TAIL 16
#define KPF_HUGE 17 #define KPF_HUGE 17
#define KPF_UNEVICTABLE 18 #define KPF_UNEVICTABLE 18
#define KPF_HWPOISON 19
#define KPF_NOPAGE 20 #define KPF_NOPAGE 20
#define KPF_KSM 21
/* [32-] kernel hacking assistances */ /* [32-] kernel hacking assistances */
#define KPF_RESERVED 32 #define KPF_RESERVED 32
...@@ -116,7 +121,9 @@ static char *page_flag_names[] = { ...@@ -116,7 +121,9 @@ static char *page_flag_names[] = {
[KPF_COMPOUND_TAIL] = "T:compound_tail", [KPF_COMPOUND_TAIL] = "T:compound_tail",
[KPF_HUGE] = "G:huge", [KPF_HUGE] = "G:huge",
[KPF_UNEVICTABLE] = "u:unevictable", [KPF_UNEVICTABLE] = "u:unevictable",
[KPF_HWPOISON] = "X:hwpoison",
[KPF_NOPAGE] = "n:nopage", [KPF_NOPAGE] = "n:nopage",
[KPF_KSM] = "x:ksm",
[KPF_RESERVED] = "r:reserved", [KPF_RESERVED] = "r:reserved",
[KPF_MLOCKED] = "m:mlocked", [KPF_MLOCKED] = "m:mlocked",
...@@ -152,9 +159,6 @@ static unsigned long opt_size[MAX_ADDR_RANGES]; ...@@ -152,9 +159,6 @@ static unsigned long opt_size[MAX_ADDR_RANGES];
static int nr_vmas; static int nr_vmas;
static unsigned long pg_start[MAX_VMAS]; static unsigned long pg_start[MAX_VMAS];
static unsigned long pg_end[MAX_VMAS]; static unsigned long pg_end[MAX_VMAS];
static unsigned long voffset;
static int pagemap_fd;
#define MAX_BIT_FILTERS 64 #define MAX_BIT_FILTERS 64
static int nr_bit_filters; static int nr_bit_filters;
...@@ -163,9 +167,16 @@ static uint64_t opt_bits[MAX_BIT_FILTERS]; ...@@ -163,9 +167,16 @@ static uint64_t opt_bits[MAX_BIT_FILTERS];
static int page_size; static int page_size;
#define PAGES_BATCH (64 << 10) /* 64k pages */ static int pagemap_fd;
static int kpageflags_fd; static int kpageflags_fd;
static int opt_hwpoison;
static int opt_unpoison;
static char *hwpoison_debug_fs = "/debug/hwpoison";
static int hwpoison_inject_fd;
static int hwpoison_forget_fd;
#define HASH_SHIFT 13 #define HASH_SHIFT 13
#define HASH_SIZE (1 << HASH_SHIFT) #define HASH_SIZE (1 << HASH_SHIFT)
#define HASH_MASK (HASH_SIZE - 1) #define HASH_MASK (HASH_SIZE - 1)
...@@ -207,6 +218,74 @@ static void fatal(const char *x, ...) ...@@ -207,6 +218,74 @@ static void fatal(const char *x, ...)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
static int checked_open(const char *pathname, int flags)
{
int fd = open(pathname, flags);
if (fd < 0) {
perror(pathname);
exit(EXIT_FAILURE);
}
return fd;
}
/*
* pagemap/kpageflags routines
*/
static unsigned long do_u64_read(int fd, char *name,
uint64_t *buf,
unsigned long index,
unsigned long count)
{
long bytes;
if (index > ULONG_MAX / 8)
fatal("index overflow: %lu\n", index);
if (lseek(fd, index * 8, SEEK_SET) < 0) {
perror(name);
exit(EXIT_FAILURE);
}
bytes = read(fd, buf, count * 8);
if (bytes < 0) {
perror(name);
exit(EXIT_FAILURE);
}
if (bytes % 8)
fatal("partial read: %lu bytes\n", bytes);
return bytes / 8;
}
static unsigned long kpageflags_read(uint64_t *buf,
unsigned long index,
unsigned long pages)
{
return do_u64_read(kpageflags_fd, PROC_KPAGEFLAGS, buf, index, pages);
}
static unsigned long pagemap_read(uint64_t *buf,
unsigned long index,
unsigned long pages)
{
return do_u64_read(pagemap_fd, "/proc/pid/pagemap", buf, index, pages);
}
static unsigned long pagemap_pfn(uint64_t val)
{
unsigned long pfn;
if (val & PM_PRESENT)
pfn = PM_PFRAME(val);
else
pfn = 0;
return pfn;
}
/* /*
* page flag names * page flag names
...@@ -255,7 +334,8 @@ static char *page_flag_longname(uint64_t flags) ...@@ -255,7 +334,8 @@ static char *page_flag_longname(uint64_t flags)
* page list and summary * page list and summary
*/ */
static void show_page_range(unsigned long offset, uint64_t flags) static void show_page_range(unsigned long voffset,
unsigned long offset, uint64_t flags)
{ {
static uint64_t flags0; static uint64_t flags0;
static unsigned long voff; static unsigned long voff;
...@@ -281,7 +361,8 @@ static void show_page_range(unsigned long offset, uint64_t flags) ...@@ -281,7 +361,8 @@ static void show_page_range(unsigned long offset, uint64_t flags)
count = 1; count = 1;
} }
static void show_page(unsigned long offset, uint64_t flags) static void show_page(unsigned long voffset,
unsigned long offset, uint64_t flags)
{ {
if (opt_pid) if (opt_pid)
printf("%lx\t", voffset); printf("%lx\t", voffset);
...@@ -362,6 +443,62 @@ static uint64_t well_known_flags(uint64_t flags) ...@@ -362,6 +443,62 @@ static uint64_t well_known_flags(uint64_t flags)
return flags; return flags;
} }
static uint64_t kpageflags_flags(uint64_t flags)
{
flags = expand_overloaded_flags(flags);
if (!opt_raw)
flags = well_known_flags(flags);
return flags;
}
/*
* page actions
*/
static void prepare_hwpoison_fd(void)
{
char buf[100];
if (opt_hwpoison && !hwpoison_inject_fd) {
sprintf(buf, "%s/corrupt-pfn", hwpoison_debug_fs);
hwpoison_inject_fd = checked_open(buf, O_WRONLY);
}
if (opt_unpoison && !hwpoison_forget_fd) {
sprintf(buf, "%s/renew-pfn", hwpoison_debug_fs);
hwpoison_forget_fd = checked_open(buf, O_WRONLY);
}
}
static int hwpoison_page(unsigned long offset)
{
char buf[100];
int len;
len = sprintf(buf, "0x%lx\n", offset);
len = write(hwpoison_inject_fd, buf, len);
if (len < 0) {
perror("hwpoison inject");
return len;
}
return 0;
}
static int unpoison_page(unsigned long offset)
{
char buf[100];
int len;
len = sprintf(buf, "0x%lx\n", offset);
len = write(hwpoison_forget_fd, buf, len);
if (len < 0) {
perror("hwpoison forget");
return len;
}
return 0;
}
/* /*
* page frame walker * page frame walker
...@@ -394,104 +531,83 @@ static int hash_slot(uint64_t flags) ...@@ -394,104 +531,83 @@ static int hash_slot(uint64_t flags)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
static void add_page(unsigned long offset, uint64_t flags) static void add_page(unsigned long voffset,
unsigned long offset, uint64_t flags)
{ {
flags = expand_overloaded_flags(flags); flags = kpageflags_flags(flags);
if (!opt_raw)
flags = well_known_flags(flags);
if (!bit_mask_ok(flags)) if (!bit_mask_ok(flags))
return; return;
if (opt_hwpoison)
hwpoison_page(offset);
if (opt_unpoison)
unpoison_page(offset);
if (opt_list == 1) if (opt_list == 1)
show_page_range(offset, flags); show_page_range(voffset, offset, flags);
else if (opt_list == 2) else if (opt_list == 2)
show_page(offset, flags); show_page(voffset, offset, flags);
nr_pages[hash_slot(flags)]++; nr_pages[hash_slot(flags)]++;
total_pages++; total_pages++;
} }
static void walk_pfn(unsigned long index, unsigned long count) #define KPAGEFLAGS_BATCH (64 << 10) /* 64k pages */
static void walk_pfn(unsigned long voffset,
unsigned long index,
unsigned long count)
{ {
uint64_t buf[KPAGEFLAGS_BATCH];
unsigned long batch; unsigned long batch;
unsigned long n; unsigned long pages;
unsigned long i; unsigned long i;
if (index > ULONG_MAX / KPF_BYTES)
fatal("index overflow: %lu\n", index);
lseek(kpageflags_fd, index * KPF_BYTES, SEEK_SET);
while (count) { while (count) {
uint64_t kpageflags_buf[KPF_BYTES * PAGES_BATCH]; batch = min_t(unsigned long, count, KPAGEFLAGS_BATCH);
pages = kpageflags_read(buf, index, batch);
batch = min_t(unsigned long, count, PAGES_BATCH); if (pages == 0)
n = read(kpageflags_fd, kpageflags_buf, batch * KPF_BYTES);
if (n == 0)
break; break;
if (n < 0) {
perror(PROC_KPAGEFLAGS);
exit(EXIT_FAILURE);
}
if (n % KPF_BYTES != 0) for (i = 0; i < pages; i++)
fatal("partial read: %lu bytes\n", n); add_page(voffset + i, index + i, buf[i]);
n = n / KPF_BYTES;
for (i = 0; i < n; i++) index += pages;
add_page(index + i, kpageflags_buf[i]); count -= pages;
index += batch;
count -= batch;
} }
} }
#define PAGEMAP_BATCH (64 << 10)
#define PAGEMAP_BATCH 4096 static void walk_vma(unsigned long index, unsigned long count)
static unsigned long task_pfn(unsigned long pgoff)
{ {
static uint64_t buf[PAGEMAP_BATCH]; uint64_t buf[PAGEMAP_BATCH];
static unsigned long start; unsigned long batch;
static long count; unsigned long pages;
uint64_t pfn; unsigned long pfn;
unsigned long i;
if (pgoff < start || pgoff >= start + count) { while (count) {
if (lseek64(pagemap_fd, batch = min_t(unsigned long, count, PAGEMAP_BATCH);
(uint64_t)pgoff * PM_ENTRY_BYTES, pages = pagemap_read(buf, index, batch);
SEEK_SET) < 0) { if (pages == 0)
perror("pagemap seek"); break;
exit(EXIT_FAILURE);
}
count = read(pagemap_fd, buf, sizeof(buf));
if (count == 0)
return 0;
if (count < 0) {
perror("pagemap read");
exit(EXIT_FAILURE);
}
if (count % PM_ENTRY_BYTES) {
fatal("pagemap read not aligned.\n");
exit(EXIT_FAILURE);
}
count /= PM_ENTRY_BYTES;
start = pgoff;
}
pfn = buf[pgoff - start]; for (i = 0; i < pages; i++) {
if (pfn & PM_PRESENT) pfn = pagemap_pfn(buf[i]);
pfn = PM_PFRAME(pfn); if (pfn)
else walk_pfn(index + i, pfn, 1);
pfn = 0; }
return pfn; index += pages;
count -= pages;
}
} }
static void walk_task(unsigned long index, unsigned long count) static void walk_task(unsigned long index, unsigned long count)
{ {
int i = 0;
const unsigned long end = index + count; const unsigned long end = index + count;
unsigned long start;
int i = 0;
while (index < end) { while (index < end) {
...@@ -501,15 +617,11 @@ static void walk_task(unsigned long index, unsigned long count) ...@@ -501,15 +617,11 @@ static void walk_task(unsigned long index, unsigned long count)
if (pg_start[i] >= end) if (pg_start[i] >= end)
return; return;
voffset = max_t(unsigned long, pg_start[i], index); start = max_t(unsigned long, pg_start[i], index);
index = min_t(unsigned long, pg_end[i], end); index = min_t(unsigned long, pg_end[i], end);
assert(voffset < index); assert(start < index);
for (; voffset < index; voffset++) { walk_vma(start, index - start);
unsigned long pfn = task_pfn(voffset);
if (pfn)
walk_pfn(pfn, 1);
}
} }
} }
...@@ -527,18 +639,14 @@ static void walk_addr_ranges(void) ...@@ -527,18 +639,14 @@ static void walk_addr_ranges(void)
{ {
int i; int i;
kpageflags_fd = open(PROC_KPAGEFLAGS, O_RDONLY); kpageflags_fd = checked_open(PROC_KPAGEFLAGS, O_RDONLY);
if (kpageflags_fd < 0) {
perror(PROC_KPAGEFLAGS);
exit(EXIT_FAILURE);
}
if (!nr_addr_ranges) if (!nr_addr_ranges)
add_addr_range(0, ULONG_MAX); add_addr_range(0, ULONG_MAX);
for (i = 0; i < nr_addr_ranges; i++) for (i = 0; i < nr_addr_ranges; i++)
if (!opt_pid) if (!opt_pid)
walk_pfn(opt_offset[i], opt_size[i]); walk_pfn(0, opt_offset[i], opt_size[i]);
else else
walk_task(opt_offset[i], opt_size[i]); walk_task(opt_offset[i], opt_size[i]);
...@@ -575,6 +683,8 @@ static void usage(void) ...@@ -575,6 +683,8 @@ static void usage(void)
" -l|--list Show page details in ranges\n" " -l|--list Show page details in ranges\n"
" -L|--list-each Show page details one by one\n" " -L|--list-each Show page details one by one\n"
" -N|--no-summary Don't show summay info\n" " -N|--no-summary Don't show summay info\n"
" -X|--hwpoison hwpoison pages\n"
" -x|--unpoison unpoison pages\n"
" -h|--help Show this usage message\n" " -h|--help Show this usage message\n"
"addr-spec:\n" "addr-spec:\n"
" N one page at offset N (unit: pages)\n" " N one page at offset N (unit: pages)\n"
...@@ -624,11 +734,7 @@ static void parse_pid(const char *str) ...@@ -624,11 +734,7 @@ static void parse_pid(const char *str)
opt_pid = parse_number(str); opt_pid = parse_number(str);
sprintf(buf, "/proc/%d/pagemap", opt_pid); sprintf(buf, "/proc/%d/pagemap", opt_pid);
pagemap_fd = open(buf, O_RDONLY); pagemap_fd = checked_open(buf, O_RDONLY);
if (pagemap_fd < 0) {
perror(buf);
exit(EXIT_FAILURE);
}
sprintf(buf, "/proc/%d/maps", opt_pid); sprintf(buf, "/proc/%d/maps", opt_pid);
file = fopen(buf, "r"); file = fopen(buf, "r");
...@@ -788,6 +894,8 @@ static struct option opts[] = { ...@@ -788,6 +894,8 @@ static struct option opts[] = {
{ "list" , 0, NULL, 'l' }, { "list" , 0, NULL, 'l' },
{ "list-each" , 0, NULL, 'L' }, { "list-each" , 0, NULL, 'L' },
{ "no-summary", 0, NULL, 'N' }, { "no-summary", 0, NULL, 'N' },
{ "hwpoison" , 0, NULL, 'X' },
{ "unpoison" , 0, NULL, 'x' },
{ "help" , 0, NULL, 'h' }, { "help" , 0, NULL, 'h' },
{ NULL , 0, NULL, 0 } { NULL , 0, NULL, 0 }
}; };
...@@ -799,7 +907,7 @@ int main(int argc, char *argv[]) ...@@ -799,7 +907,7 @@ int main(int argc, char *argv[])
page_size = getpagesize(); page_size = getpagesize();
while ((c = getopt_long(argc, argv, while ((c = getopt_long(argc, argv,
"rp:f:a:b:lLNh", opts, NULL)) != -1) { "rp:f:a:b:lLNXxh", opts, NULL)) != -1) {
switch (c) { switch (c) {
case 'r': case 'r':
opt_raw = 1; opt_raw = 1;
...@@ -825,6 +933,14 @@ int main(int argc, char *argv[]) ...@@ -825,6 +933,14 @@ int main(int argc, char *argv[])
case 'N': case 'N':
opt_no_summary = 1; opt_no_summary = 1;
break; break;
case 'X':
opt_hwpoison = 1;
prepare_hwpoison_fd();
break;
case 'x':
opt_unpoison = 1;
prepare_hwpoison_fd();
break;
case 'h': case 'h':
usage(); usage();
exit(0); exit(0);
...@@ -844,7 +960,7 @@ int main(int argc, char *argv[]) ...@@ -844,7 +960,7 @@ int main(int argc, char *argv[])
walk_addr_ranges(); walk_addr_ranges();
if (opt_list == 1) if (opt_list == 1)
show_page_range(0, 0); /* drain the buffer */ show_page_range(0, 0, 0); /* drain the buffer */
if (opt_no_summary) if (opt_no_summary)
return 0; return 0;
......
...@@ -57,7 +57,9 @@ There are three components to pagemap: ...@@ -57,7 +57,9 @@ There are three components to pagemap:
16. COMPOUND_TAIL 16. COMPOUND_TAIL
16. HUGE 16. HUGE
18. UNEVICTABLE 18. UNEVICTABLE
19. HWPOISON
20. NOPAGE 20. NOPAGE
21. KSM
Short descriptions to the page flags: Short descriptions to the page flags:
...@@ -86,9 +88,15 @@ Short descriptions to the page flags: ...@@ -86,9 +88,15 @@ Short descriptions to the page flags:
17. HUGE 17. HUGE
this is an integral part of a HugeTLB page this is an integral part of a HugeTLB page
19. HWPOISON
hardware detected memory corruption on this page: don't touch the data!
20. NOPAGE 20. NOPAGE
no page frame exists at the requested address no page frame exists at the requested address
21. KSM
identical memory pages dynamically shared between one or more processes
[IO related page flags] [IO related page flags]
1. ERROR IO error occurred 1. ERROR IO error occurred
3. UPTODATE page has up-to-date data 3. UPTODATE page has up-to-date data
......
...@@ -65,43 +65,51 @@ trivial patch so apply some common sense. ...@@ -65,43 +65,51 @@ trivial patch so apply some common sense.
8. Happy hacking. 8. Happy hacking.
----------------------------------- Descriptions of section entries:
Maintainers List (try to look for most precise areas first) P: Person (obsolete)
M: Mail patches to: FullName <address@domain>
L: Mailing list that is relevant to this area
W: Web-page with status/info
T: SCM tree type and location. Type is one of: git, hg, quilt, stgit.
S: Status, one of the following:
Supported: Someone is actually paid to look after this.
Maintained: Someone actually looks after it.
Odd Fixes: It has a maintainer but they don't have time to do
much other than throw the odd patch in. See below..
Orphan: No current maintainer [but maybe you could take the
role as you write your new code].
Obsolete: Old code. Something tagged obsolete generally means
it has been replaced by a better system and you
should be using that.
F: Files and directories with wildcard patterns.
A trailing slash includes all files and subdirectory files.
F: drivers/net/ all files in and below drivers/net
F: drivers/net/* all files in drivers/net, but not below
F: */net/* all files in "any top level directory"/net
One pattern per line. Multiple F: lines acceptable.
X: Files and directories that are NOT maintained, same rules as F:
Files exclusions are tested before file matches.
Can be useful for excluding a specific subdirectory, for instance:
F: net/
X: net/ipv6/
matches all files in and below net excluding net/ipv6/
K: Keyword perl extended regex pattern to match content in a
patch or file. For instance:
K: of_get_profile
matches patches or files that contain "of_get_profile"
K: \b(printk|pr_(info|err))\b
matches patches or files that contain one or more of the words
printk, pr_info or pr_err
One regex pattern per line. Multiple K: lines acceptable.
Note: For the hard of thinking, this list is meant to remain in alphabetical Note: For the hard of thinking, this list is meant to remain in alphabetical
order. If you could add yourselves to it in alphabetical order that would be order. If you could add yourselves to it in alphabetical order that would be
so much easier [Ed] so much easier [Ed]
P: Person (obsolete) Maintainers List (try to look for most precise areas first)
M: Mail patches to: FullName <address@domain>
L: Mailing list that is relevant to this area
W: Web-page with status/info
T: SCM tree type and location. Type is one of: git, hg, quilt, stgit.
S: Status, one of the following:
Supported: Someone is actually paid to look after this.
Maintained: Someone actually looks after it.
Odd Fixes: It has a maintainer but they don't have time to do
much other than throw the odd patch in. See below..
Orphan: No current maintainer [but maybe you could take the
role as you write your new code].
Obsolete: Old code. Something tagged obsolete generally means
it has been replaced by a better system and you
should be using that.
F: Files and directories with wildcard patterns. -----------------------------------
A trailing slash includes all files and subdirectory files.
F: drivers/net/ all files in and below drivers/net
F: drivers/net/* all files in drivers/net, but not below
F: */net/* all files in "any top level directory"/net
One pattern per line. Multiple F: lines acceptable.
X: Files and directories that are NOT maintained, same rules as F:
Files exclusions are tested before file matches.
Can be useful for excluding a specific subdirectory, for instance:
F: net/
X: net/ipv6/
matches all files in and below net excluding net/ipv6/
3C505 NETWORK DRIVER 3C505 NETWORK DRIVER
M: Philip Blundell <philb@gnu.org> M: Philip Blundell <philb@gnu.org>
...@@ -174,7 +182,7 @@ M: Ron Minnich <rminnich@sandia.gov> ...@@ -174,7 +182,7 @@ M: Ron Minnich <rminnich@sandia.gov>
M: Latchesar Ionkov <lucho@ionkov.net> M: Latchesar Ionkov <lucho@ionkov.net>
L: v9fs-developer@lists.sourceforge.net L: v9fs-developer@lists.sourceforge.net
W: http://swik.net/v9fs W: http://swik.net/v9fs
T: git git://git.kernel.org/pub/scm/linux/kernel/ericvh/v9fs.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs.git
S: Maintained S: Maintained
F: Documentation/filesystems/9p.txt F: Documentation/filesystems/9p.txt
F: fs/9p/ F: fs/9p/
...@@ -577,6 +585,11 @@ M: Mike Rapoport <mike@compulab.co.il> ...@@ -577,6 +585,11 @@ M: Mike Rapoport <mike@compulab.co.il>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
S: Maintained S: Maintained
ARM/CONTEC MICRO9 MACHINE SUPPORT
M: Hubert Feurstein <hubert.feurstein@contec.at>
S: Maintained
F: arch/arm/mach-ep93xx/micro9.c
ARM/CORGI MACHINE SUPPORT ARM/CORGI MACHINE SUPPORT
M: Richard Purdie <rpurdie@rpsys.net> M: Richard Purdie <rpurdie@rpsys.net>
S: Maintained S: Maintained
...@@ -893,7 +906,6 @@ M: Karol Kozimor <sziwan@users.sourceforge.net> ...@@ -893,7 +906,6 @@ M: Karol Kozimor <sziwan@users.sourceforge.net>
L: acpi4asus-user@lists.sourceforge.net L: acpi4asus-user@lists.sourceforge.net
W: http://acpi4asus.sf.net W: http://acpi4asus.sf.net
S: Maintained S: Maintained
F: arch/x86/kernel/acpi/boot.c
F: drivers/platform/x86/asus_acpi.c F: drivers/platform/x86/asus_acpi.c
ASUS ASB100 HARDWARE MONITOR DRIVER ASUS ASB100 HARDWARE MONITOR DRIVER
...@@ -987,7 +999,7 @@ F: drivers/net/atlx/ ...@@ -987,7 +999,7 @@ F: drivers/net/atlx/
ATM ATM
M: Chas Williams <chas@cmf.nrl.navy.mil> M: Chas Williams <chas@cmf.nrl.navy.mil>
L: linux-atm-general@lists.sourceforge.net (subscribers-only) L: linux-atm-general@lists.sourceforge.net (moderated for non-subscribers)
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
W: http://linux-atm.sourceforge.net W: http://linux-atm.sourceforge.net
S: Maintained S: Maintained
...@@ -1230,6 +1242,12 @@ L: netdev@vger.kernel.org ...@@ -1230,6 +1242,12 @@ L: netdev@vger.kernel.org
S: Supported S: Supported
F: drivers/net/tg3.* F: drivers/net/tg3.*
BROCADE BFA FC SCSI DRIVER
M: Jing Huang <huangj@brocade.com>
L: linux-scsi@vger.kernel.org
S: Supported
F: drivers/scsi/bfa/
BSG (block layer generic sg v4 driver) BSG (block layer generic sg v4 driver)
M: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> M: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
L: linux-scsi@vger.kernel.org L: linux-scsi@vger.kernel.org
...@@ -1467,6 +1485,7 @@ F: mm/*cgroup* ...@@ -1467,6 +1485,7 @@ F: mm/*cgroup*
CORETEMP HARDWARE MONITORING DRIVER CORETEMP HARDWARE MONITORING DRIVER
M: Rudolf Marek <r.marek@assembler.cz> M: Rudolf Marek <r.marek@assembler.cz>
M: Huaxu Wan <huaxu.wan@intel.com>
L: lm-sensors@lm-sensors.org L: lm-sensors@lm-sensors.org
S: Maintained S: Maintained
F: Documentation/hwmon/coretemp F: Documentation/hwmon/coretemp
...@@ -2057,7 +2076,7 @@ S: Maintained ...@@ -2057,7 +2076,7 @@ S: Maintained
F: fs/* F: fs/*
FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER
M: Riku Voipio <riku.vipio@iki.fi> M: Riku Voipio <riku.voipio@iki.fi>
L: lm-sensors@lm-sensors.org L: lm-sensors@lm-sensors.org
S: Maintained S: Maintained
F: drivers/hwmon/f75375s.c F: drivers/hwmon/f75375s.c
...@@ -2138,7 +2157,7 @@ S: Supported ...@@ -2138,7 +2157,7 @@ S: Supported
F: arch/powerpc/sysdev/qe_lib/ F: arch/powerpc/sysdev/qe_lib/
F: arch/powerpc/include/asm/*qe.h F: arch/powerpc/include/asm/*qe.h
FREESCALE USB PERIPHERIAL DRIVERS FREESCALE USB PERIPHERAL DRIVERS
M: Li Yang <leoli@freescale.com> M: Li Yang <leoli@freescale.com>
L: linux-usb@vger.kernel.org L: linux-usb@vger.kernel.org
L: linuxppc-dev@ozlabs.org L: linuxppc-dev@ozlabs.org
...@@ -2189,18 +2208,6 @@ F: Documentation/filesystems/caching/ ...@@ -2189,18 +2208,6 @@ F: Documentation/filesystems/caching/
F: fs/fscache/ F: fs/fscache/
F: include/linux/fscache*.h F: include/linux/fscache*.h
TRACING
M: Steven Rostedt <rostedt@goodmis.org>
M: Frederic Weisbecker <fweisbec@gmail.com>
M: Ingo Molnar <mingo@redhat.com>
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git tracing/core
S: Maintained
F: Documentation/trace/ftrace.txt
F: arch/*/*/*/ftrace.h
F: arch/*/kernel/ftrace.c
F: include/*/ftrace.h include/trace/ include/linux/trace*.h
F: kernel/trace/
FUJITSU FR-V (FRV) PORT FUJITSU FR-V (FRV) PORT
M: David Howells <dhowells@redhat.com> M: David Howells <dhowells@redhat.com>
S: Maintained S: Maintained
...@@ -2259,9 +2266,8 @@ S: Maintained ...@@ -2259,9 +2266,8 @@ S: Maintained
F: include/asm-generic F: include/asm-generic
GENERIC UIO DRIVER FOR PCI DEVICES GENERIC UIO DRIVER FOR PCI DEVICES
M: Michael S. Tsirkin <mst@redhat.com> M: "Michael S. Tsirkin" <mst@redhat.com>
L: kvm@vger.kernel.org L: kvm@vger.kernel.org
L: linux-kernel@vger.kernel.org
S: Supported S: Supported
F: drivers/uio/uio_pci_generic.c F: drivers/uio/uio_pci_generic.c
...@@ -2602,6 +2608,7 @@ L: linux1394-devel@lists.sourceforge.net ...@@ -2602,6 +2608,7 @@ L: linux1394-devel@lists.sourceforge.net
W: http://www.linux1394.org/ W: http://www.linux1394.org/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git
S: Maintained S: Maintained
F: Documentation/debugging-via-ohci1394.txt
F: drivers/ieee1394/ F: drivers/ieee1394/
IEEE 1394 RAW I/O DRIVER IEEE 1394 RAW I/O DRIVER
...@@ -2815,7 +2822,7 @@ F: drivers/infiniband/hw/ipath/ ...@@ -2815,7 +2822,7 @@ F: drivers/infiniband/hw/ipath/
IPMI SUBSYSTEM IPMI SUBSYSTEM
M: Corey Minyard <minyard@acm.org> M: Corey Minyard <minyard@acm.org>
L: openipmi-developer@lists.sourceforge.net L: openipmi-developer@lists.sourceforge.net (moderated for non-subscribers)
W: http://openipmi.sourceforge.net/ W: http://openipmi.sourceforge.net/
S: Supported S: Supported
F: Documentation/IPMI.txt F: Documentation/IPMI.txt
...@@ -2990,8 +2997,8 @@ F: scripts/Makefile.* ...@@ -2990,8 +2997,8 @@ F: scripts/Makefile.*
KERNEL JANITORS KERNEL JANITORS
L: kernel-janitors@vger.kernel.org L: kernel-janitors@vger.kernel.org
W: http://www.kerneljanitors.org/ W: http://janitor.kernelnewbies.org/
S: Maintained S: Odd Fixes
KERNEL NFSD, SUNRPC, AND LOCKD SERVERS KERNEL NFSD, SUNRPC, AND LOCKD SERVERS
M: "J. Bruce Fields" <bfields@fieldses.org> M: "J. Bruce Fields" <bfields@fieldses.org>
...@@ -3076,9 +3083,13 @@ F: kernel/kgdb.c ...@@ -3076,9 +3083,13 @@ F: kernel/kgdb.c
KMEMCHECK KMEMCHECK
M: Vegard Nossum <vegardno@ifi.uio.no> M: Vegard Nossum <vegardno@ifi.uio.no>
P Pekka Enberg M: Pekka Enberg <penberg@cs.helsinki.fi>
M: penberg@cs.helsinki.fi
S: Maintained S: Maintained
F: Documentation/kmemcheck.txt
F: arch/x86/include/asm/kmemcheck.h
F: arch/x86/mm/kmemcheck/
F: include/linux/kmemcheck.h
F: mm/kmemcheck.c
KMEMLEAK KMEMLEAK
M: Catalin Marinas <catalin.marinas@arm.com> M: Catalin Marinas <catalin.marinas@arm.com>
...@@ -3608,7 +3619,7 @@ L: netfilter@vger.kernel.org ...@@ -3608,7 +3619,7 @@ L: netfilter@vger.kernel.org
L: coreteam@netfilter.org L: coreteam@netfilter.org
W: http://www.netfilter.org/ W: http://www.netfilter.org/
W: http://www.iptables.org/ W: http://www.iptables.org/
T: git://git.kernel.org/pub/scm/linux/kernel/git/kaber/nf-2.6.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/kaber/nf-2.6.git
S: Supported S: Supported
F: include/linux/netfilter* F: include/linux/netfilter*
F: include/linux/netfilter/ F: include/linux/netfilter/
...@@ -3772,7 +3783,7 @@ F: drivers/video/riva/ ...@@ -3772,7 +3783,7 @@ F: drivers/video/riva/
F: drivers/video/nvidia/ F: drivers/video/nvidia/
OMAP SUPPORT OMAP SUPPORT
M: "Tony Lindgren <tony@atomide.com>" <tony@atomide.com> M: Tony Lindgren <tony@atomide.com>
L: linux-omap@vger.kernel.org L: linux-omap@vger.kernel.org
W: http://www.muru.com/linux/omap/ W: http://www.muru.com/linux/omap/
W: http://linux.omap.com/ W: http://linux.omap.com/
...@@ -3877,6 +3888,15 @@ S: Maintained ...@@ -3877,6 +3888,15 @@ S: Maintained
F: Documentation/i2c/busses/i2c-ocores F: Documentation/i2c/busses/i2c-ocores
F: drivers/i2c/busses/i2c-ocores.c F: drivers/i2c/busses/i2c-ocores.c
OPEN FIRMWARE AND FLATTENED DEVICE TREE
M: Grant Likely <grant.likely@secretlab.ca>
L: devicetree-discuss@lists.ozlabs.org
W: http://fdt.secretlab.ca
S: Maintained
F: drivers/of
F: include/linux/of*.h
K: of_get_property
OPROFILE OPROFILE
M: Robert Richter <robert.richter@amd.com> M: Robert Richter <robert.richter@amd.com>
L: oprofile-list@lists.sf.net L: oprofile-list@lists.sf.net
...@@ -3981,6 +4001,7 @@ F: drivers/block/paride/ ...@@ -3981,6 +4001,7 @@ F: drivers/block/paride/
PARISC ARCHITECTURE PARISC ARCHITECTURE
M: Kyle McMartin <kyle@mcmartin.ca> M: Kyle McMartin <kyle@mcmartin.ca>
M: Helge Deller <deller@gmx.de> M: Helge Deller <deller@gmx.de>
M: "James E.J. Bottomley" <jejb@parisc-linux.org>
L: linux-parisc@vger.kernel.org L: linux-parisc@vger.kernel.org
W: http://www.parisc-linux.org/ W: http://www.parisc-linux.org/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6.git
...@@ -4064,6 +4085,13 @@ M: Peter Zijlstra <a.p.zijlstra@chello.nl> ...@@ -4064,6 +4085,13 @@ M: Peter Zijlstra <a.p.zijlstra@chello.nl>
M: Paul Mackerras <paulus@samba.org> M: Paul Mackerras <paulus@samba.org>
M: Ingo Molnar <mingo@elte.hu> M: Ingo Molnar <mingo@elte.hu>
S: Supported S: Supported
F: kernel/perf_event.c
F: include/linux/perf_event.h
F: arch/*/*/kernel/perf_event.c
F: arch/*/include/asm/perf_event.h
F: arch/*/lib/perf_event.c
F: arch/*/kernel/perf_callchain.c
F: tools/perf/
PERSONALITY HANDLING PERSONALITY HANDLING
M: Christoph Hellwig <hch@infradead.org> M: Christoph Hellwig <hch@infradead.org>
...@@ -4515,12 +4543,11 @@ F: kernel/sched* ...@@ -4515,12 +4543,11 @@ F: kernel/sched*
F: include/linux/sched.h F: include/linux/sched.h
SCORE ARCHITECTURE SCORE ARCHITECTURE
P: Chen Liqin M: Chen Liqin <liqin.chen@sunplusct.com>
M: liqin.chen@sunplusct.com M: Lennox Wu <lennox.wu@gmail.com>
P: Lennox Wu
M: lennox.wu@gmail.com
W: http://www.sunplusct.com W: http://www.sunplusct.com
S: Supported S: Supported
F: arch/score/
SCSI CDROM DRIVER SCSI CDROM DRIVER
M: Jens Axboe <axboe@kernel.dk> M: Jens Axboe <axboe@kernel.dk>
...@@ -4593,27 +4620,27 @@ S: Maintained ...@@ -4593,27 +4620,27 @@ S: Maintained
F: drivers/mmc/host/sdricoh_cs.c F: drivers/mmc/host/sdricoh_cs.c
SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) DRIVER SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) DRIVER
S: Orphan S: Orphan
L: linux-mmc@vger.kernel.org L: linux-mmc@vger.kernel.org
F: drivers/mmc/host/sdhci.* F: drivers/mmc/host/sdhci.*
SECURE DIGITAL HOST CONTROLLER INTERFACE, OPEN FIRMWARE BINDINGS (SDHCI-OF) SECURE DIGITAL HOST CONTROLLER INTERFACE, OPEN FIRMWARE BINDINGS (SDHCI-OF)
M: Anton Vorontsov <avorontsov@ru.mvista.com> M: Anton Vorontsov <avorontsov@ru.mvista.com>
L: linuxppc-dev@ozlabs.org L: linuxppc-dev@ozlabs.org
L: linux-mmc@vger.kernel.org L: linux-mmc@vger.kernel.org
S: Maintained S: Maintained
F: drivers/mmc/host/sdhci-of.* F: drivers/mmc/host/sdhci-of.*
SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) SAMSUNG DRIVER SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) SAMSUNG DRIVER
M: Ben Dooks <ben-linux@fluff.org> M: Ben Dooks <ben-linux@fluff.org>
L: linux-mmc@vger.kernel.org L: linux-mmc@vger.kernel.org
S: Maintained S: Maintained
F: drivers/mmc/host/sdhci-s3c.c F: drivers/mmc/host/sdhci-s3c.c
SECURITY SUBSYSTEM SECURITY SUBSYSTEM
M: James Morris <jmorris@namei.org> M: James Morris <jmorris@namei.org>
L: linux-security-module@vger.kernel.org (suggested Cc:) L: linux-security-module@vger.kernel.org (suggested Cc:)
T: git git://www.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6.git
W: http://security.wiki.kernel.org/ W: http://security.wiki.kernel.org/
S: Supported S: Supported
F: security/ F: security/
...@@ -4648,6 +4675,13 @@ F: drivers/ata/ ...@@ -4648,6 +4675,13 @@ F: drivers/ata/
F: include/linux/ata.h F: include/linux/ata.h
F: include/linux/libata.h F: include/linux/libata.h
SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER
M: Jayamohan Kallickal <jayamohank@serverengines.com>
L: linux-scsi@vger.kernel.org
W: http://www.serverengines.com
S: Supported
F: drivers/scsi/be2iscsi/
SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER
M: Sathya Perla <sathyap@serverengines.com> M: Sathya Perla <sathyap@serverengines.com>
M: Subbu Seetharaman <subbus@serverengines.com> M: Subbu Seetharaman <subbus@serverengines.com>
...@@ -4701,8 +4735,7 @@ F: drivers/usb/gadget/lh7a40* ...@@ -4701,8 +4735,7 @@ F: drivers/usb/gadget/lh7a40*
F: drivers/usb/host/ohci-lh7a40* F: drivers/usb/host/ohci-lh7a40*
SIMPLE FIRMWARE INTERFACE (SFI) SIMPLE FIRMWARE INTERFACE (SFI)
P: Len Brown M: Len Brown <lenb@kernel.org>
M: lenb@kernel.org
L: sfi-devel@simplefirmware.org L: sfi-devel@simplefirmware.org
W: http://simplefirmware.org/ W: http://simplefirmware.org/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-sfi-2.6.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-sfi-2.6.git
...@@ -5150,6 +5183,20 @@ L: tpmdd-devel@lists.sourceforge.net (moderated for non-subscribers) ...@@ -5150,6 +5183,20 @@ L: tpmdd-devel@lists.sourceforge.net (moderated for non-subscribers)
S: Maintained S: Maintained
F: drivers/char/tpm/ F: drivers/char/tpm/
TRACING
M: Steven Rostedt <rostedt@goodmis.org>
M: Frederic Weisbecker <fweisbec@gmail.com>
M: Ingo Molnar <mingo@redhat.com>
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git tracing/core
S: Maintained
F: Documentation/trace/ftrace.txt
F: arch/*/*/*/ftrace.h
F: arch/*/kernel/ftrace.c
F: include/*/ftrace.h
F: include/linux/trace*.h
F: include/trace/
F: kernel/trace/
TRIVIAL PATCHES TRIVIAL PATCHES
M: Jiri Kosina <trivial@kernel.org> M: Jiri Kosina <trivial@kernel.org>
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial.git
...@@ -5639,11 +5686,11 @@ F: drivers/vlynq/vlynq.c ...@@ -5639,11 +5686,11 @@ F: drivers/vlynq/vlynq.c
F: include/linux/vlynq.h F: include/linux/vlynq.h
VMWARE VMXNET3 ETHERNET DRIVER VMWARE VMXNET3 ETHERNET DRIVER
M: Shreyas Bhatewara <sbhatewara@vmware.com> M: Shreyas Bhatewara <sbhatewara@vmware.com>
M: VMware, Inc. <pv-drivers@vmware.com> M: "VMware, Inc." <pv-drivers@vmware.com>
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
S: Maintained S: Maintained
F: drivers/net/vmxnet3/ F: drivers/net/vmxnet3/
VOLTAGE AND CURRENT REGULATOR FRAMEWORK VOLTAGE AND CURRENT REGULATOR FRAMEWORK
M: Liam Girdwood <lrg@slimlogic.co.uk> M: Liam Girdwood <lrg@slimlogic.co.uk>
...@@ -5716,8 +5763,7 @@ S: Maintained ...@@ -5716,8 +5763,7 @@ S: Maintained
F: drivers/scsi/wd7000.c F: drivers/scsi/wd7000.c
WINBOND CIR DRIVER WINBOND CIR DRIVER
P: David Hrdeman M: David Härdeman <david@hardeman.nu>
M: david@hardeman.nu
S: Maintained S: Maintained
F: drivers/input/misc/winbond-cir.c F: drivers/input/misc/winbond-cir.c
...@@ -5774,9 +5820,7 @@ F: drivers/input/touchscreen/*wm97* ...@@ -5774,9 +5820,7 @@ F: drivers/input/touchscreen/*wm97*
F: include/linux/wm97xx.h F: include/linux/wm97xx.h
WOLFSON MICROELECTRONICS PMIC DRIVERS WOLFSON MICROELECTRONICS PMIC DRIVERS
P: Mark Brown M: Mark Brown <broonie@opensource.wolfsonmicro.com>
M: broonie@opensource.wolfsonmicro.com
L: linux-kernel@vger.kernel.org
T: git git://opensource.wolfsonmicro.com/linux-2.6-audioplus T: git git://opensource.wolfsonmicro.com/linux-2.6-audioplus
W: http://opensource.wolfsonmicro.com/node/8 W: http://opensource.wolfsonmicro.com/node/8
S: Supported S: Supported
......
VERSION = 2 VERSION = 2
PATCHLEVEL = 6 PATCHLEVEL = 6
SUBLEVEL = 32 SUBLEVEL = 32
EXTRAVERSION = -rc3 EXTRAVERSION = -rc7
NAME = Man-Eating Seals of Antiquity NAME = Man-Eating Seals of Antiquity
# *DOCUMENTATION* # *DOCUMENTATION*
...@@ -179,46 +179,9 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \ ...@@ -179,46 +179,9 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
# Alternatively CROSS_COMPILE can be set in the environment. # Alternatively CROSS_COMPILE can be set in the environment.
# Default value for CROSS_COMPILE is not to prefix executables # Default value for CROSS_COMPILE is not to prefix executables
# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile # Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
#
# To force ARCH and CROSS_COMPILE settings include kernel.* files
# in the kernel tree - do not patch this file.
export KBUILD_BUILDHOST := $(SUBARCH) export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= $(SUBARCH)
# Kbuild save the ARCH and CROSS_COMPILE setting in kernel.* files. CROSS_COMPILE ?=
# Restore these settings and check that user did not specify
# conflicting values.
saved_arch := $(shell cat include/generated/kernel.arch 2> /dev/null)
saved_cross := $(shell cat include/generated/kernel.cross 2> /dev/null)
ifneq ($(CROSS_COMPILE),)
ifneq ($(saved_cross),)
ifneq ($(CROSS_COMPILE),$(saved_cross))
$(error CROSS_COMPILE changed from \
"$(saved_cross)" to \
to "$(CROSS_COMPILE)". \
Use "make mrproper" to fix it up)
endif
endif
else
CROSS_COMPILE := $(saved_cross)
endif
ifneq ($(ARCH),)
ifneq ($(saved_arch),)
ifneq ($(saved_arch),$(ARCH))
$(error ARCH changed from \
"$(saved_arch)" to "$(ARCH)". \
Use "make mrproper" to fix it up)
endif
endif
else
ifneq ($(saved_arch),)
ARCH := $(saved_arch)
else
ARCH := $(SUBARCH)
endif
endif
# Architecture as present in compile.h # Architecture as present in compile.h
UTS_MACHINE := $(ARCH) UTS_MACHINE := $(ARCH)
...@@ -258,7 +221,7 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ ...@@ -258,7 +221,7 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
HOSTCC = gcc HOSTCC = gcc
HOSTCXX = g++ HOSTCXX = g++
HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer HOSTCFLAGS = -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer
HOSTCXXFLAGS = -O2 HOSTCXXFLAGS = -O2
# Decide whether to build built-in, modular, or both. # Decide whether to build built-in, modular, or both.
...@@ -483,11 +446,6 @@ ifeq ($(config-targets),1) ...@@ -483,11 +446,6 @@ ifeq ($(config-targets),1)
include $(srctree)/arch/$(SRCARCH)/Makefile include $(srctree)/arch/$(SRCARCH)/Makefile
export KBUILD_DEFCONFIG KBUILD_KCONFIG export KBUILD_DEFCONFIG KBUILD_KCONFIG
# save ARCH & CROSS_COMPILE settings
$(shell mkdir -p include/generated && \
echo $(ARCH) > include/generated/kernel.arch && \
echo $(CROSS_COMPILE) > include/generated/kernel.cross)
config: scripts_basic outputmakefile FORCE config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config $(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@ $(Q)$(MAKE) $(build)=scripts/kconfig $@
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
const char * prog_name; const char * prog_name;
void static void
usage (void) usage (void)
{ {
fprintf(stderr, fprintf(stderr,
......
...@@ -26,8 +26,6 @@ ...@@ -26,8 +26,6 @@
#define F_GETOWN 6 /* for sockets. */ #define F_GETOWN 6 /* for sockets. */
#define F_SETSIG 10 /* for sockets. */ #define F_SETSIG 10 /* for sockets. */
#define F_GETSIG 11 /* for sockets. */ #define F_GETSIG 11 /* for sockets. */
#define F_SETOWN_EX 12
#define F_GETOWN_EX 13
/* for posix fcntl() and lockf() */ /* for posix fcntl() and lockf() */
#define F_RDLCK 1 #define F_RDLCK 1
......
...@@ -50,12 +50,12 @@ struct thread_info { ...@@ -50,12 +50,12 @@ struct thread_info {
register struct thread_info *__current_thread_info __asm__("$8"); register struct thread_info *__current_thread_info __asm__("$8");
#define current_thread_info() __current_thread_info #define current_thread_info() __current_thread_info
#endif /* __ASSEMBLY__ */
/* Thread information allocation. */ /* Thread information allocation. */
#define THREAD_SIZE_ORDER 1 #define THREAD_SIZE_ORDER 1
#define THREAD_SIZE (2*PAGE_SIZE) #define THREAD_SIZE (2*PAGE_SIZE)
#endif /* __ASSEMBLY__ */
#define PREEMPT_ACTIVE 0x40000000 #define PREEMPT_ACTIVE 0x40000000
/* /*
......
...@@ -55,10 +55,10 @@ CONFIG_BLK_DEV_INITRD=y ...@@ -55,10 +55,10 @@ CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="" CONFIG_INITRAMFS_SOURCE=""
CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_CC_OPTIMIZE_FOR_SIZE=y
CONFIG_SYSCTL=y CONFIG_SYSCTL=y
# CONFIG_EMBEDDED is not set CONFIG_EMBEDDED=y
CONFIG_UID16=y CONFIG_UID16=y
CONFIG_SYSCTL_SYSCALL=y CONFIG_SYSCTL_SYSCALL=y
CONFIG_KALLSYMS=y # CONFIG_KALLSYMS is not set
# CONFIG_KALLSYMS_ALL is not set # CONFIG_KALLSYMS_ALL is not set
# CONFIG_KALLSYMS_EXTRA_PASS is not set # CONFIG_KALLSYMS_EXTRA_PASS is not set
CONFIG_HOTPLUG=y CONFIG_HOTPLUG=y
...@@ -224,7 +224,7 @@ CONFIG_CPU_CP15_MMU=y ...@@ -224,7 +224,7 @@ CONFIG_CPU_CP15_MMU=y
# #
# Processor Features # Processor Features
# #
# CONFIG_ARM_THUMB is not set CONFIG_ARM_THUMB=y
# CONFIG_CPU_ICACHE_DISABLE is not set # CONFIG_CPU_ICACHE_DISABLE is not set
# CONFIG_CPU_DCACHE_DISABLE is not set # CONFIG_CPU_DCACHE_DISABLE is not set
CONFIG_CPU_DCACHE_WRITETHROUGH=y CONFIG_CPU_DCACHE_WRITETHROUGH=y
...@@ -248,7 +248,7 @@ CONFIG_CPU_DCACHE_WRITETHROUGH=y ...@@ -248,7 +248,7 @@ CONFIG_CPU_DCACHE_WRITETHROUGH=y
# CONFIG_HIGH_RES_TIMERS is not set # CONFIG_HIGH_RES_TIMERS is not set
CONFIG_PREEMPT=y CONFIG_PREEMPT=y
CONFIG_HZ=100 CONFIG_HZ=100
# CONFIG_AEABI is not set CONFIG_AEABI=y
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
CONFIG_SELECT_MEMORY_MODEL=y CONFIG_SELECT_MEMORY_MODEL=y
CONFIG_FLATMEM_MANUAL=y CONFIG_FLATMEM_MANUAL=y
...@@ -299,7 +299,9 @@ CONFIG_BINFMT_ELF=y ...@@ -299,7 +299,9 @@ CONFIG_BINFMT_ELF=y
# #
# Power management options # Power management options
# #
# CONFIG_PM is not set CONFIG_PM=y
# CONFIG_SUSPEND is not set
CONFIG_PM_RUNTIME=y
# #
# Networking # Networking
...@@ -670,7 +672,7 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ...@@ -670,7 +672,7 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
# CONFIG_INPUT_JOYDEV is not set # CONFIG_INPUT_JOYDEV is not set
# CONFIG_INPUT_TSDEV is not set # CONFIG_INPUT_TSDEV is not set
# CONFIG_INPUT_EVDEV is not set CONFIG_INPUT_EVDEV=y
# CONFIG_INPUT_EVBUG is not set # CONFIG_INPUT_EVBUG is not set
# #
...@@ -784,6 +786,7 @@ CONFIG_I2C_OMAP=y ...@@ -784,6 +786,7 @@ CONFIG_I2C_OMAP=y
# #
# CONFIG_SPI is not set # CONFIG_SPI is not set
# CONFIG_SPI_MASTER is not set # CONFIG_SPI_MASTER is not set
CONFIG_GPIO_SYSFS=y
# #
# Dallas's 1-wire bus # Dallas's 1-wire bus
...@@ -820,6 +823,7 @@ CONFIG_LEDS_AMS_DELTA=y ...@@ -820,6 +823,7 @@ CONFIG_LEDS_AMS_DELTA=y
CONFIG_LEDS_TRIGGERS=y CONFIG_LEDS_TRIGGERS=y
CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_LEDS_TRIGGER_TIMER=y
CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_LEDS_TRIGGER_HEARTBEAT=y
CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
# #
# Multimedia devices # Multimedia devices
...@@ -896,7 +900,13 @@ CONFIG_LOGO_LINUX_CLUT224=y ...@@ -896,7 +900,13 @@ CONFIG_LOGO_LINUX_CLUT224=y
# #
# Sound # Sound
# #
# CONFIG_SOUND is not set CONFIG_SOUND=y
CONFIG_SND=y
CONFIG_SND_MIXER_OSS=y
CONFIG_SND_PCM_OSS=y
CONFIG_SND_SOC=y
CONFIG_SND_OMAP_SOC=y
CONFIG_SND_OMAP_SOC_AMS_DELTA=y
# #
# HID Devices # HID Devices
......
此差异已折叠。
...@@ -304,7 +304,7 @@ CONFIG_ALIGNMENT_TRAP=y ...@@ -304,7 +304,7 @@ CONFIG_ALIGNMENT_TRAP=y
CONFIG_ZBOOT_ROM_TEXT=0x10C08000 CONFIG_ZBOOT_ROM_TEXT=0x10C08000
CONFIG_ZBOOT_ROM_BSS=0x10200000 CONFIG_ZBOOT_ROM_BSS=0x10200000
# CONFIG_ZBOOT_ROM is not set # CONFIG_ZBOOT_ROM is not set
CONFIG_CMDLINE="root=1f03 rootfstype=jffs2 console=ttyS0,115200n8" CONFIG_CMDLINE="root=1f03 rootfstype=jffs2 console=ttyS2,115200n8"
# CONFIG_XIP_KERNEL is not set # CONFIG_XIP_KERNEL is not set
# CONFIG_KEXEC is not set # CONFIG_KEXEC is not set
......
...@@ -969,7 +969,6 @@ CONFIG_USB_ETH_RNDIS=y ...@@ -969,7 +969,6 @@ CONFIG_USB_ETH_RNDIS=y
# #
CONFIG_USB_OTG_UTILS=y CONFIG_USB_OTG_UTILS=y
# CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_GPIO_VBUS is not set
# CONFIG_ISP1301_OMAP is not set
CONFIG_TWL4030_USB=y CONFIG_TWL4030_USB=y
# CONFIG_NOP_USB_XCEIV is not set # CONFIG_NOP_USB_XCEIV is not set
CONFIG_MMC=y CONFIG_MMC=y
......
...@@ -611,7 +611,7 @@ CONFIG_INPUT_KEYBOARD=y ...@@ -611,7 +611,7 @@ CONFIG_INPUT_KEYBOARD=y
# CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_XTKBD is not set
# CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_NEWTON is not set
# CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_STOWAWAY is not set
# CONFIG_KEYBOARD_GPIO is not set CONFIG_KEYBOARD_GPIO=y
CONFIG_INPUT_MOUSE=y CONFIG_INPUT_MOUSE=y
# CONFIG_MOUSE_PS2 is not set # CONFIG_MOUSE_PS2 is not set
# CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_SERIAL is not set
...@@ -634,7 +634,8 @@ CONFIG_TOUCHSCREEN_ADS7846=y ...@@ -634,7 +634,8 @@ CONFIG_TOUCHSCREEN_ADS7846=y
# CONFIG_TOUCHSCREEN_TOUCHWIN is not set # CONFIG_TOUCHSCREEN_TOUCHWIN is not set
# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
# CONFIG_INPUT_MISC is not set CONFIG_INPUT_MISC=y
CONFIG_INPUT_TWL4030_PWRBUTTON=y
# #
# Hardware I/O ports # Hardware I/O ports
...@@ -834,7 +835,29 @@ CONFIG_DAB=y ...@@ -834,7 +835,29 @@ CONFIG_DAB=y
# #
# CONFIG_VGA_CONSOLE is not set # CONFIG_VGA_CONSOLE is not set
CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE=y
# CONFIG_SOUND is not set CONFIG_SOUND=y
CONFIG_SOUND_OSS_CORE=y
CONFIG_SOUND_OSS_CORE_PRECLAIM=y
CONFIG_SND=y
CONFIG_SND_TIMER=y
CONFIG_SND_PCM=y
CONFIG_SND_JACK=y
CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=y
CONFIG_SND_PCM_OSS=y
CONFIG_SND_PCM_OSS_PLUGINS=y
CONFIG_SND_SUPPORT_OLD_API=y
CONFIG_SND_VERBOSE_PROCFS=y
CONFIG_SND_VERBOSE_PRINTK=y
CONFIG_SND_DRIVERS=y
CONFIG_SND_USB=y
CONFIG_SND_SOC=y
CONFIG_SND_OMAP_SOC=y
CONFIG_SND_OMAP_SOC_MCBSP=y
CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=y
CONFIG_SND_SOC_I2C_AND_SPI=y
CONFIG_SND_SOC_TWL4030=y
CONFIG_HID_SUPPORT=y CONFIG_HID_SUPPORT=y
CONFIG_HID=y CONFIG_HID=y
# CONFIG_HID_DEBUG is not set # CONFIG_HID_DEBUG is not set
...@@ -1020,7 +1043,13 @@ CONFIG_MMC_BLOCK_BOUNCE=y ...@@ -1020,7 +1043,13 @@ CONFIG_MMC_BLOCK_BOUNCE=y
# CONFIG_MMC_SPI is not set # CONFIG_MMC_SPI is not set
# CONFIG_MEMSTICK is not set # CONFIG_MEMSTICK is not set
# CONFIG_ACCESSIBILITY is not set # CONFIG_ACCESSIBILITY is not set
# CONFIG_NEW_LEDS is not set CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y
CONFIG_LEDS_GPIO=y
CONFIG_LEDS_GPIO_PLATFORM=y
CONFIG_LEDS_TRIGGERS=y
CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
CONFIG_RTC_LIB=y CONFIG_RTC_LIB=y
CONFIG_RTC_CLASS=y CONFIG_RTC_CLASS=y
CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS=y
...@@ -1084,9 +1113,12 @@ CONFIG_RTC_DRV_TWL4030=y ...@@ -1084,9 +1113,12 @@ CONFIG_RTC_DRV_TWL4030=y
# on-CPU RTC drivers # on-CPU RTC drivers
# #
# CONFIG_DMADEVICES is not set # CONFIG_DMADEVICES is not set
# CONFIG_REGULATOR is not set
# CONFIG_UIO is not set # CONFIG_UIO is not set
CONFIG_REGULATOR=y
CONFIG_REGULATOR_FIXED_VOLTAGE=y
CONFIG_REGULATOR_TWL4030=y
# #
# File systems # File systems
# #
...@@ -1407,3 +1439,10 @@ CONFIG_PLIST=y ...@@ -1407,3 +1439,10 @@ CONFIG_PLIST=y
CONFIG_HAS_IOMEM=y CONFIG_HAS_IOMEM=y
CONFIG_HAS_IOPORT=y CONFIG_HAS_IOPORT=y
CONFIG_HAS_DMA=y CONFIG_HAS_DMA=y
# added by hand for now
CONFIG_KEYBOARD_TWL4030=y
CONFIG_USB_OTG_UTILS=y
CONFIG_TWL4030_USB=y
CONFIG_MMC_OMAP_HS=y
...@@ -1703,7 +1703,14 @@ CONFIG_RTC_DRV_TWL4030=y ...@@ -1703,7 +1703,14 @@ CONFIG_RTC_DRV_TWL4030=y
# on-CPU RTC drivers # on-CPU RTC drivers
# #
# CONFIG_DMADEVICES is not set # CONFIG_DMADEVICES is not set
# CONFIG_REGULATOR is not set CONFIG_REGULATOR=y
# CONFIG_REGULATOR_DEBUG is not set
# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
# CONFIG_REGULATOR_BQ24022 is not set
# CONFIG_REGULATOR_MAX1586 is not set
CONFIG_REGULATOR_TWL4030=y
# CONFIG_UIO is not set # CONFIG_UIO is not set
# CONFIG_STAGING is not set # CONFIG_STAGING is not set
......
此差异已折叠。
# #
# Automatically generated make config: don't edit # Automatically generated make config: don't edit
# Linux kernel version: 2.6.31-rc3 # Linux kernel version: 2.6.32-rc5
# Thu Jul 16 23:36:10 2009 # Sat Oct 17 23:32:24 2009
# #
CONFIG_ARM=y CONFIG_ARM=y
CONFIG_SYS_SUPPORTS_APM_EMULATION=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y
CONFIG_GENERIC_GPIO=y CONFIG_GENERIC_GPIO=y
CONFIG_GENERIC_TIME=y CONFIG_GENERIC_TIME=y
CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_MMU=y CONFIG_HAVE_TCM=y
CONFIG_GENERIC_HARDIRQS=y CONFIG_GENERIC_HARDIRQS=y
CONFIG_STACKTRACE_SUPPORT=y CONFIG_STACKTRACE_SUPPORT=y
CONFIG_HAVE_LATENCYTOP_SUPPORT=y CONFIG_HAVE_LATENCYTOP_SUPPORT=y
...@@ -44,11 +44,12 @@ CONFIG_SYSVIPC_SYSCTL=y ...@@ -44,11 +44,12 @@ CONFIG_SYSVIPC_SYSCTL=y
# #
# RCU Subsystem # RCU Subsystem
# #
CONFIG_CLASSIC_RCU=y CONFIG_TREE_RCU=y
# CONFIG_TREE_RCU is not set # CONFIG_TREE_PREEMPT_RCU is not set
# CONFIG_PREEMPT_RCU is not set # CONFIG_RCU_TRACE is not set
CONFIG_RCU_FANOUT=32
# CONFIG_RCU_FANOUT_EXACT is not set
# CONFIG_TREE_RCU_TRACE is not set # CONFIG_TREE_RCU_TRACE is not set
# CONFIG_PREEMPT_RCU_TRACE is not set
# CONFIG_IKCONFIG is not set # CONFIG_IKCONFIG is not set
CONFIG_LOG_BUF_SHIFT=14 CONFIG_LOG_BUF_SHIFT=14
# CONFIG_GROUP_SCHED is not set # CONFIG_GROUP_SCHED is not set
...@@ -80,17 +81,15 @@ CONFIG_SHMEM=y ...@@ -80,17 +81,15 @@ CONFIG_SHMEM=y
# CONFIG_AIO is not set # CONFIG_AIO is not set
# #
# Performance Counters # Kernel Performance Events And Counters
# #
# CONFIG_VM_EVENT_COUNTERS is not set # CONFIG_VM_EVENT_COUNTERS is not set
CONFIG_SLUB_DEBUG=y CONFIG_SLUB_DEBUG=y
# CONFIG_STRIP_ASM_SYMS is not set
CONFIG_COMPAT_BRK=y CONFIG_COMPAT_BRK=y
# CONFIG_SLAB is not set # CONFIG_SLAB is not set
CONFIG_SLUB=y CONFIG_SLUB=y
# CONFIG_SLOB is not set # CONFIG_SLOB is not set
# CONFIG_PROFILING is not set # CONFIG_PROFILING is not set
# CONFIG_MARKERS is not set
CONFIG_HAVE_OPROFILE=y CONFIG_HAVE_OPROFILE=y
# CONFIG_KPROBES is not set # CONFIG_KPROBES is not set
CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KPROBES=y
...@@ -133,6 +132,7 @@ CONFIG_DEFAULT_IOSCHED="deadline" ...@@ -133,6 +132,7 @@ CONFIG_DEFAULT_IOSCHED="deadline"
# #
# System Type # System Type
# #
CONFIG_MMU=y
# CONFIG_ARCH_AAEC2000 is not set # CONFIG_ARCH_AAEC2000 is not set
# CONFIG_ARCH_INTEGRATOR is not set # CONFIG_ARCH_INTEGRATOR is not set
# CONFIG_ARCH_REALVIEW is not set # CONFIG_ARCH_REALVIEW is not set
...@@ -147,6 +147,7 @@ CONFIG_DEFAULT_IOSCHED="deadline" ...@@ -147,6 +147,7 @@ CONFIG_DEFAULT_IOSCHED="deadline"
# CONFIG_ARCH_STMP3XXX is not set # CONFIG_ARCH_STMP3XXX is not set
# CONFIG_ARCH_NETX is not set # CONFIG_ARCH_NETX is not set
# CONFIG_ARCH_H720X is not set # CONFIG_ARCH_H720X is not set
# CONFIG_ARCH_NOMADIK is not set
# CONFIG_ARCH_IOP13XX is not set # CONFIG_ARCH_IOP13XX is not set
# CONFIG_ARCH_IOP32X is not set # CONFIG_ARCH_IOP32X is not set
# CONFIG_ARCH_IOP33X is not set # CONFIG_ARCH_IOP33X is not set
...@@ -169,11 +170,13 @@ CONFIG_DEFAULT_IOSCHED="deadline" ...@@ -169,11 +170,13 @@ CONFIG_DEFAULT_IOSCHED="deadline"
# CONFIG_ARCH_SA1100 is not set # CONFIG_ARCH_SA1100 is not set
# CONFIG_ARCH_S3C2410 is not set # CONFIG_ARCH_S3C2410 is not set
# CONFIG_ARCH_S3C64XX is not set # CONFIG_ARCH_S3C64XX is not set
# CONFIG_ARCH_S5PC1XX is not set
# CONFIG_ARCH_SHARK is not set # CONFIG_ARCH_SHARK is not set
# CONFIG_ARCH_LH7A40X is not set # CONFIG_ARCH_LH7A40X is not set
CONFIG_ARCH_U300=y CONFIG_ARCH_U300=y
# CONFIG_ARCH_DAVINCI is not set # CONFIG_ARCH_DAVINCI is not set
# CONFIG_ARCH_OMAP is not set # CONFIG_ARCH_OMAP is not set
# CONFIG_ARCH_BCMRING is not set
# #
# ST-Ericsson AB U300/U330/U335/U365 Platform # ST-Ericsson AB U300/U330/U335/U365 Platform
...@@ -195,6 +198,7 @@ CONFIG_MACH_U300_BS335=y ...@@ -195,6 +198,7 @@ CONFIG_MACH_U300_BS335=y
CONFIG_MACH_U300_DUAL_RAM=y CONFIG_MACH_U300_DUAL_RAM=y
CONFIG_U300_DEBUG=y CONFIG_U300_DEBUG=y
# CONFIG_MACH_U300_SEMI_IS_SHARED is not set # CONFIG_MACH_U300_SEMI_IS_SHARED is not set
CONFIG_MACH_U300_SPIDUMMY=y
# #
# All the settings below must match the bootloader's settings # All the settings below must match the bootloader's settings
...@@ -207,7 +211,7 @@ CONFIG_CPU_32=y ...@@ -207,7 +211,7 @@ CONFIG_CPU_32=y
CONFIG_CPU_ARM926T=y CONFIG_CPU_ARM926T=y
CONFIG_CPU_32v5=y CONFIG_CPU_32v5=y
CONFIG_CPU_ABRT_EV5TJ=y CONFIG_CPU_ABRT_EV5TJ=y
CONFIG_CPU_PABRT_NOIFAR=y CONFIG_CPU_PABRT_LEGACY=y
CONFIG_CPU_CACHE_VIVT=y CONFIG_CPU_CACHE_VIVT=y
CONFIG_CPU_COPY_V4WB=y CONFIG_CPU_COPY_V4WB=y
CONFIG_CPU_TLB_V4WBI=y CONFIG_CPU_TLB_V4WBI=y
...@@ -222,6 +226,7 @@ CONFIG_ARM_THUMB=y ...@@ -222,6 +226,7 @@ CONFIG_ARM_THUMB=y
# CONFIG_CPU_DCACHE_DISABLE is not set # CONFIG_CPU_DCACHE_DISABLE is not set
# CONFIG_CPU_DCACHE_WRITETHROUGH is not set # CONFIG_CPU_DCACHE_WRITETHROUGH is not set
# CONFIG_CPU_CACHE_ROUND_ROBIN is not set # CONFIG_CPU_CACHE_ROUND_ROBIN is not set
CONFIG_ARM_L1_CACHE_SHIFT=5
CONFIG_ARM_VIC=y CONFIG_ARM_VIC=y
CONFIG_ARM_VIC_NR=2 CONFIG_ARM_VIC_NR=2
CONFIG_COMMON_CLKDEV=y CONFIG_COMMON_CLKDEV=y
...@@ -245,6 +250,8 @@ CONFIG_VMSPLIT_3G=y ...@@ -245,6 +250,8 @@ CONFIG_VMSPLIT_3G=y
# CONFIG_VMSPLIT_2G is not set # CONFIG_VMSPLIT_2G is not set
# CONFIG_VMSPLIT_1G is not set # CONFIG_VMSPLIT_1G is not set
CONFIG_PAGE_OFFSET=0xC0000000 CONFIG_PAGE_OFFSET=0xC0000000
# CONFIG_PREEMPT_NONE is not set
# CONFIG_PREEMPT_VOLUNTARY is not set
CONFIG_PREEMPT=y CONFIG_PREEMPT=y
CONFIG_HZ=100 CONFIG_HZ=100
CONFIG_AEABI=y CONFIG_AEABI=y
...@@ -265,6 +272,7 @@ CONFIG_ZONE_DMA_FLAG=0 ...@@ -265,6 +272,7 @@ CONFIG_ZONE_DMA_FLAG=0
CONFIG_VIRT_TO_BUS=y CONFIG_VIRT_TO_BUS=y
CONFIG_HAVE_MLOCK=y CONFIG_HAVE_MLOCK=y
CONFIG_HAVE_MLOCKED_PAGE_BIT=y CONFIG_HAVE_MLOCKED_PAGE_BIT=y
# CONFIG_KSM is not set
CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
CONFIG_ALIGNMENT_TRAP=y CONFIG_ALIGNMENT_TRAP=y
# CONFIG_UACCESS_WITH_MEMCPY is not set # CONFIG_UACCESS_WITH_MEMCPY is not set
...@@ -313,6 +321,7 @@ CONFIG_PM=y ...@@ -313,6 +321,7 @@ CONFIG_PM=y
# CONFIG_PM_DEBUG is not set # CONFIG_PM_DEBUG is not set
# CONFIG_SUSPEND is not set # CONFIG_SUSPEND is not set
# CONFIG_APM_EMULATION is not set # CONFIG_APM_EMULATION is not set
# CONFIG_PM_RUNTIME is not set
CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y
CONFIG_NET=y CONFIG_NET=y
...@@ -351,6 +360,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" ...@@ -351,6 +360,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
# CONFIG_NETFILTER is not set # CONFIG_NETFILTER is not set
# CONFIG_IP_DCCP is not set # CONFIG_IP_DCCP is not set
# CONFIG_IP_SCTP is not set # CONFIG_IP_SCTP is not set
# CONFIG_RDS is not set
# CONFIG_TIPC is not set # CONFIG_TIPC is not set
# CONFIG_ATM is not set # CONFIG_ATM is not set
# CONFIG_BRIDGE is not set # CONFIG_BRIDGE is not set
...@@ -391,6 +401,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" ...@@ -391,6 +401,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
# Generic Driver Options # Generic Driver Options
# #
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
# CONFIG_DEVTMPFS is not set
CONFIG_STANDALONE=y CONFIG_STANDALONE=y
# CONFIG_PREVENT_FIRMWARE_BUILD is not set # CONFIG_PREVENT_FIRMWARE_BUILD is not set
CONFIG_FW_LOADER=y CONFIG_FW_LOADER=y
...@@ -402,9 +413,9 @@ CONFIG_EXTRA_FIRMWARE="" ...@@ -402,9 +413,9 @@ CONFIG_EXTRA_FIRMWARE=""
# CONFIG_CONNECTOR is not set # CONFIG_CONNECTOR is not set
CONFIG_MTD=y CONFIG_MTD=y
# CONFIG_MTD_DEBUG is not set # CONFIG_MTD_DEBUG is not set
# CONFIG_MTD_TESTS is not set
# CONFIG_MTD_CONCAT is not set # CONFIG_MTD_CONCAT is not set
CONFIG_MTD_PARTITIONS=y CONFIG_MTD_PARTITIONS=y
# CONFIG_MTD_TESTS is not set
# CONFIG_MTD_REDBOOT_PARTS is not set # CONFIG_MTD_REDBOOT_PARTS is not set
CONFIG_MTD_CMDLINE_PARTS=y CONFIG_MTD_CMDLINE_PARTS=y
# CONFIG_MTD_AFS_PARTS is not set # CONFIG_MTD_AFS_PARTS is not set
...@@ -453,6 +464,7 @@ CONFIG_MTD_CFI_I2=y ...@@ -453,6 +464,7 @@ CONFIG_MTD_CFI_I2=y
# #
# CONFIG_MTD_DATAFLASH is not set # CONFIG_MTD_DATAFLASH is not set
# CONFIG_MTD_M25P80 is not set # CONFIG_MTD_M25P80 is not set
# CONFIG_MTD_SST25L is not set
# CONFIG_MTD_SLRAM is not set # CONFIG_MTD_SLRAM is not set
# CONFIG_MTD_PHRAM is not set # CONFIG_MTD_PHRAM is not set
# CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_MTDRAM is not set
...@@ -520,6 +532,7 @@ CONFIG_HAVE_IDE=y ...@@ -520,6 +532,7 @@ CONFIG_HAVE_IDE=y
# CONFIG_MD is not set # CONFIG_MD is not set
# CONFIG_NETDEVICES is not set # CONFIG_NETDEVICES is not set
# CONFIG_ISDN is not set # CONFIG_ISDN is not set
# CONFIG_PHONE is not set
# #
# Input device support # Input device support
...@@ -540,12 +553,16 @@ CONFIG_INPUT_EVDEV=y ...@@ -540,12 +553,16 @@ CONFIG_INPUT_EVDEV=y
# Input Device Drivers # Input Device Drivers
# #
CONFIG_INPUT_KEYBOARD=y CONFIG_INPUT_KEYBOARD=y
# CONFIG_KEYBOARD_ADP5588 is not set
# CONFIG_KEYBOARD_ATKBD is not set # CONFIG_KEYBOARD_ATKBD is not set
# CONFIG_QT2160 is not set
# CONFIG_KEYBOARD_LKKBD is not set # CONFIG_KEYBOARD_LKKBD is not set
# CONFIG_KEYBOARD_GPIO is not set # CONFIG_KEYBOARD_GPIO is not set
# CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_MATRIX is not set
# CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8323 is not set
# CONFIG_KEYBOARD_MAX7359 is not set
# CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_NEWTON is not set
# CONFIG_KEYBOARD_OPENCORES is not set
# CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_STOWAWAY is not set
# CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_SUNKBD is not set
# CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_XTKBD is not set
...@@ -597,6 +614,7 @@ CONFIG_LEGACY_PTY_COUNT=16 ...@@ -597,6 +614,7 @@ CONFIG_LEGACY_PTY_COUNT=16
# CONFIG_TCG_TPM is not set # CONFIG_TCG_TPM is not set
CONFIG_I2C=y CONFIG_I2C=y
CONFIG_I2C_BOARDINFO=y CONFIG_I2C_BOARDINFO=y
CONFIG_I2C_COMPAT=y
# CONFIG_I2C_CHARDEV is not set # CONFIG_I2C_CHARDEV is not set
CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_HELPER_AUTO=y
...@@ -629,9 +647,6 @@ CONFIG_I2C_STU300=y ...@@ -629,9 +647,6 @@ CONFIG_I2C_STU300=y
# Miscellaneous I2C Chip support # Miscellaneous I2C Chip support
# #
# CONFIG_DS1682 is not set # CONFIG_DS1682 is not set
# CONFIG_SENSORS_PCF8574 is not set
# CONFIG_PCF8575 is not set
# CONFIG_SENSORS_PCA9539 is not set
# CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_TSL2550 is not set
# CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_CORE is not set
# CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_ALGO is not set
...@@ -653,16 +668,21 @@ CONFIG_SPI_PL022=y ...@@ -653,16 +668,21 @@ CONFIG_SPI_PL022=y
# #
# CONFIG_SPI_SPIDEV is not set # CONFIG_SPI_SPIDEV is not set
# CONFIG_SPI_TLE62X0 is not set # CONFIG_SPI_TLE62X0 is not set
#
# PPS support
#
# CONFIG_PPS is not set
# CONFIG_W1 is not set # CONFIG_W1 is not set
CONFIG_POWER_SUPPLY=y CONFIG_POWER_SUPPLY=y
# CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_POWER_SUPPLY_DEBUG is not set
# CONFIG_PDA_POWER is not set # CONFIG_PDA_POWER is not set
# CONFIG_BATTERY_DS2760 is not set # CONFIG_BATTERY_DS2760 is not set
# CONFIG_BATTERY_DS2782 is not set
# CONFIG_BATTERY_BQ27x00 is not set # CONFIG_BATTERY_BQ27x00 is not set
# CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17040 is not set
# CONFIG_HWMON is not set # CONFIG_HWMON is not set
# CONFIG_THERMAL is not set # CONFIG_THERMAL is not set
# CONFIG_THERMAL_HWMON is not set
CONFIG_WATCHDOG=y CONFIG_WATCHDOG=y
# CONFIG_WATCHDOG_NOWAYOUT is not set # CONFIG_WATCHDOG_NOWAYOUT is not set
...@@ -690,10 +710,24 @@ CONFIG_SSB_POSSIBLE=y ...@@ -690,10 +710,24 @@ CONFIG_SSB_POSSIBLE=y
# CONFIG_MFD_TC6387XB is not set # CONFIG_MFD_TC6387XB is not set
# CONFIG_PMIC_DA903X is not set # CONFIG_PMIC_DA903X is not set
# CONFIG_MFD_WM8400 is not set # CONFIG_MFD_WM8400 is not set
# CONFIG_MFD_WM831X is not set
# CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8350_I2C is not set
# CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_PCF50633 is not set
# CONFIG_MFD_MC13783 is not set
CONFIG_AB3100_CORE=y CONFIG_AB3100_CORE=y
CONFIG_AB3100_OTP=y
# CONFIG_EZX_PCAP is not set # CONFIG_EZX_PCAP is not set
CONFIG_REGULATOR=y
# CONFIG_REGULATOR_DEBUG is not set
# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
# CONFIG_REGULATOR_BQ24022 is not set
# CONFIG_REGULATOR_MAX1586 is not set
# CONFIG_REGULATOR_LP3971 is not set
CONFIG_REGULATOR_AB3100=y
# CONFIG_REGULATOR_TPS65023 is not set
# CONFIG_REGULATOR_TPS6507X is not set
# CONFIG_MEDIA_SUPPORT is not set # CONFIG_MEDIA_SUPPORT is not set
# #
...@@ -792,9 +826,10 @@ CONFIG_MMC_BLOCK_BOUNCE=y ...@@ -792,9 +826,10 @@ CONFIG_MMC_BLOCK_BOUNCE=y
# #
CONFIG_MMC_ARMMMCI=y CONFIG_MMC_ARMMMCI=y
# CONFIG_MMC_SDHCI is not set # CONFIG_MMC_SDHCI is not set
# CONFIG_MMC_AT91 is not set
# CONFIG_MMC_ATMELMCI is not set
# CONFIG_MMC_SPI is not set # CONFIG_MMC_SPI is not set
# CONFIG_MEMSTICK is not set # CONFIG_MEMSTICK is not set
# CONFIG_ACCESSIBILITY is not set
CONFIG_NEW_LEDS=y CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y CONFIG_LEDS_CLASS=y
...@@ -820,10 +855,10 @@ CONFIG_LEDS_TRIGGER_BACKLIGHT=y ...@@ -820,10 +855,10 @@ CONFIG_LEDS_TRIGGER_BACKLIGHT=y
# #
# iptables trigger is under Netfilter config (LED target) # iptables trigger is under Netfilter config (LED target)
# #
# CONFIG_ACCESSIBILITY is not set
CONFIG_RTC_LIB=y CONFIG_RTC_LIB=y
CONFIG_RTC_CLASS=y CONFIG_RTC_CLASS=y
CONFIG_RTC_HCTOSYS=y # CONFIG_RTC_HCTOSYS is not set
CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
# CONFIG_RTC_DEBUG is not set # CONFIG_RTC_DEBUG is not set
# #
...@@ -863,6 +898,7 @@ CONFIG_RTC_INTF_DEV=y ...@@ -863,6 +898,7 @@ CONFIG_RTC_INTF_DEV=y
# CONFIG_RTC_DRV_R9701 is not set # CONFIG_RTC_DRV_R9701 is not set
# CONFIG_RTC_DRV_RS5C348 is not set # CONFIG_RTC_DRV_RS5C348 is not set
# CONFIG_RTC_DRV_DS3234 is not set # CONFIG_RTC_DRV_DS3234 is not set
# CONFIG_RTC_DRV_PCF2123 is not set
# #
# Platform RTC drivers # Platform RTC drivers
...@@ -878,27 +914,25 @@ CONFIG_RTC_INTF_DEV=y ...@@ -878,27 +914,25 @@ CONFIG_RTC_INTF_DEV=y
# CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_M48T59 is not set
# CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_BQ4802 is not set
# CONFIG_RTC_DRV_V3020 is not set # CONFIG_RTC_DRV_V3020 is not set
CONFIG_RTC_DRV_AB3100=y
# #
# on-CPU RTC drivers # on-CPU RTC drivers
# #
# CONFIG_RTC_DRV_PL030 is not set # CONFIG_RTC_DRV_PL030 is not set
# CONFIG_RTC_DRV_PL031 is not set # CONFIG_RTC_DRV_PL031 is not set
CONFIG_RTC_DRV_COH901331=y
CONFIG_DMADEVICES=y CONFIG_DMADEVICES=y
# #
# DMA Devices # DMA Devices
# #
# CONFIG_AUXDISPLAY is not set # CONFIG_AUXDISPLAY is not set
CONFIG_REGULATOR=y
# CONFIG_REGULATOR_DEBUG is not set
# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
# CONFIG_REGULATOR_BQ24022 is not set
# CONFIG_REGULATOR_MAX1586 is not set
# CONFIG_REGULATOR_LP3971 is not set
# CONFIG_UIO is not set # CONFIG_UIO is not set
#
# TI VLYNQ
#
# CONFIG_STAGING is not set # CONFIG_STAGING is not set
# #
...@@ -913,6 +947,7 @@ CONFIG_REGULATOR=y ...@@ -913,6 +947,7 @@ CONFIG_REGULATOR=y
# CONFIG_XFS_FS is not set # CONFIG_XFS_FS is not set
# CONFIG_OCFS2_FS is not set # CONFIG_OCFS2_FS is not set
# CONFIG_BTRFS_FS is not set # CONFIG_BTRFS_FS is not set
# CONFIG_NILFS2_FS is not set
CONFIG_FILE_LOCKING=y CONFIG_FILE_LOCKING=y
CONFIG_FSNOTIFY=y CONFIG_FSNOTIFY=y
# CONFIG_DNOTIFY is not set # CONFIG_DNOTIFY is not set
...@@ -975,7 +1010,6 @@ CONFIG_MISC_FILESYSTEMS=y ...@@ -975,7 +1010,6 @@ CONFIG_MISC_FILESYSTEMS=y
# CONFIG_ROMFS_FS is not set # CONFIG_ROMFS_FS is not set
# CONFIG_SYSV_FS is not set # CONFIG_SYSV_FS is not set
# CONFIG_UFS_FS is not set # CONFIG_UFS_FS is not set
# CONFIG_NILFS2_FS is not set
# CONFIG_NETWORK_FILESYSTEMS is not set # CONFIG_NETWORK_FILESYSTEMS is not set
# #
...@@ -1033,6 +1067,7 @@ CONFIG_ENABLE_WARN_DEPRECATED=y ...@@ -1033,6 +1067,7 @@ CONFIG_ENABLE_WARN_DEPRECATED=y
CONFIG_ENABLE_MUST_CHECK=y CONFIG_ENABLE_MUST_CHECK=y
CONFIG_FRAME_WARN=1024 CONFIG_FRAME_WARN=1024
# CONFIG_MAGIC_SYSRQ is not set # CONFIG_MAGIC_SYSRQ is not set
# CONFIG_STRIP_ASM_SYMS is not set
# CONFIG_UNUSED_SYMBOLS is not set # CONFIG_UNUSED_SYMBOLS is not set
# CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_FS is not set
# CONFIG_HEADERS_CHECK is not set # CONFIG_HEADERS_CHECK is not set
...@@ -1066,11 +1101,13 @@ CONFIG_DEBUG_INFO=y ...@@ -1066,11 +1101,13 @@ CONFIG_DEBUG_INFO=y
# CONFIG_DEBUG_LIST is not set # CONFIG_DEBUG_LIST is not set
# CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_SG is not set
# CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_DEBUG_NOTIFIERS is not set
# CONFIG_DEBUG_CREDENTIALS is not set
# CONFIG_BOOT_PRINTK_DELAY is not set # CONFIG_BOOT_PRINTK_DELAY is not set
# CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set
# CONFIG_RCU_CPU_STALL_DETECTOR is not set # CONFIG_RCU_CPU_STALL_DETECTOR is not set
# CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_BACKTRACE_SELF_TEST is not set
# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
# CONFIG_FAULT_INJECTION is not set # CONFIG_FAULT_INJECTION is not set
# CONFIG_LATENCYTOP is not set # CONFIG_LATENCYTOP is not set
# CONFIG_SYSCTL_SYSCALL_CHECK is not set # CONFIG_SYSCTL_SYSCALL_CHECK is not set
...@@ -1121,6 +1158,7 @@ CONFIG_GENERIC_FIND_LAST_BIT=y ...@@ -1121,6 +1158,7 @@ CONFIG_GENERIC_FIND_LAST_BIT=y
# CONFIG_CRC32 is not set # CONFIG_CRC32 is not set
# CONFIG_CRC7 is not set # CONFIG_CRC7 is not set
# CONFIG_LIBCRC32C is not set # CONFIG_LIBCRC32C is not set
CONFIG_GENERIC_ALLOCATOR=y
CONFIG_HAS_IOMEM=y CONFIG_HAS_IOMEM=y
CONFIG_HAS_IOPORT=y CONFIG_HAS_IOPORT=y
CONFIG_HAS_DMA=y CONFIG_HAS_DMA=y
......
...@@ -84,7 +84,7 @@ ____atomic_test_and_set_bit(unsigned int bit, volatile unsigned long *p) ...@@ -84,7 +84,7 @@ ____atomic_test_and_set_bit(unsigned int bit, volatile unsigned long *p)
*p = res | mask; *p = res | mask;
raw_local_irq_restore(flags); raw_local_irq_restore(flags);
return res & mask; return (res & mask) != 0;
} }
static inline int static inline int
...@@ -101,7 +101,7 @@ ____atomic_test_and_clear_bit(unsigned int bit, volatile unsigned long *p) ...@@ -101,7 +101,7 @@ ____atomic_test_and_clear_bit(unsigned int bit, volatile unsigned long *p)
*p = res & ~mask; *p = res & ~mask;
raw_local_irq_restore(flags); raw_local_irq_restore(flags);
return res & mask; return (res & mask) != 0;
} }
static inline int static inline int
...@@ -118,7 +118,7 @@ ____atomic_test_and_change_bit(unsigned int bit, volatile unsigned long *p) ...@@ -118,7 +118,7 @@ ____atomic_test_and_change_bit(unsigned int bit, volatile unsigned long *p)
*p = res ^ mask; *p = res ^ mask;
raw_local_irq_restore(flags); raw_local_irq_restore(flags);
return res & mask; return (res & mask) != 0;
} }
#include <asm-generic/bitops/non-atomic.h> #include <asm-generic/bitops/non-atomic.h>
......
...@@ -414,9 +414,14 @@ extern void __flush_dcache_page(struct address_space *mapping, struct page *page ...@@ -414,9 +414,14 @@ extern void __flush_dcache_page(struct address_space *mapping, struct page *page
static inline void __flush_icache_all(void) static inline void __flush_icache_all(void)
{ {
#ifdef CONFIG_ARM_ERRATA_411920
extern void v6_icache_inval_all(void);
v6_icache_inval_all();
#else
asm("mcr p15, 0, %0, c7, c5, 0 @ invalidate I-cache\n" asm("mcr p15, 0, %0, c7, c5, 0 @ invalidate I-cache\n"
: :
: "r" (0)); : "r" (0));
#endif
} }
#define ARCH_HAS_FLUSH_ANON_PAGE #define ARCH_HAS_FLUSH_ANON_PAGE
......
...@@ -98,6 +98,9 @@ extern int elf_check_arch(const struct elf32_hdr *); ...@@ -98,6 +98,9 @@ extern int elf_check_arch(const struct elf32_hdr *);
extern int arm_elf_read_implies_exec(const struct elf32_hdr *, int); extern int arm_elf_read_implies_exec(const struct elf32_hdr *, int);
#define elf_read_implies_exec(ex,stk) arm_elf_read_implies_exec(&(ex), stk) #define elf_read_implies_exec(ex,stk) arm_elf_read_implies_exec(&(ex), stk)
int dump_task_regs(struct task_struct *t, elf_gregset_t *elfregs);
#define ELF_CORE_COPY_TASK_REGS dump_task_regs
#define USE_ELF_CORE_DUMP #define USE_ELF_CORE_DUMP
#define ELF_EXEC_PAGESIZE 4096 #define ELF_EXEC_PAGESIZE 4096
......
...@@ -350,7 +350,7 @@ static inline void local_flush_tlb_mm(struct mm_struct *mm) ...@@ -350,7 +350,7 @@ static inline void local_flush_tlb_mm(struct mm_struct *mm)
if (tlb_flag(TLB_WB)) if (tlb_flag(TLB_WB))
dsb(); dsb();
if (cpumask_test_cpu(smp_processor_id(), mm_cpumask(mm))) { if (cpumask_test_cpu(get_cpu(), mm_cpumask(mm))) {
if (tlb_flag(TLB_V3_FULL)) if (tlb_flag(TLB_V3_FULL))
asm("mcr p15, 0, %0, c6, c0, 0" : : "r" (zero) : "cc"); asm("mcr p15, 0, %0, c6, c0, 0" : : "r" (zero) : "cc");
if (tlb_flag(TLB_V4_U_FULL)) if (tlb_flag(TLB_V4_U_FULL))
...@@ -360,6 +360,7 @@ static inline void local_flush_tlb_mm(struct mm_struct *mm) ...@@ -360,6 +360,7 @@ static inline void local_flush_tlb_mm(struct mm_struct *mm)
if (tlb_flag(TLB_V4_I_FULL)) if (tlb_flag(TLB_V4_I_FULL))
asm("mcr p15, 0, %0, c8, c5, 0" : : "r" (zero) : "cc"); asm("mcr p15, 0, %0, c8, c5, 0" : : "r" (zero) : "cc");
} }
put_cpu();
if (tlb_flag(TLB_V6_U_ASID)) if (tlb_flag(TLB_V6_U_ASID))
asm("mcr p15, 0, %0, c8, c7, 2" : : "r" (asid) : "cc"); asm("mcr p15, 0, %0, c8, c7, 2" : : "r" (asid) : "cc");
......
...@@ -402,6 +402,15 @@ ...@@ -402,6 +402,15 @@
#define __ARM_NR_usr32 (__ARM_NR_BASE+4) #define __ARM_NR_usr32 (__ARM_NR_BASE+4)
#define __ARM_NR_set_tls (__ARM_NR_BASE+5) #define __ARM_NR_set_tls (__ARM_NR_BASE+5)
/*
* *NOTE*: This is a ghost syscall private to the kernel. Only the
* __kuser_cmpxchg code in entry-armv.S should be aware of its
* existence. Don't ever use this from user code.
*/
#ifdef __KERNEL__
#define __ARM_NR_cmpxchg (__ARM_NR_BASE+0x00fff0)
#endif
/* /*
* The following syscalls are obsolete and no longer available for EABI. * The following syscalls are obsolete and no longer available for EABI.
*/ */
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <mach/entry-macro.S> #include <mach/entry-macro.S>
#include <asm/thread_notify.h> #include <asm/thread_notify.h>
#include <asm/unwind.h> #include <asm/unwind.h>
#include <asm/unistd.h>
#include "entry-header.S" #include "entry-header.S"
...@@ -608,33 +609,33 @@ call_fpe: ...@@ -608,33 +609,33 @@ call_fpe:
THUMB( add pc, r8 ) THUMB( add pc, r8 )
nop nop
W(mov) pc, lr @ CP#0 movw_pc lr @ CP#0
W(b) do_fpe @ CP#1 (FPE) W(b) do_fpe @ CP#1 (FPE)
W(b) do_fpe @ CP#2 (FPE) W(b) do_fpe @ CP#2 (FPE)
W(mov) pc, lr @ CP#3 movw_pc lr @ CP#3
#ifdef CONFIG_CRUNCH #ifdef CONFIG_CRUNCH
b crunch_task_enable @ CP#4 (MaverickCrunch) b crunch_task_enable @ CP#4 (MaverickCrunch)
b crunch_task_enable @ CP#5 (MaverickCrunch) b crunch_task_enable @ CP#5 (MaverickCrunch)
b crunch_task_enable @ CP#6 (MaverickCrunch) b crunch_task_enable @ CP#6 (MaverickCrunch)
#else #else
W(mov) pc, lr @ CP#4 movw_pc lr @ CP#4
W(mov) pc, lr @ CP#5 movw_pc lr @ CP#5
W(mov) pc, lr @ CP#6 movw_pc lr @ CP#6
#endif #endif
W(mov) pc, lr @ CP#7 movw_pc lr @ CP#7
W(mov) pc, lr @ CP#8 movw_pc lr @ CP#8
W(mov) pc, lr @ CP#9 movw_pc lr @ CP#9
#ifdef CONFIG_VFP #ifdef CONFIG_VFP
W(b) do_vfp @ CP#10 (VFP) W(b) do_vfp @ CP#10 (VFP)
W(b) do_vfp @ CP#11 (VFP) W(b) do_vfp @ CP#11 (VFP)
#else #else
W(mov) pc, lr @ CP#10 (VFP) movw_pc lr @ CP#10 (VFP)
W(mov) pc, lr @ CP#11 (VFP) movw_pc lr @ CP#11 (VFP)
#endif #endif
W(mov) pc, lr @ CP#12 movw_pc lr @ CP#12
W(mov) pc, lr @ CP#13 movw_pc lr @ CP#13
W(mov) pc, lr @ CP#14 (Debug) movw_pc lr @ CP#14 (Debug)
W(mov) pc, lr @ CP#15 (Control) movw_pc lr @ CP#15 (Control)
#ifdef CONFIG_NEON #ifdef CONFIG_NEON
.align 6 .align 6
...@@ -908,10 +909,10 @@ __kuser_cmpxchg: @ 0xffff0fc0 ...@@ -908,10 +909,10 @@ __kuser_cmpxchg: @ 0xffff0fc0
* A special ghost syscall is used for that (see traps.c). * A special ghost syscall is used for that (see traps.c).
*/ */
stmfd sp!, {r7, lr} stmfd sp!, {r7, lr}
mov r7, #0xff00 @ 0xfff0 into r7 for EABI ldr r7, =1f @ it's 20 bits
orr r7, r7, #0xf0 swi __ARM_NR_cmpxchg
swi #0x9ffff0
ldmfd sp!, {r7, pc} ldmfd sp!, {r7, pc}
1: .word __ARM_NR_cmpxchg
#elif __LINUX_ARM_ARCH__ < 6 #elif __LINUX_ARM_ARCH__ < 6
......
...@@ -110,6 +110,13 @@ ...@@ -110,6 +110,13 @@
mov \rd, sp, lsr #13 mov \rd, sp, lsr #13
mov \rd, \rd, lsl #13 mov \rd, \rd, lsl #13
.endm .endm
@
@ 32-bit wide "mov pc, reg"
@
.macro movw_pc, reg
mov pc, \reg
.endm
#else /* CONFIG_THUMB2_KERNEL */ #else /* CONFIG_THUMB2_KERNEL */
.macro svc_exit, rpsr .macro svc_exit, rpsr
clrex @ clear the exclusive monitor clrex @ clear the exclusive monitor
...@@ -146,6 +153,14 @@ ...@@ -146,6 +153,14 @@
lsr \rd, \rd, #13 lsr \rd, \rd, #13
mov \rd, \rd, lsl #13 mov \rd, \rd, lsl #13
.endm .endm
@
@ 32-bit wide "mov pc, reg"
@
.macro movw_pc, reg
mov pc, \reg
nop
.endm
#endif /* !CONFIG_THUMB2_KERNEL */ #endif /* !CONFIG_THUMB2_KERNEL */
/* /*
......
...@@ -97,7 +97,7 @@ __error_a: ...@@ -97,7 +97,7 @@ __error_a:
bl printhex8 bl printhex8
adr r0, str_a2 adr r0, str_a2
bl printascii bl printascii
adr r3, 3f adr r3, 4f
ldmia r3, {r4, r5, r6} @ get machine desc list ldmia r3, {r4, r5, r6} @ get machine desc list
sub r4, r3, r4 @ get offset between virt&phys sub r4, r3, r4 @ get offset between virt&phys
add r5, r5, r4 @ convert virt addresses to add r5, r5, r4 @ convert virt addresses to
......
...@@ -327,6 +327,15 @@ copy_thread(unsigned long clone_flags, unsigned long stack_start, ...@@ -327,6 +327,15 @@ copy_thread(unsigned long clone_flags, unsigned long stack_start,
return 0; return 0;
} }
/*
* Fill in the task's elfregs structure for a core dump.
*/
int dump_task_regs(struct task_struct *t, elf_gregset_t *elfregs)
{
elf_core_copy_regs(elfregs, task_pt_regs(t));
return 1;
}
/* /*
* fill in the fpe structure for a core dump... * fill in the fpe structure for a core dump...
*/ */
......
/* /*
* linux/arch/arm/kernel/signal.c * linux/arch/arm/kernel/signal.c
* *
* Copyright (C) 1995-2002 Russell King * Copyright (C) 1995-2009 Russell King
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License version 2 as
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
*/ */
#define SWI_SYS_SIGRETURN (0xef000000|(__NR_sigreturn)|(__NR_OABI_SYSCALL_BASE)) #define SWI_SYS_SIGRETURN (0xef000000|(__NR_sigreturn)|(__NR_OABI_SYSCALL_BASE))
#define SWI_SYS_RT_SIGRETURN (0xef000000|(__NR_rt_sigreturn)|(__NR_OABI_SYSCALL_BASE)) #define SWI_SYS_RT_SIGRETURN (0xef000000|(__NR_rt_sigreturn)|(__NR_OABI_SYSCALL_BASE))
#define SWI_SYS_RESTART (0xef000000|__NR_restart_syscall|__NR_OABI_SYSCALL_BASE)
/* /*
* With EABI, the syscall number has to be loaded into r7. * With EABI, the syscall number has to be loaded into r7.
...@@ -48,6 +49,18 @@ const unsigned long sigreturn_codes[7] = { ...@@ -48,6 +49,18 @@ const unsigned long sigreturn_codes[7] = {
MOV_R7_NR_RT_SIGRETURN, SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN, MOV_R7_NR_RT_SIGRETURN, SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN,
}; };
/*
* Either we support OABI only, or we have EABI with the OABI
* compat layer enabled. In the later case we don't know if
* user space is EABI or not, and if not we must not clobber r7.
* Always using the OABI syscall solves that issue and works for
* all those cases.
*/
const unsigned long syscall_restart_code[2] = {
SWI_SYS_RESTART, /* swi __NR_restart_syscall */
0xe49df004, /* ldr pc, [sp], #4 */
};
/* /*
* atomically swap in the new signal mask, and wait for a signal. * atomically swap in the new signal mask, and wait for a signal.
*/ */
...@@ -645,32 +658,12 @@ static void do_signal(struct pt_regs *regs, int syscall) ...@@ -645,32 +658,12 @@ static void do_signal(struct pt_regs *regs, int syscall)
regs->ARM_pc -= 4; regs->ARM_pc -= 4;
#else #else
u32 __user *usp; u32 __user *usp;
u32 swival = __NR_restart_syscall;
regs->ARM_sp -= 12; regs->ARM_sp -= 4;
usp = (u32 __user *)regs->ARM_sp; usp = (u32 __user *)regs->ARM_sp;
/* put_user(regs->ARM_pc, usp);
* Either we supports OABI only, or we have regs->ARM_pc = KERN_RESTART_CODE;
* EABI with the OABI compat layer enabled.
* In the later case we don't know if user
* space is EABI or not, and if not we must
* not clobber r7. Always using the OABI
* syscall solves that issue and works for
* all those cases.
*/
swival = swival - __NR_SYSCALL_BASE + __NR_OABI_SYSCALL_BASE;
put_user(regs->ARM_pc, &usp[0]);
/* swi __NR_restart_syscall */
put_user(0xef000000 | swival, &usp[1]);
/* ldr pc, [sp], #12 */
put_user(0xe49df00c, &usp[2]);
flush_icache_range((unsigned long)usp,
(unsigned long)(usp + 3));
regs->ARM_pc = regs->ARM_sp + 4;
#endif #endif
} }
} }
......
/* /*
* linux/arch/arm/kernel/signal.h * linux/arch/arm/kernel/signal.h
* *
* Copyright (C) 2005 Russell King. * Copyright (C) 2005-2009 Russell King.
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#define KERN_SIGRETURN_CODE (CONFIG_VECTORS_BASE + 0x00000500) #define KERN_SIGRETURN_CODE (CONFIG_VECTORS_BASE + 0x00000500)
#define KERN_RESTART_CODE (KERN_SIGRETURN_CODE + sizeof(sigreturn_codes))
extern const unsigned long sigreturn_codes[7]; extern const unsigned long sigreturn_codes[7];
extern const unsigned long syscall_restart_code[2];
...@@ -37,6 +37,10 @@ void __init scu_enable(void __iomem *scu_base) ...@@ -37,6 +37,10 @@ void __init scu_enable(void __iomem *scu_base)
u32 scu_ctrl; u32 scu_ctrl;
scu_ctrl = __raw_readl(scu_base + SCU_CTRL); scu_ctrl = __raw_readl(scu_base + SCU_CTRL);
/* already enabled? */
if (scu_ctrl & 1)
return;
scu_ctrl |= 1; scu_ctrl |= 1;
__raw_writel(scu_ctrl, scu_base + SCU_CTRL); __raw_writel(scu_ctrl, scu_base + SCU_CTRL);
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/time.h> #include <linux/time.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/sched.h>
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/timex.h> #include <linux/timex.h>
#include <linux/errno.h> #include <linux/errno.h>
......
/* /*
* linux/arch/arm/kernel/traps.c * linux/arch/arm/kernel/traps.c
* *
* Copyright (C) 1995-2002 Russell King * Copyright (C) 1995-2009 Russell King
* Fragments that appear the same as linux/arch/i386/kernel/traps.c (C) Linus Torvalds * Fragments that appear the same as linux/arch/i386/kernel/traps.c (C) Linus Torvalds
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -45,21 +45,21 @@ static int __init user_debug_setup(char *str) ...@@ -45,21 +45,21 @@ static int __init user_debug_setup(char *str)
__setup("user_debug=", user_debug_setup); __setup("user_debug=", user_debug_setup);
#endif #endif
static void dump_mem(const char *str, unsigned long bottom, unsigned long top); static void dump_mem(const char *, const char *, unsigned long, unsigned long);
void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame) void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame)
{ {
#ifdef CONFIG_KALLSYMS #ifdef CONFIG_KALLSYMS
printk("[<%08lx>] ", where); char sym1[KSYM_SYMBOL_LEN], sym2[KSYM_SYMBOL_LEN];
print_symbol("(%s) ", where); sprint_symbol(sym1, where);
printk("from [<%08lx>] ", from); sprint_symbol(sym2, from);
print_symbol("(%s)\n", from); printk("[<%08lx>] (%s) from [<%08lx>] (%s)\n", where, sym1, from, sym2);
#else #else
printk("Function entered at [<%08lx>] from [<%08lx>]\n", where, from); printk("Function entered at [<%08lx>] from [<%08lx>]\n", where, from);
#endif #endif
if (in_exception_text(where)) if (in_exception_text(where))
dump_mem("Exception stack", frame + 4, frame + 4 + sizeof(struct pt_regs)); dump_mem("", "Exception stack", frame + 4, frame + 4 + sizeof(struct pt_regs));
} }
#ifndef CONFIG_ARM_UNWIND #ifndef CONFIG_ARM_UNWIND
...@@ -81,9 +81,10 @@ static int verify_stack(unsigned long sp) ...@@ -81,9 +81,10 @@ static int verify_stack(unsigned long sp)
/* /*
* Dump out the contents of some memory nicely... * Dump out the contents of some memory nicely...
*/ */
static void dump_mem(const char *str, unsigned long bottom, unsigned long top) static void dump_mem(const char *lvl, const char *str, unsigned long bottom,
unsigned long top)
{ {
unsigned long p = bottom & ~31; unsigned long first;
mm_segment_t fs; mm_segment_t fs;
int i; int i;
...@@ -95,33 +96,37 @@ static void dump_mem(const char *str, unsigned long bottom, unsigned long top) ...@@ -95,33 +96,37 @@ static void dump_mem(const char *str, unsigned long bottom, unsigned long top)
fs = get_fs(); fs = get_fs();
set_fs(KERNEL_DS); set_fs(KERNEL_DS);
printk("%s(0x%08lx to 0x%08lx)\n", str, bottom, top); printk("%s%s(0x%08lx to 0x%08lx)\n", lvl, str, bottom, top);
for (p = bottom & ~31; p < top;) { for (first = bottom & ~31; first < top; first += 32) {
printk("%04lx: ", p & 0xffff); unsigned long p;
char str[sizeof(" 12345678") * 8 + 1];
for (i = 0; i < 8; i++, p += 4) { memset(str, ' ', sizeof(str));
unsigned int val; str[sizeof(str) - 1] = '\0';
if (p < bottom || p >= top) for (p = first, i = 0; i < 8 && p < top; i++, p += 4) {
printk(" "); if (p >= bottom && p < top) {
else { unsigned long val;
__get_user(val, (unsigned long *)p); if (__get_user(val, (unsigned long *)p) == 0)
printk("%08x ", val); sprintf(str + i * 9, " %08lx", val);
else
sprintf(str + i * 9, " ????????");
} }
} }
printk ("\n"); printk("%s%04lx:%s\n", lvl, first & 0xffff, str);
} }
set_fs(fs); set_fs(fs);
} }
static void dump_instr(struct pt_regs *regs) static void dump_instr(const char *lvl, struct pt_regs *regs)
{ {
unsigned long addr = instruction_pointer(regs); unsigned long addr = instruction_pointer(regs);
const int thumb = thumb_mode(regs); const int thumb = thumb_mode(regs);
const int width = thumb ? 4 : 8; const int width = thumb ? 4 : 8;
mm_segment_t fs; mm_segment_t fs;
char str[sizeof("00000000 ") * 5 + 2 + 1], *p = str;
int i; int i;
/* /*
...@@ -132,7 +137,6 @@ static void dump_instr(struct pt_regs *regs) ...@@ -132,7 +137,6 @@ static void dump_instr(struct pt_regs *regs)
fs = get_fs(); fs = get_fs();
set_fs(KERNEL_DS); set_fs(KERNEL_DS);
printk("Code: ");
for (i = -4; i < 1; i++) { for (i = -4; i < 1; i++) {
unsigned int val, bad; unsigned int val, bad;
...@@ -142,13 +146,14 @@ static void dump_instr(struct pt_regs *regs) ...@@ -142,13 +146,14 @@ static void dump_instr(struct pt_regs *regs)
bad = __get_user(val, &((u32 *)addr)[i]); bad = __get_user(val, &((u32 *)addr)[i]);
if (!bad) if (!bad)
printk(i == 0 ? "(%0*x) " : "%0*x ", width, val); p += sprintf(p, i == 0 ? "(%0*x) " : "%0*x ",
width, val);
else { else {
printk("bad PC value."); p += sprintf(p, "bad PC value");
break; break;
} }
} }
printk("\n"); printk("%sCode: %s\n", lvl, str);
set_fs(fs); set_fs(fs);
} }
...@@ -224,18 +229,19 @@ static void __die(const char *str, int err, struct thread_info *thread, struct p ...@@ -224,18 +229,19 @@ static void __die(const char *str, int err, struct thread_info *thread, struct p
struct task_struct *tsk = thread->task; struct task_struct *tsk = thread->task;
static int die_counter; static int die_counter;
printk("Internal error: %s: %x [#%d]" S_PREEMPT S_SMP "\n", printk(KERN_EMERG "Internal error: %s: %x [#%d]" S_PREEMPT S_SMP "\n",
str, err, ++die_counter); str, err, ++die_counter);
sysfs_printk_last_file();
print_modules(); print_modules();
__show_regs(regs); __show_regs(regs);
printk("Process %s (pid: %d, stack limit = 0x%p)\n", printk(KERN_EMERG "Process %.*s (pid: %d, stack limit = 0x%p)\n",
tsk->comm, task_pid_nr(tsk), thread + 1); TASK_COMM_LEN, tsk->comm, task_pid_nr(tsk), thread + 1);
if (!user_mode(regs) || in_interrupt()) { if (!user_mode(regs) || in_interrupt()) {
dump_mem("Stack: ", regs->ARM_sp, dump_mem(KERN_EMERG, "Stack: ", regs->ARM_sp,
THREAD_SIZE + (unsigned long)task_stack_page(tsk)); THREAD_SIZE + (unsigned long)task_stack_page(tsk));
dump_backtrace(regs, tsk); dump_backtrace(regs, tsk);
dump_instr(regs); dump_instr(KERN_EMERG, regs);
} }
} }
...@@ -250,13 +256,14 @@ NORET_TYPE void die(const char *str, struct pt_regs *regs, int err) ...@@ -250,13 +256,14 @@ NORET_TYPE void die(const char *str, struct pt_regs *regs, int err)
oops_enter(); oops_enter();
console_verbose();
spin_lock_irq(&die_lock); spin_lock_irq(&die_lock);
console_verbose();
bust_spinlocks(1); bust_spinlocks(1);
__die(str, err, thread, regs); __die(str, err, thread, regs);
bust_spinlocks(0); bust_spinlocks(0);
add_taint(TAINT_DIE); add_taint(TAINT_DIE);
spin_unlock_irq(&die_lock); spin_unlock_irq(&die_lock);
oops_exit();
if (in_interrupt()) if (in_interrupt())
panic("Fatal exception in interrupt"); panic("Fatal exception in interrupt");
...@@ -264,7 +271,6 @@ NORET_TYPE void die(const char *str, struct pt_regs *regs, int err) ...@@ -264,7 +271,6 @@ NORET_TYPE void die(const char *str, struct pt_regs *regs, int err)
if (panic_on_oops) if (panic_on_oops)
panic("Fatal exception"); panic("Fatal exception");
oops_exit();
do_exit(SIGSEGV); do_exit(SIGSEGV);
} }
...@@ -349,7 +355,7 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs) ...@@ -349,7 +355,7 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs)
if (user_debug & UDBG_UNDEFINED) { if (user_debug & UDBG_UNDEFINED) {
printk(KERN_INFO "%s (%d): undefined instruction: pc=%p\n", printk(KERN_INFO "%s (%d): undefined instruction: pc=%p\n",
current->comm, task_pid_nr(current), pc); current->comm, task_pid_nr(current), pc);
dump_instr(regs); dump_instr(KERN_INFO, regs);
} }
#endif #endif
...@@ -400,7 +406,7 @@ static int bad_syscall(int n, struct pt_regs *regs) ...@@ -400,7 +406,7 @@ static int bad_syscall(int n, struct pt_regs *regs)
if (user_debug & UDBG_SYSCALL) { if (user_debug & UDBG_SYSCALL) {
printk(KERN_ERR "[%d] %s: obsolete system call %08x.\n", printk(KERN_ERR "[%d] %s: obsolete system call %08x.\n",
task_pid_nr(current), current->comm, n); task_pid_nr(current), current->comm, n);
dump_instr(regs); dump_instr(KERN_ERR, regs);
} }
#endif #endif
...@@ -522,7 +528,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs) ...@@ -522,7 +528,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
* __kuser_cmpxchg code in entry-armv.S should be aware of its * __kuser_cmpxchg code in entry-armv.S should be aware of its
* existence. Don't ever use this from user code. * existence. Don't ever use this from user code.
*/ */
case 0xfff0: case NR(cmpxchg):
for (;;) { for (;;) {
extern void do_DataAbort(unsigned long addr, unsigned int fsr, extern void do_DataAbort(unsigned long addr, unsigned int fsr,
struct pt_regs *regs); struct pt_regs *regs);
...@@ -567,7 +573,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs) ...@@ -567,7 +573,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
if not implemented, rather than raising SIGILL. This if not implemented, rather than raising SIGILL. This
way the calling program can gracefully determine whether way the calling program can gracefully determine whether
a feature is supported. */ a feature is supported. */
if (no <= 0x7ff) if ((no & 0xffff) <= 0x7ff)
return -ENOSYS; return -ENOSYS;
break; break;
} }
...@@ -579,7 +585,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs) ...@@ -579,7 +585,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
if (user_debug & UDBG_SYSCALL) { if (user_debug & UDBG_SYSCALL) {
printk("[%d] %s: arm syscall %d\n", printk("[%d] %s: arm syscall %d\n",
task_pid_nr(current), current->comm, no); task_pid_nr(current), current->comm, no);
dump_instr(regs); dump_instr("", regs);
if (user_mode(regs)) { if (user_mode(regs)) {
__show_regs(regs); __show_regs(regs);
c_backtrace(regs->ARM_fp, processor_mode(regs)); c_backtrace(regs->ARM_fp, processor_mode(regs));
...@@ -656,7 +662,7 @@ baddataabort(int code, unsigned long instr, struct pt_regs *regs) ...@@ -656,7 +662,7 @@ baddataabort(int code, unsigned long instr, struct pt_regs *regs)
if (user_debug & UDBG_BADABORT) { if (user_debug & UDBG_BADABORT) {
printk(KERN_ERR "[%d] %s: bad data abort: code %d instr 0x%08lx\n", printk(KERN_ERR "[%d] %s: bad data abort: code %d instr 0x%08lx\n",
task_pid_nr(current), current->comm, code, instr); task_pid_nr(current), current->comm, code, instr);
dump_instr(regs); dump_instr(KERN_ERR, regs);
show_pte(current->mm, addr); show_pte(current->mm, addr);
} }
#endif #endif
...@@ -745,6 +751,8 @@ void __init early_trap_init(void) ...@@ -745,6 +751,8 @@ void __init early_trap_init(void)
*/ */
memcpy((void *)KERN_SIGRETURN_CODE, sigreturn_codes, memcpy((void *)KERN_SIGRETURN_CODE, sigreturn_codes,
sizeof(sigreturn_codes)); sizeof(sigreturn_codes));
memcpy((void *)KERN_RESTART_CODE, syscall_restart_code,
sizeof(syscall_restart_code));
flush_icache_range(vectors, vectors + PAGE_SIZE); flush_icache_range(vectors, vectors + PAGE_SIZE);
modify_domain(DOMAIN_USER, DOMAIN_CLIENT); modify_domain(DOMAIN_USER, DOMAIN_CLIENT);
......
...@@ -26,6 +26,15 @@ ...@@ -26,6 +26,15 @@
* http://infocenter.arm.com/help/topic/com.arm.doc.subset.swdev.abi/index.html * http://infocenter.arm.com/help/topic/com.arm.doc.subset.swdev.abi/index.html
*/ */
#if !defined (__ARM_EABI__)
#warning Your compiler does not have EABI support.
#warning ARM unwind is known to compile only with EABI compilers.
#warning Change compiler or disable ARM_UNWIND option.
#elif (__GNUC__ == 4 && __GNUC_MINOR__ <= 2)
#warning Your compiler is too buggy; it is known to not compile ARM unwind support.
#warning Change compiler or disable ARM_UNWIND option.
#endif
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/module.h> #include <linux/module.h>
......
...@@ -289,13 +289,6 @@ config MACH_NEOCORE926 ...@@ -289,13 +289,6 @@ config MACH_NEOCORE926
help help
Select this if you are using the Adeneo Neocore 926 board. Select this if you are using the Adeneo Neocore 926 board.
config MACH_AT91SAM9G20EK_2MMC
bool "Atmel AT91SAM9G20-EK Evaluation Kit modified for 2 MMC Slots"
depends on ARCH_AT91SAM9G20
help
Select this if you are using an Atmel AT91SAM9G20-EK Evaluation Kit
Rev A or B modified for 2 MMC Slots.
endif endif
# ---------------------------------------------------------- # ----------------------------------------------------------
...@@ -322,7 +315,16 @@ config MACH_AT91SAM9G20EK ...@@ -322,7 +315,16 @@ config MACH_AT91SAM9G20EK
bool "Atmel AT91SAM9G20-EK Evaluation Kit" bool "Atmel AT91SAM9G20-EK Evaluation Kit"
depends on ARCH_AT91SAM9G20 depends on ARCH_AT91SAM9G20
help help
Select this if you are using Atmel's AT91SAM9G20-EK Evaluation Kit. Select this if you are using Atmel's AT91SAM9G20-EK Evaluation Kit
that embeds only one SD/MMC slot.
config MACH_AT91SAM9G20EK_2MMC
bool "Atmel AT91SAM9G20-EK Evaluation Kit with 2 SD/MMC Slots"
depends on ARCH_AT91SAM9G20
help
Select this if you are using an Atmel AT91SAM9G20-EK Evaluation Kit
with 2 SD/MMC Slots. This is the case for AT91SAM9G20-EK rev. C and
onwards.
config MACH_CPU9G20 config MACH_CPU9G20
bool "Eukrea CPU9G20 board" bool "Eukrea CPU9G20 board"
...@@ -392,7 +394,7 @@ config MTD_AT91_DATAFLASH_CARD ...@@ -392,7 +394,7 @@ config MTD_AT91_DATAFLASH_CARD
config MTD_NAND_ATMEL_BUSWIDTH_16 config MTD_NAND_ATMEL_BUSWIDTH_16
bool "Enable 16-bit data bus interface to NAND flash" bool "Enable 16-bit data bus interface to NAND flash"
depends on (MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9G10EK || MACH_AT91SAM9263EK || MACH_AT91SAM9G20EK || MACH_AT91SAM9G45EKES || MACH_AT91CAP9ADK) depends on (MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9G10EK || MACH_AT91SAM9263EK || MACH_AT91SAM9G20EK || MACH_AT91SAM9G20EK_2MMC || MACH_AT91SAM9G45EKES || MACH_AT91CAP9ADK)
help help
On AT91SAM926x boards both types of NAND flash can be present On AT91SAM926x boards both types of NAND flash can be present
(8 and 16 bit data bus width). (8 and 16 bit data bus width).
......
...@@ -838,7 +838,7 @@ static void __init at91_add_device_rtt(void) ...@@ -838,7 +838,7 @@ static void __init at91_add_device_rtt(void)
* Watchdog * Watchdog
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE) #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
static struct platform_device at91sam9g45_wdt_device = { static struct platform_device at91sam9g45_wdt_device = {
.name = "at91_wdt", .name = "at91_wdt",
.id = -1, .id = -1,
......
...@@ -90,7 +90,7 @@ static struct at91_udc_data __initdata ek_udc_data = { ...@@ -90,7 +90,7 @@ static struct at91_udc_data __initdata ek_udc_data = {
* SPI devices. * SPI devices.
*/ */
static struct spi_board_info ek_spi_devices[] = { static struct spi_board_info ek_spi_devices[] = {
#if !defined(CONFIG_MMC_ATMELMCI) #if !(defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_AT91))
{ /* DataFlash chip */ { /* DataFlash chip */
.modalias = "mtd_dataflash", .modalias = "mtd_dataflash",
.chip_select = 1, .chip_select = 1,
...@@ -113,7 +113,7 @@ static struct spi_board_info ek_spi_devices[] = { ...@@ -113,7 +113,7 @@ static struct spi_board_info ek_spi_devices[] = {
* MACB Ethernet device * MACB Ethernet device
*/ */
static struct at91_eth_data __initdata ek_macb_data = { static struct at91_eth_data __initdata ek_macb_data = {
.phy_irq_pin = AT91_PIN_PC12, .phy_irq_pin = AT91_PIN_PB0,
.is_rmii = 1, .is_rmii = 1,
}; };
...@@ -194,24 +194,27 @@ static void __init ek_add_device_nand(void) ...@@ -194,24 +194,27 @@ static void __init ek_add_device_nand(void)
/* /*
* MCI (SD/MMC) * MCI (SD/MMC)
* det_pin and wp_pin are not connected * wp_pin is not connected
*/ */
#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE) #if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE)
static struct mci_platform_data __initdata ek_mmc_data = { static struct mci_platform_data __initdata ek_mmc_data = {
.slot[0] = { .slot[0] = {
.bus_width = 4, .bus_width = 4,
.detect_pin = -ENODEV, .detect_pin = AT91_PIN_PC2,
.wp_pin = -ENODEV, .wp_pin = -ENODEV,
}, },
.slot[1] = { .slot[1] = {
.bus_width = 4, .bus_width = 4,
.detect_pin = -ENODEV, .detect_pin = AT91_PIN_PC9,
.wp_pin = -ENODEV, .wp_pin = -ENODEV,
}, },
}; };
#else #else
static struct amci_platform_data __initdata ek_mmc_data = { static struct at91_mmc_data __initdata ek_mmc_data = {
.slot_b = 1, /* Only one slot so use slot B */
.wire4 = 1,
.det_pin = AT91_PIN_PC9,
}; };
#endif #endif
...@@ -221,13 +224,13 @@ static struct amci_platform_data __initdata ek_mmc_data = { ...@@ -221,13 +224,13 @@ static struct amci_platform_data __initdata ek_mmc_data = {
static struct gpio_led ek_leds[] = { static struct gpio_led ek_leds[] = {
{ /* "bottom" led, green, userled1 to be defined */ { /* "bottom" led, green, userled1 to be defined */
.name = "ds5", .name = "ds5",
.gpio = AT91_PIN_PB12, .gpio = AT91_PIN_PB8,
.active_low = 1, .active_low = 1,
.default_trigger = "none", .default_trigger = "none",
}, },
{ /* "power" led, yellow */ { /* "power" led, yellow */
.name = "ds1", .name = "ds1",
.gpio = AT91_PIN_PB13, .gpio = AT91_PIN_PB9,
.default_trigger = "heartbeat", .default_trigger = "heartbeat",
} }
}; };
...@@ -254,7 +257,11 @@ static void __init ek_board_init(void) ...@@ -254,7 +257,11 @@ static void __init ek_board_init(void)
/* Ethernet */ /* Ethernet */
at91_add_device_eth(&ek_macb_data); at91_add_device_eth(&ek_macb_data);
/* MMC */ /* MMC */
#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE)
at91_add_device_mci(0, &ek_mmc_data); at91_add_device_mci(0, &ek_mmc_data);
#else
at91_add_device_mmc(0, &ek_mmc_data);
#endif
/* I2C */ /* I2C */
at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices)); at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices));
/* LEDs */ /* LEDs */
......
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
#define ARCH_ID_AT91SAM9G20 0x019905a0 #define ARCH_ID_AT91SAM9G20 0x019905a0
#define ARCH_ID_AT91SAM9RL64 0x019b03a0 #define ARCH_ID_AT91SAM9RL64 0x019b03a0
#define ARCH_ID_AT91SAM9G45 0x819b05a0 #define ARCH_ID_AT91SAM9G45 0x819b05a0
#define ARCH_ID_AT91SAM9G45MRL 0x819b05a2 /* aka 9G45-ES2 & non ES lots */
#define ARCH_ID_AT91SAM9G45ES 0x819b05a1 /* 9G45-ES (Engineering Sample) */
#define ARCH_ID_AT91CAP9 0x039A03A0 #define ARCH_ID_AT91CAP9 0x039A03A0
#define ARCH_ID_AT91SAM9XE128 0x329973a0 #define ARCH_ID_AT91SAM9XE128 0x329973a0
...@@ -41,6 +43,11 @@ static inline unsigned long at91_cpu_identify(void) ...@@ -41,6 +43,11 @@ static inline unsigned long at91_cpu_identify(void)
return (at91_sys_read(AT91_DBGU_CIDR) & ~AT91_CIDR_VERSION); return (at91_sys_read(AT91_DBGU_CIDR) & ~AT91_CIDR_VERSION);
} }
static inline unsigned long at91_cpu_fully_identify(void)
{
return at91_sys_read(AT91_DBGU_CIDR);
}
#define ARCH_EXID_AT91SAM9M11 0x00000001 #define ARCH_EXID_AT91SAM9M11 0x00000001
#define ARCH_EXID_AT91SAM9M10 0x00000002 #define ARCH_EXID_AT91SAM9M10 0x00000002
#define ARCH_EXID_AT91SAM9G45 0x00000004 #define ARCH_EXID_AT91SAM9G45 0x00000004
...@@ -118,8 +125,10 @@ static inline unsigned long at91cap9_rev_identify(void) ...@@ -118,8 +125,10 @@ static inline unsigned long at91cap9_rev_identify(void)
#ifdef CONFIG_ARCH_AT91SAM9G45 #ifdef CONFIG_ARCH_AT91SAM9G45
#define cpu_is_at91sam9g45() (at91_cpu_identify() == ARCH_ID_AT91SAM9G45) #define cpu_is_at91sam9g45() (at91_cpu_identify() == ARCH_ID_AT91SAM9G45)
#define cpu_is_at91sam9g45es() (at91_cpu_fully_identify() == ARCH_ID_AT91SAM9G45ES)
#else #else
#define cpu_is_at91sam9g45() (0) #define cpu_is_at91sam9g45() (0)
#define cpu_is_at91sam9g45es() (0)
#endif #endif
#ifdef CONFIG_ARCH_AT91CAP9 #ifdef CONFIG_ARCH_AT91CAP9
......
...@@ -271,12 +271,12 @@ static struct irqaction bcmring_timer_irq = { ...@@ -271,12 +271,12 @@ static struct irqaction bcmring_timer_irq = {
.handler = bcmring_timer_interrupt, .handler = bcmring_timer_interrupt,
}; };
static cycle_t bcmring_get_cycles_timer1(void) static cycle_t bcmring_get_cycles_timer1(struct clocksource *cs)
{ {
return ~readl(TIMER1_VA_BASE + TIMER_VALUE); return ~readl(TIMER1_VA_BASE + TIMER_VALUE);
} }
static cycle_t bcmring_get_cycles_timer3(void) static cycle_t bcmring_get_cycles_timer3(struct clocksource *cs)
{ {
return ~readl(TIMER3_VA_BASE + TIMER_VALUE); return ~readl(TIMER3_VA_BASE + TIMER_VALUE);
} }
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册