mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-30 14:19:16 +00:00
Auto-update from upstream
This commit is contained in:
commit
0ad3a96f8a
1662 changed files with 79916 additions and 70678 deletions
6
CREDITS
6
CREDITS
|
@ -3642,11 +3642,9 @@ S: Beaverton, OR 97005
|
||||||
S: USA
|
S: USA
|
||||||
|
|
||||||
N: Michal Wronski
|
N: Michal Wronski
|
||||||
E: wrona@mat.uni.torun.pl
|
E: Michal.Wronski@motorola.com
|
||||||
W: http://www.mat.uni.torun.pl/~wrona
|
|
||||||
D: POSIX message queues fs (with K. Benedyczak)
|
D: POSIX message queues fs (with K. Benedyczak)
|
||||||
S: ul. Teczowa 23/12
|
S: Krakow
|
||||||
S: 80-680 Gdansk-Sobieszewo
|
|
||||||
S: Poland
|
S: Poland
|
||||||
|
|
||||||
N: Frank Xia
|
N: Frank Xia
|
||||||
|
|
|
@ -139,9 +139,14 @@ You'll probably want to upgrade.
|
||||||
Ksymoops
|
Ksymoops
|
||||||
--------
|
--------
|
||||||
|
|
||||||
If the unthinkable happens and your kernel oopses, you'll need a 2.4
|
If the unthinkable happens and your kernel oopses, you may need the
|
||||||
version of ksymoops to decode the report; see REPORTING-BUGS in the
|
ksymoops tool to decode it, but in most cases you don't.
|
||||||
root of the Linux source for more information.
|
In the 2.6 kernel it is generally preferred to build the kernel with
|
||||||
|
CONFIG_KALLSYMS so that it produces readable dumps that can be used as-is
|
||||||
|
(this also produces better output than ksymoops).
|
||||||
|
If for some reason your kernel is not build with CONFIG_KALLSYMS and
|
||||||
|
you have no way to rebuild and reproduce the Oops with that option, then
|
||||||
|
you can still decode that Oops with ksymoops.
|
||||||
|
|
||||||
Module-Init-Tools
|
Module-Init-Tools
|
||||||
-----------------
|
-----------------
|
||||||
|
|
|
@ -10,7 +10,7 @@ DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml videobook.xml \
|
||||||
kernel-hacking.xml kernel-locking.xml deviceiobook.xml \
|
kernel-hacking.xml kernel-locking.xml deviceiobook.xml \
|
||||||
procfs-guide.xml writing_usb_driver.xml \
|
procfs-guide.xml writing_usb_driver.xml \
|
||||||
sis900.xml kernel-api.xml journal-api.xml lsm.xml usb.xml \
|
sis900.xml kernel-api.xml journal-api.xml lsm.xml usb.xml \
|
||||||
gadget.xml libata.xml mtdnand.xml librs.xml
|
gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml
|
||||||
|
|
||||||
###
|
###
|
||||||
# The build process is as follows (targets):
|
# The build process is as follows (targets):
|
||||||
|
|
|
@ -306,7 +306,7 @@ an example.
|
||||||
</para>
|
</para>
|
||||||
<sect1><title>Journal Level</title>
|
<sect1><title>Journal Level</title>
|
||||||
!Efs/jbd/journal.c
|
!Efs/jbd/journal.c
|
||||||
!Efs/jbd/recovery.c
|
!Ifs/jbd/recovery.c
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1><title>Transasction Level</title>
|
<sect1><title>Transasction Level</title>
|
||||||
!Efs/jbd/transaction.c
|
!Efs/jbd/transaction.c
|
||||||
|
|
|
@ -118,7 +118,7 @@ X!Ilib/string.c
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1><title>User Space Memory Access</title>
|
<sect1><title>User Space Memory Access</title>
|
||||||
!Iinclude/asm-i386/uaccess.h
|
!Iinclude/asm-i386/uaccess.h
|
||||||
!Iarch/i386/lib/usercopy.c
|
!Earch/i386/lib/usercopy.c
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1><title>More Memory Management Functions</title>
|
<sect1><title>More Memory Management Functions</title>
|
||||||
!Iinclude/linux/rmap.h
|
!Iinclude/linux/rmap.h
|
||||||
|
@ -174,7 +174,6 @@ X!Ilib/string.c
|
||||||
<title>The Linux VFS</title>
|
<title>The Linux VFS</title>
|
||||||
<sect1><title>The Filesystem types</title>
|
<sect1><title>The Filesystem types</title>
|
||||||
!Iinclude/linux/fs.h
|
!Iinclude/linux/fs.h
|
||||||
!Einclude/linux/fs.h
|
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1><title>The Directory Cache</title>
|
<sect1><title>The Directory Cache</title>
|
||||||
!Efs/dcache.c
|
!Efs/dcache.c
|
||||||
|
@ -239,9 +238,9 @@ X!Ilib/string.c
|
||||||
<title>Network device support</title>
|
<title>Network device support</title>
|
||||||
<sect1><title>Driver Support</title>
|
<sect1><title>Driver Support</title>
|
||||||
!Enet/core/dev.c
|
!Enet/core/dev.c
|
||||||
</sect1>
|
!Enet/ethernet/eth.c
|
||||||
<sect1><title>8390 Based Network Cards</title>
|
!Einclude/linux/etherdevice.h
|
||||||
!Edrivers/net/8390.c
|
!Enet/core/wireless.c
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1><title>Synchronous PPP</title>
|
<sect1><title>Synchronous PPP</title>
|
||||||
!Edrivers/net/wan/syncppp.c
|
!Edrivers/net/wan/syncppp.c
|
||||||
|
@ -266,7 +265,7 @@ X!Ekernel/module.c
|
||||||
<chapter id="hardware">
|
<chapter id="hardware">
|
||||||
<title>Hardware Interfaces</title>
|
<title>Hardware Interfaces</title>
|
||||||
<sect1><title>Interrupt Handling</title>
|
<sect1><title>Interrupt Handling</title>
|
||||||
!Ikernel/irq/manage.c
|
!Ekernel/irq/manage.c
|
||||||
</sect1>
|
</sect1>
|
||||||
|
|
||||||
<sect1><title>Resources Management</title>
|
<sect1><title>Resources Management</title>
|
||||||
|
@ -501,7 +500,7 @@ KAO -->
|
||||||
!Edrivers/video/modedb.c
|
!Edrivers/video/modedb.c
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1><title>Frame Buffer Macintosh Video Mode Database</title>
|
<sect1><title>Frame Buffer Macintosh Video Mode Database</title>
|
||||||
!Idrivers/video/macmodes.c
|
!Edrivers/video/macmodes.c
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1><title>Frame Buffer Fonts</title>
|
<sect1><title>Frame Buffer Fonts</title>
|
||||||
<para>
|
<para>
|
||||||
|
|
160
Documentation/DocBook/rapidio.tmpl
Normal file
160
Documentation/DocBook/rapidio.tmpl
Normal file
|
@ -0,0 +1,160 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
|
||||||
|
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
|
||||||
|
<!ENTITY rapidio SYSTEM "rapidio.xml">
|
||||||
|
]>
|
||||||
|
|
||||||
|
<book id="RapidIO-Guide">
|
||||||
|
<bookinfo>
|
||||||
|
<title>RapidIO Subsystem Guide</title>
|
||||||
|
|
||||||
|
<authorgroup>
|
||||||
|
<author>
|
||||||
|
<firstname>Matt</firstname>
|
||||||
|
<surname>Porter</surname>
|
||||||
|
<affiliation>
|
||||||
|
<address>
|
||||||
|
<email>mporter@kernel.crashing.org</email>
|
||||||
|
<email>mporter@mvista.com</email>
|
||||||
|
</address>
|
||||||
|
</affiliation>
|
||||||
|
</author>
|
||||||
|
</authorgroup>
|
||||||
|
|
||||||
|
<copyright>
|
||||||
|
<year>2005</year>
|
||||||
|
<holder>MontaVista Software, Inc.</holder>
|
||||||
|
</copyright>
|
||||||
|
|
||||||
|
<legalnotice>
|
||||||
|
<para>
|
||||||
|
This documentation is free software; you can redistribute
|
||||||
|
it and/or modify it under the terms of the GNU General Public
|
||||||
|
License version 2 as published by the Free Software Foundation.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
This program is distributed in the hope that it will be
|
||||||
|
useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||||
|
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
You should have received a copy of the GNU General Public
|
||||||
|
License along with this program; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||||
|
MA 02111-1307 USA
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
For more details see the file COPYING in the source
|
||||||
|
distribution of Linux.
|
||||||
|
</para>
|
||||||
|
</legalnotice>
|
||||||
|
</bookinfo>
|
||||||
|
|
||||||
|
<toc></toc>
|
||||||
|
|
||||||
|
<chapter id="intro">
|
||||||
|
<title>Introduction</title>
|
||||||
|
<para>
|
||||||
|
RapidIO is a high speed switched fabric interconnect with
|
||||||
|
features aimed at the embedded market. RapidIO provides
|
||||||
|
support for memory-mapped I/O as well as message-based
|
||||||
|
transactions over the switched fabric network. RapidIO has
|
||||||
|
a standardized discovery mechanism not unlike the PCI bus
|
||||||
|
standard that allows simple detection of devices in a
|
||||||
|
network.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
This documentation is provided for developers intending
|
||||||
|
to support RapidIO on new architectures, write new drivers,
|
||||||
|
or to understand the subsystem internals.
|
||||||
|
</para>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="bugs">
|
||||||
|
<title>Known Bugs and Limitations</title>
|
||||||
|
|
||||||
|
<sect1>
|
||||||
|
<title>Bugs</title>
|
||||||
|
<para>None. ;)</para>
|
||||||
|
</sect1>
|
||||||
|
<sect1>
|
||||||
|
<title>Limitations</title>
|
||||||
|
<para>
|
||||||
|
<orderedlist>
|
||||||
|
<listitem><para>Access/management of RapidIO memory regions is not supported</para></listitem>
|
||||||
|
<listitem><para>Multiple host enumeration is not supported</para></listitem>
|
||||||
|
</orderedlist>
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="drivers">
|
||||||
|
<title>RapidIO driver interface</title>
|
||||||
|
<para>
|
||||||
|
Drivers are provided a set of calls in order
|
||||||
|
to interface with the subsystem to gather info
|
||||||
|
on devices, request/map memory region resources,
|
||||||
|
and manage mailboxes/doorbells.
|
||||||
|
</para>
|
||||||
|
<sect1>
|
||||||
|
<title>Functions</title>
|
||||||
|
!Iinclude/linux/rio_drv.h
|
||||||
|
!Edrivers/rapidio/rio-driver.c
|
||||||
|
!Edrivers/rapidio/rio.c
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="internals">
|
||||||
|
<title>Internals</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
This chapter contains the autogenerated documentation of the RapidIO
|
||||||
|
subsystem.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect1><title>Structures</title>
|
||||||
|
!Iinclude/linux/rio.h
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Enumeration and Discovery</title>
|
||||||
|
!Idrivers/rapidio/rio-scan.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Driver functionality</title>
|
||||||
|
!Idrivers/rapidio/rio.c
|
||||||
|
!Idrivers/rapidio/rio-access.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Device model support</title>
|
||||||
|
!Idrivers/rapidio/rio-driver.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Sysfs support</title>
|
||||||
|
!Idrivers/rapidio/rio-sysfs.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>PPC32 support</title>
|
||||||
|
!Iarch/ppc/kernel/rio.c
|
||||||
|
!Earch/ppc/syslib/ppc85xx_rio.c
|
||||||
|
!Iarch/ppc/syslib/ppc85xx_rio.c
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="credits">
|
||||||
|
<title>Credits</title>
|
||||||
|
<para>
|
||||||
|
The following people have contributed to the RapidIO
|
||||||
|
subsystem directly or indirectly:
|
||||||
|
<orderedlist>
|
||||||
|
<listitem><para>Matt Porter<email>mporter@kernel.crashing.org</email></para></listitem>
|
||||||
|
<listitem><para>Randy Vinson<email>rvinson@mvista.com</email></para></listitem>
|
||||||
|
<listitem><para>Dan Malek<email>dan@embeddedalley.com</email></para></listitem>
|
||||||
|
</orderedlist>
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The following people have contributed to this document:
|
||||||
|
<orderedlist>
|
||||||
|
<listitem><para>Matt Porter<email>mporter@kernel.crashing.org</email></para></listitem>
|
||||||
|
</orderedlist>
|
||||||
|
</para>
|
||||||
|
</chapter>
|
||||||
|
</book>
|
|
@ -10,14 +10,22 @@
|
||||||
This guide describes the basics of Message Signaled Interrupts (MSI),
|
This guide describes the basics of Message Signaled Interrupts (MSI),
|
||||||
the advantages of using MSI over traditional interrupt mechanisms,
|
the advantages of using MSI over traditional interrupt mechanisms,
|
||||||
and how to enable your driver to use MSI or MSI-X. Also included is
|
and how to enable your driver to use MSI or MSI-X. Also included is
|
||||||
a Frequently Asked Questions.
|
a Frequently Asked Questions (FAQ) section.
|
||||||
|
|
||||||
|
1.1 Terminology
|
||||||
|
|
||||||
|
PCI devices can be single-function or multi-function. In either case,
|
||||||
|
when this text talks about enabling or disabling MSI on a "device
|
||||||
|
function," it is referring to one specific PCI device and function and
|
||||||
|
not to all functions on a PCI device (unless the PCI device has only
|
||||||
|
one function).
|
||||||
|
|
||||||
2. Copyright 2003 Intel Corporation
|
2. Copyright 2003 Intel Corporation
|
||||||
|
|
||||||
3. What is MSI/MSI-X?
|
3. What is MSI/MSI-X?
|
||||||
|
|
||||||
Message Signaled Interrupt (MSI), as described in the PCI Local Bus
|
Message Signaled Interrupt (MSI), as described in the PCI Local Bus
|
||||||
Specification Revision 2.3 or latest, is an optional feature, and a
|
Specification Revision 2.3 or later, is an optional feature, and a
|
||||||
required feature for PCI Express devices. MSI enables a device function
|
required feature for PCI Express devices. MSI enables a device function
|
||||||
to request service by sending an Inbound Memory Write on its PCI bus to
|
to request service by sending an Inbound Memory Write on its PCI bus to
|
||||||
the FSB as a Message Signal Interrupt transaction. Because MSI is
|
the FSB as a Message Signal Interrupt transaction. Because MSI is
|
||||||
|
@ -27,7 +35,7 @@ supported.
|
||||||
|
|
||||||
A PCI device that supports MSI must also support pin IRQ assertion
|
A PCI device that supports MSI must also support pin IRQ assertion
|
||||||
interrupt mechanism to provide backward compatibility for systems that
|
interrupt mechanism to provide backward compatibility for systems that
|
||||||
do not support MSI. In Systems, which support MSI, the bus driver is
|
do not support MSI. In systems which support MSI, the bus driver is
|
||||||
responsible for initializing the message address and message data of
|
responsible for initializing the message address and message data of
|
||||||
the device function's MSI/MSI-X capability structure during device
|
the device function's MSI/MSI-X capability structure during device
|
||||||
initial configuration.
|
initial configuration.
|
||||||
|
@ -61,17 +69,17 @@ over the MSI capability structure as described below.
|
||||||
|
|
||||||
- MSI and MSI-X both support per-vector masking. Per-vector
|
- MSI and MSI-X both support per-vector masking. Per-vector
|
||||||
masking is an optional extension of MSI but a required
|
masking is an optional extension of MSI but a required
|
||||||
feature for MSI-X. Per-vector masking provides the kernel
|
feature for MSI-X. Per-vector masking provides the kernel the
|
||||||
the ability to mask/unmask MSI when servicing its software
|
ability to mask/unmask a single MSI while running its
|
||||||
interrupt service routing handler. If per-vector masking is
|
interrupt service routine. If per-vector masking is
|
||||||
not supported, then the device driver should provide the
|
not supported, then the device driver should provide the
|
||||||
hardware/software synchronization to ensure that the device
|
hardware/software synchronization to ensure that the device
|
||||||
generates MSI when the driver wants it to do so.
|
generates MSI when the driver wants it to do so.
|
||||||
|
|
||||||
4. Why use MSI?
|
4. Why use MSI?
|
||||||
|
|
||||||
As a benefit the simplification of board design, MSI allows board
|
As a benefit to the simplification of board design, MSI allows board
|
||||||
designers to remove out of band interrupt routing. MSI is another
|
designers to remove out-of-band interrupt routing. MSI is another
|
||||||
step towards a legacy-free environment.
|
step towards a legacy-free environment.
|
||||||
|
|
||||||
Due to increasing pressure on chipset and processor packages to
|
Due to increasing pressure on chipset and processor packages to
|
||||||
|
@ -87,7 +95,7 @@ support. As a result, the PCI Express technology requires MSI
|
||||||
support for better interrupt performance.
|
support for better interrupt performance.
|
||||||
|
|
||||||
Using MSI enables the device functions to support two or more
|
Using MSI enables the device functions to support two or more
|
||||||
vectors, which can be configured to target different CPU's to
|
vectors, which can be configured to target different CPUs to
|
||||||
increase scalability.
|
increase scalability.
|
||||||
|
|
||||||
5. Configuring a driver to use MSI/MSI-X
|
5. Configuring a driver to use MSI/MSI-X
|
||||||
|
@ -119,13 +127,13 @@ pci_enable_msi() explicitly.
|
||||||
|
|
||||||
int pci_enable_msi(struct pci_dev *dev)
|
int pci_enable_msi(struct pci_dev *dev)
|
||||||
|
|
||||||
With this new API, any existing device driver, which like to have
|
With this new API, a device driver that wants to have MSI
|
||||||
MSI enabled on its device function, must call this API to enable MSI
|
enabled on its device function must call this API to enable MSI.
|
||||||
A successful call will initialize the MSI capability structure
|
A successful call will initialize the MSI capability structure
|
||||||
with ONE vector, regardless of whether a device function is
|
with ONE vector, regardless of whether a device function is
|
||||||
capable of supporting multiple messages. This vector replaces the
|
capable of supporting multiple messages. This vector replaces the
|
||||||
pre-assigned dev->irq with a new MSI vector. To avoid the conflict
|
pre-assigned dev->irq with a new MSI vector. To avoid a conflict
|
||||||
of new assigned vector with existing pre-assigned vector requires
|
of the new assigned vector with existing pre-assigned vector requires
|
||||||
a device driver to call this API before calling request_irq().
|
a device driver to call this API before calling request_irq().
|
||||||
|
|
||||||
5.2.2 API pci_disable_msi
|
5.2.2 API pci_disable_msi
|
||||||
|
@ -137,14 +145,14 @@ when a device driver is unloading. This API restores dev->irq with
|
||||||
the pre-assigned IOAPIC vector and switches a device's interrupt
|
the pre-assigned IOAPIC vector and switches a device's interrupt
|
||||||
mode to PCI pin-irq assertion/INTx emulation mode.
|
mode to PCI pin-irq assertion/INTx emulation mode.
|
||||||
|
|
||||||
Note that a device driver should always call free_irq() on MSI vector
|
Note that a device driver should always call free_irq() on the MSI vector
|
||||||
it has done request_irq() on before calling this API. Failure to do
|
that it has done request_irq() on before calling this API. Failure to do
|
||||||
so results a BUG_ON() and a device will be left with MSI enabled and
|
so results in a BUG_ON() and a device will be left with MSI enabled and
|
||||||
leaks its vector.
|
leaks its vector.
|
||||||
|
|
||||||
5.2.3 MSI mode vs. legacy mode diagram
|
5.2.3 MSI mode vs. legacy mode diagram
|
||||||
|
|
||||||
The below diagram shows the events, which switches the interrupt
|
The below diagram shows the events which switch the interrupt
|
||||||
mode on the MSI-capable device function between MSI mode and
|
mode on the MSI-capable device function between MSI mode and
|
||||||
PIN-IRQ assertion mode.
|
PIN-IRQ assertion mode.
|
||||||
|
|
||||||
|
@ -155,9 +163,9 @@ PIN-IRQ assertion mode.
|
||||||
------------ pci_disable_msi ------------------------
|
------------ pci_disable_msi ------------------------
|
||||||
|
|
||||||
|
|
||||||
Figure 1.0 MSI Mode vs. Legacy Mode
|
Figure 1. MSI Mode vs. Legacy Mode
|
||||||
|
|
||||||
In Figure 1.0, a device operates by default in legacy mode. Legacy
|
In Figure 1, a device operates by default in legacy mode. Legacy
|
||||||
in this context means PCI pin-irq assertion or PCI-Express INTx
|
in this context means PCI pin-irq assertion or PCI-Express INTx
|
||||||
emulation. A successful MSI request (using pci_enable_msi()) switches
|
emulation. A successful MSI request (using pci_enable_msi()) switches
|
||||||
a device's interrupt mode to MSI mode. A pre-assigned IOAPIC vector
|
a device's interrupt mode to MSI mode. A pre-assigned IOAPIC vector
|
||||||
|
@ -166,11 +174,11 @@ assigned MSI vector will replace dev->irq.
|
||||||
|
|
||||||
To return back to its default mode, a device driver should always call
|
To return back to its default mode, a device driver should always call
|
||||||
pci_disable_msi() to undo the effect of pci_enable_msi(). Note that a
|
pci_disable_msi() to undo the effect of pci_enable_msi(). Note that a
|
||||||
device driver should always call free_irq() on MSI vector it has done
|
device driver should always call free_irq() on the MSI vector it has
|
||||||
request_irq() on before calling pci_disable_msi(). Failure to do so
|
done request_irq() on before calling pci_disable_msi(). Failure to do
|
||||||
results a BUG_ON() and a device will be left with MSI enabled and
|
so results in a BUG_ON() and a device will be left with MSI enabled and
|
||||||
leaks its vector. Otherwise, the PCI subsystem restores a device's
|
leaks its vector. Otherwise, the PCI subsystem restores a device's
|
||||||
dev->irq with a pre-assigned IOAPIC vector and marks released
|
dev->irq with a pre-assigned IOAPIC vector and marks the released
|
||||||
MSI vector as unused.
|
MSI vector as unused.
|
||||||
|
|
||||||
Once being marked as unused, there is no guarantee that the PCI
|
Once being marked as unused, there is no guarantee that the PCI
|
||||||
|
@ -178,8 +186,8 @@ subsystem will reserve this MSI vector for a device. Depending on
|
||||||
the availability of current PCI vector resources and the number of
|
the availability of current PCI vector resources and the number of
|
||||||
MSI/MSI-X requests from other drivers, this MSI may be re-assigned.
|
MSI/MSI-X requests from other drivers, this MSI may be re-assigned.
|
||||||
|
|
||||||
For the case where the PCI subsystem re-assigned this MSI vector
|
For the case where the PCI subsystem re-assigns this MSI vector to
|
||||||
another driver, a request to switching back to MSI mode may result
|
another driver, a request to switch back to MSI mode may result
|
||||||
in being assigned a different MSI vector or a failure if no more
|
in being assigned a different MSI vector or a failure if no more
|
||||||
vectors are available.
|
vectors are available.
|
||||||
|
|
||||||
|
@ -208,12 +216,12 @@ Unlike the function pci_enable_msi(), the function pci_enable_msix()
|
||||||
does not replace the pre-assigned IOAPIC dev->irq with a new MSI
|
does not replace the pre-assigned IOAPIC dev->irq with a new MSI
|
||||||
vector because the PCI subsystem writes the 1:1 vector-to-entry mapping
|
vector because the PCI subsystem writes the 1:1 vector-to-entry mapping
|
||||||
into the field vector of each element contained in a second argument.
|
into the field vector of each element contained in a second argument.
|
||||||
Note that the pre-assigned IO-APIC dev->irq is valid only if the device
|
Note that the pre-assigned IOAPIC dev->irq is valid only if the device
|
||||||
operates in PIN-IRQ assertion mode. In MSI-X mode, any attempt of
|
operates in PIN-IRQ assertion mode. In MSI-X mode, any attempt at
|
||||||
using dev->irq by the device driver to request for interrupt service
|
using dev->irq by the device driver to request for interrupt service
|
||||||
may result unpredictabe behavior.
|
may result unpredictabe behavior.
|
||||||
|
|
||||||
For each MSI-X vector granted, a device driver is responsible to call
|
For each MSI-X vector granted, a device driver is responsible for calling
|
||||||
other functions like request_irq(), enable_irq(), etc. to enable
|
other functions like request_irq(), enable_irq(), etc. to enable
|
||||||
this vector with its corresponding interrupt service handler. It is
|
this vector with its corresponding interrupt service handler. It is
|
||||||
a device driver's choice to assign all vectors with the same
|
a device driver's choice to assign all vectors with the same
|
||||||
|
@ -224,13 +232,13 @@ service handler.
|
||||||
|
|
||||||
The PCI 3.0 specification has implementation notes that MMIO address
|
The PCI 3.0 specification has implementation notes that MMIO address
|
||||||
space for a device's MSI-X structure should be isolated so that the
|
space for a device's MSI-X structure should be isolated so that the
|
||||||
software system can set different page for controlling accesses to
|
software system can set different pages for controlling accesses to the
|
||||||
the MSI-X structure. The implementation of MSI patch requires the PCI
|
MSI-X structure. The implementation of MSI support requires the PCI
|
||||||
subsystem, not a device driver, to maintain full control of the MSI-X
|
subsystem, not a device driver, to maintain full control of the MSI-X
|
||||||
table/MSI-X PBA and MMIO address space of the MSI-X table/MSI-X PBA.
|
table/MSI-X PBA (Pending Bit Array) and MMIO address space of the MSI-X
|
||||||
A device driver is prohibited from requesting the MMIO address space
|
table/MSI-X PBA. A device driver is prohibited from requesting the MMIO
|
||||||
of the MSI-X table/MSI-X PBA. Otherwise, the PCI subsystem will fail
|
address space of the MSI-X table/MSI-X PBA. Otherwise, the PCI subsystem
|
||||||
enabling MSI-X on its hardware device when it calls the function
|
will fail enabling MSI-X on its hardware device when it calls the function
|
||||||
pci_enable_msix().
|
pci_enable_msix().
|
||||||
|
|
||||||
5.3.2 Handling MSI-X allocation
|
5.3.2 Handling MSI-X allocation
|
||||||
|
@ -274,9 +282,9 @@ For the case where fewer MSI-X vectors are allocated to a function
|
||||||
than requested, the function pci_enable_msix() will return the
|
than requested, the function pci_enable_msix() will return the
|
||||||
maximum number of MSI-X vectors available to the caller. A device
|
maximum number of MSI-X vectors available to the caller. A device
|
||||||
driver may re-send its request with fewer or equal vectors indicated
|
driver may re-send its request with fewer or equal vectors indicated
|
||||||
in a return. For example, if a device driver requests 5 vectors, but
|
in the return. For example, if a device driver requests 5 vectors, but
|
||||||
the number of available vectors is 3 vectors, a value of 3 will be a
|
the number of available vectors is 3 vectors, a value of 3 will be
|
||||||
return as a result of pci_enable_msix() call. A function could be
|
returned as a result of pci_enable_msix() call. A function could be
|
||||||
designed for its driver to use only 3 MSI-X table entries as
|
designed for its driver to use only 3 MSI-X table entries as
|
||||||
different combinations as ABC--, A-B-C, A--CB, etc. Note that this
|
different combinations as ABC--, A-B-C, A--CB, etc. Note that this
|
||||||
patch does not support multiple entries with the same vector. Such
|
patch does not support multiple entries with the same vector. Such
|
||||||
|
@ -285,49 +293,46 @@ as ABBCC, AABCC, BCCBA, etc will result as a failure by the function
|
||||||
pci_enable_msix(). Below are the reasons why supporting multiple
|
pci_enable_msix(). Below are the reasons why supporting multiple
|
||||||
entries with the same vector is an undesirable solution.
|
entries with the same vector is an undesirable solution.
|
||||||
|
|
||||||
- The PCI subsystem can not determine which entry, which
|
- The PCI subsystem cannot determine the entry that
|
||||||
generated the message, to mask/unmask MSI while handling
|
generated the message to mask/unmask MSI while handling
|
||||||
software driver ISR. Attempting to walk through all MSI-X
|
software driver ISR. Attempting to walk through all MSI-X
|
||||||
table entries (2048 max) to mask/unmask any match vector
|
table entries (2048 max) to mask/unmask any match vector
|
||||||
is an undesirable solution.
|
is an undesirable solution.
|
||||||
|
|
||||||
- Walk through all MSI-X table entries (2048 max) to handle
|
- Walking through all MSI-X table entries (2048 max) to handle
|
||||||
SMP affinity of any match vector is an undesirable solution.
|
SMP affinity of any match vector is an undesirable solution.
|
||||||
|
|
||||||
5.3.4 API pci_enable_msix
|
5.3.4 API pci_enable_msix
|
||||||
|
|
||||||
int pci_enable_msix(struct pci_dev *dev, u32 *entries, int nvec)
|
int pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries, int nvec)
|
||||||
|
|
||||||
This API enables a device driver to request the PCI subsystem
|
This API enables a device driver to request the PCI subsystem
|
||||||
for enabling MSI-X messages on its hardware device. Depending on
|
to enable MSI-X messages on its hardware device. Depending on
|
||||||
the availability of PCI vectors resources, the PCI subsystem enables
|
the availability of PCI vectors resources, the PCI subsystem enables
|
||||||
either all or nothing.
|
either all or none of the requested vectors.
|
||||||
|
|
||||||
Argument dev points to the device (pci_dev) structure.
|
Argument 'dev' points to the device (pci_dev) structure.
|
||||||
|
|
||||||
Argument entries is a pointer of unsigned integer type. The number of
|
Argument 'entries' is a pointer to an array of msix_entry structs.
|
||||||
elements is indicated in argument nvec. The content of each element
|
The number of entries is indicated in argument 'nvec'.
|
||||||
will be mapped to the following struct defined in /driver/pci/msi.h.
|
struct msix_entry is defined in /driver/pci/msi.h:
|
||||||
|
|
||||||
struct msix_entry {
|
struct msix_entry {
|
||||||
u16 vector; /* kernel uses to write alloc vector */
|
u16 vector; /* kernel uses to write alloc vector */
|
||||||
u16 entry; /* driver uses to specify entry */
|
u16 entry; /* driver uses to specify entry */
|
||||||
};
|
};
|
||||||
|
|
||||||
A device driver is responsible for initializing the field entry of
|
A device driver is responsible for initializing the field 'entry' of
|
||||||
each element with unique entry supported by MSI-X table. Otherwise,
|
each element with a unique entry supported by MSI-X table. Otherwise,
|
||||||
-EINVAL will be returned as a result. A successful return of zero
|
-EINVAL will be returned as a result. A successful return of zero
|
||||||
indicates the PCI subsystem completes initializing each of requested
|
indicates the PCI subsystem completed initializing each of the requested
|
||||||
entries of the MSI-X table with message address and message data.
|
entries of the MSI-X table with message address and message data.
|
||||||
Last but not least, the PCI subsystem will write the 1:1
|
Last but not least, the PCI subsystem will write the 1:1
|
||||||
vector-to-entry mapping into the field vector of each element. A
|
vector-to-entry mapping into the field 'vector' of each element. A
|
||||||
device driver is responsible of keeping track of allocated MSI-X
|
device driver is responsible for keeping track of allocated MSI-X
|
||||||
vectors in its internal data structure.
|
vectors in its internal data structure.
|
||||||
|
|
||||||
Argument nvec is an integer indicating the number of messages
|
A return of zero indicates that the number of MSI-X vectors was
|
||||||
requested.
|
|
||||||
|
|
||||||
A return of zero indicates that the number of MSI-X vectors is
|
|
||||||
successfully allocated. A return of greater than zero indicates
|
successfully allocated. A return of greater than zero indicates
|
||||||
MSI-X vector shortage. Or a return of less than zero indicates
|
MSI-X vector shortage. Or a return of less than zero indicates
|
||||||
a failure. This failure may be a result of duplicate entries
|
a failure. This failure may be a result of duplicate entries
|
||||||
|
@ -341,12 +346,12 @@ void pci_disable_msix(struct pci_dev *dev)
|
||||||
This API should always be used to undo the effect of pci_enable_msix()
|
This API should always be used to undo the effect of pci_enable_msix()
|
||||||
when a device driver is unloading. Note that a device driver should
|
when a device driver is unloading. Note that a device driver should
|
||||||
always call free_irq() on all MSI-X vectors it has done request_irq()
|
always call free_irq() on all MSI-X vectors it has done request_irq()
|
||||||
on before calling this API. Failure to do so results a BUG_ON() and
|
on before calling this API. Failure to do so results in a BUG_ON() and
|
||||||
a device will be left with MSI-X enabled and leaks its vectors.
|
a device will be left with MSI-X enabled and leaks its vectors.
|
||||||
|
|
||||||
5.3.6 MSI-X mode vs. legacy mode diagram
|
5.3.6 MSI-X mode vs. legacy mode diagram
|
||||||
|
|
||||||
The below diagram shows the events, which switches the interrupt
|
The below diagram shows the events which switch the interrupt
|
||||||
mode on the MSI-X capable device function between MSI-X mode and
|
mode on the MSI-X capable device function between MSI-X mode and
|
||||||
PIN-IRQ assertion mode (legacy).
|
PIN-IRQ assertion mode (legacy).
|
||||||
|
|
||||||
|
@ -356,22 +361,22 @@ PIN-IRQ assertion mode (legacy).
|
||||||
| | ===============> | |
|
| | ===============> | |
|
||||||
------------ pci_disable_msix ------------------------
|
------------ pci_disable_msix ------------------------
|
||||||
|
|
||||||
Figure 2.0 MSI-X Mode vs. Legacy Mode
|
Figure 2. MSI-X Mode vs. Legacy Mode
|
||||||
|
|
||||||
In Figure 2.0, a device operates by default in legacy mode. A
|
In Figure 2, a device operates by default in legacy mode. A
|
||||||
successful MSI-X request (using pci_enable_msix()) switches a
|
successful MSI-X request (using pci_enable_msix()) switches a
|
||||||
device's interrupt mode to MSI-X mode. A pre-assigned IOAPIC vector
|
device's interrupt mode to MSI-X mode. A pre-assigned IOAPIC vector
|
||||||
stored in dev->irq will be saved by the PCI subsystem; however,
|
stored in dev->irq will be saved by the PCI subsystem; however,
|
||||||
unlike MSI mode, the PCI subsystem will not replace dev->irq with
|
unlike MSI mode, the PCI subsystem will not replace dev->irq with
|
||||||
assigned MSI-X vector because the PCI subsystem already writes the 1:1
|
assigned MSI-X vector because the PCI subsystem already writes the 1:1
|
||||||
vector-to-entry mapping into the field vector of each element
|
vector-to-entry mapping into the field 'vector' of each element
|
||||||
specified in second argument.
|
specified in second argument.
|
||||||
|
|
||||||
To return back to its default mode, a device driver should always call
|
To return back to its default mode, a device driver should always call
|
||||||
pci_disable_msix() to undo the effect of pci_enable_msix(). Note that
|
pci_disable_msix() to undo the effect of pci_enable_msix(). Note that
|
||||||
a device driver should always call free_irq() on all MSI-X vectors it
|
a device driver should always call free_irq() on all MSI-X vectors it
|
||||||
has done request_irq() on before calling pci_disable_msix(). Failure
|
has done request_irq() on before calling pci_disable_msix(). Failure
|
||||||
to do so results a BUG_ON() and a device will be left with MSI-X
|
to do so results in a BUG_ON() and a device will be left with MSI-X
|
||||||
enabled and leaks its vectors. Otherwise, the PCI subsystem switches a
|
enabled and leaks its vectors. Otherwise, the PCI subsystem switches a
|
||||||
device function's interrupt mode from MSI-X mode to legacy mode and
|
device function's interrupt mode from MSI-X mode to legacy mode and
|
||||||
marks all allocated MSI-X vectors as unused.
|
marks all allocated MSI-X vectors as unused.
|
||||||
|
@ -383,53 +388,56 @@ MSI/MSI-X requests from other drivers, these MSI-X vectors may be
|
||||||
re-assigned.
|
re-assigned.
|
||||||
|
|
||||||
For the case where the PCI subsystem re-assigned these MSI-X vectors
|
For the case where the PCI subsystem re-assigned these MSI-X vectors
|
||||||
to other driver, a request to switching back to MSI-X mode may result
|
to other drivers, a request to switch back to MSI-X mode may result
|
||||||
being assigned with another set of MSI-X vectors or a failure if no
|
being assigned with another set of MSI-X vectors or a failure if no
|
||||||
more vectors are available.
|
more vectors are available.
|
||||||
|
|
||||||
5.4 Handling function implementng both MSI and MSI-X capabilities
|
5.4 Handling function implementing both MSI and MSI-X capabilities
|
||||||
|
|
||||||
For the case where a function implements both MSI and MSI-X
|
For the case where a function implements both MSI and MSI-X
|
||||||
capabilities, the PCI subsystem enables a device to run either in MSI
|
capabilities, the PCI subsystem enables a device to run either in MSI
|
||||||
mode or MSI-X mode but not both. A device driver determines whether it
|
mode or MSI-X mode but not both. A device driver determines whether it
|
||||||
wants MSI or MSI-X enabled on its hardware device. Once a device
|
wants MSI or MSI-X enabled on its hardware device. Once a device
|
||||||
driver requests for MSI, for example, it is prohibited to request for
|
driver requests for MSI, for example, it is prohibited from requesting
|
||||||
MSI-X; in other words, a device driver is not permitted to ping-pong
|
MSI-X; in other words, a device driver is not permitted to ping-pong
|
||||||
between MSI mod MSI-X mode during a run-time.
|
between MSI mod MSI-X mode during a run-time.
|
||||||
|
|
||||||
5.5 Hardware requirements for MSI/MSI-X support
|
5.5 Hardware requirements for MSI/MSI-X support
|
||||||
|
|
||||||
MSI/MSI-X support requires support from both system hardware and
|
MSI/MSI-X support requires support from both system hardware and
|
||||||
individual hardware device functions.
|
individual hardware device functions.
|
||||||
|
|
||||||
5.5.1 System hardware support
|
5.5.1 System hardware support
|
||||||
|
|
||||||
Since the target of MSI address is the local APIC CPU, enabling
|
Since the target of MSI address is the local APIC CPU, enabling
|
||||||
MSI/MSI-X support in Linux kernel is dependent on whether existing
|
MSI/MSI-X support in the Linux kernel is dependent on whether existing
|
||||||
system hardware supports local APIC. Users should verify their
|
system hardware supports local APIC. Users should verify that their
|
||||||
system whether it runs when CONFIG_X86_LOCAL_APIC=y.
|
system supports local APIC operation by testing that it runs when
|
||||||
|
CONFIG_X86_LOCAL_APIC=y.
|
||||||
|
|
||||||
In SMP environment, CONFIG_X86_LOCAL_APIC is automatically set;
|
In SMP environment, CONFIG_X86_LOCAL_APIC is automatically set;
|
||||||
however, in UP environment, users must manually set
|
however, in UP environment, users must manually set
|
||||||
CONFIG_X86_LOCAL_APIC. Once CONFIG_X86_LOCAL_APIC=y, setting
|
CONFIG_X86_LOCAL_APIC. Once CONFIG_X86_LOCAL_APIC=y, setting
|
||||||
CONFIG_PCI_MSI enables the VECTOR based scheme and
|
CONFIG_PCI_MSI enables the VECTOR based scheme and the option for
|
||||||
the option for MSI-capable device drivers to selectively enable
|
MSI-capable device drivers to selectively enable MSI/MSI-X.
|
||||||
MSI/MSI-X.
|
|
||||||
|
|
||||||
Note that CONFIG_X86_IO_APIC setting is irrelevant because MSI/MSI-X
|
Note that CONFIG_X86_IO_APIC setting is irrelevant because MSI/MSI-X
|
||||||
vector is allocated new during runtime and MSI/MSI-X support does not
|
vector is allocated new during runtime and MSI/MSI-X support does not
|
||||||
depend on BIOS support. This key independency enables MSI/MSI-X
|
depend on BIOS support. This key independency enables MSI/MSI-X
|
||||||
support on future IOxAPIC free platform.
|
support on future IOxAPIC free platforms.
|
||||||
|
|
||||||
5.5.2 Device hardware support
|
5.5.2 Device hardware support
|
||||||
|
|
||||||
The hardware device function supports MSI by indicating the
|
The hardware device function supports MSI by indicating the
|
||||||
MSI/MSI-X capability structure on its PCI capability list. By
|
MSI/MSI-X capability structure on its PCI capability list. By
|
||||||
default, this capability structure will not be initialized by
|
default, this capability structure will not be initialized by
|
||||||
the kernel to enable MSI during the system boot. In other words,
|
the kernel to enable MSI during the system boot. In other words,
|
||||||
the device function is running on its default pin assertion mode.
|
the device function is running on its default pin assertion mode.
|
||||||
Note that in many cases the hardware supporting MSI have bugs,
|
Note that in many cases the hardware supporting MSI have bugs,
|
||||||
which may result in system hang. The software driver of specific
|
which may result in system hangs. The software driver of specific
|
||||||
MSI-capable hardware is responsible for whether calling
|
MSI-capable hardware is responsible for deciding whether to call
|
||||||
pci_enable_msi or not. A return of zero indicates the kernel
|
pci_enable_msi or not. A return of zero indicates the kernel
|
||||||
successfully initializes the MSI/MSI-X capability structure of the
|
successfully initialized the MSI/MSI-X capability structure of the
|
||||||
device function. The device function is now running on MSI/MSI-X mode.
|
device function. The device function is now running on MSI/MSI-X mode.
|
||||||
|
|
||||||
5.6 How to tell whether MSI/MSI-X is enabled on device function
|
5.6 How to tell whether MSI/MSI-X is enabled on device function
|
||||||
|
@ -439,10 +447,10 @@ pci_enable_msi()/pci_enable_msix() indicates to a device driver that
|
||||||
its device function is initialized successfully and ready to run in
|
its device function is initialized successfully and ready to run in
|
||||||
MSI/MSI-X mode.
|
MSI/MSI-X mode.
|
||||||
|
|
||||||
At the user level, users can use command 'cat /proc/interrupts'
|
At the user level, users can use the command 'cat /proc/interrupts'
|
||||||
to display the vector allocated for a device and its interrupt
|
to display the vectors allocated for devices and their interrupt
|
||||||
MSI/MSI-X mode ("PCI MSI"/"PCI MSIX"). Below shows below MSI mode is
|
MSI/MSI-X modes ("PCI-MSI"/"PCI-MSI-X"). Below shows MSI mode is
|
||||||
enabled on a SCSI Adaptec 39320D Ultra320.
|
enabled on a SCSI Adaptec 39320D Ultra320 controller.
|
||||||
|
|
||||||
CPU0 CPU1
|
CPU0 CPU1
|
||||||
0: 324639 0 IO-APIC-edge timer
|
0: 324639 0 IO-APIC-edge timer
|
||||||
|
@ -453,8 +461,8 @@ enabled on a SCSI Adaptec 39320D Ultra320.
|
||||||
15: 1 0 IO-APIC-edge ide1
|
15: 1 0 IO-APIC-edge ide1
|
||||||
169: 0 0 IO-APIC-level uhci-hcd
|
169: 0 0 IO-APIC-level uhci-hcd
|
||||||
185: 0 0 IO-APIC-level uhci-hcd
|
185: 0 0 IO-APIC-level uhci-hcd
|
||||||
193: 138 10 PCI MSI aic79xx
|
193: 138 10 PCI-MSI aic79xx
|
||||||
201: 30 0 PCI MSI aic79xx
|
201: 30 0 PCI-MSI aic79xx
|
||||||
225: 30 0 IO-APIC-level aic7xxx
|
225: 30 0 IO-APIC-level aic7xxx
|
||||||
233: 30 0 IO-APIC-level aic7xxx
|
233: 30 0 IO-APIC-level aic7xxx
|
||||||
NMI: 0 0
|
NMI: 0 0
|
||||||
|
@ -490,8 +498,8 @@ target address set as 0xfeexxxxx, as conformed to PCI
|
||||||
specification 2.3 or latest, then it should work.
|
specification 2.3 or latest, then it should work.
|
||||||
|
|
||||||
Q4. From the driver point of view, if the MSI is lost because
|
Q4. From the driver point of view, if the MSI is lost because
|
||||||
of the errors occur during inbound memory write, then it may
|
of errors occurring during inbound memory write, then it may
|
||||||
wait for ever. Is there a mechanism for it to recover?
|
wait forever. Is there a mechanism for it to recover?
|
||||||
|
|
||||||
A4. Since the target of the transaction is an inbound memory
|
A4. Since the target of the transaction is an inbound memory
|
||||||
write, all transaction termination conditions (Retry,
|
write, all transaction termination conditions (Retry,
|
||||||
|
|
|
@ -772,8 +772,6 @@ RCU pointer/list traversal:
|
||||||
list_for_each_entry_rcu
|
list_for_each_entry_rcu
|
||||||
list_for_each_continue_rcu (to be deprecated in favor of new
|
list_for_each_continue_rcu (to be deprecated in favor of new
|
||||||
list_for_each_entry_continue_rcu)
|
list_for_each_entry_continue_rcu)
|
||||||
hlist_for_each_rcu (to be deprecated in favor of
|
|
||||||
hlist_for_each_entry_rcu)
|
|
||||||
hlist_for_each_entry_rcu
|
hlist_for_each_entry_rcu
|
||||||
|
|
||||||
RCU pointer update:
|
RCU pointer update:
|
||||||
|
|
|
@ -8,10 +8,9 @@ Compilation of kernel
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
In order to compile ARM Linux, you will need a compiler capable of
|
In order to compile ARM Linux, you will need a compiler capable of
|
||||||
generating ARM ELF code with GNU extensions. GCC 2.95.1, EGCS
|
generating ARM ELF code with GNU extensions. GCC 3.3 is known to be
|
||||||
1.1.2, and GCC 3.3 are known to be good compilers. Fortunately, you
|
a good compiler. Fortunately, you needn't guess. The kernel will report
|
||||||
needn't guess. The kernel will report an error if your compiler is
|
an error if your compiler is a recognized offender.
|
||||||
a recognized offender.
|
|
||||||
|
|
||||||
To build ARM Linux natively, you shouldn't have to alter the ARCH = line
|
To build ARM Linux natively, you shouldn't have to alter the ARCH = line
|
||||||
in the top level Makefile. However, if you don't have the ARM Linux ELF
|
in the top level Makefile. However, if you don't have the ARM Linux ELF
|
||||||
|
|
|
@ -19,7 +19,6 @@ There are two dm targets available: snapshot and snapshot-origin.
|
||||||
*) snapshot-origin <origin>
|
*) snapshot-origin <origin>
|
||||||
|
|
||||||
which will normally have one or more snapshots based on it.
|
which will normally have one or more snapshots based on it.
|
||||||
You must create the snapshot-origin device before you can create snapshots.
|
|
||||||
Reads will be mapped directly to the backing device. For each write, the
|
Reads will be mapped directly to the backing device. For each write, the
|
||||||
original data will be saved in the <COW device> of each snapshot to keep
|
original data will be saved in the <COW device> of each snapshot to keep
|
||||||
its visible content unchanged, at least until the <COW device> fills up.
|
its visible content unchanged, at least until the <COW device> fills up.
|
||||||
|
@ -27,7 +26,7 @@ its visible content unchanged, at least until the <COW device> fills up.
|
||||||
|
|
||||||
*) snapshot <origin> <COW device> <persistent?> <chunksize>
|
*) snapshot <origin> <COW device> <persistent?> <chunksize>
|
||||||
|
|
||||||
A snapshot is created of the <origin> block device. Changed chunks of
|
A snapshot of the <origin> block device is created. Changed chunks of
|
||||||
<chunksize> sectors will be stored on the <COW device>. Writes will
|
<chunksize> sectors will be stored on the <COW device>. Writes will
|
||||||
only go to the <COW device>. Reads will come from the <COW device> or
|
only go to the <COW device>. Reads will come from the <COW device> or
|
||||||
from <origin> for unchanged data. <COW device> will often be
|
from <origin> for unchanged data. <COW device> will often be
|
||||||
|
@ -37,6 +36,8 @@ the amount of free space and expand the <COW device> before it fills up.
|
||||||
|
|
||||||
<persistent?> is P (Persistent) or N (Not persistent - will not survive
|
<persistent?> is P (Persistent) or N (Not persistent - will not survive
|
||||||
after reboot).
|
after reboot).
|
||||||
|
The difference is that for transient snapshots less metadata must be
|
||||||
|
saved on disk - they can be kept in memory by the kernel.
|
||||||
|
|
||||||
|
|
||||||
How this is used by LVM2
|
How this is used by LVM2
|
||||||
|
|
|
@ -146,10 +146,10 @@ pmipal Use the protected mode interface for palette changes.
|
||||||
|
|
||||||
mtrr:n setup memory type range registers for the vesafb framebuffer
|
mtrr:n setup memory type range registers for the vesafb framebuffer
|
||||||
where n:
|
where n:
|
||||||
0 - disabled (equivalent to nomtrr)
|
0 - disabled (equivalent to nomtrr) (default)
|
||||||
1 - uncachable
|
1 - uncachable
|
||||||
2 - write-back
|
2 - write-back
|
||||||
3 - write-combining (default)
|
3 - write-combining
|
||||||
4 - write-through
|
4 - write-through
|
||||||
|
|
||||||
If you see the following in dmesg, choose the type that matches the
|
If you see the following in dmesg, choose the type that matches the
|
||||||
|
|
|
@ -69,6 +69,22 @@ Who: Grant Coady <gcoady@gmail.com>
|
||||||
|
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
|
What: remove EXPORT_SYMBOL(panic_timeout)
|
||||||
|
When: April 2006
|
||||||
|
Files: kernel/panic.c
|
||||||
|
Why: No modular usage in the kernel.
|
||||||
|
Who: Adrian Bunk <bunk@stusta.de>
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
What: remove EXPORT_SYMBOL(insert_resource)
|
||||||
|
When: April 2006
|
||||||
|
Files: kernel/resource.c
|
||||||
|
Why: No modular usage in the kernel.
|
||||||
|
Who: Adrian Bunk <bunk@stusta.de>
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
|
||||||
What: PCMCIA control ioctl (needed for pcmcia-cs [cardmgr, cardctl])
|
What: PCMCIA control ioctl (needed for pcmcia-cs [cardmgr, cardctl])
|
||||||
When: November 2005
|
When: November 2005
|
||||||
Files: drivers/pcmcia/: pcmcia_ioctl.c
|
Files: drivers/pcmcia/: pcmcia_ioctl.c
|
||||||
|
|
173
Documentation/filesystems/dentry-locking.txt
Normal file
173
Documentation/filesystems/dentry-locking.txt
Normal file
|
@ -0,0 +1,173 @@
|
||||||
|
RCU-based dcache locking model
|
||||||
|
==============================
|
||||||
|
|
||||||
|
On many workloads, the most common operation on dcache is to look up a
|
||||||
|
dentry, given a parent dentry and the name of the child. Typically,
|
||||||
|
for every open(), stat() etc., the dentry corresponding to the
|
||||||
|
pathname will be looked up by walking the tree starting with the first
|
||||||
|
component of the pathname and using that dentry along with the next
|
||||||
|
component to look up the next level and so on. Since it is a frequent
|
||||||
|
operation for workloads like multiuser environments and web servers,
|
||||||
|
it is important to optimize this path.
|
||||||
|
|
||||||
|
Prior to 2.5.10, dcache_lock was acquired in d_lookup and thus in
|
||||||
|
every component during path look-up. Since 2.5.10 onwards, fast-walk
|
||||||
|
algorithm changed this by holding the dcache_lock at the beginning and
|
||||||
|
walking as many cached path component dentries as possible. This
|
||||||
|
significantly decreases the number of acquisition of
|
||||||
|
dcache_lock. However it also increases the lock hold time
|
||||||
|
significantly and affects performance in large SMP machines. Since
|
||||||
|
2.5.62 kernel, dcache has been using a new locking model that uses RCU
|
||||||
|
to make dcache look-up lock-free.
|
||||||
|
|
||||||
|
The current dcache locking model is not very different from the
|
||||||
|
existing dcache locking model. Prior to 2.5.62 kernel, dcache_lock
|
||||||
|
protected the hash chain, d_child, d_alias, d_lru lists as well as
|
||||||
|
d_inode and several other things like mount look-up. RCU-based changes
|
||||||
|
affect only the way the hash chain is protected. For everything else
|
||||||
|
the dcache_lock must be taken for both traversing as well as
|
||||||
|
updating. The hash chain updates too take the dcache_lock. The
|
||||||
|
significant change is the way d_lookup traverses the hash chain, it
|
||||||
|
doesn't acquire the dcache_lock for this and rely on RCU to ensure
|
||||||
|
that the dentry has not been *freed*.
|
||||||
|
|
||||||
|
|
||||||
|
Dcache locking details
|
||||||
|
======================
|
||||||
|
|
||||||
|
For many multi-user workloads, open() and stat() on files are very
|
||||||
|
frequently occurring operations. Both involve walking of path names to
|
||||||
|
find the dentry corresponding to the concerned file. In 2.4 kernel,
|
||||||
|
dcache_lock was held during look-up of each path component. Contention
|
||||||
|
and cache-line bouncing of this global lock caused significant
|
||||||
|
scalability problems. With the introduction of RCU in Linux kernel,
|
||||||
|
this was worked around by making the look-up of path components during
|
||||||
|
path walking lock-free.
|
||||||
|
|
||||||
|
|
||||||
|
Safe lock-free look-up of dcache hash table
|
||||||
|
===========================================
|
||||||
|
|
||||||
|
Dcache is a complex data structure with the hash table entries also
|
||||||
|
linked together in other lists. In 2.4 kernel, dcache_lock protected
|
||||||
|
all the lists. We applied RCU only on hash chain walking. The rest of
|
||||||
|
the lists are still protected by dcache_lock. Some of the important
|
||||||
|
changes are :
|
||||||
|
|
||||||
|
1. The deletion from hash chain is done using hlist_del_rcu() macro
|
||||||
|
which doesn't initialize next pointer of the deleted dentry and
|
||||||
|
this allows us to walk safely lock-free while a deletion is
|
||||||
|
happening.
|
||||||
|
|
||||||
|
2. Insertion of a dentry into the hash table is done using
|
||||||
|
hlist_add_head_rcu() which take care of ordering the writes - the
|
||||||
|
writes to the dentry must be visible before the dentry is
|
||||||
|
inserted. This works in conjunction with hlist_for_each_rcu() while
|
||||||
|
walking the hash chain. The only requirement is that all
|
||||||
|
initialization to the dentry must be done before
|
||||||
|
hlist_add_head_rcu() since we don't have dcache_lock protection
|
||||||
|
while traversing the hash chain. This isn't different from the
|
||||||
|
existing code.
|
||||||
|
|
||||||
|
3. The dentry looked up without holding dcache_lock by cannot be
|
||||||
|
returned for walking if it is unhashed. It then may have a NULL
|
||||||
|
d_inode or other bogosity since RCU doesn't protect the other
|
||||||
|
fields in the dentry. We therefore use a flag DCACHE_UNHASHED to
|
||||||
|
indicate unhashed dentries and use this in conjunction with a
|
||||||
|
per-dentry lock (d_lock). Once looked up without the dcache_lock,
|
||||||
|
we acquire the per-dentry lock (d_lock) and check if the dentry is
|
||||||
|
unhashed. If so, the look-up is failed. If not, the reference count
|
||||||
|
of the dentry is increased and the dentry is returned.
|
||||||
|
|
||||||
|
4. Once a dentry is looked up, it must be ensured during the path walk
|
||||||
|
for that component it doesn't go away. In pre-2.5.10 code, this was
|
||||||
|
done holding a reference to the dentry. dcache_rcu does the same.
|
||||||
|
In some sense, dcache_rcu path walking looks like the pre-2.5.10
|
||||||
|
version.
|
||||||
|
|
||||||
|
5. All dentry hash chain updates must take the dcache_lock as well as
|
||||||
|
the per-dentry lock in that order. dput() does this to ensure that
|
||||||
|
a dentry that has just been looked up in another CPU doesn't get
|
||||||
|
deleted before dget() can be done on it.
|
||||||
|
|
||||||
|
6. There are several ways to do reference counting of RCU protected
|
||||||
|
objects. One such example is in ipv4 route cache where deferred
|
||||||
|
freeing (using call_rcu()) is done as soon as the reference count
|
||||||
|
goes to zero. This cannot be done in the case of dentries because
|
||||||
|
tearing down of dentries require blocking (dentry_iput()) which
|
||||||
|
isn't supported from RCU callbacks. Instead, tearing down of
|
||||||
|
dentries happen synchronously in dput(), but actual freeing happens
|
||||||
|
later when RCU grace period is over. This allows safe lock-free
|
||||||
|
walking of the hash chains, but a matched dentry may have been
|
||||||
|
partially torn down. The checking of DCACHE_UNHASHED flag with
|
||||||
|
d_lock held detects such dentries and prevents them from being
|
||||||
|
returned from look-up.
|
||||||
|
|
||||||
|
|
||||||
|
Maintaining POSIX rename semantics
|
||||||
|
==================================
|
||||||
|
|
||||||
|
Since look-up of dentries is lock-free, it can race against a
|
||||||
|
concurrent rename operation. For example, during rename of file A to
|
||||||
|
B, look-up of either A or B must succeed. So, if look-up of B happens
|
||||||
|
after A has been removed from the hash chain but not added to the new
|
||||||
|
hash chain, it may fail. Also, a comparison while the name is being
|
||||||
|
written concurrently by a rename may result in false positive matches
|
||||||
|
violating rename semantics. Issues related to race with rename are
|
||||||
|
handled as described below :
|
||||||
|
|
||||||
|
1. Look-up can be done in two ways - d_lookup() which is safe from
|
||||||
|
simultaneous renames and __d_lookup() which is not. If
|
||||||
|
__d_lookup() fails, it must be followed up by a d_lookup() to
|
||||||
|
correctly determine whether a dentry is in the hash table or
|
||||||
|
not. d_lookup() protects look-ups using a sequence lock
|
||||||
|
(rename_lock).
|
||||||
|
|
||||||
|
2. The name associated with a dentry (d_name) may be changed if a
|
||||||
|
rename is allowed to happen simultaneously. To avoid memcmp() in
|
||||||
|
__d_lookup() go out of bounds due to a rename and false positive
|
||||||
|
comparison, the name comparison is done while holding the
|
||||||
|
per-dentry lock. This prevents concurrent renames during this
|
||||||
|
operation.
|
||||||
|
|
||||||
|
3. Hash table walking during look-up may move to a different bucket as
|
||||||
|
the current dentry is moved to a different bucket due to rename.
|
||||||
|
But we use hlists in dcache hash table and they are
|
||||||
|
null-terminated. So, even if a dentry moves to a different bucket,
|
||||||
|
hash chain walk will terminate. [with a list_head list, it may not
|
||||||
|
since termination is when the list_head in the original bucket is
|
||||||
|
reached]. Since we redo the d_parent check and compare name while
|
||||||
|
holding d_lock, lock-free look-up will not race against d_move().
|
||||||
|
|
||||||
|
4. There can be a theoretical race when a dentry keeps coming back to
|
||||||
|
original bucket due to double moves. Due to this look-up may
|
||||||
|
consider that it has never moved and can end up in a infinite loop.
|
||||||
|
But this is not any worse that theoretical livelocks we already
|
||||||
|
have in the kernel.
|
||||||
|
|
||||||
|
|
||||||
|
Important guidelines for filesystem developers related to dcache_rcu
|
||||||
|
====================================================================
|
||||||
|
|
||||||
|
1. Existing dcache interfaces (pre-2.5.62) exported to filesystem
|
||||||
|
don't change. Only dcache internal implementation changes. However
|
||||||
|
filesystems *must not* delete from the dentry hash chains directly
|
||||||
|
using the list macros like allowed earlier. They must use dcache
|
||||||
|
APIs like d_drop() or __d_drop() depending on the situation.
|
||||||
|
|
||||||
|
2. d_flags is now protected by a per-dentry lock (d_lock). All access
|
||||||
|
to d_flags must be protected by it.
|
||||||
|
|
||||||
|
3. For a hashed dentry, checking of d_count needs to be protected by
|
||||||
|
d_lock.
|
||||||
|
|
||||||
|
|
||||||
|
Papers and other documentation on dcache locking
|
||||||
|
================================================
|
||||||
|
|
||||||
|
1. Scaling dcache with RCU (http://linuxjournal.com/article.php?sid=7124).
|
||||||
|
|
||||||
|
2. http://lse.sourceforge.net/locking/dcache/dcache.html
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1812,11 +1812,6 @@ it may overflow the messages buffer, but try to get as much of it as
|
||||||
you can
|
you can
|
||||||
|
|
||||||
|
|
||||||
if you get an Oops, run ksymoops to decode it so that the
|
|
||||||
names of the offending functions are provided. A non-decoded Oops is
|
|
||||||
pretty useless
|
|
||||||
|
|
||||||
|
|
||||||
send a copy of your devfsd configuration file(s)
|
send a copy of your devfsd configuration file(s)
|
||||||
|
|
||||||
send the bug report to me first.
|
send the bug report to me first.
|
||||||
|
|
195
Documentation/filesystems/ramfs-rootfs-initramfs.txt
Normal file
195
Documentation/filesystems/ramfs-rootfs-initramfs.txt
Normal file
|
@ -0,0 +1,195 @@
|
||||||
|
ramfs, rootfs and initramfs
|
||||||
|
October 17, 2005
|
||||||
|
Rob Landley <rob@landley.net>
|
||||||
|
=============================
|
||||||
|
|
||||||
|
What is ramfs?
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Ramfs is a very simple filesystem that exports Linux's disk caching
|
||||||
|
mechanisms (the page cache and dentry cache) as a dynamically resizable
|
||||||
|
ram-based filesystem.
|
||||||
|
|
||||||
|
Normally all files are cached in memory by Linux. Pages of data read from
|
||||||
|
backing store (usually the block device the filesystem is mounted on) are kept
|
||||||
|
around in case it's needed again, but marked as clean (freeable) in case the
|
||||||
|
Virtual Memory system needs the memory for something else. Similarly, data
|
||||||
|
written to files is marked clean as soon as it has been written to backing
|
||||||
|
store, but kept around for caching purposes until the VM reallocates the
|
||||||
|
memory. A similar mechanism (the dentry cache) greatly speeds up access to
|
||||||
|
directories.
|
||||||
|
|
||||||
|
With ramfs, there is no backing store. Files written into ramfs allocate
|
||||||
|
dentries and page cache as usual, but there's nowhere to write them to.
|
||||||
|
This means the pages are never marked clean, so they can't be freed by the
|
||||||
|
VM when it's looking to recycle memory.
|
||||||
|
|
||||||
|
The amount of code required to implement ramfs is tiny, because all the
|
||||||
|
work is done by the existing Linux caching infrastructure. Basically,
|
||||||
|
you're mounting the disk cache as a filesystem. Because of this, ramfs is not
|
||||||
|
an optional component removable via menuconfig, since there would be negligible
|
||||||
|
space savings.
|
||||||
|
|
||||||
|
ramfs and ramdisk:
|
||||||
|
------------------
|
||||||
|
|
||||||
|
The older "ram disk" mechanism created a synthetic block device out of
|
||||||
|
an area of ram and used it as backing store for a filesystem. This block
|
||||||
|
device was of fixed size, so the filesystem mounted on it was of fixed
|
||||||
|
size. Using a ram disk also required unnecessarily copying memory from the
|
||||||
|
fake block device into the page cache (and copying changes back out), as well
|
||||||
|
as creating and destroying dentries. Plus it needed a filesystem driver
|
||||||
|
(such as ext2) to format and interpret this data.
|
||||||
|
|
||||||
|
Compared to ramfs, this wastes memory (and memory bus bandwidth), creates
|
||||||
|
unnecessary work for the CPU, and pollutes the CPU caches. (There are tricks
|
||||||
|
to avoid this copying by playing with the page tables, but they're unpleasantly
|
||||||
|
complicated and turn out to be about as expensive as the copying anyway.)
|
||||||
|
More to the point, all the work ramfs is doing has to happen _anyway_,
|
||||||
|
since all file access goes through the page and dentry caches. The ram
|
||||||
|
disk is simply unnecessary, ramfs is internally much simpler.
|
||||||
|
|
||||||
|
Another reason ramdisks are semi-obsolete is that the introduction of
|
||||||
|
loopback devices offered a more flexible and convenient way to create
|
||||||
|
synthetic block devices, now from files instead of from chunks of memory.
|
||||||
|
See losetup (8) for details.
|
||||||
|
|
||||||
|
ramfs and tmpfs:
|
||||||
|
----------------
|
||||||
|
|
||||||
|
One downside of ramfs is you can keep writing data into it until you fill
|
||||||
|
up all memory, and the VM can't free it because the VM thinks that files
|
||||||
|
should get written to backing store (rather than swap space), but ramfs hasn't
|
||||||
|
got any backing store. Because of this, only root (or a trusted user) should
|
||||||
|
be allowed write access to a ramfs mount.
|
||||||
|
|
||||||
|
A ramfs derivative called tmpfs was created to add size limits, and the ability
|
||||||
|
to write the data to swap space. Normal users can be allowed write access to
|
||||||
|
tmpfs mounts. See Documentation/filesystems/tmpfs.txt for more information.
|
||||||
|
|
||||||
|
What is rootfs?
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Rootfs is a special instance of ramfs, which is always present in 2.6 systems.
|
||||||
|
(It's used internally as the starting and stopping point for searches of the
|
||||||
|
kernel's doubly-linked list of mount points.)
|
||||||
|
|
||||||
|
Most systems just mount another filesystem over it and ignore it. The
|
||||||
|
amount of space an empty instance of ramfs takes up is tiny.
|
||||||
|
|
||||||
|
What is initramfs?
|
||||||
|
------------------
|
||||||
|
|
||||||
|
All 2.6 Linux kernels contain a gzipped "cpio" format archive, which is
|
||||||
|
extracted into rootfs when the kernel boots up. After extracting, the kernel
|
||||||
|
checks to see if rootfs contains a file "init", and if so it executes it as PID
|
||||||
|
1. If found, this init process is responsible for bringing the system the
|
||||||
|
rest of the way up, including locating and mounting the real root device (if
|
||||||
|
any). If rootfs does not contain an init program after the embedded cpio
|
||||||
|
archive is extracted into it, the kernel will fall through to the older code
|
||||||
|
to locate and mount a root partition, then exec some variant of /sbin/init
|
||||||
|
out of that.
|
||||||
|
|
||||||
|
All this differs from the old initrd in several ways:
|
||||||
|
|
||||||
|
- The old initrd was a separate file, while the initramfs archive is linked
|
||||||
|
into the linux kernel image. (The directory linux-*/usr is devoted to
|
||||||
|
generating this archive during the build.)
|
||||||
|
|
||||||
|
- The old initrd file was a gzipped filesystem image (in some file format,
|
||||||
|
such as ext2, that had to be built into the kernel), while the new
|
||||||
|
initramfs archive is a gzipped cpio archive (like tar only simpler,
|
||||||
|
see cpio(1) and Documentation/early-userspace/buffer-format.txt).
|
||||||
|
|
||||||
|
- The program run by the old initrd (which was called /initrd, not /init) did
|
||||||
|
some setup and then returned to the kernel, while the init program from
|
||||||
|
initramfs is not expected to return to the kernel. (If /init needs to hand
|
||||||
|
off control it can overmount / with a new root device and exec another init
|
||||||
|
program. See the switch_root utility, below.)
|
||||||
|
|
||||||
|
- When switching another root device, initrd would pivot_root and then
|
||||||
|
umount the ramdisk. But initramfs is rootfs: you can neither pivot_root
|
||||||
|
rootfs, nor unmount it. Instead delete everything out of rootfs to
|
||||||
|
free up the space (find -xdev / -exec rm '{}' ';'), overmount rootfs
|
||||||
|
with the new root (cd /newmount; mount --move . /; chroot .), attach
|
||||||
|
stdin/stdout/stderr to the new /dev/console, and exec the new init.
|
||||||
|
|
||||||
|
Since this is a remarkably persnickity process (and involves deleting
|
||||||
|
commands before you can run them), the klibc package introduced a helper
|
||||||
|
program (utils/run_init.c) to do all this for you. Most other packages
|
||||||
|
(such as busybox) have named this command "switch_root".
|
||||||
|
|
||||||
|
Populating initramfs:
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
The 2.6 kernel build process always creates a gzipped cpio format initramfs
|
||||||
|
archive and links it into the resulting kernel binary. By default, this
|
||||||
|
archive is empty (consuming 134 bytes on x86). The config option
|
||||||
|
CONFIG_INITRAMFS_SOURCE (for some reason buried under devices->block devices
|
||||||
|
in menuconfig, and living in usr/Kconfig) can be used to specify a source for
|
||||||
|
the initramfs archive, which will automatically be incorporated into the
|
||||||
|
resulting binary. This option can point to an existing gzipped cpio archive, a
|
||||||
|
directory containing files to be archived, or a text file specification such
|
||||||
|
as the following example:
|
||||||
|
|
||||||
|
dir /dev 755 0 0
|
||||||
|
nod /dev/console 644 0 0 c 5 1
|
||||||
|
nod /dev/loop0 644 0 0 b 7 0
|
||||||
|
dir /bin 755 1000 1000
|
||||||
|
slink /bin/sh busybox 777 0 0
|
||||||
|
file /bin/busybox initramfs/busybox 755 0 0
|
||||||
|
dir /proc 755 0 0
|
||||||
|
dir /sys 755 0 0
|
||||||
|
dir /mnt 755 0 0
|
||||||
|
file /init initramfs/init.sh 755 0 0
|
||||||
|
|
||||||
|
One advantage of the text file is that root access is not required to
|
||||||
|
set permissions or create device nodes in the new archive. (Note that those
|
||||||
|
two example "file" entries expect to find files named "init.sh" and "busybox" in
|
||||||
|
a directory called "initramfs", under the linux-2.6.* directory. See
|
||||||
|
Documentation/early-userspace/README for more details.)
|
||||||
|
|
||||||
|
If you don't already understand what shared libraries, devices, and paths
|
||||||
|
you need to get a minimal root filesystem up and running, here are some
|
||||||
|
references:
|
||||||
|
http://www.tldp.org/HOWTO/Bootdisk-HOWTO/
|
||||||
|
http://www.tldp.org/HOWTO/From-PowerUp-To-Bash-Prompt-HOWTO.html
|
||||||
|
http://www.linuxfromscratch.org/lfs/view/stable/
|
||||||
|
|
||||||
|
The "klibc" package (http://www.kernel.org/pub/linux/libs/klibc) is
|
||||||
|
designed to be a tiny C library to statically link early userspace
|
||||||
|
code against, along with some related utilities. It is BSD licensed.
|
||||||
|
|
||||||
|
I use uClibc (http://www.uclibc.org) and busybox (http://www.busybox.net)
|
||||||
|
myself. These are LGPL and GPL, respectively.
|
||||||
|
|
||||||
|
In theory you could use glibc, but that's not well suited for small embedded
|
||||||
|
uses like this. (A "hello world" program statically linked against glibc is
|
||||||
|
over 400k. With uClibc it's 7k. Also note that glibc dlopens libnss to do
|
||||||
|
name lookups, even when otherwise statically linked.)
|
||||||
|
|
||||||
|
Future directions:
|
||||||
|
------------------
|
||||||
|
|
||||||
|
Today (2.6.14), initramfs is always compiled in, but not always used. The
|
||||||
|
kernel falls back to legacy boot code that is reached only if initramfs does
|
||||||
|
not contain an /init program. The fallback is legacy code, there to ensure a
|
||||||
|
smooth transition and allowing early boot functionality to gradually move to
|
||||||
|
"early userspace" (I.E. initramfs).
|
||||||
|
|
||||||
|
The move to early userspace is necessary because finding and mounting the real
|
||||||
|
root device is complex. Root partitions can span multiple devices (raid or
|
||||||
|
separate journal). They can be out on the network (requiring dhcp, setting a
|
||||||
|
specific mac address, logging into a server, etc). They can live on removable
|
||||||
|
media, with dynamically allocated major/minor numbers and persistent naming
|
||||||
|
issues requiring a full udev implementation to sort out. They can be
|
||||||
|
compressed, encrypted, copy-on-write, loopback mounted, strangely partitioned,
|
||||||
|
and so on.
|
||||||
|
|
||||||
|
This kind of complexity (which inevitably includes policy) is rightly handled
|
||||||
|
in userspace. Both klibc and busybox/uClibc are working on simple initramfs
|
||||||
|
packages to drop into a kernel build, and when standard solutions are ready
|
||||||
|
and widely deployed, the kernel's legacy early boot code will become obsolete
|
||||||
|
and a candidate for the feature removal schedule.
|
||||||
|
|
||||||
|
But that's a while off yet.
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
Original author: Richard Gooch <rgooch@atnf.csiro.au>
|
Original author: Richard Gooch <rgooch@atnf.csiro.au>
|
||||||
|
|
||||||
Last updated on August 25, 2005
|
Last updated on October 28, 2005
|
||||||
|
|
||||||
Copyright (C) 1999 Richard Gooch
|
Copyright (C) 1999 Richard Gooch
|
||||||
Copyright (C) 2005 Pekka Enberg
|
Copyright (C) 2005 Pekka Enberg
|
||||||
|
@ -11,62 +11,61 @@
|
||||||
This file is released under the GPLv2.
|
This file is released under the GPLv2.
|
||||||
|
|
||||||
|
|
||||||
What is it?
|
Introduction
|
||||||
===========
|
============
|
||||||
|
|
||||||
The Virtual File System (otherwise known as the Virtual Filesystem
|
The Virtual File System (also known as the Virtual Filesystem Switch)
|
||||||
Switch) is the software layer in the kernel that provides the
|
is the software layer in the kernel that provides the filesystem
|
||||||
filesystem interface to userspace programs. It also provides an
|
interface to userspace programs. It also provides an abstraction
|
||||||
abstraction within the kernel which allows different filesystem
|
within the kernel which allows different filesystem implementations to
|
||||||
implementations to coexist.
|
coexist.
|
||||||
|
|
||||||
|
VFS system calls open(2), stat(2), read(2), write(2), chmod(2) and so
|
||||||
|
on are called from a process context. Filesystem locking is described
|
||||||
|
in the document Documentation/filesystems/Locking.
|
||||||
|
|
||||||
|
|
||||||
A Quick Look At How It Works
|
Directory Entry Cache (dcache)
|
||||||
============================
|
------------------------------
|
||||||
|
|
||||||
In this section I'll briefly describe how things work, before
|
The VFS implements the open(2), stat(2), chmod(2), and similar system
|
||||||
launching into the details. I'll start with describing what happens
|
calls. The pathname argument that is passed to them is used by the VFS
|
||||||
when user programs open and manipulate files, and then look from the
|
to search through the directory entry cache (also known as the dentry
|
||||||
other view which is how a filesystem is supported and subsequently
|
cache or dcache). This provides a very fast look-up mechanism to
|
||||||
mounted.
|
translate a pathname (filename) into a specific dentry. Dentries live
|
||||||
|
in RAM and are never saved to disc: they exist only for performance.
|
||||||
|
|
||||||
|
The dentry cache is meant to be a view into your entire filespace. As
|
||||||
|
most computers cannot fit all dentries in the RAM at the same time,
|
||||||
|
some bits of the cache are missing. In order to resolve your pathname
|
||||||
|
into a dentry, the VFS may have to resort to creating dentries along
|
||||||
|
the way, and then loading the inode. This is done by looking up the
|
||||||
|
inode.
|
||||||
|
|
||||||
|
|
||||||
Opening a File
|
The Inode Object
|
||||||
--------------
|
----------------
|
||||||
|
|
||||||
The VFS implements the open(2), stat(2), chmod(2) and similar system
|
An individual dentry usually has a pointer to an inode. Inodes are
|
||||||
calls. The pathname argument is used by the VFS to search through the
|
filesystem objects such as regular files, directories, FIFOs and other
|
||||||
directory entry cache (dentry cache or "dcache"). This provides a very
|
beasts. They live either on the disc (for block device filesystems)
|
||||||
fast look-up mechanism to translate a pathname (filename) into a
|
or in the memory (for pseudo filesystems). Inodes that live on the
|
||||||
specific dentry.
|
disc are copied into the memory when required and changes to the inode
|
||||||
|
are written back to disc. A single inode can be pointed to by multiple
|
||||||
|
dentries (hard links, for example, do this).
|
||||||
|
|
||||||
An individual dentry usually has a pointer to an inode. Inodes are the
|
To look up an inode requires that the VFS calls the lookup() method of
|
||||||
things that live on disc drives, and can be regular files (you know:
|
the parent directory inode. This method is installed by the specific
|
||||||
those things that you write data into), directories, FIFOs and other
|
filesystem implementation that the inode lives in. Once the VFS has
|
||||||
beasts. Dentries live in RAM and are never saved to disc: they exist
|
the required dentry (and hence the inode), we can do all those boring
|
||||||
only for performance. Inodes live on disc and are copied into memory
|
things like open(2) the file, or stat(2) it to peek at the inode
|
||||||
when required. Later any changes are written back to disc. The inode
|
data. The stat(2) operation is fairly simple: once the VFS has the
|
||||||
that lives in RAM is a VFS inode, and it is this which the dentry
|
dentry, it peeks at the inode data and passes some of it back to
|
||||||
points to. A single inode can be pointed to by multiple dentries
|
userspace.
|
||||||
(think about hardlinks).
|
|
||||||
|
|
||||||
The dcache is meant to be a view into your entire filespace. Unlike
|
|
||||||
Linus, most of us losers can't fit enough dentries into RAM to cover
|
|
||||||
all of our filespace, so the dcache has bits missing. In order to
|
|
||||||
resolve your pathname into a dentry, the VFS may have to resort to
|
|
||||||
creating dentries along the way, and then loading the inode. This is
|
|
||||||
done by looking up the inode.
|
|
||||||
|
|
||||||
To look up an inode (usually read from disc) requires that the VFS
|
The File Object
|
||||||
calls the lookup() method of the parent directory inode. This method
|
---------------
|
||||||
is installed by the specific filesystem implementation that the inode
|
|
||||||
lives in. There will be more on this later.
|
|
||||||
|
|
||||||
Once the VFS has the required dentry (and hence the inode), we can do
|
|
||||||
all those boring things like open(2) the file, or stat(2) it to peek
|
|
||||||
at the inode data. The stat(2) operation is fairly simple: once the
|
|
||||||
VFS has the dentry, it peeks at the inode data and passes some of it
|
|
||||||
back to userspace.
|
|
||||||
|
|
||||||
Opening a file requires another operation: allocation of a file
|
Opening a file requires another operation: allocation of a file
|
||||||
structure (this is the kernel-side implementation of file
|
structure (this is the kernel-side implementation of file
|
||||||
|
@ -74,51 +73,39 @@ descriptors). The freshly allocated file structure is initialized with
|
||||||
a pointer to the dentry and a set of file operation member functions.
|
a pointer to the dentry and a set of file operation member functions.
|
||||||
These are taken from the inode data. The open() file method is then
|
These are taken from the inode data. The open() file method is then
|
||||||
called so the specific filesystem implementation can do it's work. You
|
called so the specific filesystem implementation can do it's work. You
|
||||||
can see that this is another switch performed by the VFS.
|
can see that this is another switch performed by the VFS. The file
|
||||||
|
structure is placed into the file descriptor table for the process.
|
||||||
The file structure is placed into the file descriptor table for the
|
|
||||||
process.
|
|
||||||
|
|
||||||
Reading, writing and closing files (and other assorted VFS operations)
|
Reading, writing and closing files (and other assorted VFS operations)
|
||||||
is done by using the userspace file descriptor to grab the appropriate
|
is done by using the userspace file descriptor to grab the appropriate
|
||||||
file structure, and then calling the required file structure method
|
file structure, and then calling the required file structure method to
|
||||||
function to do whatever is required.
|
do whatever is required. For as long as the file is open, it keeps the
|
||||||
|
dentry in use, which in turn means that the VFS inode is still in use.
|
||||||
For as long as the file is open, it keeps the dentry "open" (in use),
|
|
||||||
which in turn means that the VFS inode is still in use.
|
|
||||||
|
|
||||||
All VFS system calls (i.e. open(2), stat(2), read(2), write(2),
|
|
||||||
chmod(2) and so on) are called from a process context. You should
|
|
||||||
assume that these calls are made without any kernel locks being
|
|
||||||
held. This means that the processes may be executing the same piece of
|
|
||||||
filesystem or driver code at the same time, on different
|
|
||||||
processors. You should ensure that access to shared resources is
|
|
||||||
protected by appropriate locks.
|
|
||||||
|
|
||||||
|
|
||||||
Registering and Mounting a Filesystem
|
Registering and Mounting a Filesystem
|
||||||
-------------------------------------
|
=====================================
|
||||||
|
|
||||||
If you want to support a new kind of filesystem in the kernel, all you
|
To register and unregister a filesystem, use the following API
|
||||||
need to do is call register_filesystem(). You pass a structure
|
functions:
|
||||||
describing the filesystem implementation (struct file_system_type)
|
|
||||||
which is then added to an internal table of supported filesystems. You
|
|
||||||
can do:
|
|
||||||
|
|
||||||
% cat /proc/filesystems
|
#include <linux/fs.h>
|
||||||
|
|
||||||
to see what filesystems are currently available on your system.
|
extern int register_filesystem(struct file_system_type *);
|
||||||
|
extern int unregister_filesystem(struct file_system_type *);
|
||||||
|
|
||||||
When a request is made to mount a block device onto a directory in
|
The passed struct file_system_type describes your filesystem. When a
|
||||||
your filespace the VFS will call the appropriate method for the
|
request is made to mount a device onto a directory in your filespace,
|
||||||
specific filesystem. The dentry for the mount point will then be
|
the VFS will call the appropriate get_sb() method for the specific
|
||||||
updated to point to the root inode for the new filesystem.
|
filesystem. The dentry for the mount point will then be updated to
|
||||||
|
point to the root inode for the new filesystem.
|
||||||
|
|
||||||
It's now time to look at things in more detail.
|
You can see all filesystems that are registered to the kernel in the
|
||||||
|
file /proc/filesystems.
|
||||||
|
|
||||||
|
|
||||||
struct file_system_type
|
struct file_system_type
|
||||||
=======================
|
-----------------------
|
||||||
|
|
||||||
This describes the filesystem. As of kernel 2.6.13, the following
|
This describes the filesystem. As of kernel 2.6.13, the following
|
||||||
members are defined:
|
members are defined:
|
||||||
|
@ -197,8 +184,14 @@ A fill_super() method implementation has the following arguments:
|
||||||
int silent: whether or not to be silent on error
|
int silent: whether or not to be silent on error
|
||||||
|
|
||||||
|
|
||||||
|
The Superblock Object
|
||||||
|
=====================
|
||||||
|
|
||||||
|
A superblock object represents a mounted filesystem.
|
||||||
|
|
||||||
|
|
||||||
struct super_operations
|
struct super_operations
|
||||||
=======================
|
-----------------------
|
||||||
|
|
||||||
This describes how the VFS can manipulate the superblock of your
|
This describes how the VFS can manipulate the superblock of your
|
||||||
filesystem. As of kernel 2.6.13, the following members are defined:
|
filesystem. As of kernel 2.6.13, the following members are defined:
|
||||||
|
@ -286,9 +279,9 @@ or bottom half).
|
||||||
a superblock. The second parameter indicates whether the method
|
a superblock. The second parameter indicates whether the method
|
||||||
should wait until the write out has been completed. Optional.
|
should wait until the write out has been completed. Optional.
|
||||||
|
|
||||||
write_super_lockfs: called when VFS is locking a filesystem and forcing
|
write_super_lockfs: called when VFS is locking a filesystem and
|
||||||
it into a consistent state. This function is currently used by the
|
forcing it into a consistent state. This method is currently
|
||||||
Logical Volume Manager (LVM).
|
used by the Logical Volume Manager (LVM).
|
||||||
|
|
||||||
unlockfs: called when VFS is unlocking a filesystem and making it writable
|
unlockfs: called when VFS is unlocking a filesystem and making it writable
|
||||||
again.
|
again.
|
||||||
|
@ -317,8 +310,14 @@ field. This is a pointer to a "struct inode_operations" which
|
||||||
describes the methods that can be performed on individual inodes.
|
describes the methods that can be performed on individual inodes.
|
||||||
|
|
||||||
|
|
||||||
|
The Inode Object
|
||||||
|
================
|
||||||
|
|
||||||
|
An inode object represents an object within the filesystem.
|
||||||
|
|
||||||
|
|
||||||
struct inode_operations
|
struct inode_operations
|
||||||
=======================
|
-----------------------
|
||||||
|
|
||||||
This describes how the VFS can manipulate an inode in your
|
This describes how the VFS can manipulate an inode in your
|
||||||
filesystem. As of kernel 2.6.13, the following members are defined:
|
filesystem. As of kernel 2.6.13, the following members are defined:
|
||||||
|
@ -394,51 +393,62 @@ otherwise noted.
|
||||||
will probably need to call d_instantiate() just as you would
|
will probably need to call d_instantiate() just as you would
|
||||||
in the create() method
|
in the create() method
|
||||||
|
|
||||||
|
rename: called by the rename(2) system call to rename the object to
|
||||||
|
have the parent and name given by the second inode and dentry.
|
||||||
|
|
||||||
readlink: called by the readlink(2) system call. Only required if
|
readlink: called by the readlink(2) system call. Only required if
|
||||||
you want to support reading symbolic links
|
you want to support reading symbolic links
|
||||||
|
|
||||||
follow_link: called by the VFS to follow a symbolic link to the
|
follow_link: called by the VFS to follow a symbolic link to the
|
||||||
inode it points to. Only required if you want to support
|
inode it points to. Only required if you want to support
|
||||||
symbolic links. This function returns a void pointer cookie
|
symbolic links. This method returns a void pointer cookie
|
||||||
that is passed to put_link().
|
that is passed to put_link().
|
||||||
|
|
||||||
put_link: called by the VFS to release resources allocated by
|
put_link: called by the VFS to release resources allocated by
|
||||||
follow_link(). The cookie returned by follow_link() is passed to
|
follow_link(). The cookie returned by follow_link() is passed
|
||||||
to this function as the last parameter. It is used by filesystems
|
to to this method as the last parameter. It is used by
|
||||||
such as NFS where page cache is not stable (i.e. page that was
|
filesystems such as NFS where page cache is not stable
|
||||||
installed when the symbolic link walk started might not be in the
|
(i.e. page that was installed when the symbolic link walk
|
||||||
page cache at the end of the walk).
|
started might not be in the page cache at the end of the
|
||||||
|
walk).
|
||||||
|
|
||||||
truncate: called by the VFS to change the size of a file. The i_size
|
truncate: called by the VFS to change the size of a file. The
|
||||||
field of the inode is set to the desired size by the VFS before
|
i_size field of the inode is set to the desired size by the
|
||||||
this function is called. This function is called by the truncate(2)
|
VFS before this method is called. This method is called by
|
||||||
system call and related functionality.
|
the truncate(2) system call and related functionality.
|
||||||
|
|
||||||
permission: called by the VFS to check for access rights on a POSIX-like
|
permission: called by the VFS to check for access rights on a POSIX-like
|
||||||
filesystem.
|
filesystem.
|
||||||
|
|
||||||
setattr: called by the VFS to set attributes for a file. This function is
|
setattr: called by the VFS to set attributes for a file. This method
|
||||||
called by chmod(2) and related system calls.
|
is called by chmod(2) and related system calls.
|
||||||
|
|
||||||
getattr: called by the VFS to get attributes of a file. This function is
|
getattr: called by the VFS to get attributes of a file. This method
|
||||||
called by stat(2) and related system calls.
|
is called by stat(2) and related system calls.
|
||||||
|
|
||||||
setxattr: called by the VFS to set an extended attribute for a file.
|
setxattr: called by the VFS to set an extended attribute for a file.
|
||||||
Extended attribute is a name:value pair associated with an inode. This
|
Extended attribute is a name:value pair associated with an
|
||||||
function is called by setxattr(2) system call.
|
inode. This method is called by setxattr(2) system call.
|
||||||
|
|
||||||
getxattr: called by the VFS to retrieve the value of an extended attribute
|
getxattr: called by the VFS to retrieve the value of an extended
|
||||||
name. This function is called by getxattr(2) function call.
|
attribute name. This method is called by getxattr(2) function
|
||||||
|
call.
|
||||||
|
|
||||||
listxattr: called by the VFS to list all extended attributes for a given
|
listxattr: called by the VFS to list all extended attributes for a
|
||||||
file. This function is called by listxattr(2) system call.
|
given file. This method is called by listxattr(2) system call.
|
||||||
|
|
||||||
removexattr: called by the VFS to remove an extended attribute from a file.
|
removexattr: called by the VFS to remove an extended attribute from
|
||||||
This function is called by removexattr(2) system call.
|
a file. This method is called by removexattr(2) system call.
|
||||||
|
|
||||||
|
|
||||||
|
The Address Space Object
|
||||||
|
========================
|
||||||
|
|
||||||
|
The address space object is used to identify pages in the page cache.
|
||||||
|
|
||||||
|
|
||||||
struct address_space_operations
|
struct address_space_operations
|
||||||
===============================
|
-------------------------------
|
||||||
|
|
||||||
This describes how the VFS can manipulate mapping of a file to page cache in
|
This describes how the VFS can manipulate mapping of a file to page cache in
|
||||||
your filesystem. As of kernel 2.6.13, the following members are defined:
|
your filesystem. As of kernel 2.6.13, the following members are defined:
|
||||||
|
@ -502,8 +512,14 @@ struct address_space_operations {
|
||||||
it. An example implementation can be found in fs/ext2/xip.c.
|
it. An example implementation can be found in fs/ext2/xip.c.
|
||||||
|
|
||||||
|
|
||||||
|
The File Object
|
||||||
|
===============
|
||||||
|
|
||||||
|
A file object represents a file opened by a process.
|
||||||
|
|
||||||
|
|
||||||
struct file_operations
|
struct file_operations
|
||||||
======================
|
----------------------
|
||||||
|
|
||||||
This describes how the VFS can manipulate an open file. As of kernel
|
This describes how the VFS can manipulate an open file. As of kernel
|
||||||
2.6.13, the following members are defined:
|
2.6.13, the following members are defined:
|
||||||
|
@ -661,7 +677,7 @@ of child dentries. Child dentries are basically like files in a
|
||||||
directory.
|
directory.
|
||||||
|
|
||||||
|
|
||||||
Directory Entry Cache APIs
|
Directory Entry Cache API
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
There are a number of functions defined which permit a filesystem to
|
There are a number of functions defined which permit a filesystem to
|
||||||
|
@ -705,178 +721,24 @@ manipulate dentries:
|
||||||
and the dentry is returned. The caller must use d_put()
|
and the dentry is returned. The caller must use d_put()
|
||||||
to free the dentry when it finishes using it.
|
to free the dentry when it finishes using it.
|
||||||
|
|
||||||
|
For further information on dentry locking, please refer to the document
|
||||||
RCU-based dcache locking model
|
Documentation/filesystems/dentry-locking.txt.
|
||||||
------------------------------
|
|
||||||
|
|
||||||
On many workloads, the most common operation on dcache is
|
|
||||||
to look up a dentry, given a parent dentry and the name
|
|
||||||
of the child. Typically, for every open(), stat() etc.,
|
|
||||||
the dentry corresponding to the pathname will be looked
|
|
||||||
up by walking the tree starting with the first component
|
|
||||||
of the pathname and using that dentry along with the next
|
|
||||||
component to look up the next level and so on. Since it
|
|
||||||
is a frequent operation for workloads like multiuser
|
|
||||||
environments and web servers, it is important to optimize
|
|
||||||
this path.
|
|
||||||
|
|
||||||
Prior to 2.5.10, dcache_lock was acquired in d_lookup and thus
|
|
||||||
in every component during path look-up. Since 2.5.10 onwards,
|
|
||||||
fast-walk algorithm changed this by holding the dcache_lock
|
|
||||||
at the beginning and walking as many cached path component
|
|
||||||
dentries as possible. This significantly decreases the number
|
|
||||||
of acquisition of dcache_lock. However it also increases the
|
|
||||||
lock hold time significantly and affects performance in large
|
|
||||||
SMP machines. Since 2.5.62 kernel, dcache has been using
|
|
||||||
a new locking model that uses RCU to make dcache look-up
|
|
||||||
lock-free.
|
|
||||||
|
|
||||||
The current dcache locking model is not very different from the existing
|
|
||||||
dcache locking model. Prior to 2.5.62 kernel, dcache_lock
|
|
||||||
protected the hash chain, d_child, d_alias, d_lru lists as well
|
|
||||||
as d_inode and several other things like mount look-up. RCU-based
|
|
||||||
changes affect only the way the hash chain is protected. For everything
|
|
||||||
else the dcache_lock must be taken for both traversing as well as
|
|
||||||
updating. The hash chain updates too take the dcache_lock.
|
|
||||||
The significant change is the way d_lookup traverses the hash chain,
|
|
||||||
it doesn't acquire the dcache_lock for this and rely on RCU to
|
|
||||||
ensure that the dentry has not been *freed*.
|
|
||||||
|
|
||||||
|
|
||||||
Dcache locking details
|
Resources
|
||||||
----------------------
|
=========
|
||||||
|
|
||||||
For many multi-user workloads, open() and stat() on files are
|
(Note some of these resources are not up-to-date with the latest kernel
|
||||||
very frequently occurring operations. Both involve walking
|
version.)
|
||||||
of path names to find the dentry corresponding to the
|
|
||||||
concerned file. In 2.4 kernel, dcache_lock was held
|
|
||||||
during look-up of each path component. Contention and
|
|
||||||
cache-line bouncing of this global lock caused significant
|
|
||||||
scalability problems. With the introduction of RCU
|
|
||||||
in Linux kernel, this was worked around by making
|
|
||||||
the look-up of path components during path walking lock-free.
|
|
||||||
|
|
||||||
|
Creating Linux virtual filesystems. 2002
|
||||||
|
<http://lwn.net/Articles/13325/>
|
||||||
|
|
||||||
Safe lock-free look-up of dcache hash table
|
The Linux Virtual File-system Layer by Neil Brown. 1999
|
||||||
===========================================
|
<http://www.cse.unsw.edu.au/~neilb/oss/linux-commentary/vfs.html>
|
||||||
|
|
||||||
Dcache is a complex data structure with the hash table entries
|
A tour of the Linux VFS by Michael K. Johnson. 1996
|
||||||
also linked together in other lists. In 2.4 kernel, dcache_lock
|
<http://www.tldp.org/LDP/khg/HyperNews/get/fs/vfstour.html>
|
||||||
protected all the lists. We applied RCU only on hash chain
|
|
||||||
walking. The rest of the lists are still protected by dcache_lock.
|
|
||||||
Some of the important changes are :
|
|
||||||
|
|
||||||
1. The deletion from hash chain is done using hlist_del_rcu() macro which
|
A small trail through the Linux kernel by Andries Brouwer. 2001
|
||||||
doesn't initialize next pointer of the deleted dentry and this
|
<http://www.win.tue.nl/~aeb/linux/vfs/trail.html>
|
||||||
allows us to walk safely lock-free while a deletion is happening.
|
|
||||||
|
|
||||||
2. Insertion of a dentry into the hash table is done using
|
|
||||||
hlist_add_head_rcu() which take care of ordering the writes -
|
|
||||||
the writes to the dentry must be visible before the dentry
|
|
||||||
is inserted. This works in conjunction with hlist_for_each_rcu()
|
|
||||||
while walking the hash chain. The only requirement is that
|
|
||||||
all initialization to the dentry must be done before hlist_add_head_rcu()
|
|
||||||
since we don't have dcache_lock protection while traversing
|
|
||||||
the hash chain. This isn't different from the existing code.
|
|
||||||
|
|
||||||
3. The dentry looked up without holding dcache_lock by cannot be
|
|
||||||
returned for walking if it is unhashed. It then may have a NULL
|
|
||||||
d_inode or other bogosity since RCU doesn't protect the other
|
|
||||||
fields in the dentry. We therefore use a flag DCACHE_UNHASHED to
|
|
||||||
indicate unhashed dentries and use this in conjunction with a
|
|
||||||
per-dentry lock (d_lock). Once looked up without the dcache_lock,
|
|
||||||
we acquire the per-dentry lock (d_lock) and check if the
|
|
||||||
dentry is unhashed. If so, the look-up is failed. If not, the
|
|
||||||
reference count of the dentry is increased and the dentry is returned.
|
|
||||||
|
|
||||||
4. Once a dentry is looked up, it must be ensured during the path
|
|
||||||
walk for that component it doesn't go away. In pre-2.5.10 code,
|
|
||||||
this was done holding a reference to the dentry. dcache_rcu does
|
|
||||||
the same. In some sense, dcache_rcu path walking looks like
|
|
||||||
the pre-2.5.10 version.
|
|
||||||
|
|
||||||
5. All dentry hash chain updates must take the dcache_lock as well as
|
|
||||||
the per-dentry lock in that order. dput() does this to ensure
|
|
||||||
that a dentry that has just been looked up in another CPU
|
|
||||||
doesn't get deleted before dget() can be done on it.
|
|
||||||
|
|
||||||
6. There are several ways to do reference counting of RCU protected
|
|
||||||
objects. One such example is in ipv4 route cache where
|
|
||||||
deferred freeing (using call_rcu()) is done as soon as
|
|
||||||
the reference count goes to zero. This cannot be done in
|
|
||||||
the case of dentries because tearing down of dentries
|
|
||||||
require blocking (dentry_iput()) which isn't supported from
|
|
||||||
RCU callbacks. Instead, tearing down of dentries happen
|
|
||||||
synchronously in dput(), but actual freeing happens later
|
|
||||||
when RCU grace period is over. This allows safe lock-free
|
|
||||||
walking of the hash chains, but a matched dentry may have
|
|
||||||
been partially torn down. The checking of DCACHE_UNHASHED
|
|
||||||
flag with d_lock held detects such dentries and prevents
|
|
||||||
them from being returned from look-up.
|
|
||||||
|
|
||||||
|
|
||||||
Maintaining POSIX rename semantics
|
|
||||||
==================================
|
|
||||||
|
|
||||||
Since look-up of dentries is lock-free, it can race against
|
|
||||||
a concurrent rename operation. For example, during rename
|
|
||||||
of file A to B, look-up of either A or B must succeed.
|
|
||||||
So, if look-up of B happens after A has been removed from the
|
|
||||||
hash chain but not added to the new hash chain, it may fail.
|
|
||||||
Also, a comparison while the name is being written concurrently
|
|
||||||
by a rename may result in false positive matches violating
|
|
||||||
rename semantics. Issues related to race with rename are
|
|
||||||
handled as described below :
|
|
||||||
|
|
||||||
1. Look-up can be done in two ways - d_lookup() which is safe
|
|
||||||
from simultaneous renames and __d_lookup() which is not.
|
|
||||||
If __d_lookup() fails, it must be followed up by a d_lookup()
|
|
||||||
to correctly determine whether a dentry is in the hash table
|
|
||||||
or not. d_lookup() protects look-ups using a sequence
|
|
||||||
lock (rename_lock).
|
|
||||||
|
|
||||||
2. The name associated with a dentry (d_name) may be changed if
|
|
||||||
a rename is allowed to happen simultaneously. To avoid memcmp()
|
|
||||||
in __d_lookup() go out of bounds due to a rename and false
|
|
||||||
positive comparison, the name comparison is done while holding the
|
|
||||||
per-dentry lock. This prevents concurrent renames during this
|
|
||||||
operation.
|
|
||||||
|
|
||||||
3. Hash table walking during look-up may move to a different bucket as
|
|
||||||
the current dentry is moved to a different bucket due to rename.
|
|
||||||
But we use hlists in dcache hash table and they are null-terminated.
|
|
||||||
So, even if a dentry moves to a different bucket, hash chain
|
|
||||||
walk will terminate. [with a list_head list, it may not since
|
|
||||||
termination is when the list_head in the original bucket is reached].
|
|
||||||
Since we redo the d_parent check and compare name while holding
|
|
||||||
d_lock, lock-free look-up will not race against d_move().
|
|
||||||
|
|
||||||
4. There can be a theoretical race when a dentry keeps coming back
|
|
||||||
to original bucket due to double moves. Due to this look-up may
|
|
||||||
consider that it has never moved and can end up in a infinite loop.
|
|
||||||
But this is not any worse that theoretical livelocks we already
|
|
||||||
have in the kernel.
|
|
||||||
|
|
||||||
|
|
||||||
Important guidelines for filesystem developers related to dcache_rcu
|
|
||||||
====================================================================
|
|
||||||
|
|
||||||
1. Existing dcache interfaces (pre-2.5.62) exported to filesystem
|
|
||||||
don't change. Only dcache internal implementation changes. However
|
|
||||||
filesystems *must not* delete from the dentry hash chains directly
|
|
||||||
using the list macros like allowed earlier. They must use dcache
|
|
||||||
APIs like d_drop() or __d_drop() depending on the situation.
|
|
||||||
|
|
||||||
2. d_flags is now protected by a per-dentry lock (d_lock). All
|
|
||||||
access to d_flags must be protected by it.
|
|
||||||
|
|
||||||
3. For a hashed dentry, checking of d_count needs to be protected
|
|
||||||
by d_lock.
|
|
||||||
|
|
||||||
|
|
||||||
Papers and other documentation on dcache locking
|
|
||||||
================================================
|
|
||||||
|
|
||||||
1. Scaling dcache with RCU (http://linuxjournal.com/article.php?sid=7124).
|
|
||||||
|
|
||||||
2. http://lse.sourceforge.net/locking/dcache/dcache.html
|
|
||||||
|
|
|
@ -19,15 +19,43 @@ Mount Options
|
||||||
|
|
||||||
When mounting an XFS filesystem, the following options are accepted.
|
When mounting an XFS filesystem, the following options are accepted.
|
||||||
|
|
||||||
biosize=size
|
allocsize=size
|
||||||
Sets the preferred buffered I/O size (default size is 64K).
|
Sets the buffered I/O end-of-file preallocation size when
|
||||||
"size" must be expressed as the logarithm (base2) of the
|
doing delayed allocation writeout (default size is 64KiB).
|
||||||
desired I/O size.
|
Valid values for this option are page size (typically 4KiB)
|
||||||
Valid values for this option are 14 through 16, inclusive
|
through to 1GiB, inclusive, in power-of-2 increments.
|
||||||
(i.e. 16K, 32K, and 64K bytes). On machines with a 4K
|
|
||||||
pagesize, 13 (8K bytes) is also a valid size.
|
attr2/noattr2
|
||||||
The preferred buffered I/O size can also be altered on an
|
The options enable/disable (default is disabled for backward
|
||||||
individual file basis using the ioctl(2) system call.
|
compatibility on-disk) an "opportunistic" improvement to be
|
||||||
|
made in the way inline extended attributes are stored on-disk.
|
||||||
|
When the new form is used for the first time (by setting or
|
||||||
|
removing extended attributes) the on-disk superblock feature
|
||||||
|
bit field will be updated to reflect this format being in use.
|
||||||
|
|
||||||
|
barrier
|
||||||
|
Enables the use of block layer write barriers for writes into
|
||||||
|
the journal and unwritten extent conversion. This allows for
|
||||||
|
drive level write caching to be enabled, for devices that
|
||||||
|
support write barriers.
|
||||||
|
|
||||||
|
dmapi
|
||||||
|
Enable the DMAPI (Data Management API) event callouts.
|
||||||
|
Use with the "mtpt" option.
|
||||||
|
|
||||||
|
grpid/bsdgroups and nogrpid/sysvgroups
|
||||||
|
These options define what group ID a newly created file gets.
|
||||||
|
When grpid is set, it takes the group ID of the directory in
|
||||||
|
which it is created; otherwise (the default) it takes the fsgid
|
||||||
|
of the current process, unless the directory has the setgid bit
|
||||||
|
set, in which case it takes the gid from the parent directory,
|
||||||
|
and also gets the setgid bit set if it is a directory itself.
|
||||||
|
|
||||||
|
ihashsize=value
|
||||||
|
Sets the number of hash buckets available for hashing the
|
||||||
|
in-memory inodes of the specified mount point. If a value
|
||||||
|
of zero is used, the value selected by the default algorithm
|
||||||
|
will be displayed in /proc/mounts.
|
||||||
|
|
||||||
ikeep/noikeep
|
ikeep/noikeep
|
||||||
When inode clusters are emptied of inodes, keep them around
|
When inode clusters are emptied of inodes, keep them around
|
||||||
|
@ -35,12 +63,31 @@ When mounting an XFS filesystem, the following options are accepted.
|
||||||
and is still the default for now. Using the noikeep option,
|
and is still the default for now. Using the noikeep option,
|
||||||
inode clusters are returned to the free space pool.
|
inode clusters are returned to the free space pool.
|
||||||
|
|
||||||
|
inode64
|
||||||
|
Indicates that XFS is allowed to create inodes at any location
|
||||||
|
in the filesystem, including those which will result in inode
|
||||||
|
numbers occupying more than 32 bits of significance. This is
|
||||||
|
provided for backwards compatibility, but causes problems for
|
||||||
|
backup applications that cannot handle large inode numbers.
|
||||||
|
|
||||||
|
largeio/nolargeio
|
||||||
|
If "nolargeio" is specified, the optimal I/O reported in
|
||||||
|
st_blksize by stat(2) will be as small as possible to allow user
|
||||||
|
applications to avoid inefficient read/modify/write I/O.
|
||||||
|
If "largeio" specified, a filesystem that has a "swidth" specified
|
||||||
|
will return the "swidth" value (in bytes) in st_blksize. If the
|
||||||
|
filesystem does not have a "swidth" specified but does specify
|
||||||
|
an "allocsize" then "allocsize" (in bytes) will be returned
|
||||||
|
instead.
|
||||||
|
If neither of these two options are specified, then filesystem
|
||||||
|
will behave as if "nolargeio" was specified.
|
||||||
|
|
||||||
logbufs=value
|
logbufs=value
|
||||||
Set the number of in-memory log buffers. Valid numbers range
|
Set the number of in-memory log buffers. Valid numbers range
|
||||||
from 2-8 inclusive.
|
from 2-8 inclusive.
|
||||||
The default value is 8 buffers for filesystems with a
|
The default value is 8 buffers for filesystems with a
|
||||||
blocksize of 64K, 4 buffers for filesystems with a blocksize
|
blocksize of 64KiB, 4 buffers for filesystems with a blocksize
|
||||||
of 32K, 3 buffers for filesystems with a blocksize of 16K
|
of 32KiB, 3 buffers for filesystems with a blocksize of 16KiB
|
||||||
and 2 buffers for all other configurations. Increasing the
|
and 2 buffers for all other configurations. Increasing the
|
||||||
number of buffers may increase performance on some workloads
|
number of buffers may increase performance on some workloads
|
||||||
at the cost of the memory used for the additional log buffers
|
at the cost of the memory used for the additional log buffers
|
||||||
|
@ -49,10 +96,10 @@ When mounting an XFS filesystem, the following options are accepted.
|
||||||
logbsize=value
|
logbsize=value
|
||||||
Set the size of each in-memory log buffer.
|
Set the size of each in-memory log buffer.
|
||||||
Size may be specified in bytes, or in kilobytes with a "k" suffix.
|
Size may be specified in bytes, or in kilobytes with a "k" suffix.
|
||||||
Valid sizes for version 1 and version 2 logs are 16384 (16k) and
|
Valid sizes for version 1 and version 2 logs are 16384 (16k) and
|
||||||
32768 (32k). Valid sizes for version 2 logs also include
|
32768 (32k). Valid sizes for version 2 logs also include
|
||||||
65536 (64k), 131072 (128k) and 262144 (256k).
|
65536 (64k), 131072 (128k) and 262144 (256k).
|
||||||
The default value for machines with more than 32MB of memory
|
The default value for machines with more than 32MiB of memory
|
||||||
is 32768, machines with less memory use 16384 by default.
|
is 32768, machines with less memory use 16384 by default.
|
||||||
|
|
||||||
logdev=device and rtdev=device
|
logdev=device and rtdev=device
|
||||||
|
@ -62,6 +109,11 @@ When mounting an XFS filesystem, the following options are accepted.
|
||||||
optional, and the log section can be separate from the data
|
optional, and the log section can be separate from the data
|
||||||
section or contained within it.
|
section or contained within it.
|
||||||
|
|
||||||
|
mtpt=mountpoint
|
||||||
|
Use with the "dmapi" option. The value specified here will be
|
||||||
|
included in the DMAPI mount event, and should be the path of
|
||||||
|
the actual mountpoint that is used.
|
||||||
|
|
||||||
noalign
|
noalign
|
||||||
Data allocations will not be aligned at stripe unit boundaries.
|
Data allocations will not be aligned at stripe unit boundaries.
|
||||||
|
|
||||||
|
@ -91,13 +143,17 @@ When mounting an XFS filesystem, the following options are accepted.
|
||||||
O_SYNC writes can be lost if the system crashes.
|
O_SYNC writes can be lost if the system crashes.
|
||||||
If timestamp updates are critical, use the osyncisosync option.
|
If timestamp updates are critical, use the osyncisosync option.
|
||||||
|
|
||||||
quota/usrquota/uqnoenforce
|
uquota/usrquota/uqnoenforce/quota
|
||||||
User disk quota accounting enabled, and limits (optionally)
|
User disk quota accounting enabled, and limits (optionally)
|
||||||
enforced.
|
enforced. Refer to xfs_quota(8) for further details.
|
||||||
|
|
||||||
grpquota/gqnoenforce
|
gquota/grpquota/gqnoenforce
|
||||||
Group disk quota accounting enabled and limits (optionally)
|
Group disk quota accounting enabled and limits (optionally)
|
||||||
enforced.
|
enforced. Refer to xfs_quota(8) for further details.
|
||||||
|
|
||||||
|
pquota/prjquota/pqnoenforce
|
||||||
|
Project disk quota accounting enabled and limits (optionally)
|
||||||
|
enforced. Refer to xfs_quota(8) for further details.
|
||||||
|
|
||||||
sunit=value and swidth=value
|
sunit=value and swidth=value
|
||||||
Used to specify the stripe unit and width for a RAID device or
|
Used to specify the stripe unit and width for a RAID device or
|
||||||
|
@ -113,15 +169,21 @@ When mounting an XFS filesystem, the following options are accepted.
|
||||||
The "swidth" option is required if the "sunit" option has been
|
The "swidth" option is required if the "sunit" option has been
|
||||||
specified, and must be a multiple of the "sunit" value.
|
specified, and must be a multiple of the "sunit" value.
|
||||||
|
|
||||||
|
swalloc
|
||||||
|
Data allocations will be rounded up to stripe width boundaries
|
||||||
|
when the current end of file is being extended and the file
|
||||||
|
size is larger than the stripe width size.
|
||||||
|
|
||||||
|
|
||||||
sysctls
|
sysctls
|
||||||
=======
|
=======
|
||||||
|
|
||||||
The following sysctls are available for the XFS filesystem:
|
The following sysctls are available for the XFS filesystem:
|
||||||
|
|
||||||
fs.xfs.stats_clear (Min: 0 Default: 0 Max: 1)
|
fs.xfs.stats_clear (Min: 0 Default: 0 Max: 1)
|
||||||
Setting this to "1" clears accumulated XFS statistics
|
Setting this to "1" clears accumulated XFS statistics
|
||||||
in /proc/fs/xfs/stat. It then immediately resets to "0".
|
in /proc/fs/xfs/stat. It then immediately resets to "0".
|
||||||
|
|
||||||
fs.xfs.xfssyncd_centisecs (Min: 100 Default: 3000 Max: 720000)
|
fs.xfs.xfssyncd_centisecs (Min: 100 Default: 3000 Max: 720000)
|
||||||
The interval at which the xfssyncd thread flushes metadata
|
The interval at which the xfssyncd thread flushes metadata
|
||||||
out to disk. This thread will flush log activity out, and
|
out to disk. This thread will flush log activity out, and
|
||||||
|
@ -143,9 +205,9 @@ The following sysctls are available for the XFS filesystem:
|
||||||
XFS_ERRLEVEL_HIGH: 5
|
XFS_ERRLEVEL_HIGH: 5
|
||||||
|
|
||||||
fs.xfs.panic_mask (Min: 0 Default: 0 Max: 127)
|
fs.xfs.panic_mask (Min: 0 Default: 0 Max: 127)
|
||||||
Causes certain error conditions to call BUG(). Value is a bitmask;
|
Causes certain error conditions to call BUG(). Value is a bitmask;
|
||||||
AND together the tags which represent errors which should cause panics:
|
AND together the tags which represent errors which should cause panics:
|
||||||
|
|
||||||
XFS_NO_PTAG 0
|
XFS_NO_PTAG 0
|
||||||
XFS_PTAG_IFLUSH 0x00000001
|
XFS_PTAG_IFLUSH 0x00000001
|
||||||
XFS_PTAG_LOGRES 0x00000002
|
XFS_PTAG_LOGRES 0x00000002
|
||||||
|
@ -155,7 +217,7 @@ The following sysctls are available for the XFS filesystem:
|
||||||
XFS_PTAG_SHUTDOWN_IOERROR 0x00000020
|
XFS_PTAG_SHUTDOWN_IOERROR 0x00000020
|
||||||
XFS_PTAG_SHUTDOWN_LOGERROR 0x00000040
|
XFS_PTAG_SHUTDOWN_LOGERROR 0x00000040
|
||||||
|
|
||||||
This option is intended for debugging only.
|
This option is intended for debugging only.
|
||||||
|
|
||||||
fs.xfs.irix_symlink_mode (Min: 0 Default: 0 Max: 1)
|
fs.xfs.irix_symlink_mode (Min: 0 Default: 0 Max: 1)
|
||||||
Controls whether symlinks are created with mode 0777 (default)
|
Controls whether symlinks are created with mode 0777 (default)
|
||||||
|
@ -164,25 +226,37 @@ The following sysctls are available for the XFS filesystem:
|
||||||
fs.xfs.irix_sgid_inherit (Min: 0 Default: 0 Max: 1)
|
fs.xfs.irix_sgid_inherit (Min: 0 Default: 0 Max: 1)
|
||||||
Controls files created in SGID directories.
|
Controls files created in SGID directories.
|
||||||
If the group ID of the new file does not match the effective group
|
If the group ID of the new file does not match the effective group
|
||||||
ID or one of the supplementary group IDs of the parent dir, the
|
ID or one of the supplementary group IDs of the parent dir, the
|
||||||
ISGID bit is cleared if the irix_sgid_inherit compatibility sysctl
|
ISGID bit is cleared if the irix_sgid_inherit compatibility sysctl
|
||||||
is set.
|
is set.
|
||||||
|
|
||||||
fs.xfs.restrict_chown (Min: 0 Default: 1 Max: 1)
|
fs.xfs.restrict_chown (Min: 0 Default: 1 Max: 1)
|
||||||
Controls whether unprivileged users can use chown to "give away"
|
Controls whether unprivileged users can use chown to "give away"
|
||||||
a file to another user.
|
a file to another user.
|
||||||
|
|
||||||
fs.xfs.inherit_sync (Min: 0 Default: 1 Max 1)
|
fs.xfs.inherit_sync (Min: 0 Default: 1 Max: 1)
|
||||||
Setting this to "1" will cause the "sync" flag set
|
Setting this to "1" will cause the "sync" flag set
|
||||||
by the chattr(1) command on a directory to be
|
by the xfs_io(8) chattr command on a directory to be
|
||||||
inherited by files in that directory.
|
inherited by files in that directory.
|
||||||
|
|
||||||
fs.xfs.inherit_nodump (Min: 0 Default: 1 Max 1)
|
fs.xfs.inherit_nodump (Min: 0 Default: 1 Max: 1)
|
||||||
Setting this to "1" will cause the "nodump" flag set
|
Setting this to "1" will cause the "nodump" flag set
|
||||||
by the chattr(1) command on a directory to be
|
by the xfs_io(8) chattr command on a directory to be
|
||||||
inherited by files in that directory.
|
inherited by files in that directory.
|
||||||
|
|
||||||
fs.xfs.inherit_noatime (Min: 0 Default: 1 Max 1)
|
fs.xfs.inherit_noatime (Min: 0 Default: 1 Max: 1)
|
||||||
Setting this to "1" will cause the "noatime" flag set
|
Setting this to "1" will cause the "noatime" flag set
|
||||||
by the chattr(1) command on a directory to be
|
by the xfs_io(8) chattr command on a directory to be
|
||||||
inherited by files in that directory.
|
inherited by files in that directory.
|
||||||
|
|
||||||
|
fs.xfs.inherit_nosymlinks (Min: 0 Default: 1 Max: 1)
|
||||||
|
Setting this to "1" will cause the "nosymlinks" flag set
|
||||||
|
by the xfs_io(8) chattr command on a directory to be
|
||||||
|
inherited by files in that directory.
|
||||||
|
|
||||||
|
fs.xfs.rotorstep (Min: 1 Default: 1 Max: 256)
|
||||||
|
In "inode32" allocation mode, this option determines how many
|
||||||
|
files the allocator attempts to allocate in the same allocation
|
||||||
|
group before moving to the next allocation group. The intent
|
||||||
|
is to control the rate at which the allocator moves between
|
||||||
|
allocation groups when allocating extents for new files.
|
||||||
|
|
|
@ -1,18 +1,21 @@
|
||||||
High Precision Event Timer Driver for Linux
|
High Precision Event Timer Driver for Linux
|
||||||
|
|
||||||
The High Precision Event Timer (HPET) hardware is the future replacement for the 8254 and Real
|
The High Precision Event Timer (HPET) hardware is the future replacement
|
||||||
Time Clock (RTC) periodic timer functionality. Each HPET can have up two 32 timers. It is possible
|
for the 8254 and Real Time Clock (RTC) periodic timer functionality.
|
||||||
to configure the first two timers as legacy replacements for 8254 and RTC periodic. A specification
|
Each HPET can have up two 32 timers. It is possible to configure the
|
||||||
done by INTEL and Microsoft can be found at http://www.intel.com/labs/platcomp/hpet/hpetspec.htm.
|
first two timers as legacy replacements for 8254 and RTC periodic timers.
|
||||||
|
A specification done by Intel and Microsoft can be found at
|
||||||
|
<http://www.intel.com/hardwaredesign/hpetspec.htm>.
|
||||||
|
|
||||||
The driver supports detection of HPET driver allocation and initialization of the HPET before the
|
The driver supports detection of HPET driver allocation and initialization
|
||||||
driver module_init routine is called. This enables platform code which uses timer 0 or 1 as the
|
of the HPET before the driver module_init routine is called. This enables
|
||||||
main timer to intercept HPET initialization. An example of this initialization can be found in
|
platform code which uses timer 0 or 1 as the main timer to intercept HPET
|
||||||
|
initialization. An example of this initialization can be found in
|
||||||
arch/i386/kernel/time_hpet.c.
|
arch/i386/kernel/time_hpet.c.
|
||||||
|
|
||||||
The driver provides two APIs which are very similar to the API found in the rtc.c driver.
|
The driver provides two APIs which are very similar to the API found in
|
||||||
There is a user space API and a kernel space API. An example user space program is provided
|
the rtc.c driver. There is a user space API and a kernel space API.
|
||||||
below.
|
An example user space program is provided below.
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -290,9 +293,8 @@ The kernel API has three interfaces exported from the driver:
|
||||||
hpet_unregister(struct hpet_task *tp)
|
hpet_unregister(struct hpet_task *tp)
|
||||||
hpet_control(struct hpet_task *tp, unsigned int cmd, unsigned long arg)
|
hpet_control(struct hpet_task *tp, unsigned int cmd, unsigned long arg)
|
||||||
|
|
||||||
The kernel module using this interface fills in the ht_func and ht_data members of the
|
The kernel module using this interface fills in the ht_func and ht_data
|
||||||
hpet_task structure before calling hpet_register. hpet_control simply vectors to the hpet_ioctl
|
members of the hpet_task structure before calling hpet_register.
|
||||||
routine and has the same commands and respective arguments as the user API. hpet_unregister
|
hpet_control simply vectors to the hpet_ioctl routine and has the same
|
||||||
|
commands and respective arguments as the user API. hpet_unregister
|
||||||
is used to terminate usage of the HPET timer reserved by hpet_register.
|
is used to terminate usage of the HPET timer reserved by hpet_register.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -120,7 +120,7 @@ ISDN_NET_MAGIC 0x49344C02 isdn_net_local_s drivers/isdn/i4l/isdn_net_li
|
||||||
SAVEKMSG_MAGIC2 0x4B4D5347 savekmsg arch/*/amiga/config.c
|
SAVEKMSG_MAGIC2 0x4B4D5347 savekmsg arch/*/amiga/config.c
|
||||||
STLI_BOARDMAGIC 0x4bc6c825 stlibrd include/linux/istallion.h
|
STLI_BOARDMAGIC 0x4bc6c825 stlibrd include/linux/istallion.h
|
||||||
CS_STATE_MAGIC 0x4c4f4749 cs_state sound/oss/cs46xx.c
|
CS_STATE_MAGIC 0x4c4f4749 cs_state sound/oss/cs46xx.c
|
||||||
SLAB_C_MAGIC 0x4f17a36d kmem_cache_s mm/slab.c
|
SLAB_C_MAGIC 0x4f17a36d kmem_cache mm/slab.c
|
||||||
COW_MAGIC 0x4f4f4f4d cow_header_v1 arch/um/drivers/ubd_user.c
|
COW_MAGIC 0x4f4f4f4d cow_header_v1 arch/um/drivers/ubd_user.c
|
||||||
I810_CARD_MAGIC 0x5072696E i810_card sound/oss/i810_audio.c
|
I810_CARD_MAGIC 0x5072696E i810_card sound/oss/i810_audio.c
|
||||||
TRIDENT_CARD_MAGIC 0x5072696E trident_card sound/oss/trident.c
|
TRIDENT_CARD_MAGIC 0x5072696E trident_card sound/oss/trident.c
|
||||||
|
|
|
@ -176,8 +176,6 @@ information (_most_ of which _is_ _essential_) includes:
|
||||||
- Which client caused the problem ?
|
- Which client caused the problem ?
|
||||||
- How much data was being transferred ?
|
- How much data was being transferred ?
|
||||||
- Was the network congested ?
|
- Was the network congested ?
|
||||||
- If there was a kernel panic, please run the output through ksymoops
|
|
||||||
before sending it to me, otherwise its _useless_.
|
|
||||||
- How can the problem be reproduced ?
|
- How can the problem be reproduced ?
|
||||||
- Can you use tcpdump to get a trace ? (N.B. Most (all?) versions of
|
- Can you use tcpdump to get a trace ? (N.B. Most (all?) versions of
|
||||||
tcpdump don't understand how to dump DECnet properly, so including
|
tcpdump don't understand how to dump DECnet properly, so including
|
||||||
|
|
|
@ -1,48 +1,153 @@
|
||||||
S2IO Technologies XFrame 10 Gig adapter.
|
Release notes for Neterion's (Formerly S2io) Xframe I/II PCI-X 10GbE driver.
|
||||||
-------------------------------------------
|
|
||||||
|
|
||||||
I. Module loadable parameters.
|
Contents
|
||||||
When loaded as a module, the driver provides a host of Module loadable
|
=======
|
||||||
parameters, so the device can be tuned as per the users needs.
|
- 1. Introduction
|
||||||
A list of the Module params is given below.
|
- 2. Identifying the adapter/interface
|
||||||
(i) ring_num: This can be used to program the number of
|
- 3. Features supported
|
||||||
receive rings used in the driver.
|
- 4. Command line parameters
|
||||||
(ii) ring_len: This defines the number of descriptors each ring
|
- 5. Performance suggestions
|
||||||
can have. There can be a maximum of 8 rings.
|
- 6. Available Downloads
|
||||||
(iii) frame_len: This is an array of size 8. Using this we can
|
|
||||||
set the maximum size of the received frame that can
|
|
||||||
be steered into the corrsponding receive ring.
|
|
||||||
(iv) fifo_num: This defines the number of Tx FIFOs thats used in
|
|
||||||
the driver.
|
|
||||||
(v) fifo_len: Each element defines the number of
|
|
||||||
Tx descriptors that can be associated with each
|
|
||||||
corresponding FIFO. There are a maximum of 8 FIFOs.
|
|
||||||
(vi) tx_prio: This is a bool, if module is loaded with a non-zero
|
|
||||||
value for tx_prio multi FIFO scheme is activated.
|
|
||||||
(vii) rx_prio: This is a bool, if module is loaded with a non-zero
|
|
||||||
value for tx_prio multi RING scheme is activated.
|
|
||||||
(viii) latency_timer: The value given against this param will be
|
|
||||||
loaded into the latency timer register in PCI Config
|
|
||||||
space, else the register is left with its reset value.
|
|
||||||
|
|
||||||
II. Performance tuning.
|
|
||||||
By changing a few sysctl parameters.
|
1. Introduction:
|
||||||
Copy the following lines into a file and run the following command,
|
This Linux driver supports Neterion's Xframe I PCI-X 1.0 and
|
||||||
"sysctl -p <file_name>"
|
Xframe II PCI-X 2.0 adapters. It supports several features
|
||||||
### IPV4 specific settings
|
such as jumbo frames, MSI/MSI-X, checksum offloads, TSO, UFO and so on.
|
||||||
net.ipv4.tcp_timestamps = 0 # turns TCP timestamp support off, default 1, reduces CPU use
|
See below for complete list of features.
|
||||||
net.ipv4.tcp_sack = 0 # turn SACK support off, default on
|
All features are supported for both IPv4 and IPv6.
|
||||||
# on systems with a VERY fast bus -> memory interface this is the big gainer
|
|
||||||
net.ipv4.tcp_rmem = 10000000 10000000 10000000 # sets min/default/max TCP read buffer, default 4096 87380 174760
|
2. Identifying the adapter/interface:
|
||||||
net.ipv4.tcp_wmem = 10000000 10000000 10000000 # sets min/pressure/max TCP write buffer, default 4096 16384 131072
|
a. Insert the adapter(s) in your system.
|
||||||
net.ipv4.tcp_mem = 10000000 10000000 10000000 # sets min/pressure/max TCP buffer space, default 31744 32256 32768
|
b. Build and load driver
|
||||||
|
# insmod s2io.ko
|
||||||
### CORE settings (mostly for socket and UDP effect)
|
c. View log messages
|
||||||
net.core.rmem_max = 524287 # maximum receive socket buffer size, default 131071
|
# dmesg | tail -40
|
||||||
net.core.wmem_max = 524287 # maximum send socket buffer size, default 131071
|
You will see messages similar to:
|
||||||
net.core.rmem_default = 524287 # default receive socket buffer size, default 65535
|
eth3: Neterion Xframe I 10GbE adapter (rev 3), Version 2.0.9.1, Intr type INTA
|
||||||
net.core.wmem_default = 524287 # default send socket buffer size, default 65535
|
eth4: Neterion Xframe II 10GbE adapter (rev 2), Version 2.0.9.1, Intr type INTA
|
||||||
net.core.optmem_max = 524287 # maximum amount of option memory buffers, default 10240
|
eth4: Device is on 64 bit 133MHz PCIX(M1) bus
|
||||||
net.core.netdev_max_backlog = 300000 # number of unprocessed input packets before kernel starts dropping them, default 300
|
|
||||||
---End of performance tuning file---
|
The above messages identify the adapter type(Xframe I/II), adapter revision,
|
||||||
|
driver version, interface name(eth3, eth4), Interrupt type(INTA, MSI, MSI-X).
|
||||||
|
In case of Xframe II, the PCI/PCI-X bus width and frequency are displayed
|
||||||
|
as well.
|
||||||
|
|
||||||
|
To associate an interface with a physical adapter use "ethtool -p <ethX>".
|
||||||
|
The corresponding adapter's LED will blink multiple times.
|
||||||
|
|
||||||
|
3. Features supported:
|
||||||
|
a. Jumbo frames. Xframe I/II supports MTU upto 9600 bytes,
|
||||||
|
modifiable using ifconfig command.
|
||||||
|
|
||||||
|
b. Offloads. Supports checksum offload(TCP/UDP/IP) on transmit
|
||||||
|
and receive, TSO.
|
||||||
|
|
||||||
|
c. Multi-buffer receive mode. Scattering of packet across multiple
|
||||||
|
buffers. Currently driver supports 2-buffer mode which yields
|
||||||
|
significant performance improvement on certain platforms(SGI Altix,
|
||||||
|
IBM xSeries).
|
||||||
|
|
||||||
|
d. MSI/MSI-X. Can be enabled on platforms which support this feature
|
||||||
|
(IA64, Xeon) resulting in noticeable performance improvement(upto 7%
|
||||||
|
on certain platforms).
|
||||||
|
|
||||||
|
e. NAPI. Compile-time option(CONFIG_S2IO_NAPI) for better Rx interrupt
|
||||||
|
moderation.
|
||||||
|
|
||||||
|
f. Statistics. Comprehensive MAC-level and software statistics displayed
|
||||||
|
using "ethtool -S" option.
|
||||||
|
|
||||||
|
g. Multi-FIFO/Ring. Supports up to 8 transmit queues and receive rings,
|
||||||
|
with multiple steering options.
|
||||||
|
|
||||||
|
4. Command line parameters
|
||||||
|
a. tx_fifo_num
|
||||||
|
Number of transmit queues
|
||||||
|
Valid range: 1-8
|
||||||
|
Default: 1
|
||||||
|
|
||||||
|
b. rx_ring_num
|
||||||
|
Number of receive rings
|
||||||
|
Valid range: 1-8
|
||||||
|
Default: 1
|
||||||
|
|
||||||
|
c. tx_fifo_len
|
||||||
|
Size of each transmit queue
|
||||||
|
Valid range: Total length of all queues should not exceed 8192
|
||||||
|
Default: 4096
|
||||||
|
|
||||||
|
d. rx_ring_sz
|
||||||
|
Size of each receive ring(in 4K blocks)
|
||||||
|
Valid range: Limited by memory on system
|
||||||
|
Default: 30
|
||||||
|
|
||||||
|
e. intr_type
|
||||||
|
Specifies interrupt type. Possible values 1(INTA), 2(MSI), 3(MSI-X)
|
||||||
|
Valid range: 1-3
|
||||||
|
Default: 1
|
||||||
|
|
||||||
|
5. Performance suggestions
|
||||||
|
General:
|
||||||
|
a. Set MTU to maximum(9000 for switch setup, 9600 in back-to-back configuration)
|
||||||
|
b. Set TCP windows size to optimal value.
|
||||||
|
For instance, for MTU=1500 a value of 210K has been observed to result in
|
||||||
|
good performance.
|
||||||
|
# sysctl -w net.ipv4.tcp_rmem="210000 210000 210000"
|
||||||
|
# sysctl -w net.ipv4.tcp_wmem="210000 210000 210000"
|
||||||
|
For MTU=9000, TCP window size of 10 MB is recommended.
|
||||||
|
# sysctl -w net.ipv4.tcp_rmem="10000000 10000000 10000000"
|
||||||
|
# sysctl -w net.ipv4.tcp_wmem="10000000 10000000 10000000"
|
||||||
|
|
||||||
|
Transmit performance:
|
||||||
|
a. By default, the driver respects BIOS settings for PCI bus parameters.
|
||||||
|
However, you may want to experiment with PCI bus parameters
|
||||||
|
max-split-transactions(MOST) and MMRBC (use setpci command).
|
||||||
|
A MOST value of 2 has been found optimal for Opterons and 3 for Itanium.
|
||||||
|
It could be different for your hardware.
|
||||||
|
Set MMRBC to 4K**.
|
||||||
|
|
||||||
|
For example you can set
|
||||||
|
For opteron
|
||||||
|
#setpci -d 17d5:* 62=1d
|
||||||
|
For Itanium
|
||||||
|
#setpci -d 17d5:* 62=3d
|
||||||
|
|
||||||
|
For detailed description of the PCI registers, please see Xframe User Guide.
|
||||||
|
|
||||||
|
b. Ensure Transmit Checksum offload is enabled. Use ethtool to set/verify this
|
||||||
|
parameter.
|
||||||
|
c. Turn on TSO(using "ethtool -K")
|
||||||
|
# ethtool -K <ethX> tso on
|
||||||
|
|
||||||
|
Receive performance:
|
||||||
|
a. By default, the driver respects BIOS settings for PCI bus parameters.
|
||||||
|
However, you may want to set PCI latency timer to 248.
|
||||||
|
#setpci -d 17d5:* LATENCY_TIMER=f8
|
||||||
|
For detailed description of the PCI registers, please see Xframe User Guide.
|
||||||
|
b. Use 2-buffer mode. This results in large performance boost on
|
||||||
|
on certain platforms(eg. SGI Altix, IBM xSeries).
|
||||||
|
c. Ensure Receive Checksum offload is enabled. Use "ethtool -K ethX" command to
|
||||||
|
set/verify this option.
|
||||||
|
d. Enable NAPI feature(in kernel configuration Device Drivers ---> Network
|
||||||
|
device support ---> Ethernet (10000 Mbit) ---> S2IO 10Gbe Xframe NIC) to
|
||||||
|
bring down CPU utilization.
|
||||||
|
|
||||||
|
** For AMD opteron platforms with 8131 chipset, MMRBC=1 and MOST=1 are
|
||||||
|
recommended as safe parameters.
|
||||||
|
For more information, please review the AMD8131 errata at
|
||||||
|
http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/26310.pdf
|
||||||
|
|
||||||
|
6. Available Downloads
|
||||||
|
Neterion "s2io" driver in Red Hat and Suse 2.6-based distributions is kept up
|
||||||
|
to date, also the latest "s2io" code (including support for 2.4 kernels) is
|
||||||
|
available via "Support" link on the Neterion site: http://www.neterion.com.
|
||||||
|
|
||||||
|
For Xframe User Guide (Programming manual), visit ftp site ns1.s2io.com,
|
||||||
|
user: linuxdocs password: HALdocs
|
||||||
|
|
||||||
|
7. Support
|
||||||
|
For further support please contact either your 10GbE Xframe NIC vendor (IBM,
|
||||||
|
HP, SGI etc.) or click on the "Support" link on the Neterion site:
|
||||||
|
http://www.neterion.com.
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
NOTE: ksymoops is useless on 2.6. Please use the Oops in its original format
|
NOTE: ksymoops is useless on 2.6. Please use the Oops in its original format
|
||||||
(from dmesg, etc). Ignore any references in this or other docs to "decoding
|
(from dmesg, etc). Ignore any references in this or other docs to "decoding
|
||||||
the Oops" or "running it through ksymoops". If you post an Oops fron 2.6 that
|
the Oops" or "running it through ksymoops". If you post an Oops from 2.6 that
|
||||||
has been run through ksymoops, people will just tell you to repost it.
|
has been run through ksymoops, people will just tell you to repost it.
|
||||||
|
|
||||||
Quick Summary
|
Quick Summary
|
||||||
|
|
|
@ -11,9 +11,9 @@ boot video card. (Kernel usually does not even contain video card
|
||||||
driver -- vesafb and vgacon are widely used).
|
driver -- vesafb and vgacon are widely used).
|
||||||
|
|
||||||
This is not problem for swsusp, because during swsusp resume, BIOS is
|
This is not problem for swsusp, because during swsusp resume, BIOS is
|
||||||
run normally so video card is normally initialized. S3 has absolutely
|
run normally so video card is normally initialized. It should not be
|
||||||
no chance of working with SMP/HT. Be sure it to turn it off before
|
problem for S1 standby, because hardware should retain its state over
|
||||||
testing (swsusp should work ok, OTOH).
|
that.
|
||||||
|
|
||||||
There are a few types of systems where video works after S3 resume:
|
There are a few types of systems where video works after S3 resume:
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ your video card (good luck getting docs :-(). Maybe suspending from X
|
||||||
(proper X, knowing your hardware, not XF68_FBcon) might have better
|
(proper X, knowing your hardware, not XF68_FBcon) might have better
|
||||||
chance of working.
|
chance of working.
|
||||||
|
|
||||||
Table of known working systems:
|
Table of known working notebooks:
|
||||||
|
|
||||||
Model hack (or "how to do it")
|
Model hack (or "how to do it")
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
@ -73,7 +73,7 @@ Acer TM 242FX vbetool (6)
|
||||||
Acer TM C110 video_post (8)
|
Acer TM C110 video_post (8)
|
||||||
Acer TM C300 vga=normal (only suspend on console, not in X), vbetool (6) or video_post (8)
|
Acer TM C300 vga=normal (only suspend on console, not in X), vbetool (6) or video_post (8)
|
||||||
Acer TM 4052LCi s3_bios (2)
|
Acer TM 4052LCi s3_bios (2)
|
||||||
Acer TM 636Lci s3_bios vga=normal (2)
|
Acer TM 636Lci s3_bios,s3_mode (4)
|
||||||
Acer TM 650 (Radeon M7) vga=normal plus boot-radeon (5) gets text console back
|
Acer TM 650 (Radeon M7) vga=normal plus boot-radeon (5) gets text console back
|
||||||
Acer TM 660 ??? (*)
|
Acer TM 660 ??? (*)
|
||||||
Acer TM 800 vga=normal, X patches, see webpage (5) or vbetool (6)
|
Acer TM 800 vga=normal, X patches, see webpage (5) or vbetool (6)
|
||||||
|
@ -137,6 +137,13 @@ Toshiba Satellite P10-554 s3_bios,s3_mode (4)(****)
|
||||||
Toshiba M30 (2) xor X with nvidia driver using internal AGP
|
Toshiba M30 (2) xor X with nvidia driver using internal AGP
|
||||||
Uniwill 244IIO ??? (*)
|
Uniwill 244IIO ??? (*)
|
||||||
|
|
||||||
|
Known working desktop systems
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Mainboard Graphics card hack (or "how to do it")
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
Asus A7V8X nVidia RIVA TNT2 model 64 s3_bios,s3_mode (4)
|
||||||
|
|
||||||
|
|
||||||
(*) from http://www.ubuntulinux.org/wiki/HoaryPMResults, not sure
|
(*) from http://www.ubuntulinux.org/wiki/HoaryPMResults, not sure
|
||||||
which options to use. If you know, please tell me.
|
which options to use. If you know, please tell me.
|
||||||
|
|
|
@ -8,11 +8,10 @@ All devices which can be addressed by means of ccws are called 'CCW devices' -
|
||||||
even if they aren't actually driven by ccws.
|
even if they aren't actually driven by ccws.
|
||||||
|
|
||||||
All ccw devices are accessed via a subchannel, this is reflected in the
|
All ccw devices are accessed via a subchannel, this is reflected in the
|
||||||
structures under root/:
|
structures under devices/:
|
||||||
|
|
||||||
root/
|
devices/
|
||||||
- sys
|
- system/
|
||||||
- legacy
|
|
||||||
- css0/
|
- css0/
|
||||||
- 0.0.0000/0.0.0815/
|
- 0.0.0000/0.0.0815/
|
||||||
- 0.0.0001/0.0.4711/
|
- 0.0.0001/0.0.4711/
|
||||||
|
@ -36,7 +35,7 @@ availability: Can be 'good' or 'boxed'; 'no path' or 'no device' for
|
||||||
|
|
||||||
online: An interface to set the device online and offline.
|
online: An interface to set the device online and offline.
|
||||||
In the special case of the device being disconnected (see the
|
In the special case of the device being disconnected (see the
|
||||||
notify function under 1.2), piping 0 to online will focibly delete
|
notify function under 1.2), piping 0 to online will forcibly delete
|
||||||
the device.
|
the device.
|
||||||
|
|
||||||
The device drivers can add entries to export per-device data and interfaces.
|
The device drivers can add entries to export per-device data and interfaces.
|
||||||
|
@ -222,7 +221,7 @@ and are called 'chp0.<chpid>'. They have no driver and do not belong to any bus.
|
||||||
Please note, that unlike /proc/chpids in 2.4, the channel path objects reflect
|
Please note, that unlike /proc/chpids in 2.4, the channel path objects reflect
|
||||||
only the logical state and not the physical state, since we cannot track the
|
only the logical state and not the physical state, since we cannot track the
|
||||||
latter consistently due to lacking machine support (we don't need to be aware
|
latter consistently due to lacking machine support (we don't need to be aware
|
||||||
of anyway).
|
of it anyway).
|
||||||
|
|
||||||
status - Can be 'online' or 'offline'.
|
status - Can be 'online' or 'offline'.
|
||||||
Piping 'on' or 'off' sets the chpid logically online/offline.
|
Piping 'on' or 'off' sets the chpid logically online/offline.
|
||||||
|
@ -235,12 +234,16 @@ status - Can be 'online' or 'offline'.
|
||||||
3. System devices
|
3. System devices
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
Note: cpus may yet be added here.
|
|
||||||
|
|
||||||
3.1 xpram
|
3.1 xpram
|
||||||
---------
|
---------
|
||||||
|
|
||||||
xpram shows up under sys/ as 'xpram'.
|
xpram shows up under devices/system/ as 'xpram'.
|
||||||
|
|
||||||
|
3.2 cpus
|
||||||
|
--------
|
||||||
|
|
||||||
|
For each cpu, a directory is created under devices/system/cpu/. Each cpu has an
|
||||||
|
attribute 'online' which can be 0 or 1.
|
||||||
|
|
||||||
|
|
||||||
4. Other devices
|
4. Other devices
|
||||||
|
|
45
Documentation/scsi/LICENSE.qla2xxx
Normal file
45
Documentation/scsi/LICENSE.qla2xxx
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
Copyright (c) 2003-2005 QLogic Corporation
|
||||||
|
QLogic Linux Fibre Channel HBA Driver
|
||||||
|
|
||||||
|
This program includes a device driver for Linux 2.6 that may be
|
||||||
|
distributed with QLogic hardware specific firmware binary file.
|
||||||
|
You may modify and redistribute the device driver code under the
|
||||||
|
GNU General Public License as published by the Free Software
|
||||||
|
Foundation (version 2 or a later version).
|
||||||
|
|
||||||
|
You may redistribute the hardware specific firmware binary file
|
||||||
|
under the following terms:
|
||||||
|
|
||||||
|
1. Redistribution of source code (only if applicable),
|
||||||
|
must retain the above copyright notice, this list of
|
||||||
|
conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. Redistribution in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the
|
||||||
|
following disclaimer in the documentation and/or other
|
||||||
|
materials provided with the distribution.
|
||||||
|
|
||||||
|
3. The name of QLogic Corporation may not be used to
|
||||||
|
endorse or promote products derived from this software
|
||||||
|
without specific prior written permission
|
||||||
|
|
||||||
|
REGARDLESS OF WHAT LICENSING MECHANISM IS USED OR APPLICABLE,
|
||||||
|
THIS PROGRAM IS PROVIDED BY QLOGIC CORPORATION "AS IS'' AND ANY
|
||||||
|
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR
|
||||||
|
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||||
|
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
USER ACKNOWLEDGES AND AGREES THAT USE OF THIS PROGRAM WILL NOT
|
||||||
|
CREATE OR GIVE GROUNDS FOR A LICENSE BY IMPLICATION, ESTOPPEL, OR
|
||||||
|
OTHERWISE IN ANY INTELLECTUAL PROPERTY RIGHTS (PATENT, COPYRIGHT,
|
||||||
|
TRADE SECRET, MASK WORK, OR OTHER PROPRIETARY RIGHT) EMBODIED IN
|
||||||
|
ANY OTHER QLOGIC HARDWARE OR SOFTWARE EITHER SOLELY OR IN
|
||||||
|
COMBINATION WITH THIS PROGRAM.
|
|
@ -167,7 +167,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
spdif - Support SPDIF I/O
|
spdif - Support SPDIF I/O
|
||||||
- Default: disabled
|
- Default: disabled
|
||||||
|
|
||||||
Module supports autoprobe and multiple chips (max 8).
|
This module supports one chip and autoprobe.
|
||||||
|
|
||||||
The power-management is supported.
|
The power-management is supported.
|
||||||
|
|
||||||
|
@ -206,7 +206,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
See "AC97 Quirk Option" section below.
|
See "AC97 Quirk Option" section below.
|
||||||
spdif_aclink - S/PDIF transfer over AC-link (default = 1)
|
spdif_aclink - S/PDIF transfer over AC-link (default = 1)
|
||||||
|
|
||||||
This module supports up to 8 cards and autoprobe.
|
This module supports one card and autoprobe.
|
||||||
|
|
||||||
ATI IXP has two different methods to control SPDIF output. One is
|
ATI IXP has two different methods to control SPDIF output. One is
|
||||||
over AC-link and another is over the "direct" SPDIF output. The
|
over AC-link and another is over the "direct" SPDIF output. The
|
||||||
|
@ -218,7 +218,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
|
|
||||||
Module for ATI IXP 150/200/250 AC97 modem controllers.
|
Module for ATI IXP 150/200/250 AC97 modem controllers.
|
||||||
|
|
||||||
Module supports up to 8 cards.
|
This module supports one card and autoprobe.
|
||||||
|
|
||||||
Note: The default index value of this module is -2, i.e. the first
|
Note: The default index value of this module is -2, i.e. the first
|
||||||
slot is excluded.
|
slot is excluded.
|
||||||
|
@ -637,7 +637,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
model - force the model name
|
model - force the model name
|
||||||
position_fix - Fix DMA pointer (0 = auto, 1 = none, 2 = POSBUF, 3 = FIFO size)
|
position_fix - Fix DMA pointer (0 = auto, 1 = none, 2 = POSBUF, 3 = FIFO size)
|
||||||
|
|
||||||
Module supports up to 8 cards.
|
This module supports one card and autoprobe.
|
||||||
|
|
||||||
Each codec may have a model table for different configurations.
|
Each codec may have a model table for different configurations.
|
||||||
If your machine isn't listed there, the default (usually minimal)
|
If your machine isn't listed there, the default (usually minimal)
|
||||||
|
@ -663,6 +663,10 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
adjusted. Appearing only when compiled with
|
adjusted. Appearing only when compiled with
|
||||||
$CONFIG_SND_DEBUG=y
|
$CONFIG_SND_DEBUG=y
|
||||||
|
|
||||||
|
ALC260
|
||||||
|
hp HP machines
|
||||||
|
fujitsu Fujitsu S7020
|
||||||
|
|
||||||
CMI9880
|
CMI9880
|
||||||
minimal 3-jack in back
|
minimal 3-jack in back
|
||||||
min_fp 3-jack in back, 2-jack in front
|
min_fp 3-jack in back, 2-jack in front
|
||||||
|
@ -811,7 +815,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
semaphores (e.g. on some ASUS laptops)
|
semaphores (e.g. on some ASUS laptops)
|
||||||
(default off)
|
(default off)
|
||||||
|
|
||||||
Module supports autoprobe and multiple bus-master chips (max 8).
|
This module supports one chip and autoprobe.
|
||||||
|
|
||||||
Note: the latest driver supports auto-detection of chip clock.
|
Note: the latest driver supports auto-detection of chip clock.
|
||||||
if you still encounter too fast playback, specify the clock
|
if you still encounter too fast playback, specify the clock
|
||||||
|
@ -830,7 +834,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
|
|
||||||
ac97_clock - AC'97 codec clock base (0 = auto-detect)
|
ac97_clock - AC'97 codec clock base (0 = auto-detect)
|
||||||
|
|
||||||
This module supports up to 8 cards and autoprobe.
|
This module supports one card and autoprobe.
|
||||||
|
|
||||||
Note: The default index value of this module is -2, i.e. the first
|
Note: The default index value of this module is -2, i.e. the first
|
||||||
slot is excluded.
|
slot is excluded.
|
||||||
|
@ -950,8 +954,10 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
use_cache - 0 or 1 (disabled by default)
|
use_cache - 0 or 1 (disabled by default)
|
||||||
vaio_hack - alias buffer_top=0x25a800
|
vaio_hack - alias buffer_top=0x25a800
|
||||||
reset_workaround - enable AC97 RESET workaround for some laptops
|
reset_workaround - enable AC97 RESET workaround for some laptops
|
||||||
|
reset_workaround2 - enable extended AC97 RESET workaround for some
|
||||||
|
other laptops
|
||||||
|
|
||||||
Module supports autoprobe and multiple chips (max 8).
|
This module supports one chip and autoprobe.
|
||||||
|
|
||||||
The power-management is supported.
|
The power-management is supported.
|
||||||
|
|
||||||
|
@ -980,6 +986,11 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
workaround is enabled automatically. For other laptops with a
|
workaround is enabled automatically. For other laptops with a
|
||||||
hard freeze, you can try reset_workaround=1 option.
|
hard freeze, you can try reset_workaround=1 option.
|
||||||
|
|
||||||
|
Note: Dell Latitude CSx laptops have another problem regarding
|
||||||
|
AC97 RESET. On these laptops, reset_workaround2 option is
|
||||||
|
turned on as default. This option is worth to try if the
|
||||||
|
previous reset_workaround option doesn't help.
|
||||||
|
|
||||||
Note: This driver is really crappy. It's a porting from the
|
Note: This driver is really crappy. It's a porting from the
|
||||||
OSS driver, which is a result of black-magic reverse engineering.
|
OSS driver, which is a result of black-magic reverse engineering.
|
||||||
The detection of codec will fail if the driver is loaded *after*
|
The detection of codec will fail if the driver is loaded *after*
|
||||||
|
@ -1310,7 +1321,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
ac97_quirk - AC'97 workaround for strange hardware
|
ac97_quirk - AC'97 workaround for strange hardware
|
||||||
See "AC97 Quirk Option" section below.
|
See "AC97 Quirk Option" section below.
|
||||||
|
|
||||||
Module supports autoprobe and multiple bus-master chips (max 8).
|
This module supports one chip and autoprobe.
|
||||||
|
|
||||||
Note: on some SMP motherboards like MSI 694D the interrupts might
|
Note: on some SMP motherboards like MSI 694D the interrupts might
|
||||||
not be generated properly. In such a case, please try to
|
not be generated properly. In such a case, please try to
|
||||||
|
@ -1352,7 +1363,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
|
|
||||||
ac97_clock - AC'97 codec clock base (default 48000Hz)
|
ac97_clock - AC'97 codec clock base (default 48000Hz)
|
||||||
|
|
||||||
Module supports up to 8 cards.
|
This module supports one card and autoprobe.
|
||||||
|
|
||||||
Note: The default index value of this module is -2, i.e. the first
|
Note: The default index value of this module is -2, i.e. the first
|
||||||
slot is excluded.
|
slot is excluded.
|
||||||
|
|
|
@ -18,8 +18,8 @@
|
||||||
</affiliation>
|
</affiliation>
|
||||||
</author>
|
</author>
|
||||||
|
|
||||||
<date>March 6, 2005</date>
|
<date>October 6, 2005</date>
|
||||||
<edition>0.3.4</edition>
|
<edition>0.3.5</edition>
|
||||||
|
|
||||||
<abstract>
|
<abstract>
|
||||||
<para>
|
<para>
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
<legalnotice>
|
<legalnotice>
|
||||||
<para>
|
<para>
|
||||||
Copyright (c) 2002-2004 Takashi Iwai <email>tiwai@suse.de</email>
|
Copyright (c) 2002-2005 Takashi Iwai <email>tiwai@suse.de</email>
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
|
@ -1433,25 +1433,10 @@
|
||||||
<informalexample>
|
<informalexample>
|
||||||
<programlisting>
|
<programlisting>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
if (chip->res_port) {
|
release_and_free_resource(chip->res_port);
|
||||||
release_resource(chip->res_port);
|
|
||||||
kfree_nocheck(chip->res_port);
|
|
||||||
}
|
|
||||||
]]>
|
]]>
|
||||||
</programlisting>
|
</programlisting>
|
||||||
</informalexample>
|
</informalexample>
|
||||||
|
|
||||||
As you can see, the resource pointer is also to be freed
|
|
||||||
via <function>kfree_nocheck()</function> after
|
|
||||||
<function>release_resource()</function> is called. You
|
|
||||||
cannot use <function>kfree()</function> here, because on ALSA,
|
|
||||||
<function>kfree()</function> may be a wrapper to its own
|
|
||||||
allocator with the memory debugging. Since the resource pointer
|
|
||||||
is allocated externally outside the ALSA, it must be released
|
|
||||||
via the native
|
|
||||||
<function>kfree()</function>.
|
|
||||||
<function>kfree_nocheck()</function> is used for that; it calls
|
|
||||||
the native <function>kfree()</function> without wrapper.
|
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
|
@ -2190,8 +2175,7 @@ struct _snd_pcm_runtime {
|
||||||
unsigned int rate_den;
|
unsigned int rate_den;
|
||||||
|
|
||||||
/* -- SW params -- */
|
/* -- SW params -- */
|
||||||
int tstamp_timespec; /* use timeval (0) or timespec (1) */
|
struct timespec tstamp_mode; /* mmap timestamp is updated */
|
||||||
snd_pcm_tstamp_t tstamp_mode; /* mmap timestamp is updated */
|
|
||||||
unsigned int period_step;
|
unsigned int period_step;
|
||||||
unsigned int sleep_min; /* min ticks to sleep */
|
unsigned int sleep_min; /* min ticks to sleep */
|
||||||
snd_pcm_uframes_t xfer_align; /* xfer size need to be a multiple */
|
snd_pcm_uframes_t xfer_align; /* xfer size need to be a multiple */
|
||||||
|
@ -3709,8 +3693,7 @@ struct _snd_pcm_runtime {
|
||||||
<para>
|
<para>
|
||||||
Here, the chip instance is retrieved via
|
Here, the chip instance is retrieved via
|
||||||
<function>snd_kcontrol_chip()</function> macro. This macro
|
<function>snd_kcontrol_chip()</function> macro. This macro
|
||||||
converts from kcontrol->private_data to the type defined by
|
just accesses to kcontrol->private_data. The
|
||||||
<type>chip_t</type>. The
|
|
||||||
kcontrol->private_data field is
|
kcontrol->private_data field is
|
||||||
given as the argument of <function>snd_ctl_new()</function>
|
given as the argument of <function>snd_ctl_new()</function>
|
||||||
(see the later subsection
|
(see the later subsection
|
||||||
|
@ -5998,32 +5981,23 @@ struct _snd_pcm_runtime {
|
||||||
The first argument is the expression to evaluate, and the
|
The first argument is the expression to evaluate, and the
|
||||||
second argument is the action if it fails. When
|
second argument is the action if it fails. When
|
||||||
<constant>CONFIG_SND_DEBUG</constant>, is set, it will show an
|
<constant>CONFIG_SND_DEBUG</constant>, is set, it will show an
|
||||||
error message such as <computeroutput>BUG? (xxx) (called from
|
error message such as <computeroutput>BUG? (xxx)</computeroutput>
|
||||||
yyy)</computeroutput>. When no debug flag is set, this is
|
together with stack trace.
|
||||||
ignored.
|
|
||||||
</para>
|
</para>
|
||||||
</section>
|
|
||||||
|
|
||||||
<section id="useful-functions-snd-runtime-check">
|
|
||||||
<title><function>snd_runtime_check()</function></title>
|
|
||||||
<para>
|
<para>
|
||||||
This macro is quite similar with
|
When no debug flag is set, this macro is ignored.
|
||||||
<function>snd_assert()</function>. Unlike
|
|
||||||
<function>snd_assert()</function>, the expression is always
|
|
||||||
evaluated regardless of
|
|
||||||
<constant>CONFIG_SND_DEBUG</constant>. When
|
|
||||||
<constant>CONFIG_SND_DEBUG</constant> is set, the macro will
|
|
||||||
show a message like <computeroutput>ERROR (xx) (called from
|
|
||||||
yyy)</computeroutput>.
|
|
||||||
</para>
|
</para>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section id="useful-functions-snd-bug">
|
<section id="useful-functions-snd-bug">
|
||||||
<title><function>snd_BUG()</function></title>
|
<title><function>snd_BUG()</function></title>
|
||||||
<para>
|
<para>
|
||||||
It calls <function>snd_assert(0,)</function> -- that is, just
|
It shows <computeroutput>BUG?</computeroutput> message and
|
||||||
prints the error message at the point. It's useful to show that
|
stack trace as well as <function>snd_assert</function> at the point.
|
||||||
a fatal error happens there.
|
It's useful to show that a fatal error happens there.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
When no debug flag is set, this macro is ignored.
|
||||||
</para>
|
</para>
|
||||||
</section>
|
</section>
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
|
@ -41,9 +41,9 @@ sure that bitwise types don't get mixed up (little-endian vs big-endian
|
||||||
vs cpu-endian vs whatever), and there the constant "0" really _is_
|
vs cpu-endian vs whatever), and there the constant "0" really _is_
|
||||||
special.
|
special.
|
||||||
|
|
||||||
Modify top-level Makefile to say
|
Use
|
||||||
|
|
||||||
CHECK = sparse -Wbitwise
|
make C=[12] CF=-Wbitwise
|
||||||
|
|
||||||
or you don't get any checking at all.
|
or you don't get any checking at all.
|
||||||
|
|
||||||
|
|
|
@ -27,9 +27,9 @@ information out of a register+stack dump printed by the kernel on
|
||||||
protection faults (so-called "kernel oops").
|
protection faults (so-called "kernel oops").
|
||||||
|
|
||||||
If you run into some kind of deadlock, you can try to dump a call trace
|
If you run into some kind of deadlock, you can try to dump a call trace
|
||||||
for each process using sysrq-t (see Documentation/sysrq.txt). ksymoops
|
for each process using sysrq-t (see Documentation/sysrq.txt).
|
||||||
will translate these dumps into kernel symbols too. This way it is
|
This way it is possible to figure where *exactly* some process in "D"
|
||||||
possible to figure where *exactly* some process in "D" state is stuck.
|
state is stuck.
|
||||||
|
|
||||||
I've seen reports that bttv 0.7.x crashes whereas 0.8.x works rock solid
|
I've seen reports that bttv 0.7.x crashes whereas 0.8.x works rock solid
|
||||||
for some people. Thus probably a small buglet left somewhere in bttv
|
for some people. Thus probably a small buglet left somewhere in bttv
|
||||||
|
|
|
@ -13,12 +13,13 @@ This optimization is more critical now as bigger and bigger physical memories
|
||||||
Users can use the huge page support in Linux kernel by either using the mmap
|
Users can use the huge page support in Linux kernel by either using the mmap
|
||||||
system call or standard SYSv shared memory system calls (shmget, shmat).
|
system call or standard SYSv shared memory system calls (shmget, shmat).
|
||||||
|
|
||||||
First the Linux kernel needs to be built with CONFIG_HUGETLB_PAGE (present
|
First the Linux kernel needs to be built with the CONFIG_HUGETLBFS
|
||||||
under Processor types and feature) and CONFIG_HUGETLBFS (present under file
|
(present under "File systems") and CONFIG_HUGETLB_PAGE (selected
|
||||||
system option on config menu) config options.
|
automatically when CONFIG_HUGETLBFS is selected) configuration
|
||||||
|
options.
|
||||||
|
|
||||||
The kernel built with hugepage support should show the number of configured
|
The kernel built with hugepage support should show the number of configured
|
||||||
hugepages in the system by running the "cat /proc/meminfo" command.
|
hugepages in the system by running the "cat /proc/meminfo" command.
|
||||||
|
|
||||||
/proc/meminfo also provides information about the total number of hugetlb
|
/proc/meminfo also provides information about the total number of hugetlb
|
||||||
pages configured in the kernel. It also displays information about the
|
pages configured in the kernel. It also displays information about the
|
||||||
|
@ -38,19 +39,19 @@ in the kernel.
|
||||||
|
|
||||||
/proc/sys/vm/nr_hugepages indicates the current number of configured hugetlb
|
/proc/sys/vm/nr_hugepages indicates the current number of configured hugetlb
|
||||||
pages in the kernel. Super user can dynamically request more (or free some
|
pages in the kernel. Super user can dynamically request more (or free some
|
||||||
pre-configured) hugepages.
|
pre-configured) hugepages.
|
||||||
The allocation( or deallocation) of hugetlb pages is posible only if there are
|
The allocation (or deallocation) of hugetlb pages is possible only if there are
|
||||||
enough physically contiguous free pages in system (freeing of hugepages is
|
enough physically contiguous free pages in system (freeing of hugepages is
|
||||||
possible only if there are enough hugetlb pages free that can be transfered
|
possible only if there are enough hugetlb pages free that can be transfered
|
||||||
back to regular memory pool).
|
back to regular memory pool).
|
||||||
|
|
||||||
Pages that are used as hugetlb pages are reserved inside the kernel and can
|
Pages that are used as hugetlb pages are reserved inside the kernel and can
|
||||||
not be used for other purposes.
|
not be used for other purposes.
|
||||||
|
|
||||||
Once the kernel with Hugetlb page support is built and running, a user can
|
Once the kernel with Hugetlb page support is built and running, a user can
|
||||||
use either the mmap system call or shared memory system calls to start using
|
use either the mmap system call or shared memory system calls to start using
|
||||||
the huge pages. It is required that the system administrator preallocate
|
the huge pages. It is required that the system administrator preallocate
|
||||||
enough memory for huge page purposes.
|
enough memory for huge page purposes.
|
||||||
|
|
||||||
Use the following command to dynamically allocate/deallocate hugepages:
|
Use the following command to dynamically allocate/deallocate hugepages:
|
||||||
|
|
||||||
|
@ -80,9 +81,9 @@ memory (huge pages) allowed for that filesystem (/mnt/huge). The size is
|
||||||
rounded down to HPAGE_SIZE. The option nr_inode sets the maximum number of
|
rounded down to HPAGE_SIZE. The option nr_inode sets the maximum number of
|
||||||
inodes that /mnt/huge can use. If the size or nr_inode options are not
|
inodes that /mnt/huge can use. If the size or nr_inode options are not
|
||||||
provided on command line then no limits are set. For size and nr_inodes
|
provided on command line then no limits are set. For size and nr_inodes
|
||||||
options, you can use [G|g]/[M|m]/[K|k] to represent giga/mega/kilo. For
|
options, you can use [G|g]/[M|m]/[K|k] to represent giga/mega/kilo. For
|
||||||
example, size=2K has the same meaning as size=2048. An example is given at
|
example, size=2K has the same meaning as size=2048. An example is given at
|
||||||
the end of this document.
|
the end of this document.
|
||||||
|
|
||||||
read and write system calls are not supported on files that reside on hugetlb
|
read and write system calls are not supported on files that reside on hugetlb
|
||||||
file systems.
|
file systems.
|
||||||
|
|
46
MAINTAINERS
46
MAINTAINERS
|
@ -297,6 +297,11 @@ P: Richard Purdie
|
||||||
M: rpurdie@rpsys.net
|
M: rpurdie@rpsys.net
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
ARM/TOSA MACHINE SUPPORT
|
||||||
|
P: Dirk Opfer
|
||||||
|
M: dirk@opfer-online.de
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
ARM/PLEB SUPPORT
|
ARM/PLEB SUPPORT
|
||||||
P: Peter Chubb
|
P: Peter Chubb
|
||||||
M: pleb@gelato.unsw.edu.au
|
M: pleb@gelato.unsw.edu.au
|
||||||
|
@ -910,6 +915,15 @@ L: linux-fbdev-devel@lists.sourceforge.net
|
||||||
W: http://linux-fbdev.sourceforge.net/
|
W: http://linux-fbdev.sourceforge.net/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
FREESCALE SOC FS_ENET DRIVER
|
||||||
|
P: Pantelis Antoniou
|
||||||
|
M: pantelis.antoniou@gmail.com
|
||||||
|
P: Vitaly Bordug
|
||||||
|
M: vbordug@ru.mvista.com
|
||||||
|
L: linuxppc-embedded@ozlabs.org
|
||||||
|
L: netdev@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
FILE LOCKING (flock() and fcntl()/lockf())
|
FILE LOCKING (flock() and fcntl()/lockf())
|
||||||
P: Matthew Wilcox
|
P: Matthew Wilcox
|
||||||
M: matthew@wil.cx
|
M: matthew@wil.cx
|
||||||
|
@ -1063,6 +1077,26 @@ P: Jaroslav Kysela
|
||||||
M: perex@suse.cz
|
M: perex@suse.cz
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
HPET: High Precision Event Timers driver (hpet.c)
|
||||||
|
P: Clemens Ladisch
|
||||||
|
M: clemens@ladisch.de
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
|
HPET: i386
|
||||||
|
P: Venkatesh Pallipadi (Venki)
|
||||||
|
M: venkatesh.pallipadi@intel.com
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
|
HPET: x86_64
|
||||||
|
P: Andi Kleen and Vojtech Pavlik
|
||||||
|
M: ak@muc.de and vojtech@suse.cz
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
|
HPET: ACPI hpet.c
|
||||||
|
P: Bob Picco
|
||||||
|
M: bob.picco@hp.com
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
HPFS FILESYSTEM
|
HPFS FILESYSTEM
|
||||||
P: Mikulas Patocka
|
P: Mikulas Patocka
|
||||||
M: mikulas@artax.karlin.mff.cuni.cz
|
M: mikulas@artax.karlin.mff.cuni.cz
|
||||||
|
@ -2037,6 +2071,12 @@ P: Matt Mackall
|
||||||
M: mpm@selenic.com
|
M: mpm@selenic.com
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
RAPIDIO SUBSYSTEM
|
||||||
|
P: Matt Porter
|
||||||
|
M: mporter@kernel.crashing.org
|
||||||
|
L: linux-kernel@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
REAL TIME CLOCK DRIVER
|
REAL TIME CLOCK DRIVER
|
||||||
P: Paul Gortmaker
|
P: Paul Gortmaker
|
||||||
M: p_gortmaker@yahoo.com
|
M: p_gortmaker@yahoo.com
|
||||||
|
@ -2441,10 +2481,10 @@ L: linux-kernel@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
TRIVIAL PATCHES
|
TRIVIAL PATCHES
|
||||||
P: Rusty Russell
|
P: Adrian Bunk
|
||||||
M: trivial@rustcorp.com.au
|
M: trivial@kernel.org
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
W: http://www.kernel.org/pub/linux/kernel/people/rusty/trivial/
|
W: http://www.kernel.org/pub/linux/kernel/people/bunk/trivial/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
TMS380 TOKEN-RING NETWORK DRIVER
|
TMS380 TOKEN-RING NETWORK DRIVER
|
||||||
|
|
10
Makefile
10
Makefile
|
@ -346,7 +346,8 @@ AFLAGS_KERNEL =
|
||||||
# Use LINUXINCLUDE when you must reference the include/ directory.
|
# Use LINUXINCLUDE when you must reference the include/ directory.
|
||||||
# Needed to be compatible with the O= option
|
# Needed to be compatible with the O= option
|
||||||
LINUXINCLUDE := -Iinclude \
|
LINUXINCLUDE := -Iinclude \
|
||||||
$(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include)
|
$(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \
|
||||||
|
-imacros include/linux/autoconf.h
|
||||||
|
|
||||||
CPPFLAGS := -D__KERNEL__ $(LINUXINCLUDE)
|
CPPFLAGS := -D__KERNEL__ $(LINUXINCLUDE)
|
||||||
|
|
||||||
|
@ -582,7 +583,7 @@ export MODLIB
|
||||||
|
|
||||||
|
|
||||||
ifeq ($(KBUILD_EXTMOD),)
|
ifeq ($(KBUILD_EXTMOD),)
|
||||||
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/
|
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
|
||||||
|
|
||||||
vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \
|
vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \
|
||||||
$(core-y) $(core-m) $(drivers-y) $(drivers-m) \
|
$(core-y) $(core-m) $(drivers-y) $(drivers-m) \
|
||||||
|
@ -1249,11 +1250,6 @@ tags: FORCE
|
||||||
# Scripts to check various things for consistency
|
# Scripts to check various things for consistency
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
configcheck:
|
|
||||||
find * $(RCS_FIND_IGNORE) \
|
|
||||||
-name '*.[hcS]' -type f -print | sort \
|
|
||||||
| xargs $(PERL) -w scripts/checkconfig.pl
|
|
||||||
|
|
||||||
includecheck:
|
includecheck:
|
||||||
find * $(RCS_FIND_IGNORE) \
|
find * $(RCS_FIND_IGNORE) \
|
||||||
-name '*.[hcS]' -type f -print | sort \
|
-name '*.[hcS]' -type f -print | sort \
|
||||||
|
|
|
@ -704,8 +704,7 @@ source "drivers/acorn/block/Kconfig"
|
||||||
|
|
||||||
if PCMCIA || ARCH_CLPS7500 || ARCH_IOP3XX || ARCH_IXP4XX \
|
if PCMCIA || ARCH_CLPS7500 || ARCH_IOP3XX || ARCH_IXP4XX \
|
||||||
|| ARCH_L7200 || ARCH_LH7A40X || ARCH_PXA || ARCH_RPC \
|
|| ARCH_L7200 || ARCH_LH7A40X || ARCH_PXA || ARCH_RPC \
|
||||||
|| ARCH_S3C2410 || ARCH_SA1100 || ARCH_SHARK || FOOTBRIDGE \
|
|| ARCH_S3C2410 || ARCH_SA1100 || ARCH_SHARK || FOOTBRIDGE
|
||||||
|| MACH_MP1000
|
|
||||||
source "drivers/ide/Kconfig"
|
source "drivers/ide/Kconfig"
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,7 @@ comma = ,
|
||||||
# macro, but instead defines a whole series of macros which makes
|
# macro, but instead defines a whole series of macros which makes
|
||||||
# testing for a specific architecture or later rather impossible.
|
# testing for a specific architecture or later rather impossible.
|
||||||
arch-$(CONFIG_CPU_32v6) :=-D__LINUX_ARM_ARCH__=6 $(call cc-option,-march=armv6,-march=armv5t -Wa$(comma)-march=armv6)
|
arch-$(CONFIG_CPU_32v6) :=-D__LINUX_ARM_ARCH__=6 $(call cc-option,-march=armv6,-march=armv5t -Wa$(comma)-march=armv6)
|
||||||
|
arch-$(CONFIG_CPU_32v6K) :=-D__LINUX_ARM_ARCH__=6 $(call cc-option,-march=armv6k,-march=armv5t -Wa$(comma)-march=armv6k)
|
||||||
arch-$(CONFIG_CPU_32v5) :=-D__LINUX_ARM_ARCH__=5 $(call cc-option,-march=armv5te,-march=armv4)
|
arch-$(CONFIG_CPU_32v5) :=-D__LINUX_ARM_ARCH__=5 $(call cc-option,-march=armv5te,-march=armv4)
|
||||||
arch-$(CONFIG_CPU_32v4) :=-D__LINUX_ARM_ARCH__=4 -march=armv4
|
arch-$(CONFIG_CPU_32v4) :=-D__LINUX_ARM_ARCH__=4 -march=armv4
|
||||||
arch-$(CONFIG_CPU_32v3) :=-D__LINUX_ARM_ARCH__=3 -march=armv3
|
arch-$(CONFIG_CPU_32v3) :=-D__LINUX_ARM_ARCH__=3 -march=armv3
|
||||||
|
@ -143,7 +144,7 @@ drivers-$(CONFIG_OPROFILE) += arch/arm/oprofile/
|
||||||
drivers-$(CONFIG_ARCH_CLPS7500) += drivers/acorn/char/
|
drivers-$(CONFIG_ARCH_CLPS7500) += drivers/acorn/char/
|
||||||
drivers-$(CONFIG_ARCH_L7200) += drivers/acorn/char/
|
drivers-$(CONFIG_ARCH_L7200) += drivers/acorn/char/
|
||||||
|
|
||||||
libs-y += arch/arm/lib/
|
libs-y := arch/arm/lib/ $(libs-y)
|
||||||
|
|
||||||
# Default target when executing plain make
|
# Default target when executing plain make
|
||||||
ifeq ($(CONFIG_XIP_KERNEL),y)
|
ifeq ($(CONFIG_XIP_KERNEL),y)
|
||||||
|
|
|
@ -39,8 +39,7 @@
|
||||||
defined(CONFIG_ARCH_IXP4XX) || \
|
defined(CONFIG_ARCH_IXP4XX) || \
|
||||||
defined(CONFIG_ARCH_IXP2000) || \
|
defined(CONFIG_ARCH_IXP2000) || \
|
||||||
defined(CONFIG_ARCH_LH7A40X) || \
|
defined(CONFIG_ARCH_LH7A40X) || \
|
||||||
defined(CONFIG_ARCH_OMAP) || \
|
defined(CONFIG_ARCH_OMAP)
|
||||||
defined(CONFIG_MACH_MP1000)
|
|
||||||
.macro loadsp, rb
|
.macro loadsp, rb
|
||||||
addruart \rb
|
addruart \rb
|
||||||
.endm
|
.endm
|
||||||
|
|
|
@ -152,7 +152,7 @@ CONFIG_ALIGNMENT_TRAP=y
|
||||||
#
|
#
|
||||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||||
CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmware"
|
CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmware"
|
||||||
# CONFIG_XIP_KERNEL is not set
|
# CONFIG_XIP_KERNEL is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -560,7 +560,7 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||||
#
|
#
|
||||||
CONFIG_SERIAL_8250=y
|
CONFIG_SERIAL_8250=y
|
||||||
CONFIG_SERIAL_8250_CONSOLE=y
|
CONFIG_SERIAL_8250_CONSOLE=y
|
||||||
CONFIG_SERIAL_8250_NR_UARTS=2
|
CONFIG_SERIAL_8250_NR_UARTS=3
|
||||||
# CONFIG_SERIAL_8250_EXTENDED is not set
|
# CONFIG_SERIAL_8250_EXTENDED is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
|
@ -560,7 +560,7 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||||
#
|
#
|
||||||
CONFIG_SERIAL_8250=y
|
CONFIG_SERIAL_8250=y
|
||||||
CONFIG_SERIAL_8250_CONSOLE=y
|
CONFIG_SERIAL_8250_CONSOLE=y
|
||||||
CONFIG_SERIAL_8250_NR_UARTS=2
|
CONFIG_SERIAL_8250_NR_UARTS=3
|
||||||
# CONFIG_SERIAL_8250_EXTENDED is not set
|
# CONFIG_SERIAL_8250_EXTENDED is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.14-rc1
|
# Linux kernel version: 2.6.14-rc2
|
||||||
# Fri Sep 16 15:48:13 2005
|
# Thu Sep 29 14:50:10 2005
|
||||||
#
|
#
|
||||||
CONFIG_ARM=y
|
CONFIG_ARM=y
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
|
@ -12,11 +12,9 @@ CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||||
#
|
#
|
||||||
# Code maturity level options
|
# Code maturity level options
|
||||||
#
|
#
|
||||||
CONFIG_EXPERIMENTAL=y
|
# CONFIG_EXPERIMENTAL is not set
|
||||||
# CONFIG_CLEAN_COMPILE is not set
|
CONFIG_CLEAN_COMPILE=y
|
||||||
CONFIG_BROKEN=y
|
|
||||||
CONFIG_BROKEN_ON_SMP=y
|
CONFIG_BROKEN_ON_SMP=y
|
||||||
CONFIG_LOCK_KERNEL=y
|
|
||||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -24,18 +22,16 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||||
#
|
#
|
||||||
CONFIG_LOCALVERSION=""
|
CONFIG_LOCALVERSION=""
|
||||||
CONFIG_LOCALVERSION_AUTO=y
|
CONFIG_LOCALVERSION_AUTO=y
|
||||||
CONFIG_SWAP=y
|
# CONFIG_SWAP is not set
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
# CONFIG_POSIX_MQUEUE is not set
|
|
||||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||||
CONFIG_SYSCTL=y
|
CONFIG_SYSCTL=y
|
||||||
# CONFIG_AUDIT is not set
|
# CONFIG_AUDIT is not set
|
||||||
# CONFIG_HOTPLUG is not set
|
CONFIG_HOTPLUG=y
|
||||||
CONFIG_KOBJECT_UEVENT=y
|
CONFIG_KOBJECT_UEVENT=y
|
||||||
CONFIG_IKCONFIG=y
|
# CONFIG_IKCONFIG is not set
|
||||||
CONFIG_IKCONFIG_PROC=y
|
|
||||||
CONFIG_INITRAMFS_SOURCE=""
|
CONFIG_INITRAMFS_SOURCE=""
|
||||||
CONFIG_EMBEDDED=y
|
# CONFIG_EMBEDDED is not set
|
||||||
CONFIG_KALLSYMS=y
|
CONFIG_KALLSYMS=y
|
||||||
# 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
|
||||||
|
@ -58,17 +54,15 @@ CONFIG_BASE_SMALL=0
|
||||||
#
|
#
|
||||||
CONFIG_MODULES=y
|
CONFIG_MODULES=y
|
||||||
CONFIG_MODULE_UNLOAD=y
|
CONFIG_MODULE_UNLOAD=y
|
||||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
|
||||||
CONFIG_OBSOLETE_MODPARM=y
|
CONFIG_OBSOLETE_MODPARM=y
|
||||||
# CONFIG_MODVERSIONS is not set
|
|
||||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||||
CONFIG_KMOD=y
|
# CONFIG_KMOD is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# System Type
|
# System Type
|
||||||
#
|
#
|
||||||
# CONFIG_ARCH_CLPS7500 is not set
|
# CONFIG_ARCH_CLPS7500 is not set
|
||||||
CONFIG_ARCH_CLPS711X=y
|
# CONFIG_ARCH_CLPS711X is not set
|
||||||
# CONFIG_ARCH_CO285 is not set
|
# CONFIG_ARCH_CO285 is not set
|
||||||
# CONFIG_ARCH_EBSA110 is not set
|
# CONFIG_ARCH_EBSA110 is not set
|
||||||
# CONFIG_ARCH_CAMELOT is not set
|
# CONFIG_ARCH_CAMELOT is not set
|
||||||
|
@ -86,43 +80,43 @@ CONFIG_ARCH_CLPS711X=y
|
||||||
# CONFIG_ARCH_LH7A40X is not set
|
# CONFIG_ARCH_LH7A40X is not set
|
||||||
# CONFIG_ARCH_OMAP is not set
|
# CONFIG_ARCH_OMAP is not set
|
||||||
# CONFIG_ARCH_VERSATILE is not set
|
# CONFIG_ARCH_VERSATILE is not set
|
||||||
|
CONFIG_ARCH_REALVIEW=y
|
||||||
# CONFIG_ARCH_IMX is not set
|
# CONFIG_ARCH_IMX is not set
|
||||||
# CONFIG_ARCH_H720X is not set
|
# CONFIG_ARCH_H720X is not set
|
||||||
# CONFIG_ARCH_AAEC2000 is not set
|
# CONFIG_ARCH_AAEC2000 is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# CLPS711X/EP721X Implementations
|
# RealView platform type
|
||||||
#
|
#
|
||||||
# CONFIG_ARCH_AUTCPU12 is not set
|
CONFIG_MACH_REALVIEW_EB=y
|
||||||
# CONFIG_ARCH_CDB89712 is not set
|
|
||||||
# CONFIG_ARCH_CEIVA is not set
|
|
||||||
# CONFIG_ARCH_CLEP7312 is not set
|
|
||||||
# CONFIG_ARCH_EDB7211 is not set
|
|
||||||
# CONFIG_ARCH_P720T is not set
|
|
||||||
# CONFIG_ARCH_FORTUNET is not set
|
|
||||||
CONFIG_MACH_MP1000=y
|
|
||||||
CONFIG_MP1000_90MHZ=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Processor Type
|
# Processor Type
|
||||||
#
|
#
|
||||||
CONFIG_CPU_32=y
|
CONFIG_CPU_32=y
|
||||||
CONFIG_CPU_ARM720T=y
|
CONFIG_CPU_ARM926T=y
|
||||||
CONFIG_CPU_32v4=y
|
# CONFIG_CPU_V6 is not set
|
||||||
CONFIG_CPU_ABRT_LV4T=y
|
CONFIG_CPU_32v5=y
|
||||||
CONFIG_CPU_CACHE_V4=y
|
CONFIG_CPU_ABRT_EV5TJ=y
|
||||||
CONFIG_CPU_CACHE_VIVT=y
|
CONFIG_CPU_CACHE_VIVT=y
|
||||||
CONFIG_CPU_COPY_V4WT=y
|
CONFIG_CPU_COPY_V4WB=y
|
||||||
CONFIG_CPU_TLB_V4WT=y
|
CONFIG_CPU_TLB_V4WBI=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# Processor Features
|
# Processor Features
|
||||||
#
|
#
|
||||||
CONFIG_ARM_THUMB=y
|
CONFIG_ARM_THUMB=y
|
||||||
|
# CONFIG_CPU_ICACHE_DISABLE is not set
|
||||||
|
# CONFIG_CPU_DCACHE_DISABLE is not set
|
||||||
|
# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
|
||||||
|
# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
|
||||||
|
CONFIG_ARM_GIC=y
|
||||||
|
CONFIG_ICST307=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bus support
|
# Bus support
|
||||||
#
|
#
|
||||||
|
CONFIG_ARM_AMBA=y
|
||||||
CONFIG_ISA_DMA_API=y
|
CONFIG_ISA_DMA_API=y
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -133,14 +127,8 @@ CONFIG_ISA_DMA_API=y
|
||||||
#
|
#
|
||||||
# Kernel Features
|
# Kernel Features
|
||||||
#
|
#
|
||||||
# CONFIG_SMP is not set
|
|
||||||
CONFIG_PREEMPT=y
|
|
||||||
# CONFIG_NO_IDLE_HZ is not set
|
# CONFIG_NO_IDLE_HZ is not set
|
||||||
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||||
CONFIG_SELECT_MEMORY_MODEL=y
|
|
||||||
CONFIG_FLATMEM_MANUAL=y
|
|
||||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
|
||||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
|
||||||
CONFIG_FLATMEM=y
|
CONFIG_FLATMEM=y
|
||||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||||
# CONFIG_SPARSEMEM_STATIC is not set
|
# CONFIG_SPARSEMEM_STATIC is not set
|
||||||
|
@ -151,7 +139,7 @@ CONFIG_ALIGNMENT_TRAP=y
|
||||||
#
|
#
|
||||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||||
CONFIG_CMDLINE="console=ttyCL,38400 root=/dev/discs/disc0/part1 ip=any cs89x0_media=rj45"
|
CONFIG_CMDLINE="root=/dev/nfs nfsroot=10.1.69.3:/work/nfsroot ip=dhcp console=ttyAMA0 mem=128M"
|
||||||
# CONFIG_XIP_KERNEL is not set
|
# CONFIG_XIP_KERNEL is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -163,14 +151,14 @@ CONFIG_CMDLINE="console=ttyCL,38400 root=/dev/discs/disc0/part1 ip=any cs89x0_me
|
||||||
#
|
#
|
||||||
CONFIG_FPE_NWFPE=y
|
CONFIG_FPE_NWFPE=y
|
||||||
# CONFIG_FPE_NWFPE_XP is not set
|
# CONFIG_FPE_NWFPE_XP is not set
|
||||||
# CONFIG_FPE_FASTFPE is not set
|
# CONFIG_VFP is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Userspace binary formats
|
# Userspace binary formats
|
||||||
#
|
#
|
||||||
CONFIG_BINFMT_ELF=y
|
CONFIG_BINFMT_ELF=y
|
||||||
# CONFIG_BINFMT_AOUT is not set
|
# CONFIG_BINFMT_AOUT is not set
|
||||||
CONFIG_BINFMT_MISC=y
|
# CONFIG_BINFMT_MISC is not set
|
||||||
# CONFIG_ARTHUR is not set
|
# CONFIG_ARTHUR is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -197,10 +185,9 @@ CONFIG_IP_FIB_HASH=y
|
||||||
CONFIG_IP_PNP=y
|
CONFIG_IP_PNP=y
|
||||||
CONFIG_IP_PNP_DHCP=y
|
CONFIG_IP_PNP_DHCP=y
|
||||||
CONFIG_IP_PNP_BOOTP=y
|
CONFIG_IP_PNP_BOOTP=y
|
||||||
CONFIG_IP_PNP_RARP=y
|
# CONFIG_IP_PNP_RARP is not set
|
||||||
# CONFIG_NET_IPIP is not set
|
# CONFIG_NET_IPIP is not set
|
||||||
# CONFIG_NET_IPGRE is not set
|
# CONFIG_NET_IPGRE is not set
|
||||||
# CONFIG_ARPD is not set
|
|
||||||
# CONFIG_SYN_COOKIES is not set
|
# CONFIG_SYN_COOKIES is not set
|
||||||
# CONFIG_INET_AH is not set
|
# CONFIG_INET_AH is not set
|
||||||
# CONFIG_INET_ESP is not set
|
# CONFIG_INET_ESP is not set
|
||||||
|
@ -210,36 +197,14 @@ CONFIG_INET_DIAG=y
|
||||||
CONFIG_INET_TCP_DIAG=y
|
CONFIG_INET_TCP_DIAG=y
|
||||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||||
CONFIG_TCP_CONG_BIC=y
|
CONFIG_TCP_CONG_BIC=y
|
||||||
CONFIG_IPV6=y
|
# CONFIG_IPV6 is not set
|
||||||
# CONFIG_IPV6_PRIVACY is not set
|
|
||||||
# CONFIG_INET6_AH is not set
|
|
||||||
# CONFIG_INET6_ESP is not set
|
|
||||||
# CONFIG_INET6_IPCOMP is not set
|
|
||||||
# CONFIG_INET6_TUNNEL is not set
|
|
||||||
# CONFIG_IPV6_TUNNEL is not set
|
|
||||||
# CONFIG_NETFILTER is not set
|
# CONFIG_NETFILTER is not set
|
||||||
|
|
||||||
#
|
|
||||||
# DCCP Configuration (EXPERIMENTAL)
|
|
||||||
#
|
|
||||||
# CONFIG_IP_DCCP is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# SCTP Configuration (EXPERIMENTAL)
|
|
||||||
#
|
|
||||||
# CONFIG_IP_SCTP is not set
|
|
||||||
# CONFIG_ATM is not set
|
|
||||||
# CONFIG_BRIDGE is not set
|
# CONFIG_BRIDGE is not set
|
||||||
# CONFIG_VLAN_8021Q is not set
|
# CONFIG_VLAN_8021Q is not set
|
||||||
# CONFIG_DECNET is not set
|
# CONFIG_DECNET is not set
|
||||||
# CONFIG_LLC2 is not set
|
# CONFIG_LLC2 is not set
|
||||||
# CONFIG_IPX is not set
|
# CONFIG_IPX is not set
|
||||||
# CONFIG_ATALK is not set
|
# CONFIG_ATALK is not set
|
||||||
# CONFIG_X25 is not set
|
|
||||||
# CONFIG_LAPB is not set
|
|
||||||
# CONFIG_NET_DIVERT is not set
|
|
||||||
# CONFIG_ECONET is not set
|
|
||||||
# CONFIG_WAN_ROUTER is not set
|
|
||||||
# CONFIG_NET_SCHED is not set
|
# CONFIG_NET_SCHED is not set
|
||||||
# CONFIG_NET_CLS_ROUTE is not set
|
# CONFIG_NET_CLS_ROUTE is not set
|
||||||
|
|
||||||
|
@ -247,7 +212,6 @@ CONFIG_IPV6=y
|
||||||
# Network testing
|
# Network testing
|
||||||
#
|
#
|
||||||
# CONFIG_NET_PKTGEN is not set
|
# CONFIG_NET_PKTGEN is not set
|
||||||
# CONFIG_NETFILTER_NETLINK is not set
|
|
||||||
# CONFIG_HAMRADIO is not set
|
# CONFIG_HAMRADIO is not set
|
||||||
# CONFIG_IRDA is not set
|
# CONFIG_IRDA is not set
|
||||||
# CONFIG_BT is not set
|
# CONFIG_BT is not set
|
||||||
|
@ -269,14 +233,10 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||||
# Memory Technology Devices (MTD)
|
# Memory Technology Devices (MTD)
|
||||||
#
|
#
|
||||||
CONFIG_MTD=y
|
CONFIG_MTD=y
|
||||||
CONFIG_MTD_DEBUG=y
|
# CONFIG_MTD_DEBUG is not set
|
||||||
CONFIG_MTD_DEBUG_VERBOSE=3
|
|
||||||
# CONFIG_MTD_CONCAT is not set
|
# CONFIG_MTD_CONCAT is not set
|
||||||
CONFIG_MTD_PARTITIONS=y
|
CONFIG_MTD_PARTITIONS=y
|
||||||
CONFIG_MTD_REDBOOT_PARTS=m
|
# CONFIG_MTD_REDBOOT_PARTS is not set
|
||||||
CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-2
|
|
||||||
CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED=y
|
|
||||||
# CONFIG_MTD_REDBOOT_PARTS_READONLY 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
|
||||||
|
|
||||||
|
@ -292,45 +252,36 @@ CONFIG_MTD_BLOCK=y
|
||||||
#
|
#
|
||||||
# RAM/ROM/Flash chip drivers
|
# RAM/ROM/Flash chip drivers
|
||||||
#
|
#
|
||||||
CONFIG_MTD_CFI=m
|
CONFIG_MTD_CFI=y
|
||||||
# CONFIG_MTD_JEDECPROBE is not set
|
# CONFIG_MTD_JEDECPROBE is not set
|
||||||
CONFIG_MTD_GEN_PROBE=m
|
CONFIG_MTD_GEN_PROBE=y
|
||||||
CONFIG_MTD_CFI_ADV_OPTIONS=y
|
# CONFIG_MTD_CFI_ADV_OPTIONS is not set
|
||||||
CONFIG_MTD_CFI_NOSWAP=y
|
CONFIG_MTD_MAP_BANK_WIDTH_1=y
|
||||||
# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
|
CONFIG_MTD_MAP_BANK_WIDTH_2=y
|
||||||
# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
|
|
||||||
CONFIG_MTD_CFI_GEOMETRY=y
|
|
||||||
# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set
|
|
||||||
# CONFIG_MTD_MAP_BANK_WIDTH_2 is not set
|
|
||||||
CONFIG_MTD_MAP_BANK_WIDTH_4=y
|
CONFIG_MTD_MAP_BANK_WIDTH_4=y
|
||||||
# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
|
# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
|
||||||
# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
|
# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
|
||||||
# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
|
# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
|
||||||
# CONFIG_MTD_CFI_I1 is not set
|
CONFIG_MTD_CFI_I1=y
|
||||||
CONFIG_MTD_CFI_I2=y
|
CONFIG_MTD_CFI_I2=y
|
||||||
# CONFIG_MTD_CFI_I4 is not set
|
# CONFIG_MTD_CFI_I4 is not set
|
||||||
# CONFIG_MTD_CFI_I8 is not set
|
# CONFIG_MTD_CFI_I8 is not set
|
||||||
# CONFIG_MTD_OTP is not set
|
CONFIG_MTD_CFI_INTELEXT=y
|
||||||
CONFIG_MTD_CFI_INTELEXT=m
|
CONFIG_MTD_CFI_AMDSTD=y
|
||||||
# CONFIG_MTD_CFI_AMDSTD is not set
|
CONFIG_MTD_CFI_AMDSTD_RETRY=0
|
||||||
# CONFIG_MTD_CFI_STAA is not set
|
# CONFIG_MTD_CFI_STAA is not set
|
||||||
CONFIG_MTD_CFI_UTIL=m
|
CONFIG_MTD_CFI_UTIL=y
|
||||||
# CONFIG_MTD_RAM is not set
|
# CONFIG_MTD_RAM is not set
|
||||||
# CONFIG_MTD_ROM is not set
|
# CONFIG_MTD_ROM is not set
|
||||||
# CONFIG_MTD_ABSENT is not set
|
# CONFIG_MTD_ABSENT is not set
|
||||||
# CONFIG_MTD_OBSOLETE_CHIPS is not set
|
|
||||||
# CONFIG_MTD_XIP is not set
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Mapping drivers for chip access
|
# Mapping drivers for chip access
|
||||||
#
|
#
|
||||||
# CONFIG_MTD_COMPLEX_MAPPINGS is not set
|
# CONFIG_MTD_COMPLEX_MAPPINGS is not set
|
||||||
CONFIG_MTD_PHYSMAP=m
|
# CONFIG_MTD_PHYSMAP is not set
|
||||||
CONFIG_MTD_PHYSMAP_START=0x0000000
|
CONFIG_MTD_ARM_INTEGRATOR=y
|
||||||
CONFIG_MTD_PHYSMAP_LEN=0x4000000
|
# CONFIG_MTD_EDB7312 is not set
|
||||||
CONFIG_MTD_PHYSMAP_BANKWIDTH=2
|
|
||||||
# CONFIG_MTD_ARM_INTEGRATOR is not set
|
|
||||||
CONFIG_MTD_EDB7312=m
|
|
||||||
# CONFIG_MTD_PLATRAM is not set
|
# CONFIG_MTD_PLATRAM is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -340,7 +291,6 @@ CONFIG_MTD_EDB7312=m
|
||||||
# CONFIG_MTD_PHRAM is not set
|
# CONFIG_MTD_PHRAM is not set
|
||||||
# CONFIG_MTD_MTDRAM is not set
|
# CONFIG_MTD_MTDRAM is not set
|
||||||
# CONFIG_MTD_BLKMTD is not set
|
# CONFIG_MTD_BLKMTD is not set
|
||||||
# CONFIG_MTD_BLOCK2MTD is not set
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Disk-On-Chip Device Drivers
|
# Disk-On-Chip Device Drivers
|
||||||
|
@ -352,12 +302,7 @@ CONFIG_MTD_EDB7312=m
|
||||||
#
|
#
|
||||||
# NAND Flash Device Drivers
|
# NAND Flash Device Drivers
|
||||||
#
|
#
|
||||||
CONFIG_MTD_NAND=y
|
# CONFIG_MTD_NAND is not set
|
||||||
# CONFIG_MTD_NAND_VERIFY_WRITE is not set
|
|
||||||
CONFIG_MTD_NAND_MP1000=y
|
|
||||||
CONFIG_MTD_NAND_IDS=y
|
|
||||||
# CONFIG_MTD_NAND_DISKONCHIP is not set
|
|
||||||
# CONFIG_MTD_NAND_NANDSIM is not set
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Parallel port support
|
# Parallel port support
|
||||||
|
@ -372,52 +317,21 @@ CONFIG_MTD_NAND_IDS=y
|
||||||
# Block devices
|
# Block devices
|
||||||
#
|
#
|
||||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||||
CONFIG_BLK_DEV_LOOP=m
|
# CONFIG_BLK_DEV_LOOP is not set
|
||||||
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
|
|
||||||
# CONFIG_BLK_DEV_NBD is not set
|
# CONFIG_BLK_DEV_NBD is not set
|
||||||
CONFIG_BLK_DEV_RAM=y
|
# CONFIG_BLK_DEV_RAM is not set
|
||||||
CONFIG_BLK_DEV_RAM_COUNT=2
|
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||||
CONFIG_BLK_DEV_RAM_SIZE=16384
|
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
|
||||||
# CONFIG_CDROM_PKTCDVD is not set
|
# CONFIG_CDROM_PKTCDVD is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# IO Schedulers
|
# IO Schedulers
|
||||||
#
|
#
|
||||||
CONFIG_IOSCHED_NOOP=y
|
CONFIG_IOSCHED_NOOP=y
|
||||||
CONFIG_IOSCHED_AS=y
|
# CONFIG_IOSCHED_AS is not set
|
||||||
CONFIG_IOSCHED_DEADLINE=y
|
CONFIG_IOSCHED_DEADLINE=y
|
||||||
CONFIG_IOSCHED_CFQ=y
|
# CONFIG_IOSCHED_CFQ is not set
|
||||||
# CONFIG_ATA_OVER_ETH is not set
|
# CONFIG_ATA_OVER_ETH is not set
|
||||||
|
|
||||||
#
|
|
||||||
# ATA/ATAPI/MFM/RLL support
|
|
||||||
#
|
|
||||||
CONFIG_IDE=y
|
|
||||||
CONFIG_BLK_DEV_IDE=y
|
|
||||||
|
|
||||||
#
|
|
||||||
# Please see Documentation/ide.txt for help/info on IDE drives
|
|
||||||
#
|
|
||||||
# CONFIG_BLK_DEV_IDE_SATA is not set
|
|
||||||
# CONFIG_BLK_DEV_HD_IDE is not set
|
|
||||||
CONFIG_BLK_DEV_IDEDISK=y
|
|
||||||
# CONFIG_IDEDISK_MULTI_MODE is not set
|
|
||||||
# CONFIG_BLK_DEV_IDECD is not set
|
|
||||||
# CONFIG_BLK_DEV_IDETAPE is not set
|
|
||||||
# CONFIG_BLK_DEV_IDEFLOPPY is not set
|
|
||||||
# CONFIG_IDE_TASK_IOCTL is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# IDE chipset support/bugfixes
|
|
||||||
#
|
|
||||||
# CONFIG_IDE_GENERIC is not set
|
|
||||||
CONFIG_IDE_ARM=y
|
|
||||||
CONFIG_BLK_DEV_IDE_MP1000=y
|
|
||||||
# CONFIG_BLK_DEV_IDEDMA is not set
|
|
||||||
# CONFIG_IDEDMA_AUTO is not set
|
|
||||||
# CONFIG_BLK_DEV_HD is not set
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# SCSI device support
|
# SCSI device support
|
||||||
#
|
#
|
||||||
|
@ -427,14 +341,7 @@ CONFIG_BLK_DEV_IDE_MP1000=y
|
||||||
#
|
#
|
||||||
# Multi-device support (RAID and LVM)
|
# Multi-device support (RAID and LVM)
|
||||||
#
|
#
|
||||||
CONFIG_MD=y
|
# CONFIG_MD is not set
|
||||||
# CONFIG_BLK_DEV_MD is not set
|
|
||||||
CONFIG_BLK_DEV_DM=y
|
|
||||||
# CONFIG_DM_CRYPT is not set
|
|
||||||
# CONFIG_DM_SNAPSHOT is not set
|
|
||||||
# CONFIG_DM_MIRROR is not set
|
|
||||||
# CONFIG_DM_ZERO is not set
|
|
||||||
# CONFIG_DM_MULTIPATH is not set
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Fusion MPT device support
|
# Fusion MPT device support
|
||||||
|
@ -444,7 +351,6 @@ CONFIG_BLK_DEV_DM=y
|
||||||
#
|
#
|
||||||
# IEEE 1394 (FireWire) support
|
# IEEE 1394 (FireWire) support
|
||||||
#
|
#
|
||||||
# CONFIG_IEEE1394 is not set
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# I2O device support
|
# I2O device support
|
||||||
|
@ -468,10 +374,9 @@ CONFIG_NETDEVICES=y
|
||||||
# Ethernet (10 or 100Mbit)
|
# Ethernet (10 or 100Mbit)
|
||||||
#
|
#
|
||||||
CONFIG_NET_ETHERNET=y
|
CONFIG_NET_ETHERNET=y
|
||||||
# CONFIG_MII is not set
|
CONFIG_MII=y
|
||||||
# CONFIG_SMC91X is not set
|
CONFIG_SMC91X=y
|
||||||
# CONFIG_DM9000 is not set
|
# CONFIG_DM9000 is not set
|
||||||
CONFIG_CS89x0=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Ethernet (1000 Mbit)
|
# Ethernet (1000 Mbit)
|
||||||
|
@ -496,8 +401,6 @@ CONFIG_CS89x0=y
|
||||||
# CONFIG_WAN is not set
|
# CONFIG_WAN is not set
|
||||||
# CONFIG_PPP is not set
|
# CONFIG_PPP is not set
|
||||||
# CONFIG_SLIP is not set
|
# CONFIG_SLIP is not set
|
||||||
# CONFIG_SHAPER is not set
|
|
||||||
# CONFIG_NETCONSOLE is not set
|
|
||||||
# CONFIG_NETPOLL is not set
|
# CONFIG_NETPOLL is not set
|
||||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||||
|
|
||||||
|
@ -514,17 +417,28 @@ CONFIG_INPUT=y
|
||||||
#
|
#
|
||||||
# Userland interfaces
|
# Userland interfaces
|
||||||
#
|
#
|
||||||
# CONFIG_INPUT_MOUSEDEV is not set
|
CONFIG_INPUT_MOUSEDEV=y
|
||||||
|
CONFIG_INPUT_MOUSEDEV_PSAUX=y
|
||||||
|
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
|
||||||
|
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 is not set
|
||||||
CONFIG_INPUT_EVBUG=y
|
# CONFIG_INPUT_EVBUG is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Input Device Drivers
|
# Input Device Drivers
|
||||||
#
|
#
|
||||||
# CONFIG_INPUT_KEYBOARD is not set
|
CONFIG_INPUT_KEYBOARD=y
|
||||||
# CONFIG_INPUT_MOUSE is not set
|
CONFIG_KEYBOARD_ATKBD=y
|
||||||
|
# CONFIG_KEYBOARD_SUNKBD is not set
|
||||||
|
# CONFIG_KEYBOARD_LKKBD is not set
|
||||||
|
# CONFIG_KEYBOARD_XTKBD is not set
|
||||||
|
# CONFIG_KEYBOARD_NEWTON is not set
|
||||||
|
CONFIG_INPUT_MOUSE=y
|
||||||
|
CONFIG_MOUSE_PS2=y
|
||||||
|
# CONFIG_MOUSE_SERIAL is not set
|
||||||
|
# CONFIG_MOUSE_VSXXXAA is not set
|
||||||
# CONFIG_INPUT_JOYSTICK is not set
|
# CONFIG_INPUT_JOYSTICK is not set
|
||||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||||
# CONFIG_INPUT_MISC is not set
|
# CONFIG_INPUT_MISC is not set
|
||||||
|
@ -533,8 +447,9 @@ CONFIG_INPUT_EVBUG=y
|
||||||
# Hardware I/O ports
|
# Hardware I/O ports
|
||||||
#
|
#
|
||||||
CONFIG_SERIO=y
|
CONFIG_SERIO=y
|
||||||
CONFIG_SERIO_SERPORT=y
|
# CONFIG_SERIO_SERPORT is not set
|
||||||
# CONFIG_SERIO_LIBPS2 is not set
|
CONFIG_SERIO_AMBAKMI=y
|
||||||
|
CONFIG_SERIO_LIBPS2=y
|
||||||
# CONFIG_SERIO_RAW is not set
|
# CONFIG_SERIO_RAW is not set
|
||||||
# CONFIG_GAMEPORT is not set
|
# CONFIG_GAMEPORT is not set
|
||||||
|
|
||||||
|
@ -549,21 +464,19 @@ CONFIG_HW_CONSOLE=y
|
||||||
#
|
#
|
||||||
# Serial drivers
|
# Serial drivers
|
||||||
#
|
#
|
||||||
CONFIG_SERIAL_8250=y
|
# CONFIG_SERIAL_8250 is not set
|
||||||
CONFIG_SERIAL_8250_CONSOLE=y
|
|
||||||
CONFIG_SERIAL_8250_NR_UARTS=2
|
|
||||||
# CONFIG_SERIAL_8250_EXTENDED is not set
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Non-8250 serial port support
|
# Non-8250 serial port support
|
||||||
#
|
#
|
||||||
CONFIG_SERIAL_CLPS711X=y
|
# CONFIG_SERIAL_AMBA_PL010 is not set
|
||||||
CONFIG_SERIAL_CLPS711X_CONSOLE=y
|
CONFIG_SERIAL_AMBA_PL011=y
|
||||||
|
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
|
||||||
CONFIG_SERIAL_CORE=y
|
CONFIG_SERIAL_CORE=y
|
||||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||||
CONFIG_UNIX98_PTYS=y
|
CONFIG_UNIX98_PTYS=y
|
||||||
CONFIG_LEGACY_PTYS=y
|
CONFIG_LEGACY_PTYS=y
|
||||||
CONFIG_LEGACY_PTY_COUNT=256
|
CONFIG_LEGACY_PTY_COUNT=16
|
||||||
|
|
||||||
#
|
#
|
||||||
# IPMI
|
# IPMI
|
||||||
|
@ -574,8 +487,8 @@ CONFIG_LEGACY_PTY_COUNT=256
|
||||||
# Watchdog Cards
|
# Watchdog Cards
|
||||||
#
|
#
|
||||||
# CONFIG_WATCHDOG is not set
|
# CONFIG_WATCHDOG is not set
|
||||||
CONFIG_NVRAM=y
|
# CONFIG_NVRAM is not set
|
||||||
CONFIG_RTC=y
|
# CONFIG_RTC is not set
|
||||||
# CONFIG_DTLK is not set
|
# CONFIG_DTLK is not set
|
||||||
# CONFIG_R3964 is not set
|
# CONFIG_R3964 is not set
|
||||||
|
|
||||||
|
@ -596,9 +509,8 @@ CONFIG_RTC=y
|
||||||
#
|
#
|
||||||
# Hardware Monitoring support
|
# Hardware Monitoring support
|
||||||
#
|
#
|
||||||
CONFIG_HWMON=y
|
# CONFIG_HWMON is not set
|
||||||
# CONFIG_HWMON_VID is not set
|
# CONFIG_HWMON_VID is not set
|
||||||
# CONFIG_HWMON_DEBUG_CHIP is not set
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Misc devices
|
# Misc devices
|
||||||
|
@ -621,18 +533,72 @@ CONFIG_HWMON=y
|
||||||
#
|
#
|
||||||
# Graphics support
|
# Graphics support
|
||||||
#
|
#
|
||||||
# CONFIG_FB is not set
|
CONFIG_FB=y
|
||||||
|
CONFIG_FB_CFB_FILLRECT=y
|
||||||
|
CONFIG_FB_CFB_COPYAREA=y
|
||||||
|
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||||
|
CONFIG_FB_SOFT_CURSOR=y
|
||||||
|
# CONFIG_FB_MACMODES is not set
|
||||||
|
# CONFIG_FB_MODE_HELPERS is not set
|
||||||
|
# CONFIG_FB_TILEBLITTING is not set
|
||||||
|
CONFIG_FB_ARMCLCD=y
|
||||||
|
# CONFIG_FB_S1D13XXX is not set
|
||||||
|
# CONFIG_FB_VIRTUAL is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Console display driver support
|
# Console display driver support
|
||||||
#
|
#
|
||||||
# CONFIG_VGA_CONSOLE is not set
|
# CONFIG_VGA_CONSOLE is not set
|
||||||
CONFIG_DUMMY_CONSOLE=y
|
CONFIG_DUMMY_CONSOLE=y
|
||||||
|
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||||
|
# CONFIG_FONTS is not set
|
||||||
|
CONFIG_FONT_8x8=y
|
||||||
|
CONFIG_FONT_8x16=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Logo configuration
|
||||||
|
#
|
||||||
|
CONFIG_LOGO=y
|
||||||
|
# CONFIG_LOGO_LINUX_MONO is not set
|
||||||
|
# CONFIG_LOGO_LINUX_VGA16 is not set
|
||||||
|
CONFIG_LOGO_LINUX_CLUT224=y
|
||||||
|
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Sound
|
# Sound
|
||||||
#
|
#
|
||||||
# CONFIG_SOUND is not set
|
CONFIG_SOUND=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Advanced Linux Sound Architecture
|
||||||
|
#
|
||||||
|
CONFIG_SND=y
|
||||||
|
CONFIG_SND_TIMER=y
|
||||||
|
CONFIG_SND_PCM=y
|
||||||
|
# CONFIG_SND_SEQUENCER is not set
|
||||||
|
CONFIG_SND_OSSEMUL=y
|
||||||
|
CONFIG_SND_MIXER_OSS=y
|
||||||
|
CONFIG_SND_PCM_OSS=y
|
||||||
|
# CONFIG_SND_VERBOSE_PRINTK is not set
|
||||||
|
# CONFIG_SND_DEBUG is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Generic devices
|
||||||
|
#
|
||||||
|
# CONFIG_SND_DUMMY is not set
|
||||||
|
# CONFIG_SND_MTPAV is not set
|
||||||
|
# CONFIG_SND_SERIAL_U16550 is not set
|
||||||
|
# CONFIG_SND_MPU401 is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# ALSA ARM devices
|
||||||
|
#
|
||||||
|
# CONFIG_SND_ARMAACI is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Open Sound System
|
||||||
|
#
|
||||||
|
# CONFIG_SOUND_PRIME is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# USB support
|
# USB support
|
||||||
|
@ -654,32 +620,17 @@ CONFIG_USB_ARCH_HAS_HCD=y
|
||||||
#
|
#
|
||||||
# File systems
|
# File systems
|
||||||
#
|
#
|
||||||
CONFIG_EXT2_FS=y
|
# CONFIG_EXT2_FS is not set
|
||||||
CONFIG_EXT2_FS_XATTR=y
|
# CONFIG_EXT3_FS is not set
|
||||||
# CONFIG_EXT2_FS_POSIX_ACL is not set
|
# CONFIG_JBD is not set
|
||||||
# CONFIG_EXT2_FS_SECURITY is not set
|
# CONFIG_REISERFS_FS is not set
|
||||||
# CONFIG_EXT2_FS_XIP is not set
|
|
||||||
CONFIG_EXT3_FS=y
|
|
||||||
CONFIG_EXT3_FS_XATTR=y
|
|
||||||
# CONFIG_EXT3_FS_POSIX_ACL is not set
|
|
||||||
# CONFIG_EXT3_FS_SECURITY is not set
|
|
||||||
CONFIG_JBD=y
|
|
||||||
# CONFIG_JBD_DEBUG is not set
|
|
||||||
CONFIG_FS_MBCACHE=y
|
|
||||||
CONFIG_REISERFS_FS=m
|
|
||||||
# CONFIG_REISERFS_CHECK is not set
|
|
||||||
# CONFIG_REISERFS_PROC_INFO is not set
|
|
||||||
# CONFIG_REISERFS_FS_XATTR is not set
|
|
||||||
# CONFIG_JFS_FS is not set
|
# CONFIG_JFS_FS is not set
|
||||||
CONFIG_FS_POSIX_ACL=y
|
# CONFIG_FS_POSIX_ACL is not set
|
||||||
# CONFIG_XFS_FS is not set
|
# CONFIG_XFS_FS is not set
|
||||||
# CONFIG_MINIX_FS is not set
|
# CONFIG_MINIX_FS is not set
|
||||||
# CONFIG_ROMFS_FS is not set
|
# CONFIG_ROMFS_FS is not set
|
||||||
CONFIG_INOTIFY=y
|
CONFIG_INOTIFY=y
|
||||||
CONFIG_QUOTA=y
|
# CONFIG_QUOTA is not set
|
||||||
# CONFIG_QFMT_V1 is not set
|
|
||||||
# CONFIG_QFMT_V2 is not set
|
|
||||||
CONFIG_QUOTACTL=y
|
|
||||||
CONFIG_DNOTIFY=y
|
CONFIG_DNOTIFY=y
|
||||||
# CONFIG_AUTOFS_FS is not set
|
# CONFIG_AUTOFS_FS is not set
|
||||||
# CONFIG_AUTOFS4_FS is not set
|
# CONFIG_AUTOFS4_FS is not set
|
||||||
|
@ -694,8 +645,11 @@ CONFIG_DNOTIFY=y
|
||||||
#
|
#
|
||||||
# DOS/FAT/NT Filesystems
|
# DOS/FAT/NT Filesystems
|
||||||
#
|
#
|
||||||
|
CONFIG_FAT_FS=y
|
||||||
# CONFIG_MSDOS_FS is not set
|
# CONFIG_MSDOS_FS is not set
|
||||||
# CONFIG_VFAT_FS is not set
|
CONFIG_VFAT_FS=y
|
||||||
|
CONFIG_FAT_DEFAULT_CODEPAGE=437
|
||||||
|
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
|
||||||
# CONFIG_NTFS_FS is not set
|
# CONFIG_NTFS_FS is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -704,7 +658,6 @@ CONFIG_DNOTIFY=y
|
||||||
CONFIG_PROC_FS=y
|
CONFIG_PROC_FS=y
|
||||||
CONFIG_SYSFS=y
|
CONFIG_SYSFS=y
|
||||||
CONFIG_TMPFS=y
|
CONFIG_TMPFS=y
|
||||||
# CONFIG_HUGETLBFS is not set
|
|
||||||
# CONFIG_HUGETLB_PAGE is not set
|
# CONFIG_HUGETLB_PAGE is not set
|
||||||
CONFIG_RAMFS=y
|
CONFIG_RAMFS=y
|
||||||
# CONFIG_RELAYFS_FS is not set
|
# CONFIG_RELAYFS_FS is not set
|
||||||
|
@ -712,22 +665,10 @@ CONFIG_RAMFS=y
|
||||||
#
|
#
|
||||||
# Miscellaneous filesystems
|
# Miscellaneous filesystems
|
||||||
#
|
#
|
||||||
# CONFIG_ADFS_FS is not set
|
|
||||||
# CONFIG_AFFS_FS is not set
|
|
||||||
# CONFIG_HFS_FS is not set
|
|
||||||
# CONFIG_HFSPLUS_FS is not set
|
# CONFIG_HFSPLUS_FS is not set
|
||||||
# CONFIG_BEFS_FS is not set
|
|
||||||
# CONFIG_BFS_FS is not set
|
|
||||||
# CONFIG_EFS_FS is not set
|
|
||||||
# CONFIG_JFFS_FS is not set
|
# CONFIG_JFFS_FS is not set
|
||||||
CONFIG_JFFS2_FS=m
|
# CONFIG_JFFS2_FS is not set
|
||||||
CONFIG_JFFS2_FS_DEBUG=0
|
CONFIG_CRAMFS=y
|
||||||
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
|
||||||
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
|
|
||||||
CONFIG_JFFS2_ZLIB=y
|
|
||||||
CONFIG_JFFS2_RTIME=y
|
|
||||||
# CONFIG_JFFS2_RUBIN is not set
|
|
||||||
CONFIG_CRAMFS=m
|
|
||||||
# CONFIG_VXFS_FS is not set
|
# CONFIG_VXFS_FS is not set
|
||||||
# CONFIG_HPFS_FS is not set
|
# CONFIG_HPFS_FS is not set
|
||||||
# CONFIG_QNX4FS_FS is not set
|
# CONFIG_QNX4FS_FS is not set
|
||||||
|
@ -740,32 +681,16 @@ CONFIG_CRAMFS=m
|
||||||
CONFIG_NFS_FS=y
|
CONFIG_NFS_FS=y
|
||||||
CONFIG_NFS_V3=y
|
CONFIG_NFS_V3=y
|
||||||
# CONFIG_NFS_V3_ACL is not set
|
# CONFIG_NFS_V3_ACL is not set
|
||||||
CONFIG_NFS_V4=y
|
# CONFIG_NFSD is not set
|
||||||
# CONFIG_NFS_DIRECTIO is not set
|
|
||||||
CONFIG_NFSD=y
|
|
||||||
CONFIG_NFSD_V3=y
|
|
||||||
# CONFIG_NFSD_V3_ACL is not set
|
|
||||||
CONFIG_NFSD_V4=y
|
|
||||||
CONFIG_NFSD_TCP=y
|
|
||||||
CONFIG_ROOT_NFS=y
|
CONFIG_ROOT_NFS=y
|
||||||
CONFIG_LOCKD=y
|
CONFIG_LOCKD=y
|
||||||
CONFIG_LOCKD_V4=y
|
CONFIG_LOCKD_V4=y
|
||||||
CONFIG_EXPORTFS=y
|
|
||||||
CONFIG_NFS_COMMON=y
|
CONFIG_NFS_COMMON=y
|
||||||
CONFIG_SUNRPC=y
|
CONFIG_SUNRPC=y
|
||||||
CONFIG_SUNRPC_GSS=y
|
# CONFIG_SMB_FS is not set
|
||||||
CONFIG_RPCSEC_GSS_KRB5=y
|
# CONFIG_CIFS is not set
|
||||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
|
||||||
CONFIG_SMB_FS=m
|
|
||||||
# CONFIG_SMB_NLS_DEFAULT is not set
|
|
||||||
CONFIG_CIFS=m
|
|
||||||
# CONFIG_CIFS_STATS is not set
|
|
||||||
# CONFIG_CIFS_XATTR is not set
|
|
||||||
# CONFIG_CIFS_EXPERIMENTAL is not set
|
|
||||||
# CONFIG_NCP_FS is not set
|
# CONFIG_NCP_FS is not set
|
||||||
# CONFIG_CODA_FS is not set
|
# CONFIG_CODA_FS is not set
|
||||||
# CONFIG_AFS_FS is not set
|
|
||||||
# CONFIG_9P_FS is not set
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Partition Types
|
# Partition Types
|
||||||
|
@ -802,7 +727,7 @@ CONFIG_NLS_CODEPAGE_437=y
|
||||||
# CONFIG_NLS_CODEPAGE_1250 is not set
|
# CONFIG_NLS_CODEPAGE_1250 is not set
|
||||||
# CONFIG_NLS_CODEPAGE_1251 is not set
|
# CONFIG_NLS_CODEPAGE_1251 is not set
|
||||||
# CONFIG_NLS_ASCII is not set
|
# CONFIG_NLS_ASCII is not set
|
||||||
# CONFIG_NLS_ISO8859_1 is not set
|
CONFIG_NLS_ISO8859_1=y
|
||||||
# CONFIG_NLS_ISO8859_2 is not set
|
# CONFIG_NLS_ISO8859_2 is not set
|
||||||
# CONFIG_NLS_ISO8859_3 is not set
|
# CONFIG_NLS_ISO8859_3 is not set
|
||||||
# CONFIG_NLS_ISO8859_4 is not set
|
# CONFIG_NLS_ISO8859_4 is not set
|
||||||
|
@ -817,35 +742,27 @@ CONFIG_NLS_CODEPAGE_437=y
|
||||||
# CONFIG_NLS_KOI8_U is not set
|
# CONFIG_NLS_KOI8_U is not set
|
||||||
# CONFIG_NLS_UTF8 is not set
|
# CONFIG_NLS_UTF8 is not set
|
||||||
|
|
||||||
#
|
|
||||||
# Profiling support
|
|
||||||
#
|
|
||||||
# CONFIG_PROFILING is not set
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Kernel hacking
|
# Kernel hacking
|
||||||
#
|
#
|
||||||
CONFIG_PRINTK_TIME=y
|
# CONFIG_PRINTK_TIME is not set
|
||||||
CONFIG_DEBUG_KERNEL=y
|
CONFIG_DEBUG_KERNEL=y
|
||||||
# CONFIG_MAGIC_SYSRQ is not set
|
CONFIG_MAGIC_SYSRQ=y
|
||||||
CONFIG_LOG_BUF_SHIFT=14
|
CONFIG_LOG_BUF_SHIFT=14
|
||||||
CONFIG_DETECT_SOFTLOCKUP=y
|
CONFIG_DETECT_SOFTLOCKUP=y
|
||||||
# CONFIG_SCHEDSTATS is not set
|
# CONFIG_SCHEDSTATS is not set
|
||||||
# CONFIG_DEBUG_SLAB is not set
|
# CONFIG_DEBUG_SLAB is not set
|
||||||
CONFIG_DEBUG_PREEMPT=y
|
|
||||||
# CONFIG_DEBUG_SPINLOCK is not set
|
# CONFIG_DEBUG_SPINLOCK is not set
|
||||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||||
# CONFIG_DEBUG_KOBJECT is not set
|
# CONFIG_DEBUG_KOBJECT is not set
|
||||||
# CONFIG_DEBUG_BUGVERBOSE is not set
|
CONFIG_DEBUG_BUGVERBOSE=y
|
||||||
CONFIG_DEBUG_INFO=y
|
# CONFIG_DEBUG_INFO is not set
|
||||||
# CONFIG_DEBUG_FS is not set
|
# CONFIG_DEBUG_FS is not set
|
||||||
CONFIG_FRAME_POINTER=y
|
CONFIG_FRAME_POINTER=y
|
||||||
CONFIG_DEBUG_USER=y
|
CONFIG_DEBUG_USER=y
|
||||||
CONFIG_DEBUG_WAITQ=y
|
# CONFIG_DEBUG_WAITQ is not set
|
||||||
CONFIG_DEBUG_ERRORS=y
|
CONFIG_DEBUG_ERRORS=y
|
||||||
CONFIG_DEBUG_LL=y
|
# CONFIG_DEBUG_LL is not set
|
||||||
# CONFIG_DEBUG_ICEDCC is not set
|
|
||||||
# CONFIG_DEBUG_CLPS711X_UART2 is not set
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Security options
|
# Security options
|
||||||
|
@ -856,31 +773,7 @@ CONFIG_DEBUG_LL=y
|
||||||
#
|
#
|
||||||
# Cryptographic options
|
# Cryptographic options
|
||||||
#
|
#
|
||||||
CONFIG_CRYPTO=y
|
# CONFIG_CRYPTO is not set
|
||||||
# CONFIG_CRYPTO_HMAC is not set
|
|
||||||
# CONFIG_CRYPTO_NULL is not set
|
|
||||||
# CONFIG_CRYPTO_MD4 is not set
|
|
||||||
CONFIG_CRYPTO_MD5=y
|
|
||||||
# CONFIG_CRYPTO_SHA1 is not set
|
|
||||||
# CONFIG_CRYPTO_SHA256 is not set
|
|
||||||
# CONFIG_CRYPTO_SHA512 is not set
|
|
||||||
# CONFIG_CRYPTO_WP512 is not set
|
|
||||||
# CONFIG_CRYPTO_TGR192 is not set
|
|
||||||
CONFIG_CRYPTO_DES=y
|
|
||||||
# CONFIG_CRYPTO_BLOWFISH is not set
|
|
||||||
# CONFIG_CRYPTO_TWOFISH is not set
|
|
||||||
# CONFIG_CRYPTO_SERPENT is not set
|
|
||||||
# CONFIG_CRYPTO_AES is not set
|
|
||||||
# CONFIG_CRYPTO_CAST5 is not set
|
|
||||||
# CONFIG_CRYPTO_CAST6 is not set
|
|
||||||
# CONFIG_CRYPTO_TEA is not set
|
|
||||||
# CONFIG_CRYPTO_ARC4 is not set
|
|
||||||
# CONFIG_CRYPTO_KHAZAD is not set
|
|
||||||
# CONFIG_CRYPTO_ANUBIS is not set
|
|
||||||
# CONFIG_CRYPTO_DEFLATE is not set
|
|
||||||
# CONFIG_CRYPTO_MICHAEL_MIC is not set
|
|
||||||
# CONFIG_CRYPTO_CRC32C is not set
|
|
||||||
# CONFIG_CRYPTO_TEST is not set
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Hardware crypto devices
|
# Hardware crypto devices
|
||||||
|
@ -893,5 +786,4 @@ CONFIG_CRYPTO_DES=y
|
||||||
# CONFIG_CRC16 is not set
|
# CONFIG_CRC16 is not set
|
||||||
CONFIG_CRC32=y
|
CONFIG_CRC32=y
|
||||||
# CONFIG_LIBCRC32C is not set
|
# CONFIG_LIBCRC32C is not set
|
||||||
CONFIG_ZLIB_INFLATE=m
|
CONFIG_ZLIB_INFLATE=y
|
||||||
CONFIG_ZLIB_DEFLATE=m
|
|
|
@ -785,7 +785,7 @@ __kuser_helper_end:
|
||||||
* SP points to a minimal amount of processor-private memory, the address
|
* SP points to a minimal amount of processor-private memory, the address
|
||||||
* of which is copied into r0 for the mode specific abort handler.
|
* of which is copied into r0 for the mode specific abort handler.
|
||||||
*/
|
*/
|
||||||
.macro vector_stub, name, correction=0
|
.macro vector_stub, name, mode, correction=0
|
||||||
.align 5
|
.align 5
|
||||||
|
|
||||||
vector_\name:
|
vector_\name:
|
||||||
|
@ -805,15 +805,14 @@ vector_\name:
|
||||||
@ Prepare for SVC32 mode. IRQs remain disabled.
|
@ Prepare for SVC32 mode. IRQs remain disabled.
|
||||||
@
|
@
|
||||||
mrs r0, cpsr
|
mrs r0, cpsr
|
||||||
bic r0, r0, #MODE_MASK
|
eor r0, r0, #(\mode ^ SVC_MODE)
|
||||||
orr r0, r0, #SVC_MODE
|
|
||||||
msr spsr_cxsf, r0
|
msr spsr_cxsf, r0
|
||||||
|
|
||||||
@
|
@
|
||||||
@ the branch table must immediately follow this code
|
@ the branch table must immediately follow this code
|
||||||
@
|
@
|
||||||
mov r0, sp
|
|
||||||
and lr, lr, #0x0f
|
and lr, lr, #0x0f
|
||||||
|
mov r0, sp
|
||||||
ldr lr, [pc, lr, lsl #2]
|
ldr lr, [pc, lr, lsl #2]
|
||||||
movs pc, lr @ branch to handler in SVC mode
|
movs pc, lr @ branch to handler in SVC mode
|
||||||
.endm
|
.endm
|
||||||
|
@ -823,7 +822,7 @@ __stubs_start:
|
||||||
/*
|
/*
|
||||||
* Interrupt dispatcher
|
* Interrupt dispatcher
|
||||||
*/
|
*/
|
||||||
vector_stub irq, 4
|
vector_stub irq, IRQ_MODE, 4
|
||||||
|
|
||||||
.long __irq_usr @ 0 (USR_26 / USR_32)
|
.long __irq_usr @ 0 (USR_26 / USR_32)
|
||||||
.long __irq_invalid @ 1 (FIQ_26 / FIQ_32)
|
.long __irq_invalid @ 1 (FIQ_26 / FIQ_32)
|
||||||
|
@ -846,7 +845,7 @@ __stubs_start:
|
||||||
* Data abort dispatcher
|
* Data abort dispatcher
|
||||||
* Enter in ABT mode, spsr = USR CPSR, lr = USR PC
|
* Enter in ABT mode, spsr = USR CPSR, lr = USR PC
|
||||||
*/
|
*/
|
||||||
vector_stub dabt, 8
|
vector_stub dabt, ABT_MODE, 8
|
||||||
|
|
||||||
.long __dabt_usr @ 0 (USR_26 / USR_32)
|
.long __dabt_usr @ 0 (USR_26 / USR_32)
|
||||||
.long __dabt_invalid @ 1 (FIQ_26 / FIQ_32)
|
.long __dabt_invalid @ 1 (FIQ_26 / FIQ_32)
|
||||||
|
@ -869,7 +868,7 @@ __stubs_start:
|
||||||
* Prefetch abort dispatcher
|
* Prefetch abort dispatcher
|
||||||
* Enter in ABT mode, spsr = USR CPSR, lr = USR PC
|
* Enter in ABT mode, spsr = USR CPSR, lr = USR PC
|
||||||
*/
|
*/
|
||||||
vector_stub pabt, 4
|
vector_stub pabt, ABT_MODE, 4
|
||||||
|
|
||||||
.long __pabt_usr @ 0 (USR_26 / USR_32)
|
.long __pabt_usr @ 0 (USR_26 / USR_32)
|
||||||
.long __pabt_invalid @ 1 (FIQ_26 / FIQ_32)
|
.long __pabt_invalid @ 1 (FIQ_26 / FIQ_32)
|
||||||
|
@ -892,7 +891,7 @@ __stubs_start:
|
||||||
* Undef instr entry dispatcher
|
* Undef instr entry dispatcher
|
||||||
* Enter in UND mode, spsr = SVC/USR CPSR, lr = SVC/USR PC
|
* Enter in UND mode, spsr = SVC/USR CPSR, lr = SVC/USR PC
|
||||||
*/
|
*/
|
||||||
vector_stub und
|
vector_stub und, UND_MODE
|
||||||
|
|
||||||
.long __und_usr @ 0 (USR_26 / USR_32)
|
.long __und_usr @ 0 (USR_26 / USR_32)
|
||||||
.long __und_invalid @ 1 (FIQ_26 / FIQ_32)
|
.long __und_invalid @ 1 (FIQ_26 / FIQ_32)
|
||||||
|
|
|
@ -648,7 +648,7 @@ static int ptrace_setwmmxregs(struct task_struct *tsk, void __user *ufp)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int do_ptrace(int request, struct task_struct *child, long addr, long data)
|
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||||
{
|
{
|
||||||
unsigned long tmp;
|
unsigned long tmp;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -782,53 +782,6 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage long sys_ptrace(long request, long pid, long addr, long data)
|
|
||||||
{
|
|
||||||
struct task_struct *child;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
lock_kernel();
|
|
||||||
ret = -EPERM;
|
|
||||||
if (request == PTRACE_TRACEME) {
|
|
||||||
/* are we already being traced? */
|
|
||||||
if (current->ptrace & PT_PTRACED)
|
|
||||||
goto out;
|
|
||||||
ret = security_ptrace(current->parent, current);
|
|
||||||
if (ret)
|
|
||||||
goto out;
|
|
||||||
/* set the ptrace bit in the process flags. */
|
|
||||||
current->ptrace |= PT_PTRACED;
|
|
||||||
ret = 0;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
ret = -ESRCH;
|
|
||||||
read_lock(&tasklist_lock);
|
|
||||||
child = find_task_by_pid(pid);
|
|
||||||
if (child)
|
|
||||||
get_task_struct(child);
|
|
||||||
read_unlock(&tasklist_lock);
|
|
||||||
if (!child)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
ret = -EPERM;
|
|
||||||
if (pid == 1) /* you may not mess with init */
|
|
||||||
goto out_tsk;
|
|
||||||
|
|
||||||
if (request == PTRACE_ATTACH) {
|
|
||||||
ret = ptrace_attach(child);
|
|
||||||
goto out_tsk;
|
|
||||||
}
|
|
||||||
ret = ptrace_check_attach(child, request == PTRACE_KILL);
|
|
||||||
if (ret == 0)
|
|
||||||
ret = do_ptrace(request, child, addr, data);
|
|
||||||
|
|
||||||
out_tsk:
|
|
||||||
put_task_struct(child);
|
|
||||||
out:
|
|
||||||
unlock_kernel();
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
asmlinkage void syscall_trace(int why, struct pt_regs *regs)
|
asmlinkage void syscall_trace(int why, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
unsigned long ip;
|
unsigned long ip;
|
||||||
|
|
|
@ -338,7 +338,8 @@ void cpu_init(void)
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
|
|
||||||
dump_cpu_info(cpu);
|
if (system_state == SYSTEM_BOOTING)
|
||||||
|
dump_cpu_info(cpu);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* setup stacks for re-entrant exception handlers
|
* setup stacks for re-entrant exception handlers
|
||||||
|
@ -838,7 +839,12 @@ static int c_show(struct seq_file *m, void *v)
|
||||||
|
|
||||||
#if defined(CONFIG_SMP)
|
#if defined(CONFIG_SMP)
|
||||||
for_each_online_cpu(i) {
|
for_each_online_cpu(i) {
|
||||||
seq_printf(m, "Processor\t: %d\n", i);
|
/*
|
||||||
|
* glibc reads /proc/cpuinfo to determine the number of
|
||||||
|
* online processors, looking for lines beginning with
|
||||||
|
* "processor". Give glibc what it expects.
|
||||||
|
*/
|
||||||
|
seq_printf(m, "processor\t: %d\n", i);
|
||||||
seq_printf(m, "BogoMIPS\t: %lu.%02lu\n\n",
|
seq_printf(m, "BogoMIPS\t: %lu.%02lu\n\n",
|
||||||
per_cpu(cpu_data, i).loops_per_jiffy / (500000UL/HZ),
|
per_cpu(cpu_data, i).loops_per_jiffy / (500000UL/HZ),
|
||||||
(per_cpu(cpu_data, i).loops_per_jiffy / (5000UL/HZ)) % 100);
|
(per_cpu(cpu_data, i).loops_per_jiffy / (5000UL/HZ)) % 100);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include <linux/config.h>
|
#include <linux/config.h>
|
||||||
|
|
||||||
#if __LINUX_ARM_ARCH__ >= 6 && defined(CONFIG_CPU_MPCORE)
|
#if __LINUX_ARM_ARCH__ >= 6 && defined(CONFIG_CPU_32v6K)
|
||||||
.macro bitop, instr
|
.macro bitop, instr
|
||||||
mov r2, #1
|
mov r2, #1
|
||||||
and r3, r0, #7 @ Get bit offset
|
and r3, r0, #7 @ Get bit offset
|
||||||
|
|
|
@ -43,8 +43,6 @@ ENTRY(__arch_copy_to_user)
|
||||||
stmfd sp!, {r2, r4 - r7, lr}
|
stmfd sp!, {r2, r4 - r7, lr}
|
||||||
cmp r2, #4
|
cmp r2, #4
|
||||||
blt .c2u_not_enough
|
blt .c2u_not_enough
|
||||||
PLD( pld [r1, #0] )
|
|
||||||
PLD( pld [r0, #0] )
|
|
||||||
ands ip, r0, #3
|
ands ip, r0, #3
|
||||||
bne .c2u_dest_not_aligned
|
bne .c2u_dest_not_aligned
|
||||||
.c2u_dest_aligned:
|
.c2u_dest_aligned:
|
||||||
|
@ -73,25 +71,13 @@ USER( strt r3, [r0], #4) @ May fault
|
||||||
sub r2, r2, ip
|
sub r2, r2, ip
|
||||||
subs ip, ip, #32
|
subs ip, ip, #32
|
||||||
blt .c2u_0rem8lp
|
blt .c2u_0rem8lp
|
||||||
PLD( pld [r1, #28] )
|
|
||||||
PLD( pld [r0, #28] )
|
|
||||||
PLD( subs ip, ip, #64 )
|
|
||||||
PLD( blt .c2u_0cpynopld )
|
|
||||||
PLD( pld [r1, #60] )
|
|
||||||
PLD( pld [r0, #60] )
|
|
||||||
|
|
||||||
.c2u_0cpy8lp:
|
.c2u_0cpy8lp: ldmia r1!, {r3 - r6}
|
||||||
PLD( pld [r1, #92] )
|
|
||||||
PLD( pld [r0, #92] )
|
|
||||||
.c2u_0cpynopld: ldmia r1!, {r3 - r6}
|
|
||||||
stmia r0!, {r3 - r6} @ Shouldnt fault
|
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||||
ldmia r1!, {r3 - r6}
|
ldmia r1!, {r3 - r6}
|
||||||
subs ip, ip, #32
|
subs ip, ip, #32
|
||||||
stmia r0!, {r3 - r6} @ Shouldnt fault
|
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||||
bpl .c2u_0cpy8lp
|
bpl .c2u_0cpy8lp
|
||||||
PLD( cmn ip, #64 )
|
|
||||||
PLD( bge .c2u_0cpynopld )
|
|
||||||
PLD( add ip, ip, #64 )
|
|
||||||
|
|
||||||
.c2u_0rem8lp: cmn ip, #16
|
.c2u_0rem8lp: cmn ip, #16
|
||||||
ldmgeia r1!, {r3 - r6}
|
ldmgeia r1!, {r3 - r6}
|
||||||
|
@ -143,17 +129,8 @@ USER( strt r3, [r0], #4) @ May fault
|
||||||
sub r2, r2, ip
|
sub r2, r2, ip
|
||||||
subs ip, ip, #16
|
subs ip, ip, #16
|
||||||
blt .c2u_1rem8lp
|
blt .c2u_1rem8lp
|
||||||
PLD( pld [r1, #12] )
|
|
||||||
PLD( pld [r0, #12] )
|
|
||||||
PLD( subs ip, ip, #32 )
|
|
||||||
PLD( blt .c2u_1cpynopld )
|
|
||||||
PLD( pld [r1, #28] )
|
|
||||||
PLD( pld [r0, #28] )
|
|
||||||
|
|
||||||
.c2u_1cpy8lp:
|
.c2u_1cpy8lp: mov r3, r7, pull #8
|
||||||
PLD( pld [r1, #44] )
|
|
||||||
PLD( pld [r0, #44] )
|
|
||||||
.c2u_1cpynopld: mov r3, r7, pull #8
|
|
||||||
ldmia r1!, {r4 - r7}
|
ldmia r1!, {r4 - r7}
|
||||||
subs ip, ip, #16
|
subs ip, ip, #16
|
||||||
orr r3, r3, r4, push #24
|
orr r3, r3, r4, push #24
|
||||||
|
@ -165,9 +142,6 @@ USER( strt r3, [r0], #4) @ May fault
|
||||||
orr r6, r6, r7, push #24
|
orr r6, r6, r7, push #24
|
||||||
stmia r0!, {r3 - r6} @ Shouldnt fault
|
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||||
bpl .c2u_1cpy8lp
|
bpl .c2u_1cpy8lp
|
||||||
PLD( cmn ip, #32 )
|
|
||||||
PLD( bge .c2u_1cpynopld )
|
|
||||||
PLD( add ip, ip, #32 )
|
|
||||||
|
|
||||||
.c2u_1rem8lp: tst ip, #8
|
.c2u_1rem8lp: tst ip, #8
|
||||||
movne r3, r7, pull #8
|
movne r3, r7, pull #8
|
||||||
|
@ -210,17 +184,8 @@ USER( strt r3, [r0], #4) @ May fault
|
||||||
sub r2, r2, ip
|
sub r2, r2, ip
|
||||||
subs ip, ip, #16
|
subs ip, ip, #16
|
||||||
blt .c2u_2rem8lp
|
blt .c2u_2rem8lp
|
||||||
PLD( pld [r1, #12] )
|
|
||||||
PLD( pld [r0, #12] )
|
|
||||||
PLD( subs ip, ip, #32 )
|
|
||||||
PLD( blt .c2u_2cpynopld )
|
|
||||||
PLD( pld [r1, #28] )
|
|
||||||
PLD( pld [r0, #28] )
|
|
||||||
|
|
||||||
.c2u_2cpy8lp:
|
.c2u_2cpy8lp: mov r3, r7, pull #16
|
||||||
PLD( pld [r1, #44] )
|
|
||||||
PLD( pld [r0, #44] )
|
|
||||||
.c2u_2cpynopld: mov r3, r7, pull #16
|
|
||||||
ldmia r1!, {r4 - r7}
|
ldmia r1!, {r4 - r7}
|
||||||
subs ip, ip, #16
|
subs ip, ip, #16
|
||||||
orr r3, r3, r4, push #16
|
orr r3, r3, r4, push #16
|
||||||
|
@ -232,9 +197,6 @@ USER( strt r3, [r0], #4) @ May fault
|
||||||
orr r6, r6, r7, push #16
|
orr r6, r6, r7, push #16
|
||||||
stmia r0!, {r3 - r6} @ Shouldnt fault
|
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||||
bpl .c2u_2cpy8lp
|
bpl .c2u_2cpy8lp
|
||||||
PLD( cmn ip, #32 )
|
|
||||||
PLD( bge .c2u_2cpynopld )
|
|
||||||
PLD( add ip, ip, #32 )
|
|
||||||
|
|
||||||
.c2u_2rem8lp: tst ip, #8
|
.c2u_2rem8lp: tst ip, #8
|
||||||
movne r3, r7, pull #16
|
movne r3, r7, pull #16
|
||||||
|
@ -277,17 +239,8 @@ USER( strt r3, [r0], #4) @ May fault
|
||||||
sub r2, r2, ip
|
sub r2, r2, ip
|
||||||
subs ip, ip, #16
|
subs ip, ip, #16
|
||||||
blt .c2u_3rem8lp
|
blt .c2u_3rem8lp
|
||||||
PLD( pld [r1, #12] )
|
|
||||||
PLD( pld [r0, #12] )
|
|
||||||
PLD( subs ip, ip, #32 )
|
|
||||||
PLD( blt .c2u_3cpynopld )
|
|
||||||
PLD( pld [r1, #28] )
|
|
||||||
PLD( pld [r0, #28] )
|
|
||||||
|
|
||||||
.c2u_3cpy8lp:
|
.c2u_3cpy8lp: mov r3, r7, pull #24
|
||||||
PLD( pld [r1, #44] )
|
|
||||||
PLD( pld [r0, #44] )
|
|
||||||
.c2u_3cpynopld: mov r3, r7, pull #24
|
|
||||||
ldmia r1!, {r4 - r7}
|
ldmia r1!, {r4 - r7}
|
||||||
subs ip, ip, #16
|
subs ip, ip, #16
|
||||||
orr r3, r3, r4, push #8
|
orr r3, r3, r4, push #8
|
||||||
|
@ -299,9 +252,6 @@ USER( strt r3, [r0], #4) @ May fault
|
||||||
orr r6, r6, r7, push #8
|
orr r6, r6, r7, push #8
|
||||||
stmia r0!, {r3 - r6} @ Shouldnt fault
|
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||||
bpl .c2u_3cpy8lp
|
bpl .c2u_3cpy8lp
|
||||||
PLD( cmn ip, #32 )
|
|
||||||
PLD( bge .c2u_3cpynopld )
|
|
||||||
PLD( add ip, ip, #32 )
|
|
||||||
|
|
||||||
.c2u_3rem8lp: tst ip, #8
|
.c2u_3rem8lp: tst ip, #8
|
||||||
movne r3, r7, pull #24
|
movne r3, r7, pull #24
|
||||||
|
@ -356,8 +306,6 @@ ENTRY(__arch_copy_from_user)
|
||||||
stmfd sp!, {r0, r2, r4 - r7, lr}
|
stmfd sp!, {r0, r2, r4 - r7, lr}
|
||||||
cmp r2, #4
|
cmp r2, #4
|
||||||
blt .cfu_not_enough
|
blt .cfu_not_enough
|
||||||
PLD( pld [r1, #0] )
|
|
||||||
PLD( pld [r0, #0] )
|
|
||||||
ands ip, r0, #3
|
ands ip, r0, #3
|
||||||
bne .cfu_dest_not_aligned
|
bne .cfu_dest_not_aligned
|
||||||
.cfu_dest_aligned:
|
.cfu_dest_aligned:
|
||||||
|
@ -385,25 +333,13 @@ USER( ldrt r3, [r1], #4)
|
||||||
sub r2, r2, ip
|
sub r2, r2, ip
|
||||||
subs ip, ip, #32
|
subs ip, ip, #32
|
||||||
blt .cfu_0rem8lp
|
blt .cfu_0rem8lp
|
||||||
PLD( pld [r1, #28] )
|
|
||||||
PLD( pld [r0, #28] )
|
|
||||||
PLD( subs ip, ip, #64 )
|
|
||||||
PLD( blt .cfu_0cpynopld )
|
|
||||||
PLD( pld [r1, #60] )
|
|
||||||
PLD( pld [r0, #60] )
|
|
||||||
|
|
||||||
.cfu_0cpy8lp:
|
.cfu_0cpy8lp: ldmia r1!, {r3 - r6} @ Shouldnt fault
|
||||||
PLD( pld [r1, #92] )
|
|
||||||
PLD( pld [r0, #92] )
|
|
||||||
.cfu_0cpynopld: ldmia r1!, {r3 - r6} @ Shouldnt fault
|
|
||||||
stmia r0!, {r3 - r6}
|
stmia r0!, {r3 - r6}
|
||||||
ldmia r1!, {r3 - r6} @ Shouldnt fault
|
ldmia r1!, {r3 - r6} @ Shouldnt fault
|
||||||
subs ip, ip, #32
|
subs ip, ip, #32
|
||||||
stmia r0!, {r3 - r6}
|
stmia r0!, {r3 - r6}
|
||||||
bpl .cfu_0cpy8lp
|
bpl .cfu_0cpy8lp
|
||||||
PLD( cmn ip, #64 )
|
|
||||||
PLD( bge .cfu_0cpynopld )
|
|
||||||
PLD( add ip, ip, #64 )
|
|
||||||
|
|
||||||
.cfu_0rem8lp: cmn ip, #16
|
.cfu_0rem8lp: cmn ip, #16
|
||||||
ldmgeia r1!, {r3 - r6} @ Shouldnt fault
|
ldmgeia r1!, {r3 - r6} @ Shouldnt fault
|
||||||
|
@ -456,17 +392,8 @@ USER( ldrt r7, [r1], #4) @ May fault
|
||||||
sub r2, r2, ip
|
sub r2, r2, ip
|
||||||
subs ip, ip, #16
|
subs ip, ip, #16
|
||||||
blt .cfu_1rem8lp
|
blt .cfu_1rem8lp
|
||||||
PLD( pld [r1, #12] )
|
|
||||||
PLD( pld [r0, #12] )
|
|
||||||
PLD( subs ip, ip, #32 )
|
|
||||||
PLD( blt .cfu_1cpynopld )
|
|
||||||
PLD( pld [r1, #28] )
|
|
||||||
PLD( pld [r0, #28] )
|
|
||||||
|
|
||||||
.cfu_1cpy8lp:
|
.cfu_1cpy8lp: mov r3, r7, pull #8
|
||||||
PLD( pld [r1, #44] )
|
|
||||||
PLD( pld [r0, #44] )
|
|
||||||
.cfu_1cpynopld: mov r3, r7, pull #8
|
|
||||||
ldmia r1!, {r4 - r7} @ Shouldnt fault
|
ldmia r1!, {r4 - r7} @ Shouldnt fault
|
||||||
subs ip, ip, #16
|
subs ip, ip, #16
|
||||||
orr r3, r3, r4, push #24
|
orr r3, r3, r4, push #24
|
||||||
|
@ -478,9 +405,6 @@ USER( ldrt r7, [r1], #4) @ May fault
|
||||||
orr r6, r6, r7, push #24
|
orr r6, r6, r7, push #24
|
||||||
stmia r0!, {r3 - r6}
|
stmia r0!, {r3 - r6}
|
||||||
bpl .cfu_1cpy8lp
|
bpl .cfu_1cpy8lp
|
||||||
PLD( cmn ip, #32 )
|
|
||||||
PLD( bge .cfu_1cpynopld )
|
|
||||||
PLD( add ip, ip, #32 )
|
|
||||||
|
|
||||||
.cfu_1rem8lp: tst ip, #8
|
.cfu_1rem8lp: tst ip, #8
|
||||||
movne r3, r7, pull #8
|
movne r3, r7, pull #8
|
||||||
|
@ -523,17 +447,8 @@ USER( ldrt r7, [r1], #4) @ May fault
|
||||||
sub r2, r2, ip
|
sub r2, r2, ip
|
||||||
subs ip, ip, #16
|
subs ip, ip, #16
|
||||||
blt .cfu_2rem8lp
|
blt .cfu_2rem8lp
|
||||||
PLD( pld [r1, #12] )
|
|
||||||
PLD( pld [r0, #12] )
|
|
||||||
PLD( subs ip, ip, #32 )
|
|
||||||
PLD( blt .cfu_2cpynopld )
|
|
||||||
PLD( pld [r1, #28] )
|
|
||||||
PLD( pld [r0, #28] )
|
|
||||||
|
|
||||||
.cfu_2cpy8lp:
|
.cfu_2cpy8lp: mov r3, r7, pull #16
|
||||||
PLD( pld [r1, #44] )
|
|
||||||
PLD( pld [r0, #44] )
|
|
||||||
.cfu_2cpynopld: mov r3, r7, pull #16
|
|
||||||
ldmia r1!, {r4 - r7} @ Shouldnt fault
|
ldmia r1!, {r4 - r7} @ Shouldnt fault
|
||||||
subs ip, ip, #16
|
subs ip, ip, #16
|
||||||
orr r3, r3, r4, push #16
|
orr r3, r3, r4, push #16
|
||||||
|
@ -545,9 +460,6 @@ USER( ldrt r7, [r1], #4) @ May fault
|
||||||
orr r6, r6, r7, push #16
|
orr r6, r6, r7, push #16
|
||||||
stmia r0!, {r3 - r6}
|
stmia r0!, {r3 - r6}
|
||||||
bpl .cfu_2cpy8lp
|
bpl .cfu_2cpy8lp
|
||||||
PLD( cmn ip, #32 )
|
|
||||||
PLD( bge .cfu_2cpynopld )
|
|
||||||
PLD( add ip, ip, #32 )
|
|
||||||
|
|
||||||
.cfu_2rem8lp: tst ip, #8
|
.cfu_2rem8lp: tst ip, #8
|
||||||
movne r3, r7, pull #16
|
movne r3, r7, pull #16
|
||||||
|
@ -590,17 +502,8 @@ USER( ldrt r7, [r1], #4) @ May fault
|
||||||
sub r2, r2, ip
|
sub r2, r2, ip
|
||||||
subs ip, ip, #16
|
subs ip, ip, #16
|
||||||
blt .cfu_3rem8lp
|
blt .cfu_3rem8lp
|
||||||
PLD( pld [r1, #12] )
|
|
||||||
PLD( pld [r0, #12] )
|
|
||||||
PLD( subs ip, ip, #32 )
|
|
||||||
PLD( blt .cfu_3cpynopld )
|
|
||||||
PLD( pld [r1, #28] )
|
|
||||||
PLD( pld [r0, #28] )
|
|
||||||
|
|
||||||
.cfu_3cpy8lp:
|
.cfu_3cpy8lp: mov r3, r7, pull #24
|
||||||
PLD( pld [r1, #44] )
|
|
||||||
PLD( pld [r0, #44] )
|
|
||||||
.cfu_3cpynopld: mov r3, r7, pull #24
|
|
||||||
ldmia r1!, {r4 - r7} @ Shouldnt fault
|
ldmia r1!, {r4 - r7} @ Shouldnt fault
|
||||||
orr r3, r3, r4, push #8
|
orr r3, r3, r4, push #8
|
||||||
mov r4, r4, pull #24
|
mov r4, r4, pull #24
|
||||||
|
@ -612,9 +515,6 @@ USER( ldrt r7, [r1], #4) @ May fault
|
||||||
stmia r0!, {r3 - r6}
|
stmia r0!, {r3 - r6}
|
||||||
subs ip, ip, #16
|
subs ip, ip, #16
|
||||||
bpl .cfu_3cpy8lp
|
bpl .cfu_3cpy8lp
|
||||||
PLD( cmn ip, #32 )
|
|
||||||
PLD( bge .cfu_3cpynopld )
|
|
||||||
PLD( add ip, ip, #32 )
|
|
||||||
|
|
||||||
.cfu_3rem8lp: tst ip, #8
|
.cfu_3rem8lp: tst ip, #8
|
||||||
movne r3, r7, pull #24
|
movne r3, r7, pull #24
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
|
#include <linux/string.h>
|
||||||
|
|
||||||
#include <asm/semaphore.h>
|
#include <asm/semaphore.h>
|
||||||
#include <asm/hardware/clock.h>
|
#include <asm/hardware/clock.h>
|
||||||
|
|
|
@ -69,17 +69,6 @@ config EP72XX_ROM_BOOT
|
||||||
|
|
||||||
You almost surely want to say N here.
|
You almost surely want to say N here.
|
||||||
|
|
||||||
config MACH_MP1000
|
|
||||||
bool "MACH_MP1000"
|
|
||||||
help
|
|
||||||
Say Y if you intend to run the kernel on the Comdial MP1000 platform.
|
|
||||||
|
|
||||||
config MP1000_90MHZ
|
|
||||||
bool "MP1000_90MHZ"
|
|
||||||
depends on MACH_MP1000
|
|
||||||
help
|
|
||||||
Say Y if you have the MP1000 configured to be set at 90MHZ rather than 74MHZ
|
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -15,7 +15,6 @@ obj-$(CONFIG_ARCH_CDB89712) += cdb89712.o
|
||||||
obj-$(CONFIG_ARCH_CLEP7312) += clep7312.o
|
obj-$(CONFIG_ARCH_CLEP7312) += clep7312.o
|
||||||
obj-$(CONFIG_ARCH_EDB7211) += edb7211-arch.o edb7211-mm.o
|
obj-$(CONFIG_ARCH_EDB7211) += edb7211-arch.o edb7211-mm.o
|
||||||
obj-$(CONFIG_ARCH_FORTUNET) += fortunet.o
|
obj-$(CONFIG_ARCH_FORTUNET) += fortunet.o
|
||||||
obj-$(CONFIG_MACH_MP1000) += mp1000-mach.o mp1000-mm.o mp1000-seprom.o
|
|
||||||
obj-$(CONFIG_ARCH_P720T) += p720t.o
|
obj-$(CONFIG_ARCH_P720T) += p720t.o
|
||||||
leds-$(CONFIG_ARCH_P720T) += p720t-leds.o
|
leds-$(CONFIG_ARCH_P720T) += p720t-leds.o
|
||||||
obj-$(CONFIG_LEDS) += $(leds-y)
|
obj-$(CONFIG_LEDS) += $(leds-y)
|
||||||
|
|
|
@ -55,22 +55,22 @@ static struct map_desc edb7211_io_desc[] __initdata = {
|
||||||
.virtual = EP7211_VIRT_EXTKBD,
|
.virtual = EP7211_VIRT_EXTKBD,
|
||||||
.pfn = __phys_to_pfn(EP7211_PHYS_EXTKBD),
|
.pfn = __phys_to_pfn(EP7211_PHYS_EXTKBD),
|
||||||
.length = SZ_1M,
|
.length = SZ_1M,
|
||||||
.type - MT_DEVICE
|
.type = MT_DEVICE,
|
||||||
}, { /* and CS8900A Ethernet chip */
|
}, { /* and CS8900A Ethernet chip */
|
||||||
.virtual = EP7211_VIRT_CS8900A,
|
.virtual = EP7211_VIRT_CS8900A,
|
||||||
.pfn = __phys_to_pfn(EP7211_PHYS_CS8900A),
|
.pfn = __phys_to_pfn(EP7211_PHYS_CS8900A),
|
||||||
.length = SZ_1M,
|
.length = SZ_1M,
|
||||||
.type = MT_DEVICE
|
.type = MT_DEVICE,
|
||||||
}, { /* flash banks */
|
}, { /* flash banks */
|
||||||
.virtual = EP7211_VIRT_FLASH1,
|
.virtual = EP7211_VIRT_FLASH1,
|
||||||
.pfn = __phys_to_pfn(EP7211_PHYS_FLASH1),
|
.pfn = __phys_to_pfn(EP7211_PHYS_FLASH1),
|
||||||
.length = SZ_8M,
|
.length = SZ_8M,
|
||||||
.type = MT_DEVICE
|
.type = MT_DEVICE,
|
||||||
}, {
|
}, {
|
||||||
.virtual = EP7211_VIRT_FLASH2,
|
.virtual = EP7211_VIRT_FLASH2,
|
||||||
.pfn = __phys_to_pfn(EP7211_PHYS_FLASH2),
|
.pfn = __phys_to_pfn(EP7211_PHYS_FLASH2),
|
||||||
.length = SZ_8M,
|
.length = SZ_8M,
|
||||||
.type = MT_DEVICE
|
.type = MT_DEVICE,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,49 +0,0 @@
|
||||||
/*
|
|
||||||
* linux/arch/arm/mach-mp1000/mp1000.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 2005 Comdial Corporation
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/types.h>
|
|
||||||
#include <linux/string.h>
|
|
||||||
|
|
||||||
#include <asm/setup.h>
|
|
||||||
#include <asm/mach-types.h>
|
|
||||||
#include <asm/mach/arch.h>
|
|
||||||
#include <asm/arch/mp1000-seprom.h>
|
|
||||||
|
|
||||||
#include "common.h"
|
|
||||||
|
|
||||||
extern void mp1000_map_io(void);
|
|
||||||
|
|
||||||
static void __init mp1000_init(void)
|
|
||||||
{
|
|
||||||
seprom_init();
|
|
||||||
}
|
|
||||||
|
|
||||||
MACHINE_START(MP1000, "Comdial MP1000")
|
|
||||||
/* Maintainer: Jon Ringle */
|
|
||||||
.phys_ram = 0xc0000000,
|
|
||||||
.phys_io = 0x80000000,
|
|
||||||
.io_pg_offst = ((0xff000000) >> 18) & 0xfffc,
|
|
||||||
.boot_params = 0xc0015100,
|
|
||||||
.map_io = mp1000_map_io,
|
|
||||||
.init_irq = clps711x_init_irq,
|
|
||||||
.init_machine = mp1000_init,
|
|
||||||
.timer = &clps711x_timer,
|
|
||||||
MACHINE_END
|
|
||||||
|
|
|
@ -1,47 +0,0 @@
|
||||||
/*
|
|
||||||
* linux/arch/arm/mach-mp1000/mm.c
|
|
||||||
*
|
|
||||||
* Extra MM routines for the MP1000
|
|
||||||
*
|
|
||||||
* Copyright (C) 2005 Comdial Corporation
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
#include <asm/hardware.h>
|
|
||||||
#include <asm/page.h>
|
|
||||||
#include <asm/pgtable.h>
|
|
||||||
#include <asm/sizes.h>
|
|
||||||
|
|
||||||
#include <asm/mach/map.h>
|
|
||||||
|
|
||||||
extern void clps711x_map_io(void);
|
|
||||||
|
|
||||||
static struct map_desc mp1000_io_desc[] __initdata = {
|
|
||||||
{ MP1000_EIO_BASE, MP1000_EIO_START, MP1000_EIO_SIZE, MT_DEVICE },
|
|
||||||
{ MP1000_FIO_BASE, MP1000_FIO_START, MP1000_FIO_SIZE, MT_DEVICE },
|
|
||||||
{ MP1000_LIO_BASE, MP1000_LIO_START, MP1000_LIO_SIZE, MT_DEVICE },
|
|
||||||
{ MP1000_NIO_BASE, MP1000_NIO_START, MP1000_NIO_SIZE, MT_DEVICE },
|
|
||||||
{ MP1000_IDE_BASE, MP1000_IDE_START, MP1000_IDE_SIZE, MT_DEVICE },
|
|
||||||
{ MP1000_DSP_BASE, MP1000_DSP_START, MP1000_DSP_SIZE, MT_DEVICE }
|
|
||||||
};
|
|
||||||
|
|
||||||
void __init mp1000_map_io(void)
|
|
||||||
{
|
|
||||||
clps711x_map_io();
|
|
||||||
iotable_init(mp1000_io_desc, ARRAY_SIZE(mp1000_io_desc));
|
|
||||||
}
|
|
|
@ -1,195 +0,0 @@
|
||||||
/*`
|
|
||||||
* mp1000-seprom.c
|
|
||||||
*
|
|
||||||
* This file contains the Serial EEPROM code for the MP1000 board
|
|
||||||
*
|
|
||||||
* Copyright (C) 2005 Comdial Corporation
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <asm/hardware.h>
|
|
||||||
#include <asm/hardware/clps7111.h>
|
|
||||||
#include <asm/arch/mp1000-seprom.h>
|
|
||||||
|
|
||||||
/* If SepromInit() can initialize and checksum the seprom successfully, */
|
|
||||||
/* then it will point seprom_data_ptr at the shadow copy. */
|
|
||||||
|
|
||||||
static eeprom_struct seprom_data; /* shadow copy of seprom content */
|
|
||||||
|
|
||||||
eeprom_struct *seprom_data_ptr = 0; /* 0 => not initialized */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Port D Bit 5 is Chip Select for EEPROM
|
|
||||||
* Port E Bit 0 is Input, Data out from EEPROM
|
|
||||||
* Port E Bit 1 is Output, Data in to EEPROM
|
|
||||||
* Port E Bit 2 is Output, CLK to EEPROM
|
|
||||||
*/
|
|
||||||
|
|
||||||
static char *port_d_ptr = (char *)(CLPS7111_VIRT_BASE + PDDR);
|
|
||||||
static char *port_e_ptr = (char *)(CLPS7111_VIRT_BASE + PEDR);
|
|
||||||
|
|
||||||
#define NO_OF_SHORTS 64 // Device is 64 x 16 bits
|
|
||||||
#define ENABLE_RW 0
|
|
||||||
#define DISABLE_RW 1
|
|
||||||
|
|
||||||
static inline void toggle_seprom_clock(void)
|
|
||||||
{
|
|
||||||
*port_e_ptr |= HwPortESepromCLK;
|
|
||||||
*port_e_ptr &= ~(HwPortESepromCLK);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void select_eeprom(void)
|
|
||||||
{
|
|
||||||
*port_d_ptr |= HwPortDEECS;
|
|
||||||
*port_e_ptr &= ~(HwPortESepromCLK);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void deselect_eeprom(void)
|
|
||||||
{
|
|
||||||
*port_d_ptr &= ~(HwPortDEECS);
|
|
||||||
*port_e_ptr &= ~(HwPortESepromDIn);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* GetSepromDataPtr - returns pointer to shadow (RAM) copy of seprom
|
|
||||||
* and returns 0 if seprom is not initialized or
|
|
||||||
* has a checksum error.
|
|
||||||
*/
|
|
||||||
|
|
||||||
eeprom_struct* get_seprom_ptr(void)
|
|
||||||
{
|
|
||||||
return seprom_data_ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char* get_eeprom_mac_address(void)
|
|
||||||
{
|
|
||||||
return seprom_data_ptr->variant.eprom_struct.mac_Address;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ReadSProm, Physically reads data from the Serial PROM
|
|
||||||
*/
|
|
||||||
static void read_sprom(short address, int length, eeprom_struct *buffer)
|
|
||||||
{
|
|
||||||
short data = COMMAND_READ | (address & 0x3F);
|
|
||||||
short bit;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
select_eeprom();
|
|
||||||
|
|
||||||
// Clock in 9 bits of the command
|
|
||||||
for (i = 0, bit = 0x100; i < 9; i++, bit >>= 1) {
|
|
||||||
if (data & bit)
|
|
||||||
*port_e_ptr |= HwPortESepromDIn;
|
|
||||||
else
|
|
||||||
*port_e_ptr &= ~(HwPortESepromDIn);
|
|
||||||
|
|
||||||
toggle_seprom_clock();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Now read one or more shorts of data from the Seprom
|
|
||||||
//
|
|
||||||
while (length-- > 0) {
|
|
||||||
data = 0;
|
|
||||||
|
|
||||||
// Read 16 bits at a time
|
|
||||||
for (i = 0; i < 16; i++) {
|
|
||||||
data <<= 1;
|
|
||||||
toggle_seprom_clock();
|
|
||||||
data |= *port_e_ptr & HwPortESepromDOut;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
buffer->variant.eprom_short_data[address++] = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
deselect_eeprom();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ReadSerialPROM
|
|
||||||
*
|
|
||||||
* Input: Pointer to array of 64 x 16 Bits
|
|
||||||
*
|
|
||||||
* Output: if no problem reading data is filled in
|
|
||||||
*/
|
|
||||||
static void read_serial_prom(eeprom_struct *data)
|
|
||||||
{
|
|
||||||
read_sprom(0, 64, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Compute Serial EEPROM checksum
|
|
||||||
//
|
|
||||||
// Input: Pointer to struct with Eprom data
|
|
||||||
//
|
|
||||||
// Output: The computed Eprom checksum
|
|
||||||
//
|
|
||||||
static short compute_seprom_checksum(eeprom_struct *data)
|
|
||||||
{
|
|
||||||
short checksum = 0;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < 126; i++) {
|
|
||||||
checksum += (short)data->variant.eprom_byte_data[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
return((short)(0x5555 - (checksum & 0xFFFF)));
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Make sure the data port bits for the SEPROM are correctly initialised
|
|
||||||
//
|
|
||||||
|
|
||||||
void __init seprom_init(void)
|
|
||||||
{
|
|
||||||
short checksum;
|
|
||||||
|
|
||||||
// Init Port D
|
|
||||||
*(char *)(CLPS7111_VIRT_BASE + PDDDR) = 0x0;
|
|
||||||
*(char *)(CLPS7111_VIRT_BASE + PDDR) = 0x15;
|
|
||||||
|
|
||||||
// Init Port E
|
|
||||||
*(int *)(CLPS7111_VIRT_BASE + PEDDR) = 0x06;
|
|
||||||
*(int *)(CLPS7111_VIRT_BASE + PEDR) = 0x04;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Make sure that EEPROM struct size never exceeds 128 bytes
|
|
||||||
//
|
|
||||||
if (sizeof(eeprom_struct) > 128) {
|
|
||||||
panic("Serial PROM struct size > 128, aborting read\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
read_serial_prom(&seprom_data);
|
|
||||||
|
|
||||||
checksum = compute_seprom_checksum(&seprom_data);
|
|
||||||
|
|
||||||
if (checksum != seprom_data.variant.eprom_short_data[63]) {
|
|
||||||
panic("Serial EEPROM checksum failed\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
seprom_data_ptr = &seprom_data;
|
|
||||||
}
|
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include <asm/hardware.h>
|
#include <asm/hardware.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/sizes.h>
|
#include <asm/sizes.h>
|
||||||
|
#include <asm/page.h>
|
||||||
|
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
|
|
||||||
|
|
|
@ -420,8 +420,7 @@ static int impd1_probe(struct lm_device *dev)
|
||||||
free_impd1:
|
free_impd1:
|
||||||
if (impd1 && impd1->base)
|
if (impd1 && impd1->base)
|
||||||
iounmap(impd1->base);
|
iounmap(impd1->base);
|
||||||
if (impd1)
|
kfree(impd1);
|
||||||
kfree(impd1);
|
|
||||||
release_lm:
|
release_lm:
|
||||||
release_mem_region(dev->resource.start, SZ_4K);
|
release_mem_region(dev->resource.start, SZ_4K);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -402,6 +402,40 @@ static void ixp2000_pci_irq_unmask(unsigned int irq)
|
||||||
ixp2000_reg_write(IXP2000_PCI_XSCALE_INT_ENABLE, (temp | (1 << 27)));
|
ixp2000_reg_write(IXP2000_PCI_XSCALE_INT_ENABLE, (temp | (1 << 27)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Error interrupts. These are used extensively by the microengine drivers
|
||||||
|
*/
|
||||||
|
static void ixp2000_err_irq_handler(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
unsigned long status = *IXP2000_IRQ_ERR_STATUS;
|
||||||
|
|
||||||
|
for(i = 31; i >= 0; i--) {
|
||||||
|
if(status & (1 << i)) {
|
||||||
|
desc = irq_desc + IRQ_IXP2000_DRAM0_MIN_ERR + i;
|
||||||
|
desc->handle(IRQ_IXP2000_DRAM0_MIN_ERR + i, desc, regs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ixp2000_err_irq_mask(unsigned int irq)
|
||||||
|
{
|
||||||
|
ixp2000_reg_write(IXP2000_IRQ_ERR_ENABLE_CLR,
|
||||||
|
(1 << (irq - IRQ_IXP2000_DRAM0_MIN_ERR)));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ixp2000_err_irq_unmask(unsigned int irq)
|
||||||
|
{
|
||||||
|
ixp2000_reg_write(IXP2000_IRQ_ERR_ENABLE_SET,
|
||||||
|
(1 << (irq - IRQ_IXP2000_DRAM0_MIN_ERR)));
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct irqchip ixp2000_err_irq_chip = {
|
||||||
|
.ack = ixp2000_err_irq_mask,
|
||||||
|
.mask = ixp2000_err_irq_mask,
|
||||||
|
.unmask = ixp2000_err_irq_unmask
|
||||||
|
};
|
||||||
|
|
||||||
static struct irqchip ixp2000_pci_irq_chip = {
|
static struct irqchip ixp2000_pci_irq_chip = {
|
||||||
.ack = ixp2000_pci_irq_mask,
|
.ack = ixp2000_pci_irq_mask,
|
||||||
.mask = ixp2000_pci_irq_mask,
|
.mask = ixp2000_pci_irq_mask,
|
||||||
|
@ -459,6 +493,18 @@ void __init ixp2000_init_irq(void)
|
||||||
} else set_irq_flags(irq, 0);
|
} else set_irq_flags(irq, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (irq = IRQ_IXP2000_DRAM0_MIN_ERR; irq <= IRQ_IXP2000_SP_INT; irq++) {
|
||||||
|
if((1 << (irq - IRQ_IXP2000_DRAM0_MIN_ERR)) &
|
||||||
|
IXP2000_VALID_ERR_IRQ_MASK) {
|
||||||
|
set_irq_chip(irq, &ixp2000_err_irq_chip);
|
||||||
|
set_irq_handler(irq, do_level_IRQ);
|
||||||
|
set_irq_flags(irq, IRQF_VALID);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
set_irq_flags(irq, 0);
|
||||||
|
}
|
||||||
|
set_irq_chained_handler(IRQ_IXP2000_ERRSUM, ixp2000_err_irq_handler);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GPIO IRQs are invalid until someone sets the interrupt mode
|
* GPIO IRQs are invalid until someone sets the interrupt mode
|
||||||
* by calling set_irq_type().
|
* by calling set_irq_type().
|
||||||
|
|
|
@ -69,19 +69,19 @@ static struct sys_timer enp2611_timer = {
|
||||||
static struct map_desc enp2611_io_desc[] __initdata = {
|
static struct map_desc enp2611_io_desc[] __initdata = {
|
||||||
{
|
{
|
||||||
.virtual = ENP2611_CALEB_VIRT_BASE,
|
.virtual = ENP2611_CALEB_VIRT_BASE,
|
||||||
.physical = ENP2611_CALEB_PHYS_BASE,
|
.pfn = __phys_to_pfn(ENP2611_CALEB_PHYS_BASE),
|
||||||
.length = ENP2611_CALEB_SIZE,
|
.length = ENP2611_CALEB_SIZE,
|
||||||
.type = MT_IXP2000_DEVICE
|
.type = MT_IXP2000_DEVICE,
|
||||||
}, {
|
}, {
|
||||||
.virtual = ENP2611_PM3386_0_VIRT_BASE,
|
.virtual = ENP2611_PM3386_0_VIRT_BASE,
|
||||||
.physical = ENP2611_PM3386_0_PHYS_BASE,
|
.pfn = __phys_to_pfn(ENP2611_PM3386_0_PHYS_BASE),
|
||||||
.length = ENP2611_PM3386_0_SIZE,
|
.length = ENP2611_PM3386_0_SIZE,
|
||||||
.type = MT_IXP2000_DEVICE
|
.type = MT_IXP2000_DEVICE,
|
||||||
}, {
|
}, {
|
||||||
.virtual = ENP2611_PM3386_1_VIRT_BASE,
|
.virtual = ENP2611_PM3386_1_VIRT_BASE,
|
||||||
.physical = ENP2611_PM3386_1_PHYS_BASE,
|
.pfn = __phys_to_pfn(ENP2611_PM3386_1_PHYS_BASE),
|
||||||
.length = ENP2611_PM3386_1_SIZE,
|
.length = ENP2611_PM3386_1_SIZE,
|
||||||
.type = MT_IXP2000_DEVICE
|
.type = MT_IXP2000_DEVICE,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -91,8 +91,8 @@ EXPORT_SYMBOL(ixp2000_uengine_csr_write);
|
||||||
|
|
||||||
void ixp2000_uengine_reset(u32 uengine_mask)
|
void ixp2000_uengine_reset(u32 uengine_mask)
|
||||||
{
|
{
|
||||||
ixp2000_reg_write(IXP2000_RESET1, uengine_mask & ixp2000_uengine_mask);
|
ixp2000_reg_wrb(IXP2000_RESET1, uengine_mask & ixp2000_uengine_mask);
|
||||||
ixp2000_reg_write(IXP2000_RESET1, 0);
|
ixp2000_reg_wrb(IXP2000_RESET1, 0);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ixp2000_uengine_reset);
|
EXPORT_SYMBOL(ixp2000_uengine_reset);
|
||||||
|
|
||||||
|
@ -452,21 +452,20 @@ static int __init ixp2000_uengine_init(void)
|
||||||
/*
|
/*
|
||||||
* Reset microengines.
|
* Reset microengines.
|
||||||
*/
|
*/
|
||||||
ixp2000_reg_write(IXP2000_RESET1, ixp2000_uengine_mask);
|
ixp2000_uengine_reset(ixp2000_uengine_mask);
|
||||||
ixp2000_reg_write(IXP2000_RESET1, 0);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Synchronise timestamp counters across all microengines.
|
* Synchronise timestamp counters across all microengines.
|
||||||
*/
|
*/
|
||||||
value = ixp2000_reg_read(IXP2000_MISC_CONTROL);
|
value = ixp2000_reg_read(IXP2000_MISC_CONTROL);
|
||||||
ixp2000_reg_write(IXP2000_MISC_CONTROL, value & ~0x80);
|
ixp2000_reg_wrb(IXP2000_MISC_CONTROL, value & ~0x80);
|
||||||
for (uengine = 0; uengine < 32; uengine++) {
|
for (uengine = 0; uengine < 32; uengine++) {
|
||||||
if (ixp2000_uengine_mask & (1 << uengine)) {
|
if (ixp2000_uengine_mask & (1 << uengine)) {
|
||||||
ixp2000_uengine_csr_write(uengine, TIMESTAMP_LOW, 0);
|
ixp2000_uengine_csr_write(uengine, TIMESTAMP_LOW, 0);
|
||||||
ixp2000_uengine_csr_write(uengine, TIMESTAMP_HIGH, 0);
|
ixp2000_uengine_csr_write(uengine, TIMESTAMP_HIGH, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ixp2000_reg_write(IXP2000_MISC_CONTROL, value | 0x80);
|
ixp2000_reg_wrb(IXP2000_MISC_CONTROL, value | 0x80);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -427,7 +427,7 @@ void __init ixp4xx_pci_preinit(void)
|
||||||
#ifdef __ARMEB__
|
#ifdef __ARMEB__
|
||||||
*PCI_CSR = PCI_CSR_IC | PCI_CSR_ABE | PCI_CSR_PDS | PCI_CSR_ADS;
|
*PCI_CSR = PCI_CSR_IC | PCI_CSR_ABE | PCI_CSR_PDS | PCI_CSR_ADS;
|
||||||
#else
|
#else
|
||||||
*PCI_CSR = PCI_CSR_IC;
|
*PCI_CSR = PCI_CSR_IC | PCI_CSR_ABE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pr_debug("DONE\n");
|
pr_debug("DONE\n");
|
||||||
|
|
|
@ -27,7 +27,8 @@ config PXA_SHARPSL
|
||||||
Say Y here if you intend to run this kernel on a
|
Say Y here if you intend to run this kernel on a
|
||||||
Sharp Zaurus SL-5600 (Poodle), SL-C700 (Corgi),
|
Sharp Zaurus SL-5600 (Poodle), SL-C700 (Corgi),
|
||||||
SL-C750 (Shepherd), SL-C760 (Husky), SL-C1000 (Akita),
|
SL-C750 (Shepherd), SL-C760 (Husky), SL-C1000 (Akita),
|
||||||
SL-C3000 (Spitz) or SL-C3100 (Borzoi) handheld computer.
|
SL-C3000 (Spitz), SL-C3100 (Borzoi) or SL-C6000x (Tosa)
|
||||||
|
handheld computer.
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
@ -37,7 +38,7 @@ choice
|
||||||
prompt "Select target Sharp Zaurus device range"
|
prompt "Select target Sharp Zaurus device range"
|
||||||
|
|
||||||
config PXA_SHARPSL_25x
|
config PXA_SHARPSL_25x
|
||||||
bool "Sharp PXA25x models (SL-5600 and SL-C7xx)"
|
bool "Sharp PXA25x models (SL-5600, SL-C7xx and SL-C6000x)"
|
||||||
select PXA25x
|
select PXA25x
|
||||||
|
|
||||||
config PXA_SHARPSL_27x
|
config PXA_SHARPSL_27x
|
||||||
|
@ -80,6 +81,10 @@ config MACH_BORZOI
|
||||||
depends PXA_SHARPSL_27x
|
depends PXA_SHARPSL_27x
|
||||||
select PXA_SHARP_Cxx00
|
select PXA_SHARP_Cxx00
|
||||||
|
|
||||||
|
config MACH_TOSA
|
||||||
|
bool "Enable Sharp SL-6000x (Tosa) Support"
|
||||||
|
depends PXA_SHARPSL
|
||||||
|
|
||||||
config PXA25x
|
config PXA25x
|
||||||
bool
|
bool
|
||||||
help
|
help
|
||||||
|
|
|
@ -14,6 +14,7 @@ obj-$(CONFIG_ARCH_PXA_IDP) += idp.o
|
||||||
obj-$(CONFIG_PXA_SHARP_C7xx) += corgi.o corgi_ssp.o corgi_lcd.o ssp.o
|
obj-$(CONFIG_PXA_SHARP_C7xx) += corgi.o corgi_ssp.o corgi_lcd.o ssp.o
|
||||||
obj-$(CONFIG_PXA_SHARP_Cxx00) += spitz.o corgi_ssp.o corgi_lcd.o ssp.o
|
obj-$(CONFIG_PXA_SHARP_Cxx00) += spitz.o corgi_ssp.o corgi_lcd.o ssp.o
|
||||||
obj-$(CONFIG_MACH_POODLE) += poodle.o
|
obj-$(CONFIG_MACH_POODLE) += poodle.o
|
||||||
|
obj-$(CONFIG_MACH_TOSA) += tosa.o
|
||||||
|
|
||||||
# Support for blinky lights
|
# Support for blinky lights
|
||||||
led-y := leds.o
|
led-y := leds.o
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <linux/string.h>
|
||||||
#include <asm/arch/akita.h>
|
#include <asm/arch/akita.h>
|
||||||
#include <asm/arch/corgi.h>
|
#include <asm/arch/corgi.h>
|
||||||
#include <asm/arch/hardware.h>
|
#include <asm/arch/hardware.h>
|
||||||
|
|
|
@ -19,16 +19,20 @@
|
||||||
#include <linux/major.h>
|
#include <linux/major.h>
|
||||||
#include <linux/fb.h>
|
#include <linux/fb.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
|
#include <linux/mtd/mtd.h>
|
||||||
|
#include <linux/mtd/partitions.h>
|
||||||
|
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/memory.h>
|
#include <asm/memory.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/hardware.h>
|
#include <asm/hardware.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
|
#include <asm/sizes.h>
|
||||||
|
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
|
#include <asm/mach/flash.h>
|
||||||
|
|
||||||
#include <asm/hardware/sa1111.h>
|
#include <asm/hardware/sa1111.h>
|
||||||
|
|
||||||
|
@ -199,10 +203,75 @@ static struct platform_device smc91x_device = {
|
||||||
.resource = smc91x_resources,
|
.resource = smc91x_resources,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct resource flash_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = 0x00000000,
|
||||||
|
.end = SZ_64M - 1,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = 0x04000000,
|
||||||
|
.end = 0x04000000 + SZ_64M - 1,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct mtd_partition lubbock_partitions[] = {
|
||||||
|
{
|
||||||
|
.name = "Bootloader",
|
||||||
|
.size = 0x00040000,
|
||||||
|
.offset = 0,
|
||||||
|
.mask_flags = MTD_WRITEABLE /* force read-only */
|
||||||
|
},{
|
||||||
|
.name = "Kernel",
|
||||||
|
.size = 0x00100000,
|
||||||
|
.offset = 0x00040000,
|
||||||
|
},{
|
||||||
|
.name = "Filesystem",
|
||||||
|
.size = MTDPART_SIZ_FULL,
|
||||||
|
.offset = 0x00140000
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct flash_platform_data lubbock_flash_data[2] = {
|
||||||
|
{
|
||||||
|
.map_name = "cfi_probe",
|
||||||
|
.parts = lubbock_partitions,
|
||||||
|
.nr_parts = ARRAY_SIZE(lubbock_partitions),
|
||||||
|
}, {
|
||||||
|
.map_name = "cfi_probe",
|
||||||
|
.parts = NULL,
|
||||||
|
.nr_parts = 0,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device lubbock_flash_device[2] = {
|
||||||
|
{
|
||||||
|
.name = "pxa2xx-flash",
|
||||||
|
.id = 0,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &lubbock_flash_data[0],
|
||||||
|
},
|
||||||
|
.resource = &flash_resources[0],
|
||||||
|
.num_resources = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "pxa2xx-flash",
|
||||||
|
.id = 1,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &lubbock_flash_data[1],
|
||||||
|
},
|
||||||
|
.resource = &flash_resources[1],
|
||||||
|
.num_resources = 1,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct platform_device *devices[] __initdata = {
|
static struct platform_device *devices[] __initdata = {
|
||||||
&sa1111_device,
|
&sa1111_device,
|
||||||
&lub_audio_device,
|
&lub_audio_device,
|
||||||
&smc91x_device,
|
&smc91x_device,
|
||||||
|
&lubbock_flash_device[0],
|
||||||
|
&lubbock_flash_device[1],
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct pxafb_mach_info sharp_lm8v31 __initdata = {
|
static struct pxafb_mach_info sharp_lm8v31 __initdata = {
|
||||||
|
@ -315,10 +384,21 @@ static struct pxaficp_platform_data lubbock_ficp_platform_data = {
|
||||||
|
|
||||||
static void __init lubbock_init(void)
|
static void __init lubbock_init(void)
|
||||||
{
|
{
|
||||||
|
int flashboot = (LUB_CONF_SWITCHES & 1);
|
||||||
|
|
||||||
pxa_set_udc_info(&udc_info);
|
pxa_set_udc_info(&udc_info);
|
||||||
set_pxa_fb_info(&sharp_lm8v31);
|
set_pxa_fb_info(&sharp_lm8v31);
|
||||||
pxa_set_mci_info(&lubbock_mci_platform_data);
|
pxa_set_mci_info(&lubbock_mci_platform_data);
|
||||||
pxa_set_ficp_info(&lubbock_ficp_platform_data);
|
pxa_set_ficp_info(&lubbock_ficp_platform_data);
|
||||||
|
|
||||||
|
lubbock_flash_data[0].width = lubbock_flash_data[1].width =
|
||||||
|
(BOOT_DEF & 1) ? 2 : 4;
|
||||||
|
/* Compensate for the nROMBT switch which swaps the flash banks */
|
||||||
|
printk(KERN_NOTICE "Lubbock configured to boot from %s (bank %d)\n",
|
||||||
|
flashboot?"Flash":"ROM", flashboot);
|
||||||
|
|
||||||
|
lubbock_flash_data[flashboot^1].name = "application-flash";
|
||||||
|
lubbock_flash_data[flashboot].name = "boot-rom";
|
||||||
(void) platform_add_devices(devices, ARRAY_SIZE(devices));
|
(void) platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,9 @@
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
#include <linux/fb.h>
|
#include <linux/fb.h>
|
||||||
|
#include <linux/ioport.h>
|
||||||
|
#include <linux/mtd/mtd.h>
|
||||||
|
#include <linux/mtd/partitions.h>
|
||||||
|
|
||||||
#include <asm/types.h>
|
#include <asm/types.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
|
@ -27,10 +30,12 @@
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/hardware.h>
|
#include <asm/hardware.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
|
#include <asm/sizes.h>
|
||||||
|
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
#include <asm/mach/irq.h>
|
#include <asm/mach/irq.h>
|
||||||
|
#include <asm/mach/flash.h>
|
||||||
|
|
||||||
#include <asm/arch/pxa-regs.h>
|
#include <asm/arch/pxa-regs.h>
|
||||||
#include <asm/arch/mainstone.h>
|
#include <asm/arch/mainstone.h>
|
||||||
|
@ -190,6 +195,69 @@ static struct platform_device mst_audio_device = {
|
||||||
.dev = { .platform_data = &mst_audio_ops },
|
.dev = { .platform_data = &mst_audio_ops },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct resource flash_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = PXA_CS0_PHYS,
|
||||||
|
.end = PXA_CS0_PHYS + SZ_64M - 1,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = PXA_CS1_PHYS,
|
||||||
|
.end = PXA_CS1_PHYS + SZ_64M - 1,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct mtd_partition mainstoneflash0_partitions[] = {
|
||||||
|
{
|
||||||
|
.name = "Bootloader",
|
||||||
|
.size = 0x00040000,
|
||||||
|
.offset = 0,
|
||||||
|
.mask_flags = MTD_WRITEABLE /* force read-only */
|
||||||
|
},{
|
||||||
|
.name = "Kernel",
|
||||||
|
.size = 0x00400000,
|
||||||
|
.offset = 0x00040000,
|
||||||
|
},{
|
||||||
|
.name = "Filesystem",
|
||||||
|
.size = MTDPART_SIZ_FULL,
|
||||||
|
.offset = 0x00440000
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct flash_platform_data mst_flash_data[2] = {
|
||||||
|
{
|
||||||
|
.map_name = "cfi_probe",
|
||||||
|
.parts = mainstoneflash0_partitions,
|
||||||
|
.nr_parts = ARRAY_SIZE(mainstoneflash0_partitions),
|
||||||
|
}, {
|
||||||
|
.map_name = "cfi_probe",
|
||||||
|
.parts = NULL,
|
||||||
|
.nr_parts = 0,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device mst_flash_device[2] = {
|
||||||
|
{
|
||||||
|
.name = "pxa2xx-flash",
|
||||||
|
.id = 0,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &mst_flash_data[0],
|
||||||
|
},
|
||||||
|
.resource = &flash_resources[0],
|
||||||
|
.num_resources = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "pxa2xx-flash",
|
||||||
|
.id = 1,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &mst_flash_data[1],
|
||||||
|
},
|
||||||
|
.resource = &flash_resources[1],
|
||||||
|
.num_resources = 1,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static void mainstone_backlight_power(int on)
|
static void mainstone_backlight_power(int on)
|
||||||
{
|
{
|
||||||
if (on) {
|
if (on) {
|
||||||
|
@ -318,16 +386,34 @@ static struct pxaficp_platform_data mainstone_ficp_platform_data = {
|
||||||
.transceiver_mode = mainstone_irda_transceiver_mode,
|
.transceiver_mode = mainstone_irda_transceiver_mode,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct platform_device *platform_devices[] __initdata = {
|
||||||
|
&smc91x_device,
|
||||||
|
&mst_audio_device,
|
||||||
|
&mst_flash_device[0],
|
||||||
|
&mst_flash_device[1],
|
||||||
|
};
|
||||||
|
|
||||||
static void __init mainstone_init(void)
|
static void __init mainstone_init(void)
|
||||||
{
|
{
|
||||||
|
int SW7 = 0; /* FIXME: get from SCR (Mst doc section 3.2.1.1) */
|
||||||
|
|
||||||
|
mst_flash_data[0].width = (BOOT_DEF & 1) ? 2 : 4;
|
||||||
|
mst_flash_data[1].width = 4;
|
||||||
|
|
||||||
|
/* Compensate for SW7 which swaps the flash banks */
|
||||||
|
mst_flash_data[SW7].name = "processor-flash";
|
||||||
|
mst_flash_data[SW7 ^ 1].name = "mainboard-flash";
|
||||||
|
|
||||||
|
printk(KERN_NOTICE "Mainstone configured to boot from %s\n",
|
||||||
|
mst_flash_data[0].name);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* On Mainstone, we route AC97_SYSCLK via GPIO45 to
|
* On Mainstone, we route AC97_SYSCLK via GPIO45 to
|
||||||
* the audio daughter card
|
* the audio daughter card
|
||||||
*/
|
*/
|
||||||
pxa_gpio_mode(GPIO45_SYSCLK_AC97_MD);
|
pxa_gpio_mode(GPIO45_SYSCLK_AC97_MD);
|
||||||
|
|
||||||
platform_device_register(&smc91x_device);
|
platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
|
||||||
platform_device_register(&mst_audio_device);
|
|
||||||
|
|
||||||
/* reading Mainstone's "Virtual Configuration Register"
|
/* reading Mainstone's "Virtual Configuration Register"
|
||||||
might be handy to select LCD type here */
|
might be handy to select LCD type here */
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
*/
|
*/
|
||||||
#include <linux/config.h>
|
#include <linux/config.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
#include <linux/module.h>
|
||||||
#include <linux/suspend.h>
|
#include <linux/suspend.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
|
@ -19,6 +20,7 @@
|
||||||
#include <asm/hardware.h>
|
#include <asm/hardware.h>
|
||||||
#include <asm/memory.h>
|
#include <asm/memory.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
#include <asm/arch/pm.h>
|
||||||
#include <asm/arch/pxa-regs.h>
|
#include <asm/arch/pxa-regs.h>
|
||||||
#include <asm/arch/lubbock.h>
|
#include <asm/arch/lubbock.h>
|
||||||
#include <asm/mach/time.h>
|
#include <asm/mach/time.h>
|
||||||
|
@ -72,7 +74,7 @@ enum { SLEEP_SAVE_START = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static int pxa_pm_enter(suspend_state_t state)
|
int pxa_pm_enter(suspend_state_t state)
|
||||||
{
|
{
|
||||||
unsigned long sleep_save[SLEEP_SAVE_SIZE];
|
unsigned long sleep_save[SLEEP_SAVE_SIZE];
|
||||||
unsigned long checksum = 0;
|
unsigned long checksum = 0;
|
||||||
|
@ -191,6 +193,8 @@ static int pxa_pm_enter(suspend_state_t state)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL_GPL(pxa_pm_enter);
|
||||||
|
|
||||||
unsigned long sleep_phys_sp(void *sp)
|
unsigned long sleep_phys_sp(void *sp)
|
||||||
{
|
{
|
||||||
return virt_to_phys(sp);
|
return virt_to_phys(sp);
|
||||||
|
@ -199,21 +203,25 @@ unsigned long sleep_phys_sp(void *sp)
|
||||||
/*
|
/*
|
||||||
* Called after processes are frozen, but before we shut down devices.
|
* Called after processes are frozen, but before we shut down devices.
|
||||||
*/
|
*/
|
||||||
static int pxa_pm_prepare(suspend_state_t state)
|
int pxa_pm_prepare(suspend_state_t state)
|
||||||
{
|
{
|
||||||
extern int pxa_cpu_pm_prepare(suspend_state_t state);
|
extern int pxa_cpu_pm_prepare(suspend_state_t state);
|
||||||
|
|
||||||
return pxa_cpu_pm_prepare(state);
|
return pxa_cpu_pm_prepare(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL_GPL(pxa_pm_prepare);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Called after devices are re-setup, but before processes are thawed.
|
* Called after devices are re-setup, but before processes are thawed.
|
||||||
*/
|
*/
|
||||||
static int pxa_pm_finish(suspend_state_t state)
|
int pxa_pm_finish(suspend_state_t state)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL_GPL(pxa_pm_finish);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set to PM_DISK_FIRMWARE so we can quickly veto suspend-to-disk.
|
* Set to PM_DISK_FIRMWARE so we can quickly veto suspend-to-disk.
|
||||||
*/
|
*/
|
||||||
|
@ -230,4 +238,4 @@ static int __init pxa_pm_init(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
late_initcall(pxa_pm_init);
|
device_initcall(pxa_pm_init);
|
||||||
|
|
162
arch/arm/mach-pxa/tosa.c
Normal file
162
arch/arm/mach-pxa/tosa.c
Normal file
|
@ -0,0 +1,162 @@
|
||||||
|
/*
|
||||||
|
* Support for Sharp SL-C6000x PDAs
|
||||||
|
* Model: (Tosa)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2005 Dirk Opfer
|
||||||
|
*
|
||||||
|
* Based on code written by Sharp/Lineo for 2.4 kernels
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/device.h>
|
||||||
|
#include <linux/major.h>
|
||||||
|
#include <linux/fs.h>
|
||||||
|
#include <linux/interrupt.h>
|
||||||
|
#include <linux/mmc/host.h>
|
||||||
|
|
||||||
|
#include <asm/setup.h>
|
||||||
|
#include <asm/memory.h>
|
||||||
|
#include <asm/mach-types.h>
|
||||||
|
#include <asm/hardware.h>
|
||||||
|
#include <asm/irq.h>
|
||||||
|
#include <asm/arch/irda.h>
|
||||||
|
#include <asm/arch/mmc.h>
|
||||||
|
#include <asm/arch/udc.h>
|
||||||
|
|
||||||
|
#include <asm/mach/arch.h>
|
||||||
|
#include <asm/mach/map.h>
|
||||||
|
#include <asm/mach/irq.h>
|
||||||
|
|
||||||
|
#include <asm/arch/pxa-regs.h>
|
||||||
|
#include <asm/arch/irq.h>
|
||||||
|
#include <asm/arch/tosa.h>
|
||||||
|
|
||||||
|
#include <asm/hardware/scoop.h>
|
||||||
|
#include <asm/mach/sharpsl_param.h>
|
||||||
|
|
||||||
|
#include "generic.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SCOOP Device
|
||||||
|
*/
|
||||||
|
static struct resource tosa_scoop_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = TOSA_CF_PHYS,
|
||||||
|
.end = TOSA_CF_PHYS + 0xfff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct scoop_config tosa_scoop_setup = {
|
||||||
|
.io_dir = TOSA_SCOOP_IO_DIR,
|
||||||
|
.io_out = TOSA_SCOOP_IO_OUT,
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
struct platform_device tosascoop_device = {
|
||||||
|
.name = "sharp-scoop",
|
||||||
|
.id = 0,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &tosa_scoop_setup,
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(tosa_scoop_resources),
|
||||||
|
.resource = tosa_scoop_resources,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SCOOP Device Jacket
|
||||||
|
*/
|
||||||
|
static struct resource tosa_scoop_jc_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = TOSA_SCOOP_PHYS + 0x40,
|
||||||
|
.end = TOSA_SCOOP_PHYS + 0xfff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct scoop_config tosa_scoop_jc_setup = {
|
||||||
|
.io_dir = TOSA_SCOOP_JC_IO_DIR,
|
||||||
|
.io_out = TOSA_SCOOP_JC_IO_OUT,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct platform_device tosascoop_jc_device = {
|
||||||
|
.name = "sharp-scoop",
|
||||||
|
.id = 1,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &tosa_scoop_jc_setup,
|
||||||
|
.parent = &tosascoop_device.dev,
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(tosa_scoop_jc_resources),
|
||||||
|
.resource = tosa_scoop_jc_resources,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct scoop_pcmcia_dev tosa_pcmcia_scoop[] = {
|
||||||
|
{
|
||||||
|
.dev = &tosascoop_device.dev,
|
||||||
|
.irq = TOSA_IRQ_GPIO_CF_IRQ,
|
||||||
|
.cd_irq = TOSA_IRQ_GPIO_CF_CD,
|
||||||
|
.cd_irq_str = "PCMCIA0 CD",
|
||||||
|
},{
|
||||||
|
.dev = &tosascoop_jc_device.dev,
|
||||||
|
.irq = TOSA_IRQ_GPIO_JC_CF_IRQ,
|
||||||
|
.cd_irq = -1,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static struct platform_device *devices[] __initdata = {
|
||||||
|
&tosascoop_device,
|
||||||
|
&tosascoop_jc_device,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void __init tosa_init(void)
|
||||||
|
{
|
||||||
|
pxa_gpio_mode(TOSA_GPIO_ON_RESET | GPIO_IN);
|
||||||
|
pxa_gpio_mode(TOSA_GPIO_TC6393_INT | GPIO_IN);
|
||||||
|
|
||||||
|
/* setup sleep mode values */
|
||||||
|
PWER = 0x00000002;
|
||||||
|
PFER = 0x00000000;
|
||||||
|
PRER = 0x00000002;
|
||||||
|
PGSR0 = 0x00000000;
|
||||||
|
PGSR1 = 0x00FF0002;
|
||||||
|
PGSR2 = 0x00014000;
|
||||||
|
PCFR |= PCFR_OPDE;
|
||||||
|
|
||||||
|
// enable batt_fault
|
||||||
|
PMCR = 0x01;
|
||||||
|
|
||||||
|
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||||
|
|
||||||
|
scoop_num = 2;
|
||||||
|
scoop_devs = &tosa_pcmcia_scoop[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __init fixup_tosa(struct machine_desc *desc,
|
||||||
|
struct tag *tags, char **cmdline, struct meminfo *mi)
|
||||||
|
{
|
||||||
|
sharpsl_save_param();
|
||||||
|
mi->nr_banks=1;
|
||||||
|
mi->bank[0].start = 0xa0000000;
|
||||||
|
mi->bank[0].node = 0;
|
||||||
|
mi->bank[0].size = (64*1024*1024);
|
||||||
|
}
|
||||||
|
|
||||||
|
MACHINE_START(TOSA, "SHARP Tosa")
|
||||||
|
.phys_ram = 0xa0000000,
|
||||||
|
.phys_io = 0x40000000,
|
||||||
|
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||||
|
.fixup = fixup_tosa,
|
||||||
|
.map_io = pxa_map_io,
|
||||||
|
.init_irq = pxa_init_irq,
|
||||||
|
.init_machine = tosa_init,
|
||||||
|
.timer = &pxa_timer,
|
||||||
|
MACHINE_END
|
|
@ -250,6 +250,18 @@ config CPU_V6
|
||||||
select CPU_COPY_V6
|
select CPU_COPY_V6
|
||||||
select CPU_TLB_V6
|
select CPU_TLB_V6
|
||||||
|
|
||||||
|
# ARMv6k
|
||||||
|
config CPU_32v6K
|
||||||
|
bool "Support ARM V6K processor extensions" if !SMP
|
||||||
|
depends on CPU_V6
|
||||||
|
default y if SMP
|
||||||
|
help
|
||||||
|
Say Y here if your ARMv6 processor supports the 'K' extension.
|
||||||
|
This enables the kernel to use some instructions not present
|
||||||
|
on previous processors, and as such a kernel build with this
|
||||||
|
enabled will not boot on processors with do not support these
|
||||||
|
instructions.
|
||||||
|
|
||||||
# Figure out what processor architecture version we should be using.
|
# Figure out what processor architecture version we should be using.
|
||||||
# This defines the compiler instruction set which depends on the machine type.
|
# This defines the compiler instruction set which depends on the machine type.
|
||||||
config CPU_32v3
|
config CPU_32v3
|
||||||
|
|
|
@ -469,14 +469,14 @@ void __init create_mapping(struct map_desc *md)
|
||||||
|
|
||||||
if (md->virtual != vectors_base() && md->virtual < TASK_SIZE) {
|
if (md->virtual != vectors_base() && md->virtual < TASK_SIZE) {
|
||||||
printk(KERN_WARNING "BUG: not creating mapping for "
|
printk(KERN_WARNING "BUG: not creating mapping for "
|
||||||
"0x%016llx at 0x%08lx in user region\n",
|
"0x%08llx at 0x%08lx in user region\n",
|
||||||
__pfn_to_phys((u64)md->pfn), md->virtual);
|
__pfn_to_phys((u64)md->pfn), md->virtual);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((md->type == MT_DEVICE || md->type == MT_ROM) &&
|
if ((md->type == MT_DEVICE || md->type == MT_ROM) &&
|
||||||
md->virtual >= PAGE_OFFSET && md->virtual < VMALLOC_END) {
|
md->virtual >= PAGE_OFFSET && md->virtual < VMALLOC_END) {
|
||||||
printk(KERN_WARNING "BUG: mapping for 0x%016llx at 0x%08lx "
|
printk(KERN_WARNING "BUG: mapping for 0x%08llx at 0x%08lx "
|
||||||
"overlaps vmalloc space\n",
|
"overlaps vmalloc space\n",
|
||||||
__pfn_to_phys((u64)md->pfn), md->virtual);
|
__pfn_to_phys((u64)md->pfn), md->virtual);
|
||||||
}
|
}
|
||||||
|
@ -492,14 +492,14 @@ void __init create_mapping(struct map_desc *md)
|
||||||
if(md->pfn >= 0x100000) {
|
if(md->pfn >= 0x100000) {
|
||||||
if(domain) {
|
if(domain) {
|
||||||
printk(KERN_ERR "MM: invalid domain in supersection "
|
printk(KERN_ERR "MM: invalid domain in supersection "
|
||||||
"mapping for 0x%016llx at 0x%08lx\n",
|
"mapping for 0x%08llx at 0x%08lx\n",
|
||||||
__pfn_to_phys((u64)md->pfn), md->virtual);
|
__pfn_to_phys((u64)md->pfn), md->virtual);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if((md->virtual | md->length | __pfn_to_phys(md->pfn))
|
if((md->virtual | md->length | __pfn_to_phys(md->pfn))
|
||||||
& ~SUPERSECTION_MASK) {
|
& ~SUPERSECTION_MASK) {
|
||||||
printk(KERN_ERR "MM: cannot create mapping for "
|
printk(KERN_ERR "MM: cannot create mapping for "
|
||||||
"0x%016llx at 0x%08lx invalid alignment\n",
|
"0x%08llx at 0x%08lx invalid alignment\n",
|
||||||
__pfn_to_phys((u64)md->pfn), md->virtual);
|
__pfn_to_phys((u64)md->pfn), md->virtual);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -546,7 +546,7 @@ static int ptrace_setfpregs(struct task_struct *tsk, void *ufp)
|
||||||
sizeof(struct user_fp)) ? -EFAULT : 0;
|
sizeof(struct user_fp)) ? -EFAULT : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int do_ptrace(int request, struct task_struct *child, long addr, long data)
|
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||||
{
|
{
|
||||||
unsigned long tmp;
|
unsigned long tmp;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -665,53 +665,6 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage long sys_ptrace(long request, long pid, long addr, long data)
|
|
||||||
{
|
|
||||||
struct task_struct *child;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
lock_kernel();
|
|
||||||
ret = -EPERM;
|
|
||||||
if (request == PTRACE_TRACEME) {
|
|
||||||
/* are we already being traced? */
|
|
||||||
if (current->ptrace & PT_PTRACED)
|
|
||||||
goto out;
|
|
||||||
ret = security_ptrace(current->parent, current);
|
|
||||||
if (ret)
|
|
||||||
goto out;
|
|
||||||
/* set the ptrace bit in the process flags. */
|
|
||||||
current->ptrace |= PT_PTRACED;
|
|
||||||
ret = 0;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
ret = -ESRCH;
|
|
||||||
read_lock(&tasklist_lock);
|
|
||||||
child = find_task_by_pid(pid);
|
|
||||||
if (child)
|
|
||||||
get_task_struct(child);
|
|
||||||
read_unlock(&tasklist_lock);
|
|
||||||
if (!child)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
ret = -EPERM;
|
|
||||||
if (pid == 1) /* you may not mess with init */
|
|
||||||
goto out_tsk;
|
|
||||||
|
|
||||||
if (request == PTRACE_ATTACH) {
|
|
||||||
ret = ptrace_attach(child);
|
|
||||||
goto out_tsk;
|
|
||||||
}
|
|
||||||
ret = ptrace_check_attach(child, request == PTRACE_KILL);
|
|
||||||
if (ret == 0)
|
|
||||||
ret = do_ptrace(request, child, addr, data);
|
|
||||||
|
|
||||||
out_tsk:
|
|
||||||
put_task_struct(child);
|
|
||||||
out:
|
|
||||||
unlock_kernel();
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
asmlinkage void syscall_trace(int why, struct pt_regs *regs)
|
asmlinkage void syscall_trace(int why, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
unsigned long ip;
|
unsigned long ip;
|
||||||
|
|
|
@ -177,7 +177,7 @@ The example address is 0xd004000c; in binary this is:
|
||||||
Given the top-level Page Directory, the offset in that directory is calculated
|
Given the top-level Page Directory, the offset in that directory is calculated
|
||||||
using the upper 8 bits:
|
using the upper 8 bits:
|
||||||
|
|
||||||
extern inline pgd_t * pgd_offset(struct mm_struct * mm, unsigned long address)
|
static inline pgd_t * pgd_offset(struct mm_struct * mm, unsigned long address)
|
||||||
{
|
{
|
||||||
return mm->pgd + (address >> PGDIR_SHIFT);
|
return mm->pgd + (address >> PGDIR_SHIFT);
|
||||||
}
|
}
|
||||||
|
@ -190,14 +190,14 @@ The pgd_t from our example will therefore be the 208'th (0xd0) entry in mm->pgd.
|
||||||
|
|
||||||
Since the Middle Directory does not exist, it is a unity mapping:
|
Since the Middle Directory does not exist, it is a unity mapping:
|
||||||
|
|
||||||
extern inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address)
|
static inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address)
|
||||||
{
|
{
|
||||||
return (pmd_t *) dir;
|
return (pmd_t *) dir;
|
||||||
}
|
}
|
||||||
|
|
||||||
The Page Table provides the final lookup by using bits 13 to 23 as index:
|
The Page Table provides the final lookup by using bits 13 to 23 as index:
|
||||||
|
|
||||||
extern inline pte_t * pte_offset(pmd_t * dir, unsigned long address)
|
static inline pte_t * pte_offset(pmd_t * dir, unsigned long address)
|
||||||
{
|
{
|
||||||
return (pte_t *) pmd_page(*dir) + ((address >> PAGE_SHIFT) &
|
return (pte_t *) pmd_page(*dir) + ((address >> PAGE_SHIFT) &
|
||||||
(PTRS_PER_PTE - 1));
|
(PTRS_PER_PTE - 1));
|
||||||
|
|
|
@ -76,55 +76,11 @@ ptrace_disable(struct task_struct *child)
|
||||||
* (in user space) where the result of the ptrace call is written (instead of
|
* (in user space) where the result of the ptrace call is written (instead of
|
||||||
* being returned).
|
* being returned).
|
||||||
*/
|
*/
|
||||||
asmlinkage int
|
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||||
sys_ptrace(long request, long pid, long addr, long data)
|
|
||||||
{
|
{
|
||||||
struct task_struct *child;
|
|
||||||
int ret;
|
int ret;
|
||||||
unsigned long __user *datap = (unsigned long __user *)data;
|
unsigned long __user *datap = (unsigned long __user *)data;
|
||||||
|
|
||||||
lock_kernel();
|
|
||||||
ret = -EPERM;
|
|
||||||
|
|
||||||
if (request == PTRACE_TRACEME) {
|
|
||||||
/* are we already being traced? */
|
|
||||||
if (current->ptrace & PT_PTRACED)
|
|
||||||
goto out;
|
|
||||||
ret = security_ptrace(current->parent, current);
|
|
||||||
if (ret)
|
|
||||||
goto out;
|
|
||||||
/* set the ptrace bit in the process flags. */
|
|
||||||
current->ptrace |= PT_PTRACED;
|
|
||||||
ret = 0;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = -ESRCH;
|
|
||||||
read_lock(&tasklist_lock);
|
|
||||||
child = find_task_by_pid(pid);
|
|
||||||
|
|
||||||
if (child)
|
|
||||||
get_task_struct(child);
|
|
||||||
|
|
||||||
read_unlock(&tasklist_lock);
|
|
||||||
|
|
||||||
if (!child)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
ret = -EPERM;
|
|
||||||
|
|
||||||
if (pid == 1) /* Leave the init process alone! */
|
|
||||||
goto out_tsk;
|
|
||||||
|
|
||||||
if (request == PTRACE_ATTACH) {
|
|
||||||
ret = ptrace_attach(child);
|
|
||||||
goto out_tsk;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = ptrace_check_attach(child, request == PTRACE_KILL);
|
|
||||||
if (ret < 0)
|
|
||||||
goto out_tsk;
|
|
||||||
|
|
||||||
switch (request) {
|
switch (request) {
|
||||||
/* Read word at location address. */
|
/* Read word at location address. */
|
||||||
case PTRACE_PEEKTEXT:
|
case PTRACE_PEEKTEXT:
|
||||||
|
@ -289,10 +245,7 @@ sys_ptrace(long request, long pid, long addr, long data)
|
||||||
ret = ptrace_request(child, request, addr, data);
|
ret = ptrace_request(child, request, addr, data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
out_tsk:
|
|
||||||
put_task_struct(child);
|
|
||||||
out:
|
|
||||||
unlock_kernel();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -476,7 +476,7 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
||||||
* OK, we're invoking a handler
|
* OK, we're invoking a handler
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern inline void
|
static inline void
|
||||||
handle_signal(int canrestart, unsigned long sig,
|
handle_signal(int canrestart, unsigned long sig,
|
||||||
siginfo_t *info, struct k_sigaction *ka,
|
siginfo_t *info, struct k_sigaction *ka,
|
||||||
sigset_t *oldset, struct pt_regs * regs)
|
sigset_t *oldset, struct pt_regs * regs)
|
||||||
|
|
|
@ -277,7 +277,7 @@ struct file_operations cryptocop_fops = {
|
||||||
static void free_cdesc(struct cryptocop_dma_desc *cdesc)
|
static void free_cdesc(struct cryptocop_dma_desc *cdesc)
|
||||||
{
|
{
|
||||||
DEBUG(printk("free_cdesc: cdesc 0x%p, from_pool=%d\n", cdesc, cdesc->from_pool));
|
DEBUG(printk("free_cdesc: cdesc 0x%p, from_pool=%d\n", cdesc, cdesc->from_pool));
|
||||||
if (cdesc->free_buf) kfree(cdesc->free_buf);
|
kfree(cdesc->free_buf);
|
||||||
|
|
||||||
if (cdesc->from_pool) {
|
if (cdesc->from_pool) {
|
||||||
unsigned long int flags;
|
unsigned long int flags;
|
||||||
|
@ -2950,15 +2950,15 @@ static int cryptocop_ioctl_process(struct inode *inode, struct file *filp, unsig
|
||||||
put_page(outpages[i]);
|
put_page(outpages[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (digest_result) kfree(digest_result);
|
kfree(digest_result);
|
||||||
if (inpages) kfree(inpages);
|
kfree(inpages);
|
||||||
if (outpages) kfree(outpages);
|
kfree(outpages);
|
||||||
if (cop){
|
if (cop){
|
||||||
if (cop->tfrm_op.indata) kfree(cop->tfrm_op.indata);
|
kfree(cop->tfrm_op.indata);
|
||||||
if (cop->tfrm_op.outdata) kfree(cop->tfrm_op.outdata);
|
kfree(cop->tfrm_op.outdata);
|
||||||
kfree(cop);
|
kfree(cop);
|
||||||
}
|
}
|
||||||
if (jc) kfree(jc);
|
kfree(jc);
|
||||||
|
|
||||||
DEBUG(print_lock_status());
|
DEBUG(print_lock_status());
|
||||||
|
|
||||||
|
|
|
@ -99,55 +99,11 @@ ptrace_disable(struct task_struct *child)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
asmlinkage int
|
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||||
sys_ptrace(long request, long pid, long addr, long data)
|
|
||||||
{
|
{
|
||||||
struct task_struct *child;
|
|
||||||
int ret;
|
int ret;
|
||||||
unsigned long __user *datap = (unsigned long __user *)data;
|
unsigned long __user *datap = (unsigned long __user *)data;
|
||||||
|
|
||||||
lock_kernel();
|
|
||||||
ret = -EPERM;
|
|
||||||
|
|
||||||
if (request == PTRACE_TRACEME) {
|
|
||||||
/* are we already being traced? */
|
|
||||||
if (current->ptrace & PT_PTRACED)
|
|
||||||
goto out;
|
|
||||||
ret = security_ptrace(current->parent, current);
|
|
||||||
if (ret)
|
|
||||||
goto out;
|
|
||||||
/* set the ptrace bit in the process flags. */
|
|
||||||
current->ptrace |= PT_PTRACED;
|
|
||||||
ret = 0;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = -ESRCH;
|
|
||||||
read_lock(&tasklist_lock);
|
|
||||||
child = find_task_by_pid(pid);
|
|
||||||
|
|
||||||
if (child)
|
|
||||||
get_task_struct(child);
|
|
||||||
|
|
||||||
read_unlock(&tasklist_lock);
|
|
||||||
|
|
||||||
if (!child)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
ret = -EPERM;
|
|
||||||
|
|
||||||
if (pid == 1) /* Leave the init process alone! */
|
|
||||||
goto out_tsk;
|
|
||||||
|
|
||||||
if (request == PTRACE_ATTACH) {
|
|
||||||
ret = ptrace_attach(child);
|
|
||||||
goto out_tsk;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = ptrace_check_attach(child, request == PTRACE_KILL);
|
|
||||||
if (ret < 0)
|
|
||||||
goto out_tsk;
|
|
||||||
|
|
||||||
switch (request) {
|
switch (request) {
|
||||||
/* Read word at location address. */
|
/* Read word at location address. */
|
||||||
case PTRACE_PEEKTEXT:
|
case PTRACE_PEEKTEXT:
|
||||||
|
@ -347,10 +303,7 @@ sys_ptrace(long request, long pid, long addr, long data)
|
||||||
ret = ptrace_request(child, request, addr, data);
|
ret = ptrace_request(child, request, addr, data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
out_tsk:
|
|
||||||
put_task_struct(child);
|
|
||||||
out:
|
|
||||||
unlock_kernel();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -513,7 +513,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Invoke a singal handler to, well, handle the signal. */
|
/* Invoke a singal handler to, well, handle the signal. */
|
||||||
extern inline void
|
static inline void
|
||||||
handle_signal(int canrestart, unsigned long sig,
|
handle_signal(int canrestart, unsigned long sig,
|
||||||
siginfo_t *info, struct k_sigaction *ka,
|
siginfo_t *info, struct k_sigaction *ka,
|
||||||
sigset_t *oldset, struct pt_regs * regs)
|
sigset_t *oldset, struct pt_regs * regs)
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
#include <asm/arch/memmap.h>
|
#include <asm/arch/memmap.h>
|
||||||
|
|
||||||
extern inline void remap_area_pte(pte_t * pte, unsigned long address, unsigned long size,
|
static inline void remap_area_pte(pte_t * pte, unsigned long address, unsigned long size,
|
||||||
unsigned long phys_addr, pgprot_t prot)
|
unsigned long phys_addr, pgprot_t prot)
|
||||||
{
|
{
|
||||||
unsigned long end;
|
unsigned long end;
|
||||||
|
|
|
@ -106,48 +106,11 @@ void ptrace_enable(struct task_struct *child)
|
||||||
child->thread.frame0->__status |= REG__STATUS_STEP;
|
child->thread.frame0->__status |= REG__STATUS_STEP;
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage long sys_ptrace(long request, long pid, long addr, long data)
|
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||||
{
|
{
|
||||||
struct task_struct *child;
|
|
||||||
unsigned long tmp;
|
unsigned long tmp;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
lock_kernel();
|
|
||||||
ret = -EPERM;
|
|
||||||
if (request == PTRACE_TRACEME) {
|
|
||||||
/* are we already being traced? */
|
|
||||||
if (current->ptrace & PT_PTRACED)
|
|
||||||
goto out;
|
|
||||||
ret = security_ptrace(current->parent, current);
|
|
||||||
if (ret)
|
|
||||||
goto out;
|
|
||||||
/* set the ptrace bit in the process flags. */
|
|
||||||
current->ptrace |= PT_PTRACED;
|
|
||||||
ret = 0;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
ret = -ESRCH;
|
|
||||||
read_lock(&tasklist_lock);
|
|
||||||
child = find_task_by_pid(pid);
|
|
||||||
if (child)
|
|
||||||
get_task_struct(child);
|
|
||||||
read_unlock(&tasklist_lock);
|
|
||||||
if (!child)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
ret = -EPERM;
|
|
||||||
if (pid == 1) /* you may not mess with init */
|
|
||||||
goto out_tsk;
|
|
||||||
|
|
||||||
if (request == PTRACE_ATTACH) {
|
|
||||||
ret = ptrace_attach(child);
|
|
||||||
goto out_tsk;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = ptrace_check_attach(child, request == PTRACE_KILL);
|
|
||||||
if (ret < 0)
|
|
||||||
goto out_tsk;
|
|
||||||
|
|
||||||
switch (request) {
|
switch (request) {
|
||||||
/* when I and D space are separate, these will need to be fixed. */
|
/* when I and D space are separate, these will need to be fixed. */
|
||||||
case PTRACE_PEEKTEXT: /* read word at location addr. */
|
case PTRACE_PEEKTEXT: /* read word at location addr. */
|
||||||
|
@ -351,10 +314,6 @@ asmlinkage long sys_ptrace(long request, long pid, long addr, long data)
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
out_tsk:
|
|
||||||
put_task_struct(child);
|
|
||||||
out:
|
|
||||||
unlock_kernel();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,43 +57,10 @@ void ptrace_disable(struct task_struct *child)
|
||||||
h8300_disable_trace(child);
|
h8300_disable_trace(child);
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage long sys_ptrace(long request, long pid, long addr, long data)
|
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||||
{
|
{
|
||||||
struct task_struct *child;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
lock_kernel();
|
|
||||||
ret = -EPERM;
|
|
||||||
if (request == PTRACE_TRACEME) {
|
|
||||||
/* are we already being traced? */
|
|
||||||
if (current->ptrace & PT_PTRACED)
|
|
||||||
goto out;
|
|
||||||
/* set the ptrace bit in the process flags. */
|
|
||||||
current->ptrace |= PT_PTRACED;
|
|
||||||
ret = 0;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
ret = -ESRCH;
|
|
||||||
read_lock(&tasklist_lock);
|
|
||||||
child = find_task_by_pid(pid);
|
|
||||||
if (child)
|
|
||||||
get_task_struct(child);
|
|
||||||
read_unlock(&tasklist_lock);
|
|
||||||
if (!child)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
ret = -EPERM;
|
|
||||||
if (pid == 1) /* you may not mess with init */
|
|
||||||
goto out_tsk;
|
|
||||||
|
|
||||||
if (request == PTRACE_ATTACH) {
|
|
||||||
ret = ptrace_attach(child);
|
|
||||||
goto out_tsk;
|
|
||||||
}
|
|
||||||
ret = ptrace_check_attach(child, request == PTRACE_KILL);
|
|
||||||
if (ret < 0)
|
|
||||||
goto out_tsk;
|
|
||||||
|
|
||||||
switch (request) {
|
switch (request) {
|
||||||
case PTRACE_PEEKTEXT: /* read word at location addr. */
|
case PTRACE_PEEKTEXT: /* read word at location addr. */
|
||||||
case PTRACE_PEEKDATA: {
|
case PTRACE_PEEKDATA: {
|
||||||
|
@ -251,10 +218,6 @@ asmlinkage long sys_ptrace(long request, long pid, long addr, long data)
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
out_tsk:
|
|
||||||
put_task_struct(child);
|
|
||||||
out:
|
|
||||||
unlock_kernel();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -997,8 +997,21 @@ source "drivers/Kconfig"
|
||||||
|
|
||||||
source "fs/Kconfig"
|
source "fs/Kconfig"
|
||||||
|
|
||||||
|
menu "Instrumentation Support"
|
||||||
|
depends on EXPERIMENTAL
|
||||||
|
|
||||||
source "arch/i386/oprofile/Kconfig"
|
source "arch/i386/oprofile/Kconfig"
|
||||||
|
|
||||||
|
config KPROBES
|
||||||
|
bool "Kprobes (EXPERIMENTAL)"
|
||||||
|
help
|
||||||
|
Kprobes allows you to trap at almost any kernel address and
|
||||||
|
execute a callback function. register_kprobe() establishes
|
||||||
|
a probepoint and specifies the callback. Kprobes is useful
|
||||||
|
for kernel debugging, non-intrusive instrumentation and testing.
|
||||||
|
If in doubt, say "N".
|
||||||
|
endmenu
|
||||||
|
|
||||||
source "arch/i386/Kconfig.debug"
|
source "arch/i386/Kconfig.debug"
|
||||||
|
|
||||||
source "security/Kconfig"
|
source "security/Kconfig"
|
||||||
|
|
|
@ -22,16 +22,6 @@ config DEBUG_STACKOVERFLOW
|
||||||
This option will cause messages to be printed if free stack space
|
This option will cause messages to be printed if free stack space
|
||||||
drops below a certain limit.
|
drops below a certain limit.
|
||||||
|
|
||||||
config KPROBES
|
|
||||||
bool "Kprobes"
|
|
||||||
depends on DEBUG_KERNEL
|
|
||||||
help
|
|
||||||
Kprobes allows you to trap at almost any kernel address and
|
|
||||||
execute a callback function. register_kprobe() establishes
|
|
||||||
a probepoint and specifies the callback. Kprobes is useful
|
|
||||||
for kernel debugging, non-intrusive instrumentation and testing.
|
|
||||||
If in doubt, say "N".
|
|
||||||
|
|
||||||
config DEBUG_STACK_USAGE
|
config DEBUG_STACK_USAGE
|
||||||
bool "Stack utilization instrumentation"
|
bool "Stack utilization instrumentation"
|
||||||
depends on DEBUG_KERNEL
|
depends on DEBUG_KERNEL
|
||||||
|
|
|
@ -559,14 +559,20 @@ void __devinit setup_local_APIC(void)
|
||||||
* If Linux enabled the LAPIC against the BIOS default
|
* If Linux enabled the LAPIC against the BIOS default
|
||||||
* disable it down before re-entering the BIOS on shutdown.
|
* disable it down before re-entering the BIOS on shutdown.
|
||||||
* Otherwise the BIOS may get confused and not power-off.
|
* Otherwise the BIOS may get confused and not power-off.
|
||||||
|
* Additionally clear all LVT entries before disable_local_APIC
|
||||||
|
* for the case where Linux didn't enable the LAPIC.
|
||||||
*/
|
*/
|
||||||
void lapic_shutdown(void)
|
void lapic_shutdown(void)
|
||||||
{
|
{
|
||||||
if (!cpu_has_apic || !enabled_via_apicbase)
|
if (!cpu_has_apic)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
disable_local_APIC();
|
clear_local_APIC();
|
||||||
|
|
||||||
|
if (enabled_via_apicbase)
|
||||||
|
disable_local_APIC();
|
||||||
|
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -447,8 +447,7 @@ static char * apm_event_name[] = {
|
||||||
"system standby resume",
|
"system standby resume",
|
||||||
"capabilities change"
|
"capabilities change"
|
||||||
};
|
};
|
||||||
#define NR_APM_EVENT_NAME \
|
#define NR_APM_EVENT_NAME ARRAY_SIZE(apm_event_name)
|
||||||
(sizeof(apm_event_name) / sizeof(apm_event_name[0]))
|
|
||||||
|
|
||||||
typedef struct lookup_t {
|
typedef struct lookup_t {
|
||||||
int key;
|
int key;
|
||||||
|
@ -479,7 +478,7 @@ static const lookup_t error_table[] = {
|
||||||
{ APM_NO_ERROR, "BIOS did not set a return code" },
|
{ APM_NO_ERROR, "BIOS did not set a return code" },
|
||||||
{ APM_NOT_PRESENT, "No APM present" }
|
{ APM_NOT_PRESENT, "No APM present" }
|
||||||
};
|
};
|
||||||
#define ERROR_COUNT (sizeof(error_table)/sizeof(lookup_t))
|
#define ERROR_COUNT ARRAY_SIZE(error_table)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* apm_error - display an APM error
|
* apm_error - display an APM error
|
||||||
|
|
|
@ -30,8 +30,6 @@ static int disable_x86_serial_nr __devinitdata = 1;
|
||||||
|
|
||||||
struct cpu_dev * cpu_devs[X86_VENDOR_NUM] = {};
|
struct cpu_dev * cpu_devs[X86_VENDOR_NUM] = {};
|
||||||
|
|
||||||
extern void mcheck_init(struct cpuinfo_x86 *c);
|
|
||||||
|
|
||||||
extern int disable_pse;
|
extern int disable_pse;
|
||||||
|
|
||||||
static void default_init(struct cpuinfo_x86 * c)
|
static void default_init(struct cpuinfo_x86 * c)
|
||||||
|
@ -429,9 +427,8 @@ void __devinit identify_cpu(struct cpuinfo_x86 *c)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Init Machine Check Exception if available. */
|
/* Init Machine Check Exception if available. */
|
||||||
#ifdef CONFIG_X86_MCE
|
|
||||||
mcheck_init(c);
|
mcheck_init(c);
|
||||||
#endif
|
|
||||||
if (c == &boot_cpu_data)
|
if (c == &boot_cpu_data)
|
||||||
sysenter_setup();
|
sysenter_setup();
|
||||||
enable_sep_cpu();
|
enable_sep_cpu();
|
||||||
|
|
|
@ -67,7 +67,7 @@ static const struct cpu_id cpu_ids[] = {
|
||||||
[CPU_MP4HT_D0] = {15, 3, 4 },
|
[CPU_MP4HT_D0] = {15, 3, 4 },
|
||||||
[CPU_MP4HT_E0] = {15, 4, 1 },
|
[CPU_MP4HT_E0] = {15, 4, 1 },
|
||||||
};
|
};
|
||||||
#define N_IDS (sizeof(cpu_ids)/sizeof(cpu_ids[0]))
|
#define N_IDS ARRAY_SIZE(cpu_ids)
|
||||||
|
|
||||||
struct cpu_model
|
struct cpu_model
|
||||||
{
|
{
|
||||||
|
|
|
@ -68,7 +68,7 @@ static fastcall void k7_machine_check(struct pt_regs * regs, long error_code)
|
||||||
|
|
||||||
|
|
||||||
/* AMD K7 machine check is Intel like */
|
/* AMD K7 machine check is Intel like */
|
||||||
void __devinit amd_mcheck_init(struct cpuinfo_x86 *c)
|
void amd_mcheck_init(struct cpuinfo_x86 *c)
|
||||||
{
|
{
|
||||||
u32 l, h;
|
u32 l, h;
|
||||||
int i;
|
int i;
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
#include "mce.h"
|
#include "mce.h"
|
||||||
|
|
||||||
int mce_disabled __devinitdata = 0;
|
int mce_disabled = 0;
|
||||||
int nr_mce_banks;
|
int nr_mce_banks;
|
||||||
|
|
||||||
EXPORT_SYMBOL_GPL(nr_mce_banks); /* non-fatal.o */
|
EXPORT_SYMBOL_GPL(nr_mce_banks); /* non-fatal.o */
|
||||||
|
@ -31,7 +31,7 @@ static fastcall void unexpected_machine_check(struct pt_regs * regs, long error_
|
||||||
void fastcall (*machine_check_vector)(struct pt_regs *, long error_code) = unexpected_machine_check;
|
void fastcall (*machine_check_vector)(struct pt_regs *, long error_code) = unexpected_machine_check;
|
||||||
|
|
||||||
/* This has to be run for each processor */
|
/* This has to be run for each processor */
|
||||||
void __devinit mcheck_init(struct cpuinfo_x86 *c)
|
void mcheck_init(struct cpuinfo_x86 *c)
|
||||||
{
|
{
|
||||||
if (mce_disabled==1)
|
if (mce_disabled==1)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -77,7 +77,7 @@ fastcall void smp_thermal_interrupt(struct pt_regs *regs)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* P4/Xeon Thermal regulation detect and init */
|
/* P4/Xeon Thermal regulation detect and init */
|
||||||
static void __devinit intel_init_thermal(struct cpuinfo_x86 *c)
|
static void intel_init_thermal(struct cpuinfo_x86 *c)
|
||||||
{
|
{
|
||||||
u32 l, h;
|
u32 l, h;
|
||||||
unsigned int cpu = smp_processor_id();
|
unsigned int cpu = smp_processor_id();
|
||||||
|
@ -231,7 +231,7 @@ static fastcall void intel_machine_check(struct pt_regs * regs, long error_code)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void __devinit intel_p4_mcheck_init(struct cpuinfo_x86 *c)
|
void intel_p4_mcheck_init(struct cpuinfo_x86 *c)
|
||||||
{
|
{
|
||||||
u32 l, h;
|
u32 l, h;
|
||||||
int i;
|
int i;
|
||||||
|
|
|
@ -28,7 +28,7 @@ static fastcall void pentium_machine_check(struct pt_regs * regs, long error_cod
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set up machine check reporting for processors with Intel style MCE */
|
/* Set up machine check reporting for processors with Intel style MCE */
|
||||||
void __devinit intel_p5_mcheck_init(struct cpuinfo_x86 *c)
|
void intel_p5_mcheck_init(struct cpuinfo_x86 *c)
|
||||||
{
|
{
|
||||||
u32 l, h;
|
u32 l, h;
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,7 @@ static fastcall void intel_machine_check(struct pt_regs * regs, long error_code)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set up machine check reporting for processors with Intel style MCE */
|
/* Set up machine check reporting for processors with Intel style MCE */
|
||||||
void __devinit intel_p6_mcheck_init(struct cpuinfo_x86 *c)
|
void intel_p6_mcheck_init(struct cpuinfo_x86 *c)
|
||||||
{
|
{
|
||||||
u32 l, h;
|
u32 l, h;
|
||||||
int i;
|
int i;
|
||||||
|
|
|
@ -22,7 +22,7 @@ static fastcall void winchip_machine_check(struct pt_regs * regs, long error_cod
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set up machine check reporting on the Winchip C6 series */
|
/* Set up machine check reporting on the Winchip C6 series */
|
||||||
void __devinit winchip_mcheck_init(struct cpuinfo_x86 *c)
|
void winchip_mcheck_init(struct cpuinfo_x86 *c)
|
||||||
{
|
{
|
||||||
u32 lo, hi;
|
u32 lo, hi;
|
||||||
machine_check_vector = winchip_machine_check;
|
machine_check_vector = winchip_machine_check;
|
||||||
|
|
|
@ -108,8 +108,11 @@ asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on)
|
||||||
/*
|
/*
|
||||||
* Sets the lazy trigger so that the next I/O operation will
|
* Sets the lazy trigger so that the next I/O operation will
|
||||||
* reload the correct bitmap.
|
* reload the correct bitmap.
|
||||||
|
* Reset the owner so that a process switch will not set
|
||||||
|
* tss->io_bitmap_base to IO_BITMAP_OFFSET.
|
||||||
*/
|
*/
|
||||||
tss->io_bitmap_base = INVALID_IO_BITMAP_OFFSET_LAZY;
|
tss->io_bitmap_base = INVALID_IO_BITMAP_OFFSET_LAZY;
|
||||||
|
tss->io_bitmap_owner = NULL;
|
||||||
|
|
||||||
put_cpu();
|
put_cpu();
|
||||||
|
|
||||||
|
|
|
@ -31,22 +31,16 @@
|
||||||
#include <linux/config.h>
|
#include <linux/config.h>
|
||||||
#include <linux/kprobes.h>
|
#include <linux/kprobes.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/spinlock.h>
|
|
||||||
#include <linux/preempt.h>
|
#include <linux/preempt.h>
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
#include <asm/kdebug.h>
|
#include <asm/kdebug.h>
|
||||||
#include <asm/desc.h>
|
#include <asm/desc.h>
|
||||||
|
|
||||||
static struct kprobe *current_kprobe;
|
|
||||||
static unsigned long kprobe_status, kprobe_old_eflags, kprobe_saved_eflags;
|
|
||||||
static struct kprobe *kprobe_prev;
|
|
||||||
static unsigned long kprobe_status_prev, kprobe_old_eflags_prev, kprobe_saved_eflags_prev;
|
|
||||||
static struct pt_regs jprobe_saved_regs;
|
|
||||||
static long *jprobe_saved_esp;
|
|
||||||
/* copy of the kernel stack at the probe fire time */
|
|
||||||
static kprobe_opcode_t jprobes_stack[MAX_STACK_SIZE];
|
|
||||||
void jprobe_return_end(void);
|
void jprobe_return_end(void);
|
||||||
|
|
||||||
|
DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL;
|
||||||
|
DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* returns non-zero if opcode modifies the interrupt flag.
|
* returns non-zero if opcode modifies the interrupt flag.
|
||||||
*/
|
*/
|
||||||
|
@ -91,29 +85,30 @@ void __kprobes arch_remove_kprobe(struct kprobe *p)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void save_previous_kprobe(void)
|
static inline void save_previous_kprobe(struct kprobe_ctlblk *kcb)
|
||||||
{
|
{
|
||||||
kprobe_prev = current_kprobe;
|
kcb->prev_kprobe.kp = kprobe_running();
|
||||||
kprobe_status_prev = kprobe_status;
|
kcb->prev_kprobe.status = kcb->kprobe_status;
|
||||||
kprobe_old_eflags_prev = kprobe_old_eflags;
|
kcb->prev_kprobe.old_eflags = kcb->kprobe_old_eflags;
|
||||||
kprobe_saved_eflags_prev = kprobe_saved_eflags;
|
kcb->prev_kprobe.saved_eflags = kcb->kprobe_saved_eflags;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void restore_previous_kprobe(void)
|
static inline void restore_previous_kprobe(struct kprobe_ctlblk *kcb)
|
||||||
{
|
{
|
||||||
current_kprobe = kprobe_prev;
|
__get_cpu_var(current_kprobe) = kcb->prev_kprobe.kp;
|
||||||
kprobe_status = kprobe_status_prev;
|
kcb->kprobe_status = kcb->prev_kprobe.status;
|
||||||
kprobe_old_eflags = kprobe_old_eflags_prev;
|
kcb->kprobe_old_eflags = kcb->prev_kprobe.old_eflags;
|
||||||
kprobe_saved_eflags = kprobe_saved_eflags_prev;
|
kcb->kprobe_saved_eflags = kcb->prev_kprobe.saved_eflags;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void set_current_kprobe(struct kprobe *p, struct pt_regs *regs)
|
static inline void set_current_kprobe(struct kprobe *p, struct pt_regs *regs,
|
||||||
|
struct kprobe_ctlblk *kcb)
|
||||||
{
|
{
|
||||||
current_kprobe = p;
|
__get_cpu_var(current_kprobe) = p;
|
||||||
kprobe_saved_eflags = kprobe_old_eflags
|
kcb->kprobe_saved_eflags = kcb->kprobe_old_eflags
|
||||||
= (regs->eflags & (TF_MASK | IF_MASK));
|
= (regs->eflags & (TF_MASK | IF_MASK));
|
||||||
if (is_IF_modifier(p->opcode))
|
if (is_IF_modifier(p->opcode))
|
||||||
kprobe_saved_eflags &= ~IF_MASK;
|
kcb->kprobe_saved_eflags &= ~IF_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void prepare_singlestep(struct kprobe *p, struct pt_regs *regs)
|
static inline void prepare_singlestep(struct kprobe *p, struct pt_regs *regs)
|
||||||
|
@ -127,6 +122,7 @@ static inline void prepare_singlestep(struct kprobe *p, struct pt_regs *regs)
|
||||||
regs->eip = (unsigned long)&p->ainsn.insn;
|
regs->eip = (unsigned long)&p->ainsn.insn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Called with kretprobe_lock held */
|
||||||
void __kprobes arch_prepare_kretprobe(struct kretprobe *rp,
|
void __kprobes arch_prepare_kretprobe(struct kretprobe *rp,
|
||||||
struct pt_regs *regs)
|
struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
@ -157,9 +153,15 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
kprobe_opcode_t *addr = NULL;
|
kprobe_opcode_t *addr = NULL;
|
||||||
unsigned long *lp;
|
unsigned long *lp;
|
||||||
|
struct kprobe_ctlblk *kcb;
|
||||||
|
|
||||||
/* We're in an interrupt, but this is clear and BUG()-safe. */
|
/*
|
||||||
|
* We don't want to be preempted for the entire
|
||||||
|
* duration of kprobe processing
|
||||||
|
*/
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
|
kcb = get_kprobe_ctlblk();
|
||||||
|
|
||||||
/* Check if the application is using LDT entry for its code segment and
|
/* Check if the application is using LDT entry for its code segment and
|
||||||
* calculate the address by reading the base address from the LDT entry.
|
* calculate the address by reading the base address from the LDT entry.
|
||||||
*/
|
*/
|
||||||
|
@ -173,15 +175,12 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
|
||||||
}
|
}
|
||||||
/* Check we're not actually recursing */
|
/* Check we're not actually recursing */
|
||||||
if (kprobe_running()) {
|
if (kprobe_running()) {
|
||||||
/* We *are* holding lock here, so this is safe.
|
|
||||||
Disarm the probe we just hit, and ignore it. */
|
|
||||||
p = get_kprobe(addr);
|
p = get_kprobe(addr);
|
||||||
if (p) {
|
if (p) {
|
||||||
if (kprobe_status == KPROBE_HIT_SS &&
|
if (kcb->kprobe_status == KPROBE_HIT_SS &&
|
||||||
*p->ainsn.insn == BREAKPOINT_INSTRUCTION) {
|
*p->ainsn.insn == BREAKPOINT_INSTRUCTION) {
|
||||||
regs->eflags &= ~TF_MASK;
|
regs->eflags &= ~TF_MASK;
|
||||||
regs->eflags |= kprobe_saved_eflags;
|
regs->eflags |= kcb->kprobe_saved_eflags;
|
||||||
unlock_kprobes();
|
|
||||||
goto no_kprobe;
|
goto no_kprobe;
|
||||||
}
|
}
|
||||||
/* We have reentered the kprobe_handler(), since
|
/* We have reentered the kprobe_handler(), since
|
||||||
|
@ -190,26 +189,23 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
|
||||||
* just single step on the instruction of the new probe
|
* just single step on the instruction of the new probe
|
||||||
* without calling any user handlers.
|
* without calling any user handlers.
|
||||||
*/
|
*/
|
||||||
save_previous_kprobe();
|
save_previous_kprobe(kcb);
|
||||||
set_current_kprobe(p, regs);
|
set_current_kprobe(p, regs, kcb);
|
||||||
p->nmissed++;
|
p->nmissed++;
|
||||||
prepare_singlestep(p, regs);
|
prepare_singlestep(p, regs);
|
||||||
kprobe_status = KPROBE_REENTER;
|
kcb->kprobe_status = KPROBE_REENTER;
|
||||||
return 1;
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
p = current_kprobe;
|
p = __get_cpu_var(current_kprobe);
|
||||||
if (p->break_handler && p->break_handler(p, regs)) {
|
if (p->break_handler && p->break_handler(p, regs)) {
|
||||||
goto ss_probe;
|
goto ss_probe;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* If it's not ours, can't be delete race, (we hold lock). */
|
|
||||||
goto no_kprobe;
|
goto no_kprobe;
|
||||||
}
|
}
|
||||||
|
|
||||||
lock_kprobes();
|
|
||||||
p = get_kprobe(addr);
|
p = get_kprobe(addr);
|
||||||
if (!p) {
|
if (!p) {
|
||||||
unlock_kprobes();
|
|
||||||
if (regs->eflags & VM_MASK) {
|
if (regs->eflags & VM_MASK) {
|
||||||
/* We are in virtual-8086 mode. Return 0 */
|
/* We are in virtual-8086 mode. Return 0 */
|
||||||
goto no_kprobe;
|
goto no_kprobe;
|
||||||
|
@ -232,8 +228,8 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
|
||||||
goto no_kprobe;
|
goto no_kprobe;
|
||||||
}
|
}
|
||||||
|
|
||||||
kprobe_status = KPROBE_HIT_ACTIVE;
|
set_current_kprobe(p, regs, kcb);
|
||||||
set_current_kprobe(p, regs);
|
kcb->kprobe_status = KPROBE_HIT_ACTIVE;
|
||||||
|
|
||||||
if (p->pre_handler && p->pre_handler(p, regs))
|
if (p->pre_handler && p->pre_handler(p, regs))
|
||||||
/* handler has already set things up, so skip ss setup */
|
/* handler has already set things up, so skip ss setup */
|
||||||
|
@ -241,7 +237,7 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
|
||||||
|
|
||||||
ss_probe:
|
ss_probe:
|
||||||
prepare_singlestep(p, regs);
|
prepare_singlestep(p, regs);
|
||||||
kprobe_status = KPROBE_HIT_SS;
|
kcb->kprobe_status = KPROBE_HIT_SS;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
no_kprobe:
|
no_kprobe:
|
||||||
|
@ -269,9 +265,10 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)
|
||||||
struct kretprobe_instance *ri = NULL;
|
struct kretprobe_instance *ri = NULL;
|
||||||
struct hlist_head *head;
|
struct hlist_head *head;
|
||||||
struct hlist_node *node, *tmp;
|
struct hlist_node *node, *tmp;
|
||||||
unsigned long orig_ret_address = 0;
|
unsigned long flags, orig_ret_address = 0;
|
||||||
unsigned long trampoline_address =(unsigned long)&kretprobe_trampoline;
|
unsigned long trampoline_address =(unsigned long)&kretprobe_trampoline;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&kretprobe_lock, flags);
|
||||||
head = kretprobe_inst_table_head(current);
|
head = kretprobe_inst_table_head(current);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -310,14 +307,15 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)
|
||||||
BUG_ON(!orig_ret_address || (orig_ret_address == trampoline_address));
|
BUG_ON(!orig_ret_address || (orig_ret_address == trampoline_address));
|
||||||
regs->eip = orig_ret_address;
|
regs->eip = orig_ret_address;
|
||||||
|
|
||||||
unlock_kprobes();
|
reset_current_kprobe();
|
||||||
|
spin_unlock_irqrestore(&kretprobe_lock, flags);
|
||||||
preempt_enable_no_resched();
|
preempt_enable_no_resched();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* By returning a non-zero value, we are telling
|
* By returning a non-zero value, we are telling
|
||||||
* kprobe_handler() that we have handled unlocking
|
* kprobe_handler() that we don't want the post_handler
|
||||||
* and re-enabling preemption.
|
* to run (and have re-enabled preemption)
|
||||||
*/
|
*/
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -343,7 +341,8 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)
|
||||||
* that is atop the stack is the address following the copied instruction.
|
* that is atop the stack is the address following the copied instruction.
|
||||||
* We need to make it the address following the original instruction.
|
* We need to make it the address following the original instruction.
|
||||||
*/
|
*/
|
||||||
static void __kprobes resume_execution(struct kprobe *p, struct pt_regs *regs)
|
static void __kprobes resume_execution(struct kprobe *p,
|
||||||
|
struct pt_regs *regs, struct kprobe_ctlblk *kcb)
|
||||||
{
|
{
|
||||||
unsigned long *tos = (unsigned long *)®s->esp;
|
unsigned long *tos = (unsigned long *)®s->esp;
|
||||||
unsigned long next_eip = 0;
|
unsigned long next_eip = 0;
|
||||||
|
@ -353,7 +352,7 @@ static void __kprobes resume_execution(struct kprobe *p, struct pt_regs *regs)
|
||||||
switch (p->ainsn.insn[0]) {
|
switch (p->ainsn.insn[0]) {
|
||||||
case 0x9c: /* pushfl */
|
case 0x9c: /* pushfl */
|
||||||
*tos &= ~(TF_MASK | IF_MASK);
|
*tos &= ~(TF_MASK | IF_MASK);
|
||||||
*tos |= kprobe_old_eflags;
|
*tos |= kcb->kprobe_old_eflags;
|
||||||
break;
|
break;
|
||||||
case 0xc3: /* ret/lret */
|
case 0xc3: /* ret/lret */
|
||||||
case 0xcb:
|
case 0xcb:
|
||||||
|
@ -394,27 +393,30 @@ static void __kprobes resume_execution(struct kprobe *p, struct pt_regs *regs)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Interrupts are disabled on entry as trap1 is an interrupt gate and they
|
* Interrupts are disabled on entry as trap1 is an interrupt gate and they
|
||||||
* remain disabled thoroughout this function. And we hold kprobe lock.
|
* remain disabled thoroughout this function.
|
||||||
*/
|
*/
|
||||||
static inline int post_kprobe_handler(struct pt_regs *regs)
|
static inline int post_kprobe_handler(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
if (!kprobe_running())
|
struct kprobe *cur = kprobe_running();
|
||||||
|
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
|
||||||
|
|
||||||
|
if (!cur)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if ((kprobe_status != KPROBE_REENTER) && current_kprobe->post_handler) {
|
if ((kcb->kprobe_status != KPROBE_REENTER) && cur->post_handler) {
|
||||||
kprobe_status = KPROBE_HIT_SSDONE;
|
kcb->kprobe_status = KPROBE_HIT_SSDONE;
|
||||||
current_kprobe->post_handler(current_kprobe, regs, 0);
|
cur->post_handler(cur, regs, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
resume_execution(current_kprobe, regs);
|
resume_execution(cur, regs, kcb);
|
||||||
regs->eflags |= kprobe_saved_eflags;
|
regs->eflags |= kcb->kprobe_saved_eflags;
|
||||||
|
|
||||||
/*Restore back the original saved kprobes variables and continue. */
|
/*Restore back the original saved kprobes variables and continue. */
|
||||||
if (kprobe_status == KPROBE_REENTER) {
|
if (kcb->kprobe_status == KPROBE_REENTER) {
|
||||||
restore_previous_kprobe();
|
restore_previous_kprobe(kcb);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
unlock_kprobes();
|
reset_current_kprobe();
|
||||||
out:
|
out:
|
||||||
preempt_enable_no_resched();
|
preempt_enable_no_resched();
|
||||||
|
|
||||||
|
@ -429,18 +431,19 @@ static inline int post_kprobe_handler(struct pt_regs *regs)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Interrupts disabled, kprobe_lock held. */
|
|
||||||
static inline int kprobe_fault_handler(struct pt_regs *regs, int trapnr)
|
static inline int kprobe_fault_handler(struct pt_regs *regs, int trapnr)
|
||||||
{
|
{
|
||||||
if (current_kprobe->fault_handler
|
struct kprobe *cur = kprobe_running();
|
||||||
&& current_kprobe->fault_handler(current_kprobe, regs, trapnr))
|
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
|
||||||
|
|
||||||
|
if (cur->fault_handler && cur->fault_handler(cur, regs, trapnr))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (kprobe_status & KPROBE_HIT_SS) {
|
if (kcb->kprobe_status & KPROBE_HIT_SS) {
|
||||||
resume_execution(current_kprobe, regs);
|
resume_execution(cur, regs, kcb);
|
||||||
regs->eflags |= kprobe_old_eflags;
|
regs->eflags |= kcb->kprobe_old_eflags;
|
||||||
|
|
||||||
unlock_kprobes();
|
reset_current_kprobe();
|
||||||
preempt_enable_no_resched();
|
preempt_enable_no_resched();
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -453,39 +456,41 @@ int __kprobes kprobe_exceptions_notify(struct notifier_block *self,
|
||||||
unsigned long val, void *data)
|
unsigned long val, void *data)
|
||||||
{
|
{
|
||||||
struct die_args *args = (struct die_args *)data;
|
struct die_args *args = (struct die_args *)data;
|
||||||
|
int ret = NOTIFY_DONE;
|
||||||
|
|
||||||
switch (val) {
|
switch (val) {
|
||||||
case DIE_INT3:
|
case DIE_INT3:
|
||||||
if (kprobe_handler(args->regs))
|
if (kprobe_handler(args->regs))
|
||||||
return NOTIFY_STOP;
|
ret = NOTIFY_STOP;
|
||||||
break;
|
break;
|
||||||
case DIE_DEBUG:
|
case DIE_DEBUG:
|
||||||
if (post_kprobe_handler(args->regs))
|
if (post_kprobe_handler(args->regs))
|
||||||
return NOTIFY_STOP;
|
ret = NOTIFY_STOP;
|
||||||
break;
|
break;
|
||||||
case DIE_GPF:
|
case DIE_GPF:
|
||||||
if (kprobe_running() &&
|
|
||||||
kprobe_fault_handler(args->regs, args->trapnr))
|
|
||||||
return NOTIFY_STOP;
|
|
||||||
break;
|
|
||||||
case DIE_PAGE_FAULT:
|
case DIE_PAGE_FAULT:
|
||||||
|
/* kprobe_running() needs smp_processor_id() */
|
||||||
|
preempt_disable();
|
||||||
if (kprobe_running() &&
|
if (kprobe_running() &&
|
||||||
kprobe_fault_handler(args->regs, args->trapnr))
|
kprobe_fault_handler(args->regs, args->trapnr))
|
||||||
return NOTIFY_STOP;
|
ret = NOTIFY_STOP;
|
||||||
|
preempt_enable();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return NOTIFY_DONE;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
|
int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct jprobe *jp = container_of(p, struct jprobe, kp);
|
struct jprobe *jp = container_of(p, struct jprobe, kp);
|
||||||
unsigned long addr;
|
unsigned long addr;
|
||||||
|
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
|
||||||
|
|
||||||
jprobe_saved_regs = *regs;
|
kcb->jprobe_saved_regs = *regs;
|
||||||
jprobe_saved_esp = ®s->esp;
|
kcb->jprobe_saved_esp = ®s->esp;
|
||||||
addr = (unsigned long)jprobe_saved_esp;
|
addr = (unsigned long)(kcb->jprobe_saved_esp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TBD: As Linus pointed out, gcc assumes that the callee
|
* TBD: As Linus pointed out, gcc assumes that the callee
|
||||||
|
@ -494,7 +499,8 @@ int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
|
||||||
* we also save and restore enough stack bytes to cover
|
* we also save and restore enough stack bytes to cover
|
||||||
* the argument area.
|
* the argument area.
|
||||||
*/
|
*/
|
||||||
memcpy(jprobes_stack, (kprobe_opcode_t *) addr, MIN_STACK_SIZE(addr));
|
memcpy(kcb->jprobes_stack, (kprobe_opcode_t *)addr,
|
||||||
|
MIN_STACK_SIZE(addr));
|
||||||
regs->eflags &= ~IF_MASK;
|
regs->eflags &= ~IF_MASK;
|
||||||
regs->eip = (unsigned long)(jp->entry);
|
regs->eip = (unsigned long)(jp->entry);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -502,36 +508,40 @@ int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
|
||||||
|
|
||||||
void __kprobes jprobe_return(void)
|
void __kprobes jprobe_return(void)
|
||||||
{
|
{
|
||||||
preempt_enable_no_resched();
|
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
|
||||||
|
|
||||||
asm volatile (" xchgl %%ebx,%%esp \n"
|
asm volatile (" xchgl %%ebx,%%esp \n"
|
||||||
" int3 \n"
|
" int3 \n"
|
||||||
" .globl jprobe_return_end \n"
|
" .globl jprobe_return_end \n"
|
||||||
" jprobe_return_end: \n"
|
" jprobe_return_end: \n"
|
||||||
" nop \n"::"b"
|
" nop \n"::"b"
|
||||||
(jprobe_saved_esp):"memory");
|
(kcb->jprobe_saved_esp):"memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
|
int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
|
||||||
u8 *addr = (u8 *) (regs->eip - 1);
|
u8 *addr = (u8 *) (regs->eip - 1);
|
||||||
unsigned long stack_addr = (unsigned long)jprobe_saved_esp;
|
unsigned long stack_addr = (unsigned long)(kcb->jprobe_saved_esp);
|
||||||
struct jprobe *jp = container_of(p, struct jprobe, kp);
|
struct jprobe *jp = container_of(p, struct jprobe, kp);
|
||||||
|
|
||||||
if ((addr > (u8 *) jprobe_return) && (addr < (u8 *) jprobe_return_end)) {
|
if ((addr > (u8 *) jprobe_return) && (addr < (u8 *) jprobe_return_end)) {
|
||||||
if (®s->esp != jprobe_saved_esp) {
|
if (®s->esp != kcb->jprobe_saved_esp) {
|
||||||
struct pt_regs *saved_regs =
|
struct pt_regs *saved_regs =
|
||||||
container_of(jprobe_saved_esp, struct pt_regs, esp);
|
container_of(kcb->jprobe_saved_esp,
|
||||||
|
struct pt_regs, esp);
|
||||||
printk("current esp %p does not match saved esp %p\n",
|
printk("current esp %p does not match saved esp %p\n",
|
||||||
®s->esp, jprobe_saved_esp);
|
®s->esp, kcb->jprobe_saved_esp);
|
||||||
printk("Saved registers for jprobe %p\n", jp);
|
printk("Saved registers for jprobe %p\n", jp);
|
||||||
show_registers(saved_regs);
|
show_registers(saved_regs);
|
||||||
printk("Current registers\n");
|
printk("Current registers\n");
|
||||||
show_registers(regs);
|
show_registers(regs);
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
*regs = jprobe_saved_regs;
|
*regs = kcb->jprobe_saved_regs;
|
||||||
memcpy((kprobe_opcode_t *) stack_addr, jprobes_stack,
|
memcpy((kprobe_opcode_t *) stack_addr, kcb->jprobes_stack,
|
||||||
MIN_STACK_SIZE(stack_addr));
|
MIN_STACK_SIZE(stack_addr));
|
||||||
|
preempt_enable_no_resched();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#include <asm/ldt.h>
|
#include <asm/ldt.h>
|
||||||
#include <asm/desc.h>
|
#include <asm/desc.h>
|
||||||
|
#include <asm/mmu_context.h>
|
||||||
|
|
||||||
#ifdef CONFIG_SMP /* avoids "defined but not used" warnig */
|
#ifdef CONFIG_SMP /* avoids "defined but not used" warnig */
|
||||||
static void flush_ldt(void *null)
|
static void flush_ldt(void *null)
|
||||||
|
|
|
@ -132,7 +132,7 @@ static struct resource mca_standard_resources[] = {
|
||||||
{ .start = 0x100, .end = 0x107, .name = "POS (MCA)" }
|
{ .start = 0x100, .end = 0x107, .name = "POS (MCA)" }
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MCA_STANDARD_RESOURCES (sizeof(mca_standard_resources)/sizeof(struct resource))
|
#define MCA_STANDARD_RESOURCES ARRAY_SIZE(mca_standard_resources)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mca_read_and_store_pos - read the POS registers into a memory buffer
|
* mca_read_and_store_pos - read the POS registers into a memory buffer
|
||||||
|
|
|
@ -354,49 +354,12 @@ ptrace_set_thread_area(struct task_struct *child,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage long sys_ptrace(long request, long pid, long addr, long data)
|
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
||||||
{
|
{
|
||||||
struct task_struct *child;
|
|
||||||
struct user * dummy = NULL;
|
struct user * dummy = NULL;
|
||||||
int i, ret;
|
int i, ret;
|
||||||
unsigned long __user *datap = (unsigned long __user *)data;
|
unsigned long __user *datap = (unsigned long __user *)data;
|
||||||
|
|
||||||
lock_kernel();
|
|
||||||
ret = -EPERM;
|
|
||||||
if (request == PTRACE_TRACEME) {
|
|
||||||
/* are we already being traced? */
|
|
||||||
if (current->ptrace & PT_PTRACED)
|
|
||||||
goto out;
|
|
||||||
ret = security_ptrace(current->parent, current);
|
|
||||||
if (ret)
|
|
||||||
goto out;
|
|
||||||
/* set the ptrace bit in the process flags. */
|
|
||||||
current->ptrace |= PT_PTRACED;
|
|
||||||
ret = 0;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
ret = -ESRCH;
|
|
||||||
read_lock(&tasklist_lock);
|
|
||||||
child = find_task_by_pid(pid);
|
|
||||||
if (child)
|
|
||||||
get_task_struct(child);
|
|
||||||
read_unlock(&tasklist_lock);
|
|
||||||
if (!child)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
ret = -EPERM;
|
|
||||||
if (pid == 1) /* you may not mess with init */
|
|
||||||
goto out_tsk;
|
|
||||||
|
|
||||||
if (request == PTRACE_ATTACH) {
|
|
||||||
ret = ptrace_attach(child);
|
|
||||||
goto out_tsk;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = ptrace_check_attach(child, request == PTRACE_KILL);
|
|
||||||
if (ret < 0)
|
|
||||||
goto out_tsk;
|
|
||||||
|
|
||||||
switch (request) {
|
switch (request) {
|
||||||
/* when I and D space are separate, these will need to be fixed. */
|
/* when I and D space are separate, these will need to be fixed. */
|
||||||
case PTRACE_PEEKTEXT: /* read word at location addr. */
|
case PTRACE_PEEKTEXT: /* read word at location addr. */
|
||||||
|
@ -663,10 +626,7 @@ asmlinkage long sys_ptrace(long request, long pid, long addr, long data)
|
||||||
ret = ptrace_request(child, request, addr, data);
|
ret = ptrace_request(child, request, addr, data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
out_tsk:
|
out_tsk:
|
||||||
put_task_struct(child);
|
|
||||||
out:
|
|
||||||
unlock_kernel();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
#include <asm/delay.h>
|
#include <asm/delay.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
|
#include <linux/reboot_fixups.h>
|
||||||
|
|
||||||
static void cs5530a_warm_reset(struct pci_dev *dev)
|
static void cs5530a_warm_reset(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
|
@ -42,7 +43,7 @@ void mach_reboot_fixups(void)
|
||||||
struct pci_dev *dev;
|
struct pci_dev *dev;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i=0; i < (sizeof(fixups_table)/sizeof(fixups_table[0])); i++) {
|
for (i=0; i < ARRAY_SIZE(fixups_table); i++) {
|
||||||
cur = &(fixups_table[i]);
|
cur = &(fixups_table[i]);
|
||||||
dev = pci_get_device(cur->vendor, cur->device, NULL);
|
dev = pci_get_device(cur->vendor, cur->device, NULL);
|
||||||
if (!dev)
|
if (!dev)
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
|
|
||||||
#include <linux/scx200.h>
|
#include <linux/scx200.h>
|
||||||
|
#include <linux/scx200_gpio.h>
|
||||||
|
|
||||||
/* Verify that the configuration block really is there */
|
/* Verify that the configuration block really is there */
|
||||||
#define scx200_cb_probe(base) (inw((base) + SCx200_CBA) == (base))
|
#define scx200_cb_probe(base) (inw((base) + SCx200_CBA) == (base))
|
||||||
|
|
|
@ -68,11 +68,9 @@ EXPORT_SYMBOL(smp_num_siblings);
|
||||||
|
|
||||||
/* Package ID of each logical CPU */
|
/* Package ID of each logical CPU */
|
||||||
int phys_proc_id[NR_CPUS] __read_mostly = {[0 ... NR_CPUS-1] = BAD_APICID};
|
int phys_proc_id[NR_CPUS] __read_mostly = {[0 ... NR_CPUS-1] = BAD_APICID};
|
||||||
EXPORT_SYMBOL(phys_proc_id);
|
|
||||||
|
|
||||||
/* Core ID of each logical CPU */
|
/* Core ID of each logical CPU */
|
||||||
int cpu_core_id[NR_CPUS] __read_mostly = {[0 ... NR_CPUS-1] = BAD_APICID};
|
int cpu_core_id[NR_CPUS] __read_mostly = {[0 ... NR_CPUS-1] = BAD_APICID};
|
||||||
EXPORT_SYMBOL(cpu_core_id);
|
|
||||||
|
|
||||||
cpumask_t cpu_sibling_map[NR_CPUS] __read_mostly;
|
cpumask_t cpu_sibling_map[NR_CPUS] __read_mostly;
|
||||||
EXPORT_SYMBOL(cpu_sibling_map);
|
EXPORT_SYMBOL(cpu_sibling_map);
|
||||||
|
@ -612,7 +610,7 @@ static inline void __inquire_remote_apic(int apicid)
|
||||||
|
|
||||||
printk("Inquiring remote APIC #%d...\n", apicid);
|
printk("Inquiring remote APIC #%d...\n", apicid);
|
||||||
|
|
||||||
for (i = 0; i < sizeof(regs) / sizeof(*regs); i++) {
|
for (i = 0; i < ARRAY_SIZE(regs); i++) {
|
||||||
printk("... APIC #%d %s: ", apicid, names[i]);
|
printk("... APIC #%d %s: ", apicid, names[i]);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1,7 +1,3 @@
|
||||||
|
|
||||||
menu "Profiling support"
|
|
||||||
depends on EXPERIMENTAL
|
|
||||||
|
|
||||||
config PROFILING
|
config PROFILING
|
||||||
bool "Profiling support (EXPERIMENTAL)"
|
bool "Profiling support (EXPERIMENTAL)"
|
||||||
help
|
help
|
||||||
|
@ -19,5 +15,3 @@ config OPROFILE
|
||||||
|
|
||||||
If unsure, say N.
|
If unsure, say N.
|
||||||
|
|
||||||
endmenu
|
|
||||||
|
|
||||||
|
|
|
@ -118,6 +118,7 @@ void __restore_processor_state(struct saved_context *ctxt)
|
||||||
fix_processor_context();
|
fix_processor_context();
|
||||||
do_fpu_end();
|
do_fpu_end();
|
||||||
mtrr_ap_init();
|
mtrr_ap_init();
|
||||||
|
mcheck_init(&boot_cpu_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void restore_processor_state(void)
|
void restore_processor_state(void)
|
||||||
|
|
|
@ -427,8 +427,21 @@ config GENERIC_PENDING_IRQ
|
||||||
|
|
||||||
source "arch/ia64/hp/sim/Kconfig"
|
source "arch/ia64/hp/sim/Kconfig"
|
||||||
|
|
||||||
|
menu "Instrumentation Support"
|
||||||
|
depends on EXPERIMENTAL
|
||||||
|
|
||||||
source "arch/ia64/oprofile/Kconfig"
|
source "arch/ia64/oprofile/Kconfig"
|
||||||
|
|
||||||
|
config KPROBES
|
||||||
|
bool "Kprobes (EXPERIMENTAL)"
|
||||||
|
help
|
||||||
|
Kprobes allows you to trap at almost any kernel address and
|
||||||
|
execute a callback function. register_kprobe() establishes
|
||||||
|
a probepoint and specifies the callback. Kprobes is useful
|
||||||
|
for kernel debugging, non-intrusive instrumentation and testing.
|
||||||
|
If in doubt, say "N".
|
||||||
|
endmenu
|
||||||
|
|
||||||
source "arch/ia64/Kconfig.debug"
|
source "arch/ia64/Kconfig.debug"
|
||||||
|
|
||||||
source "security/Kconfig"
|
source "security/Kconfig"
|
||||||
|
|
|
@ -2,17 +2,6 @@ menu "Kernel hacking"
|
||||||
|
|
||||||
source "lib/Kconfig.debug"
|
source "lib/Kconfig.debug"
|
||||||
|
|
||||||
config KPROBES
|
|
||||||
bool "Kprobes"
|
|
||||||
depends on DEBUG_KERNEL
|
|
||||||
help
|
|
||||||
Kprobes allows you to trap at almost any kernel address and
|
|
||||||
execute a callback function. register_kprobe() establishes
|
|
||||||
a probepoint and specifies the callback. Kprobes is useful
|
|
||||||
for kernel debugging, non-intrusive instrumentation and testing.
|
|
||||||
If in doubt, say "N".
|
|
||||||
|
|
||||||
|
|
||||||
choice
|
choice
|
||||||
prompt "Physical memory granularity"
|
prompt "Physical memory granularity"
|
||||||
default IA64_GRANULE_64MB
|
default IA64_GRANULE_64MB
|
||||||
|
|
|
@ -642,10 +642,8 @@ static void rs_close(struct tty_struct *tty, struct file * filp)
|
||||||
info->event = 0;
|
info->event = 0;
|
||||||
info->tty = 0;
|
info->tty = 0;
|
||||||
if (info->blocked_open) {
|
if (info->blocked_open) {
|
||||||
if (info->close_delay) {
|
if (info->close_delay)
|
||||||
current->state = TASK_INTERRUPTIBLE;
|
schedule_timeout_interruptible(info->close_delay);
|
||||||
schedule_timeout(info->close_delay);
|
|
||||||
}
|
|
||||||
wake_up_interruptible(&info->open_wait);
|
wake_up_interruptible(&info->open_wait);
|
||||||
}
|
}
|
||||||
info->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING);
|
info->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING);
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue