Merge branch 'linus' into x86/apic

Conflicts:
	arch/x86/mach-default/setup.c

Semantic conflict resolution:
	arch/x86/kernel/setup.c

Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Ingo Molnar 2009-02-22 20:05:19 +01:00
commit fc6fc7f1b1
330 changed files with 5039 additions and 1547 deletions

View File

@ -2166,7 +2166,6 @@ D: Initial implementation of VC's, pty's and select()
N: Pavel Machek N: Pavel Machek
E: pavel@ucw.cz E: pavel@ucw.cz
E: pavel@suse.cz
D: Softcursor for vga, hypertech cdrom support, vcsa bugfix, nbd D: Softcursor for vga, hypertech cdrom support, vcsa bugfix, nbd
D: sun4/330 port, capabilities for elf, speedup for rm on ext2, USB, D: sun4/330 port, capabilities for elf, speedup for rm on ext2, USB,
D: work on suspend-to-ram/disk, killing duplicates from ioctl32 D: work on suspend-to-ram/disk, killing duplicates from ioctl32

View File

@ -1,6 +1,6 @@
What: /sys/firmware/memmap/ What: /sys/firmware/memmap/
Date: June 2008 Date: June 2008
Contact: Bernhard Walle <bwalle@suse.de> Contact: Bernhard Walle <bernhard.walle@gmx.de>
Description: Description:
On all platforms, the firmware provides a memory map which the On all platforms, the firmware provides a memory map which the
kernel reads. The resources from that memory map are registered kernel reads. The resources from that memory map are registered

View File

@ -93,7 +93,7 @@ the PCI Express Port Bus driver from loading a service driver.
int pcie_port_service_register(struct pcie_port_service_driver *new) int pcie_port_service_register(struct pcie_port_service_driver *new)
This API replaces the Linux Driver Model's pci_module_init API. A This API replaces the Linux Driver Model's pci_register_driver API. A
service driver should always calls pcie_port_service_register at service driver should always calls pcie_port_service_register at
module init. Note that after service driver being loaded, calls module init. Note that after service driver being loaded, calls
such as pci_enable_device(dev) and pci_set_master(dev) are no longer such as pci_enable_device(dev) and pci_set_master(dev) are no longer

View File

@ -252,10 +252,8 @@ cgroup file system directories.
When a task is moved from one cgroup to another, it gets a new When a task is moved from one cgroup to another, it gets a new
css_set pointer - if there's an already existing css_set with the css_set pointer - if there's an already existing css_set with the
desired collection of cgroups then that group is reused, else a new desired collection of cgroups then that group is reused, else a new
css_set is allocated. Note that the current implementation uses a css_set is allocated. The appropriate existing css_set is located by
linear search to locate an appropriate existing css_set, so isn't looking into a hash table.
very efficient. A future version will use a hash table for better
performance.
To allow access from a cgroup to the css_sets (and hence tasks) To allow access from a cgroup to the css_sets (and hence tasks)
that comprise it, a set of cg_cgroup_link objects form a lattice; that comprise it, a set of cg_cgroup_link objects form a lattice;

View File

@ -142,7 +142,7 @@ into the rest of the kernel, none in performance critical paths:
- in fork and exit, to attach and detach a task from its cpuset. - in fork and exit, to attach and detach a task from its cpuset.
- in sched_setaffinity, to mask the requested CPUs by what's - in sched_setaffinity, to mask the requested CPUs by what's
allowed in that tasks cpuset. allowed in that tasks cpuset.
- in sched.c migrate_all_tasks(), to keep migrating tasks within - in sched.c migrate_live_tasks(), to keep migrating tasks within
the CPUs allowed by their cpuset, if possible. the CPUs allowed by their cpuset, if possible.
- in the mbind and set_mempolicy system calls, to mask the requested - in the mbind and set_mempolicy system calls, to mask the requested
Memory Nodes by what's allowed in that tasks cpuset. Memory Nodes by what's allowed in that tasks cpuset.
@ -175,6 +175,10 @@ files describing that cpuset:
- mem_exclusive flag: is memory placement exclusive? - mem_exclusive flag: is memory placement exclusive?
- mem_hardwall flag: is memory allocation hardwalled - mem_hardwall flag: is memory allocation hardwalled
- memory_pressure: measure of how much paging pressure in cpuset - memory_pressure: measure of how much paging pressure in cpuset
- memory_spread_page flag: if set, spread page cache evenly on allowed nodes
- memory_spread_slab flag: if set, spread slab cache evenly on allowed nodes
- sched_load_balance flag: if set, load balance within CPUs on that cpuset
- sched_relax_domain_level: the searching range when migrating tasks
In addition, the root cpuset only has the following file: In addition, the root cpuset only has the following file:
- memory_pressure_enabled flag: compute memory_pressure? - memory_pressure_enabled flag: compute memory_pressure?
@ -252,7 +256,7 @@ is causing.
This is useful both on tightly managed systems running a wide mix of This is useful both on tightly managed systems running a wide mix of
submitted jobs, which may choose to terminate or re-prioritize jobs that submitted jobs, which may choose to terminate or re-prioritize jobs that
are trying to use more memory than allowed on the nodes assigned them, are trying to use more memory than allowed on the nodes assigned to them,
and with tightly coupled, long running, massively parallel scientific and with tightly coupled, long running, massively parallel scientific
computing jobs that will dramatically fail to meet required performance computing jobs that will dramatically fail to meet required performance
goals if they start to use more memory than allowed to them. goals if they start to use more memory than allowed to them.
@ -378,7 +382,7 @@ as cpusets and sched_setaffinity.
The algorithmic cost of load balancing and its impact on key shared The algorithmic cost of load balancing and its impact on key shared
kernel data structures such as the task list increases more than kernel data structures such as the task list increases more than
linearly with the number of CPUs being balanced. So the scheduler linearly with the number of CPUs being balanced. So the scheduler
has support to partition the systems CPUs into a number of sched has support to partition the systems CPUs into a number of sched
domains such that it only load balances within each sched domain. domains such that it only load balances within each sched domain.
Each sched domain covers some subset of the CPUs in the system; Each sched domain covers some subset of the CPUs in the system;
no two sched domains overlap; some CPUs might not be in any sched no two sched domains overlap; some CPUs might not be in any sched
@ -485,17 +489,22 @@ of CPUs allowed to a cpuset having 'sched_load_balance' enabled.
The internal kernel cpuset to scheduler interface passes from the The internal kernel cpuset to scheduler interface passes from the
cpuset code to the scheduler code a partition of the load balanced cpuset code to the scheduler code a partition of the load balanced
CPUs in the system. This partition is a set of subsets (represented CPUs in the system. This partition is a set of subsets (represented
as an array of cpumask_t) of CPUs, pairwise disjoint, that cover all as an array of struct cpumask) of CPUs, pairwise disjoint, that cover
the CPUs that must be load balanced. all the CPUs that must be load balanced.
Whenever the 'sched_load_balance' flag changes, or CPUs come or go The cpuset code builds a new such partition and passes it to the
from a cpuset with this flag enabled, or a cpuset with this flag scheduler sched domain setup code, to have the sched domains rebuilt
enabled is removed, the cpuset code builds a new such partition and as necessary, whenever:
passes it to the scheduler sched domain setup code, to have the sched - the 'sched_load_balance' flag of a cpuset with non-empty CPUs changes,
domains rebuilt as necessary. - or CPUs come or go from a cpuset with this flag enabled,
- or 'sched_relax_domain_level' value of a cpuset with non-empty CPUs
and with this flag enabled changes,
- or a cpuset with non-empty CPUs and with this flag enabled is removed,
- or a cpu is offlined/onlined.
This partition exactly defines what sched domains the scheduler should This partition exactly defines what sched domains the scheduler should
setup - one sched domain for each element (cpumask_t) in the partition. setup - one sched domain for each element (struct cpumask) in the
partition.
The scheduler remembers the currently active sched domain partitions. The scheduler remembers the currently active sched domain partitions.
When the scheduler routine partition_sched_domains() is invoked from When the scheduler routine partition_sched_domains() is invoked from
@ -559,7 +568,7 @@ domain, the largest value among those is used. Be careful, if one
requests 0 and others are -1 then 0 is used. requests 0 and others are -1 then 0 is used.
Note that modifying this file will have both good and bad effects, Note that modifying this file will have both good and bad effects,
and whether it is acceptable or not will be depend on your situation. and whether it is acceptable or not depends on your situation.
Don't modify this file if you are not sure. Don't modify this file if you are not sure.
If your situation is: If your situation is:
@ -600,19 +609,15 @@ to allocate a page of memory for that task.
If a cpuset has its 'cpus' modified, then each task in that cpuset If a cpuset has its 'cpus' modified, then each task in that cpuset
will have its allowed CPU placement changed immediately. Similarly, will have its allowed CPU placement changed immediately. Similarly,
if a tasks pid is written to a cpusets 'tasks' file, in either its if a tasks pid is written to another cpusets 'tasks' file, then its
current cpuset or another cpuset, then its allowed CPU placement is allowed CPU placement is changed immediately. If such a task had been
changed immediately. If such a task had been bound to some subset bound to some subset of its cpuset using the sched_setaffinity() call,
of its cpuset using the sched_setaffinity() call, the task will be the task will be allowed to run on any CPU allowed in its new cpuset,
allowed to run on any CPU allowed in its new cpuset, negating the negating the effect of the prior sched_setaffinity() call.
affect of the prior sched_setaffinity() call.
In summary, the memory placement of a task whose cpuset is changed is In summary, the memory placement of a task whose cpuset is changed is
updated by the kernel, on the next allocation of a page for that task, updated by the kernel, on the next allocation of a page for that task,
but the processor placement is not updated, until that tasks pid is and the processor placement is updated immediately.
rewritten to the 'tasks' file of its cpuset. This is done to avoid
impacting the scheduler code in the kernel with a check for changes
in a tasks processor placement.
Normally, once a page is allocated (given a physical page Normally, once a page is allocated (given a physical page
of main memory) then that page stays on whatever node it of main memory) then that page stays on whatever node it
@ -681,10 +686,14 @@ and then start a subshell 'sh' in that cpuset:
# The next line should display '/Charlie' # The next line should display '/Charlie'
cat /proc/self/cpuset cat /proc/self/cpuset
In the future, a C library interface to cpusets will likely be There are ways to query or modify cpusets:
available. For now, the only way to query or modify cpusets is - via the cpuset file system directly, using the various cd, mkdir, echo,
via the cpuset file system, using the various cd, mkdir, echo, cat, cat, rmdir commands from the shell, or their equivalent from C.
rmdir commands from the shell, or their equivalent from C. - via the C library libcpuset.
- via the C library libcgroup.
(http://sourceforge.net/proects/libcg/)
- via the python application cset.
(http://developer.novell.com/wiki/index.php/Cpuset)
The sched_setaffinity calls can also be done at the shell prompt using The sched_setaffinity calls can also be done at the shell prompt using
SGI's runon or Robert Love's taskset. The mbind and set_mempolicy SGI's runon or Robert Love's taskset. The mbind and set_mempolicy
@ -756,7 +765,7 @@ mount -t cpuset X /dev/cpuset
is equivalent to is equivalent to
mount -t cgroup -ocpuset X /dev/cpuset mount -t cgroup -ocpuset,noprefix X /dev/cpuset
echo "/sbin/cpuset_release_agent" > /dev/cpuset/release_agent echo "/sbin/cpuset_release_agent" > /dev/cpuset/release_agent
2.2 Adding/removing cpus 2.2 Adding/removing cpus

View File

@ -127,9 +127,11 @@ void unlock_device(struct device * dev);
Attributes Attributes
~~~~~~~~~~ ~~~~~~~~~~
struct device_attribute { struct device_attribute {
struct attribute attr; struct attribute attr;
ssize_t (*show)(struct device * dev, char * buf, size_t count, loff_t off); ssize_t (*show)(struct device *dev, struct device_attribute *attr,
ssize_t (*store)(struct device * dev, const char * buf, size_t count, loff_t off); char *buf);
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count);
}; };
Attributes of devices can be exported via drivers using a simple Attributes of devices can be exported via drivers using a simple

View File

@ -2,8 +2,10 @@
sysfs - _The_ filesystem for exporting kernel objects. sysfs - _The_ filesystem for exporting kernel objects.
Patrick Mochel <mochel@osdl.org> Patrick Mochel <mochel@osdl.org>
Mike Murphy <mamurph@cs.clemson.edu>
10 January 2003 Revised: 22 February 2009
Original: 10 January 2003
What it is: What it is:
@ -64,12 +66,13 @@ An attribute definition is simply:
struct attribute { struct attribute {
char * name; char * name;
struct module *owner;
mode_t mode; mode_t mode;
}; };
int sysfs_create_file(struct kobject * kobj, struct attribute * attr); int sysfs_create_file(struct kobject * kobj, const struct attribute * attr);
void sysfs_remove_file(struct kobject * kobj, struct attribute * attr); void sysfs_remove_file(struct kobject * kobj, const struct attribute * attr);
A bare attribute contains no means to read or write the value of the A bare attribute contains no means to read or write the value of the
@ -80,9 +83,11 @@ a specific object type.
For example, the driver model defines struct device_attribute like: For example, the driver model defines struct device_attribute like:
struct device_attribute { struct device_attribute {
struct attribute attr; struct attribute attr;
ssize_t (*show)(struct device * dev, char * buf); ssize_t (*show)(struct device *dev, struct device_attribute *attr,
ssize_t (*store)(struct device * dev, const char * buf); char *buf);
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count);
}; };
int device_create_file(struct device *, struct device_attribute *); int device_create_file(struct device *, struct device_attribute *);
@ -90,12 +95,8 @@ void device_remove_file(struct device *, struct device_attribute *);
It also defines this helper for defining device attributes: It also defines this helper for defining device attributes:
#define DEVICE_ATTR(_name, _mode, _show, _store) \ #define DEVICE_ATTR(_name, _mode, _show, _store) \
struct device_attribute dev_attr_##_name = { \ struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)
.attr = {.name = __stringify(_name) , .mode = _mode }, \
.show = _show, \
.store = _store, \
};
For example, declaring For example, declaring
@ -107,9 +108,9 @@ static struct device_attribute dev_attr_foo = {
.attr = { .attr = {
.name = "foo", .name = "foo",
.mode = S_IWUSR | S_IRUGO, .mode = S_IWUSR | S_IRUGO,
.show = show_foo,
.store = store_foo,
}, },
.show = show_foo,
.store = store_foo,
}; };
@ -161,10 +162,12 @@ To read or write attributes, show() or store() methods must be
specified when declaring the attribute. The method types should be as specified when declaring the attribute. The method types should be as
simple as those defined for device attributes: simple as those defined for device attributes:
ssize_t (*show)(struct device * dev, char * buf); ssize_t (*show)(struct device * dev, struct device_attribute * attr,
ssize_t (*store)(struct device * dev, const char * buf); char * buf);
ssize_t (*store)(struct device * dev, struct device_attribute * attr,
const char * buf);
IOW, they should take only an object and a buffer as parameters. IOW, they should take only an object, an attribute, and a buffer as parameters.
sysfs allocates a buffer of size (PAGE_SIZE) and passes it to the sysfs allocates a buffer of size (PAGE_SIZE) and passes it to the
@ -299,14 +302,16 @@ The following interface layers currently exist in sysfs:
Structure: Structure:
struct device_attribute { struct device_attribute {
struct attribute attr; struct attribute attr;
ssize_t (*show)(struct device * dev, char * buf); ssize_t (*show)(struct device *dev, struct device_attribute *attr,
ssize_t (*store)(struct device * dev, const char * buf); char *buf);
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count);
}; };
Declaring: Declaring:
DEVICE_ATTR(_name, _str, _mode, _show, _store); DEVICE_ATTR(_name, _mode, _show, _store);
Creation/Removal: Creation/Removal:
@ -342,7 +347,8 @@ Structure:
struct driver_attribute { struct driver_attribute {
struct attribute attr; struct attribute attr;
ssize_t (*show)(struct device_driver *, char * buf); ssize_t (*show)(struct device_driver *, char * buf);
ssize_t (*store)(struct device_driver *, const char * buf); ssize_t (*store)(struct device_driver *, const char * buf,
size_t count);
}; };
Declaring: Declaring:

View File

@ -0,0 +1,101 @@
/* Disk protection for HP machines.
*
* Copyright 2008 Eric Piel
* Copyright 2009 Pavel Machek <pavel@suse.cz>
*
* GPLv2.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
#include <stdint.h>
#include <errno.h>
#include <signal.h>
void write_int(char *path, int i)
{
char buf[1024];
int fd = open(path, O_RDWR);
if (fd < 0) {
perror("open");
exit(1);
}
sprintf(buf, "%d", i);
if (write(fd, buf, strlen(buf)) != strlen(buf)) {
perror("write");
exit(1);
}
close(fd);
}
void set_led(int on)
{
write_int("/sys/class/leds/hp::hddprotect/brightness", on);
}
void protect(int seconds)
{
write_int("/sys/block/sda/device/unload_heads", seconds*1000);
}
int on_ac(void)
{
// /sys/class/power_supply/AC0/online
}
int lid_open(void)
{
// /proc/acpi/button/lid/LID/state
}
void ignore_me(void)
{
protect(0);
set_led(0);
}
int main(int argc, char* argv[])
{
int fd, ret;
fd = open("/dev/freefall", O_RDONLY);
if (fd < 0) {
perror("open");
return EXIT_FAILURE;
}
signal(SIGALRM, ignore_me);
for (;;) {
unsigned char count;
ret = read(fd, &count, sizeof(count));
alarm(0);
if ((ret == -1) && (errno == EINTR)) {
/* Alarm expired, time to unpark the heads */
continue;
}
if (ret != sizeof(count)) {
perror("read");
break;
}
protect(21);
set_led(1);
if (1 || on_ac() || lid_open()) {
alarm(2);
} else {
alarm(20);
}
}
close(fd);
return EXIT_SUCCESS;
}

View File

@ -33,6 +33,14 @@ rate - reports the sampling rate of the accelerometer device in HZ
This driver also provides an absolute input class device, allowing This driver also provides an absolute input class device, allowing
the laptop to act as a pinball machine-esque joystick. the laptop to act as a pinball machine-esque joystick.
Another feature of the driver is misc device called "freefall" that
acts similar to /dev/rtc and reacts on free-fall interrupts received
from the device. It supports blocking operations, poll/select and
fasync operation modes. You must read 1 bytes from the device. The
result is number of free-fall interrupts since the last successful
read (or 255 if number of interrupts would not fit).
Axes orientation Axes orientation
---------------- ----------------

View File

@ -78,12 +78,10 @@ to view your kernel log and look for "mmiotrace has lost events" warning. If
events were lost, the trace is incomplete. You should enlarge the buffers and events were lost, the trace is incomplete. You should enlarge the buffers and
try again. Buffers are enlarged by first seeing how large the current buffers try again. Buffers are enlarged by first seeing how large the current buffers
are: are:
$ cat /debug/tracing/trace_entries $ cat /debug/tracing/buffer_size_kb
gives you a number. Approximately double this number and write it back, for gives you a number. Approximately double this number and write it back, for
instance: instance:
$ echo 0 > /debug/tracing/tracing_enabled $ echo 128000 > /debug/tracing/buffer_size_kb
$ echo 128000 > /debug/tracing/trace_entries
$ echo 1 > /debug/tracing/tracing_enabled
Then start again from the top. Then start again from the top.
If you are doing a trace for a driver project, e.g. Nouveau, you should also If you are doing a trace for a driver project, e.g. Nouveau, you should also

View File

@ -692,6 +692,13 @@ M: kernel@wantstofly.org
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
ARM/NUVOTON W90X900 ARM ARCHITECTURE
P: Wan ZongShun
M: mcuos.com@gmail.com
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
W: http://www.mcuos.com
S: Maintained
ARPD SUPPORT ARPD SUPPORT
P: Jonathan Layes P: Jonathan Layes
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
@ -1905,10 +1912,10 @@ W: http://gigaset307x.sourceforge.net/
S: Maintained S: Maintained
HARD DRIVE ACTIVE PROTECTION SYSTEM (HDAPS) DRIVER HARD DRIVE ACTIVE PROTECTION SYSTEM (HDAPS) DRIVER
P: Robert Love P: Frank Seidel
M: rlove@rlove.org M: frank@f-seidel.de
M: linux-kernel@vger.kernel.org L: lm-sensors@lm-sensors.org
W: http://www.kernel.org/pub/linux/kernel/people/rml/hdaps/ W: http://www.kernel.org/pub/linux/kernel/people/fseidel/hdaps/
S: Maintained S: Maintained
GSPCA FINEPIX SUBDRIVER GSPCA FINEPIX SUBDRIVER
@ -2001,7 +2008,7 @@ S: Maintained
HIBERNATION (aka Software Suspend, aka swsusp) HIBERNATION (aka Software Suspend, aka swsusp)
P: Pavel Machek P: Pavel Machek
M: pavel@suse.cz M: pavel@ucw.cz
P: Rafael J. Wysocki P: Rafael J. Wysocki
M: rjw@sisk.pl M: rjw@sisk.pl
L: linux-pm@lists.linux-foundation.org L: linux-pm@lists.linux-foundation.org
@ -3327,8 +3334,8 @@ P: Jeremy Fitzhardinge
M: jeremy@xensource.com M: jeremy@xensource.com
P: Chris Wright P: Chris Wright
M: chrisw@sous-sol.org M: chrisw@sous-sol.org
P: Zachary Amsden P: Alok Kataria
M: zach@vmware.com M: akataria@vmware.com
P: Rusty Russell P: Rusty Russell
M: rusty@rustcorp.com.au M: rusty@rustcorp.com.au
L: virtualization@lists.osdl.org L: virtualization@lists.osdl.org
@ -4172,7 +4179,7 @@ SUSPEND TO RAM
P: Len Brown P: Len Brown
M: len.brown@intel.com M: len.brown@intel.com
P: Pavel Machek P: Pavel Machek
M: pavel@suse.cz M: pavel@ucw.cz
P: Rafael J. Wysocki P: Rafael J. Wysocki
M: rjw@sisk.pl M: rjw@sisk.pl
L: linux-pm@lists.linux-foundation.org L: linux-pm@lists.linux-foundation.org
@ -4924,11 +4931,11 @@ L: zd1211-devs@lists.sourceforge.net (subscribers-only)
S: Maintained S: Maintained
ZR36067 VIDEO FOR LINUX DRIVER ZR36067 VIDEO FOR LINUX DRIVER
P: Ronald Bultje
M: rbultje@ronald.bitfreak.net
L: mjpeg-users@lists.sourceforge.net L: mjpeg-users@lists.sourceforge.net
L: linux-media@vger.kernel.org
W: http://mjpeg.sourceforge.net/driver-zoran/ W: http://mjpeg.sourceforge.net/driver-zoran/
S: Maintained T: Mercurial http://linuxtv.org/hg/v4l-dvb
S: Odd Fixes
ZS DECSTATION Z85C30 SERIAL DRIVER ZS DECSTATION Z85C30 SERIAL DRIVER
P: Maciej W. Rozycki P: Maciej W. Rozycki

View File

@ -389,6 +389,7 @@ PHONY += outputmakefile
# output directory. # output directory.
outputmakefile: outputmakefile:
ifneq ($(KBUILD_SRC),) ifneq ($(KBUILD_SRC),)
$(Q)ln -fsn $(srctree) source
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \ $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
$(srctree) $(objtree) $(VERSION) $(PATCHLEVEL) $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
endif endif
@ -947,7 +948,6 @@ ifneq ($(KBUILD_SRC),)
mkdir -p include2; \ mkdir -p include2; \
ln -fsn $(srctree)/include/asm-$(SRCARCH) include2/asm; \ ln -fsn $(srctree)/include/asm-$(SRCARCH) include2/asm; \
fi fi
ln -fsn $(srctree) source
endif endif
# prepare2 creates a makefile if using a separate output directory # prepare2 creates a makefile if using a separate output directory

2
README
View File

@ -188,7 +188,7 @@ CONFIGURING the kernel:
values to random values. values to random values.
You can find more information on using the Linux kernel config tools You can find more information on using the Linux kernel config tools
in Documentation/kbuild/make-configs.txt. in Documentation/kbuild/kconfig.txt.
NOTES on "make config": NOTES on "make config":
- having unnecessary drivers will make the kernel bigger, and can - having unnecessary drivers will make the kernel bigger, and can

View File

@ -93,8 +93,8 @@ common_shutdown_1(void *generic_ptr)
if (cpuid != boot_cpuid) { if (cpuid != boot_cpuid) {
flags |= 0x00040000UL; /* "remain halted" */ flags |= 0x00040000UL; /* "remain halted" */
*pflags = flags; *pflags = flags;
cpu_clear(cpuid, cpu_present_map); set_cpu_present(cpuid, false);
cpu_clear(cpuid, cpu_possible_map); set_cpu_possible(cpuid, false);
halt(); halt();
} }
#endif #endif
@ -120,8 +120,8 @@ common_shutdown_1(void *generic_ptr)
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
/* Wait for the secondaries to halt. */ /* Wait for the secondaries to halt. */
cpu_clear(boot_cpuid, cpu_present_map); set_cpu_present(boot_cpuid, false);
cpu_clear(boot_cpuid, cpu_possible_map); set_cpu_possible(boot_cpuid, false);
while (cpus_weight(cpu_present_map)) while (cpus_weight(cpu_present_map))
barrier(); barrier();
#endif #endif

View File

@ -120,12 +120,12 @@ void __cpuinit
smp_callin(void) smp_callin(void)
{ {
int cpuid = hard_smp_processor_id(); int cpuid = hard_smp_processor_id();
cpumask_t mask = cpu_online_map;
if (cpu_test_and_set(cpuid, mask)) { if (cpu_online(cpuid)) {
printk("??, cpu 0x%x already present??\n", cpuid); printk("??, cpu 0x%x already present??\n", cpuid);
BUG(); BUG();
} }
set_cpu_online(cpuid, true);
/* Turn on machine checks. */ /* Turn on machine checks. */
wrmces(7); wrmces(7);
@ -436,8 +436,8 @@ setup_smp(void)
((char *)cpubase + i*hwrpb->processor_size); ((char *)cpubase + i*hwrpb->processor_size);
if ((cpu->flags & 0x1cc) == 0x1cc) { if ((cpu->flags & 0x1cc) == 0x1cc) {
smp_num_probed++; smp_num_probed++;
cpu_set(i, cpu_possible_map); set_cpu_possible(i, true);
cpu_set(i, cpu_present_map); set_cpu_present(i, true);
cpu->pal_revision = boot_cpu_palrev; cpu->pal_revision = boot_cpu_palrev;
} }
@ -470,8 +470,8 @@ smp_prepare_cpus(unsigned int max_cpus)
/* Nothing to do on a UP box, or when told not to. */ /* Nothing to do on a UP box, or when told not to. */
if (smp_num_probed == 1 || max_cpus == 0) { if (smp_num_probed == 1 || max_cpus == 0) {
cpu_possible_map = cpumask_of_cpu(boot_cpuid); init_cpu_possible(cpumask_of(boot_cpuid));
cpu_present_map = cpumask_of_cpu(boot_cpuid); init_cpu_present(cpumask_of(boot_cpuid));
printk(KERN_INFO "SMP mode deactivated.\n"); printk(KERN_INFO "SMP mode deactivated.\n");
return; return;
} }

View File

@ -608,7 +608,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y
# Watchdog Device Drivers # Watchdog Device Drivers
# #
# CONFIG_SOFT_WATCHDOG is not set # CONFIG_SOFT_WATCHDOG is not set
CONFIG_AT91SAM9_WATCHDOG=y CONFIG_AT91SAM9X_WATCHDOG=y
# #
# USB-based Watchdog Cards # USB-based Watchdog Cards

View File

@ -700,7 +700,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y
# Watchdog Device Drivers # Watchdog Device Drivers
# #
# CONFIG_SOFT_WATCHDOG is not set # CONFIG_SOFT_WATCHDOG is not set
CONFIG_AT91SAM9_WATCHDOG=y CONFIG_AT91SAM9X_WATCHDOG=y
# #
# USB-based Watchdog Cards # USB-based Watchdog Cards

View File

@ -710,7 +710,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y
# Watchdog Device Drivers # Watchdog Device Drivers
# #
# CONFIG_SOFT_WATCHDOG is not set # CONFIG_SOFT_WATCHDOG is not set
CONFIG_AT91SAM9_WATCHDOG=y CONFIG_AT91SAM9X_WATCHDOG=y
# #
# USB-based Watchdog Cards # USB-based Watchdog Cards

View File

@ -606,7 +606,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y
# Watchdog Device Drivers # Watchdog Device Drivers
# #
# CONFIG_SOFT_WATCHDOG is not set # CONFIG_SOFT_WATCHDOG is not set
CONFIG_AT91SAM9_WATCHDOG=y CONFIG_AT91SAM9X_WATCHDOG=y
# #
# Sonics Silicon Backplane # Sonics Silicon Backplane

View File

@ -727,7 +727,7 @@ CONFIG_WATCHDOG_NOWAYOUT=y
# Watchdog Device Drivers # Watchdog Device Drivers
# #
# CONFIG_SOFT_WATCHDOG is not set # CONFIG_SOFT_WATCHDOG is not set
# CONFIG_AT91SAM9_WATCHDOG is not set # CONFIG_AT91SAM9X_WATCHDOG is not set
# #
# USB-based Watchdog Cards # USB-based Watchdog Cards

View File

@ -74,9 +74,9 @@ EXPORT_SYMBOL(elf_set_personality);
*/ */
int arm_elf_read_implies_exec(const struct elf32_hdr *x, int executable_stack) int arm_elf_read_implies_exec(const struct elf32_hdr *x, int executable_stack)
{ {
if (executable_stack != EXSTACK_ENABLE_X) if (executable_stack != EXSTACK_DISABLE_X)
return 1; return 1;
if (cpu_architecture() <= CPU_ARCH_ARMv6) if (cpu_architecture() < CPU_ARCH_ARMv6)
return 1; return 1;
return 0; return 0;
} }

View File

@ -697,7 +697,7 @@ static void __init at91_add_device_rtt(void)
* Watchdog * Watchdog
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE) #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
static struct platform_device at91cap9_wdt_device = { static struct platform_device at91cap9_wdt_device = {
.name = "at91_wdt", .name = "at91_wdt",
.id = -1, .id = -1,

View File

@ -643,7 +643,7 @@ static void __init at91_add_device_rtt(void)
* Watchdog * Watchdog
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE) #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
static struct platform_device at91sam9260_wdt_device = { static struct platform_device at91sam9260_wdt_device = {
.name = "at91_wdt", .name = "at91_wdt",
.id = -1, .id = -1,

View File

@ -621,7 +621,7 @@ static void __init at91_add_device_rtt(void)
* Watchdog * Watchdog
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE) #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
static struct platform_device at91sam9261_wdt_device = { static struct platform_device at91sam9261_wdt_device = {
.name = "at91_wdt", .name = "at91_wdt",
.id = -1, .id = -1,

View File

@ -854,7 +854,7 @@ static void __init at91_add_device_rtt(void)
* Watchdog * Watchdog
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE) #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
static struct platform_device at91sam9263_wdt_device = { static struct platform_device at91sam9263_wdt_device = {
.name = "at91_wdt", .name = "at91_wdt",
.id = -1, .id = -1,

View File

@ -609,7 +609,7 @@ static void __init at91_add_device_rtt(void)
* Watchdog * Watchdog
* -------------------------------------------------------------------- */ * -------------------------------------------------------------------- */
#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE) #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
static struct platform_device at91sam9rl_wdt_device = { static struct platform_device at91sam9rl_wdt_device = {
.name = "at91_wdt", .name = "at91_wdt",
.id = -1, .id = -1,

View File

@ -490,7 +490,8 @@ postcore_initcall(at91_gpio_debugfs_init);
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
/* This lock class tells lockdep that GPIO irqs are in a different /*
* This lock class tells lockdep that GPIO irqs are in a different
* category than their parents, so it won't report false recursion. * category than their parents, so it won't report false recursion.
*/ */
static struct lock_class_key gpio_lock_class; static struct lock_class_key gpio_lock_class;
@ -509,9 +510,6 @@ void __init at91_gpio_irq_setup(void)
unsigned id = this->id; unsigned id = this->id;
unsigned i; unsigned i;
/* enable PIO controller's clock */
clk_enable(this->clock);
__raw_writel(~0, this->regbase + PIO_IDR); __raw_writel(~0, this->regbase + PIO_IDR);
for (i = 0, pin = this->chipbase; i < 32; i++, pin++) { for (i = 0, pin = this->chipbase; i < 32; i++, pin++) {
@ -556,7 +554,14 @@ void __init at91_gpio_init(struct at91_gpio_bank *data, int nr_banks)
data->chipbase = PIN_BASE + i * 32; data->chipbase = PIN_BASE + i * 32;
data->regbase = data->offset + (void __iomem *)AT91_VA_BASE_SYS; data->regbase = data->offset + (void __iomem *)AT91_VA_BASE_SYS;
/* AT91SAM9263_ID_PIOCDE groups PIOC, PIOD, PIOE */ /* enable PIO controller's clock */
clk_enable(data->clock);
/*
* Some processors share peripheral ID between multiple GPIO banks.
* SAM9263 (PIOC, PIOD, PIOE)
* CAP9 (PIOA, PIOB, PIOC, PIOD)
*/
if (last && last->id == data->id) if (last && last->id == data->id)
last->next = data; last->next = data;
} }

View File

@ -93,6 +93,7 @@ struct atmel_nand_data {
u8 enable_pin; /* chip enable */ u8 enable_pin; /* chip enable */
u8 det_pin; /* card detect */ u8 det_pin; /* card detect */
u8 rdy_pin; /* ready/busy */ u8 rdy_pin; /* ready/busy */
u8 rdy_pin_active_low; /* rdy_pin value is inverted */
u8 ale; /* address line number connected to ALE */ u8 ale; /* address line number connected to ALE */
u8 cle; /* address line number connected to CLE */ u8 cle; /* address line number connected to CLE */
u8 bus_width_16; /* buswidth is 16 bit */ u8 bus_width_16; /* buswidth is 16 bit */

View File

@ -1,3 +0,0 @@
/*
* arch/arm/mach-ep93xx/include/mach/gesbc9312.h
*/

View File

@ -10,7 +10,6 @@
#include "platform.h" #include "platform.h"
#include "gesbc9312.h"
#include "ts72xx.h" #include "ts72xx.h"
#endif #endif

View File

@ -42,7 +42,7 @@ void __init kirkwood_init_irq(void)
writel(0, GPIO_EDGE_CAUSE(32)); writel(0, GPIO_EDGE_CAUSE(32));
for (i = IRQ_KIRKWOOD_GPIO_START; i < NR_IRQS; i++) { for (i = IRQ_KIRKWOOD_GPIO_START; i < NR_IRQS; i++) {
set_irq_chip(i, &orion_gpio_irq_level_chip); set_irq_chip(i, &orion_gpio_irq_chip);
set_irq_handler(i, handle_level_irq); set_irq_handler(i, handle_level_irq);
irq_desc[i].status |= IRQ_LEVEL; irq_desc[i].status |= IRQ_LEVEL;
set_irq_flags(i, IRQF_VALID); set_irq_flags(i, IRQF_VALID);

View File

@ -40,7 +40,7 @@ void __init mv78xx0_init_irq(void)
writel(0, GPIO_EDGE_CAUSE(0)); writel(0, GPIO_EDGE_CAUSE(0));
for (i = IRQ_MV78XX0_GPIO_START; i < NR_IRQS; i++) { for (i = IRQ_MV78XX0_GPIO_START; i < NR_IRQS; i++) {
set_irq_chip(i, &orion_gpio_irq_level_chip); set_irq_chip(i, &orion_gpio_irq_chip);
set_irq_handler(i, handle_level_irq); set_irq_handler(i, handle_level_irq);
irq_desc[i].status |= IRQ_LEVEL; irq_desc[i].status |= IRQ_LEVEL;
set_irq_flags(i, IRQF_VALID); set_irq_flags(i, IRQF_VALID);

View File

@ -565,7 +565,7 @@ u32 omap2_clksel_to_divisor(struct clk *clk, u32 field_val)
* *
* Given a struct clk of a rate-selectable clksel clock, and a clock divisor, * Given a struct clk of a rate-selectable clksel clock, and a clock divisor,
* find the corresponding register field value. The return register value is * find the corresponding register field value. The return register value is
* the value before left-shifting. Returns 0xffffffff on error * the value before left-shifting. Returns ~0 on error
*/ */
u32 omap2_divisor_to_clksel(struct clk *clk, u32 div) u32 omap2_divisor_to_clksel(struct clk *clk, u32 div)
{ {
@ -577,7 +577,7 @@ u32 omap2_divisor_to_clksel(struct clk *clk, u32 div)
clks = omap2_get_clksel_by_parent(clk, clk->parent); clks = omap2_get_clksel_by_parent(clk, clk->parent);
if (clks == NULL) if (clks == NULL)
return 0; return ~0;
for (clkr = clks->rates; clkr->div; clkr++) { for (clkr = clks->rates; clkr->div; clkr++) {
if ((clkr->flags & cpu_mask) && (clkr->div == div)) if ((clkr->flags & cpu_mask) && (clkr->div == div))
@ -588,7 +588,7 @@ u32 omap2_divisor_to_clksel(struct clk *clk, u32 div)
printk(KERN_ERR "clock: Could not find divisor %d for " printk(KERN_ERR "clock: Could not find divisor %d for "
"clock %s parent %s\n", div, clk->name, "clock %s parent %s\n", div, clk->name,
clk->parent->name); clk->parent->name);
return 0; return ~0;
} }
return clkr->val; return clkr->val;
@ -708,7 +708,7 @@ static u32 omap2_clksel_get_src_field(void __iomem **src_addr,
return 0; return 0;
for (clkr = clks->rates; clkr->div; clkr++) { for (clkr = clks->rates; clkr->div; clkr++) {
if (clkr->flags & (cpu_mask | DEFAULT_RATE)) if (clkr->flags & cpu_mask && clkr->flags & DEFAULT_RATE)
break; /* Found the default rate for this platform */ break; /* Found the default rate for this platform */
} }
@ -746,7 +746,7 @@ int omap2_clk_set_parent(struct clk *clk, struct clk *new_parent)
return -EINVAL; return -EINVAL;
if (clk->usecount > 0) if (clk->usecount > 0)
_omap2_clk_disable(clk); omap2_clk_disable(clk);
/* Set new source value (previous dividers if any in effect) */ /* Set new source value (previous dividers if any in effect) */
reg_val = __raw_readl(src_addr) & ~field_mask; reg_val = __raw_readl(src_addr) & ~field_mask;
@ -759,11 +759,11 @@ int omap2_clk_set_parent(struct clk *clk, struct clk *new_parent)
wmb(); wmb();
} }
if (clk->usecount > 0)
_omap2_clk_enable(clk);
clk->parent = new_parent; clk->parent = new_parent;
if (clk->usecount > 0)
omap2_clk_enable(clk);
/* CLKSEL clocks follow their parents' rates, divided by a divisor */ /* CLKSEL clocks follow their parents' rates, divided by a divisor */
clk->rate = new_parent->rate; clk->rate = new_parent->rate;

View File

@ -44,7 +44,7 @@ void __init orion5x_init_irq(void)
* User can use set_type() if he wants to use edge types handlers. * User can use set_type() if he wants to use edge types handlers.
*/ */
for (i = IRQ_ORION5X_GPIO_START; i < NR_IRQS; i++) { for (i = IRQ_ORION5X_GPIO_START; i < NR_IRQS; i++) {
set_irq_chip(i, &orion_gpio_irq_level_chip); set_irq_chip(i, &orion_gpio_irq_chip);
set_irq_handler(i, handle_level_irq); set_irq_handler(i, handle_level_irq);
irq_desc[i].status |= IRQ_LEVEL; irq_desc[i].status |= IRQ_LEVEL;
set_irq_flags(i, IRQF_VALID); set_irq_flags(i, IRQF_VALID);

View File

@ -693,7 +693,8 @@ static void __init sanity_check_meminfo(void)
* Check whether this memory bank would entirely overlap * Check whether this memory bank would entirely overlap
* the vmalloc area. * the vmalloc area.
*/ */
if (__va(bank->start) >= VMALLOC_MIN) { if (__va(bank->start) >= VMALLOC_MIN ||
__va(bank->start) < PAGE_OFFSET) {
printk(KERN_NOTICE "Ignoring RAM at %.8lx-%.8lx " printk(KERN_NOTICE "Ignoring RAM at %.8lx-%.8lx "
"(vmalloc region overlap).\n", "(vmalloc region overlap).\n",
bank->start, bank->start + bank->size - 1); bank->start, bank->start + bank->size - 1);

View File

@ -265,51 +265,36 @@ EXPORT_SYMBOL(orion_gpio_set_blink);
* polarity LEVEL mask * polarity LEVEL mask
* *
****************************************************************************/ ****************************************************************************/
static void gpio_irq_edge_ack(u32 irq)
{
int pin = irq_to_gpio(irq);
writel(~(1 << (pin & 31)), GPIO_EDGE_CAUSE(pin)); static void gpio_irq_ack(u32 irq)
{
int type = irq_desc[irq].status & IRQ_TYPE_SENSE_MASK;
if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) {
int pin = irq_to_gpio(irq);
writel(~(1 << (pin & 31)), GPIO_EDGE_CAUSE(pin));
}
} }
static void gpio_irq_edge_mask(u32 irq) static void gpio_irq_mask(u32 irq)
{ {
int pin = irq_to_gpio(irq); int pin = irq_to_gpio(irq);
u32 u; int type = irq_desc[irq].status & IRQ_TYPE_SENSE_MASK;
u32 reg = (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) ?
u = readl(GPIO_EDGE_MASK(pin)); GPIO_EDGE_MASK(pin) : GPIO_LEVEL_MASK(pin);
u32 u = readl(reg);
u &= ~(1 << (pin & 31)); u &= ~(1 << (pin & 31));
writel(u, GPIO_EDGE_MASK(pin)); writel(u, reg);
} }
static void gpio_irq_edge_unmask(u32 irq) static void gpio_irq_unmask(u32 irq)
{ {
int pin = irq_to_gpio(irq); int pin = irq_to_gpio(irq);
u32 u; int type = irq_desc[irq].status & IRQ_TYPE_SENSE_MASK;
u32 reg = (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) ?
u = readl(GPIO_EDGE_MASK(pin)); GPIO_EDGE_MASK(pin) : GPIO_LEVEL_MASK(pin);
u32 u = readl(reg);
u |= 1 << (pin & 31); u |= 1 << (pin & 31);
writel(u, GPIO_EDGE_MASK(pin)); writel(u, reg);
}
static void gpio_irq_level_mask(u32 irq)
{
int pin = irq_to_gpio(irq);
u32 u;
u = readl(GPIO_LEVEL_MASK(pin));
u &= ~(1 << (pin & 31));
writel(u, GPIO_LEVEL_MASK(pin));
}
static void gpio_irq_level_unmask(u32 irq)
{
int pin = irq_to_gpio(irq);
u32 u;
u = readl(GPIO_LEVEL_MASK(pin));
u |= 1 << (pin & 31);
writel(u, GPIO_LEVEL_MASK(pin));
} }
static int gpio_irq_set_type(u32 irq, u32 type) static int gpio_irq_set_type(u32 irq, u32 type)
@ -331,9 +316,9 @@ static int gpio_irq_set_type(u32 irq, u32 type)
* Set edge/level type. * Set edge/level type.
*/ */
if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) { if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) {
desc->chip = &orion_gpio_irq_edge_chip; desc->handle_irq = handle_edge_irq;
} else if (type & (IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW)) { } else if (type & (IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW)) {
desc->chip = &orion_gpio_irq_level_chip; desc->handle_irq = handle_level_irq;
} else { } else {
printk(KERN_ERR "failed to set irq=%d (type=%d)\n", irq, type); printk(KERN_ERR "failed to set irq=%d (type=%d)\n", irq, type);
return -EINVAL; return -EINVAL;
@ -371,19 +356,11 @@ static int gpio_irq_set_type(u32 irq, u32 type)
return 0; return 0;
} }
struct irq_chip orion_gpio_irq_edge_chip = { struct irq_chip orion_gpio_irq_chip = {
.name = "orion_gpio_irq_edge", .name = "orion_gpio",
.ack = gpio_irq_edge_ack, .ack = gpio_irq_ack,
.mask = gpio_irq_edge_mask, .mask = gpio_irq_mask,
.unmask = gpio_irq_edge_unmask, .unmask = gpio_irq_unmask,
.set_type = gpio_irq_set_type,
};
struct irq_chip orion_gpio_irq_level_chip = {
.name = "orion_gpio_irq_level",
.mask = gpio_irq_level_mask,
.mask_ack = gpio_irq_level_mask,
.unmask = gpio_irq_level_unmask,
.set_type = gpio_irq_set_type, .set_type = gpio_irq_set_type,
}; };

View File

@ -31,8 +31,7 @@ void orion_gpio_set_blink(unsigned pin, int blink);
/* /*
* GPIO interrupt handling. * GPIO interrupt handling.
*/ */
extern struct irq_chip orion_gpio_irq_edge_chip; extern struct irq_chip orion_gpio_irq_chip;
extern struct irq_chip orion_gpio_irq_level_chip;
void orion_gpio_irq_handler(int irqoff); void orion_gpio_irq_handler(int irqoff);

View File

@ -116,6 +116,7 @@ struct atmel_nand_data {
int enable_pin; /* chip enable */ int enable_pin; /* chip enable */
int det_pin; /* card detect */ int det_pin; /* card detect */
int rdy_pin; /* ready/busy */ int rdy_pin; /* ready/busy */
u8 rdy_pin_active_low; /* rdy_pin value is inverted */
u8 ale; /* address line number connected to ALE */ u8 ale; /* address line number connected to ALE */
u8 cle; /* address line number connected to CLE */ u8 cle; /* address line number connected to CLE */
u8 bus_width_16; /* buswidth is 16 bit */ u8 bus_width_16; /* buswidth is 16 bit */

View File

@ -221,7 +221,11 @@ config IA64_HP_SIM
config IA64_XEN_GUEST config IA64_XEN_GUEST
bool "Xen guest" bool "Xen guest"
select SWIOTLB
depends on XEN depends on XEN
help
Build a kernel that runs on Xen guest domain. At this moment only
16KB page size in supported.
endchoice endchoice
@ -479,8 +483,7 @@ config HOLES_IN_ZONE
default y if VIRTUAL_MEM_MAP default y if VIRTUAL_MEM_MAP
config HAVE_ARCH_EARLY_PFN_TO_NID config HAVE_ARCH_EARLY_PFN_TO_NID
def_bool y def_bool NUMA && SPARSEMEM
depends on NEED_MULTIPLE_NODES
config HAVE_ARCH_NODEDATA_EXTENSION config HAVE_ARCH_NODEDATA_EXTENSION
def_bool y def_bool y

File diff suppressed because it is too large Load Diff

View File

@ -24,6 +24,10 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/ioctl.h> #include <linux/ioctl.h>
/* Select x86 specific features in <linux/kvm.h> */
#define __KVM_HAVE_IOAPIC
#define __KVM_HAVE_DEVICE_ASSIGNMENT
/* Architectural interrupt line count. */ /* Architectural interrupt line count. */
#define KVM_NR_INTERRUPTS 256 #define KVM_NR_INTERRUPTS 256

View File

@ -31,10 +31,6 @@ static inline int pfn_to_nid(unsigned long pfn)
#endif #endif
} }
#ifdef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID
extern int early_pfn_to_nid(unsigned long pfn);
#endif
#ifdef CONFIG_IA64_DIG /* DIG systems are small */ #ifdef CONFIG_IA64_DIG /* DIG systems are small */
# define MAX_PHYSNODE_ID 8 # define MAX_PHYSNODE_ID 8
# define NR_NODE_MEMBLKS (MAX_NUMNODES * 8) # define NR_NODE_MEMBLKS (MAX_NUMNODES * 8)

View File

@ -39,7 +39,7 @@
/* BTE status register only supports 16 bits for length field */ /* BTE status register only supports 16 bits for length field */
#define BTE_LEN_BITS (16) #define BTE_LEN_BITS (16)
#define BTE_LEN_MASK ((1 << BTE_LEN_BITS) - 1) #define BTE_LEN_MASK ((1 << BTE_LEN_BITS) - 1)
#define BTE_MAX_XFER ((1 << BTE_LEN_BITS) * L1_CACHE_BYTES) #define BTE_MAX_XFER (BTE_LEN_MASK << L1_CACHE_SHIFT)
/* Define hardware */ /* Define hardware */

View File

@ -736,14 +736,15 @@ int __cpu_disable(void)
return -EBUSY; return -EBUSY;
} }
cpu_clear(cpu, cpu_online_map);
if (migrate_platform_irqs(cpu)) { if (migrate_platform_irqs(cpu)) {
cpu_set(cpu, cpu_online_map); cpu_set(cpu, cpu_online_map);
return (-EBUSY); return -EBUSY;
} }
remove_siblinginfo(cpu); remove_siblinginfo(cpu);
fixup_irqs(); fixup_irqs();
cpu_clear(cpu, cpu_online_map);
local_flush_tlb_all(); local_flush_tlb_all();
cpu_clear(cpu, cpu_callin_map); cpu_clear(cpu, cpu_callin_map);
return 0; return 0;

View File

@ -1337,6 +1337,10 @@ static void kvm_release_vm_pages(struct kvm *kvm)
} }
} }
void kvm_arch_sync_events(struct kvm *kvm)
{
}
void kvm_arch_destroy_vm(struct kvm *kvm) void kvm_arch_destroy_vm(struct kvm *kvm)
{ {
kvm_iommu_unmap_guest(kvm); kvm_iommu_unmap_guest(kvm);

View File

@ -455,13 +455,18 @@ fpswa_ret_t vmm_fp_emulate(int fp_fault, void *bundle, unsigned long *ipsr,
if (!vmm_fpswa_interface) if (!vmm_fpswa_interface)
return (fpswa_ret_t) {-1, 0, 0, 0}; return (fpswa_ret_t) {-1, 0, 0, 0};
/*
* Just let fpswa driver to use hardware fp registers.
* No fp register is valid in memory.
*/
memset(&fp_state, 0, sizeof(fp_state_t)); memset(&fp_state, 0, sizeof(fp_state_t));
/* /*
* compute fp_state. only FP registers f6 - f11 are used by the
* vmm, so set those bits in the mask and set the low volatile
* pointer to point to these registers.
*/
fp_state.bitmask_low64 = 0xfc0; /* bit6..bit11 */
fp_state.fp_state_low_volatile = (fp_state_low_volatile_t *) &regs->f6;
/*
* unsigned long (*EFI_FPSWA) ( * unsigned long (*EFI_FPSWA) (
* unsigned long trap_type, * unsigned long trap_type,
* void *Bundle, * void *Bundle,
@ -545,10 +550,6 @@ void reflect_interruption(u64 ifa, u64 isr, u64 iim,
status = vmm_handle_fpu_swa(0, regs, isr); status = vmm_handle_fpu_swa(0, regs, isr);
if (!status) if (!status)
return ; return ;
else if (-EAGAIN == status) {
vcpu_decrement_iip(vcpu);
return ;
}
break; break;
} }

View File

@ -58,7 +58,7 @@ paddr_to_nid(unsigned long paddr)
* SPARSEMEM to allocate the SPARSEMEM sectionmap on the NUMA node where * SPARSEMEM to allocate the SPARSEMEM sectionmap on the NUMA node where
* the section resides. * the section resides.
*/ */
int early_pfn_to_nid(unsigned long pfn) int __meminit __early_pfn_to_nid(unsigned long pfn)
{ {
int i, section = pfn >> PFN_SECTION_SHIFT, ssec, esec; int i, section = pfn >> PFN_SECTION_SHIFT, ssec, esec;
@ -70,7 +70,7 @@ int early_pfn_to_nid(unsigned long pfn)
return node_memblk[i].nid; return node_memblk[i].nid;
} }
return 0; return -1;
} }
#ifdef CONFIG_MEMORY_HOTPLUG #ifdef CONFIG_MEMORY_HOTPLUG

View File

@ -97,9 +97,10 @@ bte_result_t bte_copy(u64 src, u64 dest, u64 len, u64 mode, void *notification)
return BTE_SUCCESS; return BTE_SUCCESS;
} }
BUG_ON((len & L1_CACHE_MASK) || BUG_ON(len & L1_CACHE_MASK);
(src & L1_CACHE_MASK) || (dest & L1_CACHE_MASK)); BUG_ON(src & L1_CACHE_MASK);
BUG_ON(!(len < ((BTE_LEN_MASK + 1) << L1_CACHE_SHIFT))); BUG_ON(dest & L1_CACHE_MASK);
BUG_ON(len > BTE_MAX_XFER);
/* /*
* Start with interface corresponding to cpu number * Start with interface corresponding to cpu number

View File

@ -8,8 +8,7 @@ config XEN
depends on PARAVIRT && MCKINLEY && IA64_PAGE_SIZE_16KB && EXPERIMENTAL depends on PARAVIRT && MCKINLEY && IA64_PAGE_SIZE_16KB && EXPERIMENTAL
select XEN_XENCOMM select XEN_XENCOMM
select NO_IDLE_HZ select NO_IDLE_HZ
# followings are required to save/restore.
# those are required to save/restore.
select ARCH_SUSPEND_POSSIBLE select ARCH_SUSPEND_POSSIBLE
select SUSPEND select SUSPEND
select PM_SLEEP select PM_SLEEP

View File

@ -153,7 +153,7 @@ xen_post_smp_prepare_boot_cpu(void)
xen_setup_vcpu_info_placement(); xen_setup_vcpu_info_placement();
} }
static const struct pv_init_ops xen_init_ops __initdata = { static const struct pv_init_ops xen_init_ops __initconst = {
.banner = xen_banner, .banner = xen_banner,
.reserve_memory = xen_reserve_memory, .reserve_memory = xen_reserve_memory,
@ -337,7 +337,7 @@ xen_iosapic_write(char __iomem *iosapic, unsigned int reg, u32 val)
HYPERVISOR_physdev_op(PHYSDEVOP_apic_write, &apic_op); HYPERVISOR_physdev_op(PHYSDEVOP_apic_write, &apic_op);
} }
static const struct pv_iosapic_ops xen_iosapic_ops __initdata = { static const struct pv_iosapic_ops xen_iosapic_ops __initconst = {
.pcat_compat_init = xen_pcat_compat_init, .pcat_compat_init = xen_pcat_compat_init,
.__get_irq_chip = xen_iosapic_get_irq_chip, .__get_irq_chip = xen_iosapic_get_irq_chip,

View File

@ -187,8 +187,8 @@ __asm__ (__ALIGN_STR "\n" \
" jbra ret_from_interrupt\n" \ " jbra ret_from_interrupt\n" \
: : "i" (&kstat_cpu(0).irqs[n+8]), "i" (&irq_handler[n+8]), \ : : "i" (&kstat_cpu(0).irqs[n+8]), "i" (&irq_handler[n+8]), \
"n" (PT_OFF_SR), "n" (n), \ "n" (PT_OFF_SR), "n" (n), \
"i" (n & 8 ? (n & 16 ? &tt_mfp.int_mk_a : &mfp.int_mk_a) \ "i" (n & 8 ? (n & 16 ? &tt_mfp.int_mk_a : &st_mfp.int_mk_a) \
: (n & 16 ? &tt_mfp.int_mk_b : &mfp.int_mk_b)), \ : (n & 16 ? &tt_mfp.int_mk_b : &st_mfp.int_mk_b)), \
"m" (preempt_count()), "di" (HARDIRQ_OFFSET) \ "m" (preempt_count()), "di" (HARDIRQ_OFFSET) \
); \ ); \
for (;;); /* fake noreturn */ \ for (;;); /* fake noreturn */ \
@ -366,14 +366,14 @@ void __init atari_init_IRQ(void)
/* Initialize the MFP(s) */ /* Initialize the MFP(s) */
#ifdef ATARI_USE_SOFTWARE_EOI #ifdef ATARI_USE_SOFTWARE_EOI
mfp.vec_adr = 0x48; /* Software EOI-Mode */ st_mfp.vec_adr = 0x48; /* Software EOI-Mode */
#else #else
mfp.vec_adr = 0x40; /* Automatic EOI-Mode */ st_mfp.vec_adr = 0x40; /* Automatic EOI-Mode */
#endif #endif
mfp.int_en_a = 0x00; /* turn off MFP-Ints */ st_mfp.int_en_a = 0x00; /* turn off MFP-Ints */
mfp.int_en_b = 0x00; st_mfp.int_en_b = 0x00;
mfp.int_mk_a = 0xff; /* no Masking */ st_mfp.int_mk_a = 0xff; /* no Masking */
mfp.int_mk_b = 0xff; st_mfp.int_mk_b = 0xff;
if (ATARIHW_PRESENT(TT_MFP)) { if (ATARIHW_PRESENT(TT_MFP)) {
#ifdef ATARI_USE_SOFTWARE_EOI #ifdef ATARI_USE_SOFTWARE_EOI

View File

@ -609,10 +609,10 @@ int atari_keyb_init(void)
ACIA_RHTID : 0); ACIA_RHTID : 0);
/* make sure the interrupt line is up */ /* make sure the interrupt line is up */
} while ((mfp.par_dt_reg & 0x10) == 0); } while ((st_mfp.par_dt_reg & 0x10) == 0);
/* enable ACIA Interrupts */ /* enable ACIA Interrupts */
mfp.active_edge &= ~0x10; st_mfp.active_edge &= ~0x10;
atari_turnon_irq(IRQ_MFP_ACIA); atari_turnon_irq(IRQ_MFP_ACIA);
ikbd_self_test = 1; ikbd_self_test = 1;

View File

@ -258,7 +258,7 @@ void __init config_atari(void)
printk("STND_SHIFTER "); printk("STND_SHIFTER ");
} }
} }
if (hwreg_present(&mfp.par_dt_reg)) { if (hwreg_present(&st_mfp.par_dt_reg)) {
ATARIHW_SET(ST_MFP); ATARIHW_SET(ST_MFP);
printk("ST_MFP "); printk("ST_MFP ");
} }

View File

@ -34,9 +34,9 @@ static struct console atari_console_driver = {
static inline void ata_mfp_out(char c) static inline void ata_mfp_out(char c)
{ {
while (!(mfp.trn_stat & 0x80)) /* wait for tx buf empty */ while (!(st_mfp.trn_stat & 0x80)) /* wait for tx buf empty */
barrier(); barrier();
mfp.usart_dta = c; st_mfp.usart_dta = c;
} }
static void atari_mfp_console_write(struct console *co, const char *str, static void atari_mfp_console_write(struct console *co, const char *str,
@ -91,7 +91,7 @@ static int ata_par_out(char c)
/* This a some-seconds timeout in case no printer is connected */ /* This a some-seconds timeout in case no printer is connected */
unsigned long i = loops_per_jiffy > 1 ? loops_per_jiffy : 10000000/HZ; unsigned long i = loops_per_jiffy > 1 ? loops_per_jiffy : 10000000/HZ;
while ((mfp.par_dt_reg & 1) && --i) /* wait for BUSY == L */ while ((st_mfp.par_dt_reg & 1) && --i) /* wait for BUSY == L */
; ;
if (!i) if (!i)
return 0; return 0;
@ -131,9 +131,9 @@ static void atari_par_console_write(struct console *co, const char *str,
#if 0 #if 0
int atari_mfp_console_wait_key(struct console *co) int atari_mfp_console_wait_key(struct console *co)
{ {
while (!(mfp.rcv_stat & 0x80)) /* wait for rx buf filled */ while (!(st_mfp.rcv_stat & 0x80)) /* wait for rx buf filled */
barrier(); barrier();
return mfp.usart_dta; return st_mfp.usart_dta;
} }
int atari_scc_console_wait_key(struct console *co) int atari_scc_console_wait_key(struct console *co)
@ -175,12 +175,12 @@ static void __init atari_init_mfp_port(int cflag)
baud = B9600; /* use default 9600bps for non-implemented rates */ baud = B9600; /* use default 9600bps for non-implemented rates */
baud -= B1200; /* baud_table[] starts at 1200bps */ baud -= B1200; /* baud_table[] starts at 1200bps */
mfp.trn_stat &= ~0x01; /* disable TX */ st_mfp.trn_stat &= ~0x01; /* disable TX */
mfp.usart_ctr = parity | csize | 0x88; /* 1:16 clk mode, 1 stop bit */ st_mfp.usart_ctr = parity | csize | 0x88; /* 1:16 clk mode, 1 stop bit */
mfp.tim_ct_cd &= 0x70; /* stop timer D */ st_mfp.tim_ct_cd &= 0x70; /* stop timer D */
mfp.tim_dt_d = baud_table[baud]; st_mfp.tim_dt_d = baud_table[baud];
mfp.tim_ct_cd |= 0x01; /* start timer D, 1:4 */ st_mfp.tim_ct_cd |= 0x01; /* start timer D, 1:4 */
mfp.trn_stat |= 0x01; /* enable TX */ st_mfp.trn_stat |= 0x01; /* enable TX */
} }
#define SCC_WRITE(reg, val) \ #define SCC_WRITE(reg, val) \

View File

@ -27,9 +27,9 @@ void __init
atari_sched_init(irq_handler_t timer_routine) atari_sched_init(irq_handler_t timer_routine)
{ {
/* set Timer C data Register */ /* set Timer C data Register */
mfp.tim_dt_c = INT_TICKS; st_mfp.tim_dt_c = INT_TICKS;
/* start timer C, div = 1:100 */ /* start timer C, div = 1:100 */
mfp.tim_ct_cd = (mfp.tim_ct_cd & 15) | 0x60; st_mfp.tim_ct_cd = (st_mfp.tim_ct_cd & 15) | 0x60;
/* install interrupt service routine for MFP Timer C */ /* install interrupt service routine for MFP Timer C */
if (request_irq(IRQ_MFP_TIMC, timer_routine, IRQ_TYPE_SLOW, if (request_irq(IRQ_MFP_TIMC, timer_routine, IRQ_TYPE_SLOW,
"timer", timer_routine)) "timer", timer_routine))
@ -46,11 +46,11 @@ unsigned long atari_gettimeoffset (void)
unsigned long ticks, offset = 0; unsigned long ticks, offset = 0;
/* read MFP timer C current value */ /* read MFP timer C current value */
ticks = mfp.tim_dt_c; ticks = st_mfp.tim_dt_c;
/* The probability of underflow is less than 2% */ /* The probability of underflow is less than 2% */
if (ticks > INT_TICKS - INT_TICKS / 50) if (ticks > INT_TICKS - INT_TICKS / 50)
/* Check for pending timer interrupt */ /* Check for pending timer interrupt */
if (mfp.int_pn_b & (1 << 5)) if (st_mfp.int_pn_b & (1 << 5))
offset = TICK_SIZE; offset = TICK_SIZE;
ticks = INT_TICKS - ticks; ticks = INT_TICKS - ticks;

View File

@ -113,7 +113,7 @@ extern struct atari_hw_present atari_hw_present;
* of nops on various machines. Somebody claimed that the tstb takes 600 ns. * of nops on various machines. Somebody claimed that the tstb takes 600 ns.
*/ */
#define MFPDELAY() \ #define MFPDELAY() \
__asm__ __volatile__ ( "tstb %0" : : "m" (mfp.par_dt_reg) : "cc" ); __asm__ __volatile__ ( "tstb %0" : : "m" (st_mfp.par_dt_reg) : "cc" );
/* Do cache push/invalidate for DMA read/write. This function obeys the /* Do cache push/invalidate for DMA read/write. This function obeys the
* snooping on some machines (Medusa) and processors: The Medusa itself can * snooping on some machines (Medusa) and processors: The Medusa itself can
@ -565,7 +565,7 @@ struct MFP
u_char char_dummy23; u_char char_dummy23;
u_char usart_dta; u_char usart_dta;
}; };
# define mfp ((*(volatile struct MFP*)MFP_BAS)) # define st_mfp ((*(volatile struct MFP*)MFP_BAS))
/* TT's second MFP */ /* TT's second MFP */

View File

@ -113,7 +113,7 @@ static inline int get_mfp_bit( unsigned irq, int type )
{ unsigned char mask, *reg; { unsigned char mask, *reg;
mask = 1 << (irq & 7); mask = 1 << (irq & 7);
reg = (unsigned char *)&mfp.int_en_a + type*4 + reg = (unsigned char *)&st_mfp.int_en_a + type*4 +
((irq & 8) >> 2) + (((irq-8) & 16) << 3); ((irq & 8) >> 2) + (((irq-8) & 16) << 3);
return( *reg & mask ); return( *reg & mask );
} }
@ -123,7 +123,7 @@ static inline void set_mfp_bit( unsigned irq, int type )
{ unsigned char mask, *reg; { unsigned char mask, *reg;
mask = 1 << (irq & 7); mask = 1 << (irq & 7);
reg = (unsigned char *)&mfp.int_en_a + type*4 + reg = (unsigned char *)&st_mfp.int_en_a + type*4 +
((irq & 8) >> 2) + (((irq-8) & 16) << 3); ((irq & 8) >> 2) + (((irq-8) & 16) << 3);
__asm__ __volatile__ ( "orb %0,%1" __asm__ __volatile__ ( "orb %0,%1"
: : "di" (mask), "m" (*reg) : "memory" ); : : "di" (mask), "m" (*reg) : "memory" );
@ -134,7 +134,7 @@ static inline void clear_mfp_bit( unsigned irq, int type )
{ unsigned char mask, *reg; { unsigned char mask, *reg;
mask = ~(1 << (irq & 7)); mask = ~(1 << (irq & 7));
reg = (unsigned char *)&mfp.int_en_a + type*4 + reg = (unsigned char *)&st_mfp.int_en_a + type*4 +
((irq & 8) >> 2) + (((irq-8) & 16) << 3); ((irq & 8) >> 2) + (((irq-8) & 16) << 3);
if (type == MFP_PENDING || type == MFP_SERVICE) if (type == MFP_PENDING || type == MFP_SERVICE)
__asm__ __volatile__ ( "moveb %0,%1" __asm__ __volatile__ ( "moveb %0,%1"

View File

@ -7,6 +7,7 @@ mainmenu "Linux Kernel Configuration"
config MN10300 config MN10300
def_bool y def_bool y
select HAVE_OPROFILE
config AM33 config AM33
def_bool y def_bool y

View File

@ -173,7 +173,7 @@ static int pci_ampci_write_config_byte(struct pci_bus *bus, unsigned int devfn,
BRIDGEREGB(where) = value; BRIDGEREGB(where) = value;
} else { } else {
if (bus->number == 0 && if (bus->number == 0 &&
(devfn == PCI_DEVFN(2, 0) && devfn == PCI_DEVFN(3, 0)) (devfn == PCI_DEVFN(2, 0) || devfn == PCI_DEVFN(3, 0))
) )
__pcidebug("<= %02x", bus, devfn, where, value); __pcidebug("<= %02x", bus, devfn, where, value);
CONFIG_ADDRESS = CONFIG_CMD(bus, devfn, where); CONFIG_ADDRESS = CONFIG_CMD(bus, devfn, where);

View File

@ -60,7 +60,7 @@
/* It should be preserving the high 48 bits and then specifically */ /* It should be preserving the high 48 bits and then specifically */
/* preserving _PAGE_SECONDARY | _PAGE_GROUP_IX */ /* preserving _PAGE_SECONDARY | _PAGE_GROUP_IX */
#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY | \ #define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY | \
_PAGE_HPTEFLAGS) _PAGE_HPTEFLAGS | _PAGE_SPECIAL)
/* Bits to mask out from a PMD to get to the PTE page */ /* Bits to mask out from a PMD to get to the PTE page */
#define PMD_MASKED_BITS 0 #define PMD_MASKED_BITS 0

View File

@ -114,7 +114,7 @@ static inline struct subpage_prot_table *pgd_subpage_prot(pgd_t *pgd)
* pgprot changes * pgprot changes
*/ */
#define _PAGE_CHG_MASK (PTE_RPN_MASK | _PAGE_HPTEFLAGS | _PAGE_DIRTY | \ #define _PAGE_CHG_MASK (PTE_RPN_MASK | _PAGE_HPTEFLAGS | _PAGE_DIRTY | \
_PAGE_ACCESSED) _PAGE_ACCESSED | _PAGE_SPECIAL)
/* Bits to mask out from a PMD to get to the PTE page */ /* Bits to mask out from a PMD to get to the PTE page */
#define PMD_MASKED_BITS 0x1ff #define PMD_MASKED_BITS 0x1ff

View File

@ -429,7 +429,8 @@ extern int icache_44x_need_flush;
#define PMD_PAGE_SIZE(pmd) bad_call_to_PMD_PAGE_SIZE() #define PMD_PAGE_SIZE(pmd) bad_call_to_PMD_PAGE_SIZE()
#endif #endif
#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY) #define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY | \
_PAGE_SPECIAL)
#define PAGE_PROT_BITS (_PAGE_GUARDED | _PAGE_COHERENT | _PAGE_NO_CACHE | \ #define PAGE_PROT_BITS (_PAGE_GUARDED | _PAGE_COHERENT | _PAGE_NO_CACHE | \

View File

@ -646,11 +646,16 @@ static int emulate_vsx(unsigned char __user *addr, unsigned int reg,
unsigned int areg, struct pt_regs *regs, unsigned int areg, struct pt_regs *regs,
unsigned int flags, unsigned int length) unsigned int flags, unsigned int length)
{ {
char *ptr = (char *) &current->thread.TS_FPR(reg); char *ptr;
int ret = 0; int ret = 0;
flush_vsx_to_thread(current); flush_vsx_to_thread(current);
if (reg < 32)
ptr = (char *) &current->thread.TS_FPR(reg);
else
ptr = (char *) &current->thread.vr[reg - 32];
if (flags & ST) if (flags & ST)
ret = __copy_to_user(addr, ptr, length); ret = __copy_to_user(addr, ptr, length);
else { else {

View File

@ -125,6 +125,10 @@ static void kvmppc_free_vcpus(struct kvm *kvm)
} }
} }
void kvm_arch_sync_events(struct kvm *kvm)
{
}
void kvm_arch_destroy_vm(struct kvm *kvm) void kvm_arch_destroy_vm(struct kvm *kvm)
{ {
kvmppc_free_vcpus(kvm); kvmppc_free_vcpus(kvm);

View File

@ -19,6 +19,7 @@
#include <linux/notifier.h> #include <linux/notifier.h>
#include <linux/lmb.h> #include <linux/lmb.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/pfn.h>
#include <asm/sparsemem.h> #include <asm/sparsemem.h>
#include <asm/prom.h> #include <asm/prom.h>
#include <asm/system.h> #include <asm/system.h>
@ -882,7 +883,7 @@ static void mark_reserved_regions_for_nid(int nid)
unsigned long physbase = lmb.reserved.region[i].base; unsigned long physbase = lmb.reserved.region[i].base;
unsigned long size = lmb.reserved.region[i].size; unsigned long size = lmb.reserved.region[i].size;
unsigned long start_pfn = physbase >> PAGE_SHIFT; unsigned long start_pfn = physbase >> PAGE_SHIFT;
unsigned long end_pfn = ((physbase + size) >> PAGE_SHIFT); unsigned long end_pfn = PFN_UP(physbase + size);
struct node_active_region node_ar; struct node_active_region node_ar;
unsigned long node_end_pfn = node->node_start_pfn + unsigned long node_end_pfn = node->node_start_pfn +
node->node_spanned_pages; node->node_spanned_pages;
@ -908,7 +909,7 @@ static void mark_reserved_regions_for_nid(int nid)
*/ */
if (end_pfn > node_ar.end_pfn) if (end_pfn > node_ar.end_pfn)
reserve_size = (node_ar.end_pfn << PAGE_SHIFT) reserve_size = (node_ar.end_pfn << PAGE_SHIFT)
- (start_pfn << PAGE_SHIFT); - physbase;
/* /*
* Only worry about *this* node, others may not * Only worry about *this* node, others may not
* yet have valid NODE_DATA(). * yet have valid NODE_DATA().

View File

@ -328,7 +328,7 @@ static int __init ps3_mm_add_memory(void)
return result; return result;
} }
core_initcall(ps3_mm_add_memory); device_initcall(ps3_mm_add_memory);
/*============================================================================*/ /*============================================================================*/
/* dma routines */ /* dma routines */

View File

@ -145,7 +145,7 @@ cputime_to_timeval(const cputime_t cputime, struct timeval *value)
value->tv_usec = rp.subreg.even / 4096; value->tv_usec = rp.subreg.even / 4096;
value->tv_sec = rp.subreg.odd; value->tv_sec = rp.subreg.odd;
#else #else
value->tv_usec = cputime % 4096000000ULL; value->tv_usec = (cputime % 4096000000ULL) / 4096;
value->tv_sec = cputime / 4096000000ULL; value->tv_sec = cputime / 4096000000ULL;
#endif #endif
} }

View File

@ -43,6 +43,8 @@ struct mem_chunk {
extern struct mem_chunk memory_chunk[]; extern struct mem_chunk memory_chunk[];
extern unsigned long real_memory_size; extern unsigned long real_memory_size;
extern int memory_end_set;
extern unsigned long memory_end;
void detect_memory_layout(struct mem_chunk chunk[]); void detect_memory_layout(struct mem_chunk chunk[]);

View File

@ -82,7 +82,9 @@ char elf_platform[ELF_PLATFORM_SIZE];
struct mem_chunk __initdata memory_chunk[MEMORY_CHUNKS]; struct mem_chunk __initdata memory_chunk[MEMORY_CHUNKS];
volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */ volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */
static unsigned long __initdata memory_end;
int __initdata memory_end_set;
unsigned long __initdata memory_end;
/* /*
* This is set up by the setup-routine at boot-time * This is set up by the setup-routine at boot-time
@ -281,6 +283,7 @@ void (*pm_power_off)(void) = machine_power_off;
static int __init early_parse_mem(char *p) static int __init early_parse_mem(char *p)
{ {
memory_end = memparse(p, &p); memory_end = memparse(p, &p);
memory_end_set = 1;
return 0; return 0;
} }
early_param("mem", early_parse_mem); early_param("mem", early_parse_mem);
@ -508,8 +511,10 @@ static void __init setup_memory_end(void)
int i; int i;
#if defined(CONFIG_ZFCPDUMP) || defined(CONFIG_ZFCPDUMP_MODULE) #if defined(CONFIG_ZFCPDUMP) || defined(CONFIG_ZFCPDUMP_MODULE)
if (ipl_info.type == IPL_TYPE_FCP_DUMP) if (ipl_info.type == IPL_TYPE_FCP_DUMP) {
memory_end = ZFCPDUMP_HSA_SIZE; memory_end = ZFCPDUMP_HSA_SIZE;
memory_end_set = 1;
}
#endif #endif
memory_size = 0; memory_size = 0;
memory_end &= PAGE_MASK; memory_end &= PAGE_MASK;

View File

@ -212,6 +212,10 @@ static void kvm_free_vcpus(struct kvm *kvm)
} }
} }
void kvm_arch_sync_events(struct kvm *kvm)
{
}
void kvm_arch_destroy_vm(struct kvm *kvm) void kvm_arch_destroy_vm(struct kvm *kvm)
{ {
kvm_free_vcpus(kvm); kvm_free_vcpus(kvm);

View File

@ -78,7 +78,7 @@ void vde_init_libstuff(struct vde_data *vpri, struct vde_init *init)
{ {
struct vde_open_args *args; struct vde_open_args *args;
vpri->args = kmalloc(sizeof(struct vde_open_args), UM_GFP_KERNEL); vpri->args = uml_kmalloc(sizeof(struct vde_open_args), UM_GFP_KERNEL);
if (vpri->args == NULL) { if (vpri->args == NULL) {
printk(UM_KERN_ERR "vde_init_libstuff - vde_open_args " printk(UM_KERN_ERR "vde_init_libstuff - vde_open_args "
"allocation failed"); "allocation failed");
@ -91,8 +91,8 @@ void vde_init_libstuff(struct vde_data *vpri, struct vde_init *init)
args->group = init->group; args->group = init->group;
args->mode = init->mode ? init->mode : 0700; args->mode = init->mode ? init->mode : 0700;
args->port ? printk(UM_KERN_INFO "port %d", args->port) : args->port ? printk("port %d", args->port) :
printk(UM_KERN_INFO "undefined port"); printk("undefined port");
} }
int vde_user_read(void *conn, void *buf, int len) int vde_user_read(void *conn, void *buf, int len)

View File

@ -175,28 +175,8 @@ config IOMMU_LEAK
Add a simple leak tracer to the IOMMU code. This is useful when you Add a simple leak tracer to the IOMMU code. This is useful when you
are debugging a buggy device driver that leaks IOMMU mappings. are debugging a buggy device driver that leaks IOMMU mappings.
config MMIOTRACE config HAVE_MMIOTRACE_SUPPORT
bool "Memory mapped IO tracing" def_bool y
depends on DEBUG_KERNEL && PCI
select TRACING
help
Mmiotrace traces Memory Mapped I/O access and is meant for
debugging and reverse engineering. It is called from the ioremap
implementation and works via page faults. Tracing is disabled by
default and can be enabled at run-time.
See Documentation/tracers/mmiotrace.txt.
If you are not helping to develop drivers, say N.
config MMIOTRACE_TEST
tristate "Test module for mmiotrace"
depends on MMIOTRACE && m
help
This is a dumb module for testing mmiotrace. It is very dangerous
as it will write garbage to IO memory starting at a given address.
However, it should be safe to use on e.g. unused portion of VRAM.
Say N, unless you absolutely know what you are doing.
# #
# IO delay types: # IO delay types:

View File

@ -9,6 +9,13 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/ioctl.h> #include <linux/ioctl.h>
/* Select x86 specific features in <linux/kvm.h> */
#define __KVM_HAVE_PIT
#define __KVM_HAVE_IOAPIC
#define __KVM_HAVE_DEVICE_ASSIGNMENT
#define __KVM_HAVE_MSI
#define __KVM_HAVE_USER_NMI
/* Architectural interrupt line count. */ /* Architectural interrupt line count. */
#define KVM_NR_INTERRUPTS 256 #define KVM_NR_INTERRUPTS 256

View File

@ -32,8 +32,6 @@ static inline void get_memcfg_numa(void)
get_memcfg_numa_flat(); get_memcfg_numa_flat();
} }
extern int early_pfn_to_nid(unsigned long pfn);
extern void resume_map_numa_kva(pgd_t *pgd); extern void resume_map_numa_kva(pgd_t *pgd);
#else /* !CONFIG_NUMA */ #else /* !CONFIG_NUMA */

View File

@ -40,8 +40,6 @@ static inline __attribute__((pure)) int phys_to_nid(unsigned long addr)
#define node_end_pfn(nid) (NODE_DATA(nid)->node_start_pfn + \ #define node_end_pfn(nid) (NODE_DATA(nid)->node_start_pfn + \
NODE_DATA(nid)->node_spanned_pages) NODE_DATA(nid)->node_spanned_pages)
extern int early_pfn_to_nid(unsigned long pfn);
#ifdef CONFIG_NUMA_EMU #ifdef CONFIG_NUMA_EMU
#define FAKE_NODE_MIN_SIZE (64 * 1024 * 1024) #define FAKE_NODE_MIN_SIZE (64 * 1024 * 1024)
#define FAKE_NODE_MIN_HASH_MASK (~(FAKE_NODE_MIN_SIZE - 1UL)) #define FAKE_NODE_MIN_HASH_MASK (~(FAKE_NODE_MIN_SIZE - 1UL))

View File

@ -13,7 +13,6 @@
* Hooray, we are in Long 64-bit mode (but still running in low memory) * Hooray, we are in Long 64-bit mode (but still running in low memory)
*/ */
ENTRY(wakeup_long64) ENTRY(wakeup_long64)
wakeup_long64:
movq saved_magic, %rax movq saved_magic, %rax
movq $0x123456789abcdef0, %rdx movq $0x123456789abcdef0, %rdx
cmpq %rdx, %rax cmpq %rdx, %rax
@ -34,16 +33,12 @@ wakeup_long64:
movq saved_rip, %rax movq saved_rip, %rax
jmp *%rax jmp *%rax
ENDPROC(wakeup_long64)
bogus_64_magic: bogus_64_magic:
jmp bogus_64_magic jmp bogus_64_magic
.align 2 ENTRY(do_suspend_lowlevel)
.p2align 4,,15
.globl do_suspend_lowlevel
.type do_suspend_lowlevel,@function
do_suspend_lowlevel:
.LFB5:
subq $8, %rsp subq $8, %rsp
xorl %eax, %eax xorl %eax, %eax
call save_processor_state call save_processor_state
@ -67,7 +62,7 @@ do_suspend_lowlevel:
pushfq pushfq
popq pt_regs_flags(%rax) popq pt_regs_flags(%rax)
movq $.L97, saved_rip(%rip) movq $resume_point, saved_rip(%rip)
movq %rsp, saved_rsp movq %rsp, saved_rsp
movq %rbp, saved_rbp movq %rbp, saved_rbp
@ -78,14 +73,12 @@ do_suspend_lowlevel:
addq $8, %rsp addq $8, %rsp
movl $3, %edi movl $3, %edi
xorl %eax, %eax xorl %eax, %eax
jmp acpi_enter_sleep_state call acpi_enter_sleep_state
.L97: /* in case something went wrong, restore the machine status and go on */
.p2align 4,,7 jmp resume_point
.L99:
.align 4
movl $24, %eax
movw %ax, %ds
.align 4
resume_point:
/* We don't restore %rax, it must be 0 anyway */ /* We don't restore %rax, it must be 0 anyway */
movq $saved_context, %rax movq $saved_context, %rax
movq saved_context_cr4(%rax), %rbx movq saved_context_cr4(%rax), %rbx
@ -117,12 +110,9 @@ do_suspend_lowlevel:
xorl %eax, %eax xorl %eax, %eax
addq $8, %rsp addq $8, %rsp
jmp restore_processor_state jmp restore_processor_state
.LFE5: ENDPROC(do_suspend_lowlevel)
.Lfe5:
.size do_suspend_lowlevel, .Lfe5-do_suspend_lowlevel
.data .data
ALIGN
ENTRY(saved_rbp) .quad 0 ENTRY(saved_rbp) .quad 0
ENTRY(saved_rsi) .quad 0 ENTRY(saved_rsi) .quad 0
ENTRY(saved_rdi) .quad 0 ENTRY(saved_rdi) .quad 0

View File

@ -837,7 +837,7 @@ void clear_local_APIC(void)
} }
/* lets not touch this if we didn't frob it */ /* lets not touch this if we didn't frob it */
#if defined(CONFIG_X86_MCE_P4THERMAL) || defined(X86_MCE_INTEL) #if defined(CONFIG_X86_MCE_P4THERMAL) || defined(CONFIG_X86_MCE_INTEL)
if (maxlvt >= 5) { if (maxlvt >= 5) {
v = apic_read(APIC_LVTTHMR); v = apic_read(APIC_LVTTHMR);
apic_write(APIC_LVTTHMR, v | APIC_LVT_MASKED); apic_write(APIC_LVTTHMR, v | APIC_LVT_MASKED);

View File

@ -1192,6 +1192,7 @@ static int suspend(int vetoable)
device_suspend(PMSG_SUSPEND); device_suspend(PMSG_SUSPEND);
local_irq_disable(); local_irq_disable();
device_power_down(PMSG_SUSPEND); device_power_down(PMSG_SUSPEND);
sysdev_suspend(PMSG_SUSPEND);
local_irq_enable(); local_irq_enable();
@ -1208,6 +1209,7 @@ static int suspend(int vetoable)
if (err != APM_SUCCESS) if (err != APM_SUCCESS)
apm_error("suspend", err); apm_error("suspend", err);
err = (err == APM_SUCCESS) ? 0 : -EIO; err = (err == APM_SUCCESS) ? 0 : -EIO;
sysdev_resume();
device_power_up(PMSG_RESUME); device_power_up(PMSG_RESUME);
local_irq_enable(); local_irq_enable();
device_resume(PMSG_RESUME); device_resume(PMSG_RESUME);
@ -1228,6 +1230,7 @@ static void standby(void)
local_irq_disable(); local_irq_disable();
device_power_down(PMSG_SUSPEND); device_power_down(PMSG_SUSPEND);
sysdev_suspend(PMSG_SUSPEND);
local_irq_enable(); local_irq_enable();
err = set_system_power_state(APM_STATE_STANDBY); err = set_system_power_state(APM_STATE_STANDBY);
@ -1235,6 +1238,7 @@ static void standby(void)
apm_error("standby", err); apm_error("standby", err);
local_irq_disable(); local_irq_disable();
sysdev_resume();
device_power_up(PMSG_RESUME); device_power_up(PMSG_RESUME);
local_irq_enable(); local_irq_enable();
} }

View File

@ -1157,8 +1157,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
data->cpu = pol->cpu; data->cpu = pol->cpu;
data->currpstate = HW_PSTATE_INVALID; data->currpstate = HW_PSTATE_INVALID;
rc = powernow_k8_cpu_init_acpi(data); if (powernow_k8_cpu_init_acpi(data)) {
if (rc) {
/* /*
* Use the PSB BIOS structure. This is only availabe on * Use the PSB BIOS structure. This is only availabe on
* an UP version, and is deprecated by AMD. * an UP version, and is deprecated by AMD.
@ -1176,17 +1175,20 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
"ACPI maintainers and complain to your BIOS " "ACPI maintainers and complain to your BIOS "
"vendor.\n"); "vendor.\n");
#endif #endif
goto err_out; kfree(data);
return -ENODEV;
} }
if (pol->cpu != 0) { if (pol->cpu != 0) {
printk(KERN_ERR FW_BUG PFX "No ACPI _PSS objects for " printk(KERN_ERR FW_BUG PFX "No ACPI _PSS objects for "
"CPU other than CPU0. Complain to your BIOS " "CPU other than CPU0. Complain to your BIOS "
"vendor.\n"); "vendor.\n");
goto err_out; kfree(data);
return -ENODEV;
} }
rc = find_psb_table(data); rc = find_psb_table(data);
if (rc) { if (rc) {
goto err_out; kfree(data);
return -ENODEV;
} }
/* Take a crude guess here. /* Take a crude guess here.
* That guess was in microseconds, so multiply with 1000 */ * That guess was in microseconds, so multiply with 1000 */

View File

@ -295,11 +295,11 @@ void do_machine_check(struct pt_regs * regs, long error_code)
* If we know that the error was in user space, send a * If we know that the error was in user space, send a
* SIGBUS. Otherwise, panic if tolerance is low. * SIGBUS. Otherwise, panic if tolerance is low.
* *
* do_exit() takes an awful lot of locks and has a slight * force_sig() takes an awful lot of locks and has a slight
* risk of deadlocking. * risk of deadlocking.
*/ */
if (user_space) { if (user_space) {
do_exit(SIGBUS); force_sig(SIGBUS, current);
} else if (panic_on_oops || tolerant < 2) { } else if (panic_on_oops || tolerant < 2) {
mce_panic("Uncorrected machine check", mce_panic("Uncorrected machine check",
&panicm, mcestart); &panicm, mcestart);
@ -490,7 +490,7 @@ static void __cpuinit mce_cpu_quirks(struct cpuinfo_x86 *c)
} }
static void __cpuinit mce_cpu_features(struct cpuinfo_x86 *c) static void mce_cpu_features(struct cpuinfo_x86 *c)
{ {
switch (c->x86_vendor) { switch (c->x86_vendor) {
case X86_VENDOR_INTEL: case X86_VENDOR_INTEL:
@ -734,6 +734,7 @@ __setup("mce=", mcheck_enable);
static int mce_resume(struct sys_device *dev) static int mce_resume(struct sys_device *dev)
{ {
mce_init(NULL); mce_init(NULL);
mce_cpu_features(&current_cpu_data);
return 0; return 0;
} }

View File

@ -121,7 +121,7 @@ static long threshold_restart_bank(void *_tr)
} }
/* cpu init entry point, called from mce.c with preempt off */ /* cpu init entry point, called from mce.c with preempt off */
void __cpuinit mce_amd_feature_init(struct cpuinfo_x86 *c) void mce_amd_feature_init(struct cpuinfo_x86 *c)
{ {
unsigned int bank, block; unsigned int bank, block;
unsigned int cpu = smp_processor_id(); unsigned int cpu = smp_processor_id();

View File

@ -31,7 +31,7 @@ asmlinkage void smp_thermal_interrupt(void)
irq_exit(); irq_exit();
} }
static void __cpuinit intel_init_thermal(struct cpuinfo_x86 *c) static void intel_init_thermal(struct cpuinfo_x86 *c)
{ {
u32 l, h; u32 l, h;
int tm2 = 0; int tm2 = 0;
@ -85,7 +85,7 @@ static void __cpuinit intel_init_thermal(struct cpuinfo_x86 *c)
return; return;
} }
void __cpuinit mce_intel_feature_init(struct cpuinfo_x86 *c) void mce_intel_feature_init(struct cpuinfo_x86 *c)
{ {
intel_init_thermal(c); intel_init_thermal(c);
} }

View File

@ -111,9 +111,6 @@ void cpu_idle(void)
check_pgt_cache(); check_pgt_cache();
rmb(); rmb();
if (rcu_pending(cpu))
rcu_check_callbacks(cpu, 0);
if (cpu_is_offline(cpu)) if (cpu_is_offline(cpu))
play_dead(); play_dead();

View File

@ -1051,7 +1051,7 @@ void __init trap_init_hook(void)
static struct irqaction irq0 = { static struct irqaction irq0 = {
.handler = timer_interrupt, .handler = timer_interrupt,
.flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL, .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL | IRQF_TIMER,
.mask = CPU_MASK_NONE, .mask = CPU_MASK_NONE,
.name = "timer" .name = "timer"
}; };

View File

@ -115,7 +115,7 @@ unsigned long __init calibrate_cpu(void)
static struct irqaction irq0 = { static struct irqaction irq0 = {
.handler = timer_interrupt, .handler = timer_interrupt,
.flags = IRQF_DISABLED | IRQF_IRQPOLL | IRQF_NOBALANCING, .flags = IRQF_DISABLED | IRQF_IRQPOLL | IRQF_NOBALANCING | IRQF_TIMER,
.mask = CPU_MASK_NONE, .mask = CPU_MASK_NONE,
.name = "timer" .name = "timer"
}; };

View File

@ -202,7 +202,7 @@ static irqreturn_t vmi_timer_interrupt(int irq, void *dev_id)
static struct irqaction vmi_clock_action = { static struct irqaction vmi_clock_action = {
.name = "vmi-timer", .name = "vmi-timer",
.handler = vmi_timer_interrupt, .handler = vmi_timer_interrupt,
.flags = IRQF_DISABLED | IRQF_NOBALANCING, .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_TIMER,
.mask = CPU_MASK_ALL, .mask = CPU_MASK_ALL,
}; };
@ -283,10 +283,13 @@ void __devinit vmi_time_ap_init(void)
#endif #endif
/** vmi clocksource */ /** vmi clocksource */
static struct clocksource clocksource_vmi;
static cycle_t read_real_cycles(void) static cycle_t read_real_cycles(void)
{ {
return vmi_timer_ops.get_cycle_counter(VMI_CYCLES_REAL); cycle_t ret = (cycle_t)vmi_timer_ops.get_cycle_counter(VMI_CYCLES_REAL);
return ret >= clocksource_vmi.cycle_last ?
ret : clocksource_vmi.cycle_last;
} }
static struct clocksource clocksource_vmi = { static struct clocksource clocksource_vmi = {

View File

@ -207,7 +207,7 @@ static int __pit_timer_fn(struct kvm_kpit_state *ps)
hrtimer_add_expires_ns(&pt->timer, pt->period); hrtimer_add_expires_ns(&pt->timer, pt->period);
pt->scheduled = hrtimer_get_expires_ns(&pt->timer); pt->scheduled = hrtimer_get_expires_ns(&pt->timer);
if (pt->period) if (pt->period)
ps->channels[0].count_load_time = hrtimer_get_expires(&pt->timer); ps->channels[0].count_load_time = ktime_get();
return (pt->period == 0 ? 0 : 1); return (pt->period == 0 ? 0 : 1);
} }

View File

@ -87,13 +87,6 @@ void kvm_inject_pending_timer_irqs(struct kvm_vcpu *vcpu)
} }
EXPORT_SYMBOL_GPL(kvm_inject_pending_timer_irqs); EXPORT_SYMBOL_GPL(kvm_inject_pending_timer_irqs);
void kvm_timer_intr_post(struct kvm_vcpu *vcpu, int vec)
{
kvm_apic_timer_intr_post(vcpu, vec);
/* TODO: PIT, RTC etc. */
}
EXPORT_SYMBOL_GPL(kvm_timer_intr_post);
void __kvm_migrate_timers(struct kvm_vcpu *vcpu) void __kvm_migrate_timers(struct kvm_vcpu *vcpu)
{ {
__kvm_migrate_apic_timer(vcpu); __kvm_migrate_apic_timer(vcpu);

View File

@ -89,7 +89,6 @@ static inline int irqchip_in_kernel(struct kvm *kvm)
void kvm_pic_reset(struct kvm_kpic_state *s); void kvm_pic_reset(struct kvm_kpic_state *s);
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_apic_nmi_wd_deliver(struct kvm_vcpu *vcpu); void kvm_apic_nmi_wd_deliver(struct kvm_vcpu *vcpu);

View File

@ -35,6 +35,12 @@
#include "kvm_cache_regs.h" #include "kvm_cache_regs.h"
#include "irq.h" #include "irq.h"
#ifndef CONFIG_X86_64
#define mod_64(x, y) ((x) - (y) * div64_u64(x, y))
#else
#define mod_64(x, y) ((x) % (y))
#endif
#define PRId64 "d" #define PRId64 "d"
#define PRIx64 "llx" #define PRIx64 "llx"
#define PRIu64 "u" #define PRIu64 "u"
@ -511,52 +517,22 @@ static void apic_send_ipi(struct kvm_lapic *apic)
static u32 apic_get_tmcct(struct kvm_lapic *apic) static u32 apic_get_tmcct(struct kvm_lapic *apic)
{ {
u64 counter_passed; ktime_t remaining;
ktime_t passed, now; s64 ns;
u32 tmcct; u32 tmcct;
ASSERT(apic != NULL); ASSERT(apic != NULL);
now = apic->timer.dev.base->get_time();
tmcct = apic_get_reg(apic, APIC_TMICT);
/* if initial count is 0, current count should also be 0 */ /* if initial count is 0, current count should also be 0 */
if (tmcct == 0) if (apic_get_reg(apic, APIC_TMICT) == 0)
return 0; return 0;
if (unlikely(ktime_to_ns(now) <= remaining = hrtimer_expires_remaining(&apic->timer.dev);
ktime_to_ns(apic->timer.last_update))) { if (ktime_to_ns(remaining) < 0)
/* Wrap around */ remaining = ktime_set(0, 0);
passed = ktime_add(( {
(ktime_t) {
.tv64 = KTIME_MAX -
(apic->timer.last_update).tv64}; }
), now);
apic_debug("time elapsed\n");
} else
passed = ktime_sub(now, apic->timer.last_update);
counter_passed = div64_u64(ktime_to_ns(passed), ns = mod_64(ktime_to_ns(remaining), apic->timer.period);
(APIC_BUS_CYCLE_NS * apic->timer.divide_count)); tmcct = div64_u64(ns, (APIC_BUS_CYCLE_NS * apic->timer.divide_count));
if (counter_passed > tmcct) {
if (unlikely(!apic_lvtt_period(apic))) {
/* one-shot timers stick at 0 until reset */
tmcct = 0;
} else {
/*
* periodic timers reset to APIC_TMICT when they
* hit 0. The while loop simulates this happening N
* times. (counter_passed %= tmcct) would also work,
* but might be slower or not work on 32-bit??
*/
while (counter_passed > tmcct)
counter_passed -= tmcct;
tmcct -= counter_passed;
}
} else {
tmcct -= counter_passed;
}
return tmcct; return tmcct;
} }
@ -653,8 +629,6 @@ static void start_apic_timer(struct kvm_lapic *apic)
{ {
ktime_t now = apic->timer.dev.base->get_time(); ktime_t now = apic->timer.dev.base->get_time();
apic->timer.last_update = now;
apic->timer.period = apic_get_reg(apic, APIC_TMICT) * apic->timer.period = apic_get_reg(apic, APIC_TMICT) *
APIC_BUS_CYCLE_NS * apic->timer.divide_count; APIC_BUS_CYCLE_NS * apic->timer.divide_count;
atomic_set(&apic->timer.pending, 0); atomic_set(&apic->timer.pending, 0);
@ -1110,16 +1084,6 @@ void kvm_inject_apic_timer_irqs(struct kvm_vcpu *vcpu)
} }
} }
void kvm_apic_timer_intr_post(struct kvm_vcpu *vcpu, int vec)
{
struct kvm_lapic *apic = vcpu->arch.apic;
if (apic && apic_lvt_vector(apic, APIC_LVTT) == vec)
apic->timer.last_update = ktime_add_ns(
apic->timer.last_update,
apic->timer.period);
}
int kvm_get_apic_interrupt(struct kvm_vcpu *vcpu) int kvm_get_apic_interrupt(struct kvm_vcpu *vcpu)
{ {
int vector = kvm_apic_has_interrupt(vcpu); int vector = kvm_apic_has_interrupt(vcpu);

View File

@ -12,7 +12,6 @@ struct kvm_lapic {
atomic_t pending; atomic_t pending;
s64 period; /* unit: ns */ s64 period; /* unit: ns */
u32 divide_count; u32 divide_count;
ktime_t last_update;
struct hrtimer dev; struct hrtimer dev;
} timer; } timer;
struct kvm_vcpu *vcpu; struct kvm_vcpu *vcpu;
@ -42,7 +41,6 @@ void kvm_set_apic_base(struct kvm_vcpu *vcpu, u64 data);
void kvm_apic_post_state_restore(struct kvm_vcpu *vcpu); void kvm_apic_post_state_restore(struct kvm_vcpu *vcpu);
int kvm_lapic_enabled(struct kvm_vcpu *vcpu); int kvm_lapic_enabled(struct kvm_vcpu *vcpu);
int kvm_lapic_find_highest_irr(struct kvm_vcpu *vcpu); int kvm_lapic_find_highest_irr(struct kvm_vcpu *vcpu);
void kvm_apic_timer_intr_post(struct kvm_vcpu *vcpu, int vec);
void kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr); void kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr);
void kvm_lapic_sync_from_vapic(struct kvm_vcpu *vcpu); void kvm_lapic_sync_from_vapic(struct kvm_vcpu *vcpu);

View File

@ -1698,8 +1698,13 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *shadow_pte,
if (largepage) if (largepage)
spte |= PT_PAGE_SIZE_MASK; spte |= PT_PAGE_SIZE_MASK;
if (mt_mask) { if (mt_mask) {
mt_mask = get_memory_type(vcpu, gfn) << if (!kvm_is_mmio_pfn(pfn)) {
kvm_x86_ops->get_mt_mask_shift(); mt_mask = get_memory_type(vcpu, gfn) <<
kvm_x86_ops->get_mt_mask_shift();
mt_mask |= VMX_EPT_IGMT_BIT;
} else
mt_mask = MTRR_TYPE_UNCACHABLE <<
kvm_x86_ops->get_mt_mask_shift();
spte |= mt_mask; spte |= mt_mask;
} }

View File

@ -1600,7 +1600,6 @@ static void svm_intr_assist(struct kvm_vcpu *vcpu)
/* Okay, we can deliver the interrupt: grab it and update PIC state. */ /* Okay, we can deliver the interrupt: grab it and update PIC state. */
intr_vector = kvm_cpu_get_interrupt(vcpu); intr_vector = kvm_cpu_get_interrupt(vcpu);
svm_inject_irq(svm, intr_vector); svm_inject_irq(svm, intr_vector);
kvm_timer_intr_post(vcpu, intr_vector);
out: out:
update_cr8_intercept(vcpu); update_cr8_intercept(vcpu);
} }

View File

@ -903,6 +903,7 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata)
data = vmcs_readl(GUEST_SYSENTER_ESP); data = vmcs_readl(GUEST_SYSENTER_ESP);
break; break;
default: default:
vmx_load_host_state(to_vmx(vcpu));
msr = find_msr_entry(to_vmx(vcpu), msr_index); msr = find_msr_entry(to_vmx(vcpu), msr_index);
if (msr) { if (msr) {
data = msr->data; data = msr->data;
@ -3285,7 +3286,6 @@ static void vmx_intr_assist(struct kvm_vcpu *vcpu)
} }
if (vcpu->arch.interrupt.pending) { if (vcpu->arch.interrupt.pending) {
vmx_inject_irq(vcpu, vcpu->arch.interrupt.nr); vmx_inject_irq(vcpu, vcpu->arch.interrupt.nr);
kvm_timer_intr_post(vcpu, vcpu->arch.interrupt.nr);
if (kvm_cpu_has_interrupt(vcpu)) if (kvm_cpu_has_interrupt(vcpu))
enable_irq_window(vcpu); enable_irq_window(vcpu);
} }
@ -3687,8 +3687,7 @@ static int __init vmx_init(void)
if (vm_need_ept()) { if (vm_need_ept()) {
bypass_guest_pf = 0; bypass_guest_pf = 0;
kvm_mmu_set_base_ptes(VMX_EPT_READABLE_MASK | kvm_mmu_set_base_ptes(VMX_EPT_READABLE_MASK |
VMX_EPT_WRITABLE_MASK | VMX_EPT_WRITABLE_MASK);
VMX_EPT_IGMT_BIT);
kvm_mmu_set_mask_ptes(0ull, 0ull, 0ull, 0ull, kvm_mmu_set_mask_ptes(0ull, 0ull, 0ull, 0ull,
VMX_EPT_EXECUTABLE_MASK, VMX_EPT_EXECUTABLE_MASK,
VMX_EPT_DEFAULT_MT << VMX_EPT_MT_EPTE_SHIFT); VMX_EPT_DEFAULT_MT << VMX_EPT_MT_EPTE_SHIFT);

View File

@ -967,7 +967,6 @@ int kvm_dev_ioctl_check_extension(long ext)
case KVM_CAP_MMU_SHADOW_CACHE_CONTROL: case KVM_CAP_MMU_SHADOW_CACHE_CONTROL:
case KVM_CAP_SET_TSS_ADDR: case KVM_CAP_SET_TSS_ADDR:
case KVM_CAP_EXT_CPUID: case KVM_CAP_EXT_CPUID:
case KVM_CAP_CLOCKSOURCE:
case KVM_CAP_PIT: case KVM_CAP_PIT:
case KVM_CAP_NOP_IO_DELAY: case KVM_CAP_NOP_IO_DELAY:
case KVM_CAP_MP_STATE: case KVM_CAP_MP_STATE:
@ -992,6 +991,9 @@ int kvm_dev_ioctl_check_extension(long ext)
case KVM_CAP_IOMMU: case KVM_CAP_IOMMU:
r = iommu_found(); r = iommu_found();
break; break;
case KVM_CAP_CLOCKSOURCE:
r = boot_cpu_has(X86_FEATURE_CONSTANT_TSC);
break;
default: default:
r = 0; r = 0;
break; break;
@ -4127,9 +4129,13 @@ static void kvm_free_vcpus(struct kvm *kvm)
} }
void kvm_arch_destroy_vm(struct kvm *kvm) void kvm_arch_sync_events(struct kvm *kvm)
{ {
kvm_free_all_assigned_devices(kvm); kvm_free_all_assigned_devices(kvm);
}
void kvm_arch_destroy_vm(struct kvm *kvm)
{
kvm_iommu_unmap_guest(kvm); kvm_iommu_unmap_guest(kvm);
kvm_free_pit(kvm); kvm_free_pit(kvm);
kfree(kvm->arch.vpic); kfree(kvm->arch.vpic);

View File

@ -57,7 +57,7 @@ void __init trap_init_hook(void)
static struct irqaction irq0 = { static struct irqaction irq0 = {
.handler = timer_interrupt, .handler = timer_interrupt,
.flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL, .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL | IRQF_TIMER,
.mask = CPU_MASK_NONE, .mask = CPU_MASK_NONE,
.name = "timer" .name = "timer"
}; };

View File

@ -166,7 +166,7 @@ int __init compute_hash_shift(struct bootnode *nodes, int numnodes,
return shift; return shift;
} }
int early_pfn_to_nid(unsigned long pfn) int __meminit __early_pfn_to_nid(unsigned long pfn)
{ {
return phys_to_nid(pfn << PAGE_SHIFT); return phys_to_nid(pfn << PAGE_SHIFT);
} }

View File

@ -508,18 +508,13 @@ static int split_large_page(pte_t *kpte, unsigned long address)
#endif #endif
/* /*
* Install the new, split up pagetable. Important details here: * Install the new, split up pagetable.
* *
* On Intel the NX bit of all levels must be cleared to make a * We use the standard kernel pagetable protections for the new
* page executable. See section 4.13.2 of Intel 64 and IA-32 * pagetable protections, the actual ptes set above control the
* Architectures Software Developer's Manual). * primary protection behavior:
*
* Mark the entry present. The current mapping might be
* set to not present, which we preserved above.
*/ */
ref_prot = pte_pgprot(pte_mkexec(pte_clrhuge(*kpte))); __set_pmd_pte(kpte, address, mk_pte(base, __pgprot(_KERNPG_TABLE)));
pgprot_val(ref_prot) |= _PAGE_PRESENT;
__set_pmd_pte(kpte, address, mk_pte(base, ref_prot));
base = NULL; base = NULL;
out_unlock: out_unlock:

View File

@ -209,12 +209,19 @@ void blk_abort_queue(struct request_queue *q)
{ {
unsigned long flags; unsigned long flags;
struct request *rq, *tmp; struct request *rq, *tmp;
LIST_HEAD(list);
spin_lock_irqsave(q->queue_lock, flags); spin_lock_irqsave(q->queue_lock, flags);
elv_abort_queue(q); elv_abort_queue(q);
list_for_each_entry_safe(rq, tmp, &q->timeout_list, timeout_list) /*
* Splice entries to local list, to avoid deadlocking if entries
* get readded to the timeout list by error handling
*/
list_splice_init(&q->timeout_list, &list);
list_for_each_entry_safe(rq, tmp, &list, timeout_list)
blk_abort_request(rq); blk_abort_request(rq);
spin_unlock_irqrestore(q->queue_lock, flags); spin_unlock_irqrestore(q->queue_lock, flags);

View File

@ -142,7 +142,7 @@ static void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes,
what |= ddir_act[rw & WRITE]; what |= ddir_act[rw & WRITE];
what |= MASK_TC_BIT(rw, BARRIER); what |= MASK_TC_BIT(rw, BARRIER);
what |= MASK_TC_BIT(rw, SYNC); what |= MASK_TC_BIT(rw, SYNCIO);
what |= MASK_TC_BIT(rw, AHEAD); what |= MASK_TC_BIT(rw, AHEAD);
what |= MASK_TC_BIT(rw, META); what |= MASK_TC_BIT(rw, META);
what |= MASK_TC_BIT(rw, DISCARD); what |= MASK_TC_BIT(rw, DISCARD);

Some files were not shown because too many files have changed in this diff Show More