Merge /spare/repo/linux-2.6/
This commit is contained in:
commit
739cdbf1d8
462 changed files with 15667 additions and 8144 deletions
3
CREDITS
3
CREDITS
|
@ -2423,8 +2423,7 @@ S: Toronto, Ontario
|
|||
S: Canada
|
||||
|
||||
N: Zwane Mwaikambo
|
||||
E: zwane@linuxpower.ca
|
||||
W: http://function.linuxpower.ca
|
||||
E: zwane@arm.linux.org.uk
|
||||
D: Various driver hacking
|
||||
D: Lowlevel x86 kernel hacking
|
||||
D: General debugging
|
||||
|
|
288
Documentation/networking/phy.txt
Normal file
288
Documentation/networking/phy.txt
Normal file
|
@ -0,0 +1,288 @@
|
|||
|
||||
-------
|
||||
PHY Abstraction Layer
|
||||
(Updated 2005-07-21)
|
||||
|
||||
Purpose
|
||||
|
||||
Most network devices consist of set of registers which provide an interface
|
||||
to a MAC layer, which communicates with the physical connection through a
|
||||
PHY. The PHY concerns itself with negotiating link parameters with the link
|
||||
partner on the other side of the network connection (typically, an ethernet
|
||||
cable), and provides a register interface to allow drivers to determine what
|
||||
settings were chosen, and to configure what settings are allowed.
|
||||
|
||||
While these devices are distinct from the network devices, and conform to a
|
||||
standard layout for the registers, it has been common practice to integrate
|
||||
the PHY management code with the network driver. This has resulted in large
|
||||
amounts of redundant code. Also, on embedded systems with multiple (and
|
||||
sometimes quite different) ethernet controllers connected to the same
|
||||
management bus, it is difficult to ensure safe use of the bus.
|
||||
|
||||
Since the PHYs are devices, and the management busses through which they are
|
||||
accessed are, in fact, busses, the PHY Abstraction Layer treats them as such.
|
||||
In doing so, it has these goals:
|
||||
|
||||
1) Increase code-reuse
|
||||
2) Increase overall code-maintainability
|
||||
3) Speed development time for new network drivers, and for new systems
|
||||
|
||||
Basically, this layer is meant to provide an interface to PHY devices which
|
||||
allows network driver writers to write as little code as possible, while
|
||||
still providing a full feature set.
|
||||
|
||||
The MDIO bus
|
||||
|
||||
Most network devices are connected to a PHY by means of a management bus.
|
||||
Different devices use different busses (though some share common interfaces).
|
||||
In order to take advantage of the PAL, each bus interface needs to be
|
||||
registered as a distinct device.
|
||||
|
||||
1) read and write functions must be implemented. Their prototypes are:
|
||||
|
||||
int write(struct mii_bus *bus, int mii_id, int regnum, u16 value);
|
||||
int read(struct mii_bus *bus, int mii_id, int regnum);
|
||||
|
||||
mii_id is the address on the bus for the PHY, and regnum is the register
|
||||
number. These functions are guaranteed not to be called from interrupt
|
||||
time, so it is safe for them to block, waiting for an interrupt to signal
|
||||
the operation is complete
|
||||
|
||||
2) A reset function is necessary. This is used to return the bus to an
|
||||
initialized state.
|
||||
|
||||
3) A probe function is needed. This function should set up anything the bus
|
||||
driver needs, setup the mii_bus structure, and register with the PAL using
|
||||
mdiobus_register. Similarly, there's a remove function to undo all of
|
||||
that (use mdiobus_unregister).
|
||||
|
||||
4) Like any driver, the device_driver structure must be configured, and init
|
||||
exit functions are used to register the driver.
|
||||
|
||||
5) The bus must also be declared somewhere as a device, and registered.
|
||||
|
||||
As an example for how one driver implemented an mdio bus driver, see
|
||||
drivers/net/gianfar_mii.c and arch/ppc/syslib/mpc85xx_devices.c
|
||||
|
||||
Connecting to a PHY
|
||||
|
||||
Sometime during startup, the network driver needs to establish a connection
|
||||
between the PHY device, and the network device. At this time, the PHY's bus
|
||||
and drivers need to all have been loaded, so it is ready for the connection.
|
||||
At this point, there are several ways to connect to the PHY:
|
||||
|
||||
1) The PAL handles everything, and only calls the network driver when
|
||||
the link state changes, so it can react.
|
||||
|
||||
2) The PAL handles everything except interrupts (usually because the
|
||||
controller has the interrupt registers).
|
||||
|
||||
3) The PAL handles everything, but checks in with the driver every second,
|
||||
allowing the network driver to react first to any changes before the PAL
|
||||
does.
|
||||
|
||||
4) The PAL serves only as a library of functions, with the network device
|
||||
manually calling functions to update status, and configure the PHY
|
||||
|
||||
|
||||
Letting the PHY Abstraction Layer do Everything
|
||||
|
||||
If you choose option 1 (The hope is that every driver can, but to still be
|
||||
useful to drivers that can't), connecting to the PHY is simple:
|
||||
|
||||
First, you need a function to react to changes in the link state. This
|
||||
function follows this protocol:
|
||||
|
||||
static void adjust_link(struct net_device *dev);
|
||||
|
||||
Next, you need to know the device name of the PHY connected to this device.
|
||||
The name will look something like, "phy0:0", where the first number is the
|
||||
bus id, and the second is the PHY's address on that bus.
|
||||
|
||||
Now, to connect, just call this function:
|
||||
|
||||
phydev = phy_connect(dev, phy_name, &adjust_link, flags);
|
||||
|
||||
phydev is a pointer to the phy_device structure which represents the PHY. If
|
||||
phy_connect is successful, it will return the pointer. dev, here, is the
|
||||
pointer to your net_device. Once done, this function will have started the
|
||||
PHY's software state machine, and registered for the PHY's interrupt, if it
|
||||
has one. The phydev structure will be populated with information about the
|
||||
current state, though the PHY will not yet be truly operational at this
|
||||
point.
|
||||
|
||||
flags is a u32 which can optionally contain phy-specific flags.
|
||||
This is useful if the system has put hardware restrictions on
|
||||
the PHY/controller, of which the PHY needs to be aware.
|
||||
|
||||
Now just make sure that phydev->supported and phydev->advertising have any
|
||||
values pruned from them which don't make sense for your controller (a 10/100
|
||||
controller may be connected to a gigabit capable PHY, so you would need to
|
||||
mask off SUPPORTED_1000baseT*). See include/linux/ethtool.h for definitions
|
||||
for these bitfields. Note that you should not SET any bits, or the PHY may
|
||||
get put into an unsupported state.
|
||||
|
||||
Lastly, once the controller is ready to handle network traffic, you call
|
||||
phy_start(phydev). This tells the PAL that you are ready, and configures the
|
||||
PHY to connect to the network. If you want to handle your own interrupts,
|
||||
just set phydev->irq to PHY_IGNORE_INTERRUPT before you call phy_start.
|
||||
Similarly, if you don't want to use interrupts, set phydev->irq to PHY_POLL.
|
||||
|
||||
When you want to disconnect from the network (even if just briefly), you call
|
||||
phy_stop(phydev).
|
||||
|
||||
Keeping Close Tabs on the PAL
|
||||
|
||||
It is possible that the PAL's built-in state machine needs a little help to
|
||||
keep your network device and the PHY properly in sync. If so, you can
|
||||
register a helper function when connecting to the PHY, which will be called
|
||||
every second before the state machine reacts to any changes. To do this, you
|
||||
need to manually call phy_attach() and phy_prepare_link(), and then call
|
||||
phy_start_machine() with the second argument set to point to your special
|
||||
handler.
|
||||
|
||||
Currently there are no examples of how to use this functionality, and testing
|
||||
on it has been limited because the author does not have any drivers which use
|
||||
it (they all use option 1). So Caveat Emptor.
|
||||
|
||||
Doing it all yourself
|
||||
|
||||
There's a remote chance that the PAL's built-in state machine cannot track
|
||||
the complex interactions between the PHY and your network device. If this is
|
||||
so, you can simply call phy_attach(), and not call phy_start_machine or
|
||||
phy_prepare_link(). This will mean that phydev->state is entirely yours to
|
||||
handle (phy_start and phy_stop toggle between some of the states, so you
|
||||
might need to avoid them).
|
||||
|
||||
An effort has been made to make sure that useful functionality can be
|
||||
accessed without the state-machine running, and most of these functions are
|
||||
descended from functions which did not interact with a complex state-machine.
|
||||
However, again, no effort has been made so far to test running without the
|
||||
state machine, so tryer beware.
|
||||
|
||||
Here is a brief rundown of the functions:
|
||||
|
||||
int phy_read(struct phy_device *phydev, u16 regnum);
|
||||
int phy_write(struct phy_device *phydev, u16 regnum, u16 val);
|
||||
|
||||
Simple read/write primitives. They invoke the bus's read/write function
|
||||
pointers.
|
||||
|
||||
void phy_print_status(struct phy_device *phydev);
|
||||
|
||||
A convenience function to print out the PHY status neatly.
|
||||
|
||||
int phy_clear_interrupt(struct phy_device *phydev);
|
||||
int phy_config_interrupt(struct phy_device *phydev, u32 interrupts);
|
||||
|
||||
Clear the PHY's interrupt, and configure which ones are allowed,
|
||||
respectively. Currently only supports all on, or all off.
|
||||
|
||||
int phy_enable_interrupts(struct phy_device *phydev);
|
||||
int phy_disable_interrupts(struct phy_device *phydev);
|
||||
|
||||
Functions which enable/disable PHY interrupts, clearing them
|
||||
before and after, respectively.
|
||||
|
||||
int phy_start_interrupts(struct phy_device *phydev);
|
||||
int phy_stop_interrupts(struct phy_device *phydev);
|
||||
|
||||
Requests the IRQ for the PHY interrupts, then enables them for
|
||||
start, or disables then frees them for stop.
|
||||
|
||||
struct phy_device * phy_attach(struct net_device *dev, const char *phy_id,
|
||||
u32 flags);
|
||||
|
||||
Attaches a network device to a particular PHY, binding the PHY to a generic
|
||||
driver if none was found during bus initialization. Passes in
|
||||
any phy-specific flags as needed.
|
||||
|
||||
int phy_start_aneg(struct phy_device *phydev);
|
||||
|
||||
Using variables inside the phydev structure, either configures advertising
|
||||
and resets autonegotiation, or disables autonegotiation, and configures
|
||||
forced settings.
|
||||
|
||||
static inline int phy_read_status(struct phy_device *phydev);
|
||||
|
||||
Fills the phydev structure with up-to-date information about the current
|
||||
settings in the PHY.
|
||||
|
||||
void phy_sanitize_settings(struct phy_device *phydev)
|
||||
|
||||
Resolves differences between currently desired settings, and
|
||||
supported settings for the given PHY device. Does not make
|
||||
the changes in the hardware, though.
|
||||
|
||||
int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd);
|
||||
int phy_ethtool_gset(struct phy_device *phydev, struct ethtool_cmd *cmd);
|
||||
|
||||
Ethtool convenience functions.
|
||||
|
||||
int phy_mii_ioctl(struct phy_device *phydev,
|
||||
struct mii_ioctl_data *mii_data, int cmd);
|
||||
|
||||
The MII ioctl. Note that this function will completely screw up the state
|
||||
machine if you write registers like BMCR, BMSR, ADVERTISE, etc. Best to
|
||||
use this only to write registers which are not standard, and don't set off
|
||||
a renegotiation.
|
||||
|
||||
|
||||
PHY Device Drivers
|
||||
|
||||
With the PHY Abstraction Layer, adding support for new PHYs is
|
||||
quite easy. In some cases, no work is required at all! However,
|
||||
many PHYs require a little hand-holding to get up-and-running.
|
||||
|
||||
Generic PHY driver
|
||||
|
||||
If the desired PHY doesn't have any errata, quirks, or special
|
||||
features you want to support, then it may be best to not add
|
||||
support, and let the PHY Abstraction Layer's Generic PHY Driver
|
||||
do all of the work.
|
||||
|
||||
Writing a PHY driver
|
||||
|
||||
If you do need to write a PHY driver, the first thing to do is
|
||||
make sure it can be matched with an appropriate PHY device.
|
||||
This is done during bus initialization by reading the device's
|
||||
UID (stored in registers 2 and 3), then comparing it to each
|
||||
driver's phy_id field by ANDing it with each driver's
|
||||
phy_id_mask field. Also, it needs a name. Here's an example:
|
||||
|
||||
static struct phy_driver dm9161_driver = {
|
||||
.phy_id = 0x0181b880,
|
||||
.name = "Davicom DM9161E",
|
||||
.phy_id_mask = 0x0ffffff0,
|
||||
...
|
||||
}
|
||||
|
||||
Next, you need to specify what features (speed, duplex, autoneg,
|
||||
etc) your PHY device and driver support. Most PHYs support
|
||||
PHY_BASIC_FEATURES, but you can look in include/mii.h for other
|
||||
features.
|
||||
|
||||
Each driver consists of a number of function pointers:
|
||||
|
||||
config_init: configures PHY into a sane state after a reset.
|
||||
For instance, a Davicom PHY requires descrambling disabled.
|
||||
probe: Does any setup needed by the driver
|
||||
suspend/resume: power management
|
||||
config_aneg: Changes the speed/duplex/negotiation settings
|
||||
read_status: Reads the current speed/duplex/negotiation settings
|
||||
ack_interrupt: Clear a pending interrupt
|
||||
config_intr: Enable or disable interrupts
|
||||
remove: Does any driver take-down
|
||||
|
||||
Of these, only config_aneg and read_status are required to be
|
||||
assigned by the driver code. The rest are optional. Also, it is
|
||||
preferred to use the generic phy driver's versions of these two
|
||||
functions if at all possible: genphy_read_status and
|
||||
genphy_config_aneg. If this is not possible, it is likely that
|
||||
you only need to perform some actions before and after invoking
|
||||
these functions, and so your functions will wrap the generic
|
||||
ones.
|
||||
|
||||
Feel free to look at the Marvell, Cicada, and Davicom drivers in
|
||||
drivers/net/phy/ for examples (the lxt and qsemi drivers have
|
||||
not been tested as of this writing)
|
|
@ -1739,7 +1739,7 @@ S: Maintained
|
|||
|
||||
OPL3-SA2, SA3, and SAx DRIVER
|
||||
P: Zwane Mwaikambo
|
||||
M: zwane@commfireservices.com
|
||||
M: zwane@arm.linux.org.uk
|
||||
L: linux-sound@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
|
@ -1995,7 +1995,7 @@ S: Maintained
|
|||
|
||||
SC1200 WDT DRIVER
|
||||
P: Zwane Mwaikambo
|
||||
M: zwane@commfireservices.com
|
||||
M: zwane@arm.linux.org.uk
|
||||
S: Maintained
|
||||
|
||||
SCHEDULER
|
||||
|
|
4
Makefile
4
Makefile
|
@ -1,8 +1,8 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 13
|
||||
EXTRAVERSION =-rc6
|
||||
NAME=Woozy Numbat
|
||||
EXTRAVERSION =
|
||||
NAME=Affluent Albatross
|
||||
|
||||
# *DOCUMENTATION*
|
||||
# To see a list of typical targets execute "make help"
|
||||
|
|
|
@ -522,7 +522,7 @@ source "mm/Kconfig"
|
|||
|
||||
config NUMA
|
||||
bool "NUMA Support (EXPERIMENTAL)"
|
||||
depends on DISCONTIGMEM
|
||||
depends on DISCONTIGMEM && BROKEN
|
||||
help
|
||||
Say Y to compile the kernel to support NUMA (Non-Uniform Memory
|
||||
Access). This option is for configuring high-end multiprocessor
|
||||
|
|
|
@ -566,14 +566,13 @@ handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info,
|
|||
if (ka->sa.sa_flags & SA_RESETHAND)
|
||||
ka->sa.sa_handler = SIG_DFL;
|
||||
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER)) {
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(¤t->blocked,sig);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
syscall_restart(unsigned long r0, unsigned long r19,
|
||||
|
|
|
@ -1036,7 +1036,7 @@ debug_spin_lock(spinlock_t * lock, const char *base_file, int line_no)
|
|||
" br 1b\n"
|
||||
".previous"
|
||||
: "=r" (tmp), "=m" (lock->lock), "=r" (stuck)
|
||||
: "1" (lock->lock), "2" (stuck) : "memory");
|
||||
: "m" (lock->lock), "2" (stuck) : "memory");
|
||||
|
||||
if (stuck < 0) {
|
||||
printk(KERN_WARNING
|
||||
|
@ -1115,7 +1115,7 @@ void _raw_write_lock(rwlock_t * lock)
|
|||
".previous"
|
||||
: "=m" (*(volatile int *)lock), "=&r" (regx), "=&r" (regy),
|
||||
"=&r" (stuck_lock), "=&r" (stuck_reader)
|
||||
: "0" (*(volatile int *)lock), "3" (stuck_lock), "4" (stuck_reader) : "memory");
|
||||
: "m" (*(volatile int *)lock), "3" (stuck_lock), "4" (stuck_reader) : "memory");
|
||||
|
||||
if (stuck_lock < 0) {
|
||||
printk(KERN_WARNING "write_lock stuck at %p\n", inline_pc);
|
||||
|
@ -1153,7 +1153,7 @@ void _raw_read_lock(rwlock_t * lock)
|
|||
" br 1b\n"
|
||||
".previous"
|
||||
: "=m" (*(volatile int *)lock), "=&r" (regx), "=&r" (stuck_lock)
|
||||
: "0" (*(volatile int *)lock), "2" (stuck_lock) : "memory");
|
||||
: "m" (*(volatile int *)lock), "2" (stuck_lock) : "memory");
|
||||
|
||||
if (stuck_lock < 0) {
|
||||
printk(KERN_WARNING "read_lock stuck at %p\n", inline_pc);
|
||||
|
|
|
@ -65,7 +65,7 @@ op_axp_setup(void)
|
|||
model->reg_setup(®, ctr, &sys);
|
||||
|
||||
/* Configure the registers on all cpus. */
|
||||
smp_call_function(model->cpu_setup, ®, 0, 1);
|
||||
(void)smp_call_function(model->cpu_setup, ®, 0, 1);
|
||||
model->cpu_setup(®);
|
||||
return 0;
|
||||
}
|
||||
|
@ -86,7 +86,7 @@ op_axp_cpu_start(void *dummy)
|
|||
static int
|
||||
op_axp_start(void)
|
||||
{
|
||||
smp_call_function(op_axp_cpu_start, NULL, 0, 1);
|
||||
(void)smp_call_function(op_axp_cpu_start, NULL, 0, 1);
|
||||
op_axp_cpu_start(NULL);
|
||||
return 0;
|
||||
}
|
||||
|
@ -101,7 +101,7 @@ op_axp_cpu_stop(void *dummy)
|
|||
static void
|
||||
op_axp_stop(void)
|
||||
{
|
||||
smp_call_function(op_axp_cpu_stop, NULL, 0, 1);
|
||||
(void)smp_call_function(op_axp_cpu_stop, NULL, 0, 1);
|
||||
op_axp_cpu_stop(NULL);
|
||||
}
|
||||
|
||||
|
|
|
@ -310,7 +310,7 @@ menu "Kernel Features"
|
|||
|
||||
config SMP
|
||||
bool "Symmetric Multi-Processing (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL #&& n
|
||||
depends on EXPERIMENTAL && BROKEN #&& n
|
||||
help
|
||||
This enables support for systems with more than one CPU. If you have
|
||||
a system with only one CPU, like most personal computers, say N. If
|
||||
|
@ -635,10 +635,6 @@ config PM
|
|||
and the Battery Powered Linux mini-HOWTO, available from
|
||||
<http://www.tldp.org/docs.html#howto>.
|
||||
|
||||
Note that, even if you say N here, Linux on the x86 architecture
|
||||
will issue the hlt instruction if nothing is to be done, thereby
|
||||
sending the processor to sleep and saving power.
|
||||
|
||||
config APM
|
||||
tristate "Advanced Power Management Emulation"
|
||||
depends on PM
|
||||
|
@ -650,12 +646,6 @@ config APM
|
|||
battery status information, and user-space programs will receive
|
||||
notification of APM "events" (e.g. battery status change).
|
||||
|
||||
If you select "Y" here, you can disable actual use of the APM
|
||||
BIOS by passing the "apm=off" option to the kernel at boot time.
|
||||
|
||||
Note that the APM support is almost completely disabled for
|
||||
machines with more than one CPU.
|
||||
|
||||
In order to use APM, you will need supporting software. For location
|
||||
and more information, read <file:Documentation/pm.txt> and the
|
||||
Battery Powered Linux mini-HOWTO, available from
|
||||
|
@ -665,39 +655,12 @@ config APM
|
|||
manpage ("man 8 hdparm") for that), and it doesn't turn off
|
||||
VESA-compliant "green" monitors.
|
||||
|
||||
This driver does not support the TI 4000M TravelMate and the ACER
|
||||
486/DX4/75 because they don't have compliant BIOSes. Many "green"
|
||||
desktop machines also don't have compliant BIOSes, and this driver
|
||||
may cause those machines to panic during the boot phase.
|
||||
|
||||
Generally, if you don't have a battery in your machine, there isn't
|
||||
much point in using this driver and you should say N. If you get
|
||||
random kernel OOPSes or reboots that don't seem to be related to
|
||||
anything, try disabling/enabling this option (or disabling/enabling
|
||||
APM in your BIOS).
|
||||
|
||||
Some other things you should try when experiencing seemingly random,
|
||||
"weird" problems:
|
||||
|
||||
1) make sure that you have enough swap space and that it is
|
||||
enabled.
|
||||
2) pass the "no-hlt" option to the kernel
|
||||
3) switch on floating point emulation in the kernel and pass
|
||||
the "no387" option to the kernel
|
||||
4) pass the "floppy=nodma" option to the kernel
|
||||
5) pass the "mem=4M" option to the kernel (thereby disabling
|
||||
all but the first 4 MB of RAM)
|
||||
6) make sure that the CPU is not over clocked.
|
||||
7) read the sig11 FAQ at <http://www.bitwizard.nl/sig11/>
|
||||
8) disable the cache from your BIOS settings
|
||||
9) install a fan for the video card or exchange video RAM
|
||||
10) install a better fan for the CPU
|
||||
11) exchange RAM chips
|
||||
12) exchange the motherboard.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called apm.
|
||||
|
||||
endmenu
|
||||
|
||||
source "net/Kconfig"
|
||||
|
@ -752,6 +715,8 @@ source "drivers/hwmon/Kconfig"
|
|||
|
||||
source "drivers/misc/Kconfig"
|
||||
|
||||
source "drivers/mfd/Kconfig"
|
||||
|
||||
source "drivers/media/Kconfig"
|
||||
|
||||
source "drivers/video/Kconfig"
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
config ICST525
|
||||
bool
|
||||
|
||||
config ARM_GIC
|
||||
bool
|
||||
|
||||
config ICST307
|
||||
bool
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
obj-y += rtctime.o
|
||||
obj-$(CONFIG_ARM_AMBA) += amba.o
|
||||
obj-$(CONFIG_ARM_GIC) += gic.o
|
||||
obj-$(CONFIG_ICST525) += icst525.o
|
||||
obj-$(CONFIG_ICST307) += icst307.o
|
||||
obj-$(CONFIG_SA1111) += sa1111.o
|
||||
|
|
166
arch/arm/common/gic.c
Normal file
166
arch/arm/common/gic.c
Normal file
|
@ -0,0 +1,166 @@
|
|||
/*
|
||||
* linux/arch/arm/common/gic.c
|
||||
*
|
||||
* Copyright (C) 2002 ARM Limited, All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* Interrupt architecture for the GIC:
|
||||
*
|
||||
* o There is one Interrupt Distributor, which receives interrupts
|
||||
* from system devices and sends them to the Interrupt Controllers.
|
||||
*
|
||||
* o There is one CPU Interface per CPU, which sends interrupts sent
|
||||
* by the Distributor, and interrupts generated locally, to the
|
||||
* associated CPU.
|
||||
*
|
||||
* Note that IRQs 0-31 are special - they are local to each CPU.
|
||||
* As such, the enable set/clear, pending set/clear and active bit
|
||||
* registers are banked per-cpu for these sources.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/smp.h>
|
||||
|
||||
#include <asm/irq.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/mach/irq.h>
|
||||
#include <asm/hardware/gic.h>
|
||||
|
||||
static void __iomem *gic_dist_base;
|
||||
static void __iomem *gic_cpu_base;
|
||||
|
||||
/*
|
||||
* Routines to acknowledge, disable and enable interrupts
|
||||
*
|
||||
* Linux assumes that when we're done with an interrupt we need to
|
||||
* unmask it, in the same way we need to unmask an interrupt when
|
||||
* we first enable it.
|
||||
*
|
||||
* The GIC has a seperate notion of "end of interrupt" to re-enable
|
||||
* an interrupt after handling, in order to support hardware
|
||||
* prioritisation.
|
||||
*
|
||||
* We can make the GIC behave in the way that Linux expects by making
|
||||
* our "acknowledge" routine disable the interrupt, then mark it as
|
||||
* complete.
|
||||
*/
|
||||
static void gic_ack_irq(unsigned int irq)
|
||||
{
|
||||
u32 mask = 1 << (irq % 32);
|
||||
writel(mask, gic_dist_base + GIC_DIST_ENABLE_CLEAR + (irq / 32) * 4);
|
||||
writel(irq, gic_cpu_base + GIC_CPU_EOI);
|
||||
}
|
||||
|
||||
static void gic_mask_irq(unsigned int irq)
|
||||
{
|
||||
u32 mask = 1 << (irq % 32);
|
||||
writel(mask, gic_dist_base + GIC_DIST_ENABLE_CLEAR + (irq / 32) * 4);
|
||||
}
|
||||
|
||||
static void gic_unmask_irq(unsigned int irq)
|
||||
{
|
||||
u32 mask = 1 << (irq % 32);
|
||||
writel(mask, gic_dist_base + GIC_DIST_ENABLE_SET + (irq / 32) * 4);
|
||||
}
|
||||
|
||||
static void gic_set_cpu(struct irqdesc *desc, unsigned int irq, unsigned int cpu)
|
||||
{
|
||||
void __iomem *reg = gic_dist_base + GIC_DIST_TARGET + (irq & ~3);
|
||||
unsigned int shift = (irq % 4) * 8;
|
||||
u32 val;
|
||||
|
||||
val = readl(reg) & ~(0xff << shift);
|
||||
val |= 1 << (cpu + shift);
|
||||
writel(val, reg);
|
||||
}
|
||||
|
||||
static struct irqchip gic_chip = {
|
||||
.ack = gic_ack_irq,
|
||||
.mask = gic_mask_irq,
|
||||
.unmask = gic_unmask_irq,
|
||||
#ifdef CONFIG_SMP
|
||||
.set_cpu = gic_set_cpu,
|
||||
#endif
|
||||
};
|
||||
|
||||
void __init gic_dist_init(void __iomem *base)
|
||||
{
|
||||
unsigned int max_irq, i;
|
||||
u32 cpumask = 1 << smp_processor_id();
|
||||
|
||||
cpumask |= cpumask << 8;
|
||||
cpumask |= cpumask << 16;
|
||||
|
||||
gic_dist_base = base;
|
||||
|
||||
writel(0, base + GIC_DIST_CTRL);
|
||||
|
||||
/*
|
||||
* Find out how many interrupts are supported.
|
||||
*/
|
||||
max_irq = readl(base + GIC_DIST_CTR) & 0x1f;
|
||||
max_irq = (max_irq + 1) * 32;
|
||||
|
||||
/*
|
||||
* The GIC only supports up to 1020 interrupt sources.
|
||||
* Limit this to either the architected maximum, or the
|
||||
* platform maximum.
|
||||
*/
|
||||
if (max_irq > max(1020, NR_IRQS))
|
||||
max_irq = max(1020, NR_IRQS);
|
||||
|
||||
/*
|
||||
* Set all global interrupts to be level triggered, active low.
|
||||
*/
|
||||
for (i = 32; i < max_irq; i += 16)
|
||||
writel(0, base + GIC_DIST_CONFIG + i * 4 / 16);
|
||||
|
||||
/*
|
||||
* Set all global interrupts to this CPU only.
|
||||
*/
|
||||
for (i = 32; i < max_irq; i += 4)
|
||||
writel(cpumask, base + GIC_DIST_TARGET + i * 4 / 4);
|
||||
|
||||
/*
|
||||
* Set priority on all interrupts.
|
||||
*/
|
||||
for (i = 0; i < max_irq; i += 4)
|
||||
writel(0xa0a0a0a0, base + GIC_DIST_PRI + i * 4 / 4);
|
||||
|
||||
/*
|
||||
* Disable all interrupts.
|
||||
*/
|
||||
for (i = 0; i < max_irq; i += 32)
|
||||
writel(0xffffffff, base + GIC_DIST_ENABLE_CLEAR + i * 4 / 32);
|
||||
|
||||
/*
|
||||
* Setup the Linux IRQ subsystem.
|
||||
*/
|
||||
for (i = 29; i < max_irq; i++) {
|
||||
set_irq_chip(i, &gic_chip);
|
||||
set_irq_handler(i, do_level_IRQ);
|
||||
set_irq_flags(i, IRQF_VALID | IRQF_PROBE);
|
||||
}
|
||||
|
||||
writel(1, base + GIC_DIST_CTRL);
|
||||
}
|
||||
|
||||
void __cpuinit gic_cpu_init(void __iomem *base)
|
||||
{
|
||||
gic_cpu_base = base;
|
||||
writel(0xf0, base + GIC_CPU_PRIMASK);
|
||||
writel(1, base + GIC_CPU_CTRL);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
void gic_raise_softirq(cpumask_t cpumask, unsigned int irq)
|
||||
{
|
||||
unsigned long map = *cpus_addr(cpumask);
|
||||
|
||||
writel(map << 16 | irq, gic_dist_base + GIC_DIST_SOFTINT);
|
||||
}
|
||||
#endif
|
|
@ -327,6 +327,12 @@ __syscall_start:
|
|||
/* 310 */ .long sys_request_key
|
||||
.long sys_keyctl
|
||||
.long sys_semtimedop
|
||||
/* vserver */ .long sys_ni_syscall
|
||||
.long sys_ioprio_set
|
||||
/* 315 */ .long sys_ioprio_get
|
||||
.long sys_inotify_init
|
||||
.long sys_inotify_add_watch
|
||||
.long sys_inotify_rm_watch
|
||||
__syscall_end:
|
||||
|
||||
.rept NR_syscalls - (__syscall_end - __syscall_start) / 4
|
||||
|
|
|
@ -658,10 +658,11 @@ handle_signal(unsigned long sig, struct k_sigaction *ka,
|
|||
/*
|
||||
* Block the signal if we were unsuccessful.
|
||||
*/
|
||||
if (ret != 0 || !(ka->sa.sa_flags & SA_NODEFER)) {
|
||||
if (ret != 0) {
|
||||
spin_lock_irq(&tsk->sighand->siglock);
|
||||
sigorsets(&tsk->blocked, &tsk->blocked,
|
||||
&ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(&tsk->blocked, sig);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(&tsk->sighand->siglock);
|
||||
|
|
|
@ -617,7 +617,7 @@ baddataabort(int code, unsigned long instr, struct pt_regs *regs)
|
|||
notify_die("unknown data abort code", regs, &info, instr, 0);
|
||||
}
|
||||
|
||||
volatile void __bug(const char *file, int line, void *data)
|
||||
void __attribute__((noreturn)) __bug(const char *file, int line, void *data)
|
||||
{
|
||||
printk(KERN_CRIT"kernel BUG at %s:%d!", file, line);
|
||||
if (data)
|
||||
|
|
|
@ -36,7 +36,7 @@ static struct flash_platform_data coyote_flash_data = {
|
|||
|
||||
static struct resource coyote_flash_resource = {
|
||||
.start = COYOTE_FLASH_BASE,
|
||||
.end = COYOTE_FLASH_BASE + COYOTE_FLASH_SIZE,
|
||||
.end = COYOTE_FLASH_BASE + COYOTE_FLASH_SIZE - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
|
|
|
@ -114,7 +114,7 @@ static struct flash_platform_data gtwx5715_flash_data = {
|
|||
|
||||
static struct resource gtwx5715_flash_resource = {
|
||||
.start = GTWX5715_FLASH_BASE,
|
||||
.end = GTWX5715_FLASH_BASE + GTWX5715_FLASH_SIZE,
|
||||
.end = GTWX5715_FLASH_BASE + GTWX5715_FLASH_SIZE - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ static struct flash_platform_data ixdp425_flash_data = {
|
|||
|
||||
static struct resource ixdp425_flash_resource = {
|
||||
.start = IXDP425_FLASH_BASE,
|
||||
.end = IXDP425_FLASH_BASE + IXDP425_FLASH_SIZE,
|
||||
.end = IXDP425_FLASH_BASE + IXDP425_FLASH_SIZE - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
* 28-Sep-2004 BJD Updates for new serial port bits
|
||||
* 04-Nov-2004 BJD Updated UART configuration process
|
||||
* 10-Jan-2005 BJD Removed s3c2410_clock_tick_rate
|
||||
* 13-Aug-2005 DA Removed UART from initial I/O mappings
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
@ -49,10 +50,9 @@ static struct map_desc s3c2410_iodesc[] __initdata = {
|
|||
IODESC_ENT(USBHOST),
|
||||
IODESC_ENT(CLKPWR),
|
||||
IODESC_ENT(LCD),
|
||||
IODESC_ENT(UART),
|
||||
IODESC_ENT(TIMER),
|
||||
IODESC_ENT(ADC),
|
||||
IODESC_ENT(WATCHDOG)
|
||||
IODESC_ENT(WATCHDOG),
|
||||
};
|
||||
|
||||
static struct resource s3c_uart0_resource[] = {
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/serial_sa1100.h>
|
||||
#include <asm/arch/assabet.h>
|
||||
#include <asm/arch/mcp.h>
|
||||
|
||||
#include "generic.h"
|
||||
|
||||
|
@ -198,6 +199,11 @@ static struct irda_platform_data assabet_irda_data = {
|
|||
.set_speed = assabet_irda_set_speed,
|
||||
};
|
||||
|
||||
static struct mcp_plat_data assabet_mcp_data = {
|
||||
.mccr0 = MCCR0_ADM,
|
||||
.sclk_rate = 11981000,
|
||||
};
|
||||
|
||||
static void __init assabet_init(void)
|
||||
{
|
||||
/*
|
||||
|
@ -246,6 +252,7 @@ static void __init assabet_init(void)
|
|||
sa11x0_set_flash_data(&assabet_flash_data, assabet_flash_resources,
|
||||
ARRAY_SIZE(assabet_flash_resources));
|
||||
sa11x0_set_irda_data(&assabet_irda_data);
|
||||
sa11x0_set_mcp_data(&assabet_mcp_data);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include <asm/mach/serial_sa1100.h>
|
||||
|
||||
#include <asm/arch/cerf.h>
|
||||
#include <asm/arch/mcp.h>
|
||||
#include "generic.h"
|
||||
|
||||
static struct resource cerfuart2_resources[] = {
|
||||
|
@ -116,10 +117,16 @@ static void __init cerf_map_io(void)
|
|||
GPDR |= CERF_GPIO_CF_RESET;
|
||||
}
|
||||
|
||||
static struct mcp_plat_data cerf_mcp_data = {
|
||||
.mccr0 = MCCR0_ADM,
|
||||
.sclk_rate = 11981000,
|
||||
};
|
||||
|
||||
static void __init cerf_init(void)
|
||||
{
|
||||
platform_add_devices(cerf_devices, ARRAY_SIZE(cerf_devices));
|
||||
sa11x0_set_flash_data(&cerf_flash_data, &cerf_flash_resource, 1);
|
||||
sa11x0_set_mcp_data(&cerf_mcp_data);
|
||||
}
|
||||
|
||||
MACHINE_START(CERF, "Intrinsyc CerfBoard/CerfCube")
|
||||
|
|
|
@ -221,6 +221,11 @@ static struct platform_device sa11x0mcp_device = {
|
|||
.resource = sa11x0mcp_resources,
|
||||
};
|
||||
|
||||
void sa11x0_set_mcp_data(struct mcp_plat_data *data)
|
||||
{
|
||||
sa11x0mcp_device.dev.platform_data = data;
|
||||
}
|
||||
|
||||
static struct resource sa11x0ssp_resources[] = {
|
||||
[0] = {
|
||||
.start = 0x80070000,
|
||||
|
|
|
@ -34,5 +34,8 @@ struct resource;
|
|||
extern void sa11x0_set_flash_data(struct flash_platform_data *flash,
|
||||
struct resource *res, int nr);
|
||||
|
||||
struct sa11x0_ssp_plat_ops;
|
||||
extern void sa11x0_set_ssp_data(struct sa11x0_ssp_plat_ops *ops);
|
||||
|
||||
struct irda_platform_data;
|
||||
void sa11x0_set_irda_data(struct irda_platform_data *irda);
|
||||
|
|
|
@ -13,12 +13,23 @@
|
|||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/serial_sa1100.h>
|
||||
#include <asm/arch/mcp.h>
|
||||
|
||||
#include "generic.h"
|
||||
|
||||
|
||||
#warning "include/asm/arch-sa1100/ide.h needs fixing for lart"
|
||||
|
||||
static struct mcp_plat_data lart_mcp_data = {
|
||||
.mccr0 = MCCR0_ADM,
|
||||
.sclk_rate = 11981000,
|
||||
};
|
||||
|
||||
static void __init lart_init(void)
|
||||
{
|
||||
sa11x0_set_mcp_data(&lart_mcp_data);
|
||||
}
|
||||
|
||||
static struct map_desc lart_io_desc[] __initdata = {
|
||||
/* virtual physical length type */
|
||||
{ 0xe8000000, 0x00000000, 0x00400000, MT_DEVICE }, /* main flash memory */
|
||||
|
@ -47,5 +58,6 @@ MACHINE_START(LART, "LART")
|
|||
.boot_params = 0xc0000100,
|
||||
.map_io = lart_map_io,
|
||||
.init_irq = sa1100_init_irq,
|
||||
.init_machine = lart_init,
|
||||
.timer = &sa1100_timer,
|
||||
MACHINE_END
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <asm/mach/flash.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/serial_sa1100.h>
|
||||
#include <asm/arch/mcp.h>
|
||||
#include <asm/arch/shannon.h>
|
||||
|
||||
#include "generic.h"
|
||||
|
@ -52,9 +53,15 @@ static struct resource shannon_flash_resource = {
|
|||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
static struct mcp_plat_data shannon_mcp_data = {
|
||||
.mccr0 = MCCR0_ADM,
|
||||
.sclk_rate = 11981000,
|
||||
};
|
||||
|
||||
static void __init shannon_init(void)
|
||||
{
|
||||
sa11x0_set_flash_data(&shannon_flash_data, &shannon_flash_resource, 1);
|
||||
sa11x0_set_mcp_data(&shannon_mcp_data);
|
||||
}
|
||||
|
||||
static void __init shannon_map_io(void)
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <asm/mach/flash.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/serial_sa1100.h>
|
||||
#include <asm/arch/mcp.h>
|
||||
#include <asm/arch/simpad.h>
|
||||
|
||||
#include <linux/serial_core.h>
|
||||
|
@ -123,6 +124,11 @@ static struct resource simpad_flash_resources [] = {
|
|||
}
|
||||
};
|
||||
|
||||
static struct mcp_plat_data simpad_mcp_data = {
|
||||
.mccr0 = MCCR0_ADM,
|
||||
.sclk_rate = 11981000,
|
||||
};
|
||||
|
||||
|
||||
|
||||
static void __init simpad_map_io(void)
|
||||
|
@ -157,6 +163,7 @@ static void __init simpad_map_io(void)
|
|||
|
||||
sa11x0_set_flash_data(&simpad_flash_data, simpad_flash_resources,
|
||||
ARRAY_SIZE(simpad_flash_resources));
|
||||
sa11x0_set_mcp_data(&simpad_mcp_data);
|
||||
}
|
||||
|
||||
static void simpad_power_off(void)
|
||||
|
|
|
@ -384,7 +384,7 @@ config CPU_DCACHE_DISABLE
|
|||
|
||||
config CPU_DCACHE_WRITETHROUGH
|
||||
bool "Force write through D-cache"
|
||||
depends on (CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM1020) && !CPU_DISABLE_DCACHE
|
||||
depends on (CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM1020) && !CPU_DCACHE_DISABLE
|
||||
default y if CPU_ARM925T
|
||||
help
|
||||
Say Y here to use the data cache in writethrough mode. Unless you
|
||||
|
|
|
@ -370,20 +370,20 @@ TABLE 5
|
|||
#define getRoundingMode(opcode) ((opcode & MASK_ROUNDING_MODE) >> 5)
|
||||
|
||||
#ifdef CONFIG_FPE_NWFPE_XP
|
||||
static inline const floatx80 getExtendedConstant(const unsigned int nIndex)
|
||||
static inline __attribute_pure__ floatx80 getExtendedConstant(const unsigned int nIndex)
|
||||
{
|
||||
extern const floatx80 floatx80Constant[];
|
||||
return floatx80Constant[nIndex];
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline const float64 getDoubleConstant(const unsigned int nIndex)
|
||||
static inline __attribute_pure__ float64 getDoubleConstant(const unsigned int nIndex)
|
||||
{
|
||||
extern const float64 float64Constant[];
|
||||
return float64Constant[nIndex];
|
||||
}
|
||||
|
||||
static inline const float32 getSingleConstant(const unsigned int nIndex)
|
||||
static inline __attribute_pure__ float32 getSingleConstant(const unsigned int nIndex)
|
||||
{
|
||||
extern const float32 float32Constant[];
|
||||
return float32Constant[nIndex];
|
||||
|
|
|
@ -1602,9 +1602,7 @@ flag float32_le_quiet( float32 a, float32 b )
|
|||
if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) )
|
||||
|| ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) )
|
||||
) {
|
||||
if ( float32_is_signaling_nan( a ) || float32_is_signaling_nan( b ) ) {
|
||||
float_raise( float_flag_invalid );
|
||||
}
|
||||
/* Do nothing, even if NaN as we're quiet */
|
||||
return 0;
|
||||
}
|
||||
aSign = extractFloat32Sign( a );
|
||||
|
@ -1629,9 +1627,7 @@ flag float32_lt_quiet( float32 a, float32 b )
|
|||
if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) )
|
||||
|| ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) )
|
||||
) {
|
||||
if ( float32_is_signaling_nan( a ) || float32_is_signaling_nan( b ) ) {
|
||||
float_raise( float_flag_invalid );
|
||||
}
|
||||
/* Do nothing, even if NaN as we're quiet */
|
||||
return 0;
|
||||
}
|
||||
aSign = extractFloat32Sign( a );
|
||||
|
@ -2493,9 +2489,7 @@ flag float64_le_quiet( float64 a, float64 b )
|
|||
if ( ( ( extractFloat64Exp( a ) == 0x7FF ) && extractFloat64Frac( a ) )
|
||||
|| ( ( extractFloat64Exp( b ) == 0x7FF ) && extractFloat64Frac( b ) )
|
||||
) {
|
||||
if ( float64_is_signaling_nan( a ) || float64_is_signaling_nan( b ) ) {
|
||||
float_raise( float_flag_invalid );
|
||||
}
|
||||
/* Do nothing, even if NaN as we're quiet */
|
||||
return 0;
|
||||
}
|
||||
aSign = extractFloat64Sign( a );
|
||||
|
@ -2520,9 +2514,7 @@ flag float64_lt_quiet( float64 a, float64 b )
|
|||
if ( ( ( extractFloat64Exp( a ) == 0x7FF ) && extractFloat64Frac( a ) )
|
||||
|| ( ( extractFloat64Exp( b ) == 0x7FF ) && extractFloat64Frac( b ) )
|
||||
) {
|
||||
if ( float64_is_signaling_nan( a ) || float64_is_signaling_nan( b ) ) {
|
||||
float_raise( float_flag_invalid );
|
||||
}
|
||||
/* Do nothing, even if NaN as we're quiet */
|
||||
return 0;
|
||||
}
|
||||
aSign = extractFloat64Sign( a );
|
||||
|
@ -3256,7 +3248,7 @@ flag floatx80_eq( floatx80 a, floatx80 b )
|
|||
) {
|
||||
if ( floatx80_is_signaling_nan( a )
|
||||
|| floatx80_is_signaling_nan( b ) ) {
|
||||
roundData->exception |= float_flag_invalid;
|
||||
float_raise( float_flag_invalid );
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -3286,7 +3278,7 @@ flag floatx80_le( floatx80 a, floatx80 b )
|
|||
|| ( ( extractFloatx80Exp( b ) == 0x7FFF )
|
||||
&& (bits64) ( extractFloatx80Frac( b )<<1 ) )
|
||||
) {
|
||||
roundData->exception |= float_flag_invalid;
|
||||
float_raise( float_flag_invalid );
|
||||
return 0;
|
||||
}
|
||||
aSign = extractFloatx80Sign( a );
|
||||
|
@ -3320,7 +3312,7 @@ flag floatx80_lt( floatx80 a, floatx80 b )
|
|||
|| ( ( extractFloatx80Exp( b ) == 0x7FFF )
|
||||
&& (bits64) ( extractFloatx80Frac( b )<<1 ) )
|
||||
) {
|
||||
roundData->exception |= float_flag_invalid;
|
||||
float_raise( float_flag_invalid );
|
||||
return 0;
|
||||
}
|
||||
aSign = extractFloatx80Sign( a );
|
||||
|
@ -3353,7 +3345,7 @@ flag floatx80_eq_signaling( floatx80 a, floatx80 b )
|
|||
|| ( ( extractFloatx80Exp( b ) == 0x7FFF )
|
||||
&& (bits64) ( extractFloatx80Frac( b )<<1 ) )
|
||||
) {
|
||||
roundData->exception |= float_flag_invalid;
|
||||
float_raise( float_flag_invalid );
|
||||
return 0;
|
||||
}
|
||||
return
|
||||
|
@ -3382,10 +3374,7 @@ flag floatx80_le_quiet( floatx80 a, floatx80 b )
|
|||
|| ( ( extractFloatx80Exp( b ) == 0x7FFF )
|
||||
&& (bits64) ( extractFloatx80Frac( b )<<1 ) )
|
||||
) {
|
||||
if ( floatx80_is_signaling_nan( a )
|
||||
|| floatx80_is_signaling_nan( b ) ) {
|
||||
roundData->exception |= float_flag_invalid;
|
||||
}
|
||||
/* Do nothing, even if NaN as we're quiet */
|
||||
return 0;
|
||||
}
|
||||
aSign = extractFloatx80Sign( a );
|
||||
|
@ -3419,10 +3408,7 @@ flag floatx80_lt_quiet( floatx80 a, floatx80 b )
|
|||
|| ( ( extractFloatx80Exp( b ) == 0x7FFF )
|
||||
&& (bits64) ( extractFloatx80Frac( b )<<1 ) )
|
||||
) {
|
||||
if ( floatx80_is_signaling_nan( a )
|
||||
|| floatx80_is_signaling_nan( b ) ) {
|
||||
roundData->exception |= float_flag_invalid;
|
||||
}
|
||||
/* Do nothing, even if NaN as we're quiet */
|
||||
return 0;
|
||||
}
|
||||
aSign = extractFloatx80Sign( a );
|
||||
|
|
|
@ -454,14 +454,13 @@ handle_signal(unsigned long sig, siginfo_t *info, sigset_t *oldset,
|
|||
if (ka->sa.sa_flags & SA_ONESHOT)
|
||||
ka->sa.sa_handler = SIG_DFL;
|
||||
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER)) {
|
||||
spin_lock_irq(&tsk->sighand->siglock);
|
||||
sigorsets(&tsk->blocked, &tsk->blocked,
|
||||
&ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(&tsk->blocked, sig);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(&tsk->sighand->siglock);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -517,14 +517,13 @@ handle_signal(int canrestart, unsigned long sig,
|
|||
if (ka->sa.sa_flags & SA_ONESHOT)
|
||||
ka->sa.sa_handler = SIG_DFL;
|
||||
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER)) {
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(¤t->blocked,sig);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Note that 'init' is a special process: it doesn't get signals it doesn't
|
||||
|
|
|
@ -568,14 +568,13 @@ handle_signal(int canrestart, unsigned long sig,
|
|||
if (ka->sa.sa_flags & SA_ONESHOT)
|
||||
ka->sa.sa_handler = SIG_DFL;
|
||||
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER)) {
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(¤t->blocked,sig);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Note that 'init' is a special process: it doesn't get signals it doesn't
|
||||
|
|
|
@ -506,13 +506,12 @@ static void handle_signal(unsigned long sig, siginfo_t *info,
|
|||
else
|
||||
setup_frame(sig, ka, oldset, regs);
|
||||
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER)) {
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
sigorsets(¤t->blocked, ¤t->blocked, &ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(¤t->blocked, sig);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
}
|
||||
} /* end handle_signal() */
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -488,14 +488,13 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
|
|||
else
|
||||
setup_frame(sig, ka, oldset, regs);
|
||||
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER)) {
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(¤t->blocked,sig);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Note that 'init' is a special process: it doesn't get signals it doesn't
|
||||
|
|
|
@ -726,15 +726,11 @@ __setup("apic=", apic_set_verbosity);
|
|||
static int __init detect_init_APIC (void)
|
||||
{
|
||||
u32 h, l, features;
|
||||
extern void get_cpu_vendor(struct cpuinfo_x86*);
|
||||
|
||||
/* Disabled by kernel option? */
|
||||
if (enable_local_apic < 0)
|
||||
return -1;
|
||||
|
||||
/* Workaround for us being called before identify_cpu(). */
|
||||
get_cpu_vendor(&boot_cpu_data);
|
||||
|
||||
switch (boot_cpu_data.x86_vendor) {
|
||||
case X86_VENDOR_AMD:
|
||||
if ((boot_cpu_data.x86 == 6 && boot_cpu_data.x86_model > 1) ||
|
||||
|
|
|
@ -195,7 +195,7 @@ static void disable_lapic_nmi_watchdog(void)
|
|||
wrmsr(MSR_P6_EVNTSEL0, 0, 0);
|
||||
break;
|
||||
case 15:
|
||||
if (boot_cpu_data.x86_model > 0x3)
|
||||
if (boot_cpu_data.x86_model > 0x4)
|
||||
break;
|
||||
|
||||
wrmsr(MSR_P4_IQ_CCCR0, 0, 0);
|
||||
|
@ -432,7 +432,7 @@ void setup_apic_nmi_watchdog (void)
|
|||
setup_p6_watchdog();
|
||||
break;
|
||||
case 15:
|
||||
if (boot_cpu_data.x86_model > 0x3)
|
||||
if (boot_cpu_data.x86_model > 0x4)
|
||||
return;
|
||||
|
||||
if (!setup_p4_watchdog())
|
||||
|
|
|
@ -577,9 +577,10 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
|
|||
else
|
||||
ret = setup_frame(sig, ka, oldset, regs);
|
||||
|
||||
if (ret && !(ka->sa.sa_flags & SA_NODEFER)) {
|
||||
if (ret) {
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(¤t->blocked,sig);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
|
|
|
@ -803,15 +803,17 @@ void math_error(void __user *eip)
|
|||
*/
|
||||
cwd = get_fpu_cwd(task);
|
||||
swd = get_fpu_swd(task);
|
||||
switch (((~cwd) & swd & 0x3f) | (swd & 0x240)) {
|
||||
switch (swd & ~cwd & 0x3f) {
|
||||
case 0x000:
|
||||
default:
|
||||
break;
|
||||
case 0x001: /* Invalid Op */
|
||||
case 0x041: /* Stack Fault */
|
||||
case 0x241: /* Stack Fault | Direction */
|
||||
/*
|
||||
* swd & 0x240 == 0x040: Stack Underflow
|
||||
* swd & 0x240 == 0x240: Stack Overflow
|
||||
* User must clear the SF bit (0x40) if set
|
||||
*/
|
||||
info.si_code = FPE_FLTINV;
|
||||
/* Should we clear the SF or let user space do it ???? */
|
||||
break;
|
||||
case 0x002: /* Denormalize */
|
||||
case 0x010: /* Underflow */
|
||||
|
|
|
@ -392,15 +392,8 @@ menu "Bus options (PCI, PCMCIA)"
|
|||
config PCI
|
||||
bool "PCI support"
|
||||
help
|
||||
Find out whether you have a PCI motherboard. PCI is the name of a
|
||||
bus system, i.e. the way the CPU talks to the other stuff inside
|
||||
your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or
|
||||
VESA. If you have PCI, say Y, otherwise N.
|
||||
|
||||
The PCI-HOWTO, available from
|
||||
<http://www.tldp.org/docs.html#howto>, contains valuable
|
||||
information about which PCI hardware does work under Linux and which
|
||||
doesn't.
|
||||
Real IA-64 machines all have PCI/PCI-X/PCI Express busses. Say Y
|
||||
here unless you are using a simulator without PCI support.
|
||||
|
||||
config PCI_DOMAINS
|
||||
bool
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.10
|
||||
# Mon Jan 10 13:57:35 2005
|
||||
# Linux kernel version: 2.6.13-rc6
|
||||
# Tue Aug 16 14:40:41 2005
|
||||
#
|
||||
|
||||
#
|
||||
|
@ -10,6 +10,7 @@
|
|||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_CLEAN_COMPILE=y
|
||||
CONFIG_LOCK_KERNEL=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
|
@ -21,24 +22,26 @@ CONFIG_POSIX_MQUEUE=y
|
|||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_AUDIT is not set
|
||||
CONFIG_LOG_BUF_SHIFT=20
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_KOBJECT_UEVENT=y
|
||||
# CONFIG_IKCONFIG is not set
|
||||
CONFIG_CPUSETS=y
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_KALLSYMS=y
|
||||
CONFIG_KALLSYMS_ALL=y
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_CPUSETS=y
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_CC_ALIGN_FUNCTIONS=0
|
||||
CONFIG_CC_ALIGN_LABELS=0
|
||||
CONFIG_CC_ALIGN_LOOPS=0
|
||||
CONFIG_CC_ALIGN_JUMPS=0
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
|
||||
#
|
||||
# Loadable module support
|
||||
|
@ -63,9 +66,12 @@ CONFIG_GENERIC_CALIBRATE_DELAY=y
|
|||
CONFIG_TIME_INTERPOLATION=y
|
||||
CONFIG_EFI=y
|
||||
CONFIG_GENERIC_IOMAP=y
|
||||
CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
|
||||
CONFIG_IA64_UNCACHED_ALLOCATOR=y
|
||||
# CONFIG_IA64_GENERIC is not set
|
||||
# CONFIG_IA64_DIG is not set
|
||||
# CONFIG_IA64_HP_ZX1 is not set
|
||||
# CONFIG_IA64_HP_ZX1_SWIOTLB is not set
|
||||
CONFIG_IA64_SGI_SN2=y
|
||||
# CONFIG_IA64_HP_SIM is not set
|
||||
# CONFIG_ITANIUM is not set
|
||||
|
@ -74,6 +80,10 @@ CONFIG_MCKINLEY=y
|
|||
# CONFIG_IA64_PAGE_SIZE_8KB is not set
|
||||
CONFIG_IA64_PAGE_SIZE_16KB=y
|
||||
# CONFIG_IA64_PAGE_SIZE_64KB is not set
|
||||
# CONFIG_HZ_100 is not set
|
||||
CONFIG_HZ_250=y
|
||||
# CONFIG_HZ_1000 is not set
|
||||
CONFIG_HZ=250
|
||||
CONFIG_IA64_L1_CACHE_SHIFT=7
|
||||
CONFIG_NUMA=y
|
||||
CONFIG_VIRTUAL_MEM_MAP=y
|
||||
|
@ -81,11 +91,20 @@ CONFIG_HOLES_IN_ZONE=y
|
|||
CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
|
||||
# CONFIG_IA64_CYCLONE is not set
|
||||
CONFIG_IOSAPIC=y
|
||||
CONFIG_IA64_SGI_SN_XP=m
|
||||
CONFIG_FORCE_MAX_ZONEORDER=18
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=512
|
||||
# CONFIG_HOTPLUG_CPU is not set
|
||||
CONFIG_SCHED_SMT=y
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
# CONFIG_FLATMEM_MANUAL is not set
|
||||
CONFIG_DISCONTIGMEM_MANUAL=y
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_DISCONTIGMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
CONFIG_NEED_MULTIPLE_NODES=y
|
||||
CONFIG_HAVE_DEC_LOCK=y
|
||||
CONFIG_IA32_SUPPORT=y
|
||||
CONFIG_COMPAT=y
|
||||
|
@ -105,6 +124,7 @@ CONFIG_BINFMT_ELF=y
|
|||
#
|
||||
# Power management and ACPI
|
||||
#
|
||||
CONFIG_PM=y
|
||||
CONFIG_ACPI=y
|
||||
|
||||
#
|
||||
|
@ -114,6 +134,7 @@ CONFIG_ACPI_BOOT=y
|
|||
CONFIG_ACPI_INTERPRETER=y
|
||||
# CONFIG_ACPI_BUTTON is not set
|
||||
CONFIG_ACPI_VIDEO=m
|
||||
CONFIG_ACPI_HOTKEY=m
|
||||
# CONFIG_ACPI_FAN is not set
|
||||
# CONFIG_ACPI_PROCESSOR is not set
|
||||
CONFIG_ACPI_NUMA=y
|
||||
|
@ -133,6 +154,7 @@ CONFIG_PCI_DOMAINS=y
|
|||
# CONFIG_PCI_MSI is not set
|
||||
CONFIG_PCI_LEGACY_PROC=y
|
||||
CONFIG_PCI_NAMES=y
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
# PCI Hotplug Support
|
||||
|
@ -141,7 +163,6 @@ CONFIG_HOTPLUG_PCI=y
|
|||
# CONFIG_HOTPLUG_PCI_FAKE is not set
|
||||
# CONFIG_HOTPLUG_PCI_ACPI is not set
|
||||
# CONFIG_HOTPLUG_PCI_CPCI is not set
|
||||
# CONFIG_HOTPLUG_PCI_PCIE is not set
|
||||
# CONFIG_HOTPLUG_PCI_SHPC is not set
|
||||
CONFIG_HOTPLUG_PCI_SGI=y
|
||||
|
||||
|
@ -151,8 +172,70 @@ CONFIG_HOTPLUG_PCI_SGI=y
|
|||
# CONFIG_PCCARD is not set
|
||||
|
||||
#
|
||||
# PC-card bridges
|
||||
# Networking
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_PACKET_MMAP=y
|
||||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
# CONFIG_IP_PNP is not set
|
||||
# CONFIG_NET_IPIP is not set
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_IP_MROUTE is not set
|
||||
# CONFIG_ARPD is not set
|
||||
CONFIG_SYN_COOKIES=y
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
CONFIG_IP_TCPDIAG=y
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
CONFIG_IPV6=m
|
||||
# CONFIG_IPV6_PRIVACY is not set
|
||||
# CONFIG_INET6_AH is not set
|
||||
# CONFIG_INET6_ESP is not set
|
||||
# CONFIG_INET6_IPCOMP is not set
|
||||
# CONFIG_INET6_TUNNEL is not set
|
||||
# CONFIG_IPV6_TUNNEL is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_SCTP is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
|
@ -163,7 +246,7 @@ CONFIG_HOTPLUG_PCI_SGI=y
|
|||
#
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
CONFIG_FW_LOADER=m
|
||||
CONFIG_FW_LOADER=y
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
|
||||
#
|
||||
|
@ -188,6 +271,7 @@ CONFIG_FW_LOADER=m
|
|||
# CONFIG_BLK_CPQ_CISS_DA is not set
|
||||
# CONFIG_BLK_DEV_DAC960 is not set
|
||||
# CONFIG_BLK_DEV_UMEM is not set
|
||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_CRYPTOLOOP=m
|
||||
CONFIG_BLK_DEV_NBD=m
|
||||
|
@ -252,6 +336,7 @@ CONFIG_IDEDMA_PCI_AUTO=y
|
|||
# CONFIG_BLK_DEV_HPT366 is not set
|
||||
# CONFIG_BLK_DEV_SC1200 is not set
|
||||
# CONFIG_BLK_DEV_PIIX is not set
|
||||
# CONFIG_BLK_DEV_IT821X is not set
|
||||
# CONFIG_BLK_DEV_NS87415 is not set
|
||||
# CONFIG_BLK_DEV_PDC202XX_OLD is not set
|
||||
# CONFIG_BLK_DEV_PDC202XX_NEW is not set
|
||||
|
@ -282,6 +367,7 @@ CONFIG_CHR_DEV_ST=m
|
|||
CONFIG_BLK_DEV_SR=m
|
||||
# CONFIG_BLK_DEV_SR_VENDOR is not set
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
CONFIG_CHR_DEV_SCH=m
|
||||
|
||||
#
|
||||
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
|
||||
|
@ -315,24 +401,20 @@ CONFIG_SCSI_SATA=y
|
|||
# CONFIG_SCSI_ATA_PIIX is not set
|
||||
# CONFIG_SCSI_SATA_NV is not set
|
||||
# CONFIG_SCSI_SATA_PROMISE is not set
|
||||
# CONFIG_SCSI_SATA_QSTOR is not set
|
||||
# CONFIG_SCSI_SATA_SX4 is not set
|
||||
# CONFIG_SCSI_SATA_SIL is not set
|
||||
# CONFIG_SCSI_SATA_SIS is not set
|
||||
# CONFIG_SCSI_SATA_ULI is not set
|
||||
# CONFIG_SCSI_SATA_VIA is not set
|
||||
CONFIG_SCSI_SATA_VITESSE=y
|
||||
# CONFIG_SCSI_BUSLOGIC is not set
|
||||
# CONFIG_SCSI_DMX3191D is not set
|
||||
# CONFIG_SCSI_EATA is not set
|
||||
# CONFIG_SCSI_EATA_PIO is not set
|
||||
# CONFIG_SCSI_FUTURE_DOMAIN is not set
|
||||
# CONFIG_SCSI_GDTH is not set
|
||||
# CONFIG_SCSI_IPS is not set
|
||||
# CONFIG_SCSI_INITIO is not set
|
||||
# CONFIG_SCSI_INIA100 is not set
|
||||
# CONFIG_SCSI_SYM53C8XX_2 is not set
|
||||
# CONFIG_SCSI_IPR is not set
|
||||
# CONFIG_SCSI_QLOGIC_ISP is not set
|
||||
# CONFIG_SCSI_QLOGIC_FC is not set
|
||||
CONFIG_SCSI_QLOGIC_1280=y
|
||||
# CONFIG_SCSI_QLOGIC_1280_1040 is not set
|
||||
|
@ -342,6 +424,8 @@ CONFIG_SCSI_QLA22XX=y
|
|||
CONFIG_SCSI_QLA2300=y
|
||||
CONFIG_SCSI_QLA2322=y
|
||||
# CONFIG_SCSI_QLA6312 is not set
|
||||
# CONFIG_SCSI_QLA24XX is not set
|
||||
# CONFIG_SCSI_LPFC is not set
|
||||
# CONFIG_SCSI_DC395x is not set
|
||||
# CONFIG_SCSI_DC390T is not set
|
||||
# CONFIG_SCSI_DEBUG is not set
|
||||
|
@ -364,11 +448,15 @@ CONFIG_DM_CRYPT=m
|
|||
CONFIG_DM_SNAPSHOT=m
|
||||
CONFIG_DM_MIRROR=m
|
||||
CONFIG_DM_ZERO=m
|
||||
CONFIG_DM_MULTIPATH=m
|
||||
CONFIG_DM_MULTIPATH_EMC=m
|
||||
|
||||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
CONFIG_FUSION=y
|
||||
CONFIG_FUSION_SPI=y
|
||||
CONFIG_FUSION_FC=y
|
||||
CONFIG_FUSION_MAX_SGE=128
|
||||
CONFIG_FUSION_CTL=m
|
||||
|
||||
|
@ -383,82 +471,13 @@ CONFIG_FUSION_CTL=m
|
|||
# CONFIG_I2O is not set
|
||||
|
||||
#
|
||||
# Networking support
|
||||
# Network device support
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_PACKET_MMAP=y
|
||||
CONFIG_NETLINK_DEV=y
|
||||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
# CONFIG_IP_PNP is not set
|
||||
# CONFIG_NET_IPIP is not set
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_IP_MROUTE is not set
|
||||
# CONFIG_ARPD is not set
|
||||
CONFIG_SYN_COOKIES=y
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
CONFIG_IP_TCPDIAG=y
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
CONFIG_IPV6=m
|
||||
# CONFIG_IPV6_PRIVACY is not set
|
||||
# CONFIG_INET6_AH is not set
|
||||
# CONFIG_INET6_ESP is not set
|
||||
# CONFIG_INET6_IPCOMP is not set
|
||||
# CONFIG_INET6_TUNNEL is not set
|
||||
# CONFIG_IPV6_TUNNEL is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_SCTP is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
CONFIG_NETPOLL=y
|
||||
# CONFIG_NETPOLL_RX is not set
|
||||
# CONFIG_NETPOLL_TRAP is not set
|
||||
CONFIG_NET_POLL_CONTROLLER=y
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_DUMMY is not set
|
||||
# CONFIG_BONDING is not set
|
||||
# CONFIG_EQUALIZER is not set
|
||||
# CONFIG_TUN is not set
|
||||
# CONFIG_ETHERTAP is not set
|
||||
|
||||
#
|
||||
# ARCnet devices
|
||||
|
@ -480,8 +499,10 @@ CONFIG_NETDEVICES=y
|
|||
# CONFIG_HAMACHI is not set
|
||||
# CONFIG_YELLOWFIN is not set
|
||||
# CONFIG_R8169 is not set
|
||||
# CONFIG_SKGE is not set
|
||||
# CONFIG_SK98LIN is not set
|
||||
CONFIG_TIGON3=y
|
||||
# CONFIG_BNX2 is not set
|
||||
|
||||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
|
@ -512,6 +533,10 @@ CONFIG_S2IO=m
|
|||
# CONFIG_NET_FC is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
CONFIG_NETCONSOLE=y
|
||||
CONFIG_NETPOLL=y
|
||||
# CONFIG_NETPOLL_RX is not set
|
||||
# CONFIG_NETPOLL_TRAP is not set
|
||||
CONFIG_NET_POLL_CONTROLLER=y
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
|
@ -540,14 +565,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
|||
# CONFIG_INPUT_EVDEV is not set
|
||||
# CONFIG_INPUT_EVBUG is not set
|
||||
|
||||
#
|
||||
# Input I/O drivers
|
||||
#
|
||||
# CONFIG_GAMEPORT is not set
|
||||
CONFIG_SOUND_GAMEPORT=y
|
||||
# CONFIG_SERIO is not set
|
||||
# CONFIG_SERIO_I8042 is not set
|
||||
|
||||
#
|
||||
# Input Device Drivers
|
||||
#
|
||||
|
@ -557,6 +574,12 @@ CONFIG_SOUND_GAMEPORT=y
|
|||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||
# CONFIG_INPUT_MISC is not set
|
||||
|
||||
#
|
||||
# Hardware I/O ports
|
||||
#
|
||||
# CONFIG_SERIO is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
|
||||
#
|
||||
# Character devices
|
||||
#
|
||||
|
@ -568,9 +591,10 @@ CONFIG_SERIAL_NONSTANDARD=y
|
|||
# CONFIG_CYCLADES is not set
|
||||
# CONFIG_MOXA_SMARTIO is not set
|
||||
# CONFIG_ISI is not set
|
||||
# CONFIG_SYNCLINK is not set
|
||||
# CONFIG_SYNCLINKMP is not set
|
||||
# CONFIG_N_HDLC is not set
|
||||
# CONFIG_SPECIALIX is not set
|
||||
# CONFIG_SX is not set
|
||||
# CONFIG_STALDRV is not set
|
||||
CONFIG_SGI_SNSC=y
|
||||
CONFIG_SGI_TIOCX=y
|
||||
|
@ -587,6 +611,7 @@ CONFIG_SGI_MBCS=m
|
|||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
CONFIG_SERIAL_SGI_L1_CONSOLE=y
|
||||
# CONFIG_SERIAL_JSM is not set
|
||||
CONFIG_SERIAL_SGI_IOC4=y
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
|
@ -615,18 +640,30 @@ CONFIG_EFI_RTC=y
|
|||
CONFIG_RAW_DRIVER=m
|
||||
# CONFIG_HPET is not set
|
||||
CONFIG_MAX_RAW_DEVS=256
|
||||
# CONFIG_HANGCHECK_TIMER is not set
|
||||
CONFIG_MMTIMER=y
|
||||
|
||||
#
|
||||
# TPM devices
|
||||
#
|
||||
# CONFIG_TCG_TPM is not set
|
||||
|
||||
#
|
||||
# I2C support
|
||||
#
|
||||
# CONFIG_I2C is not set
|
||||
# CONFIG_I2C_SENSOR is not set
|
||||
|
||||
#
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
# CONFIG_W1 is not set
|
||||
|
||||
#
|
||||
# Hardware Monitoring support
|
||||
#
|
||||
# CONFIG_HWMON is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
#
|
||||
|
@ -660,6 +697,8 @@ CONFIG_DUMMY_CONSOLE=y
|
|||
#
|
||||
# USB support
|
||||
#
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
CONFIG_USB=m
|
||||
# CONFIG_USB_DEBUG is not set
|
||||
|
||||
|
@ -669,9 +708,8 @@ CONFIG_USB=m
|
|||
# CONFIG_USB_DEVICEFS is not set
|
||||
# CONFIG_USB_BANDWIDTH is not set
|
||||
# CONFIG_USB_DYNAMIC_MINORS is not set
|
||||
# CONFIG_USB_SUSPEND is not set
|
||||
# CONFIG_USB_OTG is not set
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
|
||||
#
|
||||
# USB Host Controller Drivers
|
||||
|
@ -679,7 +717,10 @@ CONFIG_USB_ARCH_HAS_OHCI=y
|
|||
CONFIG_USB_EHCI_HCD=m
|
||||
# CONFIG_USB_EHCI_SPLIT_ISO is not set
|
||||
# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
|
||||
# CONFIG_USB_ISP116X_HCD is not set
|
||||
CONFIG_USB_OHCI_HCD=m
|
||||
# CONFIG_USB_OHCI_BIG_ENDIAN is not set
|
||||
CONFIG_USB_OHCI_LITTLE_ENDIAN=y
|
||||
CONFIG_USB_UHCI_HCD=m
|
||||
# CONFIG_USB_SL811_HCD is not set
|
||||
|
||||
|
@ -710,12 +751,15 @@ CONFIG_USB_HIDINPUT=y
|
|||
# CONFIG_USB_MOUSE is not set
|
||||
# CONFIG_USB_AIPTEK is not set
|
||||
# CONFIG_USB_WACOM is not set
|
||||
# CONFIG_USB_ACECAD is not set
|
||||
# CONFIG_USB_KBTAB is not set
|
||||
# CONFIG_USB_POWERMATE is not set
|
||||
# CONFIG_USB_MTOUCH is not set
|
||||
# CONFIG_USB_ITMTOUCH is not set
|
||||
# CONFIG_USB_EGALAX is not set
|
||||
# CONFIG_USB_XPAD is not set
|
||||
# CONFIG_USB_ATI_REMOTE is not set
|
||||
# CONFIG_USB_KEYSPAN_REMOTE is not set
|
||||
|
||||
#
|
||||
# USB Imaging devices
|
||||
|
@ -740,6 +784,7 @@ CONFIG_USB_HIDINPUT=y
|
|||
# CONFIG_USB_PEGASUS is not set
|
||||
# CONFIG_USB_RTL8150 is not set
|
||||
# CONFIG_USB_USBNET is not set
|
||||
CONFIG_USB_MON=y
|
||||
|
||||
#
|
||||
# USB port drivers
|
||||
|
@ -763,9 +808,12 @@ CONFIG_USB_HIDINPUT=y
|
|||
# CONFIG_USB_CYTHERM is not set
|
||||
# CONFIG_USB_PHIDGETKIT is not set
|
||||
# CONFIG_USB_PHIDGETSERVO is not set
|
||||
# CONFIG_USB_IDMOUSE is not set
|
||||
# CONFIG_USB_SISUSBVGA is not set
|
||||
# CONFIG_USB_LD is not set
|
||||
|
||||
#
|
||||
# USB ATM/DSL drivers
|
||||
# USB DSL modem support
|
||||
#
|
||||
|
||||
#
|
||||
|
@ -782,6 +830,7 @@ CONFIG_USB_HIDINPUT=y
|
|||
# InfiniBand support
|
||||
#
|
||||
CONFIG_INFINIBAND=m
|
||||
CONFIG_INFINIBAND_USER_VERBS=m
|
||||
CONFIG_INFINIBAND_MTHCA=m
|
||||
# CONFIG_INFINIBAND_MTHCA_DEBUG is not set
|
||||
CONFIG_INFINIBAND_IPOIB=m
|
||||
|
@ -799,6 +848,7 @@ CONFIG_EXT2_FS=y
|
|||
CONFIG_EXT2_FS_XATTR=y
|
||||
CONFIG_EXT2_FS_POSIX_ACL=y
|
||||
CONFIG_EXT2_FS_SECURITY=y
|
||||
# CONFIG_EXT2_FS_XIP is not set
|
||||
CONFIG_EXT3_FS=y
|
||||
CONFIG_EXT3_FS_XATTR=y
|
||||
CONFIG_EXT3_FS_POSIX_ACL=y
|
||||
|
@ -814,13 +864,19 @@ CONFIG_REISERFS_FS_POSIX_ACL=y
|
|||
CONFIG_REISERFS_FS_SECURITY=y
|
||||
# CONFIG_JFS_FS is not set
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
|
||||
#
|
||||
# XFS support
|
||||
#
|
||||
CONFIG_XFS_FS=y
|
||||
CONFIG_XFS_EXPORT=y
|
||||
CONFIG_XFS_RT=y
|
||||
CONFIG_XFS_QUOTA=y
|
||||
# CONFIG_XFS_SECURITY is not set
|
||||
CONFIG_XFS_POSIX_ACL=y
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_QUOTA=y
|
||||
# CONFIG_QFMT_V1 is not set
|
||||
# CONFIG_QFMT_V2 is not set
|
||||
|
@ -854,7 +910,6 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
|
|||
CONFIG_PROC_FS=y
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_DEVFS_FS is not set
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_TMPFS_XATTR=y
|
||||
|
@ -885,15 +940,18 @@ CONFIG_RAMFS=y
|
|||
#
|
||||
CONFIG_NFS_FS=m
|
||||
CONFIG_NFS_V3=y
|
||||
# CONFIG_NFS_V3_ACL is not set
|
||||
CONFIG_NFS_V4=y
|
||||
CONFIG_NFS_DIRECTIO=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
# CONFIG_NFSD_V3_ACL is not set
|
||||
CONFIG_NFSD_V4=y
|
||||
CONFIG_NFSD_TCP=y
|
||||
CONFIG_LOCKD=m
|
||||
CONFIG_LOCKD_V4=y
|
||||
CONFIG_EXPORTFS=m
|
||||
CONFIG_EXPORTFS=y
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=m
|
||||
CONFIG_SUNRPC_GSS=m
|
||||
CONFIG_RPCSEC_GSS_KRB5=m
|
||||
|
@ -980,6 +1038,9 @@ CONFIG_CRC32=y
|
|||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=m
|
||||
CONFIG_ZLIB_DEFLATE=m
|
||||
CONFIG_GENERIC_ALLOCATOR=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_GENERIC_IRQ_PROBE=y
|
||||
|
||||
#
|
||||
# Profiling support
|
||||
|
@ -989,15 +1050,19 @@ CONFIG_ZLIB_DEFLATE=m
|
|||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_LOG_BUF_SHIFT=20
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
CONFIG_DEBUG_PREEMPT=y
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_KPROBES is not set
|
||||
CONFIG_IA64_GRANULE_16MB=y
|
||||
# CONFIG_IA64_GRANULE_64MB is not set
|
||||
# CONFIG_IA64_PRINT_HAZARDS is not set
|
||||
|
@ -1019,11 +1084,12 @@ CONFIG_CRYPTO=y
|
|||
CONFIG_CRYPTO_HMAC=y
|
||||
# CONFIG_CRYPTO_NULL is not set
|
||||
# CONFIG_CRYPTO_MD4 is not set
|
||||
CONFIG_CRYPTO_MD5=m
|
||||
CONFIG_CRYPTO_MD5=y
|
||||
CONFIG_CRYPTO_SHA1=m
|
||||
# CONFIG_CRYPTO_SHA256 is not set
|
||||
# CONFIG_CRYPTO_SHA512 is not set
|
||||
# CONFIG_CRYPTO_WP512 is not set
|
||||
# CONFIG_CRYPTO_TGR192 is not set
|
||||
CONFIG_CRYPTO_DES=m
|
||||
# CONFIG_CRYPTO_BLOWFISH is not set
|
||||
# CONFIG_CRYPTO_TWOFISH is not set
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13-rc1-20050629
|
||||
# Wed Jun 29 15:28:12 2005
|
||||
# Linux kernel version: 2.6.13-rc6-tiger-smp
|
||||
# Wed Aug 17 10:19:51 2005
|
||||
#
|
||||
|
||||
#
|
||||
|
@ -132,6 +132,7 @@ CONFIG_ACPI_BOOT=y
|
|||
CONFIG_ACPI_INTERPRETER=y
|
||||
CONFIG_ACPI_BUTTON=m
|
||||
# CONFIG_ACPI_VIDEO is not set
|
||||
# CONFIG_ACPI_HOTKEY is not set
|
||||
CONFIG_ACPI_FAN=m
|
||||
CONFIG_ACPI_PROCESSOR=m
|
||||
# CONFIG_ACPI_HOTPLUG_CPU is not set
|
||||
|
@ -169,6 +170,66 @@ CONFIG_HOTPLUG_PCI_ACPI=m
|
|||
#
|
||||
# CONFIG_PCCARD is not set
|
||||
|
||||
#
|
||||
# Networking
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
CONFIG_PACKET=y
|
||||
# CONFIG_PACKET_MMAP is not set
|
||||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
# CONFIG_IP_PNP is not set
|
||||
# CONFIG_NET_IPIP is not set
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_IP_MROUTE is not set
|
||||
CONFIG_ARPD=y
|
||||
CONFIG_SYN_COOKIES=y
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
CONFIG_IP_TCPDIAG=y
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_SCTP is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
@ -178,7 +239,7 @@ CONFIG_HOTPLUG_PCI_ACPI=m
|
|||
#
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
CONFIG_FW_LOADER=m
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
|
||||
#
|
||||
|
@ -348,6 +409,7 @@ CONFIG_SCSI_QLA22XX=m
|
|||
CONFIG_SCSI_QLA2300=m
|
||||
CONFIG_SCSI_QLA2322=m
|
||||
# CONFIG_SCSI_QLA6312 is not set
|
||||
# CONFIG_SCSI_QLA24XX is not set
|
||||
# CONFIG_SCSI_LPFC is not set
|
||||
# CONFIG_SCSI_DC395x is not set
|
||||
# CONFIG_SCSI_DC390T is not set
|
||||
|
@ -393,72 +455,8 @@ CONFIG_FUSION_CTL=y
|
|||
# CONFIG_I2O is not set
|
||||
|
||||
#
|
||||
# Networking support
|
||||
# Network device support
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
CONFIG_PACKET=y
|
||||
# CONFIG_PACKET_MMAP is not set
|
||||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
# CONFIG_IP_PNP is not set
|
||||
# CONFIG_NET_IPIP is not set
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_IP_MROUTE is not set
|
||||
CONFIG_ARPD=y
|
||||
CONFIG_SYN_COOKIES=y
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
CONFIG_IP_TCPDIAG=y
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_SCTP is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
CONFIG_NETPOLL=y
|
||||
# CONFIG_NETPOLL_RX is not set
|
||||
# CONFIG_NETPOLL_TRAP is not set
|
||||
CONFIG_NET_POLL_CONTROLLER=y
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_DUMMY=m
|
||||
# CONFIG_BONDING is not set
|
||||
|
@ -555,6 +553,10 @@ CONFIG_TIGON3=y
|
|||
# CONFIG_NET_FC is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
CONFIG_NETCONSOLE=y
|
||||
CONFIG_NETPOLL=y
|
||||
# CONFIG_NETPOLL_RX is not set
|
||||
# CONFIG_NETPOLL_TRAP is not set
|
||||
CONFIG_NET_POLL_CONTROLLER=y
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
|
@ -680,6 +682,7 @@ CONFIG_DRM_R128=m
|
|||
CONFIG_DRM_RADEON=m
|
||||
CONFIG_DRM_MGA=m
|
||||
CONFIG_DRM_SIS=m
|
||||
# CONFIG_DRM_VIA is not set
|
||||
CONFIG_RAW_DRIVER=m
|
||||
CONFIG_HPET=y
|
||||
# CONFIG_HPET_RTC_IRQ is not set
|
||||
|
@ -696,12 +699,19 @@ CONFIG_MAX_RAW_DEVS=256
|
|||
# I2C support
|
||||
#
|
||||
# CONFIG_I2C is not set
|
||||
# CONFIG_I2C_SENSOR is not set
|
||||
|
||||
#
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
# CONFIG_W1 is not set
|
||||
|
||||
#
|
||||
# Hardware Monitoring support
|
||||
#
|
||||
CONFIG_HWMON=y
|
||||
# CONFIG_HWMON_DEBUG_CHIP is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
#
|
||||
|
@ -800,6 +810,7 @@ CONFIG_USB_HIDINPUT=y
|
|||
# CONFIG_USB_EGALAX is not set
|
||||
# CONFIG_USB_XPAD is not set
|
||||
# CONFIG_USB_ATI_REMOTE is not set
|
||||
# CONFIG_USB_KEYSPAN_REMOTE is not set
|
||||
|
||||
#
|
||||
# USB Imaging devices
|
||||
|
@ -850,6 +861,7 @@ CONFIG_USB_HIDINPUT=y
|
|||
# CONFIG_USB_PHIDGETSERVO is not set
|
||||
# CONFIG_USB_IDMOUSE is not set
|
||||
# CONFIG_USB_SISUSBVGA is not set
|
||||
# CONFIG_USB_LD is not set
|
||||
# CONFIG_USB_TEST is not set
|
||||
|
||||
#
|
||||
|
@ -910,6 +922,7 @@ CONFIG_XFS_EXPORT=y
|
|||
# CONFIG_XFS_POSIX_ACL is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
CONFIG_AUTOFS_FS=y
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13-rc1-20050629
|
||||
# Wed Jun 29 15:31:11 2005
|
||||
# Linux kernel version: 2.6.13-rc6
|
||||
# Wed Aug 17 10:02:43 2005
|
||||
#
|
||||
|
||||
#
|
||||
|
@ -132,6 +132,7 @@ CONFIG_ACPI_BOOT=y
|
|||
CONFIG_ACPI_INTERPRETER=y
|
||||
CONFIG_ACPI_BUTTON=y
|
||||
CONFIG_ACPI_VIDEO=m
|
||||
CONFIG_ACPI_HOTKEY=m
|
||||
CONFIG_ACPI_FAN=y
|
||||
CONFIG_ACPI_PROCESSOR=y
|
||||
CONFIG_ACPI_THERMAL=y
|
||||
|
@ -168,6 +169,83 @@ CONFIG_HOTPLUG_PCI_ACPI=y
|
|||
#
|
||||
# CONFIG_PCCARD is not set
|
||||
|
||||
#
|
||||
# Networking
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
CONFIG_PACKET=y
|
||||
# CONFIG_PACKET_MMAP is not set
|
||||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
# CONFIG_IP_PNP is not set
|
||||
# CONFIG_NET_IPIP is not set
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_IP_MROUTE is not set
|
||||
# CONFIG_ARPD is not set
|
||||
# CONFIG_SYN_COOKIES is not set
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
# CONFIG_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
|
||||
#
|
||||
# IP: Virtual Server Configuration
|
||||
#
|
||||
# CONFIG_IP_VS is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
CONFIG_NETFILTER=y
|
||||
# CONFIG_NETFILTER_DEBUG is not set
|
||||
|
||||
#
|
||||
# IP: Netfilter Configuration
|
||||
#
|
||||
# CONFIG_IP_NF_CONNTRACK is not set
|
||||
# CONFIG_IP_NF_CONNTRACK_MARK is not set
|
||||
# CONFIG_IP_NF_QUEUE is not set
|
||||
# CONFIG_IP_NF_IPTABLES is not set
|
||||
CONFIG_IP_NF_ARPTABLES=y
|
||||
# CONFIG_IP_NF_ARPFILTER is not set
|
||||
# CONFIG_IP_NF_ARP_MANGLE is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_SCTP is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
@ -349,6 +427,7 @@ CONFIG_SCSI_QLA2XXX=y
|
|||
# CONFIG_SCSI_QLA2300 is not set
|
||||
# CONFIG_SCSI_QLA2322 is not set
|
||||
# CONFIG_SCSI_QLA6312 is not set
|
||||
# CONFIG_SCSI_QLA24XX is not set
|
||||
# CONFIG_SCSI_LPFC is not set
|
||||
# CONFIG_SCSI_DC395x is not set
|
||||
# CONFIG_SCSI_DC390T is not set
|
||||
|
@ -362,9 +441,11 @@ CONFIG_SCSI_QLA2XXX=y
|
|||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_FUSION is not set
|
||||
# CONFIG_FUSION_SPI is not set
|
||||
# CONFIG_FUSION_FC is not set
|
||||
CONFIG_FUSION=y
|
||||
CONFIG_FUSION_SPI=y
|
||||
CONFIG_FUSION_FC=y
|
||||
CONFIG_FUSION_MAX_SGE=128
|
||||
CONFIG_FUSION_CTL=m
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
|
@ -377,87 +458,8 @@ CONFIG_SCSI_QLA2XXX=y
|
|||
# CONFIG_I2O is not set
|
||||
|
||||
#
|
||||
# Networking support
|
||||
# Network device support
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
CONFIG_PACKET=y
|
||||
# CONFIG_PACKET_MMAP is not set
|
||||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
# CONFIG_IP_PNP is not set
|
||||
# CONFIG_NET_IPIP is not set
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_IP_MROUTE is not set
|
||||
# CONFIG_ARPD is not set
|
||||
# CONFIG_SYN_COOKIES is not set
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
# CONFIG_IP_TCPDIAG is not set
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
|
||||
#
|
||||
# IP: Virtual Server Configuration
|
||||
#
|
||||
# CONFIG_IP_VS is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
CONFIG_NETFILTER=y
|
||||
# CONFIG_NETFILTER_DEBUG is not set
|
||||
|
||||
#
|
||||
# IP: Netfilter Configuration
|
||||
#
|
||||
# CONFIG_IP_NF_CONNTRACK is not set
|
||||
# CONFIG_IP_NF_CONNTRACK_MARK is not set
|
||||
# CONFIG_IP_NF_QUEUE is not set
|
||||
# CONFIG_IP_NF_IPTABLES is not set
|
||||
CONFIG_IP_NF_ARPTABLES=y
|
||||
# CONFIG_IP_NF_ARPFILTER is not set
|
||||
# CONFIG_IP_NF_ARP_MANGLE is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_SCTP is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_DUMMY=y
|
||||
# CONFIG_BONDING is not set
|
||||
|
@ -555,6 +557,8 @@ CONFIG_TIGON3=y
|
|||
# CONFIG_NET_FC is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
|
@ -659,6 +663,7 @@ CONFIG_DRM=y
|
|||
CONFIG_DRM_RADEON=y
|
||||
# CONFIG_DRM_MGA is not set
|
||||
# CONFIG_DRM_SIS is not set
|
||||
# CONFIG_DRM_VIA is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
# CONFIG_HPET is not set
|
||||
# CONFIG_HANGCHECK_TIMER is not set
|
||||
|
@ -706,47 +711,10 @@ CONFIG_I2C_ALGOPCF=y
|
|||
# CONFIG_I2C_VIAPRO is not set
|
||||
# CONFIG_I2C_VOODOO3 is not set
|
||||
# CONFIG_I2C_PCA_ISA is not set
|
||||
|
||||
#
|
||||
# Hardware Sensors Chip support
|
||||
#
|
||||
# CONFIG_I2C_SENSOR is not set
|
||||
# CONFIG_SENSORS_ADM1021 is not set
|
||||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
# CONFIG_SENSORS_ADM1031 is not set
|
||||
# CONFIG_SENSORS_ADM9240 is not set
|
||||
# CONFIG_SENSORS_ASB100 is not set
|
||||
# CONFIG_SENSORS_ATXP1 is not set
|
||||
# CONFIG_SENSORS_DS1621 is not set
|
||||
# CONFIG_SENSORS_FSCHER is not set
|
||||
# CONFIG_SENSORS_FSCPOS is not set
|
||||
# CONFIG_SENSORS_GL518SM is not set
|
||||
# CONFIG_SENSORS_GL520SM is not set
|
||||
# CONFIG_SENSORS_IT87 is not set
|
||||
# CONFIG_SENSORS_LM63 is not set
|
||||
# CONFIG_SENSORS_LM75 is not set
|
||||
# CONFIG_SENSORS_LM77 is not set
|
||||
# CONFIG_SENSORS_LM78 is not set
|
||||
# CONFIG_SENSORS_LM80 is not set
|
||||
# CONFIG_SENSORS_LM83 is not set
|
||||
# CONFIG_SENSORS_LM85 is not set
|
||||
# CONFIG_SENSORS_LM87 is not set
|
||||
# CONFIG_SENSORS_LM90 is not set
|
||||
# CONFIG_SENSORS_LM92 is not set
|
||||
# CONFIG_SENSORS_MAX1619 is not set
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_SIS5595 is not set
|
||||
# CONFIG_SENSORS_SMSC47M1 is not set
|
||||
# CONFIG_SENSORS_VIA686A is not set
|
||||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
|
||||
#
|
||||
# Other I2C Chip support
|
||||
# Miscellaneous I2C Chip support
|
||||
#
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
|
@ -766,6 +734,11 @@ CONFIG_I2C_ALGOPCF=y
|
|||
#
|
||||
# CONFIG_W1 is not set
|
||||
|
||||
#
|
||||
# Hardware Monitoring support
|
||||
#
|
||||
# CONFIG_HWMON is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
#
|
||||
|
@ -782,7 +755,6 @@ CONFIG_VIDEO_DEV=y
|
|||
#
|
||||
# Video Adapters
|
||||
#
|
||||
# CONFIG_TUNER_MULTI_I2C is not set
|
||||
# CONFIG_VIDEO_BT848 is not set
|
||||
# CONFIG_VIDEO_CPIA is not set
|
||||
# CONFIG_VIDEO_SAA5246A is not set
|
||||
|
@ -1025,6 +997,7 @@ CONFIG_USB_HIDDEV=y
|
|||
# CONFIG_USB_EGALAX is not set
|
||||
# CONFIG_USB_XPAD is not set
|
||||
# CONFIG_USB_ATI_REMOTE is not set
|
||||
# CONFIG_USB_KEYSPAN_REMOTE is not set
|
||||
|
||||
#
|
||||
# USB Imaging devices
|
||||
|
@ -1080,6 +1053,7 @@ CONFIG_USB_MON=y
|
|||
# CONFIG_USB_PHIDGETSERVO is not set
|
||||
# CONFIG_USB_IDMOUSE is not set
|
||||
# CONFIG_USB_SISUSBVGA is not set
|
||||
# CONFIG_USB_LD is not set
|
||||
|
||||
#
|
||||
# USB DSL modem support
|
||||
|
@ -1121,6 +1095,7 @@ CONFIG_JBD=y
|
|||
CONFIG_FS_MBCACHE=y
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
# CONFIG_FS_POSIX_ACL is not set
|
||||
|
||||
#
|
||||
# XFS support
|
||||
|
@ -1128,6 +1103,7 @@ CONFIG_FS_MBCACHE=y
|
|||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
# CONFIG_INOTIFY is not set
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
CONFIG_AUTOFS_FS=y
|
||||
|
|
|
@ -22,7 +22,7 @@ GLOBAL_ENTRY(_start)
|
|||
.save rp, r0
|
||||
.body
|
||||
movl gp = __gp
|
||||
movl sp = stack_mem
|
||||
movl sp = stack_mem+16384-16
|
||||
bsw.1
|
||||
br.call.sptk.many rp=start_bootloader
|
||||
END(_start)
|
||||
|
|
|
@ -4312,6 +4312,7 @@ pfm_context_load(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
|
|||
DPRINT(("before cmpxchg() old_ctx=%p new_ctx=%p\n",
|
||||
thread->pfm_context, ctx));
|
||||
|
||||
ret = -EBUSY;
|
||||
old = ia64_cmpxchg(acq, &thread->pfm_context, NULL, ctx, sizeof(pfm_context_t *));
|
||||
if (old != NULL) {
|
||||
DPRINT(("load_pid [%d] already has a context\n", req->load_pid));
|
||||
|
|
|
@ -143,7 +143,8 @@ struct salinfo_data {
|
|||
|
||||
static struct salinfo_data salinfo_data[ARRAY_SIZE(salinfo_log_name)];
|
||||
|
||||
static spinlock_t data_lock, data_saved_lock;
|
||||
static DEFINE_SPINLOCK(data_lock);
|
||||
static DEFINE_SPINLOCK(data_saved_lock);
|
||||
|
||||
/** salinfo_platform_oemdata - optional callback to decode oemdata from an error
|
||||
* record.
|
||||
|
|
|
@ -467,15 +467,12 @@ handle_signal (unsigned long sig, struct k_sigaction *ka, siginfo_t *info, sigse
|
|||
if (!setup_frame(sig, ka, info, oldset, scr))
|
||||
return 0;
|
||||
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER)) {
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
{
|
||||
sigorsets(¤t->blocked, ¤t->blocked, &ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(¤t->blocked, sig);
|
||||
recalc_sigpending();
|
||||
}
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -380,6 +380,7 @@ void pcibios_bus_to_resource(struct pci_dev *dev,
|
|||
res->start = region->start + offset;
|
||||
res->end = region->end + offset;
|
||||
}
|
||||
EXPORT_SYMBOL(pcibios_bus_to_resource);
|
||||
|
||||
static int __devinit is_valid_resource(struct pci_dev *dev, int idx)
|
||||
{
|
||||
|
|
|
@ -203,6 +203,7 @@ static void sn_fixup_ionodes(void)
|
|||
continue;
|
||||
}
|
||||
|
||||
spin_lock_init(&sn_flush_device_list->sfdl_flush_lock);
|
||||
hubdev->hdi_flush_nasid_list.widget_p[widget] =
|
||||
sn_flush_device_list;
|
||||
}
|
||||
|
@ -322,7 +323,7 @@ void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
|
|||
struct pci_controller *controller;
|
||||
struct pcibus_bussoft *prom_bussoft_ptr;
|
||||
struct hubdev_info *hubdev_info;
|
||||
void *provider_soft;
|
||||
void *provider_soft = NULL;
|
||||
struct sn_pcibus_provider *provider;
|
||||
|
||||
status = sal_get_pcibus_info((u64) segment, (u64) busnum,
|
||||
|
@ -338,7 +339,7 @@ void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
|
|||
if (bus == NULL) {
|
||||
bus = pci_scan_bus(busnum, &pci_root_ops, controller);
|
||||
if (bus == NULL)
|
||||
return; /* error, or bus already scanned */
|
||||
goto error_return; /* error, or bus already scanned */
|
||||
bus->sysdata = NULL;
|
||||
}
|
||||
|
||||
|
@ -351,28 +352,30 @@ void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
|
|||
*/
|
||||
|
||||
if (prom_bussoft_ptr->bs_asic_type >= PCIIO_ASIC_MAX_TYPES)
|
||||
return; /* unsupported asic type */
|
||||
goto error_return; /* unsupported asic type */
|
||||
|
||||
if (prom_bussoft_ptr->bs_asic_type == PCIIO_ASIC_TYPE_PPB)
|
||||
goto error_return; /* no further fixup necessary */
|
||||
|
||||
provider = sn_pci_provider[prom_bussoft_ptr->bs_asic_type];
|
||||
if (provider == NULL)
|
||||
return; /* no provider registerd for this asic */
|
||||
goto error_return; /* no provider registerd for this asic */
|
||||
|
||||
provider_soft = NULL;
|
||||
bus->sysdata = controller;
|
||||
if (provider->bus_fixup)
|
||||
provider_soft = (*provider->bus_fixup) (prom_bussoft_ptr, controller);
|
||||
|
||||
if (provider_soft == NULL)
|
||||
return; /* fixup failed or not applicable */
|
||||
if (provider_soft == NULL) {
|
||||
/* fixup failed or not applicable */
|
||||
bus->sysdata = NULL;
|
||||
goto error_return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Generic bus fixup goes here. Don't reference prom_bussoft_ptr
|
||||
* after this point.
|
||||
*/
|
||||
|
||||
bus->sysdata = controller;
|
||||
PCI_CONTROLLER(bus)->platform_data = provider_soft;
|
||||
nasid = NASID_GET(SN_PCIBUS_BUSSOFT(bus)->bs_base);
|
||||
cnode = nasid_to_cnodeid(nasid);
|
||||
|
|
|
@ -269,7 +269,7 @@ config NR_CPUS
|
|||
# Common NUMA Features
|
||||
config NUMA
|
||||
bool "Numa Memory Allocation Support"
|
||||
depends on SMP
|
||||
depends on SMP && BROKEN
|
||||
default n
|
||||
|
||||
# turning this on wastes a bunch of space.
|
||||
|
@ -286,6 +286,7 @@ menu "Bus options (PCI, PCMCIA, EISA, MCA, ISA)"
|
|||
|
||||
config PCI
|
||||
bool "PCI support"
|
||||
depends on BROKEN
|
||||
default n
|
||||
help
|
||||
Find out whether you have a PCI motherboard. PCI is the name of a
|
||||
|
|
|
@ -20,7 +20,7 @@ config DEBUG_STACK_USAGE
|
|||
|
||||
config DEBUG_PAGEALLOC
|
||||
bool "Page alloc debugging"
|
||||
depends on DEBUG_KERNEL
|
||||
depends on DEBUG_KERNEL && BROKEN
|
||||
help
|
||||
Unmap pages from the kernel linear mapping after free_pages().
|
||||
This results in a large slowdown, but helps to find certain types
|
||||
|
|
|
@ -30,9 +30,11 @@
|
|||
typedef struct {
|
||||
unsigned long icucr; /* ICU Control Register */
|
||||
} icu_data_t;
|
||||
static icu_data_t icu_data[M32700UT_NUM_CPU_IRQ];
|
||||
#else
|
||||
icu_data_t icu_data[M32700UT_NUM_CPU_IRQ];
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
static icu_data_t icu_data[M32700UT_NUM_CPU_IRQ];
|
||||
|
||||
static void disable_m32700ut_irq(unsigned int irq)
|
||||
{
|
||||
|
|
|
@ -31,9 +31,11 @@
|
|||
typedef struct {
|
||||
unsigned long icucr; /* ICU Control Register */
|
||||
} icu_data_t;
|
||||
static icu_data_t icu_data[OPSPUT_NUM_CPU_IRQ];
|
||||
#else
|
||||
icu_data_t icu_data[OPSPUT_NUM_CPU_IRQ];
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
static icu_data_t icu_data[OPSPUT_NUM_CPU_IRQ];
|
||||
|
||||
static void disable_opsput_irq(unsigned int irq)
|
||||
{
|
||||
|
|
|
@ -341,14 +341,13 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
|
|||
/* Set up the stack frame */
|
||||
setup_rt_frame(sig, ka, info, oldset, regs);
|
||||
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER)) {
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(¤t->blocked,sig);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Note that 'init' is a special process: it doesn't get signals it doesn't
|
||||
|
|
|
@ -91,6 +91,7 @@ extern struct {
|
|||
|
||||
/* which physical physical ID maps to which logical CPU number */
|
||||
static volatile int physid_2_cpu[NR_CPUS];
|
||||
#define physid_to_cpu(physid) physid_2_cpu[physid]
|
||||
|
||||
/* which logical CPU number maps to which physical ID */
|
||||
volatile int cpu_2_physid[NR_CPUS];
|
||||
|
|
|
@ -58,3 +58,4 @@ csum_partial_copy_from_user (const unsigned char __user *src,
|
|||
return csum_partial(dst, len-missing, sum);
|
||||
}
|
||||
EXPORT_SYMBOL(csum_partial_copy_from_user);
|
||||
EXPORT_SYMBOL(csum_partial);
|
||||
|
|
|
@ -12,12 +12,14 @@
|
|||
#include <linux/mmzone.h>
|
||||
#include <linux/initrd.h>
|
||||
#include <linux/nodemask.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
|
||||
extern char _end[];
|
||||
|
||||
struct pglist_data *node_data[MAX_NUMNODES];
|
||||
EXPORT_SYMBOL(node_data);
|
||||
static bootmem_data_t node_bdata[MAX_NUMNODES] __initdata;
|
||||
|
||||
pg_data_t m32r_node_data[MAX_NUMNODES];
|
||||
|
|
|
@ -732,14 +732,13 @@ handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info,
|
|||
if (ka->sa.sa_flags & SA_ONESHOT)
|
||||
ka->sa.sa_handler = SIG_DFL;
|
||||
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER)) {
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(¤t->blocked,sig);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Note that 'init' is a special process: it doesn't get signals it doesn't
|
||||
|
|
|
@ -155,14 +155,13 @@ static inline void handle_signal(unsigned long sig, siginfo_t *info,
|
|||
else
|
||||
setup_irix_frame(ka, regs, sig, oldset);
|
||||
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER)) {
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(¤t->blocked,sig);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
}
|
||||
}
|
||||
|
||||
asmlinkage int do_irix_signal(sigset_t *oldset, struct pt_regs *regs)
|
||||
{
|
||||
|
|
|
@ -425,14 +425,13 @@ static inline void handle_signal(unsigned long sig, siginfo_t *info,
|
|||
setup_frame(ka, regs, sig, oldset);
|
||||
#endif
|
||||
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER)) {
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(¤t->blocked,sig);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
}
|
||||
}
|
||||
|
||||
extern int do_signal32(sigset_t *oldset, struct pt_regs *regs);
|
||||
extern int do_irix_signal(sigset_t *oldset, struct pt_regs *regs);
|
||||
|
|
|
@ -751,14 +751,13 @@ static inline void handle_signal(unsigned long sig, siginfo_t *info,
|
|||
else
|
||||
setup_frame(ka, regs, sig, oldset);
|
||||
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER)) {
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(¤t->blocked,sig);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
}
|
||||
}
|
||||
|
||||
int do_signal32(sigset_t *oldset, struct pt_regs *regs)
|
||||
{
|
||||
|
|
|
@ -517,13 +517,12 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
|
|||
if (!setup_rt_frame(sig, ka, info, oldset, regs, in_syscall))
|
||||
return 0;
|
||||
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER)) {
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(¤t->blocked,sig);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -911,6 +911,7 @@ config PPCBUG_NVRAM
|
|||
default y if PPC_PREP
|
||||
|
||||
config SMP
|
||||
depends on PPC_STD_MMU
|
||||
bool "Symmetric multi-processing support"
|
||||
---help---
|
||||
This enables support for systems with more than one CPU. If you have
|
||||
|
@ -930,7 +931,7 @@ config SMP
|
|||
|
||||
config IRQ_ALL_CPUS
|
||||
bool "Distribute interrupts on all CPUs by default"
|
||||
depends on SMP
|
||||
depends on SMP && !MV64360
|
||||
help
|
||||
This option gives the kernel permission to distribute IRQs across
|
||||
multiple CPUs. Saying N here will route all IRQs to the first
|
||||
|
@ -1121,7 +1122,9 @@ config PROC_HARDWARE
|
|||
|
||||
source "drivers/zorro/Kconfig"
|
||||
|
||||
if !44x || BROKEN
|
||||
source kernel/power/Kconfig
|
||||
endif
|
||||
|
||||
config SECCOMP
|
||||
bool "Enable seccomp to safely compute untrusted bytecode"
|
||||
|
|
|
@ -759,13 +759,12 @@ int do_signal(sigset_t *oldset, struct pt_regs *regs)
|
|||
else
|
||||
handle_signal(signr, &ka, &info, oldset, regs, newsp);
|
||||
|
||||
if (!(ka.sa.sa_flags & SA_NODEFER)) {
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
sigorsets(¤t->blocked,¤t->blocked,&ka.sa.sa_mask);
|
||||
if (!(ka.sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(¤t->blocked, signr);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -3,6 +3,11 @@ config 4xx
|
|||
depends on 40x || 44x
|
||||
default y
|
||||
|
||||
config WANT_EARLY_SERIAL
|
||||
bool
|
||||
select SERIAL_8250
|
||||
default n
|
||||
|
||||
menu "IBM 4xx options"
|
||||
depends on 4xx
|
||||
|
||||
|
@ -18,6 +23,7 @@ config ASH
|
|||
|
||||
config BUBINGA
|
||||
bool "Bubinga"
|
||||
select WANT_EARLY_SERIAL
|
||||
help
|
||||
This option enables support for the IBM 405EP evaluation board.
|
||||
|
||||
|
@ -70,21 +76,25 @@ choice
|
|||
|
||||
config BAMBOO
|
||||
bool "Bamboo"
|
||||
select WANT_EARLY_SERIAL
|
||||
help
|
||||
This option enables support for the IBM PPC440EP evaluation board.
|
||||
|
||||
config EBONY
|
||||
bool "Ebony"
|
||||
select WANT_EARLY_SERIAL
|
||||
help
|
||||
This option enables support for the IBM PPC440GP evaluation board.
|
||||
|
||||
config LUAN
|
||||
bool "Luan"
|
||||
select WANT_EARLY_SERIAL
|
||||
help
|
||||
This option enables support for the IBM PPC440SP evaluation board.
|
||||
|
||||
config OCOTEA
|
||||
bool "Ocotea"
|
||||
select WANT_EARLY_SERIAL
|
||||
help
|
||||
This option enables support for the IBM PPC440GX evaluation board.
|
||||
|
||||
|
@ -230,10 +240,6 @@ config PPC_GEN550
|
|||
depends on 4xx
|
||||
default y
|
||||
|
||||
config PM
|
||||
bool "Power Management support (EXPERIMENTAL)"
|
||||
depends on 4xx && EXPERIMENTAL
|
||||
|
||||
choice
|
||||
prompt "TTYS0 device and default console"
|
||||
depends on 40x
|
||||
|
|
|
@ -423,7 +423,7 @@ platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
|
|||
ppc_md.find_end_of_memory = m8xx_find_end_of_memory;
|
||||
ppc_md.setup_io_mappings = m8xx_map_io;
|
||||
|
||||
#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE)
|
||||
#if defined(CONFIG_BLK_DEV_MPC8xx_IDE)
|
||||
m8xx_ide_init();
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -620,6 +620,7 @@ ppc4xx_clr_dma_status(unsigned int dmanr)
|
|||
return DMA_STATUS_GOOD;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC4xx_EDMA
|
||||
/*
|
||||
* Enables the burst on the channel (BTEN bit in the control/count register)
|
||||
* Note:
|
||||
|
@ -685,6 +686,11 @@ ppc4xx_set_burst_size(unsigned int dmanr, unsigned int bsize)
|
|||
return DMA_STATUS_GOOD;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(ppc4xx_enable_burst);
|
||||
EXPORT_SYMBOL(ppc4xx_disable_burst);
|
||||
EXPORT_SYMBOL(ppc4xx_set_burst_size);
|
||||
#endif /* CONFIG_PPC4xx_EDMA */
|
||||
|
||||
EXPORT_SYMBOL(ppc4xx_init_dma_channel);
|
||||
EXPORT_SYMBOL(ppc4xx_get_channel_config);
|
||||
EXPORT_SYMBOL(ppc4xx_set_channel_priority);
|
||||
|
@ -703,6 +709,4 @@ EXPORT_SYMBOL(ppc4xx_enable_dma_interrupt);
|
|||
EXPORT_SYMBOL(ppc4xx_disable_dma_interrupt);
|
||||
EXPORT_SYMBOL(ppc4xx_get_dma_status);
|
||||
EXPORT_SYMBOL(ppc4xx_clr_dma_status);
|
||||
EXPORT_SYMBOL(ppc4xx_enable_burst);
|
||||
EXPORT_SYMBOL(ppc4xx_disable_burst);
|
||||
EXPORT_SYMBOL(ppc4xx_set_burst_size);
|
||||
|
||||
|
|
|
@ -242,7 +242,7 @@ int iommu_map_sg(struct device *dev, struct iommu_table *tbl,
|
|||
dma_addr_t dma_next = 0, dma_addr;
|
||||
unsigned long flags;
|
||||
struct scatterlist *s, *outs, *segstart;
|
||||
int outcount;
|
||||
int outcount, incount;
|
||||
unsigned long handle;
|
||||
|
||||
BUG_ON(direction == DMA_NONE);
|
||||
|
@ -252,6 +252,7 @@ int iommu_map_sg(struct device *dev, struct iommu_table *tbl,
|
|||
|
||||
outs = s = segstart = &sglist[0];
|
||||
outcount = 1;
|
||||
incount = nelems;
|
||||
handle = 0;
|
||||
|
||||
/* Init first segment length for backout at failure */
|
||||
|
@ -338,10 +339,10 @@ int iommu_map_sg(struct device *dev, struct iommu_table *tbl,
|
|||
|
||||
DBG("mapped %d elements:\n", outcount);
|
||||
|
||||
/* For the sake of iommu_free_sg, we clear out the length in the
|
||||
/* For the sake of iommu_unmap_sg, we clear out the length in the
|
||||
* next entry of the sglist if we didn't fill the list completely
|
||||
*/
|
||||
if (outcount < nelems) {
|
||||
if (outcount < incount) {
|
||||
outs++;
|
||||
outs->dma_address = DMA_ERROR_CODE;
|
||||
outs->dma_length = 0;
|
||||
|
|
|
@ -706,6 +706,8 @@ void machine_power_off(void)
|
|||
local_irq_disable();
|
||||
while (1) ;
|
||||
}
|
||||
/* Used by the G5 thermal driver */
|
||||
EXPORT_SYMBOL_GPL(machine_power_off);
|
||||
|
||||
void machine_halt(void)
|
||||
{
|
||||
|
|
|
@ -481,9 +481,10 @@ static int handle_signal(unsigned long sig, struct k_sigaction *ka,
|
|||
/* Set up Signal Frame */
|
||||
ret = setup_rt_frame(sig, ka, info, oldset, regs);
|
||||
|
||||
if (ret && !(ka->sa.sa_flags & SA_NODEFER)) {
|
||||
if (ret) {
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
sigorsets(¤t->blocked, ¤t->blocked, &ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(¤t->blocked,sig);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
|
|
|
@ -976,10 +976,11 @@ int do_signal32(sigset_t *oldset, struct pt_regs *regs)
|
|||
else
|
||||
ret = handle_signal32(signr, &ka, &info, oldset, regs, newsp);
|
||||
|
||||
if (ret && !(ka.sa.sa_flags & SA_NODEFER)) {
|
||||
if (ret) {
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
sigorsets(¤t->blocked, ¤t->blocked,
|
||||
&ka.sa.sa_mask);
|
||||
if (!(ka.sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(¤t->blocked, signr);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
|
|
|
@ -637,12 +637,11 @@ handle_signal32(unsigned long sig, struct k_sigaction *ka,
|
|||
else
|
||||
setup_frame32(sig, ka, oldset, regs);
|
||||
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER)) {
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(¤t->blocked,sig);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -46,9 +46,9 @@ int __cpcmd(const char *cmd, char *response, int rlen, int *response_code)
|
|||
"lra 3,0(%4)\n"
|
||||
"lr 5,%5\n"
|
||||
"diag 2,4,0x8\n"
|
||||
"brc 8, .Litfits\n"
|
||||
"brc 8, 1f\n"
|
||||
"ar 5, %5\n"
|
||||
".Litfits: \n"
|
||||
"1: \n"
|
||||
"lr %0,4\n"
|
||||
"lr %1,5\n"
|
||||
: "=d" (return_code), "=d" (return_len)
|
||||
|
@ -64,9 +64,9 @@ int __cpcmd(const char *cmd, char *response, int rlen, int *response_code)
|
|||
"sam31\n"
|
||||
"diag 2,4,0x8\n"
|
||||
"sam64\n"
|
||||
"brc 8, .Litfits\n"
|
||||
"brc 8, 1f\n"
|
||||
"agr 5, %5\n"
|
||||
".Litfits: \n"
|
||||
"1: \n"
|
||||
"lgr %0,4\n"
|
||||
"lgr %1,5\n"
|
||||
: "=d" (return_code), "=d" (return_len)
|
||||
|
|
|
@ -429,14 +429,13 @@ handle_signal(unsigned long sig, struct k_sigaction *ka,
|
|||
else
|
||||
setup_frame(sig, ka, oldset, regs);
|
||||
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER)) {
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(¤t->blocked,sig);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Note that 'init' is a special process: it doesn't get signals it doesn't
|
||||
|
|
|
@ -1145,5 +1145,10 @@ ENTRY(sys_call_table)
|
|||
.long sys_add_key /* 285 */
|
||||
.long sys_request_key
|
||||
.long sys_keyctl
|
||||
.long sys_ioprio_set
|
||||
.long sys_ioprio_get
|
||||
.long sys_inotify_init /* 290 */
|
||||
.long sys_inotify_add_watch
|
||||
.long sys_inotify_rm_watch
|
||||
|
||||
/* End of entry.S */
|
||||
|
|
|
@ -546,14 +546,13 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
|
|||
if (ka->sa.sa_flags & SA_ONESHOT)
|
||||
ka->sa.sa_handler = SIG_DFL;
|
||||
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER)) {
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(¤t->blocked,sig);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Note that 'init' is a special process: it doesn't get signals it doesn't
|
||||
|
|
|
@ -664,14 +664,13 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
|
|||
else
|
||||
setup_frame(sig, ka, oldset, regs);
|
||||
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER)) {
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NODEFER))
|
||||
sigaddset(¤t->blocked,sig);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Note that 'init' is a special process: it doesn't get signals it doesn't
|
||||
|
|
|
@ -342,4 +342,9 @@ sys_call_table:
|
|||
.long sys_add_key
|
||||
.long sys_request_key
|
||||
.long sys_keyctl /* 315 */
|
||||
.long sys_ioprio_set
|
||||
.long sys_ioprio_get
|
||||
.long sys_inotify_init
|
||||
.long sys_inotify_add_watch
|
||||
.long sys_inotify_rm_watch /* 320 */
|
||||
|
||||
|
|
|
@ -32,7 +32,6 @@
|
|||
#include <linux/spinlock.h>
|
||||
#include <linux/root_dev.h>
|
||||
|
||||
#include <asm/segment.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/processor.h>
|
||||
|
|
|
@ -1034,14 +1034,13 @@ handle_signal(unsigned long signr, struct k_sigaction *ka,
|
|||
else
|
||||
setup_frame(&ka->sa, regs, signr, oldset, info);
|
||||
}
|
||||
if (!(ka->sa.sa_flags & SA_NOMASK)) {
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NOMASK))
|
||||
sigaddset(¤t->blocked, signr);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
|
||||
struct sigaction *sa)
|
||||
|
|
|
@ -98,8 +98,9 @@ extern void ___rw_write_enter(void);
|
|||
* The module references will be fixed up by module_frob_arch_sections.
|
||||
*/
|
||||
#define DOT_ALIAS2(__ret, __x, __arg1, __arg2) \
|
||||
extern __ret __x(__arg1, __arg2) \
|
||||
__attribute__((weak, alias("." # __x)));
|
||||
extern __ret __x(__arg1, __arg2); \
|
||||
asm(".weak " #__x);\
|
||||
asm(#__x "=." #__x);
|
||||
|
||||
DOT_ALIAS2(int, div, int, int)
|
||||
DOT_ALIAS2(int, mul, int, int)
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
#include <linux/interrupt.h>
|
||||
|
||||
#include <asm/oplib.h>
|
||||
#include <asm/segment.h>
|
||||
#include <asm/timer.h>
|
||||
#include <asm/mostek.h>
|
||||
#include <asm/system.h>
|
||||
|
|
|
@ -32,7 +32,6 @@
|
|||
#include <linux/profile.h>
|
||||
|
||||
#include <asm/oplib.h>
|
||||
#include <asm/segment.h>
|
||||
#include <asm/timer.h>
|
||||
#include <asm/mostek.h>
|
||||
#include <asm/system.h>
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
#include <linux/module.h>
|
||||
|
||||
#include <asm/system.h>
|
||||
#include <asm/segment.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/memreg.h>
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
#include <linux/bootmem.h>
|
||||
|
||||
#include <asm/system.h>
|
||||
#include <asm/segment.h>
|
||||
#include <asm/vac-ops.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
|
|
@ -8,7 +8,7 @@ EXTRA_CFLAGS := -Werror
|
|||
extra-y := head.o init_task.o vmlinux.lds
|
||||
|
||||
obj-y := process.o setup.o cpu.o idprom.o \
|
||||
traps.o devices.o auxio.o \
|
||||
traps.o devices.o auxio.o una_asm.o \
|
||||
irq.o ptrace.o time.o sys_sparc.o signal.o \
|
||||
unaligned.o central.o pci.o starfire.o semaphore.o \
|
||||
power.o sbus.o iommu_common.o sparc64_ksyms.o chmc.o
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <asm/visasm.h>
|
||||
#include <asm/estate.h>
|
||||
#include <asm/auxio.h>
|
||||
#include <asm/sfafsr.h>
|
||||
|
||||
#define curptr g6
|
||||
|
||||
|
@ -690,79 +691,102 @@ netbsd_syscall:
|
|||
retl
|
||||
nop
|
||||
|
||||
/* These next few routines must be sure to clear the
|
||||
* SFSR FaultValid bit so that the fast tlb data protection
|
||||
* handler does not flush the wrong context and lock up the
|
||||
* box.
|
||||
/* We need to carefully read the error status, ACK
|
||||
* the errors, prevent recursive traps, and pass the
|
||||
* information on to C code for logging.
|
||||
*
|
||||
* We pass the AFAR in as-is, and we encode the status
|
||||
* information as described in asm-sparc64/sfafsr.h
|
||||
*/
|
||||
.globl __do_data_access_exception
|
||||
.globl __do_data_access_exception_tl1
|
||||
__do_data_access_exception_tl1:
|
||||
rdpr %pstate, %g4
|
||||
wrpr %g4, PSTATE_MG|PSTATE_AG, %pstate
|
||||
mov TLB_SFSR, %g3
|
||||
mov DMMU_SFAR, %g5
|
||||
ldxa [%g3] ASI_DMMU, %g4 ! Get SFSR
|
||||
ldxa [%g5] ASI_DMMU, %g5 ! Get SFAR
|
||||
stxa %g0, [%g3] ASI_DMMU ! Clear SFSR.FaultValid bit
|
||||
.globl __spitfire_access_error
|
||||
__spitfire_access_error:
|
||||
/* Disable ESTATE error reporting so that we do not
|
||||
* take recursive traps and RED state the processor.
|
||||
*/
|
||||
stxa %g0, [%g0] ASI_ESTATE_ERROR_EN
|
||||
membar #Sync
|
||||
ba,pt %xcc, winfix_dax
|
||||
rdpr %tpc, %g3
|
||||
__do_data_access_exception:
|
||||
rdpr %pstate, %g4
|
||||
wrpr %g4, PSTATE_MG|PSTATE_AG, %pstate
|
||||
mov TLB_SFSR, %g3
|
||||
mov DMMU_SFAR, %g5
|
||||
ldxa [%g3] ASI_DMMU, %g4 ! Get SFSR
|
||||
ldxa [%g5] ASI_DMMU, %g5 ! Get SFAR
|
||||
stxa %g0, [%g3] ASI_DMMU ! Clear SFSR.FaultValid bit
|
||||
membar #Sync
|
||||
sethi %hi(109f), %g7
|
||||
ba,pt %xcc, etrap
|
||||
109: or %g7, %lo(109b), %g7
|
||||
mov %l4, %o1
|
||||
mov %l5, %o2
|
||||
call data_access_exception
|
||||
add %sp, PTREGS_OFF, %o0
|
||||
ba,pt %xcc, rtrap
|
||||
clr %l6
|
||||
|
||||
.globl __do_instruction_access_exception
|
||||
.globl __do_instruction_access_exception_tl1
|
||||
__do_instruction_access_exception_tl1:
|
||||
rdpr %pstate, %g4
|
||||
wrpr %g4, PSTATE_MG|PSTATE_AG, %pstate
|
||||
mov TLB_SFSR, %g3
|
||||
mov DMMU_SFAR, %g5
|
||||
ldxa [%g3] ASI_DMMU, %g4 ! Get SFSR
|
||||
ldxa [%g5] ASI_DMMU, %g5 ! Get SFAR
|
||||
stxa %g0, [%g3] ASI_IMMU ! Clear FaultValid bit
|
||||
mov UDBE_UE, %g1
|
||||
ldxa [%g0] ASI_AFSR, %g4 ! Get AFSR
|
||||
|
||||
/* __spitfire_cee_trap branches here with AFSR in %g4 and
|
||||
* UDBE_CE in %g1. It only clears ESTATE_ERR_CE in the
|
||||
* ESTATE Error Enable register.
|
||||
*/
|
||||
__spitfire_cee_trap_continue:
|
||||
ldxa [%g0] ASI_AFAR, %g5 ! Get AFAR
|
||||
|
||||
rdpr %tt, %g3
|
||||
and %g3, 0x1ff, %g3 ! Paranoia
|
||||
sllx %g3, SFSTAT_TRAP_TYPE_SHIFT, %g3
|
||||
or %g4, %g3, %g4
|
||||
rdpr %tl, %g3
|
||||
cmp %g3, 1
|
||||
mov 1, %g3
|
||||
bleu %xcc, 1f
|
||||
sllx %g3, SFSTAT_TL_GT_ONE_SHIFT, %g3
|
||||
|
||||
or %g4, %g3, %g4
|
||||
|
||||
/* Read in the UDB error register state, clearing the
|
||||
* sticky error bits as-needed. We only clear them if
|
||||
* the UE bit is set. Likewise, __spitfire_cee_trap
|
||||
* below will only do so if the CE bit is set.
|
||||
*
|
||||
* NOTE: UltraSparc-I/II have high and low UDB error
|
||||
* registers, corresponding to the two UDB units
|
||||
* present on those chips. UltraSparc-IIi only
|
||||
* has a single UDB, called "SDB" in the manual.
|
||||
* For IIi the upper UDB register always reads
|
||||
* as zero so for our purposes things will just
|
||||
* work with the checks below.
|
||||
*/
|
||||
1: ldxa [%g0] ASI_UDBH_ERROR_R, %g3
|
||||
and %g3, 0x3ff, %g7 ! Paranoia
|
||||
sllx %g7, SFSTAT_UDBH_SHIFT, %g7
|
||||
or %g4, %g7, %g4
|
||||
andcc %g3, %g1, %g3 ! UDBE_UE or UDBE_CE
|
||||
be,pn %xcc, 1f
|
||||
nop
|
||||
stxa %g3, [%g0] ASI_UDB_ERROR_W
|
||||
membar #Sync
|
||||
sethi %hi(109f), %g7
|
||||
|
||||
1: mov 0x18, %g3
|
||||
ldxa [%g3] ASI_UDBL_ERROR_R, %g3
|
||||
and %g3, 0x3ff, %g7 ! Paranoia
|
||||
sllx %g7, SFSTAT_UDBL_SHIFT, %g7
|
||||
or %g4, %g7, %g4
|
||||
andcc %g3, %g1, %g3 ! UDBE_UE or UDBE_CE
|
||||
be,pn %xcc, 1f
|
||||
nop
|
||||
mov 0x18, %g7
|
||||
stxa %g3, [%g7] ASI_UDB_ERROR_W
|
||||
membar #Sync
|
||||
|
||||
1: /* Ok, now that we've latched the error state,
|
||||
* clear the sticky bits in the AFSR.
|
||||
*/
|
||||
stxa %g4, [%g0] ASI_AFSR
|
||||
membar #Sync
|
||||
|
||||
rdpr %tl, %g2
|
||||
cmp %g2, 1
|
||||
rdpr %pil, %g2
|
||||
bleu,pt %xcc, 1f
|
||||
wrpr %g0, 15, %pil
|
||||
|
||||
ba,pt %xcc, etraptl1
|
||||
109: or %g7, %lo(109b), %g7
|
||||
mov %l4, %o1
|
||||
mov %l5, %o2
|
||||
call instruction_access_exception_tl1
|
||||
add %sp, PTREGS_OFF, %o0
|
||||
ba,pt %xcc, rtrap
|
||||
clr %l6
|
||||
rd %pc, %g7
|
||||
|
||||
__do_instruction_access_exception:
|
||||
rdpr %pstate, %g4
|
||||
wrpr %g4, PSTATE_MG|PSTATE_AG, %pstate
|
||||
mov TLB_SFSR, %g3
|
||||
mov DMMU_SFAR, %g5
|
||||
ldxa [%g3] ASI_DMMU, %g4 ! Get SFSR
|
||||
ldxa [%g5] ASI_DMMU, %g5 ! Get SFAR
|
||||
stxa %g0, [%g3] ASI_IMMU ! Clear FaultValid bit
|
||||
membar #Sync
|
||||
sethi %hi(109f), %g7
|
||||
ba,pt %xcc, etrap
|
||||
109: or %g7, %lo(109b), %g7
|
||||
mov %l4, %o1
|
||||
ba,pt %xcc, 2f
|
||||
nop
|
||||
|
||||
1: ba,pt %xcc, etrap_irq
|
||||
rd %pc, %g7
|
||||
|
||||
2: mov %l4, %o1
|
||||
mov %l5, %o2
|
||||
call instruction_access_exception
|
||||
call spitfire_access_error
|
||||
add %sp, PTREGS_OFF, %o0
|
||||
ba,pt %xcc, rtrap
|
||||
clr %l6
|
||||
|
@ -784,79 +808,124 @@ __do_instruction_access_exception:
|
|||
* as it is the only situation where we can safely record
|
||||
* and log. For trap level >1 we just clear the CE bit
|
||||
* in the AFSR and return.
|
||||
*/
|
||||
|
||||
/* Our trap handling infrastructure allows us to preserve
|
||||
* two 64-bit values during etrap for arguments to
|
||||
* subsequent C code. Therefore we encode the information
|
||||
* as follows:
|
||||
*
|
||||
* value 1) Full 64-bits of AFAR
|
||||
* value 2) Low 33-bits of AFSR, then bits 33-->42
|
||||
* are UDBL error status and bits 43-->52
|
||||
* are UDBH error status
|
||||
* This is just like __spiftire_access_error above, but it
|
||||
* specifically handles correctable errors. If an
|
||||
* uncorrectable error is indicated in the AFSR we
|
||||
* will branch directly above to __spitfire_access_error
|
||||
* to handle it instead. Uncorrectable therefore takes
|
||||
* priority over correctable, and the error logging
|
||||
* C code will notice this case by inspecting the
|
||||
* trap type.
|
||||
*/
|
||||
.align 64
|
||||
.globl cee_trap
|
||||
cee_trap:
|
||||
ldxa [%g0] ASI_AFSR, %g1 ! Read AFSR
|
||||
ldxa [%g0] ASI_AFAR, %g2 ! Read AFAR
|
||||
sllx %g1, 31, %g1 ! Clear reserved bits
|
||||
srlx %g1, 31, %g1 ! in AFSR
|
||||
.globl __spitfire_cee_trap
|
||||
__spitfire_cee_trap:
|
||||
ldxa [%g0] ASI_AFSR, %g4 ! Get AFSR
|
||||
mov 1, %g3
|
||||
sllx %g3, SFAFSR_UE_SHIFT, %g3
|
||||
andcc %g4, %g3, %g0 ! Check for UE
|
||||
bne,pn %xcc, __spitfire_access_error
|
||||
nop
|
||||
|
||||
/* NOTE: UltraSparc-I/II have high and low UDB error
|
||||
* registers, corresponding to the two UDB units
|
||||
* present on those chips. UltraSparc-IIi only
|
||||
* has a single UDB, called "SDB" in the manual.
|
||||
* For IIi the upper UDB register always reads
|
||||
* as zero so for our purposes things will just
|
||||
* work with the checks below.
|
||||
/* Ok, in this case we only have a correctable error.
|
||||
* Indicate we only wish to capture that state in register
|
||||
* %g1, and we only disable CE error reporting unlike UE
|
||||
* handling which disables all errors.
|
||||
*/
|
||||
ldxa [%g0] ASI_UDBL_ERROR_R, %g3 ! Read UDB-Low error status
|
||||
andcc %g3, (1 << 8), %g4 ! Check CE bit
|
||||
sllx %g3, (64 - 10), %g3 ! Clear reserved bits
|
||||
srlx %g3, (64 - 10), %g3 ! in UDB-Low error status
|
||||
ldxa [%g0] ASI_ESTATE_ERROR_EN, %g3
|
||||
andn %g3, ESTATE_ERR_CE, %g3
|
||||
stxa %g3, [%g0] ASI_ESTATE_ERROR_EN
|
||||
membar #Sync
|
||||
|
||||
sllx %g3, (33 + 0), %g3 ! Shift up to encoding area
|
||||
or %g1, %g3, %g1 ! Or it in
|
||||
be,pn %xcc, 1f ! Branch if CE bit was clear
|
||||
/* Preserve AFSR in %g4, indicate UDB state to capture in %g1 */
|
||||
ba,pt %xcc, __spitfire_cee_trap_continue
|
||||
mov UDBE_CE, %g1
|
||||
|
||||
.globl __spitfire_data_access_exception
|
||||
.globl __spitfire_data_access_exception_tl1
|
||||
__spitfire_data_access_exception_tl1:
|
||||
rdpr %pstate, %g4
|
||||
wrpr %g4, PSTATE_MG|PSTATE_AG, %pstate
|
||||
mov TLB_SFSR, %g3
|
||||
mov DMMU_SFAR, %g5
|
||||
ldxa [%g3] ASI_DMMU, %g4 ! Get SFSR
|
||||
ldxa [%g5] ASI_DMMU, %g5 ! Get SFAR
|
||||
stxa %g0, [%g3] ASI_DMMU ! Clear SFSR.FaultValid bit
|
||||
membar #Sync
|
||||
rdpr %tt, %g3
|
||||
cmp %g3, 0x80 ! first win spill/fill trap
|
||||
blu,pn %xcc, 1f
|
||||
cmp %g3, 0xff ! last win spill/fill trap
|
||||
bgu,pn %xcc, 1f
|
||||
nop
|
||||
stxa %g4, [%g0] ASI_UDB_ERROR_W ! Clear CE sticky bit in UDBL
|
||||
membar #Sync ! Synchronize ASI stores
|
||||
1: mov 0x18, %g5 ! Addr of UDB-High error status
|
||||
ldxa [%g5] ASI_UDBH_ERROR_R, %g3 ! Read it
|
||||
ba,pt %xcc, winfix_dax
|
||||
rdpr %tpc, %g3
|
||||
1: sethi %hi(109f), %g7
|
||||
ba,pt %xcc, etraptl1
|
||||
109: or %g7, %lo(109b), %g7
|
||||
mov %l4, %o1
|
||||
mov %l5, %o2
|
||||
call spitfire_data_access_exception_tl1
|
||||
add %sp, PTREGS_OFF, %o0
|
||||
ba,pt %xcc, rtrap
|
||||
clr %l6
|
||||
|
||||
andcc %g3, (1 << 8), %g4 ! Check CE bit
|
||||
sllx %g3, (64 - 10), %g3 ! Clear reserved bits
|
||||
srlx %g3, (64 - 10), %g3 ! in UDB-High error status
|
||||
sllx %g3, (33 + 10), %g3 ! Shift up to encoding area
|
||||
or %g1, %g3, %g1 ! Or it in
|
||||
be,pn %xcc, 1f ! Branch if CE bit was clear
|
||||
nop
|
||||
nop
|
||||
__spitfire_data_access_exception:
|
||||
rdpr %pstate, %g4
|
||||
wrpr %g4, PSTATE_MG|PSTATE_AG, %pstate
|
||||
mov TLB_SFSR, %g3
|
||||
mov DMMU_SFAR, %g5
|
||||
ldxa [%g3] ASI_DMMU, %g4 ! Get SFSR
|
||||
ldxa [%g5] ASI_DMMU, %g5 ! Get SFAR
|
||||
stxa %g0, [%g3] ASI_DMMU ! Clear SFSR.FaultValid bit
|
||||
membar #Sync
|
||||
sethi %hi(109f), %g7
|
||||
ba,pt %xcc, etrap
|
||||
109: or %g7, %lo(109b), %g7
|
||||
mov %l4, %o1
|
||||
mov %l5, %o2
|
||||
call spitfire_data_access_exception
|
||||
add %sp, PTREGS_OFF, %o0
|
||||
ba,pt %xcc, rtrap
|
||||
clr %l6
|
||||
|
||||
stxa %g4, [%g5] ASI_UDB_ERROR_W ! Clear CE sticky bit in UDBH
|
||||
membar #Sync ! Synchronize ASI stores
|
||||
1: mov 1, %g5 ! AFSR CE bit is
|
||||
sllx %g5, 20, %g5 ! bit 20
|
||||
stxa %g5, [%g0] ASI_AFSR ! Clear CE sticky bit in AFSR
|
||||
membar #Sync ! Synchronize ASI stores
|
||||
sllx %g2, (64 - 41), %g2 ! Clear reserved bits
|
||||
srlx %g2, (64 - 41), %g2 ! in latched AFAR
|
||||
.globl __spitfire_insn_access_exception
|
||||
.globl __spitfire_insn_access_exception_tl1
|
||||
__spitfire_insn_access_exception_tl1:
|
||||
rdpr %pstate, %g4
|
||||
wrpr %g4, PSTATE_MG|PSTATE_AG, %pstate
|
||||
mov TLB_SFSR, %g3
|
||||
ldxa [%g3] ASI_IMMU, %g4 ! Get SFSR
|
||||
rdpr %tpc, %g5 ! IMMU has no SFAR, use TPC
|
||||
stxa %g0, [%g3] ASI_IMMU ! Clear FaultValid bit
|
||||
membar #Sync
|
||||
sethi %hi(109f), %g7
|
||||
ba,pt %xcc, etraptl1
|
||||
109: or %g7, %lo(109b), %g7
|
||||
mov %l4, %o1
|
||||
mov %l5, %o2
|
||||
call spitfire_insn_access_exception_tl1
|
||||
add %sp, PTREGS_OFF, %o0
|
||||
ba,pt %xcc, rtrap
|
||||
clr %l6
|
||||
|
||||
andn %g2, 0x0f, %g2 ! Finish resv bit clearing
|
||||
mov %g1, %g4 ! Move AFSR+UDB* into save reg
|
||||
mov %g2, %g5 ! Move AFAR into save reg
|
||||
rdpr %pil, %g2
|
||||
wrpr %g0, 15, %pil
|
||||
ba,pt %xcc, etrap_irq
|
||||
rd %pc, %g7
|
||||
mov %l4, %o0
|
||||
|
||||
mov %l5, %o1
|
||||
call cee_log
|
||||
add %sp, PTREGS_OFF, %o2
|
||||
ba,a,pt %xcc, rtrap_irq
|
||||
__spitfire_insn_access_exception:
|
||||
rdpr %pstate, %g4
|
||||
wrpr %g4, PSTATE_MG|PSTATE_AG, %pstate
|
||||
mov TLB_SFSR, %g3
|
||||
ldxa [%g3] ASI_IMMU, %g4 ! Get SFSR
|
||||
rdpr %tpc, %g5 ! IMMU has no SFAR, use TPC
|
||||
stxa %g0, [%g3] ASI_IMMU ! Clear FaultValid bit
|
||||
membar #Sync
|
||||
sethi %hi(109f), %g7
|
||||
ba,pt %xcc, etrap
|
||||
109: or %g7, %lo(109b), %g7
|
||||
mov %l4, %o1
|
||||
mov %l5, %o2
|
||||
call spitfire_insn_access_exception
|
||||
add %sp, PTREGS_OFF, %o0
|
||||
ba,pt %xcc, rtrap
|
||||
clr %l6
|
||||
|
||||
/* Capture I/D/E-cache state into per-cpu error scoreboard.
|
||||
*
|
||||
|
|
|
@ -540,6 +540,7 @@ void pcibios_bus_to_resource(struct pci_dev *pdev, struct resource *res,
|
|||
|
||||
pbm->parent->resource_adjust(pdev, res, root);
|
||||
}
|
||||
EXPORT_SYMBOL(pcibios_bus_to_resource);
|
||||
|
||||
char * __init pcibios_setup(char *str)
|
||||
{
|
||||
|
|
|
@ -466,7 +466,7 @@ do_flush_sync:
|
|||
if (!limit)
|
||||
break;
|
||||
udelay(1);
|
||||
membar("#LoadLoad");
|
||||
rmb();
|
||||
}
|
||||
if (!limit)
|
||||
printk(KERN_WARNING "pci_strbuf_flush: flushflag timeout "
|
||||
|
|
|
@ -103,7 +103,7 @@ void cpu_idle(void)
|
|||
* other cpus see our increasing idleness for the buddy
|
||||
* redistribution algorithm. -DaveM
|
||||
*/
|
||||
membar("#StoreStore | #StoreLoad");
|
||||
membar_storeload_storestore();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -147,7 +147,7 @@ static void sbus_strbuf_flush(struct sbus_iommu *iommu, u32 base, unsigned long
|
|||
if (!limit)
|
||||
break;
|
||||
udelay(1);
|
||||
membar("#LoadLoad");
|
||||
rmb();
|
||||
}
|
||||
if (!limit)
|
||||
printk(KERN_WARNING "sbus_strbuf_flush: flushflag timeout "
|
||||
|
|
|
@ -33,7 +33,6 @@
|
|||
#include <linux/cpu.h>
|
||||
#include <linux/initrd.h>
|
||||
|
||||
#include <asm/segment.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/processor.h>
|
||||
|
|
|
@ -574,14 +574,13 @@ static inline void handle_signal(unsigned long signr, struct k_sigaction *ka,
|
|||
{
|
||||
setup_rt_frame(ka, regs, signr, oldset,
|
||||
(ka->sa.sa_flags & SA_SIGINFO) ? info : NULL);
|
||||
if (!(ka->sa.sa_flags & SA_NOMASK)) {
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NOMASK))
|
||||
sigaddset(¤t->blocked,signr);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
|
||||
struct sigaction *sa)
|
||||
|
|
|
@ -877,10 +877,11 @@ static void new_setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,
|
|||
unsigned long page = (unsigned long)
|
||||
page_address(pte_page(*ptep));
|
||||
|
||||
__asm__ __volatile__(
|
||||
" membar #StoreStore\n"
|
||||
" flush %0 + %1"
|
||||
: : "r" (page), "r" (address & (PAGE_SIZE - 1))
|
||||
wmb();
|
||||
__asm__ __volatile__("flush %0 + %1"
|
||||
: /* no outputs */
|
||||
: "r" (page),
|
||||
"r" (address & (PAGE_SIZE - 1))
|
||||
: "memory");
|
||||
}
|
||||
pte_unmap(ptep);
|
||||
|
@ -1292,10 +1293,11 @@ static void setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,
|
|||
unsigned long page = (unsigned long)
|
||||
page_address(pte_page(*ptep));
|
||||
|
||||
__asm__ __volatile__(
|
||||
" membar #StoreStore\n"
|
||||
" flush %0 + %1"
|
||||
: : "r" (page), "r" (address & (PAGE_SIZE - 1))
|
||||
wmb();
|
||||
__asm__ __volatile__("flush %0 + %1"
|
||||
: /* no outputs */
|
||||
: "r" (page),
|
||||
"r" (address & (PAGE_SIZE - 1))
|
||||
: "memory");
|
||||
}
|
||||
pte_unmap(ptep);
|
||||
|
@ -1325,14 +1327,13 @@ static inline void handle_signal32(unsigned long signr, struct k_sigaction *ka,
|
|||
else
|
||||
setup_frame32(&ka->sa, regs, signr, oldset, info);
|
||||
}
|
||||
if (!(ka->sa.sa_flags & SA_NOMASK)) {
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
|
||||
if (!(ka->sa.sa_flags & SA_NOMASK))
|
||||
sigaddset(¤t->blocked,signr);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs,
|
||||
struct sigaction *sa)
|
||||
|
|
|
@ -144,7 +144,7 @@ void __init smp_callin(void)
|
|||
current->active_mm = &init_mm;
|
||||
|
||||
while (!cpu_isset(cpuid, smp_commenced_mask))
|
||||
membar("#LoadLoad");
|
||||
rmb();
|
||||
|
||||
cpu_set(cpuid, cpu_online_map);
|
||||
}
|
||||
|
@ -184,11 +184,11 @@ static inline long get_delta (long *rt, long *master)
|
|||
for (i = 0; i < NUM_ITERS; i++) {
|
||||
t0 = tick_ops->get_tick();
|
||||
go[MASTER] = 1;
|
||||
membar("#StoreLoad");
|
||||
membar_storeload();
|
||||
while (!(tm = go[SLAVE]))
|
||||
membar("#LoadLoad");
|
||||
rmb();
|
||||
go[SLAVE] = 0;
|
||||
membar("#StoreStore");
|
||||
wmb();
|
||||
t1 = tick_ops->get_tick();
|
||||
|
||||
if (t1 - t0 < best_t1 - best_t0)
|
||||
|
@ -221,7 +221,7 @@ void smp_synchronize_tick_client(void)
|
|||
go[MASTER] = 1;
|
||||
|
||||
while (go[MASTER])
|
||||
membar("#LoadLoad");
|
||||
rmb();
|
||||
|
||||
local_irq_save(flags);
|
||||
{
|
||||
|
@ -273,21 +273,21 @@ static void smp_synchronize_one_tick(int cpu)
|
|||
|
||||
/* wait for client to be ready */
|
||||
while (!go[MASTER])
|
||||
membar("#LoadLoad");
|
||||
rmb();
|
||||
|
||||
/* now let the client proceed into his loop */
|
||||
go[MASTER] = 0;
|
||||
membar("#StoreLoad");
|
||||
membar_storeload();
|
||||
|
||||
spin_lock_irqsave(&itc_sync_lock, flags);
|
||||
{
|
||||
for (i = 0; i < NUM_ROUNDS*NUM_ITERS; i++) {
|
||||
while (!go[MASTER])
|
||||
membar("#LoadLoad");
|
||||
rmb();
|
||||
go[MASTER] = 0;
|
||||
membar("#StoreStore");
|
||||
wmb();
|
||||
go[SLAVE] = tick_ops->get_tick();
|
||||
membar("#StoreLoad");
|
||||
membar_storeload();
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&itc_sync_lock, flags);
|
||||
|
@ -927,11 +927,11 @@ void smp_capture(void)
|
|||
smp_processor_id());
|
||||
#endif
|
||||
penguins_are_doing_time = 1;
|
||||
membar("#StoreStore | #LoadStore");
|
||||
membar_storestore_loadstore();
|
||||
atomic_inc(&smp_capture_registry);
|
||||
smp_cross_call(&xcall_capture, 0, 0, 0);
|
||||
while (atomic_read(&smp_capture_registry) != ncpus)
|
||||
membar("#LoadLoad");
|
||||
rmb();
|
||||
#ifdef CAPTURE_DEBUG
|
||||
printk("done\n");
|
||||
#endif
|
||||
|
@ -947,7 +947,7 @@ void smp_release(void)
|
|||
smp_processor_id());
|
||||
#endif
|
||||
penguins_are_doing_time = 0;
|
||||
membar("#StoreStore | #StoreLoad");
|
||||
membar_storeload_storestore();
|
||||
atomic_dec(&smp_capture_registry);
|
||||
}
|
||||
}
|
||||
|
@ -970,9 +970,9 @@ void smp_penguin_jailcell(int irq, struct pt_regs *regs)
|
|||
save_alternate_globals(global_save);
|
||||
prom_world(1);
|
||||
atomic_inc(&smp_capture_registry);
|
||||
membar("#StoreLoad | #StoreStore");
|
||||
membar_storeload_storestore();
|
||||
while (penguins_are_doing_time)
|
||||
membar("#LoadLoad");
|
||||
rmb();
|
||||
restore_alternate_globals(global_save);
|
||||
atomic_dec(&smp_capture_registry);
|
||||
prom_world(0);
|
||||
|
|
|
@ -99,17 +99,6 @@ extern int __ashrdi3(int, int);
|
|||
extern void dump_thread(struct pt_regs *, struct user *);
|
||||
extern int dump_fpu (struct pt_regs * regs, elf_fpregset_t * fpregs);
|
||||
|
||||
#if defined(CONFIG_SMP) && defined(CONFIG_DEBUG_SPINLOCK)
|
||||
extern void _do_spin_lock (spinlock_t *lock, char *str);
|
||||
extern void _do_spin_unlock (spinlock_t *lock);
|
||||
extern int _spin_trylock (spinlock_t *lock);
|
||||
extern void _do_read_lock(rwlock_t *rw, char *str);
|
||||
extern void _do_read_unlock(rwlock_t *rw, char *str);
|
||||
extern void _do_write_lock(rwlock_t *rw, char *str);
|
||||
extern void _do_write_unlock(rwlock_t *rw);
|
||||
extern int _do_write_trylock(rwlock_t *rw, char *str);
|
||||
#endif
|
||||
|
||||
extern unsigned long phys_base;
|
||||
extern unsigned long pfn_base;
|
||||
|
||||
|
@ -152,18 +141,6 @@ EXPORT_SYMBOL(_mcount);
|
|||
EXPORT_SYMBOL(cpu_online_map);
|
||||
EXPORT_SYMBOL(phys_cpu_present_map);
|
||||
|
||||
/* Spinlock debugging library, optional. */
|
||||
#ifdef CONFIG_DEBUG_SPINLOCK
|
||||
EXPORT_SYMBOL(_do_spin_lock);
|
||||
EXPORT_SYMBOL(_do_spin_unlock);
|
||||
EXPORT_SYMBOL(_spin_trylock);
|
||||
EXPORT_SYMBOL(_do_read_lock);
|
||||
EXPORT_SYMBOL(_do_read_unlock);
|
||||
EXPORT_SYMBOL(_do_write_lock);
|
||||
EXPORT_SYMBOL(_do_write_unlock);
|
||||
EXPORT_SYMBOL(_do_write_trylock);
|
||||
#endif
|
||||
|
||||
EXPORT_SYMBOL(smp_call_function);
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
|
@ -429,3 +406,12 @@ EXPORT_SYMBOL(xor_vis_4);
|
|||
EXPORT_SYMBOL(xor_vis_5);
|
||||
|
||||
EXPORT_SYMBOL(prom_palette);
|
||||
|
||||
/* memory barriers */
|
||||
EXPORT_SYMBOL(mb);
|
||||
EXPORT_SYMBOL(rmb);
|
||||
EXPORT_SYMBOL(wmb);
|
||||
EXPORT_SYMBOL(membar_storeload);
|
||||
EXPORT_SYMBOL(membar_storeload_storestore);
|
||||
EXPORT_SYMBOL(membar_storeload_loadload);
|
||||
EXPORT_SYMBOL(membar_storestore_loadstore);
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include <asm/dcu.h>
|
||||
#include <asm/estate.h>
|
||||
#include <asm/chafsr.h>
|
||||
#include <asm/sfafsr.h>
|
||||
#include <asm/psrcompat.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/timer.h>
|
||||
|
@ -143,8 +144,7 @@ void do_BUG(const char *file, int line)
|
|||
}
|
||||
#endif
|
||||
|
||||
void instruction_access_exception(struct pt_regs *regs,
|
||||
unsigned long sfsr, unsigned long sfar)
|
||||
void spitfire_insn_access_exception(struct pt_regs *regs, unsigned long sfsr, unsigned long sfar)
|
||||
{
|
||||
siginfo_t info;
|
||||
|
||||
|
@ -153,8 +153,8 @@ void instruction_access_exception(struct pt_regs *regs,
|
|||
return;
|
||||
|
||||
if (regs->tstate & TSTATE_PRIV) {
|
||||
printk("instruction_access_exception: SFSR[%016lx] SFAR[%016lx], going.\n",
|
||||
sfsr, sfar);
|
||||
printk("spitfire_insn_access_exception: SFSR[%016lx] "
|
||||
"SFAR[%016lx], going.\n", sfsr, sfar);
|
||||
die_if_kernel("Iax", regs);
|
||||
}
|
||||
if (test_thread_flag(TIF_32BIT)) {
|
||||
|
@ -169,19 +169,17 @@ void instruction_access_exception(struct pt_regs *regs,
|
|||
force_sig_info(SIGSEGV, &info, current);
|
||||
}
|
||||
|
||||
void instruction_access_exception_tl1(struct pt_regs *regs,
|
||||
unsigned long sfsr, unsigned long sfar)
|
||||
void spitfire_insn_access_exception_tl1(struct pt_regs *regs, unsigned long sfsr, unsigned long sfar)
|
||||
{
|
||||
if (notify_die(DIE_TRAP_TL1, "instruction access exception tl1", regs,
|
||||
0, 0x8, SIGTRAP) == NOTIFY_STOP)
|
||||
return;
|
||||
|
||||
dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
|
||||
instruction_access_exception(regs, sfsr, sfar);
|
||||
spitfire_insn_access_exception(regs, sfsr, sfar);
|
||||
}
|
||||
|
||||
void data_access_exception(struct pt_regs *regs,
|
||||
unsigned long sfsr, unsigned long sfar)
|
||||
void spitfire_data_access_exception(struct pt_regs *regs, unsigned long sfsr, unsigned long sfar)
|
||||
{
|
||||
siginfo_t info;
|
||||
|
||||
|
@ -207,8 +205,8 @@ void data_access_exception(struct pt_regs *regs,
|
|||
return;
|
||||
}
|
||||
/* Shit... */
|
||||
printk("data_access_exception: SFSR[%016lx] SFAR[%016lx], going.\n",
|
||||
sfsr, sfar);
|
||||
printk("spitfire_data_access_exception: SFSR[%016lx] "
|
||||
"SFAR[%016lx], going.\n", sfsr, sfar);
|
||||
die_if_kernel("Dax", regs);
|
||||
}
|
||||
|
||||
|
@ -220,6 +218,16 @@ void data_access_exception(struct pt_regs *regs,
|
|||
force_sig_info(SIGSEGV, &info, current);
|
||||
}
|
||||
|
||||
void spitfire_data_access_exception_tl1(struct pt_regs *regs, unsigned long sfsr, unsigned long sfar)
|
||||
{
|
||||
if (notify_die(DIE_TRAP_TL1, "data access exception tl1", regs,
|
||||
0, 0x30, SIGTRAP) == NOTIFY_STOP)
|
||||
return;
|
||||
|
||||
dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
|
||||
spitfire_data_access_exception(regs, sfsr, sfar);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
/* This is really pathetic... */
|
||||
extern volatile int pci_poke_in_progress;
|
||||
|
@ -253,54 +261,13 @@ static void spitfire_clean_and_reenable_l1_caches(void)
|
|||
: "memory");
|
||||
}
|
||||
|
||||
void do_iae(struct pt_regs *regs)
|
||||
static void spitfire_enable_estate_errors(void)
|
||||
{
|
||||
siginfo_t info;
|
||||
|
||||
spitfire_clean_and_reenable_l1_caches();
|
||||
|
||||
if (notify_die(DIE_TRAP, "instruction access exception", regs,
|
||||
0, 0x8, SIGTRAP) == NOTIFY_STOP)
|
||||
return;
|
||||
|
||||
info.si_signo = SIGBUS;
|
||||
info.si_errno = 0;
|
||||
info.si_code = BUS_OBJERR;
|
||||
info.si_addr = (void *)0;
|
||||
info.si_trapno = 0;
|
||||
force_sig_info(SIGBUS, &info, current);
|
||||
}
|
||||
|
||||
void do_dae(struct pt_regs *regs)
|
||||
{
|
||||
siginfo_t info;
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
if (pci_poke_in_progress && pci_poke_cpu == smp_processor_id()) {
|
||||
spitfire_clean_and_reenable_l1_caches();
|
||||
|
||||
pci_poke_faulted = 1;
|
||||
|
||||
/* Why the fuck did they have to change this? */
|
||||
if (tlb_type == cheetah || tlb_type == cheetah_plus)
|
||||
regs->tpc += 4;
|
||||
|
||||
regs->tnpc = regs->tpc + 4;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
spitfire_clean_and_reenable_l1_caches();
|
||||
|
||||
if (notify_die(DIE_TRAP, "data access exception", regs,
|
||||
0, 0x30, SIGTRAP) == NOTIFY_STOP)
|
||||
return;
|
||||
|
||||
info.si_signo = SIGBUS;
|
||||
info.si_errno = 0;
|
||||
info.si_code = BUS_OBJERR;
|
||||
info.si_addr = (void *)0;
|
||||
info.si_trapno = 0;
|
||||
force_sig_info(SIGBUS, &info, current);
|
||||
__asm__ __volatile__("stxa %0, [%%g0] %1\n\t"
|
||||
"membar #Sync"
|
||||
: /* no outputs */
|
||||
: "r" (ESTATE_ERR_ALL),
|
||||
"i" (ASI_ESTATE_ERROR_EN));
|
||||
}
|
||||
|
||||
static char ecc_syndrome_table[] = {
|
||||
|
@ -338,65 +305,15 @@ static char ecc_syndrome_table[] = {
|
|||
0x0b, 0x48, 0x48, 0x4b, 0x48, 0x4b, 0x4b, 0x4a
|
||||
};
|
||||
|
||||
/* cee_trap in entry.S encodes AFSR/UDBH/UDBL error status
|
||||
* in the following format. The AFAR is left as is, with
|
||||
* reserved bits cleared, and is a raw 40-bit physical
|
||||
* address.
|
||||
*/
|
||||
#define CE_STATUS_UDBH_UE (1UL << (43 + 9))
|
||||
#define CE_STATUS_UDBH_CE (1UL << (43 + 8))
|
||||
#define CE_STATUS_UDBH_ESYNDR (0xffUL << 43)
|
||||
#define CE_STATUS_UDBH_SHIFT 43
|
||||
#define CE_STATUS_UDBL_UE (1UL << (33 + 9))
|
||||
#define CE_STATUS_UDBL_CE (1UL << (33 + 8))
|
||||
#define CE_STATUS_UDBL_ESYNDR (0xffUL << 33)
|
||||
#define CE_STATUS_UDBL_SHIFT 33
|
||||
#define CE_STATUS_AFSR_MASK (0x1ffffffffUL)
|
||||
#define CE_STATUS_AFSR_ME (1UL << 32)
|
||||
#define CE_STATUS_AFSR_PRIV (1UL << 31)
|
||||
#define CE_STATUS_AFSR_ISAP (1UL << 30)
|
||||
#define CE_STATUS_AFSR_ETP (1UL << 29)
|
||||
#define CE_STATUS_AFSR_IVUE (1UL << 28)
|
||||
#define CE_STATUS_AFSR_TO (1UL << 27)
|
||||
#define CE_STATUS_AFSR_BERR (1UL << 26)
|
||||
#define CE_STATUS_AFSR_LDP (1UL << 25)
|
||||
#define CE_STATUS_AFSR_CP (1UL << 24)
|
||||
#define CE_STATUS_AFSR_WP (1UL << 23)
|
||||
#define CE_STATUS_AFSR_EDP (1UL << 22)
|
||||
#define CE_STATUS_AFSR_UE (1UL << 21)
|
||||
#define CE_STATUS_AFSR_CE (1UL << 20)
|
||||
#define CE_STATUS_AFSR_ETS (0xfUL << 16)
|
||||
#define CE_STATUS_AFSR_ETS_SHIFT 16
|
||||
#define CE_STATUS_AFSR_PSYND (0xffffUL << 0)
|
||||
#define CE_STATUS_AFSR_PSYND_SHIFT 0
|
||||
|
||||
/* Layout of Ecache TAG Parity Syndrome of AFSR */
|
||||
#define AFSR_ETSYNDROME_7_0 0x1UL /* E$-tag bus bits <7:0> */
|
||||
#define AFSR_ETSYNDROME_15_8 0x2UL /* E$-tag bus bits <15:8> */
|
||||
#define AFSR_ETSYNDROME_21_16 0x4UL /* E$-tag bus bits <21:16> */
|
||||
#define AFSR_ETSYNDROME_24_22 0x8UL /* E$-tag bus bits <24:22> */
|
||||
|
||||
static char *syndrome_unknown = "<Unknown>";
|
||||
|
||||
asmlinkage void cee_log(unsigned long ce_status,
|
||||
unsigned long afar,
|
||||
struct pt_regs *regs)
|
||||
static void spitfire_log_udb_syndrome(unsigned long afar, unsigned long udbh, unsigned long udbl, unsigned long bit)
|
||||
{
|
||||
char memmod_str[64];
|
||||
char *p;
|
||||
unsigned short scode, udb_reg;
|
||||
unsigned short scode;
|
||||
char memmod_str[64], *p;
|
||||
|
||||
printk(KERN_WARNING "CPU[%d]: Correctable ECC Error "
|
||||
"AFSR[%lx] AFAR[%016lx] UDBL[%lx] UDBH[%lx]\n",
|
||||
smp_processor_id(),
|
||||
(ce_status & CE_STATUS_AFSR_MASK),
|
||||
afar,
|
||||
((ce_status >> CE_STATUS_UDBL_SHIFT) & 0x3ffUL),
|
||||
((ce_status >> CE_STATUS_UDBH_SHIFT) & 0x3ffUL));
|
||||
|
||||
udb_reg = ((ce_status >> CE_STATUS_UDBL_SHIFT) & 0x3ffUL);
|
||||
if (udb_reg & (1 << 8)) {
|
||||
scode = ecc_syndrome_table[udb_reg & 0xff];
|
||||
if (udbl & bit) {
|
||||
scode = ecc_syndrome_table[udbl & 0xff];
|
||||
if (prom_getunumber(scode, afar,
|
||||
memmod_str, sizeof(memmod_str)) == -1)
|
||||
p = syndrome_unknown;
|
||||
|
@ -407,9 +324,8 @@ asmlinkage void cee_log(unsigned long ce_status,
|
|||
smp_processor_id(), scode, p);
|
||||
}
|
||||
|
||||
udb_reg = ((ce_status >> CE_STATUS_UDBH_SHIFT) & 0x3ffUL);
|
||||
if (udb_reg & (1 << 8)) {
|
||||
scode = ecc_syndrome_table[udb_reg & 0xff];
|
||||
if (udbh & bit) {
|
||||
scode = ecc_syndrome_table[udbh & 0xff];
|
||||
if (prom_getunumber(scode, afar,
|
||||
memmod_str, sizeof(memmod_str)) == -1)
|
||||
p = syndrome_unknown;
|
||||
|
@ -419,6 +335,127 @@ asmlinkage void cee_log(unsigned long ce_status,
|
|||
"Memory Module \"%s\"\n",
|
||||
smp_processor_id(), scode, p);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void spitfire_cee_log(unsigned long afsr, unsigned long afar, unsigned long udbh, unsigned long udbl, int tl1, struct pt_regs *regs)
|
||||
{
|
||||
|
||||
printk(KERN_WARNING "CPU[%d]: Correctable ECC Error "
|
||||
"AFSR[%lx] AFAR[%016lx] UDBL[%lx] UDBH[%lx] TL>1[%d]\n",
|
||||
smp_processor_id(), afsr, afar, udbl, udbh, tl1);
|
||||
|
||||
spitfire_log_udb_syndrome(afar, udbh, udbl, UDBE_CE);
|
||||
|
||||
/* We always log it, even if someone is listening for this
|
||||
* trap.
|
||||
*/
|
||||
notify_die(DIE_TRAP, "Correctable ECC Error", regs,
|
||||
0, TRAP_TYPE_CEE, SIGTRAP);
|
||||
|
||||
/* The Correctable ECC Error trap does not disable I/D caches. So
|
||||
* we only have to restore the ESTATE Error Enable register.
|
||||
*/
|
||||
spitfire_enable_estate_errors();
|
||||
}
|
||||
|
||||
static void spitfire_ue_log(unsigned long afsr, unsigned long afar, unsigned long udbh, unsigned long udbl, unsigned long tt, int tl1, struct pt_regs *regs)
|
||||
{
|
||||
siginfo_t info;
|
||||
|
||||
printk(KERN_WARNING "CPU[%d]: Uncorrectable Error AFSR[%lx] "
|
||||
"AFAR[%lx] UDBL[%lx] UDBH[%ld] TT[%lx] TL>1[%d]\n",
|
||||
smp_processor_id(), afsr, afar, udbl, udbh, tt, tl1);
|
||||
|
||||
/* XXX add more human friendly logging of the error status
|
||||
* XXX as is implemented for cheetah
|
||||
*/
|
||||
|
||||
spitfire_log_udb_syndrome(afar, udbh, udbl, UDBE_UE);
|
||||
|
||||
/* We always log it, even if someone is listening for this
|
||||
* trap.
|
||||
*/
|
||||
notify_die(DIE_TRAP, "Uncorrectable Error", regs,
|
||||
0, tt, SIGTRAP);
|
||||
|
||||
if (regs->tstate & TSTATE_PRIV) {
|
||||
if (tl1)
|
||||
dump_tl1_traplog((struct tl1_traplog *)(regs + 1));
|
||||
die_if_kernel("UE", regs);
|
||||
}
|
||||
|
||||
/* XXX need more intelligent processing here, such as is implemented
|
||||
* XXX for cheetah errors, in fact if the E-cache still holds the
|
||||
* XXX line with bad parity this will loop
|
||||
*/
|
||||
|
||||
spitfire_clean_and_reenable_l1_caches();
|
||||
spitfire_enable_estate_errors();
|
||||
|
||||
if (test_thread_flag(TIF_32BIT)) {
|
||||
regs->tpc &= 0xffffffff;
|
||||
regs->tnpc &= 0xffffffff;
|
||||
}
|
||||
info.si_signo = SIGBUS;
|
||||
info.si_errno = 0;
|
||||
info.si_code = BUS_OBJERR;
|
||||
info.si_addr = (void *)0;
|
||||
info.si_trapno = 0;
|
||||
force_sig_info(SIGBUS, &info, current);
|
||||
}
|
||||
|
||||
void spitfire_access_error(struct pt_regs *regs, unsigned long status_encoded, unsigned long afar)
|
||||
{
|
||||
unsigned long afsr, tt, udbh, udbl;
|
||||
int tl1;
|
||||
|
||||
afsr = (status_encoded & SFSTAT_AFSR_MASK) >> SFSTAT_AFSR_SHIFT;
|
||||
tt = (status_encoded & SFSTAT_TRAP_TYPE) >> SFSTAT_TRAP_TYPE_SHIFT;
|
||||
tl1 = (status_encoded & SFSTAT_TL_GT_ONE) ? 1 : 0;
|
||||
udbl = (status_encoded & SFSTAT_UDBL_MASK) >> SFSTAT_UDBL_SHIFT;
|
||||
udbh = (status_encoded & SFSTAT_UDBH_MASK) >> SFSTAT_UDBH_SHIFT;
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
if (tt == TRAP_TYPE_DAE &&
|
||||
pci_poke_in_progress && pci_poke_cpu == smp_processor_id()) {
|
||||
spitfire_clean_and_reenable_l1_caches();
|
||||
spitfire_enable_estate_errors();
|
||||
|
||||
pci_poke_faulted = 1;
|
||||
regs->tnpc = regs->tpc + 4;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (afsr & SFAFSR_UE)
|
||||
spitfire_ue_log(afsr, afar, udbh, udbl, tt, tl1, regs);
|
||||
|
||||
if (tt == TRAP_TYPE_CEE) {
|
||||
/* Handle the case where we took a CEE trap, but ACK'd
|
||||
* only the UE state in the UDB error registers.
|
||||
*/
|
||||
if (afsr & SFAFSR_UE) {
|
||||
if (udbh & UDBE_CE) {
|
||||
__asm__ __volatile__(
|
||||
"stxa %0, [%1] %2\n\t"
|
||||
"membar #Sync"
|
||||
: /* no outputs */
|
||||
: "r" (udbh & UDBE_CE),
|
||||
"r" (0x0), "i" (ASI_UDB_ERROR_W));
|
||||
}
|
||||
if (udbl & UDBE_CE) {
|
||||
__asm__ __volatile__(
|
||||
"stxa %0, [%1] %2\n\t"
|
||||
"membar #Sync"
|
||||
: /* no outputs */
|
||||
: "r" (udbl & UDBE_CE),
|
||||
"r" (0x18), "i" (ASI_UDB_ERROR_W));
|
||||
}
|
||||
}
|
||||
|
||||
spitfire_cee_log(afsr, afar, udbh, udbl, tl1, regs);
|
||||
}
|
||||
}
|
||||
|
||||
int cheetah_pcache_forced_on;
|
||||
|
@ -2127,6 +2164,9 @@ void __init trap_init(void)
|
|||
TI_PRE_COUNT != offsetof(struct thread_info, preempt_count) ||
|
||||
TI_NEW_CHILD != offsetof(struct thread_info, new_child) ||
|
||||
TI_SYS_NOERROR != offsetof(struct thread_info, syscall_noerror) ||
|
||||
TI_RESTART_BLOCK != offsetof(struct thread_info, restart_block) ||
|
||||
TI_KUNA_REGS != offsetof(struct thread_info, kern_una_regs) ||
|
||||
TI_KUNA_INSN != offsetof(struct thread_info, kern_una_insn) ||
|
||||
TI_FPREGS != offsetof(struct thread_info, fpregs) ||
|
||||
(TI_FPREGS & (64 - 1)))
|
||||
thread_info_offsets_are_bolixed_dave();
|
||||
|
|
|
@ -18,9 +18,10 @@ sparc64_ttable_tl0:
|
|||
tl0_resv000: BOOT_KERNEL BTRAP(0x1) BTRAP(0x2) BTRAP(0x3)
|
||||
tl0_resv004: BTRAP(0x4) BTRAP(0x5) BTRAP(0x6) BTRAP(0x7)
|
||||
tl0_iax: membar #Sync
|
||||
TRAP_NOSAVE_7INSNS(__do_instruction_access_exception)
|
||||
TRAP_NOSAVE_7INSNS(__spitfire_insn_access_exception)
|
||||
tl0_resv009: BTRAP(0x9)
|
||||
tl0_iae: TRAP(do_iae)
|
||||
tl0_iae: membar #Sync
|
||||
TRAP_NOSAVE_7INSNS(__spitfire_access_error)
|
||||
tl0_resv00b: BTRAP(0xb) BTRAP(0xc) BTRAP(0xd) BTRAP(0xe) BTRAP(0xf)
|
||||
tl0_ill: membar #Sync
|
||||
TRAP_7INSNS(do_illegal_instruction)
|
||||
|
@ -36,9 +37,10 @@ tl0_cwin: CLEAN_WINDOW
|
|||
tl0_div0: TRAP(do_div0)
|
||||
tl0_resv029: BTRAP(0x29) BTRAP(0x2a) BTRAP(0x2b) BTRAP(0x2c) BTRAP(0x2d) BTRAP(0x2e)
|
||||
tl0_resv02f: BTRAP(0x2f)
|
||||
tl0_dax: TRAP_NOSAVE(__do_data_access_exception)
|
||||
tl0_dax: TRAP_NOSAVE(__spitfire_data_access_exception)
|
||||
tl0_resv031: BTRAP(0x31)
|
||||
tl0_dae: TRAP(do_dae)
|
||||
tl0_dae: membar #Sync
|
||||
TRAP_NOSAVE_7INSNS(__spitfire_access_error)
|
||||
tl0_resv033: BTRAP(0x33)
|
||||
tl0_mna: TRAP_NOSAVE(do_mna)
|
||||
tl0_lddfmna: TRAP_NOSAVE(do_lddfmna)
|
||||
|
@ -73,7 +75,8 @@ tl0_resv05c: BTRAP(0x5c) BTRAP(0x5d) BTRAP(0x5e) BTRAP(0x5f)
|
|||
tl0_ivec: TRAP_IVEC
|
||||
tl0_paw: TRAP(do_paw)
|
||||
tl0_vaw: TRAP(do_vaw)
|
||||
tl0_cee: TRAP_NOSAVE(cee_trap)
|
||||
tl0_cee: membar #Sync
|
||||
TRAP_NOSAVE_7INSNS(__spitfire_cee_trap)
|
||||
tl0_iamiss:
|
||||
#include "itlb_base.S"
|
||||
tl0_damiss:
|
||||
|
@ -175,9 +178,10 @@ tl0_resv1f0: BTRAPS(0x1f0) BTRAPS(0x1f8)
|
|||
sparc64_ttable_tl1:
|
||||
tl1_resv000: BOOT_KERNEL BTRAPTL1(0x1) BTRAPTL1(0x2) BTRAPTL1(0x3)
|
||||
tl1_resv004: BTRAPTL1(0x4) BTRAPTL1(0x5) BTRAPTL1(0x6) BTRAPTL1(0x7)
|
||||
tl1_iax: TRAP_NOSAVE(__do_instruction_access_exception_tl1)
|
||||
tl1_iax: TRAP_NOSAVE(__spitfire_insn_access_exception_tl1)
|
||||
tl1_resv009: BTRAPTL1(0x9)
|
||||
tl1_iae: TRAPTL1(do_iae_tl1)
|
||||
tl1_iae: membar #Sync
|
||||
TRAP_NOSAVE_7INSNS(__spitfire_access_error)
|
||||
tl1_resv00b: BTRAPTL1(0xb) BTRAPTL1(0xc) BTRAPTL1(0xd) BTRAPTL1(0xe) BTRAPTL1(0xf)
|
||||
tl1_ill: TRAPTL1(do_ill_tl1)
|
||||
tl1_privop: BTRAPTL1(0x11)
|
||||
|
@ -193,9 +197,10 @@ tl1_cwin: CLEAN_WINDOW
|
|||
tl1_div0: TRAPTL1(do_div0_tl1)
|
||||
tl1_resv029: BTRAPTL1(0x29) BTRAPTL1(0x2a) BTRAPTL1(0x2b) BTRAPTL1(0x2c)
|
||||
tl1_resv02d: BTRAPTL1(0x2d) BTRAPTL1(0x2e) BTRAPTL1(0x2f)
|
||||
tl1_dax: TRAP_NOSAVE(__do_data_access_exception_tl1)
|
||||
tl1_dax: TRAP_NOSAVE(__spitfire_data_access_exception_tl1)
|
||||
tl1_resv031: BTRAPTL1(0x31)
|
||||
tl1_dae: TRAPTL1(do_dae_tl1)
|
||||
tl1_dae: membar #Sync
|
||||
TRAP_NOSAVE_7INSNS(__spitfire_access_error)
|
||||
tl1_resv033: BTRAPTL1(0x33)
|
||||
tl1_mna: TRAP_NOSAVE(do_mna)
|
||||
tl1_lddfmna: TRAPTL1(do_lddfmna_tl1)
|
||||
|
@ -219,8 +224,8 @@ tl1_paw: TRAPTL1(do_paw_tl1)
|
|||
tl1_vaw: TRAPTL1(do_vaw_tl1)
|
||||
|
||||
/* The grotty trick to save %g1 into current->thread.cee_stuff
|
||||
* is because when we take this trap we could be interrupting trap
|
||||
* code already using the trap alternate global registers.
|
||||
* is because when we take this trap we could be interrupting
|
||||
* trap code already using the trap alternate global registers.
|
||||
*
|
||||
* We cross our fingers and pray that this store/load does
|
||||
* not cause yet another CEE trap.
|
||||
|
|
153
arch/sparc64/kernel/una_asm.S
Normal file
153
arch/sparc64/kernel/una_asm.S
Normal file
|
@ -0,0 +1,153 @@
|
|||
/* una_asm.S: Kernel unaligned trap assembler helpers.
|
||||
*
|
||||
* Copyright (C) 1996,2005 David S. Miller (davem@davemloft.net)
|
||||
* Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
|
||||
*/
|
||||
|
||||
.text
|
||||
|
||||
kernel_unaligned_trap_fault:
|
||||
call kernel_mna_trap_fault
|
||||
nop
|
||||
retl
|
||||
nop
|
||||
.size kern_unaligned_trap_fault, .-kern_unaligned_trap_fault
|
||||
|
||||
.globl __do_int_store
|
||||
__do_int_store:
|
||||
rd %asi, %o4
|
||||
wr %o3, 0, %asi
|
||||
ldx [%o2], %g3
|
||||
cmp %o1, 2
|
||||
be,pn %icc, 2f
|
||||
cmp %o1, 4
|
||||
be,pt %icc, 1f
|
||||
srlx %g3, 24, %g2
|
||||
srlx %g3, 56, %g1
|
||||
srlx %g3, 48, %g7
|
||||
4: stba %g1, [%o0] %asi
|
||||
srlx %g3, 40, %g1
|
||||
5: stba %g7, [%o0 + 1] %asi
|
||||
srlx %g3, 32, %g7
|
||||
6: stba %g1, [%o0 + 2] %asi
|
||||
7: stba %g7, [%o0 + 3] %asi
|
||||
srlx %g3, 16, %g1
|
||||
8: stba %g2, [%o0 + 4] %asi
|
||||
srlx %g3, 8, %g7
|
||||
9: stba %g1, [%o0 + 5] %asi
|
||||
10: stba %g7, [%o0 + 6] %asi
|
||||
ba,pt %xcc, 0f
|
||||
11: stba %g3, [%o0 + 7] %asi
|
||||
1: srl %g3, 16, %g7
|
||||
12: stba %g2, [%o0] %asi
|
||||
srl %g3, 8, %g2
|
||||
13: stba %g7, [%o0 + 1] %asi
|
||||
14: stba %g2, [%o0 + 2] %asi
|
||||
ba,pt %xcc, 0f
|
||||
15: stba %g3, [%o0 + 3] %asi
|
||||
2: srl %g3, 8, %g2
|
||||
16: stba %g2, [%o0] %asi
|
||||
17: stba %g3, [%o0 + 1] %asi
|
||||
0:
|
||||
wr %o4, 0x0, %asi
|
||||
retl
|
||||
nop
|
||||
.size __do_int_store, .-__do_int_store
|
||||
|
||||
.section __ex_table
|
||||
.word 4b, kernel_unaligned_trap_fault
|
||||
.word 5b, kernel_unaligned_trap_fault
|
||||
.word 6b, kernel_unaligned_trap_fault
|
||||
.word 7b, kernel_unaligned_trap_fault
|
||||
.word 8b, kernel_unaligned_trap_fault
|
||||
.word 9b, kernel_unaligned_trap_fault
|
||||
.word 10b, kernel_unaligned_trap_fault
|
||||
.word 11b, kernel_unaligned_trap_fault
|
||||
.word 12b, kernel_unaligned_trap_fault
|
||||
.word 13b, kernel_unaligned_trap_fault
|
||||
.word 14b, kernel_unaligned_trap_fault
|
||||
.word 15b, kernel_unaligned_trap_fault
|
||||
.word 16b, kernel_unaligned_trap_fault
|
||||
.word 17b, kernel_unaligned_trap_fault
|
||||
.previous
|
||||
|
||||
.globl do_int_load
|
||||
do_int_load:
|
||||
rd %asi, %o5
|
||||
wr %o4, 0, %asi
|
||||
cmp %o1, 8
|
||||
bge,pn %icc, 9f
|
||||
cmp %o1, 4
|
||||
be,pt %icc, 6f
|
||||
4: lduba [%o2] %asi, %g2
|
||||
5: lduba [%o2 + 1] %asi, %g3
|
||||
sll %g2, 8, %g2
|
||||
brz,pt %o3, 3f
|
||||
add %g2, %g3, %g2
|
||||
sllx %g2, 48, %g2
|
||||
srax %g2, 48, %g2
|
||||
3: ba,pt %xcc, 0f
|
||||
stx %g2, [%o0]
|
||||
6: lduba [%o2 + 1] %asi, %g3
|
||||
sll %g2, 24, %g2
|
||||
7: lduba [%o2 + 2] %asi, %g7
|
||||
sll %g3, 16, %g3
|
||||
8: lduba [%o2 + 3] %asi, %g1
|
||||
sll %g7, 8, %g7
|
||||
or %g2, %g3, %g2
|
||||
or %g7, %g1, %g7
|
||||
or %g2, %g7, %g2
|
||||
brnz,a,pt %o3, 3f
|
||||
sra %g2, 0, %g2
|
||||
3: ba,pt %xcc, 0f
|
||||
stx %g2, [%o0]
|
||||
9: lduba [%o2] %asi, %g2
|
||||
10: lduba [%o2 + 1] %asi, %g3
|
||||
sllx %g2, 56, %g2
|
||||
11: lduba [%o2 + 2] %asi, %g7
|
||||
sllx %g3, 48, %g3
|
||||
12: lduba [%o2 + 3] %asi, %g1
|
||||
sllx %g7, 40, %g7
|
||||
sllx %g1, 32, %g1
|
||||
or %g2, %g3, %g2
|
||||
or %g7, %g1, %g7
|
||||
13: lduba [%o2 + 4] %asi, %g3
|
||||
or %g2, %g7, %g7
|
||||
14: lduba [%o2 + 5] %asi, %g1
|
||||
sllx %g3, 24, %g3
|
||||
15: lduba [%o2 + 6] %asi, %g2
|
||||
sllx %g1, 16, %g1
|
||||
or %g7, %g3, %g7
|
||||
16: lduba [%o2 + 7] %asi, %g3
|
||||
sllx %g2, 8, %g2
|
||||
or %g7, %g1, %g7
|
||||
or %g2, %g3, %g2
|
||||
or %g7, %g2, %g7
|
||||
cmp %o1, 8
|
||||
be,a,pt %icc, 0f
|
||||
stx %g7, [%o0]
|
||||
srlx %g7, 32, %g2
|
||||
sra %g7, 0, %g7
|
||||
stx %g2, [%o0]
|
||||
stx %g7, [%o0 + 8]
|
||||
0:
|
||||
wr %o5, 0x0, %asi
|
||||
retl
|
||||
nop
|
||||
.size __do_int_load, .-__do_int_load
|
||||
|
||||
.section __ex_table
|
||||
.word 4b, kernel_unaligned_trap_fault
|
||||
.word 5b, kernel_unaligned_trap_fault
|
||||
.word 6b, kernel_unaligned_trap_fault
|
||||
.word 7b, kernel_unaligned_trap_fault
|
||||
.word 8b, kernel_unaligned_trap_fault
|
||||
.word 9b, kernel_unaligned_trap_fault
|
||||
.word 10b, kernel_unaligned_trap_fault
|
||||
.word 11b, kernel_unaligned_trap_fault
|
||||
.word 12b, kernel_unaligned_trap_fault
|
||||
.word 13b, kernel_unaligned_trap_fault
|
||||
.word 14b, kernel_unaligned_trap_fault
|
||||
.word 15b, kernel_unaligned_trap_fault
|
||||
.word 16b, kernel_unaligned_trap_fault
|
||||
.previous
|
|
@ -180,169 +180,28 @@ static void __attribute_used__ unaligned_panic(char *str, struct pt_regs *regs)
|
|||
die_if_kernel(str, regs);
|
||||
}
|
||||
|
||||
#define do_integer_load(dest_reg, size, saddr, is_signed, asi, errh) ({ \
|
||||
__asm__ __volatile__ ( \
|
||||
"wr %4, 0, %%asi\n\t" \
|
||||
"cmp %1, 8\n\t" \
|
||||
"bge,pn %%icc, 9f\n\t" \
|
||||
" cmp %1, 4\n\t" \
|
||||
"be,pt %%icc, 6f\n" \
|
||||
"4:\t" " lduba [%2] %%asi, %%l1\n" \
|
||||
"5:\t" "lduba [%2 + 1] %%asi, %%l2\n\t" \
|
||||
"sll %%l1, 8, %%l1\n\t" \
|
||||
"brz,pt %3, 3f\n\t" \
|
||||
" add %%l1, %%l2, %%l1\n\t" \
|
||||
"sllx %%l1, 48, %%l1\n\t" \
|
||||
"srax %%l1, 48, %%l1\n" \
|
||||
"3:\t" "ba,pt %%xcc, 0f\n\t" \
|
||||
" stx %%l1, [%0]\n" \
|
||||
"6:\t" "lduba [%2 + 1] %%asi, %%l2\n\t" \
|
||||
"sll %%l1, 24, %%l1\n" \
|
||||
"7:\t" "lduba [%2 + 2] %%asi, %%g7\n\t" \
|
||||
"sll %%l2, 16, %%l2\n" \
|
||||
"8:\t" "lduba [%2 + 3] %%asi, %%g1\n\t" \
|
||||
"sll %%g7, 8, %%g7\n\t" \
|
||||
"or %%l1, %%l2, %%l1\n\t" \
|
||||
"or %%g7, %%g1, %%g7\n\t" \
|
||||
"or %%l1, %%g7, %%l1\n\t" \
|
||||
"brnz,a,pt %3, 3f\n\t" \
|
||||
" sra %%l1, 0, %%l1\n" \
|
||||
"3:\t" "ba,pt %%xcc, 0f\n\t" \
|
||||
" stx %%l1, [%0]\n" \
|
||||
"9:\t" "lduba [%2] %%asi, %%l1\n" \
|
||||
"10:\t" "lduba [%2 + 1] %%asi, %%l2\n\t" \
|
||||
"sllx %%l1, 56, %%l1\n" \
|
||||
"11:\t" "lduba [%2 + 2] %%asi, %%g7\n\t" \
|
||||
"sllx %%l2, 48, %%l2\n" \
|
||||
"12:\t" "lduba [%2 + 3] %%asi, %%g1\n\t" \
|
||||
"sllx %%g7, 40, %%g7\n\t" \
|
||||
"sllx %%g1, 32, %%g1\n\t" \
|
||||
"or %%l1, %%l2, %%l1\n\t" \
|
||||
"or %%g7, %%g1, %%g7\n" \
|
||||
"13:\t" "lduba [%2 + 4] %%asi, %%l2\n\t" \
|
||||
"or %%l1, %%g7, %%g7\n" \
|
||||
"14:\t" "lduba [%2 + 5] %%asi, %%g1\n\t" \
|
||||
"sllx %%l2, 24, %%l2\n" \
|
||||
"15:\t" "lduba [%2 + 6] %%asi, %%l1\n\t" \
|
||||
"sllx %%g1, 16, %%g1\n\t" \
|
||||
"or %%g7, %%l2, %%g7\n" \
|
||||
"16:\t" "lduba [%2 + 7] %%asi, %%l2\n\t" \
|
||||
"sllx %%l1, 8, %%l1\n\t" \
|
||||
"or %%g7, %%g1, %%g7\n\t" \
|
||||
"or %%l1, %%l2, %%l1\n\t" \
|
||||
"or %%g7, %%l1, %%g7\n\t" \
|
||||
"cmp %1, 8\n\t" \
|
||||
"be,a,pt %%icc, 0f\n\t" \
|
||||
" stx %%g7, [%0]\n\t" \
|
||||
"srlx %%g7, 32, %%l1\n\t" \
|
||||
"sra %%g7, 0, %%g7\n\t" \
|
||||
"stx %%l1, [%0]\n\t" \
|
||||
"stx %%g7, [%0 + 8]\n" \
|
||||
"0:\n\t" \
|
||||
"wr %%g0, %5, %%asi\n\n\t" \
|
||||
".section __ex_table\n\t" \
|
||||
".word 4b, " #errh "\n\t" \
|
||||
".word 5b, " #errh "\n\t" \
|
||||
".word 6b, " #errh "\n\t" \
|
||||
".word 7b, " #errh "\n\t" \
|
||||
".word 8b, " #errh "\n\t" \
|
||||
".word 9b, " #errh "\n\t" \
|
||||
".word 10b, " #errh "\n\t" \
|
||||
".word 11b, " #errh "\n\t" \
|
||||
".word 12b, " #errh "\n\t" \
|
||||
".word 13b, " #errh "\n\t" \
|
||||
".word 14b, " #errh "\n\t" \
|
||||
".word 15b, " #errh "\n\t" \
|
||||
".word 16b, " #errh "\n\n\t" \
|
||||
".previous\n\t" \
|
||||
: : "r" (dest_reg), "r" (size), "r" (saddr), "r" (is_signed), \
|
||||
"r" (asi), "i" (ASI_AIUS) \
|
||||
: "l1", "l2", "g7", "g1", "cc"); \
|
||||
})
|
||||
extern void do_int_load(unsigned long *dest_reg, int size,
|
||||
unsigned long *saddr, int is_signed, int asi);
|
||||
|
||||
#define store_common(dst_addr, size, src_val, asi, errh) ({ \
|
||||
__asm__ __volatile__ ( \
|
||||
"wr %3, 0, %%asi\n\t" \
|
||||
"ldx [%2], %%l1\n" \
|
||||
"cmp %1, 2\n\t" \
|
||||
"be,pn %%icc, 2f\n\t" \
|
||||
" cmp %1, 4\n\t" \
|
||||
"be,pt %%icc, 1f\n\t" \
|
||||
" srlx %%l1, 24, %%l2\n\t" \
|
||||
"srlx %%l1, 56, %%g1\n\t" \
|
||||
"srlx %%l1, 48, %%g7\n" \
|
||||
"4:\t" "stba %%g1, [%0] %%asi\n\t" \
|
||||
"srlx %%l1, 40, %%g1\n" \
|
||||
"5:\t" "stba %%g7, [%0 + 1] %%asi\n\t" \
|
||||
"srlx %%l1, 32, %%g7\n" \
|
||||
"6:\t" "stba %%g1, [%0 + 2] %%asi\n" \
|
||||
"7:\t" "stba %%g7, [%0 + 3] %%asi\n\t" \
|
||||
"srlx %%l1, 16, %%g1\n" \
|
||||
"8:\t" "stba %%l2, [%0 + 4] %%asi\n\t" \
|
||||
"srlx %%l1, 8, %%g7\n" \
|
||||
"9:\t" "stba %%g1, [%0 + 5] %%asi\n" \
|
||||
"10:\t" "stba %%g7, [%0 + 6] %%asi\n\t" \
|
||||
"ba,pt %%xcc, 0f\n" \
|
||||
"11:\t" " stba %%l1, [%0 + 7] %%asi\n" \
|
||||
"1:\t" "srl %%l1, 16, %%g7\n" \
|
||||
"12:\t" "stba %%l2, [%0] %%asi\n\t" \
|
||||
"srl %%l1, 8, %%l2\n" \
|
||||
"13:\t" "stba %%g7, [%0 + 1] %%asi\n" \
|
||||
"14:\t" "stba %%l2, [%0 + 2] %%asi\n\t" \
|
||||
"ba,pt %%xcc, 0f\n" \
|
||||
"15:\t" " stba %%l1, [%0 + 3] %%asi\n" \
|
||||
"2:\t" "srl %%l1, 8, %%l2\n" \
|
||||
"16:\t" "stba %%l2, [%0] %%asi\n" \
|
||||
"17:\t" "stba %%l1, [%0 + 1] %%asi\n" \
|
||||
"0:\n\t" \
|
||||
"wr %%g0, %4, %%asi\n\n\t" \
|
||||
".section __ex_table\n\t" \
|
||||
".word 4b, " #errh "\n\t" \
|
||||
".word 5b, " #errh "\n\t" \
|
||||
".word 6b, " #errh "\n\t" \
|
||||
".word 7b, " #errh "\n\t" \
|
||||
".word 8b, " #errh "\n\t" \
|
||||
".word 9b, " #errh "\n\t" \
|
||||
".word 10b, " #errh "\n\t" \
|
||||
".word 11b, " #errh "\n\t" \
|
||||
".word 12b, " #errh "\n\t" \
|
||||
".word 13b, " #errh "\n\t" \
|
||||
".word 14b, " #errh "\n\t" \
|
||||
".word 15b, " #errh "\n\t" \
|
||||
".word 16b, " #errh "\n\t" \
|
||||
".word 17b, " #errh "\n\n\t" \
|
||||
".previous\n\t" \
|
||||
: : "r" (dst_addr), "r" (size), "r" (src_val), "r" (asi), "i" (ASI_AIUS)\
|
||||
: "l1", "l2", "g7", "g1", "cc"); \
|
||||
})
|
||||
extern void __do_int_store(unsigned long *dst_addr, int size,
|
||||
unsigned long *src_val, int asi);
|
||||
|
||||
#define do_integer_store(reg_num, size, dst_addr, regs, asi, errh) ({ \
|
||||
unsigned long zero = 0; \
|
||||
unsigned long *src_val = &zero; \
|
||||
\
|
||||
if (size == 16) { \
|
||||
size = 8; \
|
||||
zero = (((long)(reg_num ? \
|
||||
(unsigned)fetch_reg(reg_num, regs) : 0)) << 32) | \
|
||||
(unsigned)fetch_reg(reg_num + 1, regs); \
|
||||
} else if (reg_num) src_val = fetch_reg_addr(reg_num, regs); \
|
||||
store_common(dst_addr, size, src_val, asi, errh); \
|
||||
})
|
||||
static inline void do_int_store(int reg_num, int size, unsigned long *dst_addr,
|
||||
struct pt_regs *regs, int asi)
|
||||
{
|
||||
unsigned long zero = 0;
|
||||
unsigned long *src_val = &zero;
|
||||
|
||||
extern void smp_capture(void);
|
||||
extern void smp_release(void);
|
||||
|
||||
#define do_atomic(srcdest_reg, mem, errh) ({ \
|
||||
unsigned long flags, tmp; \
|
||||
\
|
||||
smp_capture(); \
|
||||
local_irq_save(flags); \
|
||||
tmp = *srcdest_reg; \
|
||||
do_integer_load(srcdest_reg, 4, mem, 0, errh); \
|
||||
store_common(mem, 4, &tmp, errh); \
|
||||
local_irq_restore(flags); \
|
||||
smp_release(); \
|
||||
})
|
||||
if (size == 16) {
|
||||
size = 8;
|
||||
zero = (((long)(reg_num ?
|
||||
(unsigned)fetch_reg(reg_num, regs) : 0)) << 32) |
|
||||
(unsigned)fetch_reg(reg_num + 1, regs);
|
||||
} else if (reg_num) {
|
||||
src_val = fetch_reg_addr(reg_num, regs);
|
||||
}
|
||||
__do_int_store(dst_addr, size, src_val, asi);
|
||||
}
|
||||
|
||||
static inline void advance(struct pt_regs *regs)
|
||||
{
|
||||
|
@ -364,24 +223,29 @@ static inline int ok_for_kernel(unsigned int insn)
|
|||
return !floating_point_load_or_store_p(insn);
|
||||
}
|
||||
|
||||
void kernel_mna_trap_fault(struct pt_regs *regs, unsigned int insn) __asm__ ("kernel_mna_trap_fault");
|
||||
|
||||
void kernel_mna_trap_fault(struct pt_regs *regs, unsigned int insn)
|
||||
void kernel_mna_trap_fault(void)
|
||||
{
|
||||
struct pt_regs *regs = current_thread_info()->kern_una_regs;
|
||||
unsigned int insn = current_thread_info()->kern_una_insn;
|
||||
unsigned long g2 = regs->u_regs[UREG_G2];
|
||||
unsigned long fixup = search_extables_range(regs->tpc, &g2);
|
||||
|
||||
if (!fixup) {
|
||||
unsigned long address = compute_effective_address(regs, insn, ((insn >> 25) & 0x1f));
|
||||
unsigned long address;
|
||||
|
||||
address = compute_effective_address(regs, insn,
|
||||
((insn >> 25) & 0x1f));
|
||||
if (address < PAGE_SIZE) {
|
||||
printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference in mna handler");
|
||||
printk(KERN_ALERT "Unable to handle kernel NULL "
|
||||
"pointer dereference in mna handler");
|
||||
} else
|
||||
printk(KERN_ALERT "Unable to handle kernel paging request in mna handler");
|
||||
printk(KERN_ALERT "Unable to handle kernel paging "
|
||||
"request in mna handler");
|
||||
printk(KERN_ALERT " at virtual address %016lx\n",address);
|
||||
printk(KERN_ALERT "current->{mm,active_mm}->context = %016lx\n",
|
||||
printk(KERN_ALERT "current->{active_,}mm->context = %016lx\n",
|
||||
(current->mm ? CTX_HWBITS(current->mm->context) :
|
||||
CTX_HWBITS(current->active_mm->context)));
|
||||
printk(KERN_ALERT "current->{mm,active_mm}->pgd = %016lx\n",
|
||||
printk(KERN_ALERT "current->{active_,}mm->pgd = %016lx\n",
|
||||
(current->mm ? (unsigned long) current->mm->pgd :
|
||||
(unsigned long) current->active_mm->pgd));
|
||||
die_if_kernel("Oops", regs);
|
||||
|
@ -400,48 +264,41 @@ asmlinkage void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn, u
|
|||
enum direction dir = decode_direction(insn);
|
||||
int size = decode_access_size(insn);
|
||||
|
||||
current_thread_info()->kern_una_regs = regs;
|
||||
current_thread_info()->kern_una_insn = insn;
|
||||
|
||||
if (!ok_for_kernel(insn) || dir == both) {
|
||||
printk("Unsupported unaligned load/store trap for kernel at <%016lx>.\n",
|
||||
regs->tpc);
|
||||
unaligned_panic("Kernel does fpu/atomic unaligned load/store.", regs);
|
||||
printk("Unsupported unaligned load/store trap for kernel "
|
||||
"at <%016lx>.\n", regs->tpc);
|
||||
unaligned_panic("Kernel does fpu/atomic "
|
||||
"unaligned load/store.", regs);
|
||||
|
||||
__asm__ __volatile__ ("\n"
|
||||
"kernel_unaligned_trap_fault:\n\t"
|
||||
"mov %0, %%o0\n\t"
|
||||
"call kernel_mna_trap_fault\n\t"
|
||||
" mov %1, %%o1\n\t"
|
||||
:
|
||||
: "r" (regs), "r" (insn)
|
||||
: "o0", "o1", "o2", "o3", "o4", "o5", "o7",
|
||||
"g1", "g2", "g3", "g4", "g7", "cc");
|
||||
kernel_mna_trap_fault();
|
||||
} else {
|
||||
unsigned long addr = compute_effective_address(regs, insn, ((insn >> 25) & 0x1f));
|
||||
unsigned long addr;
|
||||
|
||||
addr = compute_effective_address(regs, insn,
|
||||
((insn >> 25) & 0x1f));
|
||||
#ifdef DEBUG_MNA
|
||||
printk("KMNA: pc=%016lx [dir=%s addr=%016lx size=%d] retpc[%016lx]\n",
|
||||
regs->tpc, dirstrings[dir], addr, size, regs->u_regs[UREG_RETPC]);
|
||||
printk("KMNA: pc=%016lx [dir=%s addr=%016lx size=%d] "
|
||||
"retpc[%016lx]\n",
|
||||
regs->tpc, dirstrings[dir], addr, size,
|
||||
regs->u_regs[UREG_RETPC]);
|
||||
#endif
|
||||
switch (dir) {
|
||||
case load:
|
||||
do_integer_load(fetch_reg_addr(((insn>>25)&0x1f), regs),
|
||||
do_int_load(fetch_reg_addr(((insn>>25)&0x1f), regs),
|
||||
size, (unsigned long *) addr,
|
||||
decode_signedness(insn), decode_asi(insn, regs),
|
||||
kernel_unaligned_trap_fault);
|
||||
decode_signedness(insn),
|
||||
decode_asi(insn, regs));
|
||||
break;
|
||||
|
||||
case store:
|
||||
do_integer_store(((insn>>25)&0x1f), size,
|
||||
do_int_store(((insn>>25)&0x1f), size,
|
||||
(unsigned long *) addr, regs,
|
||||
decode_asi(insn, regs),
|
||||
kernel_unaligned_trap_fault);
|
||||
decode_asi(insn, regs));
|
||||
break;
|
||||
#if 0 /* unsupported */
|
||||
case both:
|
||||
do_atomic(fetch_reg_addr(((insn>>25)&0x1f), regs),
|
||||
(unsigned long *) addr,
|
||||
kernel_unaligned_trap_fault);
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
panic("Impossible kernel unaligned trap.");
|
||||
/* Not reached... */
|
||||
|
@ -492,7 +349,7 @@ int handle_popc(u32 insn, struct pt_regs *regs)
|
|||
|
||||
extern void do_fpother(struct pt_regs *regs);
|
||||
extern void do_privact(struct pt_regs *regs);
|
||||
extern void data_access_exception(struct pt_regs *regs,
|
||||
extern void spitfire_data_access_exception(struct pt_regs *regs,
|
||||
unsigned long sfsr,
|
||||
unsigned long sfar);
|
||||
|
||||
|
@ -537,14 +394,14 @@ int handle_ldf_stq(u32 insn, struct pt_regs *regs)
|
|||
break;
|
||||
}
|
||||
default:
|
||||
data_access_exception(regs, 0, addr);
|
||||
spitfire_data_access_exception(regs, 0, addr);
|
||||
return 1;
|
||||
}
|
||||
if (put_user (first >> 32, (u32 __user *)addr) ||
|
||||
__put_user ((u32)first, (u32 __user *)(addr + 4)) ||
|
||||
__put_user (second >> 32, (u32 __user *)(addr + 8)) ||
|
||||
__put_user ((u32)second, (u32 __user *)(addr + 12))) {
|
||||
data_access_exception(regs, 0, addr);
|
||||
spitfire_data_access_exception(regs, 0, addr);
|
||||
return 1;
|
||||
}
|
||||
} else {
|
||||
|
@ -557,7 +414,7 @@ int handle_ldf_stq(u32 insn, struct pt_regs *regs)
|
|||
do_privact(regs);
|
||||
return 1;
|
||||
} else if (asi > ASI_SNFL) {
|
||||
data_access_exception(regs, 0, addr);
|
||||
spitfire_data_access_exception(regs, 0, addr);
|
||||
return 1;
|
||||
}
|
||||
switch (insn & 0x180000) {
|
||||
|
@ -574,7 +431,7 @@ int handle_ldf_stq(u32 insn, struct pt_regs *regs)
|
|||
err |= __get_user (data[i], (u32 __user *)(addr + 4*i));
|
||||
}
|
||||
if (err && !(asi & 0x2 /* NF */)) {
|
||||
data_access_exception(regs, 0, addr);
|
||||
spitfire_data_access_exception(regs, 0, addr);
|
||||
return 1;
|
||||
}
|
||||
if (asi & 0x8) /* Little */ {
|
||||
|
@ -677,7 +534,7 @@ void handle_lddfmna(struct pt_regs *regs, unsigned long sfar, unsigned long sfsr
|
|||
*(u64 *)(f->regs + freg) = value;
|
||||
current_thread_info()->fpsaved[0] |= flag;
|
||||
} else {
|
||||
daex: data_access_exception(regs, sfsr, sfar);
|
||||
daex: spitfire_data_access_exception(regs, sfsr, sfar);
|
||||
return;
|
||||
}
|
||||
advance(regs);
|
||||
|
@ -721,7 +578,7 @@ void handle_stdfmna(struct pt_regs *regs, unsigned long sfar, unsigned long sfsr
|
|||
__put_user ((u32)value, (u32 __user *)(sfar + 4)))
|
||||
goto daex;
|
||||
} else {
|
||||
daex: data_access_exception(regs, sfsr, sfar);
|
||||
daex: spitfire_data_access_exception(regs, sfsr, sfar);
|
||||
return;
|
||||
}
|
||||
advance(regs);
|
||||
|
|
|
@ -88,7 +88,6 @@ static void frob_mem_refresh(int cpu_slowing_down,
|
|||
{
|
||||
unsigned long old_refr_count, refr_count, mctrl;
|
||||
|
||||
|
||||
refr_count = (clock_tick * MCTRL0_REFR_INTERVAL);
|
||||
refr_count /= (MCTRL0_REFR_CLKS_P_CNT * divisor * 1000000000UL);
|
||||
|
||||
|
@ -230,6 +229,25 @@ static unsigned long estar_to_divisor(unsigned long estar)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static unsigned int us2e_freq_get(unsigned int cpu)
|
||||
{
|
||||
cpumask_t cpus_allowed;
|
||||
unsigned long clock_tick, estar;
|
||||
|
||||
if (!cpu_online(cpu))
|
||||
return 0;
|
||||
|
||||
cpus_allowed = current->cpus_allowed;
|
||||
set_cpus_allowed(current, cpumask_of_cpu(cpu));
|
||||
|
||||
clock_tick = sparc64_get_clock_tick(cpu) / 1000;
|
||||
estar = read_hbreg(HBIRD_ESTAR_MODE_ADDR);
|
||||
|
||||
set_cpus_allowed(current, cpus_allowed);
|
||||
|
||||
return clock_tick / estar_to_divisor(estar);
|
||||
}
|
||||
|
||||
static void us2e_set_cpu_divider_index(unsigned int cpu, unsigned int index)
|
||||
{
|
||||
unsigned long new_bits, new_freq;
|
||||
|
@ -243,7 +261,7 @@ static void us2e_set_cpu_divider_index(unsigned int cpu, unsigned int index)
|
|||
cpus_allowed = current->cpus_allowed;
|
||||
set_cpus_allowed(current, cpumask_of_cpu(cpu));
|
||||
|
||||
new_freq = clock_tick = sparc64_get_clock_tick(cpu);
|
||||
new_freq = clock_tick = sparc64_get_clock_tick(cpu) / 1000;
|
||||
new_bits = index_to_estar_mode(index);
|
||||
divisor = index_to_divisor(index);
|
||||
new_freq /= divisor;
|
||||
|
@ -258,7 +276,8 @@ static void us2e_set_cpu_divider_index(unsigned int cpu, unsigned int index)
|
|||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
if (old_divisor != divisor)
|
||||
us2e_transition(estar, new_bits, clock_tick, old_divisor, divisor);
|
||||
us2e_transition(estar, new_bits, clock_tick * 1000,
|
||||
old_divisor, divisor);
|
||||
|
||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||
|
||||
|
@ -273,9 +292,7 @@ static int us2e_freq_target(struct cpufreq_policy *policy,
|
|||
|
||||
if (cpufreq_frequency_table_target(policy,
|
||||
&us2e_freq_table[policy->cpu].table[0],
|
||||
target_freq,
|
||||
relation,
|
||||
&new_index))
|
||||
target_freq, relation, &new_index))
|
||||
return -EINVAL;
|
||||
|
||||
us2e_set_cpu_divider_index(policy->cpu, new_index);
|
||||
|
@ -292,7 +309,7 @@ static int us2e_freq_verify(struct cpufreq_policy *policy)
|
|||
static int __init us2e_freq_cpu_init(struct cpufreq_policy *policy)
|
||||
{
|
||||
unsigned int cpu = policy->cpu;
|
||||
unsigned long clock_tick = sparc64_get_clock_tick(cpu);
|
||||
unsigned long clock_tick = sparc64_get_clock_tick(cpu) / 1000;
|
||||
struct cpufreq_frequency_table *table =
|
||||
&us2e_freq_table[cpu].table[0];
|
||||
|
||||
|
@ -351,9 +368,10 @@ static int __init us2e_freq_init(void)
|
|||
memset(us2e_freq_table, 0,
|
||||
(NR_CPUS * sizeof(struct us2e_freq_percpu_info)));
|
||||
|
||||
driver->init = us2e_freq_cpu_init;
|
||||
driver->verify = us2e_freq_verify;
|
||||
driver->target = us2e_freq_target;
|
||||
driver->init = us2e_freq_cpu_init;
|
||||
driver->get = us2e_freq_get;
|
||||
driver->exit = us2e_freq_cpu_exit;
|
||||
driver->owner = THIS_MODULE,
|
||||
strcpy(driver->name, "UltraSPARC-IIe");
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Reference in a new issue