forked from Minki/linux
merge by hand - fix up rejections in Documentation/DocBook/Makefile
This commit is contained in:
commit
ad34ea2cc3
2
CREDITS
2
CREDITS
@ -339,7 +339,7 @@ W: http://tomas.nocrew.org/
|
|||||||
D: dsp56k device driver
|
D: dsp56k device driver
|
||||||
|
|
||||||
N: Ross Biro
|
N: Ross Biro
|
||||||
E: bir7@leland.Stanford.Edu
|
E: ross.biro@gmail.com
|
||||||
D: Original author of the Linux networking code
|
D: Original author of the Linux networking code
|
||||||
|
|
||||||
N: Anton Blanchard
|
N: Anton Blanchard
|
||||||
|
@ -12,8 +12,6 @@ Following translations are available on the WWW:
|
|||||||
|
|
||||||
00-INDEX
|
00-INDEX
|
||||||
- this file.
|
- this file.
|
||||||
BK-usage/
|
|
||||||
- directory with info on BitKeeper.
|
|
||||||
BUG-HUNTING
|
BUG-HUNTING
|
||||||
- brute force method of doing binary search of patches to find bug.
|
- brute force method of doing binary search of patches to find bug.
|
||||||
Changes
|
Changes
|
||||||
|
@ -1,51 +0,0 @@
|
|||||||
bk-kernel-howto.txt: Description of kernel workflow under BitKeeper
|
|
||||||
|
|
||||||
bk-make-sum: Create summary of changesets in one repository and not
|
|
||||||
another, typically in preparation to be sent to an upstream maintainer.
|
|
||||||
Typical usage:
|
|
||||||
cd my-updated-repo
|
|
||||||
bk-make-sum ~/repo/original-repo
|
|
||||||
mv /tmp/linus.txt ../original-repo.txt
|
|
||||||
|
|
||||||
bksend: Create readable text output containing summary of changes, GNU
|
|
||||||
patch of the changes, and BK metadata of changes (as needed for proper
|
|
||||||
importing into BitKeeper by an upstream maintainer). This output is
|
|
||||||
suitable for emailing BitKeeper changes. The recipient of this output
|
|
||||||
may pipe it directly to 'bk receive'.
|
|
||||||
|
|
||||||
bz64wrap: helper script. Uncompressed input is piped to this script,
|
|
||||||
which compresses its input, and then outputs the uu-/base64-encoded
|
|
||||||
version of the compressed input.
|
|
||||||
|
|
||||||
cpcset: Copy changeset between unrelated repositories.
|
|
||||||
Attempts to preserve changeset user, user address, description, in
|
|
||||||
addition to the changeset (the patch) itself.
|
|
||||||
Typical usage:
|
|
||||||
cd my-updated-repo
|
|
||||||
bk changes # looking for a changeset...
|
|
||||||
cpcset 1.1511 . ../another-repo
|
|
||||||
|
|
||||||
csets-to-patches: Produces a delta of two BK repositories, in the form
|
|
||||||
of individual files, each containing a single cset as a GNU patch.
|
|
||||||
Output is several files, each with the filename "/tmp/rev-$REV.patch"
|
|
||||||
Typical usage:
|
|
||||||
cd my-updated-repo
|
|
||||||
bk changes -L ~/repo/original-repo 2>&1 | \
|
|
||||||
perl csets-to-patches
|
|
||||||
|
|
||||||
cset-to-linus: Produces a delta of two BK repositories, in the form of
|
|
||||||
changeset descriptions, with 'diffstat' output created for each
|
|
||||||
individual changset.
|
|
||||||
Typical usage:
|
|
||||||
cd my-updated-repo
|
|
||||||
bk changes -L ~/repo/original-repo 2>&1 | \
|
|
||||||
perl cset-to-linus > summary.txt
|
|
||||||
|
|
||||||
gcapatch: Generates patch containing changes in local repository.
|
|
||||||
Typical usage:
|
|
||||||
cd my-updated-repo
|
|
||||||
gcapatch > foo.patch
|
|
||||||
|
|
||||||
unbz64wrap: Reverse an encoded, compressed data stream created by
|
|
||||||
bz64wrap into an uncompressed, typically text/plain output.
|
|
||||||
|
|
@ -1,283 +0,0 @@
|
|||||||
|
|
||||||
Doing the BK Thing, Penguin-Style
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
This set of notes is intended mainly for kernel developers, occasional
|
|
||||||
or full-time, but sysadmins and power users may find parts of it useful
|
|
||||||
as well. It assumes at least a basic familiarity with CVS, both at a
|
|
||||||
user level (use on the cmd line) and at a higher level (client-server model).
|
|
||||||
Due to the author's background, an operation may be described in terms
|
|
||||||
of CVS, or in terms of how that operation differs from CVS.
|
|
||||||
|
|
||||||
This is -not- intended to be BitKeeper documentation. Always run
|
|
||||||
"bk help <command>" or in X "bk helptool <command>" for reference
|
|
||||||
documentation.
|
|
||||||
|
|
||||||
|
|
||||||
BitKeeper Concepts
|
|
||||||
------------------
|
|
||||||
|
|
||||||
In the true nature of the Internet itself, BitKeeper is a distributed
|
|
||||||
system. When applied to revision control, this means doing away with
|
|
||||||
client-server, and changing to a parent-child model... essentially
|
|
||||||
peer-to-peer. On the developer's end, this also represents a
|
|
||||||
fundamental disruption in the standard workflow of changes, commits,
|
|
||||||
and merges. You will need to take a few minutes to think about
|
|
||||||
how to best work under BitKeeper, and re-optimize things a bit.
|
|
||||||
In some sense it is a bit radical, because it might described as
|
|
||||||
tossing changes out into a maelstrom and having them magically
|
|
||||||
land at the right destination... but I'm getting ahead of myself.
|
|
||||||
|
|
||||||
Let's start with this progression:
|
|
||||||
Each BitKeeper source tree on disk is a repository unto itself.
|
|
||||||
Each repository has a parent (except the root/original, of course).
|
|
||||||
Each repository contains a set of a changesets ("csets").
|
|
||||||
Each cset is one or more changed files, bundled together.
|
|
||||||
|
|
||||||
Each tree is a repository, so all changes are checked into the local
|
|
||||||
tree. When a change is checked in, all modified files are grouped
|
|
||||||
into a logical unit, the changeset. Internally, BK links these
|
|
||||||
changesets in a tree, representing various converging and diverging
|
|
||||||
lines of development. These changesets are the bread and butter of
|
|
||||||
the BK system.
|
|
||||||
|
|
||||||
After the concept of changesets, the next thing you need to get used
|
|
||||||
to is having multiple copies of source trees lying around. This -really-
|
|
||||||
takes some getting used to, for some people. Separate source trees
|
|
||||||
are the means in BitKeeper by which you delineate parallel lines
|
|
||||||
of development, both minor and major. What would be branches in
|
|
||||||
CVS become separate source trees, or "clones" in BitKeeper [heh,
|
|
||||||
or Star Wars] terminology.
|
|
||||||
|
|
||||||
Clones and changesets are the tools from which most of the power of
|
|
||||||
BitKeeper is derived. As mentioned earlier, each clone has a parent,
|
|
||||||
the tree used as the source when the new clone was created. In a
|
|
||||||
CVS-like setup, the parent would be a remote server on the Internet,
|
|
||||||
and the child is your local clone of that tree.
|
|
||||||
|
|
||||||
Once you have established a common baseline between two source trees --
|
|
||||||
a common parent -- then you can merge changesets between those two
|
|
||||||
trees with ease. Merging changes into a tree is called a "pull", and
|
|
||||||
is analagous to 'cvs update'. A pull downloads all the changesets in
|
|
||||||
the remote tree you do not have, and merges them. Sending changes in
|
|
||||||
one tree to another tree is called a "push". Push sends all changes
|
|
||||||
in the local tree the remote does not yet have, and merges them.
|
|
||||||
|
|
||||||
From these concepts come some initial command examples:
|
|
||||||
|
|
||||||
1) bk clone -q http://linux.bkbits.net/linux-2.5 linus-2.5
|
|
||||||
Download a 2.5 stock kernel tree, naming it "linus-2.5" in the local dir.
|
|
||||||
The "-q" disables listing every single file as it is downloaded.
|
|
||||||
|
|
||||||
2) bk clone -ql linus-2.5 alpha-2.5
|
|
||||||
Create a separate source tree for the Alpha AXP architecture.
|
|
||||||
The "-l" uses hard links instead of copying data, since both trees are
|
|
||||||
on the local disk. You can also replace the above with "bk lclone -q ..."
|
|
||||||
|
|
||||||
You only clone a tree -once-. After cloning the tree lives a long time
|
|
||||||
on disk, being updating by pushes and pulls.
|
|
||||||
|
|
||||||
3) cd alpha-2.5 ; bk pull http://gkernel.bkbits.net/alpha-2.5
|
|
||||||
Download changes in "alpha-2.5" repository which are not present
|
|
||||||
in the local repository, and merge them into the source tree.
|
|
||||||
|
|
||||||
4) bk -r co -q
|
|
||||||
Because every tree is a repository, files must be checked out before
|
|
||||||
they will be in their standard places in the source tree.
|
|
||||||
|
|
||||||
5) bk vi fs/inode.c # example change...
|
|
||||||
bk citool # checkin, using X tool
|
|
||||||
bk push bk://gkernel@bkbits.net/alpha-2.5 # upload change
|
|
||||||
Typical example of a BK sequence that would replace the analagous CVS
|
|
||||||
situation,
|
|
||||||
vi fs/inode.c
|
|
||||||
cvs commit
|
|
||||||
|
|
||||||
As this is just supposed to be a quick BK intro, for more in-depth
|
|
||||||
tutorials, live working demos, and docs, see http://www.bitkeeper.com/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BK and Kernel Development Workflow
|
|
||||||
----------------------------------
|
|
||||||
Currently the latest 2.5 tree is available via "bk clone $URL"
|
|
||||||
and "bk pull $URL" at http://linux.bkbits.net/linux-2.5
|
|
||||||
This should change in a few weeks to a kernel.org URL.
|
|
||||||
|
|
||||||
|
|
||||||
A big part of using BitKeeper is organizing the various trees you have
|
|
||||||
on your local disk, and organizing the flow of changes among those
|
|
||||||
trees, and remote trees. If one were to graph the relationships between
|
|
||||||
a desired BK setup, you are likely to see a few-many-few graph, like
|
|
||||||
this:
|
|
||||||
|
|
||||||
linux-2.5
|
|
||||||
|
|
|
||||||
merge-to-linus-2.5
|
|
||||||
/ | |
|
|
||||||
/ | |
|
|
||||||
vm-hacks bugfixes filesys personal-hacks
|
|
||||||
\ | | /
|
|
||||||
\ | | /
|
|
||||||
\ | | /
|
|
||||||
testing-and-validation
|
|
||||||
|
|
||||||
Since a "bk push" sends all changes not in the target tree, and
|
|
||||||
since a "bk pull" receives all changes not in the source tree, you want
|
|
||||||
to make sure you are only pushing specific changes to the desired tree,
|
|
||||||
not all changes from "peer parent" trees. For example, pushing a change
|
|
||||||
from the testing-and-validation tree would probably be a bad idea,
|
|
||||||
because it will push all changes from vm-hacks, bugfixes, filesys, and
|
|
||||||
personal-hacks trees into the target tree.
|
|
||||||
|
|
||||||
One would typically work on only one "theme" at a time, either
|
|
||||||
vm-hacks or bugfixes or filesys, keeping those changes isolated in
|
|
||||||
their own tree during development, and only merge the isolated with
|
|
||||||
other changes when going upstream (to Linus or other maintainers) or
|
|
||||||
downstream (to your "union" trees, like testing-and-validation above).
|
|
||||||
|
|
||||||
It should be noted that some of this separation is not just recommended
|
|
||||||
practice, it's actually [for now] -enforced- by BitKeeper. BitKeeper
|
|
||||||
requires that changesets maintain a certain order, which is the reason
|
|
||||||
that "bk push" sends all local changesets the remote doesn't have. This
|
|
||||||
separation may look like a lot of wasted disk space at first, but it
|
|
||||||
helps when two unrelated changes may "pollute" the same area of code, or
|
|
||||||
don't follow the same pace of development, or any other of the standard
|
|
||||||
reasons why one creates a development branch.
|
|
||||||
|
|
||||||
Small development branches (clones) will appear and disappear:
|
|
||||||
|
|
||||||
-------- A --------- B --------- C --------- D -------
|
|
||||||
\ /
|
|
||||||
-----short-term devel branch-----
|
|
||||||
|
|
||||||
While long-term branches will parallel a tree (or trees), with period
|
|
||||||
merge points. In this first example, we pull from a tree (pulls,
|
|
||||||
"\") periodically, such as what occurs when tracking changes in a
|
|
||||||
vendor tree, never pushing changes back up the line:
|
|
||||||
|
|
||||||
-------- A --------- B --------- C --------- D -------
|
|
||||||
\ \ \
|
|
||||||
----long-term devel branch-----------------
|
|
||||||
|
|
||||||
And then a more common case in Linux kernel development, a long term
|
|
||||||
branch with periodic merges back into the tree (pushes, "/"):
|
|
||||||
|
|
||||||
-------- A --------- B --------- C --------- D -------
|
|
||||||
\ \ / \
|
|
||||||
----long-term devel branch-----------------
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Submitting Changes to Linus
|
|
||||||
---------------------------
|
|
||||||
There's a bit of an art, or style, of submitting changes to Linus.
|
|
||||||
Since Linus's tree is now (you might say) fully integrated into the
|
|
||||||
distributed BitKeeper system, there are several prerequisites to
|
|
||||||
properly submitting a BitKeeper change. All these prereq's are just
|
|
||||||
general cleanliness of BK usage, so as people become experts at BK, feel
|
|
||||||
free to optimize this process further (assuming Linus agrees, of
|
|
||||||
course).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
0) Make sure your tree was originally cloned from the linux-2.5 tree
|
|
||||||
created by Linus. If your tree does not have this as its ancestor, it
|
|
||||||
is impossible to reliably exchange changesets.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
1) Pay attention to your commit text. The commit message that
|
|
||||||
accompanies each changeset you submit will live on forever in history,
|
|
||||||
and is used by Linus to accurately summarize the changes in each
|
|
||||||
pre-patch. Remember that there is no context, so
|
|
||||||
"fix for new scheduler changes"
|
|
||||||
would be too vague, but
|
|
||||||
"fix mips64 arch for new scheduler switch_to(), TIF_xxx semantics"
|
|
||||||
would be much better.
|
|
||||||
|
|
||||||
You can and should use the command "bk comment -C<rev>" to update the
|
|
||||||
commit text, and improve it after the fact. This is very useful for
|
|
||||||
development: poor, quick descriptions during development, which get
|
|
||||||
cleaned up using "bk comment" before issuing the "bk push" to submit the
|
|
||||||
changes.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
2) Include an Internet-available URL for Linus to pull from, such as
|
|
||||||
|
|
||||||
Pull from: http://gkernel.bkbits.net/net-drivers-2.5
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
3) Include a summary and "diffstat -p1" of each changeset that will be
|
|
||||||
downloaded, when Linus issues a "bk pull". The author auto-generates
|
|
||||||
these summaries using "bk changes -L <parent>", to obtain a listing
|
|
||||||
of all the pending-to-send changesets, and their commit messages.
|
|
||||||
|
|
||||||
It is important to show Linus what he will be downloading when he issues
|
|
||||||
a "bk pull", to reduce the time required to sift the changes once they
|
|
||||||
are downloaded to Linus's local machine.
|
|
||||||
|
|
||||||
IMPORTANT NOTE: One of the features of BK is that your repository does
|
|
||||||
not have to be up to date, in order for Linus to receive your changes.
|
|
||||||
It is considered a courtesy to keep your repository fairly recent, to
|
|
||||||
lessen any potential merge work Linus may need to do.
|
|
||||||
|
|
||||||
|
|
||||||
4) Split up your changes. Each maintainer<->Linus situation is likely
|
|
||||||
to be slightly different here, so take this just as general advice. The
|
|
||||||
author splits up changes according to "themes" when merging with Linus.
|
|
||||||
Simultaneous pushes from local development go to special trees which
|
|
||||||
exist solely to house changes "queued" for Linus. Example of the trees:
|
|
||||||
|
|
||||||
net-drivers-2.5 -- on-going net driver maintenance
|
|
||||||
vm-2.5 -- VM-related changes
|
|
||||||
fs-2.5 -- filesystem-related changes
|
|
||||||
|
|
||||||
Linus then has much more freedom for pulling changes. He could (for
|
|
||||||
example) issue a "bk pull" on vm-2.5 and fs-2.5 trees, to merge their
|
|
||||||
changes, but hold off net-drivers-2.5 because of a change that needs
|
|
||||||
more discussion.
|
|
||||||
|
|
||||||
Other maintainers may find that a single linus-pull-from tree is
|
|
||||||
adequate for passing BK changesets to him.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Frequently Answered Questions
|
|
||||||
-----------------------------
|
|
||||||
1) How do I change the e-mail address shown in the changelog?
|
|
||||||
A. When you run "bk citool" or "bk commit", set environment
|
|
||||||
variables BK_USER and BK_HOST to the desired username
|
|
||||||
and host/domain name.
|
|
||||||
|
|
||||||
|
|
||||||
2) How do I use tags / get a diff between two kernel versions?
|
|
||||||
A. Pass the tags Linus uses to 'bk export'.
|
|
||||||
|
|
||||||
ChangeSets are in a forward-progressing order, so it's pretty easy
|
|
||||||
to get a snapshot starting and ending at any two points in time.
|
|
||||||
Linus puts tags on each release and pre-release, so you could use
|
|
||||||
these two examples:
|
|
||||||
|
|
||||||
bk export -tpatch -hdu -rv2.5.4,v2.5.5 | less
|
|
||||||
# creates patch-2.5.5 essentially
|
|
||||||
bk export -tpatch -du -rv2.5.5-pre1,v2.5.5 | less
|
|
||||||
# changes from pre1 to final
|
|
||||||
|
|
||||||
A tag is just an alias for a specific changeset... and since changesets
|
|
||||||
are ordered, a tag is thus a marker for a specific point in time (or
|
|
||||||
specific state of the tree).
|
|
||||||
|
|
||||||
|
|
||||||
3) Is there an easy way to generate One Big Patch versus mainline,
|
|
||||||
for my long-lived kernel branch?
|
|
||||||
A. Yes. This requires BK 3.x, though.
|
|
||||||
|
|
||||||
bk export -tpatch -r`bk repogca bk://linux.bkbits.net/linux-2.5`,+
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
|||||||
#!/bin/sh -e
|
|
||||||
# DIR=$HOME/BK/axp-2.5
|
|
||||||
# cd $DIR
|
|
||||||
|
|
||||||
LINUS_REPO=$1
|
|
||||||
DIRBASE=`basename $PWD`
|
|
||||||
|
|
||||||
{
|
|
||||||
cat <<EOT
|
|
||||||
Please do a
|
|
||||||
|
|
||||||
bk pull bk://gkernel.bkbits.net/$DIRBASE
|
|
||||||
|
|
||||||
This will update the following files:
|
|
||||||
|
|
||||||
EOT
|
|
||||||
|
|
||||||
bk export -tpatch -hdu -r`bk repogca $LINUS_REPO`,+ | diffstat -p1 2>/dev/null
|
|
||||||
|
|
||||||
cat <<EOT
|
|
||||||
|
|
||||||
through these ChangeSets:
|
|
||||||
|
|
||||||
EOT
|
|
||||||
|
|
||||||
bk changes -L -d'$unless(:MERGE:){ChangeSet|:CSETREV:\n}' $LINUS_REPO |
|
|
||||||
bk -R prs -h -d'$unless(:MERGE:){<:P:@:HOST:> (:D: :I:)\n$each(:C:){ (:C:)\n}\n}' -
|
|
||||||
|
|
||||||
} > /tmp/linus.txt
|
|
||||||
|
|
||||||
cat <<EOT
|
|
||||||
Mail text in /tmp/linus.txt; please check and send using your favourite
|
|
||||||
mailer.
|
|
||||||
EOT
|
|
@ -1,36 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# A script to format BK changeset output in a manner that is easy to read.
|
|
||||||
# Andreas Dilger <adilger@turbolabs.com> 13/02/2002
|
|
||||||
#
|
|
||||||
# Add diffstat output after Changelog <adilger@turbolabs.com> 21/02/2002
|
|
||||||
|
|
||||||
PROG=bksend
|
|
||||||
|
|
||||||
usage() {
|
|
||||||
echo "usage: $PROG -r<rev>"
|
|
||||||
echo -e "\twhere <rev> is of the form '1.23', '1.23..', '1.23..1.27',"
|
|
||||||
echo -e "\tor '+' to indicate the most recent revision"
|
|
||||||
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
-r) REV=$2; shift ;;
|
|
||||||
-r*) REV=`echo $1 | sed 's/^-r//'` ;;
|
|
||||||
*) echo "$PROG: no revision given, you probably don't want that";;
|
|
||||||
esac
|
|
||||||
|
|
||||||
[ -z "$REV" ] && usage
|
|
||||||
|
|
||||||
echo "You can import this changeset into BK by piping this whole message to:"
|
|
||||||
echo "'| bk receive [path to repository]' or apply the patch as usual."
|
|
||||||
|
|
||||||
SEP="\n===================================================================\n\n"
|
|
||||||
echo -e $SEP
|
|
||||||
env PAGER=/bin/cat bk changes -r$REV
|
|
||||||
echo
|
|
||||||
bk export -tpatch -du -h -r$REV | diffstat
|
|
||||||
echo; echo
|
|
||||||
bk export -tpatch -du -h -r$REV
|
|
||||||
echo -e $SEP
|
|
||||||
bk send -wgzip_uu -r$REV -
|
|
@ -1,41 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# bz64wrap - the sending side of a bzip2 | base64 stream
|
|
||||||
# Andreas Dilger <adilger@clusterfs.com> Jan 2002
|
|
||||||
|
|
||||||
|
|
||||||
PATH=$PATH:/usr/bin:/usr/local/bin:/usr/freeware/bin
|
|
||||||
|
|
||||||
# A program to generate base64 encoding on stdout
|
|
||||||
BASE64_ENCODE="uuencode -m /dev/stdout"
|
|
||||||
BASE64_BEGIN=
|
|
||||||
BASE64_END=
|
|
||||||
|
|
||||||
BZIP=NO
|
|
||||||
BASE64=NO
|
|
||||||
|
|
||||||
# Test if we have the bzip program installed
|
|
||||||
bzip2 -c /dev/null > /dev/null 2>&1 && BZIP=YES
|
|
||||||
|
|
||||||
# Test if uuencode can handle the -m (MIME) encoding option
|
|
||||||
$BASE64_ENCODE < /dev/null > /dev/null 2>&1 && BASE64=YES
|
|
||||||
|
|
||||||
if [ $BASE64 = NO ]; then
|
|
||||||
BASE64_ENCODE=mimencode
|
|
||||||
BASE64_BEGIN="begin-base64 644 -"
|
|
||||||
BASE64_END="===="
|
|
||||||
|
|
||||||
$BASE64_ENCODE < /dev/null > /dev/null 2>&1 && BASE64=YES
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $BZIP = NO -o $BASE64 = NO ]; then
|
|
||||||
echo "$0: can't use bz64 encoding: bzip2=$BZIP, $BASE64_ENCODE=$BASE64"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Sadly, mimencode does not appear to have good "begin" and "end" markers
|
|
||||||
# like uuencode does, and it is picky about getting the right start/end of
|
|
||||||
# the base64 stream, so we handle this internally.
|
|
||||||
echo "$BASE64_BEGIN"
|
|
||||||
bzip2 -9 | $BASE64_ENCODE
|
|
||||||
echo "$BASE64_END"
|
|
@ -1,36 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# Purpose: Copy changeset patch and description from one
|
|
||||||
# repository to another, unrelated one.
|
|
||||||
#
|
|
||||||
# usage: cpcset [revision] [from-repository] [to-repository]
|
|
||||||
#
|
|
||||||
|
|
||||||
REV=$1
|
|
||||||
FROM=$2
|
|
||||||
TO=$3
|
|
||||||
TMPF=/tmp/cpcset.$$
|
|
||||||
|
|
||||||
rm -f $TMPF*
|
|
||||||
|
|
||||||
CWD_SAVE=`pwd`
|
|
||||||
cd $FROM
|
|
||||||
bk changes -r$REV | \
|
|
||||||
grep -v '^ChangeSet' | \
|
|
||||||
sed -e 's/^ //g' > $TMPF.log
|
|
||||||
|
|
||||||
USERHOST=`bk changes -r$REV | grep '^ChangeSet' | awk '{print $4}'`
|
|
||||||
export BK_USER=`echo $USERHOST | awk '-F@' '{print $1}'`
|
|
||||||
export BK_HOST=`echo $USERHOST | awk '-F@' '{print $2}'`
|
|
||||||
|
|
||||||
bk export -tpatch -hdu -r$REV > $TMPF.patch && \
|
|
||||||
cd $CWD_SAVE && \
|
|
||||||
cd $TO && \
|
|
||||||
bk import -tpatch -CFR -y"`cat $TMPF.log`" $TMPF.patch . && \
|
|
||||||
bk commit -y"`cat $TMPF.log`"
|
|
||||||
|
|
||||||
rm -f $TMPF*
|
|
||||||
|
|
||||||
echo changeset $REV copied.
|
|
||||||
echo ""
|
|
||||||
|
|
@ -1,49 +0,0 @@
|
|||||||
#!/usr/bin/perl -w
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
my ($lhs, $rev, $tmp, $rhs, $s);
|
|
||||||
my @cset_text = ();
|
|
||||||
my @pipe_text = ();
|
|
||||||
my $have_cset = 0;
|
|
||||||
|
|
||||||
while (<>) {
|
|
||||||
next if /^---/;
|
|
||||||
|
|
||||||
if (($lhs, $tmp, $rhs) = (/^(ChangeSet\@)([^,]+)(, .*)$/)) {
|
|
||||||
&cset_rev if ($have_cset);
|
|
||||||
|
|
||||||
$rev = $tmp;
|
|
||||||
$have_cset = 1;
|
|
||||||
|
|
||||||
push(@cset_text, $_);
|
|
||||||
}
|
|
||||||
|
|
||||||
elsif ($have_cset) {
|
|
||||||
push(@cset_text, $_);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&cset_rev if ($have_cset);
|
|
||||||
exit(0);
|
|
||||||
|
|
||||||
|
|
||||||
sub cset_rev {
|
|
||||||
my $empty_cset = 0;
|
|
||||||
|
|
||||||
open PIPE, "bk export -tpatch -hdu -r $rev | diffstat -p1 2>/dev/null |" or die;
|
|
||||||
while ($s = <PIPE>) {
|
|
||||||
$empty_cset = 1 if ($s =~ /0 files changed/);
|
|
||||||
push(@pipe_text, $s);
|
|
||||||
}
|
|
||||||
close(PIPE);
|
|
||||||
|
|
||||||
if (! $empty_cset) {
|
|
||||||
print @cset_text;
|
|
||||||
print @pipe_text;
|
|
||||||
print "\n\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
@pipe_text = ();
|
|
||||||
@cset_text = ();
|
|
||||||
}
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
|||||||
#!/usr/bin/perl -w
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
my ($lhs, $rev, $tmp, $rhs, $s);
|
|
||||||
my @cset_text = ();
|
|
||||||
my @pipe_text = ();
|
|
||||||
my $have_cset = 0;
|
|
||||||
|
|
||||||
while (<>) {
|
|
||||||
next if /^---/;
|
|
||||||
|
|
||||||
if (($lhs, $tmp, $rhs) = (/^(ChangeSet\@)([^,]+)(, .*)$/)) {
|
|
||||||
&cset_rev if ($have_cset);
|
|
||||||
|
|
||||||
$rev = $tmp;
|
|
||||||
$have_cset = 1;
|
|
||||||
|
|
||||||
push(@cset_text, $_);
|
|
||||||
}
|
|
||||||
|
|
||||||
elsif ($have_cset) {
|
|
||||||
push(@cset_text, $_);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&cset_rev if ($have_cset);
|
|
||||||
exit(0);
|
|
||||||
|
|
||||||
|
|
||||||
sub cset_rev {
|
|
||||||
my $empty_cset = 0;
|
|
||||||
|
|
||||||
system("bk export -tpatch -du -r $rev > /tmp/rev-$rev.patch");
|
|
||||||
|
|
||||||
if (! $empty_cset) {
|
|
||||||
print @cset_text;
|
|
||||||
print @pipe_text;
|
|
||||||
print "\n\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
@pipe_text = ();
|
|
||||||
@cset_text = ();
|
|
||||||
}
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# Purpose: Generate GNU diff of local changes versus canonical top-of-tree
|
|
||||||
#
|
|
||||||
# Usage: gcapatch > foo.patch
|
|
||||||
#
|
|
||||||
|
|
||||||
bk export -tpatch -hdu -r`bk repogca bk://linux.bkbits.net/linux-2.5`,+
|
|
@ -1,25 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# unbz64wrap - the receiving side of a bzip2 | base64 stream
|
|
||||||
# Andreas Dilger <adilger@clusterfs.com> Jan 2002
|
|
||||||
|
|
||||||
# Sadly, mimencode does not appear to have good "begin" and "end" markers
|
|
||||||
# like uuencode does, and it is picky about getting the right start/end of
|
|
||||||
# the base64 stream, so we handle this explicitly here.
|
|
||||||
|
|
||||||
PATH=$PATH:/usr/bin:/usr/local/bin:/usr/freeware/bin
|
|
||||||
|
|
||||||
if mimencode -u < /dev/null > /dev/null 2>&1 ; then
|
|
||||||
SHOW=
|
|
||||||
while read LINE; do
|
|
||||||
case $LINE in
|
|
||||||
begin-base64*) SHOW=YES ;;
|
|
||||||
====) SHOW= ;;
|
|
||||||
*) [ "$SHOW" ] && echo "$LINE" ;;
|
|
||||||
esac
|
|
||||||
done | mimencode -u | bunzip2
|
|
||||||
exit $?
|
|
||||||
else
|
|
||||||
cat - | uudecode -o /dev/stdout | bunzip2
|
|
||||||
exit $?
|
|
||||||
fi
|
|
@ -357,14 +357,14 @@ Quota-tools
|
|||||||
----------
|
----------
|
||||||
o <http://sourceforge.net/projects/linuxquota/>
|
o <http://sourceforge.net/projects/linuxquota/>
|
||||||
|
|
||||||
Jade
|
|
||||||
----
|
|
||||||
o <ftp://ftp.jclark.com/pub/jade/jade-1.2.1.tar.gz>
|
|
||||||
|
|
||||||
DocBook Stylesheets
|
DocBook Stylesheets
|
||||||
-------------------
|
-------------------
|
||||||
o <http://nwalsh.com/docbook/dsssl/>
|
o <http://nwalsh.com/docbook/dsssl/>
|
||||||
|
|
||||||
|
XMLTO XSLT Frontend
|
||||||
|
-------------------
|
||||||
|
o <http://cyberelk.net/tim/xmlto/>
|
||||||
|
|
||||||
Intel P6 microcode
|
Intel P6 microcode
|
||||||
------------------
|
------------------
|
||||||
o <http://www.urbanmyth.org/microcode/>
|
o <http://www.urbanmyth.org/microcode/>
|
||||||
|
@ -7,11 +7,10 @@
|
|||||||
# list of DOCBOOKS.
|
# list of DOCBOOKS.
|
||||||
|
|
||||||
DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml videobook.xml \
|
DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml videobook.xml \
|
||||||
kernel-hacking.xml kernel-locking.xml via-audio.xml \
|
kernel-hacking.xml kernel-locking.xml deviceiobook.xml \
|
||||||
deviceiobook.xml procfs-guide.xml tulip-user.xml \
|
procfs-guide.xml writing_usb_driver.xml \
|
||||||
writing_usb_driver.xml sis900.xml kernel-api.xml \
|
sis900.xml kernel-api.xml journal-api.xml lsm.xml usb.xml \
|
||||||
journal-api.xml lsm.xml usb.xml gadget.xml libata.xml \
|
gadget.xml libata.xml mtdnand.xml librs.xml
|
||||||
mtdnand.xml librs.xml
|
|
||||||
|
|
||||||
###
|
###
|
||||||
# The build process is as follows (targets):
|
# The build process is as follows (targets):
|
||||||
@ -42,14 +41,16 @@ MAN := $(patsubst %.xml, %.9, $(BOOKS))
|
|||||||
mandocs: $(MAN)
|
mandocs: $(MAN)
|
||||||
|
|
||||||
installmandocs: mandocs
|
installmandocs: mandocs
|
||||||
$(MAKEMAN) install Documentation/DocBook/man
|
mkdir -p /usr/local/man/man9/
|
||||||
|
install Documentation/DocBook/man/*.9.gz /usr/local/man/man9/
|
||||||
|
|
||||||
###
|
###
|
||||||
#External programs used
|
#External programs used
|
||||||
KERNELDOC = scripts/kernel-doc
|
KERNELDOC = scripts/kernel-doc
|
||||||
DOCPROC = scripts/basic/docproc
|
DOCPROC = scripts/basic/docproc
|
||||||
SPLITMAN = $(PERL) $(srctree)/scripts/split-man
|
|
||||||
MAKEMAN = $(PERL) $(srctree)/scripts/makeman
|
XMLTOFLAGS = -m Documentation/DocBook/stylesheet.xsl
|
||||||
|
#XMLTOFLAGS += --skip-validation
|
||||||
|
|
||||||
###
|
###
|
||||||
# DOCPROC is used for two purposes:
|
# DOCPROC is used for two purposes:
|
||||||
@ -96,45 +97,44 @@ $(obj)/procfs-guide.xml: $(C-procfs-example2)
|
|||||||
# Rules to generate postscript, PDF and HTML
|
# Rules to generate postscript, PDF and HTML
|
||||||
# db2html creates a directory. Generate a html file used for timestamp
|
# db2html creates a directory. Generate a html file used for timestamp
|
||||||
|
|
||||||
quiet_cmd_db2ps = DB2PS $@
|
quiet_cmd_db2ps = XMLTO $@
|
||||||
cmd_db2ps = db2ps -o $(dir $@) $<
|
cmd_db2ps = xmlto ps $(XMLTOFLAGS) -o $(dir $@) $<
|
||||||
%.ps : %.xml
|
%.ps : %.xml
|
||||||
@(which db2ps > /dev/null 2>&1) || \
|
@(which xmlto > /dev/null 2>&1) || \
|
||||||
(echo "*** You need to install DocBook stylesheets ***"; \
|
(echo "*** You need to install xmlto ***"; \
|
||||||
exit 1)
|
exit 1)
|
||||||
$(call cmd,db2ps)
|
$(call cmd,db2ps)
|
||||||
|
|
||||||
quiet_cmd_db2pdf = DB2PDF $@
|
quiet_cmd_db2pdf = XMLTO $@
|
||||||
cmd_db2pdf = db2pdf -o $(dir $@) $<
|
cmd_db2pdf = xmlto pdf $(XMLTOFLAGS) -o $(dir $@) $<
|
||||||
%.pdf : %.xml
|
%.pdf : %.xml
|
||||||
@(which db2pdf > /dev/null 2>&1) || \
|
@(which xmlto > /dev/null 2>&1) || \
|
||||||
(echo "*** You need to install DocBook stylesheets ***"; \
|
(echo "*** You need to install xmlto ***"; \
|
||||||
exit 1)
|
exit 1)
|
||||||
$(call cmd,db2pdf)
|
$(call cmd,db2pdf)
|
||||||
|
|
||||||
quiet_cmd_db2html = DB2HTML $@
|
quiet_cmd_db2html = XMLTO $@
|
||||||
cmd_db2html = db2html -o $(patsubst %.html,%,$@) $< && \
|
cmd_db2html = xmlto xhtml $(XMLTOFLAGS) -o $(patsubst %.html,%,$@) $< && \
|
||||||
echo '<a HREF="$(patsubst %.html,%,$(notdir $@))/book1.html"> \
|
echo '<a HREF="$(patsubst %.html,%,$(notdir $@))/index.html"> \
|
||||||
Goto $(patsubst %.html,%,$(notdir $@))</a><p>' > $@
|
Goto $(patsubst %.html,%,$(notdir $@))</a><p>' > $@
|
||||||
|
|
||||||
%.html: %.xml
|
%.html: %.xml
|
||||||
@(which db2html > /dev/null 2>&1) || \
|
@(which xmlto > /dev/null 2>&1) || \
|
||||||
(echo "*** You need to install DocBook stylesheets ***"; \
|
(echo "*** You need to install xmlto ***"; \
|
||||||
exit 1)
|
exit 1)
|
||||||
@rm -rf $@ $(patsubst %.html,%,$@)
|
@rm -rf $@ $(patsubst %.html,%,$@)
|
||||||
$(call cmd,db2html)
|
$(call cmd,db2html)
|
||||||
@if [ ! -z "$(PNG-$(basename $(notdir $@)))" ]; then \
|
@if [ ! -z "$(PNG-$(basename $(notdir $@)))" ]; then \
|
||||||
cp $(PNG-$(basename $(notdir $@))) $(patsubst %.html,%,$@); fi
|
cp $(PNG-$(basename $(notdir $@))) $(patsubst %.html,%,$@); fi
|
||||||
|
|
||||||
###
|
quiet_cmd_db2man = XMLTO $@
|
||||||
# Rule to generate man files - output is placed in the man subdirectory
|
cmd_db2man = if grep -q refentry $<; then xmlto man $(XMLTOFLAGS) -o $(obj)/man $< ; gzip -f $(obj)/man/*.9; fi
|
||||||
|
%.9 : %.xml
|
||||||
%.9: %.xml
|
@(which xmlto > /dev/null 2>&1) || \
|
||||||
ifneq ($(KBUILD_SRC),)
|
(echo "*** You need to install xmlto ***"; \
|
||||||
$(Q)mkdir -p $(objtree)/Documentation/DocBook/man
|
exit 1)
|
||||||
endif
|
$(call cmd,db2man)
|
||||||
$(SPLITMAN) $< $(objtree)/Documentation/DocBook/man "$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)"
|
@touch $@
|
||||||
$(MAKEMAN) convert $(objtree)/Documentation/DocBook/man $<
|
|
||||||
|
|
||||||
###
|
###
|
||||||
# Rules to generate postscripts and PNG imgages from .fig format files
|
# Rules to generate postscripts and PNG imgages from .fig format files
|
||||||
|
@ -49,13 +49,33 @@
|
|||||||
!Iinclude/asm-i386/unaligned.h
|
!Iinclude/asm-i386/unaligned.h
|
||||||
</sect1>
|
</sect1>
|
||||||
|
|
||||||
<!-- FIXME:
|
|
||||||
kernel/sched.c has no docs, which stuffs up the sgml. Comment
|
|
||||||
out until somebody adds docs. KAO
|
|
||||||
<sect1><title>Delaying, scheduling, and timer routines</title>
|
<sect1><title>Delaying, scheduling, and timer routines</title>
|
||||||
X!Ekernel/sched.c
|
!Iinclude/linux/sched.h
|
||||||
|
!Ekernel/sched.c
|
||||||
|
!Ekernel/timer.c
|
||||||
</sect1>
|
</sect1>
|
||||||
KAO -->
|
<sect1><title>Internal Functions</title>
|
||||||
|
!Ikernel/exit.c
|
||||||
|
!Ikernel/signal.c
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1><title>Kernel objects manipulation</title>
|
||||||
|
<!--
|
||||||
|
X!Iinclude/linux/kobject.h
|
||||||
|
-->
|
||||||
|
!Elib/kobject.c
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1><title>Kernel utility functions</title>
|
||||||
|
!Iinclude/linux/kernel.h
|
||||||
|
<!-- This needs to clean up to make kernel-doc happy
|
||||||
|
X!Ekernel/printk.c
|
||||||
|
-->
|
||||||
|
!Ekernel/panic.c
|
||||||
|
!Ekernel/sys.c
|
||||||
|
!Ekernel/rcupdate.c
|
||||||
|
</sect1>
|
||||||
|
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
<chapter id="adt">
|
<chapter id="adt">
|
||||||
@ -81,7 +101,9 @@ KAO -->
|
|||||||
!Elib/vsprintf.c
|
!Elib/vsprintf.c
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1><title>String Manipulation</title>
|
<sect1><title>String Manipulation</title>
|
||||||
!Ilib/string.c
|
<!-- All functions are exported at now
|
||||||
|
X!Ilib/string.c
|
||||||
|
-->
|
||||||
!Elib/string.c
|
!Elib/string.c
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1><title>Bit Operations</title>
|
<sect1><title>Bit Operations</title>
|
||||||
@ -98,6 +120,25 @@ KAO -->
|
|||||||
!Iinclude/asm-i386/uaccess.h
|
!Iinclude/asm-i386/uaccess.h
|
||||||
!Iarch/i386/lib/usercopy.c
|
!Iarch/i386/lib/usercopy.c
|
||||||
</sect1>
|
</sect1>
|
||||||
|
<sect1><title>More Memory Management Functions</title>
|
||||||
|
!Iinclude/linux/rmap.h
|
||||||
|
!Emm/readahead.c
|
||||||
|
!Emm/filemap.c
|
||||||
|
!Emm/memory.c
|
||||||
|
!Emm/vmalloc.c
|
||||||
|
!Emm/mempool.c
|
||||||
|
!Emm/page-writeback.c
|
||||||
|
!Emm/truncate.c
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
|
||||||
|
<chapter id="ipc">
|
||||||
|
<title>Kernel IPC facilities</title>
|
||||||
|
|
||||||
|
<sect1><title>IPC utilities</title>
|
||||||
|
!Iipc/util.c
|
||||||
|
</sect1>
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
<chapter id="kfifo">
|
<chapter id="kfifo">
|
||||||
@ -114,6 +155,10 @@ KAO -->
|
|||||||
<sect1><title>sysctl interface</title>
|
<sect1><title>sysctl interface</title>
|
||||||
!Ekernel/sysctl.c
|
!Ekernel/sysctl.c
|
||||||
</sect1>
|
</sect1>
|
||||||
|
|
||||||
|
<sect1><title>proc filesystem interface</title>
|
||||||
|
!Ifs/proc/base.c
|
||||||
|
</sect1>
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
<chapter id="debugfs">
|
<chapter id="debugfs">
|
||||||
@ -127,6 +172,10 @@ KAO -->
|
|||||||
|
|
||||||
<chapter id="vfs">
|
<chapter id="vfs">
|
||||||
<title>The Linux VFS</title>
|
<title>The Linux VFS</title>
|
||||||
|
<sect1><title>The Filesystem types</title>
|
||||||
|
!Iinclude/linux/fs.h
|
||||||
|
!Einclude/linux/fs.h
|
||||||
|
</sect1>
|
||||||
<sect1><title>The Directory Cache</title>
|
<sect1><title>The Directory Cache</title>
|
||||||
!Efs/dcache.c
|
!Efs/dcache.c
|
||||||
!Iinclude/linux/dcache.h
|
!Iinclude/linux/dcache.h
|
||||||
@ -142,13 +191,31 @@ KAO -->
|
|||||||
!Efs/locks.c
|
!Efs/locks.c
|
||||||
!Ifs/locks.c
|
!Ifs/locks.c
|
||||||
</sect1>
|
</sect1>
|
||||||
|
<sect1><title>Other Functions</title>
|
||||||
|
!Efs/mpage.c
|
||||||
|
!Efs/namei.c
|
||||||
|
!Efs/buffer.c
|
||||||
|
!Efs/bio.c
|
||||||
|
!Efs/seq_file.c
|
||||||
|
!Efs/filesystems.c
|
||||||
|
!Efs/fs-writeback.c
|
||||||
|
!Efs/block_dev.c
|
||||||
|
</sect1>
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
<chapter id="netcore">
|
<chapter id="netcore">
|
||||||
<title>Linux Networking</title>
|
<title>Linux Networking</title>
|
||||||
|
<sect1><title>Networking Base Types</title>
|
||||||
|
!Iinclude/linux/net.h
|
||||||
|
</sect1>
|
||||||
<sect1><title>Socket Buffer Functions</title>
|
<sect1><title>Socket Buffer Functions</title>
|
||||||
!Iinclude/linux/skbuff.h
|
!Iinclude/linux/skbuff.h
|
||||||
|
!Iinclude/net/sock.h
|
||||||
|
!Enet/socket.c
|
||||||
!Enet/core/skbuff.c
|
!Enet/core/skbuff.c
|
||||||
|
!Enet/core/sock.c
|
||||||
|
!Enet/core/datagram.c
|
||||||
|
!Enet/core/stream.c
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1><title>Socket Filter</title>
|
<sect1><title>Socket Filter</title>
|
||||||
!Enet/core/filter.c
|
!Enet/core/filter.c
|
||||||
@ -158,6 +225,14 @@ KAO -->
|
|||||||
!Enet/core/gen_stats.c
|
!Enet/core/gen_stats.c
|
||||||
!Enet/core/gen_estimator.c
|
!Enet/core/gen_estimator.c
|
||||||
</sect1>
|
</sect1>
|
||||||
|
<sect1><title>SUN RPC subsystem</title>
|
||||||
|
<!-- The !D functionality is not perfect, garbage has to be protected by comments
|
||||||
|
!Dnet/sunrpc/sunrpc_syms.c
|
||||||
|
-->
|
||||||
|
!Enet/sunrpc/xdr.c
|
||||||
|
!Enet/sunrpc/svcsock.c
|
||||||
|
!Enet/sunrpc/sched.c
|
||||||
|
</sect1>
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
<chapter id="netdev">
|
<chapter id="netdev">
|
||||||
@ -194,11 +269,26 @@ X!Ekernel/module.c
|
|||||||
!Iarch/i386/kernel/irq.c
|
!Iarch/i386/kernel/irq.c
|
||||||
</sect1>
|
</sect1>
|
||||||
|
|
||||||
|
<sect1><title>Resources Management</title>
|
||||||
|
!Ekernel/resource.c
|
||||||
|
</sect1>
|
||||||
|
|
||||||
<sect1><title>MTRR Handling</title>
|
<sect1><title>MTRR Handling</title>
|
||||||
!Earch/i386/kernel/cpu/mtrr/main.c
|
!Earch/i386/kernel/cpu/mtrr/main.c
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1><title>PCI Support Library</title>
|
<sect1><title>PCI Support Library</title>
|
||||||
!Edrivers/pci/pci.c
|
!Edrivers/pci/pci.c
|
||||||
|
!Edrivers/pci/pci-driver.c
|
||||||
|
!Edrivers/pci/remove.c
|
||||||
|
!Edrivers/pci/pci-acpi.c
|
||||||
|
<!-- kerneldoc does not understand to __devinit
|
||||||
|
X!Edrivers/pci/search.c
|
||||||
|
-->
|
||||||
|
!Edrivers/pci/msi.c
|
||||||
|
!Edrivers/pci/bus.c
|
||||||
|
!Edrivers/pci/hotplug.c
|
||||||
|
!Edrivers/pci/probe.c
|
||||||
|
!Edrivers/pci/rom.c
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1><title>PCI Hotplug Support Library</title>
|
<sect1><title>PCI Hotplug Support Library</title>
|
||||||
!Edrivers/pci/hotplug/pci_hotplug_core.c
|
!Edrivers/pci/hotplug/pci_hotplug_core.c
|
||||||
@ -223,6 +313,14 @@ X!Earch/i386/kernel/mca.c
|
|||||||
!Efs/devfs/base.c
|
!Efs/devfs/base.c
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="sysfs">
|
||||||
|
<title>The Filesystem for Exporting Kernel Objects</title>
|
||||||
|
!Efs/sysfs/file.c
|
||||||
|
!Efs/sysfs/dir.c
|
||||||
|
!Efs/sysfs/symlink.c
|
||||||
|
!Efs/sysfs/bin.c
|
||||||
|
</chapter>
|
||||||
|
|
||||||
<chapter id="security">
|
<chapter id="security">
|
||||||
<title>Security Framework</title>
|
<title>Security Framework</title>
|
||||||
!Esecurity/security.c
|
!Esecurity/security.c
|
||||||
@ -233,6 +331,61 @@ X!Earch/i386/kernel/mca.c
|
|||||||
!Ekernel/power/pm.c
|
!Ekernel/power/pm.c
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="devdrivers">
|
||||||
|
<title>Device drivers infrastructure</title>
|
||||||
|
<sect1><title>Device Drivers Base</title>
|
||||||
|
<!--
|
||||||
|
X!Iinclude/linux/device.h
|
||||||
|
-->
|
||||||
|
!Edrivers/base/driver.c
|
||||||
|
!Edrivers/base/class_simple.c
|
||||||
|
!Edrivers/base/core.c
|
||||||
|
!Edrivers/base/firmware_class.c
|
||||||
|
!Edrivers/base/transport_class.c
|
||||||
|
!Edrivers/base/dmapool.c
|
||||||
|
<!-- Cannot be included, because
|
||||||
|
attribute_container_add_class_device_adapter
|
||||||
|
and attribute_container_classdev_to_container
|
||||||
|
exceed allowed 44 characters maximum
|
||||||
|
X!Edrivers/base/attribute_container.c
|
||||||
|
-->
|
||||||
|
!Edrivers/base/sys.c
|
||||||
|
<!--
|
||||||
|
X!Edrivers/base/interface.c
|
||||||
|
-->
|
||||||
|
!Edrivers/base/platform.c
|
||||||
|
!Edrivers/base/bus.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Device Drivers Power Management</title>
|
||||||
|
!Edrivers/base/power/main.c
|
||||||
|
!Edrivers/base/power/resume.c
|
||||||
|
!Edrivers/base/power/suspend.c
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Device Drivers ACPI Support</title>
|
||||||
|
<!-- Internal functions only
|
||||||
|
X!Edrivers/acpi/sleep/main.c
|
||||||
|
X!Edrivers/acpi/sleep/wakeup.c
|
||||||
|
X!Edrivers/acpi/motherboard.c
|
||||||
|
X!Edrivers/acpi/bus.c
|
||||||
|
-->
|
||||||
|
!Edrivers/acpi/scan.c
|
||||||
|
<!-- No correct structured comments
|
||||||
|
X!Edrivers/acpi/pci_bind.c
|
||||||
|
-->
|
||||||
|
</sect1>
|
||||||
|
<sect1><title>Device drivers PnP support</title>
|
||||||
|
!Edrivers/pnp/core.c
|
||||||
|
<!-- No correct structured comments
|
||||||
|
X!Edrivers/pnp/system.c
|
||||||
|
-->
|
||||||
|
!Edrivers/pnp/card.c
|
||||||
|
!Edrivers/pnp/driver.c
|
||||||
|
!Edrivers/pnp/manager.c
|
||||||
|
!Edrivers/pnp/support.c
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
|
||||||
<chapter id="blkdev">
|
<chapter id="blkdev">
|
||||||
<title>Block Devices</title>
|
<title>Block Devices</title>
|
||||||
!Edrivers/block/ll_rw_blk.c
|
!Edrivers/block/ll_rw_blk.c
|
||||||
@ -250,7 +403,23 @@ X!Earch/i386/kernel/mca.c
|
|||||||
|
|
||||||
<chapter id="snddev">
|
<chapter id="snddev">
|
||||||
<title>Sound Devices</title>
|
<title>Sound Devices</title>
|
||||||
|
!Iinclude/sound/core.h
|
||||||
!Esound/sound_core.c
|
!Esound/sound_core.c
|
||||||
|
!Iinclude/sound/pcm.h
|
||||||
|
!Esound/core/pcm.c
|
||||||
|
!Esound/core/device.c
|
||||||
|
!Esound/core/info.c
|
||||||
|
!Esound/core/rawmidi.c
|
||||||
|
!Esound/core/sound.c
|
||||||
|
!Esound/core/memory.c
|
||||||
|
!Esound/core/pcm_memory.c
|
||||||
|
!Esound/core/init.c
|
||||||
|
!Esound/core/isadma.c
|
||||||
|
!Esound/core/control.c
|
||||||
|
!Esound/core/pcm_lib.c
|
||||||
|
!Esound/core/hwdep.c
|
||||||
|
!Esound/core/pcm_native.c
|
||||||
|
!Esound/core/memalloc.c
|
||||||
<!-- FIXME: Removed for now since no structured comments in source
|
<!-- FIXME: Removed for now since no structured comments in source
|
||||||
X!Isound/sound_firmware.c
|
X!Isound/sound_firmware.c
|
||||||
-->
|
-->
|
||||||
@ -258,6 +427,7 @@ X!Isound/sound_firmware.c
|
|||||||
|
|
||||||
<chapter id="uart16x50">
|
<chapter id="uart16x50">
|
||||||
<title>16x50 UART Driver</title>
|
<title>16x50 UART Driver</title>
|
||||||
|
!Iinclude/linux/serial_core.h
|
||||||
!Edrivers/serial/serial_core.c
|
!Edrivers/serial/serial_core.c
|
||||||
!Edrivers/serial/8250.c
|
!Edrivers/serial/8250.c
|
||||||
</chapter>
|
</chapter>
|
||||||
@ -310,9 +480,11 @@ X!Isound/sound_firmware.c
|
|||||||
<sect1><title>Frame Buffer Memory</title>
|
<sect1><title>Frame Buffer Memory</title>
|
||||||
!Edrivers/video/fbmem.c
|
!Edrivers/video/fbmem.c
|
||||||
</sect1>
|
</sect1>
|
||||||
|
<!--
|
||||||
<sect1><title>Frame Buffer Console</title>
|
<sect1><title>Frame Buffer Console</title>
|
||||||
!Edrivers/video/console/fbcon.c
|
X!Edrivers/video/console/fbcon.c
|
||||||
</sect1>
|
</sect1>
|
||||||
|
-->
|
||||||
<sect1><title>Frame Buffer Colormap</title>
|
<sect1><title>Frame Buffer Colormap</title>
|
||||||
!Edrivers/video/fbcmap.c
|
!Edrivers/video/fbcmap.c
|
||||||
</sect1>
|
</sect1>
|
||||||
|
5
Documentation/DocBook/stylesheet.xsl
Normal file
5
Documentation/DocBook/stylesheet.xsl
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0">
|
||||||
|
<param name="chunk.quietly">1</param>
|
||||||
|
<param name="funcsynopsis.style">ansi</param>
|
||||||
|
</stylesheet>
|
@ -1,327 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
|
|
||||||
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>
|
|
||||||
|
|
||||||
<book id="TulipUserGuide">
|
|
||||||
<bookinfo>
|
|
||||||
<title>Tulip Driver User's Guide</title>
|
|
||||||
|
|
||||||
<authorgroup>
|
|
||||||
<author>
|
|
||||||
<firstname>Jeff</firstname>
|
|
||||||
<surname>Garzik</surname>
|
|
||||||
<affiliation>
|
|
||||||
<address>
|
|
||||||
<email>jgarzik@pobox.com</email>
|
|
||||||
</address>
|
|
||||||
</affiliation>
|
|
||||||
</author>
|
|
||||||
</authorgroup>
|
|
||||||
|
|
||||||
<copyright>
|
|
||||||
<year>2001</year>
|
|
||||||
<holder>Jeff Garzik</holder>
|
|
||||||
</copyright>
|
|
||||||
|
|
||||||
<legalnotice>
|
|
||||||
<para>
|
|
||||||
This documentation is free software; you can redistribute
|
|
||||||
it and/or modify it under the terms of the GNU General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2 of the License, or (at your option) any later
|
|
||||||
version.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
This program is distributed in the hope that it will be
|
|
||||||
useful, but WITHOUT ANY WARRANTY; without even the implied
|
|
||||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
See the GNU General Public License for more details.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
You should have received a copy of the GNU General Public
|
|
||||||
License along with this program; if not, write to the Free
|
|
||||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
||||||
MA 02111-1307 USA
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
For more details see the file COPYING in the source
|
|
||||||
distribution of Linux.
|
|
||||||
</para>
|
|
||||||
</legalnotice>
|
|
||||||
</bookinfo>
|
|
||||||
|
|
||||||
<toc></toc>
|
|
||||||
|
|
||||||
<chapter id="intro">
|
|
||||||
<title>Introduction</title>
|
|
||||||
<para>
|
|
||||||
The Tulip Ethernet Card Driver
|
|
||||||
is maintained by Jeff Garzik (<email>jgarzik@pobox.com</email>).
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The Tulip driver was developed by Donald Becker and changed by
|
|
||||||
Jeff Garzik, Takashi Manabe and a cast of thousands.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
For 2.4.x and later kernels, the Linux Tulip driver is available at
|
|
||||||
<ulink url="http://sourceforge.net/projects/tulip/">http://sourceforge.net/projects/tulip/</ulink>
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
This driver is for the Digital "Tulip" Ethernet adapter interface.
|
|
||||||
It should work with most DEC 21*4*-based chips/ethercards, as well as
|
|
||||||
with work-alike chips from Lite-On (PNIC) and Macronix (MXIC) and ASIX.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The original author may be reached as becker@scyld.com, or C/O
|
|
||||||
Scyld Computing Corporation,
|
|
||||||
410 Severn Ave., Suite 210,
|
|
||||||
Annapolis MD 21403
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
Additional information on Donald Becker's tulip.c
|
|
||||||
is available at <ulink url="http://www.scyld.com/network/tulip.html">http://www.scyld.com/network/tulip.html</ulink>
|
|
||||||
</para>
|
|
||||||
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="drvr-compat">
|
|
||||||
<title>Driver Compatibility</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
This device driver is designed for the DECchip "Tulip", Digital's
|
|
||||||
single-chip ethernet controllers for PCI (now owned by Intel).
|
|
||||||
Supported members of the family
|
|
||||||
are the 21040, 21041, 21140, 21140A, 21142, and 21143. Similar work-alike
|
|
||||||
chips from Lite-On, Macronics, ASIX, Compex and other listed below are also
|
|
||||||
supported.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
These chips are used on at least 140 unique PCI board designs. The great
|
|
||||||
number of chips and board designs supported is the reason for the
|
|
||||||
driver size and complexity. Almost of the increasing complexity is in the
|
|
||||||
board configuration and media selection code. There is very little
|
|
||||||
increasing in the operational critical path length.
|
|
||||||
</para>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="board-settings">
|
|
||||||
<title>Board-specific Settings</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
PCI bus devices are configured by the system at boot time, so no jumpers
|
|
||||||
need to be set on the board. The system BIOS preferably should assign the
|
|
||||||
PCI INTA signal to an otherwise unused system IRQ line.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
Some boards have EEPROMs tables with default media entry. The factory default
|
|
||||||
is usually "autoselect". This should only be overridden when using
|
|
||||||
transceiver connections without link beat e.g. 10base2 or AUI, or (rarely!)
|
|
||||||
for forcing full-duplex when used with old link partners that do not do
|
|
||||||
autonegotiation.
|
|
||||||
</para>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="driver-operation">
|
|
||||||
<title>Driver Operation</title>
|
|
||||||
|
|
||||||
<sect1><title>Ring buffers</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The Tulip can use either ring buffers or lists of Tx and Rx descriptors.
|
|
||||||
This driver uses statically allocated rings of Rx and Tx descriptors, set at
|
|
||||||
compile time by RX/TX_RING_SIZE. This version of the driver allocates skbuffs
|
|
||||||
for the Rx ring buffers at open() time and passes the skb->data field to the
|
|
||||||
Tulip as receive data buffers. When an incoming frame is less than
|
|
||||||
RX_COPYBREAK bytes long, a fresh skbuff is allocated and the frame is
|
|
||||||
copied to the new skbuff. When the incoming frame is larger, the skbuff is
|
|
||||||
passed directly up the protocol stack and replaced by a newly allocated
|
|
||||||
skbuff.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The RX_COPYBREAK value is chosen to trade-off the memory wasted by
|
|
||||||
using a full-sized skbuff for small frames vs. the copying costs of larger
|
|
||||||
frames. For small frames the copying cost is negligible (esp. considering
|
|
||||||
that we are pre-loading the cache with immediately useful header
|
|
||||||
information). For large frames the copying cost is non-trivial, and the
|
|
||||||
larger copy might flush the cache of useful data. A subtle aspect of this
|
|
||||||
choice is that the Tulip only receives into longword aligned buffers, thus
|
|
||||||
the IP header at offset 14 isn't longword aligned for further processing.
|
|
||||||
Copied frames are put into the new skbuff at an offset of "+2", thus copying
|
|
||||||
has the beneficial effect of aligning the IP header and preloading the
|
|
||||||
cache.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Synchronization</title>
|
|
||||||
<para>
|
|
||||||
The driver runs as two independent, single-threaded flows of control. One
|
|
||||||
is the send-packet routine, which enforces single-threaded use by the
|
|
||||||
dev->tbusy flag. The other thread is the interrupt handler, which is single
|
|
||||||
threaded by the hardware and other software.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The send packet thread has partial control over the Tx ring and 'dev->tbusy'
|
|
||||||
flag. It sets the tbusy flag whenever it's queuing a Tx packet. If the next
|
|
||||||
queue slot is empty, it clears the tbusy flag when finished otherwise it sets
|
|
||||||
the 'tp->tx_full' flag.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The interrupt handler has exclusive control over the Rx ring and records stats
|
|
||||||
from the Tx ring. (The Tx-done interrupt can't be selectively turned off, so
|
|
||||||
we can't avoid the interrupt overhead by having the Tx routine reap the Tx
|
|
||||||
stats.) After reaping the stats, it marks the queue entry as empty by setting
|
|
||||||
the 'base' to zero. Iff the 'tp->tx_full' flag is set, it clears both the
|
|
||||||
tx_full and tbusy flags.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="errata">
|
|
||||||
<title>Errata</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The old DEC databooks were light on details.
|
|
||||||
The 21040 databook claims that CSR13, CSR14, and CSR15 should each be the last
|
|
||||||
register of the set CSR12-15 written. Hmmm, now how is that possible?
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The DEC SROM format is very badly designed not precisely defined, leading to
|
|
||||||
part of the media selection junkheap below. Some boards do not have EEPROM
|
|
||||||
media tables and need to be patched up. Worse, other boards use the DEC
|
|
||||||
design kit media table when it isn't correct for their board.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
We cannot use MII interrupts because there is no defined GPIO pin to attach
|
|
||||||
them. The MII transceiver status is polled using an kernel timer.
|
|
||||||
</para>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="changelog">
|
|
||||||
<title>Driver Change History</title>
|
|
||||||
|
|
||||||
<sect1><title>Version 0.9.14 (February 20, 2001)</title>
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para>Fix PNIC problems (Manfred Spraul)</para></listitem>
|
|
||||||
<listitem><para>Add new PCI id for Accton comet</para></listitem>
|
|
||||||
<listitem><para>Support Davicom tulips</para></listitem>
|
|
||||||
<listitem><para>Fix oops in eeprom parsing</para></listitem>
|
|
||||||
<listitem><para>Enable workarounds for early PCI chipsets</para></listitem>
|
|
||||||
<listitem><para>IA64, hppa csr0 support</para></listitem>
|
|
||||||
<listitem><para>Support media types 5, 6</para></listitem>
|
|
||||||
<listitem><para>Interpret a bit more of the 21142 SROM extended media type 3</para></listitem>
|
|
||||||
<listitem><para>Add missing delay in eeprom reading</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Version 0.9.11 (November 3, 2000)</title>
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para>Eliminate extra bus accesses when sharing interrupts (prumpf)</para></listitem>
|
|
||||||
<listitem><para>Barrier following ownership descriptor bit flip (prumpf)</para></listitem>
|
|
||||||
<listitem><para>Endianness fixes for >14 addresses in setup frames (prumpf)</para></listitem>
|
|
||||||
<listitem><para>Report link beat to kernel/userspace via netif_carrier_*. (kuznet)</para></listitem>
|
|
||||||
<listitem><para>Better spinlocking in set_rx_mode.</para></listitem>
|
|
||||||
<listitem><para>Fix I/O resource request failure error messages (DaveM catch)</para></listitem>
|
|
||||||
<listitem><para>Handle DMA allocation failure.</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Version 0.9.10 (September 6, 2000)</title>
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para>Simple interrupt mitigation (via jamal)</para></listitem>
|
|
||||||
<listitem><para>More PCI ids</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Version 0.9.9 (August 11, 2000)</title>
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para>More PCI ids</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Version 0.9.8 (July 13, 2000)</title>
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para>Correct signed/unsigned comparison for dummy frame index</para></listitem>
|
|
||||||
<listitem><para>Remove outdated references to struct enet_statistics</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Version 0.9.7 (June 17, 2000)</title>
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para>Timer cleanups (Andrew Morton)</para></listitem>
|
|
||||||
<listitem><para>Alpha compile fix (somebody?)</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Version 0.9.6 (May 31, 2000)</title>
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para>Revert 21143-related support flag patch</para></listitem>
|
|
||||||
<listitem><para>Add HPPA/media-table debugging printk</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Version 0.9.5 (May 30, 2000)</title>
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para>HPPA support (willy@puffingroup)</para></listitem>
|
|
||||||
<listitem><para>CSR6 bits and tulip.h cleanup (Chris Smith)</para></listitem>
|
|
||||||
<listitem><para>Improve debugging messages a bit</para></listitem>
|
|
||||||
<listitem><para>Add delay after CSR13 write in t21142_start_nway</para></listitem>
|
|
||||||
<listitem><para>Remove unused ETHER_STATS code</para></listitem>
|
|
||||||
<listitem><para>Convert 'extern inline' to 'static inline' in tulip.h (Chris Smith)</para></listitem>
|
|
||||||
<listitem><para>Update DS21143 support flags in tulip_chip_info[]</para></listitem>
|
|
||||||
<listitem><para>Use spin_lock_irq, not _irqsave/restore, in tulip_start_xmit()</para></listitem>
|
|
||||||
<listitem><para>Add locking to set_rx_mode()</para></listitem>
|
|
||||||
<listitem><para>Fix race with chip setting DescOwned bit (Hal Murray)</para></listitem>
|
|
||||||
<listitem><para>Request 100% of PIO and MMIO resource space assigned to card</para></listitem>
|
|
||||||
<listitem><para>Remove error message from pci_enable_device failure</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Version 0.9.4.3 (April 14, 2000)</title>
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para>mod_timer fix (Hal Murray)</para></listitem>
|
|
||||||
<listitem><para>PNIC2 resuscitation (Chris Smith)</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Version 0.9.4.2 (March 21, 2000)</title>
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para>Fix 21041 CSR7, CSR13/14/15 handling</para></listitem>
|
|
||||||
<listitem><para>Merge some PCI ids from tulip 0.91x</para></listitem>
|
|
||||||
<listitem><para>Merge some HAS_xxx flags and flag settings from tulip 0.91x</para></listitem>
|
|
||||||
<listitem><para>asm/io.h fix (submitted by many) and cleanup</para></listitem>
|
|
||||||
<listitem><para>s/HAS_NWAY143/HAS_NWAY/</para></listitem>
|
|
||||||
<listitem><para>Cleanup 21041 mode reporting</para></listitem>
|
|
||||||
<listitem><para>Small code cleanups</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1><title>Version 0.9.4.1 (March 18, 2000)</title>
|
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para>Finish PCI DMA conversion (davem)</para></listitem>
|
|
||||||
<listitem><para>Do not netif_start_queue() at end of tulip_tx_timeout() (kuznet)</para></listitem>
|
|
||||||
<listitem><para>PCI DMA fix (kuznet)</para></listitem>
|
|
||||||
<listitem><para>eeprom.c code cleanup</para></listitem>
|
|
||||||
<listitem><para>Remove Xircom Tulip crud</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
</book>
|
|
@ -1,597 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
|
|
||||||
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>
|
|
||||||
|
|
||||||
<book id="ViaAudioGuide">
|
|
||||||
<bookinfo>
|
|
||||||
<title>Via 686 Audio Driver for Linux</title>
|
|
||||||
|
|
||||||
<authorgroup>
|
|
||||||
<author>
|
|
||||||
<firstname>Jeff</firstname>
|
|
||||||
<surname>Garzik</surname>
|
|
||||||
</author>
|
|
||||||
</authorgroup>
|
|
||||||
|
|
||||||
<copyright>
|
|
||||||
<year>1999-2001</year>
|
|
||||||
<holder>Jeff Garzik</holder>
|
|
||||||
</copyright>
|
|
||||||
|
|
||||||
<legalnotice>
|
|
||||||
<para>
|
|
||||||
This documentation is free software; you can redistribute
|
|
||||||
it and/or modify it under the terms of the GNU General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2 of the License, or (at your option) any later
|
|
||||||
version.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
This program is distributed in the hope that it will be
|
|
||||||
useful, but WITHOUT ANY WARRANTY; without even the implied
|
|
||||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
See the GNU General Public License for more details.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
You should have received a copy of the GNU General Public
|
|
||||||
License along with this program; if not, write to the Free
|
|
||||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
||||||
MA 02111-1307 USA
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
For more details see the file COPYING in the source
|
|
||||||
distribution of Linux.
|
|
||||||
</para>
|
|
||||||
</legalnotice>
|
|
||||||
</bookinfo>
|
|
||||||
|
|
||||||
<toc></toc>
|
|
||||||
|
|
||||||
<chapter id="intro">
|
|
||||||
<title>Introduction</title>
|
|
||||||
<para>
|
|
||||||
The Via VT82C686A "super southbridge" chips contain
|
|
||||||
AC97-compatible audio logic which features dual 16-bit stereo
|
|
||||||
PCM sound channels (full duplex), plus a third PCM channel intended for use
|
|
||||||
in hardware-assisted FM synthesis.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
The current Linux kernel audio driver for this family of chips
|
|
||||||
supports audio playback and recording, but hardware-assisted
|
|
||||||
FM features, and hardware buffer direct-access (mmap)
|
|
||||||
support are not yet available.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
This driver supports any Linux kernel version after 2.4.10.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
Please send bug reports to the mailing list <email>linux-via@gtf.org</email>.
|
|
||||||
To subscribe, e-mail <email>majordomo@gtf.org</email> with
|
|
||||||
</para>
|
|
||||||
<programlisting>
|
|
||||||
subscribe linux-via
|
|
||||||
</programlisting>
|
|
||||||
<para>
|
|
||||||
in the body of the message.
|
|
||||||
</para>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="install">
|
|
||||||
<title>Driver Installation</title>
|
|
||||||
<para>
|
|
||||||
To use this audio driver, select the
|
|
||||||
CONFIG_SOUND_VIA82CXXX option in the section Sound during kernel configuration.
|
|
||||||
Follow the usual kernel procedures for rebuilding the kernel,
|
|
||||||
or building and installing driver modules.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
To make this driver the default audio driver, you can add the
|
|
||||||
following to your /etc/conf.modules file:
|
|
||||||
</para>
|
|
||||||
<programlisting>
|
|
||||||
alias sound via82cxxx_audio
|
|
||||||
</programlisting>
|
|
||||||
<para>
|
|
||||||
Note that soundcore and ac97_codec support modules
|
|
||||||
are also required for working audio, in addition to
|
|
||||||
the via82cxxx_audio module itself.
|
|
||||||
</para>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="reportbug">
|
|
||||||
<title>Submitting a bug report</title>
|
|
||||||
<sect1 id="bugrepdesc"><title>Description of problem</title>
|
|
||||||
<para>
|
|
||||||
Describe the application you were using to play/record sound, and how
|
|
||||||
to reproduce the problem.
|
|
||||||
</para>
|
|
||||||
</sect1>
|
|
||||||
<sect1 id="bugrepdiag"><title>Diagnostic output</title>
|
|
||||||
<para>
|
|
||||||
Obtain the via-audio-diag diagnostics program from
|
|
||||||
http://sf.net/projects/gkernel/ and provide a dump of the
|
|
||||||
audio chip's registers while the problem is occurring. Sample command line:
|
|
||||||
</para>
|
|
||||||
<programlisting>
|
|
||||||
./via-audio-diag -aps > diag-output.txt
|
|
||||||
</programlisting>
|
|
||||||
</sect1>
|
|
||||||
<sect1 id="bugrepdebug"><title>Driver debug output</title>
|
|
||||||
<para>
|
|
||||||
Define <constant>VIA_DEBUG</constant> at the beginning of the driver, then capture and email
|
|
||||||
the kernel log output. This can be viewed in the system kernel log (if
|
|
||||||
enabled), or via the dmesg program. Sample command line:
|
|
||||||
</para>
|
|
||||||
<programlisting>
|
|
||||||
dmesg > /tmp/dmesg-output.txt
|
|
||||||
</programlisting>
|
|
||||||
</sect1>
|
|
||||||
<sect1 id="bugrepprintk"><title>Bigger kernel message buffer</title>
|
|
||||||
<para>
|
|
||||||
If you wish to increase the size of the buffer displayed by dmesg, then
|
|
||||||
change the <constant>LOG_BUF_LEN</constant> macro at the top of linux/kernel/printk.c, recompile
|
|
||||||
your kernel, and pass the <constant>LOG_BUF_LEN</constant> value to dmesg. Sample command line with
|
|
||||||
<constant>LOG_BUF_LEN</constant> == 32768:
|
|
||||||
</para>
|
|
||||||
<programlisting>
|
|
||||||
dmesg -s 32768 > /tmp/dmesg-output.txt
|
|
||||||
</programlisting>
|
|
||||||
</sect1>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="bugs">
|
|
||||||
<title>Known Bugs And Assumptions</title>
|
|
||||||
<para>
|
|
||||||
<variablelist>
|
|
||||||
<varlistentry><term>Low volume</term>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Volume too low on many systems. Workaround: use mixer program
|
|
||||||
such as xmixer to increase volume.
|
|
||||||
</para>
|
|
||||||
</listitem></varlistentry>
|
|
||||||
|
|
||||||
</variablelist>
|
|
||||||
|
|
||||||
</para>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="thanks">
|
|
||||||
<title>Thanks</title>
|
|
||||||
<para>
|
|
||||||
Via for providing e-mail support, specs, and NDA'd source code.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
MandrakeSoft for providing hacking time.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
AC97 mixer interface fixes and debugging by Ron Cemer <email>roncemer@gte.net</email>.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
Rui Sousa <email>rui.sousa@conexant.com</email>, for bugfixing
|
|
||||||
MMAP support, and several other notable fixes that resulted from
|
|
||||||
his hard work and testing.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
Adrian Cox <email>adrian@humboldt.co.uk</email>, for bugfixing
|
|
||||||
MMAP support, and several other notable fixes that resulted from
|
|
||||||
his hard work and testing.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
Thomas Sailer for further bugfixes.
|
|
||||||
</para>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="notes">
|
|
||||||
<title>Random Notes</title>
|
|
||||||
<para>
|
|
||||||
Two /proc pseudo-files provide diagnostic information. This is generally
|
|
||||||
not useful to most users. Power users can disable CONFIG_SOUND_VIA82CXXX_PROCFS,
|
|
||||||
and remove the /proc support code. Once
|
|
||||||
version 2.0.0 is released, the /proc support code will be disabled by
|
|
||||||
default. Available /proc pseudo-files:
|
|
||||||
</para>
|
|
||||||
<programlisting>
|
|
||||||
/proc/driver/via/0/info
|
|
||||||
/proc/driver/via/0/ac97
|
|
||||||
</programlisting>
|
|
||||||
<para>
|
|
||||||
This driver by default supports all PCI audio devices which report
|
|
||||||
a vendor id of 0x1106, and a device id of 0x3058. Subsystem vendor
|
|
||||||
and device ids are not examined.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
GNU indent formatting options:
|
|
||||||
<programlisting>
|
|
||||||
-kr -i8 -ts8 -br -ce -bap -sob -l80 -pcs -cs -ss -bs -di1 -nbc -lp -psl
|
|
||||||
</programlisting>
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
Via has graciously donated e-mail support and source code to help further
|
|
||||||
the development of this driver. Their assistance has been invaluable
|
|
||||||
in the design and coding of the next major version of this driver.
|
|
||||||
</para>
|
|
||||||
<para>
|
|
||||||
The Via audio chip apparently provides a second PCM scatter-gather
|
|
||||||
DMA channel just for FM data, but does not have a full hardware MIDI
|
|
||||||
processor. I haven't put much thought towards a solution here, but it
|
|
||||||
might involve using SoftOSS midi wave table, or simply disabling MIDI
|
|
||||||
support altogether and using the FM PCM channel as a second (input? output?)
|
|
||||||
</para>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="changelog">
|
|
||||||
<title>Driver ChangeLog</title>
|
|
||||||
|
|
||||||
<sect1 id="version191"><title>
|
|
||||||
Version 1.9.1
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
DSP read/write bugfixes from Thomas Sailer.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Add new PCI id for single-channel use of Via 8233.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Other bug fixes, tweaks, new ioctls.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="version1115"><title>
|
|
||||||
Version 1.1.15
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Support for variable fragment size and variable fragment number (Rui
|
|
||||||
Sousa)
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Fixes for the SPEED, STEREO, CHANNELS, FMT ioctls when in read &
|
|
||||||
write mode (Rui Sousa)
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Mmaped sound is now fully functional. (Rui Sousa)
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Make sure to enable PCI device before reading any of its PCI
|
|
||||||
config information. (fixes potential hotplug problems)
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Clean up code a bit and add more internal function documentation.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
AC97 codec access fixes (Adrian Cox)
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Big endian fixes (Adrian Cox)
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
MIDI support (Adrian Cox)
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Detect and report locked-rate AC97 codecs. If your hardware only
|
|
||||||
supports 48Khz (locked rate), then your recording/playback software
|
|
||||||
must upsample or downsample accordingly. The hardware cannot do it.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Use new pci_request_regions and pci_disable_device functions in
|
|
||||||
kernel 2.4.6.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="version1114"><title>
|
|
||||||
Version 1.1.14
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Use VM_RESERVE when available, to eliminate unnecessary page faults.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="version1112"><title>
|
|
||||||
Version 1.1.12
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
mmap bug fixes from Linus.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="version1111"><title>
|
|
||||||
Version 1.1.11
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Many more bug fixes. mmap enabled by default, but may still be buggy.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Uses new and spiffy method of mmap'ing the DMA buffer, based
|
|
||||||
on a suggestion from Linus.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="version1110"><title>
|
|
||||||
Version 1.1.10
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Many bug fixes. mmap enabled by default, but may still be buggy.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="version119"><title>
|
|
||||||
Version 1.1.9
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Redesign and rewrite audio playback implementation. (faster and smaller, hopefully)
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Implement recording and full duplex (DSP_CAP_DUPLEX) support.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Make procfs support optional.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Quick interrupt status check, to lessen overhead in interrupt
|
|
||||||
sharing situations.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Add mmap(2) support. Disabled for now, it is still buggy and experimental.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Surround all syscalls with a semaphore for cheap and easy SMP protection.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Fix bug in channel shutdown (hardware channel reset) code.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Remove unnecessary spinlocks (better performance).
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Eliminate "unknown AFMT" message by using a different method
|
|
||||||
of selecting the best AFMT_xxx sound sample format for use.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Support for realtime hardware pointer position reporting
|
|
||||||
(DSP_CAP_REALTIME, SNDCTL_DSP_GETxPTR ioctls)
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Support for capture/playback triggering
|
|
||||||
(DSP_CAP_TRIGGER, SNDCTL_DSP_SETTRIGGER ioctls)
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
SNDCTL_DSP_SETDUPLEX and SNDCTL_DSP_POST ioctls now handled.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Rewrite open(2) and close(2) logic to allow only one user at
|
|
||||||
a time. All other open(2) attempts will sleep until they succeed.
|
|
||||||
FIXME: open(O_RDONLY) and open(O_WRONLY) should be allowed to succeed.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Reviewed code to ensure that SMP and multiple audio devices
|
|
||||||
are fully supported.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="version118"><title>
|
|
||||||
Version 1.1.8
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Clean up interrupt handler output. Fixes the following kernel error message:
|
|
||||||
</para>
|
|
||||||
<programlisting>
|
|
||||||
unhandled interrupt ...
|
|
||||||
</programlisting>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Convert documentation to DocBook, so that PDF, HTML and PostScript (.ps) output is readily
|
|
||||||
available.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="version117"><title>
|
|
||||||
Version 1.1.7
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Fix module unload bug where mixer device left registered
|
|
||||||
after driver exit
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="version116"><title>
|
|
||||||
Version 1.1.6
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Rewrite via_set_rate to mimic ALSA basic AC97 rate setting
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Remove much dead code
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Complete spin_lock_irqsave -> spin_lock_irq conversion in via_dsp_ioctl
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Fix build problem in via_dsp_ioctl
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Optimize included headers to eliminate headers found in linux/sound
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="version115"><title>
|
|
||||||
Version 1.1.5
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Disable some overly-verbose debugging code
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Remove unnecessary sound locks
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Fix some ioctls for better time resolution
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Begin spin_lock_irqsave -> spin_lock_irq conversion in via_dsp_ioctl
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="version114"><title>
|
|
||||||
Version 1.1.4
|
|
||||||
</title>
|
|
||||||
<itemizedlist spacing="compact">
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Completed rewrite of driver. Eliminated SoundBlaster compatibility
|
|
||||||
completely, and now uses the much-faster scatter-gather DMA engine.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="intfunctions">
|
|
||||||
<title>Internal Functions</title>
|
|
||||||
!Isound/oss/via82cxxx_audio.c
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
</book>
|
|
||||||
|
|
||||||
|
|
@ -108,8 +108,9 @@ year saw a paper describing an RCU implementation of System V IPC
|
|||||||
2004 has seen a Linux-Journal article on use of RCU in dcache
|
2004 has seen a Linux-Journal article on use of RCU in dcache
|
||||||
[McKenney04a], a performance comparison of locking to RCU on several
|
[McKenney04a], a performance comparison of locking to RCU on several
|
||||||
different CPUs [McKenney04b], a dissertation describing use of RCU in a
|
different CPUs [McKenney04b], a dissertation describing use of RCU in a
|
||||||
number of operating-system kernels [PaulEdwardMcKenneyPhD], and a paper
|
number of operating-system kernels [PaulEdwardMcKenneyPhD], a paper
|
||||||
describing how to make RCU safe for soft-realtime applications [Sarma04c].
|
describing how to make RCU safe for soft-realtime applications [Sarma04c],
|
||||||
|
and a paper describing SELinux performance with RCU [JamesMorris04b].
|
||||||
|
|
||||||
|
|
||||||
Bibtex Entries
|
Bibtex Entries
|
||||||
@ -341,6 +342,17 @@ Dipankar Sarma"
|
|||||||
,pages="18-26"
|
,pages="18-26"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@techreport{Friedberg03a
|
||||||
|
,author="Stuart A. Friedberg"
|
||||||
|
,title="Lock-Free Wild Card Search Data Structure and Method"
|
||||||
|
,institution="US Patent and Trademark Office"
|
||||||
|
,address="Washington, DC"
|
||||||
|
,year="2003"
|
||||||
|
,number="US Patent 6,662,184 (contributed under GPL)"
|
||||||
|
,month="December"
|
||||||
|
,pages="112"
|
||||||
|
}
|
||||||
|
|
||||||
@article{McKenney04a
|
@article{McKenney04a
|
||||||
,author="Paul E. McKenney and Dipankar Sarma and Maneesh Soni"
|
,author="Paul E. McKenney and Dipankar Sarma and Maneesh Soni"
|
||||||
,title="Scaling dcache with {RCU}"
|
,title="Scaling dcache with {RCU}"
|
||||||
@ -373,6 +385,9 @@ in Operating System Kernels"
|
|||||||
,school="OGI School of Science and Engineering at
|
,school="OGI School of Science and Engineering at
|
||||||
Oregon Health and Sciences University"
|
Oregon Health and Sciences University"
|
||||||
,year="2004"
|
,year="2004"
|
||||||
|
,note="Available:
|
||||||
|
\url{http://www.rdrop.com/users/paulmck/RCU/RCUdissertation.2004.07.14e1.pdf}
|
||||||
|
[Viewed October 15, 2004]"
|
||||||
}
|
}
|
||||||
|
|
||||||
@Conference{Sarma04c
|
@Conference{Sarma04c
|
||||||
@ -385,3 +400,13 @@ Oregon Health and Sciences University"
|
|||||||
,month="June"
|
,month="June"
|
||||||
,pages="182-191"
|
,pages="182-191"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@unpublished{JamesMorris04b
|
||||||
|
,Author="James Morris"
|
||||||
|
,Title="Recent Developments in {SELinux} Kernel Performance"
|
||||||
|
,month="December"
|
||||||
|
,year="2004"
|
||||||
|
,note="Available:
|
||||||
|
\url{http://www.livejournal.com/users/james_morris/2153.html}
|
||||||
|
[Viewed December 10, 2004]"
|
||||||
|
}
|
||||||
|
@ -2,11 +2,11 @@ RCU on Uniprocessor Systems
|
|||||||
|
|
||||||
|
|
||||||
A common misconception is that, on UP systems, the call_rcu() primitive
|
A common misconception is that, on UP systems, the call_rcu() primitive
|
||||||
may immediately invoke its function, and that the synchronize_kernel
|
may immediately invoke its function, and that the synchronize_rcu()
|
||||||
primitive may return immediately. The basis of this misconception
|
primitive may return immediately. The basis of this misconception
|
||||||
is that since there is only one CPU, it should not be necessary to
|
is that since there is only one CPU, it should not be necessary to
|
||||||
wait for anything else to get done, since there are no other CPUs for
|
wait for anything else to get done, since there are no other CPUs for
|
||||||
anything else to be happening on. Although this approach will sort of
|
anything else to be happening on. Although this approach will -sort- -of-
|
||||||
work a surprising amount of the time, it is a very bad idea in general.
|
work a surprising amount of the time, it is a very bad idea in general.
|
||||||
This document presents two examples that demonstrate exactly how bad an
|
This document presents two examples that demonstrate exactly how bad an
|
||||||
idea this is.
|
idea this is.
|
||||||
@ -44,14 +44,14 @@ its arguments would cause it to fail to make the fundamental guarantee
|
|||||||
underlying RCU, namely that call_rcu() defers invoking its arguments until
|
underlying RCU, namely that call_rcu() defers invoking its arguments until
|
||||||
all RCU read-side critical sections currently executing have completed.
|
all RCU read-side critical sections currently executing have completed.
|
||||||
|
|
||||||
Quick Quiz: why is it -not- legal to invoke synchronize_kernel() in
|
Quick Quiz: why is it -not- legal to invoke synchronize_rcu() in
|
||||||
this case?
|
this case?
|
||||||
|
|
||||||
|
|
||||||
Summary
|
Summary
|
||||||
|
|
||||||
Permitting call_rcu() to immediately invoke its arguments or permitting
|
Permitting call_rcu() to immediately invoke its arguments or permitting
|
||||||
synchronize_kernel() to immediately return breaks RCU, even on a UP system.
|
synchronize_rcu() to immediately return breaks RCU, even on a UP system.
|
||||||
So do not do it! Even on a UP system, the RCU infrastructure -must-
|
So do not do it! Even on a UP system, the RCU infrastructure -must-
|
||||||
respect grace periods.
|
respect grace periods.
|
||||||
|
|
||||||
|
@ -32,7 +32,10 @@ over a rather long period of time, but improvements are always welcome!
|
|||||||
them -- even x86 allows reads to be reordered), and be prepared
|
them -- even x86 allows reads to be reordered), and be prepared
|
||||||
to explain why this added complexity is worthwhile. If you
|
to explain why this added complexity is worthwhile. If you
|
||||||
choose #c, be prepared to explain how this single task does not
|
choose #c, be prepared to explain how this single task does not
|
||||||
become a major bottleneck on big multiprocessor machines.
|
become a major bottleneck on big multiprocessor machines (for
|
||||||
|
example, if the task is updating information relating to itself
|
||||||
|
that other tasks can read, there by definition can be no
|
||||||
|
bottleneck).
|
||||||
|
|
||||||
2. Do the RCU read-side critical sections make proper use of
|
2. Do the RCU read-side critical sections make proper use of
|
||||||
rcu_read_lock() and friends? These primitives are needed
|
rcu_read_lock() and friends? These primitives are needed
|
||||||
@ -89,27 +92,34 @@ over a rather long period of time, but improvements are always welcome!
|
|||||||
"_rcu()" list-traversal primitives, such as the
|
"_rcu()" list-traversal primitives, such as the
|
||||||
list_for_each_entry_rcu().
|
list_for_each_entry_rcu().
|
||||||
|
|
||||||
b. If the list macros are being used, the list_del_rcu(),
|
b. If the list macros are being used, the list_add_tail_rcu()
|
||||||
list_add_tail_rcu(), and list_del_rcu() primitives must
|
and list_add_rcu() primitives must be used in order
|
||||||
be used in order to prevent weakly ordered machines from
|
to prevent weakly ordered machines from misordering
|
||||||
misordering structure initialization and pointer planting.
|
structure initialization and pointer planting.
|
||||||
Similarly, if the hlist macros are being used, the
|
Similarly, if the hlist macros are being used, the
|
||||||
hlist_del_rcu() and hlist_add_head_rcu() primitives
|
hlist_add_head_rcu() primitive is required.
|
||||||
are required.
|
|
||||||
|
|
||||||
c. Updates must ensure that initialization of a given
|
c. If the list macros are being used, the list_del_rcu()
|
||||||
|
primitive must be used to keep list_del()'s pointer
|
||||||
|
poisoning from inflicting toxic effects on concurrent
|
||||||
|
readers. Similarly, if the hlist macros are being used,
|
||||||
|
the hlist_del_rcu() primitive is required.
|
||||||
|
|
||||||
|
The list_replace_rcu() primitive may be used to
|
||||||
|
replace an old structure with a new one in an
|
||||||
|
RCU-protected list.
|
||||||
|
|
||||||
|
d. Updates must ensure that initialization of a given
|
||||||
structure happens before pointers to that structure are
|
structure happens before pointers to that structure are
|
||||||
publicized. Use the rcu_assign_pointer() primitive
|
publicized. Use the rcu_assign_pointer() primitive
|
||||||
when publicizing a pointer to a structure that can
|
when publicizing a pointer to a structure that can
|
||||||
be traversed by an RCU read-side critical section.
|
be traversed by an RCU read-side critical section.
|
||||||
|
|
||||||
[The rcu_assign_pointer() primitive is in process.]
|
|
||||||
|
|
||||||
5. If call_rcu(), or a related primitive such as call_rcu_bh(),
|
5. If call_rcu(), or a related primitive such as call_rcu_bh(),
|
||||||
is used, the callback function must be written to be called
|
is used, the callback function must be written to be called
|
||||||
from softirq context. In particular, it cannot block.
|
from softirq context. In particular, it cannot block.
|
||||||
|
|
||||||
6. Since synchronize_kernel() blocks, it cannot be called from
|
6. Since synchronize_rcu() can block, it cannot be called from
|
||||||
any sort of irq context.
|
any sort of irq context.
|
||||||
|
|
||||||
7. If the updater uses call_rcu(), then the corresponding readers
|
7. If the updater uses call_rcu(), then the corresponding readers
|
||||||
@ -125,9 +135,9 @@ over a rather long period of time, but improvements are always welcome!
|
|||||||
such cases is a must, of course! And the jury is still out on
|
such cases is a must, of course! And the jury is still out on
|
||||||
whether the increased speed is worth it.
|
whether the increased speed is worth it.
|
||||||
|
|
||||||
8. Although synchronize_kernel() is a bit slower than is call_rcu(),
|
8. Although synchronize_rcu() is a bit slower than is call_rcu(),
|
||||||
it usually results in simpler code. So, unless update performance
|
it usually results in simpler code. So, unless update performance
|
||||||
is important or the updaters cannot block, synchronize_kernel()
|
is important or the updaters cannot block, synchronize_rcu()
|
||||||
should be used in preference to call_rcu().
|
should be used in preference to call_rcu().
|
||||||
|
|
||||||
9. All RCU list-traversal primitives, which include
|
9. All RCU list-traversal primitives, which include
|
||||||
@ -155,3 +165,14 @@ over a rather long period of time, but improvements are always welcome!
|
|||||||
you -must- use the "_rcu()" variants of the list macros.
|
you -must- use the "_rcu()" variants of the list macros.
|
||||||
Failing to do so will break Alpha and confuse people reading
|
Failing to do so will break Alpha and confuse people reading
|
||||||
your code.
|
your code.
|
||||||
|
|
||||||
|
11. Note that synchronize_rcu() -only- guarantees to wait until
|
||||||
|
all currently executing rcu_read_lock()-protected RCU read-side
|
||||||
|
critical sections complete. It does -not- necessarily guarantee
|
||||||
|
that all currently running interrupts, NMIs, preempt_disable()
|
||||||
|
code, or idle loops will complete. Therefore, if you do not have
|
||||||
|
rcu_read_lock()-protected read-side critical sections, do -not-
|
||||||
|
use synchronize_rcu().
|
||||||
|
|
||||||
|
If you want to wait for some of these other things, you might
|
||||||
|
instead need to use synchronize_irq() or synchronize_sched().
|
||||||
|
@ -32,6 +32,7 @@ implementation of audit_filter_task() might be as follows:
|
|||||||
enum audit_state state;
|
enum audit_state state;
|
||||||
|
|
||||||
read_lock(&auditsc_lock);
|
read_lock(&auditsc_lock);
|
||||||
|
/* Note: audit_netlink_sem held by caller. */
|
||||||
list_for_each_entry(e, &audit_tsklist, list) {
|
list_for_each_entry(e, &audit_tsklist, list) {
|
||||||
if (audit_filter_rules(tsk, &e->rule, NULL, &state)) {
|
if (audit_filter_rules(tsk, &e->rule, NULL, &state)) {
|
||||||
read_unlock(&auditsc_lock);
|
read_unlock(&auditsc_lock);
|
||||||
@ -55,6 +56,7 @@ This means that RCU can be easily applied to the read side, as follows:
|
|||||||
enum audit_state state;
|
enum audit_state state;
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
|
/* Note: audit_netlink_sem held by caller. */
|
||||||
list_for_each_entry_rcu(e, &audit_tsklist, list) {
|
list_for_each_entry_rcu(e, &audit_tsklist, list) {
|
||||||
if (audit_filter_rules(tsk, &e->rule, NULL, &state)) {
|
if (audit_filter_rules(tsk, &e->rule, NULL, &state)) {
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
@ -139,12 +141,15 @@ Normally, the write_lock() and write_unlock() would be replaced by
|
|||||||
a spin_lock() and a spin_unlock(), but in this case, all callers hold
|
a spin_lock() and a spin_unlock(), but in this case, all callers hold
|
||||||
audit_netlink_sem, so no additional locking is required. The auditsc_lock
|
audit_netlink_sem, so no additional locking is required. The auditsc_lock
|
||||||
can therefore be eliminated, since use of RCU eliminates the need for
|
can therefore be eliminated, since use of RCU eliminates the need for
|
||||||
writers to exclude readers.
|
writers to exclude readers. Normally, the write_lock() calls would
|
||||||
|
be converted into spin_lock() calls.
|
||||||
|
|
||||||
The list_del(), list_add(), and list_add_tail() primitives have been
|
The list_del(), list_add(), and list_add_tail() primitives have been
|
||||||
replaced by list_del_rcu(), list_add_rcu(), and list_add_tail_rcu().
|
replaced by list_del_rcu(), list_add_rcu(), and list_add_tail_rcu().
|
||||||
The _rcu() list-manipulation primitives add memory barriers that are
|
The _rcu() list-manipulation primitives add memory barriers that are
|
||||||
needed on weakly ordered CPUs (most of them!).
|
needed on weakly ordered CPUs (most of them!). The list_del_rcu()
|
||||||
|
primitive omits the pointer poisoning debug-assist code that would
|
||||||
|
otherwise cause concurrent readers to fail spectacularly.
|
||||||
|
|
||||||
So, when readers can tolerate stale data and when entries are either added
|
So, when readers can tolerate stale data and when entries are either added
|
||||||
or deleted, without in-place modification, it is very easy to use RCU!
|
or deleted, without in-place modification, it is very easy to use RCU!
|
||||||
@ -166,6 +171,7 @@ otherwise, the added fields would need to be filled in):
|
|||||||
struct audit_newentry *ne;
|
struct audit_newentry *ne;
|
||||||
|
|
||||||
write_lock(&auditsc_lock);
|
write_lock(&auditsc_lock);
|
||||||
|
/* Note: audit_netlink_sem held by caller. */
|
||||||
list_for_each_entry(e, list, list) {
|
list_for_each_entry(e, list, list) {
|
||||||
if (!audit_compare_rule(rule, &e->rule)) {
|
if (!audit_compare_rule(rule, &e->rule)) {
|
||||||
e->rule.action = newaction;
|
e->rule.action = newaction;
|
||||||
@ -199,8 +205,7 @@ RCU ("read-copy update") its name. The RCU code is as follows:
|
|||||||
audit_copy_rule(&ne->rule, &e->rule);
|
audit_copy_rule(&ne->rule, &e->rule);
|
||||||
ne->rule.action = newaction;
|
ne->rule.action = newaction;
|
||||||
ne->rule.file_count = newfield_count;
|
ne->rule.file_count = newfield_count;
|
||||||
list_add_rcu(ne, e);
|
list_replace_rcu(e, ne);
|
||||||
list_del(e);
|
|
||||||
call_rcu(&e->rcu, audit_free_rule, e);
|
call_rcu(&e->rcu, audit_free_rule, e);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,9 @@ o If I am running on a uniprocessor kernel, which can only do one
|
|||||||
|
|
||||||
o How can I see where RCU is currently used in the Linux kernel?
|
o How can I see where RCU is currently used in the Linux kernel?
|
||||||
|
|
||||||
Search for "rcu_read_lock", "call_rcu", and "synchronize_kernel".
|
Search for "rcu_read_lock", "rcu_read_unlock", "call_rcu",
|
||||||
|
"rcu_read_lock_bh", "rcu_read_unlock_bh", "call_rcu_bh",
|
||||||
|
"synchronize_rcu", and "synchronize_net".
|
||||||
|
|
||||||
o What guidelines should I follow when writing code that uses RCU?
|
o What guidelines should I follow when writing code that uses RCU?
|
||||||
|
|
||||||
|
@ -4,6 +4,16 @@ The EtherDrive (R) HOWTO for users of 2.6 kernels is found at ...
|
|||||||
|
|
||||||
It has many tips and hints!
|
It has many tips and hints!
|
||||||
|
|
||||||
|
The aoetools are userland programs that are designed to work with this
|
||||||
|
driver. The aoetools are on sourceforge.
|
||||||
|
|
||||||
|
http://aoetools.sourceforge.net/
|
||||||
|
|
||||||
|
The scripts in this Documentation/aoe directory are intended to
|
||||||
|
document the use of the driver and are not necessary if you install
|
||||||
|
the aoetools.
|
||||||
|
|
||||||
|
|
||||||
CREATING DEVICE NODES
|
CREATING DEVICE NODES
|
||||||
|
|
||||||
Users of udev should find the block device nodes created
|
Users of udev should find the block device nodes created
|
||||||
@ -35,14 +45,15 @@ USING DEVICE NODES
|
|||||||
|
|
||||||
"echo eth2 eth4 > /dev/etherd/interfaces" tells the aoe driver to
|
"echo eth2 eth4 > /dev/etherd/interfaces" tells the aoe driver to
|
||||||
limit ATA over Ethernet traffic to eth2 and eth4. AoE traffic from
|
limit ATA over Ethernet traffic to eth2 and eth4. AoE traffic from
|
||||||
untrusted networks should be ignored as a matter of security.
|
untrusted networks should be ignored as a matter of security. See
|
||||||
|
also the aoe_iflist driver option described below.
|
||||||
|
|
||||||
"echo > /dev/etherd/discover" tells the driver to find out what AoE
|
"echo > /dev/etherd/discover" tells the driver to find out what AoE
|
||||||
devices are available.
|
devices are available.
|
||||||
|
|
||||||
These character devices may disappear and be replaced by sysfs
|
These character devices may disappear and be replaced by sysfs
|
||||||
counterparts, so distribution maintainers are encouraged to create
|
counterparts. Using the commands in aoetools insulates users from
|
||||||
scripts that use these devices.
|
these implementation details.
|
||||||
|
|
||||||
The block devices are named like this:
|
The block devices are named like this:
|
||||||
|
|
||||||
@ -66,7 +77,8 @@ USING SYSFS
|
|||||||
through which we are communicating with the remote AoE device.
|
through which we are communicating with the remote AoE device.
|
||||||
|
|
||||||
There is a script in this directory that formats this information
|
There is a script in this directory that formats this information
|
||||||
in a convenient way.
|
in a convenient way. Users with aoetools can use the aoe-stat
|
||||||
|
command.
|
||||||
|
|
||||||
root@makki root# sh Documentation/aoe/status.sh
|
root@makki root# sh Documentation/aoe/status.sh
|
||||||
e10.0 eth3 up
|
e10.0 eth3 up
|
||||||
@ -89,3 +101,23 @@ USING SYSFS
|
|||||||
e4.7 eth1 up
|
e4.7 eth1 up
|
||||||
e4.8 eth1 up
|
e4.8 eth1 up
|
||||||
e4.9 eth1 up
|
e4.9 eth1 up
|
||||||
|
|
||||||
|
Use /sys/module/aoe/parameters/aoe_iflist (or better, the driver
|
||||||
|
option discussed below) instead of /dev/etherd/interfaces to limit
|
||||||
|
AoE traffic to the network interfaces in the given
|
||||||
|
whitespace-separated list. Unlike the old character device, the
|
||||||
|
sysfs entry can be read from as well as written to.
|
||||||
|
|
||||||
|
It's helpful to trigger discovery after setting the list of allowed
|
||||||
|
interfaces. The aoetools package provides an aoe-discover script
|
||||||
|
for this purpose. You can also directly use the
|
||||||
|
/dev/etherd/discover special file described above.
|
||||||
|
|
||||||
|
DRIVER OPTIONS
|
||||||
|
|
||||||
|
There is a boot option for the built-in aoe driver and a
|
||||||
|
corresponding module parameter, aoe_iflist. Without this option,
|
||||||
|
all network interfaces may be used for ATA over Ethernet. Here is a
|
||||||
|
usage example for the module parameter.
|
||||||
|
|
||||||
|
modprobe aoe_iflist="eth1 eth3"
|
||||||
|
@ -14,10 +14,6 @@ test ! -d "$sysd/block" && {
|
|||||||
echo "$me Error: sysfs is not mounted" 1>&2
|
echo "$me Error: sysfs is not mounted" 1>&2
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
test -z "`lsmod | grep '^aoe'`" && {
|
|
||||||
echo "$me Error: aoe module is not loaded" 1>&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
for d in `ls -d $sysd/block/etherd* 2>/dev/null | grep -v p` end; do
|
for d in `ls -d $sysd/block/etherd* 2>/dev/null | grep -v p` end; do
|
||||||
# maybe ls comes up empty, so we use "end"
|
# maybe ls comes up empty, so we use "end"
|
||||||
|
@ -1,137 +1,140 @@
|
|||||||
.*
|
|
||||||
*~
|
|
||||||
53c8xx_d.h*
|
|
||||||
*.a
|
*.a
|
||||||
aic7*reg.h*
|
*.aux
|
||||||
aic7*seq.h*
|
*.bin
|
||||||
aic7*reg_print.c*
|
*.cpio
|
||||||
|
*.css
|
||||||
|
*.dvi
|
||||||
|
*.eps
|
||||||
|
*.gif
|
||||||
|
*.grep
|
||||||
|
*.grp
|
||||||
|
*.gz
|
||||||
|
*.html
|
||||||
|
*.jpeg
|
||||||
|
*.ko
|
||||||
|
*.log
|
||||||
|
*.lst
|
||||||
|
*.mod.c
|
||||||
|
*.o
|
||||||
|
*.orig
|
||||||
|
*.out
|
||||||
|
*.pdf
|
||||||
|
*.png
|
||||||
|
*.ps
|
||||||
|
*.rej
|
||||||
|
*.s
|
||||||
|
*.sgml
|
||||||
|
*.so
|
||||||
|
*.tex
|
||||||
|
*.ver
|
||||||
|
*.xml
|
||||||
|
*_MODULES
|
||||||
|
*_vga16.c
|
||||||
|
*cscope*
|
||||||
|
*~
|
||||||
|
.*
|
||||||
|
.cscope
|
||||||
53c700_d.h
|
53c700_d.h
|
||||||
|
53c8xx_d.h*
|
||||||
|
BitKeeper
|
||||||
|
COPYING
|
||||||
|
CREDITS
|
||||||
|
CVS
|
||||||
|
ChangeSet
|
||||||
|
Kerntypes
|
||||||
|
MODS.txt
|
||||||
|
Module.symvers
|
||||||
|
PENDING
|
||||||
|
SCCS
|
||||||
|
System.map*
|
||||||
|
TAGS
|
||||||
|
aic7*reg.h*
|
||||||
|
aic7*reg_print.c*
|
||||||
|
aic7*seq.h*
|
||||||
aicasm
|
aicasm
|
||||||
aicdb.h*
|
aicdb.h*
|
||||||
asm
|
asm
|
||||||
asm_offsets.*
|
asm_offsets.*
|
||||||
autoconf.h*
|
autoconf.h*
|
||||||
*.aux
|
|
||||||
bbootsect
|
bbootsect
|
||||||
*.bin
|
|
||||||
bin2c
|
bin2c
|
||||||
binkernel.spec
|
binkernel.spec
|
||||||
BitKeeper
|
|
||||||
bootsect
|
bootsect
|
||||||
bsetup
|
bsetup
|
||||||
btfixupprep
|
btfixupprep
|
||||||
build
|
build
|
||||||
bvmlinux
|
bvmlinux
|
||||||
bzImage*
|
bzImage*
|
||||||
ChangeSet
|
|
||||||
classlist.h*
|
classlist.h*
|
||||||
compile.h*
|
|
||||||
comp*.log
|
comp*.log
|
||||||
|
compile.h*
|
||||||
config
|
config
|
||||||
config-*
|
config-*
|
||||||
config_data.h*
|
config_data.h*
|
||||||
conmakehash
|
conmakehash
|
||||||
consolemap_deftbl.c*
|
consolemap_deftbl.c*
|
||||||
COPYING
|
crc32table.h*
|
||||||
CREDITS
|
|
||||||
.cscope
|
|
||||||
*cscope*
|
|
||||||
cscope.*
|
cscope.*
|
||||||
*.out
|
|
||||||
*.css
|
|
||||||
CVS
|
|
||||||
defkeymap.c*
|
defkeymap.c*
|
||||||
devlist.h*
|
devlist.h*
|
||||||
docproc
|
docproc
|
||||||
dummy_sym.c*
|
dummy_sym.c*
|
||||||
*.dvi
|
elfconfig.h*
|
||||||
*.eps
|
|
||||||
filelist
|
filelist
|
||||||
fixdep
|
fixdep
|
||||||
fore200e_mkfirm
|
fore200e_mkfirm
|
||||||
fore200e_pca_fw.c*
|
fore200e_pca_fw.c*
|
||||||
gen-devlist
|
gen-devlist
|
||||||
gen_init_cpio
|
|
||||||
gen_crc32table
|
|
||||||
crc32table.h*
|
|
||||||
*.cpio
|
|
||||||
gen-kdb_cmds.c*
|
gen-kdb_cmds.c*
|
||||||
gentbl
|
gen_crc32table
|
||||||
|
gen_init_cpio
|
||||||
genksyms
|
genksyms
|
||||||
*.gif
|
gentbl
|
||||||
*.gz
|
|
||||||
*.html
|
|
||||||
ikconfig.h*
|
ikconfig.h*
|
||||||
initramfs_list
|
initramfs_list
|
||||||
*.jpeg
|
kallsyms
|
||||||
kconfig
|
kconfig
|
||||||
kconfig.tk
|
kconfig.tk
|
||||||
Kerntypes
|
|
||||||
keywords.c*
|
keywords.c*
|
||||||
ksym.c*
|
ksym.c*
|
||||||
ksym.h*
|
ksym.h*
|
||||||
kallsyms
|
|
||||||
mk_elfconfig
|
|
||||||
elfconfig.h*
|
|
||||||
modpost
|
|
||||||
pnmtologo
|
|
||||||
logo_*.c
|
|
||||||
*.log
|
|
||||||
lex.c*
|
lex.c*
|
||||||
|
logo_*.c
|
||||||
logo_*_clut224.c
|
logo_*_clut224.c
|
||||||
logo_*_mono.c
|
logo_*_mono.c
|
||||||
lxdialog
|
lxdialog
|
||||||
make_times_h
|
make_times_h
|
||||||
map
|
map
|
||||||
mkdep
|
|
||||||
*_MODULES
|
|
||||||
MODS.txt
|
|
||||||
modversions.h*
|
|
||||||
Module.symvers
|
|
||||||
*.mod.c
|
|
||||||
*.o
|
|
||||||
*.ko
|
|
||||||
*.orig
|
|
||||||
*.lst
|
|
||||||
*.grp
|
|
||||||
*.grep
|
|
||||||
oui.c*
|
|
||||||
mktables
|
|
||||||
raid6tables.c
|
|
||||||
raid6int*.c
|
|
||||||
raid6altivec*.c
|
|
||||||
wanxlfw.inc
|
|
||||||
maui_boot.h
|
maui_boot.h
|
||||||
pss_boot.h
|
mk_elfconfig
|
||||||
trix_boot.h
|
mkdep
|
||||||
*.pdf
|
mktables
|
||||||
|
modpost
|
||||||
|
modversions.h*
|
||||||
|
offsets.h
|
||||||
|
oui.c*
|
||||||
parse.c*
|
parse.c*
|
||||||
parse.h*
|
parse.h*
|
||||||
PENDING
|
pnmtologo
|
||||||
ppc_defs.h*
|
ppc_defs.h*
|
||||||
promcon_tbl.c*
|
promcon_tbl.c*
|
||||||
*.png
|
pss_boot.h
|
||||||
*.ps
|
raid6altivec*.c
|
||||||
*.rej
|
raid6int*.c
|
||||||
SCCS
|
raid6tables.c
|
||||||
setup
|
setup
|
||||||
*.s
|
|
||||||
*.so
|
|
||||||
*.sgml
|
|
||||||
sim710_d.h*
|
sim710_d.h*
|
||||||
sm_tbl*
|
sm_tbl*
|
||||||
split-include
|
split-include
|
||||||
System.map*
|
|
||||||
tags
|
tags
|
||||||
TAGS
|
|
||||||
*.tex
|
|
||||||
times.h*
|
times.h*
|
||||||
tkparse
|
tkparse
|
||||||
*.ver
|
trix_boot.h
|
||||||
version.h*
|
version.h*
|
||||||
*_vga16.c
|
|
||||||
vmlinux
|
vmlinux
|
||||||
vmlinux.lds
|
|
||||||
vmlinux-*
|
vmlinux-*
|
||||||
|
vmlinux.lds
|
||||||
vsyscall.lds
|
vsyscall.lds
|
||||||
|
wanxlfw.inc
|
||||||
|
uImage
|
||||||
zImage
|
zImage
|
||||||
|
@ -48,3 +48,18 @@ When: April 2005
|
|||||||
Why: Replaced by ->compat_ioctl in file_operations and other method
|
Why: Replaced by ->compat_ioctl in file_operations and other method
|
||||||
vecors.
|
vecors.
|
||||||
Who: Andi Kleen <ak@muc.de>, Christoph Hellwig <hch@lst.de>
|
Who: Andi Kleen <ak@muc.de>, Christoph Hellwig <hch@lst.de>
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
What: RCU API moves to EXPORT_SYMBOL_GPL
|
||||||
|
When: April 2006
|
||||||
|
Files: include/linux/rcupdate.h, kernel/rcupdate.c
|
||||||
|
Why: Outside of Linux, the only implementations of anything even
|
||||||
|
vaguely resembling RCU that I am aware of are in DYNIX/ptx,
|
||||||
|
VM/XA, Tornado, and K42. I do not expect anyone to port binary
|
||||||
|
drivers or kernel modules from any of these, since the first two
|
||||||
|
are owned by IBM and the last two are open-source research OSes.
|
||||||
|
So these will move to GPL after a grace period to allow
|
||||||
|
people, who might be using implementations that I am not aware
|
||||||
|
of, to adjust to this upcoming change.
|
||||||
|
Who: Paul E. McKenney <paulmck@us.ibm.com>
|
||||||
|
@ -219,8 +219,12 @@ This may also be done to avoid internal deadlocks, but rarely.
|
|||||||
If the filesytem is called for sync then it must wait on any
|
If the filesytem is called for sync then it must wait on any
|
||||||
in-progress I/O and then start new I/O.
|
in-progress I/O and then start new I/O.
|
||||||
|
|
||||||
The filesystem should unlock the page synchronously, before returning
|
The filesystem should unlock the page synchronously, before returning to the
|
||||||
to the caller.
|
caller, unless ->writepage() returns special WRITEPAGE_ACTIVATE
|
||||||
|
value. WRITEPAGE_ACTIVATE means that page cannot really be written out
|
||||||
|
currently, and VM should stop calling ->writepage() on this page for some
|
||||||
|
time. VM does this by moving page to the head of the active list, hence the
|
||||||
|
name.
|
||||||
|
|
||||||
Unless the filesystem is going to redirty_page_for_writepage(), unlock the page
|
Unless the filesystem is going to redirty_page_for_writepage(), unlock the page
|
||||||
and return zero, writepage *must* run set_page_writeback() against the page,
|
and return zero, writepage *must* run set_page_writeback() against the page,
|
||||||
|
@ -909,16 +909,6 @@ nr_free_inodes
|
|||||||
Represents the number of free inodes. Ie. The number of inuse inodes is
|
Represents the number of free inodes. Ie. The number of inuse inodes is
|
||||||
(nr_inodes - nr_free_inodes).
|
(nr_inodes - nr_free_inodes).
|
||||||
|
|
||||||
super-nr and super-max
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
Again, super block structures are allocated by the kernel, but not freed. The
|
|
||||||
file super-max contains the maximum number of super block handlers, where
|
|
||||||
super-nr shows the number of currently allocated ones.
|
|
||||||
|
|
||||||
Every mounted file system needs a super block, so if you plan to mount lots of
|
|
||||||
file systems, you may want to increase these numbers.
|
|
||||||
|
|
||||||
aio-nr and aio-max-nr
|
aio-nr and aio-max-nr
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
|
@ -79,6 +79,6 @@ Offset Type Description
|
|||||||
0x22c unsigned long ramdisk_max
|
0x22c unsigned long ramdisk_max
|
||||||
0x230 16 bytes trampoline
|
0x230 16 bytes trampoline
|
||||||
0x290 - 0x2cf EDD_MBR_SIG_BUFFER (edd.S)
|
0x290 - 0x2cf EDD_MBR_SIG_BUFFER (edd.S)
|
||||||
0x2d0 - 0x600 E820MAP
|
0x2d0 - 0xd00 E820MAP
|
||||||
0x600 - 0x7ff EDDBUF (edd.S) for disk signature read sector
|
0xd00 - 0xeff EDDBUF (edd.S) for disk signature read sector
|
||||||
0x600 - 0x7eb EDDBUF (edd.S) for edd data
|
0xd00 - 0xeeb EDDBUF (edd.S) for edd data
|
||||||
|
@ -178,10 +178,9 @@ Released 1994-06-13
|
|||||||
7. ACKNOWLEDGMENTS.
|
7. ACKNOWLEDGMENTS.
|
||||||
|
|
||||||
These drivers wouldn't have been done without the base
|
These drivers wouldn't have been done without the base
|
||||||
(and support) from Ross Biro <bir7@leland.stanford.edu>,
|
(and support) from Ross Biro, and D-Link Systems Inc.
|
||||||
and D-Link Systems Inc. The driver relies upon GPL-ed
|
The driver relies upon GPL-ed source from D-Link Systems Inc.
|
||||||
source from D-Link Systems Inc. and from Russel Nelson at
|
and from Russel Nelson at Crynwr Software <nelson@crynwr.com>.
|
||||||
Crynwr Software <nelson@crynwr.com>.
|
|
||||||
|
|
||||||
Additional input also from:
|
Additional input also from:
|
||||||
Donald Becker <becker@super.org>, Alan Cox <A.Cox@swansea.ac.uk>
|
Donald Becker <becker@super.org>, Alan Cox <A.Cox@swansea.ac.uk>
|
||||||
|
@ -51,6 +51,8 @@ dev->hard_start_xmit:
|
|||||||
set_multicast_list
|
set_multicast_list
|
||||||
Context: BHs disabled
|
Context: BHs disabled
|
||||||
Notes: netif_queue_stopped() is guaranteed false
|
Notes: netif_queue_stopped() is guaranteed false
|
||||||
|
Interrupts must be enabled when calling hard_start_xmit.
|
||||||
|
(Interrupts must also be enabled when enabling the BH handler.)
|
||||||
Return codes:
|
Return codes:
|
||||||
o NETDEV_TX_OK everything ok.
|
o NETDEV_TX_OK everything ok.
|
||||||
o NETDEV_TX_BUSY Cannot transmit packet, try later
|
o NETDEV_TX_BUSY Cannot transmit packet, try later
|
||||||
|
@ -279,6 +279,7 @@ pci_for_each_dev_reverse() Superseded by pci_find_device_reverse()
|
|||||||
pci_for_each_bus() Superseded by pci_find_next_bus()
|
pci_for_each_bus() Superseded by pci_find_next_bus()
|
||||||
pci_find_device() Superseded by pci_get_device()
|
pci_find_device() Superseded by pci_get_device()
|
||||||
pci_find_subsys() Superseded by pci_get_subsys()
|
pci_find_subsys() Superseded by pci_get_subsys()
|
||||||
|
pci_find_slot() Superseded by pci_get_slot()
|
||||||
pcibios_find_class() Superseded by pci_get_class()
|
pcibios_find_class() Superseded by pci_get_class()
|
||||||
pci_find_class() Superseded by pci_get_class()
|
pci_find_class() Superseded by pci_get_class()
|
||||||
pci_(read|write)_*_nodev() Superseded by pci_bus_(read|write)_*()
|
pci_(read|write)_*_nodev() Superseded by pci_bus_(read|write)_*()
|
||||||
|
@ -165,40 +165,9 @@ Description:
|
|||||||
These functions are intended for use by individual drivers, and are defined in
|
These functions are intended for use by individual drivers, and are defined in
|
||||||
struct pci_driver:
|
struct pci_driver:
|
||||||
|
|
||||||
int (*save_state) (struct pci_dev *dev, u32 state);
|
int (*suspend) (struct pci_dev *dev, pm_message_t state);
|
||||||
int (*suspend) (struct pci_dev *dev, u32 state);
|
|
||||||
int (*resume) (struct pci_dev *dev);
|
int (*resume) (struct pci_dev *dev);
|
||||||
int (*enable_wake) (struct pci_dev *dev, u32 state, int enable);
|
int (*enable_wake) (struct pci_dev *dev, pci_power_t state, int enable);
|
||||||
|
|
||||||
|
|
||||||
save_state
|
|
||||||
----------
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
|
|
||||||
if (dev->driver && dev->driver->save_state)
|
|
||||||
dev->driver->save_state(dev,state);
|
|
||||||
|
|
||||||
The driver should use this callback to save device state. It should take into
|
|
||||||
account the current state of the device and the requested state in order to
|
|
||||||
avoid any unnecessary operations.
|
|
||||||
|
|
||||||
For example, a video card that supports all 4 states (D0-D3), all controller
|
|
||||||
context is preserved when entering D1, but the screen is placed into a low power
|
|
||||||
state (blanked).
|
|
||||||
|
|
||||||
The driver can also interpret this function as a notification that it may be
|
|
||||||
entering a sleep state in the near future. If it knows that the device cannot
|
|
||||||
enter the requested state, either because of lack of support for it, or because
|
|
||||||
the device is middle of some critical operation, then it should fail.
|
|
||||||
|
|
||||||
This function should not be used to set any state in the device or the driver
|
|
||||||
because the device may not actually enter the sleep state (e.g. another driver
|
|
||||||
later causes causes a global state transition to fail).
|
|
||||||
|
|
||||||
Note that in intermediate low power states, a device's I/O and memory spaces may
|
|
||||||
be disabled and may not be available in subsequent transitions to lower power
|
|
||||||
states.
|
|
||||||
|
|
||||||
|
|
||||||
suspend
|
suspend
|
||||||
|
@ -56,12 +56,16 @@ read_dev_chars()
|
|||||||
read device characteristics
|
read device characteristics
|
||||||
|
|
||||||
read_conf_data()
|
read_conf_data()
|
||||||
|
read_conf_data_lpm()
|
||||||
read configuration data.
|
read configuration data.
|
||||||
|
|
||||||
ccw_device_get_ciw()
|
ccw_device_get_ciw()
|
||||||
get commands from extended sense data.
|
get commands from extended sense data.
|
||||||
|
|
||||||
ccw_device_start()
|
ccw_device_start()
|
||||||
|
ccw_device_start_timeout()
|
||||||
|
ccw_device_start_key()
|
||||||
|
ccw_device_start_key_timeout()
|
||||||
initiate an I/O request.
|
initiate an I/O request.
|
||||||
|
|
||||||
ccw_device_resume()
|
ccw_device_resume()
|
||||||
@ -197,19 +201,21 @@ The read_dev_chars() function returns :
|
|||||||
operational.
|
operational.
|
||||||
|
|
||||||
|
|
||||||
read_conf_data() - Read Configuration Data
|
read_conf_data(), read_conf_data_lpm() - Read Configuration Data
|
||||||
|
|
||||||
Retrieve the device dependent configuration data. Please have a look at your
|
Retrieve the device dependent configuration data. Please have a look at your
|
||||||
device dependent I/O commands for the device specific layout of the node
|
device dependent I/O commands for the device specific layout of the node
|
||||||
descriptor elements.
|
descriptor elements. read_conf_data_lpm() will retrieve the configuration data
|
||||||
|
for a specific path.
|
||||||
|
|
||||||
The function is meant to be called with an irq handler in place; that is,
|
The function is meant to be called with the device already enabled; that is,
|
||||||
at earliest during set_online() processing.
|
at earliest during set_online() processing.
|
||||||
|
|
||||||
The function may be called enabled or disabled, but the device must not be
|
The function may be called enabled or disabled, but the device must not be
|
||||||
locked
|
locked
|
||||||
|
|
||||||
int read_conf_data(struct ccw_device, void **buffer, int *length, __u8 lpm);
|
int read_conf_data(struct ccw_device, void **buffer, int *length);
|
||||||
|
int read_conf_data_lpm(struct ccw_device, void **buffer, int *length, __u8 lpm);
|
||||||
|
|
||||||
cdev - the ccw_device the data is requested for.
|
cdev - the ccw_device the data is requested for.
|
||||||
buffer - Pointer to a buffer pointer. The read_conf_data() routine
|
buffer - Pointer to a buffer pointer. The read_conf_data() routine
|
||||||
@ -263,6 +269,25 @@ int ccw_device_start(struct ccw_device *cdev,
|
|||||||
unsigned long intparm,
|
unsigned long intparm,
|
||||||
__u8 lpm,
|
__u8 lpm,
|
||||||
unsigned long flags);
|
unsigned long flags);
|
||||||
|
int ccw_device_start_timeout(struct ccw_device *cdev,
|
||||||
|
struct ccw1 *cpa,
|
||||||
|
unsigned long intparm,
|
||||||
|
__u8 lpm,
|
||||||
|
unsigned long flags,
|
||||||
|
int expires);
|
||||||
|
int ccw_device_start_key(struct ccw_device *cdev,
|
||||||
|
struct ccw1 *cpa,
|
||||||
|
unsigned long intparm,
|
||||||
|
__u8 lpm,
|
||||||
|
__u8 key,
|
||||||
|
unsigned long flags);
|
||||||
|
int ccw_device_start_key_timeout(struct ccw_device *cdev,
|
||||||
|
struct ccw1 *cpa,
|
||||||
|
unsigned long intparm,
|
||||||
|
__u8 lpm,
|
||||||
|
__u8 key,
|
||||||
|
unsigned long flags,
|
||||||
|
int expires);
|
||||||
|
|
||||||
cdev : ccw_device the I/O is destined for
|
cdev : ccw_device the I/O is destined for
|
||||||
cpa : logical start address of channel program
|
cpa : logical start address of channel program
|
||||||
@ -272,7 +297,12 @@ user_intparm : user specific interrupt information; will be presented
|
|||||||
particular I/O request.
|
particular I/O request.
|
||||||
lpm : defines the channel path to be used for a specific I/O
|
lpm : defines the channel path to be used for a specific I/O
|
||||||
request. A value of 0 will make cio use the opm.
|
request. A value of 0 will make cio use the opm.
|
||||||
|
key : the storage key to use for the I/O (useful for operating on a
|
||||||
|
storage with a storage key != default key)
|
||||||
flag : defines the action to be performed for I/O processing
|
flag : defines the action to be performed for I/O processing
|
||||||
|
expires : timeout value in jiffies. The common I/O layer will terminate
|
||||||
|
the running program after this and call the interrupt handler
|
||||||
|
with ERR_PTR(-ETIMEDOUT) as irb.
|
||||||
|
|
||||||
Possible flag values are :
|
Possible flag values are :
|
||||||
|
|
||||||
@ -327,6 +357,13 @@ current (last) I/O request. In case of a delayed status notification no special
|
|||||||
interrupt will be presented to indicate I/O completion as the I/O request was
|
interrupt will be presented to indicate I/O completion as the I/O request was
|
||||||
never started, even though ccw_device_start() returned with successful completion.
|
never started, even though ccw_device_start() returned with successful completion.
|
||||||
|
|
||||||
|
The irb may contain an error value, and the device driver should check for this
|
||||||
|
first:
|
||||||
|
|
||||||
|
-ETIMEDOUT: the common I/O layer terminated the request after the specified
|
||||||
|
timeout value
|
||||||
|
-EIO: the common I/O layer terminated the request due to an error state
|
||||||
|
|
||||||
If the concurrent sense flag in the extended status word in the irb is set, the
|
If the concurrent sense flag in the extended status word in the irb is set, the
|
||||||
field irb->scsw.count describes the numer of device specific sense bytes
|
field irb->scsw.count describes the numer of device specific sense bytes
|
||||||
available in the extended control word irb->scsw.ecw[0]. No device sensing by
|
available in the extended control word irb->scsw.ecw[0]. No device sensing by
|
||||||
|
11
MAINTAINERS
11
MAINTAINERS
@ -1699,7 +1699,9 @@ P: Pavel Roskin
|
|||||||
M: proski@gnu.org
|
M: proski@gnu.org
|
||||||
P: David Gibson
|
P: David Gibson
|
||||||
M: hermes@gibson.dropbear.id.au
|
M: hermes@gibson.dropbear.id.au
|
||||||
W: http://www.ozlabs.org/people/dgibson/dldwd
|
L: orinoco-users@lists.sourceforge.net
|
||||||
|
L: orinoco-devel@lists.sourceforge.net
|
||||||
|
W: http://www.nongnu.org/orinoco/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
PARALLEL PORT SUPPORT
|
PARALLEL PORT SUPPORT
|
||||||
@ -2113,6 +2115,13 @@ M: perex@suse.cz
|
|||||||
L: alsa-devel@alsa-project.org
|
L: alsa-devel@alsa-project.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
TPM DEVICE DRIVER
|
||||||
|
P: Kylene Hall
|
||||||
|
M: kjhall@us.ibm.com
|
||||||
|
W: http://tpmdd.sourceforge.net
|
||||||
|
L: tpmdd-devel@lists.sourceforge.net
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
UltraSPARC (sparc64):
|
UltraSPARC (sparc64):
|
||||||
P: David S. Miller
|
P: David S. Miller
|
||||||
M: davem@davemloft.net
|
M: davem@davemloft.net
|
||||||
|
12
Makefile
12
Makefile
@ -1,7 +1,7 @@
|
|||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 12
|
SUBLEVEL = 12
|
||||||
EXTRAVERSION =-rc3
|
EXTRAVERSION =-rc4
|
||||||
NAME=Woozy Numbat
|
NAME=Woozy Numbat
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
@ -332,9 +332,7 @@ KALLSYMS = scripts/kallsyms
|
|||||||
PERL = perl
|
PERL = perl
|
||||||
CHECK = sparse
|
CHECK = sparse
|
||||||
|
|
||||||
NOSTDINC_FLAGS = -nostdinc -isystem $(shell $(CC) -print-file-name=include)
|
|
||||||
CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__
|
CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__
|
||||||
CHECKFLAGS += $(NOSTDINC_FLAGS)
|
|
||||||
MODFLAGS = -DMODULE
|
MODFLAGS = -DMODULE
|
||||||
CFLAGS_MODULE = $(MODFLAGS)
|
CFLAGS_MODULE = $(MODFLAGS)
|
||||||
AFLAGS_MODULE = $(MODFLAGS)
|
AFLAGS_MODULE = $(MODFLAGS)
|
||||||
@ -531,6 +529,10 @@ endif
|
|||||||
|
|
||||||
include $(srctree)/arch/$(ARCH)/Makefile
|
include $(srctree)/arch/$(ARCH)/Makefile
|
||||||
|
|
||||||
|
# arch Makefile may override CC so keep this after arch Makefile is included
|
||||||
|
NOSTDINC_FLAGS := -nostdinc -isystem $(shell $(CC) -print-file-name=include)
|
||||||
|
CHECKFLAGS += $(NOSTDINC_FLAGS)
|
||||||
|
|
||||||
# warn about C99 declaration after statement
|
# warn about C99 declaration after statement
|
||||||
CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
|
CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
|
||||||
|
|
||||||
@ -1188,8 +1190,8 @@ cmd_TAGS = $(all-sources) | etags -
|
|||||||
quiet_cmd_tags = MAKE $@
|
quiet_cmd_tags = MAKE $@
|
||||||
define cmd_tags
|
define cmd_tags
|
||||||
rm -f $@; \
|
rm -f $@; \
|
||||||
CTAGSF=`ctags --version | grep -i exuberant >/dev/null && echo "-I __initdata,__exitdata,EXPORT_SYMBOL,EXPORT_SYMBOL_GPL"`; \
|
CTAGSF=`ctags --version | grep -i exuberant >/dev/null && echo "-I __initdata,__exitdata,EXPORT_SYMBOL,EXPORT_SYMBOL_GPL --extra=+f"`; \
|
||||||
$(all-sources) | xargs ctags $$CTAGSF -a --extra=+f
|
$(all-sources) | xargs ctags $$CTAGSF -a
|
||||||
endef
|
endef
|
||||||
|
|
||||||
TAGS: FORCE
|
TAGS: FORCE
|
||||||
|
@ -280,6 +280,10 @@ config ISA
|
|||||||
(MCA) or VESA. ISA is an older system, now being displaced by PCI;
|
(MCA) or VESA. ISA is an older system, now being displaced by PCI;
|
||||||
newer boards don't support it. If you have ISA, say Y, otherwise N.
|
newer boards don't support it. If you have ISA, say Y, otherwise N.
|
||||||
|
|
||||||
|
config ISA_DMA_API
|
||||||
|
bool
|
||||||
|
default y
|
||||||
|
|
||||||
config PCI
|
config PCI
|
||||||
bool
|
bool
|
||||||
depends on !ALPHA_JENSEN
|
depends on !ALPHA_JENSEN
|
||||||
|
@ -457,22 +457,6 @@ osf_getdomainname(char __user *name, int namelen)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage long
|
|
||||||
osf_shmat(int shmid, void __user *shmaddr, int shmflg)
|
|
||||||
{
|
|
||||||
unsigned long raddr;
|
|
||||||
long err;
|
|
||||||
|
|
||||||
err = do_shmat(shmid, shmaddr, shmflg, &raddr);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This works because all user-level addresses are
|
|
||||||
* non-negative longs!
|
|
||||||
*/
|
|
||||||
return err ? err : (long)raddr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The following stuff should move into a header file should it ever
|
* The following stuff should move into a header file should it ever
|
||||||
* be labeled "officially supported." Right now, there is just enough
|
* be labeled "officially supported." Right now, there is just enough
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
@ -335,7 +336,7 @@ do_sys_ptrace(long request, long pid, long addr, long data,
|
|||||||
/* continue and stop at next (return from) syscall */
|
/* continue and stop at next (return from) syscall */
|
||||||
case PTRACE_CONT: /* restart after signal. */
|
case PTRACE_CONT: /* restart after signal. */
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
if (request == PTRACE_SYSCALL)
|
if (request == PTRACE_SYSCALL)
|
||||||
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
@ -365,7 +366,7 @@ do_sys_ptrace(long request, long pid, long addr, long data,
|
|||||||
|
|
||||||
case PTRACE_SINGLESTEP: /* execute single instruction. */
|
case PTRACE_SINGLESTEP: /* execute single instruction. */
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
/* Mark single stepping. */
|
/* Mark single stepping. */
|
||||||
child->thread_info->bpt_nsaved = -1;
|
child->thread_info->bpt_nsaved = -1;
|
||||||
|
@ -227,7 +227,7 @@ sys_call_table:
|
|||||||
.quad sys_semop
|
.quad sys_semop
|
||||||
.quad osf_utsname
|
.quad osf_utsname
|
||||||
.quad sys_lchown
|
.quad sys_lchown
|
||||||
.quad osf_shmat
|
.quad sys_shmat
|
||||||
.quad sys_shmctl /* 210 */
|
.quad sys_shmctl /* 210 */
|
||||||
.quad sys_shmdt
|
.quad sys_shmdt
|
||||||
.quad sys_shmget
|
.quad sys_shmget
|
||||||
|
@ -85,6 +85,7 @@ choice
|
|||||||
config ARCH_CLPS7500
|
config ARCH_CLPS7500
|
||||||
bool "Cirrus-CL-PS7500FE"
|
bool "Cirrus-CL-PS7500FE"
|
||||||
select TIMER_ACORN
|
select TIMER_ACORN
|
||||||
|
select ISA
|
||||||
|
|
||||||
config ARCH_CLPS711X
|
config ARCH_CLPS711X
|
||||||
bool "CLPS711x/EP721x-based"
|
bool "CLPS711x/EP721x-based"
|
||||||
@ -96,6 +97,7 @@ config ARCH_CO285
|
|||||||
|
|
||||||
config ARCH_EBSA110
|
config ARCH_EBSA110
|
||||||
bool "EBSA-110"
|
bool "EBSA-110"
|
||||||
|
select ISA
|
||||||
help
|
help
|
||||||
This is an evaluation board for the StrongARM processor available
|
This is an evaluation board for the StrongARM processor available
|
||||||
from Digital. It has limited hardware on-board, including an onboard
|
from Digital. It has limited hardware on-board, including an onboard
|
||||||
@ -120,13 +122,16 @@ config ARCH_INTEGRATOR
|
|||||||
|
|
||||||
config ARCH_IOP3XX
|
config ARCH_IOP3XX
|
||||||
bool "IOP3xx-based"
|
bool "IOP3xx-based"
|
||||||
|
select PCI
|
||||||
|
|
||||||
config ARCH_IXP4XX
|
config ARCH_IXP4XX
|
||||||
bool "IXP4xx-based"
|
bool "IXP4xx-based"
|
||||||
select DMABOUNCE
|
select DMABOUNCE
|
||||||
|
select PCI
|
||||||
|
|
||||||
config ARCH_IXP2000
|
config ARCH_IXP2000
|
||||||
bool "IXP2400/2800-based"
|
bool "IXP2400/2800-based"
|
||||||
|
select PCI
|
||||||
|
|
||||||
config ARCH_L7200
|
config ARCH_L7200
|
||||||
bool "LinkUp-L7200"
|
bool "LinkUp-L7200"
|
||||||
@ -155,6 +160,8 @@ config ARCH_RPC
|
|||||||
|
|
||||||
config ARCH_SA1100
|
config ARCH_SA1100
|
||||||
bool "SA1100-based"
|
bool "SA1100-based"
|
||||||
|
select ISA
|
||||||
|
select DISCONTIGMEM
|
||||||
|
|
||||||
config ARCH_S3C2410
|
config ARCH_S3C2410
|
||||||
bool "Samsung S3C2410"
|
bool "Samsung S3C2410"
|
||||||
@ -165,6 +172,9 @@ config ARCH_S3C2410
|
|||||||
|
|
||||||
config ARCH_SHARK
|
config ARCH_SHARK
|
||||||
bool "Shark"
|
bool "Shark"
|
||||||
|
select ISA
|
||||||
|
select ISA_DMA
|
||||||
|
select PCI
|
||||||
|
|
||||||
config ARCH_LH7A40X
|
config ARCH_LH7A40X
|
||||||
bool "Sharp LH7A40X"
|
bool "Sharp LH7A40X"
|
||||||
@ -252,8 +262,6 @@ config ARM_AMBA
|
|||||||
|
|
||||||
config ISA
|
config ISA
|
||||||
bool
|
bool
|
||||||
depends on FOOTBRIDGE_HOST || ARCH_SHARK || ARCH_CLPS7500 || ARCH_EBSA110 || ARCH_CDB89712 || ARCH_EDB7211 || ARCH_SA1100 || ARCH_MX1ADS
|
|
||||||
default y
|
|
||||||
help
|
help
|
||||||
Find out whether you have ISA slots on your motherboard. ISA is the
|
Find out whether you have ISA slots on your motherboard. ISA is the
|
||||||
name of a bus system, i.e. the way the CPU talks to the other stuff
|
name of a bus system, i.e. the way the CPU talks to the other stuff
|
||||||
@ -263,12 +271,13 @@ config ISA
|
|||||||
|
|
||||||
config ISA_DMA
|
config ISA_DMA
|
||||||
bool
|
bool
|
||||||
depends on FOOTBRIDGE_HOST || ARCH_SHARK
|
|
||||||
|
config ISA_DMA_API
|
||||||
|
bool
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config PCI
|
config PCI
|
||||||
bool "PCI support" if ARCH_INTEGRATOR_AP
|
bool "PCI support" if ARCH_INTEGRATOR_AP
|
||||||
default y if ARCH_SHARK || FOOTBRIDGE_HOST || ARCH_IOP3XX || ARCH_IXP4XX || ARCH_IXP2000
|
|
||||||
help
|
help
|
||||||
Find out whether you have a PCI motherboard. PCI is the name of a
|
Find out whether you have a PCI motherboard. PCI is the name of a
|
||||||
bus system, i.e. the way the CPU talks to the other stuff inside
|
bus system, i.e. the way the CPU talks to the other stuff inside
|
||||||
@ -296,7 +305,7 @@ menu "Kernel Features"
|
|||||||
|
|
||||||
config SMP
|
config SMP
|
||||||
bool "Symmetric Multi-Processing (EXPERIMENTAL)"
|
bool "Symmetric Multi-Processing (EXPERIMENTAL)"
|
||||||
depends on EXPERIMENTAL && n
|
depends on EXPERIMENTAL #&& n
|
||||||
help
|
help
|
||||||
This enables support for systems with more than one CPU. If you have
|
This enables support for systems with more than one CPU. If you have
|
||||||
a system with only one CPU, like most personal computers, say N. If
|
a system with only one CPU, like most personal computers, say N. If
|
||||||
@ -336,8 +345,7 @@ config PREEMPT
|
|||||||
|
|
||||||
config DISCONTIGMEM
|
config DISCONTIGMEM
|
||||||
bool
|
bool
|
||||||
depends on ARCH_EDB7211 || ARCH_SA1100 || (ARCH_LH7A40X && !LH7A40X_CONTIGMEM)
|
default (ARCH_LH7A40X && !LH7A40X_CONTIGMEM)
|
||||||
default y
|
|
||||||
help
|
help
|
||||||
Say Y to support efficient handling of discontiguous physical memory,
|
Say Y to support efficient handling of discontiguous physical memory,
|
||||||
for architectures which are either NUMA (Non-Uniform Memory Access)
|
for architectures which are either NUMA (Non-Uniform Memory Access)
|
||||||
|
@ -18,48 +18,30 @@
|
|||||||
* Please select one of the following when turning on debugging.
|
* Please select one of the following when turning on debugging.
|
||||||
*/
|
*/
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
#if defined(CONFIG_DEBUG_DC21285_PORT)
|
|
||||||
.macro loadsp, rb
|
#include <asm/arch/debug-macro.S>
|
||||||
mov \rb, #0x42000000
|
|
||||||
.endm
|
#if defined(CONFIG_DEBUG_ICEDCC)
|
||||||
.macro writeb, rb
|
|
||||||
str \rb, [r3, #0x160]
|
|
||||||
.endm
|
|
||||||
#elif defined(CONFIG_DEBUG_ICEDCC)
|
|
||||||
.macro loadsp, rb
|
.macro loadsp, rb
|
||||||
.endm
|
.endm
|
||||||
.macro writeb, rb
|
.macro writeb, ch, rb
|
||||||
mcr p14, 0, \rb, c0, c1, 0
|
mcr p14, 0, \ch, c0, c1, 0
|
||||||
.endm
|
.endm
|
||||||
#elif defined(CONFIG_FOOTBRIDGE)
|
#else
|
||||||
|
.macro writeb, ch, rb
|
||||||
|
senduart \ch, \rb
|
||||||
|
.endm
|
||||||
|
|
||||||
|
#if defined(CONFIG_FOOTBRIDGE) || \
|
||||||
|
defined(CONFIG_ARCH_RPC) || \
|
||||||
|
defined(CONFIG_ARCH_INTEGRATOR) || \
|
||||||
|
defined(CONFIG_ARCH_PXA) || \
|
||||||
|
defined(CONFIG_ARCH_IXP4XX) || \
|
||||||
|
defined(CONFIG_ARCH_IXP2000) || \
|
||||||
|
defined(CONFIG_ARCH_LH7A40X) || \
|
||||||
|
defined(CONFIG_ARCH_OMAP)
|
||||||
.macro loadsp, rb
|
.macro loadsp, rb
|
||||||
mov \rb, #0x7c000000
|
addruart \rb
|
||||||
.endm
|
|
||||||
.macro writeb, rb
|
|
||||||
strb \rb, [r3, #0x3f8]
|
|
||||||
.endm
|
|
||||||
#elif defined(CONFIG_ARCH_RPC)
|
|
||||||
.macro loadsp, rb
|
|
||||||
mov \rb, #0x03000000
|
|
||||||
orr \rb, \rb, #0x00010000
|
|
||||||
.endm
|
|
||||||
.macro writeb, rb
|
|
||||||
strb \rb, [r3, #0x3f8 << 2]
|
|
||||||
.endm
|
|
||||||
#elif defined(CONFIG_ARCH_INTEGRATOR)
|
|
||||||
.macro loadsp, rb
|
|
||||||
mov \rb, #0x16000000
|
|
||||||
.endm
|
|
||||||
.macro writeb, rb
|
|
||||||
strb \rb, [r3, #0]
|
|
||||||
.endm
|
|
||||||
#elif defined(CONFIG_ARCH_PXA) /* Xscale-type */
|
|
||||||
.macro loadsp, rb
|
|
||||||
mov \rb, #0x40000000
|
|
||||||
orr \rb, \rb, #0x00100000
|
|
||||||
.endm
|
|
||||||
.macro writeb, rb
|
|
||||||
strb \rb, [r3, #0]
|
|
||||||
.endm
|
.endm
|
||||||
#elif defined(CONFIG_ARCH_SA1100)
|
#elif defined(CONFIG_ARCH_SA1100)
|
||||||
.macro loadsp, rb
|
.macro loadsp, rb
|
||||||
@ -70,64 +52,21 @@
|
|||||||
add \rb, \rb, #0x00010000 @ Ser1
|
add \rb, \rb, #0x00010000 @ Ser1
|
||||||
# endif
|
# endif
|
||||||
.endm
|
.endm
|
||||||
.macro writeb, rb
|
|
||||||
str \rb, [r3, #0x14] @ UTDR
|
|
||||||
.endm
|
|
||||||
#elif defined(CONFIG_ARCH_IXP4XX)
|
|
||||||
.macro loadsp, rb
|
|
||||||
mov \rb, #0xc8000000
|
|
||||||
.endm
|
|
||||||
.macro writeb, rb
|
|
||||||
str \rb, [r3, #0]
|
|
||||||
#elif defined(CONFIG_ARCH_IXP2000)
|
|
||||||
.macro loadsp, rb
|
|
||||||
mov \rb, #0xc0000000
|
|
||||||
orr \rb, \rb, #0x00030000
|
|
||||||
.endm
|
|
||||||
.macro writeb, rb
|
|
||||||
str \rb, [r3, #0]
|
|
||||||
.endm
|
|
||||||
#elif defined(CONFIG_ARCH_LH7A40X)
|
|
||||||
.macro loadsp, rb
|
|
||||||
ldr \rb, =0x80000700 @ UART2 UARTBASE
|
|
||||||
.endm
|
|
||||||
.macro writeb, rb
|
|
||||||
strb \rb, [r3, #0]
|
|
||||||
.endm
|
|
||||||
#elif defined(CONFIG_ARCH_OMAP)
|
|
||||||
.macro loadsp, rb
|
|
||||||
mov \rb, #0xff000000 @ physical base address
|
|
||||||
add \rb, \rb, #0x00fb0000
|
|
||||||
#if defined(CONFIG_OMAP_LL_DEBUG_UART2) || defined(CONFIG_OMAP_LL_DEBUG_UART3)
|
|
||||||
add \rb, \rb, #0x00000800
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_OMAP_LL_DEBUG_UART3
|
|
||||||
add \rb, \rb, #0x00009000
|
|
||||||
#endif
|
|
||||||
.endm
|
|
||||||
.macro writeb, rb
|
|
||||||
strb \rb, [r3]
|
|
||||||
.endm
|
|
||||||
#elif defined(CONFIG_ARCH_IOP331)
|
#elif defined(CONFIG_ARCH_IOP331)
|
||||||
.macro loadsp, rb
|
.macro loadsp, rb
|
||||||
mov \rb, #0xff000000
|
mov \rb, #0xff000000
|
||||||
orr \rb, \rb, #0x00ff0000
|
orr \rb, \rb, #0x00ff0000
|
||||||
orr \rb, \rb, #0x0000f700 @ location of the UART
|
orr \rb, \rb, #0x0000f700 @ location of the UART
|
||||||
.endm
|
.endm
|
||||||
.macro writeb, rb
|
|
||||||
str \rb, [r3, #0]
|
|
||||||
.endm
|
|
||||||
#elif defined(CONFIG_ARCH_S3C2410)
|
#elif defined(CONFIG_ARCH_S3C2410)
|
||||||
.macro loadsp, rb
|
.macro loadsp, rb
|
||||||
mov \rb, #0x50000000
|
mov \rb, #0x50000000
|
||||||
add \rb, \rb, #0x4000 * CONFIG_S3C2410_LOWLEVEL_UART_PORT
|
add \rb, \rb, #0x4000 * CONFIG_S3C2410_LOWLEVEL_UART_PORT
|
||||||
.endm
|
.endm
|
||||||
.macro writeb, rb
|
|
||||||
strb \rb, [r3, #0x20]
|
|
||||||
.endm
|
|
||||||
#else
|
#else
|
||||||
#error no serial architecture defined
|
#error no serial architecture defined
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
.macro kputc,val
|
.macro kputc,val
|
||||||
@ -734,7 +673,7 @@ puts: loadsp r3
|
|||||||
1: ldrb r2, [r0], #1
|
1: ldrb r2, [r0], #1
|
||||||
teq r2, #0
|
teq r2, #0
|
||||||
moveq pc, lr
|
moveq pc, lr
|
||||||
2: writeb r2
|
2: writeb r2, r3
|
||||||
mov r1, #0x00020000
|
mov r1, #0x00020000
|
||||||
3: subs r1, r1, #1
|
3: subs r1, r1, #1
|
||||||
bne 3b
|
bne 3b
|
||||||
|
@ -141,10 +141,10 @@ void rtc_next_alarm_time(struct rtc_time *next, struct rtc_time *now, struct rtc
|
|||||||
next->tm_sec = alrm->tm_sec;
|
next->tm_sec = alrm->tm_sec;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void rtc_read_time(struct rtc_ops *ops, struct rtc_time *tm)
|
static inline int rtc_read_time(struct rtc_ops *ops, struct rtc_time *tm)
|
||||||
{
|
{
|
||||||
memset(tm, 0, sizeof(struct rtc_time));
|
memset(tm, 0, sizeof(struct rtc_time));
|
||||||
ops->read_time(tm);
|
return ops->read_time(tm);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int rtc_set_time(struct rtc_ops *ops, struct rtc_time *tm)
|
static inline int rtc_set_time(struct rtc_ops *ops, struct rtc_time *tm)
|
||||||
@ -163,8 +163,7 @@ static inline int rtc_read_alarm(struct rtc_ops *ops, struct rtc_wkalrm *alrm)
|
|||||||
int ret = -EINVAL;
|
int ret = -EINVAL;
|
||||||
if (ops->read_alarm) {
|
if (ops->read_alarm) {
|
||||||
memset(alrm, 0, sizeof(struct rtc_wkalrm));
|
memset(alrm, 0, sizeof(struct rtc_wkalrm));
|
||||||
ops->read_alarm(alrm);
|
ret = ops->read_alarm(alrm);
|
||||||
ret = 0;
|
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -283,7 +282,9 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case RTC_RD_TIME:
|
case RTC_RD_TIME:
|
||||||
rtc_read_time(ops, &tm);
|
ret = rtc_read_time(ops, &tm);
|
||||||
|
if (ret)
|
||||||
|
break;
|
||||||
ret = copy_to_user(uarg, &tm, sizeof(tm));
|
ret = copy_to_user(uarg, &tm, sizeof(tm));
|
||||||
if (ret)
|
if (ret)
|
||||||
ret = -EFAULT;
|
ret = -EFAULT;
|
||||||
@ -424,15 +425,15 @@ static int rtc_read_proc(char *page, char **start, off_t off, int count, int *eo
|
|||||||
struct rtc_time tm;
|
struct rtc_time tm;
|
||||||
char *p = page;
|
char *p = page;
|
||||||
|
|
||||||
rtc_read_time(ops, &tm);
|
if (rtc_read_time(ops, &tm) == 0) {
|
||||||
|
p += sprintf(p,
|
||||||
p += sprintf(p,
|
"rtc_time\t: %02d:%02d:%02d\n"
|
||||||
"rtc_time\t: %02d:%02d:%02d\n"
|
"rtc_date\t: %04d-%02d-%02d\n"
|
||||||
"rtc_date\t: %04d-%02d-%02d\n"
|
"rtc_epoch\t: %04lu\n",
|
||||||
"rtc_epoch\t: %04lu\n",
|
tm.tm_hour, tm.tm_min, tm.tm_sec,
|
||||||
tm.tm_hour, tm.tm_min, tm.tm_sec,
|
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
|
||||||
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
|
rtc_epoch);
|
||||||
rtc_epoch);
|
}
|
||||||
|
|
||||||
if (rtc_read_alarm(ops, &alrm) == 0) {
|
if (rtc_read_alarm(ops, &alrm) == 0) {
|
||||||
p += sprintf(p, "alrm_time\t: ");
|
p += sprintf(p, "alrm_time\t: ");
|
||||||
|
@ -133,7 +133,7 @@ CONFIG_ALIGNMENT_TRAP=y
|
|||||||
#
|
#
|
||||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||||
CONFIG_CMDLINE="console=ttyS0,9600 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmware"
|
CONFIG_CMDLINE="console=ttyS0,9600 root=/dev/nfs ip=bootp mem=64M@0x0"
|
||||||
# CONFIG_XIP_KERNEL is not set
|
# CONFIG_XIP_KERNEL is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -31,8 +31,3 @@ head-y := head.o
|
|||||||
obj-$(CONFIG_DEBUG_LL) += debug.o
|
obj-$(CONFIG_DEBUG_LL) += debug.o
|
||||||
|
|
||||||
extra-y := $(head-y) init_task.o vmlinux.lds
|
extra-y := $(head-y) init_task.o vmlinux.lds
|
||||||
|
|
||||||
# Spell out some dependencies that aren't automatically figured out
|
|
||||||
$(obj)/entry-armv.o: $(obj)/entry-header.S include/asm-arm/constants.h
|
|
||||||
$(obj)/entry-common.o: $(obj)/entry-header.S include/asm-arm/constants.h \
|
|
||||||
$(obj)/calls.S
|
|
||||||
|
@ -64,6 +64,26 @@ int main(void)
|
|||||||
DEFINE(TI_VFPSTATE, offsetof(struct thread_info, vfpstate));
|
DEFINE(TI_VFPSTATE, offsetof(struct thread_info, vfpstate));
|
||||||
DEFINE(TI_IWMMXT_STATE, (offsetof(struct thread_info, fpstate)+4)&~7);
|
DEFINE(TI_IWMMXT_STATE, (offsetof(struct thread_info, fpstate)+4)&~7);
|
||||||
BLANK();
|
BLANK();
|
||||||
|
DEFINE(S_R0, offsetof(struct pt_regs, ARM_r0));
|
||||||
|
DEFINE(S_R1, offsetof(struct pt_regs, ARM_r1));
|
||||||
|
DEFINE(S_R2, offsetof(struct pt_regs, ARM_r2));
|
||||||
|
DEFINE(S_R3, offsetof(struct pt_regs, ARM_r3));
|
||||||
|
DEFINE(S_R4, offsetof(struct pt_regs, ARM_r4));
|
||||||
|
DEFINE(S_R5, offsetof(struct pt_regs, ARM_r5));
|
||||||
|
DEFINE(S_R6, offsetof(struct pt_regs, ARM_r6));
|
||||||
|
DEFINE(S_R7, offsetof(struct pt_regs, ARM_r7));
|
||||||
|
DEFINE(S_R8, offsetof(struct pt_regs, ARM_r8));
|
||||||
|
DEFINE(S_R9, offsetof(struct pt_regs, ARM_r9));
|
||||||
|
DEFINE(S_R10, offsetof(struct pt_regs, ARM_r10));
|
||||||
|
DEFINE(S_FP, offsetof(struct pt_regs, ARM_fp));
|
||||||
|
DEFINE(S_IP, offsetof(struct pt_regs, ARM_ip));
|
||||||
|
DEFINE(S_SP, offsetof(struct pt_regs, ARM_sp));
|
||||||
|
DEFINE(S_LR, offsetof(struct pt_regs, ARM_lr));
|
||||||
|
DEFINE(S_PC, offsetof(struct pt_regs, ARM_pc));
|
||||||
|
DEFINE(S_PSR, offsetof(struct pt_regs, ARM_cpsr));
|
||||||
|
DEFINE(S_OLD_R0, offsetof(struct pt_regs, ARM_ORIG_r0));
|
||||||
|
DEFINE(S_FRAME_SIZE, sizeof(struct pt_regs));
|
||||||
|
BLANK();
|
||||||
#if __LINUX_ARM_ARCH__ >= 6
|
#if __LINUX_ARM_ARCH__ >= 6
|
||||||
DEFINE(MM_CONTEXT_ID, offsetof(struct mm_struct, context.id));
|
DEFINE(MM_CONTEXT_ID, offsetof(struct mm_struct, context.id));
|
||||||
BLANK();
|
BLANK();
|
||||||
|
@ -14,12 +14,12 @@
|
|||||||
* it to save wrong values... Be aware!
|
* it to save wrong values... Be aware!
|
||||||
*/
|
*/
|
||||||
#include <linux/config.h>
|
#include <linux/config.h>
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
#include <asm/thread_info.h>
|
|
||||||
#include <asm/glue.h>
|
#include <asm/glue.h>
|
||||||
#include <asm/ptrace.h>
|
|
||||||
#include <asm/vfpmacros.h>
|
#include <asm/vfpmacros.h>
|
||||||
|
#include <asm/hardware.h> /* should be moved into entry-macro.S */
|
||||||
|
#include <asm/arch/irqs.h> /* should be moved into entry-macro.S */
|
||||||
|
#include <asm/arch/entry-macro.S>
|
||||||
|
|
||||||
#include "entry-header.S"
|
#include "entry-header.S"
|
||||||
|
|
||||||
@ -118,7 +118,7 @@ __dabt_svc:
|
|||||||
@
|
@
|
||||||
@ IRQs off again before pulling preserved data off the stack
|
@ IRQs off again before pulling preserved data off the stack
|
||||||
@
|
@
|
||||||
disable_irq r0
|
disable_irq
|
||||||
|
|
||||||
@
|
@
|
||||||
@ restore SPSR and restart the instruction
|
@ restore SPSR and restart the instruction
|
||||||
@ -198,7 +198,7 @@ __und_svc:
|
|||||||
@
|
@
|
||||||
@ IRQs off again before pulling preserved data off the stack
|
@ IRQs off again before pulling preserved data off the stack
|
||||||
@
|
@
|
||||||
1: disable_irq r0
|
1: disable_irq
|
||||||
|
|
||||||
@
|
@
|
||||||
@ restore SPSR and restart the instruction
|
@ restore SPSR and restart the instruction
|
||||||
@ -232,7 +232,7 @@ __pabt_svc:
|
|||||||
@
|
@
|
||||||
@ IRQs off again before pulling preserved data off the stack
|
@ IRQs off again before pulling preserved data off the stack
|
||||||
@
|
@
|
||||||
disable_irq r0
|
disable_irq
|
||||||
|
|
||||||
@
|
@
|
||||||
@ restore SPSR and restart the instruction
|
@ restore SPSR and restart the instruction
|
||||||
@ -269,6 +269,12 @@ __pabt_svc:
|
|||||||
add r5, sp, #S_PC
|
add r5, sp, #S_PC
|
||||||
ldmia r7, {r2 - r4} @ Get USR pc, cpsr
|
ldmia r7, {r2 - r4} @ Get USR pc, cpsr
|
||||||
|
|
||||||
|
#if __LINUX_ARM_ARCH__ < 6
|
||||||
|
@ make sure our user space atomic helper is aborted
|
||||||
|
cmp r2, #VIRT_OFFSET
|
||||||
|
bichs r3, r3, #PSR_Z_BIT
|
||||||
|
#endif
|
||||||
|
|
||||||
@
|
@
|
||||||
@ We are now ready to fill in the remaining blanks on the stack:
|
@ We are now ready to fill in the remaining blanks on the stack:
|
||||||
@
|
@
|
||||||
@ -316,7 +322,7 @@ __dabt_usr:
|
|||||||
@
|
@
|
||||||
@ IRQs on, then call the main handler
|
@ IRQs on, then call the main handler
|
||||||
@
|
@
|
||||||
enable_irq r2
|
enable_irq
|
||||||
mov r2, sp
|
mov r2, sp
|
||||||
adr lr, ret_from_exception
|
adr lr, ret_from_exception
|
||||||
b do_DataAbort
|
b do_DataAbort
|
||||||
@ -418,7 +424,7 @@ call_fpe:
|
|||||||
movcss r7, r5, lsr #(TIF_USING_IWMMXT + 1)
|
movcss r7, r5, lsr #(TIF_USING_IWMMXT + 1)
|
||||||
bcs iwmmxt_task_enable
|
bcs iwmmxt_task_enable
|
||||||
#endif
|
#endif
|
||||||
enable_irq r7
|
enable_irq
|
||||||
add pc, pc, r8, lsr #6
|
add pc, pc, r8, lsr #6
|
||||||
mov r0, r0
|
mov r0, r0
|
||||||
|
|
||||||
@ -472,7 +478,7 @@ fpundefinstr:
|
|||||||
__pabt_usr:
|
__pabt_usr:
|
||||||
usr_entry abt
|
usr_entry abt
|
||||||
|
|
||||||
enable_irq r0 @ Enable interrupts
|
enable_irq @ Enable interrupts
|
||||||
mov r0, r2 @ address (pc)
|
mov r0, r2 @ address (pc)
|
||||||
mov r1, sp @ regs
|
mov r1, sp @ regs
|
||||||
bl do_PrefetchAbort @ call abort handler
|
bl do_PrefetchAbort @ call abort handler
|
||||||
@ -499,8 +505,12 @@ ENTRY(__switch_to)
|
|||||||
mra r4, r5, acc0
|
mra r4, r5, acc0
|
||||||
stmia ip, {r4, r5}
|
stmia ip, {r4, r5}
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(CONFIG_HAS_TLS_REG)
|
||||||
|
mcr p15, 0, r3, c13, c0, 3 @ set TLS register
|
||||||
|
#elif !defined(CONFIG_TLS_REG_EMUL)
|
||||||
mov r4, #0xffff0fff
|
mov r4, #0xffff0fff
|
||||||
str r3, [r4, #-3] @ Set TLS ptr
|
str r3, [r4, #-15] @ TLS val at 0xffff0ff0
|
||||||
|
#endif
|
||||||
mcr p15, 0, r6, c3, c0, 0 @ Set domain register
|
mcr p15, 0, r6, c3, c0, 0 @ Set domain register
|
||||||
#ifdef CONFIG_VFP
|
#ifdef CONFIG_VFP
|
||||||
@ Always disable VFP so we can lazily save/restore the old
|
@ Always disable VFP so we can lazily save/restore the old
|
||||||
@ -519,11 +529,209 @@ ENTRY(__switch_to)
|
|||||||
ldmib r2, {r4 - sl, fp, sp, pc} @ Load all regs saved previously
|
ldmib r2, {r4 - sl, fp, sp, pc} @ Load all regs saved previously
|
||||||
|
|
||||||
__INIT
|
__INIT
|
||||||
|
|
||||||
|
/*
|
||||||
|
* User helpers.
|
||||||
|
*
|
||||||
|
* These are segment of kernel provided user code reachable from user space
|
||||||
|
* at a fixed address in kernel memory. This is used to provide user space
|
||||||
|
* with some operations which require kernel help because of unimplemented
|
||||||
|
* native feature and/or instructions in many ARM CPUs. The idea is for
|
||||||
|
* this code to be executed directly in user mode for best efficiency but
|
||||||
|
* which is too intimate with the kernel counter part to be left to user
|
||||||
|
* libraries. In fact this code might even differ from one CPU to another
|
||||||
|
* depending on the available instruction set and restrictions like on
|
||||||
|
* SMP systems. In other words, the kernel reserves the right to change
|
||||||
|
* this code as needed without warning. Only the entry points and their
|
||||||
|
* results are guaranteed to be stable.
|
||||||
|
*
|
||||||
|
* Each segment is 32-byte aligned and will be moved to the top of the high
|
||||||
|
* vector page. New segments (if ever needed) must be added in front of
|
||||||
|
* existing ones. This mechanism should be used only for things that are
|
||||||
|
* really small and justified, and not be abused freely.
|
||||||
|
*
|
||||||
|
* User space is expected to implement those things inline when optimizing
|
||||||
|
* for a processor that has the necessary native support, but only if such
|
||||||
|
* resulting binaries are already to be incompatible with earlier ARM
|
||||||
|
* processors due to the use of unsupported instructions other than what
|
||||||
|
* is provided here. In other words don't make binaries unable to run on
|
||||||
|
* earlier processors just for the sake of not using these kernel helpers
|
||||||
|
* if your compiled code is not going to use the new instructions for other
|
||||||
|
* purpose.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.align 5
|
||||||
|
.globl __kuser_helper_start
|
||||||
|
__kuser_helper_start:
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reference prototype:
|
||||||
|
*
|
||||||
|
* int __kernel_cmpxchg(int oldval, int newval, int *ptr)
|
||||||
|
*
|
||||||
|
* Input:
|
||||||
|
*
|
||||||
|
* r0 = oldval
|
||||||
|
* r1 = newval
|
||||||
|
* r2 = ptr
|
||||||
|
* lr = return address
|
||||||
|
*
|
||||||
|
* Output:
|
||||||
|
*
|
||||||
|
* r0 = returned value (zero or non-zero)
|
||||||
|
* C flag = set if r0 == 0, clear if r0 != 0
|
||||||
|
*
|
||||||
|
* Clobbered:
|
||||||
|
*
|
||||||
|
* r3, ip, flags
|
||||||
|
*
|
||||||
|
* Definition and user space usage example:
|
||||||
|
*
|
||||||
|
* typedef int (__kernel_cmpxchg_t)(int oldval, int newval, int *ptr);
|
||||||
|
* #define __kernel_cmpxchg (*(__kernel_cmpxchg_t *)0xffff0fc0)
|
||||||
|
*
|
||||||
|
* Atomically store newval in *ptr if *ptr is equal to oldval for user space.
|
||||||
|
* Return zero if *ptr was changed or non-zero if no exchange happened.
|
||||||
|
* The C flag is also set if *ptr was changed to allow for assembly
|
||||||
|
* optimization in the calling code.
|
||||||
|
*
|
||||||
|
* For example, a user space atomic_add implementation could look like this:
|
||||||
|
*
|
||||||
|
* #define atomic_add(ptr, val) \
|
||||||
|
* ({ register unsigned int *__ptr asm("r2") = (ptr); \
|
||||||
|
* register unsigned int __result asm("r1"); \
|
||||||
|
* asm volatile ( \
|
||||||
|
* "1: @ atomic_add\n\t" \
|
||||||
|
* "ldr r0, [r2]\n\t" \
|
||||||
|
* "mov r3, #0xffff0fff\n\t" \
|
||||||
|
* "add lr, pc, #4\n\t" \
|
||||||
|
* "add r1, r0, %2\n\t" \
|
||||||
|
* "add pc, r3, #(0xffff0fc0 - 0xffff0fff)\n\t" \
|
||||||
|
* "bcc 1b" \
|
||||||
|
* : "=&r" (__result) \
|
||||||
|
* : "r" (__ptr), "rIL" (val) \
|
||||||
|
* : "r0","r3","ip","lr","cc","memory" ); \
|
||||||
|
* __result; })
|
||||||
|
*/
|
||||||
|
|
||||||
|
__kuser_cmpxchg: @ 0xffff0fc0
|
||||||
|
|
||||||
|
#if __LINUX_ARM_ARCH__ < 6
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP /* sanity check */
|
||||||
|
#error "CONFIG_SMP on a machine supporting pre-ARMv6 processors?"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Theory of operation:
|
||||||
|
*
|
||||||
|
* We set the Z flag before loading oldval. If ever an exception
|
||||||
|
* occurs we can not be sure the loaded value will still be the same
|
||||||
|
* when the exception returns, therefore the user exception handler
|
||||||
|
* will clear the Z flag whenever the interrupted user code was
|
||||||
|
* actually from the kernel address space (see the usr_entry macro).
|
||||||
|
*
|
||||||
|
* The post-increment on the str is used to prevent a race with an
|
||||||
|
* exception happening just after the str instruction which would
|
||||||
|
* clear the Z flag although the exchange was done.
|
||||||
|
*/
|
||||||
|
teq ip, ip @ set Z flag
|
||||||
|
ldr ip, [r2] @ load current val
|
||||||
|
add r3, r2, #1 @ prepare store ptr
|
||||||
|
teqeq ip, r0 @ compare with oldval if still allowed
|
||||||
|
streq r1, [r3, #-1]! @ store newval if still allowed
|
||||||
|
subs r0, r2, r3 @ if r2 == r3 the str occured
|
||||||
|
mov pc, lr
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
ldrex r3, [r2]
|
||||||
|
subs r3, r3, r0
|
||||||
|
strexeq r3, r1, [r2]
|
||||||
|
rsbs r0, r3, #0
|
||||||
|
mov pc, lr
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
.align 5
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reference prototype:
|
||||||
|
*
|
||||||
|
* int __kernel_get_tls(void)
|
||||||
|
*
|
||||||
|
* Input:
|
||||||
|
*
|
||||||
|
* lr = return address
|
||||||
|
*
|
||||||
|
* Output:
|
||||||
|
*
|
||||||
|
* r0 = TLS value
|
||||||
|
*
|
||||||
|
* Clobbered:
|
||||||
|
*
|
||||||
|
* the Z flag might be lost
|
||||||
|
*
|
||||||
|
* Definition and user space usage example:
|
||||||
|
*
|
||||||
|
* typedef int (__kernel_get_tls_t)(void);
|
||||||
|
* #define __kernel_get_tls (*(__kernel_get_tls_t *)0xffff0fe0)
|
||||||
|
*
|
||||||
|
* Get the TLS value as previously set via the __ARM_NR_set_tls syscall.
|
||||||
|
*
|
||||||
|
* This could be used as follows:
|
||||||
|
*
|
||||||
|
* #define __kernel_get_tls() \
|
||||||
|
* ({ register unsigned int __val asm("r0"); \
|
||||||
|
* asm( "mov r0, #0xffff0fff; mov lr, pc; sub pc, r0, #31" \
|
||||||
|
* : "=r" (__val) : : "lr","cc" ); \
|
||||||
|
* __val; })
|
||||||
|
*/
|
||||||
|
|
||||||
|
__kuser_get_tls: @ 0xffff0fe0
|
||||||
|
|
||||||
|
#if !defined(CONFIG_HAS_TLS_REG) && !defined(CONFIG_TLS_REG_EMUL)
|
||||||
|
|
||||||
|
ldr r0, [pc, #(16 - 8)] @ TLS stored at 0xffff0ff0
|
||||||
|
mov pc, lr
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
mrc p15, 0, r0, c13, c0, 3 @ read TLS register
|
||||||
|
mov pc, lr
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
.rep 5
|
||||||
|
.word 0 @ pad up to __kuser_helper_version
|
||||||
|
.endr
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reference declaration:
|
||||||
|
*
|
||||||
|
* extern unsigned int __kernel_helper_version;
|
||||||
|
*
|
||||||
|
* Definition and user space usage example:
|
||||||
|
*
|
||||||
|
* #define __kernel_helper_version (*(unsigned int *)0xffff0ffc)
|
||||||
|
*
|
||||||
|
* User space may read this to determine the curent number of helpers
|
||||||
|
* available.
|
||||||
|
*/
|
||||||
|
|
||||||
|
__kuser_helper_version: @ 0xffff0ffc
|
||||||
|
.word ((__kuser_helper_end - __kuser_helper_start) >> 5)
|
||||||
|
|
||||||
|
.globl __kuser_helper_end
|
||||||
|
__kuser_helper_end:
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Vector stubs.
|
* Vector stubs.
|
||||||
*
|
*
|
||||||
* This code is copied to 0x200 or 0xffff0200 so we can use branches in the
|
* This code is copied to 0xffff0200 so we can use branches in the
|
||||||
* vectors, rather than ldr's.
|
* vectors, rather than ldr's. Note that this code must not
|
||||||
|
* exceed 0x300 bytes.
|
||||||
*
|
*
|
||||||
* Common stub entry macro:
|
* Common stub entry macro:
|
||||||
* Enter in IRQ mode, spsr = SVC/USR CPSR, lr = SVC/USR PC
|
* Enter in IRQ mode, spsr = SVC/USR CPSR, lr = SVC/USR PC
|
||||||
@ -544,7 +752,7 @@ vector_\name:
|
|||||||
@
|
@
|
||||||
mrs r13, cpsr
|
mrs r13, cpsr
|
||||||
bic r13, r13, #MODE_MASK
|
bic r13, r13, #MODE_MASK
|
||||||
orr r13, r13, #MODE_SVC
|
orr r13, r13, #SVC_MODE
|
||||||
msr spsr_cxsf, r13 @ switch to SVC_32 mode
|
msr spsr_cxsf, r13 @ switch to SVC_32 mode
|
||||||
|
|
||||||
and lr, lr, #15
|
and lr, lr, #15
|
||||||
@ -552,6 +760,7 @@ vector_\name:
|
|||||||
movs pc, lr @ Changes mode and branches
|
movs pc, lr @ Changes mode and branches
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
.globl __stubs_start
|
||||||
__stubs_start:
|
__stubs_start:
|
||||||
/*
|
/*
|
||||||
* Interrupt dispatcher
|
* Interrupt dispatcher
|
||||||
@ -686,37 +895,24 @@ vector_addrexcptn:
|
|||||||
.LCsabt:
|
.LCsabt:
|
||||||
.word __temp_abt
|
.word __temp_abt
|
||||||
|
|
||||||
|
.globl __stubs_end
|
||||||
__stubs_end:
|
__stubs_end:
|
||||||
|
|
||||||
.equ __real_stubs_start, .LCvectors + 0x200
|
.equ stubs_offset, __vectors_start + 0x200 - __stubs_start
|
||||||
|
|
||||||
.LCvectors:
|
.globl __vectors_start
|
||||||
|
__vectors_start:
|
||||||
swi SYS_ERROR0
|
swi SYS_ERROR0
|
||||||
b __real_stubs_start + (vector_und - __stubs_start)
|
b vector_und + stubs_offset
|
||||||
ldr pc, __real_stubs_start + (.LCvswi - __stubs_start)
|
ldr pc, .LCvswi + stubs_offset
|
||||||
b __real_stubs_start + (vector_pabt - __stubs_start)
|
b vector_pabt + stubs_offset
|
||||||
b __real_stubs_start + (vector_dabt - __stubs_start)
|
b vector_dabt + stubs_offset
|
||||||
b __real_stubs_start + (vector_addrexcptn - __stubs_start)
|
b vector_addrexcptn + stubs_offset
|
||||||
b __real_stubs_start + (vector_irq - __stubs_start)
|
b vector_irq + stubs_offset
|
||||||
b __real_stubs_start + (vector_fiq - __stubs_start)
|
b vector_fiq + stubs_offset
|
||||||
|
|
||||||
ENTRY(__trap_init)
|
.globl __vectors_end
|
||||||
stmfd sp!, {r4 - r6, lr}
|
__vectors_end:
|
||||||
|
|
||||||
mov r0, #0xff000000
|
|
||||||
orr r0, r0, #0x00ff0000 @ high vectors position
|
|
||||||
adr r1, .LCvectors @ set up the vectors
|
|
||||||
ldmia r1, {r1, r2, r3, r4, r5, r6, ip, lr}
|
|
||||||
stmia r0, {r1, r2, r3, r4, r5, r6, ip, lr}
|
|
||||||
|
|
||||||
add r2, r0, #0x200
|
|
||||||
adr r0, __stubs_start @ copy stubs to 0x200
|
|
||||||
adr r1, __stubs_end
|
|
||||||
1: ldr r3, [r0], #4
|
|
||||||
str r3, [r2], #4
|
|
||||||
cmp r0, r1
|
|
||||||
blt 1b
|
|
||||||
LOADREGS(fd, sp!, {r4 - r6, pc})
|
|
||||||
|
|
||||||
.data
|
.data
|
||||||
|
|
||||||
|
@ -9,19 +9,10 @@
|
|||||||
*/
|
*/
|
||||||
#include <linux/config.h>
|
#include <linux/config.h>
|
||||||
|
|
||||||
#include <asm/thread_info.h>
|
|
||||||
#include <asm/ptrace.h>
|
|
||||||
#include <asm/unistd.h>
|
#include <asm/unistd.h>
|
||||||
|
|
||||||
#include "entry-header.S"
|
#include "entry-header.S"
|
||||||
|
|
||||||
/*
|
|
||||||
* We rely on the fact that R0 is at the bottom of the stack (due to
|
|
||||||
* slow/fast restore user regs).
|
|
||||||
*/
|
|
||||||
#if S_R0 != 0
|
|
||||||
#error "Please fix"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
.align 5
|
.align 5
|
||||||
/*
|
/*
|
||||||
@ -30,11 +21,19 @@
|
|||||||
* stack.
|
* stack.
|
||||||
*/
|
*/
|
||||||
ret_fast_syscall:
|
ret_fast_syscall:
|
||||||
disable_irq r1 @ disable interrupts
|
disable_irq @ disable interrupts
|
||||||
ldr r1, [tsk, #TI_FLAGS]
|
ldr r1, [tsk, #TI_FLAGS]
|
||||||
tst r1, #_TIF_WORK_MASK
|
tst r1, #_TIF_WORK_MASK
|
||||||
bne fast_work_pending
|
bne fast_work_pending
|
||||||
fast_restore_user_regs
|
|
||||||
|
@ fast_restore_user_regs
|
||||||
|
ldr r1, [sp, #S_OFF + S_PSR] @ get calling cpsr
|
||||||
|
ldr lr, [sp, #S_OFF + S_PC]! @ get pc
|
||||||
|
msr spsr_cxsf, r1 @ save in spsr_svc
|
||||||
|
ldmdb sp, {r1 - lr}^ @ get calling r1 - lr
|
||||||
|
mov r0, r0
|
||||||
|
add sp, sp, #S_FRAME_SIZE - S_PC
|
||||||
|
movs pc, lr @ return & move spsr_svc into cpsr
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Ok, we need to do extra processing, enter the slow path.
|
* Ok, we need to do extra processing, enter the slow path.
|
||||||
@ -49,7 +48,7 @@ work_pending:
|
|||||||
mov r0, sp @ 'regs'
|
mov r0, sp @ 'regs'
|
||||||
mov r2, why @ 'syscall'
|
mov r2, why @ 'syscall'
|
||||||
bl do_notify_resume
|
bl do_notify_resume
|
||||||
disable_irq r1 @ disable interrupts
|
disable_irq @ disable interrupts
|
||||||
b no_work_pending
|
b no_work_pending
|
||||||
|
|
||||||
work_resched:
|
work_resched:
|
||||||
@ -59,12 +58,19 @@ work_resched:
|
|||||||
*/
|
*/
|
||||||
ENTRY(ret_to_user)
|
ENTRY(ret_to_user)
|
||||||
ret_slow_syscall:
|
ret_slow_syscall:
|
||||||
disable_irq r1 @ disable interrupts
|
disable_irq @ disable interrupts
|
||||||
ldr r1, [tsk, #TI_FLAGS]
|
ldr r1, [tsk, #TI_FLAGS]
|
||||||
tst r1, #_TIF_WORK_MASK
|
tst r1, #_TIF_WORK_MASK
|
||||||
bne work_pending
|
bne work_pending
|
||||||
no_work_pending:
|
no_work_pending:
|
||||||
slow_restore_user_regs
|
@ slow_restore_user_regs
|
||||||
|
ldr r1, [sp, #S_PSR] @ get calling cpsr
|
||||||
|
ldr lr, [sp, #S_PC]! @ get pc
|
||||||
|
msr spsr_cxsf, r1 @ save in spsr_svc
|
||||||
|
ldmdb sp, {r0 - lr}^ @ get calling r1 - lr
|
||||||
|
mov r0, r0
|
||||||
|
add sp, sp, #S_FRAME_SIZE - S_PC
|
||||||
|
movs pc, lr @ return & move spsr_svc into cpsr
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is how we return from a fork.
|
* This is how we return from a fork.
|
||||||
@ -116,9 +122,26 @@ ENTRY(ret_from_fork)
|
|||||||
|
|
||||||
.align 5
|
.align 5
|
||||||
ENTRY(vector_swi)
|
ENTRY(vector_swi)
|
||||||
save_user_regs
|
sub sp, sp, #S_FRAME_SIZE
|
||||||
|
stmia sp, {r0 - r12} @ Calling r0 - r12
|
||||||
|
add r8, sp, #S_PC
|
||||||
|
stmdb r8, {sp, lr}^ @ Calling sp, lr
|
||||||
|
mrs r8, spsr @ called from non-FIQ mode, so ok.
|
||||||
|
str lr, [sp, #S_PC] @ Save calling PC
|
||||||
|
str r8, [sp, #S_PSR] @ Save CPSR
|
||||||
|
str r0, [sp, #S_OLD_R0] @ Save OLD_R0
|
||||||
zero_fp
|
zero_fp
|
||||||
get_scno
|
|
||||||
|
/*
|
||||||
|
* Get the system call number.
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_ARM_THUMB
|
||||||
|
tst r8, #PSR_T_BIT @ this is SPSR from save_user_regs
|
||||||
|
addne scno, r7, #__NR_SYSCALL_BASE @ put OS number in
|
||||||
|
ldreq scno, [lr, #-4]
|
||||||
|
#else
|
||||||
|
ldr scno, [lr, #-4] @ get SWI instruction
|
||||||
|
#endif
|
||||||
arm710_bug_check scno, ip
|
arm710_bug_check scno, ip
|
||||||
|
|
||||||
#ifdef CONFIG_ALIGNMENT_TRAP
|
#ifdef CONFIG_ALIGNMENT_TRAP
|
||||||
@ -126,14 +149,14 @@ ENTRY(vector_swi)
|
|||||||
ldr ip, [ip]
|
ldr ip, [ip]
|
||||||
mcr p15, 0, ip, c1, c0 @ update control register
|
mcr p15, 0, ip, c1, c0 @ update control register
|
||||||
#endif
|
#endif
|
||||||
enable_irq ip
|
enable_irq
|
||||||
|
|
||||||
str r4, [sp, #-S_OFF]! @ push fifth arg
|
str r4, [sp, #-S_OFF]! @ push fifth arg
|
||||||
|
|
||||||
get_thread_info tsk
|
get_thread_info tsk
|
||||||
ldr ip, [tsk, #TI_FLAGS] @ check for syscall tracing
|
ldr ip, [tsk, #TI_FLAGS] @ check for syscall tracing
|
||||||
bic scno, scno, #0xff000000 @ mask off SWI op-code
|
bic scno, scno, #0xff000000 @ mask off SWI op-code
|
||||||
eor scno, scno, #OS_NUMBER << 20 @ check OS number
|
eor scno, scno, #__NR_SYSCALL_BASE @ check OS number
|
||||||
adr tbl, sys_call_table @ load syscall table pointer
|
adr tbl, sys_call_table @ load syscall table pointer
|
||||||
tst ip, #_TIF_SYSCALL_TRACE @ are we tracing syscalls?
|
tst ip, #_TIF_SYSCALL_TRACE @ are we tracing syscalls?
|
||||||
bne __sys_trace
|
bne __sys_trace
|
||||||
@ -144,8 +167,8 @@ ENTRY(vector_swi)
|
|||||||
|
|
||||||
add r1, sp, #S_OFF
|
add r1, sp, #S_OFF
|
||||||
2: mov why, #0 @ no longer a real syscall
|
2: mov why, #0 @ no longer a real syscall
|
||||||
cmp scno, #ARMSWI_OFFSET
|
cmp scno, #(__ARM_NR_BASE - __NR_SYSCALL_BASE)
|
||||||
eor r0, scno, #OS_NUMBER << 20 @ put OS number back
|
eor r0, scno, #__NR_SYSCALL_BASE @ put OS number back
|
||||||
bcs arm_syscall
|
bcs arm_syscall
|
||||||
b sys_ni_syscall @ not private func
|
b sys_ni_syscall @ not private func
|
||||||
|
|
||||||
@ -190,7 +213,7 @@ ENTRY(sys_call_table)
|
|||||||
@ r5 = syscall table
|
@ r5 = syscall table
|
||||||
.type sys_syscall, #function
|
.type sys_syscall, #function
|
||||||
sys_syscall:
|
sys_syscall:
|
||||||
eor scno, r0, #OS_NUMBER << 20
|
eor scno, r0, #__NR_SYSCALL_BASE
|
||||||
cmp scno, #__NR_syscall - __NR_SYSCALL_BASE
|
cmp scno, #__NR_syscall - __NR_SYSCALL_BASE
|
||||||
cmpne scno, #NR_syscalls @ check range
|
cmpne scno, #NR_syscalls @ check range
|
||||||
stmloia sp, {r5, r6} @ shuffle args
|
stmloia sp, {r5, r6} @ shuffle args
|
||||||
|
@ -1,24 +1,11 @@
|
|||||||
#include <linux/config.h> /* for CONFIG_ARCH_xxxx */
|
#include <linux/config.h>
|
||||||
|
#include <linux/init.h>
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
#include <asm/assembler.h>
|
#include <asm/assembler.h>
|
||||||
#include <asm/constants.h>
|
#include <asm/constants.h>
|
||||||
#include <asm/errno.h>
|
#include <asm/errno.h>
|
||||||
#include <asm/hardware.h>
|
#include <asm/thread_info.h>
|
||||||
#include <asm/arch/irqs.h>
|
|
||||||
#include <asm/arch/entry-macro.S>
|
|
||||||
|
|
||||||
#ifndef MODE_SVC
|
|
||||||
#define MODE_SVC 0x13
|
|
||||||
#endif
|
|
||||||
|
|
||||||
.macro zero_fp
|
|
||||||
#ifdef CONFIG_FRAME_POINTER
|
|
||||||
mov fp, #0
|
|
||||||
#endif
|
|
||||||
.endm
|
|
||||||
|
|
||||||
.text
|
|
||||||
|
|
||||||
@ Bad Abort numbers
|
@ Bad Abort numbers
|
||||||
@ -----------------
|
@ -----------------
|
||||||
@ -29,113 +16,44 @@
|
|||||||
#define BAD_IRQ 3
|
#define BAD_IRQ 3
|
||||||
#define BAD_UNDEFINSTR 4
|
#define BAD_UNDEFINSTR 4
|
||||||
|
|
||||||
#define PT_TRACESYS 0x00000002
|
|
||||||
|
|
||||||
@ OS version number used in SWIs
|
|
||||||
@ RISC OS is 0
|
|
||||||
@ RISC iX is 8
|
|
||||||
@
|
@
|
||||||
#define OS_NUMBER 9
|
@ Most of the stack format comes from struct pt_regs, but with
|
||||||
#define ARMSWI_OFFSET 0x000f0000
|
@ the addition of 8 bytes for storing syscall args 5 and 6.
|
||||||
|
|
||||||
@
|
@
|
||||||
@ Stack format (ensured by USER_* and SVC_*)
|
|
||||||
@
|
|
||||||
#define S_FRAME_SIZE 72
|
|
||||||
#define S_OLD_R0 68
|
|
||||||
#define S_PSR 64
|
|
||||||
|
|
||||||
#define S_PC 60
|
|
||||||
#define S_LR 56
|
|
||||||
#define S_SP 52
|
|
||||||
#define S_IP 48
|
|
||||||
#define S_FP 44
|
|
||||||
#define S_R10 40
|
|
||||||
#define S_R9 36
|
|
||||||
#define S_R8 32
|
|
||||||
#define S_R7 28
|
|
||||||
#define S_R6 24
|
|
||||||
#define S_R5 20
|
|
||||||
#define S_R4 16
|
|
||||||
#define S_R3 12
|
|
||||||
#define S_R2 8
|
|
||||||
#define S_R1 4
|
|
||||||
#define S_R0 0
|
|
||||||
#define S_OFF 8
|
#define S_OFF 8
|
||||||
|
|
||||||
.macro set_cpsr_c, reg, mode
|
/*
|
||||||
msr cpsr_c, \mode
|
* The SWI code relies on the fact that R0 is at the bottom of the stack
|
||||||
|
* (due to slow/fast restore user regs).
|
||||||
|
*/
|
||||||
|
#if S_R0 != 0
|
||||||
|
#error "Please fix"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
.macro zero_fp
|
||||||
|
#ifdef CONFIG_FRAME_POINTER
|
||||||
|
mov fp, #0
|
||||||
|
#endif
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
#if __LINUX_ARM_ARCH__ >= 6
|
#if __LINUX_ARM_ARCH__ >= 6
|
||||||
.macro disable_irq, temp
|
.macro disable_irq
|
||||||
cpsid i
|
cpsid i
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro enable_irq, temp
|
.macro enable_irq
|
||||||
cpsie i
|
cpsie i
|
||||||
.endm
|
.endm
|
||||||
#else
|
#else
|
||||||
.macro disable_irq, temp
|
.macro disable_irq
|
||||||
set_cpsr_c \temp, #PSR_I_BIT | MODE_SVC
|
msr cpsr_c, #PSR_I_BIT | SVC_MODE
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro enable_irq, temp
|
.macro enable_irq
|
||||||
set_cpsr_c \temp, #MODE_SVC
|
msr cpsr_c, #SVC_MODE
|
||||||
.endm
|
.endm
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
.macro save_user_regs
|
|
||||||
sub sp, sp, #S_FRAME_SIZE
|
|
||||||
stmia sp, {r0 - r12} @ Calling r0 - r12
|
|
||||||
add r8, sp, #S_PC
|
|
||||||
stmdb r8, {sp, lr}^ @ Calling sp, lr
|
|
||||||
mrs r8, spsr @ called from non-FIQ mode, so ok.
|
|
||||||
str lr, [sp, #S_PC] @ Save calling PC
|
|
||||||
str r8, [sp, #S_PSR] @ Save CPSR
|
|
||||||
str r0, [sp, #S_OLD_R0] @ Save OLD_R0
|
|
||||||
.endm
|
|
||||||
|
|
||||||
.macro restore_user_regs
|
|
||||||
ldr r1, [sp, #S_PSR] @ Get calling cpsr
|
|
||||||
disable_irq ip @ disable IRQs
|
|
||||||
ldr lr, [sp, #S_PC]! @ Get PC
|
|
||||||
msr spsr_cxsf, r1 @ save in spsr_svc
|
|
||||||
ldmdb sp, {r0 - lr}^ @ Get calling r0 - lr
|
|
||||||
mov r0, r0
|
|
||||||
add sp, sp, #S_FRAME_SIZE - S_PC
|
|
||||||
movs pc, lr @ return & move spsr_svc into cpsr
|
|
||||||
.endm
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Must be called with IRQs already disabled.
|
|
||||||
*/
|
|
||||||
.macro fast_restore_user_regs
|
|
||||||
ldr r1, [sp, #S_OFF + S_PSR] @ get calling cpsr
|
|
||||||
ldr lr, [sp, #S_OFF + S_PC]! @ get pc
|
|
||||||
msr spsr_cxsf, r1 @ save in spsr_svc
|
|
||||||
ldmdb sp, {r1 - lr}^ @ get calling r1 - lr
|
|
||||||
mov r0, r0
|
|
||||||
add sp, sp, #S_FRAME_SIZE - S_PC
|
|
||||||
movs pc, lr @ return & move spsr_svc into cpsr
|
|
||||||
.endm
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Must be called with IRQs already disabled.
|
|
||||||
*/
|
|
||||||
.macro slow_restore_user_regs
|
|
||||||
ldr r1, [sp, #S_PSR] @ get calling cpsr
|
|
||||||
ldr lr, [sp, #S_PC]! @ get pc
|
|
||||||
msr spsr_cxsf, r1 @ save in spsr_svc
|
|
||||||
ldmdb sp, {r0 - lr}^ @ get calling r1 - lr
|
|
||||||
mov r0, r0
|
|
||||||
add sp, sp, #S_FRAME_SIZE - S_PC
|
|
||||||
movs pc, lr @ return & move spsr_svc into cpsr
|
|
||||||
.endm
|
|
||||||
|
|
||||||
.macro mask_pc, rd, rm
|
|
||||||
.endm
|
|
||||||
|
|
||||||
.macro get_thread_info, rd
|
.macro get_thread_info, rd
|
||||||
mov \rd, sp, lsr #13
|
mov \rd, sp, lsr #13
|
||||||
mov \rd, \rd, lsl #13
|
mov \rd, \rd, lsl #13
|
||||||
@ -165,18 +83,3 @@ scno .req r7 @ syscall number
|
|||||||
tbl .req r8 @ syscall table pointer
|
tbl .req r8 @ syscall table pointer
|
||||||
why .req r8 @ Linux syscall (!= 0)
|
why .req r8 @ Linux syscall (!= 0)
|
||||||
tsk .req r9 @ current thread_info
|
tsk .req r9 @ current thread_info
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the system call number.
|
|
||||||
*/
|
|
||||||
.macro get_scno
|
|
||||||
#ifdef CONFIG_ARM_THUMB
|
|
||||||
tst r8, #PSR_T_BIT @ this is SPSR from save_user_regs
|
|
||||||
addne scno, r7, #OS_NUMBER << 20 @ put OS number in
|
|
||||||
ldreq scno, [lr, #-4]
|
|
||||||
|
|
||||||
#else
|
|
||||||
mask_pc lr, lr
|
|
||||||
ldr scno, [lr, #-4] @ get SWI instruction
|
|
||||||
#endif
|
|
||||||
.endm
|
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <asm/procinfo.h>
|
#include <asm/procinfo.h>
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
#include <asm/constants.h>
|
#include <asm/constants.h>
|
||||||
|
#include <asm/thread_info.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
|
||||||
#define PROCINFO_MMUFLAGS 8
|
#define PROCINFO_MMUFLAGS 8
|
||||||
@ -131,7 +132,7 @@ __switch_data:
|
|||||||
.long processor_id @ r4
|
.long processor_id @ r4
|
||||||
.long __machine_arch_type @ r5
|
.long __machine_arch_type @ r5
|
||||||
.long cr_alignment @ r6
|
.long cr_alignment @ r6
|
||||||
.long init_thread_union+8192 @ sp
|
.long init_thread_union + THREAD_START_SP @ sp
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The following fragment of code is executed with the MMU on, and uses
|
* The following fragment of code is executed with the MMU on, and uses
|
||||||
|
@ -256,8 +256,6 @@ static unsigned long *thread_info_head;
|
|||||||
static unsigned int nr_thread_info;
|
static unsigned int nr_thread_info;
|
||||||
|
|
||||||
#define EXTRA_TASK_STRUCT 4
|
#define EXTRA_TASK_STRUCT 4
|
||||||
#define ll_alloc_task_struct() ((struct thread_info *) __get_free_pages(GFP_KERNEL,1))
|
|
||||||
#define ll_free_task_struct(p) free_pages((unsigned long)(p),1)
|
|
||||||
|
|
||||||
struct thread_info *alloc_thread_info(struct task_struct *task)
|
struct thread_info *alloc_thread_info(struct task_struct *task)
|
||||||
{
|
{
|
||||||
@ -274,17 +272,16 @@ struct thread_info *alloc_thread_info(struct task_struct *task)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!thread)
|
if (!thread)
|
||||||
thread = ll_alloc_task_struct();
|
thread = (struct thread_info *)
|
||||||
|
__get_free_pages(GFP_KERNEL, THREAD_SIZE_ORDER);
|
||||||
|
|
||||||
#ifdef CONFIG_MAGIC_SYSRQ
|
#ifdef CONFIG_DEBUG_STACK_USAGE
|
||||||
/*
|
/*
|
||||||
* The stack must be cleared if you want SYSRQ-T to
|
* The stack must be cleared if you want SYSRQ-T to
|
||||||
* give sensible stack usage information
|
* give sensible stack usage information
|
||||||
*/
|
*/
|
||||||
if (thread) {
|
if (thread)
|
||||||
char *p = (char *)thread;
|
memzero(thread, THREAD_SIZE);
|
||||||
memzero(p+KERNEL_STACK_SIZE, KERNEL_STACK_SIZE);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
return thread;
|
return thread;
|
||||||
}
|
}
|
||||||
@ -297,7 +294,7 @@ void free_thread_info(struct thread_info *thread)
|
|||||||
thread_info_head = p;
|
thread_info_head = p;
|
||||||
nr_thread_info += 1;
|
nr_thread_info += 1;
|
||||||
} else
|
} else
|
||||||
ll_free_task_struct(thread);
|
free_pages((unsigned long)thread, THREAD_SIZE_ORDER);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -350,7 +347,7 @@ copy_thread(int nr, unsigned long clone_flags, unsigned long stack_start,
|
|||||||
struct thread_info *thread = p->thread_info;
|
struct thread_info *thread = p->thread_info;
|
||||||
struct pt_regs *childregs;
|
struct pt_regs *childregs;
|
||||||
|
|
||||||
childregs = ((struct pt_regs *)((unsigned long)thread + THREAD_SIZE - 8)) - 1;
|
childregs = ((struct pt_regs *)((unsigned long)thread + THREAD_START_SP)) - 1;
|
||||||
*childregs = *regs;
|
*childregs = *regs;
|
||||||
childregs->ARM_r0 = 0;
|
childregs->ARM_r0 = 0;
|
||||||
childregs->ARM_sp = stack_start;
|
childregs->ARM_sp = stack_start;
|
||||||
@ -447,15 +444,17 @@ EXPORT_SYMBOL(kernel_thread);
|
|||||||
unsigned long get_wchan(struct task_struct *p)
|
unsigned long get_wchan(struct task_struct *p)
|
||||||
{
|
{
|
||||||
unsigned long fp, lr;
|
unsigned long fp, lr;
|
||||||
unsigned long stack_page;
|
unsigned long stack_start, stack_end;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
if (!p || p == current || p->state == TASK_RUNNING)
|
if (!p || p == current || p->state == TASK_RUNNING)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
stack_page = 4096 + (unsigned long)p->thread_info;
|
stack_start = (unsigned long)(p->thread_info + 1);
|
||||||
|
stack_end = ((unsigned long)p->thread_info) + THREAD_SIZE;
|
||||||
|
|
||||||
fp = thread_saved_fp(p);
|
fp = thread_saved_fp(p);
|
||||||
do {
|
do {
|
||||||
if (fp < stack_page || fp > 4092+stack_page)
|
if (fp < stack_start || fp > stack_end)
|
||||||
return 0;
|
return 0;
|
||||||
lr = pc_pointer (((unsigned long *)fp)[-1]);
|
lr = pc_pointer (((unsigned long *)fp)[-1]);
|
||||||
if (!in_sched_functions(lr))
|
if (!in_sched_functions(lr))
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
@ -693,7 +694,7 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat
|
|||||||
case PTRACE_SYSCALL:
|
case PTRACE_SYSCALL:
|
||||||
case PTRACE_CONT:
|
case PTRACE_CONT:
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
if (request == PTRACE_SYSCALL)
|
if (request == PTRACE_SYSCALL)
|
||||||
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
@ -728,7 +729,7 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat
|
|||||||
*/
|
*/
|
||||||
case PTRACE_SINGLESTEP:
|
case PTRACE_SINGLESTEP:
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
child->ptrace |= PT_SINGLESTEP;
|
child->ptrace |= PT_SINGLESTEP;
|
||||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
|
@ -227,18 +227,6 @@ asmlinkage int sys_ipc(uint call, int first, int second, int third,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage long sys_shmat(int shmid, char __user *shmaddr, int shmflg,
|
|
||||||
unsigned long __user *addr)
|
|
||||||
{
|
|
||||||
unsigned long ret;
|
|
||||||
long err;
|
|
||||||
|
|
||||||
err = do_shmat(shmid, shmaddr, shmflg, &ret);
|
|
||||||
if (err == 0)
|
|
||||||
err = put_user(ret, addr);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Fork a new task - this creates a new program thread.
|
/* Fork a new task - this creates a new program thread.
|
||||||
* This is called indirectly via a small wrapper
|
* This is called indirectly via a small wrapper
|
||||||
*/
|
*/
|
||||||
@ -314,7 +302,7 @@ long execve(const char *filename, char **argv, char **envp)
|
|||||||
"b ret_to_user"
|
"b ret_to_user"
|
||||||
:
|
:
|
||||||
: "r" (current_thread_info()),
|
: "r" (current_thread_info()),
|
||||||
"Ir" (THREAD_SIZE - 8 - sizeof(regs)),
|
"Ir" (THREAD_START_SP - sizeof(regs)),
|
||||||
"r" (®s),
|
"r" (®s),
|
||||||
"Ir" (sizeof(regs))
|
"Ir" (sizeof(regs))
|
||||||
: "r0", "r1", "r2", "r3", "ip", "memory");
|
: "r0", "r1", "r2", "r3", "ip", "memory");
|
||||||
|
@ -218,7 +218,8 @@ NORET_TYPE void die(const char *str, struct pt_regs *regs, int err)
|
|||||||
tsk->comm, tsk->pid, tsk->thread_info + 1);
|
tsk->comm, tsk->pid, tsk->thread_info + 1);
|
||||||
|
|
||||||
if (!user_mode(regs) || in_interrupt()) {
|
if (!user_mode(regs) || in_interrupt()) {
|
||||||
dump_mem("Stack: ", regs->ARM_sp, 8192+(unsigned long)tsk->thread_info);
|
dump_mem("Stack: ", regs->ARM_sp,
|
||||||
|
THREAD_SIZE + (unsigned long)tsk->thread_info);
|
||||||
dump_backtrace(regs, tsk);
|
dump_backtrace(regs, tsk);
|
||||||
dump_instr(regs);
|
dump_instr(regs);
|
||||||
}
|
}
|
||||||
@ -450,13 +451,17 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
|
|||||||
|
|
||||||
case NR(set_tls):
|
case NR(set_tls):
|
||||||
thread->tp_value = regs->ARM_r0;
|
thread->tp_value = regs->ARM_r0;
|
||||||
|
#if defined(CONFIG_HAS_TLS_REG)
|
||||||
|
asm ("mcr p15, 0, %0, c13, c0, 3" : : "r" (regs->ARM_r0) );
|
||||||
|
#elif !defined(CONFIG_TLS_REG_EMUL)
|
||||||
/*
|
/*
|
||||||
* Our user accessible TLS ptr is located at 0xffff0ffc.
|
* User space must never try to access this directly.
|
||||||
* On SMP read access to this address must raise a fault
|
* Expect your app to break eventually if you do so.
|
||||||
* and be emulated from the data abort handler.
|
* The user helper at 0xffff0fe0 must be used instead.
|
||||||
* m
|
* (see entry-armv.S for details)
|
||||||
*/
|
*/
|
||||||
*((unsigned long *)0xffff0ffc) = thread->tp_value;
|
*((unsigned int *)0xffff0ff0) = regs->ARM_r0;
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -493,6 +498,44 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_TLS_REG_EMUL
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We might be running on an ARMv6+ processor which should have the TLS
|
||||||
|
* register but for some reason we can't use it, or maybe an SMP system
|
||||||
|
* using a pre-ARMv6 processor (there are apparently a few prototypes like
|
||||||
|
* that in existence) and therefore access to that register must be
|
||||||
|
* emulated.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int get_tp_trap(struct pt_regs *regs, unsigned int instr)
|
||||||
|
{
|
||||||
|
int reg = (instr >> 12) & 15;
|
||||||
|
if (reg == 15)
|
||||||
|
return 1;
|
||||||
|
regs->uregs[reg] = current_thread_info()->tp_value;
|
||||||
|
regs->ARM_pc += 4;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct undef_hook arm_mrc_hook = {
|
||||||
|
.instr_mask = 0x0fff0fff,
|
||||||
|
.instr_val = 0x0e1d0f70,
|
||||||
|
.cpsr_mask = PSR_T_BIT,
|
||||||
|
.cpsr_val = 0,
|
||||||
|
.fn = get_tp_trap,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init arm_mrc_hook_init(void)
|
||||||
|
{
|
||||||
|
register_undef_hook(&arm_mrc_hook);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
late_initcall(arm_mrc_hook_init);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
void __bad_xchg(volatile void *ptr, int size)
|
void __bad_xchg(volatile void *ptr, int size)
|
||||||
{
|
{
|
||||||
printk("xchg: bad data size: pc 0x%p, ptr 0x%p, size %d\n",
|
printk("xchg: bad data size: pc 0x%p, ptr 0x%p, size %d\n",
|
||||||
@ -578,9 +621,19 @@ EXPORT_SYMBOL(abort);
|
|||||||
|
|
||||||
void __init trap_init(void)
|
void __init trap_init(void)
|
||||||
{
|
{
|
||||||
extern void __trap_init(void);
|
extern char __stubs_start[], __stubs_end[];
|
||||||
|
extern char __vectors_start[], __vectors_end[];
|
||||||
|
extern char __kuser_helper_start[], __kuser_helper_end[];
|
||||||
|
int kuser_sz = __kuser_helper_end - __kuser_helper_start;
|
||||||
|
|
||||||
__trap_init();
|
/*
|
||||||
|
* Copy the vectors, stubs and kuser helpers (in entry-armv.S)
|
||||||
|
* into the vector page, mapped at 0xffff0000, and ensure these
|
||||||
|
* are visible to the instruction stream.
|
||||||
|
*/
|
||||||
|
memcpy((void *)0xffff0000, __vectors_start, __vectors_end - __vectors_start);
|
||||||
|
memcpy((void *)0xffff0200, __stubs_start, __stubs_end - __stubs_start);
|
||||||
|
memcpy((void *)0xffff1000 - kuser_sz, __kuser_helper_start, kuser_sz);
|
||||||
flush_icache_range(0xffff0000, 0xffff0000 + PAGE_SIZE);
|
flush_icache_range(0xffff0000, 0xffff0000 + PAGE_SIZE);
|
||||||
modify_domain(DOMAIN_USER, DOMAIN_CLIENT);
|
modify_domain(DOMAIN_USER, DOMAIN_CLIENT);
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include <asm-generic/vmlinux.lds.h>
|
#include <asm-generic/vmlinux.lds.h>
|
||||||
#include <linux/config.h>
|
#include <linux/config.h>
|
||||||
|
#include <asm/thread_info.h>
|
||||||
|
|
||||||
OUTPUT_ARCH(arm)
|
OUTPUT_ARCH(arm)
|
||||||
ENTRY(stext)
|
ENTRY(stext)
|
||||||
@ -103,7 +104,7 @@ SECTIONS
|
|||||||
__data_loc = ALIGN(4); /* location in binary */
|
__data_loc = ALIGN(4); /* location in binary */
|
||||||
. = DATAADDR;
|
. = DATAADDR;
|
||||||
#else
|
#else
|
||||||
. = ALIGN(8192);
|
. = ALIGN(THREAD_SIZE);
|
||||||
__data_loc = .;
|
__data_loc = .;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ config ARCH_AUTCPU12
|
|||||||
|
|
||||||
config ARCH_CDB89712
|
config ARCH_CDB89712
|
||||||
bool "CDB89712"
|
bool "CDB89712"
|
||||||
|
select ISA
|
||||||
help
|
help
|
||||||
This is an evaluation board from Cirrus for the CS89712 processor.
|
This is an evaluation board from Cirrus for the CS89712 processor.
|
||||||
The board includes 2 serial ports, Ethernet, IRDA, and expansion
|
The board includes 2 serial ports, Ethernet, IRDA, and expansion
|
||||||
@ -26,6 +27,8 @@ config ARCH_CLEP7312
|
|||||||
|
|
||||||
config ARCH_EDB7211
|
config ARCH_EDB7211
|
||||||
bool "EDB7211"
|
bool "EDB7211"
|
||||||
|
select ISA
|
||||||
|
select DISCONTIGMEM
|
||||||
help
|
help
|
||||||
Say Y here if you intend to run this kernel on a Cirrus Logic EDB-7211
|
Say Y here if you intend to run this kernel on a Cirrus Logic EDB-7211
|
||||||
evaluation board.
|
evaluation board.
|
||||||
|
@ -5,6 +5,9 @@ menu "Footbridge Implementations"
|
|||||||
config ARCH_CATS
|
config ARCH_CATS
|
||||||
bool "CATS"
|
bool "CATS"
|
||||||
select FOOTBRIDGE_HOST
|
select FOOTBRIDGE_HOST
|
||||||
|
select ISA
|
||||||
|
select ISA_DMA
|
||||||
|
select PCI
|
||||||
help
|
help
|
||||||
Say Y here if you intend to run this kernel on the CATS.
|
Say Y here if you intend to run this kernel on the CATS.
|
||||||
|
|
||||||
@ -13,6 +16,9 @@ config ARCH_CATS
|
|||||||
config ARCH_PERSONAL_SERVER
|
config ARCH_PERSONAL_SERVER
|
||||||
bool "Compaq Personal Server"
|
bool "Compaq Personal Server"
|
||||||
select FOOTBRIDGE_HOST
|
select FOOTBRIDGE_HOST
|
||||||
|
select ISA
|
||||||
|
select ISA_DMA
|
||||||
|
select PCI
|
||||||
---help---
|
---help---
|
||||||
Say Y here if you intend to run this kernel on the Compaq
|
Say Y here if you intend to run this kernel on the Compaq
|
||||||
Personal Server.
|
Personal Server.
|
||||||
@ -42,6 +48,9 @@ config ARCH_EBSA285_HOST
|
|||||||
bool "EBSA285 (host mode)"
|
bool "EBSA285 (host mode)"
|
||||||
select ARCH_EBSA285
|
select ARCH_EBSA285
|
||||||
select FOOTBRIDGE_HOST
|
select FOOTBRIDGE_HOST
|
||||||
|
select ISA
|
||||||
|
select ISA_DMA
|
||||||
|
select PCI
|
||||||
help
|
help
|
||||||
Say Y here if you intend to run this kernel on the EBSA285 card
|
Say Y here if you intend to run this kernel on the EBSA285 card
|
||||||
in host ("central function") mode.
|
in host ("central function") mode.
|
||||||
@ -51,6 +60,9 @@ config ARCH_EBSA285_HOST
|
|||||||
config ARCH_NETWINDER
|
config ARCH_NETWINDER
|
||||||
bool "NetWinder"
|
bool "NetWinder"
|
||||||
select FOOTBRIDGE_HOST
|
select FOOTBRIDGE_HOST
|
||||||
|
select ISA
|
||||||
|
select ISA_DMA
|
||||||
|
select PCI
|
||||||
help
|
help
|
||||||
Say Y here if you intend to run this kernel on the Rebel.COM
|
Say Y here if you intend to run this kernel on the Rebel.COM
|
||||||
NetWinder. Information about this machine can be found at:
|
NetWinder. Information about this machine can be found at:
|
||||||
|
@ -4,6 +4,7 @@ menu "IMX Implementations"
|
|||||||
config ARCH_MX1ADS
|
config ARCH_MX1ADS
|
||||||
bool "mx1ads"
|
bool "mx1ads"
|
||||||
depends on ARCH_IMX
|
depends on ARCH_IMX
|
||||||
|
select ISA
|
||||||
help
|
help
|
||||||
Say Y here if you are using the Motorola MX1ADS board
|
Say Y here if you are using the Motorola MX1ADS board
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <asm/arch/imxfb.h>
|
||||||
#include <asm/hardware.h>
|
#include <asm/hardware.h>
|
||||||
|
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
@ -228,6 +229,14 @@ static struct platform_device imx_uart2_device = {
|
|||||||
.resource = imx_uart2_resources,
|
.resource = imx_uart2_resources,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct imxfb_mach_info imx_fb_info;
|
||||||
|
|
||||||
|
void __init set_imx_fb_info(struct imxfb_mach_info *hard_imx_fb_info)
|
||||||
|
{
|
||||||
|
memcpy(&imx_fb_info,hard_imx_fb_info,sizeof(struct imxfb_mach_info));
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(set_imx_fb_info);
|
||||||
|
|
||||||
static struct resource imxfb_resources[] = {
|
static struct resource imxfb_resources[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
.start = 0x00205000,
|
.start = 0x00205000,
|
||||||
@ -241,9 +250,16 @@ static struct resource imxfb_resources[] = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static u64 fb_dma_mask = ~(u64)0;
|
||||||
|
|
||||||
static struct platform_device imxfb_device = {
|
static struct platform_device imxfb_device = {
|
||||||
.name = "imx-fb",
|
.name = "imx-fb",
|
||||||
.id = 0,
|
.id = 0,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &imx_fb_info,
|
||||||
|
.dma_mask = &fb_dma_mask,
|
||||||
|
.coherent_dma_mask = 0xffffffff,
|
||||||
|
},
|
||||||
.num_resources = ARRAY_SIZE(imxfb_resources),
|
.num_resources = ARRAY_SIZE(imxfb_resources),
|
||||||
.resource = imxfb_resources,
|
.resource = imxfb_resources,
|
||||||
};
|
};
|
||||||
|
@ -216,7 +216,9 @@ integrator_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
|||||||
|
|
||||||
write_seqlock(&xtime_lock);
|
write_seqlock(&xtime_lock);
|
||||||
|
|
||||||
// ...clear the interrupt
|
/*
|
||||||
|
* clear the interrupt
|
||||||
|
*/
|
||||||
timer1->TimerClear = 1;
|
timer1->TimerClear = 1;
|
||||||
|
|
||||||
timer_tick(regs);
|
timer_tick(regs);
|
||||||
@ -264,7 +266,7 @@ void __init integrator_time_init(unsigned long reload, unsigned int ctrl)
|
|||||||
timer1->TimerValue = timer_reload;
|
timer1->TimerValue = timer_reload;
|
||||||
timer1->TimerControl = timer_ctrl;
|
timer1->TimerControl = timer_ctrl;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make irqs happen for the system timer
|
* Make irqs happen for the system timer
|
||||||
*/
|
*/
|
||||||
setup_irq(IRQ_TIMERINT1, &integrator_timer_irq);
|
setup_irq(IRQ_TIMERINT1, &integrator_timer_irq);
|
||||||
|
@ -420,7 +420,22 @@ static struct clcd_panel vga = {
|
|||||||
*/
|
*/
|
||||||
static void cp_clcd_enable(struct clcd_fb *fb)
|
static void cp_clcd_enable(struct clcd_fb *fb)
|
||||||
{
|
{
|
||||||
cm_control(CM_CTRL_LCDMUXSEL_MASK, CM_CTRL_LCDMUXSEL_VGA);
|
u32 val;
|
||||||
|
|
||||||
|
if (fb->fb.var.bits_per_pixel <= 8)
|
||||||
|
val = CM_CTRL_LCDMUXSEL_VGA_8421BPP;
|
||||||
|
else if (fb->fb.var.bits_per_pixel <= 16)
|
||||||
|
val = CM_CTRL_LCDMUXSEL_VGA_16BPP;
|
||||||
|
else
|
||||||
|
val = 0; /* no idea for this, don't trust the docs */
|
||||||
|
|
||||||
|
cm_control(CM_CTRL_LCDMUXSEL_MASK|
|
||||||
|
CM_CTRL_LCDEN0|
|
||||||
|
CM_CTRL_LCDEN1|
|
||||||
|
CM_CTRL_STATIC1|
|
||||||
|
CM_CTRL_STATIC2|
|
||||||
|
CM_CTRL_STATIC|
|
||||||
|
CM_CTRL_n24BITEN, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned long framesize = SZ_1M;
|
static unsigned long framesize = SZ_1M;
|
||||||
|
@ -37,7 +37,7 @@ static void integrator_leds_event(led_event_t ledevt)
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
const unsigned int dbg_base = IO_ADDRESS(INTEGRATOR_DBG_BASE);
|
const unsigned int dbg_base = IO_ADDRESS(INTEGRATOR_DBG_BASE);
|
||||||
unsigned int update_alpha_leds;
|
unsigned int update_alpha_leds;
|
||||||
|
|
||||||
// yup, change the LEDs
|
// yup, change the LEDs
|
||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
update_alpha_leds = 0;
|
update_alpha_leds = 0;
|
||||||
|
@ -40,25 +40,32 @@ static int integrator_set_rtc(void)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rtc_read_alarm(struct rtc_wkalrm *alrm)
|
static int rtc_read_alarm(struct rtc_wkalrm *alrm)
|
||||||
{
|
{
|
||||||
rtc_time_to_tm(readl(rtc_base + RTC_MR), &alrm->time);
|
rtc_time_to_tm(readl(rtc_base + RTC_MR), &alrm->time);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rtc_set_alarm(struct rtc_wkalrm *alrm)
|
static inline int rtc_set_alarm(struct rtc_wkalrm *alrm)
|
||||||
{
|
{
|
||||||
unsigned long time;
|
unsigned long time;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = rtc_tm_to_time(&alrm->time, &time);
|
/*
|
||||||
|
* At the moment, we can only deal with non-wildcarded alarm times.
|
||||||
|
*/
|
||||||
|
ret = rtc_valid_tm(&alrm->time);
|
||||||
|
if (ret == 0)
|
||||||
|
ret = rtc_tm_to_time(&alrm->time, &time);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
writel(time, rtc_base + RTC_MR);
|
writel(time, rtc_base + RTC_MR);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rtc_read_time(struct rtc_time *tm)
|
static int rtc_read_time(struct rtc_time *tm)
|
||||||
{
|
{
|
||||||
rtc_time_to_tm(readl(rtc_base + RTC_DR), tm);
|
rtc_time_to_tm(readl(rtc_base + RTC_DR), tm);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -69,7 +76,7 @@ static void rtc_read_time(struct rtc_time *tm)
|
|||||||
* edge of the 1Hz clock, we must write the time one second
|
* edge of the 1Hz clock, we must write the time one second
|
||||||
* in advance.
|
* in advance.
|
||||||
*/
|
*/
|
||||||
static int rtc_set_time(struct rtc_time *tm)
|
static inline int rtc_set_time(struct rtc_time *tm)
|
||||||
{
|
{
|
||||||
unsigned long time;
|
unsigned long time;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -65,19 +65,102 @@ static struct sys_timer ixdp2800_timer = {
|
|||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* IXDP2800 PCI
|
* IXDP2800 PCI
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
static void __init ixdp2800_slave_disable_pci_master(void)
|
||||||
|
{
|
||||||
|
*IXP2000_PCI_CMDSTAT &= ~(PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __init ixdp2800_master_wait_for_slave(void)
|
||||||
|
{
|
||||||
|
volatile u32 *addr;
|
||||||
|
|
||||||
|
printk(KERN_INFO "IXDP2800: waiting for slave NPU to configure "
|
||||||
|
"its BAR sizes\n");
|
||||||
|
|
||||||
|
addr = ixp2000_pci_config_addr(0, IXDP2X00_SLAVE_NPU_DEVFN,
|
||||||
|
PCI_BASE_ADDRESS_1);
|
||||||
|
do {
|
||||||
|
*addr = 0xffffffff;
|
||||||
|
cpu_relax();
|
||||||
|
} while (*addr != 0xfe000008);
|
||||||
|
|
||||||
|
addr = ixp2000_pci_config_addr(0, IXDP2X00_SLAVE_NPU_DEVFN,
|
||||||
|
PCI_BASE_ADDRESS_2);
|
||||||
|
do {
|
||||||
|
*addr = 0xffffffff;
|
||||||
|
cpu_relax();
|
||||||
|
} while (*addr != 0xc0000008);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Configure the slave's SDRAM BAR by hand.
|
||||||
|
*/
|
||||||
|
*addr = 0x40000008;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __init ixdp2800_slave_wait_for_master_enable(void)
|
||||||
|
{
|
||||||
|
printk(KERN_INFO "IXDP2800: waiting for master NPU to enable us\n");
|
||||||
|
|
||||||
|
while ((*IXP2000_PCI_CMDSTAT & PCI_COMMAND_MASTER) == 0)
|
||||||
|
cpu_relax();
|
||||||
|
}
|
||||||
|
|
||||||
void __init ixdp2800_pci_preinit(void)
|
void __init ixdp2800_pci_preinit(void)
|
||||||
{
|
{
|
||||||
printk("ixdp2x00_pci_preinit called\n");
|
printk("ixdp2x00_pci_preinit called\n");
|
||||||
|
|
||||||
*IXP2000_PCI_ADDR_EXT = 0x0000e000;
|
*IXP2000_PCI_ADDR_EXT = 0x0001e000;
|
||||||
|
|
||||||
|
if (!ixdp2x00_master_npu())
|
||||||
|
ixdp2800_slave_disable_pci_master();
|
||||||
|
|
||||||
*IXP2000_PCI_DRAM_BASE_ADDR_MASK = (0x40000000 - 1) & ~0xfffff;
|
|
||||||
*IXP2000_PCI_SRAM_BASE_ADDR_MASK = (0x2000000 - 1) & ~0x3ffff;
|
*IXP2000_PCI_SRAM_BASE_ADDR_MASK = (0x2000000 - 1) & ~0x3ffff;
|
||||||
|
*IXP2000_PCI_DRAM_BASE_ADDR_MASK = (0x40000000 - 1) & ~0xfffff;
|
||||||
|
|
||||||
ixp2000_pci_preinit();
|
ixp2000_pci_preinit();
|
||||||
|
|
||||||
|
if (ixdp2x00_master_npu()) {
|
||||||
|
/*
|
||||||
|
* Wait until the slave set its SRAM/SDRAM BAR sizes
|
||||||
|
* correctly before we proceed to scan and enumerate
|
||||||
|
* the bus.
|
||||||
|
*/
|
||||||
|
ixdp2800_master_wait_for_slave();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We configure the SDRAM BARs by hand because they
|
||||||
|
* are 1G and fall outside of the regular allocated
|
||||||
|
* PCI address space.
|
||||||
|
*/
|
||||||
|
*IXP2000_PCI_SDRAM_BAR = 0x00000008;
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Wait for the master to complete scanning the bus
|
||||||
|
* and assigning resources before we proceed to scan
|
||||||
|
* the bus ourselves. Set pci=firmware to honor the
|
||||||
|
* master's resource assignment.
|
||||||
|
*/
|
||||||
|
ixdp2800_slave_wait_for_master_enable();
|
||||||
|
pcibios_setup("firmware");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int ixdp2800_pci_setup(int nr, struct pci_sys_data *sys)
|
/*
|
||||||
|
* We assign the SDRAM BARs for the two IXP2800 CPUs by hand, outside
|
||||||
|
* of the regular PCI window, because there's only 512M of outbound PCI
|
||||||
|
* memory window on each IXP, while we need 1G for each of the BARs.
|
||||||
|
*/
|
||||||
|
static void __devinit ixp2800_pci_fixup(struct pci_dev *dev)
|
||||||
|
{
|
||||||
|
if (machine_is_ixdp2800()) {
|
||||||
|
dev->resource[2].start = 0;
|
||||||
|
dev->resource[2].end = 0;
|
||||||
|
dev->resource[2].flags = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IXP2800, ixp2800_pci_fixup);
|
||||||
|
|
||||||
|
static int __init ixdp2800_pci_setup(int nr, struct pci_sys_data *sys)
|
||||||
{
|
{
|
||||||
sys->mem_offset = 0x00000000;
|
sys->mem_offset = 0x00000000;
|
||||||
|
|
||||||
@ -129,22 +212,47 @@ static int __init ixdp2800_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
|||||||
} else return IRQ_IXP2000_PCIB; /* Slave NIC interrupt */
|
} else return IRQ_IXP2000_PCIB; /* Slave NIC interrupt */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ixdp2800_pci_postinit(void)
|
static void __init ixdp2800_master_enable_slave(void)
|
||||||
{
|
{
|
||||||
struct pci_dev *dev;
|
volatile u32 *addr;
|
||||||
|
|
||||||
if (ixdp2x00_master_npu()) {
|
printk(KERN_INFO "IXDP2800: enabling slave NPU\n");
|
||||||
dev = pci_find_slot(1, IXDP2800_SLAVE_ENET_DEVFN);
|
|
||||||
pci_remove_bus_device(dev);
|
|
||||||
} else {
|
|
||||||
dev = pci_find_slot(1, IXDP2800_MASTER_ENET_DEVFN);
|
|
||||||
pci_remove_bus_device(dev);
|
|
||||||
|
|
||||||
|
addr = (volatile u32 *)ixp2000_pci_config_addr(0,
|
||||||
|
IXDP2X00_SLAVE_NPU_DEVFN,
|
||||||
|
PCI_COMMAND);
|
||||||
|
|
||||||
|
*addr |= PCI_COMMAND_MASTER;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __init ixdp2800_master_wait_for_slave_bus_scan(void)
|
||||||
|
{
|
||||||
|
volatile u32 *addr;
|
||||||
|
|
||||||
|
printk(KERN_INFO "IXDP2800: waiting for slave to finish bus scan\n");
|
||||||
|
|
||||||
|
addr = (volatile u32 *)ixp2000_pci_config_addr(0,
|
||||||
|
IXDP2X00_SLAVE_NPU_DEVFN,
|
||||||
|
PCI_COMMAND);
|
||||||
|
while ((*addr & PCI_COMMAND_MEMORY) == 0)
|
||||||
|
cpu_relax();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __init ixdp2800_slave_signal_bus_scan_completion(void)
|
||||||
|
{
|
||||||
|
printk(KERN_INFO "IXDP2800: bus scan done, signaling master\n");
|
||||||
|
*IXP2000_PCI_CMDSTAT |= PCI_COMMAND_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __init ixdp2800_pci_postinit(void)
|
||||||
|
{
|
||||||
|
if (!ixdp2x00_master_npu()) {
|
||||||
ixdp2x00_slave_pci_postinit();
|
ixdp2x00_slave_pci_postinit();
|
||||||
|
ixdp2800_slave_signal_bus_scan_completion();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct hw_pci ixdp2800_pci __initdata = {
|
struct __initdata hw_pci ixdp2800_pci __initdata = {
|
||||||
.nr_controllers = 1,
|
.nr_controllers = 1,
|
||||||
.setup = ixdp2800_pci_setup,
|
.setup = ixdp2800_pci_setup,
|
||||||
.preinit = ixdp2800_pci_preinit,
|
.preinit = ixdp2800_pci_preinit,
|
||||||
@ -155,8 +263,21 @@ struct hw_pci ixdp2800_pci __initdata = {
|
|||||||
|
|
||||||
int __init ixdp2800_pci_init(void)
|
int __init ixdp2800_pci_init(void)
|
||||||
{
|
{
|
||||||
if (machine_is_ixdp2800())
|
if (machine_is_ixdp2800()) {
|
||||||
|
struct pci_dev *dev;
|
||||||
|
|
||||||
pci_common_init(&ixdp2800_pci);
|
pci_common_init(&ixdp2800_pci);
|
||||||
|
if (ixdp2x00_master_npu()) {
|
||||||
|
dev = pci_find_slot(1, IXDP2800_SLAVE_ENET_DEVFN);
|
||||||
|
pci_remove_bus_device(dev);
|
||||||
|
|
||||||
|
ixdp2800_master_enable_slave();
|
||||||
|
ixdp2800_master_wait_for_slave_bus_scan();
|
||||||
|
} else {
|
||||||
|
dev = pci_find_slot(1, IXDP2800_MASTER_ENET_DEVFN);
|
||||||
|
pci_remove_bus_device(dev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ static int pci_master_aborts = 0;
|
|||||||
|
|
||||||
static int clear_master_aborts(void);
|
static int clear_master_aborts(void);
|
||||||
|
|
||||||
static u32 *
|
u32 *
|
||||||
ixp2000_pci_config_addr(unsigned int bus_nr, unsigned int devfn, int where)
|
ixp2000_pci_config_addr(unsigned int bus_nr, unsigned int devfn, int where)
|
||||||
{
|
{
|
||||||
u32 *paddress;
|
u32 *paddress;
|
||||||
@ -208,15 +208,15 @@ ixp2000_pci_preinit(void)
|
|||||||
* use our own resource space.
|
* use our own resource space.
|
||||||
*/
|
*/
|
||||||
static struct resource ixp2000_pci_mem_space = {
|
static struct resource ixp2000_pci_mem_space = {
|
||||||
.start = 0x00000000,
|
.start = 0xe0000000,
|
||||||
.end = 0xffffffff,
|
.end = 0xffffffff,
|
||||||
.flags = IORESOURCE_MEM,
|
.flags = IORESOURCE_MEM,
|
||||||
.name = "PCI Mem Space"
|
.name = "PCI Mem Space"
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct resource ixp2000_pci_io_space = {
|
static struct resource ixp2000_pci_io_space = {
|
||||||
.start = 0x00000000,
|
.start = 0x00010000,
|
||||||
.end = 0xffffffff,
|
.end = 0x0001ffff,
|
||||||
.flags = IORESOURCE_IO,
|
.flags = IORESOURCE_IO,
|
||||||
.name = "PCI I/O Space"
|
.name = "PCI I/O Space"
|
||||||
};
|
};
|
||||||
|
@ -501,15 +501,6 @@ pci_set_dma_mask(struct pci_dev *dev, u64 mask)
|
|||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
pci_dac_set_dma_mask(struct pci_dev *dev, u64 mask)
|
|
||||||
{
|
|
||||||
if (mask >= SZ_64M - 1 )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask)
|
pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask)
|
||||||
{
|
{
|
||||||
@ -520,7 +511,6 @@ pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask)
|
|||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(pci_set_dma_mask);
|
EXPORT_SYMBOL(pci_set_dma_mask);
|
||||||
EXPORT_SYMBOL(pci_dac_set_dma_mask);
|
|
||||||
EXPORT_SYMBOL(pci_set_consistent_dma_mask);
|
EXPORT_SYMBOL(pci_set_consistent_dma_mask);
|
||||||
EXPORT_SYMBOL(ixp4xx_pci_read);
|
EXPORT_SYMBOL(ixp4xx_pci_read);
|
||||||
EXPORT_SYMBOL(ixp4xx_pci_write);
|
EXPORT_SYMBOL(ixp4xx_pci_write);
|
||||||
|
@ -220,6 +220,30 @@ static struct platform_device stuart_device = {
|
|||||||
.id = 2,
|
.id = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct resource i2c_resources[] = {
|
||||||
|
{
|
||||||
|
.start = 0x40301680,
|
||||||
|
.end = 0x403016a3,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
}, {
|
||||||
|
.start = IRQ_I2C,
|
||||||
|
.end = IRQ_I2C,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device i2c_device = {
|
||||||
|
.name = "pxa2xx-i2c",
|
||||||
|
.id = 0,
|
||||||
|
.resource = i2c_resources,
|
||||||
|
.num_resources = ARRAY_SIZE(i2c_resources),
|
||||||
|
};
|
||||||
|
|
||||||
|
void __init pxa_set_i2c_info(struct i2c_pxa_platform_data *info)
|
||||||
|
{
|
||||||
|
i2c_device.dev.platform_data = info;
|
||||||
|
}
|
||||||
|
|
||||||
static struct platform_device *devices[] __initdata = {
|
static struct platform_device *devices[] __initdata = {
|
||||||
&pxamci_device,
|
&pxamci_device,
|
||||||
&udc_device,
|
&udc_device,
|
||||||
@ -227,6 +251,7 @@ static struct platform_device *devices[] __initdata = {
|
|||||||
&ffuart_device,
|
&ffuart_device,
|
||||||
&btuart_device,
|
&btuart_device,
|
||||||
&stuart_device,
|
&stuart_device,
|
||||||
|
&i2c_device,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init pxa_init(void)
|
static int __init pxa_init(void)
|
||||||
|
@ -18,6 +18,11 @@
|
|||||||
|
|
||||||
#include <asm/arch/pxa-regs.h>
|
#include <asm/arch/pxa-regs.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_PXA27x // workaround for Errata 50
|
||||||
|
#define MDREFR_KDIV 0x200a4000 // all banks
|
||||||
|
#define CCCR_SLEEP 0x00000107 // L=7 2N=2 A=0 PPDIS=0 CPDIS=0
|
||||||
|
#endif
|
||||||
|
|
||||||
.text
|
.text
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -28,7 +33,9 @@
|
|||||||
|
|
||||||
ENTRY(pxa_cpu_suspend)
|
ENTRY(pxa_cpu_suspend)
|
||||||
|
|
||||||
|
#ifndef CONFIG_IWMMXT
|
||||||
mra r2, r3, acc0
|
mra r2, r3, acc0
|
||||||
|
#endif
|
||||||
stmfd sp!, {r2 - r12, lr} @ save registers on stack
|
stmfd sp!, {r2 - r12, lr} @ save registers on stack
|
||||||
|
|
||||||
@ get coprocessor registers
|
@ get coprocessor registers
|
||||||
@ -61,14 +68,23 @@ ENTRY(pxa_cpu_suspend)
|
|||||||
@ prepare value for sleep mode
|
@ prepare value for sleep mode
|
||||||
mov r1, #3 @ sleep mode
|
mov r1, #3 @ sleep mode
|
||||||
|
|
||||||
@ prepare to put SDRAM into self-refresh manually
|
|
||||||
ldr r4, =MDREFR
|
|
||||||
ldr r5, [r4]
|
|
||||||
orr r5, r5, #MDREFR_SLFRSH
|
|
||||||
|
|
||||||
@ prepare pointer to physical address 0 (virtual mapping in generic.c)
|
@ prepare pointer to physical address 0 (virtual mapping in generic.c)
|
||||||
mov r2, #UNCACHED_PHYS_0
|
mov r2, #UNCACHED_PHYS_0
|
||||||
|
|
||||||
|
@ prepare SDRAM refresh settings
|
||||||
|
ldr r4, =MDREFR
|
||||||
|
ldr r5, [r4]
|
||||||
|
|
||||||
|
@ enable SDRAM self-refresh mode
|
||||||
|
orr r5, r5, #MDREFR_SLFRSH
|
||||||
|
|
||||||
|
#ifdef CONFIG_PXA27x
|
||||||
|
@ set SDCLKx divide-by-2 bits (this is part of a workaround for Errata 50)
|
||||||
|
ldr r6, =MDREFR_KDIV
|
||||||
|
orr r5, r5, r6
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_PXA25x
|
||||||
@ Intel PXA255 Specification Update notes problems
|
@ Intel PXA255 Specification Update notes problems
|
||||||
@ about suspending with PXBus operating above 133MHz
|
@ about suspending with PXBus operating above 133MHz
|
||||||
@ (see Errata 31, GPIO output signals, ... unpredictable in sleep
|
@ (see Errata 31, GPIO output signals, ... unpredictable in sleep
|
||||||
@ -100,6 +116,18 @@ ENTRY(pxa_cpu_suspend)
|
|||||||
mov r0, #0
|
mov r0, #0
|
||||||
mcr p14, 0, r0, c6, c0, 0
|
mcr p14, 0, r0, c6, c0, 0
|
||||||
orr r0, r0, #2 @ initiate change bit
|
orr r0, r0, #2 @ initiate change bit
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_PXA27x
|
||||||
|
@ Intel PXA270 Specification Update notes problems sleeping
|
||||||
|
@ with core operating above 91 MHz
|
||||||
|
@ (see Errata 50, ...processor does not exit from sleep...)
|
||||||
|
|
||||||
|
ldr r6, =CCCR
|
||||||
|
ldr r8, [r6] @ keep original value for resume
|
||||||
|
|
||||||
|
ldr r7, =CCCR_SLEEP @ prepare CCCR sleep value
|
||||||
|
mov r0, #0x2 @ prepare value for CLKCFG
|
||||||
|
#endif
|
||||||
|
|
||||||
@ align execution to a cache line
|
@ align execution to a cache line
|
||||||
b 1f
|
b 1f
|
||||||
@ -111,6 +139,7 @@ ENTRY(pxa_cpu_suspend)
|
|||||||
@ All needed values are now in registers.
|
@ All needed values are now in registers.
|
||||||
@ These last instructions should be in cache
|
@ These last instructions should be in cache
|
||||||
|
|
||||||
|
#if defined(CONFIG_PXA25x) || defined(CONFIG_PXA27x)
|
||||||
@ initiate the frequency change...
|
@ initiate the frequency change...
|
||||||
str r7, [r6]
|
str r7, [r6]
|
||||||
mcr p14, 0, r0, c6, c0, 0
|
mcr p14, 0, r0, c6, c0, 0
|
||||||
@ -118,14 +147,27 @@ ENTRY(pxa_cpu_suspend)
|
|||||||
@ restore the original cpu speed value for resume
|
@ restore the original cpu speed value for resume
|
||||||
str r8, [r6]
|
str r8, [r6]
|
||||||
|
|
||||||
@ put SDRAM into self-refresh
|
@ need 6 13-MHz cycles before changing PWRMODE
|
||||||
str r5, [r4]
|
@ just set frequency to 91-MHz... 6*91/13 = 42
|
||||||
|
|
||||||
|
mov r0, #42
|
||||||
|
10: subs r0, r0, #1
|
||||||
|
bne 10b
|
||||||
|
#endif
|
||||||
|
|
||||||
|
@ Do not reorder...
|
||||||
|
@ Intel PXA270 Specification Update notes problems performing
|
||||||
|
@ external accesses after SDRAM is put in self-refresh mode
|
||||||
|
@ (see Errata 39 ...hangs when entering self-refresh mode)
|
||||||
|
|
||||||
@ force address lines low by reading at physical address 0
|
@ force address lines low by reading at physical address 0
|
||||||
ldr r3, [r2]
|
ldr r3, [r2]
|
||||||
|
|
||||||
|
@ put SDRAM into self-refresh
|
||||||
|
str r5, [r4]
|
||||||
|
|
||||||
@ enter sleep mode
|
@ enter sleep mode
|
||||||
mcr p14, 0, r1, c7, c0, 0
|
mcr p14, 0, r1, c7, c0, 0 @ PWRMODE
|
||||||
|
|
||||||
20: b 20b @ loop waiting for sleep
|
20: b 20b @ loop waiting for sleep
|
||||||
|
|
||||||
@ -188,7 +230,9 @@ resume_after_mmu:
|
|||||||
bl cpu_xscale_proc_init
|
bl cpu_xscale_proc_init
|
||||||
#endif
|
#endif
|
||||||
ldmfd sp!, {r2, r3}
|
ldmfd sp!, {r2, r3}
|
||||||
|
#ifndef CONFIG_IWMMXT
|
||||||
mar acc0, r2, r3
|
mar acc0, r2, r3
|
||||||
|
#endif
|
||||||
ldmfd sp!, {r4 - r12, pc} @ return to caller
|
ldmfd sp!, {r4 - r12, pc} @ return to caller
|
||||||
|
|
||||||
|
|
||||||
|
@ -409,3 +409,24 @@ config CPU_BPREDICT_DISABLE
|
|||||||
depends on CPU_ARM1020
|
depends on CPU_ARM1020
|
||||||
help
|
help
|
||||||
Say Y here to disable branch prediction. If unsure, say N.
|
Say Y here to disable branch prediction. If unsure, say N.
|
||||||
|
|
||||||
|
config TLS_REG_EMUL
|
||||||
|
bool
|
||||||
|
default y if (SMP || CPU_32v6) && (CPU_32v5 || CPU_32v4 || CPU_32v3)
|
||||||
|
help
|
||||||
|
We might be running on an ARMv6+ processor which should have the TLS
|
||||||
|
register but for some reason we can't use it, or maybe an SMP system
|
||||||
|
using a pre-ARMv6 processor (there are apparently a few prototypes
|
||||||
|
like that in existence) and therefore access to that register must
|
||||||
|
be emulated.
|
||||||
|
|
||||||
|
config HAS_TLS_REG
|
||||||
|
bool
|
||||||
|
depends on CPU_32v6
|
||||||
|
default y if !TLS_REG_EMUL
|
||||||
|
help
|
||||||
|
This selects support for the CP15 thread register.
|
||||||
|
It is defined to be available on ARMv6 or later. If a particular
|
||||||
|
ARMv6 or later CPU doesn't support it then it must omc;ide "select
|
||||||
|
TLS_REG_EMUL" along with its other caracteristics.
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <asm/assembler.h>
|
#include <asm/assembler.h>
|
||||||
|
#include "abort-macro.S"
|
||||||
/*
|
/*
|
||||||
* Function: v6_early_abort
|
* Function: v6_early_abort
|
||||||
*
|
*
|
||||||
@ -13,11 +14,26 @@
|
|||||||
* : sp = pointer to registers
|
* : sp = pointer to registers
|
||||||
*
|
*
|
||||||
* Purpose : obtain information about current aborted instruction.
|
* Purpose : obtain information about current aborted instruction.
|
||||||
|
* Note: we read user space. This means we might cause a data
|
||||||
|
* abort here if the I-TLB and D-TLB aren't seeing the same
|
||||||
|
* picture. Unfortunately, this does happen. We live with it.
|
||||||
*/
|
*/
|
||||||
.align 5
|
.align 5
|
||||||
ENTRY(v6_early_abort)
|
ENTRY(v6_early_abort)
|
||||||
mrc p15, 0, r1, c5, c0, 0 @ get FSR
|
mrc p15, 0, r1, c5, c0, 0 @ get FSR
|
||||||
mrc p15, 0, r0, c6, c0, 0 @ get FAR
|
mrc p15, 0, r0, c6, c0, 0 @ get FAR
|
||||||
|
/*
|
||||||
|
* Faulty SWP instruction on 1136 doesn't set bit 11 in DFSR.
|
||||||
|
* The test below covers all the write situations, including Java bytecodes
|
||||||
|
*/
|
||||||
|
bic r1, r1, #1 << 11 | 1 << 10 @ clear bits 11 and 10 of FSR
|
||||||
|
tst r3, #PSR_J_BIT @ Java?
|
||||||
|
movne pc, lr
|
||||||
|
do_thumb_abort
|
||||||
|
ldreq r3, [r2] @ read aborted ARM instruction
|
||||||
|
do_ldrd_abort
|
||||||
|
tst r3, #1 << 20 @ L = 0 -> write
|
||||||
|
orreq r1, r1, #1 << 11 @ yes.
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
|
||||||
|
|
||||||
|
@ -411,9 +411,10 @@ static void __init build_mem_type_table(void)
|
|||||||
mem_types[MT_MEMORY].prot_sect &= ~PMD_BIT4;
|
mem_types[MT_MEMORY].prot_sect &= ~PMD_BIT4;
|
||||||
mem_types[MT_ROM].prot_sect &= ~PMD_BIT4;
|
mem_types[MT_ROM].prot_sect &= ~PMD_BIT4;
|
||||||
/*
|
/*
|
||||||
* Mark cache clean areas read only from SVC mode
|
* Mark cache clean areas and XIP ROM read only
|
||||||
* and no access from userspace.
|
* from SVC mode and no access from userspace.
|
||||||
*/
|
*/
|
||||||
|
mem_types[MT_ROM].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE;
|
||||||
mem_types[MT_MINICLEAN].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE;
|
mem_types[MT_MINICLEAN].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE;
|
||||||
mem_types[MT_CACHECLEAN].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE;
|
mem_types[MT_CACHECLEAN].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE;
|
||||||
}
|
}
|
||||||
|
@ -89,6 +89,10 @@ config PAGESIZE_16
|
|||||||
machine with 4MB of memory.
|
machine with 4MB of memory.
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
|
config ISA_DMA_API
|
||||||
|
bool
|
||||||
|
default y
|
||||||
|
|
||||||
menu "General setup"
|
menu "General setup"
|
||||||
|
|
||||||
# Compressed boot loader in ROM. Yes, we really want to ask about
|
# Compressed boot loader in ROM. Yes, we really want to ask about
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
@ -591,7 +592,7 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat
|
|||||||
case PTRACE_SYSCALL:
|
case PTRACE_SYSCALL:
|
||||||
case PTRACE_CONT:
|
case PTRACE_CONT:
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
if (request == PTRACE_SYSCALL)
|
if (request == PTRACE_SYSCALL)
|
||||||
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
@ -626,7 +627,7 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat
|
|||||||
*/
|
*/
|
||||||
case PTRACE_SINGLESTEP:
|
case PTRACE_SINGLESTEP:
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
child->ptrace |= PT_SINGLESTEP;
|
child->ptrace |= PT_SINGLESTEP;
|
||||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
|
@ -92,8 +92,7 @@ static unsigned long __get_small_page(int priority, struct order *order)
|
|||||||
page = list_entry(order->queue.next, struct page, lru);
|
page = list_entry(order->queue.next, struct page, lru);
|
||||||
again:
|
again:
|
||||||
#ifdef PEDANTIC
|
#ifdef PEDANTIC
|
||||||
if (USED_MAP(page) & ~order->all_used)
|
BUG_ON(USED_MAP(page) & ~order->all_used);
|
||||||
PAGE_BUG(page);
|
|
||||||
#endif
|
#endif
|
||||||
offset = ffz(USED_MAP(page));
|
offset = ffz(USED_MAP(page));
|
||||||
SET_USED(page, offset);
|
SET_USED(page, offset);
|
||||||
@ -141,8 +140,7 @@ static void __free_small_page(unsigned long spage, struct order *order)
|
|||||||
goto non_small;
|
goto non_small;
|
||||||
|
|
||||||
#ifdef PEDANTIC
|
#ifdef PEDANTIC
|
||||||
if (USED_MAP(page) & ~order->all_used)
|
BUG_ON(USED_MAP(page) & ~order->all_used);
|
||||||
PAGE_BUG(page);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
spage = spage >> order->shift;
|
spage = spage >> order->shift;
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
@ -184,7 +185,7 @@ sys_ptrace(long request, long pid, long addr, long data)
|
|||||||
case PTRACE_CONT:
|
case PTRACE_CONT:
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
|
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (request == PTRACE_SYSCALL) {
|
if (request == PTRACE_SYSCALL) {
|
||||||
@ -219,7 +220,7 @@ sys_ptrace(long request, long pid, long addr, long data)
|
|||||||
case PTRACE_SINGLESTEP:
|
case PTRACE_SINGLESTEP:
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
|
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/config.h>
|
#include <linux/config.h>
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
@ -239,7 +240,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
|
|||||||
case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
|
case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
|
||||||
case PTRACE_CONT: /* restart after signal. */
|
case PTRACE_CONT: /* restart after signal. */
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
if (request == PTRACE_SYSCALL)
|
if (request == PTRACE_SYSCALL)
|
||||||
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
@ -267,7 +268,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
|
|||||||
|
|
||||||
case PTRACE_SINGLESTEP: /* set the trap flag. */
|
case PTRACE_SINGLESTEP: /* set the trap flag. */
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
ptrace_enable(child);
|
ptrace_enable(child);
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/config.h>
|
#include <linux/config.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
@ -171,7 +172,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
|
|||||||
case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
|
case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
|
||||||
case PTRACE_CONT: { /* restart after signal. */
|
case PTRACE_CONT: { /* restart after signal. */
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data >= _NSIG)
|
if (!valid_signal(data))
|
||||||
break ;
|
break ;
|
||||||
if (request == PTRACE_SYSCALL)
|
if (request == PTRACE_SYSCALL)
|
||||||
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
@ -202,7 +203,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
|
|||||||
|
|
||||||
case PTRACE_SINGLESTEP: { /* set the trap flag. */
|
case PTRACE_SINGLESTEP: { /* set the trap flag. */
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
child->exit_code = data;
|
child->exit_code = data;
|
||||||
|
@ -183,7 +183,7 @@ config M386
|
|||||||
- "Winchip-C6" for original IDT Winchip.
|
- "Winchip-C6" for original IDT Winchip.
|
||||||
- "Winchip-2" for IDT Winchip 2.
|
- "Winchip-2" for IDT Winchip 2.
|
||||||
- "Winchip-2A" for IDT Winchips with 3dNow! capabilities.
|
- "Winchip-2A" for IDT Winchips with 3dNow! capabilities.
|
||||||
- "MediaGX/Geode" for Cyrix MediaGX aka Geode.
|
- "GeodeGX1" for Geode GX1 (Cyrix MediaGX).
|
||||||
- "CyrixIII/VIA C3" for VIA Cyrix III or VIA C3.
|
- "CyrixIII/VIA C3" for VIA Cyrix III or VIA C3.
|
||||||
- "VIA C3-2 for VIA C3-2 "Nehemiah" (model 9 and above).
|
- "VIA C3-2 for VIA C3-2 "Nehemiah" (model 9 and above).
|
||||||
|
|
||||||
@ -311,12 +311,10 @@ config MWINCHIP3D
|
|||||||
stores for this CPU, which can increase performance of some
|
stores for this CPU, which can increase performance of some
|
||||||
operations.
|
operations.
|
||||||
|
|
||||||
config MGEODE
|
config MGEODEGX1
|
||||||
bool "MediaGX/Geode"
|
bool "GeodeGX1"
|
||||||
help
|
help
|
||||||
Select this for a Cyrix MediaGX aka Geode chip. Linux and GCC
|
Select this for a Geode GX1 (Cyrix MediaGX) chip.
|
||||||
treat this chip as a 586TSC with some extended instructions
|
|
||||||
and alignment reqirements.
|
|
||||||
|
|
||||||
config MCYRIXIII
|
config MCYRIXIII
|
||||||
bool "CyrixIII/VIA-C3"
|
bool "CyrixIII/VIA-C3"
|
||||||
@ -368,7 +366,7 @@ config X86_L1_CACHE_SHIFT
|
|||||||
int
|
int
|
||||||
default "7" if MPENTIUM4 || X86_GENERIC
|
default "7" if MPENTIUM4 || X86_GENERIC
|
||||||
default "4" if X86_ELAN || M486 || M386
|
default "4" if X86_ELAN || M486 || M386
|
||||||
default "5" if MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCRUSOE || MEFFICEON || MCYRIXIII || MK6 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || M586 || MVIAC3_2 || MGEODE
|
default "5" if MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCRUSOE || MEFFICEON || MCYRIXIII || MK6 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || M586 || MVIAC3_2 || MGEODEGX1
|
||||||
default "6" if MK7 || MK8 || MPENTIUMM
|
default "6" if MK7 || MK8 || MPENTIUMM
|
||||||
|
|
||||||
config RWSEM_GENERIC_SPINLOCK
|
config RWSEM_GENERIC_SPINLOCK
|
||||||
@ -387,7 +385,7 @@ config GENERIC_CALIBRATE_DELAY
|
|||||||
|
|
||||||
config X86_PPRO_FENCE
|
config X86_PPRO_FENCE
|
||||||
bool
|
bool
|
||||||
depends on M686 || M586MMX || M586TSC || M586 || M486 || M386 || MGEODE
|
depends on M686 || M586MMX || M586TSC || M586 || M486 || M386 || MGEODEGX1
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config X86_F00F_BUG
|
config X86_F00F_BUG
|
||||||
@ -417,7 +415,7 @@ config X86_POPAD_OK
|
|||||||
|
|
||||||
config X86_ALIGNMENT_16
|
config X86_ALIGNMENT_16
|
||||||
bool
|
bool
|
||||||
depends on MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCYRIXIII || X86_ELAN || MK6 || M586MMX || M586TSC || M586 || M486 || MVIAC3_2 || MGEODE
|
depends on MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCYRIXIII || X86_ELAN || MK6 || M586MMX || M586TSC || M586 || M486 || MVIAC3_2 || MGEODEGX1
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config X86_GOOD_APIC
|
config X86_GOOD_APIC
|
||||||
@ -442,7 +440,7 @@ config X86_USE_3DNOW
|
|||||||
|
|
||||||
config X86_OOSTORE
|
config X86_OOSTORE
|
||||||
bool
|
bool
|
||||||
depends on (MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MGEODE) && MTRR
|
depends on (MWINCHIP3D || MWINCHIP2 || MWINCHIPC6) && MTRR
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config HPET_TIMER
|
config HPET_TIMER
|
||||||
@ -578,7 +576,7 @@ config X86_VISWS_APIC
|
|||||||
|
|
||||||
config X86_TSC
|
config X86_TSC
|
||||||
bool
|
bool
|
||||||
depends on (MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MGEODE) && !X86_NUMAQ
|
depends on (MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MGEODEGX1) && !X86_NUMAQ
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config X86_MCE
|
config X86_MCE
|
||||||
@ -653,6 +651,24 @@ config I8K
|
|||||||
Say Y if you intend to run this kernel on a Dell Inspiron 8000.
|
Say Y if you intend to run this kernel on a Dell Inspiron 8000.
|
||||||
Say N otherwise.
|
Say N otherwise.
|
||||||
|
|
||||||
|
config X86_REBOOTFIXUPS
|
||||||
|
bool "Enable X86 board specific fixups for reboot"
|
||||||
|
depends on X86
|
||||||
|
default n
|
||||||
|
---help---
|
||||||
|
This enables chipset and/or board specific fixups to be done
|
||||||
|
in order to get reboot to work correctly. This is only needed on
|
||||||
|
some combinations of hardware and BIOS. The symptom, for which
|
||||||
|
this config is intended, is when reboot ends with a stalled/hung
|
||||||
|
system.
|
||||||
|
|
||||||
|
Currently, the only fixup is for the Geode GX1/CS5530A/TROM2.1.
|
||||||
|
combination.
|
||||||
|
|
||||||
|
Say Y if you want to enable the fixup. Currently, it's safe to
|
||||||
|
enable this option even if you don't need it.
|
||||||
|
Say N otherwise.
|
||||||
|
|
||||||
config MICROCODE
|
config MICROCODE
|
||||||
tristate "/dev/cpu/microcode - Intel IA32 CPU microcode support"
|
tristate "/dev/cpu/microcode - Intel IA32 CPU microcode support"
|
||||||
---help---
|
---help---
|
||||||
@ -1155,6 +1171,10 @@ source "drivers/pci/pcie/Kconfig"
|
|||||||
|
|
||||||
source "drivers/pci/Kconfig"
|
source "drivers/pci/Kconfig"
|
||||||
|
|
||||||
|
config ISA_DMA_API
|
||||||
|
bool
|
||||||
|
default y
|
||||||
|
|
||||||
config ISA
|
config ISA
|
||||||
bool "ISA support"
|
bool "ISA support"
|
||||||
depends on !(X86_VOYAGER || X86_VISWS)
|
depends on !(X86_VOYAGER || X86_VISWS)
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
# 19990713 Artur Skawina <skawina@geocities.com>
|
# 19990713 Artur Skawina <skawina@geocities.com>
|
||||||
# Added '-march' and '-mpreferred-stack-boundary' support
|
# Added '-march' and '-mpreferred-stack-boundary' support
|
||||||
#
|
#
|
||||||
# Kianusch Sayah Karadji <kianusch@sk-tech.net>
|
# 20050320 Kianusch Sayah Karadji <kianusch@sk-tech.net>
|
||||||
# Added support for GEODE CPU
|
# Added support for GEODE CPU
|
||||||
|
|
||||||
LDFLAGS := -m elf_i386
|
LDFLAGS := -m elf_i386
|
||||||
@ -54,8 +54,8 @@ cflags-$(CONFIG_MVIAC3_2) += $(call cc-option,-march=c3-2,-march=i686)
|
|||||||
# AMD Elan support
|
# AMD Elan support
|
||||||
cflags-$(CONFIG_X86_ELAN) += -march=i486
|
cflags-$(CONFIG_X86_ELAN) += -march=i486
|
||||||
|
|
||||||
# MediaGX aka Geode support
|
# Geode GX1 support
|
||||||
cflags-$(CONFIG_MGEODE) += $(call cc-option,-march=pentium-mmx,-march=i586)
|
cflags-$(CONFIG_MGEODEGX1) += $(call cc-option,-march=pentium-mmx,-march=i486)
|
||||||
|
|
||||||
# -mregparm=3 works ok on gcc-3.0 and later
|
# -mregparm=3 works ok on gcc-3.0 and later
|
||||||
#
|
#
|
||||||
@ -123,7 +123,7 @@ AFLAGS += $(mflags-y)
|
|||||||
boot := arch/i386/boot
|
boot := arch/i386/boot
|
||||||
|
|
||||||
.PHONY: zImage bzImage compressed zlilo bzlilo \
|
.PHONY: zImage bzImage compressed zlilo bzlilo \
|
||||||
zdisk bzdisk fdimage fdimage144 fdimage288 install
|
zdisk bzdisk fdimage fdimage144 fdimage288 install kernel_install
|
||||||
|
|
||||||
all: bzImage
|
all: bzImage
|
||||||
|
|
||||||
@ -145,8 +145,9 @@ zdisk bzdisk: vmlinux
|
|||||||
fdimage fdimage144 fdimage288: vmlinux
|
fdimage fdimage144 fdimage288: vmlinux
|
||||||
$(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) $@
|
$(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) $@
|
||||||
|
|
||||||
install:
|
install: vmlinux
|
||||||
$(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) $@
|
install kernel_install:
|
||||||
|
$(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) install
|
||||||
|
|
||||||
prepare: include/asm-$(ARCH)/asm_offsets.h
|
prepare: include/asm-$(ARCH)/asm_offsets.h
|
||||||
CLEAN_FILES += include/asm-$(ARCH)/asm_offsets.h
|
CLEAN_FILES += include/asm-$(ARCH)/asm_offsets.h
|
||||||
|
@ -83,7 +83,7 @@ bugger_off_msg:
|
|||||||
.ascii "\n"
|
.ascii "\n"
|
||||||
.ascii "Remove disk and press any key to reboot . . .\r\n"
|
.ascii "Remove disk and press any key to reboot . . .\r\n"
|
||||||
.byte 0
|
.byte 0
|
||||||
|
|
||||||
|
|
||||||
# Kernel attributes; used by setup
|
# Kernel attributes; used by setup
|
||||||
|
|
||||||
|
@ -12,7 +12,6 @@
|
|||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
#include <linux/tty.h>
|
#include <linux/tty.h>
|
||||||
#include <video/edid.h>
|
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -164,7 +164,7 @@ ramdisk_max: .long (-__PAGE_OFFSET-(512 << 20)-1) & 0x7fffffff
|
|||||||
trampoline: call start_of_setup
|
trampoline: call start_of_setup
|
||||||
.align 16
|
.align 16
|
||||||
# The offset at this point is 0x240
|
# The offset at this point is 0x240
|
||||||
.space (0x7ff-0x240+1) # E820 & EDD space (ending at 0x7ff)
|
.space (0xeff-0x240+1) # E820 & EDD space (ending at 0xeff)
|
||||||
# End of setup header #####################################################
|
# End of setup header #####################################################
|
||||||
|
|
||||||
start_of_setup:
|
start_of_setup:
|
||||||
@ -333,9 +333,9 @@ jmpe820:
|
|||||||
# sizeof(e820rec).
|
# sizeof(e820rec).
|
||||||
#
|
#
|
||||||
good820:
|
good820:
|
||||||
movb (E820NR), %al # up to 32 entries
|
movb (E820NR), %al # up to 128 entries
|
||||||
cmpb $E820MAX, %al
|
cmpb $E820MAX, %al
|
||||||
jnl bail820
|
jae bail820
|
||||||
|
|
||||||
incb (E820NR)
|
incb (E820NR)
|
||||||
movw %di, %ax
|
movw %di, %ax
|
||||||
|
@ -1924,36 +1924,36 @@ skip10: movb %ah, %al
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
store_edid:
|
store_edid:
|
||||||
pushw %es # just save all registers
|
pushw %es # just save all registers
|
||||||
pushw %ax
|
pushw %ax
|
||||||
pushw %bx
|
pushw %bx
|
||||||
pushw %cx
|
pushw %cx
|
||||||
pushw %dx
|
pushw %dx
|
||||||
pushw %di
|
pushw %di
|
||||||
|
|
||||||
pushw %fs
|
pushw %fs
|
||||||
popw %es
|
popw %es
|
||||||
|
|
||||||
movl $0x13131313, %eax # memset block with 0x13
|
movl $0x13131313, %eax # memset block with 0x13
|
||||||
movw $32, %cx
|
movw $32, %cx
|
||||||
movw $0x140, %di
|
movw $0x140, %di
|
||||||
cld
|
cld
|
||||||
rep
|
rep
|
||||||
stosl
|
stosl
|
||||||
|
|
||||||
movw $0x4f15, %ax # do VBE/DDC
|
movw $0x4f15, %ax # do VBE/DDC
|
||||||
movw $0x01, %bx
|
movw $0x01, %bx
|
||||||
movw $0x00, %cx
|
movw $0x00, %cx
|
||||||
movw $0x01, %dx
|
movw $0x01, %dx
|
||||||
movw $0x140, %di
|
movw $0x140, %di
|
||||||
int $0x10
|
int $0x10
|
||||||
|
|
||||||
popw %di # restore all registers
|
popw %di # restore all registers
|
||||||
popw %dx
|
popw %dx
|
||||||
popw %cx
|
popw %cx
|
||||||
popw %bx
|
popw %bx
|
||||||
popw %ax
|
popw %ax
|
||||||
popw %es
|
popw %es
|
||||||
ret
|
ret
|
||||||
|
|
||||||
# VIDEO_SELECT-only variables
|
# VIDEO_SELECT-only variables
|
||||||
|
@ -23,6 +23,7 @@ obj-$(CONFIG_X86_TRAMPOLINE) += trampoline.o
|
|||||||
obj-$(CONFIG_X86_MPPARSE) += mpparse.o
|
obj-$(CONFIG_X86_MPPARSE) += mpparse.o
|
||||||
obj-$(CONFIG_X86_LOCAL_APIC) += apic.o nmi.o
|
obj-$(CONFIG_X86_LOCAL_APIC) += apic.o nmi.o
|
||||||
obj-$(CONFIG_X86_IO_APIC) += io_apic.o
|
obj-$(CONFIG_X86_IO_APIC) += io_apic.o
|
||||||
|
obj-$(CONFIG_X86_REBOOTFIXUPS) += reboot_fixups.o
|
||||||
obj-$(CONFIG_X86_NUMAQ) += numaq.o
|
obj-$(CONFIG_X86_NUMAQ) += numaq.o
|
||||||
obj-$(CONFIG_X86_SUMMIT_NUMA) += summit.o
|
obj-$(CONFIG_X86_SUMMIT_NUMA) += summit.o
|
||||||
obj-$(CONFIG_KPROBES) += kprobes.o
|
obj-$(CONFIG_KPROBES) += kprobes.o
|
||||||
|
@ -650,7 +650,7 @@ acpi_find_rsdp (void)
|
|||||||
*/
|
*/
|
||||||
rsdp_phys = acpi_scan_rsdp (0, 0x400);
|
rsdp_phys = acpi_scan_rsdp (0, 0x400);
|
||||||
if (!rsdp_phys)
|
if (!rsdp_phys)
|
||||||
rsdp_phys = acpi_scan_rsdp (0xE0000, 0xFFFFF);
|
rsdp_phys = acpi_scan_rsdp (0xE0000, 0x20000);
|
||||||
|
|
||||||
return rsdp_phys;
|
return rsdp_phys;
|
||||||
}
|
}
|
||||||
|
@ -1265,8 +1265,6 @@ int __init APIC_init_uniprocessor (void)
|
|||||||
|
|
||||||
setup_local_APIC();
|
setup_local_APIC();
|
||||||
|
|
||||||
if (nmi_watchdog == NMI_LOCAL_APIC)
|
|
||||||
check_nmi_watchdog();
|
|
||||||
#ifdef CONFIG_X86_IO_APIC
|
#ifdef CONFIG_X86_IO_APIC
|
||||||
if (smp_found_config)
|
if (smp_found_config)
|
||||||
if (!skip_ioapic_setup && nr_ioapics)
|
if (!skip_ioapic_setup && nr_ioapics)
|
||||||
|
@ -24,7 +24,7 @@ __asm__(".align 4\nvide: ret");
|
|||||||
|
|
||||||
static void __init init_amd(struct cpuinfo_x86 *c)
|
static void __init init_amd(struct cpuinfo_x86 *c)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_X86_SMP
|
||||||
int cpu = c == &boot_cpu_data ? 0 : c - cpu_data;
|
int cpu = c == &boot_cpu_data ? 0 : c - cpu_data;
|
||||||
#endif
|
#endif
|
||||||
u32 l, h;
|
u32 l, h;
|
||||||
@ -198,7 +198,7 @@ static void __init init_amd(struct cpuinfo_x86 *c)
|
|||||||
c->x86_num_cores = 1;
|
c->x86_num_cores = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_X86_SMP
|
||||||
/*
|
/*
|
||||||
* On a AMD dual core setup the lower bits of the APIC id
|
* On a AMD dual core setup the lower bits of the APIC id
|
||||||
* distingush the cores. Assumes number of cores is a power
|
* distingush the cores. Assumes number of cores is a power
|
||||||
|
@ -218,12 +218,12 @@ typedef struct {
|
|||||||
mtrr_type type;
|
mtrr_type type;
|
||||||
} arr_state_t;
|
} arr_state_t;
|
||||||
|
|
||||||
static arr_state_t arr_state[8] __initdata = {
|
static arr_state_t arr_state[8] __devinitdata = {
|
||||||
{0UL, 0UL, 0UL}, {0UL, 0UL, 0UL}, {0UL, 0UL, 0UL}, {0UL, 0UL, 0UL},
|
{0UL, 0UL, 0UL}, {0UL, 0UL, 0UL}, {0UL, 0UL, 0UL}, {0UL, 0UL, 0UL},
|
||||||
{0UL, 0UL, 0UL}, {0UL, 0UL, 0UL}, {0UL, 0UL, 0UL}, {0UL, 0UL, 0UL}
|
{0UL, 0UL, 0UL}, {0UL, 0UL, 0UL}, {0UL, 0UL, 0UL}, {0UL, 0UL, 0UL}
|
||||||
};
|
};
|
||||||
|
|
||||||
static unsigned char ccr_state[7] __initdata = { 0, 0, 0, 0, 0, 0, 0 };
|
static unsigned char ccr_state[7] __devinitdata = { 0, 0, 0, 0, 0, 0, 0 };
|
||||||
|
|
||||||
static void cyrix_set_all(void)
|
static void cyrix_set_all(void)
|
||||||
{
|
{
|
||||||
|
@ -124,8 +124,8 @@ int generic_get_free_region(unsigned long base, unsigned long size)
|
|||||||
return -ENOSPC;
|
return -ENOSPC;
|
||||||
}
|
}
|
||||||
|
|
||||||
void generic_get_mtrr(unsigned int reg, unsigned long *base,
|
static void generic_get_mtrr(unsigned int reg, unsigned long *base,
|
||||||
unsigned int *size, mtrr_type * type)
|
unsigned int *size, mtrr_type * type)
|
||||||
{
|
{
|
||||||
unsigned int mask_lo, mask_hi, base_lo, base_hi;
|
unsigned int mask_lo, mask_hi, base_lo, base_hi;
|
||||||
|
|
||||||
|
@ -72,17 +72,21 @@ void set_mtrr_ops(struct mtrr_ops * ops)
|
|||||||
static int have_wrcomb(void)
|
static int have_wrcomb(void)
|
||||||
{
|
{
|
||||||
struct pci_dev *dev;
|
struct pci_dev *dev;
|
||||||
|
u8 rev;
|
||||||
|
|
||||||
if ((dev = pci_get_class(PCI_CLASS_BRIDGE_HOST << 8, NULL)) != NULL) {
|
if ((dev = pci_get_class(PCI_CLASS_BRIDGE_HOST << 8, NULL)) != NULL) {
|
||||||
/* ServerWorks LE chipsets have problems with write-combining
|
/* ServerWorks LE chipsets < rev 6 have problems with write-combining
|
||||||
Don't allow it and leave room for other chipsets to be tagged */
|
Don't allow it and leave room for other chipsets to be tagged */
|
||||||
if (dev->vendor == PCI_VENDOR_ID_SERVERWORKS &&
|
if (dev->vendor == PCI_VENDOR_ID_SERVERWORKS &&
|
||||||
dev->device == PCI_DEVICE_ID_SERVERWORKS_LE) {
|
dev->device == PCI_DEVICE_ID_SERVERWORKS_LE) {
|
||||||
printk(KERN_INFO "mtrr: Serverworks LE detected. Write-combining disabled.\n");
|
pci_read_config_byte(dev, PCI_CLASS_REVISION, &rev);
|
||||||
pci_dev_put(dev);
|
if (rev <= 5) {
|
||||||
return 0;
|
printk(KERN_INFO "mtrr: Serverworks LE rev < 6 detected. Write-combining disabled.\n");
|
||||||
|
pci_dev_put(dev);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* Intel 450NX errata # 23. Non ascending cachline evictions to
|
/* Intel 450NX errata # 23. Non ascending cacheline evictions to
|
||||||
write combining memory may resulting in data corruption */
|
write combining memory may resulting in data corruption */
|
||||||
if (dev->vendor == PCI_VENDOR_ID_INTEL &&
|
if (dev->vendor == PCI_VENDOR_ID_INTEL &&
|
||||||
dev->device == PCI_DEVICE_ID_INTEL_82451NX) {
|
dev->device == PCI_DEVICE_ID_INTEL_82451NX) {
|
||||||
|
@ -25,7 +25,7 @@ static int show_cpuinfo(struct seq_file *m, void *v)
|
|||||||
"fxsr", "sse", "sse2", "ss", "ht", "tm", "ia64", "pbe",
|
"fxsr", "sse", "sse2", "ss", "ht", "tm", "ia64", "pbe",
|
||||||
|
|
||||||
/* AMD-defined */
|
/* AMD-defined */
|
||||||
"pni", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
NULL, NULL, NULL, "syscall", NULL, NULL, NULL, NULL,
|
NULL, NULL, NULL, "syscall", NULL, NULL, NULL, NULL,
|
||||||
NULL, NULL, NULL, "mp", "nx", NULL, "mmxext", NULL,
|
NULL, NULL, NULL, "mp", "nx", NULL, "mmxext", NULL,
|
||||||
NULL, "fxsr_opt", NULL, NULL, NULL, "lm", "3dnowext", "3dnow",
|
NULL, "fxsr_opt", NULL, NULL, NULL, "lm", "3dnowext", "3dnow",
|
||||||
|
@ -260,11 +260,9 @@ restore_nocheck:
|
|||||||
.section .fixup,"ax"
|
.section .fixup,"ax"
|
||||||
iret_exc:
|
iret_exc:
|
||||||
sti
|
sti
|
||||||
movl $__USER_DS, %edx
|
pushl $0 # no error code
|
||||||
movl %edx, %ds
|
pushl $do_iret_error
|
||||||
movl %edx, %es
|
jmp error_code
|
||||||
movl $11,%eax
|
|
||||||
call do_exit
|
|
||||||
.previous
|
.previous
|
||||||
.section __ex_table,"a"
|
.section __ex_table,"a"
|
||||||
.align 4
|
.align 4
|
||||||
@ -516,8 +514,6 @@ debug_stack_correct:
|
|||||||
xorl %edx,%edx # error code 0
|
xorl %edx,%edx # error code 0
|
||||||
movl %esp,%eax # pt_regs pointer
|
movl %esp,%eax # pt_regs pointer
|
||||||
call do_debug
|
call do_debug
|
||||||
testl %eax,%eax
|
|
||||||
jnz restore_all
|
|
||||||
jmp ret_from_exception
|
jmp ret_from_exception
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -598,8 +594,6 @@ ENTRY(int3)
|
|||||||
xorl %edx,%edx # zero error code
|
xorl %edx,%edx # zero error code
|
||||||
movl %esp,%eax # pt_regs pointer
|
movl %esp,%eax # pt_regs pointer
|
||||||
call do_int3
|
call do_int3
|
||||||
testl %eax,%eax
|
|
||||||
jnz restore_all
|
|
||||||
jmp ret_from_exception
|
jmp ret_from_exception
|
||||||
|
|
||||||
ENTRY(overflow)
|
ENTRY(overflow)
|
||||||
@ -658,296 +652,6 @@ ENTRY(spurious_interrupt_bug)
|
|||||||
pushl $do_spurious_interrupt_bug
|
pushl $do_spurious_interrupt_bug
|
||||||
jmp error_code
|
jmp error_code
|
||||||
|
|
||||||
.data
|
#include "syscall_table.S"
|
||||||
ENTRY(sys_call_table)
|
|
||||||
.long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */
|
|
||||||
.long sys_exit
|
|
||||||
.long sys_fork
|
|
||||||
.long sys_read
|
|
||||||
.long sys_write
|
|
||||||
.long sys_open /* 5 */
|
|
||||||
.long sys_close
|
|
||||||
.long sys_waitpid
|
|
||||||
.long sys_creat
|
|
||||||
.long sys_link
|
|
||||||
.long sys_unlink /* 10 */
|
|
||||||
.long sys_execve
|
|
||||||
.long sys_chdir
|
|
||||||
.long sys_time
|
|
||||||
.long sys_mknod
|
|
||||||
.long sys_chmod /* 15 */
|
|
||||||
.long sys_lchown16
|
|
||||||
.long sys_ni_syscall /* old break syscall holder */
|
|
||||||
.long sys_stat
|
|
||||||
.long sys_lseek
|
|
||||||
.long sys_getpid /* 20 */
|
|
||||||
.long sys_mount
|
|
||||||
.long sys_oldumount
|
|
||||||
.long sys_setuid16
|
|
||||||
.long sys_getuid16
|
|
||||||
.long sys_stime /* 25 */
|
|
||||||
.long sys_ptrace
|
|
||||||
.long sys_alarm
|
|
||||||
.long sys_fstat
|
|
||||||
.long sys_pause
|
|
||||||
.long sys_utime /* 30 */
|
|
||||||
.long sys_ni_syscall /* old stty syscall holder */
|
|
||||||
.long sys_ni_syscall /* old gtty syscall holder */
|
|
||||||
.long sys_access
|
|
||||||
.long sys_nice
|
|
||||||
.long sys_ni_syscall /* 35 - old ftime syscall holder */
|
|
||||||
.long sys_sync
|
|
||||||
.long sys_kill
|
|
||||||
.long sys_rename
|
|
||||||
.long sys_mkdir
|
|
||||||
.long sys_rmdir /* 40 */
|
|
||||||
.long sys_dup
|
|
||||||
.long sys_pipe
|
|
||||||
.long sys_times
|
|
||||||
.long sys_ni_syscall /* old prof syscall holder */
|
|
||||||
.long sys_brk /* 45 */
|
|
||||||
.long sys_setgid16
|
|
||||||
.long sys_getgid16
|
|
||||||
.long sys_signal
|
|
||||||
.long sys_geteuid16
|
|
||||||
.long sys_getegid16 /* 50 */
|
|
||||||
.long sys_acct
|
|
||||||
.long sys_umount /* recycled never used phys() */
|
|
||||||
.long sys_ni_syscall /* old lock syscall holder */
|
|
||||||
.long sys_ioctl
|
|
||||||
.long sys_fcntl /* 55 */
|
|
||||||
.long sys_ni_syscall /* old mpx syscall holder */
|
|
||||||
.long sys_setpgid
|
|
||||||
.long sys_ni_syscall /* old ulimit syscall holder */
|
|
||||||
.long sys_olduname
|
|
||||||
.long sys_umask /* 60 */
|
|
||||||
.long sys_chroot
|
|
||||||
.long sys_ustat
|
|
||||||
.long sys_dup2
|
|
||||||
.long sys_getppid
|
|
||||||
.long sys_getpgrp /* 65 */
|
|
||||||
.long sys_setsid
|
|
||||||
.long sys_sigaction
|
|
||||||
.long sys_sgetmask
|
|
||||||
.long sys_ssetmask
|
|
||||||
.long sys_setreuid16 /* 70 */
|
|
||||||
.long sys_setregid16
|
|
||||||
.long sys_sigsuspend
|
|
||||||
.long sys_sigpending
|
|
||||||
.long sys_sethostname
|
|
||||||
.long sys_setrlimit /* 75 */
|
|
||||||
.long sys_old_getrlimit
|
|
||||||
.long sys_getrusage
|
|
||||||
.long sys_gettimeofday
|
|
||||||
.long sys_settimeofday
|
|
||||||
.long sys_getgroups16 /* 80 */
|
|
||||||
.long sys_setgroups16
|
|
||||||
.long old_select
|
|
||||||
.long sys_symlink
|
|
||||||
.long sys_lstat
|
|
||||||
.long sys_readlink /* 85 */
|
|
||||||
.long sys_uselib
|
|
||||||
.long sys_swapon
|
|
||||||
.long sys_reboot
|
|
||||||
.long old_readdir
|
|
||||||
.long old_mmap /* 90 */
|
|
||||||
.long sys_munmap
|
|
||||||
.long sys_truncate
|
|
||||||
.long sys_ftruncate
|
|
||||||
.long sys_fchmod
|
|
||||||
.long sys_fchown16 /* 95 */
|
|
||||||
.long sys_getpriority
|
|
||||||
.long sys_setpriority
|
|
||||||
.long sys_ni_syscall /* old profil syscall holder */
|
|
||||||
.long sys_statfs
|
|
||||||
.long sys_fstatfs /* 100 */
|
|
||||||
.long sys_ioperm
|
|
||||||
.long sys_socketcall
|
|
||||||
.long sys_syslog
|
|
||||||
.long sys_setitimer
|
|
||||||
.long sys_getitimer /* 105 */
|
|
||||||
.long sys_newstat
|
|
||||||
.long sys_newlstat
|
|
||||||
.long sys_newfstat
|
|
||||||
.long sys_uname
|
|
||||||
.long sys_iopl /* 110 */
|
|
||||||
.long sys_vhangup
|
|
||||||
.long sys_ni_syscall /* old "idle" system call */
|
|
||||||
.long sys_vm86old
|
|
||||||
.long sys_wait4
|
|
||||||
.long sys_swapoff /* 115 */
|
|
||||||
.long sys_sysinfo
|
|
||||||
.long sys_ipc
|
|
||||||
.long sys_fsync
|
|
||||||
.long sys_sigreturn
|
|
||||||
.long sys_clone /* 120 */
|
|
||||||
.long sys_setdomainname
|
|
||||||
.long sys_newuname
|
|
||||||
.long sys_modify_ldt
|
|
||||||
.long sys_adjtimex
|
|
||||||
.long sys_mprotect /* 125 */
|
|
||||||
.long sys_sigprocmask
|
|
||||||
.long sys_ni_syscall /* old "create_module" */
|
|
||||||
.long sys_init_module
|
|
||||||
.long sys_delete_module
|
|
||||||
.long sys_ni_syscall /* 130: old "get_kernel_syms" */
|
|
||||||
.long sys_quotactl
|
|
||||||
.long sys_getpgid
|
|
||||||
.long sys_fchdir
|
|
||||||
.long sys_bdflush
|
|
||||||
.long sys_sysfs /* 135 */
|
|
||||||
.long sys_personality
|
|
||||||
.long sys_ni_syscall /* reserved for afs_syscall */
|
|
||||||
.long sys_setfsuid16
|
|
||||||
.long sys_setfsgid16
|
|
||||||
.long sys_llseek /* 140 */
|
|
||||||
.long sys_getdents
|
|
||||||
.long sys_select
|
|
||||||
.long sys_flock
|
|
||||||
.long sys_msync
|
|
||||||
.long sys_readv /* 145 */
|
|
||||||
.long sys_writev
|
|
||||||
.long sys_getsid
|
|
||||||
.long sys_fdatasync
|
|
||||||
.long sys_sysctl
|
|
||||||
.long sys_mlock /* 150 */
|
|
||||||
.long sys_munlock
|
|
||||||
.long sys_mlockall
|
|
||||||
.long sys_munlockall
|
|
||||||
.long sys_sched_setparam
|
|
||||||
.long sys_sched_getparam /* 155 */
|
|
||||||
.long sys_sched_setscheduler
|
|
||||||
.long sys_sched_getscheduler
|
|
||||||
.long sys_sched_yield
|
|
||||||
.long sys_sched_get_priority_max
|
|
||||||
.long sys_sched_get_priority_min /* 160 */
|
|
||||||
.long sys_sched_rr_get_interval
|
|
||||||
.long sys_nanosleep
|
|
||||||
.long sys_mremap
|
|
||||||
.long sys_setresuid16
|
|
||||||
.long sys_getresuid16 /* 165 */
|
|
||||||
.long sys_vm86
|
|
||||||
.long sys_ni_syscall /* Old sys_query_module */
|
|
||||||
.long sys_poll
|
|
||||||
.long sys_nfsservctl
|
|
||||||
.long sys_setresgid16 /* 170 */
|
|
||||||
.long sys_getresgid16
|
|
||||||
.long sys_prctl
|
|
||||||
.long sys_rt_sigreturn
|
|
||||||
.long sys_rt_sigaction
|
|
||||||
.long sys_rt_sigprocmask /* 175 */
|
|
||||||
.long sys_rt_sigpending
|
|
||||||
.long sys_rt_sigtimedwait
|
|
||||||
.long sys_rt_sigqueueinfo
|
|
||||||
.long sys_rt_sigsuspend
|
|
||||||
.long sys_pread64 /* 180 */
|
|
||||||
.long sys_pwrite64
|
|
||||||
.long sys_chown16
|
|
||||||
.long sys_getcwd
|
|
||||||
.long sys_capget
|
|
||||||
.long sys_capset /* 185 */
|
|
||||||
.long sys_sigaltstack
|
|
||||||
.long sys_sendfile
|
|
||||||
.long sys_ni_syscall /* reserved for streams1 */
|
|
||||||
.long sys_ni_syscall /* reserved for streams2 */
|
|
||||||
.long sys_vfork /* 190 */
|
|
||||||
.long sys_getrlimit
|
|
||||||
.long sys_mmap2
|
|
||||||
.long sys_truncate64
|
|
||||||
.long sys_ftruncate64
|
|
||||||
.long sys_stat64 /* 195 */
|
|
||||||
.long sys_lstat64
|
|
||||||
.long sys_fstat64
|
|
||||||
.long sys_lchown
|
|
||||||
.long sys_getuid
|
|
||||||
.long sys_getgid /* 200 */
|
|
||||||
.long sys_geteuid
|
|
||||||
.long sys_getegid
|
|
||||||
.long sys_setreuid
|
|
||||||
.long sys_setregid
|
|
||||||
.long sys_getgroups /* 205 */
|
|
||||||
.long sys_setgroups
|
|
||||||
.long sys_fchown
|
|
||||||
.long sys_setresuid
|
|
||||||
.long sys_getresuid
|
|
||||||
.long sys_setresgid /* 210 */
|
|
||||||
.long sys_getresgid
|
|
||||||
.long sys_chown
|
|
||||||
.long sys_setuid
|
|
||||||
.long sys_setgid
|
|
||||||
.long sys_setfsuid /* 215 */
|
|
||||||
.long sys_setfsgid
|
|
||||||
.long sys_pivot_root
|
|
||||||
.long sys_mincore
|
|
||||||
.long sys_madvise
|
|
||||||
.long sys_getdents64 /* 220 */
|
|
||||||
.long sys_fcntl64
|
|
||||||
.long sys_ni_syscall /* reserved for TUX */
|
|
||||||
.long sys_ni_syscall
|
|
||||||
.long sys_gettid
|
|
||||||
.long sys_readahead /* 225 */
|
|
||||||
.long sys_setxattr
|
|
||||||
.long sys_lsetxattr
|
|
||||||
.long sys_fsetxattr
|
|
||||||
.long sys_getxattr
|
|
||||||
.long sys_lgetxattr /* 230 */
|
|
||||||
.long sys_fgetxattr
|
|
||||||
.long sys_listxattr
|
|
||||||
.long sys_llistxattr
|
|
||||||
.long sys_flistxattr
|
|
||||||
.long sys_removexattr /* 235 */
|
|
||||||
.long sys_lremovexattr
|
|
||||||
.long sys_fremovexattr
|
|
||||||
.long sys_tkill
|
|
||||||
.long sys_sendfile64
|
|
||||||
.long sys_futex /* 240 */
|
|
||||||
.long sys_sched_setaffinity
|
|
||||||
.long sys_sched_getaffinity
|
|
||||||
.long sys_set_thread_area
|
|
||||||
.long sys_get_thread_area
|
|
||||||
.long sys_io_setup /* 245 */
|
|
||||||
.long sys_io_destroy
|
|
||||||
.long sys_io_getevents
|
|
||||||
.long sys_io_submit
|
|
||||||
.long sys_io_cancel
|
|
||||||
.long sys_fadvise64 /* 250 */
|
|
||||||
.long sys_ni_syscall
|
|
||||||
.long sys_exit_group
|
|
||||||
.long sys_lookup_dcookie
|
|
||||||
.long sys_epoll_create
|
|
||||||
.long sys_epoll_ctl /* 255 */
|
|
||||||
.long sys_epoll_wait
|
|
||||||
.long sys_remap_file_pages
|
|
||||||
.long sys_set_tid_address
|
|
||||||
.long sys_timer_create
|
|
||||||
.long sys_timer_settime /* 260 */
|
|
||||||
.long sys_timer_gettime
|
|
||||||
.long sys_timer_getoverrun
|
|
||||||
.long sys_timer_delete
|
|
||||||
.long sys_clock_settime
|
|
||||||
.long sys_clock_gettime /* 265 */
|
|
||||||
.long sys_clock_getres
|
|
||||||
.long sys_clock_nanosleep
|
|
||||||
.long sys_statfs64
|
|
||||||
.long sys_fstatfs64
|
|
||||||
.long sys_tgkill /* 270 */
|
|
||||||
.long sys_utimes
|
|
||||||
.long sys_fadvise64_64
|
|
||||||
.long sys_ni_syscall /* sys_vserver */
|
|
||||||
.long sys_mbind
|
|
||||||
.long sys_get_mempolicy
|
|
||||||
.long sys_set_mempolicy
|
|
||||||
.long sys_mq_open
|
|
||||||
.long sys_mq_unlink
|
|
||||||
.long sys_mq_timedsend
|
|
||||||
.long sys_mq_timedreceive /* 280 */
|
|
||||||
.long sys_mq_notify
|
|
||||||
.long sys_mq_getsetattr
|
|
||||||
.long sys_ni_syscall /* reserved for kexec */
|
|
||||||
.long sys_waitid
|
|
||||||
.long sys_ni_syscall /* 285 */ /* available */
|
|
||||||
.long sys_add_key
|
|
||||||
.long sys_request_key
|
|
||||||
.long sys_keyctl
|
|
||||||
|
|
||||||
syscall_table_size=(.-sys_call_table)
|
syscall_table_size=(.-sys_call_table)
|
||||||
|
@ -380,6 +380,7 @@ rp_sidt:
|
|||||||
ALIGN
|
ALIGN
|
||||||
ignore_int:
|
ignore_int:
|
||||||
cld
|
cld
|
||||||
|
#ifdef CONFIG_PRINTK
|
||||||
pushl %eax
|
pushl %eax
|
||||||
pushl %ecx
|
pushl %ecx
|
||||||
pushl %edx
|
pushl %edx
|
||||||
@ -400,6 +401,7 @@ ignore_int:
|
|||||||
popl %edx
|
popl %edx
|
||||||
popl %ecx
|
popl %ecx
|
||||||
popl %eax
|
popl %eax
|
||||||
|
#endif
|
||||||
iret
|
iret
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -169,10 +169,6 @@ EXPORT_SYMBOL(rtc_lock);
|
|||||||
EXPORT_SYMBOL_GPL(set_nmi_callback);
|
EXPORT_SYMBOL_GPL(set_nmi_callback);
|
||||||
EXPORT_SYMBOL_GPL(unset_nmi_callback);
|
EXPORT_SYMBOL_GPL(unset_nmi_callback);
|
||||||
|
|
||||||
#undef memcmp
|
|
||||||
extern int memcmp(const void *,const void *,__kernel_size_t);
|
|
||||||
EXPORT_SYMBOL(memcmp);
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(register_die_notifier);
|
EXPORT_SYMBOL(register_die_notifier);
|
||||||
#ifdef CONFIG_HAVE_DEC_LOCK
|
#ifdef CONFIG_HAVE_DEC_LOCK
|
||||||
EXPORT_SYMBOL(_atomic_dec_and_lock);
|
EXPORT_SYMBOL(_atomic_dec_and_lock);
|
||||||
|
@ -2175,7 +2175,6 @@ static inline void check_timer(void)
|
|||||||
disable_8259A_irq(0);
|
disable_8259A_irq(0);
|
||||||
setup_nmi();
|
setup_nmi();
|
||||||
enable_8259A_irq(0);
|
enable_8259A_irq(0);
|
||||||
check_nmi_watchdog();
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2198,7 +2197,6 @@ static inline void check_timer(void)
|
|||||||
add_pin_to_irq(0, 0, pin2);
|
add_pin_to_irq(0, 0, pin2);
|
||||||
if (nmi_watchdog == NMI_IO_APIC) {
|
if (nmi_watchdog == NMI_IO_APIC) {
|
||||||
setup_nmi();
|
setup_nmi();
|
||||||
check_nmi_watchdog();
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -217,6 +217,13 @@ static void resume_execution(struct kprobe *p, struct pt_regs *regs)
|
|||||||
*tos &= ~(TF_MASK | IF_MASK);
|
*tos &= ~(TF_MASK | IF_MASK);
|
||||||
*tos |= kprobe_old_eflags;
|
*tos |= kprobe_old_eflags;
|
||||||
break;
|
break;
|
||||||
|
case 0xc3: /* ret/lret */
|
||||||
|
case 0xcb:
|
||||||
|
case 0xc2:
|
||||||
|
case 0xca:
|
||||||
|
regs->eflags &= ~TF_MASK;
|
||||||
|
/* eip is already adjusted, no more changes required*/
|
||||||
|
return;
|
||||||
case 0xe8: /* call relative - Fix return addr */
|
case 0xe8: /* call relative - Fix return addr */
|
||||||
*tos = orig_eip + (*tos - copy_eip);
|
*tos = orig_eip + (*tos - copy_eip);
|
||||||
break;
|
break;
|
||||||
|
@ -102,20 +102,21 @@ int nmi_active;
|
|||||||
(P4_CCCR_OVF_PMI0|P4_CCCR_THRESHOLD(15)|P4_CCCR_COMPLEMENT| \
|
(P4_CCCR_OVF_PMI0|P4_CCCR_THRESHOLD(15)|P4_CCCR_COMPLEMENT| \
|
||||||
P4_CCCR_COMPARE|P4_CCCR_REQUIRED|P4_CCCR_ESCR_SELECT(4)|P4_CCCR_ENABLE)
|
P4_CCCR_COMPARE|P4_CCCR_REQUIRED|P4_CCCR_ESCR_SELECT(4)|P4_CCCR_ENABLE)
|
||||||
|
|
||||||
int __init check_nmi_watchdog (void)
|
static int __init check_nmi_watchdog(void)
|
||||||
{
|
{
|
||||||
unsigned int prev_nmi_count[NR_CPUS];
|
unsigned int prev_nmi_count[NR_CPUS];
|
||||||
int cpu;
|
int cpu;
|
||||||
|
|
||||||
printk(KERN_INFO "testing NMI watchdog ... ");
|
if (nmi_watchdog == NMI_NONE)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
printk(KERN_INFO "Testing NMI watchdog ... ");
|
||||||
|
|
||||||
for (cpu = 0; cpu < NR_CPUS; cpu++)
|
for (cpu = 0; cpu < NR_CPUS; cpu++)
|
||||||
prev_nmi_count[cpu] = per_cpu(irq_stat, cpu).__nmi_count;
|
prev_nmi_count[cpu] = per_cpu(irq_stat, cpu).__nmi_count;
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
mdelay((10*1000)/nmi_hz); // wait 10 ticks
|
mdelay((10*1000)/nmi_hz); // wait 10 ticks
|
||||||
|
|
||||||
/* FIXME: Only boot CPU is online at this stage. Check CPUs
|
|
||||||
as they come up. */
|
|
||||||
for (cpu = 0; cpu < NR_CPUS; cpu++) {
|
for (cpu = 0; cpu < NR_CPUS; cpu++) {
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
/* Check cpu_callin_map here because that is set
|
/* Check cpu_callin_map here because that is set
|
||||||
@ -139,6 +140,8 @@ int __init check_nmi_watchdog (void)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
/* This needs to happen later in boot so counters are working */
|
||||||
|
late_initcall(check_nmi_watchdog);
|
||||||
|
|
||||||
static int __init setup_nmi_watchdog(char *str)
|
static int __init setup_nmi_watchdog(char *str)
|
||||||
{
|
{
|
||||||
|
@ -400,11 +400,6 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long esp,
|
|||||||
int err;
|
int err;
|
||||||
|
|
||||||
childregs = ((struct pt_regs *) (THREAD_SIZE + (unsigned long) p->thread_info)) - 1;
|
childregs = ((struct pt_regs *) (THREAD_SIZE + (unsigned long) p->thread_info)) - 1;
|
||||||
*childregs = *regs;
|
|
||||||
childregs->eax = 0;
|
|
||||||
childregs->esp = esp;
|
|
||||||
|
|
||||||
p->thread.esp = (unsigned long) childregs;
|
|
||||||
/*
|
/*
|
||||||
* The below -8 is to reserve 8 bytes on top of the ring0 stack.
|
* The below -8 is to reserve 8 bytes on top of the ring0 stack.
|
||||||
* This is necessary to guarantee that the entire "struct pt_regs"
|
* This is necessary to guarantee that the entire "struct pt_regs"
|
||||||
@ -415,7 +410,13 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long esp,
|
|||||||
* "struct pt_regs" is possible, but they may contain the
|
* "struct pt_regs" is possible, but they may contain the
|
||||||
* completely wrong values.
|
* completely wrong values.
|
||||||
*/
|
*/
|
||||||
p->thread.esp0 = (unsigned long) (childregs+1) - 8;
|
childregs = (struct pt_regs *) ((unsigned long) childregs - 8);
|
||||||
|
*childregs = *regs;
|
||||||
|
childregs->eax = 0;
|
||||||
|
childregs->esp = esp;
|
||||||
|
|
||||||
|
p->thread.esp = (unsigned long) childregs;
|
||||||
|
p->thread.esp0 = (unsigned long) (childregs+1);
|
||||||
|
|
||||||
p->thread.eip = (unsigned long) ret_from_fork;
|
p->thread.eip = (unsigned long) ret_from_fork;
|
||||||
|
|
||||||
@ -611,8 +612,8 @@ struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct tas
|
|||||||
* Save away %fs and %gs. No need to save %es and %ds, as
|
* Save away %fs and %gs. No need to save %es and %ds, as
|
||||||
* those are always kernel segments while inside the kernel.
|
* those are always kernel segments while inside the kernel.
|
||||||
*/
|
*/
|
||||||
asm volatile("movl %%fs,%0":"=m" (*(int *)&prev->fs));
|
asm volatile("mov %%fs,%0":"=m" (prev->fs));
|
||||||
asm volatile("movl %%gs,%0":"=m" (*(int *)&prev->gs));
|
asm volatile("mov %%gs,%0":"=m" (prev->gs));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Restore %fs and %gs if needed.
|
* Restore %fs and %gs if needed.
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
#include <linux/audit.h>
|
#include <linux/audit.h>
|
||||||
#include <linux/seccomp.h>
|
#include <linux/seccomp.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
@ -511,7 +512,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
|
|||||||
case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
|
case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
|
||||||
case PTRACE_CONT: /* restart after signal. */
|
case PTRACE_CONT: /* restart after signal. */
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
if (request == PTRACE_SYSCALL) {
|
if (request == PTRACE_SYSCALL) {
|
||||||
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
@ -543,7 +544,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
|
|||||||
|
|
||||||
case PTRACE_SINGLESTEP: /* set the trap flag. */
|
case PTRACE_SINGLESTEP: /* set the trap flag. */
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
if ((unsigned long) data > _NSIG)
|
if (!valid_signal(data))
|
||||||
break;
|
break;
|
||||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||||
set_singlestep(child);
|
set_singlestep(child);
|
||||||
@ -682,24 +683,18 @@ void do_syscall_trace(struct pt_regs *regs, int entryexit)
|
|||||||
/* do the secure computing check first */
|
/* do the secure computing check first */
|
||||||
secure_computing(regs->orig_eax);
|
secure_computing(regs->orig_eax);
|
||||||
|
|
||||||
if (unlikely(current->audit_context)) {
|
if (unlikely(current->audit_context) && entryexit)
|
||||||
if (!entryexit)
|
audit_syscall_exit(current, AUDITSC_RESULT(regs->eax), regs->eax);
|
||||||
audit_syscall_entry(current, regs->orig_eax,
|
|
||||||
regs->ebx, regs->ecx,
|
|
||||||
regs->edx, regs->esi);
|
|
||||||
else
|
|
||||||
audit_syscall_exit(current, regs->eax);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(current->ptrace & PT_PTRACED))
|
if (!(current->ptrace & PT_PTRACED))
|
||||||
return;
|
goto out;
|
||||||
|
|
||||||
/* Fake a debug trap */
|
/* Fake a debug trap */
|
||||||
if (test_thread_flag(TIF_SINGLESTEP))
|
if (test_thread_flag(TIF_SINGLESTEP))
|
||||||
send_sigtrap(current, regs, 0);
|
send_sigtrap(current, regs, 0);
|
||||||
|
|
||||||
if (!test_thread_flag(TIF_SYSCALL_TRACE))
|
if (!test_thread_flag(TIF_SYSCALL_TRACE))
|
||||||
return;
|
goto out;
|
||||||
|
|
||||||
/* the 0x80 provides a way for the tracing parent to distinguish
|
/* the 0x80 provides a way for the tracing parent to distinguish
|
||||||
between a syscall stop and SIGTRAP delivery */
|
between a syscall stop and SIGTRAP delivery */
|
||||||
@ -714,4 +709,9 @@ void do_syscall_trace(struct pt_regs *regs, int entryexit)
|
|||||||
send_sig(current->exit_code, current, 1);
|
send_sig(current->exit_code, current, 1);
|
||||||
current->exit_code = 0;
|
current->exit_code = 0;
|
||||||
}
|
}
|
||||||
|
out:
|
||||||
|
if (unlikely(current->audit_context) && !entryexit)
|
||||||
|
audit_syscall_entry(current, AUDIT_ARCH_I386, regs->orig_eax,
|
||||||
|
regs->ebx, regs->ecx, regs->edx, regs->esi);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user