You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'linus' into sched/core
Merge reason: branch had an old upstream base (-rc1-ish), but also
merge to avoid a conflict.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
@@ -27,6 +27,7 @@
|
|||||||
*.gz
|
*.gz
|
||||||
*.lzma
|
*.lzma
|
||||||
*.patch
|
*.patch
|
||||||
|
*.gcno
|
||||||
|
|
||||||
#
|
#
|
||||||
# Top-level generic files
|
# Top-level generic files
|
||||||
|
|||||||
@@ -184,8 +184,6 @@ usage should require reading the full document.
|
|||||||
!Finclude/net/mac80211.h ieee80211_ctstoself_get
|
!Finclude/net/mac80211.h ieee80211_ctstoself_get
|
||||||
!Finclude/net/mac80211.h ieee80211_ctstoself_duration
|
!Finclude/net/mac80211.h ieee80211_ctstoself_duration
|
||||||
!Finclude/net/mac80211.h ieee80211_generic_frame_duration
|
!Finclude/net/mac80211.h ieee80211_generic_frame_duration
|
||||||
!Finclude/net/mac80211.h ieee80211_get_hdrlen_from_skb
|
|
||||||
!Finclude/net/mac80211.h ieee80211_hdrlen
|
|
||||||
!Finclude/net/mac80211.h ieee80211_wake_queue
|
!Finclude/net/mac80211.h ieee80211_wake_queue
|
||||||
!Finclude/net/mac80211.h ieee80211_stop_queue
|
!Finclude/net/mac80211.h ieee80211_stop_queue
|
||||||
!Finclude/net/mac80211.h ieee80211_wake_queues
|
!Finclude/net/mac80211.h ieee80211_wake_queues
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ encouraged them to allow separation of the data and integrity metadata
|
|||||||
scatter-gather lists.
|
scatter-gather lists.
|
||||||
|
|
||||||
The controller will interleave the buffers on write and split them on
|
The controller will interleave the buffers on write and split them on
|
||||||
read. This means that the Linux can DMA the data buffers to and from
|
read. This means that Linux can DMA the data buffers to and from
|
||||||
host memory without changes to the page cache.
|
host memory without changes to the page cache.
|
||||||
|
|
||||||
Also, the 16-bit CRC checksum mandated by both the SCSI and SATA specs
|
Also, the 16-bit CRC checksum mandated by both the SCSI and SATA specs
|
||||||
@@ -66,7 +66,7 @@ software RAID5).
|
|||||||
|
|
||||||
The IP checksum is weaker than the CRC in terms of detecting bit
|
The IP checksum is weaker than the CRC in terms of detecting bit
|
||||||
errors. However, the strength is really in the separation of the data
|
errors. However, the strength is really in the separation of the data
|
||||||
buffers and the integrity metadata. These two distinct buffers much
|
buffers and the integrity metadata. These two distinct buffers must
|
||||||
match up for an I/O to complete.
|
match up for an I/O to complete.
|
||||||
|
|
||||||
The separation of the data and integrity metadata buffers as well as
|
The separation of the data and integrity metadata buffers as well as
|
||||||
|
|||||||
@@ -777,6 +777,18 @@ in cpuset directories:
|
|||||||
# /bin/echo 1-4 > cpus -> set cpus list to cpus 1,2,3,4
|
# /bin/echo 1-4 > cpus -> set cpus list to cpus 1,2,3,4
|
||||||
# /bin/echo 1,2,3,4 > cpus -> set cpus list to cpus 1,2,3,4
|
# /bin/echo 1,2,3,4 > cpus -> set cpus list to cpus 1,2,3,4
|
||||||
|
|
||||||
|
To add a CPU to a cpuset, write the new list of CPUs including the
|
||||||
|
CPU to be added. To add 6 to the above cpuset:
|
||||||
|
|
||||||
|
# /bin/echo 1-4,6 > cpus -> set cpus list to cpus 1,2,3,4,6
|
||||||
|
|
||||||
|
Similarly to remove a CPU from a cpuset, write the new list of CPUs
|
||||||
|
without the CPU to be removed.
|
||||||
|
|
||||||
|
To remove all the CPUs:
|
||||||
|
|
||||||
|
# /bin/echo "" > cpus -> clear cpus list
|
||||||
|
|
||||||
2.3 Setting flags
|
2.3 Setting flags
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
|||||||
@@ -207,8 +207,8 @@ Attributes
|
|||||||
~~~~~~~~~~
|
~~~~~~~~~~
|
||||||
struct driver_attribute {
|
struct driver_attribute {
|
||||||
struct attribute attr;
|
struct attribute attr;
|
||||||
ssize_t (*show)(struct device_driver *, char * buf, size_t count, loff_t off);
|
ssize_t (*show)(struct device_driver *driver, char *buf);
|
||||||
ssize_t (*store)(struct device_driver *, const char * buf, size_t count, loff_t off);
|
ssize_t (*store)(struct device_driver *, const char * buf, size_t count);
|
||||||
};
|
};
|
||||||
|
|
||||||
Device drivers can export attributes via their sysfs directories.
|
Device drivers can export attributes via their sysfs directories.
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ use IO::Handle;
|
|||||||
"tda10046lifeview", "av7110", "dec2000t", "dec2540t",
|
"tda10046lifeview", "av7110", "dec2000t", "dec2540t",
|
||||||
"dec3000s", "vp7041", "dibusb", "nxt2002", "nxt2004",
|
"dec3000s", "vp7041", "dibusb", "nxt2002", "nxt2004",
|
||||||
"or51211", "or51132_qam", "or51132_vsb", "bluebird",
|
"or51211", "or51132_qam", "or51132_vsb", "bluebird",
|
||||||
"opera1", "cx231xx", "cx18", "cx23885", "pvrusb2" );
|
"opera1", "cx231xx", "cx18", "cx23885", "pvrusb2", "mpc718" );
|
||||||
|
|
||||||
# Check args
|
# Check args
|
||||||
syntax() if (scalar(@ARGV) != 1);
|
syntax() if (scalar(@ARGV) != 1);
|
||||||
@@ -381,6 +381,57 @@ sub cx18 {
|
|||||||
$allfiles;
|
$allfiles;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub mpc718 {
|
||||||
|
my $archive = 'Yuan MPC718 TV Tuner Card 2.13.10.1016.zip';
|
||||||
|
my $url = "ftp://ftp.work.acer-euro.com/desktop/aspire_idea510/vista/Drivers/$archive";
|
||||||
|
my $fwfile = "dvb-cx18-mpc718-mt352.fw";
|
||||||
|
my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
|
||||||
|
|
||||||
|
checkstandard();
|
||||||
|
wgetfile($archive, $url);
|
||||||
|
unzip($archive, $tmpdir);
|
||||||
|
|
||||||
|
my $sourcefile = "$tmpdir/Yuan MPC718 TV Tuner Card 2.13.10.1016/mpc718_32bit/yuanrap.sys";
|
||||||
|
my $found = 0;
|
||||||
|
|
||||||
|
open IN, '<', $sourcefile or die "Couldn't open $sourcefile to extract $fwfile data\n";
|
||||||
|
binmode IN;
|
||||||
|
open OUT, '>', $fwfile;
|
||||||
|
binmode OUT;
|
||||||
|
{
|
||||||
|
# Block scope because we change the line terminator variable $/
|
||||||
|
my $prevlen = 0;
|
||||||
|
my $currlen;
|
||||||
|
|
||||||
|
# Buried in the data segment are 3 runs of almost identical
|
||||||
|
# register-value pairs that end in 0x5d 0x01 which is a "TUNER GO"
|
||||||
|
# command for the MT352.
|
||||||
|
# Pull out the middle run (because it's easy) of register-value
|
||||||
|
# pairs to make the "firmware" file.
|
||||||
|
|
||||||
|
local $/ = "\x5d\x01"; # MT352 "TUNER GO"
|
||||||
|
|
||||||
|
while (<IN>) {
|
||||||
|
$currlen = length($_);
|
||||||
|
if ($prevlen == $currlen && $currlen <= 64) {
|
||||||
|
chop; chop; # Get rid of "TUNER GO"
|
||||||
|
s/^\0\0//; # get rid of leading 00 00 if it's there
|
||||||
|
printf OUT "$_";
|
||||||
|
$found = 1;
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
$prevlen = $currlen;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close OUT;
|
||||||
|
close IN;
|
||||||
|
if (!$found) {
|
||||||
|
unlink $fwfile;
|
||||||
|
die "Couldn't find valid register-value sequence in $sourcefile for $fwfile\n";
|
||||||
|
}
|
||||||
|
$fwfile;
|
||||||
|
}
|
||||||
|
|
||||||
sub cx23885 {
|
sub cx23885 {
|
||||||
my $url = "http://linuxtv.org/downloads/firmware/";
|
my $url = "http://linuxtv.org/downloads/firmware/";
|
||||||
|
|
||||||
|
|||||||
@@ -458,3 +458,13 @@ Why: Remove the old legacy 32bit machine check code. This has been
|
|||||||
but the old version has been kept around for easier testing. Note this
|
but the old version has been kept around for easier testing. Note this
|
||||||
doesn't impact the old P5 and WinChip machine check handlers.
|
doesn't impact the old P5 and WinChip machine check handlers.
|
||||||
Who: Andi Kleen <andi@firstfloor.org>
|
Who: Andi Kleen <andi@firstfloor.org>
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
What: lock_policy_rwsem_* and unlock_policy_rwsem_* will not be
|
||||||
|
exported interface anymore.
|
||||||
|
When: 2.6.33
|
||||||
|
Why: cpu_policy_rwsem has a new cleaner definition making it local to
|
||||||
|
cpufreq core and contained inside cpufreq.c. Other dependent
|
||||||
|
drivers should not use it in order to safely avoid lockdep issues.
|
||||||
|
Who: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
|
||||||
|
|||||||
+16
-9
@@ -188,13 +188,18 @@ Solution: Exclude affected source files from profiling by specifying
|
|||||||
GCOV_PROFILE := n or GCOV_PROFILE_basename.o := n in the
|
GCOV_PROFILE := n or GCOV_PROFILE_basename.o := n in the
|
||||||
corresponding Makefile.
|
corresponding Makefile.
|
||||||
|
|
||||||
|
Problem: Files copied from sysfs appear empty or incomplete.
|
||||||
|
Cause: Due to the way seq_file works, some tools such as cp or tar
|
||||||
|
may not correctly copy files from sysfs.
|
||||||
|
Solution: Use 'cat' to read .gcda files and 'cp -d' to copy links.
|
||||||
|
Alternatively use the mechanism shown in Appendix B.
|
||||||
|
|
||||||
|
|
||||||
Appendix A: gather_on_build.sh
|
Appendix A: gather_on_build.sh
|
||||||
==============================
|
==============================
|
||||||
|
|
||||||
Sample script to gather coverage meta files on the build machine
|
Sample script to gather coverage meta files on the build machine
|
||||||
(see 6a):
|
(see 6a):
|
||||||
|
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
KSRC=$1
|
KSRC=$1
|
||||||
@@ -226,7 +231,7 @@ Appendix B: gather_on_test.sh
|
|||||||
Sample script to gather coverage data files on the test machine
|
Sample script to gather coverage data files on the test machine
|
||||||
(see 6b):
|
(see 6b):
|
||||||
|
|
||||||
#!/bin/bash
|
#!/bin/bash -e
|
||||||
|
|
||||||
DEST=$1
|
DEST=$1
|
||||||
GCDA=/sys/kernel/debug/gcov
|
GCDA=/sys/kernel/debug/gcov
|
||||||
@@ -236,11 +241,13 @@ if [ -z "$DEST" ] ; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
find $GCDA -name '*.gcno' -o -name '*.gcda' | tar cfz $DEST -T -
|
TEMPDIR=$(mktemp -d)
|
||||||
|
echo Collecting data..
|
||||||
|
find $GCDA -type d -exec mkdir -p $TEMPDIR/\{\} \;
|
||||||
|
find $GCDA -name '*.gcda' -exec sh -c 'cat < $0 > '$TEMPDIR'/$0' {} \;
|
||||||
|
find $GCDA -name '*.gcno' -exec sh -c 'cp -d $0 '$TEMPDIR'/$0' {} \;
|
||||||
|
tar czf $DEST -C $TEMPDIR sys
|
||||||
|
rm -rf $TEMPDIR
|
||||||
|
|
||||||
if [ $? -eq 0 ] ; then
|
echo "$DEST successfully created, copy to build system and unpack with:"
|
||||||
echo "$DEST successfully created, copy to build system and unpack with:"
|
echo " tar xfz $DEST"
|
||||||
echo " tar xfz $DEST"
|
|
||||||
else
|
|
||||||
echo "Could not create file $DEST"
|
|
||||||
fi
|
|
||||||
|
|||||||
@@ -1720,8 +1720,8 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||||||
oprofile.cpu_type= Force an oprofile cpu type
|
oprofile.cpu_type= Force an oprofile cpu type
|
||||||
This might be useful if you have an older oprofile
|
This might be useful if you have an older oprofile
|
||||||
userland or if you want common events.
|
userland or if you want common events.
|
||||||
Format: { archperfmon }
|
Format: { arch_perfmon }
|
||||||
archperfmon: [X86] Force use of architectural
|
arch_perfmon: [X86] Force use of architectural
|
||||||
perfmon on Intel CPUs instead of the
|
perfmon on Intel CPUs instead of the
|
||||||
CPU specific event set.
|
CPU specific event set.
|
||||||
|
|
||||||
|
|||||||
@@ -16,13 +16,17 @@ Usage
|
|||||||
-----
|
-----
|
||||||
|
|
||||||
CONFIG_DEBUG_KMEMLEAK in "Kernel hacking" has to be enabled. A kernel
|
CONFIG_DEBUG_KMEMLEAK in "Kernel hacking" has to be enabled. A kernel
|
||||||
thread scans the memory every 10 minutes (by default) and prints any new
|
thread scans the memory every 10 minutes (by default) and prints the
|
||||||
unreferenced objects found. To trigger an intermediate scan and display
|
number of new unreferenced objects found. To display the details of all
|
||||||
all the possible memory leaks:
|
the possible memory leaks:
|
||||||
|
|
||||||
# mount -t debugfs nodev /sys/kernel/debug/
|
# mount -t debugfs nodev /sys/kernel/debug/
|
||||||
# cat /sys/kernel/debug/kmemleak
|
# cat /sys/kernel/debug/kmemleak
|
||||||
|
|
||||||
|
To trigger an intermediate memory scan:
|
||||||
|
|
||||||
|
# echo scan > /sys/kernel/debug/kmemleak
|
||||||
|
|
||||||
Note that the orphan objects are listed in the order they were allocated
|
Note that the orphan objects are listed in the order they were allocated
|
||||||
and one object at the beginning of the list may cause other subsequent
|
and one object at the beginning of the list may cause other subsequent
|
||||||
objects to be reported as orphan.
|
objects to be reported as orphan.
|
||||||
@@ -31,16 +35,21 @@ Memory scanning parameters can be modified at run-time by writing to the
|
|||||||
/sys/kernel/debug/kmemleak file. The following parameters are supported:
|
/sys/kernel/debug/kmemleak file. The following parameters are supported:
|
||||||
|
|
||||||
off - disable kmemleak (irreversible)
|
off - disable kmemleak (irreversible)
|
||||||
stack=on - enable the task stacks scanning
|
stack=on - enable the task stacks scanning (default)
|
||||||
stack=off - disable the tasks stacks scanning
|
stack=off - disable the tasks stacks scanning
|
||||||
scan=on - start the automatic memory scanning thread
|
scan=on - start the automatic memory scanning thread (default)
|
||||||
scan=off - stop the automatic memory scanning thread
|
scan=off - stop the automatic memory scanning thread
|
||||||
scan=<secs> - set the automatic memory scanning period in seconds (0
|
scan=<secs> - set the automatic memory scanning period in seconds
|
||||||
to disable it)
|
(default 600, 0 to stop the automatic scanning)
|
||||||
|
scan - trigger a memory scan
|
||||||
|
|
||||||
Kmemleak can also be disabled at boot-time by passing "kmemleak=off" on
|
Kmemleak can also be disabled at boot-time by passing "kmemleak=off" on
|
||||||
the kernel command line.
|
the kernel command line.
|
||||||
|
|
||||||
|
Memory may be allocated or freed before kmemleak is initialised and
|
||||||
|
these actions are stored in an early log buffer. The size of this buffer
|
||||||
|
is configured via the CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE option.
|
||||||
|
|
||||||
Basic Algorithm
|
Basic Algorithm
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ The remaining CPU time will be used for user input and other tasks. Because
|
|||||||
realtime tasks have explicitly allocated the CPU time they need to perform
|
realtime tasks have explicitly allocated the CPU time they need to perform
|
||||||
their tasks, buffer underruns in the graphics or audio can be eliminated.
|
their tasks, buffer underruns in the graphics or audio can be eliminated.
|
||||||
|
|
||||||
NOTE: the above example is not fully implemented as of yet (2.6.25). We still
|
NOTE: the above example is not fully implemented yet. We still
|
||||||
lack an EDF scheduler to make non-uniform periods usable.
|
lack an EDF scheduler to make non-uniform periods usable.
|
||||||
|
|
||||||
|
|
||||||
@@ -140,14 +140,15 @@ The other option is:
|
|||||||
|
|
||||||
.o CONFIG_CGROUP_SCHED (aka "Basis for grouping tasks" = "Control groups")
|
.o CONFIG_CGROUP_SCHED (aka "Basis for grouping tasks" = "Control groups")
|
||||||
|
|
||||||
This uses the /cgroup virtual file system and "/cgroup/<cgroup>/cpu.rt_runtime_us"
|
This uses the /cgroup virtual file system and
|
||||||
to control the CPU time reserved for each control group instead.
|
"/cgroup/<cgroup>/cpu.rt_runtime_us" to control the CPU time reserved for each
|
||||||
|
control group instead.
|
||||||
|
|
||||||
For more information on working with control groups, you should read
|
For more information on working with control groups, you should read
|
||||||
Documentation/cgroups/cgroups.txt as well.
|
Documentation/cgroups/cgroups.txt as well.
|
||||||
|
|
||||||
Group settings are checked against the following limits in order to keep the configuration
|
Group settings are checked against the following limits in order to keep the
|
||||||
schedulable:
|
configuration schedulable:
|
||||||
|
|
||||||
\Sum_{i} runtime_{i} / global_period <= global_runtime / global_period
|
\Sum_{i} runtime_{i} / global_period <= global_runtime / global_period
|
||||||
|
|
||||||
@@ -189,7 +190,7 @@ Implementing SCHED_EDF might take a while to complete. Priority Inheritance is
|
|||||||
the biggest challenge as the current linux PI infrastructure is geared towards
|
the biggest challenge as the current linux PI infrastructure is geared towards
|
||||||
the limited static priority levels 0-99. With deadline scheduling you need to
|
the limited static priority levels 0-99. With deadline scheduling you need to
|
||||||
do deadline inheritance (since priority is inversely proportional to the
|
do deadline inheritance (since priority is inversely proportional to the
|
||||||
deadline delta (deadline - now).
|
deadline delta (deadline - now)).
|
||||||
|
|
||||||
This means the whole PI machinery will have to be reworked - and that is one of
|
This means the whole PI machinery will have to be reworked - and that is one of
|
||||||
the most complex pieces of code we have.
|
the most complex pieces of code we have.
|
||||||
|
|||||||
@@ -240,6 +240,7 @@ AD1986A
|
|||||||
laptop-automute 2-channel with EAPD and HP-automute (Lenovo N100)
|
laptop-automute 2-channel with EAPD and HP-automute (Lenovo N100)
|
||||||
ultra 2-channel with EAPD (Samsung Ultra tablet PC)
|
ultra 2-channel with EAPD (Samsung Ultra tablet PC)
|
||||||
samsung 2-channel with EAPD (Samsung R65)
|
samsung 2-channel with EAPD (Samsung R65)
|
||||||
|
samsung-p50 2-channel with HP-automute (Samsung P50)
|
||||||
|
|
||||||
AD1988/AD1988B/AD1989A/AD1989B
|
AD1988/AD1988B/AD1989A/AD1989B
|
||||||
==============================
|
==============================
|
||||||
|
|||||||
@@ -99,11 +99,13 @@ void parse_opts(int argc, char *argv[])
|
|||||||
{ "lsb", 0, 0, 'L' },
|
{ "lsb", 0, 0, 'L' },
|
||||||
{ "cs-high", 0, 0, 'C' },
|
{ "cs-high", 0, 0, 'C' },
|
||||||
{ "3wire", 0, 0, '3' },
|
{ "3wire", 0, 0, '3' },
|
||||||
|
{ "no-cs", 0, 0, 'N' },
|
||||||
|
{ "ready", 0, 0, 'R' },
|
||||||
{ NULL, 0, 0, 0 },
|
{ NULL, 0, 0, 0 },
|
||||||
};
|
};
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
c = getopt_long(argc, argv, "D:s:d:b:lHOLC3", lopts, NULL);
|
c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR", lopts, NULL);
|
||||||
|
|
||||||
if (c == -1)
|
if (c == -1)
|
||||||
break;
|
break;
|
||||||
@@ -139,6 +141,12 @@ void parse_opts(int argc, char *argv[])
|
|||||||
case '3':
|
case '3':
|
||||||
mode |= SPI_3WIRE;
|
mode |= SPI_3WIRE;
|
||||||
break;
|
break;
|
||||||
|
case 'N':
|
||||||
|
mode |= SPI_NO_CS;
|
||||||
|
break;
|
||||||
|
case 'R':
|
||||||
|
mode |= SPI_READY;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
print_usage(argv[0]);
|
print_usage(argv[0]);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -66,3 +66,4 @@
|
|||||||
68 -> Terratec AV350 (em2860) [0ccd:0084]
|
68 -> Terratec AV350 (em2860) [0ccd:0084]
|
||||||
69 -> KWorld ATSC 315U HDTV TV Box (em2882) [eb1a:a313]
|
69 -> KWorld ATSC 315U HDTV TV Box (em2882) [eb1a:a313]
|
||||||
70 -> Evga inDtube (em2882)
|
70 -> Evga inDtube (em2882)
|
||||||
|
71 -> Silvercrest Webcam 1.3mpix (em2820/em2840)
|
||||||
|
|||||||
@@ -2,3 +2,5 @@
|
|||||||
- this file
|
- this file
|
||||||
mtrr.txt
|
mtrr.txt
|
||||||
- how to use x86 Memory Type Range Registers to increase performance
|
- how to use x86 Memory Type Range Registers to increase performance
|
||||||
|
exception-tables.txt
|
||||||
|
- why and how Linux kernel uses exception tables on x86
|
||||||
|
|||||||
@@ -1,123 +1,123 @@
|
|||||||
Kernel level exception handling in Linux 2.1.8
|
Kernel level exception handling in Linux
|
||||||
Commentary by Joerg Pommnitz <joerg@raleigh.ibm.com>
|
Commentary by Joerg Pommnitz <joerg@raleigh.ibm.com>
|
||||||
|
|
||||||
When a process runs in kernel mode, it often has to access user
|
When a process runs in kernel mode, it often has to access user
|
||||||
mode memory whose address has been passed by an untrusted program.
|
mode memory whose address has been passed by an untrusted program.
|
||||||
To protect itself the kernel has to verify this address.
|
To protect itself the kernel has to verify this address.
|
||||||
|
|
||||||
In older versions of Linux this was done with the
|
In older versions of Linux this was done with the
|
||||||
int verify_area(int type, const void * addr, unsigned long size)
|
int verify_area(int type, const void * addr, unsigned long size)
|
||||||
function (which has since been replaced by access_ok()).
|
function (which has since been replaced by access_ok()).
|
||||||
|
|
||||||
This function verified that the memory area starting at address
|
This function verified that the memory area starting at address
|
||||||
'addr' and of size 'size' was accessible for the operation specified
|
'addr' and of size 'size' was accessible for the operation specified
|
||||||
in type (read or write). To do this, verify_read had to look up the
|
in type (read or write). To do this, verify_read had to look up the
|
||||||
virtual memory area (vma) that contained the address addr. In the
|
virtual memory area (vma) that contained the address addr. In the
|
||||||
normal case (correctly working program), this test was successful.
|
normal case (correctly working program), this test was successful.
|
||||||
It only failed for a few buggy programs. In some kernel profiling
|
It only failed for a few buggy programs. In some kernel profiling
|
||||||
tests, this normally unneeded verification used up a considerable
|
tests, this normally unneeded verification used up a considerable
|
||||||
amount of time.
|
amount of time.
|
||||||
|
|
||||||
To overcome this situation, Linus decided to let the virtual memory
|
To overcome this situation, Linus decided to let the virtual memory
|
||||||
hardware present in every Linux-capable CPU handle this test.
|
hardware present in every Linux-capable CPU handle this test.
|
||||||
|
|
||||||
How does this work?
|
How does this work?
|
||||||
|
|
||||||
Whenever the kernel tries to access an address that is currently not
|
Whenever the kernel tries to access an address that is currently not
|
||||||
accessible, the CPU generates a page fault exception and calls the
|
accessible, the CPU generates a page fault exception and calls the
|
||||||
page fault handler
|
page fault handler
|
||||||
|
|
||||||
void do_page_fault(struct pt_regs *regs, unsigned long error_code)
|
void do_page_fault(struct pt_regs *regs, unsigned long error_code)
|
||||||
|
|
||||||
in arch/i386/mm/fault.c. The parameters on the stack are set up by
|
in arch/x86/mm/fault.c. The parameters on the stack are set up by
|
||||||
the low level assembly glue in arch/i386/kernel/entry.S. The parameter
|
the low level assembly glue in arch/x86/kernel/entry_32.S. The parameter
|
||||||
regs is a pointer to the saved registers on the stack, error_code
|
regs is a pointer to the saved registers on the stack, error_code
|
||||||
contains a reason code for the exception.
|
contains a reason code for the exception.
|
||||||
|
|
||||||
do_page_fault first obtains the unaccessible address from the CPU
|
do_page_fault first obtains the unaccessible address from the CPU
|
||||||
control register CR2. If the address is within the virtual address
|
control register CR2. If the address is within the virtual address
|
||||||
space of the process, the fault probably occurred, because the page
|
space of the process, the fault probably occurred, because the page
|
||||||
was not swapped in, write protected or something similar. However,
|
was not swapped in, write protected or something similar. However,
|
||||||
we are interested in the other case: the address is not valid, there
|
we are interested in the other case: the address is not valid, there
|
||||||
is no vma that contains this address. In this case, the kernel jumps
|
is no vma that contains this address. In this case, the kernel jumps
|
||||||
to the bad_area label.
|
to the bad_area label.
|
||||||
|
|
||||||
There it uses the address of the instruction that caused the exception
|
There it uses the address of the instruction that caused the exception
|
||||||
(i.e. regs->eip) to find an address where the execution can continue
|
(i.e. regs->eip) to find an address where the execution can continue
|
||||||
(fixup). If this search is successful, the fault handler modifies the
|
(fixup). If this search is successful, the fault handler modifies the
|
||||||
return address (again regs->eip) and returns. The execution will
|
return address (again regs->eip) and returns. The execution will
|
||||||
continue at the address in fixup.
|
continue at the address in fixup.
|
||||||
|
|
||||||
Where does fixup point to?
|
Where does fixup point to?
|
||||||
|
|
||||||
Since we jump to the contents of fixup, fixup obviously points
|
Since we jump to the contents of fixup, fixup obviously points
|
||||||
to executable code. This code is hidden inside the user access macros.
|
to executable code. This code is hidden inside the user access macros.
|
||||||
I have picked the get_user macro defined in include/asm/uaccess.h as an
|
I have picked the get_user macro defined in arch/x86/include/asm/uaccess.h
|
||||||
example. The definition is somewhat hard to follow, so let's peek at
|
as an example. The definition is somewhat hard to follow, so let's peek at
|
||||||
the code generated by the preprocessor and the compiler. I selected
|
the code generated by the preprocessor and the compiler. I selected
|
||||||
the get_user call in drivers/char/console.c for a detailed examination.
|
the get_user call in drivers/char/sysrq.c for a detailed examination.
|
||||||
|
|
||||||
The original code in console.c line 1405:
|
The original code in sysrq.c line 587:
|
||||||
get_user(c, buf);
|
get_user(c, buf);
|
||||||
|
|
||||||
The preprocessor output (edited to become somewhat readable):
|
The preprocessor output (edited to become somewhat readable):
|
||||||
|
|
||||||
(
|
(
|
||||||
{
|
{
|
||||||
long __gu_err = - 14 , __gu_val = 0;
|
long __gu_err = - 14 , __gu_val = 0;
|
||||||
const __typeof__(*( ( buf ) )) *__gu_addr = ((buf));
|
const __typeof__(*( ( buf ) )) *__gu_addr = ((buf));
|
||||||
if (((((0 + current_set[0])->tss.segment) == 0x18 ) ||
|
if (((((0 + current_set[0])->tss.segment) == 0x18 ) ||
|
||||||
(((sizeof(*(buf))) <= 0xC0000000UL) &&
|
(((sizeof(*(buf))) <= 0xC0000000UL) &&
|
||||||
((unsigned long)(__gu_addr ) <= 0xC0000000UL - (sizeof(*(buf)))))))
|
((unsigned long)(__gu_addr ) <= 0xC0000000UL - (sizeof(*(buf)))))))
|
||||||
do {
|
do {
|
||||||
__gu_err = 0;
|
__gu_err = 0;
|
||||||
switch ((sizeof(*(buf)))) {
|
switch ((sizeof(*(buf)))) {
|
||||||
case 1:
|
case 1:
|
||||||
__asm__ __volatile__(
|
|
||||||
"1: mov" "b" " %2,%" "b" "1\n"
|
|
||||||
"2:\n"
|
|
||||||
".section .fixup,\"ax\"\n"
|
|
||||||
"3: movl %3,%0\n"
|
|
||||||
" xor" "b" " %" "b" "1,%" "b" "1\n"
|
|
||||||
" jmp 2b\n"
|
|
||||||
".section __ex_table,\"a\"\n"
|
|
||||||
" .align 4\n"
|
|
||||||
" .long 1b,3b\n"
|
|
||||||
".text" : "=r"(__gu_err), "=q" (__gu_val): "m"((*(struct __large_struct *)
|
|
||||||
( __gu_addr )) ), "i"(- 14 ), "0"( __gu_err )) ;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
"1: mov" "w" " %2,%" "w" "1\n"
|
"1: mov" "b" " %2,%" "b" "1\n"
|
||||||
"2:\n"
|
"2:\n"
|
||||||
".section .fixup,\"ax\"\n"
|
".section .fixup,\"ax\"\n"
|
||||||
"3: movl %3,%0\n"
|
"3: movl %3,%0\n"
|
||||||
" xor" "w" " %" "w" "1,%" "w" "1\n"
|
" xor" "b" " %" "b" "1,%" "b" "1\n"
|
||||||
" jmp 2b\n"
|
" jmp 2b\n"
|
||||||
".section __ex_table,\"a\"\n"
|
".section __ex_table,\"a\"\n"
|
||||||
" .align 4\n"
|
" .align 4\n"
|
||||||
" .long 1b,3b\n"
|
" .long 1b,3b\n"
|
||||||
|
".text" : "=r"(__gu_err), "=q" (__gu_val): "m"((*(struct __large_struct *)
|
||||||
|
( __gu_addr )) ), "i"(- 14 ), "0"( __gu_err )) ;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
__asm__ __volatile__(
|
||||||
|
"1: mov" "w" " %2,%" "w" "1\n"
|
||||||
|
"2:\n"
|
||||||
|
".section .fixup,\"ax\"\n"
|
||||||
|
"3: movl %3,%0\n"
|
||||||
|
" xor" "w" " %" "w" "1,%" "w" "1\n"
|
||||||
|
" jmp 2b\n"
|
||||||
|
".section __ex_table,\"a\"\n"
|
||||||
|
" .align 4\n"
|
||||||
|
" .long 1b,3b\n"
|
||||||
".text" : "=r"(__gu_err), "=r" (__gu_val) : "m"((*(struct __large_struct *)
|
".text" : "=r"(__gu_err), "=r" (__gu_val) : "m"((*(struct __large_struct *)
|
||||||
( __gu_addr )) ), "i"(- 14 ), "0"( __gu_err ));
|
( __gu_addr )) ), "i"(- 14 ), "0"( __gu_err ));
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
"1: mov" "l" " %2,%" "" "1\n"
|
"1: mov" "l" " %2,%" "" "1\n"
|
||||||
"2:\n"
|
"2:\n"
|
||||||
".section .fixup,\"ax\"\n"
|
".section .fixup,\"ax\"\n"
|
||||||
"3: movl %3,%0\n"
|
"3: movl %3,%0\n"
|
||||||
" xor" "l" " %" "" "1,%" "" "1\n"
|
" xor" "l" " %" "" "1,%" "" "1\n"
|
||||||
" jmp 2b\n"
|
" jmp 2b\n"
|
||||||
".section __ex_table,\"a\"\n"
|
".section __ex_table,\"a\"\n"
|
||||||
" .align 4\n" " .long 1b,3b\n"
|
" .align 4\n" " .long 1b,3b\n"
|
||||||
".text" : "=r"(__gu_err), "=r" (__gu_val) : "m"((*(struct __large_struct *)
|
".text" : "=r"(__gu_err), "=r" (__gu_val) : "m"((*(struct __large_struct *)
|
||||||
( __gu_addr )) ), "i"(- 14 ), "0"(__gu_err));
|
( __gu_addr )) ), "i"(- 14 ), "0"(__gu_err));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
(__gu_val) = __get_user_bad();
|
(__gu_val) = __get_user_bad();
|
||||||
}
|
}
|
||||||
} while (0) ;
|
} while (0) ;
|
||||||
((c)) = (__typeof__(*((buf))))__gu_val;
|
((c)) = (__typeof__(*((buf))))__gu_val;
|
||||||
__gu_err;
|
__gu_err;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -127,12 +127,12 @@ see what code gcc generates:
|
|||||||
|
|
||||||
> xorl %edx,%edx
|
> xorl %edx,%edx
|
||||||
> movl current_set,%eax
|
> movl current_set,%eax
|
||||||
> cmpl $24,788(%eax)
|
> cmpl $24,788(%eax)
|
||||||
> je .L1424
|
> je .L1424
|
||||||
> cmpl $-1073741825,64(%esp)
|
> cmpl $-1073741825,64(%esp)
|
||||||
> ja .L1423
|
> ja .L1423
|
||||||
> .L1424:
|
> .L1424:
|
||||||
> movl %edx,%eax
|
> movl %edx,%eax
|
||||||
> movl 64(%esp),%ebx
|
> movl 64(%esp),%ebx
|
||||||
> #APP
|
> #APP
|
||||||
> 1: movb (%ebx),%dl /* this is the actual user access */
|
> 1: movb (%ebx),%dl /* this is the actual user access */
|
||||||
@@ -149,17 +149,17 @@ see what code gcc generates:
|
|||||||
> .L1423:
|
> .L1423:
|
||||||
> movzbl %dl,%esi
|
> movzbl %dl,%esi
|
||||||
|
|
||||||
The optimizer does a good job and gives us something we can actually
|
The optimizer does a good job and gives us something we can actually
|
||||||
understand. Can we? The actual user access is quite obvious. Thanks
|
understand. Can we? The actual user access is quite obvious. Thanks
|
||||||
to the unified address space we can just access the address in user
|
to the unified address space we can just access the address in user
|
||||||
memory. But what does the .section stuff do?????
|
memory. But what does the .section stuff do?????
|
||||||
|
|
||||||
To understand this we have to look at the final kernel:
|
To understand this we have to look at the final kernel:
|
||||||
|
|
||||||
> objdump --section-headers vmlinux
|
> objdump --section-headers vmlinux
|
||||||
>
|
>
|
||||||
> vmlinux: file format elf32-i386
|
> vmlinux: file format elf32-i386
|
||||||
>
|
>
|
||||||
> Sections:
|
> Sections:
|
||||||
> Idx Name Size VMA LMA File off Algn
|
> Idx Name Size VMA LMA File off Algn
|
||||||
> 0 .text 00098f40 c0100000 c0100000 00001000 2**4
|
> 0 .text 00098f40 c0100000 c0100000 00001000 2**4
|
||||||
@@ -198,18 +198,18 @@ final kernel executable:
|
|||||||
|
|
||||||
The whole user memory access is reduced to 10 x86 machine instructions.
|
The whole user memory access is reduced to 10 x86 machine instructions.
|
||||||
The instructions bracketed in the .section directives are no longer
|
The instructions bracketed in the .section directives are no longer
|
||||||
in the normal execution path. They are located in a different section
|
in the normal execution path. They are located in a different section
|
||||||
of the executable file:
|
of the executable file:
|
||||||
|
|
||||||
> objdump --disassemble --section=.fixup vmlinux
|
> objdump --disassemble --section=.fixup vmlinux
|
||||||
>
|
>
|
||||||
> c0199ff5 <.fixup+10b5> movl $0xfffffff2,%eax
|
> c0199ff5 <.fixup+10b5> movl $0xfffffff2,%eax
|
||||||
> c0199ffa <.fixup+10ba> xorb %dl,%dl
|
> c0199ffa <.fixup+10ba> xorb %dl,%dl
|
||||||
> c0199ffc <.fixup+10bc> jmp c017e7a7 <do_con_write+e3>
|
> c0199ffc <.fixup+10bc> jmp c017e7a7 <do_con_write+e3>
|
||||||
|
|
||||||
And finally:
|
And finally:
|
||||||
> objdump --full-contents --section=__ex_table vmlinux
|
> objdump --full-contents --section=__ex_table vmlinux
|
||||||
>
|
>
|
||||||
> c01aa7c4 93c017c0 e09f19c0 97c017c0 99c017c0 ................
|
> c01aa7c4 93c017c0 e09f19c0 97c017c0 99c017c0 ................
|
||||||
> c01aa7d4 f6c217c0 e99f19c0 a5e717c0 f59f19c0 ................
|
> c01aa7d4 f6c217c0 e99f19c0 a5e717c0 f59f19c0 ................
|
||||||
> c01aa7e4 080a18c0 01a019c0 0a0a18c0 04a019c0 ................
|
> c01aa7e4 080a18c0 01a019c0 0a0a18c0 04a019c0 ................
|
||||||
@@ -235,8 +235,8 @@ sections in the ELF object file. So the instructions
|
|||||||
ended up in the .fixup section of the object file and the addresses
|
ended up in the .fixup section of the object file and the addresses
|
||||||
.long 1b,3b
|
.long 1b,3b
|
||||||
ended up in the __ex_table section of the object file. 1b and 3b
|
ended up in the __ex_table section of the object file. 1b and 3b
|
||||||
are local labels. The local label 1b (1b stands for next label 1
|
are local labels. The local label 1b (1b stands for next label 1
|
||||||
backward) is the address of the instruction that might fault, i.e.
|
backward) is the address of the instruction that might fault, i.e.
|
||||||
in our case the address of the label 1 is c017e7a5:
|
in our case the address of the label 1 is c017e7a5:
|
||||||
the original assembly code: > 1: movb (%ebx),%dl
|
the original assembly code: > 1: movb (%ebx),%dl
|
||||||
and linked in vmlinux : > c017e7a5 <do_con_write+e1> movb (%ebx),%dl
|
and linked in vmlinux : > c017e7a5 <do_con_write+e1> movb (%ebx),%dl
|
||||||
@@ -254,7 +254,7 @@ The assembly code
|
|||||||
becomes the value pair
|
becomes the value pair
|
||||||
> c01aa7d4 c017c2f6 c0199fe9 c017e7a5 c0199ff5 ................
|
> c01aa7d4 c017c2f6 c0199fe9 c017e7a5 c0199ff5 ................
|
||||||
^this is ^this is
|
^this is ^this is
|
||||||
1b 3b
|
1b 3b
|
||||||
c017e7a5,c0199ff5 in the exception table of the kernel.
|
c017e7a5,c0199ff5 in the exception table of the kernel.
|
||||||
|
|
||||||
So, what actually happens if a fault from kernel mode with no suitable
|
So, what actually happens if a fault from kernel mode with no suitable
|
||||||
@@ -266,9 +266,9 @@ vma occurs?
|
|||||||
3.) CPU calls do_page_fault
|
3.) CPU calls do_page_fault
|
||||||
4.) do page fault calls search_exception_table (regs->eip == c017e7a5);
|
4.) do page fault calls search_exception_table (regs->eip == c017e7a5);
|
||||||
5.) search_exception_table looks up the address c017e7a5 in the
|
5.) search_exception_table looks up the address c017e7a5 in the
|
||||||
exception table (i.e. the contents of the ELF section __ex_table)
|
exception table (i.e. the contents of the ELF section __ex_table)
|
||||||
and returns the address of the associated fault handle code c0199ff5.
|
and returns the address of the associated fault handle code c0199ff5.
|
||||||
6.) do_page_fault modifies its own return address to point to the fault
|
6.) do_page_fault modifies its own return address to point to the fault
|
||||||
handle code and returns.
|
handle code and returns.
|
||||||
7.) execution continues in the fault handling code.
|
7.) execution continues in the fault handling code.
|
||||||
8.) 8a) EAX becomes -EFAULT (== -14)
|
8.) 8a) EAX becomes -EFAULT (== -14)
|
||||||
+69
-14
@@ -867,12 +867,22 @@ M: alex@shark-linux.de
|
|||||||
W: http://www.shark-linux.de/shark.html
|
W: http://www.shark-linux.de/shark.html
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
ARM/SAMSUNG ARM ARCHITECTURES
|
||||||
|
P: Ben Dooks
|
||||||
|
M: ben-linux@fluff.org
|
||||||
|
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||||
|
W: http://www.fluff.org/ben/linux/
|
||||||
|
S: Maintained
|
||||||
|
F: arch/arm/plat-s3c/
|
||||||
|
F: arch/arm/plat-s3c24xx/
|
||||||
|
|
||||||
ARM/S3C2410 ARM ARCHITECTURE
|
ARM/S3C2410 ARM ARCHITECTURE
|
||||||
P: Ben Dooks
|
P: Ben Dooks
|
||||||
M: ben-linux@fluff.org
|
M: ben-linux@fluff.org
|
||||||
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||||
W: http://www.fluff.org/ben/linux/
|
W: http://www.fluff.org/ben/linux/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
F: arch/arm/mach-s3c2410/
|
||||||
|
|
||||||
ARM/S3C2440 ARM ARCHITECTURE
|
ARM/S3C2440 ARM ARCHITECTURE
|
||||||
P: Ben Dooks
|
P: Ben Dooks
|
||||||
@@ -880,6 +890,39 @@ M: ben-linux@fluff.org
|
|||||||
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||||
W: http://www.fluff.org/ben/linux/
|
W: http://www.fluff.org/ben/linux/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
F: arch/arm/mach-s3c2440/
|
||||||
|
|
||||||
|
ARM/S3C2442 ARM ARCHITECTURE
|
||||||
|
P: Ben Dooks
|
||||||
|
M: ben-linux@fluff.org
|
||||||
|
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||||
|
W: http://www.fluff.org/ben/linux/
|
||||||
|
S: Maintained
|
||||||
|
F: arch/arm/mach-s3c2442/
|
||||||
|
|
||||||
|
ARM/S3C2443 ARM ARCHITECTURE
|
||||||
|
P: Ben Dooks
|
||||||
|
M: ben-linux@fluff.org
|
||||||
|
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||||
|
W: http://www.fluff.org/ben/linux/
|
||||||
|
S: Maintained
|
||||||
|
F: arch/arm/mach-s3c2443/
|
||||||
|
|
||||||
|
ARM/S3C6400 ARM ARCHITECTURE
|
||||||
|
P: Ben Dooks
|
||||||
|
M: ben-linux@fluff.org
|
||||||
|
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||||
|
W: http://www.fluff.org/ben/linux/
|
||||||
|
S: Maintained
|
||||||
|
F: arch/arm/mach-s3c6400/
|
||||||
|
|
||||||
|
ARM/S3C6410 ARM ARCHITECTURE
|
||||||
|
P: Ben Dooks
|
||||||
|
M: ben-linux@fluff.org
|
||||||
|
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||||
|
W: http://www.fluff.org/ben/linux/
|
||||||
|
S: Maintained
|
||||||
|
F: arch/arm/mach-s3c6410/
|
||||||
|
|
||||||
ARM/TECHNOLOGIC SYSTEMS TS7250 MACHINE SUPPORT
|
ARM/TECHNOLOGIC SYSTEMS TS7250 MACHINE SUPPORT
|
||||||
P: Lennert Buytenhek
|
P: Lennert Buytenhek
|
||||||
@@ -2087,9 +2130,9 @@ F: drivers/edac/i5400_edac.c
|
|||||||
|
|
||||||
EDAC-I82975X
|
EDAC-I82975X
|
||||||
P: Ranganathan Desikan
|
P: Ranganathan Desikan
|
||||||
M: rdesikan@jetzbroadband.com
|
M: ravi@jetztechnologies.com
|
||||||
P: Arvind R.
|
P: Arvind R.
|
||||||
M: arvind@acarlab.com
|
M: arvind@jetztechnologies.com
|
||||||
L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers)
|
L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers)
|
||||||
W: bluesmoke.sourceforge.net
|
W: bluesmoke.sourceforge.net
|
||||||
S: Maintained
|
S: Maintained
|
||||||
@@ -2808,7 +2851,9 @@ S: Maintained
|
|||||||
|
|
||||||
IA64 (Itanium) PLATFORM
|
IA64 (Itanium) PLATFORM
|
||||||
P: Tony Luck
|
P: Tony Luck
|
||||||
|
P: Fenghua Yu
|
||||||
M: tony.luck@intel.com
|
M: tony.luck@intel.com
|
||||||
|
M: fenghua.yu@intel.com
|
||||||
L: linux-ia64@vger.kernel.org
|
L: linux-ia64@vger.kernel.org
|
||||||
W: http://www.ia64-linux.org/
|
W: http://www.ia64-linux.org/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6.git
|
||||||
@@ -2886,7 +2931,7 @@ P: Dmitry Eremin-Solenikov
|
|||||||
M: dbaryshkov@gmail.com
|
M: dbaryshkov@gmail.com
|
||||||
P: Sergey Lapin
|
P: Sergey Lapin
|
||||||
M: slapin@ossfans.org
|
M: slapin@ossfans.org
|
||||||
L: linux-zigbee-devel@lists.sourceforge.net
|
L: linux-zigbee-devel@lists.sourceforge.net (moderated for non-subscribers)
|
||||||
W: http://apps.sourceforge.net/trac/linux-zigbee
|
W: http://apps.sourceforge.net/trac/linux-zigbee
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lowpan/lowpan.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lowpan/lowpan.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
@@ -3242,11 +3287,11 @@ F: include/linux/ivtv*
|
|||||||
|
|
||||||
JFS FILESYSTEM
|
JFS FILESYSTEM
|
||||||
P: Dave Kleikamp
|
P: Dave Kleikamp
|
||||||
M: shaggy@austin.ibm.com
|
M: shaggy@linux.vnet.ibm.com
|
||||||
L: jfs-discussion@lists.sourceforge.net
|
L: jfs-discussion@lists.sourceforge.net
|
||||||
W: http://jfs.sourceforge.net/
|
W: http://jfs.sourceforge.net/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/shaggy/jfs-2.6.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/shaggy/jfs-2.6.git
|
||||||
S: Supported
|
S: Maintained
|
||||||
F: Documentation/filesystems/jfs.txt
|
F: Documentation/filesystems/jfs.txt
|
||||||
F: fs/jfs/
|
F: fs/jfs/
|
||||||
|
|
||||||
@@ -4362,7 +4407,7 @@ W: http://www.nongnu.org/orinoco/
|
|||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/net/wireless/orinoco/
|
F: drivers/net/wireless/orinoco/
|
||||||
|
|
||||||
OSD LIBRARY
|
OSD LIBRARY and FILESYSTEM
|
||||||
P: Boaz Harrosh
|
P: Boaz Harrosh
|
||||||
M: bharrosh@panasas.com
|
M: bharrosh@panasas.com
|
||||||
P: Benny Halevy
|
P: Benny Halevy
|
||||||
@@ -4371,6 +4416,9 @@ L: osd-dev@open-osd.org
|
|||||||
W: http://open-osd.org
|
W: http://open-osd.org
|
||||||
T: git git://git.open-osd.org/open-osd.git
|
T: git git://git.open-osd.org/open-osd.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
F: drivers/scsi/osd/
|
||||||
|
F: drivers/include/scsi/osd_*
|
||||||
|
F: fs/exofs/
|
||||||
|
|
||||||
P54 WIRELESS DRIVER
|
P54 WIRELESS DRIVER
|
||||||
P: Michael Wu
|
P: Michael Wu
|
||||||
@@ -5533,8 +5581,8 @@ F: drivers/staging/
|
|||||||
|
|
||||||
STARFIRE/DURALAN NETWORK DRIVER
|
STARFIRE/DURALAN NETWORK DRIVER
|
||||||
P: Ion Badulescu
|
P: Ion Badulescu
|
||||||
M: ionut@cs.columbia.edu
|
M: ionut@badula.org
|
||||||
S: Maintained
|
S: Odd Fixes
|
||||||
F: drivers/net/starfire*
|
F: drivers/net/starfire*
|
||||||
|
|
||||||
STARMODE RADIO IP (STRIP) PROTOCOL DRIVER
|
STARMODE RADIO IP (STRIP) PROTOCOL DRIVER
|
||||||
@@ -5668,6 +5716,13 @@ F: drivers/misc/tifm*
|
|||||||
F: drivers/mmc/host/tifm_sd.c
|
F: drivers/mmc/host/tifm_sd.c
|
||||||
F: include/linux/tifm.h
|
F: include/linux/tifm.h
|
||||||
|
|
||||||
|
TI TWL4030 SERIES SOC CODEC DRIVER
|
||||||
|
P: Peter Ujfalusi
|
||||||
|
M: peter.ujfalusi@nokia.com
|
||||||
|
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||||
|
S: Maintained
|
||||||
|
F: sound/soc/codecs/twl4030*
|
||||||
|
|
||||||
TIPC NETWORK LAYER
|
TIPC NETWORK LAYER
|
||||||
P: Per Liden
|
P: Per Liden
|
||||||
M: per.liden@ericsson.com
|
M: per.liden@ericsson.com
|
||||||
@@ -5751,17 +5806,17 @@ P: Jiri Kosina
|
|||||||
M: trivial@kernel.org
|
M: trivial@kernel.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/char/tty_*
|
|
||||||
F: drivers/serial/serial_core.c
|
|
||||||
F: include/linux/serial_core.h
|
|
||||||
F: include/linux/serial.h
|
|
||||||
F: include/linux/tty.h
|
|
||||||
|
|
||||||
TTY LAYER
|
TTY LAYER
|
||||||
P: Alan Cox
|
P: Alan Cox
|
||||||
M: alan@lxorguk.ukuu.org.uk
|
M: alan@lxorguk.ukuu.org.uk
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: stgit http://zeniv.linux.org.uk/~alan/ttydev/
|
T: stgit http://zeniv.linux.org.uk/~alan/ttydev/
|
||||||
|
F: drivers/char/tty_*
|
||||||
|
F: drivers/serial/serial_core.c
|
||||||
|
F: include/linux/serial_core.h
|
||||||
|
F: include/linux/serial.h
|
||||||
|
F: include/linux/tty.h
|
||||||
|
|
||||||
TULIP NETWORK DRIVERS
|
TULIP NETWORK DRIVERS
|
||||||
P: Grant Grundler
|
P: Grant Grundler
|
||||||
@@ -5799,7 +5854,7 @@ UBI FILE SYSTEM (UBIFS)
|
|||||||
P: Artem Bityutskiy
|
P: Artem Bityutskiy
|
||||||
M: dedekind@infradead.org
|
M: dedekind@infradead.org
|
||||||
P: Adrian Hunter
|
P: Adrian Hunter
|
||||||
M: ext-adrian.hunter@nokia.com
|
M: adrian.hunter@nokia.com
|
||||||
L: linux-mtd@lists.infradead.org
|
L: linux-mtd@lists.infradead.org
|
||||||
T: git git://git.infradead.org/ubifs-2.6.git
|
T: git git://git.infradead.org/ubifs-2.6.git
|
||||||
W: http://www.linux-mtd.infradead.org/doc/ubifs.html
|
W: http://www.linux-mtd.infradead.org/doc/ubifs.html
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 31
|
SUBLEVEL = 31
|
||||||
EXTRAVERSION = -rc1
|
EXTRAVERSION = -rc3
|
||||||
NAME = Man-Eating Seals of Antiquity
|
NAME = Man-Eating Seals of Antiquity
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
@@ -140,15 +140,13 @@ _all: modules
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
srctree := $(if $(KBUILD_SRC),$(KBUILD_SRC),$(CURDIR))
|
srctree := $(if $(KBUILD_SRC),$(KBUILD_SRC),$(CURDIR))
|
||||||
TOPDIR := $(srctree)
|
|
||||||
# FIXME - TOPDIR is obsolete, use srctree/objtree
|
|
||||||
objtree := $(CURDIR)
|
objtree := $(CURDIR)
|
||||||
src := $(srctree)
|
src := $(srctree)
|
||||||
obj := $(objtree)
|
obj := $(objtree)
|
||||||
|
|
||||||
VPATH := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))
|
VPATH := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))
|
||||||
|
|
||||||
export srctree objtree VPATH TOPDIR
|
export srctree objtree VPATH
|
||||||
|
|
||||||
|
|
||||||
# SUBARCH tells the usermode build what the underlying arch is. That is set
|
# SUBARCH tells the usermode build what the underlying arch is. That is set
|
||||||
@@ -344,7 +342,9 @@ KBUILD_CPPFLAGS := -D__KERNEL__
|
|||||||
|
|
||||||
KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
||||||
-fno-strict-aliasing -fno-common \
|
-fno-strict-aliasing -fno-common \
|
||||||
-Werror-implicit-function-declaration
|
-Werror-implicit-function-declaration \
|
||||||
|
-Wno-format-security \
|
||||||
|
-fno-delete-null-pointer-checks
|
||||||
KBUILD_AFLAGS := -D__ASSEMBLY__
|
KBUILD_AFLAGS := -D__ASSEMBLY__
|
||||||
|
|
||||||
# Read KERNELRELEASE from include/config/kernel.release (if it exists)
|
# Read KERNELRELEASE from include/config/kernel.release (if it exists)
|
||||||
@@ -566,7 +566,7 @@ KBUILD_CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
|
|||||||
KBUILD_CFLAGS += $(call cc-option,-Wno-pointer-sign,)
|
KBUILD_CFLAGS += $(call cc-option,-Wno-pointer-sign,)
|
||||||
|
|
||||||
# disable invalid "can't wrap" optimizations for signed / pointers
|
# disable invalid "can't wrap" optimizations for signed / pointers
|
||||||
KBUILD_CFLAGS += $(call cc-option,-fwrapv)
|
KBUILD_CFLAGS += $(call cc-option,-fno-strict-overflow)
|
||||||
|
|
||||||
# revert to pre-gcc-4.4 behaviour of .eh_frame
|
# revert to pre-gcc-4.4 behaviour of .eh_frame
|
||||||
KBUILD_CFLAGS += $(call cc-option,-fno-dwarf2-cfi-asm)
|
KBUILD_CFLAGS += $(call cc-option,-fno-dwarf2-cfi-asm)
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ extern unsigned long __per_cpu_offset[NR_CPUS];
|
|||||||
|
|
||||||
#ifndef MODULE
|
#ifndef MODULE
|
||||||
#define SHIFT_PERCPU_PTR(var, offset) RELOC_HIDE(&per_cpu_var(var), (offset))
|
#define SHIFT_PERCPU_PTR(var, offset) RELOC_HIDE(&per_cpu_var(var), (offset))
|
||||||
#define PER_CPU_ATTRIBUTES
|
#define PER_CPU_DEF_ATTRIBUTES
|
||||||
#else
|
#else
|
||||||
/*
|
/*
|
||||||
* To calculate addresses of locally defined variables, GCC uses 32-bit
|
* To calculate addresses of locally defined variables, GCC uses 32-bit
|
||||||
@@ -49,7 +49,7 @@ extern unsigned long __per_cpu_offset[NR_CPUS];
|
|||||||
: "=&r"(__ptr), "=&r"(tmp_gp)); \
|
: "=&r"(__ptr), "=&r"(tmp_gp)); \
|
||||||
(typeof(&per_cpu_var(var)))(__ptr + (offset)); })
|
(typeof(&per_cpu_var(var)))(__ptr + (offset)); })
|
||||||
|
|
||||||
#define PER_CPU_ATTRIBUTES __used
|
#define PER_CPU_DEF_ATTRIBUTES __used
|
||||||
|
|
||||||
#endif /* MODULE */
|
#endif /* MODULE */
|
||||||
|
|
||||||
@@ -71,7 +71,7 @@ extern unsigned long __per_cpu_offset[NR_CPUS];
|
|||||||
#define __get_cpu_var(var) per_cpu_var(var)
|
#define __get_cpu_var(var) per_cpu_var(var)
|
||||||
#define __raw_get_cpu_var(var) per_cpu_var(var)
|
#define __raw_get_cpu_var(var) per_cpu_var(var)
|
||||||
|
|
||||||
#define PER_CPU_ATTRIBUTES
|
#define PER_CPU_DEF_ATTRIBUTES
|
||||||
|
|
||||||
#endif /* SMP */
|
#endif /* SMP */
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ struct thread_info {
|
|||||||
.task = &tsk, \
|
.task = &tsk, \
|
||||||
.exec_domain = &default_exec_domain, \
|
.exec_domain = &default_exec_domain, \
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
|
.preempt_count = INIT_PREEMPT_COUNT, \
|
||||||
.restart_block = { \
|
.restart_block = { \
|
||||||
.fn = do_no_restart_syscall, \
|
.fn = do_no_restart_syscall, \
|
||||||
}, \
|
}, \
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user