merge by hand - fix up rejections in Documentation/DocBook/Makefile
This commit is contained in:
commit
ad34ea2cc3
1282 changed files with 32304 additions and 15748 deletions
2
CREDITS
2
CREDITS
|
@ -339,7 +339,7 @@ W: http://tomas.nocrew.org/
|
|||
D: dsp56k device driver
|
||||
|
||||
N: Ross Biro
|
||||
E: bir7@leland.Stanford.Edu
|
||||
E: ross.biro@gmail.com
|
||||
D: Original author of the Linux networking code
|
||||
|
||||
N: Anton Blanchard
|
||||
|
|
|
@ -12,8 +12,6 @@ Following translations are available on the WWW:
|
|||
|
||||
00-INDEX
|
||||
- this file.
|
||||
BK-usage/
|
||||
- directory with info on BitKeeper.
|
||||
BUG-HUNTING
|
||||
- brute force method of doing binary search of patches to find bug.
|
||||
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/>
|
||||
|
||||
Jade
|
||||
----
|
||||
o <ftp://ftp.jclark.com/pub/jade/jade-1.2.1.tar.gz>
|
||||
|
||||
DocBook Stylesheets
|
||||
-------------------
|
||||
o <http://nwalsh.com/docbook/dsssl/>
|
||||
|
||||
XMLTO XSLT Frontend
|
||||
-------------------
|
||||
o <http://cyberelk.net/tim/xmlto/>
|
||||
|
||||
Intel P6 microcode
|
||||
------------------
|
||||
o <http://www.urbanmyth.org/microcode/>
|
||||
|
|
|
@ -7,11 +7,10 @@
|
|||
# list of DOCBOOKS.
|
||||
|
||||
DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml videobook.xml \
|
||||
kernel-hacking.xml kernel-locking.xml via-audio.xml \
|
||||
deviceiobook.xml procfs-guide.xml tulip-user.xml \
|
||||
writing_usb_driver.xml sis900.xml kernel-api.xml \
|
||||
journal-api.xml lsm.xml usb.xml gadget.xml libata.xml \
|
||||
mtdnand.xml librs.xml
|
||||
kernel-hacking.xml kernel-locking.xml deviceiobook.xml \
|
||||
procfs-guide.xml writing_usb_driver.xml \
|
||||
sis900.xml kernel-api.xml journal-api.xml lsm.xml usb.xml \
|
||||
gadget.xml libata.xml mtdnand.xml librs.xml
|
||||
|
||||
###
|
||||
# The build process is as follows (targets):
|
||||
|
@ -42,14 +41,16 @@ MAN := $(patsubst %.xml, %.9, $(BOOKS))
|
|||
mandocs: $(MAN)
|
||||
|
||||
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
|
||||
KERNELDOC = scripts/kernel-doc
|
||||
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:
|
||||
|
@ -96,45 +97,44 @@ $(obj)/procfs-guide.xml: $(C-procfs-example2)
|
|||
# Rules to generate postscript, PDF and HTML
|
||||
# db2html creates a directory. Generate a html file used for timestamp
|
||||
|
||||
quiet_cmd_db2ps = DB2PS $@
|
||||
cmd_db2ps = db2ps -o $(dir $@) $<
|
||||
quiet_cmd_db2ps = XMLTO $@
|
||||
cmd_db2ps = xmlto ps $(XMLTOFLAGS) -o $(dir $@) $<
|
||||
%.ps : %.xml
|
||||
@(which db2ps > /dev/null 2>&1) || \
|
||||
(echo "*** You need to install DocBook stylesheets ***"; \
|
||||
@(which xmlto > /dev/null 2>&1) || \
|
||||
(echo "*** You need to install xmlto ***"; \
|
||||
exit 1)
|
||||
$(call cmd,db2ps)
|
||||
|
||||
quiet_cmd_db2pdf = DB2PDF $@
|
||||
cmd_db2pdf = db2pdf -o $(dir $@) $<
|
||||
quiet_cmd_db2pdf = XMLTO $@
|
||||
cmd_db2pdf = xmlto pdf $(XMLTOFLAGS) -o $(dir $@) $<
|
||||
%.pdf : %.xml
|
||||
@(which db2pdf > /dev/null 2>&1) || \
|
||||
(echo "*** You need to install DocBook stylesheets ***"; \
|
||||
@(which xmlto > /dev/null 2>&1) || \
|
||||
(echo "*** You need to install xmlto ***"; \
|
||||
exit 1)
|
||||
$(call cmd,db2pdf)
|
||||
|
||||
quiet_cmd_db2html = DB2HTML $@
|
||||
cmd_db2html = db2html -o $(patsubst %.html,%,$@) $< && \
|
||||
echo '<a HREF="$(patsubst %.html,%,$(notdir $@))/book1.html"> \
|
||||
quiet_cmd_db2html = XMLTO $@
|
||||
cmd_db2html = xmlto xhtml $(XMLTOFLAGS) -o $(patsubst %.html,%,$@) $< && \
|
||||
echo '<a HREF="$(patsubst %.html,%,$(notdir $@))/index.html"> \
|
||||
Goto $(patsubst %.html,%,$(notdir $@))</a><p>' > $@
|
||||
|
||||
%.html: %.xml
|
||||
@(which db2html > /dev/null 2>&1) || \
|
||||
(echo "*** You need to install DocBook stylesheets ***"; \
|
||||
@(which xmlto > /dev/null 2>&1) || \
|
||||
(echo "*** You need to install xmlto ***"; \
|
||||
exit 1)
|
||||
@rm -rf $@ $(patsubst %.html,%,$@)
|
||||
$(call cmd,db2html)
|
||||
@if [ ! -z "$(PNG-$(basename $(notdir $@)))" ]; then \
|
||||
cp $(PNG-$(basename $(notdir $@))) $(patsubst %.html,%,$@); fi
|
||||
|
||||
###
|
||||
# Rule to generate man files - output is placed in the man subdirectory
|
||||
|
||||
%.9: %.xml
|
||||
ifneq ($(KBUILD_SRC),)
|
||||
$(Q)mkdir -p $(objtree)/Documentation/DocBook/man
|
||||
endif
|
||||
$(SPLITMAN) $< $(objtree)/Documentation/DocBook/man "$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)"
|
||||
$(MAKEMAN) convert $(objtree)/Documentation/DocBook/man $<
|
||||
quiet_cmd_db2man = XMLTO $@
|
||||
cmd_db2man = if grep -q refentry $<; then xmlto man $(XMLTOFLAGS) -o $(obj)/man $< ; gzip -f $(obj)/man/*.9; fi
|
||||
%.9 : %.xml
|
||||
@(which xmlto > /dev/null 2>&1) || \
|
||||
(echo "*** You need to install xmlto ***"; \
|
||||
exit 1)
|
||||
$(call cmd,db2man)
|
||||
@touch $@
|
||||
|
||||
###
|
||||
# Rules to generate postscripts and PNG imgages from .fig format files
|
||||
|
|
|
@ -49,13 +49,33 @@
|
|||
!Iinclude/asm-i386/unaligned.h
|
||||
</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>
|
||||
X!Ekernel/sched.c
|
||||
!Iinclude/linux/sched.h
|
||||
!Ekernel/sched.c
|
||||
!Ekernel/timer.c
|
||||
</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 id="adt">
|
||||
|
@ -81,7 +101,9 @@ KAO -->
|
|||
!Elib/vsprintf.c
|
||||
</sect1>
|
||||
<sect1><title>String Manipulation</title>
|
||||
!Ilib/string.c
|
||||
<!-- All functions are exported at now
|
||||
X!Ilib/string.c
|
||||
-->
|
||||
!Elib/string.c
|
||||
</sect1>
|
||||
<sect1><title>Bit Operations</title>
|
||||
|
@ -98,6 +120,25 @@ KAO -->
|
|||
!Iinclude/asm-i386/uaccess.h
|
||||
!Iarch/i386/lib/usercopy.c
|
||||
</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 id="kfifo">
|
||||
|
@ -114,6 +155,10 @@ KAO -->
|
|||
<sect1><title>sysctl interface</title>
|
||||
!Ekernel/sysctl.c
|
||||
</sect1>
|
||||
|
||||
<sect1><title>proc filesystem interface</title>
|
||||
!Ifs/proc/base.c
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
||||
<chapter id="debugfs">
|
||||
|
@ -127,6 +172,10 @@ KAO -->
|
|||
|
||||
<chapter id="vfs">
|
||||
<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>
|
||||
!Efs/dcache.c
|
||||
!Iinclude/linux/dcache.h
|
||||
|
@ -142,13 +191,31 @@ KAO -->
|
|||
!Efs/locks.c
|
||||
!Ifs/locks.c
|
||||
</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 id="netcore">
|
||||
<title>Linux Networking</title>
|
||||
<sect1><title>Networking Base Types</title>
|
||||
!Iinclude/linux/net.h
|
||||
</sect1>
|
||||
<sect1><title>Socket Buffer Functions</title>
|
||||
!Iinclude/linux/skbuff.h
|
||||
!Iinclude/net/sock.h
|
||||
!Enet/socket.c
|
||||
!Enet/core/skbuff.c
|
||||
!Enet/core/sock.c
|
||||
!Enet/core/datagram.c
|
||||
!Enet/core/stream.c
|
||||
</sect1>
|
||||
<sect1><title>Socket Filter</title>
|
||||
!Enet/core/filter.c
|
||||
|
@ -158,6 +225,14 @@ KAO -->
|
|||
!Enet/core/gen_stats.c
|
||||
!Enet/core/gen_estimator.c
|
||||
</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 id="netdev">
|
||||
|
@ -194,11 +269,26 @@ X!Ekernel/module.c
|
|||
!Iarch/i386/kernel/irq.c
|
||||
</sect1>
|
||||
|
||||
<sect1><title>Resources Management</title>
|
||||
!Ekernel/resource.c
|
||||
</sect1>
|
||||
|
||||
<sect1><title>MTRR Handling</title>
|
||||
!Earch/i386/kernel/cpu/mtrr/main.c
|
||||
</sect1>
|
||||
<sect1><title>PCI Support Library</title>
|
||||
!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><title>PCI Hotplug Support Library</title>
|
||||
!Edrivers/pci/hotplug/pci_hotplug_core.c
|
||||
|
@ -223,6 +313,14 @@ X!Earch/i386/kernel/mca.c
|
|||
!Efs/devfs/base.c
|
||||
</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">
|
||||
<title>Security Framework</title>
|
||||
!Esecurity/security.c
|
||||
|
@ -233,6 +331,61 @@ X!Earch/i386/kernel/mca.c
|
|||
!Ekernel/power/pm.c
|
||||
</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">
|
||||
<title>Block Devices</title>
|
||||
!Edrivers/block/ll_rw_blk.c
|
||||
|
@ -250,7 +403,23 @@ X!Earch/i386/kernel/mca.c
|
|||
|
||||
<chapter id="snddev">
|
||||
<title>Sound Devices</title>
|
||||
!Iinclude/sound/core.h
|
||||
!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
|
||||
X!Isound/sound_firmware.c
|
||||
-->
|
||||
|
@ -258,6 +427,7 @@ X!Isound/sound_firmware.c
|
|||
|
||||
<chapter id="uart16x50">
|
||||
<title>16x50 UART Driver</title>
|
||||
!Iinclude/linux/serial_core.h
|
||||
!Edrivers/serial/serial_core.c
|
||||
!Edrivers/serial/8250.c
|
||||
</chapter>
|
||||
|
@ -310,9 +480,11 @@ X!Isound/sound_firmware.c
|
|||
<sect1><title>Frame Buffer Memory</title>
|
||||
!Edrivers/video/fbmem.c
|
||||
</sect1>
|
||||
<!--
|
||||
<sect1><title>Frame Buffer Console</title>
|
||||
!Edrivers/video/console/fbcon.c
|
||||
X!Edrivers/video/console/fbcon.c
|
||||
</sect1>
|
||||
-->
|
||||
<sect1><title>Frame Buffer Colormap</title>
|
||||
!Edrivers/video/fbcmap.c
|
||||
</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
|
||||
[McKenney04a], a performance comparison of locking to RCU on several
|
||||
different CPUs [McKenney04b], a dissertation describing use of RCU in a
|
||||
number of operating-system kernels [PaulEdwardMcKenneyPhD], and a paper
|
||||
describing how to make RCU safe for soft-realtime applications [Sarma04c].
|
||||
number of operating-system kernels [PaulEdwardMcKenneyPhD], a paper
|
||||
describing how to make RCU safe for soft-realtime applications [Sarma04c],
|
||||
and a paper describing SELinux performance with RCU [JamesMorris04b].
|
||||
|
||||
|
||||
Bibtex Entries
|
||||
|
@ -341,6 +342,17 @@ Dipankar Sarma"
|
|||
,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
|
||||
,author="Paul E. McKenney and Dipankar Sarma and Maneesh Soni"
|
||||
,title="Scaling dcache with {RCU}"
|
||||
|
@ -373,6 +385,9 @@ in Operating System Kernels"
|
|||
,school="OGI School of Science and Engineering at
|
||||
Oregon Health and Sciences University"
|
||||
,year="2004"
|
||||
,note="Available:
|
||||
\url{http://www.rdrop.com/users/paulmck/RCU/RCUdissertation.2004.07.14e1.pdf}
|
||||
[Viewed October 15, 2004]"
|
||||
}
|
||||
|
||||
@Conference{Sarma04c
|
||||
|
@ -385,3 +400,13 @@ Oregon Health and Sciences University"
|
|||
,month="June"
|
||||
,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
|
||||
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
|
||||
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
|
||||
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.
|
||||
This document presents two examples that demonstrate exactly how bad an
|
||||
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
|
||||
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?
|
||||
|
||||
|
||||
Summary
|
||||
|
||||
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-
|
||||
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
|
||||
to explain why this added complexity is worthwhile. If you
|
||||
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
|
||||
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
|
||||
list_for_each_entry_rcu().
|
||||
|
||||
b. If the list macros are being used, the list_del_rcu(),
|
||||
list_add_tail_rcu(), and list_del_rcu() primitives must
|
||||
be used in order to prevent weakly ordered machines from
|
||||
misordering structure initialization and pointer planting.
|
||||
b. If the list macros are being used, the list_add_tail_rcu()
|
||||
and list_add_rcu() primitives must be used in order
|
||||
to prevent weakly ordered machines from misordering
|
||||
structure initialization and pointer planting.
|
||||
Similarly, if the hlist macros are being used, the
|
||||
hlist_del_rcu() and hlist_add_head_rcu() primitives
|
||||
are required.
|
||||
hlist_add_head_rcu() primitive is 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
|
||||
publicized. Use the rcu_assign_pointer() primitive
|
||||
when publicizing a pointer to a structure that can
|
||||
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(),
|
||||
is used, the callback function must be written to be called
|
||||
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.
|
||||
|
||||
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
|
||||
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
|
||||
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().
|
||||
|
||||
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.
|
||||
Failing to do so will break Alpha and confuse people reading
|
||||
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;
|
||||
|
||||
read_lock(&auditsc_lock);
|
||||
/* Note: audit_netlink_sem held by caller. */
|
||||
list_for_each_entry(e, &audit_tsklist, list) {
|
||||
if (audit_filter_rules(tsk, &e->rule, NULL, &state)) {
|
||||
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;
|
||||
|
||||
rcu_read_lock();
|
||||
/* Note: audit_netlink_sem held by caller. */
|
||||
list_for_each_entry_rcu(e, &audit_tsklist, list) {
|
||||
if (audit_filter_rules(tsk, &e->rule, NULL, &state)) {
|
||||
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
|
||||
audit_netlink_sem, so no additional locking is required. The auditsc_lock
|
||||
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
|
||||
replaced by list_del_rcu(), list_add_rcu(), and list_add_tail_rcu().
|
||||
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
|
||||
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;
|
||||
|
||||
write_lock(&auditsc_lock);
|
||||
/* Note: audit_netlink_sem held by caller. */
|
||||
list_for_each_entry(e, list, list) {
|
||||
if (!audit_compare_rule(rule, &e->rule)) {
|
||||
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);
|
||||
ne->rule.action = newaction;
|
||||
ne->rule.file_count = newfield_count;
|
||||
list_add_rcu(ne, e);
|
||||
list_del(e);
|
||||
list_replace_rcu(e, ne);
|
||||
call_rcu(&e->rcu, audit_free_rule, e);
|
||||
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?
|
||||
|
||||
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?
|
||||
|
||||
|
|
|
@ -4,6 +4,16 @@ The EtherDrive (R) HOWTO for users of 2.6 kernels is found at ...
|
|||
|
||||
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
|
||||
|
||||
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
|
||||
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
|
||||
devices are available.
|
||||
|
||||
These character devices may disappear and be replaced by sysfs
|
||||
counterparts, so distribution maintainers are encouraged to create
|
||||
scripts that use these devices.
|
||||
counterparts. Using the commands in aoetools insulates users from
|
||||
these implementation details.
|
||||
|
||||
The block devices are named like this:
|
||||
|
||||
|
@ -66,7 +77,8 @@ USING SYSFS
|
|||
through which we are communicating with the remote AoE device.
|
||||
|
||||
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
|
||||
e10.0 eth3 up
|
||||
|
@ -89,3 +101,23 @@ USING SYSFS
|
|||
e4.7 eth1 up
|
||||
e4.8 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
|
||||
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
|
||||
# maybe ls comes up empty, so we use "end"
|
||||
|
|
|
@ -1,137 +1,140 @@
|
|||
.*
|
||||
*~
|
||||
53c8xx_d.h*
|
||||
*.a
|
||||
aic7*reg.h*
|
||||
aic7*seq.h*
|
||||
aic7*reg_print.c*
|
||||
*.aux
|
||||
*.bin
|
||||
*.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
|
||||
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
|
||||
aicdb.h*
|
||||
asm
|
||||
asm_offsets.*
|
||||
autoconf.h*
|
||||
*.aux
|
||||
bbootsect
|
||||
*.bin
|
||||
bin2c
|
||||
binkernel.spec
|
||||
BitKeeper
|
||||
bootsect
|
||||
bsetup
|
||||
btfixupprep
|
||||
build
|
||||
bvmlinux
|
||||
bzImage*
|
||||
ChangeSet
|
||||
classlist.h*
|
||||
compile.h*
|
||||
comp*.log
|
||||
compile.h*
|
||||
config
|
||||
config-*
|
||||
config_data.h*
|
||||
conmakehash
|
||||
consolemap_deftbl.c*
|
||||
COPYING
|
||||
CREDITS
|
||||
.cscope
|
||||
*cscope*
|
||||
crc32table.h*
|
||||
cscope.*
|
||||
*.out
|
||||
*.css
|
||||
CVS
|
||||
defkeymap.c*
|
||||
devlist.h*
|
||||
docproc
|
||||
dummy_sym.c*
|
||||
*.dvi
|
||||
*.eps
|
||||
elfconfig.h*
|
||||
filelist
|
||||
fixdep
|
||||
fore200e_mkfirm
|
||||
fore200e_pca_fw.c*
|
||||
gen-devlist
|
||||
gen_init_cpio
|
||||
gen_crc32table
|
||||
crc32table.h*
|
||||
*.cpio
|
||||
gen-kdb_cmds.c*
|
||||
gentbl
|
||||
gen_crc32table
|
||||
gen_init_cpio
|
||||
genksyms
|
||||
*.gif
|
||||
*.gz
|
||||
*.html
|
||||
gentbl
|
||||
ikconfig.h*
|
||||
initramfs_list
|
||||
*.jpeg
|
||||
kallsyms
|
||||
kconfig
|
||||
kconfig.tk
|
||||
Kerntypes
|
||||
keywords.c*
|
||||
ksym.c*
|
||||
ksym.h*
|
||||
kallsyms
|
||||
mk_elfconfig
|
||||
elfconfig.h*
|
||||
modpost
|
||||
pnmtologo
|
||||
logo_*.c
|
||||
*.log
|
||||
lex.c*
|
||||
logo_*.c
|
||||
logo_*_clut224.c
|
||||
logo_*_mono.c
|
||||
lxdialog
|
||||
make_times_h
|
||||
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
|
||||
pss_boot.h
|
||||
trix_boot.h
|
||||
*.pdf
|
||||
mk_elfconfig
|
||||
mkdep
|
||||
mktables
|
||||
modpost
|
||||
modversions.h*
|
||||
offsets.h
|
||||
oui.c*
|
||||
parse.c*
|
||||
parse.h*
|
||||
PENDING
|
||||
pnmtologo
|
||||
ppc_defs.h*
|
||||
promcon_tbl.c*
|
||||
*.png
|
||||
*.ps
|
||||
*.rej
|
||||
SCCS
|
||||
pss_boot.h
|
||||
raid6altivec*.c
|
||||
raid6int*.c
|
||||
raid6tables.c
|
||||
setup
|
||||
*.s
|
||||
*.so
|
||||
*.sgml
|
||||
sim710_d.h*
|
||||
sm_tbl*
|
||||
split-include
|
||||
System.map*
|
||||
tags
|
||||
TAGS
|
||||
*.tex
|
||||
times.h*
|
||||
tkparse
|
||||
*.ver
|
||||
trix_boot.h
|
||||
version.h*
|
||||
*_vga16.c
|
||||
vmlinux
|
||||
vmlinux.lds
|
||||
vmlinux-*
|
||||
vmlinux.lds
|
||||
vsyscall.lds
|
||||
wanxlfw.inc
|
||||
uImage
|
||||
zImage
|
||||
|
|
|
@ -48,3 +48,18 @@ When: April 2005
|
|||
Why: Replaced by ->compat_ioctl in file_operations and other method
|
||||
vecors.
|
||||
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
|
||||
in-progress I/O and then start new I/O.
|
||||
|
||||
The filesystem should unlock the page synchronously, before returning
|
||||
to the caller.
|
||||
The filesystem should unlock the page synchronously, before returning to the
|
||||
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
|
||||
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
|
||||
(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
|
||||
---------------------
|
||||
|
||||
|
|
|
@ -79,6 +79,6 @@ Offset Type Description
|
|||
0x22c unsigned long ramdisk_max
|
||||
0x230 16 bytes trampoline
|
||||
0x290 - 0x2cf EDD_MBR_SIG_BUFFER (edd.S)
|
||||
0x2d0 - 0x600 E820MAP
|
||||
0x600 - 0x7ff EDDBUF (edd.S) for disk signature read sector
|
||||
0x600 - 0x7eb EDDBUF (edd.S) for edd data
|
||||
0x2d0 - 0xd00 E820MAP
|
||||
0xd00 - 0xeff EDDBUF (edd.S) for disk signature read sector
|
||||
0xd00 - 0xeeb EDDBUF (edd.S) for edd data
|
||||
|
|
|
@ -178,10 +178,9 @@ Released 1994-06-13
|
|||
7. ACKNOWLEDGMENTS.
|
||||
|
||||
These drivers wouldn't have been done without the base
|
||||
(and support) from Ross Biro <bir7@leland.stanford.edu>,
|
||||
and D-Link Systems Inc. The driver relies upon GPL-ed
|
||||
source from D-Link Systems Inc. and from Russel Nelson at
|
||||
Crynwr Software <nelson@crynwr.com>.
|
||||
(and support) from Ross Biro, and D-Link Systems Inc.
|
||||
The driver relies upon GPL-ed source from D-Link Systems Inc.
|
||||
and from Russel Nelson at Crynwr Software <nelson@crynwr.com>.
|
||||
|
||||
Additional input also from:
|
||||
Donald Becker <becker@super.org>, Alan Cox <A.Cox@swansea.ac.uk>
|
||||
|
|
|
@ -51,6 +51,8 @@ dev->hard_start_xmit:
|
|||
set_multicast_list
|
||||
Context: BHs disabled
|
||||
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:
|
||||
o NETDEV_TX_OK everything ok.
|
||||
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_find_device() Superseded by pci_get_device()
|
||||
pci_find_subsys() Superseded by pci_get_subsys()
|
||||
pci_find_slot() Superseded by pci_get_slot()
|
||||
pcibios_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)_*()
|
||||
|
|
|
@ -165,40 +165,9 @@ Description:
|
|||
These functions are intended for use by individual drivers, and are defined in
|
||||
struct pci_driver:
|
||||
|
||||
int (*save_state) (struct pci_dev *dev, u32 state);
|
||||
int (*suspend) (struct pci_dev *dev, u32 state);
|
||||
int (*suspend) (struct pci_dev *dev, pm_message_t state);
|
||||
int (*resume) (struct pci_dev *dev);
|
||||
int (*enable_wake) (struct pci_dev *dev, u32 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.
|
||||
int (*enable_wake) (struct pci_dev *dev, pci_power_t state, int enable);
|
||||
|
||||
|
||||
suspend
|
||||
|
|
|
@ -56,12 +56,16 @@ read_dev_chars()
|
|||
read device characteristics
|
||||
|
||||
read_conf_data()
|
||||
read_conf_data_lpm()
|
||||
read configuration data.
|
||||
|
||||
ccw_device_get_ciw()
|
||||
get commands from extended sense data.
|
||||
|
||||
ccw_device_start()
|
||||
ccw_device_start_timeout()
|
||||
ccw_device_start_key()
|
||||
ccw_device_start_key_timeout()
|
||||
initiate an I/O request.
|
||||
|
||||
ccw_device_resume()
|
||||
|
@ -197,19 +201,21 @@ The read_dev_chars() function returns :
|
|||
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
|
||||
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.
|
||||
|
||||
The function may be called enabled or disabled, but the device must not be
|
||||
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.
|
||||
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,
|
||||
__u8 lpm,
|
||||
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
|
||||
cpa : logical start address of channel program
|
||||
|
@ -272,7 +297,12 @@ user_intparm : user specific interrupt information; will be presented
|
|||
particular I/O request.
|
||||
lpm : defines the channel path to be used for a specific I/O
|
||||
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
|
||||
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 :
|
||||
|
||||
|
@ -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
|
||||
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
|
||||
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
|
||||
|
|
11
MAINTAINERS
11
MAINTAINERS
|
@ -1699,7 +1699,9 @@ P: Pavel Roskin
|
|||
M: proski@gnu.org
|
||||
P: David Gibson
|
||||
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
|
||||
|
||||
PARALLEL PORT SUPPORT
|
||||
|
@ -2113,6 +2115,13 @@ M: perex@suse.cz
|
|||
L: alsa-devel@alsa-project.org
|
||||
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):
|
||||
P: David S. Miller
|
||||
M: davem@davemloft.net
|
||||
|
|
12
Makefile
12
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 12
|
||||
EXTRAVERSION =-rc3
|
||||
EXTRAVERSION =-rc4
|
||||
NAME=Woozy Numbat
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -332,9 +332,7 @@ KALLSYMS = scripts/kallsyms
|
|||
PERL = perl
|
||||
CHECK = sparse
|
||||
|
||||
NOSTDINC_FLAGS = -nostdinc -isystem $(shell $(CC) -print-file-name=include)
|
||||
CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__
|
||||
CHECKFLAGS += $(NOSTDINC_FLAGS)
|
||||
MODFLAGS = -DMODULE
|
||||
CFLAGS_MODULE = $(MODFLAGS)
|
||||
AFLAGS_MODULE = $(MODFLAGS)
|
||||
|
@ -531,6 +529,10 @@ endif
|
|||
|
||||
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
|
||||
CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
|
||||
|
||||
|
@ -1188,8 +1190,8 @@ cmd_TAGS = $(all-sources) | etags -
|
|||
quiet_cmd_tags = MAKE $@
|
||||
define cmd_tags
|
||||
rm -f $@; \
|
||||
CTAGSF=`ctags --version | grep -i exuberant >/dev/null && echo "-I __initdata,__exitdata,EXPORT_SYMBOL,EXPORT_SYMBOL_GPL"`; \
|
||||
$(all-sources) | xargs ctags $$CTAGSF -a --extra=+f
|
||||
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
|
||||
endef
|
||||
|
||||
TAGS: FORCE
|
||||
|
|
|
@ -280,6 +280,10 @@ config ISA
|
|||
(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.
|
||||
|
||||
config ISA_DMA_API
|
||||
bool
|
||||
default y
|
||||
|
||||
config PCI
|
||||
bool
|
||||
depends on !ALPHA_JENSEN
|
||||
|
|
|
@ -457,22 +457,6 @@ osf_getdomainname(char __user *name, int namelen)
|
|||
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
|
||||
* be labeled "officially supported." Right now, there is just enough
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/user.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <asm/uaccess.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 */
|
||||
case PTRACE_CONT: /* restart after signal. */
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
if (request == PTRACE_SYSCALL)
|
||||
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. */
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
/* Mark single stepping. */
|
||||
child->thread_info->bpt_nsaved = -1;
|
||||
|
|
|
@ -227,7 +227,7 @@ sys_call_table:
|
|||
.quad sys_semop
|
||||
.quad osf_utsname
|
||||
.quad sys_lchown
|
||||
.quad osf_shmat
|
||||
.quad sys_shmat
|
||||
.quad sys_shmctl /* 210 */
|
||||
.quad sys_shmdt
|
||||
.quad sys_shmget
|
||||
|
|
|
@ -85,6 +85,7 @@ choice
|
|||
config ARCH_CLPS7500
|
||||
bool "Cirrus-CL-PS7500FE"
|
||||
select TIMER_ACORN
|
||||
select ISA
|
||||
|
||||
config ARCH_CLPS711X
|
||||
bool "CLPS711x/EP721x-based"
|
||||
|
@ -96,6 +97,7 @@ config ARCH_CO285
|
|||
|
||||
config ARCH_EBSA110
|
||||
bool "EBSA-110"
|
||||
select ISA
|
||||
help
|
||||
This is an evaluation board for the StrongARM processor available
|
||||
from Digital. It has limited hardware on-board, including an onboard
|
||||
|
@ -120,13 +122,16 @@ config ARCH_INTEGRATOR
|
|||
|
||||
config ARCH_IOP3XX
|
||||
bool "IOP3xx-based"
|
||||
select PCI
|
||||
|
||||
config ARCH_IXP4XX
|
||||
bool "IXP4xx-based"
|
||||
select DMABOUNCE
|
||||
select PCI
|
||||
|
||||
config ARCH_IXP2000
|
||||
bool "IXP2400/2800-based"
|
||||
select PCI
|
||||
|
||||
config ARCH_L7200
|
||||
bool "LinkUp-L7200"
|
||||
|
@ -155,6 +160,8 @@ config ARCH_RPC
|
|||
|
||||
config ARCH_SA1100
|
||||
bool "SA1100-based"
|
||||
select ISA
|
||||
select DISCONTIGMEM
|
||||
|
||||
config ARCH_S3C2410
|
||||
bool "Samsung S3C2410"
|
||||
|
@ -165,6 +172,9 @@ config ARCH_S3C2410
|
|||
|
||||
config ARCH_SHARK
|
||||
bool "Shark"
|
||||
select ISA
|
||||
select ISA_DMA
|
||||
select PCI
|
||||
|
||||
config ARCH_LH7A40X
|
||||
bool "Sharp LH7A40X"
|
||||
|
@ -252,8 +262,6 @@ config ARM_AMBA
|
|||
|
||||
config ISA
|
||||
bool
|
||||
depends on FOOTBRIDGE_HOST || ARCH_SHARK || ARCH_CLPS7500 || ARCH_EBSA110 || ARCH_CDB89712 || ARCH_EDB7211 || ARCH_SA1100 || ARCH_MX1ADS
|
||||
default y
|
||||
help
|
||||
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
|
||||
|
@ -263,12 +271,13 @@ config ISA
|
|||
|
||||
config ISA_DMA
|
||||
bool
|
||||
depends on FOOTBRIDGE_HOST || ARCH_SHARK
|
||||
|
||||
config ISA_DMA_API
|
||||
bool
|
||||
default y
|
||||
|
||||
config PCI
|
||||
bool "PCI support" if ARCH_INTEGRATOR_AP
|
||||
default y if ARCH_SHARK || FOOTBRIDGE_HOST || ARCH_IOP3XX || ARCH_IXP4XX || ARCH_IXP2000
|
||||
help
|
||||
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
|
||||
|
@ -296,7 +305,7 @@ menu "Kernel Features"
|
|||
|
||||
config SMP
|
||||
bool "Symmetric Multi-Processing (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL && n
|
||||
depends on EXPERIMENTAL #&& n
|
||||
help
|
||||
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
|
||||
|
@ -336,8 +345,7 @@ config PREEMPT
|
|||
|
||||
config DISCONTIGMEM
|
||||
bool
|
||||
depends on ARCH_EDB7211 || ARCH_SA1100 || (ARCH_LH7A40X && !LH7A40X_CONTIGMEM)
|
||||
default y
|
||||
default (ARCH_LH7A40X && !LH7A40X_CONTIGMEM)
|
||||
help
|
||||
Say Y to support efficient handling of discontiguous physical memory,
|
||||
for architectures which are either NUMA (Non-Uniform Memory Access)
|
||||
|
|
|
@ -18,48 +18,30 @@
|
|||
* Please select one of the following when turning on debugging.
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
#if defined(CONFIG_DEBUG_DC21285_PORT)
|
||||
.macro loadsp, rb
|
||||
mov \rb, #0x42000000
|
||||
.endm
|
||||
.macro writeb, rb
|
||||
str \rb, [r3, #0x160]
|
||||
.endm
|
||||
#elif defined(CONFIG_DEBUG_ICEDCC)
|
||||
|
||||
#include <asm/arch/debug-macro.S>
|
||||
|
||||
#if defined(CONFIG_DEBUG_ICEDCC)
|
||||
.macro loadsp, rb
|
||||
.endm
|
||||
.macro writeb, rb
|
||||
mcr p14, 0, \rb, c0, c1, 0
|
||||
.macro writeb, ch, rb
|
||||
mcr p14, 0, \ch, c0, c1, 0
|
||||
.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
|
||||
mov \rb, #0x7c000000
|
||||
.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]
|
||||
addruart \rb
|
||||
.endm
|
||||
#elif defined(CONFIG_ARCH_SA1100)
|
||||
.macro loadsp, rb
|
||||
|
@ -70,64 +52,21 @@
|
|||
add \rb, \rb, #0x00010000 @ Ser1
|
||||
# endif
|
||||
.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)
|
||||
.macro loadsp, rb
|
||||
mov \rb, #0xff000000
|
||||
orr \rb, \rb, #0x00ff0000
|
||||
orr \rb, \rb, #0x0000f700 @ location of the UART
|
||||
.endm
|
||||
.macro writeb, rb
|
||||
str \rb, [r3, #0]
|
||||
.endm
|
||||
#elif defined(CONFIG_ARCH_S3C2410)
|
||||
.macro loadsp, rb
|
||||
.macro loadsp, rb
|
||||
mov \rb, #0x50000000
|
||||
add \rb, \rb, #0x4000 * CONFIG_S3C2410_LOWLEVEL_UART_PORT
|
||||
.endm
|
||||
.macro writeb, rb
|
||||
strb \rb, [r3, #0x20]
|
||||
.endm
|
||||
#else
|
||||
#error no serial architecture defined
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
.macro kputc,val
|
||||
|
@ -734,7 +673,7 @@ puts: loadsp r3
|
|||
1: ldrb r2, [r0], #1
|
||||
teq r2, #0
|
||||
moveq pc, lr
|
||||
2: writeb r2
|
||||
2: writeb r2, r3
|
||||
mov r1, #0x00020000
|
||||
3: subs r1, r1, #1
|
||||
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;
|
||||
}
|
||||
|
||||
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));
|
||||
ops->read_time(tm);
|
||||
return ops->read_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;
|
||||
if (ops->read_alarm) {
|
||||
memset(alrm, 0, sizeof(struct rtc_wkalrm));
|
||||
ops->read_alarm(alrm);
|
||||
ret = 0;
|
||||
ret = ops->read_alarm(alrm);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
@ -283,7 +282,9 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
|
|||
break;
|
||||
|
||||
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));
|
||||
if (ret)
|
||||
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;
|
||||
char *p = page;
|
||||
|
||||
rtc_read_time(ops, &tm);
|
||||
|
||||
p += sprintf(p,
|
||||
"rtc_time\t: %02d:%02d:%02d\n"
|
||||
"rtc_date\t: %04d-%02d-%02d\n"
|
||||
"rtc_epoch\t: %04lu\n",
|
||||
tm.tm_hour, tm.tm_min, tm.tm_sec,
|
||||
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
|
||||
rtc_epoch);
|
||||
if (rtc_read_time(ops, &tm) == 0) {
|
||||
p += sprintf(p,
|
||||
"rtc_time\t: %02d:%02d:%02d\n"
|
||||
"rtc_date\t: %04d-%02d-%02d\n"
|
||||
"rtc_epoch\t: %04lu\n",
|
||||
tm.tm_hour, tm.tm_min, tm.tm_sec,
|
||||
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
|
||||
rtc_epoch);
|
||||
}
|
||||
|
||||
if (rtc_read_alarm(ops, &alrm) == 0) {
|
||||
p += sprintf(p, "alrm_time\t: ");
|
||||
|
|
|
@ -133,7 +133,7 @@ CONFIG_ALIGNMENT_TRAP=y
|
|||
#
|
||||
CONFIG_ZBOOT_ROM_TEXT=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
|
||||
|
||||
#
|
||||
|
|
|
@ -31,8 +31,3 @@ head-y := head.o
|
|||
obj-$(CONFIG_DEBUG_LL) += debug.o
|
||||
|
||||
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_IWMMXT_STATE, (offsetof(struct thread_info, fpstate)+4)&~7);
|
||||
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
|
||||
DEFINE(MM_CONTEXT_ID, offsetof(struct mm_struct, context.id));
|
||||
BLANK();
|
||||
|
|
|
@ -14,12 +14,12 @@
|
|||
* it to save wrong values... Be aware!
|
||||
*/
|
||||
#include <linux/config.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/glue.h>
|
||||
#include <asm/ptrace.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"
|
||||
|
||||
|
@ -118,7 +118,7 @@ __dabt_svc:
|
|||
@
|
||||
@ IRQs off again before pulling preserved data off the stack
|
||||
@
|
||||
disable_irq r0
|
||||
disable_irq
|
||||
|
||||
@
|
||||
@ restore SPSR and restart the instruction
|
||||
|
@ -198,7 +198,7 @@ __und_svc:
|
|||
@
|
||||
@ IRQs off again before pulling preserved data off the stack
|
||||
@
|
||||
1: disable_irq r0
|
||||
1: disable_irq
|
||||
|
||||
@
|
||||
@ restore SPSR and restart the instruction
|
||||
|
@ -232,7 +232,7 @@ __pabt_svc:
|
|||
@
|
||||
@ IRQs off again before pulling preserved data off the stack
|
||||
@
|
||||
disable_irq r0
|
||||
disable_irq
|
||||
|
||||
@
|
||||
@ restore SPSR and restart the instruction
|
||||
|
@ -269,6 +269,12 @@ __pabt_svc:
|
|||
add r5, sp, #S_PC
|
||||
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:
|
||||
@
|
||||
|
@ -316,7 +322,7 @@ __dabt_usr:
|
|||
@
|
||||
@ IRQs on, then call the main handler
|
||||
@
|
||||
enable_irq r2
|
||||
enable_irq
|
||||
mov r2, sp
|
||||
adr lr, ret_from_exception
|
||||
b do_DataAbort
|
||||
|
@ -418,7 +424,7 @@ call_fpe:
|
|||
movcss r7, r5, lsr #(TIF_USING_IWMMXT + 1)
|
||||
bcs iwmmxt_task_enable
|
||||
#endif
|
||||
enable_irq r7
|
||||
enable_irq
|
||||
add pc, pc, r8, lsr #6
|
||||
mov r0, r0
|
||||
|
||||
|
@ -472,7 +478,7 @@ fpundefinstr:
|
|||
__pabt_usr:
|
||||
usr_entry abt
|
||||
|
||||
enable_irq r0 @ Enable interrupts
|
||||
enable_irq @ Enable interrupts
|
||||
mov r0, r2 @ address (pc)
|
||||
mov r1, sp @ regs
|
||||
bl do_PrefetchAbort @ call abort handler
|
||||
|
@ -499,8 +505,12 @@ ENTRY(__switch_to)
|
|||
mra r4, r5, acc0
|
||||
stmia ip, {r4, r5}
|
||||
#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
|
||||
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
|
||||
#ifdef CONFIG_VFP
|
||||
@ 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
|
||||
|
||||
__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.
|
||||
*
|
||||
* This code is copied to 0x200 or 0xffff0200 so we can use branches in the
|
||||
* vectors, rather than ldr's.
|
||||
* This code is copied to 0xffff0200 so we can use branches in the
|
||||
* vectors, rather than ldr's. Note that this code must not
|
||||
* exceed 0x300 bytes.
|
||||
*
|
||||
* Common stub entry macro:
|
||||
* Enter in IRQ mode, spsr = SVC/USR CPSR, lr = SVC/USR PC
|
||||
|
@ -544,7 +752,7 @@ vector_\name:
|
|||
@
|
||||
mrs r13, cpsr
|
||||
bic r13, r13, #MODE_MASK
|
||||
orr r13, r13, #MODE_SVC
|
||||
orr r13, r13, #SVC_MODE
|
||||
msr spsr_cxsf, r13 @ switch to SVC_32 mode
|
||||
|
||||
and lr, lr, #15
|
||||
|
@ -552,6 +760,7 @@ vector_\name:
|
|||
movs pc, lr @ Changes mode and branches
|
||||
.endm
|
||||
|
||||
.globl __stubs_start
|
||||
__stubs_start:
|
||||
/*
|
||||
* Interrupt dispatcher
|
||||
|
@ -686,37 +895,24 @@ vector_addrexcptn:
|
|||
.LCsabt:
|
||||
.word __temp_abt
|
||||
|
||||
.globl __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
|
||||
b __real_stubs_start + (vector_und - __stubs_start)
|
||||
ldr pc, __real_stubs_start + (.LCvswi - __stubs_start)
|
||||
b __real_stubs_start + (vector_pabt - __stubs_start)
|
||||
b __real_stubs_start + (vector_dabt - __stubs_start)
|
||||
b __real_stubs_start + (vector_addrexcptn - __stubs_start)
|
||||
b __real_stubs_start + (vector_irq - __stubs_start)
|
||||
b __real_stubs_start + (vector_fiq - __stubs_start)
|
||||
b vector_und + stubs_offset
|
||||
ldr pc, .LCvswi + stubs_offset
|
||||
b vector_pabt + stubs_offset
|
||||
b vector_dabt + stubs_offset
|
||||
b vector_addrexcptn + stubs_offset
|
||||
b vector_irq + stubs_offset
|
||||
b vector_fiq + stubs_offset
|
||||
|
||||
ENTRY(__trap_init)
|
||||
stmfd sp!, {r4 - r6, lr}
|
||||
|
||||
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})
|
||||
.globl __vectors_end
|
||||
__vectors_end:
|
||||
|
||||
.data
|
||||
|
||||
|
|
|
@ -9,19 +9,10 @@
|
|||
*/
|
||||
#include <linux/config.h>
|
||||
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
#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
|
||||
/*
|
||||
|
@ -30,11 +21,19 @@
|
|||
* stack.
|
||||
*/
|
||||
ret_fast_syscall:
|
||||
disable_irq r1 @ disable interrupts
|
||||
disable_irq @ disable interrupts
|
||||
ldr r1, [tsk, #TI_FLAGS]
|
||||
tst r1, #_TIF_WORK_MASK
|
||||
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.
|
||||
|
@ -49,7 +48,7 @@ work_pending:
|
|||
mov r0, sp @ 'regs'
|
||||
mov r2, why @ 'syscall'
|
||||
bl do_notify_resume
|
||||
disable_irq r1 @ disable interrupts
|
||||
disable_irq @ disable interrupts
|
||||
b no_work_pending
|
||||
|
||||
work_resched:
|
||||
|
@ -59,12 +58,19 @@ work_resched:
|
|||
*/
|
||||
ENTRY(ret_to_user)
|
||||
ret_slow_syscall:
|
||||
disable_irq r1 @ disable interrupts
|
||||
disable_irq @ disable interrupts
|
||||
ldr r1, [tsk, #TI_FLAGS]
|
||||
tst r1, #_TIF_WORK_MASK
|
||||
bne 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.
|
||||
|
@ -116,9 +122,26 @@ ENTRY(ret_from_fork)
|
|||
|
||||
.align 5
|
||||
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
|
||||
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
|
||||
|
||||
#ifdef CONFIG_ALIGNMENT_TRAP
|
||||
|
@ -126,14 +149,14 @@ ENTRY(vector_swi)
|
|||
ldr ip, [ip]
|
||||
mcr p15, 0, ip, c1, c0 @ update control register
|
||||
#endif
|
||||
enable_irq ip
|
||||
enable_irq
|
||||
|
||||
str r4, [sp, #-S_OFF]! @ push fifth arg
|
||||
|
||||
get_thread_info tsk
|
||||
ldr ip, [tsk, #TI_FLAGS] @ check for syscall tracing
|
||||
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
|
||||
tst ip, #_TIF_SYSCALL_TRACE @ are we tracing syscalls?
|
||||
bne __sys_trace
|
||||
|
@ -144,8 +167,8 @@ ENTRY(vector_swi)
|
|||
|
||||
add r1, sp, #S_OFF
|
||||
2: mov why, #0 @ no longer a real syscall
|
||||
cmp scno, #ARMSWI_OFFSET
|
||||
eor r0, scno, #OS_NUMBER << 20 @ put OS number back
|
||||
cmp scno, #(__ARM_NR_BASE - __NR_SYSCALL_BASE)
|
||||
eor r0, scno, #__NR_SYSCALL_BASE @ put OS number back
|
||||
bcs arm_syscall
|
||||
b sys_ni_syscall @ not private func
|
||||
|
||||
|
@ -190,7 +213,7 @@ ENTRY(sys_call_table)
|
|||
@ r5 = syscall table
|
||||
.type sys_syscall, #function
|
||||
sys_syscall:
|
||||
eor scno, r0, #OS_NUMBER << 20
|
||||
eor scno, r0, #__NR_SYSCALL_BASE
|
||||
cmp scno, #__NR_syscall - __NR_SYSCALL_BASE
|
||||
cmpne scno, #NR_syscalls @ check range
|
||||
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 <asm/assembler.h>
|
||||
#include <asm/constants.h>
|
||||
#include <asm/errno.h>
|
||||
#include <asm/hardware.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
|
||||
#include <asm/thread_info.h>
|
||||
|
||||
@ Bad Abort numbers
|
||||
@ -----------------
|
||||
|
@ -29,113 +16,44 @@
|
|||
#define BAD_IRQ 3
|
||||
#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
|
||||
#define ARMSWI_OFFSET 0x000f0000
|
||||
|
||||
@ Most of the stack format comes from struct pt_regs, but with
|
||||
@ 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
|
||||
|
||||
.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
|
||||
|
||||
#if __LINUX_ARM_ARCH__ >= 6
|
||||
.macro disable_irq, temp
|
||||
.macro disable_irq
|
||||
cpsid i
|
||||
.endm
|
||||
|
||||
.macro enable_irq, temp
|
||||
.macro enable_irq
|
||||
cpsie i
|
||||
.endm
|
||||
#else
|
||||
.macro disable_irq, temp
|
||||
set_cpsr_c \temp, #PSR_I_BIT | MODE_SVC
|
||||
.macro disable_irq
|
||||
msr cpsr_c, #PSR_I_BIT | SVC_MODE
|
||||
.endm
|
||||
|
||||
.macro enable_irq, temp
|
||||
set_cpsr_c \temp, #MODE_SVC
|
||||
.macro enable_irq
|
||||
msr cpsr_c, #SVC_MODE
|
||||
.endm
|
||||
#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
|
||||
mov \rd, sp, lsr #13
|
||||
mov \rd, \rd, lsl #13
|
||||
|
@ -165,18 +83,3 @@ scno .req r7 @ syscall number
|
|||
tbl .req r8 @ syscall table pointer
|
||||
why .req r8 @ Linux syscall (!= 0)
|
||||
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/ptrace.h>
|
||||
#include <asm/constants.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#define PROCINFO_MMUFLAGS 8
|
||||
|
@ -131,7 +132,7 @@ __switch_data:
|
|||
.long processor_id @ r4
|
||||
.long __machine_arch_type @ r5
|
||||
.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
|
||||
|
|
|
@ -256,8 +256,6 @@ static unsigned long *thread_info_head;
|
|||
static unsigned int nr_thread_info;
|
||||
|
||||
#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)
|
||||
{
|
||||
|
@ -274,17 +272,16 @@ struct thread_info *alloc_thread_info(struct task_struct *task)
|
|||
}
|
||||
|
||||
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
|
||||
* give sensible stack usage information
|
||||
*/
|
||||
if (thread) {
|
||||
char *p = (char *)thread;
|
||||
memzero(p+KERNEL_STACK_SIZE, KERNEL_STACK_SIZE);
|
||||
}
|
||||
if (thread)
|
||||
memzero(thread, THREAD_SIZE);
|
||||
#endif
|
||||
return thread;
|
||||
}
|
||||
|
@ -297,7 +294,7 @@ void free_thread_info(struct thread_info *thread)
|
|||
thread_info_head = p;
|
||||
nr_thread_info += 1;
|
||||
} 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 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->ARM_r0 = 0;
|
||||
childregs->ARM_sp = stack_start;
|
||||
|
@ -447,15 +444,17 @@ EXPORT_SYMBOL(kernel_thread);
|
|||
unsigned long get_wchan(struct task_struct *p)
|
||||
{
|
||||
unsigned long fp, lr;
|
||||
unsigned long stack_page;
|
||||
unsigned long stack_start, stack_end;
|
||||
int count = 0;
|
||||
if (!p || p == current || p->state == TASK_RUNNING)
|
||||
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);
|
||||
do {
|
||||
if (fp < stack_page || fp > 4092+stack_page)
|
||||
if (fp < stack_start || fp > stack_end)
|
||||
return 0;
|
||||
lr = pc_pointer (((unsigned long *)fp)[-1]);
|
||||
if (!in_sched_functions(lr))
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <linux/user.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <asm/uaccess.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_CONT:
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
if (request == PTRACE_SYSCALL)
|
||||
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:
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
child->ptrace |= PT_SINGLESTEP;
|
||||
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.
|
||||
* 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"
|
||||
:
|
||||
: "r" (current_thread_info()),
|
||||
"Ir" (THREAD_SIZE - 8 - sizeof(regs)),
|
||||
"Ir" (THREAD_START_SP - sizeof(regs)),
|
||||
"r" (®s),
|
||||
"Ir" (sizeof(regs))
|
||||
: "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);
|
||||
|
||||
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_instr(regs);
|
||||
}
|
||||
|
@ -450,13 +451,17 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
|
|||
|
||||
case NR(set_tls):
|
||||
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.
|
||||
* On SMP read access to this address must raise a fault
|
||||
* and be emulated from the data abort handler.
|
||||
* m
|
||||
* User space must never try to access this directly.
|
||||
* Expect your app to break eventually if you do so.
|
||||
* The user helper at 0xffff0fe0 must be used instead.
|
||||
* (see entry-armv.S for details)
|
||||
*/
|
||||
*((unsigned long *)0xffff0ffc) = thread->tp_value;
|
||||
*((unsigned int *)0xffff0ff0) = regs->ARM_r0;
|
||||
#endif
|
||||
return 0;
|
||||
|
||||
default:
|
||||
|
@ -493,6 +498,44 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
|
|||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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);
|
||||
modify_domain(DOMAIN_USER, DOMAIN_CLIENT);
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
#include <asm-generic/vmlinux.lds.h>
|
||||
#include <linux/config.h>
|
||||
#include <asm/thread_info.h>
|
||||
|
||||
OUTPUT_ARCH(arm)
|
||||
ENTRY(stext)
|
||||
|
@ -103,7 +104,7 @@ SECTIONS
|
|||
__data_loc = ALIGN(4); /* location in binary */
|
||||
. = DATAADDR;
|
||||
#else
|
||||
. = ALIGN(8192);
|
||||
. = ALIGN(THREAD_SIZE);
|
||||
__data_loc = .;
|
||||
#endif
|
||||
|
||||
|
|
|
@ -10,6 +10,7 @@ config ARCH_AUTCPU12
|
|||
|
||||
config ARCH_CDB89712
|
||||
bool "CDB89712"
|
||||
select ISA
|
||||
help
|
||||
This is an evaluation board from Cirrus for the CS89712 processor.
|
||||
The board includes 2 serial ports, Ethernet, IRDA, and expansion
|
||||
|
@ -26,6 +27,8 @@ config ARCH_CLEP7312
|
|||
|
||||
config ARCH_EDB7211
|
||||
bool "EDB7211"
|
||||
select ISA
|
||||
select DISCONTIGMEM
|
||||
help
|
||||
Say Y here if you intend to run this kernel on a Cirrus Logic EDB-7211
|
||||
evaluation board.
|
||||
|
|
|
@ -5,6 +5,9 @@ menu "Footbridge Implementations"
|
|||
config ARCH_CATS
|
||||
bool "CATS"
|
||||
select FOOTBRIDGE_HOST
|
||||
select ISA
|
||||
select ISA_DMA
|
||||
select PCI
|
||||
help
|
||||
Say Y here if you intend to run this kernel on the CATS.
|
||||
|
||||
|
@ -13,6 +16,9 @@ config ARCH_CATS
|
|||
config ARCH_PERSONAL_SERVER
|
||||
bool "Compaq Personal Server"
|
||||
select FOOTBRIDGE_HOST
|
||||
select ISA
|
||||
select ISA_DMA
|
||||
select PCI
|
||||
---help---
|
||||
Say Y here if you intend to run this kernel on the Compaq
|
||||
Personal Server.
|
||||
|
@ -42,6 +48,9 @@ config ARCH_EBSA285_HOST
|
|||
bool "EBSA285 (host mode)"
|
||||
select ARCH_EBSA285
|
||||
select FOOTBRIDGE_HOST
|
||||
select ISA
|
||||
select ISA_DMA
|
||||
select PCI
|
||||
help
|
||||
Say Y here if you intend to run this kernel on the EBSA285 card
|
||||
in host ("central function") mode.
|
||||
|
@ -51,6 +60,9 @@ config ARCH_EBSA285_HOST
|
|||
config ARCH_NETWINDER
|
||||
bool "NetWinder"
|
||||
select FOOTBRIDGE_HOST
|
||||
select ISA
|
||||
select ISA_DMA
|
||||
select PCI
|
||||
help
|
||||
Say Y here if you intend to run this kernel on the Rebel.COM
|
||||
NetWinder. Information about this machine can be found at:
|
||||
|
|
|
@ -4,6 +4,7 @@ menu "IMX Implementations"
|
|||
config ARCH_MX1ADS
|
||||
bool "mx1ads"
|
||||
depends on ARCH_IMX
|
||||
select ISA
|
||||
help
|
||||
Say Y here if you are using the Motorola MX1ADS board
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <asm/arch/imxfb.h>
|
||||
#include <asm/hardware.h>
|
||||
|
||||
#include <asm/mach/map.h>
|
||||
|
@ -228,6 +229,14 @@ static struct platform_device imx_uart2_device = {
|
|||
.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[] = {
|
||||
[0] = {
|
||||
.start = 0x00205000,
|
||||
|
@ -241,9 +250,16 @@ static struct resource imxfb_resources[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static u64 fb_dma_mask = ~(u64)0;
|
||||
|
||||
static struct platform_device imxfb_device = {
|
||||
.name = "imx-fb",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &imx_fb_info,
|
||||
.dma_mask = &fb_dma_mask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(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);
|
||||
|
||||
// ...clear the interrupt
|
||||
/*
|
||||
* clear the interrupt
|
||||
*/
|
||||
timer1->TimerClear = 1;
|
||||
|
||||
timer_tick(regs);
|
||||
|
@ -264,7 +266,7 @@ void __init integrator_time_init(unsigned long reload, unsigned int ctrl)
|
|||
timer1->TimerValue = timer_reload;
|
||||
timer1->TimerControl = timer_ctrl;
|
||||
|
||||
/*
|
||||
/*
|
||||
* Make irqs happen for the system timer
|
||||
*/
|
||||
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)
|
||||
{
|
||||
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;
|
||||
|
|
|
@ -37,7 +37,7 @@ static void integrator_leds_event(led_event_t ledevt)
|
|||
unsigned long flags;
|
||||
const unsigned int dbg_base = IO_ADDRESS(INTEGRATOR_DBG_BASE);
|
||||
unsigned int update_alpha_leds;
|
||||
|
||||
|
||||
// yup, change the LEDs
|
||||
local_irq_save(flags);
|
||||
update_alpha_leds = 0;
|
||||
|
|
|
@ -40,25 +40,32 @@ static int integrator_set_rtc(void)
|
|||
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);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtc_set_alarm(struct rtc_wkalrm *alrm)
|
||||
static inline int rtc_set_alarm(struct rtc_wkalrm *alrm)
|
||||
{
|
||||
unsigned long time;
|
||||
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)
|
||||
writel(time, rtc_base + RTC_MR);
|
||||
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);
|
||||
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
|
||||
* in advance.
|
||||
*/
|
||||
static int rtc_set_time(struct rtc_time *tm)
|
||||
static inline int rtc_set_time(struct rtc_time *tm)
|
||||
{
|
||||
unsigned long time;
|
||||
int ret;
|
||||
|
|
|
@ -65,19 +65,102 @@ static struct sys_timer ixdp2800_timer = {
|
|||
/*************************************************************************
|
||||
* 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)
|
||||
{
|
||||
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_DRAM_BASE_ADDR_MASK = (0x40000000 - 1) & ~0xfffff;
|
||||
|
||||
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;
|
||||
|
||||
|
@ -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 */
|
||||
}
|
||||
|
||||
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()) {
|
||||
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);
|
||||
printk(KERN_INFO "IXDP2800: enabling slave NPU\n");
|
||||
|
||||
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();
|
||||
ixdp2800_slave_signal_bus_scan_completion();
|
||||
}
|
||||
}
|
||||
|
||||
struct hw_pci ixdp2800_pci __initdata = {
|
||||
struct __initdata hw_pci ixdp2800_pci __initdata = {
|
||||
.nr_controllers = 1,
|
||||
.setup = ixdp2800_pci_setup,
|
||||
.preinit = ixdp2800_pci_preinit,
|
||||
|
@ -155,8 +263,21 @@ struct hw_pci ixdp2800_pci __initdata = {
|
|||
|
||||
int __init ixdp2800_pci_init(void)
|
||||
{
|
||||
if (machine_is_ixdp2800())
|
||||
if (machine_is_ixdp2800()) {
|
||||
struct pci_dev *dev;
|
||||
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@ static int pci_master_aborts = 0;
|
|||
|
||||
static int clear_master_aborts(void);
|
||||
|
||||
static u32 *
|
||||
u32 *
|
||||
ixp2000_pci_config_addr(unsigned int bus_nr, unsigned int devfn, int where)
|
||||
{
|
||||
u32 *paddress;
|
||||
|
@ -208,15 +208,15 @@ ixp2000_pci_preinit(void)
|
|||
* use our own resource space.
|
||||
*/
|
||||
static struct resource ixp2000_pci_mem_space = {
|
||||
.start = 0x00000000,
|
||||
.start = 0xe0000000,
|
||||
.end = 0xffffffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
.name = "PCI Mem Space"
|
||||
};
|
||||
|
||||
static struct resource ixp2000_pci_io_space = {
|
||||
.start = 0x00000000,
|
||||
.end = 0xffffffff,
|
||||
.start = 0x00010000,
|
||||
.end = 0x0001ffff,
|
||||
.flags = IORESOURCE_IO,
|
||||
.name = "PCI I/O Space"
|
||||
};
|
||||
|
|
|
@ -501,15 +501,6 @@ pci_set_dma_mask(struct pci_dev *dev, u64 mask)
|
|||
return -EIO;
|
||||
}
|
||||
|
||||
int
|
||||
pci_dac_set_dma_mask(struct pci_dev *dev, u64 mask)
|
||||
{
|
||||
if (mask >= SZ_64M - 1 )
|
||||
return 0;
|
||||
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
int
|
||||
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_dac_set_dma_mask);
|
||||
EXPORT_SYMBOL(pci_set_consistent_dma_mask);
|
||||
EXPORT_SYMBOL(ixp4xx_pci_read);
|
||||
EXPORT_SYMBOL(ixp4xx_pci_write);
|
||||
|
|
|
@ -220,6 +220,30 @@ static struct platform_device stuart_device = {
|
|||
.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 = {
|
||||
&pxamci_device,
|
||||
&udc_device,
|
||||
|
@ -227,6 +251,7 @@ static struct platform_device *devices[] __initdata = {
|
|||
&ffuart_device,
|
||||
&btuart_device,
|
||||
&stuart_device,
|
||||
&i2c_device,
|
||||
};
|
||||
|
||||
static int __init pxa_init(void)
|
||||
|
|
|
@ -18,6 +18,11 @@
|
|||
|
||||
#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
|
||||
|
||||
/*
|
||||
|
@ -28,7 +33,9 @@
|
|||
|
||||
ENTRY(pxa_cpu_suspend)
|
||||
|
||||
#ifndef CONFIG_IWMMXT
|
||||
mra r2, r3, acc0
|
||||
#endif
|
||||
stmfd sp!, {r2 - r12, lr} @ save registers on stack
|
||||
|
||||
@ get coprocessor registers
|
||||
|
@ -61,14 +68,23 @@ ENTRY(pxa_cpu_suspend)
|
|||
@ prepare value for 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)
|
||||
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
|
||||
@ about suspending with PXBus operating above 133MHz
|
||||
@ (see Errata 31, GPIO output signals, ... unpredictable in sleep
|
||||
|
@ -100,6 +116,18 @@ ENTRY(pxa_cpu_suspend)
|
|||
mov r0, #0
|
||||
mcr p14, 0, r0, c6, c0, 0
|
||||
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
|
||||
b 1f
|
||||
|
@ -111,6 +139,7 @@ ENTRY(pxa_cpu_suspend)
|
|||
@ All needed values are now in registers.
|
||||
@ These last instructions should be in cache
|
||||
|
||||
#if defined(CONFIG_PXA25x) || defined(CONFIG_PXA27x)
|
||||
@ initiate the frequency change...
|
||||
str r7, [r6]
|
||||
mcr p14, 0, r0, c6, c0, 0
|
||||
|
@ -118,14 +147,27 @@ ENTRY(pxa_cpu_suspend)
|
|||
@ restore the original cpu speed value for resume
|
||||
str r8, [r6]
|
||||
|
||||
@ put SDRAM into self-refresh
|
||||
str r5, [r4]
|
||||
@ need 6 13-MHz cycles before changing PWRMODE
|
||||
@ 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
|
||||
ldr r3, [r2]
|
||||
|
||||
@ put SDRAM into self-refresh
|
||||
str r5, [r4]
|
||||
|
||||
@ 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
|
||||
|
||||
|
@ -188,7 +230,9 @@ resume_after_mmu:
|
|||
bl cpu_xscale_proc_init
|
||||
#endif
|
||||
ldmfd sp!, {r2, r3}
|
||||
#ifndef CONFIG_IWMMXT
|
||||
mar acc0, r2, r3
|
||||
#endif
|
||||
ldmfd sp!, {r4 - r12, pc} @ return to caller
|
||||
|
||||
|
||||
|
|
|
@ -409,3 +409,24 @@ config CPU_BPREDICT_DISABLE
|
|||
depends on CPU_ARM1020
|
||||
help
|
||||
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 <asm/assembler.h>
|
||||
#include "abort-macro.S"
|
||||
/*
|
||||
* Function: v6_early_abort
|
||||
*
|
||||
|
@ -13,11 +14,26 @@
|
|||
* : sp = pointer to registers
|
||||
*
|
||||
* 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
|
||||
ENTRY(v6_early_abort)
|
||||
mrc p15, 0, r1, c5, c0, 0 @ get FSR
|
||||
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
|
||||
|
||||
|
||||
|
|
|
@ -411,9 +411,10 @@ static void __init build_mem_type_table(void)
|
|||
mem_types[MT_MEMORY].prot_sect &= ~PMD_BIT4;
|
||||
mem_types[MT_ROM].prot_sect &= ~PMD_BIT4;
|
||||
/*
|
||||
* Mark cache clean areas read only from SVC mode
|
||||
* and no access from userspace.
|
||||
* Mark cache clean areas and XIP ROM read only
|
||||
* 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_CACHECLEAN].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE;
|
||||
}
|
||||
|
|
|
@ -89,6 +89,10 @@ config PAGESIZE_16
|
|||
machine with 4MB of memory.
|
||||
endmenu
|
||||
|
||||
config ISA_DMA_API
|
||||
bool
|
||||
default y
|
||||
|
||||
menu "General setup"
|
||||
|
||||
# Compressed boot loader in ROM. Yes, we really want to ask about
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <linux/ptrace.h>
|
||||
#include <linux/user.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <asm/uaccess.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_CONT:
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
if (request == PTRACE_SYSCALL)
|
||||
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:
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
child->ptrace |= PT_SINGLESTEP;
|
||||
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);
|
||||
again:
|
||||
#ifdef PEDANTIC
|
||||
if (USED_MAP(page) & ~order->all_used)
|
||||
PAGE_BUG(page);
|
||||
BUG_ON(USED_MAP(page) & ~order->all_used);
|
||||
#endif
|
||||
offset = ffz(USED_MAP(page));
|
||||
SET_USED(page, offset);
|
||||
|
@ -141,8 +140,7 @@ static void __free_small_page(unsigned long spage, struct order *order)
|
|||
goto non_small;
|
||||
|
||||
#ifdef PEDANTIC
|
||||
if (USED_MAP(page) & ~order->all_used)
|
||||
PAGE_BUG(page);
|
||||
BUG_ON(USED_MAP(page) & ~order->all_used);
|
||||
#endif
|
||||
|
||||
spage = spage >> order->shift;
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/errno.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/user.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/page.h>
|
||||
|
@ -184,7 +185,7 @@ sys_ptrace(long request, long pid, long addr, long data)
|
|||
case PTRACE_CONT:
|
||||
ret = -EIO;
|
||||
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
|
||||
if (request == PTRACE_SYSCALL) {
|
||||
|
@ -219,7 +220,7 @@ sys_ptrace(long request, long pid, long addr, long data)
|
|||
case PTRACE_SINGLESTEP:
|
||||
ret = -EIO;
|
||||
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
|
||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include <linux/user.h>
|
||||
#include <linux/config.h>
|
||||
#include <linux/security.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <asm/uaccess.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_CONT: /* restart after signal. */
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
if (request == PTRACE_SYSCALL)
|
||||
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. */
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||
ptrace_enable(child);
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <linux/ptrace.h>
|
||||
#include <linux/user.h>
|
||||
#include <linux/config.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <asm/uaccess.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_CONT: { /* restart after signal. */
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data >= _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break ;
|
||||
if (request == PTRACE_SYSCALL)
|
||||
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. */
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||
child->exit_code = data;
|
||||
|
|
|
@ -183,7 +183,7 @@ config M386
|
|||
- "Winchip-C6" for original IDT Winchip.
|
||||
- "Winchip-2" for IDT Winchip 2.
|
||||
- "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.
|
||||
- "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
|
||||
operations.
|
||||
|
||||
config MGEODE
|
||||
bool "MediaGX/Geode"
|
||||
config MGEODEGX1
|
||||
bool "GeodeGX1"
|
||||
help
|
||||
Select this for a Cyrix MediaGX aka Geode chip. Linux and GCC
|
||||
treat this chip as a 586TSC with some extended instructions
|
||||
and alignment reqirements.
|
||||
Select this for a Geode GX1 (Cyrix MediaGX) chip.
|
||||
|
||||
config MCYRIXIII
|
||||
bool "CyrixIII/VIA-C3"
|
||||
|
@ -368,7 +366,7 @@ config X86_L1_CACHE_SHIFT
|
|||
int
|
||||
default "7" if MPENTIUM4 || X86_GENERIC
|
||||
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
|
||||
|
||||
config RWSEM_GENERIC_SPINLOCK
|
||||
|
@ -387,7 +385,7 @@ config GENERIC_CALIBRATE_DELAY
|
|||
|
||||
config X86_PPRO_FENCE
|
||||
bool
|
||||
depends on M686 || M586MMX || M586TSC || M586 || M486 || M386 || MGEODE
|
||||
depends on M686 || M586MMX || M586TSC || M586 || M486 || M386 || MGEODEGX1
|
||||
default y
|
||||
|
||||
config X86_F00F_BUG
|
||||
|
@ -417,7 +415,7 @@ config X86_POPAD_OK
|
|||
|
||||
config X86_ALIGNMENT_16
|
||||
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
|
||||
|
||||
config X86_GOOD_APIC
|
||||
|
@ -442,7 +440,7 @@ config X86_USE_3DNOW
|
|||
|
||||
config X86_OOSTORE
|
||||
bool
|
||||
depends on (MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MGEODE) && MTRR
|
||||
depends on (MWINCHIP3D || MWINCHIP2 || MWINCHIPC6) && MTRR
|
||||
default y
|
||||
|
||||
config HPET_TIMER
|
||||
|
@ -578,7 +576,7 @@ config X86_VISWS_APIC
|
|||
|
||||
config X86_TSC
|
||||
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
|
||||
|
||||
config X86_MCE
|
||||
|
@ -653,6 +651,24 @@ config I8K
|
|||
Say Y if you intend to run this kernel on a Dell Inspiron 8000.
|
||||
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
|
||||
tristate "/dev/cpu/microcode - Intel IA32 CPU microcode support"
|
||||
---help---
|
||||
|
@ -1155,6 +1171,10 @@ source "drivers/pci/pcie/Kconfig"
|
|||
|
||||
source "drivers/pci/Kconfig"
|
||||
|
||||
config ISA_DMA_API
|
||||
bool
|
||||
default y
|
||||
|
||||
config ISA
|
||||
bool "ISA support"
|
||||
depends on !(X86_VOYAGER || X86_VISWS)
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
# 19990713 Artur Skawina <skawina@geocities.com>
|
||||
# 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
|
||||
|
||||
LDFLAGS := -m elf_i386
|
||||
|
@ -54,8 +54,8 @@ cflags-$(CONFIG_MVIAC3_2) += $(call cc-option,-march=c3-2,-march=i686)
|
|||
# AMD Elan support
|
||||
cflags-$(CONFIG_X86_ELAN) += -march=i486
|
||||
|
||||
# MediaGX aka Geode support
|
||||
cflags-$(CONFIG_MGEODE) += $(call cc-option,-march=pentium-mmx,-march=i586)
|
||||
# Geode GX1 support
|
||||
cflags-$(CONFIG_MGEODEGX1) += $(call cc-option,-march=pentium-mmx,-march=i486)
|
||||
|
||||
# -mregparm=3 works ok on gcc-3.0 and later
|
||||
#
|
||||
|
@ -123,7 +123,7 @@ AFLAGS += $(mflags-y)
|
|||
boot := arch/i386/boot
|
||||
|
||||
.PHONY: zImage bzImage compressed zlilo bzlilo \
|
||||
zdisk bzdisk fdimage fdimage144 fdimage288 install
|
||||
zdisk bzdisk fdimage fdimage144 fdimage288 install kernel_install
|
||||
|
||||
all: bzImage
|
||||
|
||||
|
@ -145,8 +145,9 @@ zdisk bzdisk: vmlinux
|
|||
fdimage fdimage144 fdimage288: vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) $@
|
||||
|
||||
install:
|
||||
$(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) $@
|
||||
install: vmlinux
|
||||
install kernel_install:
|
||||
$(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) install
|
||||
|
||||
prepare: include/asm-$(ARCH)/asm_offsets.h
|
||||
CLEAN_FILES += include/asm-$(ARCH)/asm_offsets.h
|
||||
|
|
|
@ -83,7 +83,7 @@ bugger_off_msg:
|
|||
.ascii "\n"
|
||||
.ascii "Remove disk and press any key to reboot . . .\r\n"
|
||||
.byte 0
|
||||
|
||||
|
||||
|
||||
# Kernel attributes; used by setup
|
||||
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
#include <linux/linkage.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/tty.h>
|
||||
#include <video/edid.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
/*
|
||||
|
|
|
@ -164,7 +164,7 @@ ramdisk_max: .long (-__PAGE_OFFSET-(512 << 20)-1) & 0x7fffffff
|
|||
trampoline: call start_of_setup
|
||||
.align 16
|
||||
# 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 #####################################################
|
||||
|
||||
start_of_setup:
|
||||
|
@ -333,9 +333,9 @@ jmpe820:
|
|||
# sizeof(e820rec).
|
||||
#
|
||||
good820:
|
||||
movb (E820NR), %al # up to 32 entries
|
||||
movb (E820NR), %al # up to 128 entries
|
||||
cmpb $E820MAX, %al
|
||||
jnl bail820
|
||||
jae bail820
|
||||
|
||||
incb (E820NR)
|
||||
movw %di, %ax
|
||||
|
|
|
@ -1924,36 +1924,36 @@ skip10: movb %ah, %al
|
|||
ret
|
||||
|
||||
store_edid:
|
||||
pushw %es # just save all registers
|
||||
pushw %ax
|
||||
pushw %es # just save all registers
|
||||
pushw %ax
|
||||
pushw %bx
|
||||
pushw %cx
|
||||
pushw %dx
|
||||
pushw %di
|
||||
|
||||
pushw %fs
|
||||
pushw %fs
|
||||
popw %es
|
||||
|
||||
movl $0x13131313, %eax # memset block with 0x13
|
||||
movw $32, %cx
|
||||
movw $0x140, %di
|
||||
cld
|
||||
rep
|
||||
stosl
|
||||
rep
|
||||
stosl
|
||||
|
||||
movw $0x4f15, %ax # do VBE/DDC
|
||||
movw $0x4f15, %ax # do VBE/DDC
|
||||
movw $0x01, %bx
|
||||
movw $0x00, %cx
|
||||
movw $0x01, %dx
|
||||
movw $0x140, %di
|
||||
int $0x10
|
||||
int $0x10
|
||||
|
||||
popw %di # restore all registers
|
||||
popw %di # restore all registers
|
||||
popw %dx
|
||||
popw %cx
|
||||
popw %bx
|
||||
popw %ax
|
||||
popw %es
|
||||
popw %es
|
||||
ret
|
||||
|
||||
# VIDEO_SELECT-only variables
|
||||
|
|
|
@ -23,6 +23,7 @@ obj-$(CONFIG_X86_TRAMPOLINE) += trampoline.o
|
|||
obj-$(CONFIG_X86_MPPARSE) += mpparse.o
|
||||
obj-$(CONFIG_X86_LOCAL_APIC) += apic.o nmi.o
|
||||
obj-$(CONFIG_X86_IO_APIC) += io_apic.o
|
||||
obj-$(CONFIG_X86_REBOOTFIXUPS) += reboot_fixups.o
|
||||
obj-$(CONFIG_X86_NUMAQ) += numaq.o
|
||||
obj-$(CONFIG_X86_SUMMIT_NUMA) += summit.o
|
||||
obj-$(CONFIG_KPROBES) += kprobes.o
|
||||
|
|
|
@ -650,7 +650,7 @@ acpi_find_rsdp (void)
|
|||
*/
|
||||
rsdp_phys = acpi_scan_rsdp (0, 0x400);
|
||||
if (!rsdp_phys)
|
||||
rsdp_phys = acpi_scan_rsdp (0xE0000, 0xFFFFF);
|
||||
rsdp_phys = acpi_scan_rsdp (0xE0000, 0x20000);
|
||||
|
||||
return rsdp_phys;
|
||||
}
|
||||
|
|
|
@ -1265,8 +1265,6 @@ int __init APIC_init_uniprocessor (void)
|
|||
|
||||
setup_local_APIC();
|
||||
|
||||
if (nmi_watchdog == NMI_LOCAL_APIC)
|
||||
check_nmi_watchdog();
|
||||
#ifdef CONFIG_X86_IO_APIC
|
||||
if (smp_found_config)
|
||||
if (!skip_ioapic_setup && nr_ioapics)
|
||||
|
|
|
@ -24,7 +24,7 @@ __asm__(".align 4\nvide: ret");
|
|||
|
||||
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;
|
||||
#endif
|
||||
u32 l, h;
|
||||
|
@ -198,7 +198,7 @@ static void __init init_amd(struct cpuinfo_x86 *c)
|
|||
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
|
||||
* distingush the cores. Assumes number of cores is a power
|
||||
|
|
|
@ -218,12 +218,12 @@ typedef struct {
|
|||
mtrr_type type;
|
||||
} 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}
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
|
|
|
@ -124,8 +124,8 @@ int generic_get_free_region(unsigned long base, unsigned long size)
|
|||
return -ENOSPC;
|
||||
}
|
||||
|
||||
void generic_get_mtrr(unsigned int reg, unsigned long *base,
|
||||
unsigned int *size, mtrr_type * type)
|
||||
static void generic_get_mtrr(unsigned int reg, unsigned long *base,
|
||||
unsigned int *size, mtrr_type * type)
|
||||
{
|
||||
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)
|
||||
{
|
||||
struct pci_dev *dev;
|
||||
u8 rev;
|
||||
|
||||
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 */
|
||||
if (dev->vendor == PCI_VENDOR_ID_SERVERWORKS &&
|
||||
dev->device == PCI_DEVICE_ID_SERVERWORKS_LE) {
|
||||
printk(KERN_INFO "mtrr: Serverworks LE detected. Write-combining disabled.\n");
|
||||
pci_dev_put(dev);
|
||||
return 0;
|
||||
pci_read_config_byte(dev, PCI_CLASS_REVISION, &rev);
|
||||
if (rev <= 5) {
|
||||
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 */
|
||||
if (dev->vendor == PCI_VENDOR_ID_INTEL &&
|
||||
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",
|
||||
|
||||
/* 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, "mp", "nx", NULL, "mmxext", NULL,
|
||||
NULL, "fxsr_opt", NULL, NULL, NULL, "lm", "3dnowext", "3dnow",
|
||||
|
|
|
@ -260,11 +260,9 @@ restore_nocheck:
|
|||
.section .fixup,"ax"
|
||||
iret_exc:
|
||||
sti
|
||||
movl $__USER_DS, %edx
|
||||
movl %edx, %ds
|
||||
movl %edx, %es
|
||||
movl $11,%eax
|
||||
call do_exit
|
||||
pushl $0 # no error code
|
||||
pushl $do_iret_error
|
||||
jmp error_code
|
||||
.previous
|
||||
.section __ex_table,"a"
|
||||
.align 4
|
||||
|
@ -516,8 +514,6 @@ debug_stack_correct:
|
|||
xorl %edx,%edx # error code 0
|
||||
movl %esp,%eax # pt_regs pointer
|
||||
call do_debug
|
||||
testl %eax,%eax
|
||||
jnz restore_all
|
||||
jmp ret_from_exception
|
||||
|
||||
/*
|
||||
|
@ -598,8 +594,6 @@ ENTRY(int3)
|
|||
xorl %edx,%edx # zero error code
|
||||
movl %esp,%eax # pt_regs pointer
|
||||
call do_int3
|
||||
testl %eax,%eax
|
||||
jnz restore_all
|
||||
jmp ret_from_exception
|
||||
|
||||
ENTRY(overflow)
|
||||
|
@ -658,296 +652,6 @@ ENTRY(spurious_interrupt_bug)
|
|||
pushl $do_spurious_interrupt_bug
|
||||
jmp error_code
|
||||
|
||||
.data
|
||||
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
|
||||
#include "syscall_table.S"
|
||||
|
||||
syscall_table_size=(.-sys_call_table)
|
||||
|
|
|
@ -380,6 +380,7 @@ rp_sidt:
|
|||
ALIGN
|
||||
ignore_int:
|
||||
cld
|
||||
#ifdef CONFIG_PRINTK
|
||||
pushl %eax
|
||||
pushl %ecx
|
||||
pushl %edx
|
||||
|
@ -400,6 +401,7 @@ ignore_int:
|
|||
popl %edx
|
||||
popl %ecx
|
||||
popl %eax
|
||||
#endif
|
||||
iret
|
||||
|
||||
/*
|
||||
|
|
|
@ -169,10 +169,6 @@ EXPORT_SYMBOL(rtc_lock);
|
|||
EXPORT_SYMBOL_GPL(set_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);
|
||||
#ifdef CONFIG_HAVE_DEC_LOCK
|
||||
EXPORT_SYMBOL(_atomic_dec_and_lock);
|
||||
|
|
|
@ -2175,7 +2175,6 @@ static inline void check_timer(void)
|
|||
disable_8259A_irq(0);
|
||||
setup_nmi();
|
||||
enable_8259A_irq(0);
|
||||
check_nmi_watchdog();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -2198,7 +2197,6 @@ static inline void check_timer(void)
|
|||
add_pin_to_irq(0, 0, pin2);
|
||||
if (nmi_watchdog == NMI_IO_APIC) {
|
||||
setup_nmi();
|
||||
check_nmi_watchdog();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -217,6 +217,13 @@ static void resume_execution(struct kprobe *p, struct pt_regs *regs)
|
|||
*tos &= ~(TF_MASK | IF_MASK);
|
||||
*tos |= kprobe_old_eflags;
|
||||
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 */
|
||||
*tos = orig_eip + (*tos - copy_eip);
|
||||
break;
|
||||
|
|
|
@ -102,20 +102,21 @@ int nmi_active;
|
|||
(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)
|
||||
|
||||
int __init check_nmi_watchdog (void)
|
||||
static int __init check_nmi_watchdog(void)
|
||||
{
|
||||
unsigned int prev_nmi_count[NR_CPUS];
|
||||
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++)
|
||||
prev_nmi_count[cpu] = per_cpu(irq_stat, cpu).__nmi_count;
|
||||
local_irq_enable();
|
||||
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++) {
|
||||
#ifdef CONFIG_SMP
|
||||
/* Check cpu_callin_map here because that is set
|
||||
|
@ -139,6 +140,8 @@ int __init check_nmi_watchdog (void)
|
|||
|
||||
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)
|
||||
{
|
||||
|
|
|
@ -400,11 +400,6 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long esp,
|
|||
int err;
|
||||
|
||||
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.
|
||||
* 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
|
||||
* 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;
|
||||
|
||||
|
@ -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
|
||||
* those are always kernel segments while inside the kernel.
|
||||
*/
|
||||
asm volatile("movl %%fs,%0":"=m" (*(int *)&prev->fs));
|
||||
asm volatile("movl %%gs,%0":"=m" (*(int *)&prev->gs));
|
||||
asm volatile("mov %%fs,%0":"=m" (prev->fs));
|
||||
asm volatile("mov %%gs,%0":"=m" (prev->gs));
|
||||
|
||||
/*
|
||||
* Restore %fs and %gs if needed.
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include <linux/security.h>
|
||||
#include <linux/audit.h>
|
||||
#include <linux/seccomp.h>
|
||||
#include <linux/signal.h>
|
||||
|
||||
#include <asm/uaccess.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_CONT: /* restart after signal. */
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
if (request == PTRACE_SYSCALL) {
|
||||
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. */
|
||||
ret = -EIO;
|
||||
if ((unsigned long) data > _NSIG)
|
||||
if (!valid_signal(data))
|
||||
break;
|
||||
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
|
||||
set_singlestep(child);
|
||||
|
@ -682,24 +683,18 @@ void do_syscall_trace(struct pt_regs *regs, int entryexit)
|
|||
/* do the secure computing check first */
|
||||
secure_computing(regs->orig_eax);
|
||||
|
||||
if (unlikely(current->audit_context)) {
|
||||
if (!entryexit)
|
||||
audit_syscall_entry(current, regs->orig_eax,
|
||||
regs->ebx, regs->ecx,
|
||||
regs->edx, regs->esi);
|
||||
else
|
||||
audit_syscall_exit(current, regs->eax);
|
||||
}
|
||||
if (unlikely(current->audit_context) && entryexit)
|
||||
audit_syscall_exit(current, AUDITSC_RESULT(regs->eax), regs->eax);
|
||||
|
||||
if (!(current->ptrace & PT_PTRACED))
|
||||
return;
|
||||
goto out;
|
||||
|
||||
/* Fake a debug trap */
|
||||
if (test_thread_flag(TIF_SINGLESTEP))
|
||||
send_sigtrap(current, regs, 0);
|
||||
|
||||
if (!test_thread_flag(TIF_SYSCALL_TRACE))
|
||||
return;
|
||||
goto out;
|
||||
|
||||
/* the 0x80 provides a way for the tracing parent to distinguish
|
||||
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);
|
||||
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 a new issue