This commit is contained in:
commit
35267ab61f
|
@ -24,6 +24,8 @@ DMA-mapping.txt
|
|||
- info for PCI drivers using DMA portably across all platforms.
|
||||
DocBook/
|
||||
- directory with DocBook templates etc. for kernel documentation.
|
||||
HOWTO
|
||||
- The process and procedures of how to do Linux kernel development.
|
||||
IO-mapping.txt
|
||||
- how to access I/O mapped memory from within device drivers.
|
||||
IPMI.txt
|
||||
|
@ -256,6 +258,10 @@ specialix.txt
|
|||
- info on hardware/driver for specialix IO8+ multiport serial card.
|
||||
spinlocks.txt
|
||||
- info on using spinlocks to provide exclusive access in kernel.
|
||||
stable_api_nonsense.txt
|
||||
- info on why the kernel does not have a stable in-kernel api or abi.
|
||||
stable_kernel_rules.txt
|
||||
- rules and procedures for the -stable kernel releases.
|
||||
stallion.txt
|
||||
- info on using the Stallion multiport serial driver.
|
||||
svga.txt
|
||||
|
|
|
@ -0,0 +1,618 @@
|
|||
HOWTO do Linux kernel development
|
||||
---------------------------------
|
||||
|
||||
This is the be-all, end-all document on this topic. It contains
|
||||
instructions on how to become a Linux kernel developer and how to learn
|
||||
to work with the Linux kernel development community. It tries to not
|
||||
contain anything related to the technical aspects of kernel programming,
|
||||
but will help point you in the right direction for that.
|
||||
|
||||
If anything in this document becomes out of date, please send in patches
|
||||
to the maintainer of this file, who is listed at the bottom of the
|
||||
document.
|
||||
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
So, you want to learn how to become a Linux kernel developer? Or you
|
||||
have been told by your manager, "Go write a Linux driver for this
|
||||
device." This document's goal is to teach you everything you need to
|
||||
know to achieve this by describing the process you need to go through,
|
||||
and hints on how to work with the community. It will also try to
|
||||
explain some of the reasons why the community works like it does.
|
||||
|
||||
The kernel is written mostly in C, with some architecture-dependent
|
||||
parts written in assembly. A good understanding of C is required for
|
||||
kernel development. Assembly (any architecture) is not required unless
|
||||
you plan to do low-level development for that architecture. Though they
|
||||
are not a good substitute for a solid C education and/or years of
|
||||
experience, the following books are good for, if anything, reference:
|
||||
- "The C Programming Language" by Kernighan and Ritchie [Prentice Hall]
|
||||
- "Practical C Programming" by Steve Oualline [O'Reilly]
|
||||
|
||||
The kernel is written using GNU C and the GNU toolchain. While it
|
||||
adheres to the ISO C89 standard, it uses a number of extensions that are
|
||||
not featured in the standard. The kernel is a freestanding C
|
||||
environment, with no reliance on the standard C library, so some
|
||||
portions of the C standard are not supported. Arbitrary long long
|
||||
divisions and floating point are not allowed. It can sometimes be
|
||||
difficult to understand the assumptions the kernel has on the toolchain
|
||||
and the extensions that it uses, and unfortunately there is no
|
||||
definitive reference for them. Please check the gcc info pages (`info
|
||||
gcc`) for some information on them.
|
||||
|
||||
Please remember that you are trying to learn how to work with the
|
||||
existing development community. It is a diverse group of people, with
|
||||
high standards for coding, style and procedure. These standards have
|
||||
been created over time based on what they have found to work best for
|
||||
such a large and geographically dispersed team. Try to learn as much as
|
||||
possible about these standards ahead of time, as they are well
|
||||
documented; do not expect people to adapt to you or your company's way
|
||||
of doing things.
|
||||
|
||||
|
||||
Legal Issues
|
||||
------------
|
||||
|
||||
The Linux kernel source code is released under the GPL. Please see the
|
||||
file, COPYING, in the main directory of the source tree, for details on
|
||||
the license. If you have further questions about the license, please
|
||||
contact a lawyer, and do not ask on the Linux kernel mailing list. The
|
||||
people on the mailing lists are not lawyers, and you should not rely on
|
||||
their statements on legal matters.
|
||||
|
||||
For common questions and answers about the GPL, please see:
|
||||
http://www.gnu.org/licenses/gpl-faq.html
|
||||
|
||||
|
||||
Documentation
|
||||
------------
|
||||
|
||||
The Linux kernel source tree has a large range of documents that are
|
||||
invaluable for learning how to interact with the kernel community. When
|
||||
new features are added to the kernel, it is recommended that new
|
||||
documentation files are also added which explain how to use the feature.
|
||||
When a kernel change causes the interface that the kernel exposes to
|
||||
userspace to change, it is recommended that you send the information or
|
||||
a patch to the manual pages explaining the change to the manual pages
|
||||
maintainer at mtk-manpages@gmx.net.
|
||||
|
||||
Here is a list of files that are in the kernel source tree that are
|
||||
required reading:
|
||||
README
|
||||
This file gives a short background on the Linux kernel and describes
|
||||
what is necessary to do to configure and build the kernel. People
|
||||
who are new to the kernel should start here.
|
||||
|
||||
Documentation/Changes
|
||||
This file gives a list of the minimum levels of various software
|
||||
packages that are necessary to build and run the kernel
|
||||
successfully.
|
||||
|
||||
Documentation/CodingStyle
|
||||
This describes the Linux kernel coding style, and some of the
|
||||
rationale behind it. All new code is expected to follow the
|
||||
guidelines in this document. Most maintainers will only accept
|
||||
patches if these rules are followed, and many people will only
|
||||
review code if it is in the proper style.
|
||||
|
||||
Documentation/SubmittingPatches
|
||||
Documentation/SubmittingDrivers
|
||||
These files describe in explicit detail how to successfully create
|
||||
and send a patch, including (but not limited to):
|
||||
- Email contents
|
||||
- Email format
|
||||
- Who to send it to
|
||||
Following these rules will not guarantee success (as all patches are
|
||||
subject to scrutiny for content and style), but not following them
|
||||
will almost always prevent it.
|
||||
|
||||
Other excellent descriptions of how to create patches properly are:
|
||||
"The Perfect Patch"
|
||||
http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt
|
||||
"Linux kernel patch submission format"
|
||||
http://linux.yyz.us/patch-format.html
|
||||
|
||||
Documentation/stable_api_nonsense.txt
|
||||
This file describes the rationale behind the conscious decision to
|
||||
not have a stable API within the kernel, including things like:
|
||||
- Subsystem shim-layers (for compatibility?)
|
||||
- Driver portability between Operating Systems.
|
||||
- Mitigating rapid change within the kernel source tree (or
|
||||
preventing rapid change)
|
||||
This document is crucial for understanding the Linux development
|
||||
philosophy and is very important for people moving to Linux from
|
||||
development on other Operating Systems.
|
||||
|
||||
Documentation/SecurityBugs
|
||||
If you feel you have found a security problem in the Linux kernel,
|
||||
please follow the steps in this document to help notify the kernel
|
||||
developers, and help solve the issue.
|
||||
|
||||
Documentation/ManagementStyle
|
||||
This document describes how Linux kernel maintainers operate and the
|
||||
shared ethos behind their methodologies. This is important reading
|
||||
for anyone new to kernel development (or anyone simply curious about
|
||||
it), as it resolves a lot of common misconceptions and confusion
|
||||
about the unique behavior of kernel maintainers.
|
||||
|
||||
Documentation/stable_kernel_rules.txt
|
||||
This file describes the rules on how the stable kernel releases
|
||||
happen, and what to do if you want to get a change into one of these
|
||||
releases.
|
||||
|
||||
Documentation/kernel-docs.txt
|
||||
A list of external documentation that pertains to kernel
|
||||
development. Please consult this list if you do not find what you
|
||||
are looking for within the in-kernel documentation.
|
||||
|
||||
Documentation/applying-patches.txt
|
||||
A good introduction describing exactly what a patch is and how to
|
||||
apply it to the different development branches of the kernel.
|
||||
|
||||
The kernel also has a large number of documents that can be
|
||||
automatically generated from the source code itself. This includes a
|
||||
full description of the in-kernel API, and rules on how to handle
|
||||
locking properly. The documents will be created in the
|
||||
Documentation/DocBook/ directory and can be generated as PDF,
|
||||
Postscript, HTML, and man pages by running:
|
||||
make pdfdocs
|
||||
make psdocs
|
||||
make htmldocs
|
||||
make mandocs
|
||||
respectively from the main kernel source directory.
|
||||
|
||||
|
||||
Becoming A Kernel Developer
|
||||
---------------------------
|
||||
|
||||
If you do not know anything about Linux kernel development, you should
|
||||
look at the Linux KernelNewbies project:
|
||||
http://kernelnewbies.org
|
||||
It consists of a helpful mailing list where you can ask almost any type
|
||||
of basic kernel development question (make sure to search the archives
|
||||
first, before asking something that has already been answered in the
|
||||
past.) It also has an IRC channel that you can use to ask questions in
|
||||
real-time, and a lot of helpful documentation that is useful for
|
||||
learning about Linux kernel development.
|
||||
|
||||
The website has basic information about code organization, subsystems,
|
||||
and current projects (both in-tree and out-of-tree). It also describes
|
||||
some basic logistical information, like how to compile a kernel and
|
||||
apply a patch.
|
||||
|
||||
If you do not know where you want to start, but you want to look for
|
||||
some task to start doing to join into the kernel development community,
|
||||
go to the Linux Kernel Janitor's project:
|
||||
http://janitor.kernelnewbies.org/
|
||||
It is a great place to start. It describes a list of relatively simple
|
||||
problems that need to be cleaned up and fixed within the Linux kernel
|
||||
source tree. Working with the developers in charge of this project, you
|
||||
will learn the basics of getting your patch into the Linux kernel tree,
|
||||
and possibly be pointed in the direction of what to go work on next, if
|
||||
you do not already have an idea.
|
||||
|
||||
If you already have a chunk of code that you want to put into the kernel
|
||||
tree, but need some help getting it in the proper form, the
|
||||
kernel-mentors project was created to help you out with this. It is a
|
||||
mailing list, and can be found at:
|
||||
http://selenic.com/mailman/listinfo/kernel-mentors
|
||||
|
||||
Before making any actual modifications to the Linux kernel code, it is
|
||||
imperative to understand how the code in question works. For this
|
||||
purpose, nothing is better than reading through it directly (most tricky
|
||||
bits are commented well), perhaps even with the help of specialized
|
||||
tools. One such tool that is particularly recommended is the Linux
|
||||
Cross-Reference project, which is able to present source code in a
|
||||
self-referential, indexed webpage format. An excellent up-to-date
|
||||
repository of the kernel code may be found at:
|
||||
http://sosdg.org/~coywolf/lxr/
|
||||
|
||||
|
||||
The development process
|
||||
-----------------------
|
||||
|
||||
Linux kernel development process currently consists of a few different
|
||||
main kernel "branches" and lots of different subsystem-specific kernel
|
||||
branches. These different branches are:
|
||||
- main 2.6.x kernel tree
|
||||
- 2.6.x.y -stable kernel tree
|
||||
- 2.6.x -git kernel patches
|
||||
- 2.6.x -mm kernel patches
|
||||
- subsystem specific kernel trees and patches
|
||||
|
||||
2.6.x kernel tree
|
||||
-----------------
|
||||
2.6.x kernels are maintained by Linus Torvalds, and can be found on
|
||||
kernel.org in the pub/linux/kernel/v2.6/ directory. Its development
|
||||
process is as follows:
|
||||
- As soon as a new kernel is released a two weeks window is open,
|
||||
during this period of time maintainers can submit big diffs to
|
||||
Linus, usually the patches that have already been included in the
|
||||
-mm kernel for a few weeks. The preferred way to submit big changes
|
||||
is using git (the kernel's source management tool, more information
|
||||
can be found at http://git.or.cz/) but plain patches are also just
|
||||
fine.
|
||||
- After two weeks a -rc1 kernel is released it is now possible to push
|
||||
only patches that do not include new features that could affect the
|
||||
stability of the whole kernel. Please note that a whole new driver
|
||||
(or filesystem) might be accepted after -rc1 because there is no
|
||||
risk of causing regressions with such a change as long as the change
|
||||
is self-contained and does not affect areas outside of the code that
|
||||
is being added. git can be used to send patches to Linus after -rc1
|
||||
is released, but the patches need to also be sent to a public
|
||||
mailing list for review.
|
||||
- A new -rc is released whenever Linus deems the current git tree to
|
||||
be in a reasonably sane state adequate for testing. The goal is to
|
||||
release a new -rc kernel every week.
|
||||
- Process continues until the kernel is considered "ready", the
|
||||
process should last around 6 weeks.
|
||||
|
||||
It is worth mentioning what Andrew Morton wrote on the linux-kernel
|
||||
mailing list about kernel releases:
|
||||
"Nobody knows when a kernel will be released, because it's
|
||||
released according to perceived bug status, not according to a
|
||||
preconceived timeline."
|
||||
|
||||
2.6.x.y -stable kernel tree
|
||||
---------------------------
|
||||
Kernels with 4 digit versions are -stable kernels. They contain
|
||||
relatively small and critical fixes for security problems or significant
|
||||
regressions discovered in a given 2.6.x kernel.
|
||||
|
||||
This is the recommended branch for users who want the most recent stable
|
||||
kernel and are not interested in helping test development/experimental
|
||||
versions.
|
||||
|
||||
If no 2.6.x.y kernel is available, then the highest numbered 2.6.x
|
||||
kernel is the current stable kernel.
|
||||
|
||||
2.6.x.y are maintained by the "stable" team <stable@kernel.org>, and are
|
||||
released almost every other week.
|
||||
|
||||
The file Documentation/stable_kernel_rules.txt in the kernel tree
|
||||
documents what kinds of changes are acceptable for the -stable tree, and
|
||||
how the release process works.
|
||||
|
||||
2.6.x -git patches
|
||||
------------------
|
||||
These are daily snapshots of Linus' kernel tree which are managed in a
|
||||
git repository (hence the name.) These patches are usually released
|
||||
daily and represent the current state of Linus' tree. They are more
|
||||
experimental than -rc kernels since they are generated automatically
|
||||
without even a cursory glance to see if they are sane.
|
||||
|
||||
2.6.x -mm kernel patches
|
||||
------------------------
|
||||
These are experimental kernel patches released by Andrew Morton. Andrew
|
||||
takes all of the different subsystem kernel trees and patches and mushes
|
||||
them together, along with a lot of patches that have been plucked from
|
||||
the linux-kernel mailing list. This tree serves as a proving ground for
|
||||
new features and patches. Once a patch has proved its worth in -mm for
|
||||
a while Andrew or the subsystem maintainer pushes it on to Linus for
|
||||
inclusion in mainline.
|
||||
|
||||
It is heavily encouraged that all new patches get tested in the -mm tree
|
||||
before they are sent to Linus for inclusion in the main kernel tree.
|
||||
|
||||
These kernels are not appropriate for use on systems that are supposed
|
||||
to be stable and they are more risky to run than any of the other
|
||||
branches.
|
||||
|
||||
If you wish to help out with the kernel development process, please test
|
||||
and use these kernel releases and provide feedback to the linux-kernel
|
||||
mailing list if you have any problems, and if everything works properly.
|
||||
|
||||
In addition to all the other experimental patches, these kernels usually
|
||||
also contain any changes in the mainline -git kernels available at the
|
||||
time of release.
|
||||
|
||||
The -mm kernels are not released on a fixed schedule, but usually a few
|
||||
-mm kernels are released in between each -rc kernel (1 to 3 is common).
|
||||
|
||||
Subsystem Specific kernel trees and patches
|
||||
-------------------------------------------
|
||||
A number of the different kernel subsystem developers expose their
|
||||
development trees so that others can see what is happening in the
|
||||
different areas of the kernel. These trees are pulled into the -mm
|
||||
kernel releases as described above.
|
||||
|
||||
Here is a list of some of the different kernel trees available:
|
||||
git trees:
|
||||
- Kbuild development tree, Sam Ravnborg <sam@ravnborg.org>
|
||||
kernel.org:/pub/scm/linux/kernel/git/sam/kbuild.git
|
||||
|
||||
- ACPI development tree, Len Brown <len.brown@intel.com>
|
||||
kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git
|
||||
|
||||
- Block development tree, Jens Axboe <axboe@suse.de>
|
||||
kernel.org:/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git
|
||||
|
||||
- DRM development tree, Dave Airlie <airlied@linux.ie>
|
||||
kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git
|
||||
|
||||
- ia64 development tree, Tony Luck <tony.luck@intel.com>
|
||||
kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6.git
|
||||
|
||||
- ieee1394 development tree, Jody McIntyre <scjody@modernduck.com>
|
||||
kernel.org:/pub/scm/linux/kernel/git/scjody/ieee1394.git
|
||||
|
||||
- infiniband, Roland Dreier <rolandd@cisco.com>
|
||||
kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
|
||||
|
||||
- libata, Jeff Garzik <jgarzik@pobox.com>
|
||||
kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev.git
|
||||
|
||||
- network drivers, Jeff Garzik <jgarzik@pobox.com>
|
||||
kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git
|
||||
|
||||
- pcmcia, Dominik Brodowski <linux@dominikbrodowski.net>
|
||||
kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
|
||||
|
||||
- SCSI, James Bottomley <James.Bottomley@SteelEye.com>
|
||||
kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
|
||||
|
||||
Other git kernel trees can be found listed at http://kernel.org/git
|
||||
|
||||
quilt trees:
|
||||
- USB, PCI, Driver Core, and I2C, Greg Kroah-Hartman <gregkh@suse.de>
|
||||
kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
|
||||
|
||||
|
||||
Bug Reporting
|
||||
-------------
|
||||
|
||||
bugzilla.kernel.org is where the Linux kernel developers track kernel
|
||||
bugs. Users are encouraged to report all bugs that they find in this
|
||||
tool. For details on how to use the kernel bugzilla, please see:
|
||||
http://test.kernel.org/bugzilla/faq.html
|
||||
|
||||
The file REPORTING-BUGS in the main kernel source directory has a good
|
||||
template for how to report a possible kernel bug, and details what kind
|
||||
of information is needed by the kernel developers to help track down the
|
||||
problem.
|
||||
|
||||
|
||||
Mailing lists
|
||||
-------------
|
||||
|
||||
As some of the above documents describe, the majority of the core kernel
|
||||
developers participate on the Linux Kernel Mailing list. Details on how
|
||||
to subscribe and unsubscribe from the list can be found at:
|
||||
http://vger.kernel.org/vger-lists.html#linux-kernel
|
||||
There are archives of the mailing list on the web in many different
|
||||
places. Use a search engine to find these archives. For example:
|
||||
http://dir.gmane.org/gmane.linux.kernel
|
||||
It is highly recommended that you search the archives about the topic
|
||||
you want to bring up, before you post it to the list. A lot of things
|
||||
already discussed in detail are only recorded at the mailing list
|
||||
archives.
|
||||
|
||||
Most of the individual kernel subsystems also have their own separate
|
||||
mailing list where they do their development efforts. See the
|
||||
MAINTAINERS file for a list of what these lists are for the different
|
||||
groups.
|
||||
|
||||
Many of the lists are hosted on kernel.org. Information on them can be
|
||||
found at:
|
||||
http://vger.kernel.org/vger-lists.html
|
||||
|
||||
Please remember to follow good behavioral habits when using the lists.
|
||||
Though a bit cheesy, the following URL has some simple guidelines for
|
||||
interacting with the list (or any list):
|
||||
http://www.albion.com/netiquette/
|
||||
|
||||
If multiple people respond to your mail, the CC: list of recipients may
|
||||
get pretty large. Don't remove anybody from the CC: list without a good
|
||||
reason, or don't reply only to the list address. Get used to receiving the
|
||||
mail twice, one from the sender and the one from the list, and don't try
|
||||
to tune that by adding fancy mail-headers, people will not like it.
|
||||
|
||||
Remember to keep the context and the attribution of your replies intact,
|
||||
keep the "John Kernelhacker wrote ...:" lines at the top of your reply, and
|
||||
add your statements between the individual quoted sections instead of
|
||||
writing at the top of the mail.
|
||||
|
||||
If you add patches to your mail, make sure they are plain readable text
|
||||
as stated in Documentation/SubmittingPatches. Kernel developers don't
|
||||
want to deal with attachments or compressed patches; they may want
|
||||
to comment on individual lines of your patch, which works only that way.
|
||||
Make sure you use a mail program that does not mangle spaces and tab
|
||||
characters. A good first test is to send the mail to yourself and try
|
||||
to apply your own patch by yourself. If that doesn't work, get your
|
||||
mail program fixed or change it until it works.
|
||||
|
||||
Above all, please remember to show respect to other subscribers.
|
||||
|
||||
|
||||
Working with the community
|
||||
--------------------------
|
||||
|
||||
The goal of the kernel community is to provide the best possible kernel
|
||||
there is. When you submit a patch for acceptance, it will be reviewed
|
||||
on its technical merits and those alone. So, what should you be
|
||||
expecting?
|
||||
- criticism
|
||||
- comments
|
||||
- requests for change
|
||||
- requests for justification
|
||||
- silence
|
||||
|
||||
Remember, this is part of getting your patch into the kernel. You have
|
||||
to be able to take criticism and comments about your patches, evaluate
|
||||
them at a technical level and either rework your patches or provide
|
||||
clear and concise reasoning as to why those changes should not be made.
|
||||
If there are no responses to your posting, wait a few days and try
|
||||
again, sometimes things get lost in the huge volume.
|
||||
|
||||
What should you not do?
|
||||
- expect your patch to be accepted without question
|
||||
- become defensive
|
||||
- ignore comments
|
||||
- resubmit the patch without making any of the requested changes
|
||||
|
||||
In a community that is looking for the best technical solution possible,
|
||||
there will always be differing opinions on how beneficial a patch is.
|
||||
You have to be cooperative, and willing to adapt your idea to fit within
|
||||
the kernel. Or at least be willing to prove your idea is worth it.
|
||||
Remember, being wrong is acceptable as long as you are willing to work
|
||||
toward a solution that is right.
|
||||
|
||||
It is normal that the answers to your first patch might simply be a list
|
||||
of a dozen things you should correct. This does _not_ imply that your
|
||||
patch will not be accepted, and it is _not_ meant against you
|
||||
personally. Simply correct all issues raised against your patch and
|
||||
resend it.
|
||||
|
||||
|
||||
Differences between the kernel community and corporate structures
|
||||
-----------------------------------------------------------------
|
||||
|
||||
The kernel community works differently than most traditional corporate
|
||||
development environments. Here are a list of things that you can try to
|
||||
do to try to avoid problems:
|
||||
Good things to say regarding your proposed changes:
|
||||
- "This solves multiple problems."
|
||||
- "This deletes 2000 lines of code."
|
||||
- "Here is a patch that explains what I am trying to describe."
|
||||
- "I tested it on 5 different architectures..."
|
||||
- "Here is a series of small patches that..."
|
||||
- "This increases performance on typical machines..."
|
||||
|
||||
Bad things you should avoid saying:
|
||||
- "We did it this way in AIX/ptx/Solaris, so therefore it must be
|
||||
good..."
|
||||
- "I've being doing this for 20 years, so..."
|
||||
- "This is required for my company to make money"
|
||||
- "This is for our Enterprise product line."
|
||||
- "Here is my 1000 page design document that describes my idea"
|
||||
- "I've been working on this for 6 months..."
|
||||
- "Here's a 5000 line patch that..."
|
||||
- "I rewrote all of the current mess, and here it is..."
|
||||
- "I have a deadline, and this patch needs to be applied now."
|
||||
|
||||
Another way the kernel community is different than most traditional
|
||||
software engineering work environments is the faceless nature of
|
||||
interaction. One benefit of using email and irc as the primary forms of
|
||||
communication is the lack of discrimination based on gender or race.
|
||||
The Linux kernel work environment is accepting of women and minorities
|
||||
because all you are is an email address. The international aspect also
|
||||
helps to level the playing field because you can't guess gender based on
|
||||
a person's name. A man may be named Andrea and a woman may be named Pat.
|
||||
Most women who have worked in the Linux kernel and have expressed an
|
||||
opinion have had positive experiences.
|
||||
|
||||
The language barrier can cause problems for some people who are not
|
||||
comfortable with English. A good grasp of the language can be needed in
|
||||
order to get ideas across properly on mailing lists, so it is
|
||||
recommended that you check your emails to make sure they make sense in
|
||||
English before sending them.
|
||||
|
||||
|
||||
Break up your changes
|
||||
---------------------
|
||||
|
||||
The Linux kernel community does not gladly accept large chunks of code
|
||||
dropped on it all at once. The changes need to be properly introduced,
|
||||
discussed, and broken up into tiny, individual portions. This is almost
|
||||
the exact opposite of what companies are used to doing. Your proposal
|
||||
should also be introduced very early in the development process, so that
|
||||
you can receive feedback on what you are doing. It also lets the
|
||||
community feel that you are working with them, and not simply using them
|
||||
as a dumping ground for your feature. However, don't send 50 emails at
|
||||
one time to a mailing list, your patch series should be smaller than
|
||||
that almost all of the time.
|
||||
|
||||
The reasons for breaking things up are the following:
|
||||
|
||||
1) Small patches increase the likelihood that your patches will be
|
||||
applied, since they don't take much time or effort to verify for
|
||||
correctness. A 5 line patch can be applied by a maintainer with
|
||||
barely a second glance. However, a 500 line patch may take hours to
|
||||
review for correctness (the time it takes is exponentially
|
||||
proportional to the size of the patch, or something).
|
||||
|
||||
Small patches also make it very easy to debug when something goes
|
||||
wrong. It's much easier to back out patches one by one than it is
|
||||
to dissect a very large patch after it's been applied (and broken
|
||||
something).
|
||||
|
||||
2) It's important not only to send small patches, but also to rewrite
|
||||
and simplify (or simply re-order) patches before submitting them.
|
||||
|
||||
Here is an analogy from kernel developer Al Viro:
|
||||
"Think of a teacher grading homework from a math student. The
|
||||
teacher does not want to see the student's trials and errors
|
||||
before they came up with the solution. They want to see the
|
||||
cleanest, most elegant answer. A good student knows this, and
|
||||
would never submit her intermediate work before the final
|
||||
solution."
|
||||
|
||||
The same is true of kernel development. The maintainers and
|
||||
reviewers do not want to see the thought process behind the
|
||||
solution to the problem one is solving. They want to see a
|
||||
simple and elegant solution."
|
||||
|
||||
It may be challenging to keep the balance between presenting an elegant
|
||||
solution and working together with the community and discussing your
|
||||
unfinished work. Therefore it is good to get early in the process to
|
||||
get feedback to improve your work, but also keep your changes in small
|
||||
chunks that they may get already accepted, even when your whole task is
|
||||
not ready for inclusion now.
|
||||
|
||||
Also realize that it is not acceptable to send patches for inclusion
|
||||
that are unfinished and will be "fixed up later."
|
||||
|
||||
|
||||
Justify your change
|
||||
-------------------
|
||||
|
||||
Along with breaking up your patches, it is very important for you to let
|
||||
the Linux community know why they should add this change. New features
|
||||
must be justified as being needed and useful.
|
||||
|
||||
|
||||
Document your change
|
||||
--------------------
|
||||
|
||||
When sending in your patches, pay special attention to what you say in
|
||||
the text in your email. This information will become the ChangeLog
|
||||
information for the patch, and will be preserved for everyone to see for
|
||||
all time. It should describe the patch completely, containing:
|
||||
- why the change is necessary
|
||||
- the overall design approach in the patch
|
||||
- implementation details
|
||||
- testing results
|
||||
|
||||
For more details on what this should all look like, please see the
|
||||
ChangeLog section of the document:
|
||||
"The Perfect Patch"
|
||||
http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt
|
||||
|
||||
|
||||
|
||||
|
||||
All of these things are sometimes very hard to do. It can take years to
|
||||
perfect these practices (if at all). It's a continuous process of
|
||||
improvement that requires a lot of patience and determination. But
|
||||
don't give up, it's possible. Many have done it before, and each had to
|
||||
start exactly where you are now.
|
||||
|
||||
|
||||
|
||||
|
||||
----------
|
||||
Thanks to Paolo Ciarrocchi who allowed the "Development Process" section
|
||||
to be based on text he had written, and to Randy Dunlap and Gerrit
|
||||
Huizenga for some of the list of things you should and should not say.
|
||||
Also thanks to Pat Mochel, Hanna Linder, Randy Dunlap, Kay Sievers,
|
||||
Vojtech Pavlik, Jan Kara, Josh Boyer, Kees Cook, Andrew Morton, Andi
|
||||
Kleen, Vadim Lobanov, Jesper Juhl, Adrian Bunk, Keri Harris, Frans Pop,
|
||||
David A. Wheeler, Junio Hamano, Michael Kerrisk, and Alex Shepard for
|
||||
their review, comments, and contributions. Without their help, this
|
||||
document would not have been possible.
|
||||
|
||||
|
||||
|
||||
Maintainer: Greg Kroah-Hartman <greg@kroah.com>
|
16
MAINTAINERS
16
MAINTAINERS
|
@ -58,6 +58,7 @@ P: Person
|
|||
M: Mail patches to
|
||||
L: Mailing list that is relevant to this area
|
||||
W: Web-page with status/info
|
||||
T: SCM tree type and URL. Type is one of: git, hg, quilt.
|
||||
S: Status, one of the following:
|
||||
|
||||
Supported: Someone is actually paid to look after this.
|
||||
|
@ -183,6 +184,7 @@ P: Len Brown
|
|||
M: len.brown@intel.com
|
||||
L: acpi-devel@lists.sourceforge.net
|
||||
W: http://acpi.sourceforge.net/
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git
|
||||
S: Maintained
|
||||
|
||||
AD1816 SOUND DRIVER
|
||||
|
@ -418,6 +420,7 @@ BLOCK LAYER
|
|||
P: Jens Axboe
|
||||
M: axboe@suse.de
|
||||
L: linux-kernel@vger.kernel.org
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git
|
||||
S: Maintained
|
||||
|
||||
BLUETOOTH SUBSYSTEM
|
||||
|
@ -803,12 +806,14 @@ DRIVER CORE, KOBJECTS, AND SYSFS
|
|||
P: Greg Kroah-Hartman
|
||||
M: gregkh@suse.de
|
||||
L: linux-kernel@vger.kernel.org
|
||||
T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
|
||||
S: Supported
|
||||
|
||||
DRM DRIVERS
|
||||
P: David Airlie
|
||||
M: airlied@linux.ie
|
||||
L: dri-devel@lists.sourceforge.net
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git
|
||||
S: Maintained
|
||||
|
||||
DSCC4 DRIVER
|
||||
|
@ -1113,6 +1118,7 @@ P: Jean Delvare
|
|||
M: khali@linux-fr.org
|
||||
L: lm-sensors@lm-sensors.org
|
||||
W: http://www.lm-sensors.nu/
|
||||
T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
|
||||
S: Maintained
|
||||
|
||||
I2O
|
||||
|
@ -1145,6 +1151,7 @@ P: Tony Luck
|
|||
M: tony.luck@intel.com
|
||||
L: linux-ia64@vger.kernel.org
|
||||
W: http://www.ia64-linux.org/
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6.git
|
||||
S: Maintained
|
||||
|
||||
SN-IA64 (Itanium) SUB-PLATFORM
|
||||
|
@ -1212,6 +1219,7 @@ P: Jody McIntyre
|
|||
M: scjody@steamballoon.com
|
||||
L: linux1394-devel@lists.sourceforge.net
|
||||
W: http://www.linux1394.org/
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/scjody/ieee1394.git
|
||||
S: Maintained
|
||||
|
||||
IEEE 1394 OHCI DRIVER
|
||||
|
@ -1263,6 +1271,7 @@ P: Hal Rosenstock
|
|||
M: halr@voltaire.com
|
||||
L: openib-general@openib.org
|
||||
W: http://www.openib.org/
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
|
||||
S: Supported
|
||||
|
||||
INPUT (KEYBOARD, MOUSE, JOYSTICK) DRIVERS
|
||||
|
@ -1436,6 +1445,7 @@ P: Kai Germaschewski
|
|||
M: kai@germaschewski.name
|
||||
P: Sam Ravnborg
|
||||
M: sam@ravnborg.org
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/sam/kbuild.git
|
||||
S: Maintained
|
||||
|
||||
KERNEL JANITORS
|
||||
|
@ -1782,6 +1792,7 @@ M: akpm@osdl.org
|
|||
P: Jeff Garzik
|
||||
M: jgarzik@pobox.com
|
||||
L: netdev@vger.kernel.org
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git
|
||||
S: Maintained
|
||||
|
||||
NETWORKING [GENERAL]
|
||||
|
@ -1959,6 +1970,7 @@ P: Greg Kroah-Hartman
|
|||
M: gregkh@suse.de
|
||||
L: linux-kernel@vger.kernel.org
|
||||
L: linux-pci@atrey.karlin.mff.cuni.cz
|
||||
T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
|
||||
S: Supported
|
||||
|
||||
PCI HOTPLUG CORE
|
||||
|
@ -1980,6 +1992,7 @@ S: Maintained
|
|||
PCMCIA SUBSYSTEM
|
||||
P: Linux PCMCIA Team
|
||||
L: http://lists.infradead.org/mailman/listinfo/linux-pcmcia
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
|
||||
S: Maintained
|
||||
|
||||
PCNET32 NETWORK DRIVER
|
||||
|
@ -2189,6 +2202,7 @@ SCSI SUBSYSTEM
|
|||
P: James E.J. Bottomley
|
||||
M: James.Bottomley@SteelEye.com
|
||||
L: linux-scsi@vger.kernel.org
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
|
||||
S: Maintained
|
||||
|
||||
SCSI TAPE DRIVER
|
||||
|
@ -2228,6 +2242,7 @@ SERIAL ATA (SATA) SUBSYSTEM:
|
|||
P: Jeff Garzik
|
||||
M: jgarzik@pobox.com
|
||||
L: linux-ide@vger.kernel.org
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev.git
|
||||
S: Supported
|
||||
|
||||
SGI SN-IA64 (Altix) SERIAL CONSOLE DRIVER
|
||||
|
@ -2749,6 +2764,7 @@ M: gregkh@suse.de
|
|||
L: linux-usb-users@lists.sourceforge.net
|
||||
L: linux-usb-devel@lists.sourceforge.net
|
||||
W: http://www.linux-usb.org
|
||||
T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
|
||||
S: Supported
|
||||
|
||||
USB UHCI DRIVER
|
||||
|
|
|
@ -91,16 +91,17 @@ ENTRY(vhpt_miss)
|
|||
* (the "original") TLB miss, which may either be caused by an instruction
|
||||
* fetch or a data access (or non-access).
|
||||
*
|
||||
* What we do here is normal TLB miss handing for the _original_ miss, followed
|
||||
* by inserting the TLB entry for the virtual page table page that the VHPT
|
||||
* walker was attempting to access. The latter gets inserted as long
|
||||
* as both L1 and L2 have valid mappings for the faulting address.
|
||||
* The TLB entry for the original miss gets inserted only if
|
||||
* the L3 entry indicates that the page is present.
|
||||
* What we do here is normal TLB miss handing for the _original_ miss,
|
||||
* followed by inserting the TLB entry for the virtual page table page
|
||||
* that the VHPT walker was attempting to access. The latter gets
|
||||
* inserted as long as page table entry above pte level have valid
|
||||
* mappings for the faulting address. The TLB entry for the original
|
||||
* miss gets inserted only if the pte entry indicates that the page is
|
||||
* present.
|
||||
*
|
||||
* do_page_fault gets invoked in the following cases:
|
||||
* - the faulting virtual address uses unimplemented address bits
|
||||
* - the faulting virtual address has no L1, L2, or L3 mapping
|
||||
* - the faulting virtual address has no valid page table mapping
|
||||
*/
|
||||
mov r16=cr.ifa // get address that caused the TLB miss
|
||||
#ifdef CONFIG_HUGETLB_PAGE
|
||||
|
@ -126,7 +127,7 @@ ENTRY(vhpt_miss)
|
|||
#endif
|
||||
;;
|
||||
cmp.eq p6,p7=5,r17 // is IFA pointing into to region 5?
|
||||
shr.u r18=r22,PGDIR_SHIFT // get bits 33-63 of the faulting address
|
||||
shr.u r18=r22,PGDIR_SHIFT // get bottom portion of pgd index bit
|
||||
;;
|
||||
(p7) dep r17=r17,r19,(PAGE_SHIFT-3),3 // put region number bits in place
|
||||
|
||||
|
@ -137,38 +138,38 @@ ENTRY(vhpt_miss)
|
|||
(p6) shr.u r21=r21,PGDIR_SHIFT+PAGE_SHIFT
|
||||
(p7) shr.u r21=r21,PGDIR_SHIFT+PAGE_SHIFT-3
|
||||
;;
|
||||
(p6) dep r17=r18,r19,3,(PAGE_SHIFT-3) // r17=PTA + IFA(33,42)*8
|
||||
(p7) dep r17=r18,r17,3,(PAGE_SHIFT-6) // r17=PTA + (((IFA(61,63) << 7) | IFA(33,39))*8)
|
||||
(p6) dep r17=r18,r19,3,(PAGE_SHIFT-3) // r17=pgd_offset for region 5
|
||||
(p7) dep r17=r18,r17,3,(PAGE_SHIFT-6) // r17=pgd_offset for region[0-4]
|
||||
cmp.eq p7,p6=0,r21 // unused address bits all zeroes?
|
||||
#ifdef CONFIG_PGTABLE_4
|
||||
shr.u r28=r22,PUD_SHIFT // shift L2 index into position
|
||||
shr.u r28=r22,PUD_SHIFT // shift pud index into position
|
||||
#else
|
||||
shr.u r18=r22,PMD_SHIFT // shift L3 index into position
|
||||
shr.u r18=r22,PMD_SHIFT // shift pmd index into position
|
||||
#endif
|
||||
;;
|
||||
ld8 r17=[r17] // fetch the L1 entry (may be 0)
|
||||
ld8 r17=[r17] // get *pgd (may be 0)
|
||||
;;
|
||||
(p7) cmp.eq p6,p7=r17,r0 // was L1 entry NULL?
|
||||
(p7) cmp.eq p6,p7=r17,r0 // was pgd_present(*pgd) == NULL?
|
||||
#ifdef CONFIG_PGTABLE_4
|
||||
dep r28=r28,r17,3,(PAGE_SHIFT-3) // compute address of L2 page table entry
|
||||
dep r28=r28,r17,3,(PAGE_SHIFT-3) // r28=pud_offset(pgd,addr)
|
||||
;;
|
||||
shr.u r18=r22,PMD_SHIFT // shift L3 index into position
|
||||
(p7) ld8 r29=[r28] // fetch the L2 entry (may be 0)
|
||||
shr.u r18=r22,PMD_SHIFT // shift pmd index into position
|
||||
(p7) ld8 r29=[r28] // get *pud (may be 0)
|
||||
;;
|
||||
(p7) cmp.eq.or.andcm p6,p7=r29,r0 // was L2 entry NULL?
|
||||
dep r17=r18,r29,3,(PAGE_SHIFT-3) // compute address of L3 page table entry
|
||||
(p7) cmp.eq.or.andcm p6,p7=r29,r0 // was pud_present(*pud) == NULL?
|
||||
dep r17=r18,r29,3,(PAGE_SHIFT-3) // r17=pmd_offset(pud,addr)
|
||||
#else
|
||||
dep r17=r18,r17,3,(PAGE_SHIFT-3) // compute address of L3 page table entry
|
||||
dep r17=r18,r17,3,(PAGE_SHIFT-3) // r17=pmd_offset(pgd,addr)
|
||||
#endif
|
||||
;;
|
||||
(p7) ld8 r20=[r17] // fetch the L3 entry (may be 0)
|
||||
shr.u r19=r22,PAGE_SHIFT // shift L4 index into position
|
||||
(p7) ld8 r20=[r17] // get *pmd (may be 0)
|
||||
shr.u r19=r22,PAGE_SHIFT // shift pte index into position
|
||||
;;
|
||||
(p7) cmp.eq.or.andcm p6,p7=r20,r0 // was L3 entry NULL?
|
||||
dep r21=r19,r20,3,(PAGE_SHIFT-3) // compute address of L4 page table entry
|
||||
(p7) cmp.eq.or.andcm p6,p7=r20,r0 // was pmd_present(*pmd) == NULL?
|
||||
dep r21=r19,r20,3,(PAGE_SHIFT-3) // r21=pte_offset(pmd,addr)
|
||||
;;
|
||||
(p7) ld8 r18=[r21] // read the L4 PTE
|
||||
mov r19=cr.isr // cr.isr bit 0 tells us if this is an insn miss
|
||||
(p7) ld8 r18=[r21] // read *pte
|
||||
mov r19=cr.isr // cr.isr bit 32 tells us if this is an insn miss
|
||||
;;
|
||||
(p7) tbit.z p6,p7=r18,_PAGE_P_BIT // page present bit cleared?
|
||||
mov r22=cr.iha // get the VHPT address that caused the TLB miss
|
||||
|
@ -202,25 +203,33 @@ ENTRY(vhpt_miss)
|
|||
dv_serialize_data
|
||||
|
||||
/*
|
||||
* Re-check L2 and L3 pagetable. If they changed, we may have received a ptc.g
|
||||
* Re-check pagetable entry. If they changed, we may have received a ptc.g
|
||||
* between reading the pagetable and the "itc". If so, flush the entry we
|
||||
* inserted and retry.
|
||||
* inserted and retry. At this point, we have:
|
||||
*
|
||||
* r28 = equivalent of pud_offset(pgd, ifa)
|
||||
* r17 = equivalent of pmd_offset(pud, ifa)
|
||||
* r21 = equivalent of pte_offset(pmd, ifa)
|
||||
*
|
||||
* r29 = *pud
|
||||
* r20 = *pmd
|
||||
* r18 = *pte
|
||||
*/
|
||||
ld8 r25=[r21] // read L4 entry again
|
||||
ld8 r26=[r17] // read L3 PTE again
|
||||
ld8 r25=[r21] // read *pte again
|
||||
ld8 r26=[r17] // read *pmd again
|
||||
#ifdef CONFIG_PGTABLE_4
|
||||
ld8 r18=[r28] // read L2 entry again
|
||||
ld8 r19=[r28] // read *pud again
|
||||
#endif
|
||||
cmp.ne p6,p7=r0,r0
|
||||
;;
|
||||
cmp.ne.or.andcm p6,p7=r26,r20 // did L3 entry change
|
||||
cmp.ne.or.andcm p6,p7=r26,r20 // did *pmd change
|
||||
#ifdef CONFIG_PGTABLE_4
|
||||
cmp.ne.or.andcm p6,p7=r29,r18 // did L4 PTE change
|
||||
cmp.ne.or.andcm p6,p7=r19,r29 // did *pud change
|
||||
#endif
|
||||
mov r27=PAGE_SHIFT<<2
|
||||
;;
|
||||
(p6) ptc.l r22,r27 // purge PTE page translation
|
||||
(p7) cmp.ne.or.andcm p6,p7=r25,r18 // did L4 PTE change
|
||||
(p7) cmp.ne.or.andcm p6,p7=r25,r18 // did *pte change
|
||||
;;
|
||||
(p6) ptc.l r16,r27 // purge translation
|
||||
#endif
|
||||
|
@ -235,19 +244,19 @@ END(vhpt_miss)
|
|||
ENTRY(itlb_miss)
|
||||
DBG_FAULT(1)
|
||||
/*
|
||||
* The ITLB handler accesses the L3 PTE via the virtually mapped linear
|
||||
* The ITLB handler accesses the PTE via the virtually mapped linear
|
||||
* page table. If a nested TLB miss occurs, we switch into physical
|
||||
* mode, walk the page table, and then re-execute the L3 PTE read
|
||||
* and go on normally after that.
|
||||
* mode, walk the page table, and then re-execute the PTE read and
|
||||
* go on normally after that.
|
||||
*/
|
||||
mov r16=cr.ifa // get virtual address
|
||||
mov r29=b0 // save b0
|
||||
mov r31=pr // save predicates
|
||||
.itlb_fault:
|
||||
mov r17=cr.iha // get virtual address of L3 PTE
|
||||
mov r17=cr.iha // get virtual address of PTE
|
||||
movl r30=1f // load nested fault continuation point
|
||||
;;
|
||||
1: ld8 r18=[r17] // read L3 PTE
|
||||
1: ld8 r18=[r17] // read *pte
|
||||
;;
|
||||
mov b0=r29
|
||||
tbit.z p6,p0=r18,_PAGE_P_BIT // page present bit cleared?
|
||||
|
@ -262,7 +271,7 @@ ENTRY(itlb_miss)
|
|||
*/
|
||||
dv_serialize_data
|
||||
|
||||
ld8 r19=[r17] // read L3 PTE again and see if same
|
||||
ld8 r19=[r17] // read *pte again and see if same
|
||||
mov r20=PAGE_SHIFT<<2 // setup page size for purge
|
||||
;;
|
||||
cmp.ne p7,p0=r18,r19
|
||||
|
@ -279,19 +288,19 @@ END(itlb_miss)
|
|||
ENTRY(dtlb_miss)
|
||||
DBG_FAULT(2)
|
||||
/*
|
||||
* The DTLB handler accesses the L3 PTE via the virtually mapped linear
|
||||
* The DTLB handler accesses the PTE via the virtually mapped linear
|
||||
* page table. If a nested TLB miss occurs, we switch into physical
|
||||
* mode, walk the page table, and then re-execute the L3 PTE read
|
||||
* and go on normally after that.
|
||||
* mode, walk the page table, and then re-execute the PTE read and
|
||||
* go on normally after that.
|
||||
*/
|
||||
mov r16=cr.ifa // get virtual address
|
||||
mov r29=b0 // save b0
|
||||
mov r31=pr // save predicates
|
||||
dtlb_fault:
|
||||
mov r17=cr.iha // get virtual address of L3 PTE
|
||||
mov r17=cr.iha // get virtual address of PTE
|
||||
movl r30=1f // load nested fault continuation point
|
||||
;;
|
||||
1: ld8 r18=[r17] // read L3 PTE
|
||||
1: ld8 r18=[r17] // read *pte
|
||||
;;
|
||||
mov b0=r29
|
||||
tbit.z p6,p0=r18,_PAGE_P_BIT // page present bit cleared?
|
||||
|
@ -306,7 +315,7 @@ dtlb_fault:
|
|||
*/
|
||||
dv_serialize_data
|
||||
|
||||
ld8 r19=[r17] // read L3 PTE again and see if same
|
||||
ld8 r19=[r17] // read *pte again and see if same
|
||||
mov r20=PAGE_SHIFT<<2 // setup page size for purge
|
||||
;;
|
||||
cmp.ne p7,p0=r18,r19
|
||||
|
@ -420,7 +429,7 @@ ENTRY(nested_dtlb_miss)
|
|||
* r30: continuation address
|
||||
* r31: saved pr
|
||||
*
|
||||
* Output: r17: physical address of L3 PTE of faulting address
|
||||
* Output: r17: physical address of PTE of faulting address
|
||||
* r29: saved b0
|
||||
* r30: continuation address
|
||||
* r31: saved pr
|
||||
|
@ -450,33 +459,33 @@ ENTRY(nested_dtlb_miss)
|
|||
(p6) shr.u r21=r21,PGDIR_SHIFT+PAGE_SHIFT
|
||||
(p7) shr.u r21=r21,PGDIR_SHIFT+PAGE_SHIFT-3
|
||||
;;
|
||||
(p6) dep r17=r18,r19,3,(PAGE_SHIFT-3) // r17=PTA + IFA(33,42)*8
|
||||
(p7) dep r17=r18,r17,3,(PAGE_SHIFT-6) // r17=PTA + (((IFA(61,63) << 7) | IFA(33,39))*8)
|
||||
(p6) dep r17=r18,r19,3,(PAGE_SHIFT-3) // r17=pgd_offset for region 5
|
||||
(p7) dep r17=r18,r17,3,(PAGE_SHIFT-6) // r17=pgd_offset for region[0-4]
|
||||
cmp.eq p7,p6=0,r21 // unused address bits all zeroes?
|
||||
#ifdef CONFIG_PGTABLE_4
|
||||
shr.u r18=r22,PUD_SHIFT // shift L2 index into position
|
||||
shr.u r18=r22,PUD_SHIFT // shift pud index into position
|
||||
#else
|
||||
shr.u r18=r22,PMD_SHIFT // shift L3 index into position
|
||||
shr.u r18=r22,PMD_SHIFT // shift pmd index into position
|
||||
#endif
|
||||
;;
|
||||
ld8 r17=[r17] // fetch the L1 entry (may be 0)
|
||||
ld8 r17=[r17] // get *pgd (may be 0)
|
||||
;;
|
||||
(p7) cmp.eq p6,p7=r17,r0 // was L1 entry NULL?
|
||||
dep r17=r18,r17,3,(PAGE_SHIFT-3) // compute address of L2 page table entry
|
||||
(p7) cmp.eq p6,p7=r17,r0 // was pgd_present(*pgd) == NULL?
|
||||
dep r17=r18,r17,3,(PAGE_SHIFT-3) // r17=p[u|m]d_offset(pgd,addr)
|
||||
;;
|
||||
#ifdef CONFIG_PGTABLE_4
|
||||
(p7) ld8 r17=[r17] // fetch the L2 entry (may be 0)
|
||||
shr.u r18=r22,PMD_SHIFT // shift L3 index into position
|
||||
(p7) ld8 r17=[r17] // get *pud (may be 0)
|
||||
shr.u r18=r22,PMD_SHIFT // shift pmd index into position
|
||||
;;
|
||||
(p7) cmp.eq.or.andcm p6,p7=r17,r0 // was L2 entry NULL?
|
||||
dep r17=r18,r17,3,(PAGE_SHIFT-3) // compute address of L2 page table entry
|
||||
(p7) cmp.eq.or.andcm p6,p7=r17,r0 // was pud_present(*pud) == NULL?
|
||||
dep r17=r18,r17,3,(PAGE_SHIFT-3) // r17=pmd_offset(pud,addr)
|
||||
;;
|
||||
#endif
|
||||
(p7) ld8 r17=[r17] // fetch the L3 entry (may be 0)
|
||||
shr.u r19=r22,PAGE_SHIFT // shift L4 index into position
|
||||
(p7) ld8 r17=[r17] // get *pmd (may be 0)
|
||||
shr.u r19=r22,PAGE_SHIFT // shift pte index into position
|
||||
;;
|
||||
(p7) cmp.eq.or.andcm p6,p7=r17,r0 // was L3 entry NULL?
|
||||
dep r17=r19,r17,3,(PAGE_SHIFT-3) // compute address of L4 page table entry
|
||||
(p7) cmp.eq.or.andcm p6,p7=r17,r0 // was pmd_present(*pmd) == NULL?
|
||||
dep r17=r19,r17,3,(PAGE_SHIFT-3) // r17=pte_offset(pmd,addr);
|
||||
(p6) br.cond.spnt page_fault
|
||||
mov b0=r30
|
||||
br.sptk.many b0 // return to continuation point
|
||||
|
|
|
@ -598,19 +598,6 @@ config ARCH_MEMORY_PROBE
|
|||
def_bool y
|
||||
depends on MEMORY_HOTPLUG
|
||||
|
||||
# Some NUMA nodes have memory ranges that span
|
||||
# other nodes. Even though a pfn is valid and
|
||||
# between a node's start and end pfns, it may not
|
||||
# reside on that node.
|
||||
#
|
||||
# This is a relatively temporary hack that should
|
||||
# be able to go away when sparsemem is fully in
|
||||
# place
|
||||
|
||||
config NODES_SPAN_OTHER_NODES
|
||||
def_bool y
|
||||
depends on NEED_MULTIPLE_NODES
|
||||
|
||||
config PPC_64K_PAGES
|
||||
bool "64k page size"
|
||||
depends on PPC64
|
||||
|
|
|
@ -33,6 +33,8 @@ endif
|
|||
|
||||
export CROSS32CC CROSS32AS CROSS32LD CROSS32OBJCOPY
|
||||
|
||||
KBUILD_DEFCONFIG := $(shell uname -m)_defconfig
|
||||
|
||||
ifeq ($(CONFIG_PPC64),y)
|
||||
OLDARCH := ppc64
|
||||
SZ := 64
|
||||
|
@ -111,9 +113,6 @@ cpu-as-$(CONFIG_E200) += -Wa,-me200
|
|||
AFLAGS += $(cpu-as-y)
|
||||
CFLAGS += $(cpu-as-y)
|
||||
|
||||
# Default to the common case.
|
||||
KBUILD_DEFCONFIG := common_defconfig
|
||||
|
||||
head-y := arch/powerpc/kernel/head_32.o
|
||||
head-$(CONFIG_PPC64) := arch/powerpc/kernel/head_64.o
|
||||
head-$(CONFIG_8xx) := arch/powerpc/kernel/head_8xx.o
|
||||
|
@ -125,11 +124,11 @@ head-$(CONFIG_PPC64) += arch/powerpc/kernel/entry_64.o
|
|||
head-$(CONFIG_PPC_FPU) += arch/powerpc/kernel/fpu.o
|
||||
|
||||
core-y += arch/powerpc/kernel/ \
|
||||
arch/$(OLDARCH)/kernel/ \
|
||||
arch/powerpc/mm/ \
|
||||
arch/powerpc/lib/ \
|
||||
arch/powerpc/sysdev/ \
|
||||
arch/powerpc/platforms/
|
||||
core-$(CONFIG_PPC32) += arch/ppc/kernel/
|
||||
core-$(CONFIG_MATH_EMULATION) += arch/ppc/math-emu/
|
||||
core-$(CONFIG_XMON) += arch/powerpc/xmon/
|
||||
core-$(CONFIG_APUS) += arch/ppc/amiga/
|
||||
|
@ -165,7 +164,7 @@ define archhelp
|
|||
@echo ' (your) ~/bin/installkernel or'
|
||||
@echo ' (distribution) /sbin/installkernel or'
|
||||
@echo ' install to $$(INSTALL_PATH) and run lilo'
|
||||
@echo ' *_defconfig - Select default config from arch/$(ARCH)/ppc/configs'
|
||||
@echo ' *_defconfig - Select default config from arch/$(ARCH)/configs'
|
||||
endef
|
||||
|
||||
archclean:
|
||||
|
|
|
@ -14,43 +14,42 @@
|
|||
.text
|
||||
.globl _zimage_start
|
||||
_zimage_start:
|
||||
bl reloc_offset
|
||||
bl 1f
|
||||
|
||||
reloc_offset:
|
||||
1:
|
||||
mflr r0
|
||||
lis r9,reloc_offset@ha
|
||||
addi r9,r9,reloc_offset@l
|
||||
lis r9,1b@ha
|
||||
addi r9,r9,1b@l
|
||||
subf. r0,r9,r0
|
||||
beq clear_caches
|
||||
beq 3f
|
||||
|
||||
reloc_got2:
|
||||
lis r9,__got2_start@ha
|
||||
addi r9,r9,__got2_start@l
|
||||
lis r8,__got2_end@ha
|
||||
addi r8,r8,__got2_end@l
|
||||
subf. r8,r9,r8
|
||||
beq clear_caches
|
||||
beq 3f
|
||||
srwi. r8,r8,2
|
||||
mtctr r8
|
||||
add r9,r0,r9
|
||||
reloc_got2_loop:
|
||||
2:
|
||||
lwz r8,0(r9)
|
||||
add r8,r8,r0
|
||||
stw r8,0(r9)
|
||||
addi r9,r9,4
|
||||
bdnz reloc_got2_loop
|
||||
bdnz 2b
|
||||
|
||||
clear_caches:
|
||||
3:
|
||||
lis r9,_start@h
|
||||
add r9,r0,r9
|
||||
lis r8,_etext@ha
|
||||
addi r8,r8,_etext@l
|
||||
add r8,r0,r8
|
||||
1: dcbf r0,r9
|
||||
4: dcbf r0,r9
|
||||
icbi r0,r9
|
||||
addi r9,r9,0x20
|
||||
cmplwi 0,r9,8
|
||||
blt 1b
|
||||
blt 4b
|
||||
sync
|
||||
isync
|
||||
|
||||
|
|
|
@ -1,18 +1,33 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.14-rc4
|
||||
# Thu Oct 20 08:28:33 2005
|
||||
# Linux kernel version: 2.6.15-rc1
|
||||
# Fri Nov 18 16:23:24 2005
|
||||
#
|
||||
CONFIG_PPC64=y
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_PPC_MERGE=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_ISA_DMA=y
|
||||
CONFIG_PPC=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_COMPAT=y
|
||||
CONFIG_SYSVIPC_COMPAT=y
|
||||
CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
|
||||
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
|
||||
CONFIG_FORCE_MAX_ZONEORDER=13
|
||||
|
||||
#
|
||||
# Processor support
|
||||
#
|
||||
# CONFIG_POWER4_ONLY is not set
|
||||
CONFIG_POWER3=y
|
||||
CONFIG_POWER4=y
|
||||
CONFIG_PPC_FPU=y
|
||||
CONFIG_ALTIVEC=y
|
||||
CONFIG_PPC_STD_MMU=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=32
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
|
@ -41,7 +56,7 @@ CONFIG_CPUSETS=y
|
|||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
CONFIG_KALLSYMS_ALL=y
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
|
@ -67,78 +82,115 @@ CONFIG_MODVERSIONS=y
|
|||
CONFIG_MODULE_SRCVERSION_ALL=y
|
||||
CONFIG_KMOD=y
|
||||
CONFIG_STOP_MACHINE=y
|
||||
CONFIG_SYSVIPC_COMPAT=y
|
||||
|
||||
#
|
||||
# Block layer
|
||||
#
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
CONFIG_DEFAULT_AS=y
|
||||
# CONFIG_DEFAULT_DEADLINE is not set
|
||||
# CONFIG_DEFAULT_CFQ is not set
|
||||
# CONFIG_DEFAULT_NOOP is not set
|
||||
CONFIG_DEFAULT_IOSCHED="anticipatory"
|
||||
|
||||
#
|
||||
# Platform support
|
||||
#
|
||||
# CONFIG_PPC_ISERIES is not set
|
||||
CONFIG_PPC_MULTIPLATFORM=y
|
||||
# CONFIG_PPC_ISERIES is not set
|
||||
# CONFIG_EMBEDDED6xx is not set
|
||||
# CONFIG_APUS is not set
|
||||
CONFIG_PPC_PSERIES=y
|
||||
CONFIG_PPC_BPA=y
|
||||
CONFIG_PPC_PMAC=y
|
||||
CONFIG_PPC_PMAC64=y
|
||||
CONFIG_PPC_MAPLE=y
|
||||
CONFIG_PPC=y
|
||||
CONFIG_PPC64=y
|
||||
# CONFIG_PPC_CELL is not set
|
||||
CONFIG_PPC_OF=y
|
||||
CONFIG_XICS=y
|
||||
CONFIG_MPIC=y
|
||||
CONFIG_BPA_IIC=y
|
||||
CONFIG_ALTIVEC=y
|
||||
CONFIG_PPC_SPLPAR=y
|
||||
CONFIG_KEXEC=y
|
||||
CONFIG_IBMVIO=y
|
||||
CONFIG_U3_DART=y
|
||||
CONFIG_MPIC=y
|
||||
CONFIG_PPC_RTAS=y
|
||||
CONFIG_RTAS_ERROR_LOGGING=y
|
||||
CONFIG_RTAS_PROC=y
|
||||
CONFIG_RTAS_FLASH=m
|
||||
# CONFIG_MMIO_NVRAM is not set
|
||||
CONFIG_MPIC_BROKEN_U3=y
|
||||
CONFIG_PPC_PMAC64=y
|
||||
CONFIG_BOOTX_TEXT=y
|
||||
# CONFIG_POWER4_ONLY is not set
|
||||
CONFIG_IOMMU_VMERGE=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=32
|
||||
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_ARCH_FLATMEM_ENABLE=y
|
||||
CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
|
||||
CONFIG_ARCH_DISCONTIGMEM_DEFAULT=y
|
||||
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
# CONFIG_FLATMEM_MANUAL is not set
|
||||
CONFIG_DISCONTIGMEM_MANUAL=y
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_DISCONTIGMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
CONFIG_NEED_MULTIPLE_NODES=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y
|
||||
CONFIG_NODES_SPAN_OTHER_NODES=y
|
||||
# CONFIG_NUMA is not set
|
||||
# CONFIG_SCHED_SMT is not set
|
||||
CONFIG_PREEMPT_NONE=y
|
||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_PREEMPT_BKL is not set
|
||||
CONFIG_IBMVIO=y
|
||||
# CONFIG_PPC_MPC106 is not set
|
||||
CONFIG_GENERIC_TBSYNC=y
|
||||
CONFIG_CPU_FREQ=y
|
||||
CONFIG_CPU_FREQ_TABLE=y
|
||||
# CONFIG_CPU_FREQ_DEBUG is not set
|
||||
CONFIG_CPU_FREQ_STAT=y
|
||||
# CONFIG_CPU_FREQ_STAT_DETAILS is not set
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
|
||||
# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
|
||||
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
||||
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
|
||||
CONFIG_CPU_FREQ_GOV_USERSPACE=y
|
||||
# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set
|
||||
# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
|
||||
CONFIG_CPU_FREQ_PMAC64=y
|
||||
# CONFIG_WANT_EARLY_SERIAL is not set
|
||||
|
||||
#
|
||||
# Kernel options
|
||||
#
|
||||
# CONFIG_HZ_100 is not set
|
||||
CONFIG_HZ_250=y
|
||||
# CONFIG_HZ_1000 is not set
|
||||
CONFIG_HZ=250
|
||||
CONFIG_EEH=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_PPC_RTAS=y
|
||||
CONFIG_RTAS_PROC=y
|
||||
CONFIG_RTAS_FLASH=m
|
||||
CONFIG_SCANLOG=m
|
||||
CONFIG_LPARCFG=y
|
||||
CONFIG_SECCOMP=y
|
||||
CONFIG_PREEMPT_NONE=y
|
||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_PREEMPT_BKL is not set
|
||||
CONFIG_BINFMT_ELF=y
|
||||
CONFIG_BINFMT_MISC=m
|
||||
CONFIG_FORCE_MAX_ZONEORDER=13
|
||||
CONFIG_IOMMU_VMERGE=y
|
||||
CONFIG_HOTPLUG_CPU=y
|
||||
CONFIG_KEXEC=y
|
||||
CONFIG_IRQ_ALL_CPUS=y
|
||||
CONFIG_PPC_SPLPAR=y
|
||||
CONFIG_EEH=y
|
||||
CONFIG_SCANLOG=m
|
||||
CONFIG_LPARCFG=y
|
||||
# CONFIG_NUMA is not set
|
||||
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_ARCH_FLATMEM_ENABLE=y
|
||||
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
# CONFIG_FLATMEM_MANUAL is not set
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
CONFIG_SPARSEMEM_MANUAL=y
|
||||
CONFIG_SPARSEMEM=y
|
||||
CONFIG_HAVE_MEMORY_PRESENT=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPARSEMEM_EXTREME=y
|
||||
# CONFIG_MEMORY_HOTPLUG is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4096
|
||||
# CONFIG_PPC_64K_PAGES is not set
|
||||
# CONFIG_SCHED_SMT is not set
|
||||
CONFIG_PROC_DEVICETREE=y
|
||||
# CONFIG_CMDLINE_BOOL is not set
|
||||
# CONFIG_PM is not set
|
||||
CONFIG_SECCOMP=y
|
||||
CONFIG_ISA_DMA_API=y
|
||||
|
||||
#
|
||||
# Bus Options
|
||||
# Bus options
|
||||
#
|
||||
CONFIG_GENERIC_ISA_DMA=y
|
||||
CONFIG_PPC_I8259=y
|
||||
# CONFIG_PPC_INDIRECT_PCI is not set
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
# CONFIG_PCI_LEGACY_PROC is not set
|
||||
|
@ -158,6 +210,7 @@ CONFIG_HOTPLUG_PCI=m
|
|||
# CONFIG_HOTPLUG_PCI_SHPC is not set
|
||||
CONFIG_HOTPLUG_PCI_RPA=m
|
||||
CONFIG_HOTPLUG_PCI_RPA_DLPAR=m
|
||||
CONFIG_KERNEL_START=0xc000000000000000
|
||||
|
||||
#
|
||||
# Networking
|
||||
|
@ -199,6 +252,10 @@ CONFIG_TCP_CONG_BIC=y
|
|||
# CONFIG_IPV6 is not set
|
||||
CONFIG_NETFILTER=y
|
||||
# CONFIG_NETFILTER_DEBUG is not set
|
||||
|
||||
#
|
||||
# Core Netfilter Configuration
|
||||
#
|
||||
CONFIG_NETFILTER_NETLINK=y
|
||||
CONFIG_NETFILTER_NETLINK_QUEUE=m
|
||||
CONFIG_NETFILTER_NETLINK_LOG=m
|
||||
|
@ -301,6 +358,10 @@ CONFIG_LLC=y
|
|||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
CONFIG_NET_CLS_ROUTE=y
|
||||
|
||||
|
@ -338,13 +399,7 @@ CONFIG_FW_LOADER=y
|
|||
#
|
||||
# Parallel port support
|
||||
#
|
||||
CONFIG_PARPORT=m
|
||||
CONFIG_PARPORT_PC=m
|
||||
# CONFIG_PARPORT_SERIAL is not set
|
||||
# CONFIG_PARPORT_PC_FIFO is not set
|
||||
# CONFIG_PARPORT_PC_SUPERIO is not set
|
||||
# CONFIG_PARPORT_GSC is not set
|
||||
# CONFIG_PARPORT_1284 is not set
|
||||
# CONFIG_PARPORT is not set
|
||||
|
||||
#
|
||||
# Plug and Play support
|
||||
|
@ -354,7 +409,6 @@ CONFIG_PARPORT_PC=m
|
|||
# Block devices
|
||||
#
|
||||
CONFIG_BLK_DEV_FD=y
|
||||
# CONFIG_PARIDE is not set
|
||||
# CONFIG_BLK_CPQ_DA is not set
|
||||
# CONFIG_BLK_CPQ_CISS_DA is not set
|
||||
# CONFIG_BLK_DEV_DAC960 is not set
|
||||
|
@ -370,14 +424,6 @@ CONFIG_BLK_DEV_RAM_COUNT=16
|
|||
CONFIG_BLK_DEV_RAM_SIZE=65536
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
||||
#
|
||||
|
@ -407,7 +453,7 @@ CONFIG_IDEPCI_SHARE_IRQ=y
|
|||
# CONFIG_BLK_DEV_OFFBOARD is not set
|
||||
CONFIG_BLK_DEV_GENERIC=y
|
||||
# CONFIG_BLK_DEV_OPTI621 is not set
|
||||
CONFIG_BLK_DEV_SL82C105=y
|
||||
# CONFIG_BLK_DEV_SL82C105 is not set
|
||||
CONFIG_BLK_DEV_IDEDMA_PCI=y
|
||||
# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
|
||||
CONFIG_IDEDMA_PCI_AUTO=y
|
||||
|
@ -479,6 +525,7 @@ CONFIG_SCSI_ISCSI_ATTRS=m
|
|||
#
|
||||
# SCSI low-level drivers
|
||||
#
|
||||
# CONFIG_ISCSI_TCP is not set
|
||||
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
|
||||
# CONFIG_SCSI_3W_9XXX is not set
|
||||
# CONFIG_SCSI_ACARD is not set
|
||||
|
@ -495,10 +542,12 @@ CONFIG_SCSI_SATA_SVW=y
|
|||
# CONFIG_SCSI_ATA_PIIX is not set
|
||||
# CONFIG_SCSI_SATA_MV is not set
|
||||
# CONFIG_SCSI_SATA_NV is not set
|
||||
# CONFIG_SCSI_SATA_PROMISE is not set
|
||||
# CONFIG_SCSI_PDC_ADMA is not set
|
||||
# CONFIG_SCSI_SATA_QSTOR is not set
|
||||
# CONFIG_SCSI_SATA_PROMISE is not set
|
||||
# CONFIG_SCSI_SATA_SX4 is not set
|
||||
# CONFIG_SCSI_SATA_SIL is not set
|
||||
# CONFIG_SCSI_SATA_SIL24 is not set
|
||||
# CONFIG_SCSI_SATA_SIS is not set
|
||||
# CONFIG_SCSI_SATA_ULI is not set
|
||||
# CONFIG_SCSI_SATA_VIA is not set
|
||||
|
@ -512,8 +561,6 @@ CONFIG_SCSI_SATA_SVW=y
|
|||
CONFIG_SCSI_IBMVSCSI=y
|
||||
# CONFIG_SCSI_INITIO is not set
|
||||
# CONFIG_SCSI_INIA100 is not set
|
||||
# CONFIG_SCSI_PPA is not set
|
||||
# CONFIG_SCSI_IMM is not set
|
||||
CONFIG_SCSI_SYM53C8XX_2=y
|
||||
CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
|
||||
CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
|
||||
|
@ -608,6 +655,9 @@ CONFIG_IEEE1394_AMDTP=m
|
|||
CONFIG_ADB_PMU=y
|
||||
CONFIG_PMAC_SMU=y
|
||||
CONFIG_THERM_PM72=y
|
||||
CONFIG_WINDFARM=y
|
||||
CONFIG_WINDFARM_PM81=y
|
||||
CONFIG_WINDFARM_PM91=y
|
||||
|
||||
#
|
||||
# Network device support
|
||||
|
@ -664,7 +714,6 @@ CONFIG_E100=y
|
|||
# CONFIG_EPIC100 is not set
|
||||
# CONFIG_SUNDANCE is not set
|
||||
# CONFIG_VIA_RHINE is not set
|
||||
# CONFIG_NET_POCKET is not set
|
||||
|
||||
#
|
||||
# Ethernet (1000 Mbit)
|
||||
|
@ -684,7 +733,6 @@ CONFIG_E1000=y
|
|||
# CONFIG_VIA_VELOCITY is not set
|
||||
CONFIG_TIGON3=y
|
||||
# CONFIG_BNX2 is not set
|
||||
# CONFIG_SPIDER_NET is not set
|
||||
# CONFIG_MV643XX_ETH is not set
|
||||
|
||||
#
|
||||
|
@ -714,7 +762,6 @@ CONFIG_IBMOL=y
|
|||
# CONFIG_WAN is not set
|
||||
# CONFIG_FDDI is not set
|
||||
# CONFIG_HIPPI is not set
|
||||
# CONFIG_PLIP is not set
|
||||
CONFIG_PPP=m
|
||||
# CONFIG_PPP_MULTILINK is not set
|
||||
# CONFIG_PPP_FILTER is not set
|
||||
|
@ -722,6 +769,7 @@ CONFIG_PPP_ASYNC=m
|
|||
CONFIG_PPP_SYNC_TTY=m
|
||||
CONFIG_PPP_DEFLATE=m
|
||||
CONFIG_PPP_BSDCOMP=m
|
||||
# CONFIG_PPP_MPPE is not set
|
||||
CONFIG_PPPOE=m
|
||||
# CONFIG_SLIP is not set
|
||||
# CONFIG_NET_FC is not set
|
||||
|
@ -784,7 +832,6 @@ CONFIG_INPUT_PCSPKR=m
|
|||
CONFIG_SERIO=y
|
||||
CONFIG_SERIO_I8042=y
|
||||
# CONFIG_SERIO_SERPORT is not set
|
||||
# CONFIG_SERIO_PARKBD is not set
|
||||
# CONFIG_SERIO_PCIPS2 is not set
|
||||
CONFIG_SERIO_LIBPS2=y
|
||||
# CONFIG_SERIO_RAW is not set
|
||||
|
@ -817,10 +864,6 @@ CONFIG_SERIAL_JSM=m
|
|||
CONFIG_UNIX98_PTYS=y
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=256
|
||||
CONFIG_PRINTER=m
|
||||
# CONFIG_LP_CONSOLE is not set
|
||||
# CONFIG_PPDEV is not set
|
||||
# CONFIG_TIPAR is not set
|
||||
CONFIG_HVC_CONSOLE=y
|
||||
CONFIG_HVCS=m
|
||||
|
||||
|
@ -834,6 +877,7 @@ CONFIG_HVCS=m
|
|||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_RTC is not set
|
||||
# CONFIG_GEN_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
|
@ -851,6 +895,7 @@ CONFIG_MAX_RAW_DEVS=256
|
|||
# TPM devices
|
||||
#
|
||||
# CONFIG_TCG_TPM is not set
|
||||
# CONFIG_TELCLOCK is not set
|
||||
|
||||
#
|
||||
# I2C support
|
||||
|
@ -879,7 +924,6 @@ CONFIG_I2C_AMD8111=y
|
|||
CONFIG_I2C_KEYWEST=y
|
||||
CONFIG_I2C_PMAC_SMU=y
|
||||
# CONFIG_I2C_NFORCE2 is not set
|
||||
# CONFIG_I2C_PARPORT is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_PROSAVAGE is not set
|
||||
# CONFIG_I2C_SAVAGE4 is not set
|
||||
|
@ -904,6 +948,7 @@ CONFIG_I2C_PMAC_SMU=y
|
|||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_RTC8564 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
# CONFIG_RTC_X1205_I2C is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
|
@ -945,7 +990,6 @@ 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=y
|
||||
CONFIG_FB_MODE_HELPERS=y
|
||||
CONFIG_FB_TILEBLITTING=y
|
||||
|
@ -960,6 +1004,7 @@ CONFIG_FB_OF=y
|
|||
# CONFIG_FB_ASILIANT is not set
|
||||
# CONFIG_FB_IMSTT is not set
|
||||
# CONFIG_FB_VGA16 is not set
|
||||
# CONFIG_FB_S1D13XXX is not set
|
||||
# CONFIG_FB_NVIDIA is not set
|
||||
# CONFIG_FB_RIVA is not set
|
||||
CONFIG_FB_MATROX=y
|
||||
|
@ -983,7 +1028,6 @@ CONFIG_FB_RADEON_I2C=y
|
|||
# CONFIG_FB_VOODOO1 is not set
|
||||
# CONFIG_FB_CYBLA is not set
|
||||
# CONFIG_FB_TRIDENT is not set
|
||||
# CONFIG_FB_S1D13XXX is not set
|
||||
# CONFIG_FB_VIRTUAL is not set
|
||||
|
||||
#
|
||||
|
@ -992,6 +1036,7 @@ CONFIG_FB_RADEON_I2C=y
|
|||
# CONFIG_VGA_CONSOLE is not set
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
|
||||
# CONFIG_FONTS is not set
|
||||
CONFIG_FONT_8x8=y
|
||||
CONFIG_FONT_8x16=y
|
||||
|
@ -1012,7 +1057,94 @@ CONFIG_LCD_DEVICE=y
|
|||
#
|
||||
# Sound
|
||||
#
|
||||
# CONFIG_SOUND is not set
|
||||
CONFIG_SOUND=m
|
||||
|
||||
#
|
||||
# Advanced Linux Sound Architecture
|
||||
#
|
||||
CONFIG_SND=m
|
||||
CONFIG_SND_TIMER=m
|
||||
CONFIG_SND_PCM=m
|
||||
CONFIG_SND_SEQUENCER=m
|
||||
CONFIG_SND_SEQ_DUMMY=m
|
||||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=m
|
||||
CONFIG_SND_PCM_OSS=m
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
# CONFIG_SND_VERBOSE_PRINTK is not set
|
||||
# CONFIG_SND_DEBUG is not set
|
||||
CONFIG_SND_GENERIC_DRIVER=y
|
||||
|
||||
#
|
||||
# Generic devices
|
||||
#
|
||||
# CONFIG_SND_DUMMY is not set
|
||||
# CONFIG_SND_VIRMIDI is not set
|
||||
# CONFIG_SND_MTPAV is not set
|
||||
# CONFIG_SND_SERIAL_U16550 is not set
|
||||
# CONFIG_SND_MPU401 is not set
|
||||
|
||||
#
|
||||
# PCI devices
|
||||
#
|
||||
# CONFIG_SND_ALI5451 is not set
|
||||
# CONFIG_SND_ATIIXP is not set
|
||||
# CONFIG_SND_ATIIXP_MODEM is not set
|
||||
# CONFIG_SND_AU8810 is not set
|
||||
# CONFIG_SND_AU8820 is not set
|
||||
# CONFIG_SND_AU8830 is not set
|
||||
# CONFIG_SND_AZT3328 is not set
|
||||
# CONFIG_SND_BT87X is not set
|
||||
# CONFIG_SND_CS46XX is not set
|
||||
# CONFIG_SND_CS4281 is not set
|
||||
# CONFIG_SND_EMU10K1 is not set
|
||||
# CONFIG_SND_EMU10K1X is not set
|
||||
# CONFIG_SND_CA0106 is not set
|
||||
# CONFIG_SND_KORG1212 is not set
|
||||
# CONFIG_SND_MIXART is not set
|
||||
# CONFIG_SND_NM256 is not set
|
||||
# CONFIG_SND_RME32 is not set
|
||||
# CONFIG_SND_RME96 is not set
|
||||
# CONFIG_SND_RME9652 is not set
|
||||
# CONFIG_SND_HDSP is not set
|
||||
# CONFIG_SND_HDSPM is not set
|
||||
# CONFIG_SND_TRIDENT is not set
|
||||
# CONFIG_SND_YMFPCI is not set
|
||||
# CONFIG_SND_AD1889 is not set
|
||||
# CONFIG_SND_ALS4000 is not set
|
||||
# CONFIG_SND_CMIPCI is not set
|
||||
# CONFIG_SND_ENS1370 is not set
|
||||
# CONFIG_SND_ENS1371 is not set
|
||||
# CONFIG_SND_ES1938 is not set
|
||||
# CONFIG_SND_ES1968 is not set
|
||||
# CONFIG_SND_MAESTRO3 is not set
|
||||
# CONFIG_SND_FM801 is not set
|
||||
# CONFIG_SND_ICE1712 is not set
|
||||
# CONFIG_SND_ICE1724 is not set
|
||||
# CONFIG_SND_INTEL8X0 is not set
|
||||
# CONFIG_SND_INTEL8X0M is not set
|
||||
# CONFIG_SND_SONICVIBES is not set
|
||||
# CONFIG_SND_VIA82XX is not set
|
||||
# CONFIG_SND_VIA82XX_MODEM is not set
|
||||
# CONFIG_SND_VX222 is not set
|
||||
# CONFIG_SND_HDA_INTEL is not set
|
||||
|
||||
#
|
||||
# ALSA PowerMac devices
|
||||
#
|
||||
CONFIG_SND_POWERMAC=m
|
||||
CONFIG_SND_POWERMAC_AUTO_DRC=y
|
||||
|
||||
#
|
||||
# USB devices
|
||||
#
|
||||
# CONFIG_SND_USB_AUDIO is not set
|
||||
# CONFIG_SND_USB_USX2Y is not set
|
||||
|
||||
#
|
||||
# Open Sound System
|
||||
#
|
||||
# CONFIG_SOUND_PRIME is not set
|
||||
|
||||
#
|
||||
# USB support
|
||||
|
@ -1046,12 +1178,16 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
|
|||
#
|
||||
# USB Device Class drivers
|
||||
#
|
||||
# CONFIG_USB_BLUETOOTH_TTY is not set
|
||||
# CONFIG_OBSOLETE_OSS_USB_DRIVER is not set
|
||||
# CONFIG_USB_ACM is not set
|
||||
# CONFIG_USB_PRINTER is not set
|
||||
|
||||
#
|
||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
|
||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
||||
#
|
||||
|
||||
#
|
||||
# may also be needed; see USB_STORAGE Help for more information
|
||||
#
|
||||
CONFIG_USB_STORAGE=m
|
||||
# CONFIG_USB_STORAGE_DEBUG is not set
|
||||
|
@ -1106,7 +1242,7 @@ CONFIG_USB_HIDDEV=y
|
|||
#
|
||||
# CONFIG_USB_CATC is not set
|
||||
# CONFIG_USB_KAWETH is not set
|
||||
CONFIG_USB_PEGASUS=y
|
||||
# CONFIG_USB_PEGASUS is not set
|
||||
# CONFIG_USB_RTL8150 is not set
|
||||
# CONFIG_USB_USBNET is not set
|
||||
# CONFIG_USB_MON is not set
|
||||
|
@ -1114,7 +1250,6 @@ CONFIG_USB_PEGASUS=y
|
|||
#
|
||||
# USB port drivers
|
||||
#
|
||||
# CONFIG_USB_USS720 is not set
|
||||
|
||||
#
|
||||
# USB Serial Converter support
|
||||
|
@ -1163,6 +1298,7 @@ CONFIG_INFINIBAND_MTHCA=m
|
|||
# CONFIG_INFINIBAND_MTHCA_DEBUG is not set
|
||||
CONFIG_INFINIBAND_IPOIB=m
|
||||
# CONFIG_INFINIBAND_IPOIB_DEBUG is not set
|
||||
# CONFIG_INFINIBAND_SRP is not set
|
||||
|
||||
#
|
||||
# SN Devices
|
||||
|
@ -1358,10 +1494,25 @@ CONFIG_NLS_KOI8_U=m
|
|||
CONFIG_NLS_UTF8=m
|
||||
|
||||
#
|
||||
# Profiling support
|
||||
# Library routines
|
||||
#
|
||||
CONFIG_CRC_CCITT=m
|
||||
# CONFIG_CRC16 is not set
|
||||
CONFIG_CRC32=y
|
||||
CONFIG_LIBCRC32C=m
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZLIB_DEFLATE=m
|
||||
CONFIG_TEXTSEARCH=y
|
||||
CONFIG_TEXTSEARCH_KMP=m
|
||||
CONFIG_TEXTSEARCH_BM=m
|
||||
CONFIG_TEXTSEARCH_FSM=m
|
||||
|
||||
#
|
||||
# Instrumentation Support
|
||||
#
|
||||
CONFIG_PROFILING=y
|
||||
CONFIG_OPROFILE=y
|
||||
# CONFIG_KPROBES is not set
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
|
@ -1378,14 +1529,15 @@ CONFIG_DETECT_SOFTLOCKUP=y
|
|||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
CONFIG_DEBUG_STACKOVERFLOW=y
|
||||
# CONFIG_KPROBES is not set
|
||||
CONFIG_DEBUG_STACK_USAGE=y
|
||||
CONFIG_DEBUGGER=y
|
||||
CONFIG_XMON=y
|
||||
# CONFIG_XMON_DEFAULT is not set
|
||||
# CONFIG_PPCDBG is not set
|
||||
CONFIG_IRQSTACKS=y
|
||||
CONFIG_BOOTX_TEXT=y
|
||||
|
||||
#
|
||||
# Security options
|
||||
|
@ -1425,17 +1577,3 @@ CONFIG_CRYPTO_TEST=m
|
|||
#
|
||||
# Hardware crypto devices
|
||||
#
|
||||
|
||||
#
|
||||
# Library routines
|
||||
#
|
||||
CONFIG_CRC_CCITT=m
|
||||
# CONFIG_CRC16 is not set
|
||||
CONFIG_CRC32=y
|
||||
CONFIG_LIBCRC32C=m
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZLIB_DEFLATE=m
|
||||
CONFIG_TEXTSEARCH=y
|
||||
CONFIG_TEXTSEARCH_KMP=m
|
||||
CONFIG_TEXTSEARCH_BM=m
|
||||
CONFIG_TEXTSEARCH_FSM=m
|
|
@ -165,7 +165,6 @@ CONFIG_SPARSEMEM_EXTREME=y
|
|||
# CONFIG_MEMORY_HOTPLUG is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4096
|
||||
CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y
|
||||
CONFIG_NODES_SPAN_OTHER_NODES=y
|
||||
# CONFIG_PPC_64K_PAGES is not set
|
||||
CONFIG_SCHED_SMT=y
|
||||
CONFIG_PROC_DEVICETREE=y
|
||||
|
|
|
@ -12,12 +12,12 @@ CFLAGS_btext.o += -fPIC
|
|||
endif
|
||||
|
||||
obj-y := semaphore.o cputable.o ptrace.o syscalls.o \
|
||||
irq.o signal_32.o pmc.o vdso.o
|
||||
irq.o align.o signal_32.o pmc.o vdso.o
|
||||
obj-y += vdso32/
|
||||
obj-$(CONFIG_PPC64) += setup_64.o binfmt_elf32.o sys_ppc32.o \
|
||||
signal_64.o ptrace32.o systbl.o \
|
||||
paca.o ioctl32.o cpu_setup_power4.o \
|
||||
firmware.o sysfs.o udbg.o
|
||||
firmware.o sysfs.o udbg.o idle_64.o
|
||||
obj-$(CONFIG_PPC64) += vdso64/
|
||||
obj-$(CONFIG_ALTIVEC) += vecemu.o vector.o
|
||||
obj-$(CONFIG_POWER4) += idle_power4.o
|
||||
|
@ -35,6 +35,7 @@ obj-$(CONFIG_PPC_PSERIES) += udbg_16550.o
|
|||
obj-$(CONFIG_PPC_MAPLE) += udbg_16550.o
|
||||
udbgscc-$(CONFIG_PPC64) := udbg_scc.o
|
||||
obj-$(CONFIG_PPC_PMAC) += $(udbgscc-y)
|
||||
obj64-$(CONFIG_PPC_MULTIPLATFORM) += nvram_64.o
|
||||
|
||||
ifeq ($(CONFIG_PPC_MERGE),y)
|
||||
|
||||
|
@ -78,5 +79,7 @@ smpobj-$(CONFIG_SMP) += smp.o
|
|||
|
||||
endif
|
||||
|
||||
obj-$(CONFIG_PPC64) += $(obj64-y)
|
||||
|
||||
extra-$(CONFIG_PPC_FPU) += fpu.o
|
||||
extra-$(CONFIG_PPC64) += entry_64.o
|
||||
|
|
|
@ -7,6 +7,9 @@
|
|||
* PowerPC 403GCX/405GP modifications.
|
||||
* Copyright (c) 2001-2002 PPC64 team, IBM Corp
|
||||
* 64-bit and Power4 support
|
||||
* Copyright (c) 2005 Benjamin Herrenschmidt, IBM Corp
|
||||
* <benh@kernel.crashing.org>
|
||||
* Merge ppc32 and ppc64 implementations
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -38,10 +41,15 @@ struct aligninfo {
|
|||
#define F 8 /* to/from fp regs */
|
||||
#define U 0x10 /* update index register */
|
||||
#define M 0x20 /* multiple load/store */
|
||||
#define SW 0x40 /* byte swap */
|
||||
#define SW 0x40 /* byte swap int or ... */
|
||||
#define S 0x40 /* ... single-precision fp */
|
||||
#define SX 0x40 /* byte count in XER */
|
||||
#define HARD 0x80 /* string, stwcx. */
|
||||
|
||||
#define DCBZ 0x5f /* 8xx/82xx dcbz faults when cache not enabled */
|
||||
|
||||
#define SWAP(a, b) (t = (a), (a) = (b), (b) = t)
|
||||
|
||||
/*
|
||||
* The PowerPC stores certain bits of the instruction that caused the
|
||||
* alignment exception in the DSISR register. This array maps those
|
||||
|
@ -57,14 +65,14 @@ static struct aligninfo aligninfo[128] = {
|
|||
{ 2, LD+SE }, /* 00 0 0101: lha */
|
||||
{ 2, ST }, /* 00 0 0110: sth */
|
||||
{ 4, LD+M }, /* 00 0 0111: lmw */
|
||||
{ 4, LD+F }, /* 00 0 1000: lfs */
|
||||
{ 4, LD+F+S }, /* 00 0 1000: lfs */
|
||||
{ 8, LD+F }, /* 00 0 1001: lfd */
|
||||
{ 4, ST+F }, /* 00 0 1010: stfs */
|
||||
{ 4, ST+F+S }, /* 00 0 1010: stfs */
|
||||
{ 8, ST+F }, /* 00 0 1011: stfd */
|
||||
INVALID, /* 00 0 1100 */
|
||||
{ 8, LD }, /* 00 0 1101: ld */
|
||||
{ 8, LD }, /* 00 0 1101: ld/ldu/lwa */
|
||||
INVALID, /* 00 0 1110 */
|
||||
{ 8, ST }, /* 00 0 1111: std */
|
||||
{ 8, ST }, /* 00 0 1111: std/stdu */
|
||||
{ 4, LD+U }, /* 00 1 0000: lwzu */
|
||||
INVALID, /* 00 1 0001 */
|
||||
{ 4, ST+U }, /* 00 1 0010: stwu */
|
||||
|
@ -73,9 +81,9 @@ static struct aligninfo aligninfo[128] = {
|
|||
{ 2, LD+SE+U }, /* 00 1 0101: lhau */
|
||||
{ 2, ST+U }, /* 00 1 0110: sthu */
|
||||
{ 4, ST+M }, /* 00 1 0111: stmw */
|
||||
{ 4, LD+F+U }, /* 00 1 1000: lfsu */
|
||||
{ 4, LD+F+S+U }, /* 00 1 1000: lfsu */
|
||||
{ 8, LD+F+U }, /* 00 1 1001: lfdu */
|
||||
{ 4, ST+F+U }, /* 00 1 1010: stfsu */
|
||||
{ 4, ST+F+S+U }, /* 00 1 1010: stfsu */
|
||||
{ 8, ST+F+U }, /* 00 1 1011: stfdu */
|
||||
INVALID, /* 00 1 1100 */
|
||||
INVALID, /* 00 1 1101 */
|
||||
|
@ -89,10 +97,10 @@ static struct aligninfo aligninfo[128] = {
|
|||
{ 4, LD+SE }, /* 01 0 0101: lwax */
|
||||
INVALID, /* 01 0 0110 */
|
||||
INVALID, /* 01 0 0111 */
|
||||
{ 0, LD }, /* 01 0 1000: lswx */
|
||||
{ 0, LD }, /* 01 0 1001: lswi */
|
||||
{ 0, ST }, /* 01 0 1010: stswx */
|
||||
{ 0, ST }, /* 01 0 1011: stswi */
|
||||
{ 4, LD+M+HARD+SX }, /* 01 0 1000: lswx */
|
||||
{ 4, LD+M+HARD }, /* 01 0 1001: lswi */
|
||||
{ 4, ST+M+HARD+SX }, /* 01 0 1010: stswx */
|
||||
{ 4, ST+M+HARD }, /* 01 0 1011: stswi */
|
||||
INVALID, /* 01 0 1100 */
|
||||
{ 8, LD+U }, /* 01 0 1101: ldu */
|
||||
INVALID, /* 01 0 1110 */
|
||||
|
@ -115,7 +123,7 @@ static struct aligninfo aligninfo[128] = {
|
|||
INVALID, /* 01 1 1111 */
|
||||
INVALID, /* 10 0 0000 */
|
||||
INVALID, /* 10 0 0001 */
|
||||
{ 0, ST }, /* 10 0 0010: stwcx. */
|
||||
INVALID, /* 10 0 0010: stwcx. */
|
||||
INVALID, /* 10 0 0011 */
|
||||
INVALID, /* 10 0 0100 */
|
||||
INVALID, /* 10 0 0101 */
|
||||
|
@ -144,7 +152,7 @@ static struct aligninfo aligninfo[128] = {
|
|||
INVALID, /* 10 1 1100 */
|
||||
INVALID, /* 10 1 1101 */
|
||||
INVALID, /* 10 1 1110 */
|
||||
{ L1_CACHE_BYTES, ST }, /* 10 1 1111: dcbz */
|
||||
{ 0, ST+HARD }, /* 10 1 1111: dcbz */
|
||||
{ 4, LD }, /* 11 0 0000: lwzx */
|
||||
INVALID, /* 11 0 0001 */
|
||||
{ 4, ST }, /* 11 0 0010: stwx */
|
||||
|
@ -153,9 +161,9 @@ static struct aligninfo aligninfo[128] = {
|
|||
{ 2, LD+SE }, /* 11 0 0101: lhax */
|
||||
{ 2, ST }, /* 11 0 0110: sthx */
|
||||
INVALID, /* 11 0 0111 */
|
||||
{ 4, LD+F }, /* 11 0 1000: lfsx */
|
||||
{ 4, LD+F+S }, /* 11 0 1000: lfsx */
|
||||
{ 8, LD+F }, /* 11 0 1001: lfdx */
|
||||
{ 4, ST+F }, /* 11 0 1010: stfsx */
|
||||
{ 4, ST+F+S }, /* 11 0 1010: stfsx */
|
||||
{ 8, ST+F }, /* 11 0 1011: stfdx */
|
||||
INVALID, /* 11 0 1100 */
|
||||
{ 8, LD+M }, /* 11 0 1101: lmd */
|
||||
|
@ -169,9 +177,9 @@ static struct aligninfo aligninfo[128] = {
|
|||
{ 2, LD+SE+U }, /* 11 1 0101: lhaux */
|
||||
{ 2, ST+U }, /* 11 1 0110: sthux */
|
||||
INVALID, /* 11 1 0111 */
|
||||
{ 4, LD+F+U }, /* 11 1 1000: lfsux */
|
||||
{ 4, LD+F+S+U }, /* 11 1 1000: lfsux */
|
||||
{ 8, LD+F+U }, /* 11 1 1001: lfdux */
|
||||
{ 4, ST+F+U }, /* 11 1 1010: stfsux */
|
||||
{ 4, ST+F+S+U }, /* 11 1 1010: stfsux */
|
||||
{ 8, ST+F+U }, /* 11 1 1011: stfdux */
|
||||
INVALID, /* 11 1 1100 */
|
||||
INVALID, /* 11 1 1101 */
|
||||
|
@ -179,45 +187,175 @@ static struct aligninfo aligninfo[128] = {
|
|||
INVALID, /* 11 1 1111 */
|
||||
};
|
||||
|
||||
#define SWAP(a, b) (t = (a), (a) = (b), (b) = t)
|
||||
|
||||
/*
|
||||
* Create a DSISR value from the instruction
|
||||
*/
|
||||
static inline unsigned make_dsisr(unsigned instr)
|
||||
{
|
||||
unsigned dsisr;
|
||||
|
||||
/* create a DSISR value from the instruction */
|
||||
dsisr = (instr & 0x03ff0000) >> 16; /* bits 6:15 --> 22:31 */
|
||||
|
||||
if ( IS_XFORM(instr) ) {
|
||||
dsisr |= (instr & 0x00000006) << 14; /* bits 29:30 --> 15:16 */
|
||||
dsisr |= (instr & 0x00000040) << 8; /* bit 25 --> 17 */
|
||||
dsisr |= (instr & 0x00000780) << 3; /* bits 21:24 --> 18:21 */
|
||||
|
||||
|
||||
/* bits 6:15 --> 22:31 */
|
||||
dsisr = (instr & 0x03ff0000) >> 16;
|
||||
|
||||
if (IS_XFORM(instr)) {
|
||||
/* bits 29:30 --> 15:16 */
|
||||
dsisr |= (instr & 0x00000006) << 14;
|
||||
/* bit 25 --> 17 */
|
||||
dsisr |= (instr & 0x00000040) << 8;
|
||||
/* bits 21:24 --> 18:21 */
|
||||
dsisr |= (instr & 0x00000780) << 3;
|
||||
} else {
|
||||
/* bit 5 --> 17 */
|
||||
dsisr |= (instr & 0x04000000) >> 12;
|
||||
/* bits 1: 4 --> 18:21 */
|
||||
dsisr |= (instr & 0x78000000) >> 17;
|
||||
/* bits 30:31 --> 12:13 */
|
||||
if (IS_DSFORM(instr))
|
||||
dsisr |= (instr & 0x00000003) << 18;
|
||||
}
|
||||
else {
|
||||
dsisr |= (instr & 0x04000000) >> 12; /* bit 5 --> 17 */
|
||||
dsisr |= (instr & 0x78000000) >> 17; /* bits 1: 4 --> 18:21 */
|
||||
if ( IS_DSFORM(instr) ) {
|
||||
dsisr |= (instr & 0x00000003) << 18; /* bits 30:31 --> 12:13 */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return dsisr;
|
||||
}
|
||||
|
||||
int
|
||||
fix_alignment(struct pt_regs *regs)
|
||||
/*
|
||||
* The dcbz (data cache block zero) instruction
|
||||
* gives an alignment fault if used on non-cacheable
|
||||
* memory. We handle the fault mainly for the
|
||||
* case when we are running with the cache disabled
|
||||
* for debugging.
|
||||
*/
|
||||
static int emulate_dcbz(struct pt_regs *regs, unsigned char __user *addr)
|
||||
{
|
||||
long __user *p;
|
||||
int i, size;
|
||||
|
||||
#ifdef __powerpc64__
|
||||
size = ppc64_caches.dline_size;
|
||||
#else
|
||||
size = L1_CACHE_BYTES;
|
||||
#endif
|
||||
p = (long __user *) (regs->dar & -size);
|
||||
if (user_mode(regs) && !access_ok(VERIFY_WRITE, p, size))
|
||||
return -EFAULT;
|
||||
for (i = 0; i < size / sizeof(long); ++i)
|
||||
if (__put_user(0, p+i))
|
||||
return -EFAULT;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Emulate load & store multiple instructions
|
||||
* On 64-bit machines, these instructions only affect/use the
|
||||
* bottom 4 bytes of each register, and the loads clear the
|
||||
* top 4 bytes of the affected register.
|
||||
*/
|
||||
#ifdef CONFIG_PPC64
|
||||
#define REG_BYTE(rp, i) *((u8 *)((rp) + ((i) >> 2)) + ((i) & 3) + 4)
|
||||
#else
|
||||
#define REG_BYTE(rp, i) *((u8 *)(rp) + (i))
|
||||
#endif
|
||||
|
||||
static int emulate_multiple(struct pt_regs *regs, unsigned char __user *addr,
|
||||
unsigned int reg, unsigned int nb,
|
||||
unsigned int flags, unsigned int instr)
|
||||
{
|
||||
unsigned long *rptr;
|
||||
unsigned int nb0, i;
|
||||
|
||||
/*
|
||||
* We do not try to emulate 8 bytes multiple as they aren't really
|
||||
* available in our operating environments and we don't try to
|
||||
* emulate multiples operations in kernel land as they should never
|
||||
* be used/generated there at least not on unaligned boundaries
|
||||
*/
|
||||
if (unlikely((nb > 4) || !user_mode(regs)))
|
||||
return 0;
|
||||
|
||||
/* lmw, stmw, lswi/x, stswi/x */
|
||||
nb0 = 0;
|
||||
if (flags & HARD) {
|
||||
if (flags & SX) {
|
||||
nb = regs->xer & 127;
|
||||
if (nb == 0)
|
||||
return 1;
|
||||
} else {
|
||||
if (__get_user(instr,
|
||||
(unsigned int __user *)regs->nip))
|
||||
return -EFAULT;
|
||||
nb = (instr >> 11) & 0x1f;
|
||||
if (nb == 0)
|
||||
nb = 32;
|
||||
}
|
||||
if (nb + reg * 4 > 128) {
|
||||
nb0 = nb + reg * 4 - 128;
|
||||
nb = 128 - reg * 4;
|
||||
}
|
||||
} else {
|
||||
/* lwm, stmw */
|
||||
nb = (32 - reg) * 4;
|
||||
}
|
||||
|
||||
if (!access_ok((flags & ST ? VERIFY_WRITE: VERIFY_READ), addr, nb+nb0))
|
||||
return -EFAULT; /* bad address */
|
||||
|
||||
rptr = ®s->gpr[reg];
|
||||
if (flags & LD) {
|
||||
/*
|
||||
* This zeroes the top 4 bytes of the affected registers
|
||||
* in 64-bit mode, and also zeroes out any remaining
|
||||
* bytes of the last register for lsw*.
|
||||
*/
|
||||
memset(rptr, 0, ((nb + 3) / 4) * sizeof(unsigned long));
|
||||
if (nb0 > 0)
|
||||
memset(®s->gpr[0], 0,
|
||||
((nb0 + 3) / 4) * sizeof(unsigned long));
|
||||
|
||||
for (i = 0; i < nb; ++i)
|
||||
if (__get_user(REG_BYTE(rptr, i), addr + i))
|
||||
return -EFAULT;
|
||||
if (nb0 > 0) {
|
||||
rptr = ®s->gpr[0];
|
||||
addr += nb;
|
||||
for (i = 0; i < nb0; ++i)
|
||||
if (__get_user(REG_BYTE(rptr, i), addr + i))
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
} else {
|
||||
for (i = 0; i < nb; ++i)
|
||||
if (__put_user(REG_BYTE(rptr, i), addr + i))
|
||||
return -EFAULT;
|
||||
if (nb0 > 0) {
|
||||
rptr = ®s->gpr[0];
|
||||
addr += nb;
|
||||
for (i = 0; i < nb0; ++i)
|
||||
if (__put_user(REG_BYTE(rptr, i), addr + i))
|
||||
return -EFAULT;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Called on alignment exception. Attempts to fixup
|
||||
*
|
||||
* Return 1 on success
|
||||
* Return 0 if unable to handle the interrupt
|
||||
* Return -EFAULT if data address is bad
|
||||
*/
|
||||
|
||||
int fix_alignment(struct pt_regs *regs)
|
||||
{
|
||||
unsigned int instr, nb, flags;
|
||||
int t;
|
||||
unsigned long reg, areg;
|
||||
unsigned long i;
|
||||
int ret;
|
||||
unsigned dsisr;
|
||||
unsigned int reg, areg;
|
||||
unsigned int dsisr;
|
||||
unsigned char __user *addr;
|
||||
unsigned char __user *p;
|
||||
unsigned long __user *lp;
|
||||
int ret, t;
|
||||
union {
|
||||
long ll;
|
||||
u64 ll;
|
||||
double dd;
|
||||
unsigned char v[8];
|
||||
struct {
|
||||
|
@ -231,18 +369,22 @@ fix_alignment(struct pt_regs *regs)
|
|||
} data;
|
||||
|
||||
/*
|
||||
* Return 1 on success
|
||||
* Return 0 if unable to handle the interrupt
|
||||
* Return -EFAULT if data address is bad
|
||||
* We require a complete register set, if not, then our assembly
|
||||
* is broken
|
||||
*/
|
||||
CHECK_FULL_REGS(regs);
|
||||
|
||||
dsisr = regs->dsisr;
|
||||
|
||||
/* Some processors don't provide us with a DSISR we can use here,
|
||||
* let's make one up from the instruction
|
||||
*/
|
||||
if (cpu_has_feature(CPU_FTR_NODSISRALIGN)) {
|
||||
unsigned int real_instr;
|
||||
if (__get_user(real_instr, (unsigned int __user *)regs->nip))
|
||||
return 0;
|
||||
dsisr = make_dsisr(real_instr);
|
||||
unsigned int real_instr;
|
||||
if (unlikely(__get_user(real_instr,
|
||||
(unsigned int __user *)regs->nip)))
|
||||
return -EFAULT;
|
||||
dsisr = make_dsisr(real_instr);
|
||||
}
|
||||
|
||||
/* extract the operation and registers from the dsisr */
|
||||
|
@ -258,33 +400,37 @@ fix_alignment(struct pt_regs *regs)
|
|||
/* DAR has the operand effective address */
|
||||
addr = (unsigned char __user *)regs->dar;
|
||||
|
||||
/* A size of 0 indicates an instruction we don't support */
|
||||
/* we also don't support the multiples (lmw, stmw, lmd, stmd) */
|
||||
if ((nb == 0) || (flags & M))
|
||||
return 0; /* too hard or invalid instruction */
|
||||
|
||||
/*
|
||||
* Special handling for dcbz
|
||||
* dcbz may give an alignment exception for accesses to caching inhibited
|
||||
* storage
|
||||
/* A size of 0 indicates an instruction we don't support, with
|
||||
* the exception of DCBZ which is handled as a special case here
|
||||
*/
|
||||
if (instr == DCBZ)
|
||||
addr = (unsigned char __user *) ((unsigned long)addr & -L1_CACHE_BYTES);
|
||||
return emulate_dcbz(regs, addr);
|
||||
if (unlikely(nb == 0))
|
||||
return 0;
|
||||
|
||||
/* Load/Store Multiple instructions are handled in their own
|
||||
* function
|
||||
*/
|
||||
if (flags & M)
|
||||
return emulate_multiple(regs, addr, reg, nb, flags, instr);
|
||||
|
||||
/* Verify the address of the operand */
|
||||
if (user_mode(regs)) {
|
||||
if (!access_ok((flags & ST? VERIFY_WRITE: VERIFY_READ), addr, nb))
|
||||
return -EFAULT; /* bad address */
|
||||
}
|
||||
if (unlikely(user_mode(regs) &&
|
||||
!access_ok((flags & ST ? VERIFY_WRITE : VERIFY_READ),
|
||||
addr, nb)))
|
||||
return -EFAULT;
|
||||
|
||||
/* Force the fprs into the save area so we can reference them */
|
||||
if (flags & F) {
|
||||
if (!user_mode(regs))
|
||||
/* userland only */
|
||||
if (unlikely(!user_mode(regs)))
|
||||
return 0;
|
||||
flush_fp_to_thread(current);
|
||||
}
|
||||
|
||||
/* If we are loading, get the data from user space */
|
||||
|
||||
/* If we are loading, get the data from user space, else
|
||||
* get it from register values
|
||||
*/
|
||||
if (flags & LD) {
|
||||
data.ll = 0;
|
||||
ret = 0;
|
||||
|
@ -301,75 +447,62 @@ fix_alignment(struct pt_regs *regs)
|
|||
case 2:
|
||||
ret |= __get_user(data.v[6], p++);
|
||||
ret |= __get_user(data.v[7], p++);
|
||||
if (ret)
|
||||
if (unlikely(ret))
|
||||
return -EFAULT;
|
||||
}
|
||||
}
|
||||
|
||||
/* If we are storing, get the data from the saved gpr or fpr */
|
||||
if (flags & ST) {
|
||||
if (flags & F) {
|
||||
if (nb == 4) {
|
||||
/* Doing stfs, have to convert to single */
|
||||
preempt_disable();
|
||||
enable_kernel_fp();
|
||||
cvt_df(¤t->thread.fpr[reg], (float *)&data.v[4], ¤t->thread);
|
||||
disable_kernel_fp();
|
||||
preempt_enable();
|
||||
}
|
||||
else
|
||||
data.dd = current->thread.fpr[reg];
|
||||
}
|
||||
else
|
||||
data.ll = regs->gpr[reg];
|
||||
}
|
||||
|
||||
/* Swap bytes as needed */
|
||||
if (flags & SW) {
|
||||
if (nb == 2)
|
||||
SWAP(data.v[6], data.v[7]);
|
||||
else { /* nb must be 4 */
|
||||
SWAP(data.v[4], data.v[7]);
|
||||
SWAP(data.v[5], data.v[6]);
|
||||
}
|
||||
}
|
||||
|
||||
/* Sign extend as needed */
|
||||
if (flags & SE) {
|
||||
} else if (flags & F)
|
||||
data.dd = current->thread.fpr[reg];
|
||||
else
|
||||
data.ll = regs->gpr[reg];
|
||||
|
||||
/* Perform other misc operations like sign extension, byteswap,
|
||||
* or floating point single precision conversion
|
||||
*/
|
||||
switch (flags & ~U) {
|
||||
case LD+SE: /* sign extend */
|
||||
if ( nb == 2 )
|
||||
data.ll = data.x16.low16;
|
||||
else /* nb must be 4 */
|
||||
data.ll = data.x32.low32;
|
||||
}
|
||||
|
||||
/* If we are loading, move the data to the gpr or fpr */
|
||||
if (flags & LD) {
|
||||
if (flags & F) {
|
||||
if (nb == 4) {
|
||||
/* Doing lfs, have to convert to double */
|
||||
preempt_disable();
|
||||
enable_kernel_fp();
|
||||
cvt_fd((float *)&data.v[4], ¤t->thread.fpr[reg], ¤t->thread);
|
||||
disable_kernel_fp();
|
||||
preempt_enable();
|
||||
}
|
||||
else
|
||||
current->thread.fpr[reg] = data.dd;
|
||||
break;
|
||||
case LD+S: /* byte-swap */
|
||||
case ST+S:
|
||||
if (nb == 2) {
|
||||
SWAP(data.v[6], data.v[7]);
|
||||
} else {
|
||||
SWAP(data.v[4], data.v[7]);
|
||||
SWAP(data.v[5], data.v[6]);
|
||||
}
|
||||
else
|
||||
regs->gpr[reg] = data.ll;
|
||||
break;
|
||||
|
||||
/* Single-precision FP load and store require conversions... */
|
||||
case LD+F+S:
|
||||
#ifdef CONFIG_PPC_FPU
|
||||
preempt_disable();
|
||||
enable_kernel_fp();
|
||||
cvt_fd((float *)&data.v[4], &data.dd, ¤t->thread);
|
||||
preempt_enable();
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
break;
|
||||
case ST+F+S:
|
||||
#ifdef CONFIG_PPC_FPU
|
||||
preempt_disable();
|
||||
enable_kernel_fp();
|
||||
cvt_df(&data.dd, (float *)&data.v[4], ¤t->thread);
|
||||
preempt_enable();
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
/* If we are storing, copy the data to the user */
|
||||
|
||||
/* Store result to memory or update registers */
|
||||
if (flags & ST) {
|
||||
ret = 0;
|
||||
p = addr;
|
||||
switch (nb) {
|
||||
case 128: /* Special case - must be dcbz */
|
||||
lp = (unsigned long __user *)p;
|
||||
for (i = 0; i < L1_CACHE_BYTES / sizeof(long); ++i)
|
||||
ret |= __put_user(0, lp++);
|
||||
break;
|
||||
case 8:
|
||||
ret |= __put_user(data.v[0], p++);
|
||||
ret |= __put_user(data.v[1], p++);
|
||||
|
@ -382,15 +515,16 @@ fix_alignment(struct pt_regs *regs)
|
|||
ret |= __put_user(data.v[6], p++);
|
||||
ret |= __put_user(data.v[7], p++);
|
||||
}
|
||||
if (ret)
|
||||
if (unlikely(ret))
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
} else if (flags & F)
|
||||
current->thread.fpr[reg] = data.dd;
|
||||
else
|
||||
regs->gpr[reg] = data.ll;
|
||||
|
||||
/* Update RA as needed */
|
||||
if (flags & U) {
|
||||
if (flags & U)
|
||||
regs->gpr[areg] = regs->dar;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -27,14 +27,6 @@
|
|||
|
||||
.text
|
||||
|
||||
.align 5
|
||||
_GLOBAL(__delay)
|
||||
cmpwi 0,r3,0
|
||||
mtctr r3
|
||||
beqlr
|
||||
1: bdnz 1b
|
||||
blr
|
||||
|
||||
/*
|
||||
* This returns the high 64 bits of the product of two 64-bit numbers.
|
||||
*/
|
||||
|
|
|
@ -15,7 +15,7 @@ unsigned long __init rtas_get_boot_time(void)
|
|||
{
|
||||
int ret[8];
|
||||
int error, wait_time;
|
||||
unsigned long max_wait_tb;
|
||||
u64 max_wait_tb;
|
||||
|
||||
max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT;
|
||||
do {
|
||||
|
@ -45,7 +45,7 @@ void rtas_get_rtc_time(struct rtc_time *rtc_tm)
|
|||
{
|
||||
int ret[8];
|
||||
int error, wait_time;
|
||||
unsigned long max_wait_tb;
|
||||
u64 max_wait_tb;
|
||||
|
||||
max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT;
|
||||
do {
|
||||
|
@ -80,7 +80,7 @@ void rtas_get_rtc_time(struct rtc_time *rtc_tm)
|
|||
int rtas_set_rtc_time(struct rtc_time *tm)
|
||||
{
|
||||
int error, wait_time;
|
||||
unsigned long max_wait_tb;
|
||||
u64 max_wait_tb;
|
||||
|
||||
max_wait_tb = get_tb() + tb_ticks_per_usec * 1000 * MAX_RTC_WAIT;
|
||||
do {
|
||||
|
|
|
@ -130,6 +130,34 @@ unsigned long tb_last_stamp;
|
|||
*/
|
||||
DEFINE_PER_CPU(unsigned long, last_jiffy);
|
||||
|
||||
void __delay(unsigned long loops)
|
||||
{
|
||||
unsigned long start;
|
||||
int diff;
|
||||
|
||||
if (__USE_RTC()) {
|
||||
start = get_rtcl();
|
||||
do {
|
||||
/* the RTCL register wraps at 1000000000 */
|
||||
diff = get_rtcl() - start;
|
||||
if (diff < 0)
|
||||
diff += 1000000000;
|
||||
} while (diff < loops);
|
||||
} else {
|
||||
start = get_tbl();
|
||||
while (get_tbl() - start < loops)
|
||||
HMT_low();
|
||||
HMT_medium();
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(__delay);
|
||||
|
||||
void udelay(unsigned long usecs)
|
||||
{
|
||||
__delay(tb_ticks_per_usec * usecs);
|
||||
}
|
||||
EXPORT_SYMBOL(udelay);
|
||||
|
||||
static __inline__ void timer_check_rtc(void)
|
||||
{
|
||||
/*
|
||||
|
|
|
@ -257,6 +257,13 @@ void __init chrp_setup_arch(void)
|
|||
if (rtas_token("display-character") >= 0)
|
||||
ppc_md.progress = rtas_progress;
|
||||
|
||||
/* use RTAS time-of-day routines if available */
|
||||
if (rtas_token("get-time-of-day") != RTAS_UNKNOWN_SERVICE) {
|
||||
ppc_md.get_boot_time = rtas_get_boot_time;
|
||||
ppc_md.get_rtc_time = rtas_get_rtc_time;
|
||||
ppc_md.set_rtc_time = rtas_set_rtc_time;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BOOTX_TEXT
|
||||
if (ppc_md.progress == NULL && boot_text_mapped)
|
||||
ppc_md.progress = btext_progress;
|
||||
|
@ -505,9 +512,11 @@ void __init chrp_init(void)
|
|||
ppc_md.halt = rtas_halt;
|
||||
|
||||
ppc_md.time_init = chrp_time_init;
|
||||
ppc_md.calibrate_decr = chrp_calibrate_decr;
|
||||
|
||||
/* this may get overridden with rtas routines later... */
|
||||
ppc_md.set_rtc_time = chrp_set_rtc_time;
|
||||
ppc_md.get_rtc_time = chrp_get_rtc_time;
|
||||
ppc_md.calibrate_decr = chrp_calibrate_decr;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
smp_ops = &chrp_smp_ops;
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include <asm/machdep.h>
|
||||
#include <asm/smp.h>
|
||||
#include <asm/mpic.h>
|
||||
#include <asm/rtas.h>
|
||||
|
||||
static void __devinit smp_chrp_kick_cpu(int nr)
|
||||
{
|
||||
|
|
|
@ -87,7 +87,6 @@ int chrp_set_rtc_time(struct rtc_time *tmarg)
|
|||
|
||||
chrp_cmos_clock_write((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT);
|
||||
|
||||
tm.tm_year -= 1900;
|
||||
if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
|
||||
BIN_TO_BCD(tm.tm_sec);
|
||||
BIN_TO_BCD(tm.tm_min);
|
||||
|
@ -156,7 +155,7 @@ void chrp_get_rtc_time(struct rtc_time *tm)
|
|||
BCD_TO_BIN(mon);
|
||||
BCD_TO_BIN(year);
|
||||
}
|
||||
if ((year += 1900) < 1970)
|
||||
if (year < 70)
|
||||
year += 100;
|
||||
tm->tm_sec = sec;
|
||||
tm->tm_min = min;
|
||||
|
|
|
@ -158,6 +158,11 @@ int maple_set_rtc_time(struct rtc_time *tm)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct resource rtc_iores = {
|
||||
.name = "rtc",
|
||||
.flags = IORESOURCE_BUSY,
|
||||
};
|
||||
|
||||
unsigned long __init maple_get_boot_time(void)
|
||||
{
|
||||
struct rtc_time tm;
|
||||
|
@ -172,7 +177,11 @@ unsigned long __init maple_get_boot_time(void)
|
|||
printk(KERN_INFO "Maple: No device node for RTC, assuming "
|
||||
"legacy address (0x%x)\n", maple_rtc_addr);
|
||||
}
|
||||
|
||||
|
||||
rtc_iores.start = maple_rtc_addr;
|
||||
rtc_iores.end = maple_rtc_addr + 7;
|
||||
request_resource(&ioport_resource, &rtc_iores);
|
||||
|
||||
maple_get_rtc_time(&tm);
|
||||
return mktime(tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday,
|
||||
tm.tm_hour, tm.tm_min, tm.tm_sec);
|
||||
|
|
|
@ -86,7 +86,8 @@ static int ibm_read_slot_reset_state;
|
|||
static int ibm_read_slot_reset_state2;
|
||||
static int ibm_slot_error_detail;
|
||||
|
||||
static int eeh_subsystem_enabled;
|
||||
int eeh_subsystem_enabled;
|
||||
EXPORT_SYMBOL(eeh_subsystem_enabled);
|
||||
|
||||
/* Lock to avoid races due to multiple reports of an error */
|
||||
static DEFINE_SPINLOCK(confirm_error_lock);
|
||||
|
|
|
@ -504,7 +504,7 @@ static void pseries_dedicated_idle(void)
|
|||
lpaca->lppaca.idle = 1;
|
||||
|
||||
if (!need_resched()) {
|
||||
start_snooze = __get_tb() +
|
||||
start_snooze = get_tb() +
|
||||
*smt_snooze_delay * tb_ticks_per_usec;
|
||||
|
||||
while (!need_resched() && !cpu_is_offline(cpu)) {
|
||||
|
@ -518,7 +518,7 @@ static void pseries_dedicated_idle(void)
|
|||
HMT_very_low();
|
||||
|
||||
if (*smt_snooze_delay != 0 &&
|
||||
__get_tb() > start_snooze) {
|
||||
get_tb() > start_snooze) {
|
||||
HMT_medium();
|
||||
dedicated_idle_sleep(cpu);
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ extra-$(CONFIG_POWER4) += idle_power4.o
|
|||
extra-y += vmlinux.lds
|
||||
|
||||
obj-y := entry.o traps.o idle.o time.o misc.o \
|
||||
process.o align.o \
|
||||
process.o \
|
||||
setup.o \
|
||||
ppc_htab.o
|
||||
obj-$(CONFIG_6xx) += l2cr.o cpu_setup_6xx.o
|
||||
|
@ -38,7 +38,7 @@ endif
|
|||
# These are here while we do the architecture merge
|
||||
|
||||
else
|
||||
obj-y := idle.o align.o
|
||||
obj-y := idle.o
|
||||
obj-$(CONFIG_6xx) += l2cr.o cpu_setup_6xx.o
|
||||
obj-$(CONFIG_SOFTWARE_SUSPEND) += swsusp.o
|
||||
obj-$(CONFIG_MODULES) += module.o
|
||||
|
|
|
@ -1,410 +0,0 @@
|
|||
/*
|
||||
* align.c - handle alignment exceptions for the Power PC.
|
||||
*
|
||||
* Copyright (c) 1996 Paul Mackerras <paulus@cs.anu.edu.au>
|
||||
* Copyright (c) 1998-1999 TiVo, Inc.
|
||||
* PowerPC 403GCX modifications.
|
||||
* Copyright (c) 1999 Grant Erickson <grant@lcse.umn.edu>
|
||||
* PowerPC 403GCX/405GP modifications.
|
||||
*/
|
||||
#include <linux/config.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mm.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/cache.h>
|
||||
|
||||
struct aligninfo {
|
||||
unsigned char len;
|
||||
unsigned char flags;
|
||||
};
|
||||
|
||||
#if defined(CONFIG_4xx) || defined(CONFIG_POWER4) || defined(CONFIG_BOOKE)
|
||||
#define OPCD(inst) (((inst) & 0xFC000000) >> 26)
|
||||
#define RS(inst) (((inst) & 0x03E00000) >> 21)
|
||||
#define RA(inst) (((inst) & 0x001F0000) >> 16)
|
||||
#define IS_XFORM(code) ((code) == 31)
|
||||
#endif
|
||||
|
||||
#define INVALID { 0, 0 }
|
||||
|
||||
#define LD 1 /* load */
|
||||
#define ST 2 /* store */
|
||||
#define SE 4 /* sign-extend value */
|
||||
#define F 8 /* to/from fp regs */
|
||||
#define U 0x10 /* update index register */
|
||||
#define M 0x20 /* multiple load/store */
|
||||
#define S 0x40 /* single-precision fp, or byte-swap value */
|
||||
#define SX 0x40 /* byte count in XER */
|
||||
#define HARD 0x80 /* string, stwcx. */
|
||||
|
||||
#define DCBZ 0x5f /* 8xx/82xx dcbz faults when cache not enabled */
|
||||
|
||||
/*
|
||||
* The PowerPC stores certain bits of the instruction that caused the
|
||||
* alignment exception in the DSISR register. This array maps those
|
||||
* bits to information about the operand length and what the
|
||||
* instruction would do.
|
||||
*/
|
||||
static struct aligninfo aligninfo[128] = {
|
||||
{ 4, LD }, /* 00 0 0000: lwz / lwarx */
|
||||
INVALID, /* 00 0 0001 */
|
||||
{ 4, ST }, /* 00 0 0010: stw */
|
||||
INVALID, /* 00 0 0011 */
|
||||
{ 2, LD }, /* 00 0 0100: lhz */
|
||||
{ 2, LD+SE }, /* 00 0 0101: lha */
|
||||
{ 2, ST }, /* 00 0 0110: sth */
|
||||
{ 4, LD+M }, /* 00 0 0111: lmw */
|
||||
{ 4, LD+F+S }, /* 00 0 1000: lfs */
|
||||
{ 8, LD+F }, /* 00 0 1001: lfd */
|
||||
{ 4, ST+F+S }, /* 00 0 1010: stfs */
|
||||
{ 8, ST+F }, /* 00 0 1011: stfd */
|
||||
INVALID, /* 00 0 1100 */
|
||||
INVALID, /* 00 0 1101: ld/ldu/lwa */
|
||||
INVALID, /* 00 0 1110 */
|
||||
INVALID, /* 00 0 1111: std/stdu */
|
||||
{ 4, LD+U }, /* 00 1 0000: lwzu */
|
||||
INVALID, /* 00 1 0001 */
|
||||
{ 4, ST+U }, /* 00 1 0010: stwu */
|
||||
INVALID, /* 00 1 0011 */
|
||||
{ 2, LD+U }, /* 00 1 0100: lhzu */
|
||||
{ 2, LD+SE+U }, /* 00 1 0101: lhau */
|
||||
{ 2, ST+U }, /* 00 1 0110: sthu */
|
||||
{ 4, ST+M }, /* 00 1 0111: stmw */
|
||||
{ 4, LD+F+S+U }, /* 00 1 1000: lfsu */
|
||||
{ 8, LD+F+U }, /* 00 1 1001: lfdu */
|
||||
{ 4, ST+F+S+U }, /* 00 1 1010: stfsu */
|
||||
{ 8, ST+F+U }, /* 00 1 1011: stfdu */
|
||||
INVALID, /* 00 1 1100 */
|
||||
INVALID, /* 00 1 1101 */
|
||||
INVALID, /* 00 1 1110 */
|
||||
INVALID, /* 00 1 1111 */
|
||||
INVALID, /* 01 0 0000: ldx */
|
||||
INVALID, /* 01 0 0001 */
|
||||
INVALID, /* 01 0 0010: stdx */
|
||||
INVALID, /* 01 0 0011 */
|
||||
INVALID, /* 01 0 0100 */
|
||||
INVALID, /* 01 0 0101: lwax */
|
||||
INVALID, /* 01 0 0110 */
|
||||
INVALID, /* 01 0 0111 */
|
||||
{ 4, LD+M+HARD+SX }, /* 01 0 1000: lswx */
|
||||
{ 4, LD+M+HARD }, /* 01 0 1001: lswi */
|
||||
{ 4, ST+M+HARD+SX }, /* 01 0 1010: stswx */
|
||||
{ 4, ST+M+HARD }, /* 01 0 1011: stswi */
|
||||
INVALID, /* 01 0 1100 */
|
||||
INVALID, /* 01 0 1101 */
|
||||
INVALID, /* 01 0 1110 */
|
||||
INVALID, /* 01 0 1111 */
|
||||
INVALID, /* 01 1 0000: ldux */
|
||||
INVALID, /* 01 1 0001 */
|
||||
INVALID, /* 01 1 0010: stdux */
|
||||
INVALID, /* 01 1 0011 */
|
||||
INVALID, /* 01 1 0100 */
|
||||
INVALID, /* 01 1 0101: lwaux */
|
||||
INVALID, /* 01 1 0110 */
|
||||
INVALID, /* 01 1 0111 */
|
||||
INVALID, /* 01 1 1000 */
|
||||
INVALID, /* 01 1 1001 */
|
||||
INVALID, /* 01 1 1010 */
|
||||
INVALID, /* 01 1 1011 */
|
||||
INVALID, /* 01 1 1100 */
|
||||
INVALID, /* 01 1 1101 */
|
||||
INVALID, /* 01 1 1110 */
|
||||
INVALID, /* 01 1 1111 */
|
||||
INVALID, /* 10 0 0000 */
|
||||
INVALID, /* 10 0 0001 */
|
||||
{ 0, ST+HARD }, /* 10 0 0010: stwcx. */
|
||||
INVALID, /* 10 0 0011 */
|
||||
INVALID, /* 10 0 0100 */
|
||||
INVALID, /* 10 0 0101 */
|
||||
INVALID, /* 10 0 0110 */
|
||||
INVALID, /* 10 0 0111 */
|
||||
{ 4, LD+S }, /* 10 0 1000: lwbrx */
|
||||
INVALID, /* 10 0 1001 */
|
||||
{ 4, ST+S }, /* 10 0 1010: stwbrx */
|
||||
INVALID, /* 10 0 1011 */
|
||||
{ 2, LD+S }, /* 10 0 1100: lhbrx */
|
||||
INVALID, /* 10 0 1101 */
|
||||
{ 2, ST+S }, /* 10 0 1110: sthbrx */
|
||||
INVALID, /* 10 0 1111 */
|
||||
INVALID, /* 10 1 0000 */
|
||||
INVALID, /* 10 1 0001 */
|
||||
INVALID, /* 10 1 0010 */
|
||||
INVALID, /* 10 1 0011 */
|
||||
INVALID, /* 10 1 0100 */
|
||||
INVALID, /* 10 1 0101 */
|
||||
INVALID, /* 10 1 0110 */
|
||||
INVALID, /* 10 1 0111 */
|
||||
INVALID, /* 10 1 1000 */
|
||||
INVALID, /* 10 1 1001 */
|
||||
INVALID, /* 10 1 1010 */
|
||||
INVALID, /* 10 1 1011 */
|
||||
INVALID, /* 10 1 1100 */
|
||||
INVALID, /* 10 1 1101 */
|
||||
INVALID, /* 10 1 1110 */
|
||||
{ 0, ST+HARD }, /* 10 1 1111: dcbz */
|
||||
{ 4, LD }, /* 11 0 0000: lwzx */
|
||||
INVALID, /* 11 0 0001 */
|
||||
{ 4, ST }, /* 11 0 0010: stwx */
|
||||
INVALID, /* 11 0 0011 */
|
||||
{ 2, LD }, /* 11 0 0100: lhzx */
|
||||
{ 2, LD+SE }, /* 11 0 0101: lhax */
|
||||
{ 2, ST }, /* 11 0 0110: sthx */
|
||||
INVALID, /* 11 0 0111 */
|
||||
{ 4, LD+F+S }, /* 11 0 1000: lfsx */
|
||||
{ 8, LD+F }, /* 11 0 1001: lfdx */
|
||||
{ 4, ST+F+S }, /* 11 0 1010: stfsx */
|
||||
{ 8, ST+F }, /* 11 0 1011: stfdx */
|
||||
INVALID, /* 11 0 1100 */
|
||||
INVALID, /* 11 0 1101: lmd */
|
||||
INVALID, /* 11 0 1110 */
|
||||
INVALID, /* 11 0 1111: stmd */
|
||||
{ 4, LD+U }, /* 11 1 0000: lwzux */
|
||||
INVALID, /* 11 1 0001 */
|
||||
{ 4, ST+U }, /* 11 1 0010: stwux */
|
||||
INVALID, /* 11 1 0011 */
|
||||
{ 2, LD+U }, /* 11 1 0100: lhzux */
|
||||
{ 2, LD+SE+U }, /* 11 1 0101: lhaux */
|
||||
{ 2, ST+U }, /* 11 1 0110: sthux */
|
||||
INVALID, /* 11 1 0111 */
|
||||
{ 4, LD+F+S+U }, /* 11 1 1000: lfsux */
|
||||
{ 8, LD+F+U }, /* 11 1 1001: lfdux */
|
||||
{ 4, ST+F+S+U }, /* 11 1 1010: stfsux */
|
||||
{ 8, ST+F+U }, /* 11 1 1011: stfdux */
|
||||
INVALID, /* 11 1 1100 */
|
||||
INVALID, /* 11 1 1101 */
|
||||
INVALID, /* 11 1 1110 */
|
||||
INVALID, /* 11 1 1111 */
|
||||
};
|
||||
|
||||
#define SWAP(a, b) (t = (a), (a) = (b), (b) = t)
|
||||
|
||||
int
|
||||
fix_alignment(struct pt_regs *regs)
|
||||
{
|
||||
int instr, nb, flags;
|
||||
#if defined(CONFIG_4xx) || defined(CONFIG_POWER4) || defined(CONFIG_BOOKE)
|
||||
int opcode, f1, f2, f3;
|
||||
#endif
|
||||
int i, t;
|
||||
int reg, areg;
|
||||
int offset, nb0;
|
||||
unsigned char __user *addr;
|
||||
unsigned char *rptr;
|
||||
union {
|
||||
long l;
|
||||
float f;
|
||||
double d;
|
||||
unsigned char v[8];
|
||||
} data;
|
||||
|
||||
CHECK_FULL_REGS(regs);
|
||||
|
||||
#if defined(CONFIG_4xx) || defined(CONFIG_POWER4) || defined(CONFIG_BOOKE)
|
||||
/* The 4xx-family & Book-E processors have no DSISR register,
|
||||
* so we emulate it.
|
||||
* The POWER4 has a DSISR register but doesn't set it on
|
||||
* an alignment fault. -- paulus
|
||||
*/
|
||||
|
||||
if (__get_user(instr, (unsigned int __user *) regs->nip))
|
||||
return 0;
|
||||
opcode = OPCD(instr);
|
||||
reg = RS(instr);
|
||||
areg = RA(instr);
|
||||
|
||||
if (!IS_XFORM(opcode)) {
|
||||
f1 = 0;
|
||||
f2 = (instr & 0x04000000) >> 26;
|
||||
f3 = (instr & 0x78000000) >> 27;
|
||||
} else {
|
||||
f1 = (instr & 0x00000006) >> 1;
|
||||
f2 = (instr & 0x00000040) >> 6;
|
||||
f3 = (instr & 0x00000780) >> 7;
|
||||
}
|
||||
|
||||
instr = ((f1 << 5) | (f2 << 4) | f3);
|
||||
#else
|
||||
reg = (regs->dsisr >> 5) & 0x1f; /* source/dest register */
|
||||
areg = regs->dsisr & 0x1f; /* register to update */
|
||||
instr = (regs->dsisr >> 10) & 0x7f;
|
||||
#endif
|
||||
|
||||
nb = aligninfo[instr].len;
|
||||
if (nb == 0) {
|
||||
long __user *p;
|
||||
int i;
|
||||
|
||||
if (instr != DCBZ)
|
||||
return 0; /* too hard or invalid instruction */
|
||||
/*
|
||||
* The dcbz (data cache block zero) instruction
|
||||
* gives an alignment fault if used on non-cacheable
|
||||
* memory. We handle the fault mainly for the
|
||||
* case when we are running with the cache disabled
|
||||
* for debugging.
|
||||
*/
|
||||
p = (long __user *) (regs->dar & -L1_CACHE_BYTES);
|
||||
if (user_mode(regs)
|
||||
&& !access_ok(VERIFY_WRITE, p, L1_CACHE_BYTES))
|
||||
return -EFAULT;
|
||||
for (i = 0; i < L1_CACHE_BYTES / sizeof(long); ++i)
|
||||
if (__put_user(0, p+i))
|
||||
return -EFAULT;
|
||||
return 1;
|
||||
}
|
||||
|
||||
flags = aligninfo[instr].flags;
|
||||
if ((flags & (LD|ST)) == 0)
|
||||
return 0;
|
||||
|
||||
/* For the 4xx-family & Book-E processors, the 'dar' field of the
|
||||
* pt_regs structure is overloaded and is really from the DEAR.
|
||||
*/
|
||||
|
||||
addr = (unsigned char __user *)regs->dar;
|
||||
|
||||
if (flags & M) {
|
||||
/* lmw, stmw, lswi/x, stswi/x */
|
||||
nb0 = 0;
|
||||
if (flags & HARD) {
|
||||
if (flags & SX) {
|
||||
nb = regs->xer & 127;
|
||||
if (nb == 0)
|
||||
return 1;
|
||||
} else {
|
||||
if (__get_user(instr,
|
||||
(unsigned int __user *)regs->nip))
|
||||
return 0;
|
||||
nb = (instr >> 11) & 0x1f;
|
||||
if (nb == 0)
|
||||
nb = 32;
|
||||
}
|
||||
if (nb + reg * 4 > 128) {
|
||||
nb0 = nb + reg * 4 - 128;
|
||||
nb = 128 - reg * 4;
|
||||
}
|
||||
} else {
|
||||
/* lwm, stmw */
|
||||
nb = (32 - reg) * 4;
|
||||
}
|
||||
|
||||
if (!access_ok((flags & ST? VERIFY_WRITE: VERIFY_READ), addr, nb+nb0))
|
||||
return -EFAULT; /* bad address */
|
||||
|
||||
rptr = (unsigned char *) ®s->gpr[reg];
|
||||
if (flags & LD) {
|
||||
for (i = 0; i < nb; ++i)
|
||||
if (__get_user(rptr[i], addr+i))
|
||||
return -EFAULT;
|
||||
if (nb0 > 0) {
|
||||
rptr = (unsigned char *) ®s->gpr[0];
|
||||
addr += nb;
|
||||
for (i = 0; i < nb0; ++i)
|
||||
if (__get_user(rptr[i], addr+i))
|
||||
return -EFAULT;
|
||||
}
|
||||
for (; (i & 3) != 0; ++i)
|
||||
rptr[i] = 0;
|
||||
} else {
|
||||
for (i = 0; i < nb; ++i)
|
||||
if (__put_user(rptr[i], addr+i))
|
||||
return -EFAULT;
|
||||
if (nb0 > 0) {
|
||||
rptr = (unsigned char *) ®s->gpr[0];
|
||||
addr += nb;
|
||||
for (i = 0; i < nb0; ++i)
|
||||
if (__put_user(rptr[i], addr+i))
|
||||
return -EFAULT;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
offset = 0;
|
||||
if (nb < 4) {
|
||||
/* read/write the least significant bits */
|
||||
data.l = 0;
|
||||
offset = 4 - nb;
|
||||
}
|
||||
|
||||
/* Verify the address of the operand */
|
||||
if (user_mode(regs)) {
|
||||
if (!access_ok((flags & ST? VERIFY_WRITE: VERIFY_READ), addr, nb))
|
||||
return -EFAULT; /* bad address */
|
||||
}
|
||||
|
||||
if (flags & F) {
|
||||
preempt_disable();
|
||||
if (regs->msr & MSR_FP)
|
||||
giveup_fpu(current);
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
/* If we read the operand, copy it in, else get register values */
|
||||
if (flags & LD) {
|
||||
for (i = 0; i < nb; ++i)
|
||||
if (__get_user(data.v[offset+i], addr+i))
|
||||
return -EFAULT;
|
||||
} else if (flags & F) {
|
||||
data.d = current->thread.fpr[reg];
|
||||
} else {
|
||||
data.l = regs->gpr[reg];
|
||||
}
|
||||
|
||||
switch (flags & ~U) {
|
||||
case LD+SE: /* sign extend */
|
||||
if (data.v[2] >= 0x80)
|
||||
data.v[0] = data.v[1] = -1;
|
||||
break;
|
||||
|
||||
case LD+S: /* byte-swap */
|
||||
case ST+S:
|
||||
if (nb == 2) {
|
||||
SWAP(data.v[2], data.v[3]);
|
||||
} else {
|
||||
SWAP(data.v[0], data.v[3]);
|
||||
SWAP(data.v[1], data.v[2]);
|
||||
}
|
||||
break;
|
||||
|
||||
/* Single-precision FP load and store require conversions... */
|
||||
case LD+F+S:
|
||||
#ifdef CONFIG_PPC_FPU
|
||||
preempt_disable();
|
||||
enable_kernel_fp();
|
||||
cvt_fd(&data.f, &data.d, ¤t->thread);
|
||||
preempt_enable();
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
break;
|
||||
case ST+F+S:
|
||||
#ifdef CONFIG_PPC_FPU
|
||||
preempt_disable();
|
||||
enable_kernel_fp();
|
||||
cvt_df(&data.d, &data.f, ¤t->thread);
|
||||
preempt_enable();
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
if (flags & ST) {
|
||||
for (i = 0; i < nb; ++i)
|
||||
if (__put_user(data.v[offset+i], addr+i))
|
||||
return -EFAULT;
|
||||
} else if (flags & F) {
|
||||
current->thread.fpr[reg] = data.d;
|
||||
} else {
|
||||
regs->gpr[reg] = data.l;
|
||||
}
|
||||
|
||||
if (flags & U)
|
||||
regs->gpr[areg] = regs->dar;
|
||||
|
||||
return 1;
|
||||
}
|
|
@ -45,7 +45,6 @@ static void update_bridge_base(struct pci_bus *bus, int i);
|
|||
static void pcibios_fixup_resources(struct pci_dev* dev);
|
||||
static void fixup_broken_pcnet32(struct pci_dev* dev);
|
||||
static int reparent_resources(struct resource *parent, struct resource *res);
|
||||
static void fixup_rev1_53c810(struct pci_dev* dev);
|
||||
static void fixup_cpc710_pci64(struct pci_dev* dev);
|
||||
#ifdef CONFIG_PPC_OF
|
||||
static u8* pci_to_OF_bus_map;
|
||||
|
|
|
@ -69,9 +69,33 @@ struct ppc_sys_spec ppc_sys_specs[] = {
|
|||
},
|
||||
},
|
||||
{
|
||||
.ppc_sys_name = "8343E",
|
||||
.ppc_sys_name = "8347E",
|
||||
.mask = 0xFFFF0000,
|
||||
.value = 0x80540000,
|
||||
.num_devices = 9,
|
||||
.device_list = (enum ppc_sys_devices[])
|
||||
{
|
||||
MPC83xx_TSEC1, MPC83xx_TSEC2, MPC83xx_IIC1,
|
||||
MPC83xx_IIC2, MPC83xx_DUART, MPC83xx_SEC2,
|
||||
MPC83xx_USB2_DR, MPC83xx_USB2_MPH, MPC83xx_MDIO
|
||||
},
|
||||
},
|
||||
{
|
||||
.ppc_sys_name = "8347",
|
||||
.mask = 0xFFFF0000,
|
||||
.value = 0x80550000,
|
||||
.num_devices = 8,
|
||||
.device_list = (enum ppc_sys_devices[])
|
||||
{
|
||||
MPC83xx_TSEC1, MPC83xx_TSEC2, MPC83xx_IIC1,
|
||||
MPC83xx_IIC2, MPC83xx_DUART,
|
||||
MPC83xx_USB2_DR, MPC83xx_USB2_MPH, MPC83xx_MDIO
|
||||
},
|
||||
},
|
||||
{
|
||||
.ppc_sys_name = "8343E",
|
||||
.mask = 0xFFFF0000,
|
||||
.value = 0x80560000,
|
||||
.num_devices = 8,
|
||||
.device_list = (enum ppc_sys_devices[])
|
||||
{
|
||||
|
@ -83,7 +107,7 @@ struct ppc_sys_spec ppc_sys_specs[] = {
|
|||
{
|
||||
.ppc_sys_name = "8343",
|
||||
.mask = 0xFFFF0000,
|
||||
.value = 0x80550000,
|
||||
.value = 0x80570000,
|
||||
.num_devices = 7,
|
||||
.device_list = (enum ppc_sys_devices[])
|
||||
{
|
||||
|
|
|
@ -1,65 +0,0 @@
|
|||
menu "Kernel hacking"
|
||||
|
||||
source "lib/Kconfig.debug"
|
||||
|
||||
config DEBUG_STACKOVERFLOW
|
||||
bool "Check for stack overflows"
|
||||
depends on DEBUG_KERNEL
|
||||
help
|
||||
This option will cause messages to be printed if free stack space
|
||||
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
|
||||
bool "Stack utilization instrumentation"
|
||||
depends on DEBUG_KERNEL
|
||||
help
|
||||
Enables the display of the minimum amount of free stack which each
|
||||
task has ever had available in the sysrq-T and sysrq-P debug output.
|
||||
|
||||
This option will slow down process creation somewhat.
|
||||
|
||||
config DEBUGGER
|
||||
bool "Enable debugger hooks"
|
||||
depends on DEBUG_KERNEL
|
||||
help
|
||||
Include in-kernel hooks for kernel debuggers. Unless you are
|
||||
intending to debug the kernel, say N here.
|
||||
|
||||
config XMON
|
||||
bool "Include xmon kernel debugger"
|
||||
depends on DEBUGGER && !PPC_ISERIES
|
||||
help
|
||||
Include in-kernel hooks for the xmon kernel monitor/debugger.
|
||||
Unless you are intending to debug the kernel, say N here.
|
||||
Make sure to enable also CONFIG_BOOTX_TEXT on Macs. Otherwise
|
||||
nothing will appear on the screen (xmon writes directly to the
|
||||
framebuffer memory).
|
||||
The cmdline option 'xmon' or 'xmon=early' will drop into xmon very
|
||||
early during boot. 'xmon=on' will just enable the xmon debugger hooks.
|
||||
'xmon=off' will disable the debugger hooks if CONFIG_XMON_DEFAULT is set.
|
||||
|
||||
config XMON_DEFAULT
|
||||
bool "Enable xmon by default"
|
||||
depends on XMON
|
||||
help
|
||||
xmon is normally disabled unless booted with 'xmon=on'.
|
||||
Use 'xmon=off' to disable xmon init during runtime.
|
||||
|
||||
config IRQSTACKS
|
||||
bool "Use separate kernel stacks when processing interrupts"
|
||||
help
|
||||
If you say Y here the kernel will use separate kernel stacks
|
||||
for handling hard and soft interrupts. This can help avoid
|
||||
overflowing the process kernel stacks.
|
||||
|
||||
endmenu
|
|
@ -1,142 +0,0 @@
|
|||
# This file is included by the global makefile so that you can add your own
|
||||
# architecture-specific flags and dependencies. Remember to do have actions
|
||||
# for "archclean" and "archdep" for cleaning up and making dependencies for
|
||||
# this architecture
|
||||
#
|
||||
# This file is subject to the terms and conditions of the GNU General Public
|
||||
# License. See the file "COPYING" in the main directory of this archive
|
||||
# for more details.
|
||||
#
|
||||
# Copyright (C) 1994 by Linus Torvalds
|
||||
# Changes for PPC by Gary Thomas
|
||||
# Rewritten by Cort Dougan and Paul Mackerras
|
||||
# Adjusted for PPC64 by Tom Gall
|
||||
#
|
||||
|
||||
KERNELLOAD := 0xc000000000000000
|
||||
|
||||
# Set default 32 bits cross compilers for vdso and boot wrapper
|
||||
CROSS32_COMPILE ?=
|
||||
|
||||
CROSS32CC := $(CROSS32_COMPILE)gcc
|
||||
CROSS32AS := $(CROSS32_COMPILE)as
|
||||
CROSS32LD := $(CROSS32_COMPILE)ld
|
||||
CROSS32OBJCOPY := $(CROSS32_COMPILE)objcopy
|
||||
|
||||
# If we have a biarch compiler, use it for 32 bits cross compile if
|
||||
# CROSS32_COMPILE wasn't explicitely defined, and add proper explicit
|
||||
# target type to target compilers
|
||||
|
||||
HAS_BIARCH := $(call cc-option-yn, -m64)
|
||||
ifeq ($(HAS_BIARCH),y)
|
||||
ifeq ($(CROSS32_COMPILE),)
|
||||
CROSS32CC := $(CC) -m32
|
||||
CROSS32AS := $(AS) -a32
|
||||
CROSS32LD := $(LD) -m elf32ppc
|
||||
CROSS32OBJCOPY := $(OBJCOPY)
|
||||
endif
|
||||
override AS += -a64
|
||||
override LD += -m elf64ppc
|
||||
override CC += -m64
|
||||
endif
|
||||
|
||||
export CROSS32CC CROSS32AS CROSS32LD CROSS32OBJCOPY
|
||||
|
||||
new_nm := $(shell if $(NM) --help 2>&1 | grep -- '--synthetic' > /dev/null; then echo y; else echo n; fi)
|
||||
|
||||
ifeq ($(new_nm),y)
|
||||
NM := $(NM) --synthetic
|
||||
|
||||
endif
|
||||
|
||||
CHECKFLAGS += -m64 -D__powerpc__ -D__powerpc64__
|
||||
|
||||
LDFLAGS := -m elf64ppc
|
||||
LDFLAGS_vmlinux := -Bstatic -e $(KERNELLOAD) -Ttext $(KERNELLOAD)
|
||||
CFLAGS += -msoft-float -pipe -mminimal-toc -mtraceback=none \
|
||||
-mcall-aixdesc
|
||||
# Temporary hack until we have migrated to asm-powerpc
|
||||
CPPFLAGS += -Iarch/$(ARCH)/include
|
||||
|
||||
GCC_VERSION := $(call cc-version)
|
||||
GCC_BROKEN_VEC := $(shell if [ $(GCC_VERSION) -lt 0400 ] ; then echo "y"; fi ;)
|
||||
|
||||
ifeq ($(CONFIG_POWER4_ONLY),y)
|
||||
ifeq ($(CONFIG_ALTIVEC),y)
|
||||
ifeq ($(GCC_BROKEN_VEC),y)
|
||||
CFLAGS += $(call cc-option,-mcpu=970)
|
||||
else
|
||||
CFLAGS += $(call cc-option,-mcpu=power4)
|
||||
endif
|
||||
else
|
||||
CFLAGS += $(call cc-option,-mcpu=power4)
|
||||
endif
|
||||
else
|
||||
CFLAGS += $(call cc-option,-mtune=power4)
|
||||
endif
|
||||
|
||||
# No AltiVec instruction when building kernel
|
||||
CFLAGS += $(call cc-option, -mno-altivec)
|
||||
|
||||
# Enable unit-at-a-time mode when possible. It shrinks the
|
||||
# kernel considerably.
|
||||
CFLAGS += $(call cc-option,-funit-at-a-time)
|
||||
|
||||
head-y := arch/ppc64/kernel/head.o
|
||||
head-y += arch/powerpc/kernel/fpu.o
|
||||
head-y += arch/powerpc/kernel/entry_64.o
|
||||
|
||||
core-y += arch/ppc64/kernel/ arch/powerpc/kernel/
|
||||
core-y += arch/powerpc/mm/
|
||||
core-y += arch/powerpc/sysdev/
|
||||
core-y += arch/powerpc/platforms/
|
||||
core-y += arch/powerpc/lib/
|
||||
core-$(CONFIG_XMON) += arch/powerpc/xmon/
|
||||
drivers-$(CONFIG_OPROFILE) += arch/powerpc/oprofile/
|
||||
|
||||
boot := arch/ppc64/boot
|
||||
|
||||
boottargets-$(CONFIG_PPC_PSERIES) += zImage zImage.initrd
|
||||
boottargets-$(CONFIG_PPC_PMAC) += zImage.vmode zImage.initrd.vmode
|
||||
boottargets-$(CONFIG_PPC_MAPLE) += zImage zImage.initrd
|
||||
boottargets-$(CONFIG_PPC_ISERIES) += vmlinux.sminitrd vmlinux.initrd vmlinux.sm
|
||||
boottargets-$(CONFIG_PPC_BPA) += zImage zImage.initrd
|
||||
$(boottargets-y): vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
||||
|
||||
bootimage-$(CONFIG_PPC_PSERIES) := $(boot)/zImage
|
||||
bootimage-$(CONFIG_PPC_PMAC) := vmlinux
|
||||
bootimage-$(CONFIG_PPC_MAPLE) := $(boot)/zImage
|
||||
bootimage-$(CONFIG_PPC_BPA) := $(boot)/zImage
|
||||
bootimage-$(CONFIG_PPC_ISERIES) := vmlinux
|
||||
BOOTIMAGE := $(bootimage-y)
|
||||
install: vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(BOOTIMAGE) $@
|
||||
|
||||
defaultimage-$(CONFIG_PPC_PSERIES) := zImage
|
||||
defaultimage-$(CONFIG_PPC_PMAC) := zImage.vmode
|
||||
defaultimage-$(CONFIG_PPC_MAPLE) := zImage
|
||||
defaultimage-$(CONFIG_PPC_ISERIES) := vmlinux
|
||||
KBUILD_IMAGE := $(defaultimage-y)
|
||||
all: $(KBUILD_IMAGE)
|
||||
|
||||
archclean:
|
||||
$(Q)$(MAKE) $(clean)=$(boot)
|
||||
# Temporary hack until we have migrated to asm-powerpc
|
||||
$(Q)rm -rf arch/$(ARCH)/include
|
||||
|
||||
|
||||
# Temporary hack until we have migrated to asm-powerpc
|
||||
include/asm: arch/$(ARCH)/include/asm
|
||||
arch/$(ARCH)/include/asm:
|
||||
$(Q)if [ ! -d arch/$(ARCH)/include ]; then mkdir -p arch/$(ARCH)/include; fi
|
||||
$(Q)ln -fsn $(srctree)/include/asm-powerpc arch/$(ARCH)/include/asm
|
||||
|
||||
define archhelp
|
||||
echo ' zImage.vmode - Compressed kernel image (arch/$(ARCH)/boot/zImage.vmode)'
|
||||
echo ' zImage.initrd.vmode - Compressed kernel image with initrd attached,'
|
||||
echo ' sourced from arch/$(ARCH)/boot/ramdisk.image.gz'
|
||||
echo ' (arch/$(ARCH)/boot/zImage.initrd.vmode)'
|
||||
echo ' zImage - zImage for pSeries machines'
|
||||
echo ' zImage.initrd - zImage with initrd for pSeries machines'
|
||||
endef
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,998 +0,0 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.14-rc4
|
||||
# Thu Oct 20 08:30:56 2005
|
||||
#
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_ISA_DMA=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_COMPAT=y
|
||||
CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
|
||||
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
|
||||
CONFIG_FORCE_MAX_ZONEORDER=13
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_CLEAN_COMPILE=y
|
||||
CONFIG_LOCK_KERNEL=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_LOCALVERSION_AUTO=y
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
CONFIG_SYSCTL=y
|
||||
CONFIG_AUDIT=y
|
||||
CONFIG_AUDITSYSCALL=y
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_KOBJECT_UEVENT=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
# CONFIG_CPUSETS is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_CC_ALIGN_FUNCTIONS=0
|
||||
CONFIG_CC_ALIGN_LABELS=0
|
||||
CONFIG_CC_ALIGN_LOOPS=0
|
||||
CONFIG_CC_ALIGN_JUMPS=0
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
|
||||
#
|
||||
# Loadable module support
|
||||
#
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||
CONFIG_OBSOLETE_MODPARM=y
|
||||
CONFIG_MODVERSIONS=y
|
||||
CONFIG_MODULE_SRCVERSION_ALL=y
|
||||
CONFIG_KMOD=y
|
||||
CONFIG_STOP_MACHINE=y
|
||||
CONFIG_SYSVIPC_COMPAT=y
|
||||
|
||||
#
|
||||
# Platform support
|
||||
#
|
||||
CONFIG_PPC_ISERIES=y
|
||||
# CONFIG_PPC_MULTIPLATFORM is not set
|
||||
CONFIG_PPC=y
|
||||
CONFIG_PPC64=y
|
||||
CONFIG_IBMVIO=y
|
||||
# CONFIG_POWER4_ONLY is not set
|
||||
CONFIG_IOMMU_VMERGE=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=32
|
||||
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_ARCH_FLATMEM_ENABLE=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
# CONFIG_NUMA is not set
|
||||
# CONFIG_SCHED_SMT is not set
|
||||
CONFIG_PREEMPT_NONE=y
|
||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_PREEMPT_BKL is not set
|
||||
# CONFIG_HZ_100 is not set
|
||||
CONFIG_HZ_250=y
|
||||
# CONFIG_HZ_1000 is not set
|
||||
CONFIG_HZ=250
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_LPARCFG=y
|
||||
CONFIG_SECCOMP=y
|
||||
CONFIG_BINFMT_ELF=y
|
||||
# CONFIG_BINFMT_MISC is not set
|
||||
CONFIG_ISA_DMA_API=y
|
||||
|
||||
#
|
||||
# Bus Options
|
||||
#
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
CONFIG_PCI_LEGACY_PROC=y
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
#
|
||||
# CONFIG_PCCARD is not set
|
||||
|
||||
#
|
||||
# PCI Hotplug Support
|
||||
#
|
||||
# CONFIG_HOTPLUG_PCI is not set
|
||||
|
||||
#
|
||||
# Networking
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
CONFIG_PACKET=y
|
||||
# CONFIG_PACKET_MMAP is not set
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_XFRM=y
|
||||
CONFIG_XFRM_USER=m
|
||||
CONFIG_NET_KEY=m
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
# CONFIG_IP_PNP is not set
|
||||
CONFIG_NET_IPIP=y
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_IP_MROUTE is not set
|
||||
# CONFIG_ARPD is not set
|
||||
CONFIG_SYN_COOKIES=y
|
||||
CONFIG_INET_AH=m
|
||||
CONFIG_INET_ESP=m
|
||||
CONFIG_INET_IPCOMP=m
|
||||
CONFIG_INET_TUNNEL=y
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
|
||||
#
|
||||
# IP: Virtual Server Configuration
|
||||
#
|
||||
# CONFIG_IP_VS is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
CONFIG_NETFILTER=y
|
||||
# CONFIG_NETFILTER_DEBUG is not set
|
||||
# CONFIG_NETFILTER_NETLINK is not set
|
||||
|
||||
#
|
||||
# IP: Netfilter Configuration
|
||||
#
|
||||
CONFIG_IP_NF_CONNTRACK=m
|
||||
CONFIG_IP_NF_CT_ACCT=y
|
||||
CONFIG_IP_NF_CONNTRACK_MARK=y
|
||||
CONFIG_IP_NF_CONNTRACK_EVENTS=y
|
||||
CONFIG_IP_NF_CT_PROTO_SCTP=m
|
||||
CONFIG_IP_NF_FTP=m
|
||||
CONFIG_IP_NF_IRC=m
|
||||
# CONFIG_IP_NF_NETBIOS_NS is not set
|
||||
CONFIG_IP_NF_TFTP=m
|
||||
CONFIG_IP_NF_AMANDA=m
|
||||
# CONFIG_IP_NF_PPTP is not set
|
||||
CONFIG_IP_NF_QUEUE=m
|
||||
CONFIG_IP_NF_IPTABLES=m
|
||||
CONFIG_IP_NF_MATCH_LIMIT=m
|
||||
CONFIG_IP_NF_MATCH_IPRANGE=m
|
||||
CONFIG_IP_NF_MATCH_MAC=m
|
||||
CONFIG_IP_NF_MATCH_PKTTYPE=m
|
||||
CONFIG_IP_NF_MATCH_MARK=m
|
||||
CONFIG_IP_NF_MATCH_MULTIPORT=m
|
||||
CONFIG_IP_NF_MATCH_TOS=m
|
||||
CONFIG_IP_NF_MATCH_RECENT=m
|
||||
CONFIG_IP_NF_MATCH_ECN=m
|
||||
CONFIG_IP_NF_MATCH_DSCP=m
|
||||
CONFIG_IP_NF_MATCH_AH_ESP=m
|
||||
CONFIG_IP_NF_MATCH_LENGTH=m
|
||||
CONFIG_IP_NF_MATCH_TTL=m
|
||||
CONFIG_IP_NF_MATCH_TCPMSS=m
|
||||
CONFIG_IP_NF_MATCH_HELPER=m
|
||||
CONFIG_IP_NF_MATCH_STATE=m
|
||||
CONFIG_IP_NF_MATCH_CONNTRACK=m
|
||||
CONFIG_IP_NF_MATCH_OWNER=m
|
||||
CONFIG_IP_NF_MATCH_ADDRTYPE=m
|
||||
CONFIG_IP_NF_MATCH_REALM=m
|
||||
CONFIG_IP_NF_MATCH_SCTP=m
|
||||
# CONFIG_IP_NF_MATCH_DCCP is not set
|
||||
CONFIG_IP_NF_MATCH_COMMENT=m
|
||||
CONFIG_IP_NF_MATCH_CONNMARK=m
|
||||
CONFIG_IP_NF_MATCH_CONNBYTES=m
|
||||
CONFIG_IP_NF_MATCH_HASHLIMIT=m
|
||||
CONFIG_IP_NF_MATCH_STRING=m
|
||||
CONFIG_IP_NF_FILTER=m
|
||||
CONFIG_IP_NF_TARGET_REJECT=m
|
||||
CONFIG_IP_NF_TARGET_LOG=m
|
||||
CONFIG_IP_NF_TARGET_ULOG=m
|
||||
CONFIG_IP_NF_TARGET_TCPMSS=m
|
||||
CONFIG_IP_NF_TARGET_NFQUEUE=m
|
||||
CONFIG_IP_NF_NAT=m
|
||||
CONFIG_IP_NF_NAT_NEEDED=y
|
||||
CONFIG_IP_NF_TARGET_MASQUERADE=m
|
||||
CONFIG_IP_NF_TARGET_REDIRECT=m
|
||||
CONFIG_IP_NF_TARGET_NETMAP=m
|
||||
CONFIG_IP_NF_TARGET_SAME=m
|
||||
CONFIG_IP_NF_NAT_SNMP_BASIC=m
|
||||
CONFIG_IP_NF_NAT_IRC=m
|
||||
CONFIG_IP_NF_NAT_FTP=m
|
||||
CONFIG_IP_NF_NAT_TFTP=m
|
||||
CONFIG_IP_NF_NAT_AMANDA=m
|
||||
CONFIG_IP_NF_MANGLE=m
|
||||
CONFIG_IP_NF_TARGET_TOS=m
|
||||
CONFIG_IP_NF_TARGET_ECN=m
|
||||
CONFIG_IP_NF_TARGET_DSCP=m
|
||||
CONFIG_IP_NF_TARGET_MARK=m
|
||||
CONFIG_IP_NF_TARGET_CLASSIFY=m
|
||||
CONFIG_IP_NF_TARGET_TTL=m
|
||||
CONFIG_IP_NF_TARGET_CONNMARK=m
|
||||
CONFIG_IP_NF_TARGET_CLUSTERIP=m
|
||||
CONFIG_IP_NF_RAW=m
|
||||
CONFIG_IP_NF_TARGET_NOTRACK=m
|
||||
CONFIG_IP_NF_ARPTABLES=m
|
||||
CONFIG_IP_NF_ARPFILTER=m
|
||||
CONFIG_IP_NF_ARP_MANGLE=m
|
||||
|
||||
#
|
||||
# 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_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
CONFIG_LLC=y
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX 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_CLS_ROUTE=y
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_IEEE80211 is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Generic Driver Options
|
||||
#
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
CONFIG_FW_LOADER=m
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
|
||||
#
|
||||
# Connector - unified userspace <-> kernelspace linker
|
||||
#
|
||||
# CONFIG_CONNECTOR is not set
|
||||
|
||||
#
|
||||
# Memory Technology Devices (MTD)
|
||||
#
|
||||
# CONFIG_MTD is not set
|
||||
|
||||
#
|
||||
# Parallel port support
|
||||
#
|
||||
# CONFIG_PARPORT is not set
|
||||
|
||||
#
|
||||
# Plug and Play support
|
||||
#
|
||||
|
||||
#
|
||||
# Block devices
|
||||
#
|
||||
# CONFIG_BLK_DEV_FD is not set
|
||||
# CONFIG_BLK_CPQ_DA is not set
|
||||
# CONFIG_BLK_CPQ_CISS_DA is not set
|
||||
# CONFIG_BLK_DEV_DAC960 is not set
|
||||
# CONFIG_BLK_DEV_UMEM is not set
|
||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
|
||||
CONFIG_BLK_DEV_NBD=m
|
||||
# CONFIG_BLK_DEV_SX8 is not set
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=65536
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
||||
#
|
||||
# ATA/ATAPI/MFM/RLL support
|
||||
#
|
||||
# CONFIG_IDE is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
# CONFIG_RAID_ATTRS is not set
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_SCSI_PROC_FS=y
|
||||
|
||||
#
|
||||
# SCSI support type (disk, tape, CD-ROM)
|
||||
#
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=y
|
||||
# CONFIG_CHR_DEV_OSST is not set
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
# CONFIG_CHR_DEV_SCH is not set
|
||||
|
||||
#
|
||||
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
|
||||
#
|
||||
CONFIG_SCSI_MULTI_LUN=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
# CONFIG_SCSI_LOGGING is not set
|
||||
|
||||
#
|
||||
# SCSI Transport Attributes
|
||||
#
|
||||
CONFIG_SCSI_SPI_ATTRS=y
|
||||
CONFIG_SCSI_FC_ATTRS=y
|
||||
# CONFIG_SCSI_ISCSI_ATTRS is not set
|
||||
# CONFIG_SCSI_SAS_ATTRS is not set
|
||||
|
||||
#
|
||||
# SCSI low-level drivers
|
||||
#
|
||||
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
|
||||
# CONFIG_SCSI_3W_9XXX is not set
|
||||
# CONFIG_SCSI_ACARD is not set
|
||||
# CONFIG_SCSI_AACRAID is not set
|
||||
# CONFIG_SCSI_AIC7XXX is not set
|
||||
# CONFIG_SCSI_AIC7XXX_OLD is not set
|
||||
# CONFIG_SCSI_AIC79XX is not set
|
||||
# CONFIG_MEGARAID_NEWGEN is not set
|
||||
# CONFIG_MEGARAID_LEGACY is not set
|
||||
# CONFIG_MEGARAID_SAS is not set
|
||||
# CONFIG_SCSI_SATA is not set
|
||||
# CONFIG_SCSI_BUSLOGIC is not set
|
||||
# CONFIG_SCSI_DMX3191D is not set
|
||||
# CONFIG_SCSI_EATA is not set
|
||||
# CONFIG_SCSI_FUTURE_DOMAIN is not set
|
||||
# CONFIG_SCSI_GDTH is not set
|
||||
# CONFIG_SCSI_IPS is not set
|
||||
CONFIG_SCSI_IBMVSCSI=m
|
||||
# CONFIG_SCSI_INITIO is not set
|
||||
# CONFIG_SCSI_INIA100 is not set
|
||||
# CONFIG_SCSI_SYM53C8XX_2 is not set
|
||||
# CONFIG_SCSI_IPR is not set
|
||||
# CONFIG_SCSI_QLOGIC_FC is not set
|
||||
# CONFIG_SCSI_QLOGIC_1280 is not set
|
||||
CONFIG_SCSI_QLA2XXX=y
|
||||
# CONFIG_SCSI_QLA21XX is not set
|
||||
# CONFIG_SCSI_QLA22XX is not set
|
||||
# CONFIG_SCSI_QLA2300 is not set
|
||||
# CONFIG_SCSI_QLA2322 is not set
|
||||
# CONFIG_SCSI_QLA6312 is not set
|
||||
# CONFIG_SCSI_QLA24XX is not set
|
||||
# CONFIG_SCSI_LPFC is not set
|
||||
# CONFIG_SCSI_DC395x is not set
|
||||
# CONFIG_SCSI_DC390T is not set
|
||||
# CONFIG_SCSI_DEBUG is not set
|
||||
|
||||
#
|
||||
# Multi-device support (RAID and LVM)
|
||||
#
|
||||
CONFIG_MD=y
|
||||
CONFIG_BLK_DEV_MD=y
|
||||
CONFIG_MD_LINEAR=y
|
||||
CONFIG_MD_RAID0=y
|
||||
CONFIG_MD_RAID1=y
|
||||
CONFIG_MD_RAID10=m
|
||||
CONFIG_MD_RAID5=y
|
||||
CONFIG_MD_RAID6=m
|
||||
CONFIG_MD_MULTIPATH=m
|
||||
CONFIG_MD_FAULTY=m
|
||||
CONFIG_BLK_DEV_DM=y
|
||||
CONFIG_DM_CRYPT=m
|
||||
CONFIG_DM_SNAPSHOT=m
|
||||
CONFIG_DM_MIRROR=m
|
||||
CONFIG_DM_ZERO=m
|
||||
# CONFIG_DM_MULTIPATH is not set
|
||||
|
||||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_FUSION is not set
|
||||
# CONFIG_FUSION_SPI is not set
|
||||
# CONFIG_FUSION_FC is not set
|
||||
# CONFIG_FUSION_SAS is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
#
|
||||
# CONFIG_IEEE1394 is not set
|
||||
|
||||
#
|
||||
# I2O device support
|
||||
#
|
||||
# CONFIG_I2O is not set
|
||||
|
||||
#
|
||||
# Macintosh device drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Network device support
|
||||
#
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_DUMMY=m
|
||||
CONFIG_BONDING=m
|
||||
# CONFIG_EQUALIZER is not set
|
||||
CONFIG_TUN=m
|
||||
|
||||
#
|
||||
# ARCnet devices
|
||||
#
|
||||
# CONFIG_ARCNET is not set
|
||||
|
||||
#
|
||||
# PHY device support
|
||||
#
|
||||
# CONFIG_PHYLIB is not set
|
||||
|
||||
#
|
||||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=y
|
||||
# CONFIG_HAPPYMEAL is not set
|
||||
# CONFIG_SUNGEM is not set
|
||||
# CONFIG_CASSINI is not set
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
|
||||
#
|
||||
# Tulip family network device support
|
||||
#
|
||||
# CONFIG_NET_TULIP is not set
|
||||
# CONFIG_HP100 is not set
|
||||
CONFIG_NET_PCI=y
|
||||
CONFIG_PCNET32=y
|
||||
# CONFIG_AMD8111_ETH is not set
|
||||
# CONFIG_ADAPTEC_STARFIRE is not set
|
||||
# CONFIG_B44 is not set
|
||||
# CONFIG_FORCEDETH is not set
|
||||
# CONFIG_DGRS is not set
|
||||
# CONFIG_EEPRO100 is not set
|
||||
CONFIG_E100=y
|
||||
# CONFIG_FEALNX is not set
|
||||
# CONFIG_NATSEMI is not set
|
||||
# CONFIG_NE2K_PCI is not set
|
||||
# CONFIG_8139CP is not set
|
||||
# CONFIG_8139TOO is not set
|
||||
# CONFIG_SIS900 is not set
|
||||
# CONFIG_EPIC100 is not set
|
||||
# CONFIG_SUNDANCE is not set
|
||||
# CONFIG_VIA_RHINE is not set
|
||||
|
||||
#
|
||||
# Ethernet (1000 Mbit)
|
||||
#
|
||||
CONFIG_ACENIC=m
|
||||
# CONFIG_ACENIC_OMIT_TIGON_I is not set
|
||||
# CONFIG_DL2K is not set
|
||||
CONFIG_E1000=m
|
||||
# CONFIG_E1000_NAPI is not set
|
||||
# CONFIG_NS83820 is not set
|
||||
# CONFIG_HAMACHI is not set
|
||||
# CONFIG_YELLOWFIN is not set
|
||||
# CONFIG_R8169 is not set
|
||||
# CONFIG_SIS190 is not set
|
||||
# CONFIG_SKGE is not set
|
||||
# CONFIG_SK98LIN is not set
|
||||
# CONFIG_VIA_VELOCITY is not set
|
||||
# CONFIG_TIGON3 is not set
|
||||
# CONFIG_BNX2 is not set
|
||||
|
||||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
#
|
||||
# CONFIG_CHELSIO_T1 is not set
|
||||
# CONFIG_IXGB is not set
|
||||
# CONFIG_S2IO is not set
|
||||
|
||||
#
|
||||
# Token Ring devices
|
||||
#
|
||||
CONFIG_TR=y
|
||||
CONFIG_IBMOL=y
|
||||
# CONFIG_3C359 is not set
|
||||
# CONFIG_TMS380TR is not set
|
||||
|
||||
#
|
||||
# Wireless LAN (non-hamradio)
|
||||
#
|
||||
# CONFIG_NET_RADIO is not set
|
||||
|
||||
#
|
||||
# Wan interfaces
|
||||
#
|
||||
# CONFIG_WAN is not set
|
||||
CONFIG_ISERIES_VETH=y
|
||||
# CONFIG_FDDI is not set
|
||||
# CONFIG_HIPPI is not set
|
||||
CONFIG_PPP=m
|
||||
# CONFIG_PPP_MULTILINK is not set
|
||||
# CONFIG_PPP_FILTER is not set
|
||||
CONFIG_PPP_ASYNC=m
|
||||
CONFIG_PPP_SYNC_TTY=m
|
||||
CONFIG_PPP_DEFLATE=m
|
||||
CONFIG_PPP_BSDCOMP=m
|
||||
CONFIG_PPPOE=m
|
||||
# CONFIG_SLIP is not set
|
||||
# CONFIG_NET_FC is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
CONFIG_NETCONSOLE=y
|
||||
CONFIG_NETPOLL=y
|
||||
CONFIG_NETPOLL_RX=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
CONFIG_NET_POLL_CONTROLLER=y
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
#
|
||||
# CONFIG_ISDN is not set
|
||||
|
||||
#
|
||||
# Telephony Support
|
||||
#
|
||||
# CONFIG_PHONE is not set
|
||||
|
||||
#
|
||||
# Input device support
|
||||
#
|
||||
CONFIG_INPUT=y
|
||||
|
||||
#
|
||||
# Userland interfaces
|
||||
#
|
||||
CONFIG_INPUT_MOUSEDEV=y
|
||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||
# CONFIG_INPUT_JOYDEV is not set
|
||||
# CONFIG_INPUT_TSDEV is not set
|
||||
# CONFIG_INPUT_EVDEV is not set
|
||||
# CONFIG_INPUT_EVBUG is not set
|
||||
|
||||
#
|
||||
# Input Device Drivers
|
||||
#
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||
# CONFIG_INPUT_MISC is not set
|
||||
|
||||
#
|
||||
# Hardware I/O ports
|
||||
#
|
||||
# CONFIG_SERIO is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
|
||||
#
|
||||
# Character devices
|
||||
#
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
# Serial drivers
|
||||
#
|
||||
# CONFIG_SERIAL_8250 is not set
|
||||
|
||||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
CONFIG_SERIAL_CORE=m
|
||||
CONFIG_SERIAL_ICOM=m
|
||||
# CONFIG_SERIAL_JSM is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=256
|
||||
|
||||
#
|
||||
# IPMI
|
||||
#
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
|
||||
#
|
||||
# Watchdog Cards
|
||||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
|
||||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
# CONFIG_AGP is not set
|
||||
# CONFIG_DRM is not set
|
||||
CONFIG_RAW_DRIVER=y
|
||||
CONFIG_MAX_RAW_DEVS=256
|
||||
# CONFIG_HANGCHECK_TIMER is not set
|
||||
|
||||
#
|
||||
# TPM devices
|
||||
#
|
||||
# CONFIG_TCG_TPM is not set
|
||||
|
||||
#
|
||||
# I2C support
|
||||
#
|
||||
# CONFIG_I2C is not set
|
||||
|
||||
#
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
# CONFIG_W1 is not set
|
||||
|
||||
#
|
||||
# Hardware Monitoring support
|
||||
#
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_HWMON_VID is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia Capabilities Port drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
|
||||
#
|
||||
# Digital Video Broadcasting Devices
|
||||
#
|
||||
# CONFIG_DVB is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
#
|
||||
# CONFIG_FB is not set
|
||||
|
||||
#
|
||||
# Sound
|
||||
#
|
||||
# CONFIG_SOUND is not set
|
||||
|
||||
#
|
||||
# USB support
|
||||
#
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
# CONFIG_USB is not set
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
# CONFIG_USB_GADGET is not set
|
||||
|
||||
#
|
||||
# MMC/SD Card support
|
||||
#
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# InfiniBand support
|
||||
#
|
||||
# CONFIG_INFINIBAND is not set
|
||||
|
||||
#
|
||||
# SN Devices
|
||||
#
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_EXT2_FS_XATTR=y
|
||||
CONFIG_EXT2_FS_POSIX_ACL=y
|
||||
CONFIG_EXT2_FS_SECURITY=y
|
||||
CONFIG_EXT2_FS_XIP=y
|
||||
CONFIG_FS_XIP=y
|
||||
CONFIG_EXT3_FS=y
|
||||
CONFIG_EXT3_FS_XATTR=y
|
||||
CONFIG_EXT3_FS_POSIX_ACL=y
|
||||
CONFIG_EXT3_FS_SECURITY=y
|
||||
CONFIG_JBD=y
|
||||
# CONFIG_JBD_DEBUG is not set
|
||||
CONFIG_FS_MBCACHE=y
|
||||
CONFIG_REISERFS_FS=y
|
||||
# CONFIG_REISERFS_CHECK is not set
|
||||
# CONFIG_REISERFS_PROC_INFO is not set
|
||||
CONFIG_REISERFS_FS_XATTR=y
|
||||
CONFIG_REISERFS_FS_POSIX_ACL=y
|
||||
CONFIG_REISERFS_FS_SECURITY=y
|
||||
CONFIG_JFS_FS=m
|
||||
CONFIG_JFS_POSIX_ACL=y
|
||||
CONFIG_JFS_SECURITY=y
|
||||
# CONFIG_JFS_DEBUG is not set
|
||||
# CONFIG_JFS_STATISTICS is not set
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
CONFIG_XFS_FS=m
|
||||
CONFIG_XFS_EXPORT=y
|
||||
# CONFIG_XFS_QUOTA is not set
|
||||
CONFIG_XFS_SECURITY=y
|
||||
CONFIG_XFS_POSIX_ACL=y
|
||||
# CONFIG_XFS_RT is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
CONFIG_AUTOFS_FS=m
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
# CONFIG_FUSE_FS is not set
|
||||
|
||||
#
|
||||
# CD-ROM/DVD Filesystems
|
||||
#
|
||||
CONFIG_ISO9660_FS=y
|
||||
CONFIG_JOLIET=y
|
||||
CONFIG_ZISOFS=y
|
||||
CONFIG_ZISOFS_FS=y
|
||||
CONFIG_UDF_FS=m
|
||||
CONFIG_UDF_NLS=y
|
||||
|
||||
#
|
||||
# DOS/FAT/NT Filesystems
|
||||
#
|
||||
CONFIG_FAT_FS=y
|
||||
CONFIG_MSDOS_FS=y
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_FAT_DEFAULT_CODEPAGE=437
|
||||
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
|
||||
# CONFIG_NTFS_FS is not set
|
||||
|
||||
#
|
||||
# Pseudo filesystems
|
||||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_SYSFS=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_HUGETLBFS is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
|
||||
#
|
||||
# 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_BEFS_FS is not set
|
||||
# CONFIG_BFS_FS is not set
|
||||
# CONFIG_EFS_FS is not set
|
||||
CONFIG_CRAMFS=y
|
||||
# CONFIG_VXFS_FS is not set
|
||||
# CONFIG_HPFS_FS is not set
|
||||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
|
||||
#
|
||||
# Network File Systems
|
||||
#
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_NFS_V4=y
|
||||
# CONFIG_NFS_DIRECTIO is not set
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V2_ACL=y
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NFSD_V3_ACL=y
|
||||
CONFIG_NFSD_V4=y
|
||||
CONFIG_NFSD_TCP=y
|
||||
CONFIG_LOCKD=y
|
||||
CONFIG_LOCKD_V4=y
|
||||
CONFIG_EXPORTFS=m
|
||||
CONFIG_NFS_ACL_SUPPORT=y
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=y
|
||||
CONFIG_SUNRPC_GSS=y
|
||||
CONFIG_RPCSEC_GSS_KRB5=y
|
||||
CONFIG_RPCSEC_GSS_SPKM3=m
|
||||
# CONFIG_SMB_FS is not set
|
||||
CONFIG_CIFS=m
|
||||
# CONFIG_CIFS_STATS is not set
|
||||
CONFIG_CIFS_XATTR=y
|
||||
CONFIG_CIFS_POSIX=y
|
||||
# CONFIG_CIFS_EXPERIMENTAL is not set
|
||||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
# CONFIG_9P_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
#
|
||||
# CONFIG_PARTITION_ADVANCED is not set
|
||||
CONFIG_MSDOS_PARTITION=y
|
||||
|
||||
#
|
||||
# Native Language Support
|
||||
#
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NLS_DEFAULT="iso8859-1"
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
# CONFIG_NLS_CODEPAGE_737 is not set
|
||||
# CONFIG_NLS_CODEPAGE_775 is not set
|
||||
# CONFIG_NLS_CODEPAGE_850 is not set
|
||||
# CONFIG_NLS_CODEPAGE_852 is not set
|
||||
# CONFIG_NLS_CODEPAGE_855 is not set
|
||||
# CONFIG_NLS_CODEPAGE_857 is not set
|
||||
# CONFIG_NLS_CODEPAGE_860 is not set
|
||||
# CONFIG_NLS_CODEPAGE_861 is not set
|
||||
# CONFIG_NLS_CODEPAGE_862 is not set
|
||||
# CONFIG_NLS_CODEPAGE_863 is not set
|
||||
# CONFIG_NLS_CODEPAGE_864 is not set
|
||||
# CONFIG_NLS_CODEPAGE_865 is not set
|
||||
# CONFIG_NLS_CODEPAGE_866 is not set
|
||||
# CONFIG_NLS_CODEPAGE_869 is not set
|
||||
# CONFIG_NLS_CODEPAGE_936 is not set
|
||||
# CONFIG_NLS_CODEPAGE_950 is not set
|
||||
# CONFIG_NLS_CODEPAGE_932 is not set
|
||||
# CONFIG_NLS_CODEPAGE_949 is not set
|
||||
# CONFIG_NLS_CODEPAGE_874 is not set
|
||||
# CONFIG_NLS_ISO8859_8 is not set
|
||||
# CONFIG_NLS_CODEPAGE_1250 is not set
|
||||
# CONFIG_NLS_CODEPAGE_1251 is not set
|
||||
CONFIG_NLS_ASCII=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
# CONFIG_NLS_ISO8859_2 is not set
|
||||
# CONFIG_NLS_ISO8859_3 is not set
|
||||
# CONFIG_NLS_ISO8859_4 is not set
|
||||
# CONFIG_NLS_ISO8859_5 is not set
|
||||
# CONFIG_NLS_ISO8859_6 is not set
|
||||
# CONFIG_NLS_ISO8859_7 is not set
|
||||
# CONFIG_NLS_ISO8859_9 is not set
|
||||
# CONFIG_NLS_ISO8859_13 is not set
|
||||
# CONFIG_NLS_ISO8859_14 is not set
|
||||
# CONFIG_NLS_ISO8859_15 is not set
|
||||
# CONFIG_NLS_KOI8_R is not set
|
||||
# CONFIG_NLS_KOI8_U is not set
|
||||
# CONFIG_NLS_UTF8 is not set
|
||||
|
||||
#
|
||||
# iSeries device drivers
|
||||
#
|
||||
CONFIG_VIOCONS=y
|
||||
CONFIG_VIODASD=y
|
||||
CONFIG_VIOCD=m
|
||||
CONFIG_VIOTAPE=m
|
||||
CONFIG_VIOPATH=y
|
||||
|
||||
#
|
||||
# Profiling support
|
||||
#
|
||||
CONFIG_PROFILING=y
|
||||
CONFIG_OPROFILE=y
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_LOG_BUF_SHIFT=17
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
CONFIG_DEBUG_STACKOVERFLOW=y
|
||||
# CONFIG_KPROBES is not set
|
||||
CONFIG_DEBUG_STACK_USAGE=y
|
||||
# CONFIG_DEBUGGER is not set
|
||||
# CONFIG_PPCDBG is not set
|
||||
CONFIG_IRQSTACKS=y
|
||||
|
||||
#
|
||||
# Security options
|
||||
#
|
||||
# CONFIG_KEYS is not set
|
||||
# CONFIG_SECURITY is not set
|
||||
|
||||
#
|
||||
# Cryptographic options
|
||||
#
|
||||
CONFIG_CRYPTO=y
|
||||
CONFIG_CRYPTO_HMAC=y
|
||||
CONFIG_CRYPTO_NULL=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MD5=y
|
||||
CONFIG_CRYPTO_SHA1=m
|
||||
CONFIG_CRYPTO_SHA256=m
|
||||
CONFIG_CRYPTO_SHA512=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_TGR192=m
|
||||
CONFIG_CRYPTO_DES=y
|
||||
CONFIG_CRYPTO_BLOWFISH=m
|
||||
CONFIG_CRYPTO_TWOFISH=m
|
||||
CONFIG_CRYPTO_SERPENT=m
|
||||
CONFIG_CRYPTO_AES=m
|
||||
CONFIG_CRYPTO_CAST5=m
|
||||
CONFIG_CRYPTO_CAST6=m
|
||||
CONFIG_CRYPTO_TEA=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_KHAZAD=m
|
||||
CONFIG_CRYPTO_ANUBIS=m
|
||||
CONFIG_CRYPTO_DEFLATE=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_CRC32C=m
|
||||
CONFIG_CRYPTO_TEST=m
|
||||
|
||||
#
|
||||
# Hardware crypto devices
|
||||
#
|
||||
|
||||
#
|
||||
# Library routines
|
||||
#
|
||||
CONFIG_CRC_CCITT=m
|
||||
# CONFIG_CRC16 is not set
|
||||
CONFIG_CRC32=y
|
||||
CONFIG_LIBCRC32C=m
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZLIB_DEFLATE=m
|
||||
CONFIG_TEXTSEARCH=y
|
||||
CONFIG_TEXTSEARCH_KMP=m
|
||||
CONFIG_TEXTSEARCH_BM=m
|
||||
CONFIG_TEXTSEARCH_FSM=m
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,7 +0,0 @@
|
|||
#
|
||||
# Makefile for the linux ppc64 kernel.
|
||||
#
|
||||
|
||||
obj-y += idle.o align.o
|
||||
|
||||
obj-$(CONFIG_PPC_MULTIPLATFORM) += nvram.o
|
|
@ -514,8 +514,6 @@ static int acpi_processor_set_power_policy(struct acpi_processor *pr)
|
|||
|
||||
static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr)
|
||||
{
|
||||
int i;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_processor_get_power_info_fadt");
|
||||
|
||||
if (!pr)
|
||||
|
@ -524,8 +522,7 @@ static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr)
|
|||
if (!pr->pblk)
|
||||
return_VALUE(-ENODEV);
|
||||
|
||||
for (i = 0; i < ACPI_PROCESSOR_MAX_POWER; i++)
|
||||
memset(pr->power.states, 0, sizeof(struct acpi_processor_cx));
|
||||
memset(pr->power.states, 0, sizeof(pr->power.states));
|
||||
|
||||
/* if info is obtained from pblk/fadt, type equals state */
|
||||
pr->power.states[ACPI_STATE_C1].type = ACPI_STATE_C1;
|
||||
|
@ -555,13 +552,9 @@ static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr)
|
|||
|
||||
static int acpi_processor_get_power_info_default_c1(struct acpi_processor *pr)
|
||||
{
|
||||
int i;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_processor_get_power_info_default_c1");
|
||||
|
||||
for (i = 0; i < ACPI_PROCESSOR_MAX_POWER; i++)
|
||||
memset(&(pr->power.states[i]), 0,
|
||||
sizeof(struct acpi_processor_cx));
|
||||
memset(pr->power.states, 0, sizeof(pr->power.states));
|
||||
|
||||
/* if info is obtained from pblk/fadt, type equals state */
|
||||
pr->power.states[ACPI_STATE_C1].type = ACPI_STATE_C1;
|
||||
|
@ -873,7 +866,8 @@ static int acpi_processor_get_power_info(struct acpi_processor *pr)
|
|||
for (i = 1; i < ACPI_PROCESSOR_MAX_POWER; i++) {
|
||||
if (pr->power.states[i].valid) {
|
||||
pr->power.count = i;
|
||||
pr->flags.power = 1;
|
||||
if (pr->power.states[i].type >= ACPI_STATE_C2)
|
||||
pr->flags.power = 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2203,7 +2203,7 @@ static void setup_xaction_handlers(struct smi_info *smi_info)
|
|||
|
||||
static inline void wait_for_timer_and_thread(struct smi_info *smi_info)
|
||||
{
|
||||
if (smi_info->thread != ERR_PTR(-ENOMEM))
|
||||
if (smi_info->thread != NULL && smi_info->thread != ERR_PTR(-ENOMEM))
|
||||
kthread_stop(smi_info->thread);
|
||||
del_timer_sync(&smi_info->si_timer);
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@ menu "TPM devices"
|
|||
|
||||
config TCG_TPM
|
||||
tristate "TPM Hardware Support"
|
||||
depends on EXPERIMENTAL && PCI
|
||||
depends on EXPERIMENTAL
|
||||
---help---
|
||||
If you have a TPM security chip in your system, which
|
||||
implements the Trusted Computing Group's specification,
|
||||
|
|
|
@ -377,6 +377,7 @@ int tpm_release(struct inode *inode, struct file *file)
|
|||
file->private_data = NULL;
|
||||
chip->num_opens--;
|
||||
del_singleshot_timer_sync(&chip->user_read_timer);
|
||||
flush_scheduled_work();
|
||||
atomic_set(&chip->data_pending, 0);
|
||||
put_device(chip->dev);
|
||||
kfree(chip->data_buffer);
|
||||
|
@ -428,6 +429,7 @@ ssize_t tpm_read(struct file * file, char __user *buf,
|
|||
int ret_size;
|
||||
|
||||
del_singleshot_timer_sync(&chip->user_read_timer);
|
||||
flush_scheduled_work();
|
||||
ret_size = atomic_read(&chip->data_pending);
|
||||
atomic_set(&chip->data_pending, 0);
|
||||
if (ret_size > 0) { /* relay data */
|
||||
|
|
|
@ -47,13 +47,12 @@ static int tpm_atml_recv(struct tpm_chip *chip, u8 *buf, size_t count)
|
|||
return -EIO;
|
||||
|
||||
for (i = 0; i < 6; i++) {
|
||||
status = atmel_getb(chip, 1);
|
||||
status = ioread8(chip->vendor->iobase + 1);
|
||||
if ((status & ATML_STATUS_DATA_AVAIL) == 0) {
|
||||
dev_err(chip->dev,
|
||||
"error reading header\n");
|
||||
dev_err(chip->dev, "error reading header\n");
|
||||
return -EIO;
|
||||
}
|
||||
*buf++ = atmel_getb(chip, 0);
|
||||
*buf++ = ioread8(chip->vendor->iobase);
|
||||
}
|
||||
|
||||
/* size of the data received */
|
||||
|
@ -64,10 +63,9 @@ static int tpm_atml_recv(struct tpm_chip *chip, u8 *buf, size_t count)
|
|||
dev_err(chip->dev,
|
||||
"Recv size(%d) less than available space\n", size);
|
||||
for (; i < size; i++) { /* clear the waiting data anyway */
|
||||
status = atmel_getb(chip, 1);
|
||||
status = ioread8(chip->vendor->iobase + 1);
|
||||
if ((status & ATML_STATUS_DATA_AVAIL) == 0) {
|
||||
dev_err(chip->dev,
|
||||
"error reading data\n");
|
||||
dev_err(chip->dev, "error reading data\n");
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
|
@ -76,17 +74,17 @@ static int tpm_atml_recv(struct tpm_chip *chip, u8 *buf, size_t count)
|
|||
|
||||
/* read all the data available */
|
||||
for (; i < size; i++) {
|
||||
status = atmel_getb(chip, 1);
|
||||
status = ioread8(chip->vendor->iobase + 1);
|
||||
if ((status & ATML_STATUS_DATA_AVAIL) == 0) {
|
||||
dev_err(chip->dev,
|
||||
"error reading data\n");
|
||||
dev_err(chip->dev, "error reading data\n");
|
||||
return -EIO;
|
||||
}
|
||||
*buf++ = atmel_getb(chip, 0);
|
||||
*buf++ = ioread8(chip->vendor->iobase);
|
||||
}
|
||||
|
||||
/* make sure data available is gone */
|
||||
status = atmel_getb(chip, 1);
|
||||
status = ioread8(chip->vendor->iobase + 1);
|
||||
|
||||
if (status & ATML_STATUS_DATA_AVAIL) {
|
||||
dev_err(chip->dev, "data available is stuck\n");
|
||||
return -EIO;
|
||||
|
@ -102,7 +100,7 @@ static int tpm_atml_send(struct tpm_chip *chip, u8 *buf, size_t count)
|
|||
dev_dbg(chip->dev, "tpm_atml_send:\n");
|
||||
for (i = 0; i < count; i++) {
|
||||
dev_dbg(chip->dev, "%d 0x%x(%d)\n", i, buf[i], buf[i]);
|
||||
atmel_putb(buf[i], chip, 0);
|
||||
iowrite8(buf[i], chip->vendor->iobase);
|
||||
}
|
||||
|
||||
return count;
|
||||
|
@ -110,12 +108,12 @@ static int tpm_atml_send(struct tpm_chip *chip, u8 *buf, size_t count)
|
|||
|
||||
static void tpm_atml_cancel(struct tpm_chip *chip)
|
||||
{
|
||||
atmel_putb(ATML_STATUS_ABORT, chip, 1);
|
||||
iowrite8(ATML_STATUS_ABORT, chip->vendor->iobase + 1);
|
||||
}
|
||||
|
||||
static u8 tpm_atml_status(struct tpm_chip *chip)
|
||||
{
|
||||
return atmel_getb(chip, 1);
|
||||
return ioread8(chip->vendor->iobase + 1);
|
||||
}
|
||||
|
||||
static struct file_operations atmel_ops = {
|
||||
|
@ -162,7 +160,8 @@ static void atml_plat_remove(void)
|
|||
|
||||
if (chip) {
|
||||
if (chip->vendor->have_region)
|
||||
atmel_release_region(chip->vendor->base, chip->vendor->region_size);
|
||||
atmel_release_region(chip->vendor->base,
|
||||
chip->vendor->region_size);
|
||||
atmel_put_base_addr(chip->vendor);
|
||||
tpm_remove_hardware(chip->dev);
|
||||
platform_device_unregister(pdev);
|
||||
|
@ -183,14 +182,19 @@ static int __init init_atmel(void)
|
|||
|
||||
driver_register(&atml_drv);
|
||||
|
||||
if (atmel_get_base_addr(&tpm_atmel) != 0) {
|
||||
if ((tpm_atmel.iobase = atmel_get_base_addr(&tpm_atmel)) == NULL) {
|
||||
rc = -ENODEV;
|
||||
goto err_unreg_drv;
|
||||
}
|
||||
|
||||
tpm_atmel.have_region = (atmel_request_region( tpm_atmel.base, tpm_atmel.region_size, "tpm_atmel0") == NULL) ? 0 : 1;
|
||||
tpm_atmel.have_region =
|
||||
(atmel_request_region
|
||||
(tpm_atmel.base, tpm_atmel.region_size,
|
||||
"tpm_atmel0") == NULL) ? 0 : 1;
|
||||
|
||||
if (IS_ERR(pdev = platform_device_register_simple("tpm_atmel", -1, NULL, 0 ))) {
|
||||
if (IS_ERR
|
||||
(pdev =
|
||||
platform_device_register_simple("tpm_atmel", -1, NULL, 0))) {
|
||||
rc = PTR_ERR(pdev);
|
||||
goto err_rel_reg;
|
||||
}
|
||||
|
@ -202,9 +206,10 @@ static int __init init_atmel(void)
|
|||
err_unreg_dev:
|
||||
platform_device_unregister(pdev);
|
||||
err_rel_reg:
|
||||
if (tpm_atmel.have_region)
|
||||
atmel_release_region(tpm_atmel.base, tpm_atmel.region_size);
|
||||
atmel_put_base_addr(&tpm_atmel);
|
||||
if (tpm_atmel.have_region)
|
||||
atmel_release_region(tpm_atmel.base,
|
||||
tpm_atmel.region_size);
|
||||
err_unreg_drv:
|
||||
driver_unregister(&atml_drv);
|
||||
return rc;
|
||||
|
|
|
@ -27,12 +27,14 @@
|
|||
#define atmel_putb(val, chip, offset) writeb(val, chip->vendor->iobase + offset)
|
||||
#define atmel_request_region request_mem_region
|
||||
#define atmel_release_region release_mem_region
|
||||
static inline void atmel_put_base_addr(struct tpm_vendor_specific *vendor)
|
||||
|
||||
static inline void atmel_put_base_addr(struct tpm_vendor_specific
|
||||
*vendor)
|
||||
{
|
||||
iounmap(vendor->iobase);
|
||||
}
|
||||
|
||||
static int atmel_get_base_addr(struct tpm_vendor_specific *vendor)
|
||||
static void __iomem * atmel_get_base_addr(struct tpm_vendor_specific *vendor)
|
||||
{
|
||||
struct device_node *dn;
|
||||
unsigned long address, size;
|
||||
|
@ -44,11 +46,11 @@ static int atmel_get_base_addr(struct tpm_vendor_specific *vendor)
|
|||
dn = of_find_node_by_name(NULL, "tpm");
|
||||
|
||||
if (!dn)
|
||||
return 1;
|
||||
return NULL;
|
||||
|
||||
if (!device_is_compatible(dn, "AT97SC3201")) {
|
||||
of_node_put(dn);
|
||||
return 1;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
reg = (unsigned int *) get_property(dn, "reg", ®len);
|
||||
|
@ -71,8 +73,7 @@ static int atmel_get_base_addr(struct tpm_vendor_specific *vendor)
|
|||
|
||||
vendor->base = address;
|
||||
vendor->region_size = size;
|
||||
vendor->iobase = ioremap(address, size);
|
||||
return 0;
|
||||
return ioremap(vendor->base, vendor->region_size);
|
||||
}
|
||||
#else
|
||||
#define atmel_getb(chip, offset) inb(chip->vendor->base + offset)
|
||||
|
@ -105,18 +106,19 @@ static int atmel_verify_tpm11(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline void atmel_put_base_addr(struct tpm_vendor_specific *vendor)
|
||||
static inline void atmel_put_base_addr(struct tpm_vendor_specific
|
||||
*vendor)
|
||||
{
|
||||
}
|
||||
|
||||
/* Determine where to talk to device */
|
||||
static unsigned long atmel_get_base_addr(struct tpm_vendor_specific
|
||||
static void __iomem * atmel_get_base_addr(struct tpm_vendor_specific
|
||||
*vendor)
|
||||
{
|
||||
int lo, hi;
|
||||
|
||||
if (atmel_verify_tpm11() != 0)
|
||||
return 1;
|
||||
return NULL;
|
||||
|
||||
lo = tpm_read_index(TPM_ADDR, TPM_ATMEL_BASE_ADDR_LO);
|
||||
hi = tpm_read_index(TPM_ADDR, TPM_ATMEL_BASE_ADDR_HI);
|
||||
|
@ -124,6 +126,6 @@ static unsigned long atmel_get_base_addr(struct tpm_vendor_specific
|
|||
vendor->base = (hi << 8) | lo;
|
||||
vendor->region_size = 2;
|
||||
|
||||
return 0;
|
||||
return ioport_map(vendor->base, vendor->region_size);
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -326,9 +326,9 @@ static int write_page(struct bitmap *bitmap, struct page *page, int wait)
|
|||
}
|
||||
}
|
||||
|
||||
ret = page->mapping->a_ops->prepare_write(NULL, page, 0, PAGE_SIZE);
|
||||
ret = page->mapping->a_ops->prepare_write(bitmap->file, page, 0, PAGE_SIZE);
|
||||
if (!ret)
|
||||
ret = page->mapping->a_ops->commit_write(NULL, page, 0,
|
||||
ret = page->mapping->a_ops->commit_write(bitmap->file, page, 0,
|
||||
PAGE_SIZE);
|
||||
if (ret) {
|
||||
unlock_page(page);
|
||||
|
|
|
@ -3846,11 +3846,20 @@ static int is_mddev_idle(mddev_t *mddev)
|
|||
curr_events = disk_stat_read(disk, sectors[0]) +
|
||||
disk_stat_read(disk, sectors[1]) -
|
||||
atomic_read(&disk->sync_io);
|
||||
/* Allow some slack between valud of curr_events and last_events,
|
||||
* as there are some uninteresting races.
|
||||
/* The difference between curr_events and last_events
|
||||
* will be affected by any new non-sync IO (making
|
||||
* curr_events bigger) and any difference in the amount of
|
||||
* in-flight syncio (making current_events bigger or smaller)
|
||||
* The amount in-flight is currently limited to
|
||||
* 32*64K in raid1/10 and 256*PAGE_SIZE in raid5/6
|
||||
* which is at most 4096 sectors.
|
||||
* These numbers are fairly fragile and should be made
|
||||
* more robust, probably by enforcing the
|
||||
* 'window size' that md_do_sync sort-of uses.
|
||||
*
|
||||
* Note: the following is an unsigned comparison.
|
||||
*/
|
||||
if ((curr_events - rdev->last_events + 32) > 64) {
|
||||
if ((curr_events - rdev->last_events + 4096) > 8192) {
|
||||
rdev->last_events = curr_events;
|
||||
idle = 0;
|
||||
}
|
||||
|
@ -4109,7 +4118,7 @@ static void md_do_sync(mddev_t *mddev)
|
|||
if (currspeed > sysctl_speed_limit_min) {
|
||||
if ((currspeed > sysctl_speed_limit_max) ||
|
||||
!is_mddev_idle(mddev)) {
|
||||
msleep(250);
|
||||
msleep(500);
|
||||
goto repeat;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1179,12 +1179,12 @@ raw3270_create_attributes(struct raw3270 *rp)
|
|||
//FIXME: check return code
|
||||
sysfs_create_group(&rp->cdev->dev.kobj, &raw3270_attr_group);
|
||||
rp->clttydev =
|
||||
class_device_create(class3270,
|
||||
class_device_create(class3270, NULL,
|
||||
MKDEV(IBM_TTY3270_MAJOR, rp->minor),
|
||||
&rp->cdev->dev, "tty%s",
|
||||
rp->cdev->dev.bus_id);
|
||||
rp->cltubdev =
|
||||
class_device_create(class3270,
|
||||
class_device_create(class3270, NULL,
|
||||
MKDEV(IBM_FS3270_MAJOR, rp->minor),
|
||||
&rp->cdev->dev, "tub%s",
|
||||
rp->cdev->dev.bus_id);
|
||||
|
|
|
@ -185,7 +185,7 @@ static int ohci_hcd_ppc_soc_drv_probe(struct platform_device *pdev)
|
|||
|
||||
static int ohci_hcd_ppc_soc_drv_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct usb_hcd *hcd = platform_get_drvdata(dev);
|
||||
struct usb_hcd *hcd = platform_get_drvdata(pdev);
|
||||
|
||||
usb_hcd_ppc_soc_remove(hcd, pdev);
|
||||
return 0;
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <linux/fb.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/pci.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/prom.h>
|
||||
|
||||
|
@ -325,8 +326,8 @@ static void __init offb_init_nodriver(struct device_node *dp)
|
|||
int *pp, i;
|
||||
unsigned int len;
|
||||
int width = 640, height = 480, depth = 8, pitch;
|
||||
unsigned *up;
|
||||
unsigned long address;
|
||||
unsigned int rsize, *up;
|
||||
unsigned long address = 0;
|
||||
|
||||
if ((pp = (int *) get_property(dp, "depth", &len)) != NULL
|
||||
&& len == sizeof(int))
|
||||
|
@ -344,10 +345,40 @@ static void __init offb_init_nodriver(struct device_node *dp)
|
|||
pitch = 0x1000;
|
||||
} else
|
||||
pitch = width;
|
||||
if ((up = (unsigned *) get_property(dp, "address", &len)) != NULL
|
||||
&& len == sizeof(unsigned))
|
||||
|
||||
rsize = (unsigned long)pitch * (unsigned long)height *
|
||||
(unsigned long)(depth / 8);
|
||||
|
||||
/* Try to match device to a PCI device in order to get a properly
|
||||
* translated address rather then trying to decode the open firmware
|
||||
* stuff in various incorrect ways
|
||||
*/
|
||||
#ifdef CONFIG_PCI
|
||||
/* First try to locate the PCI device if any */
|
||||
{
|
||||
struct pci_dev *pdev = NULL;
|
||||
|
||||
for_each_pci_dev(pdev) {
|
||||
if (dp == pci_device_to_OF_node(pdev))
|
||||
break;
|
||||
}
|
||||
if (pdev) {
|
||||
for (i = 0; i < 6 && address == 0; i++) {
|
||||
if ((pci_resource_flags(pdev, i) &
|
||||
IORESOURCE_MEM) &&
|
||||
(pci_resource_len(pdev, i) >= rsize))
|
||||
address = pci_resource_start(pdev, i);
|
||||
}
|
||||
pci_dev_put(pdev);
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_PCI */
|
||||
|
||||
if (address == 0 &&
|
||||
(up = (unsigned *) get_property(dp, "address", &len)) != NULL &&
|
||||
len == sizeof(unsigned))
|
||||
address = (u_long) * up;
|
||||
else {
|
||||
if (address == 0) {
|
||||
for (i = 0; i < dp->n_addrs; ++i)
|
||||
if (dp->addrs[i].size >=
|
||||
pitch * height * depth / 8)
|
||||
|
|
|
@ -90,6 +90,7 @@ extern void do_cpu_ftr_fixups(unsigned long offset);
|
|||
#define CPU_FTR_NEED_COHERENT ASM_CONST(0x0000000000020000)
|
||||
#define CPU_FTR_NO_BTIC ASM_CONST(0x0000000000040000)
|
||||
#define CPU_FTR_BIG_PHYS ASM_CONST(0x0000000000080000)
|
||||
#define CPU_FTR_NODSISRALIGN ASM_CONST(0x0000000000100000)
|
||||
|
||||
#ifdef __powerpc64__
|
||||
/* Add the 64b processor unique features in the top half of the word */
|
||||
|
@ -97,7 +98,6 @@ extern void do_cpu_ftr_fixups(unsigned long offset);
|
|||
#define CPU_FTR_16M_PAGE ASM_CONST(0x0000000200000000)
|
||||
#define CPU_FTR_TLBIEL ASM_CONST(0x0000000400000000)
|
||||
#define CPU_FTR_NOEXECUTE ASM_CONST(0x0000000800000000)
|
||||
#define CPU_FTR_NODSISRALIGN ASM_CONST(0x0000001000000000)
|
||||
#define CPU_FTR_IABR ASM_CONST(0x0000002000000000)
|
||||
#define CPU_FTR_MMCRA ASM_CONST(0x0000004000000000)
|
||||
#define CPU_FTR_CTRL ASM_CONST(0x0000008000000000)
|
||||
|
@ -113,7 +113,6 @@ extern void do_cpu_ftr_fixups(unsigned long offset);
|
|||
#define CPU_FTR_16M_PAGE ASM_CONST(0x0)
|
||||
#define CPU_FTR_TLBIEL ASM_CONST(0x0)
|
||||
#define CPU_FTR_NOEXECUTE ASM_CONST(0x0)
|
||||
#define CPU_FTR_NODSISRALIGN ASM_CONST(0x0)
|
||||
#define CPU_FTR_IABR ASM_CONST(0x0)
|
||||
#define CPU_FTR_MMCRA ASM_CONST(0x0)
|
||||
#define CPU_FTR_CTRL ASM_CONST(0x0)
|
||||
|
@ -273,18 +272,21 @@ enum {
|
|||
CPU_FTRS_POWER3_32 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
|
||||
CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE,
|
||||
CPU_FTRS_POWER4_32 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
|
||||
CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE,
|
||||
CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_NODSISRALIGN,
|
||||
CPU_FTRS_970_32 = CPU_FTR_COMMON | CPU_FTR_SPLIT_ID_CACHE |
|
||||
CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_ALTIVEC_COMP |
|
||||
CPU_FTR_MAYBE_CAN_NAP,
|
||||
CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_NODSISRALIGN,
|
||||
CPU_FTRS_8XX = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB,
|
||||
CPU_FTRS_40X = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB,
|
||||
CPU_FTRS_44X = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB,
|
||||
CPU_FTRS_E200 = CPU_FTR_USE_TB,
|
||||
CPU_FTRS_E500 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB,
|
||||
CPU_FTRS_40X = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
|
||||
CPU_FTR_NODSISRALIGN,
|
||||
CPU_FTRS_44X = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
|
||||
CPU_FTR_NODSISRALIGN,
|
||||
CPU_FTRS_E200 = CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN,
|
||||
CPU_FTRS_E500 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
|
||||
CPU_FTR_NODSISRALIGN,
|
||||
CPU_FTRS_E500_2 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
|
||||
CPU_FTR_BIG_PHYS,
|
||||
CPU_FTRS_GENERIC_32 = CPU_FTR_COMMON,
|
||||
CPU_FTR_BIG_PHYS | CPU_FTR_NODSISRALIGN,
|
||||
CPU_FTRS_GENERIC_32 = CPU_FTR_COMMON | CPU_FTR_NODSISRALIGN,
|
||||
#ifdef __powerpc64__
|
||||
CPU_FTRS_POWER3 = CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB |
|
||||
CPU_FTR_HPTE_TABLE | CPU_FTR_IABR,
|
||||
|
|
|
@ -13,43 +13,7 @@
|
|||
* Anton Blanchard.
|
||||
*/
|
||||
|
||||
extern unsigned long tb_ticks_per_usec;
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
/* define these here to prevent circular dependencies */
|
||||
/* these instructions control the thread priority on multi-threaded cpus */
|
||||
#define __HMT_low() asm volatile("or 1,1,1")
|
||||
#define __HMT_medium() asm volatile("or 2,2,2")
|
||||
#else
|
||||
#define __HMT_low()
|
||||
#define __HMT_medium()
|
||||
#endif
|
||||
|
||||
#define __barrier() asm volatile("" ::: "memory")
|
||||
|
||||
static inline unsigned long __get_tb(void)
|
||||
{
|
||||
unsigned long rval;
|
||||
|
||||
asm volatile("mftb %0" : "=r" (rval));
|
||||
return rval;
|
||||
}
|
||||
|
||||
static inline void __delay(unsigned long loops)
|
||||
{
|
||||
unsigned long start = __get_tb();
|
||||
|
||||
while((__get_tb() - start) < loops)
|
||||
__HMT_low();
|
||||
__HMT_medium();
|
||||
__barrier();
|
||||
}
|
||||
|
||||
static inline void udelay(unsigned long usecs)
|
||||
{
|
||||
unsigned long loops = tb_ticks_per_usec * usecs;
|
||||
|
||||
__delay(loops);
|
||||
}
|
||||
extern void __delay(unsigned long loops);
|
||||
extern void udelay(unsigned long usecs);
|
||||
|
||||
#endif /* _ASM_POWERPC_DELAY_H */
|
||||
|
|
|
@ -30,6 +30,8 @@ struct device_node;
|
|||
|
||||
#ifdef CONFIG_EEH
|
||||
|
||||
extern int eeh_subsystem_enabled;
|
||||
|
||||
/* Values for eeh_mode bits in device_node */
|
||||
#define EEH_MODE_SUPPORTED (1<<0)
|
||||
#define EEH_MODE_NOCHECK (1<<1)
|
||||
|
@ -75,7 +77,7 @@ void eeh_remove_device(struct pci_dev *);
|
|||
* If this macro yields TRUE, the caller relays to eeh_check_failure()
|
||||
* which does further tests out of line.
|
||||
*/
|
||||
#define EEH_POSSIBLE_ERROR(val, type) ((val) == (type)~0)
|
||||
#define EEH_POSSIBLE_ERROR(val, type) ((val) == (type)~0 && eeh_subsystem_enabled)
|
||||
|
||||
/*
|
||||
* Reads from a device which has been isolated by EEH will return
|
||||
|
|
|
@ -86,7 +86,11 @@ static inline void copy_page(void *to, void *from)
|
|||
extern u64 ppc64_pft_size;
|
||||
|
||||
/* Large pages size */
|
||||
#ifdef CONFIG_HUGETLB_PAGE
|
||||
extern unsigned int HPAGE_SHIFT;
|
||||
#else
|
||||
#define HPAGE_SHIFT PAGE_SHIFT
|
||||
#endif
|
||||
#define HPAGE_SIZE ((1UL) << HPAGE_SHIFT)
|
||||
#define HPAGE_MASK (~(HPAGE_SIZE - 1))
|
||||
#define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT)
|
||||
|
|
|
@ -41,6 +41,10 @@ static inline int node_to_first_cpu(int node)
|
|||
.cache_hot_time = (10*1000000), \
|
||||
.cache_nice_tries = 1, \
|
||||
.per_cpu_gain = 100, \
|
||||
.busy_idx = 3, \
|
||||
.idle_idx = 1, \
|
||||
.newidle_idx = 2, \
|
||||
.wake_idx = 1, \
|
||||
.flags = SD_LOAD_BALANCE \
|
||||
| SD_BALANCE_EXEC \
|
||||
| SD_BALANCE_NEWIDLE \
|
||||
|
|
|
@ -1091,5 +1091,7 @@ typedef struct im_idma {
|
|||
#define CPM_IMMR_OFFSET 0x101a8
|
||||
#endif
|
||||
|
||||
#define FCC_PSMR_RMII ((uint)0x00020000) /* Use RMII interface */
|
||||
|
||||
#endif /* __CPM2__ */
|
||||
#endif /* __KERNEL__ */
|
||||
|
|
|
@ -80,6 +80,7 @@ struct rcu_torture {
|
|||
struct rcu_head rtort_rcu;
|
||||
int rtort_pipe_count;
|
||||
struct list_head rtort_free;
|
||||
int rtort_mbtest;
|
||||
};
|
||||
|
||||
static int fullstop = 0; /* stop generating callbacks at test end. */
|
||||
|
@ -96,6 +97,8 @@ static atomic_t rcu_torture_wcount[RCU_TORTURE_PIPE_LEN + 1];
|
|||
atomic_t n_rcu_torture_alloc;
|
||||
atomic_t n_rcu_torture_alloc_fail;
|
||||
atomic_t n_rcu_torture_free;
|
||||
atomic_t n_rcu_torture_mberror;
|
||||
atomic_t n_rcu_torture_error;
|
||||
|
||||
/*
|
||||
* Allocate an element from the rcu_tortures pool.
|
||||
|
@ -145,9 +148,10 @@ rcu_torture_cb(struct rcu_head *p)
|
|||
if (i > RCU_TORTURE_PIPE_LEN)
|
||||
i = RCU_TORTURE_PIPE_LEN;
|
||||
atomic_inc(&rcu_torture_wcount[i]);
|
||||
if (++rp->rtort_pipe_count >= RCU_TORTURE_PIPE_LEN)
|
||||
if (++rp->rtort_pipe_count >= RCU_TORTURE_PIPE_LEN) {
|
||||
rp->rtort_mbtest = 0;
|
||||
rcu_torture_free(rp);
|
||||
else
|
||||
} else
|
||||
call_rcu(p, rcu_torture_cb);
|
||||
}
|
||||
|
||||
|
@ -206,6 +210,7 @@ rcu_torture_writer(void *arg)
|
|||
rp->rtort_pipe_count = 0;
|
||||
udelay(rcu_random(&rand) & 0x3ff);
|
||||
old_rp = rcu_torture_current;
|
||||
rp->rtort_mbtest = 1;
|
||||
rcu_assign_pointer(rcu_torture_current, rp);
|
||||
smp_wmb();
|
||||
if (old_rp != NULL) {
|
||||
|
@ -252,6 +257,8 @@ rcu_torture_reader(void *arg)
|
|||
schedule_timeout_interruptible(HZ);
|
||||
continue;
|
||||
}
|
||||
if (p->rtort_mbtest == 0)
|
||||
atomic_inc(&n_rcu_torture_mberror);
|
||||
udelay(rcu_random(&rand) & 0x7f);
|
||||
preempt_disable();
|
||||
pipe_count = p->rtort_pipe_count;
|
||||
|
@ -300,16 +307,22 @@ rcu_torture_printk(char *page)
|
|||
}
|
||||
cnt += sprintf(&page[cnt], "rcutorture: ");
|
||||
cnt += sprintf(&page[cnt],
|
||||
"rtc: %p ver: %ld tfle: %d rta: %d rtaf: %d rtf: %d",
|
||||
"rtc: %p ver: %ld tfle: %d rta: %d rtaf: %d rtf: %d "
|
||||
"rtmbe: %d",
|
||||
rcu_torture_current,
|
||||
rcu_torture_current_version,
|
||||
list_empty(&rcu_torture_freelist),
|
||||
atomic_read(&n_rcu_torture_alloc),
|
||||
atomic_read(&n_rcu_torture_alloc_fail),
|
||||
atomic_read(&n_rcu_torture_free));
|
||||
atomic_read(&n_rcu_torture_free),
|
||||
atomic_read(&n_rcu_torture_mberror));
|
||||
if (atomic_read(&n_rcu_torture_mberror) != 0)
|
||||
cnt += sprintf(&page[cnt], " !!!");
|
||||
cnt += sprintf(&page[cnt], "\nrcutorture: ");
|
||||
if (i > 1)
|
||||
if (i > 1) {
|
||||
cnt += sprintf(&page[cnt], "!!! ");
|
||||
atomic_inc(&n_rcu_torture_error);
|
||||
}
|
||||
cnt += sprintf(&page[cnt], "Reader Pipe: ");
|
||||
for (i = 0; i < RCU_TORTURE_PIPE_LEN + 1; i++)
|
||||
cnt += sprintf(&page[cnt], " %ld", pipesummary[i]);
|
||||
|
@ -400,7 +413,9 @@ rcu_torture_cleanup(void)
|
|||
for (i = 0; i < RCU_TORTURE_PIPE_LEN; i++)
|
||||
synchronize_rcu();
|
||||
rcu_torture_stats_print(); /* -After- the stats thread is stopped! */
|
||||
PRINTK_STRING("--- End of test");
|
||||
printk(KERN_ALERT TORTURE_FLAG
|
||||
"--- End of test: %s\n",
|
||||
atomic_read(&n_rcu_torture_error) == 0 ? "SUCCESS" : "FAILURE");
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -425,6 +440,7 @@ rcu_torture_init(void)
|
|||
|
||||
INIT_LIST_HEAD(&rcu_torture_freelist);
|
||||
for (i = 0; i < sizeof(rcu_tortures) / sizeof(rcu_tortures[0]); i++) {
|
||||
rcu_tortures[i].rtort_mbtest = 0;
|
||||
list_add_tail(&rcu_tortures[i].rtort_free,
|
||||
&rcu_torture_freelist);
|
||||
}
|
||||
|
@ -436,6 +452,8 @@ rcu_torture_init(void)
|
|||
atomic_set(&n_rcu_torture_alloc, 0);
|
||||
atomic_set(&n_rcu_torture_alloc_fail, 0);
|
||||
atomic_set(&n_rcu_torture_free, 0);
|
||||
atomic_set(&n_rcu_torture_mberror, 0);
|
||||
atomic_set(&n_rcu_torture_error, 0);
|
||||
for (i = 0; i < RCU_TORTURE_PIPE_LEN + 1; i++)
|
||||
atomic_set(&rcu_torture_wcount[i], 0);
|
||||
for_each_cpu(cpu) {
|
||||
|
|
|
@ -750,6 +750,7 @@ int clear_page_dirty_for_io(struct page *page)
|
|||
}
|
||||
return TestClearPageDirty(page);
|
||||
}
|
||||
EXPORT_SYMBOL(clear_page_dirty_for_io);
|
||||
|
||||
int test_clear_page_writeback(struct page *page)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue