Merge branch 'linus' into sched-devel
This commit is contained in:
commit
f9e8e07e07
393 changed files with 3939 additions and 2471 deletions
|
@ -21,6 +21,11 @@ This driver is known to work with the following cards:
|
||||||
* SA E200
|
* SA E200
|
||||||
* SA E200i
|
* SA E200i
|
||||||
* SA E500
|
* SA E500
|
||||||
|
* SA P212
|
||||||
|
* SA P410
|
||||||
|
* SA P410i
|
||||||
|
* SA P411
|
||||||
|
* SA P812
|
||||||
|
|
||||||
Detecting drive failures:
|
Detecting drive failures:
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
|
@ -199,7 +199,7 @@ using the sched_setaffinity, mbind and set_mempolicy system calls.
|
||||||
The following rules apply to each cpuset:
|
The following rules apply to each cpuset:
|
||||||
|
|
||||||
- Its CPUs and Memory Nodes must be a subset of its parents.
|
- Its CPUs and Memory Nodes must be a subset of its parents.
|
||||||
- It can only be marked exclusive if its parent is.
|
- It can't be marked exclusive unless its parent is.
|
||||||
- If its cpu or memory is exclusive, they may not overlap any sibling.
|
- If its cpu or memory is exclusive, they may not overlap any sibling.
|
||||||
|
|
||||||
These rules, and the natural hierarchy of cpusets, enable efficient
|
These rules, and the natural hierarchy of cpusets, enable efficient
|
||||||
|
@ -345,7 +345,7 @@ is modified to perform an inline check for this PF_SPREAD_PAGE task
|
||||||
flag, and if set, a call to a new routine cpuset_mem_spread_node()
|
flag, and if set, a call to a new routine cpuset_mem_spread_node()
|
||||||
returns the node to prefer for the allocation.
|
returns the node to prefer for the allocation.
|
||||||
|
|
||||||
Similarly, setting 'memory_spread_cache' turns on the flag
|
Similarly, setting 'memory_spread_slab' turns on the flag
|
||||||
PF_SPREAD_SLAB, and appropriately marked slab caches will allocate
|
PF_SPREAD_SLAB, and appropriately marked slab caches will allocate
|
||||||
pages from the node returned by cpuset_mem_spread_node().
|
pages from the node returned by cpuset_mem_spread_node().
|
||||||
|
|
||||||
|
@ -709,7 +709,10 @@ Now you want to do something with this cpuset.
|
||||||
|
|
||||||
In this directory you can find several files:
|
In this directory you can find several files:
|
||||||
# ls
|
# ls
|
||||||
cpus cpu_exclusive mems mem_exclusive mem_hardwall tasks
|
cpu_exclusive memory_migrate mems tasks
|
||||||
|
cpus memory_pressure notify_on_release
|
||||||
|
mem_exclusive memory_spread_page sched_load_balance
|
||||||
|
mem_hardwall memory_spread_slab sched_relax_domain_level
|
||||||
|
|
||||||
Reading them will give you information about the state of this cpuset:
|
Reading them will give you information about the state of this cpuset:
|
||||||
the CPUs and Memory Nodes it can use, the processes that are using
|
the CPUs and Memory Nodes it can use, the processes that are using
|
||||||
|
|
|
@ -139,8 +139,16 @@ commit=nrsec (*) Ext4 can be told to sync all its data and metadata
|
||||||
Setting it to very large values will improve
|
Setting it to very large values will improve
|
||||||
performance.
|
performance.
|
||||||
|
|
||||||
barrier=1 This enables/disables barriers. barrier=0 disables
|
barrier=<0|1(*)> This enables/disables the use of write barriers in
|
||||||
it, barrier=1 enables it.
|
the jbd code. barrier=0 disables, barrier=1 enables.
|
||||||
|
This also requires an IO stack which can support
|
||||||
|
barriers, and if jbd gets an error on a barrier
|
||||||
|
write, it will disable again with a warning.
|
||||||
|
Write barriers enforce proper on-disk ordering
|
||||||
|
of journal commits, making volatile disk write caches
|
||||||
|
safe to use, at some performance penalty. If
|
||||||
|
your disks are battery-backed in one way or another,
|
||||||
|
disabling barriers may safely improve performance.
|
||||||
|
|
||||||
orlov (*) This enables the new Orlov block allocator. It is
|
orlov (*) This enables the new Orlov block allocator. It is
|
||||||
enabled by default.
|
enabled by default.
|
||||||
|
|
|
@ -36,6 +36,7 @@ files, each with their own function.
|
||||||
local_cpus nearby CPU mask (cpumask, ro)
|
local_cpus nearby CPU mask (cpumask, ro)
|
||||||
resource PCI resource host addresses (ascii, ro)
|
resource PCI resource host addresses (ascii, ro)
|
||||||
resource0..N PCI resource N, if present (binary, mmap)
|
resource0..N PCI resource N, if present (binary, mmap)
|
||||||
|
resource0_wc..N_wc PCI WC map resource N, if prefetchable (binary, mmap)
|
||||||
rom PCI ROM resource, if present (binary, ro)
|
rom PCI ROM resource, if present (binary, ro)
|
||||||
subsystem_device PCI subsystem device (ascii, ro)
|
subsystem_device PCI subsystem device (ascii, ro)
|
||||||
subsystem_vendor PCI subsystem vendor (ascii, ro)
|
subsystem_vendor PCI subsystem vendor (ascii, ro)
|
||||||
|
|
|
@ -1,6 +1,105 @@
|
||||||
kernel-doc nano-HOWTO
|
kernel-doc nano-HOWTO
|
||||||
=====================
|
=====================
|
||||||
|
|
||||||
|
How to format kernel-doc comments
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
In order to provide embedded, 'C' friendly, easy to maintain,
|
||||||
|
but consistent and extractable documentation of the functions and
|
||||||
|
data structures in the Linux kernel, the Linux kernel has adopted
|
||||||
|
a consistent style for documenting functions and their parameters,
|
||||||
|
and structures and their members.
|
||||||
|
|
||||||
|
The format for this documentation is called the kernel-doc format.
|
||||||
|
It is documented in this Documentation/kernel-doc-nano-HOWTO.txt file.
|
||||||
|
|
||||||
|
This style embeds the documentation within the source files, using
|
||||||
|
a few simple conventions. The scripts/kernel-doc perl script, some
|
||||||
|
SGML templates in Documentation/DocBook, and other tools understand
|
||||||
|
these conventions, and are used to extract this embedded documentation
|
||||||
|
into various documents.
|
||||||
|
|
||||||
|
In order to provide good documentation of kernel functions and data
|
||||||
|
structures, please use the following conventions to format your
|
||||||
|
kernel-doc comments in Linux kernel source.
|
||||||
|
|
||||||
|
We definitely need kernel-doc formatted documentation for functions
|
||||||
|
that are exported to loadable modules using EXPORT_SYMBOL.
|
||||||
|
|
||||||
|
We also look to provide kernel-doc formatted documentation for
|
||||||
|
functions externally visible to other kernel files (not marked
|
||||||
|
"static").
|
||||||
|
|
||||||
|
We also recommend providing kernel-doc formatted documentation
|
||||||
|
for private (file "static") routines, for consistency of kernel
|
||||||
|
source code layout. But this is lower priority and at the
|
||||||
|
discretion of the MAINTAINER of that kernel source file.
|
||||||
|
|
||||||
|
Data structures visible in kernel include files should also be
|
||||||
|
documented using kernel-doc formatted comments.
|
||||||
|
|
||||||
|
The opening comment mark "/**" is reserved for kernel-doc comments.
|
||||||
|
Only comments so marked will be considered by the kernel-doc scripts,
|
||||||
|
and any comment so marked must be in kernel-doc format. Do not use
|
||||||
|
"/**" to be begin a comment block unless the comment block contains
|
||||||
|
kernel-doc formatted comments. The closing comment marker for
|
||||||
|
kernel-doc comments can be either "*/" or "**/".
|
||||||
|
|
||||||
|
Kernel-doc comments should be placed just before the function
|
||||||
|
or data structure being described.
|
||||||
|
|
||||||
|
Example kernel-doc function comment:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* foobar() - short function description of foobar
|
||||||
|
* @arg1: Describe the first argument to foobar.
|
||||||
|
* @arg2: Describe the second argument to foobar.
|
||||||
|
* One can provide multiple line descriptions
|
||||||
|
* for arguments.
|
||||||
|
*
|
||||||
|
* A longer description, with more discussion of the function foobar()
|
||||||
|
* that might be useful to those using or modifying it. Begins with
|
||||||
|
* empty comment line, and may include additional embedded empty
|
||||||
|
* comment lines.
|
||||||
|
*
|
||||||
|
* The longer description can have multiple paragraphs.
|
||||||
|
**/
|
||||||
|
|
||||||
|
The first line, with the short description, must be on a single line.
|
||||||
|
|
||||||
|
The @argument descriptions must begin on the very next line following
|
||||||
|
this opening short function description line, with no intervening
|
||||||
|
empty comment lines.
|
||||||
|
|
||||||
|
Example kernel-doc data structure comment.
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct blah - the basic blah structure
|
||||||
|
* @mem1: describe the first member of struct blah
|
||||||
|
* @mem2: describe the second member of struct blah,
|
||||||
|
* perhaps with more lines and words.
|
||||||
|
*
|
||||||
|
* Longer description of this structure.
|
||||||
|
**/
|
||||||
|
|
||||||
|
The kernel-doc function comments describe each parameter to the
|
||||||
|
function, in order, with the @name lines.
|
||||||
|
|
||||||
|
The kernel-doc data structure comments describe each structure member
|
||||||
|
in the data structure, with the @name lines.
|
||||||
|
|
||||||
|
The longer description formatting is "reflowed", losing your line
|
||||||
|
breaks. So presenting carefully formatted lists within these
|
||||||
|
descriptions won't work so well; derived documentation will lose
|
||||||
|
the formatting.
|
||||||
|
|
||||||
|
See the section below "How to add extractable documentation to your
|
||||||
|
source files" for more details and notes on how to format kernel-doc
|
||||||
|
comments.
|
||||||
|
|
||||||
|
Components of the kernel-doc system
|
||||||
|
-----------------------------------
|
||||||
|
|
||||||
Many places in the source tree have extractable documentation in the
|
Many places in the source tree have extractable documentation in the
|
||||||
form of block comments above functions. The components of this system
|
form of block comments above functions. The components of this system
|
||||||
are:
|
are:
|
||||||
|
|
|
@ -715,14 +715,14 @@
|
||||||
|
|
||||||
* Name: "Gary's Encyclopedia - The Linux Kernel"
|
* Name: "Gary's Encyclopedia - The Linux Kernel"
|
||||||
Author: Gary (I suppose...).
|
Author: Gary (I suppose...).
|
||||||
URL: http://www.lisoleg.net/cgi-bin/lisoleg.pl?view=kernel.htm
|
URL: http://slencyclopedia.berlios.de/index.html
|
||||||
Keywords: links, not found here?.
|
Keywords: linux, community, everything!
|
||||||
Description: Gary's Encyclopedia exists to allow the rapid finding
|
Description: Gary's Encyclopedia exists to allow the rapid finding
|
||||||
of documentation and other information of interest to GNU/Linux
|
of documentation and other information of interest to GNU/Linux
|
||||||
users. It has about 4000 links to external pages in 150 major
|
users. It has about 4000 links to external pages in 150 major
|
||||||
categories. This link is for kernel-specific links, documents,
|
categories. This link is for kernel-specific links, documents,
|
||||||
sites... Look there if you could not find here what you were
|
sites... This list is now hosted by developer.Berlios.de,
|
||||||
looking for.
|
but seems not to have been updated since sometime in 1999.
|
||||||
|
|
||||||
* Name: "The home page of Linux-MM"
|
* Name: "The home page of Linux-MM"
|
||||||
Author: The Linux-MM team.
|
Author: The Linux-MM team.
|
||||||
|
|
|
@ -305,7 +305,7 @@ should not be manipulated by any other user.
|
||||||
|
|
||||||
A kset keeps its children in a standard kernel linked list. Kobjects point
|
A kset keeps its children in a standard kernel linked list. Kobjects point
|
||||||
back to their containing kset via their kset field. In almost all cases,
|
back to their containing kset via their kset field. In almost all cases,
|
||||||
the kobjects belonging to a ket have that kset (or, strictly, its embedded
|
the kobjects belonging to a kset have that kset (or, strictly, its embedded
|
||||||
kobject) in their parent.
|
kobject) in their parent.
|
||||||
|
|
||||||
As a kset contains a kobject within it, it should always be dynamically
|
As a kset contains a kobject within it, it should always be dynamically
|
||||||
|
|
|
@ -503,7 +503,7 @@ generate input device EV_KEY events.
|
||||||
In addition to the EV_KEY events, thinkpad-acpi may also issue EV_SW
|
In addition to the EV_KEY events, thinkpad-acpi may also issue EV_SW
|
||||||
events for switches:
|
events for switches:
|
||||||
|
|
||||||
SW_RADIO T60 and later hardare rfkill rocker switch
|
SW_RFKILL_ALL T60 and later hardare rfkill rocker switch
|
||||||
SW_TABLET_MODE Tablet ThinkPads HKEY events 0x5009 and 0x500A
|
SW_TABLET_MODE Tablet ThinkPads HKEY events 0x5009 and 0x500A
|
||||||
|
|
||||||
Non hot-key ACPI HKEY event map:
|
Non hot-key ACPI HKEY event map:
|
||||||
|
|
|
@ -46,7 +46,7 @@ These are the ARCnet drivers for Linux.
|
||||||
|
|
||||||
|
|
||||||
This new release (2.91) has been put together by David Woodhouse
|
This new release (2.91) has been put together by David Woodhouse
|
||||||
<dwmw2@cam.ac.uk>, in an attempt to tidy up the driver after adding support
|
<dwmw2@infradead.org>, in an attempt to tidy up the driver after adding support
|
||||||
for yet another chipset. Now the generic support has been separated from the
|
for yet another chipset. Now the generic support has been separated from the
|
||||||
individual chipset drivers, and the source files aren't quite so packed with
|
individual chipset drivers, and the source files aren't quite so packed with
|
||||||
#ifdefs! I've changed this file a bit, but kept it in the first person from
|
#ifdefs! I've changed this file a bit, but kept it in the first person from
|
||||||
|
|
77
Documentation/vm/pagemap.txt
Normal file
77
Documentation/vm/pagemap.txt
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
pagemap, from the userspace perspective
|
||||||
|
---------------------------------------
|
||||||
|
|
||||||
|
pagemap is a new (as of 2.6.25) set of interfaces in the kernel that allow
|
||||||
|
userspace programs to examine the page tables and related information by
|
||||||
|
reading files in /proc.
|
||||||
|
|
||||||
|
There are three components to pagemap:
|
||||||
|
|
||||||
|
* /proc/pid/pagemap. This file lets a userspace process find out which
|
||||||
|
physical frame each virtual page is mapped to. It contains one 64-bit
|
||||||
|
value for each virtual page, containing the following data (from
|
||||||
|
fs/proc/task_mmu.c, above pagemap_read):
|
||||||
|
|
||||||
|
* Bits 0-55 page frame number (PFN) if present
|
||||||
|
* Bits 0-4 swap type if swapped
|
||||||
|
* Bits 5-55 swap offset if swapped
|
||||||
|
* Bits 55-60 page shift (page size = 1<<page shift)
|
||||||
|
* Bit 61 reserved for future use
|
||||||
|
* Bit 62 page swapped
|
||||||
|
* Bit 63 page present
|
||||||
|
|
||||||
|
If the page is not present but in swap, then the PFN contains an
|
||||||
|
encoding of the swap file number and the page's offset into the
|
||||||
|
swap. Unmapped pages return a null PFN. This allows determining
|
||||||
|
precisely which pages are mapped (or in swap) and comparing mapped
|
||||||
|
pages between processes.
|
||||||
|
|
||||||
|
Efficient users of this interface will use /proc/pid/maps to
|
||||||
|
determine which areas of memory are actually mapped and llseek to
|
||||||
|
skip over unmapped regions.
|
||||||
|
|
||||||
|
* /proc/kpagecount. This file contains a 64-bit count of the number of
|
||||||
|
times each page is mapped, indexed by PFN.
|
||||||
|
|
||||||
|
* /proc/kpageflags. This file contains a 64-bit set of flags for each
|
||||||
|
page, indexed by PFN.
|
||||||
|
|
||||||
|
The flags are (from fs/proc/proc_misc, above kpageflags_read):
|
||||||
|
|
||||||
|
0. LOCKED
|
||||||
|
1. ERROR
|
||||||
|
2. REFERENCED
|
||||||
|
3. UPTODATE
|
||||||
|
4. DIRTY
|
||||||
|
5. LRU
|
||||||
|
6. ACTIVE
|
||||||
|
7. SLAB
|
||||||
|
8. WRITEBACK
|
||||||
|
9. RECLAIM
|
||||||
|
10. BUDDY
|
||||||
|
|
||||||
|
Using pagemap to do something useful:
|
||||||
|
|
||||||
|
The general procedure for using pagemap to find out about a process' memory
|
||||||
|
usage goes like this:
|
||||||
|
|
||||||
|
1. Read /proc/pid/maps to determine which parts of the memory space are
|
||||||
|
mapped to what.
|
||||||
|
2. Select the maps you are interested in -- all of them, or a particular
|
||||||
|
library, or the stack or the heap, etc.
|
||||||
|
3. Open /proc/pid/pagemap and seek to the pages you would like to examine.
|
||||||
|
4. Read a u64 for each page from pagemap.
|
||||||
|
5. Open /proc/kpagecount and/or /proc/kpageflags. For each PFN you just
|
||||||
|
read, seek to that entry in the file, and read the data you want.
|
||||||
|
|
||||||
|
For example, to find the "unique set size" (USS), which is the amount of
|
||||||
|
memory that a process is using that is not shared with any other process,
|
||||||
|
you can go through every map in the process, find the PFNs, look those up
|
||||||
|
in kpagecount, and tally up the number of pages that are only referenced
|
||||||
|
once.
|
||||||
|
|
||||||
|
Other notes:
|
||||||
|
|
||||||
|
Reading from any of the files will return -EINVAL if you are not starting
|
||||||
|
the read on an 8-byte boundary (e.g., if you seeked an odd number of bytes
|
||||||
|
into the file), or if the size of the read is not a multiple of 8 bytes.
|
48
MAINTAINERS
48
MAINTAINERS
|
@ -228,21 +228,21 @@ ACPI BATTERY DRIVERS
|
||||||
P: Alexey Starikovskiy
|
P: Alexey Starikovskiy
|
||||||
M: astarikovskiy@suse.de
|
M: astarikovskiy@suse.de
|
||||||
L: linux-acpi@vger.kernel.org
|
L: linux-acpi@vger.kernel.org
|
||||||
W: http://acpi.sourceforge.net/
|
W: http://www.lesswatts.org/projects/acpi/
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
ACPI EC DRIVER
|
ACPI EC DRIVER
|
||||||
P: Alexey Starikovskiy
|
P: Alexey Starikovskiy
|
||||||
M: astarikovskiy@suse.de
|
M: astarikovskiy@suse.de
|
||||||
L: linux-acpi@vger.kernel.org
|
L: linux-acpi@vger.kernel.org
|
||||||
W: http://acpi.sourceforge.net/
|
W: http://www.lesswatts.org/projects/acpi/
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
ACPI FAN DRIVER
|
ACPI FAN DRIVER
|
||||||
P: Len Brown
|
P: Len Brown
|
||||||
M: len.brown@intel.com
|
M: len.brown@intel.com
|
||||||
L: linux-acpi@vger.kernel.org
|
L: linux-acpi@vger.kernel.org
|
||||||
W: http://acpi.sourceforge.net/
|
W: http://www.lesswatts.org/projects/acpi/
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
ACPI PCI HOTPLUG DRIVER
|
ACPI PCI HOTPLUG DRIVER
|
||||||
|
@ -255,14 +255,14 @@ ACPI THERMAL DRIVER
|
||||||
P: Len Brown
|
P: Len Brown
|
||||||
M: len.brown@intel.com
|
M: len.brown@intel.com
|
||||||
L: linux-acpi@vger.kernel.org
|
L: linux-acpi@vger.kernel.org
|
||||||
W: http://acpi.sourceforge.net/
|
W: http://www.lesswatts.org/projects/acpi/
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
ACPI VIDEO DRIVER
|
ACPI VIDEO DRIVER
|
||||||
P: Rui Zhang
|
P: Rui Zhang
|
||||||
M: rui.zhang@intel.com
|
M: rui.zhang@intel.com
|
||||||
L: linux-acpi@vger.kernel.org
|
L: linux-acpi@vger.kernel.org
|
||||||
W: http://acpi.sourceforge.net/
|
W: http://www.lesswatts.org/projects/acpi/
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
ACPI WMI DRIVER
|
ACPI WMI DRIVER
|
||||||
|
@ -274,7 +274,7 @@ S: Maintained
|
||||||
|
|
||||||
AD1889 ALSA SOUND DRIVER
|
AD1889 ALSA SOUND DRIVER
|
||||||
P: Kyle McMartin
|
P: Kyle McMartin
|
||||||
M: kyle@parisc-linux.org
|
M: kyle@mcmartin.ca
|
||||||
P: Thibaut Varene
|
P: Thibaut Varene
|
||||||
M: T-Bone@parisc-linux.org
|
M: T-Bone@parisc-linux.org
|
||||||
W: http://wiki.parisc-linux.org/AD1889
|
W: http://wiki.parisc-linux.org/AD1889
|
||||||
|
@ -995,8 +995,8 @@ L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
BROADCOM BNX2X 10 GIGABIT ETHERNET DRIVER
|
BROADCOM BNX2X 10 GIGABIT ETHERNET DRIVER
|
||||||
P: Eliezer Tamir
|
P: Eilon Greenstein
|
||||||
M: eliezert@broadcom.com
|
M: eilong@broadcom.com
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
|
@ -1202,6 +1202,7 @@ M: pj@sgi.com
|
||||||
M: menage@google.com
|
M: menage@google.com
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
W: http://www.bullopensource.org/cpuset/
|
W: http://www.bullopensource.org/cpuset/
|
||||||
|
W: http://oss.sgi.com/projects/cpusets/
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
CRAMFS FILESYSTEM
|
CRAMFS FILESYSTEM
|
||||||
|
@ -1827,7 +1828,7 @@ S: Maintained
|
||||||
|
|
||||||
HARMONY SOUND DRIVER
|
HARMONY SOUND DRIVER
|
||||||
P: Kyle McMartin
|
P: Kyle McMartin
|
||||||
M: kyle@parisc-linux.org
|
M: kyle@mcmartin.ca
|
||||||
L: linux-parisc@vger.kernel.org
|
L: linux-parisc@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
@ -2565,7 +2566,6 @@ LINUX SECURITY MODULE (LSM) FRAMEWORK
|
||||||
P: Chris Wright
|
P: Chris Wright
|
||||||
M: chrisw@sous-sol.org
|
M: chrisw@sous-sol.org
|
||||||
L: linux-security-module@vger.kernel.org
|
L: linux-security-module@vger.kernel.org
|
||||||
W: http://lsm.immunix.org
|
|
||||||
T: git kernel.org:/pub/scm/linux/kernel/git/chrisw/lsm-2.6.git
|
T: git kernel.org:/pub/scm/linux/kernel/git/chrisw/lsm-2.6.git
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
|
@ -2866,8 +2866,8 @@ S: Maintained
|
||||||
NETEFFECT IWARP RNIC DRIVER (IW_NES)
|
NETEFFECT IWARP RNIC DRIVER (IW_NES)
|
||||||
P: Faisal Latif
|
P: Faisal Latif
|
||||||
M: flatif@neteffect.com
|
M: flatif@neteffect.com
|
||||||
P: Nishi Gupta
|
P: Chien Tung
|
||||||
M: ngupta@neteffect.com
|
M: ctung@neteffect.com
|
||||||
P: Glenn Streiff
|
P: Glenn Streiff
|
||||||
M: gstreiff@neteffect.com
|
M: gstreiff@neteffect.com
|
||||||
L: general@lists.openfabrics.org
|
L: general@lists.openfabrics.org
|
||||||
|
@ -3121,7 +3121,7 @@ S: Maintained
|
||||||
|
|
||||||
PARISC ARCHITECTURE
|
PARISC ARCHITECTURE
|
||||||
P: Kyle McMartin
|
P: Kyle McMartin
|
||||||
M: kyle@parisc-linux.org
|
M: kyle@mcmartin.ca
|
||||||
P: Matthew Wilcox
|
P: Matthew Wilcox
|
||||||
M: matthew@wil.cx
|
M: matthew@wil.cx
|
||||||
P: Grant Grundler
|
P: Grant Grundler
|
||||||
|
@ -3265,7 +3265,7 @@ S: Maintained
|
||||||
|
|
||||||
PPP OVER ETHERNET
|
PPP OVER ETHERNET
|
||||||
P: Michal Ostrowski
|
P: Michal Ostrowski
|
||||||
M: mostrows@speakeasy.net
|
M: mostrows@earthlink.net
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
PPP OVER L2TP
|
PPP OVER L2TP
|
||||||
|
@ -3330,9 +3330,11 @@ L: video4linux-list@redhat.com
|
||||||
W: http://www.isely.net/pvrusb2/
|
W: http://www.isely.net/pvrusb2/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
PXA2xx SUPPORT
|
PXA2xx/PXA3xx SUPPORT
|
||||||
P: Nicolas Pitre
|
P: Eric Miao
|
||||||
M: nico@cam.org
|
M: eric.miao@marvell.com
|
||||||
|
P: Russell King
|
||||||
|
M: linux@arm.linux.org.uk
|
||||||
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
@ -3439,10 +3441,7 @@ L: rtc-linux@googlegroups.com
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
REISERFS FILE SYSTEM
|
REISERFS FILE SYSTEM
|
||||||
P: Hans Reiser
|
|
||||||
M: reiserfs-dev@namesys.com
|
|
||||||
L: reiserfs-devel@vger.kernel.org
|
L: reiserfs-devel@vger.kernel.org
|
||||||
W: http://www.namesys.com
|
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
RFKILL
|
RFKILL
|
||||||
|
@ -3662,13 +3661,6 @@ M: romieu@fr.zoreil.com
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
SIS 5513 IDE CONTROLLER DRIVER
|
|
||||||
P: Lionel Bouton
|
|
||||||
M: Lionel.Bouton@inet6.fr
|
|
||||||
W: http://inet6.dyn.dhs.org/sponsoring/sis5513/index.html
|
|
||||||
W: http://gyver.homeip.net/sis5513/index.html
|
|
||||||
S: Maintained
|
|
||||||
|
|
||||||
SIS 900/7016 FAST ETHERNET DRIVER
|
SIS 900/7016 FAST ETHERNET DRIVER
|
||||||
P: Daniele Venzano
|
P: Daniele Venzano
|
||||||
M: venza@brownhat.org
|
M: venza@brownhat.org
|
||||||
|
@ -4034,7 +4026,7 @@ TULIP NETWORK DRIVERS
|
||||||
P: Grant Grundler
|
P: Grant Grundler
|
||||||
M: grundler@parisc-linux.org
|
M: grundler@parisc-linux.org
|
||||||
P: Kyle McMartin
|
P: Kyle McMartin
|
||||||
M: kyle@parisc-linux.org
|
M: kyle@mcmartin.ca
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
|
4
Makefile
4
Makefile
|
@ -1,8 +1,8 @@
|
||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 26
|
SUBLEVEL = 26
|
||||||
EXTRAVERSION = -rc5
|
EXTRAVERSION = -rc6
|
||||||
NAME = Funky Weasel is Jiggy wit it
|
NAME = Rotary Wombat
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
# To see a list of typical targets execute "make help"
|
# To see a list of typical targets execute "make help"
|
||||||
|
|
|
@ -330,7 +330,7 @@ struct ssp_device *ssp_request(int port, const char *label)
|
||||||
|
|
||||||
mutex_unlock(&ssp_lock);
|
mutex_unlock(&ssp_lock);
|
||||||
|
|
||||||
if (ssp->port_id != port)
|
if (&ssp->node == &ssp_list)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return ssp;
|
return ssp;
|
||||||
|
|
|
@ -67,7 +67,7 @@ void __init trap_init(void)
|
||||||
CSYNC();
|
CSYNC();
|
||||||
}
|
}
|
||||||
|
|
||||||
void *saved_icplb_fault_addr, *saved_dcplb_fault_addr;
|
unsigned long saved_icplb_fault_addr, saved_dcplb_fault_addr;
|
||||||
|
|
||||||
int kstack_depth_to_print = 48;
|
int kstack_depth_to_print = 48;
|
||||||
|
|
||||||
|
@ -366,7 +366,7 @@ asmlinkage void trap_c(struct pt_regs *fp)
|
||||||
info.si_code = ILL_CPLB_MULHIT;
|
info.si_code = ILL_CPLB_MULHIT;
|
||||||
sig = SIGSEGV;
|
sig = SIGSEGV;
|
||||||
#ifdef CONFIG_DEBUG_HUNT_FOR_ZERO
|
#ifdef CONFIG_DEBUG_HUNT_FOR_ZERO
|
||||||
if (saved_dcplb_fault_addr < (void *)FIXED_CODE_START)
|
if (saved_dcplb_fault_addr < FIXED_CODE_START)
|
||||||
printk(KERN_NOTICE "NULL pointer access\n");
|
printk(KERN_NOTICE "NULL pointer access\n");
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
|
@ -421,7 +421,7 @@ asmlinkage void trap_c(struct pt_regs *fp)
|
||||||
info.si_code = ILL_CPLB_MULHIT;
|
info.si_code = ILL_CPLB_MULHIT;
|
||||||
sig = SIGSEGV;
|
sig = SIGSEGV;
|
||||||
#ifdef CONFIG_DEBUG_HUNT_FOR_ZERO
|
#ifdef CONFIG_DEBUG_HUNT_FOR_ZERO
|
||||||
if (saved_icplb_fault_addr < (void *)FIXED_CODE_START)
|
if (saved_icplb_fault_addr < FIXED_CODE_START)
|
||||||
printk(KERN_NOTICE "Jump to NULL address\n");
|
printk(KERN_NOTICE "Jump to NULL address\n");
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
|
@ -939,8 +939,6 @@ void panic_cplb_error(int cplb_panic, struct pt_regs *fp)
|
||||||
|
|
||||||
oops_in_progress = 1;
|
oops_in_progress = 1;
|
||||||
|
|
||||||
printk(KERN_EMERG "DCPLB_FAULT_ADDR=%p\n", saved_dcplb_fault_addr);
|
|
||||||
printk(KERN_EMERG "ICPLB_FAULT_ADDR=%p\n", saved_icplb_fault_addr);
|
|
||||||
dump_bfin_process(fp);
|
dump_bfin_process(fp);
|
||||||
dump_bfin_mem(fp);
|
dump_bfin_mem(fp);
|
||||||
show_regs(fp);
|
show_regs(fp);
|
||||||
|
|
|
@ -451,9 +451,6 @@ static struct platform_device net2272_bfin_device = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
|
||||||
/* all SPI peripherals info goes here */
|
|
||||||
|
|
||||||
#if defined(CONFIG_MTD_M25P80) \
|
#if defined(CONFIG_MTD_M25P80) \
|
||||||
|| defined(CONFIG_MTD_M25P80_MODULE)
|
|| defined(CONFIG_MTD_M25P80_MODULE)
|
||||||
static struct mtd_partition bfin_spi_flash_partitions[] = {
|
static struct mtd_partition bfin_spi_flash_partitions[] = {
|
||||||
|
@ -676,6 +673,7 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
||||||
/* SPI controller data */
|
/* SPI controller data */
|
||||||
static struct bfin5xx_spi_master bfin_spi0_info = {
|
static struct bfin5xx_spi_master bfin_spi0_info = {
|
||||||
.num_chipselect = 8,
|
.num_chipselect = 8,
|
||||||
|
@ -1018,10 +1016,7 @@ static int __init stamp_init(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
|
platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
|
||||||
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
|
||||||
spi_register_board_info(bfin_spi_board_info,
|
|
||||||
ARRAY_SIZE(bfin_spi_board_info));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
|
#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
|
||||||
irq_desc[PATA_INT].status |= IRQ_NOAUTOEN;
|
irq_desc[PATA_INT].status |= IRQ_NOAUTOEN;
|
||||||
|
|
|
@ -87,9 +87,6 @@ static struct platform_device smc91x_device = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
|
||||||
/* all SPI peripherals info goes here */
|
|
||||||
|
|
||||||
#if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
|
#if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
|
||||||
static struct mtd_partition bfin_spi_flash_partitions[] = {
|
static struct mtd_partition bfin_spi_flash_partitions[] = {
|
||||||
{
|
{
|
||||||
|
@ -189,6 +186,7 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
||||||
/* SPI (0) */
|
/* SPI (0) */
|
||||||
static struct resource bfin_spi0_resource[] = {
|
static struct resource bfin_spi0_resource[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
|
@ -425,9 +423,7 @@ static int __init ezkit_init(void)
|
||||||
{
|
{
|
||||||
printk(KERN_INFO "%s(): registering device resources\n", __func__);
|
printk(KERN_INFO "%s(): registering device resources\n", __func__);
|
||||||
platform_add_devices(ezkit_devices, ARRAY_SIZE(ezkit_devices));
|
platform_add_devices(ezkit_devices, ARRAY_SIZE(ezkit_devices));
|
||||||
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
|
||||||
spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
|
spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
|
#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
|
||||||
irq_desc[PATA_INT].status |= IRQ_NOAUTOEN;
|
irq_desc[PATA_INT].status |= IRQ_NOAUTOEN;
|
||||||
|
|
|
@ -161,9 +161,6 @@ static struct platform_device stamp_flash_device = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
|
||||||
/* all SPI peripherals info goes here */
|
|
||||||
|
|
||||||
#if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
|
#if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
|
||||||
static struct mtd_partition bfin_spi_flash_partitions[] = {
|
static struct mtd_partition bfin_spi_flash_partitions[] = {
|
||||||
{
|
{
|
||||||
|
@ -320,6 +317,7 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
||||||
/* SPI (0) */
|
/* SPI (0) */
|
||||||
static struct resource bfin_spi0_resource[] = {
|
static struct resource bfin_spi0_resource[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
|
@ -626,10 +624,8 @@ static int __init stamp_init(void)
|
||||||
SSYNC();
|
SSYNC();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
|
||||||
spi_register_board_info(bfin_spi_board_info,
|
|
||||||
ARRAY_SIZE(bfin_spi_board_info));
|
|
||||||
#endif
|
|
||||||
#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
|
#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
|
||||||
irq_desc[PATA_INT].status |= IRQ_NOAUTOEN;
|
irq_desc[PATA_INT].status |= IRQ_NOAUTOEN;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -400,9 +400,6 @@ static struct platform_device stamp_flash_device = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
|
||||||
/* all SPI peripherals info goes here */
|
|
||||||
|
|
||||||
#if defined(CONFIG_MTD_M25P80) \
|
#if defined(CONFIG_MTD_M25P80) \
|
||||||
|| defined(CONFIG_MTD_M25P80_MODULE)
|
|| defined(CONFIG_MTD_M25P80_MODULE)
|
||||||
static struct mtd_partition bfin_spi_flash_partitions[] = {
|
static struct mtd_partition bfin_spi_flash_partitions[] = {
|
||||||
|
@ -629,6 +626,7 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
||||||
/* SPI controller data */
|
/* SPI controller data */
|
||||||
static struct bfin5xx_spi_master bfin_spi0_info = {
|
static struct bfin5xx_spi_master bfin_spi0_info = {
|
||||||
.num_chipselect = 8,
|
.num_chipselect = 8,
|
||||||
|
@ -939,10 +937,7 @@ static int __init stamp_init(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
|
platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
|
||||||
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
|
||||||
spi_register_board_info(bfin_spi_board_info,
|
|
||||||
ARRAY_SIZE(bfin_spi_board_info));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
|
#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
|
||||||
irq_desc[PATA_INT].status |= IRQ_NOAUTOEN;
|
irq_desc[PATA_INT].status |= IRQ_NOAUTOEN;
|
||||||
|
|
|
@ -412,8 +412,6 @@ static struct platform_device ezkit_flash_device = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
|
||||||
/* all SPI peripherals info goes here */
|
|
||||||
#if defined(CONFIG_MTD_M25P80) \
|
#if defined(CONFIG_MTD_M25P80) \
|
||||||
|| defined(CONFIG_MTD_M25P80_MODULE)
|
|| defined(CONFIG_MTD_M25P80_MODULE)
|
||||||
/* SPI flash chip (m25p16) */
|
/* SPI flash chip (m25p16) */
|
||||||
|
@ -481,7 +479,7 @@ static struct bfin5xx_spi_chip spidev_chip_info = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct spi_board_info bf54x_spi_board_info[] __initdata = {
|
static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
||||||
#if defined(CONFIG_MTD_M25P80) \
|
#if defined(CONFIG_MTD_M25P80) \
|
||||||
|| defined(CONFIG_MTD_M25P80_MODULE)
|
|| defined(CONFIG_MTD_M25P80_MODULE)
|
||||||
{
|
{
|
||||||
|
@ -527,6 +525,7 @@ static struct spi_board_info bf54x_spi_board_info[] __initdata = {
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
||||||
/* SPI (0) */
|
/* SPI (0) */
|
||||||
static struct resource bfin_spi0_resource[] = {
|
static struct resource bfin_spi0_resource[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
|
@ -800,10 +799,7 @@ static int __init ezkit_init(void)
|
||||||
|
|
||||||
platform_add_devices(ezkit_devices, ARRAY_SIZE(ezkit_devices));
|
platform_add_devices(ezkit_devices, ARRAY_SIZE(ezkit_devices));
|
||||||
|
|
||||||
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
|
||||||
spi_register_board_info(bf54x_spi_board_info,
|
|
||||||
ARRAY_SIZE(bf54x_spi_board_info));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -280,7 +280,6 @@ static struct platform_device ezkit_flash_device = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_SPI_BFIN
|
|
||||||
#if defined(CONFIG_SND_BLACKFIN_AD1836) \
|
#if defined(CONFIG_SND_BLACKFIN_AD1836) \
|
||||||
|| defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
|| defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
|
||||||
static struct bfin5xx_spi_chip ad1836_spi_chip_info = {
|
static struct bfin5xx_spi_chip ad1836_spi_chip_info = {
|
||||||
|
@ -295,8 +294,8 @@ static struct bfin5xx_spi_chip spidev_chip_info = {
|
||||||
.bits_per_word = 8,
|
.bits_per_word = 8,
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
|
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
||||||
/* SPI (0) */
|
/* SPI (0) */
|
||||||
static struct resource bfin_spi0_resource[] = {
|
static struct resource bfin_spi0_resource[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
|
@ -327,6 +326,7 @@ static struct platform_device bfin_spi0_device = {
|
||||||
.platform_data = &bfin_spi0_info, /* Passed to driver */
|
.platform_data = &bfin_spi0_info, /* Passed to driver */
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
static struct spi_board_info bfin_spi_board_info[] __initdata = {
|
||||||
#if defined(CONFIG_SND_BLACKFIN_AD1836) \
|
#if defined(CONFIG_SND_BLACKFIN_AD1836) \
|
||||||
|
@ -537,10 +537,7 @@ static int __init ezkit_init(void)
|
||||||
SSYNC();
|
SSYNC();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
|
spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
|
||||||
spi_register_board_info(bfin_spi_board_info,
|
|
||||||
ARRAY_SIZE(bfin_spi_board_info));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
|
#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
|
||||||
irq_desc[PATA_INT].status |= IRQ_NOAUTOEN;
|
irq_desc[PATA_INT].status |= IRQ_NOAUTOEN;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* cmode.S: clock mode management
|
/* cmode.S: clock mode management
|
||||||
*
|
*
|
||||||
* Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
|
* Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
|
||||||
* Written by David Woodhouse (dwmw2@redhat.com)
|
* Written by David Woodhouse (dwmw2@infradead.org)
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* sleep.S: power saving mode entry
|
/* sleep.S: power saving mode entry
|
||||||
*
|
*
|
||||||
* Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
|
* Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
|
||||||
* Written by David Woodhouse (dwmw2@redhat.com)
|
* Written by David Woodhouse (dwmw2@infradead.org)
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* pci-dma-nommu.c: Dynamic DMA mapping support for the FRV
|
/* pci-dma-nommu.c: Dynamic DMA mapping support for the FRV
|
||||||
*
|
*
|
||||||
* Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
|
* Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
|
||||||
* Written by David Woodhouse (dwmw2@redhat.com)
|
* Written by David Woodhouse (dwmw2@infradead.org)
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
|
|
@ -465,7 +465,6 @@ void __init acpi_numa_slit_init(struct acpi_table_slit *slit)
|
||||||
printk(KERN_ERR
|
printk(KERN_ERR
|
||||||
"ACPI 2.0 SLIT: size mismatch: %d expected, %d actual\n",
|
"ACPI 2.0 SLIT: size mismatch: %d expected, %d actual\n",
|
||||||
len, slit->header.length);
|
len, slit->header.length);
|
||||||
memset(numa_slit, 10, sizeof(numa_slit));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
slit_table = slit;
|
slit_table = slit;
|
||||||
|
@ -574,8 +573,14 @@ void __init acpi_numa_arch_fixup(void)
|
||||||
printk(KERN_INFO "Number of memory chunks in system = %d\n",
|
printk(KERN_INFO "Number of memory chunks in system = %d\n",
|
||||||
num_node_memblks);
|
num_node_memblks);
|
||||||
|
|
||||||
if (!slit_table)
|
if (!slit_table) {
|
||||||
|
for (i = 0; i < MAX_NUMNODES; i++)
|
||||||
|
for (j = 0; j < MAX_NUMNODES; j++)
|
||||||
|
node_distance(i, j) = i == j ? LOCAL_DISTANCE :
|
||||||
|
REMOTE_DISTANCE;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
memset(numa_slit, -1, sizeof(numa_slit));
|
memset(numa_slit, -1, sizeof(numa_slit));
|
||||||
for (i = 0; i < slit_table->locality_count; i++) {
|
for (i = 0; i < slit_table->locality_count; i++) {
|
||||||
if (!pxm_bit_test(i))
|
if (!pxm_bit_test(i))
|
||||||
|
|
|
@ -159,7 +159,8 @@ static void mmio_access(struct kvm_vcpu *vcpu, u64 src_pa, u64 *dest,
|
||||||
|
|
||||||
if (p->u.ioreq.state == STATE_IORESP_READY) {
|
if (p->u.ioreq.state == STATE_IORESP_READY) {
|
||||||
if (dir == IOREQ_READ)
|
if (dir == IOREQ_READ)
|
||||||
*dest = p->u.ioreq.data;
|
/* it's necessary to ensure zero extending */
|
||||||
|
*dest = p->u.ioreq.data & (~0UL >> (64-(s*8)));
|
||||||
} else
|
} else
|
||||||
panic_vm(vcpu);
|
panic_vm(vcpu);
|
||||||
out:
|
out:
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.26-rc2
|
# Linux kernel version: 2.6.26-rc4
|
||||||
# Sun May 18 14:44:41 2008
|
# Wed May 28 22:47:35 2008
|
||||||
#
|
#
|
||||||
CONFIG_M68K=y
|
CONFIG_M68K=y
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
|
@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
|
||||||
CONFIG_PRINTK=y
|
CONFIG_PRINTK=y
|
||||||
CONFIG_BUG=y
|
CONFIG_BUG=y
|
||||||
CONFIG_ELF_CORE=y
|
CONFIG_ELF_CORE=y
|
||||||
# CONFIG_COMPAT_BRK is not set
|
CONFIG_COMPAT_BRK=y
|
||||||
CONFIG_BASE_FULL=y
|
CONFIG_BASE_FULL=y
|
||||||
CONFIG_FUTEX=y
|
CONFIG_FUTEX=y
|
||||||
CONFIG_ANON_INODES=y
|
CONFIG_ANON_INODES=y
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.26-rc2
|
# Linux kernel version: 2.6.26-rc4
|
||||||
# Sun May 18 14:44:42 2008
|
# Wed May 28 22:47:35 2008
|
||||||
#
|
#
|
||||||
CONFIG_M68K=y
|
CONFIG_M68K=y
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
|
@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
|
||||||
CONFIG_PRINTK=y
|
CONFIG_PRINTK=y
|
||||||
CONFIG_BUG=y
|
CONFIG_BUG=y
|
||||||
CONFIG_ELF_CORE=y
|
CONFIG_ELF_CORE=y
|
||||||
# CONFIG_COMPAT_BRK is not set
|
CONFIG_COMPAT_BRK=y
|
||||||
CONFIG_BASE_FULL=y
|
CONFIG_BASE_FULL=y
|
||||||
CONFIG_FUTEX=y
|
CONFIG_FUTEX=y
|
||||||
CONFIG_ANON_INODES=y
|
CONFIG_ANON_INODES=y
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.26-rc2
|
# Linux kernel version: 2.6.26-rc4
|
||||||
# Sun May 18 14:44:43 2008
|
# Wed May 28 22:47:35 2008
|
||||||
#
|
#
|
||||||
CONFIG_M68K=y
|
CONFIG_M68K=y
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
|
@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
|
||||||
CONFIG_PRINTK=y
|
CONFIG_PRINTK=y
|
||||||
CONFIG_BUG=y
|
CONFIG_BUG=y
|
||||||
CONFIG_ELF_CORE=y
|
CONFIG_ELF_CORE=y
|
||||||
# CONFIG_COMPAT_BRK is not set
|
CONFIG_COMPAT_BRK=y
|
||||||
CONFIG_BASE_FULL=y
|
CONFIG_BASE_FULL=y
|
||||||
CONFIG_FUTEX=y
|
CONFIG_FUTEX=y
|
||||||
CONFIG_ANON_INODES=y
|
CONFIG_ANON_INODES=y
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.26-rc2
|
# Linux kernel version: 2.6.26-rc4
|
||||||
# Sun May 18 14:44:45 2008
|
# Wed May 28 22:47:35 2008
|
||||||
#
|
#
|
||||||
CONFIG_M68K=y
|
CONFIG_M68K=y
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
|
@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
|
||||||
CONFIG_PRINTK=y
|
CONFIG_PRINTK=y
|
||||||
CONFIG_BUG=y
|
CONFIG_BUG=y
|
||||||
CONFIG_ELF_CORE=y
|
CONFIG_ELF_CORE=y
|
||||||
# CONFIG_COMPAT_BRK is not set
|
CONFIG_COMPAT_BRK=y
|
||||||
CONFIG_BASE_FULL=y
|
CONFIG_BASE_FULL=y
|
||||||
CONFIG_FUTEX=y
|
CONFIG_FUTEX=y
|
||||||
CONFIG_ANON_INODES=y
|
CONFIG_ANON_INODES=y
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.26-rc2
|
# Linux kernel version: 2.6.26-rc4
|
||||||
# Sun May 18 14:44:46 2008
|
# Wed May 28 22:47:35 2008
|
||||||
#
|
#
|
||||||
CONFIG_M68K=y
|
CONFIG_M68K=y
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
|
@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
|
||||||
CONFIG_PRINTK=y
|
CONFIG_PRINTK=y
|
||||||
CONFIG_BUG=y
|
CONFIG_BUG=y
|
||||||
CONFIG_ELF_CORE=y
|
CONFIG_ELF_CORE=y
|
||||||
# CONFIG_COMPAT_BRK is not set
|
CONFIG_COMPAT_BRK=y
|
||||||
CONFIG_BASE_FULL=y
|
CONFIG_BASE_FULL=y
|
||||||
CONFIG_FUTEX=y
|
CONFIG_FUTEX=y
|
||||||
CONFIG_ANON_INODES=y
|
CONFIG_ANON_INODES=y
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.26-rc2
|
# Linux kernel version: 2.6.26-rc4
|
||||||
# Sun May 18 14:44:47 2008
|
# Wed May 28 22:47:35 2008
|
||||||
#
|
#
|
||||||
CONFIG_M68K=y
|
CONFIG_M68K=y
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
|
@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
|
||||||
CONFIG_PRINTK=y
|
CONFIG_PRINTK=y
|
||||||
CONFIG_BUG=y
|
CONFIG_BUG=y
|
||||||
CONFIG_ELF_CORE=y
|
CONFIG_ELF_CORE=y
|
||||||
# CONFIG_COMPAT_BRK is not set
|
CONFIG_COMPAT_BRK=y
|
||||||
CONFIG_BASE_FULL=y
|
CONFIG_BASE_FULL=y
|
||||||
CONFIG_FUTEX=y
|
CONFIG_FUTEX=y
|
||||||
CONFIG_ANON_INODES=y
|
CONFIG_ANON_INODES=y
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.26-rc2
|
# Linux kernel version: 2.6.26-rc4
|
||||||
# Sun May 18 14:42:31 2008
|
# Wed May 28 22:47:35 2008
|
||||||
#
|
#
|
||||||
CONFIG_M68K=y
|
CONFIG_M68K=y
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
|
@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
|
||||||
CONFIG_PRINTK=y
|
CONFIG_PRINTK=y
|
||||||
CONFIG_BUG=y
|
CONFIG_BUG=y
|
||||||
CONFIG_ELF_CORE=y
|
CONFIG_ELF_CORE=y
|
||||||
# CONFIG_COMPAT_BRK is not set
|
CONFIG_COMPAT_BRK=y
|
||||||
CONFIG_BASE_FULL=y
|
CONFIG_BASE_FULL=y
|
||||||
CONFIG_FUTEX=y
|
CONFIG_FUTEX=y
|
||||||
CONFIG_ANON_INODES=y
|
CONFIG_ANON_INODES=y
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.26-rc2
|
# Linux kernel version: 2.6.26-rc4
|
||||||
# Sun May 18 14:44:49 2008
|
# Wed May 28 22:47:35 2008
|
||||||
#
|
#
|
||||||
CONFIG_M68K=y
|
CONFIG_M68K=y
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
|
@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
|
||||||
CONFIG_PRINTK=y
|
CONFIG_PRINTK=y
|
||||||
CONFIG_BUG=y
|
CONFIG_BUG=y
|
||||||
CONFIG_ELF_CORE=y
|
CONFIG_ELF_CORE=y
|
||||||
# CONFIG_COMPAT_BRK is not set
|
CONFIG_COMPAT_BRK=y
|
||||||
CONFIG_BASE_FULL=y
|
CONFIG_BASE_FULL=y
|
||||||
CONFIG_FUTEX=y
|
CONFIG_FUTEX=y
|
||||||
CONFIG_ANON_INODES=y
|
CONFIG_ANON_INODES=y
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.26-rc2
|
# Linux kernel version: 2.6.26-rc4
|
||||||
# Sun May 18 14:44:50 2008
|
# Wed May 28 22:47:35 2008
|
||||||
#
|
#
|
||||||
CONFIG_M68K=y
|
CONFIG_M68K=y
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
|
@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
|
||||||
CONFIG_PRINTK=y
|
CONFIG_PRINTK=y
|
||||||
CONFIG_BUG=y
|
CONFIG_BUG=y
|
||||||
CONFIG_ELF_CORE=y
|
CONFIG_ELF_CORE=y
|
||||||
# CONFIG_COMPAT_BRK is not set
|
CONFIG_COMPAT_BRK=y
|
||||||
CONFIG_BASE_FULL=y
|
CONFIG_BASE_FULL=y
|
||||||
CONFIG_FUTEX=y
|
CONFIG_FUTEX=y
|
||||||
CONFIG_ANON_INODES=y
|
CONFIG_ANON_INODES=y
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.26-rc2
|
# Linux kernel version: 2.6.26-rc4
|
||||||
# Sun May 18 14:44:51 2008
|
# Wed May 28 22:47:35 2008
|
||||||
#
|
#
|
||||||
CONFIG_M68K=y
|
CONFIG_M68K=y
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
|
@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
|
||||||
CONFIG_PRINTK=y
|
CONFIG_PRINTK=y
|
||||||
CONFIG_BUG=y
|
CONFIG_BUG=y
|
||||||
CONFIG_ELF_CORE=y
|
CONFIG_ELF_CORE=y
|
||||||
# CONFIG_COMPAT_BRK is not set
|
CONFIG_COMPAT_BRK=y
|
||||||
CONFIG_BASE_FULL=y
|
CONFIG_BASE_FULL=y
|
||||||
CONFIG_FUTEX=y
|
CONFIG_FUTEX=y
|
||||||
CONFIG_ANON_INODES=y
|
CONFIG_ANON_INODES=y
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.26-rc2
|
# Linux kernel version: 2.6.26-rc4
|
||||||
# Sun May 18 14:44:53 2008
|
# Wed May 28 22:47:35 2008
|
||||||
#
|
#
|
||||||
CONFIG_M68K=y
|
CONFIG_M68K=y
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
|
@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
|
||||||
CONFIG_PRINTK=y
|
CONFIG_PRINTK=y
|
||||||
CONFIG_BUG=y
|
CONFIG_BUG=y
|
||||||
CONFIG_ELF_CORE=y
|
CONFIG_ELF_CORE=y
|
||||||
# CONFIG_COMPAT_BRK is not set
|
CONFIG_COMPAT_BRK=y
|
||||||
CONFIG_BASE_FULL=y
|
CONFIG_BASE_FULL=y
|
||||||
CONFIG_FUTEX=y
|
CONFIG_FUTEX=y
|
||||||
CONFIG_ANON_INODES=y
|
CONFIG_ANON_INODES=y
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.26-rc2
|
# Linux kernel version: 2.6.26-rc4
|
||||||
# Sun May 18 14:44:54 2008
|
# Wed May 28 22:47:35 2008
|
||||||
#
|
#
|
||||||
CONFIG_M68K=y
|
CONFIG_M68K=y
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
|
@ -59,7 +59,7 @@ CONFIG_HOTPLUG=y
|
||||||
CONFIG_PRINTK=y
|
CONFIG_PRINTK=y
|
||||||
CONFIG_BUG=y
|
CONFIG_BUG=y
|
||||||
CONFIG_ELF_CORE=y
|
CONFIG_ELF_CORE=y
|
||||||
# CONFIG_COMPAT_BRK is not set
|
CONFIG_COMPAT_BRK=y
|
||||||
CONFIG_BASE_FULL=y
|
CONFIG_BASE_FULL=y
|
||||||
CONFIG_FUTEX=y
|
CONFIG_FUTEX=y
|
||||||
CONFIG_ANON_INODES=y
|
CONFIG_ANON_INODES=y
|
||||||
|
|
|
@ -111,7 +111,13 @@ void hw_timer_init(void)
|
||||||
|
|
||||||
__raw_writew(MCFTIMER_TMR_DISABLE, TA(MCFTIMER_TMR));
|
__raw_writew(MCFTIMER_TMR_DISABLE, TA(MCFTIMER_TMR));
|
||||||
mcftmr_cycles_per_jiffy = FREQ / HZ;
|
mcftmr_cycles_per_jiffy = FREQ / HZ;
|
||||||
__raw_writetrr(mcftmr_cycles_per_jiffy, TA(MCFTIMER_TRR));
|
/*
|
||||||
|
* The coldfire timer runs from 0 to TRR included, then 0
|
||||||
|
* again and so on. It counts thus actually TRR + 1 steps
|
||||||
|
* for 1 tick, not TRR. So if you want n cycles,
|
||||||
|
* initialize TRR with n - 1.
|
||||||
|
*/
|
||||||
|
__raw_writetrr(mcftmr_cycles_per_jiffy - 1, TA(MCFTIMER_TRR));
|
||||||
__raw_writew(MCFTIMER_TMR_ENORI | MCFTIMER_TMR_CLK16 |
|
__raw_writew(MCFTIMER_TMR_ENORI | MCFTIMER_TMR_CLK16 |
|
||||||
MCFTIMER_TMR_RESTART | MCFTIMER_TMR_ENABLE, TA(MCFTIMER_TMR));
|
MCFTIMER_TMR_RESTART | MCFTIMER_TMR_ENABLE, TA(MCFTIMER_TMR));
|
||||||
|
|
||||||
|
|
|
@ -13,10 +13,9 @@
|
||||||
#include <asm/unistd.h>
|
#include <asm/unistd.h>
|
||||||
#include <asm/errno.h>
|
#include <asm/errno.h>
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
.level LEVEL
|
.level LEVEL
|
||||||
__HEAD
|
.text
|
||||||
|
|
||||||
.import hpux_call_table
|
.import hpux_call_table
|
||||||
.import hpux_syscall_exit,code
|
.import hpux_syscall_exit,code
|
||||||
|
|
|
@ -28,10 +28,9 @@
|
||||||
#include <asm/assembly.h>
|
#include <asm/assembly.h>
|
||||||
#include <asm/signal.h>
|
#include <asm/signal.h>
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
.level LEVEL
|
.level LEVEL
|
||||||
__HEAD
|
.text
|
||||||
|
|
||||||
/* These should probably go in a header file somewhere.
|
/* These should probably go in a header file somewhere.
|
||||||
* They are duplicated in kernel/wrappers.S
|
* They are duplicated in kernel/wrappers.S
|
||||||
|
|
|
@ -38,7 +38,6 @@
|
||||||
#include <asm/thread_info.h>
|
#include <asm/thread_info.h>
|
||||||
|
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
#ifdef CONFIG_64BIT
|
#ifdef CONFIG_64BIT
|
||||||
.level 2.0w
|
.level 2.0w
|
||||||
|
@ -622,7 +621,7 @@
|
||||||
* the static part of the kernel address space.
|
* the static part of the kernel address space.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
__HEAD
|
.text
|
||||||
|
|
||||||
.align PAGE_SIZE
|
.align PAGE_SIZE
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@ ENTRY(boot_args)
|
||||||
END(boot_args)
|
END(boot_args)
|
||||||
|
|
||||||
__HEAD
|
__HEAD
|
||||||
|
|
||||||
.align 4
|
.align 4
|
||||||
.import init_thread_union,data
|
.import init_thread_union,data
|
||||||
.import fault_vector_20,code /* IVA parisc 2.0 32 bit */
|
.import fault_vector_20,code /* IVA parisc 2.0 32 bit */
|
||||||
|
|
|
@ -47,7 +47,6 @@
|
||||||
#include <asm/pdc.h>
|
#include <asm/pdc.h>
|
||||||
|
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* stack for os_hpmc, the HPMC handler.
|
* stack for os_hpmc, the HPMC handler.
|
||||||
|
@ -77,7 +76,7 @@ ENTRY(hpmc_pim_data)
|
||||||
.block HPMC_PIM_DATA_SIZE
|
.block HPMC_PIM_DATA_SIZE
|
||||||
END(hpmc_pim_data)
|
END(hpmc_pim_data)
|
||||||
|
|
||||||
__HEAD
|
.text
|
||||||
|
|
||||||
.import intr_save, code
|
.import intr_save, code
|
||||||
ENTRY(os_hpmc)
|
ENTRY(os_hpmc)
|
||||||
|
|
|
@ -37,9 +37,8 @@
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
__HEAD
|
.text
|
||||||
.align 128
|
.align 128
|
||||||
|
|
||||||
ENTRY(flush_tlb_all_local)
|
ENTRY(flush_tlb_all_local)
|
||||||
|
|
|
@ -152,3 +152,6 @@ EXPORT_SYMBOL($$dyncall);
|
||||||
EXPORT_SYMBOL(node_data);
|
EXPORT_SYMBOL(node_data);
|
||||||
EXPORT_SYMBOL(pfnnid_map);
|
EXPORT_SYMBOL(pfnnid_map);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* from pacache.S -- needed for copy_page */
|
||||||
|
EXPORT_SYMBOL(copy_user_page_asm);
|
||||||
|
|
|
@ -43,7 +43,7 @@
|
||||||
; The coprocessor only needs to be enabled when
|
; The coprocessor only needs to be enabled when
|
||||||
; starting/stopping the coprocessor with the pmenb/pmdis.
|
; starting/stopping the coprocessor with the pmenb/pmdis.
|
||||||
;
|
;
|
||||||
__HEAD
|
.text
|
||||||
|
|
||||||
ENTRY(perf_intrigue_enable_perf_counters)
|
ENTRY(perf_intrigue_enable_perf_counters)
|
||||||
.proc
|
.proc
|
||||||
|
|
|
@ -12,7 +12,6 @@
|
||||||
#include <asm/assembly.h>
|
#include <asm/assembly.h>
|
||||||
|
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
.section .bss
|
.section .bss
|
||||||
.export real_stack
|
.export real_stack
|
||||||
|
@ -40,7 +39,7 @@ save_cr_end:
|
||||||
/************************ 32-bit real-mode calls ***********************/
|
/************************ 32-bit real-mode calls ***********************/
|
||||||
/* This can be called in both narrow and wide kernels */
|
/* This can be called in both narrow and wide kernels */
|
||||||
|
|
||||||
__HEAD
|
.text
|
||||||
|
|
||||||
/* unsigned long real32_call_asm(unsigned int *sp,
|
/* unsigned long real32_call_asm(unsigned int *sp,
|
||||||
* unsigned int *arg0p,
|
* unsigned int *arg0p,
|
||||||
|
@ -114,7 +113,7 @@ ENDPROC(real32_call_asm)
|
||||||
# define PUSH_CR(r, where) mfctl r, %r1 ! STREG,ma %r1, REG_SZ(where)
|
# define PUSH_CR(r, where) mfctl r, %r1 ! STREG,ma %r1, REG_SZ(where)
|
||||||
# define POP_CR(r, where) LDREG,mb -REG_SZ(where), %r1 ! mtctl %r1, r
|
# define POP_CR(r, where) LDREG,mb -REG_SZ(where), %r1 ! mtctl %r1, r
|
||||||
|
|
||||||
__HEAD
|
.text
|
||||||
save_control_regs:
|
save_control_regs:
|
||||||
load32 PA(save_cr_space), %r28
|
load32 PA(save_cr_space), %r28
|
||||||
PUSH_CR(%cr24, %r28)
|
PUSH_CR(%cr24, %r28)
|
||||||
|
@ -146,7 +145,7 @@ restore_control_regs:
|
||||||
/* rfi_virt2real() and rfi_real2virt() could perhaps be adapted for
|
/* rfi_virt2real() and rfi_real2virt() could perhaps be adapted for
|
||||||
* more general-purpose use by the several places which need RFIs
|
* more general-purpose use by the several places which need RFIs
|
||||||
*/
|
*/
|
||||||
__HEAD
|
.text
|
||||||
.align 128
|
.align 128
|
||||||
rfi_virt2real:
|
rfi_virt2real:
|
||||||
/* switch to real mode... */
|
/* switch to real mode... */
|
||||||
|
@ -181,7 +180,7 @@ rfi_v2r_1:
|
||||||
bv 0(%r2)
|
bv 0(%r2)
|
||||||
nop
|
nop
|
||||||
|
|
||||||
__HEAD
|
.text
|
||||||
.align 128
|
.align 128
|
||||||
rfi_real2virt:
|
rfi_real2virt:
|
||||||
rsm PSW_SM_I,%r0
|
rsm PSW_SM_I,%r0
|
||||||
|
@ -219,7 +218,7 @@ rfi_r2v_1:
|
||||||
|
|
||||||
/************************ 64-bit real-mode calls ***********************/
|
/************************ 64-bit real-mode calls ***********************/
|
||||||
/* This is only usable in wide kernels right now and will probably stay so */
|
/* This is only usable in wide kernels right now and will probably stay so */
|
||||||
__HEAD
|
.text
|
||||||
/* unsigned long real64_call_asm(unsigned long *sp,
|
/* unsigned long real64_call_asm(unsigned long *sp,
|
||||||
* unsigned long *arg0p,
|
* unsigned long *arg0p,
|
||||||
* unsigned long fn)
|
* unsigned long fn)
|
||||||
|
@ -277,7 +276,7 @@ ENDPROC(real64_call_asm)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
__HEAD
|
.text
|
||||||
/* http://lists.parisc-linux.org/hypermail/parisc-linux/10916.html
|
/* http://lists.parisc-linux.org/hypermail/parisc-linux/10916.html
|
||||||
** GCC 3.3 and later has a new function in libgcc.a for
|
** GCC 3.3 and later has a new function in libgcc.a for
|
||||||
** comparing function pointers.
|
** comparing function pointers.
|
||||||
|
|
|
@ -289,7 +289,7 @@ setup_sigcontext32(struct compat_sigcontext __user *sc, struct compat_regfile __
|
||||||
&sc->sc_iaoq[0], compat_reg);
|
&sc->sc_iaoq[0], compat_reg);
|
||||||
|
|
||||||
/* Store upper half */
|
/* Store upper half */
|
||||||
compat_reg = (compat_uint_t)(regs->gr[32] >> 32);
|
compat_reg = (compat_uint_t)(regs->gr[31] >> 32);
|
||||||
err |= __put_user(compat_reg, &rf->rf_iaoq[0]);
|
err |= __put_user(compat_reg, &rf->rf_iaoq[0]);
|
||||||
DBG(2,"setup_sigcontext32: upper half iaoq[0] = %#x\n", compat_reg);
|
DBG(2,"setup_sigcontext32: upper half iaoq[0] = %#x\n", compat_reg);
|
||||||
|
|
||||||
|
@ -299,7 +299,7 @@ setup_sigcontext32(struct compat_sigcontext __user *sc, struct compat_regfile __
|
||||||
DBG(2,"setup_sigcontext32: sc->sc_iaoq[1] = %p <= %#x\n",
|
DBG(2,"setup_sigcontext32: sc->sc_iaoq[1] = %p <= %#x\n",
|
||||||
&sc->sc_iaoq[1], compat_reg);
|
&sc->sc_iaoq[1], compat_reg);
|
||||||
/* Store upper half */
|
/* Store upper half */
|
||||||
compat_reg = (compat_uint_t)((regs->gr[32]+4) >> 32);
|
compat_reg = (compat_uint_t)((regs->gr[31]+4) >> 32);
|
||||||
err |= __put_user(compat_reg, &rf->rf_iaoq[1]);
|
err |= __put_user(compat_reg, &rf->rf_iaoq[1]);
|
||||||
DBG(2,"setup_sigcontext32: upper half iaoq[1] = %#x\n", compat_reg);
|
DBG(2,"setup_sigcontext32: upper half iaoq[1] = %#x\n", compat_reg);
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
|
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
/* We fill the empty parts of the gateway page with
|
/* We fill the empty parts of the gateway page with
|
||||||
* something that will kill the kernel or a
|
* something that will kill the kernel or a
|
||||||
|
@ -27,7 +26,7 @@
|
||||||
|
|
||||||
.level LEVEL
|
.level LEVEL
|
||||||
|
|
||||||
__HEAD
|
.text
|
||||||
|
|
||||||
.import syscall_exit,code
|
.import syscall_exit,code
|
||||||
.import syscall_exit_rfi,code
|
.import syscall_exit_rfi,code
|
||||||
|
@ -637,7 +636,7 @@ END(sys_call_table64)
|
||||||
All light-weight-syscall atomic operations
|
All light-weight-syscall atomic operations
|
||||||
will use this set of locks
|
will use this set of locks
|
||||||
*/
|
*/
|
||||||
.section .data, "aw"
|
.section .data
|
||||||
.align PAGE_SIZE
|
.align PAGE_SIZE
|
||||||
ENTRY(lws_lock_start)
|
ENTRY(lws_lock_start)
|
||||||
/* lws locks */
|
/* lws locks */
|
||||||
|
|
|
@ -50,6 +50,7 @@ SECTIONS
|
||||||
|
|
||||||
_text = .; /* Text and read-only data */
|
_text = .; /* Text and read-only data */
|
||||||
.text ALIGN(16) : {
|
.text ALIGN(16) : {
|
||||||
|
HEAD_TEXT
|
||||||
TEXT_TEXT
|
TEXT_TEXT
|
||||||
SCHED_TEXT
|
SCHED_TEXT
|
||||||
LOCK_TEXT
|
LOCK_TEXT
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
#include <asm/assembly.h>
|
#include <asm/assembly.h>
|
||||||
#include <asm/errno.h>
|
#include <asm/errno.h>
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
.macro get_fault_ip t1 t2
|
.macro get_fault_ip t1 t2
|
||||||
|
@ -56,7 +55,7 @@
|
||||||
|
|
||||||
.level LEVEL
|
.level LEVEL
|
||||||
|
|
||||||
__HEAD
|
.text
|
||||||
.section .fixup, "ax"
|
.section .fixup, "ax"
|
||||||
|
|
||||||
/* get_user() fixups, store -EFAULT in r8, and 0 in r9 */
|
/* get_user() fixups, store -EFAULT in r8, and 0 in r9 */
|
||||||
|
|
|
@ -33,12 +33,11 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
.text
|
||||||
|
|
||||||
#include <asm/assembly.h>
|
#include <asm/assembly.h>
|
||||||
#include <asm/errno.h>
|
#include <asm/errno.h>
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
__HEAD
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* get_sr gets the appropriate space value into
|
* get_sr gets the appropriate space value into
|
||||||
|
|
|
@ -547,6 +547,7 @@ void __init mem_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long *empty_zero_page __read_mostly;
|
unsigned long *empty_zero_page __read_mostly;
|
||||||
|
EXPORT_SYMBOL(empty_zero_page);
|
||||||
|
|
||||||
void show_mem(void)
|
void show_mem(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -221,8 +221,8 @@ image-$(CONFIG_WARP) += cuImage.warp
|
||||||
image-$(CONFIG_YOSEMITE) += cuImage.yosemite
|
image-$(CONFIG_YOSEMITE) += cuImage.yosemite
|
||||||
|
|
||||||
# Board ports in arch/powerpc/platform/8xx/Kconfig
|
# Board ports in arch/powerpc/platform/8xx/Kconfig
|
||||||
image-$(CONFIG_PPC_MPC86XADS) += cuImage.mpc866ads
|
image-$(CONFIG_MPC86XADS) += cuImage.mpc866ads
|
||||||
image-$(CONFIG_PPC_MPC885ADS) += cuImage.mpc885ads
|
image-$(CONFIG_MPC885ADS) += cuImage.mpc885ads
|
||||||
image-$(CONFIG_PPC_EP88XC) += dtbImage.ep88xc
|
image-$(CONFIG_PPC_EP88XC) += dtbImage.ep88xc
|
||||||
image-$(CONFIG_PPC_ADDER875) += cuImage.adder875-uboot \
|
image-$(CONFIG_PPC_ADDER875) += cuImage.adder875-uboot \
|
||||||
dtbImage.adder875-redboot
|
dtbImage.adder875-redboot
|
||||||
|
|
|
@ -189,7 +189,7 @@ struct pci_dev *of_create_pci_dev(struct device_node *node,
|
||||||
|
|
||||||
dev->cfg_size = pci_cfg_space_size(dev);
|
dev->cfg_size = pci_cfg_space_size(dev);
|
||||||
|
|
||||||
sprintf(pci_name(dev), "%04x:%02x:%02x.%d", pci_domain_nr(bus),
|
dev_set_name(&dev->dev, "%04x:%02x:%02x.%d", pci_domain_nr(bus),
|
||||||
dev->bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn));
|
dev->bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn));
|
||||||
dev->class = get_int_prop(node, "class-code", 0);
|
dev->class = get_int_prop(node, "class-code", 0);
|
||||||
dev->revision = get_int_prop(node, "revision-id", 0);
|
dev->revision = get_int_prop(node, "revision-id", 0);
|
||||||
|
|
|
@ -87,6 +87,7 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
|
||||||
#ifdef CONFIG_ALTIVEC
|
#ifdef CONFIG_ALTIVEC
|
||||||
elf_vrreg_t __user *v_regs = (elf_vrreg_t __user *)(((unsigned long)sc->vmx_reserve + 15) & ~0xful);
|
elf_vrreg_t __user *v_regs = (elf_vrreg_t __user *)(((unsigned long)sc->vmx_reserve + 15) & ~0xful);
|
||||||
#endif
|
#endif
|
||||||
|
unsigned long msr = regs->msr;
|
||||||
long err = 0;
|
long err = 0;
|
||||||
|
|
||||||
flush_fp_to_thread(current);
|
flush_fp_to_thread(current);
|
||||||
|
@ -102,7 +103,7 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
|
||||||
/* set MSR_VEC in the MSR value in the frame to indicate that sc->v_reg)
|
/* set MSR_VEC in the MSR value in the frame to indicate that sc->v_reg)
|
||||||
* contains valid data.
|
* contains valid data.
|
||||||
*/
|
*/
|
||||||
regs->msr |= MSR_VEC;
|
msr |= MSR_VEC;
|
||||||
}
|
}
|
||||||
/* We always copy to/from vrsave, it's 0 if we don't have or don't
|
/* We always copy to/from vrsave, it's 0 if we don't have or don't
|
||||||
* use altivec.
|
* use altivec.
|
||||||
|
@ -114,6 +115,7 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
|
||||||
err |= __put_user(&sc->gp_regs, &sc->regs);
|
err |= __put_user(&sc->gp_regs, &sc->regs);
|
||||||
WARN_ON(!FULL_REGS(regs));
|
WARN_ON(!FULL_REGS(regs));
|
||||||
err |= __copy_to_user(&sc->gp_regs, regs, GP_REGS_SIZE);
|
err |= __copy_to_user(&sc->gp_regs, regs, GP_REGS_SIZE);
|
||||||
|
err |= __put_user(msr, &sc->gp_regs[PT_MSR]);
|
||||||
err |= __copy_to_user(&sc->fp_regs, ¤t->thread.fpr, FP_REGS_SIZE);
|
err |= __copy_to_user(&sc->fp_regs, ¤t->thread.fpr, FP_REGS_SIZE);
|
||||||
err |= __put_user(signr, &sc->signal);
|
err |= __put_user(signr, &sc->signal);
|
||||||
err |= __put_user(handler, &sc->handler);
|
err |= __put_user(handler, &sc->handler);
|
||||||
|
|
|
@ -116,8 +116,6 @@ static void kvmppc_44x_shadow_release(struct kvm_vcpu *vcpu,
|
||||||
struct tlbe *stlbe = &vcpu->arch.shadow_tlb[index];
|
struct tlbe *stlbe = &vcpu->arch.shadow_tlb[index];
|
||||||
struct page *page = vcpu->arch.shadow_pages[index];
|
struct page *page = vcpu->arch.shadow_pages[index];
|
||||||
|
|
||||||
kunmap(vcpu->arch.shadow_pages[index]);
|
|
||||||
|
|
||||||
if (get_tlb_v(stlbe)) {
|
if (get_tlb_v(stlbe)) {
|
||||||
if (kvmppc_44x_tlbe_is_writable(stlbe))
|
if (kvmppc_44x_tlbe_is_writable(stlbe))
|
||||||
kvm_release_page_dirty(page);
|
kvm_release_page_dirty(page);
|
||||||
|
@ -144,18 +142,19 @@ void kvmppc_mmu_map(struct kvm_vcpu *vcpu, u64 gvaddr, gfn_t gfn, u64 asid,
|
||||||
stlbe = &vcpu->arch.shadow_tlb[victim];
|
stlbe = &vcpu->arch.shadow_tlb[victim];
|
||||||
|
|
||||||
/* Get reference to new page. */
|
/* Get reference to new page. */
|
||||||
down_write(¤t->mm->mmap_sem);
|
down_read(¤t->mm->mmap_sem);
|
||||||
new_page = gfn_to_page(vcpu->kvm, gfn);
|
new_page = gfn_to_page(vcpu->kvm, gfn);
|
||||||
if (is_error_page(new_page)) {
|
if (is_error_page(new_page)) {
|
||||||
printk(KERN_ERR "Couldn't get guest page!\n");
|
printk(KERN_ERR "Couldn't get guest page for gfn %lx!\n", gfn);
|
||||||
kvm_release_page_clean(new_page);
|
kvm_release_page_clean(new_page);
|
||||||
|
up_read(¤t->mm->mmap_sem);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
hpaddr = page_to_phys(new_page);
|
hpaddr = page_to_phys(new_page);
|
||||||
|
|
||||||
/* Drop reference to old page. */
|
/* Drop reference to old page. */
|
||||||
kvmppc_44x_shadow_release(vcpu, victim);
|
kvmppc_44x_shadow_release(vcpu, victim);
|
||||||
up_write(¤t->mm->mmap_sem);
|
up_read(¤t->mm->mmap_sem);
|
||||||
|
|
||||||
vcpu->arch.shadow_pages[victim] = new_page;
|
vcpu->arch.shadow_pages[victim] = new_page;
|
||||||
|
|
||||||
|
|
|
@ -227,39 +227,6 @@ void kvmppc_check_and_deliver_interrupts(struct kvm_vcpu *vcpu)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int kvmppc_emulate_mmio(struct kvm_run *run, struct kvm_vcpu *vcpu)
|
|
||||||
{
|
|
||||||
enum emulation_result er;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
er = kvmppc_emulate_instruction(run, vcpu);
|
|
||||||
switch (er) {
|
|
||||||
case EMULATE_DONE:
|
|
||||||
/* Future optimization: only reload non-volatiles if they were
|
|
||||||
* actually modified. */
|
|
||||||
r = RESUME_GUEST_NV;
|
|
||||||
break;
|
|
||||||
case EMULATE_DO_MMIO:
|
|
||||||
run->exit_reason = KVM_EXIT_MMIO;
|
|
||||||
/* We must reload nonvolatiles because "update" load/store
|
|
||||||
* instructions modify register state. */
|
|
||||||
/* Future optimization: only reload non-volatiles if they were
|
|
||||||
* actually modified. */
|
|
||||||
r = RESUME_HOST_NV;
|
|
||||||
break;
|
|
||||||
case EMULATE_FAIL:
|
|
||||||
/* XXX Deliver Program interrupt to guest. */
|
|
||||||
printk(KERN_EMERG "%s: emulation failed (%08x)\n", __func__,
|
|
||||||
vcpu->arch.last_inst);
|
|
||||||
r = RESUME_HOST;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
BUG();
|
|
||||||
}
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* kvmppc_handle_exit
|
* kvmppc_handle_exit
|
||||||
*
|
*
|
||||||
|
|
|
@ -246,6 +246,11 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu)
|
||||||
case 31:
|
case 31:
|
||||||
switch (get_xop(inst)) {
|
switch (get_xop(inst)) {
|
||||||
|
|
||||||
|
case 23: /* lwzx */
|
||||||
|
rt = get_rt(inst);
|
||||||
|
emulated = kvmppc_handle_load(run, vcpu, rt, 4, 1);
|
||||||
|
break;
|
||||||
|
|
||||||
case 83: /* mfmsr */
|
case 83: /* mfmsr */
|
||||||
rt = get_rt(inst);
|
rt = get_rt(inst);
|
||||||
vcpu->arch.gpr[rt] = vcpu->arch.msr;
|
vcpu->arch.gpr[rt] = vcpu->arch.msr;
|
||||||
|
@ -267,6 +272,13 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu)
|
||||||
kvmppc_set_msr(vcpu, vcpu->arch.gpr[rs]);
|
kvmppc_set_msr(vcpu, vcpu->arch.gpr[rs]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 151: /* stwx */
|
||||||
|
rs = get_rs(inst);
|
||||||
|
emulated = kvmppc_handle_store(run, vcpu,
|
||||||
|
vcpu->arch.gpr[rs],
|
||||||
|
4, 1);
|
||||||
|
break;
|
||||||
|
|
||||||
case 163: /* wrteei */
|
case 163: /* wrteei */
|
||||||
vcpu->arch.msr = (vcpu->arch.msr & ~MSR_EE)
|
vcpu->arch.msr = (vcpu->arch.msr & ~MSR_EE)
|
||||||
| (inst & MSR_EE);
|
| (inst & MSR_EE);
|
||||||
|
|
|
@ -151,6 +151,7 @@ out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_MEMORY_HOTREMOVE */
|
#endif /* CONFIG_MEMORY_HOTREMOVE */
|
||||||
|
#endif /* CONFIG_MEMORY_HOTPLUG */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* walk_memory_resource() needs to make sure there is no holes in a given
|
* walk_memory_resource() needs to make sure there is no holes in a given
|
||||||
|
@ -184,8 +185,6 @@ walk_memory_resource(unsigned long start_pfn, unsigned long nr_pages, void *arg,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(walk_memory_resource);
|
EXPORT_SYMBOL_GPL(walk_memory_resource);
|
||||||
|
|
||||||
#endif /* CONFIG_MEMORY_HOTPLUG */
|
|
||||||
|
|
||||||
void show_mem(void)
|
void show_mem(void)
|
||||||
{
|
{
|
||||||
unsigned long total = 0, reserved = 0;
|
unsigned long total = 0, reserved = 0;
|
||||||
|
|
|
@ -432,7 +432,7 @@ static struct i2c_driver_device i2c_devices[] __initdata = {
|
||||||
{"dallas,ds1339", "ds1339"},
|
{"dallas,ds1339", "ds1339"},
|
||||||
{"dallas,ds1340", "ds1340"},
|
{"dallas,ds1340", "ds1340"},
|
||||||
{"stm,m41t00", "m41t00"},
|
{"stm,m41t00", "m41t00"},
|
||||||
{"dallas,ds1374", "rtc-ds1374"},
|
{"dallas,ds1374", "ds1374"},
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init of_find_i2c_driver(struct device_node *node,
|
static int __init of_find_i2c_driver(struct device_node *node,
|
||||||
|
|
|
@ -304,6 +304,7 @@ config ARCH_SPARSEMEM_ENABLE
|
||||||
def_bool y
|
def_bool y
|
||||||
select SPARSEMEM_VMEMMAP_ENABLE
|
select SPARSEMEM_VMEMMAP_ENABLE
|
||||||
select SPARSEMEM_VMEMMAP
|
select SPARSEMEM_VMEMMAP
|
||||||
|
select SPARSEMEM_STATIC if !64BIT
|
||||||
|
|
||||||
config ARCH_SPARSEMEM_DEFAULT
|
config ARCH_SPARSEMEM_DEFAULT
|
||||||
def_bool y
|
def_bool y
|
||||||
|
|
|
@ -711,7 +711,7 @@ int __cpuinit __cpu_up(unsigned int cpu)
|
||||||
memset(sf, 0, sizeof(struct stack_frame));
|
memset(sf, 0, sizeof(struct stack_frame));
|
||||||
sf->gprs[9] = (unsigned long) sf;
|
sf->gprs[9] = (unsigned long) sf;
|
||||||
cpu_lowcore->save_area[15] = (unsigned long) sf;
|
cpu_lowcore->save_area[15] = (unsigned long) sf;
|
||||||
__ctl_store(cpu_lowcore->cregs_save_area[0], 0, 15);
|
__ctl_store(cpu_lowcore->cregs_save_area, 0, 15);
|
||||||
asm volatile(
|
asm volatile(
|
||||||
" stam 0,15,0(%0)"
|
" stam 0,15,0(%0)"
|
||||||
: : "a" (&cpu_lowcore->access_regs_save_area) : "memory");
|
: : "a" (&cpu_lowcore->access_regs_save_area) : "memory");
|
||||||
|
|
|
@ -20,7 +20,7 @@ static int __diag_time_slice_end(struct kvm_vcpu *vcpu)
|
||||||
VCPU_EVENT(vcpu, 5, "%s", "diag time slice end");
|
VCPU_EVENT(vcpu, 5, "%s", "diag time slice end");
|
||||||
vcpu->stat.diagnose_44++;
|
vcpu->stat.diagnose_44++;
|
||||||
vcpu_put(vcpu);
|
vcpu_put(vcpu);
|
||||||
schedule();
|
yield();
|
||||||
vcpu_load(vcpu);
|
vcpu_load(vcpu);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -339,6 +339,11 @@ int kvm_s390_handle_wait(struct kvm_vcpu *vcpu)
|
||||||
if (kvm_cpu_has_interrupt(vcpu))
|
if (kvm_cpu_has_interrupt(vcpu))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
__set_cpu_idle(vcpu);
|
||||||
|
spin_lock_bh(&vcpu->arch.local_int.lock);
|
||||||
|
vcpu->arch.local_int.timer_due = 0;
|
||||||
|
spin_unlock_bh(&vcpu->arch.local_int.lock);
|
||||||
|
|
||||||
if (psw_interrupts_disabled(vcpu)) {
|
if (psw_interrupts_disabled(vcpu)) {
|
||||||
VCPU_EVENT(vcpu, 3, "%s", "disabled wait");
|
VCPU_EVENT(vcpu, 3, "%s", "disabled wait");
|
||||||
__unset_cpu_idle(vcpu);
|
__unset_cpu_idle(vcpu);
|
||||||
|
@ -366,8 +371,6 @@ int kvm_s390_handle_wait(struct kvm_vcpu *vcpu)
|
||||||
no_timer:
|
no_timer:
|
||||||
spin_lock_bh(&vcpu->arch.local_int.float_int->lock);
|
spin_lock_bh(&vcpu->arch.local_int.float_int->lock);
|
||||||
spin_lock_bh(&vcpu->arch.local_int.lock);
|
spin_lock_bh(&vcpu->arch.local_int.lock);
|
||||||
__set_cpu_idle(vcpu);
|
|
||||||
vcpu->arch.local_int.timer_due = 0;
|
|
||||||
add_wait_queue(&vcpu->arch.local_int.wq, &wait);
|
add_wait_queue(&vcpu->arch.local_int.wq, &wait);
|
||||||
while (list_empty(&vcpu->arch.local_int.list) &&
|
while (list_empty(&vcpu->arch.local_int.list) &&
|
||||||
list_empty(&vcpu->arch.local_int.float_int->list) &&
|
list_empty(&vcpu->arch.local_int.float_int->list) &&
|
||||||
|
|
|
@ -423,6 +423,8 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
|
||||||
return -EINVAL; /* not implemented yet */
|
return -EINVAL; /* not implemented yet */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern void s390_handle_mcck(void);
|
||||||
|
|
||||||
static void __vcpu_run(struct kvm_vcpu *vcpu)
|
static void __vcpu_run(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
memcpy(&vcpu->arch.sie_block->gg14, &vcpu->arch.guest_gprs[14], 16);
|
memcpy(&vcpu->arch.sie_block->gg14, &vcpu->arch.guest_gprs[14], 16);
|
||||||
|
@ -430,13 +432,21 @@ static void __vcpu_run(struct kvm_vcpu *vcpu)
|
||||||
if (need_resched())
|
if (need_resched())
|
||||||
schedule();
|
schedule();
|
||||||
|
|
||||||
|
if (test_thread_flag(TIF_MCCK_PENDING))
|
||||||
|
s390_handle_mcck();
|
||||||
|
|
||||||
|
kvm_s390_deliver_pending_interrupts(vcpu);
|
||||||
|
|
||||||
vcpu->arch.sie_block->icptcode = 0;
|
vcpu->arch.sie_block->icptcode = 0;
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
kvm_guest_enter();
|
kvm_guest_enter();
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
VCPU_EVENT(vcpu, 6, "entering sie flags %x",
|
VCPU_EVENT(vcpu, 6, "entering sie flags %x",
|
||||||
atomic_read(&vcpu->arch.sie_block->cpuflags));
|
atomic_read(&vcpu->arch.sie_block->cpuflags));
|
||||||
sie64a(vcpu->arch.sie_block, vcpu->arch.guest_gprs);
|
if (sie64a(vcpu->arch.sie_block, vcpu->arch.guest_gprs)) {
|
||||||
|
VCPU_EVENT(vcpu, 3, "%s", "fault in sie instruction");
|
||||||
|
kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
|
||||||
|
}
|
||||||
VCPU_EVENT(vcpu, 6, "exit sie icptcode %d",
|
VCPU_EVENT(vcpu, 6, "exit sie icptcode %d",
|
||||||
vcpu->arch.sie_block->icptcode);
|
vcpu->arch.sie_block->icptcode);
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
|
@ -475,7 +485,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
||||||
might_sleep();
|
might_sleep();
|
||||||
|
|
||||||
do {
|
do {
|
||||||
kvm_s390_deliver_pending_interrupts(vcpu);
|
|
||||||
__vcpu_run(vcpu);
|
__vcpu_run(vcpu);
|
||||||
rc = kvm_handle_sie_intercept(vcpu);
|
rc = kvm_handle_sie_intercept(vcpu);
|
||||||
} while (!signal_pending(current) && !rc);
|
} while (!signal_pending(current) && !rc);
|
||||||
|
|
|
@ -254,36 +254,46 @@ void disable_noexec(struct mm_struct *mm, struct task_struct *tsk)
|
||||||
int s390_enable_sie(void)
|
int s390_enable_sie(void)
|
||||||
{
|
{
|
||||||
struct task_struct *tsk = current;
|
struct task_struct *tsk = current;
|
||||||
struct mm_struct *mm;
|
struct mm_struct *mm, *old_mm;
|
||||||
int rc;
|
|
||||||
|
|
||||||
task_lock(tsk);
|
/* Do we have pgstes? if yes, we are done */
|
||||||
|
|
||||||
rc = 0;
|
|
||||||
if (tsk->mm->context.pgstes)
|
if (tsk->mm->context.pgstes)
|
||||||
goto unlock;
|
return 0;
|
||||||
|
|
||||||
rc = -EINVAL;
|
/* lets check if we are allowed to replace the mm */
|
||||||
|
task_lock(tsk);
|
||||||
if (!tsk->mm || atomic_read(&tsk->mm->mm_users) > 1 ||
|
if (!tsk->mm || atomic_read(&tsk->mm->mm_users) > 1 ||
|
||||||
tsk->mm != tsk->active_mm || tsk->mm->ioctx_list)
|
tsk->mm != tsk->active_mm || tsk->mm->ioctx_list) {
|
||||||
goto unlock;
|
task_unlock(tsk);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
task_unlock(tsk);
|
||||||
|
|
||||||
tsk->mm->context.pgstes = 1; /* dirty little tricks .. */
|
/* we copy the mm with pgstes enabled */
|
||||||
|
tsk->mm->context.pgstes = 1;
|
||||||
mm = dup_mm(tsk);
|
mm = dup_mm(tsk);
|
||||||
tsk->mm->context.pgstes = 0;
|
tsk->mm->context.pgstes = 0;
|
||||||
|
|
||||||
rc = -ENOMEM;
|
|
||||||
if (!mm)
|
if (!mm)
|
||||||
goto unlock;
|
return -ENOMEM;
|
||||||
mmput(tsk->mm);
|
|
||||||
|
/* Now lets check again if somebody attached ptrace etc */
|
||||||
|
task_lock(tsk);
|
||||||
|
if (!tsk->mm || atomic_read(&tsk->mm->mm_users) > 1 ||
|
||||||
|
tsk->mm != tsk->active_mm || tsk->mm->ioctx_list) {
|
||||||
|
mmput(mm);
|
||||||
|
task_unlock(tsk);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ok, we are alone. No ptrace, no threads, etc. */
|
||||||
|
old_mm = tsk->mm;
|
||||||
tsk->mm = tsk->active_mm = mm;
|
tsk->mm = tsk->active_mm = mm;
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
update_mm(mm, tsk);
|
update_mm(mm, tsk);
|
||||||
cpu_set(smp_processor_id(), mm->cpu_vm_mask);
|
cpu_set(smp_processor_id(), mm->cpu_vm_mask);
|
||||||
preempt_enable();
|
preempt_enable();
|
||||||
rc = 0;
|
|
||||||
unlock:
|
|
||||||
task_unlock(tsk);
|
task_unlock(tsk);
|
||||||
return rc;
|
mmput(old_mm);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(s390_enable_sie);
|
EXPORT_SYMBOL_GPL(s390_enable_sie);
|
||||||
|
|
|
@ -236,7 +236,7 @@ static int insert_memory_segment(struct memory_segment *seg)
|
||||||
{
|
{
|
||||||
struct memory_segment *tmp;
|
struct memory_segment *tmp;
|
||||||
|
|
||||||
if (seg->start + seg->size >= VMEM_MAX_PHYS ||
|
if (seg->start + seg->size > VMEM_MAX_PHYS ||
|
||||||
seg->start + seg->size < seg->start)
|
seg->start + seg->size < seg->start)
|
||||||
return -ERANGE;
|
return -ERANGE;
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,8 @@ cflags-$(CONFIG_CPU_SH5) := $(call cc-option,-m5-32media-nofpu,)
|
||||||
cflags-$(CONFIG_CPU_BIG_ENDIAN) += -mb
|
cflags-$(CONFIG_CPU_BIG_ENDIAN) += -mb
|
||||||
cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -ml
|
cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -ml
|
||||||
|
|
||||||
|
cflags-y += $(call cc-option,-mno-fdpic)
|
||||||
|
|
||||||
#
|
#
|
||||||
# -Wa,-isa= tuning implies -Wa,-dsp for the versions of binutils that
|
# -Wa,-isa= tuning implies -Wa,-dsp for the versions of binutils that
|
||||||
# support it, while -Wa,-dsp by itself limits the range of usable opcodes
|
# support it, while -Wa,-dsp by itself limits the range of usable opcodes
|
||||||
|
|
|
@ -16,6 +16,21 @@
|
||||||
|
|
||||||
static struct plat_sci_port sci_platform_data[] = {
|
static struct plat_sci_port sci_platform_data[] = {
|
||||||
{
|
{
|
||||||
|
.mapbase = 0xffe00000,
|
||||||
|
.flags = UPF_BOOT_AUTOCONF,
|
||||||
|
.type = PORT_SCIF,
|
||||||
|
.irqs = { 80, 80, 80, 80 },
|
||||||
|
},{
|
||||||
|
.mapbase = 0xffe10000,
|
||||||
|
.flags = UPF_BOOT_AUTOCONF,
|
||||||
|
.type = PORT_SCIF,
|
||||||
|
.irqs = { 81, 81, 81, 81 },
|
||||||
|
},{
|
||||||
|
.mapbase = 0xffe20000,
|
||||||
|
.flags = UPF_BOOT_AUTOCONF,
|
||||||
|
.type = PORT_SCIF,
|
||||||
|
.irqs = { 82, 82, 82, 82 },
|
||||||
|
},{
|
||||||
.mapbase = 0xa4e30000,
|
.mapbase = 0xa4e30000,
|
||||||
.flags = UPF_BOOT_AUTOCONF,
|
.flags = UPF_BOOT_AUTOCONF,
|
||||||
.type = PORT_SCI,
|
.type = PORT_SCI,
|
||||||
|
@ -73,9 +88,35 @@ static struct platform_device rtc_device = {
|
||||||
.resource = rtc_resources,
|
.resource = rtc_resources,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct resource sh7723_usb_host_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.name = "r8a66597_hcd",
|
||||||
|
.start = 0xa4d80000,
|
||||||
|
.end = 0xa4d800ff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = 65,
|
||||||
|
.end = 65,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device sh7723_usb_host_device = {
|
||||||
|
.name = "r8a66597_hcd",
|
||||||
|
.id = 0,
|
||||||
|
.dev = {
|
||||||
|
.dma_mask = NULL, /* not use dma */
|
||||||
|
.coherent_dma_mask = 0xffffffff,
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(sh7723_usb_host_resources),
|
||||||
|
.resource = sh7723_usb_host_resources,
|
||||||
|
};
|
||||||
|
|
||||||
static struct platform_device *sh7723_devices[] __initdata = {
|
static struct platform_device *sh7723_devices[] __initdata = {
|
||||||
&sci_device,
|
&sci_device,
|
||||||
&rtc_device,
|
&rtc_device,
|
||||||
|
&sh7723_usb_host_device,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init sh7723_devices_setup(void)
|
static int __init sh7723_devices_setup(void)
|
||||||
|
|
|
@ -291,8 +291,9 @@ static struct intc_sense_reg irq_sense_registers[] __initdata = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static DECLARE_INTC_DESC(intc_irq_desc, "sh7763-irq", irq_vectors,
|
static DECLARE_INTC_DESC(intc_irq_desc, "sh7763-irq", irq_vectors,
|
||||||
NULL, NULL, irq_mask_registers, irq_prio_registers,
|
NULL, irq_mask_registers, irq_prio_registers,
|
||||||
irq_sense_registers);
|
irq_sense_registers);
|
||||||
|
|
||||||
|
|
||||||
/* External interrupt pins in IRL mode */
|
/* External interrupt pins in IRL mode */
|
||||||
static struct intc_vect irl_vectors[] __initdata = {
|
static struct intc_vect irl_vectors[] __initdata = {
|
||||||
|
@ -324,10 +325,10 @@ static struct intc_mask_reg irl7654_mask_registers[] __initdata = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static DECLARE_INTC_DESC(intc_irl7654_desc, "sh7763-irl7654", irl_vectors,
|
static DECLARE_INTC_DESC(intc_irl7654_desc, "sh7763-irl7654", irl_vectors,
|
||||||
NULL, NULL, irl7654_mask_registers, NULL, NULL);
|
NULL, irl7654_mask_registers, NULL, NULL);
|
||||||
|
|
||||||
static DECLARE_INTC_DESC(intc_irl3210_desc, "sh7763-irl3210", irl_vectors,
|
static DECLARE_INTC_DESC(intc_irl3210_desc, "sh7763-irl3210", irl_vectors,
|
||||||
NULL, NULL, irl3210_mask_registers, NULL, NULL);
|
NULL, irl3210_mask_registers, NULL, NULL);
|
||||||
|
|
||||||
#define INTC_ICR0 0xffd00000
|
#define INTC_ICR0 0xffd00000
|
||||||
#define INTC_INTMSK0 0xffd00044
|
#define INTC_INTMSK0 0xffd00044
|
||||||
|
|
|
@ -49,7 +49,6 @@
|
||||||
#include "irq_user.h"
|
#include "irq_user.h"
|
||||||
#include "irq_kern.h"
|
#include "irq_kern.h"
|
||||||
#include "ubd_user.h"
|
#include "ubd_user.h"
|
||||||
#include "kern_util.h"
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "mem.h"
|
#include "mem.h"
|
||||||
#include "mem_kern.h"
|
#include "mem_kern.h"
|
||||||
|
|
|
@ -299,6 +299,6 @@ extern int os_arch_prctl(int pid, int code, unsigned long *addr);
|
||||||
extern int get_pty(void);
|
extern int get_pty(void);
|
||||||
|
|
||||||
/* sys-$ARCH/task_size.c */
|
/* sys-$ARCH/task_size.c */
|
||||||
extern unsigned long os_get_task_size(void);
|
extern unsigned long os_get_top_address(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -274,7 +274,7 @@ int __init linux_main(int argc, char **argv)
|
||||||
if (have_root == 0)
|
if (have_root == 0)
|
||||||
add_arg(DEFAULT_COMMAND_LINE);
|
add_arg(DEFAULT_COMMAND_LINE);
|
||||||
|
|
||||||
host_task_size = os_get_task_size();
|
host_task_size = os_get_top_address();
|
||||||
/*
|
/*
|
||||||
* TASK_SIZE needs to be PGDIR_SIZE aligned or else exit_mmap craps
|
* TASK_SIZE needs to be PGDIR_SIZE aligned or else exit_mmap craps
|
||||||
* out
|
* out
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <sched.h>
|
#include <sched.h>
|
||||||
|
#include <linux/limits.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include "kern_constants.h"
|
#include "kern_constants.h"
|
||||||
|
|
|
@ -55,7 +55,7 @@ static int ptrace_dump_regs(int pid)
|
||||||
* Signals that are OK to receive in the stub - we'll just continue it.
|
* Signals that are OK to receive in the stub - we'll just continue it.
|
||||||
* SIGWINCH will happen when UML is inside a detached screen.
|
* SIGWINCH will happen when UML is inside a detached screen.
|
||||||
*/
|
*/
|
||||||
#define STUB_SIG_MASK (1 << SIGVTALRM)
|
#define STUB_SIG_MASK ((1 << SIGVTALRM) | (1 << SIGWINCH))
|
||||||
|
|
||||||
/* Signals that the stub will finish with - anything else is an error */
|
/* Signals that the stub will finish with - anything else is an error */
|
||||||
#define STUB_DONE_MASK (1 << SIGTRAP)
|
#define STUB_DONE_MASK (1 << SIGTRAP)
|
||||||
|
|
|
@ -121,8 +121,10 @@ static int stop_ptraced_child(int pid, int exitcode, int mustexit)
|
||||||
{
|
{
|
||||||
int status, n, ret = 0;
|
int status, n, ret = 0;
|
||||||
|
|
||||||
if (ptrace(PTRACE_CONT, pid, 0, 0) < 0)
|
if (ptrace(PTRACE_CONT, pid, 0, 0) < 0) {
|
||||||
fatal_perror("stop_ptraced_child : ptrace failed");
|
perror("stop_ptraced_child : ptrace failed");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
CATCH_EINTR(n = waitpid(pid, &status, 0));
|
CATCH_EINTR(n = waitpid(pid, &status, 0));
|
||||||
if (!WIFEXITED(status) || (WEXITSTATUS(status) != exitcode)) {
|
if (!WIFEXITED(status) || (WEXITSTATUS(status) != exitcode)) {
|
||||||
int exit_with = WEXITSTATUS(status);
|
int exit_with = WEXITSTATUS(status);
|
||||||
|
@ -212,7 +214,7 @@ static void __init check_sysemu(void)
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
fatal_perror("check_sysemu : wait failed");
|
fatal_perror("check_sysemu : wait failed");
|
||||||
if (!WIFSTOPPED(status) || (WSTOPSIG(status) != SIGTRAP))
|
if (!WIFSTOPPED(status) || (WSTOPSIG(status) != SIGTRAP))
|
||||||
fatal("check_sysemu : expected SIGTRAP, got status = %d",
|
fatal("check_sysemu : expected SIGTRAP, got status = %d\n",
|
||||||
status);
|
status);
|
||||||
|
|
||||||
if (ptrace(PTRACE_GETREGS, pid, 0, regs) < 0)
|
if (ptrace(PTRACE_GETREGS, pid, 0, regs) < 0)
|
||||||
|
@ -254,9 +256,11 @@ static void __init check_sysemu(void)
|
||||||
|
|
||||||
if (WIFSTOPPED(status) &&
|
if (WIFSTOPPED(status) &&
|
||||||
(WSTOPSIG(status) == (SIGTRAP|0x80))) {
|
(WSTOPSIG(status) == (SIGTRAP|0x80))) {
|
||||||
if (!count)
|
if (!count) {
|
||||||
fatal("check_ptrace : SYSEMU_SINGLESTEP "
|
non_fatal("check_ptrace : SYSEMU_SINGLESTEP "
|
||||||
"doesn't singlestep");
|
"doesn't singlestep");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
n = ptrace(PTRACE_POKEUSR, pid, PT_SYSCALL_RET_OFFSET,
|
n = ptrace(PTRACE_POKEUSR, pid, PT_SYSCALL_RET_OFFSET,
|
||||||
os_getpid());
|
os_getpid());
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
|
@ -266,9 +270,12 @@ static void __init check_sysemu(void)
|
||||||
}
|
}
|
||||||
else if (WIFSTOPPED(status) && (WSTOPSIG(status) == SIGTRAP))
|
else if (WIFSTOPPED(status) && (WSTOPSIG(status) == SIGTRAP))
|
||||||
count++;
|
count++;
|
||||||
else
|
else {
|
||||||
fatal("check_ptrace : expected SIGTRAP or "
|
non_fatal("check_ptrace : expected SIGTRAP or "
|
||||||
"(SIGTRAP | 0x80), got status = %d", status);
|
"(SIGTRAP | 0x80), got status = %d\n",
|
||||||
|
status);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (stop_ptraced_child(pid, 0, 0) < 0)
|
if (stop_ptraced_child(pid, 0, 0) < 0)
|
||||||
goto fail_stopped;
|
goto fail_stopped;
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <sys/ptrace.h>
|
#include <sys/ptrace.h>
|
||||||
#include <asm/user.h>
|
#include <sys/user.h>
|
||||||
#include "kern_constants.h"
|
#include "kern_constants.h"
|
||||||
#include "longjmp.h"
|
#include "longjmp.h"
|
||||||
#include "user.h"
|
#include "user.h"
|
||||||
|
@ -76,7 +76,7 @@ int put_fp_registers(int pid, unsigned long *regs)
|
||||||
|
|
||||||
void arch_init_registers(int pid)
|
void arch_init_registers(int pid)
|
||||||
{
|
{
|
||||||
struct user_fxsr_struct fpx_regs;
|
struct user_fpxregs_struct fpx_regs;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = ptrace(PTRACE_GETFPXREGS, pid, 0, &fpx_regs);
|
err = ptrace(PTRACE_GETFPXREGS, pid, 0, &fpx_regs);
|
||||||
|
|
|
@ -63,7 +63,7 @@ static int page_ok(unsigned long page)
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long os_get_task_size(void)
|
unsigned long os_get_top_address(void)
|
||||||
{
|
{
|
||||||
struct sigaction sa, old;
|
struct sigaction sa, old;
|
||||||
unsigned long bottom = 0;
|
unsigned long bottom = 0;
|
||||||
|
@ -76,9 +76,9 @@ unsigned long os_get_task_size(void)
|
||||||
* hosts, but shouldn't hurt otherwise.
|
* hosts, but shouldn't hurt otherwise.
|
||||||
*/
|
*/
|
||||||
unsigned long top = 0xffffd000 >> UM_KERN_PAGE_SHIFT;
|
unsigned long top = 0xffffd000 >> UM_KERN_PAGE_SHIFT;
|
||||||
unsigned long test;
|
unsigned long test, original;
|
||||||
|
|
||||||
printf("Locating the top of the address space ... ");
|
printf("Locating the bottom of the address space ... ");
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -89,16 +89,31 @@ unsigned long os_get_task_size(void)
|
||||||
sigemptyset(&sa.sa_mask);
|
sigemptyset(&sa.sa_mask);
|
||||||
sa.sa_flags = SA_NODEFER;
|
sa.sa_flags = SA_NODEFER;
|
||||||
if (sigaction(SIGSEGV, &sa, &old)) {
|
if (sigaction(SIGSEGV, &sa, &old)) {
|
||||||
perror("os_get_task_size");
|
perror("os_get_top_address");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!page_ok(bottom)) {
|
/* Manually scan the address space, bottom-up, until we find
|
||||||
fprintf(stderr, "Address 0x%x no good?\n",
|
* the first valid page (or run out of them).
|
||||||
bottom << UM_KERN_PAGE_SHIFT);
|
*/
|
||||||
|
for (bottom = 0; bottom < top; bottom++) {
|
||||||
|
if (page_ok(bottom))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we've got this far, we ran out of pages. */
|
||||||
|
if (bottom == top) {
|
||||||
|
fprintf(stderr, "Unable to determine bottom of address "
|
||||||
|
"space.\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printf("0x%x\n", bottom << UM_KERN_PAGE_SHIFT);
|
||||||
|
printf("Locating the top of the address space ... ");
|
||||||
|
fflush(stdout);
|
||||||
|
|
||||||
|
original = bottom;
|
||||||
|
|
||||||
/* This could happen with a 4G/4G split */
|
/* This could happen with a 4G/4G split */
|
||||||
if (page_ok(top))
|
if (page_ok(top))
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -114,7 +129,7 @@ unsigned long os_get_task_size(void)
|
||||||
out:
|
out:
|
||||||
/* Restore the old SIGSEGV handling */
|
/* Restore the old SIGSEGV handling */
|
||||||
if (sigaction(SIGSEGV, &old, NULL)) {
|
if (sigaction(SIGSEGV, &old, NULL)) {
|
||||||
perror("os_get_task_size");
|
perror("os_get_top_address");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
top <<= UM_KERN_PAGE_SHIFT;
|
top <<= UM_KERN_PAGE_SHIFT;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
unsigned long os_get_task_size(unsigned long shift)
|
unsigned long os_get_top_address(unsigned long shift)
|
||||||
{
|
{
|
||||||
/* The old value of CONFIG_TOP_ADDR */
|
/* The old value of CONFIG_TOP_ADDR */
|
||||||
return 0x7fc0000000;
|
return 0x7fc0000000;
|
||||||
|
|
|
@ -106,6 +106,10 @@ static void deliver_alarm(void)
|
||||||
unsigned long long this_tick = os_nsecs();
|
unsigned long long this_tick = os_nsecs();
|
||||||
int one_tick = UM_NSEC_PER_SEC / UM_HZ;
|
int one_tick = UM_NSEC_PER_SEC / UM_HZ;
|
||||||
|
|
||||||
|
/* Protection against the host's time going backwards */
|
||||||
|
if ((last_tick != 0) && (this_tick < last_tick))
|
||||||
|
this_tick = last_tick;
|
||||||
|
|
||||||
if (last_tick == 0)
|
if (last_tick == 0)
|
||||||
last_tick = this_tick - one_tick;
|
last_tick = this_tick - one_tick;
|
||||||
|
|
||||||
|
@ -148,6 +152,9 @@ static int after_sleep_interval(struct timespec *ts)
|
||||||
start_usecs = usec;
|
start_usecs = usec;
|
||||||
|
|
||||||
start_usecs -= skew / UM_NSEC_PER_USEC;
|
start_usecs -= skew / UM_NSEC_PER_USEC;
|
||||||
|
if (start_usecs < 0)
|
||||||
|
start_usecs = 0;
|
||||||
|
|
||||||
tv = ((struct timeval) { .tv_sec = start_usecs / UM_USEC_PER_SEC,
|
tv = ((struct timeval) { .tv_sec = start_usecs / UM_USEC_PER_SEC,
|
||||||
.tv_usec = start_usecs % UM_USEC_PER_SEC });
|
.tv_usec = start_usecs % UM_USEC_PER_SEC });
|
||||||
interval = ((struct itimerval) { { 0, usec }, tv });
|
interval = ((struct itimerval) { { 0, usec }, tv });
|
||||||
|
|
|
@ -3,5 +3,9 @@
|
||||||
#include <asm/checksum.h>
|
#include <asm/checksum.h>
|
||||||
|
|
||||||
/*XXX: we need them because they would be exported by x86_64 */
|
/*XXX: we need them because they would be exported by x86_64 */
|
||||||
|
#if (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || __GNUC__ > 4
|
||||||
|
EXPORT_SYMBOL(memcpy);
|
||||||
|
#else
|
||||||
EXPORT_SYMBOL(__memcpy);
|
EXPORT_SYMBOL(__memcpy);
|
||||||
|
#endif
|
||||||
EXPORT_SYMBOL(csum_partial);
|
EXPORT_SYMBOL(csum_partial);
|
||||||
|
|
|
@ -1508,13 +1508,13 @@ config PCI_GOMMCONFIG
|
||||||
config PCI_GODIRECT
|
config PCI_GODIRECT
|
||||||
bool "Direct"
|
bool "Direct"
|
||||||
|
|
||||||
config PCI_GOANY
|
|
||||||
bool "Any"
|
|
||||||
|
|
||||||
config PCI_GOOLPC
|
config PCI_GOOLPC
|
||||||
bool "OLPC"
|
bool "OLPC"
|
||||||
depends on OLPC
|
depends on OLPC
|
||||||
|
|
||||||
|
config PCI_GOANY
|
||||||
|
bool "Any"
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
config PCI_BIOS
|
config PCI_BIOS
|
||||||
|
@ -1531,9 +1531,8 @@ config PCI_MMCONFIG
|
||||||
depends on X86_32 && PCI && ACPI && (PCI_GOMMCONFIG || PCI_GOANY)
|
depends on X86_32 && PCI && ACPI && (PCI_GOMMCONFIG || PCI_GOANY)
|
||||||
|
|
||||||
config PCI_OLPC
|
config PCI_OLPC
|
||||||
bool
|
def_bool y
|
||||||
depends on PCI && PCI_GOOLPC
|
depends on PCI && OLPC && (PCI_GOOLPC || PCI_GOANY)
|
||||||
default y
|
|
||||||
|
|
||||||
config PCI_DOMAINS
|
config PCI_DOMAINS
|
||||||
def_bool y
|
def_bool y
|
||||||
|
|
|
@ -115,8 +115,6 @@ static void enable_a20_fast(void)
|
||||||
|
|
||||||
int enable_a20(void)
|
int enable_a20(void)
|
||||||
{
|
{
|
||||||
int loops = A20_ENABLE_LOOPS;
|
|
||||||
|
|
||||||
#if defined(CONFIG_X86_ELAN)
|
#if defined(CONFIG_X86_ELAN)
|
||||||
/* Elan croaks if we try to touch the KBC */
|
/* Elan croaks if we try to touch the KBC */
|
||||||
enable_a20_fast();
|
enable_a20_fast();
|
||||||
|
@ -128,6 +126,7 @@ int enable_a20(void)
|
||||||
enable_a20_kbc();
|
enable_a20_kbc();
|
||||||
return 0;
|
return 0;
|
||||||
#else
|
#else
|
||||||
|
int loops = A20_ENABLE_LOOPS;
|
||||||
while (loops--) {
|
while (loops--) {
|
||||||
/* First, check to see if A20 is already enabled
|
/* First, check to see if A20 is already enabled
|
||||||
(legacy free, etc.) */
|
(legacy free, etc.) */
|
||||||
|
|
|
@ -248,6 +248,7 @@ ENTRY(resume_userspace)
|
||||||
DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt
|
DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt
|
||||||
# setting need_resched or sigpending
|
# setting need_resched or sigpending
|
||||||
# between sampling and the iret
|
# between sampling and the iret
|
||||||
|
TRACE_IRQS_OFF
|
||||||
movl TI_flags(%ebp), %ecx
|
movl TI_flags(%ebp), %ecx
|
||||||
andl $_TIF_WORK_MASK, %ecx # is there any work to be done on
|
andl $_TIF_WORK_MASK, %ecx # is there any work to be done on
|
||||||
# int/exception return?
|
# int/exception return?
|
||||||
|
|
|
@ -189,7 +189,7 @@ default_entry:
|
||||||
* this stage.
|
* this stage.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define KPMDS ((0x100000000-__PAGE_OFFSET) >> 30) /* Number of kernel PMDs */
|
#define KPMDS (((-__PAGE_OFFSET) >> 30) & 3) /* Number of kernel PMDs */
|
||||||
|
|
||||||
xorl %ebx,%ebx /* %ebx is kept at zero */
|
xorl %ebx,%ebx /* %ebx is kept at zero */
|
||||||
|
|
||||||
|
|
|
@ -2130,14 +2130,10 @@ static inline void __init check_timer(void)
|
||||||
{
|
{
|
||||||
int apic1, pin1, apic2, pin2;
|
int apic1, pin1, apic2, pin2;
|
||||||
int vector;
|
int vector;
|
||||||
unsigned int ver;
|
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
|
|
||||||
ver = apic_read(APIC_LVR);
|
|
||||||
ver = GET_APIC_VERSION(ver);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* get/set the timer IRQ vector:
|
* get/set the timer IRQ vector:
|
||||||
*/
|
*/
|
||||||
|
@ -2150,15 +2146,11 @@ static inline void __init check_timer(void)
|
||||||
* mode for the 8259A whenever interrupts are routed
|
* mode for the 8259A whenever interrupts are routed
|
||||||
* through I/O APICs. Also IRQ0 has to be enabled in
|
* through I/O APICs. Also IRQ0 has to be enabled in
|
||||||
* the 8259A which implies the virtual wire has to be
|
* the 8259A which implies the virtual wire has to be
|
||||||
* disabled in the local APIC. Finally timer interrupts
|
* disabled in the local APIC.
|
||||||
* need to be acknowledged manually in the 8259A for
|
|
||||||
* timer_interrupt() and for the i82489DX when using
|
|
||||||
* the NMI watchdog.
|
|
||||||
*/
|
*/
|
||||||
apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
|
apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
|
||||||
init_8259A(1);
|
init_8259A(1);
|
||||||
timer_ack = !cpu_has_tsc;
|
timer_ack = 1;
|
||||||
timer_ack |= (nmi_watchdog == NMI_IO_APIC && !APIC_INTEGRATED(ver));
|
|
||||||
if (timer_over_8254 > 0)
|
if (timer_over_8254 > 0)
|
||||||
enable_8259A_irq(0);
|
enable_8259A_irq(0);
|
||||||
|
|
||||||
|
|
|
@ -155,6 +155,7 @@ int geode_mfgpt_toggle_event(int timer, int cmp, int event, int enable)
|
||||||
wrmsr(msr, value, dummy);
|
wrmsr(msr, value, dummy);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(geode_mfgpt_toggle_event);
|
||||||
|
|
||||||
int geode_mfgpt_set_irq(int timer, int cmp, int irq, int enable)
|
int geode_mfgpt_set_irq(int timer, int cmp, int irq, int enable)
|
||||||
{
|
{
|
||||||
|
@ -222,6 +223,7 @@ int geode_mfgpt_alloc_timer(int timer, int domain)
|
||||||
/* No timers available - too bad */
|
/* No timers available - too bad */
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(geode_mfgpt_alloc_timer);
|
||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_GEODE_MFGPT_TIMER
|
#ifdef CONFIG_GEODE_MFGPT_TIMER
|
||||||
|
|
|
@ -26,7 +26,6 @@
|
||||||
|
|
||||||
#include <asm/smp.h>
|
#include <asm/smp.h>
|
||||||
#include <asm/nmi.h>
|
#include <asm/nmi.h>
|
||||||
#include <asm/timer.h>
|
|
||||||
|
|
||||||
#include "mach_traps.h"
|
#include "mach_traps.h"
|
||||||
|
|
||||||
|
@ -82,7 +81,7 @@ int __init check_nmi_watchdog(void)
|
||||||
|
|
||||||
prev_nmi_count = kmalloc(NR_CPUS * sizeof(int), GFP_KERNEL);
|
prev_nmi_count = kmalloc(NR_CPUS * sizeof(int), GFP_KERNEL);
|
||||||
if (!prev_nmi_count)
|
if (!prev_nmi_count)
|
||||||
goto error;
|
return -1;
|
||||||
|
|
||||||
printk(KERN_INFO "Testing NMI watchdog ... ");
|
printk(KERN_INFO "Testing NMI watchdog ... ");
|
||||||
|
|
||||||
|
@ -119,7 +118,7 @@ int __init check_nmi_watchdog(void)
|
||||||
if (!atomic_read(&nmi_active)) {
|
if (!atomic_read(&nmi_active)) {
|
||||||
kfree(prev_nmi_count);
|
kfree(prev_nmi_count);
|
||||||
atomic_set(&nmi_active, -1);
|
atomic_set(&nmi_active, -1);
|
||||||
goto error;
|
return -1;
|
||||||
}
|
}
|
||||||
printk("OK.\n");
|
printk("OK.\n");
|
||||||
|
|
||||||
|
@ -130,10 +129,6 @@ int __init check_nmi_watchdog(void)
|
||||||
|
|
||||||
kfree(prev_nmi_count);
|
kfree(prev_nmi_count);
|
||||||
return 0;
|
return 0;
|
||||||
error:
|
|
||||||
timer_ack = !cpu_has_tsc;
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init setup_nmi_watchdog(char *str)
|
static int __init setup_nmi_watchdog(char *str)
|
||||||
|
|
|
@ -378,6 +378,7 @@ dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle,
|
||||||
struct page *page;
|
struct page *page;
|
||||||
unsigned long dma_mask = 0;
|
unsigned long dma_mask = 0;
|
||||||
dma_addr_t bus;
|
dma_addr_t bus;
|
||||||
|
int noretry = 0;
|
||||||
|
|
||||||
/* ignore region specifiers */
|
/* ignore region specifiers */
|
||||||
gfp &= ~(__GFP_DMA | __GFP_HIGHMEM | __GFP_DMA32);
|
gfp &= ~(__GFP_DMA | __GFP_HIGHMEM | __GFP_DMA32);
|
||||||
|
@ -397,20 +398,25 @@ dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle,
|
||||||
if (dev->dma_mask == NULL)
|
if (dev->dma_mask == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* Don't invoke OOM killer */
|
/* Don't invoke OOM killer or retry in lower 16MB DMA zone */
|
||||||
gfp |= __GFP_NORETRY;
|
if (gfp & __GFP_DMA)
|
||||||
|
noretry = 1;
|
||||||
|
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
/* Why <=? Even when the mask is smaller than 4GB it is often
|
/* Why <=? Even when the mask is smaller than 4GB it is often
|
||||||
larger than 16MB and in this case we have a chance of
|
larger than 16MB and in this case we have a chance of
|
||||||
finding fitting memory in the next higher zone first. If
|
finding fitting memory in the next higher zone first. If
|
||||||
not retry with true GFP_DMA. -AK */
|
not retry with true GFP_DMA. -AK */
|
||||||
if (dma_mask <= DMA_32BIT_MASK && !(gfp & GFP_DMA))
|
if (dma_mask <= DMA_32BIT_MASK && !(gfp & GFP_DMA)) {
|
||||||
gfp |= GFP_DMA32;
|
gfp |= GFP_DMA32;
|
||||||
|
if (dma_mask < DMA_32BIT_MASK)
|
||||||
|
noretry = 1;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
again:
|
again:
|
||||||
page = dma_alloc_pages(dev, gfp, get_order(size));
|
page = dma_alloc_pages(dev,
|
||||||
|
noretry ? gfp | __GFP_NORETRY : gfp, get_order(size));
|
||||||
if (page == NULL)
|
if (page == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
#include <linux/acpi.h>
|
#include <linux/acpi.h>
|
||||||
#include <linux/bcd.h>
|
#include <linux/bcd.h>
|
||||||
#include <linux/mc146818rtc.h>
|
#include <linux/mc146818rtc.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/pnp.h>
|
||||||
|
|
||||||
#include <asm/time.h>
|
#include <asm/time.h>
|
||||||
#include <asm/vsyscall.h>
|
#include <asm/vsyscall.h>
|
||||||
|
@ -197,3 +199,35 @@ unsigned long long native_read_tsc(void)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(native_read_tsc);
|
EXPORT_SYMBOL(native_read_tsc);
|
||||||
|
|
||||||
|
|
||||||
|
static struct resource rtc_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = RTC_PORT(0),
|
||||||
|
.end = RTC_PORT(1),
|
||||||
|
.flags = IORESOURCE_IO,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = RTC_IRQ,
|
||||||
|
.end = RTC_IRQ,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device rtc_device = {
|
||||||
|
.name = "rtc_cmos",
|
||||||
|
.id = -1,
|
||||||
|
.resource = rtc_resources,
|
||||||
|
.num_resources = ARRAY_SIZE(rtc_resources),
|
||||||
|
};
|
||||||
|
|
||||||
|
static __init int add_rtc_cmos(void)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_PNP
|
||||||
|
if (!pnp_platform_devices)
|
||||||
|
platform_device_register(&rtc_device);
|
||||||
|
#else
|
||||||
|
platform_device_register(&rtc_device);
|
||||||
|
#endif /* CONFIG_PNP */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
device_initcall(add_rtc_cmos);
|
||||||
|
|
|
@ -544,6 +544,7 @@ vm86_trap:
|
||||||
#define DO_ERROR(trapnr, signr, str, name) \
|
#define DO_ERROR(trapnr, signr, str, name) \
|
||||||
void do_##name(struct pt_regs *regs, long error_code) \
|
void do_##name(struct pt_regs *regs, long error_code) \
|
||||||
{ \
|
{ \
|
||||||
|
trace_hardirqs_fixup(); \
|
||||||
if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
|
if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
|
||||||
== NOTIFY_STOP) \
|
== NOTIFY_STOP) \
|
||||||
return; \
|
return; \
|
||||||
|
|
|
@ -200,7 +200,6 @@ int __pit_timer_fn(struct kvm_kpit_state *ps)
|
||||||
|
|
||||||
atomic_inc(&pt->pending);
|
atomic_inc(&pt->pending);
|
||||||
smp_mb__after_atomic_inc();
|
smp_mb__after_atomic_inc();
|
||||||
/* FIXME: handle case where the guest is in guest mode */
|
|
||||||
if (vcpu0 && waitqueue_active(&vcpu0->wq)) {
|
if (vcpu0 && waitqueue_active(&vcpu0->wq)) {
|
||||||
vcpu0->arch.mp_state = KVM_MP_STATE_RUNNABLE;
|
vcpu0->arch.mp_state = KVM_MP_STATE_RUNNABLE;
|
||||||
wake_up_interruptible(&vcpu0->wq);
|
wake_up_interruptible(&vcpu0->wq);
|
||||||
|
@ -237,6 +236,19 @@ static enum hrtimer_restart pit_timer_fn(struct hrtimer *data)
|
||||||
return HRTIMER_NORESTART;
|
return HRTIMER_NORESTART;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __kvm_migrate_pit_timer(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
struct kvm_pit *pit = vcpu->kvm->arch.vpit;
|
||||||
|
struct hrtimer *timer;
|
||||||
|
|
||||||
|
if (vcpu->vcpu_id != 0 || !pit)
|
||||||
|
return;
|
||||||
|
|
||||||
|
timer = &pit->pit_state.pit_timer.timer;
|
||||||
|
if (hrtimer_cancel(timer))
|
||||||
|
hrtimer_start(timer, timer->expires, HRTIMER_MODE_ABS);
|
||||||
|
}
|
||||||
|
|
||||||
static void destroy_pit_timer(struct kvm_kpit_timer *pt)
|
static void destroy_pit_timer(struct kvm_kpit_timer *pt)
|
||||||
{
|
{
|
||||||
pr_debug("pit: execute del timer!\n");
|
pr_debug("pit: execute del timer!\n");
|
||||||
|
|
|
@ -94,3 +94,9 @@ void kvm_timer_intr_post(struct kvm_vcpu *vcpu, int vec)
|
||||||
/* TODO: PIT, RTC etc. */
|
/* TODO: PIT, RTC etc. */
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(kvm_timer_intr_post);
|
EXPORT_SYMBOL_GPL(kvm_timer_intr_post);
|
||||||
|
|
||||||
|
void __kvm_migrate_timers(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
__kvm_migrate_apic_timer(vcpu);
|
||||||
|
__kvm_migrate_pit_timer(vcpu);
|
||||||
|
}
|
||||||
|
|
|
@ -84,6 +84,8 @@ void kvm_timer_intr_post(struct kvm_vcpu *vcpu, int vec);
|
||||||
void kvm_inject_pending_timer_irqs(struct kvm_vcpu *vcpu);
|
void kvm_inject_pending_timer_irqs(struct kvm_vcpu *vcpu);
|
||||||
void kvm_inject_apic_timer_irqs(struct kvm_vcpu *vcpu);
|
void kvm_inject_apic_timer_irqs(struct kvm_vcpu *vcpu);
|
||||||
void __kvm_migrate_apic_timer(struct kvm_vcpu *vcpu);
|
void __kvm_migrate_apic_timer(struct kvm_vcpu *vcpu);
|
||||||
|
void __kvm_migrate_pit_timer(struct kvm_vcpu *vcpu);
|
||||||
|
void __kvm_migrate_timers(struct kvm_vcpu *vcpu);
|
||||||
|
|
||||||
int pit_has_pending_timer(struct kvm_vcpu *vcpu);
|
int pit_has_pending_timer(struct kvm_vcpu *vcpu);
|
||||||
int apic_has_pending_timer(struct kvm_vcpu *vcpu);
|
int apic_has_pending_timer(struct kvm_vcpu *vcpu);
|
||||||
|
|
|
@ -658,7 +658,7 @@ static int is_empty_shadow_page(u64 *spt)
|
||||||
u64 *end;
|
u64 *end;
|
||||||
|
|
||||||
for (pos = spt, end = pos + PAGE_SIZE / sizeof(u64); pos != end; pos++)
|
for (pos = spt, end = pos + PAGE_SIZE / sizeof(u64); pos != end; pos++)
|
||||||
if (*pos != shadow_trap_nonpresent_pte) {
|
if (is_shadow_present_pte(*pos)) {
|
||||||
printk(KERN_ERR "%s: %p %llx\n", __func__,
|
printk(KERN_ERR "%s: %p %llx\n", __func__,
|
||||||
pos, *pos);
|
pos, *pos);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1858,6 +1858,7 @@ static void free_mmu_pages(struct kvm_vcpu *vcpu)
|
||||||
sp = container_of(vcpu->kvm->arch.active_mmu_pages.next,
|
sp = container_of(vcpu->kvm->arch.active_mmu_pages.next,
|
||||||
struct kvm_mmu_page, link);
|
struct kvm_mmu_page, link);
|
||||||
kvm_mmu_zap_page(vcpu->kvm, sp);
|
kvm_mmu_zap_page(vcpu->kvm, sp);
|
||||||
|
cond_resched();
|
||||||
}
|
}
|
||||||
free_page((unsigned long)vcpu->arch.mmu.pae_root);
|
free_page((unsigned long)vcpu->arch.mmu.pae_root);
|
||||||
}
|
}
|
||||||
|
|
|
@ -418,7 +418,7 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr,
|
||||||
|
|
||||||
/* mmio */
|
/* mmio */
|
||||||
if (is_error_pfn(pfn)) {
|
if (is_error_pfn(pfn)) {
|
||||||
pgprintk("gfn %x is mmio\n", walker.gfn);
|
pgprintk("gfn %lx is mmio\n", walker.gfn);
|
||||||
kvm_release_pfn_clean(pfn);
|
kvm_release_pfn_clean(pfn);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -688,7 +688,7 @@ static void svm_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
|
||||||
delta = vcpu->arch.host_tsc - tsc_this;
|
delta = vcpu->arch.host_tsc - tsc_this;
|
||||||
svm->vmcb->control.tsc_offset += delta;
|
svm->vmcb->control.tsc_offset += delta;
|
||||||
vcpu->cpu = cpu;
|
vcpu->cpu = cpu;
|
||||||
kvm_migrate_apic_timer(vcpu);
|
kvm_migrate_timers(vcpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < NR_HOST_SAVE_USER_MSRS; i++)
|
for (i = 0; i < NR_HOST_SAVE_USER_MSRS; i++)
|
||||||
|
|
|
@ -608,7 +608,7 @@ static void vmx_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
|
||||||
|
|
||||||
if (vcpu->cpu != cpu) {
|
if (vcpu->cpu != cpu) {
|
||||||
vcpu_clear(vmx);
|
vcpu_clear(vmx);
|
||||||
kvm_migrate_apic_timer(vcpu);
|
kvm_migrate_timers(vcpu);
|
||||||
vpid_sync_vcpu_all(vmx);
|
vpid_sync_vcpu_all(vmx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1036,6 +1036,7 @@ static void hardware_enable(void *garbage)
|
||||||
static void hardware_disable(void *garbage)
|
static void hardware_disable(void *garbage)
|
||||||
{
|
{
|
||||||
asm volatile (ASM_VMX_VMXOFF : : : "cc");
|
asm volatile (ASM_VMX_VMXOFF : : : "cc");
|
||||||
|
write_cr4(read_cr4() & ~X86_CR4_VMXE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static __init int adjust_vmx_controls(u32 ctl_min, u32 ctl_opt,
|
static __init int adjust_vmx_controls(u32 ctl_min, u32 ctl_opt,
|
||||||
|
|
|
@ -2758,7 +2758,7 @@ again:
|
||||||
|
|
||||||
if (vcpu->requests) {
|
if (vcpu->requests) {
|
||||||
if (test_and_clear_bit(KVM_REQ_MIGRATE_TIMER, &vcpu->requests))
|
if (test_and_clear_bit(KVM_REQ_MIGRATE_TIMER, &vcpu->requests))
|
||||||
__kvm_migrate_apic_timer(vcpu);
|
__kvm_migrate_timers(vcpu);
|
||||||
if (test_and_clear_bit(KVM_REQ_REPORT_TPR_ACCESS,
|
if (test_and_clear_bit(KVM_REQ_REPORT_TPR_ACCESS,
|
||||||
&vcpu->requests)) {
|
&vcpu->requests)) {
|
||||||
kvm_run->exit_reason = KVM_EXIT_TPR_ACCESS;
|
kvm_run->exit_reason = KVM_EXIT_TPR_ACCESS;
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue