Merge with /pub/scm/linux/kernel/git/torvalds/linux-2.6.git
french@hera:~/linux-2.6(0)$ cg-update l `/pub/scm/linux/kernel/git/torvalds/linux-2.6.git/refs/heads/master' -> `.git/refs/heads/origin' cp: cannot create link `.git/objects/info/packs': File exists progress: 213 objects, 646653 bytes, 77% done `/pub/scm/linux/kernel/git/torvalds/linux-2.6.git/objects/info/packs' -> `.git/objects/info/packs' progress: 983 objects, 2805763 bytes, 100% done cg-pull: objects pull failed
This commit is contained in:
commit
a47fd3f5e3
203 changed files with 4367 additions and 2416 deletions
4
CREDITS
4
CREDITS
|
@ -2380,8 +2380,8 @@ E: tmolina@cablespeed.com
|
|||
D: bug fixes, documentation, minor hackery
|
||||
|
||||
N: James Morris
|
||||
E: jmorris@redhat.com
|
||||
W: http://www.intercode.com.au/jmorris/
|
||||
E: jmorris@namei.org
|
||||
W: http://namei.org/
|
||||
D: Netfilter, Linux Security Modules (LSM), SELinux, IPSec,
|
||||
D: Crypto API, general networking, miscellaneous.
|
||||
S: PO Box 707
|
||||
|
|
|
@ -104,6 +104,7 @@ logo_*.c
|
|||
logo_*_clut224.c
|
||||
logo_*_mono.c
|
||||
lxdialog
|
||||
mach-types
|
||||
mach-types.h
|
||||
make_times_h
|
||||
map
|
||||
|
|
588
Documentation/kprobes.txt
Normal file
588
Documentation/kprobes.txt
Normal file
|
@ -0,0 +1,588 @@
|
|||
Title : Kernel Probes (Kprobes)
|
||||
Authors : Jim Keniston <jkenisto@us.ibm.com>
|
||||
: Prasanna S Panchamukhi <prasanna@in.ibm.com>
|
||||
|
||||
CONTENTS
|
||||
|
||||
1. Concepts: Kprobes, Jprobes, Return Probes
|
||||
2. Architectures Supported
|
||||
3. Configuring Kprobes
|
||||
4. API Reference
|
||||
5. Kprobes Features and Limitations
|
||||
6. Probe Overhead
|
||||
7. TODO
|
||||
8. Kprobes Example
|
||||
9. Jprobes Example
|
||||
10. Kretprobes Example
|
||||
|
||||
1. Concepts: Kprobes, Jprobes, Return Probes
|
||||
|
||||
Kprobes enables you to dynamically break into any kernel routine and
|
||||
collect debugging and performance information non-disruptively. You
|
||||
can trap at almost any kernel code address, specifying a handler
|
||||
routine to be invoked when the breakpoint is hit.
|
||||
|
||||
There are currently three types of probes: kprobes, jprobes, and
|
||||
kretprobes (also called return probes). A kprobe can be inserted
|
||||
on virtually any instruction in the kernel. A jprobe is inserted at
|
||||
the entry to a kernel function, and provides convenient access to the
|
||||
function's arguments. A return probe fires when a specified function
|
||||
returns.
|
||||
|
||||
In the typical case, Kprobes-based instrumentation is packaged as
|
||||
a kernel module. The module's init function installs ("registers")
|
||||
one or more probes, and the exit function unregisters them. A
|
||||
registration function such as register_kprobe() specifies where
|
||||
the probe is to be inserted and what handler is to be called when
|
||||
the probe is hit.
|
||||
|
||||
The next three subsections explain how the different types of
|
||||
probes work. They explain certain things that you'll need to
|
||||
know in order to make the best use of Kprobes -- e.g., the
|
||||
difference between a pre_handler and a post_handler, and how
|
||||
to use the maxactive and nmissed fields of a kretprobe. But
|
||||
if you're in a hurry to start using Kprobes, you can skip ahead
|
||||
to section 2.
|
||||
|
||||
1.1 How Does a Kprobe Work?
|
||||
|
||||
When a kprobe is registered, Kprobes makes a copy of the probed
|
||||
instruction and replaces the first byte(s) of the probed instruction
|
||||
with a breakpoint instruction (e.g., int3 on i386 and x86_64).
|
||||
|
||||
When a CPU hits the breakpoint instruction, a trap occurs, the CPU's
|
||||
registers are saved, and control passes to Kprobes via the
|
||||
notifier_call_chain mechanism. Kprobes executes the "pre_handler"
|
||||
associated with the kprobe, passing the handler the addresses of the
|
||||
kprobe struct and the saved registers.
|
||||
|
||||
Next, Kprobes single-steps its copy of the probed instruction.
|
||||
(It would be simpler to single-step the actual instruction in place,
|
||||
but then Kprobes would have to temporarily remove the breakpoint
|
||||
instruction. This would open a small time window when another CPU
|
||||
could sail right past the probepoint.)
|
||||
|
||||
After the instruction is single-stepped, Kprobes executes the
|
||||
"post_handler," if any, that is associated with the kprobe.
|
||||
Execution then continues with the instruction following the probepoint.
|
||||
|
||||
1.2 How Does a Jprobe Work?
|
||||
|
||||
A jprobe is implemented using a kprobe that is placed on a function's
|
||||
entry point. It employs a simple mirroring principle to allow
|
||||
seamless access to the probed function's arguments. The jprobe
|
||||
handler routine should have the same signature (arg list and return
|
||||
type) as the function being probed, and must always end by calling
|
||||
the Kprobes function jprobe_return().
|
||||
|
||||
Here's how it works. When the probe is hit, Kprobes makes a copy of
|
||||
the saved registers and a generous portion of the stack (see below).
|
||||
Kprobes then points the saved instruction pointer at the jprobe's
|
||||
handler routine, and returns from the trap. As a result, control
|
||||
passes to the handler, which is presented with the same register and
|
||||
stack contents as the probed function. When it is done, the handler
|
||||
calls jprobe_return(), which traps again to restore the original stack
|
||||
contents and processor state and switch to the probed function.
|
||||
|
||||
By convention, the callee owns its arguments, so gcc may produce code
|
||||
that unexpectedly modifies that portion of the stack. This is why
|
||||
Kprobes saves a copy of the stack and restores it after the jprobe
|
||||
handler has run. Up to MAX_STACK_SIZE bytes are copied -- e.g.,
|
||||
64 bytes on i386.
|
||||
|
||||
Note that the probed function's args may be passed on the stack
|
||||
or in registers (e.g., for x86_64 or for an i386 fastcall function).
|
||||
The jprobe will work in either case, so long as the handler's
|
||||
prototype matches that of the probed function.
|
||||
|
||||
1.3 How Does a Return Probe Work?
|
||||
|
||||
When you call register_kretprobe(), Kprobes establishes a kprobe at
|
||||
the entry to the function. When the probed function is called and this
|
||||
probe is hit, Kprobes saves a copy of the return address, and replaces
|
||||
the return address with the address of a "trampoline." The trampoline
|
||||
is an arbitrary piece of code -- typically just a nop instruction.
|
||||
At boot time, Kprobes registers a kprobe at the trampoline.
|
||||
|
||||
When the probed function executes its return instruction, control
|
||||
passes to the trampoline and that probe is hit. Kprobes' trampoline
|
||||
handler calls the user-specified handler associated with the kretprobe,
|
||||
then sets the saved instruction pointer to the saved return address,
|
||||
and that's where execution resumes upon return from the trap.
|
||||
|
||||
While the probed function is executing, its return address is
|
||||
stored in an object of type kretprobe_instance. Before calling
|
||||
register_kretprobe(), the user sets the maxactive field of the
|
||||
kretprobe struct to specify how many instances of the specified
|
||||
function can be probed simultaneously. register_kretprobe()
|
||||
pre-allocates the indicated number of kretprobe_instance objects.
|
||||
|
||||
For example, if the function is non-recursive and is called with a
|
||||
spinlock held, maxactive = 1 should be enough. If the function is
|
||||
non-recursive and can never relinquish the CPU (e.g., via a semaphore
|
||||
or preemption), NR_CPUS should be enough. If maxactive <= 0, it is
|
||||
set to a default value. If CONFIG_PREEMPT is enabled, the default
|
||||
is max(10, 2*NR_CPUS). Otherwise, the default is NR_CPUS.
|
||||
|
||||
It's not a disaster if you set maxactive too low; you'll just miss
|
||||
some probes. In the kretprobe struct, the nmissed field is set to
|
||||
zero when the return probe is registered, and is incremented every
|
||||
time the probed function is entered but there is no kretprobe_instance
|
||||
object available for establishing the return probe.
|
||||
|
||||
2. Architectures Supported
|
||||
|
||||
Kprobes, jprobes, and return probes are implemented on the following
|
||||
architectures:
|
||||
|
||||
- i386
|
||||
- x86_64 (AMD-64, E64MT)
|
||||
- ppc64
|
||||
- ia64 (Support for probes on certain instruction types is still in progress.)
|
||||
- sparc64 (Return probes not yet implemented.)
|
||||
|
||||
3. Configuring Kprobes
|
||||
|
||||
When configuring the kernel using make menuconfig/xconfig/oldconfig,
|
||||
ensure that CONFIG_KPROBES is set to "y". Under "Kernel hacking",
|
||||
look for "Kprobes". You may have to enable "Kernel debugging"
|
||||
(CONFIG_DEBUG_KERNEL) before you can enable Kprobes.
|
||||
|
||||
You may also want to ensure that CONFIG_KALLSYMS and perhaps even
|
||||
CONFIG_KALLSYMS_ALL are set to "y", since kallsyms_lookup_name()
|
||||
is a handy, version-independent way to find a function's address.
|
||||
|
||||
If you need to insert a probe in the middle of a function, you may find
|
||||
it useful to "Compile the kernel with debug info" (CONFIG_DEBUG_INFO),
|
||||
so you can use "objdump -d -l vmlinux" to see the source-to-object
|
||||
code mapping.
|
||||
|
||||
4. API Reference
|
||||
|
||||
The Kprobes API includes a "register" function and an "unregister"
|
||||
function for each type of probe. Here are terse, mini-man-page
|
||||
specifications for these functions and the associated probe handlers
|
||||
that you'll write. See the latter half of this document for examples.
|
||||
|
||||
4.1 register_kprobe
|
||||
|
||||
#include <linux/kprobes.h>
|
||||
int register_kprobe(struct kprobe *kp);
|
||||
|
||||
Sets a breakpoint at the address kp->addr. When the breakpoint is
|
||||
hit, Kprobes calls kp->pre_handler. After the probed instruction
|
||||
is single-stepped, Kprobe calls kp->post_handler. If a fault
|
||||
occurs during execution of kp->pre_handler or kp->post_handler,
|
||||
or during single-stepping of the probed instruction, Kprobes calls
|
||||
kp->fault_handler. Any or all handlers can be NULL.
|
||||
|
||||
register_kprobe() returns 0 on success, or a negative errno otherwise.
|
||||
|
||||
User's pre-handler (kp->pre_handler):
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/ptrace.h>
|
||||
int pre_handler(struct kprobe *p, struct pt_regs *regs);
|
||||
|
||||
Called with p pointing to the kprobe associated with the breakpoint,
|
||||
and regs pointing to the struct containing the registers saved when
|
||||
the breakpoint was hit. Return 0 here unless you're a Kprobes geek.
|
||||
|
||||
User's post-handler (kp->post_handler):
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/ptrace.h>
|
||||
void post_handler(struct kprobe *p, struct pt_regs *regs,
|
||||
unsigned long flags);
|
||||
|
||||
p and regs are as described for the pre_handler. flags always seems
|
||||
to be zero.
|
||||
|
||||
User's fault-handler (kp->fault_handler):
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/ptrace.h>
|
||||
int fault_handler(struct kprobe *p, struct pt_regs *regs, int trapnr);
|
||||
|
||||
p and regs are as described for the pre_handler. trapnr is the
|
||||
architecture-specific trap number associated with the fault (e.g.,
|
||||
on i386, 13 for a general protection fault or 14 for a page fault).
|
||||
Returns 1 if it successfully handled the exception.
|
||||
|
||||
4.2 register_jprobe
|
||||
|
||||
#include <linux/kprobes.h>
|
||||
int register_jprobe(struct jprobe *jp)
|
||||
|
||||
Sets a breakpoint at the address jp->kp.addr, which must be the address
|
||||
of the first instruction of a function. When the breakpoint is hit,
|
||||
Kprobes runs the handler whose address is jp->entry.
|
||||
|
||||
The handler should have the same arg list and return type as the probed
|
||||
function; and just before it returns, it must call jprobe_return().
|
||||
(The handler never actually returns, since jprobe_return() returns
|
||||
control to Kprobes.) If the probed function is declared asmlinkage,
|
||||
fastcall, or anything else that affects how args are passed, the
|
||||
handler's declaration must match.
|
||||
|
||||
register_jprobe() returns 0 on success, or a negative errno otherwise.
|
||||
|
||||
4.3 register_kretprobe
|
||||
|
||||
#include <linux/kprobes.h>
|
||||
int register_kretprobe(struct kretprobe *rp);
|
||||
|
||||
Establishes a return probe for the function whose address is
|
||||
rp->kp.addr. When that function returns, Kprobes calls rp->handler.
|
||||
You must set rp->maxactive appropriately before you call
|
||||
register_kretprobe(); see "How Does a Return Probe Work?" for details.
|
||||
|
||||
register_kretprobe() returns 0 on success, or a negative errno
|
||||
otherwise.
|
||||
|
||||
User's return-probe handler (rp->handler):
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/ptrace.h>
|
||||
int kretprobe_handler(struct kretprobe_instance *ri, struct pt_regs *regs);
|
||||
|
||||
regs is as described for kprobe.pre_handler. ri points to the
|
||||
kretprobe_instance object, of which the following fields may be
|
||||
of interest:
|
||||
- ret_addr: the return address
|
||||
- rp: points to the corresponding kretprobe object
|
||||
- task: points to the corresponding task struct
|
||||
The handler's return value is currently ignored.
|
||||
|
||||
4.4 unregister_*probe
|
||||
|
||||
#include <linux/kprobes.h>
|
||||
void unregister_kprobe(struct kprobe *kp);
|
||||
void unregister_jprobe(struct jprobe *jp);
|
||||
void unregister_kretprobe(struct kretprobe *rp);
|
||||
|
||||
Removes the specified probe. The unregister function can be called
|
||||
at any time after the probe has been registered.
|
||||
|
||||
5. Kprobes Features and Limitations
|
||||
|
||||
As of Linux v2.6.12, Kprobes allows multiple probes at the same
|
||||
address. Currently, however, there cannot be multiple jprobes on
|
||||
the same function at the same time.
|
||||
|
||||
In general, you can install a probe anywhere in the kernel.
|
||||
In particular, you can probe interrupt handlers. Known exceptions
|
||||
are discussed in this section.
|
||||
|
||||
For obvious reasons, it's a bad idea to install a probe in
|
||||
the code that implements Kprobes (mostly kernel/kprobes.c and
|
||||
arch/*/kernel/kprobes.c). A patch in the v2.6.13 timeframe instructs
|
||||
Kprobes to reject such requests.
|
||||
|
||||
If you install a probe in an inline-able function, Kprobes makes
|
||||
no attempt to chase down all inline instances of the function and
|
||||
install probes there. gcc may inline a function without being asked,
|
||||
so keep this in mind if you're not seeing the probe hits you expect.
|
||||
|
||||
A probe handler can modify the environment of the probed function
|
||||
-- e.g., by modifying kernel data structures, or by modifying the
|
||||
contents of the pt_regs struct (which are restored to the registers
|
||||
upon return from the breakpoint). So Kprobes can be used, for example,
|
||||
to install a bug fix or to inject faults for testing. Kprobes, of
|
||||
course, has no way to distinguish the deliberately injected faults
|
||||
from the accidental ones. Don't drink and probe.
|
||||
|
||||
Kprobes makes no attempt to prevent probe handlers from stepping on
|
||||
each other -- e.g., probing printk() and then calling printk() from a
|
||||
probe handler. As of Linux v2.6.12, if a probe handler hits a probe,
|
||||
that second probe's handlers won't be run in that instance.
|
||||
|
||||
In Linux v2.6.12 and previous versions, Kprobes' data structures are
|
||||
protected by a single lock that is held during probe registration and
|
||||
unregistration and while handlers are run. Thus, no two handlers
|
||||
can run simultaneously. To improve scalability on SMP systems,
|
||||
this restriction will probably be removed soon, in which case
|
||||
multiple handlers (or multiple instances of the same handler) may
|
||||
run concurrently on different CPUs. Code your handlers accordingly.
|
||||
|
||||
Kprobes does not use semaphores or allocate memory except during
|
||||
registration and unregistration.
|
||||
|
||||
Probe handlers are run with preemption disabled. Depending on the
|
||||
architecture, handlers may also run with interrupts disabled. In any
|
||||
case, your handler should not yield the CPU (e.g., by attempting to
|
||||
acquire a semaphore).
|
||||
|
||||
Since a return probe is implemented by replacing the return
|
||||
address with the trampoline's address, stack backtraces and calls
|
||||
to __builtin_return_address() will typically yield the trampoline's
|
||||
address instead of the real return address for kretprobed functions.
|
||||
(As far as we can tell, __builtin_return_address() is used only
|
||||
for instrumentation and error reporting.)
|
||||
|
||||
If the number of times a function is called does not match the
|
||||
number of times it returns, registering a return probe on that
|
||||
function may produce undesirable results. We have the do_exit()
|
||||
and do_execve() cases covered. do_fork() is not an issue. We're
|
||||
unaware of other specific cases where this could be a problem.
|
||||
|
||||
6. Probe Overhead
|
||||
|
||||
On a typical CPU in use in 2005, a kprobe hit takes 0.5 to 1.0
|
||||
microseconds to process. Specifically, a benchmark that hits the same
|
||||
probepoint repeatedly, firing a simple handler each time, reports 1-2
|
||||
million hits per second, depending on the architecture. A jprobe or
|
||||
return-probe hit typically takes 50-75% longer than a kprobe hit.
|
||||
When you have a return probe set on a function, adding a kprobe at
|
||||
the entry to that function adds essentially no overhead.
|
||||
|
||||
Here are sample overhead figures (in usec) for different architectures.
|
||||
k = kprobe; j = jprobe; r = return probe; kr = kprobe + return probe
|
||||
on same function; jr = jprobe + return probe on same function
|
||||
|
||||
i386: Intel Pentium M, 1495 MHz, 2957.31 bogomips
|
||||
k = 0.57 usec; j = 1.00; r = 0.92; kr = 0.99; jr = 1.40
|
||||
|
||||
x86_64: AMD Opteron 246, 1994 MHz, 3971.48 bogomips
|
||||
k = 0.49 usec; j = 0.76; r = 0.80; kr = 0.82; jr = 1.07
|
||||
|
||||
ppc64: POWER5 (gr), 1656 MHz (SMT disabled, 1 virtual CPU per physical CPU)
|
||||
k = 0.77 usec; j = 1.31; r = 1.26; kr = 1.45; jr = 1.99
|
||||
|
||||
7. TODO
|
||||
|
||||
a. SystemTap (http://sourceware.org/systemtap): Work in progress
|
||||
to provide a simplified programming interface for probe-based
|
||||
instrumentation.
|
||||
b. Improved SMP scalability: Currently, work is in progress to handle
|
||||
multiple kprobes in parallel.
|
||||
c. Kernel return probes for sparc64.
|
||||
d. Support for other architectures.
|
||||
e. User-space probes.
|
||||
|
||||
8. Kprobes Example
|
||||
|
||||
Here's a sample kernel module showing the use of kprobes to dump a
|
||||
stack trace and selected i386 registers when do_fork() is called.
|
||||
----- cut here -----
|
||||
/*kprobe_example.c*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/kallsyms.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
/*For each probe you need to allocate a kprobe structure*/
|
||||
static struct kprobe kp;
|
||||
|
||||
/*kprobe pre_handler: called just before the probed instruction is executed*/
|
||||
int handler_pre(struct kprobe *p, struct pt_regs *regs)
|
||||
{
|
||||
printk("pre_handler: p->addr=0x%p, eip=%lx, eflags=0x%lx\n",
|
||||
p->addr, regs->eip, regs->eflags);
|
||||
dump_stack();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*kprobe post_handler: called after the probed instruction is executed*/
|
||||
void handler_post(struct kprobe *p, struct pt_regs *regs, unsigned long flags)
|
||||
{
|
||||
printk("post_handler: p->addr=0x%p, eflags=0x%lx\n",
|
||||
p->addr, regs->eflags);
|
||||
}
|
||||
|
||||
/* fault_handler: this is called if an exception is generated for any
|
||||
* instruction within the pre- or post-handler, or when Kprobes
|
||||
* single-steps the probed instruction.
|
||||
*/
|
||||
int handler_fault(struct kprobe *p, struct pt_regs *regs, int trapnr)
|
||||
{
|
||||
printk("fault_handler: p->addr=0x%p, trap #%dn",
|
||||
p->addr, trapnr);
|
||||
/* Return 0 because we don't handle the fault. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
int init_module(void)
|
||||
{
|
||||
int ret;
|
||||
kp.pre_handler = handler_pre;
|
||||
kp.post_handler = handler_post;
|
||||
kp.fault_handler = handler_fault;
|
||||
kp.addr = (kprobe_opcode_t*) kallsyms_lookup_name("do_fork");
|
||||
/* register the kprobe now */
|
||||
if (!kp.addr) {
|
||||
printk("Couldn't find %s to plant kprobe\n", "do_fork");
|
||||
return -1;
|
||||
}
|
||||
if ((ret = register_kprobe(&kp) < 0)) {
|
||||
printk("register_kprobe failed, returned %d\n", ret);
|
||||
return -1;
|
||||
}
|
||||
printk("kprobe registered\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
void cleanup_module(void)
|
||||
{
|
||||
unregister_kprobe(&kp);
|
||||
printk("kprobe unregistered\n");
|
||||
}
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
----- cut here -----
|
||||
|
||||
You can build the kernel module, kprobe-example.ko, using the following
|
||||
Makefile:
|
||||
----- cut here -----
|
||||
obj-m := kprobe-example.o
|
||||
KDIR := /lib/modules/$(shell uname -r)/build
|
||||
PWD := $(shell pwd)
|
||||
default:
|
||||
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
|
||||
clean:
|
||||
rm -f *.mod.c *.ko *.o
|
||||
----- cut here -----
|
||||
|
||||
$ make
|
||||
$ su -
|
||||
...
|
||||
# insmod kprobe-example.ko
|
||||
|
||||
You will see the trace data in /var/log/messages and on the console
|
||||
whenever do_fork() is invoked to create a new process.
|
||||
|
||||
9. Jprobes Example
|
||||
|
||||
Here's a sample kernel module showing the use of jprobes to dump
|
||||
the arguments of do_fork().
|
||||
----- cut here -----
|
||||
/*jprobe-example.c */
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/uio.h>
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/kallsyms.h>
|
||||
|
||||
/*
|
||||
* Jumper probe for do_fork.
|
||||
* Mirror principle enables access to arguments of the probed routine
|
||||
* from the probe handler.
|
||||
*/
|
||||
|
||||
/* Proxy routine having the same arguments as actual do_fork() routine */
|
||||
long jdo_fork(unsigned long clone_flags, unsigned long stack_start,
|
||||
struct pt_regs *regs, unsigned long stack_size,
|
||||
int __user * parent_tidptr, int __user * child_tidptr)
|
||||
{
|
||||
printk("jprobe: clone_flags=0x%lx, stack_size=0x%lx, regs=0x%p\n",
|
||||
clone_flags, stack_size, regs);
|
||||
/* Always end with a call to jprobe_return(). */
|
||||
jprobe_return();
|
||||
/*NOTREACHED*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct jprobe my_jprobe = {
|
||||
.entry = (kprobe_opcode_t *) jdo_fork
|
||||
};
|
||||
|
||||
int init_module(void)
|
||||
{
|
||||
int ret;
|
||||
my_jprobe.kp.addr = (kprobe_opcode_t *) kallsyms_lookup_name("do_fork");
|
||||
if (!my_jprobe.kp.addr) {
|
||||
printk("Couldn't find %s to plant jprobe\n", "do_fork");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((ret = register_jprobe(&my_jprobe)) <0) {
|
||||
printk("register_jprobe failed, returned %d\n", ret);
|
||||
return -1;
|
||||
}
|
||||
printk("Planted jprobe at %p, handler addr %p\n",
|
||||
my_jprobe.kp.addr, my_jprobe.entry);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void cleanup_module(void)
|
||||
{
|
||||
unregister_jprobe(&my_jprobe);
|
||||
printk("jprobe unregistered\n");
|
||||
}
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
----- cut here -----
|
||||
|
||||
Build and insert the kernel module as shown in the above kprobe
|
||||
example. You will see the trace data in /var/log/messages and on
|
||||
the console whenever do_fork() is invoked to create a new process.
|
||||
(Some messages may be suppressed if syslogd is configured to
|
||||
eliminate duplicate messages.)
|
||||
|
||||
10. Kretprobes Example
|
||||
|
||||
Here's a sample kernel module showing the use of return probes to
|
||||
report failed calls to sys_open().
|
||||
----- cut here -----
|
||||
/*kretprobe-example.c*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/kallsyms.h>
|
||||
|
||||
static const char *probed_func = "sys_open";
|
||||
|
||||
/* Return-probe handler: If the probed function fails, log the return value. */
|
||||
static int ret_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
|
||||
{
|
||||
// Substitute the appropriate register name for your architecture --
|
||||
// e.g., regs->rax for x86_64, regs->gpr[3] for ppc64.
|
||||
int retval = (int) regs->eax;
|
||||
if (retval < 0) {
|
||||
printk("%s returns %d\n", probed_func, retval);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct kretprobe my_kretprobe = {
|
||||
.handler = ret_handler,
|
||||
/* Probe up to 20 instances concurrently. */
|
||||
.maxactive = 20
|
||||
};
|
||||
|
||||
int init_module(void)
|
||||
{
|
||||
int ret;
|
||||
my_kretprobe.kp.addr =
|
||||
(kprobe_opcode_t *) kallsyms_lookup_name(probed_func);
|
||||
if (!my_kretprobe.kp.addr) {
|
||||
printk("Couldn't find %s to plant return probe\n", probed_func);
|
||||
return -1;
|
||||
}
|
||||
if ((ret = register_kretprobe(&my_kretprobe)) < 0) {
|
||||
printk("register_kretprobe failed, returned %d\n", ret);
|
||||
return -1;
|
||||
}
|
||||
printk("Planted return probe at %p\n", my_kretprobe.kp.addr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void cleanup_module(void)
|
||||
{
|
||||
unregister_kretprobe(&my_kretprobe);
|
||||
printk("kretprobe unregistered\n");
|
||||
/* nmissed > 0 suggests that maxactive was set too low. */
|
||||
printk("Missed probing %d instances of %s\n",
|
||||
my_kretprobe.nmissed, probed_func);
|
||||
}
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
----- cut here -----
|
||||
|
||||
Build and insert the kernel module as shown in the above kprobe
|
||||
example. You will see the trace data in /var/log/messages and on the
|
||||
console whenever sys_open() returns a negative value. (Some messages
|
||||
may be suppressed if syslogd is configured to eliminate duplicate
|
||||
messages.)
|
||||
|
||||
For additional information on Kprobes, refer to the following URLs:
|
||||
http://www-106.ibm.com/developerworks/library/l-kprobes.html?ca=dgr-lnxw42Kprobe
|
||||
http://www.redhat.com/magazine/005mar05/features/kprobes/
|
|
@ -102,7 +102,7 @@ Here is the list of words, from left to right:
|
|||
- URB Status. This field makes no sense for submissions, but is present
|
||||
to help scripts with parsing. In error case, it contains the error code.
|
||||
In case of a setup packet, it contains a Setup Tag. If scripts read a number
|
||||
in this field, the proceed to read Data Length. Otherwise, they read
|
||||
in this field, they proceed to read Data Length. Otherwise, they read
|
||||
the setup packet before reading the Data Length.
|
||||
- Setup packet, if present, consists of 5 words: one of each for bmRequestType,
|
||||
bRequest, wValue, wIndex, wLength, as specified by the USB Specification 2.0.
|
||||
|
|
|
@ -44,6 +44,9 @@ bttv.o
|
|||
push used by bttv. bttv will disable overlay
|
||||
by default on this hardware to avoid crashes.
|
||||
With this insmod option you can override this.
|
||||
no_overlay=1 Disable overlay. It should be used by broken
|
||||
hardware that doesn't support PCI2PCI direct
|
||||
transfers.
|
||||
automute=0/1 Automatically mutes the sound if there is
|
||||
no TV signal, on by default. You might try
|
||||
to disable this if you have bad input signal
|
||||
|
|
|
@ -6,6 +6,11 @@ only the AMD64 specific ones are listed here.
|
|||
Machine check
|
||||
|
||||
mce=off disable machine check
|
||||
mce=bootlog Enable logging of machine checks left over from booting.
|
||||
Disabled by default because some BIOS leave bogus ones.
|
||||
If your BIOS doesn't do that it's a good idea to enable though
|
||||
to make sure you log even machine check events that result
|
||||
in a reboot.
|
||||
|
||||
nomce (for compatibility with i386): same as mce=off
|
||||
|
||||
|
|
|
@ -1658,7 +1658,7 @@ M: kuznet@ms2.inr.ac.ru
|
|||
P: Pekka Savola (ipv6)
|
||||
M: pekkas@netcore.fi
|
||||
P: James Morris
|
||||
M: jmorris@redhat.com
|
||||
M: jmorris@namei.org
|
||||
P: Hideaki YOSHIFUJI
|
||||
M: yoshfuji@linux-ipv6.org
|
||||
P: Patrick McHardy
|
||||
|
@ -2047,7 +2047,7 @@ SELINUX SECURITY MODULE
|
|||
P: Stephen Smalley
|
||||
M: sds@epoch.ncsc.mil
|
||||
P: James Morris
|
||||
M: jmorris@redhat.com
|
||||
M: jmorris@namei.org
|
||||
L: linux-kernel@vger.kernel.org (kernel issues)
|
||||
L: selinux@tycho.nsa.gov (general discussion)
|
||||
W: http://www.nsa.gov/selinux
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 13
|
||||
EXTRAVERSION =-rc5
|
||||
EXTRAVERSION =-rc6
|
||||
NAME=Woozy Numbat
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -41,18 +41,19 @@ summary from [1.]>" for easy identification by the developers
|
|||
[2.] Full description of the problem/report:
|
||||
[3.] Keywords (i.e., modules, networking, kernel):
|
||||
[4.] Kernel version (from /proc/version):
|
||||
[5.] Output of Oops.. message (if applicable) with symbolic information
|
||||
[5.] Most recent kernel version which did not have the bug:
|
||||
[6.] Output of Oops.. message (if applicable) with symbolic information
|
||||
resolved (see Documentation/oops-tracing.txt)
|
||||
[6.] A small shell script or example program which triggers the
|
||||
[7.] A small shell script or example program which triggers the
|
||||
problem (if possible)
|
||||
[7.] Environment
|
||||
[7.1.] Software (add the output of the ver_linux script here)
|
||||
[7.2.] Processor information (from /proc/cpuinfo):
|
||||
[7.3.] Module information (from /proc/modules):
|
||||
[7.4.] Loaded driver and hardware information (/proc/ioports, /proc/iomem)
|
||||
[7.5.] PCI information ('lspci -vvv' as root)
|
||||
[7.6.] SCSI information (from /proc/scsi/scsi)
|
||||
[7.7.] Other information that might be relevant to the problem
|
||||
[8.] Environment
|
||||
[8.1.] Software (add the output of the ver_linux script here)
|
||||
[8.2.] Processor information (from /proc/cpuinfo):
|
||||
[8.3.] Module information (from /proc/modules):
|
||||
[8.4.] Loaded driver and hardware information (/proc/ioports, /proc/iomem)
|
||||
[8.5.] PCI information ('lspci -vvv' as root)
|
||||
[8.6.] SCSI information (from /proc/scsi/scsi)
|
||||
[8.7.] Other information that might be relevant to the problem
|
||||
(please look in /proc and include all information that you
|
||||
think to be relevant):
|
||||
[X.] Other notes, patches, fixes, workarounds:
|
||||
|
|
|
@ -350,8 +350,24 @@ pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
|
|||
region->end = res->end - offset;
|
||||
}
|
||||
|
||||
void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
|
||||
struct pci_bus_region *region)
|
||||
{
|
||||
struct pci_controller *hose = (struct pci_controller *)dev->sysdata;
|
||||
unsigned long offset = 0;
|
||||
|
||||
if (res->flags & IORESOURCE_IO)
|
||||
offset = hose->io_space->start;
|
||||
else if (res->flags & IORESOURCE_MEM)
|
||||
offset = hose->mem_space->start;
|
||||
|
||||
res->start = region->start + offset;
|
||||
res->end = region->end + offset;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG
|
||||
EXPORT_SYMBOL(pcibios_resource_to_bus);
|
||||
EXPORT_SYMBOL(pcibios_bus_to_resource);
|
||||
#endif
|
||||
|
||||
int
|
||||
|
|
|
@ -447,9 +447,26 @@ pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
|
|||
region->end = res->end - offset;
|
||||
}
|
||||
|
||||
void __devinit
|
||||
pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
|
||||
struct pci_bus_region *region)
|
||||
{
|
||||
struct pci_sys_data *root = dev->sysdata;
|
||||
unsigned long offset = 0;
|
||||
|
||||
if (res->flags & IORESOURCE_IO)
|
||||
offset = root->io_offset;
|
||||
if (res->flags & IORESOURCE_MEM)
|
||||
offset = root->mem_offset;
|
||||
|
||||
res->start = region->start + offset;
|
||||
res->end = region->end + offset;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG
|
||||
EXPORT_SYMBOL(pcibios_fixup_bus);
|
||||
EXPORT_SYMBOL(pcibios_resource_to_bus);
|
||||
EXPORT_SYMBOL(pcibios_bus_to_resource);
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
|
@ -61,7 +61,7 @@ static struct plat_serial8250_port coyote_uart_data[] = {
|
|||
.mapbase = IXP4XX_UART2_BASE_PHYS,
|
||||
.membase = (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET,
|
||||
.irq = IRQ_IXP4XX_UART2,
|
||||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
|
||||
.iotype = UPIO_MEM,
|
||||
.regshift = 2,
|
||||
.uartclk = IXP4XX_UART_XTAL,
|
||||
|
|
|
@ -83,7 +83,7 @@ static struct plat_serial8250_port gtwx5715_uart_platform_data[] = {
|
|||
.mapbase = IXP4XX_UART2_BASE_PHYS,
|
||||
.membase = (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET,
|
||||
.irq = IRQ_IXP4XX_UART2,
|
||||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
|
||||
.iotype = UPIO_MEM,
|
||||
.regshift = 2,
|
||||
.uartclk = IXP4XX_UART_XTAL,
|
||||
|
|
|
@ -82,7 +82,7 @@ static struct plat_serial8250_port ixdp425_uart_data[] = {
|
|||
.mapbase = IXP4XX_UART1_BASE_PHYS,
|
||||
.membase = (char *)IXP4XX_UART1_BASE_VIRT + REG_OFFSET,
|
||||
.irq = IRQ_IXP4XX_UART1,
|
||||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
|
||||
.iotype = UPIO_MEM,
|
||||
.regshift = 2,
|
||||
.uartclk = IXP4XX_UART_XTAL,
|
||||
|
@ -91,7 +91,7 @@ static struct plat_serial8250_port ixdp425_uart_data[] = {
|
|||
.mapbase = IXP4XX_UART2_BASE_PHYS,
|
||||
.membase = (char *)IXP4XX_UART2_BASE_VIRT + REG_OFFSET,
|
||||
.irq = IRQ_IXP4XX_UART1,
|
||||
.flags = UPF_BOOT_AUTOCONF,
|
||||
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
|
||||
.iotype = UPIO_MEM,
|
||||
.regshift = 2,
|
||||
.uartclk = IXP4XX_UART_XTAL,
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
* 28-Jun-2005 BJD Moved pm functionality out to common code
|
||||
* 17-Jul-2005 BJD Changed to platform device for SuperIO 16550s
|
||||
* 25-Jul-2005 BJD Removed ASIX static mappings
|
||||
* 27-Jul-2005 BJD Ensure maximum frequency of i2c bus
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
@ -60,6 +61,7 @@
|
|||
#include <asm/arch/regs-mem.h>
|
||||
#include <asm/arch/regs-lcd.h>
|
||||
#include <asm/arch/nand.h>
|
||||
#include <asm/arch/iic.h>
|
||||
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/nand.h>
|
||||
|
@ -304,7 +306,7 @@ static void bast_nand_select(struct s3c2410_nand_set *set, int slot)
|
|||
}
|
||||
|
||||
static struct s3c2410_platform_nand bast_nand_info = {
|
||||
.tacls = 80,
|
||||
.tacls = 40,
|
||||
.twrph0 = 80,
|
||||
.twrph1 = 80,
|
||||
.nr_sets = ARRAY_SIZE(bast_nand_sets),
|
||||
|
@ -385,6 +387,17 @@ static struct platform_device bast_sio = {
|
|||
},
|
||||
};
|
||||
|
||||
/* we have devices on the bus which cannot work much over the
|
||||
* standard 100KHz i2c bus frequency
|
||||
*/
|
||||
|
||||
static struct s3c2410_platform_i2c bast_i2c_info = {
|
||||
.flags = 0,
|
||||
.slave_addr = 0x10,
|
||||
.bus_freq = 100*1000,
|
||||
.max_freq = 130*1000,
|
||||
};
|
||||
|
||||
/* Standard BAST devices */
|
||||
|
||||
static struct platform_device *bast_devices[] __initdata = {
|
||||
|
@ -431,6 +444,7 @@ void __init bast_map_io(void)
|
|||
s3c24xx_uclk.parent = &s3c24xx_clkout1;
|
||||
|
||||
s3c_device_nand.dev.platform_data = &bast_nand_info;
|
||||
s3c_device_i2c.dev.platform_data = &bast_i2c_info;
|
||||
|
||||
s3c24xx_init_io(bast_iodesc, ARRAY_SIZE(bast_iodesc));
|
||||
s3c24xx_init_clocks(0);
|
||||
|
|
|
@ -97,6 +97,7 @@ static void __init jornada720_map_io(void)
|
|||
}
|
||||
|
||||
MACHINE_START(JORNADA720, "HP Jornada 720")
|
||||
/* Maintainer: Michael Gernoth <michael@gernoth.net> */
|
||||
.phys_ram = 0xc0000000,
|
||||
.phys_io = 0x80000000,
|
||||
.io_pg_offst = ((0xf8000000) >> 18) & 0xfffc,
|
||||
|
|
|
@ -238,9 +238,9 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
|||
up_read(&mm->mmap_sem);
|
||||
|
||||
/*
|
||||
* Handle the "normal" case first
|
||||
* Handle the "normal" case first - VM_FAULT_MAJOR / VM_FAULT_MINOR
|
||||
*/
|
||||
if (fault > 0)
|
||||
if (fault >= VM_FAULT_MINOR)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
|
@ -261,7 +261,7 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
|||
do_exit(SIGKILL);
|
||||
return 0;
|
||||
|
||||
case 0:
|
||||
case VM_FAULT_SIGBUS:
|
||||
/*
|
||||
* We had some memory, but were unable to
|
||||
* successfully fix up this page fault.
|
||||
|
|
|
@ -370,142 +370,6 @@ ENTRY(cpu_xscale_dcache_clean_area)
|
|||
bhi 1b
|
||||
mov pc, lr
|
||||
|
||||
/* ================================ CACHE LOCKING============================
|
||||
*
|
||||
* The XScale MicroArchitecture implements support for locking entries into
|
||||
* the data and instruction cache. The following functions implement the core
|
||||
* low level instructions needed to accomplish the locking. The developer's
|
||||
* manual states that the code that performs the locking must be in non-cached
|
||||
* memory. To accomplish this, the code in xscale-cache-lock.c copies the
|
||||
* following functions from the cache into a non-cached memory region that
|
||||
* is allocated through consistent_alloc().
|
||||
*
|
||||
*/
|
||||
.align 5
|
||||
/*
|
||||
* xscale_icache_lock
|
||||
*
|
||||
* r0: starting address to lock
|
||||
* r1: end address to lock
|
||||
*/
|
||||
ENTRY(xscale_icache_lock)
|
||||
|
||||
iLockLoop:
|
||||
bic r0, r0, #CACHELINESIZE - 1
|
||||
mcr p15, 0, r0, c9, c1, 0 @ lock into cache
|
||||
cmp r0, r1 @ are we done?
|
||||
add r0, r0, #CACHELINESIZE @ advance to next cache line
|
||||
bls iLockLoop
|
||||
mov pc, lr
|
||||
|
||||
/*
|
||||
* xscale_icache_unlock
|
||||
*/
|
||||
ENTRY(xscale_icache_unlock)
|
||||
mcr p15, 0, r0, c9, c1, 1 @ Unlock icache
|
||||
mov pc, lr
|
||||
|
||||
/*
|
||||
* xscale_dcache_lock
|
||||
*
|
||||
* r0: starting address to lock
|
||||
* r1: end address to lock
|
||||
*/
|
||||
ENTRY(xscale_dcache_lock)
|
||||
mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer
|
||||
mov r2, #1
|
||||
mcr p15, 0, r2, c9, c2, 0 @ Put dcache in lock mode
|
||||
cpwait ip @ Wait for completion
|
||||
|
||||
mrs r2, cpsr
|
||||
orr r3, r2, #PSR_F_BIT | PSR_I_BIT
|
||||
dLockLoop:
|
||||
msr cpsr_c, r3
|
||||
mcr p15, 0, r0, c7, c10, 1 @ Write back line if it is dirty
|
||||
mcr p15, 0, r0, c7, c6, 1 @ Flush/invalidate line
|
||||
msr cpsr_c, r2
|
||||
ldr ip, [r0], #CACHELINESIZE @ Preload 32 bytes into cache from
|
||||
@ location [r0]. Post-increment
|
||||
@ r3 to next cache line
|
||||
cmp r0, r1 @ Are we done?
|
||||
bls dLockLoop
|
||||
|
||||
mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer
|
||||
mov r2, #0
|
||||
mcr p15, 0, r2, c9, c2, 0 @ Get out of lock mode
|
||||
cpwait_ret lr, ip
|
||||
|
||||
/*
|
||||
* xscale_dcache_unlock
|
||||
*/
|
||||
ENTRY(xscale_dcache_unlock)
|
||||
mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer
|
||||
mcr p15, 0, ip, c9, c2, 1 @ Unlock cache
|
||||
mov pc, lr
|
||||
|
||||
/*
|
||||
* Needed to determine the length of the code that needs to be copied.
|
||||
*/
|
||||
.align 5
|
||||
ENTRY(xscale_cache_dummy)
|
||||
mov pc, lr
|
||||
|
||||
/* ================================ TLB LOCKING==============================
|
||||
*
|
||||
* The XScale MicroArchitecture implements support for locking entries into
|
||||
* the Instruction and Data TLBs. The following functions provide the
|
||||
* low level support for supporting these under Linux. xscale-lock.c
|
||||
* implements some higher level management code. Most of the following
|
||||
* is taken straight out of the Developer's Manual.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Lock I-TLB entry
|
||||
*
|
||||
* r0: Virtual address to translate and lock
|
||||
*/
|
||||
.align 5
|
||||
ENTRY(xscale_itlb_lock)
|
||||
mrs r2, cpsr
|
||||
orr r3, r2, #PSR_F_BIT | PSR_I_BIT
|
||||
msr cpsr_c, r3 @ Disable interrupts
|
||||
mcr p15, 0, r0, c8, c5, 1 @ Invalidate I-TLB entry
|
||||
mcr p15, 0, r0, c10, c4, 0 @ Translate and lock
|
||||
msr cpsr_c, r2 @ Restore interrupts
|
||||
cpwait_ret lr, ip
|
||||
|
||||
/*
|
||||
* Lock D-TLB entry
|
||||
*
|
||||
* r0: Virtual address to translate and lock
|
||||
*/
|
||||
.align 5
|
||||
ENTRY(xscale_dtlb_lock)
|
||||
mrs r2, cpsr
|
||||
orr r3, r2, #PSR_F_BIT | PSR_I_BIT
|
||||
msr cpsr_c, r3 @ Disable interrupts
|
||||
mcr p15, 0, r0, c8, c6, 1 @ Invalidate D-TLB entry
|
||||
mcr p15, 0, r0, c10, c8, 0 @ Translate and lock
|
||||
msr cpsr_c, r2 @ Restore interrupts
|
||||
cpwait_ret lr, ip
|
||||
|
||||
/*
|
||||
* Unlock all I-TLB entries
|
||||
*/
|
||||
.align 5
|
||||
ENTRY(xscale_itlb_unlock)
|
||||
mcr p15, 0, ip, c10, c4, 1 @ Unlock I-TLB
|
||||
mcr p15, 0, ip, c8, c5, 0 @ Invalidate I-TLB
|
||||
cpwait_ret lr, ip
|
||||
|
||||
/*
|
||||
* Unlock all D-TLB entries
|
||||
*/
|
||||
ENTRY(xscale_dtlb_unlock)
|
||||
mcr p15, 0, ip, c10, c8, 1 @ Unlock D-TBL
|
||||
mcr p15, 0, ip, c8, c6, 0 @ Invalidate D-TLB
|
||||
cpwait_ret lr, ip
|
||||
|
||||
/* =============================== PageTable ============================== */
|
||||
|
||||
#define PTE_CACHE_WRITE_ALLOCATE 0
|
||||
|
|
|
@ -40,17 +40,17 @@ float64 float64_arccos(float64 rFm);
|
|||
float64 float64_pow(float64 rFn, float64 rFm);
|
||||
float64 float64_pol(float64 rFn, float64 rFm);
|
||||
|
||||
static float64 float64_rsf(float64 rFn, float64 rFm)
|
||||
static float64 float64_rsf(struct roundingData *roundData, float64 rFn, float64 rFm)
|
||||
{
|
||||
return float64_sub(rFm, rFn);
|
||||
return float64_sub(roundData, rFm, rFn);
|
||||
}
|
||||
|
||||
static float64 float64_rdv(float64 rFn, float64 rFm)
|
||||
static float64 float64_rdv(struct roundingData *roundData, float64 rFn, float64 rFm)
|
||||
{
|
||||
return float64_div(rFm, rFn);
|
||||
return float64_div(roundData, rFm, rFn);
|
||||
}
|
||||
|
||||
static float64 (*const dyadic_double[16])(float64 rFn, float64 rFm) = {
|
||||
static float64 (*const dyadic_double[16])(struct roundingData*, float64 rFn, float64 rFm) = {
|
||||
[ADF_CODE >> 20] = float64_add,
|
||||
[MUF_CODE >> 20] = float64_mul,
|
||||
[SUF_CODE >> 20] = float64_sub,
|
||||
|
@ -65,12 +65,12 @@ static float64 (*const dyadic_double[16])(float64 rFn, float64 rFm) = {
|
|||
[FRD_CODE >> 20] = float64_rdv,
|
||||
};
|
||||
|
||||
static float64 float64_mvf(float64 rFm)
|
||||
static float64 float64_mvf(struct roundingData *roundData,float64 rFm)
|
||||
{
|
||||
return rFm;
|
||||
}
|
||||
|
||||
static float64 float64_mnf(float64 rFm)
|
||||
static float64 float64_mnf(struct roundingData *roundData,float64 rFm)
|
||||
{
|
||||
union float64_components u;
|
||||
|
||||
|
@ -84,7 +84,7 @@ static float64 float64_mnf(float64 rFm)
|
|||
return u.f64;
|
||||
}
|
||||
|
||||
static float64 float64_abs(float64 rFm)
|
||||
static float64 float64_abs(struct roundingData *roundData,float64 rFm)
|
||||
{
|
||||
union float64_components u;
|
||||
|
||||
|
@ -98,7 +98,7 @@ static float64 float64_abs(float64 rFm)
|
|||
return u.f64;
|
||||
}
|
||||
|
||||
static float64 (*const monadic_double[16])(float64 rFm) = {
|
||||
static float64 (*const monadic_double[16])(struct roundingData *, float64 rFm) = {
|
||||
[MVF_CODE >> 20] = float64_mvf,
|
||||
[MNF_CODE >> 20] = float64_mnf,
|
||||
[ABS_CODE >> 20] = float64_abs,
|
||||
|
@ -108,7 +108,7 @@ static float64 (*const monadic_double[16])(float64 rFm) = {
|
|||
[NRM_CODE >> 20] = float64_mvf,
|
||||
};
|
||||
|
||||
unsigned int DoubleCPDO(const unsigned int opcode, FPREG * rFd)
|
||||
unsigned int DoubleCPDO(struct roundingData *roundData, const unsigned int opcode, FPREG * rFd)
|
||||
{
|
||||
FPA11 *fpa11 = GET_FPA11();
|
||||
float64 rFm;
|
||||
|
@ -151,13 +151,13 @@ unsigned int DoubleCPDO(const unsigned int opcode, FPREG * rFd)
|
|||
}
|
||||
|
||||
if (dyadic_double[opc_mask_shift]) {
|
||||
rFd->fDouble = dyadic_double[opc_mask_shift](rFn, rFm);
|
||||
rFd->fDouble = dyadic_double[opc_mask_shift](roundData, rFn, rFm);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
if (monadic_double[opc_mask_shift]) {
|
||||
rFd->fDouble = monadic_double[opc_mask_shift](rFm);
|
||||
rFd->fDouble = monadic_double[opc_mask_shift](roundData, rFm);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -35,17 +35,17 @@ floatx80 floatx80_arccos(floatx80 rFm);
|
|||
floatx80 floatx80_pow(floatx80 rFn, floatx80 rFm);
|
||||
floatx80 floatx80_pol(floatx80 rFn, floatx80 rFm);
|
||||
|
||||
static floatx80 floatx80_rsf(floatx80 rFn, floatx80 rFm)
|
||||
static floatx80 floatx80_rsf(struct roundingData *roundData, floatx80 rFn, floatx80 rFm)
|
||||
{
|
||||
return floatx80_sub(rFm, rFn);
|
||||
return floatx80_sub(roundData, rFm, rFn);
|
||||
}
|
||||
|
||||
static floatx80 floatx80_rdv(floatx80 rFn, floatx80 rFm)
|
||||
static floatx80 floatx80_rdv(struct roundingData *roundData, floatx80 rFn, floatx80 rFm)
|
||||
{
|
||||
return floatx80_div(rFm, rFn);
|
||||
return floatx80_div(roundData, rFm, rFn);
|
||||
}
|
||||
|
||||
static floatx80 (*const dyadic_extended[16])(floatx80 rFn, floatx80 rFm) = {
|
||||
static floatx80 (*const dyadic_extended[16])(struct roundingData*, floatx80 rFn, floatx80 rFm) = {
|
||||
[ADF_CODE >> 20] = floatx80_add,
|
||||
[MUF_CODE >> 20] = floatx80_mul,
|
||||
[SUF_CODE >> 20] = floatx80_sub,
|
||||
|
@ -60,24 +60,24 @@ static floatx80 (*const dyadic_extended[16])(floatx80 rFn, floatx80 rFm) = {
|
|||
[FRD_CODE >> 20] = floatx80_rdv,
|
||||
};
|
||||
|
||||
static floatx80 floatx80_mvf(floatx80 rFm)
|
||||
static floatx80 floatx80_mvf(struct roundingData *roundData, floatx80 rFm)
|
||||
{
|
||||
return rFm;
|
||||
}
|
||||
|
||||
static floatx80 floatx80_mnf(floatx80 rFm)
|
||||
static floatx80 floatx80_mnf(struct roundingData *roundData, floatx80 rFm)
|
||||
{
|
||||
rFm.high ^= 0x8000;
|
||||
return rFm;
|
||||
}
|
||||
|
||||
static floatx80 floatx80_abs(floatx80 rFm)
|
||||
static floatx80 floatx80_abs(struct roundingData *roundData, floatx80 rFm)
|
||||
{
|
||||
rFm.high &= 0x7fff;
|
||||
return rFm;
|
||||
}
|
||||
|
||||
static floatx80 (*const monadic_extended[16])(floatx80 rFm) = {
|
||||
static floatx80 (*const monadic_extended[16])(struct roundingData*, floatx80 rFm) = {
|
||||
[MVF_CODE >> 20] = floatx80_mvf,
|
||||
[MNF_CODE >> 20] = floatx80_mnf,
|
||||
[ABS_CODE >> 20] = floatx80_abs,
|
||||
|
@ -87,7 +87,7 @@ static floatx80 (*const monadic_extended[16])(floatx80 rFm) = {
|
|||
[NRM_CODE >> 20] = floatx80_mvf,
|
||||
};
|
||||
|
||||
unsigned int ExtendedCPDO(const unsigned int opcode, FPREG * rFd)
|
||||
unsigned int ExtendedCPDO(struct roundingData *roundData, const unsigned int opcode, FPREG * rFd)
|
||||
{
|
||||
FPA11 *fpa11 = GET_FPA11();
|
||||
floatx80 rFm;
|
||||
|
@ -138,13 +138,13 @@ unsigned int ExtendedCPDO(const unsigned int opcode, FPREG * rFd)
|
|||
}
|
||||
|
||||
if (dyadic_extended[opc_mask_shift]) {
|
||||
rFd->fExtended = dyadic_extended[opc_mask_shift](rFn, rFm);
|
||||
rFd->fExtended = dyadic_extended[opc_mask_shift](roundData, rFn, rFm);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
if (monadic_extended[opc_mask_shift]) {
|
||||
rFd->fExtended = monadic_extended[opc_mask_shift](rFm);
|
||||
rFd->fExtended = monadic_extended[opc_mask_shift](roundData, rFm);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -51,48 +51,42 @@ static void resetFPA11(void)
|
|||
fpa11->fpsr = FP_EMULATOR | BIT_AC;
|
||||
}
|
||||
|
||||
void SetRoundingMode(const unsigned int opcode)
|
||||
int8 SetRoundingMode(const unsigned int opcode)
|
||||
{
|
||||
switch (opcode & MASK_ROUNDING_MODE) {
|
||||
default:
|
||||
case ROUND_TO_NEAREST:
|
||||
float_rounding_mode = float_round_nearest_even;
|
||||
break;
|
||||
return float_round_nearest_even;
|
||||
|
||||
case ROUND_TO_PLUS_INFINITY:
|
||||
float_rounding_mode = float_round_up;
|
||||
break;
|
||||
return float_round_up;
|
||||
|
||||
case ROUND_TO_MINUS_INFINITY:
|
||||
float_rounding_mode = float_round_down;
|
||||
break;
|
||||
return float_round_down;
|
||||
|
||||
case ROUND_TO_ZERO:
|
||||
float_rounding_mode = float_round_to_zero;
|
||||
break;
|
||||
return float_round_to_zero;
|
||||
}
|
||||
}
|
||||
|
||||
void SetRoundingPrecision(const unsigned int opcode)
|
||||
int8 SetRoundingPrecision(const unsigned int opcode)
|
||||
{
|
||||
#ifdef CONFIG_FPE_NWFPE_XP
|
||||
switch (opcode & MASK_ROUNDING_PRECISION) {
|
||||
case ROUND_SINGLE:
|
||||
floatx80_rounding_precision = 32;
|
||||
break;
|
||||
return 32;
|
||||
|
||||
case ROUND_DOUBLE:
|
||||
floatx80_rounding_precision = 64;
|
||||
break;
|
||||
return 64;
|
||||
|
||||
case ROUND_EXTENDED:
|
||||
floatx80_rounding_precision = 80;
|
||||
break;
|
||||
return 80;
|
||||
|
||||
default:
|
||||
floatx80_rounding_precision = 80;
|
||||
return 80;
|
||||
}
|
||||
#endif
|
||||
return 80;
|
||||
}
|
||||
|
||||
void nwfpe_init_fpa(union fp_state *fp)
|
||||
|
@ -103,8 +97,6 @@ void nwfpe_init_fpa(union fp_state *fp)
|
|||
#endif
|
||||
memset(fpa11, 0, sizeof(FPA11));
|
||||
resetFPA11();
|
||||
SetRoundingMode(ROUND_TO_NEAREST);
|
||||
SetRoundingPrecision(ROUND_EXTENDED);
|
||||
fpa11->initflag = 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -37,6 +37,13 @@
|
|||
/* includes */
|
||||
#include "fpsr.h" /* FP control and status register definitions */
|
||||
#include "milieu.h"
|
||||
|
||||
struct roundingData {
|
||||
int8 mode;
|
||||
int8 precision;
|
||||
signed char exception;
|
||||
};
|
||||
|
||||
#include "softfloat.h"
|
||||
|
||||
#define typeNone 0x00
|
||||
|
@ -84,8 +91,8 @@ typedef struct tagFPA11 {
|
|||
initialised. */
|
||||
} FPA11;
|
||||
|
||||
extern void SetRoundingMode(const unsigned int);
|
||||
extern void SetRoundingPrecision(const unsigned int);
|
||||
extern int8 SetRoundingMode(const unsigned int);
|
||||
extern int8 SetRoundingPrecision(const unsigned int);
|
||||
extern void nwfpe_init_fpa(union fp_state *fp);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -24,15 +24,16 @@
|
|||
#include "fpa11.h"
|
||||
#include "fpopcode.h"
|
||||
|
||||
unsigned int SingleCPDO(const unsigned int opcode, FPREG * rFd);
|
||||
unsigned int DoubleCPDO(const unsigned int opcode, FPREG * rFd);
|
||||
unsigned int ExtendedCPDO(const unsigned int opcode, FPREG * rFd);
|
||||
unsigned int SingleCPDO(struct roundingData *roundData, const unsigned int opcode, FPREG * rFd);
|
||||
unsigned int DoubleCPDO(struct roundingData *roundData, const unsigned int opcode, FPREG * rFd);
|
||||
unsigned int ExtendedCPDO(struct roundingData *roundData, const unsigned int opcode, FPREG * rFd);
|
||||
|
||||
unsigned int EmulateCPDO(const unsigned int opcode)
|
||||
{
|
||||
FPA11 *fpa11 = GET_FPA11();
|
||||
FPREG *rFd;
|
||||
unsigned int nType, nDest, nRc;
|
||||
struct roundingData roundData;
|
||||
|
||||
/* Get the destination size. If not valid let Linux perform
|
||||
an invalid instruction trap. */
|
||||
|
@ -40,7 +41,9 @@ unsigned int EmulateCPDO(const unsigned int opcode)
|
|||
if (typeNone == nDest)
|
||||
return 0;
|
||||
|
||||
SetRoundingMode(opcode);
|
||||
roundData.mode = SetRoundingMode(opcode);
|
||||
roundData.precision = SetRoundingPrecision(opcode);
|
||||
roundData.exception = 0;
|
||||
|
||||
/* Compare the size of the operands in Fn and Fm.
|
||||
Choose the largest size and perform operations in that size,
|
||||
|
@ -63,14 +66,14 @@ unsigned int EmulateCPDO(const unsigned int opcode)
|
|||
|
||||
switch (nType) {
|
||||
case typeSingle:
|
||||
nRc = SingleCPDO(opcode, rFd);
|
||||
nRc = SingleCPDO(&roundData, opcode, rFd);
|
||||
break;
|
||||
case typeDouble:
|
||||
nRc = DoubleCPDO(opcode, rFd);
|
||||
nRc = DoubleCPDO(&roundData, opcode, rFd);
|
||||
break;
|
||||
#ifdef CONFIG_FPE_NWFPE_XP
|
||||
case typeExtended:
|
||||
nRc = ExtendedCPDO(opcode, rFd);
|
||||
nRc = ExtendedCPDO(&roundData, opcode, rFd);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
|
@ -93,9 +96,9 @@ unsigned int EmulateCPDO(const unsigned int opcode)
|
|||
case typeSingle:
|
||||
{
|
||||
if (typeDouble == nType)
|
||||
rFd->fSingle = float64_to_float32(rFd->fDouble);
|
||||
rFd->fSingle = float64_to_float32(&roundData, rFd->fDouble);
|
||||
else
|
||||
rFd->fSingle = floatx80_to_float32(rFd->fExtended);
|
||||
rFd->fSingle = floatx80_to_float32(&roundData, rFd->fExtended);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -104,7 +107,7 @@ unsigned int EmulateCPDO(const unsigned int opcode)
|
|||
if (typeSingle == nType)
|
||||
rFd->fDouble = float32_to_float64(rFd->fSingle);
|
||||
else
|
||||
rFd->fDouble = floatx80_to_float64(rFd->fExtended);
|
||||
rFd->fDouble = floatx80_to_float64(&roundData, rFd->fExtended);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -121,12 +124,15 @@ unsigned int EmulateCPDO(const unsigned int opcode)
|
|||
#else
|
||||
if (nDest != nType) {
|
||||
if (nDest == typeSingle)
|
||||
rFd->fSingle = float64_to_float32(rFd->fDouble);
|
||||
rFd->fSingle = float64_to_float32(&roundData, rFd->fDouble);
|
||||
else
|
||||
rFd->fDouble = float32_to_float64(rFd->fSingle);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
if (roundData.exception)
|
||||
float_raise(roundData.exception);
|
||||
|
||||
return nRc;
|
||||
}
|
||||
|
|
|
@ -96,7 +96,7 @@ static inline void loadMultiple(const unsigned int Fn, const unsigned int __user
|
|||
}
|
||||
}
|
||||
|
||||
static inline void storeSingle(const unsigned int Fn, unsigned int __user *pMem)
|
||||
static inline void storeSingle(struct roundingData *roundData, const unsigned int Fn, unsigned int __user *pMem)
|
||||
{
|
||||
FPA11 *fpa11 = GET_FPA11();
|
||||
union {
|
||||
|
@ -106,12 +106,12 @@ static inline void storeSingle(const unsigned int Fn, unsigned int __user *pMem)
|
|||
|
||||
switch (fpa11->fType[Fn]) {
|
||||
case typeDouble:
|
||||
val.f = float64_to_float32(fpa11->fpreg[Fn].fDouble);
|
||||
val.f = float64_to_float32(roundData, fpa11->fpreg[Fn].fDouble);
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_FPE_NWFPE_XP
|
||||
case typeExtended:
|
||||
val.f = floatx80_to_float32(fpa11->fpreg[Fn].fExtended);
|
||||
val.f = floatx80_to_float32(roundData, fpa11->fpreg[Fn].fExtended);
|
||||
break;
|
||||
#endif
|
||||
|
||||
|
@ -122,7 +122,7 @@ static inline void storeSingle(const unsigned int Fn, unsigned int __user *pMem)
|
|||
put_user(val.i[0], pMem);
|
||||
}
|
||||
|
||||
static inline void storeDouble(const unsigned int Fn, unsigned int __user *pMem)
|
||||
static inline void storeDouble(struct roundingData *roundData, const unsigned int Fn, unsigned int __user *pMem)
|
||||
{
|
||||
FPA11 *fpa11 = GET_FPA11();
|
||||
union {
|
||||
|
@ -137,7 +137,7 @@ static inline void storeDouble(const unsigned int Fn, unsigned int __user *pMem)
|
|||
|
||||
#ifdef CONFIG_FPE_NWFPE_XP
|
||||
case typeExtended:
|
||||
val.f = floatx80_to_float64(fpa11->fpreg[Fn].fExtended);
|
||||
val.f = floatx80_to_float64(roundData, fpa11->fpreg[Fn].fExtended);
|
||||
break;
|
||||
#endif
|
||||
|
||||
|
@ -259,8 +259,11 @@ unsigned int PerformSTF(const unsigned int opcode)
|
|||
{
|
||||
unsigned int __user *pBase, *pAddress, *pFinal;
|
||||
unsigned int nRc = 1, write_back = WRITE_BACK(opcode);
|
||||
struct roundingData roundData;
|
||||
|
||||
SetRoundingMode(ROUND_TO_NEAREST);
|
||||
roundData.mode = SetRoundingMode(opcode);
|
||||
roundData.precision = SetRoundingPrecision(opcode);
|
||||
roundData.exception = 0;
|
||||
|
||||
pBase = (unsigned int __user *) readRegister(getRn(opcode));
|
||||
if (REG_PC == getRn(opcode)) {
|
||||
|
@ -281,10 +284,10 @@ unsigned int PerformSTF(const unsigned int opcode)
|
|||
|
||||
switch (opcode & MASK_TRANSFER_LENGTH) {
|
||||
case TRANSFER_SINGLE:
|
||||
storeSingle(getFd(opcode), pAddress);
|
||||
storeSingle(&roundData, getFd(opcode), pAddress);
|
||||
break;
|
||||
case TRANSFER_DOUBLE:
|
||||
storeDouble(getFd(opcode), pAddress);
|
||||
storeDouble(&roundData, getFd(opcode), pAddress);
|
||||
break;
|
||||
#ifdef CONFIG_FPE_NWFPE_XP
|
||||
case TRANSFER_EXTENDED:
|
||||
|
@ -295,6 +298,9 @@ unsigned int PerformSTF(const unsigned int opcode)
|
|||
nRc = 0;
|
||||
}
|
||||
|
||||
if (roundData.exception)
|
||||
float_raise(roundData.exception);
|
||||
|
||||
if (write_back)
|
||||
writeRegister(getRn(opcode), (unsigned long) pFinal);
|
||||
return nRc;
|
||||
|
|
|
@ -33,8 +33,6 @@ extern flag floatx80_is_nan(floatx80);
|
|||
extern flag float64_is_nan(float64);
|
||||
extern flag float32_is_nan(float32);
|
||||
|
||||
void SetRoundingMode(const unsigned int opcode);
|
||||
|
||||
unsigned int PerformFLT(const unsigned int opcode);
|
||||
unsigned int PerformFIX(const unsigned int opcode);
|
||||
|
||||
|
@ -77,14 +75,17 @@ unsigned int EmulateCPRT(const unsigned int opcode)
|
|||
unsigned int PerformFLT(const unsigned int opcode)
|
||||
{
|
||||
FPA11 *fpa11 = GET_FPA11();
|
||||
SetRoundingMode(opcode);
|
||||
SetRoundingPrecision(opcode);
|
||||
struct roundingData roundData;
|
||||
|
||||
roundData.mode = SetRoundingMode(opcode);
|
||||
roundData.precision = SetRoundingPrecision(opcode);
|
||||
roundData.exception = 0;
|
||||
|
||||
switch (opcode & MASK_ROUNDING_PRECISION) {
|
||||
case ROUND_SINGLE:
|
||||
{
|
||||
fpa11->fType[getFn(opcode)] = typeSingle;
|
||||
fpa11->fpreg[getFn(opcode)].fSingle = int32_to_float32(readRegister(getRd(opcode)));
|
||||
fpa11->fpreg[getFn(opcode)].fSingle = int32_to_float32(&roundData, readRegister(getRd(opcode)));
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -108,6 +109,9 @@ unsigned int PerformFLT(const unsigned int opcode)
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (roundData.exception)
|
||||
float_raise(roundData.exception);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -115,26 +119,29 @@ unsigned int PerformFIX(const unsigned int opcode)
|
|||
{
|
||||
FPA11 *fpa11 = GET_FPA11();
|
||||
unsigned int Fn = getFm(opcode);
|
||||
struct roundingData roundData;
|
||||
|
||||
SetRoundingMode(opcode);
|
||||
roundData.mode = SetRoundingMode(opcode);
|
||||
roundData.precision = SetRoundingPrecision(opcode);
|
||||
roundData.exception = 0;
|
||||
|
||||
switch (fpa11->fType[Fn]) {
|
||||
case typeSingle:
|
||||
{
|
||||
writeRegister(getRd(opcode), float32_to_int32(fpa11->fpreg[Fn].fSingle));
|
||||
writeRegister(getRd(opcode), float32_to_int32(&roundData, fpa11->fpreg[Fn].fSingle));
|
||||
}
|
||||
break;
|
||||
|
||||
case typeDouble:
|
||||
{
|
||||
writeRegister(getRd(opcode), float64_to_int32(fpa11->fpreg[Fn].fDouble));
|
||||
writeRegister(getRd(opcode), float64_to_int32(&roundData, fpa11->fpreg[Fn].fDouble));
|
||||
}
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_FPE_NWFPE_XP
|
||||
case typeExtended:
|
||||
{
|
||||
writeRegister(getRd(opcode), floatx80_to_int32(fpa11->fpreg[Fn].fExtended));
|
||||
writeRegister(getRd(opcode), floatx80_to_int32(&roundData, fpa11->fpreg[Fn].fExtended));
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
@ -143,6 +150,9 @@ unsigned int PerformFIX(const unsigned int opcode)
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (roundData.exception)
|
||||
float_raise(roundData.exception);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -116,8 +116,6 @@ fpmodule.c to integrate with the NetBSD kernel (I hope!).
|
|||
code to access data in user space in some other source files at the
|
||||
moment (grep for get_user / put_user calls). --philb]
|
||||
|
||||
float_exception_flags is a global variable in SoftFloat.
|
||||
|
||||
This function is called by the SoftFloat routines to raise a floating
|
||||
point exception. We check the trap enable byte in the FPSR, and raise
|
||||
a SIGFPE exception if necessary. If not the relevant bits in the
|
||||
|
@ -129,15 +127,14 @@ void float_raise(signed char flags)
|
|||
register unsigned int fpsr, cumulativeTraps;
|
||||
|
||||
#ifdef CONFIG_DEBUG_USER
|
||||
printk(KERN_DEBUG
|
||||
"NWFPE: %s[%d] takes exception %08x at %p from %08lx\n",
|
||||
current->comm, current->pid, flags,
|
||||
__builtin_return_address(0), GET_USERREG()->ARM_pc);
|
||||
/* Ignore inexact errors as there are far too many of them to log */
|
||||
if (flags & ~BIT_IXC)
|
||||
printk(KERN_DEBUG
|
||||
"NWFPE: %s[%d] takes exception %08x at %p from %08lx\n",
|
||||
current->comm, current->pid, flags,
|
||||
__builtin_return_address(0), GET_USERREG()->ARM_pc);
|
||||
#endif
|
||||
|
||||
/* Keep SoftFloat exception flags up to date. */
|
||||
float_exception_flags |= flags;
|
||||
|
||||
/* Read fpsr and initialize the cumulativeTraps. */
|
||||
fpsr = readFPSR();
|
||||
cumulativeTraps = 0;
|
||||
|
|
|
@ -36,17 +36,17 @@ float32 float32_arccos(float32 rFm);
|
|||
float32 float32_pow(float32 rFn, float32 rFm);
|
||||
float32 float32_pol(float32 rFn, float32 rFm);
|
||||
|
||||
static float32 float32_rsf(float32 rFn, float32 rFm)
|
||||
static float32 float32_rsf(struct roundingData *roundData, float32 rFn, float32 rFm)
|
||||
{
|
||||
return float32_sub(rFm, rFn);
|
||||
return float32_sub(roundData, rFm, rFn);
|
||||
}
|
||||
|
||||
static float32 float32_rdv(float32 rFn, float32 rFm)
|
||||
static float32 float32_rdv(struct roundingData *roundData, float32 rFn, float32 rFm)
|
||||
{
|
||||
return float32_div(rFm, rFn);
|
||||
return float32_div(roundData, rFm, rFn);
|
||||
}
|
||||
|
||||
static float32 (*const dyadic_single[16])(float32 rFn, float32 rFm) = {
|
||||
static float32 (*const dyadic_single[16])(struct roundingData *, float32 rFn, float32 rFm) = {
|
||||
[ADF_CODE >> 20] = float32_add,
|
||||
[MUF_CODE >> 20] = float32_mul,
|
||||
[SUF_CODE >> 20] = float32_sub,
|
||||
|
@ -60,22 +60,22 @@ static float32 (*const dyadic_single[16])(float32 rFn, float32 rFm) = {
|
|||
[FRD_CODE >> 20] = float32_rdv,
|
||||
};
|
||||
|
||||
static float32 float32_mvf(float32 rFm)
|
||||
static float32 float32_mvf(struct roundingData *roundData, float32 rFm)
|
||||
{
|
||||
return rFm;
|
||||
}
|
||||
|
||||
static float32 float32_mnf(float32 rFm)
|
||||
static float32 float32_mnf(struct roundingData *roundData, float32 rFm)
|
||||
{
|
||||
return rFm ^ 0x80000000;
|
||||
}
|
||||
|
||||
static float32 float32_abs(float32 rFm)
|
||||
static float32 float32_abs(struct roundingData *roundData, float32 rFm)
|
||||
{
|
||||
return rFm & 0x7fffffff;
|
||||
}
|
||||
|
||||
static float32 (*const monadic_single[16])(float32 rFm) = {
|
||||
static float32 (*const monadic_single[16])(struct roundingData*, float32 rFm) = {
|
||||
[MVF_CODE >> 20] = float32_mvf,
|
||||
[MNF_CODE >> 20] = float32_mnf,
|
||||
[ABS_CODE >> 20] = float32_abs,
|
||||
|
@ -85,7 +85,7 @@ static float32 (*const monadic_single[16])(float32 rFm) = {
|
|||
[NRM_CODE >> 20] = float32_mvf,
|
||||
};
|
||||
|
||||
unsigned int SingleCPDO(const unsigned int opcode, FPREG * rFd)
|
||||
unsigned int SingleCPDO(struct roundingData *roundData, const unsigned int opcode, FPREG * rFd)
|
||||
{
|
||||
FPA11 *fpa11 = GET_FPA11();
|
||||
float32 rFm;
|
||||
|
@ -108,13 +108,13 @@ unsigned int SingleCPDO(const unsigned int opcode, FPREG * rFd)
|
|||
if (fpa11->fType[Fn] == typeSingle &&
|
||||
dyadic_single[opc_mask_shift]) {
|
||||
rFn = fpa11->fpreg[Fn].fSingle;
|
||||
rFd->fSingle = dyadic_single[opc_mask_shift](rFn, rFm);
|
||||
rFd->fSingle = dyadic_single[opc_mask_shift](roundData, rFn, rFm);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
if (monadic_single[opc_mask_shift]) {
|
||||
rFd->fSingle = monadic_single[opc_mask_shift](rFm);
|
||||
rFd->fSingle = monadic_single[opc_mask_shift](roundData, rFm);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -74,7 +74,7 @@ enum {
|
|||
Software IEC/IEEE floating-point rounding mode.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
extern signed char float_rounding_mode;
|
||||
//extern int8 float_rounding_mode;
|
||||
enum {
|
||||
float_round_nearest_even = 0,
|
||||
float_round_to_zero = 1,
|
||||
|
@ -86,7 +86,6 @@ enum {
|
|||
-------------------------------------------------------------------------------
|
||||
Software IEC/IEEE floating-point exception flags.
|
||||
-------------------------------------------------------------------------------
|
||||
extern signed char float_exception_flags;
|
||||
enum {
|
||||
float_flag_inexact = 1,
|
||||
float_flag_underflow = 2,
|
||||
|
@ -99,7 +98,6 @@ ScottB: November 4, 1998
|
|||
Changed the enumeration to match the bit order in the FPA11.
|
||||
*/
|
||||
|
||||
extern signed char float_exception_flags;
|
||||
enum {
|
||||
float_flag_invalid = 1,
|
||||
float_flag_divbyzero = 2,
|
||||
|
@ -121,7 +119,7 @@ void float_raise( signed char );
|
|||
Software IEC/IEEE integer-to-floating-point conversion routines.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
float32 int32_to_float32( signed int );
|
||||
float32 int32_to_float32( struct roundingData *, signed int );
|
||||
float64 int32_to_float64( signed int );
|
||||
#ifdef FLOATX80
|
||||
floatx80 int32_to_floatx80( signed int );
|
||||
|
@ -132,7 +130,7 @@ floatx80 int32_to_floatx80( signed int );
|
|||
Software IEC/IEEE single-precision conversion routines.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
signed int float32_to_int32( float32 );
|
||||
signed int float32_to_int32( struct roundingData *, float32 );
|
||||
signed int float32_to_int32_round_to_zero( float32 );
|
||||
float64 float32_to_float64( float32 );
|
||||
#ifdef FLOATX80
|
||||
|
@ -144,13 +142,13 @@ floatx80 float32_to_floatx80( float32 );
|
|||
Software IEC/IEEE single-precision operations.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
float32 float32_round_to_int( float32 );
|
||||
float32 float32_add( float32, float32 );
|
||||
float32 float32_sub( float32, float32 );
|
||||
float32 float32_mul( float32, float32 );
|
||||
float32 float32_div( float32, float32 );
|
||||
float32 float32_rem( float32, float32 );
|
||||
float32 float32_sqrt( float32 );
|
||||
float32 float32_round_to_int( struct roundingData*, float32 );
|
||||
float32 float32_add( struct roundingData *, float32, float32 );
|
||||
float32 float32_sub( struct roundingData *, float32, float32 );
|
||||
float32 float32_mul( struct roundingData *, float32, float32 );
|
||||
float32 float32_div( struct roundingData *, float32, float32 );
|
||||
float32 float32_rem( struct roundingData *, float32, float32 );
|
||||
float32 float32_sqrt( struct roundingData*, float32 );
|
||||
char float32_eq( float32, float32 );
|
||||
char float32_le( float32, float32 );
|
||||
char float32_lt( float32, float32 );
|
||||
|
@ -164,9 +162,9 @@ char float32_is_signaling_nan( float32 );
|
|||
Software IEC/IEEE double-precision conversion routines.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
signed int float64_to_int32( float64 );
|
||||
signed int float64_to_int32( struct roundingData *, float64 );
|
||||
signed int float64_to_int32_round_to_zero( float64 );
|
||||
float32 float64_to_float32( float64 );
|
||||
float32 float64_to_float32( struct roundingData *, float64 );
|
||||
#ifdef FLOATX80
|
||||
floatx80 float64_to_floatx80( float64 );
|
||||
#endif
|
||||
|
@ -176,13 +174,13 @@ floatx80 float64_to_floatx80( float64 );
|
|||
Software IEC/IEEE double-precision operations.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
float64 float64_round_to_int( float64 );
|
||||
float64 float64_add( float64, float64 );
|
||||
float64 float64_sub( float64, float64 );
|
||||
float64 float64_mul( float64, float64 );
|
||||
float64 float64_div( float64, float64 );
|
||||
float64 float64_rem( float64, float64 );
|
||||
float64 float64_sqrt( float64 );
|
||||
float64 float64_round_to_int( struct roundingData *, float64 );
|
||||
float64 float64_add( struct roundingData *, float64, float64 );
|
||||
float64 float64_sub( struct roundingData *, float64, float64 );
|
||||
float64 float64_mul( struct roundingData *, float64, float64 );
|
||||
float64 float64_div( struct roundingData *, float64, float64 );
|
||||
float64 float64_rem( struct roundingData *, float64, float64 );
|
||||
float64 float64_sqrt( struct roundingData *, float64 );
|
||||
char float64_eq( float64, float64 );
|
||||
char float64_le( float64, float64 );
|
||||
char float64_lt( float64, float64 );
|
||||
|
@ -198,31 +196,23 @@ char float64_is_signaling_nan( float64 );
|
|||
Software IEC/IEEE extended double-precision conversion routines.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
signed int floatx80_to_int32( floatx80 );
|
||||
signed int floatx80_to_int32( struct roundingData *, floatx80 );
|
||||
signed int floatx80_to_int32_round_to_zero( floatx80 );
|
||||
float32 floatx80_to_float32( floatx80 );
|
||||
float64 floatx80_to_float64( floatx80 );
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
Software IEC/IEEE extended double-precision rounding precision. Valid
|
||||
values are 32, 64, and 80.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
extern signed char floatx80_rounding_precision;
|
||||
float32 floatx80_to_float32( struct roundingData *, floatx80 );
|
||||
float64 floatx80_to_float64( struct roundingData *, floatx80 );
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
Software IEC/IEEE extended double-precision operations.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
floatx80 floatx80_round_to_int( floatx80 );
|
||||
floatx80 floatx80_add( floatx80, floatx80 );
|
||||
floatx80 floatx80_sub( floatx80, floatx80 );
|
||||
floatx80 floatx80_mul( floatx80, floatx80 );
|
||||
floatx80 floatx80_div( floatx80, floatx80 );
|
||||
floatx80 floatx80_rem( floatx80, floatx80 );
|
||||
floatx80 floatx80_sqrt( floatx80 );
|
||||
floatx80 floatx80_round_to_int( struct roundingData *, floatx80 );
|
||||
floatx80 floatx80_add( struct roundingData *, floatx80, floatx80 );
|
||||
floatx80 floatx80_sub( struct roundingData *, floatx80, floatx80 );
|
||||
floatx80 floatx80_mul( struct roundingData *, floatx80, floatx80 );
|
||||
floatx80 floatx80_div( struct roundingData *, floatx80, floatx80 );
|
||||
floatx80 floatx80_rem( struct roundingData *, floatx80, floatx80 );
|
||||
floatx80 floatx80_sqrt( struct roundingData *, floatx80 );
|
||||
char floatx80_eq( floatx80, floatx80 );
|
||||
char floatx80_le( floatx80, floatx80 );
|
||||
char floatx80_lt( floatx80, floatx80 );
|
||||
|
|
|
@ -115,7 +115,7 @@ static int valid_kernel_stack(struct frame_tail *tail, struct pt_regs *regs)
|
|||
return (tailaddr > stack) && (tailaddr < stack_base);
|
||||
}
|
||||
|
||||
void arm_backtrace(struct pt_regs const *regs, unsigned int depth)
|
||||
void arm_backtrace(struct pt_regs * const regs, unsigned int depth)
|
||||
{
|
||||
struct frame_tail *tail;
|
||||
unsigned long last_address = 0;
|
||||
|
|
|
@ -770,6 +770,9 @@ vfp_double_add(struct vfp_double *vdd, struct vfp_double *vdn,
|
|||
if ((s64)m_sig < 0) {
|
||||
vdd->sign = vfp_sign_negate(vdd->sign);
|
||||
m_sig = -m_sig;
|
||||
} else if (m_sig == 0) {
|
||||
vdd->sign = (fpscr & FPSCR_RMODE_MASK) ==
|
||||
FPSCR_ROUND_MINUSINF ? 0x8000 : 0;
|
||||
}
|
||||
} else {
|
||||
m_sig += vdn->significand;
|
||||
|
|
|
@ -176,12 +176,12 @@ __do_page_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr,
|
|||
* Handle the "normal" cases first - successful and sigbus
|
||||
*/
|
||||
switch (fault) {
|
||||
case 2:
|
||||
case VM_FAULT_MAJOR:
|
||||
tsk->maj_flt++;
|
||||
return fault;
|
||||
case 1:
|
||||
case VM_FAULT_MINOR:
|
||||
tsk->min_flt++;
|
||||
case 0:
|
||||
case VM_FAULT_SIGBUS:
|
||||
return fault;
|
||||
}
|
||||
|
||||
|
@ -226,14 +226,11 @@ int do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
|||
/*
|
||||
* Handle the "normal" case first
|
||||
*/
|
||||
if (fault > 0)
|
||||
switch (fault) {
|
||||
case VM_FAULT_MINOR:
|
||||
case VM_FAULT_MAJOR:
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* We had some memory, but were unable to
|
||||
* successfully fix up this page fault.
|
||||
*/
|
||||
if (fault == 0){
|
||||
case VM_FAULT_SIGBUS:
|
||||
goto do_sigbus;
|
||||
}
|
||||
|
||||
|
|
|
@ -284,13 +284,13 @@ do_page_fault(unsigned long address, struct pt_regs *regs,
|
|||
*/
|
||||
|
||||
switch (handle_mm_fault(mm, vma, address, writeaccess & 1)) {
|
||||
case 1:
|
||||
case VM_FAULT_MINOR:
|
||||
tsk->min_flt++;
|
||||
break;
|
||||
case 2:
|
||||
case VM_FAULT_MAJOR:
|
||||
tsk->maj_flt++;
|
||||
break;
|
||||
case 0:
|
||||
case VM_FAULT_SIGBUS:
|
||||
goto do_sigbus;
|
||||
default:
|
||||
goto out_of_memory;
|
||||
|
|
|
@ -163,13 +163,13 @@ asmlinkage void do_page_fault(int datammu, unsigned long esr0, unsigned long ear
|
|||
* the fault.
|
||||
*/
|
||||
switch (handle_mm_fault(mm, vma, ear0, write)) {
|
||||
case 1:
|
||||
case VM_FAULT_MINOR:
|
||||
current->min_flt++;
|
||||
break;
|
||||
case 2:
|
||||
case VM_FAULT_MAJOR:
|
||||
current->maj_flt++;
|
||||
break;
|
||||
case 0:
|
||||
case VM_FAULT_SIGBUS:
|
||||
goto do_sigbus;
|
||||
default:
|
||||
goto out_of_memory;
|
||||
|
|
|
@ -454,8 +454,9 @@ config HPET_TIMER
|
|||
Choose N to continue using the legacy 8254 timer.
|
||||
|
||||
config HPET_EMULATE_RTC
|
||||
bool "Provide RTC interrupt"
|
||||
bool
|
||||
depends on HPET_TIMER && RTC=y
|
||||
default y
|
||||
|
||||
config SMP
|
||||
bool "Symmetric multi-processing support"
|
||||
|
|
|
@ -9,12 +9,15 @@
|
|||
void (*pm_power_off)(void);
|
||||
EXPORT_SYMBOL(pm_power_off);
|
||||
|
||||
void machine_restart(char * __unused)
|
||||
void machine_shutdown(void)
|
||||
{
|
||||
#ifdef CONFIG_SMP
|
||||
smp_send_stop();
|
||||
#endif
|
||||
}
|
||||
|
||||
void machine_emergency_restart(void)
|
||||
{
|
||||
/*
|
||||
* Visual Workstations restart after this
|
||||
* register is poked on the PIIX4
|
||||
|
@ -22,6 +25,12 @@ void machine_restart(char * __unused)
|
|||
outb(PIIX4_RESET_VAL, PIIX4_RESET_PORT);
|
||||
}
|
||||
|
||||
void machine_restart(char * __unused)
|
||||
{
|
||||
machine_shutdown();
|
||||
machine_emergency_restart();
|
||||
}
|
||||
|
||||
void machine_power_off(void)
|
||||
{
|
||||
unsigned short pm_status;
|
||||
|
|
|
@ -14,6 +14,8 @@
|
|||
#include "cobalt.h"
|
||||
#include "piix4.h"
|
||||
|
||||
int no_broadcast;
|
||||
|
||||
char visws_board_type = -1;
|
||||
char visws_board_rev = -1;
|
||||
|
||||
|
|
|
@ -251,6 +251,12 @@ kb_wait(void)
|
|||
break;
|
||||
}
|
||||
|
||||
void
|
||||
machine_shutdown(void)
|
||||
{
|
||||
/* Architecture specific shutdown needed before a kexec */
|
||||
}
|
||||
|
||||
void
|
||||
machine_restart(char *cmd)
|
||||
{
|
||||
|
@ -278,6 +284,13 @@ machine_restart(char *cmd)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
machine_emergency_restart(void)
|
||||
{
|
||||
/*for now, just hook this to a warm restart */
|
||||
machine_restart(NULL);
|
||||
}
|
||||
|
||||
void
|
||||
mca_nmi_hook(void)
|
||||
{
|
||||
|
|
|
@ -243,14 +243,6 @@ static unsigned long calculate_numa_remap_pages(void)
|
|||
/* now the roundup is correct, convert to PAGE_SIZE pages */
|
||||
size = size * PTRS_PER_PTE;
|
||||
|
||||
if (node_end_pfn[nid] & (PTRS_PER_PTE-1)) {
|
||||
/*
|
||||
* Adjust size if node_end_pfn is not on a proper
|
||||
* pmd boundary. remap_numa_kva will barf otherwise.
|
||||
*/
|
||||
size += node_end_pfn[nid] & (PTRS_PER_PTE-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Validate the region we are allocating only contains valid
|
||||
* pages.
|
||||
|
@ -270,6 +262,17 @@ static unsigned long calculate_numa_remap_pages(void)
|
|||
reserve_pages += size;
|
||||
printk("Shrinking node %d from %ld pages to %ld pages\n",
|
||||
nid, node_end_pfn[nid], node_end_pfn[nid] - size);
|
||||
|
||||
if (node_end_pfn[nid] & (PTRS_PER_PTE-1)) {
|
||||
/*
|
||||
* Align node_end_pfn[] and node_remap_start_pfn[] to
|
||||
* pmd boundary. remap_numa_kva will barf otherwise.
|
||||
*/
|
||||
printk("Shrinking node %d further by %ld pages for proper alignment\n",
|
||||
nid, node_end_pfn[nid] & (PTRS_PER_PTE-1));
|
||||
size += node_end_pfn[nid] & (PTRS_PER_PTE-1);
|
||||
}
|
||||
|
||||
node_end_pfn[nid] -= size;
|
||||
node_remap_start_pfn[nid] = node_end_pfn[nid];
|
||||
}
|
||||
|
|
|
@ -18,8 +18,10 @@
|
|||
extern struct pci_raw_ops pci_direct_conf1;
|
||||
|
||||
static int pci_visws_enable_irq(struct pci_dev *dev) { return 0; }
|
||||
static void pci_visws_disable_irq(struct pci_dev *dev) { }
|
||||
|
||||
int (*pcibios_enable_irq)(struct pci_dev *dev) = &pci_visws_enable_irq;
|
||||
void (*pcibios_disable_irq)(struct pci_dev *dev) = &pci_visws_disable_irq;
|
||||
|
||||
void __init pcibios_penalize_isa_irq(int irq, int active) {}
|
||||
|
||||
|
|
|
@ -179,7 +179,7 @@ static int can_do_pal_halt = 1;
|
|||
|
||||
static int __init nohalt_setup(char * str)
|
||||
{
|
||||
pal_halt = 0;
|
||||
pal_halt = can_do_pal_halt = 0;
|
||||
return 1;
|
||||
}
|
||||
__setup("nohalt", nohalt_setup);
|
||||
|
|
|
@ -160,13 +160,13 @@ int do_page_fault(struct pt_regs *regs, unsigned long address,
|
|||
printk("handle_mm_fault returns %d\n",fault);
|
||||
#endif
|
||||
switch (fault) {
|
||||
case 1:
|
||||
case VM_FAULT_MINOR:
|
||||
current->min_flt++;
|
||||
break;
|
||||
case 2:
|
||||
case VM_FAULT_MAJOR:
|
||||
current->maj_flt++;
|
||||
break;
|
||||
case 0:
|
||||
case VM_FAULT_SIGBUS:
|
||||
goto bus_err;
|
||||
default:
|
||||
goto out_of_memory;
|
||||
|
|
|
@ -178,17 +178,17 @@ void do_page_fault(struct pt_regs *regs, unsigned long code,
|
|||
*/
|
||||
|
||||
switch (handle_mm_fault(mm, vma, address, (acc_type & VM_WRITE) != 0)) {
|
||||
case 1:
|
||||
case VM_FAULT_MINOR:
|
||||
++current->min_flt;
|
||||
break;
|
||||
case 2:
|
||||
case VM_FAULT_MAJOR:
|
||||
++current->maj_flt;
|
||||
break;
|
||||
case 0:
|
||||
case VM_FAULT_SIGBUS:
|
||||
/*
|
||||
* We ran out of memory, or some other thing happened
|
||||
* to us that made us unable to handle the page fault
|
||||
* gracefully.
|
||||
* We hit a hared mapping outside of the file, or some
|
||||
* other thing happened to us that made us unable to
|
||||
* handle the page fault gracefully.
|
||||
*/
|
||||
goto bad_area;
|
||||
default:
|
||||
|
|
|
@ -69,9 +69,9 @@ config FEC_QS6612
|
|||
|
||||
config ENET_BIG_BUFFERS
|
||||
bool "Use Big CPM Ethernet Buffers"
|
||||
depends on NET_ETHERNET
|
||||
depends on SCC_ENET || FEC_ENET
|
||||
help
|
||||
Allocate large buffers for MPC8xx Etherenet. Increases throughput
|
||||
Allocate large buffers for MPC8xx Ethernet. Increases throughput
|
||||
and decreases the likelihood of dropped packets, but costs memory.
|
||||
|
||||
config HTDMSOUND
|
||||
|
|
|
@ -39,8 +39,6 @@
|
|||
#include <asm/tlbflush.h>
|
||||
#include <asm/rheap.h>
|
||||
|
||||
extern int get_pteptr(struct mm_struct *mm, unsigned long addr, pte_t **ptep);
|
||||
|
||||
static void m8xx_cpm_dpinit(void);
|
||||
static uint host_buffer; /* One page of host buffer */
|
||||
static uint host_end; /* end + 1 */
|
||||
|
@ -108,14 +106,11 @@ struct hw_interrupt_type cpm_pic = {
|
|||
.end = cpm_eoi,
|
||||
};
|
||||
|
||||
extern void flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr);
|
||||
|
||||
void
|
||||
m8xx_cpm_reset(uint bootpage)
|
||||
m8xx_cpm_reset(void)
|
||||
{
|
||||
volatile immap_t *imp;
|
||||
volatile cpm8xx_t *commproc;
|
||||
pte_t *pte;
|
||||
|
||||
imp = (immap_t *)IMAP_ADDR;
|
||||
commproc = (cpm8xx_t *)&imp->im_cpm;
|
||||
|
@ -143,17 +138,6 @@ m8xx_cpm_reset(uint bootpage)
|
|||
/* Reclaim the DP memory for our use. */
|
||||
m8xx_cpm_dpinit();
|
||||
|
||||
/* get the PTE for the bootpage */
|
||||
if (!get_pteptr(&init_mm, bootpage, &pte))
|
||||
panic("get_pteptr failed\n");
|
||||
|
||||
/* and make it uncachable */
|
||||
pte_val(*pte) |= _PAGE_NO_CACHE;
|
||||
_tlbie(bootpage);
|
||||
|
||||
host_buffer = bootpage;
|
||||
host_end = host_buffer + PAGE_SIZE;
|
||||
|
||||
/* Tell everyone where the comm processor resides.
|
||||
*/
|
||||
cpmp = (cpm8xx_t *)commproc;
|
||||
|
@ -384,8 +368,6 @@ static rh_info_t cpm_dpmem_info;
|
|||
|
||||
void m8xx_cpm_dpinit(void)
|
||||
{
|
||||
cpm8xx_t *cp = &((immap_t *)IMAP_ADDR)->im_cpm;
|
||||
|
||||
spin_lock_init(&cpm_dpmem_lock);
|
||||
|
||||
/* Initialize the info header */
|
||||
|
|
|
@ -173,7 +173,7 @@ struct fec_enet_private {
|
|||
uint phy_status;
|
||||
uint phy_speed;
|
||||
phy_info_t *phy;
|
||||
struct tq_struct phy_task;
|
||||
struct work_struct phy_task;
|
||||
|
||||
uint sequence_done;
|
||||
|
||||
|
@ -199,7 +199,8 @@ static int fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev);
|
|||
#ifdef CONFIG_USE_MDIO
|
||||
static void fec_enet_mii(struct net_device *dev);
|
||||
#endif /* CONFIG_USE_MDIO */
|
||||
static void fec_enet_interrupt(int irq, void * dev_id, struct pt_regs * regs);
|
||||
static irqreturn_t fec_enet_interrupt(int irq, void * dev_id,
|
||||
struct pt_regs * regs);
|
||||
#ifdef CONFIG_FEC_PACKETHOOK
|
||||
static void fec_enet_tx(struct net_device *dev, __u32 regval);
|
||||
static void fec_enet_rx(struct net_device *dev, __u32 regval);
|
||||
|
@ -471,7 +472,7 @@ fec_timeout(struct net_device *dev)
|
|||
/* The interrupt handler.
|
||||
* This is called from the MPC core interrupt.
|
||||
*/
|
||||
static void
|
||||
static irqreturn_t
|
||||
fec_enet_interrupt(int irq, void * dev_id, struct pt_regs * regs)
|
||||
{
|
||||
struct net_device *dev = dev_id;
|
||||
|
@ -525,6 +526,7 @@ printk("%s[%d] %s: unexpected FEC_ENET_MII event\n", __FILE__,__LINE__,__FUNCTIO
|
|||
}
|
||||
|
||||
}
|
||||
return IRQ_RETVAL(IRQ_HANDLED);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1263,8 +1265,9 @@ static void mii_display_status(struct net_device *dev)
|
|||
printk(".\n");
|
||||
}
|
||||
|
||||
static void mii_display_config(struct net_device *dev)
|
||||
static void mii_display_config(void *priv)
|
||||
{
|
||||
struct net_device *dev = (struct net_device *)priv;
|
||||
struct fec_enet_private *fep = dev->priv;
|
||||
volatile uint *s = &(fep->phy_status);
|
||||
|
||||
|
@ -1294,8 +1297,9 @@ static void mii_display_config(struct net_device *dev)
|
|||
fep->sequence_done = 1;
|
||||
}
|
||||
|
||||
static void mii_relink(struct net_device *dev)
|
||||
static void mii_relink(void *priv)
|
||||
{
|
||||
struct net_device *dev = (struct net_device *)priv;
|
||||
struct fec_enet_private *fep = dev->priv;
|
||||
int duplex;
|
||||
|
||||
|
@ -1323,18 +1327,16 @@ static void mii_queue_relink(uint mii_reg, struct net_device *dev)
|
|||
{
|
||||
struct fec_enet_private *fep = dev->priv;
|
||||
|
||||
fep->phy_task.routine = (void *)mii_relink;
|
||||
fep->phy_task.data = dev;
|
||||
schedule_task(&fep->phy_task);
|
||||
INIT_WORK(&fep->phy_task, mii_relink, (void *)dev);
|
||||
schedule_work(&fep->phy_task);
|
||||
}
|
||||
|
||||
static void mii_queue_config(uint mii_reg, struct net_device *dev)
|
||||
{
|
||||
struct fec_enet_private *fep = dev->priv;
|
||||
|
||||
fep->phy_task.routine = (void *)mii_display_config;
|
||||
fep->phy_task.data = dev;
|
||||
schedule_task(&fep->phy_task);
|
||||
INIT_WORK(&fep->phy_task, mii_display_config, (void *)dev);
|
||||
schedule_work(&fep->phy_task);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1403,11 +1405,11 @@ mii_discover_phy(uint mii_reg, struct net_device *dev)
|
|||
|
||||
/* This interrupt occurs when the PHY detects a link change.
|
||||
*/
|
||||
static void
|
||||
static
|
||||
#ifdef CONFIG_RPXCLASSIC
|
||||
mii_link_interrupt(void *dev_id)
|
||||
void mii_link_interrupt(void *dev_id)
|
||||
#else
|
||||
mii_link_interrupt(int irq, void * dev_id, struct pt_regs * regs)
|
||||
irqreturn_t mii_link_interrupt(int irq, void * dev_id, struct pt_regs * regs)
|
||||
#endif
|
||||
{
|
||||
#ifdef CONFIG_USE_MDIO
|
||||
|
@ -1440,6 +1442,9 @@ mii_link_interrupt(int irq, void * dev_id, struct pt_regs * regs)
|
|||
printk("%s[%d] %s: unexpected Link interrupt\n", __FILE__,__LINE__,__FUNCTION__);
|
||||
#endif /* CONFIG_USE_MDIO */
|
||||
|
||||
#ifndef CONFIG_RPXCLASSIC
|
||||
return IRQ_RETVAL(IRQ_HANDLED);
|
||||
#endif /* CONFIG_RPXCLASSIC */
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -1575,7 +1580,7 @@ static int __init fec_enet_init(void)
|
|||
struct fec_enet_private *fep;
|
||||
int i, j, k, err;
|
||||
unsigned char *eap, *iap, *ba;
|
||||
unsigned long mem_addr;
|
||||
dma_addr_t mem_addr;
|
||||
volatile cbd_t *bdp;
|
||||
cbd_t *cbd_base;
|
||||
volatile immap_t *immap;
|
||||
|
@ -1640,7 +1645,8 @@ static int __init fec_enet_init(void)
|
|||
printk("FEC initialization failed.\n");
|
||||
return 1;
|
||||
}
|
||||
cbd_base = (cbd_t *)consistent_alloc(GFP_KERNEL, PAGE_SIZE, &mem_addr);
|
||||
cbd_base = (cbd_t *)dma_alloc_coherent(dev->class_dev.dev, PAGE_SIZE,
|
||||
&mem_addr, GFP_KERNEL);
|
||||
|
||||
/* Set receive and transmit descriptor base.
|
||||
*/
|
||||
|
@ -1657,7 +1663,10 @@ static int __init fec_enet_init(void)
|
|||
|
||||
/* Allocate a page.
|
||||
*/
|
||||
ba = (unsigned char *)consistent_alloc(GFP_KERNEL, PAGE_SIZE, &mem_addr);
|
||||
ba = (unsigned char *)dma_alloc_coherent(dev->class_dev.dev,
|
||||
PAGE_SIZE,
|
||||
&mem_addr,
|
||||
GFP_KERNEL);
|
||||
/* BUG: no check for failure */
|
||||
|
||||
/* Initialize the BD for every fragment in the page.
|
||||
|
|
|
@ -160,6 +160,21 @@ void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
|
|||
}
|
||||
EXPORT_SYMBOL(pcibios_resource_to_bus);
|
||||
|
||||
void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
|
||||
struct pci_bus_region *region)
|
||||
{
|
||||
unsigned long offset = 0;
|
||||
struct pci_controller *hose = dev->sysdata;
|
||||
|
||||
if (hose && res->flags & IORESOURCE_IO)
|
||||
offset = (unsigned long)hose->io_base_virt - isa_io_base;
|
||||
else if (hose && res->flags & IORESOURCE_MEM)
|
||||
offset = hose->pci_mem_offset;
|
||||
res->start = region->start + offset;
|
||||
res->end = region->end + offset;
|
||||
}
|
||||
EXPORT_SYMBOL(pcibios_bus_to_resource);
|
||||
|
||||
/*
|
||||
* We need to avoid collisions with `mirrored' VGA ports
|
||||
* and other strange ISA hardware, so we always want the
|
||||
|
|
|
@ -324,7 +324,7 @@ EXPORT_SYMBOL(__res);
|
|||
|
||||
EXPORT_SYMBOL(next_mmu_context);
|
||||
EXPORT_SYMBOL(set_context);
|
||||
EXPORT_SYMBOL(handle_mm_fault); /* For MOL */
|
||||
EXPORT_SYMBOL_GPL(__handle_mm_fault); /* For MOL */
|
||||
EXPORT_SYMBOL(disarm_decr);
|
||||
#ifdef CONFIG_PPC_STD_MMU
|
||||
extern long mol_trampoline;
|
||||
|
|
|
@ -57,7 +57,7 @@ unsigned char __res[sizeof(bd_t)];
|
|||
extern void m8xx_ide_init(void);
|
||||
|
||||
extern unsigned long find_available_memory(void);
|
||||
extern void m8xx_cpm_reset(uint cpm_page);
|
||||
extern void m8xx_cpm_reset();
|
||||
extern void m8xx_wdt_handler_install(bd_t *bp);
|
||||
extern void rpxfb_alloc_pages(void);
|
||||
extern void cpm_interrupt_init(void);
|
||||
|
@ -70,13 +70,9 @@ board_init(void)
|
|||
void __init
|
||||
m8xx_setup_arch(void)
|
||||
{
|
||||
int cpm_page;
|
||||
|
||||
cpm_page = (int) alloc_bootmem_pages(PAGE_SIZE);
|
||||
|
||||
/* Reset the Communication Processor Module.
|
||||
*/
|
||||
m8xx_cpm_reset(cpm_page);
|
||||
m8xx_cpm_reset();
|
||||
|
||||
#ifdef CONFIG_FB_RPX
|
||||
rpxfb_alloc_pages();
|
||||
|
|
|
@ -191,8 +191,8 @@ struct platform_device ppc_sys_platform_devices[] = {
|
|||
.num_resources = 2,
|
||||
.resource = (struct resource[]) {
|
||||
{
|
||||
.start = 0x22000,
|
||||
.end = 0x22fff,
|
||||
.start = 0x23000,
|
||||
.end = 0x23fff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
|
@ -208,8 +208,8 @@ struct platform_device ppc_sys_platform_devices[] = {
|
|||
.num_resources = 2,
|
||||
.resource = (struct resource[]) {
|
||||
{
|
||||
.start = 0x23000,
|
||||
.end = 0x23fff,
|
||||
.start = 0x22000,
|
||||
.end = 0x22fff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
|
|
|
@ -1307,7 +1307,7 @@ local int huft_build(
|
|||
{
|
||||
*t = (inflate_huft *)Z_NULL;
|
||||
*m = 0;
|
||||
return Z_OK;
|
||||
return Z_DATA_ERROR;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1351,6 +1351,7 @@ local int huft_build(
|
|||
if ((j = *p++) != 0)
|
||||
v[x[j]++] = i;
|
||||
} while (++i < n);
|
||||
n = x[g]; /* set n to length of v */
|
||||
|
||||
|
||||
/* Generate the Huffman codes and for each, make the table entries */
|
||||
|
|
987
arch/ppc64/configs/bpa_defconfig
Normal file
987
arch/ppc64/configs/bpa_defconfig
Normal file
|
@ -0,0 +1,987 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13-rc6
|
||||
# Mon Aug 8 14:12:19 2005
|
||||
#
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_ISA_DMA=y
|
||||
CONFIG_HAVE_DEC_LOCK=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_COMPAT=y
|
||||
CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
|
||||
CONFIG_FORCE_MAX_ZONEORDER=13
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_CLEAN_COMPILE=y
|
||||
CONFIG_LOCK_KERNEL=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_AUDIT is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_KOBJECT_UEVENT=y
|
||||
# CONFIG_IKCONFIG is not set
|
||||
# CONFIG_CPUSETS is not set
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
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
|
||||
#
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||
CONFIG_OBSOLETE_MODPARM=y
|
||||
# CONFIG_MODVERSIONS is not set
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
# CONFIG_KMOD is not set
|
||||
CONFIG_STOP_MACHINE=y
|
||||
CONFIG_SYSVIPC_COMPAT=y
|
||||
|
||||
#
|
||||
# Platform support
|
||||
#
|
||||
# CONFIG_PPC_ISERIES is not set
|
||||
CONFIG_PPC_MULTIPLATFORM=y
|
||||
# CONFIG_PPC_PSERIES is not set
|
||||
CONFIG_PPC_BPA=y
|
||||
# CONFIG_PPC_PMAC is not set
|
||||
# CONFIG_PPC_MAPLE is not set
|
||||
CONFIG_PPC=y
|
||||
CONFIG_PPC64=y
|
||||
CONFIG_PPC_OF=y
|
||||
CONFIG_BPA_IIC=y
|
||||
CONFIG_ALTIVEC=y
|
||||
CONFIG_KEXEC=y
|
||||
# CONFIG_U3_DART is not set
|
||||
# CONFIG_BOOTX_TEXT is not set
|
||||
# CONFIG_POWER4_ONLY is not set
|
||||
# CONFIG_IOMMU_VMERGE is not set
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=4
|
||||
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_ARCH_FLATMEM_ENABLE=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_NUMA is not set
|
||||
CONFIG_SCHED_SMT=y
|
||||
CONFIG_PREEMPT_NONE=y
|
||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
CONFIG_PREEMPT_BKL=y
|
||||
# CONFIG_HZ_100 is not set
|
||||
CONFIG_HZ_250=y
|
||||
# CONFIG_HZ_1000 is not set
|
||||
CONFIG_HZ=250
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_PPC_RTAS=y
|
||||
CONFIG_RTAS_PROC=y
|
||||
CONFIG_RTAS_FLASH=y
|
||||
CONFIG_SECCOMP=y
|
||||
CONFIG_ISA_DMA_API=y
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
CONFIG_BINFMT_ELF=y
|
||||
# CONFIG_BINFMT_MISC is not set
|
||||
CONFIG_PCI_LEGACY_PROC=y
|
||||
CONFIG_PCI_NAMES=y
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
#
|
||||
# CONFIG_PCCARD is not set
|
||||
|
||||
#
|
||||
# PCI Hotplug Support
|
||||
#
|
||||
# CONFIG_HOTPLUG_PCI is not set
|
||||
CONFIG_PROC_DEVICETREE=y
|
||||
# CONFIG_CMDLINE_BOOL is not set
|
||||
|
||||
#
|
||||
# Networking
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
CONFIG_PACKET=y
|
||||
# CONFIG_PACKET_MMAP is not set
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_XFRM=y
|
||||
# CONFIG_XFRM_USER is not set
|
||||
# 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=y
|
||||
# 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=y
|
||||
CONFIG_IP_TCPDIAG=y
|
||||
CONFIG_IP_TCPDIAG_IPV6=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
|
||||
#
|
||||
# IP: Virtual Server Configuration
|
||||
#
|
||||
# CONFIG_IP_VS is not set
|
||||
CONFIG_IPV6=y
|
||||
# CONFIG_IPV6_PRIVACY is not set
|
||||
CONFIG_INET6_AH=m
|
||||
CONFIG_INET6_ESP=m
|
||||
CONFIG_INET6_IPCOMP=m
|
||||
CONFIG_INET6_TUNNEL=m
|
||||
CONFIG_IPV6_TUNNEL=m
|
||||
CONFIG_NETFILTER=y
|
||||
# CONFIG_NETFILTER_DEBUG is not set
|
||||
|
||||
#
|
||||
# IP: Netfilter Configuration
|
||||
#
|
||||
CONFIG_IP_NF_CONNTRACK=y
|
||||
# CONFIG_IP_NF_CT_ACCT is not set
|
||||
# CONFIG_IP_NF_CONNTRACK_MARK is not set
|
||||
CONFIG_IP_NF_CT_PROTO_SCTP=y
|
||||
CONFIG_IP_NF_FTP=m
|
||||
CONFIG_IP_NF_IRC=m
|
||||
CONFIG_IP_NF_TFTP=m
|
||||
CONFIG_IP_NF_AMANDA=m
|
||||
CONFIG_IP_NF_QUEUE=m
|
||||
CONFIG_IP_NF_IPTABLES=m
|
||||
CONFIG_IP_NF_MATCH_LIMIT=m
|
||||
CONFIG_IP_NF_MATCH_IPRANGE=m
|
||||
CONFIG_IP_NF_MATCH_MAC=m
|
||||
CONFIG_IP_NF_MATCH_PKTTYPE=m
|
||||
CONFIG_IP_NF_MATCH_MARK=m
|
||||
CONFIG_IP_NF_MATCH_MULTIPORT=m
|
||||
CONFIG_IP_NF_MATCH_TOS=m
|
||||
CONFIG_IP_NF_MATCH_RECENT=m
|
||||
CONFIG_IP_NF_MATCH_ECN=m
|
||||
CONFIG_IP_NF_MATCH_DSCP=m
|
||||
CONFIG_IP_NF_MATCH_AH_ESP=m
|
||||
CONFIG_IP_NF_MATCH_LENGTH=m
|
||||
CONFIG_IP_NF_MATCH_TTL=m
|
||||
CONFIG_IP_NF_MATCH_TCPMSS=m
|
||||
CONFIG_IP_NF_MATCH_HELPER=m
|
||||
CONFIG_IP_NF_MATCH_STATE=m
|
||||
CONFIG_IP_NF_MATCH_CONNTRACK=m
|
||||
CONFIG_IP_NF_MATCH_OWNER=m
|
||||
CONFIG_IP_NF_MATCH_ADDRTYPE=m
|
||||
CONFIG_IP_NF_MATCH_REALM=m
|
||||
CONFIG_IP_NF_MATCH_SCTP=m
|
||||
CONFIG_IP_NF_MATCH_COMMENT=m
|
||||
CONFIG_IP_NF_MATCH_HASHLIMIT=m
|
||||
CONFIG_IP_NF_FILTER=m
|
||||
CONFIG_IP_NF_TARGET_REJECT=m
|
||||
CONFIG_IP_NF_TARGET_LOG=m
|
||||
CONFIG_IP_NF_TARGET_ULOG=m
|
||||
CONFIG_IP_NF_TARGET_TCPMSS=m
|
||||
CONFIG_IP_NF_NAT=m
|
||||
CONFIG_IP_NF_NAT_NEEDED=y
|
||||
CONFIG_IP_NF_TARGET_MASQUERADE=m
|
||||
CONFIG_IP_NF_TARGET_REDIRECT=m
|
||||
CONFIG_IP_NF_TARGET_NETMAP=m
|
||||
CONFIG_IP_NF_TARGET_SAME=m
|
||||
CONFIG_IP_NF_NAT_SNMP_BASIC=m
|
||||
CONFIG_IP_NF_NAT_IRC=m
|
||||
CONFIG_IP_NF_NAT_FTP=m
|
||||
CONFIG_IP_NF_NAT_TFTP=m
|
||||
CONFIG_IP_NF_NAT_AMANDA=m
|
||||
CONFIG_IP_NF_MANGLE=m
|
||||
CONFIG_IP_NF_TARGET_TOS=m
|
||||
CONFIG_IP_NF_TARGET_ECN=m
|
||||
CONFIG_IP_NF_TARGET_DSCP=m
|
||||
CONFIG_IP_NF_TARGET_MARK=m
|
||||
CONFIG_IP_NF_TARGET_CLASSIFY=m
|
||||
CONFIG_IP_NF_RAW=m
|
||||
CONFIG_IP_NF_TARGET_NOTRACK=m
|
||||
CONFIG_IP_NF_ARPTABLES=m
|
||||
CONFIG_IP_NF_ARPFILTER=m
|
||||
CONFIG_IP_NF_ARP_MANGLE=m
|
||||
|
||||
#
|
||||
# IPv6: Netfilter Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP6_NF_QUEUE is not set
|
||||
# CONFIG_IP6_NF_IPTABLES 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=y
|
||||
|
||||
#
|
||||
# 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
|
||||
#
|
||||
|
||||
#
|
||||
# Generic Driver Options
|
||||
#
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
CONFIG_FW_LOADER=y
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
|
||||
#
|
||||
# Memory Technology Devices (MTD)
|
||||
#
|
||||
# CONFIG_MTD is not set
|
||||
|
||||
#
|
||||
# Parallel port support
|
||||
#
|
||||
# CONFIG_PARPORT is not set
|
||||
|
||||
#
|
||||
# Plug and Play support
|
||||
#
|
||||
|
||||
#
|
||||
# Block devices
|
||||
#
|
||||
# CONFIG_BLK_DEV_FD is not set
|
||||
# CONFIG_BLK_CPQ_DA is not set
|
||||
# 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 is not set
|
||||
CONFIG_BLK_DEV_NBD=y
|
||||
# CONFIG_BLK_DEV_SX8 is not set
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=131072
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
||||
#
|
||||
# ATA/ATAPI/MFM/RLL support
|
||||
#
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDE=y
|
||||
|
||||
#
|
||||
# Please see Documentation/ide.txt for help/info on IDE drives
|
||||
#
|
||||
# CONFIG_BLK_DEV_IDE_SATA is not set
|
||||
CONFIG_BLK_DEV_IDEDISK=y
|
||||
CONFIG_IDEDISK_MULTI_MODE=y
|
||||
# CONFIG_BLK_DEV_IDECD is not set
|
||||
# CONFIG_BLK_DEV_IDETAPE is not set
|
||||
# CONFIG_BLK_DEV_IDEFLOPPY is not set
|
||||
# CONFIG_IDE_TASK_IOCTL is not set
|
||||
|
||||
#
|
||||
# IDE chipset support/bugfixes
|
||||
#
|
||||
CONFIG_IDE_GENERIC=y
|
||||
CONFIG_BLK_DEV_IDEPCI=y
|
||||
CONFIG_IDEPCI_SHARE_IRQ=y
|
||||
# CONFIG_BLK_DEV_OFFBOARD is not set
|
||||
CONFIG_BLK_DEV_GENERIC=y
|
||||
# CONFIG_BLK_DEV_OPTI621 is not set
|
||||
# CONFIG_BLK_DEV_SL82C105 is not set
|
||||
CONFIG_BLK_DEV_IDEDMA_PCI=y
|
||||
# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
|
||||
CONFIG_IDEDMA_PCI_AUTO=y
|
||||
# CONFIG_IDEDMA_ONLYDISK is not set
|
||||
CONFIG_BLK_DEV_AEC62XX=y
|
||||
# CONFIG_BLK_DEV_ALI15X3 is not set
|
||||
# CONFIG_BLK_DEV_AMD74XX is not set
|
||||
# CONFIG_BLK_DEV_CMD64X is not set
|
||||
# CONFIG_BLK_DEV_TRIFLEX is not set
|
||||
# CONFIG_BLK_DEV_CY82C693 is not set
|
||||
# CONFIG_BLK_DEV_CS5520 is not set
|
||||
# CONFIG_BLK_DEV_CS5530 is not set
|
||||
# CONFIG_BLK_DEV_HPT34X is not set
|
||||
# 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
|
||||
# CONFIG_BLK_DEV_SVWKS is not set
|
||||
CONFIG_BLK_DEV_SIIMAGE=y
|
||||
# CONFIG_BLK_DEV_SLC90E66 is not set
|
||||
# CONFIG_BLK_DEV_TRM290 is not set
|
||||
# CONFIG_BLK_DEV_VIA82CXXX is not set
|
||||
# CONFIG_IDE_ARM is not set
|
||||
CONFIG_BLK_DEV_IDEDMA=y
|
||||
# CONFIG_IDEDMA_IVB is not set
|
||||
CONFIG_IDEDMA_AUTO=y
|
||||
# CONFIG_BLK_DEV_HD is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
# CONFIG_SCSI is not set
|
||||
|
||||
#
|
||||
# Multi-device support (RAID and LVM)
|
||||
#
|
||||
# CONFIG_MD is not set
|
||||
|
||||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_FUSION is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
#
|
||||
# CONFIG_IEEE1394 is not set
|
||||
|
||||
#
|
||||
# I2O device support
|
||||
#
|
||||
# CONFIG_I2O is not set
|
||||
|
||||
#
|
||||
# Macintosh device drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Network device support
|
||||
#
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_DUMMY is not set
|
||||
# CONFIG_BONDING is not set
|
||||
# CONFIG_EQUALIZER is not set
|
||||
# CONFIG_TUN is not set
|
||||
|
||||
#
|
||||
# ARCnet devices
|
||||
#
|
||||
# CONFIG_ARCNET is not set
|
||||
|
||||
#
|
||||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=y
|
||||
# CONFIG_HAPPYMEAL is not set
|
||||
# CONFIG_SUNGEM is not set
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
|
||||
#
|
||||
# Tulip family network device support
|
||||
#
|
||||
# CONFIG_NET_TULIP is not set
|
||||
# CONFIG_HP100 is not set
|
||||
# CONFIG_NET_PCI is not set
|
||||
|
||||
#
|
||||
# Ethernet (1000 Mbit)
|
||||
#
|
||||
# CONFIG_ACENIC is not set
|
||||
# CONFIG_DL2K is not set
|
||||
CONFIG_E1000=m
|
||||
# CONFIG_E1000_NAPI is not set
|
||||
# CONFIG_NS83820 is not set
|
||||
# CONFIG_HAMACHI is not set
|
||||
# CONFIG_YELLOWFIN is not set
|
||||
# CONFIG_R8169 is not set
|
||||
CONFIG_SKGE=m
|
||||
# CONFIG_SK98LIN is not set
|
||||
# CONFIG_TIGON3 is not set
|
||||
# CONFIG_BNX2 is not set
|
||||
# CONFIG_MV643XX_ETH is not set
|
||||
|
||||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
#
|
||||
# CONFIG_IXGB is not set
|
||||
# CONFIG_S2IO is not set
|
||||
|
||||
#
|
||||
# Token Ring devices
|
||||
#
|
||||
# CONFIG_TR is not set
|
||||
|
||||
#
|
||||
# Wireless LAN (non-hamradio)
|
||||
#
|
||||
# CONFIG_NET_RADIO is not set
|
||||
|
||||
#
|
||||
# Wan interfaces
|
||||
#
|
||||
# CONFIG_WAN is not set
|
||||
# CONFIG_FDDI is not set
|
||||
# CONFIG_HIPPI is not set
|
||||
# CONFIG_PPP is not set
|
||||
# CONFIG_SLIP 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
|
||||
#
|
||||
# CONFIG_ISDN is not set
|
||||
|
||||
#
|
||||
# Telephony Support
|
||||
#
|
||||
# CONFIG_PHONE is not set
|
||||
|
||||
#
|
||||
# Input device support
|
||||
#
|
||||
CONFIG_INPUT=y
|
||||
|
||||
#
|
||||
# Userland interfaces
|
||||
#
|
||||
CONFIG_INPUT_MOUSEDEV=y
|
||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||
# CONFIG_INPUT_JOYDEV is not set
|
||||
# CONFIG_INPUT_TSDEV is not set
|
||||
# CONFIG_INPUT_EVDEV is not set
|
||||
# CONFIG_INPUT_EVBUG is not set
|
||||
|
||||
#
|
||||
# Input Device Drivers
|
||||
#
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||
# CONFIG_INPUT_MISC is not set
|
||||
|
||||
#
|
||||
# Hardware I/O ports
|
||||
#
|
||||
CONFIG_SERIO=y
|
||||
# CONFIG_SERIO_I8042 is not set
|
||||
CONFIG_SERIO_SERPORT=y
|
||||
# CONFIG_SERIO_PCIPS2 is not set
|
||||
# CONFIG_SERIO_RAW is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
|
||||
#
|
||||
# Character devices
|
||||
#
|
||||
CONFIG_VT=y
|
||||
CONFIG_VT_CONSOLE=y
|
||||
CONFIG_HW_CONSOLE=y
|
||||
CONFIG_SERIAL_NONSTANDARD=y
|
||||
# CONFIG_ROCKETPORT is not set
|
||||
# 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
|
||||
|
||||
#
|
||||
# Serial drivers
|
||||
#
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=4
|
||||
# CONFIG_SERIAL_8250_EXTENDED is not set
|
||||
|
||||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
# CONFIG_SERIAL_JSM is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
|
||||
#
|
||||
# IPMI
|
||||
#
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
|
||||
#
|
||||
# Watchdog Cards
|
||||
#
|
||||
CONFIG_WATCHDOG=y
|
||||
# CONFIG_WATCHDOG_NOWAYOUT is not set
|
||||
|
||||
#
|
||||
# Watchdog Device Drivers
|
||||
#
|
||||
# CONFIG_SOFT_WATCHDOG is not set
|
||||
CONFIG_WATCHDOG_RTAS=y
|
||||
|
||||
#
|
||||
# PCI-based Watchdog Cards
|
||||
#
|
||||
# CONFIG_PCIPCWATCHDOG is not set
|
||||
# CONFIG_WDTPCI is not set
|
||||
# CONFIG_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
|
||||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
# CONFIG_AGP is not set
|
||||
# CONFIG_DRM is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
# CONFIG_HANGCHECK_TIMER is not set
|
||||
|
||||
#
|
||||
# TPM devices
|
||||
#
|
||||
# CONFIG_TCG_TPM is not set
|
||||
|
||||
#
|
||||
# I2C support
|
||||
#
|
||||
CONFIG_I2C=y
|
||||
# CONFIG_I2C_CHARDEV is not set
|
||||
|
||||
#
|
||||
# I2C Algorithms
|
||||
#
|
||||
CONFIG_I2C_ALGOBIT=y
|
||||
# CONFIG_I2C_ALGOPCF is not set
|
||||
# CONFIG_I2C_ALGOPCA is not set
|
||||
|
||||
#
|
||||
# I2C Hardware Bus support
|
||||
#
|
||||
# CONFIG_I2C_ALI1535 is not set
|
||||
# CONFIG_I2C_ALI1563 is not set
|
||||
# CONFIG_I2C_ALI15X3 is not set
|
||||
# CONFIG_I2C_AMD756 is not set
|
||||
# CONFIG_I2C_AMD8111 is not set
|
||||
# CONFIG_I2C_I801 is not set
|
||||
# CONFIG_I2C_I810 is not set
|
||||
# CONFIG_I2C_PIIX4 is not set
|
||||
# CONFIG_I2C_ISA is not set
|
||||
# CONFIG_I2C_NFORCE2 is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_PROSAVAGE is not set
|
||||
# CONFIG_I2C_SAVAGE4 is not set
|
||||
# CONFIG_SCx200_ACB is not set
|
||||
# CONFIG_I2C_SIS5595 is not set
|
||||
# CONFIG_I2C_SIS630 is not set
|
||||
# CONFIG_I2C_SIS96X is not set
|
||||
# CONFIG_I2C_STUB is not set
|
||||
# CONFIG_I2C_VIA is not set
|
||||
# CONFIG_I2C_VIAPRO is not set
|
||||
# CONFIG_I2C_VOODOO3 is not set
|
||||
# CONFIG_I2C_PCA_ISA is not set
|
||||
# CONFIG_I2C_SENSOR is not set
|
||||
|
||||
#
|
||||
# Miscellaneous I2C Chip support
|
||||
#
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
# CONFIG_SENSORS_EEPROM is not set
|
||||
# CONFIG_SENSORS_PCF8574 is not set
|
||||
# CONFIG_SENSORS_PCA9539 is not set
|
||||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_RTC8564 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
# CONFIG_I2C_DEBUG_CHIP is not set
|
||||
|
||||
#
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
# CONFIG_W1 is not set
|
||||
|
||||
#
|
||||
# Hardware Monitoring support
|
||||
#
|
||||
# CONFIG_HWMON is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
|
||||
#
|
||||
# Digital Video Broadcasting Devices
|
||||
#
|
||||
# CONFIG_DVB is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
#
|
||||
# CONFIG_FB is not set
|
||||
|
||||
#
|
||||
# Console display driver support
|
||||
#
|
||||
# CONFIG_VGA_CONSOLE is not set
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
|
||||
#
|
||||
# Sound
|
||||
#
|
||||
# CONFIG_SOUND is not set
|
||||
|
||||
#
|
||||
# USB support
|
||||
#
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
# CONFIG_USB is not set
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
# CONFIG_USB_GADGET is not set
|
||||
|
||||
#
|
||||
# MMC/SD Card support
|
||||
#
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# InfiniBand support
|
||||
#
|
||||
# CONFIG_INFINIBAND is not set
|
||||
|
||||
#
|
||||
# SN Devices
|
||||
#
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
CONFIG_EXT2_FS=y
|
||||
# CONFIG_EXT2_FS_XATTR is not set
|
||||
# CONFIG_EXT2_FS_XIP is not set
|
||||
CONFIG_EXT3_FS=y
|
||||
CONFIG_EXT3_FS_XATTR=y
|
||||
# CONFIG_EXT3_FS_POSIX_ACL is not set
|
||||
# CONFIG_EXT3_FS_SECURITY is not set
|
||||
CONFIG_JBD=y
|
||||
# CONFIG_JBD_DEBUG is not set
|
||||
CONFIG_FS_MBCACHE=y
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
|
||||
#
|
||||
# XFS support
|
||||
#
|
||||
# CONFIG_XFS_FS 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 is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
|
||||
#
|
||||
# CD-ROM/DVD Filesystems
|
||||
#
|
||||
CONFIG_ISO9660_FS=m
|
||||
CONFIG_JOLIET=y
|
||||
# CONFIG_ZISOFS is not set
|
||||
CONFIG_UDF_FS=m
|
||||
CONFIG_UDF_NLS=y
|
||||
|
||||
#
|
||||
# DOS/FAT/NT Filesystems
|
||||
#
|
||||
CONFIG_FAT_FS=m
|
||||
CONFIG_MSDOS_FS=m
|
||||
CONFIG_VFAT_FS=m
|
||||
CONFIG_FAT_DEFAULT_CODEPAGE=437
|
||||
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
|
||||
# CONFIG_NTFS_FS is not set
|
||||
|
||||
#
|
||||
# Pseudo filesystems
|
||||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_TMPFS_XATTR=y
|
||||
# CONFIG_TMPFS_SECURITY is not set
|
||||
CONFIG_HUGETLBFS=y
|
||||
CONFIG_HUGETLB_PAGE=y
|
||||
CONFIG_RAMFS=y
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
#
|
||||
# CONFIG_ADFS_FS is not set
|
||||
# CONFIG_AFFS_FS is not set
|
||||
# CONFIG_HFS_FS is not set
|
||||
# CONFIG_HFSPLUS_FS is not set
|
||||
# CONFIG_BEFS_FS is not set
|
||||
# CONFIG_BFS_FS is not set
|
||||
# CONFIG_EFS_FS is not set
|
||||
# CONFIG_CRAMFS is not set
|
||||
# CONFIG_VXFS_FS is not set
|
||||
# CONFIG_HPFS_FS is not set
|
||||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
|
||||
#
|
||||
# Network File Systems
|
||||
#
|
||||
CONFIG_NFS_FS=m
|
||||
CONFIG_NFS_V3=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
# CONFIG_NFS_V4 is not set
|
||||
# CONFIG_NFS_DIRECTIO is not set
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V2_ACL=y
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NFSD_V3_ACL=y
|
||||
# CONFIG_NFSD_V4 is not set
|
||||
CONFIG_NFSD_TCP=y
|
||||
CONFIG_LOCKD=m
|
||||
CONFIG_LOCKD_V4=y
|
||||
CONFIG_EXPORTFS=m
|
||||
CONFIG_NFS_ACL_SUPPORT=m
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=m
|
||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
# CONFIG_SMB_FS is not set
|
||||
# CONFIG_CIFS is not set
|
||||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
#
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
# CONFIG_ACORN_PARTITION is not set
|
||||
# CONFIG_OSF_PARTITION is not set
|
||||
# CONFIG_AMIGA_PARTITION is not set
|
||||
# CONFIG_ATARI_PARTITION is not set
|
||||
# CONFIG_MAC_PARTITION is not set
|
||||
CONFIG_MSDOS_PARTITION=y
|
||||
# CONFIG_BSD_DISKLABEL is not set
|
||||
# CONFIG_MINIX_SUBPARTITION is not set
|
||||
# CONFIG_SOLARIS_X86_PARTITION is not set
|
||||
# CONFIG_UNIXWARE_DISKLABEL is not set
|
||||
# CONFIG_LDM_PARTITION is not set
|
||||
# CONFIG_SGI_PARTITION is not set
|
||||
# CONFIG_ULTRIX_PARTITION is not set
|
||||
# CONFIG_SUN_PARTITION is not set
|
||||
CONFIG_EFI_PARTITION=y
|
||||
|
||||
#
|
||||
# Native Language Support
|
||||
#
|
||||
CONFIG_NLS=m
|
||||
CONFIG_NLS_DEFAULT="iso8859-1"
|
||||
# CONFIG_NLS_CODEPAGE_437 is not set
|
||||
# CONFIG_NLS_CODEPAGE_737 is not set
|
||||
# CONFIG_NLS_CODEPAGE_775 is not set
|
||||
# CONFIG_NLS_CODEPAGE_850 is not set
|
||||
# CONFIG_NLS_CODEPAGE_852 is not set
|
||||
# CONFIG_NLS_CODEPAGE_855 is not set
|
||||
# CONFIG_NLS_CODEPAGE_857 is not set
|
||||
# CONFIG_NLS_CODEPAGE_860 is not set
|
||||
# CONFIG_NLS_CODEPAGE_861 is not set
|
||||
# CONFIG_NLS_CODEPAGE_862 is not set
|
||||
# CONFIG_NLS_CODEPAGE_863 is not set
|
||||
# CONFIG_NLS_CODEPAGE_864 is not set
|
||||
# CONFIG_NLS_CODEPAGE_865 is not set
|
||||
# CONFIG_NLS_CODEPAGE_866 is not set
|
||||
# CONFIG_NLS_CODEPAGE_869 is not set
|
||||
# CONFIG_NLS_CODEPAGE_936 is not set
|
||||
# CONFIG_NLS_CODEPAGE_950 is not set
|
||||
# CONFIG_NLS_CODEPAGE_932 is not set
|
||||
# CONFIG_NLS_CODEPAGE_949 is not set
|
||||
# CONFIG_NLS_CODEPAGE_874 is not set
|
||||
# CONFIG_NLS_ISO8859_8 is not set
|
||||
# CONFIG_NLS_CODEPAGE_1250 is not set
|
||||
# CONFIG_NLS_CODEPAGE_1251 is not set
|
||||
# CONFIG_NLS_ASCII is not set
|
||||
CONFIG_NLS_ISO8859_1=m
|
||||
CONFIG_NLS_ISO8859_2=m
|
||||
CONFIG_NLS_ISO8859_3=m
|
||||
CONFIG_NLS_ISO8859_4=m
|
||||
CONFIG_NLS_ISO8859_5=m
|
||||
CONFIG_NLS_ISO8859_6=m
|
||||
CONFIG_NLS_ISO8859_7=m
|
||||
CONFIG_NLS_ISO8859_9=m
|
||||
CONFIG_NLS_ISO8859_13=m
|
||||
CONFIG_NLS_ISO8859_14=m
|
||||
CONFIG_NLS_ISO8859_15=m
|
||||
# CONFIG_NLS_KOI8_R is not set
|
||||
# CONFIG_NLS_KOI8_U is not set
|
||||
# CONFIG_NLS_UTF8 is not set
|
||||
|
||||
#
|
||||
# Profiling support
|
||||
#
|
||||
# CONFIG_PROFILING is not set
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_LOG_BUF_SHIFT=15
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
CONFIG_DEBUG_SPINLOCK_SLEEP=y
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
# CONFIG_DEBUG_STACKOVERFLOW is not set
|
||||
# CONFIG_KPROBES is not set
|
||||
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||
CONFIG_DEBUGGER=y
|
||||
# CONFIG_XMON is not set
|
||||
# CONFIG_PPCDBG is not set
|
||||
CONFIG_IRQSTACKS=y
|
||||
|
||||
#
|
||||
# Security options
|
||||
#
|
||||
# CONFIG_KEYS is not set
|
||||
# CONFIG_SECURITY is not set
|
||||
|
||||
#
|
||||
# Cryptographic options
|
||||
#
|
||||
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_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
|
||||
# CONFIG_CRYPTO_SERPENT is not set
|
||||
# CONFIG_CRYPTO_AES is not set
|
||||
# CONFIG_CRYPTO_CAST5 is not set
|
||||
# CONFIG_CRYPTO_CAST6 is not set
|
||||
# CONFIG_CRYPTO_TEA is not set
|
||||
# CONFIG_CRYPTO_ARC4 is not set
|
||||
# CONFIG_CRYPTO_KHAZAD is not set
|
||||
# CONFIG_CRYPTO_ANUBIS is not set
|
||||
CONFIG_CRYPTO_DEFLATE=m
|
||||
# CONFIG_CRYPTO_MICHAEL_MIC is not set
|
||||
# CONFIG_CRYPTO_CRC32C is not set
|
||||
# CONFIG_CRYPTO_TEST is not set
|
||||
|
||||
#
|
||||
# Hardware crypto devices
|
||||
#
|
||||
|
||||
#
|
||||
# Library routines
|
||||
#
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=m
|
||||
CONFIG_ZLIB_DEFLATE=m
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13-rc3
|
||||
# Wed Jul 13 14:40:34 2005
|
||||
# Linux kernel version: 2.6.13-rc6
|
||||
# Mon Aug 8 14:16:59 2005
|
||||
#
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -267,8 +267,6 @@ CONFIG_NET_CLS_ROUTE=y
|
|||
# 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
|
||||
|
@ -468,6 +466,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
|
||||
|
@ -539,11 +538,9 @@ CONFIG_IEEE1394_RAWIO=y
|
|||
#
|
||||
# Macintosh device drivers
|
||||
#
|
||||
CONFIG_ADB=y
|
||||
CONFIG_ADB_PMU=y
|
||||
CONFIG_PMAC_SMU=y
|
||||
# CONFIG_PMAC_BACKLIGHT is not set
|
||||
# CONFIG_INPUT_ADBHID is not set
|
||||
CONFIG_THERM_PM72=y
|
||||
|
||||
#
|
||||
|
@ -631,6 +628,8 @@ CONFIG_PPPOE=m
|
|||
# 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
|
||||
|
@ -718,7 +717,6 @@ CONFIG_LEGACY_PTY_COUNT=256
|
|||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_RTC is not set
|
||||
# CONFIG_GEN_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13-rc3
|
||||
# Wed Jul 13 14:43:39 2005
|
||||
# Linux kernel version: 2.6.13-rc6
|
||||
# Mon Aug 8 14:17:02 2005
|
||||
#
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -257,10 +257,6 @@ CONFIG_NET_CLS_ROUTE=y
|
|||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
CONFIG_NETPOLL=y
|
||||
CONFIG_NETPOLL_RX=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
CONFIG_NET_POLL_CONTROLLER=y
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
|
@ -388,6 +384,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
|
||||
|
@ -537,6 +534,10 @@ CONFIG_PPPOE=m
|
|||
# CONFIG_NET_FC is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
CONFIG_NETCONSOLE=y
|
||||
CONFIG_NETPOLL=y
|
||||
CONFIG_NETPOLL_RX=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
CONFIG_NET_POLL_CONTROLLER=y
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
|
@ -610,7 +611,6 @@ CONFIG_LEGACY_PTY_COUNT=256
|
|||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_RTC is not set
|
||||
# CONFIG_GEN_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13-rc3
|
||||
# Wed Jul 13 14:46:18 2005
|
||||
# Linux kernel version: 2.6.13-rc6
|
||||
# Mon Aug 8 14:17:04 2005
|
||||
#
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -193,8 +193,6 @@ CONFIG_TCP_CONG_BIC=y
|
|||
# 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
|
||||
|
@ -433,6 +431,8 @@ CONFIG_E1000=y
|
|||
# CONFIG_SLIP 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
|
||||
|
@ -512,7 +512,6 @@ CONFIG_LEGACY_PTY_COUNT=256
|
|||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_RTC is not set
|
||||
# CONFIG_GEN_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13-rc3
|
||||
# Wed Jul 13 14:47:54 2005
|
||||
# Linux kernel version: 2.6.13-rc6
|
||||
# Mon Aug 8 14:17:07 2005
|
||||
#
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -287,10 +287,6 @@ CONFIG_NET_CLS_ROUTE=y
|
|||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
CONFIG_NETPOLL=y
|
||||
CONFIG_NETPOLL_RX=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
CONFIG_NET_POLL_CONTROLLER=y
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
|
@ -488,6 +484,7 @@ CONFIG_SCSI_QLA22XX=m
|
|||
CONFIG_SCSI_QLA2300=m
|
||||
CONFIG_SCSI_QLA2322=m
|
||||
CONFIG_SCSI_QLA6312=m
|
||||
CONFIG_SCSI_QLA24XX=m
|
||||
CONFIG_SCSI_LPFC=m
|
||||
# CONFIG_SCSI_DC395x is not set
|
||||
# CONFIG_SCSI_DC390T is not set
|
||||
|
@ -645,6 +642,10 @@ CONFIG_PPPOE=m
|
|||
# CONFIG_NET_FC is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
CONFIG_NETCONSOLE=y
|
||||
CONFIG_NETPOLL=y
|
||||
CONFIG_NETPOLL_RX=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
CONFIG_NET_POLL_CONTROLLER=y
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
|
@ -746,7 +747,6 @@ CONFIG_HVCS=m
|
|||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_RTC is not set
|
||||
# CONFIG_GEN_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.13-rc3
|
||||
# Wed Jul 13 14:37:07 2005
|
||||
# Linux kernel version: 2.6.13-rc6
|
||||
# Mon Aug 8 14:16:54 2005
|
||||
#
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -289,10 +289,6 @@ CONFIG_NET_CLS_ROUTE=y
|
|||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
CONFIG_NETPOLL=y
|
||||
CONFIG_NETPOLL_RX=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
CONFIG_NET_POLL_CONTROLLER=y
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
|
@ -506,6 +502,7 @@ CONFIG_SCSI_QLA22XX=m
|
|||
CONFIG_SCSI_QLA2300=m
|
||||
CONFIG_SCSI_QLA2322=m
|
||||
CONFIG_SCSI_QLA6312=m
|
||||
CONFIG_SCSI_QLA24XX=m
|
||||
CONFIG_SCSI_LPFC=m
|
||||
# CONFIG_SCSI_DC395x is not set
|
||||
# CONFIG_SCSI_DC390T is not set
|
||||
|
@ -579,11 +576,9 @@ CONFIG_IEEE1394_AMDTP=m
|
|||
#
|
||||
# Macintosh device drivers
|
||||
#
|
||||
CONFIG_ADB=y
|
||||
CONFIG_ADB_PMU=y
|
||||
CONFIG_PMAC_SMU=y
|
||||
# CONFIG_PMAC_BACKLIGHT is not set
|
||||
# CONFIG_INPUT_ADBHID is not set
|
||||
CONFIG_THERM_PM72=y
|
||||
|
||||
#
|
||||
|
@ -694,6 +689,10 @@ CONFIG_PPPOE=m
|
|||
# CONFIG_NET_FC is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
CONFIG_NETCONSOLE=y
|
||||
CONFIG_NETPOLL=y
|
||||
CONFIG_NETPOLL_RX=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
CONFIG_NET_POLL_CONTROLLER=y
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
|
@ -797,7 +796,6 @@ CONFIG_HVCS=m
|
|||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_RTC is not set
|
||||
# CONFIG_GEN_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
|
|
|
@ -2071,7 +2071,7 @@ _GLOBAL(hmt_start_secondary)
|
|||
blr
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SMP) && !defined(CONFIG_PPC_ISERIES)
|
||||
#if defined(CONFIG_KEXEC) || (defined(CONFIG_SMP) && !defined(CONFIG_PPC_ISERIES))
|
||||
_GLOBAL(smp_release_cpus)
|
||||
/* All secondary cpus are spinning on a common
|
||||
* spinloop, release them all now so they can start
|
||||
|
|
|
@ -185,7 +185,7 @@ void kexec_copy_flush(struct kimage *image)
|
|||
void kexec_smp_down(void *arg)
|
||||
{
|
||||
if (ppc_md.cpu_irq_down)
|
||||
ppc_md.cpu_irq_down();
|
||||
ppc_md.cpu_irq_down(1);
|
||||
|
||||
local_irq_disable();
|
||||
kexec_smp_wait();
|
||||
|
@ -232,7 +232,7 @@ static void kexec_prepare_cpus(void)
|
|||
|
||||
/* after we tell the others to go down */
|
||||
if (ppc_md.cpu_irq_down)
|
||||
ppc_md.cpu_irq_down();
|
||||
ppc_md.cpu_irq_down(0);
|
||||
|
||||
put_cpu();
|
||||
|
||||
|
@ -243,15 +243,19 @@ static void kexec_prepare_cpus(void)
|
|||
|
||||
static void kexec_prepare_cpus(void)
|
||||
{
|
||||
extern void smp_release_cpus(void);
|
||||
/*
|
||||
* move the secondarys to us so that we can copy
|
||||
* the new kernel 0-0x100 safely
|
||||
*
|
||||
* do this if kexec in setup.c ?
|
||||
*
|
||||
* We need to release the cpus if we are ever going from an
|
||||
* UP to an SMP kernel.
|
||||
*/
|
||||
smp_relase_cpus();
|
||||
smp_release_cpus();
|
||||
if (ppc_md.cpu_irq_down)
|
||||
ppc_md.cpu_irq_down();
|
||||
ppc_md.cpu_irq_down(0);
|
||||
local_irq_disable();
|
||||
}
|
||||
|
||||
|
|
|
@ -794,10 +794,10 @@ void mpic_setup_this_cpu(void)
|
|||
|
||||
/*
|
||||
* XXX: someone who knows mpic should check this.
|
||||
* do we need to eoi the ipi here (see xics comments)?
|
||||
* do we need to eoi the ipi including for kexec cpu here (see xics comments)?
|
||||
* or can we reset the mpic in the new kernel?
|
||||
*/
|
||||
void mpic_teardown_this_cpu(void)
|
||||
void mpic_teardown_this_cpu(int secondary)
|
||||
{
|
||||
struct mpic *mpic = mpic_primary;
|
||||
unsigned long flags;
|
||||
|
|
|
@ -256,7 +256,7 @@ extern unsigned int mpic_irq_get_priority(unsigned int irq);
|
|||
extern void mpic_setup_this_cpu(void);
|
||||
|
||||
/* Clean up for kexec (or cpu offline or ...) */
|
||||
extern void mpic_teardown_this_cpu(void);
|
||||
extern void mpic_teardown_this_cpu(int secondary);
|
||||
|
||||
/* Request IPIs on primary mpic */
|
||||
extern void mpic_request_ipis(void);
|
||||
|
|
|
@ -108,8 +108,28 @@ void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region
|
|||
region->end = res->end - offset;
|
||||
}
|
||||
|
||||
void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
|
||||
struct pci_bus_region *region)
|
||||
{
|
||||
unsigned long offset = 0;
|
||||
struct pci_controller *hose = pci_bus_to_host(dev->bus);
|
||||
|
||||
if (!hose)
|
||||
return;
|
||||
|
||||
if (res->flags & IORESOURCE_IO)
|
||||
offset = (unsigned long)hose->io_base_virt - pci_io_base;
|
||||
|
||||
if (res->flags & IORESOURCE_MEM)
|
||||
offset = hose->pci_mem_offset;
|
||||
|
||||
res->start = region->start + offset;
|
||||
res->end = region->end + offset;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG
|
||||
EXPORT_SYMBOL(pcibios_resource_to_bus);
|
||||
EXPORT_SYMBOL(pcibios_bus_to_resource);
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
|
@ -647,29 +647,30 @@ static void xics_set_affinity(unsigned int virq, cpumask_t cpumask)
|
|||
}
|
||||
}
|
||||
|
||||
void xics_teardown_cpu(void)
|
||||
void xics_teardown_cpu(int secondary)
|
||||
{
|
||||
int cpu = smp_processor_id();
|
||||
int status;
|
||||
|
||||
ops->cppr_info(cpu, 0x00);
|
||||
iosync();
|
||||
|
||||
/*
|
||||
* we need to EOI the IPI if we got here from kexec down IPI
|
||||
*
|
||||
* xics doesn't care if we duplicate an EOI as long as we
|
||||
* don't EOI and raise priority.
|
||||
*
|
||||
* probably need to check all the other interrupts too
|
||||
* should we be flagging idle loop instead?
|
||||
* or creating some task to be scheduled?
|
||||
* Some machines need to have at least one cpu in the GIQ,
|
||||
* so leave the master cpu in the group.
|
||||
*/
|
||||
ops->xirr_info_set(cpu, XICS_IPI);
|
||||
|
||||
status = rtas_set_indicator(GLOBAL_INTERRUPT_QUEUE,
|
||||
(1UL << interrupt_server_size) - 1 - default_distrib_server, 0);
|
||||
WARN_ON(status != 0);
|
||||
if (secondary) {
|
||||
/*
|
||||
* we need to EOI the IPI if we got here from kexec down IPI
|
||||
*
|
||||
* probably need to check all the other interrupts too
|
||||
* should we be flagging idle loop instead?
|
||||
* or creating some task to be scheduled?
|
||||
*/
|
||||
ops->xirr_info_set(cpu, XICS_IPI);
|
||||
rtas_set_indicator(GLOBAL_INTERRUPT_QUEUE,
|
||||
(1UL << interrupt_server_size) - 1 -
|
||||
default_distrib_server, 0);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
|
|
|
@ -329,13 +329,16 @@ int xmon_core(struct pt_regs *regs, int fromipi)
|
|||
printf("cpu 0x%x: Exception %lx %s in xmon, "
|
||||
"returning to main loop\n",
|
||||
cpu, regs->trap, getvecname(TRAP(regs)));
|
||||
release_output_lock();
|
||||
longjmp(xmon_fault_jmp[cpu], 1);
|
||||
}
|
||||
|
||||
if (setjmp(recurse_jmp) != 0) {
|
||||
if (!in_xmon || !xmon_gate) {
|
||||
get_output_lock();
|
||||
printf("xmon: WARNING: bad recursive fault "
|
||||
"on cpu 0x%x\n", cpu);
|
||||
release_output_lock();
|
||||
goto waiting;
|
||||
}
|
||||
secondary = !(xmon_taken && cpu == xmon_owner);
|
||||
|
|
|
@ -223,13 +223,13 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long writeaccess,
|
|||
*/
|
||||
survive:
|
||||
switch (handle_mm_fault(mm, vma, address, writeaccess)) {
|
||||
case 1:
|
||||
case VM_FAULT_MINOR:
|
||||
tsk->min_flt++;
|
||||
break;
|
||||
case 2:
|
||||
case VM_FAULT_MAJOR:
|
||||
tsk->maj_flt++;
|
||||
break;
|
||||
case 0:
|
||||
case VM_FAULT_SIGBUS:
|
||||
goto do_sigbus;
|
||||
default:
|
||||
goto out_of_memory;
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include <linux/net.h>
|
||||
#include <linux/compat.h>
|
||||
#include <net/compat.h>
|
||||
#include <net/sock.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/string.h>
|
||||
|
@ -297,121 +298,165 @@ asmlinkage int solaris_sendmsg(int fd, struct sol_nmsghdr __user *user_msg, unsi
|
|||
{
|
||||
struct socket *sock;
|
||||
char address[MAX_SOCK_ADDR];
|
||||
struct iovec iov[UIO_FASTIOV];
|
||||
struct iovec iovstack[UIO_FASTIOV], *iov = iovstack;
|
||||
unsigned char ctl[sizeof(struct cmsghdr) + 20];
|
||||
unsigned char *ctl_buf = ctl;
|
||||
struct msghdr kern_msg;
|
||||
int err, total_len;
|
||||
struct msghdr msg_sys;
|
||||
int err, ctl_len, iov_size, total_len;
|
||||
|
||||
if(msghdr_from_user32_to_kern(&kern_msg, user_msg))
|
||||
return -EFAULT;
|
||||
if(kern_msg.msg_iovlen > UIO_MAXIOV)
|
||||
return -EINVAL;
|
||||
err = verify_compat_iovec(&kern_msg, iov, address, VERIFY_READ);
|
||||
if (err < 0)
|
||||
err = -EFAULT;
|
||||
if (msghdr_from_user32_to_kern(&msg_sys, user_msg))
|
||||
goto out;
|
||||
|
||||
sock = sockfd_lookup(fd, &err);
|
||||
if (!sock)
|
||||
goto out;
|
||||
|
||||
/* do not move before msg_sys is valid */
|
||||
err = -EMSGSIZE;
|
||||
if (msg_sys.msg_iovlen > UIO_MAXIOV)
|
||||
goto out_put;
|
||||
|
||||
/* Check whether to allocate the iovec area*/
|
||||
err = -ENOMEM;
|
||||
iov_size = msg_sys.msg_iovlen * sizeof(struct iovec);
|
||||
if (msg_sys.msg_iovlen > UIO_FASTIOV) {
|
||||
iov = sock_kmalloc(sock->sk, iov_size, GFP_KERNEL);
|
||||
if (!iov)
|
||||
goto out_put;
|
||||
}
|
||||
|
||||
err = verify_compat_iovec(&msg_sys, iov, address, VERIFY_READ);
|
||||
if (err < 0)
|
||||
goto out_freeiov;
|
||||
total_len = err;
|
||||
|
||||
if(kern_msg.msg_controllen) {
|
||||
struct sol_cmsghdr __user *ucmsg = kern_msg.msg_control;
|
||||
err = -ENOBUFS;
|
||||
if (msg_sys.msg_controllen > INT_MAX)
|
||||
goto out_freeiov;
|
||||
|
||||
ctl_len = msg_sys.msg_controllen;
|
||||
if (ctl_len) {
|
||||
struct sol_cmsghdr __user *ucmsg = msg_sys.msg_control;
|
||||
unsigned long *kcmsg;
|
||||
compat_size_t cmlen;
|
||||
|
||||
if (kern_msg.msg_controllen <= sizeof(compat_size_t))
|
||||
return -EINVAL;
|
||||
err = -EINVAL;
|
||||
if (ctl_len <= sizeof(compat_size_t))
|
||||
goto out_freeiov;
|
||||
|
||||
if(kern_msg.msg_controllen > sizeof(ctl)) {
|
||||
if (ctl_len > sizeof(ctl)) {
|
||||
err = -ENOBUFS;
|
||||
ctl_buf = kmalloc(kern_msg.msg_controllen, GFP_KERNEL);
|
||||
if(!ctl_buf)
|
||||
ctl_buf = kmalloc(ctl_len, GFP_KERNEL);
|
||||
if (!ctl_buf)
|
||||
goto out_freeiov;
|
||||
}
|
||||
__get_user(cmlen, &ucmsg->cmsg_len);
|
||||
kcmsg = (unsigned long *) ctl_buf;
|
||||
*kcmsg++ = (unsigned long)cmlen;
|
||||
err = -EFAULT;
|
||||
if(copy_from_user(kcmsg, &ucmsg->cmsg_level,
|
||||
kern_msg.msg_controllen - sizeof(compat_size_t)))
|
||||
if (copy_from_user(kcmsg, &ucmsg->cmsg_level,
|
||||
ctl_len - sizeof(compat_size_t)))
|
||||
goto out_freectl;
|
||||
kern_msg.msg_control = ctl_buf;
|
||||
msg_sys.msg_control = ctl_buf;
|
||||
}
|
||||
kern_msg.msg_flags = solaris_to_linux_msgflags(user_flags);
|
||||
msg_sys.msg_flags = solaris_to_linux_msgflags(user_flags);
|
||||
|
||||
lock_kernel();
|
||||
sock = sockfd_lookup(fd, &err);
|
||||
if (sock != NULL) {
|
||||
if (sock->file->f_flags & O_NONBLOCK)
|
||||
kern_msg.msg_flags |= MSG_DONTWAIT;
|
||||
err = sock_sendmsg(sock, &kern_msg, total_len);
|
||||
sockfd_put(sock);
|
||||
}
|
||||
unlock_kernel();
|
||||
if (sock->file->f_flags & O_NONBLOCK)
|
||||
msg_sys.msg_flags |= MSG_DONTWAIT;
|
||||
err = sock_sendmsg(sock, &msg_sys, total_len);
|
||||
|
||||
out_freectl:
|
||||
/* N.B. Use kfree here, as kern_msg.msg_controllen might change? */
|
||||
if(ctl_buf != ctl)
|
||||
kfree(ctl_buf);
|
||||
if (ctl_buf != ctl)
|
||||
sock_kfree_s(sock->sk, ctl_buf, ctl_len);
|
||||
out_freeiov:
|
||||
if(kern_msg.msg_iov != iov)
|
||||
kfree(kern_msg.msg_iov);
|
||||
out:
|
||||
if (iov != iovstack)
|
||||
sock_kfree_s(sock->sk, iov, iov_size);
|
||||
out_put:
|
||||
sockfd_put(sock);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
asmlinkage int solaris_recvmsg(int fd, struct sol_nmsghdr __user *user_msg, unsigned int user_flags)
|
||||
{
|
||||
struct iovec iovstack[UIO_FASTIOV];
|
||||
struct msghdr kern_msg;
|
||||
char addr[MAX_SOCK_ADDR];
|
||||
struct socket *sock;
|
||||
struct iovec iovstack[UIO_FASTIOV];
|
||||
struct iovec *iov = iovstack;
|
||||
struct msghdr msg_sys;
|
||||
unsigned long cmsg_ptr;
|
||||
int err, iov_size, total_len, len;
|
||||
|
||||
/* kernel mode address */
|
||||
char addr[MAX_SOCK_ADDR];
|
||||
|
||||
/* user mode address pointers */
|
||||
struct sockaddr __user *uaddr;
|
||||
int __user *uaddr_len;
|
||||
unsigned long cmsg_ptr;
|
||||
int err, total_len, len = 0;
|
||||
|
||||
if(msghdr_from_user32_to_kern(&kern_msg, user_msg))
|
||||
if (msghdr_from_user32_to_kern(&msg_sys, user_msg))
|
||||
return -EFAULT;
|
||||
if(kern_msg.msg_iovlen > UIO_MAXIOV)
|
||||
return -EINVAL;
|
||||
|
||||
uaddr = kern_msg.msg_name;
|
||||
uaddr_len = &user_msg->msg_namelen;
|
||||
err = verify_compat_iovec(&kern_msg, iov, addr, VERIFY_WRITE);
|
||||
if (err < 0)
|
||||
sock = sockfd_lookup(fd, &err);
|
||||
if (!sock)
|
||||
goto out;
|
||||
|
||||
err = -EMSGSIZE;
|
||||
if (msg_sys.msg_iovlen > UIO_MAXIOV)
|
||||
goto out_put;
|
||||
|
||||
/* Check whether to allocate the iovec area*/
|
||||
err = -ENOMEM;
|
||||
iov_size = msg_sys.msg_iovlen * sizeof(struct iovec);
|
||||
if (msg_sys.msg_iovlen > UIO_FASTIOV) {
|
||||
iov = sock_kmalloc(sock->sk, iov_size, GFP_KERNEL);
|
||||
if (!iov)
|
||||
goto out_put;
|
||||
}
|
||||
|
||||
/*
|
||||
* Save the user-mode address (verify_iovec will change the
|
||||
* kernel msghdr to use the kernel address space)
|
||||
*/
|
||||
|
||||
uaddr = (void __user *) msg_sys.msg_name;
|
||||
uaddr_len = &user_msg->msg_namelen;
|
||||
err = verify_compat_iovec(&msg_sys, iov, addr, VERIFY_WRITE);
|
||||
if (err < 0)
|
||||
goto out_freeiov;
|
||||
total_len = err;
|
||||
|
||||
cmsg_ptr = (unsigned long) kern_msg.msg_control;
|
||||
kern_msg.msg_flags = 0;
|
||||
cmsg_ptr = (unsigned long) msg_sys.msg_control;
|
||||
msg_sys.msg_flags = MSG_CMSG_COMPAT;
|
||||
|
||||
lock_kernel();
|
||||
sock = sockfd_lookup(fd, &err);
|
||||
if (sock != NULL) {
|
||||
if (sock->file->f_flags & O_NONBLOCK)
|
||||
user_flags |= MSG_DONTWAIT;
|
||||
err = sock_recvmsg(sock, &kern_msg, total_len, user_flags);
|
||||
if(err >= 0)
|
||||
len = err;
|
||||
sockfd_put(sock);
|
||||
}
|
||||
unlock_kernel();
|
||||
if (sock->file->f_flags & O_NONBLOCK)
|
||||
user_flags |= MSG_DONTWAIT;
|
||||
|
||||
if(uaddr != NULL && err >= 0)
|
||||
err = move_addr_to_user(addr, kern_msg.msg_namelen, uaddr, uaddr_len);
|
||||
if(err >= 0) {
|
||||
err = __put_user(linux_to_solaris_msgflags(kern_msg.msg_flags), &user_msg->msg_flags);
|
||||
if(!err) {
|
||||
/* XXX Convert cmsg back into userspace 32-bit format... */
|
||||
err = __put_user((unsigned long)kern_msg.msg_control - cmsg_ptr,
|
||||
&user_msg->msg_controllen);
|
||||
}
|
||||
}
|
||||
|
||||
if(kern_msg.msg_iov != iov)
|
||||
kfree(kern_msg.msg_iov);
|
||||
out:
|
||||
err = sock_recvmsg(sock, &msg_sys, total_len, user_flags);
|
||||
if(err < 0)
|
||||
return err;
|
||||
return len;
|
||||
goto out_freeiov;
|
||||
|
||||
len = err;
|
||||
|
||||
if (uaddr != NULL) {
|
||||
err = move_addr_to_user(addr, msg_sys.msg_namelen, uaddr, uaddr_len);
|
||||
if (err < 0)
|
||||
goto out_freeiov;
|
||||
}
|
||||
err = __put_user(linux_to_solaris_msgflags(msg_sys.msg_flags), &user_msg->msg_flags);
|
||||
if (err)
|
||||
goto out_freeiov;
|
||||
err = __put_user((unsigned long)msg_sys.msg_control - cmsg_ptr,
|
||||
&user_msg->msg_controllen);
|
||||
if (err)
|
||||
goto out_freeiov;
|
||||
err = len;
|
||||
|
||||
out_freeiov:
|
||||
if (iov != iovstack)
|
||||
sock_kfree_s(sock->sk, iov, iov_size);
|
||||
out_put:
|
||||
sockfd_put(sock);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -322,3 +322,4 @@ module_exit(aes_fini);
|
|||
|
||||
MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("aes");
|
||||
|
|
|
@ -43,11 +43,11 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 val)
|
|||
switch (regno) {
|
||||
case offsetof(struct user32, regs.fs):
|
||||
if (val && (val & 3) != 3) return -EIO;
|
||||
child->thread.fs = val & 0xffff;
|
||||
child->thread.fsindex = val & 0xffff;
|
||||
break;
|
||||
case offsetof(struct user32, regs.gs):
|
||||
if (val && (val & 3) != 3) return -EIO;
|
||||
child->thread.gs = val & 0xffff;
|
||||
child->thread.gsindex = val & 0xffff;
|
||||
break;
|
||||
case offsetof(struct user32, regs.ds):
|
||||
if (val && (val & 3) != 3) return -EIO;
|
||||
|
@ -138,10 +138,10 @@ static int getreg32(struct task_struct *child, unsigned regno, u32 *val)
|
|||
|
||||
switch (regno) {
|
||||
case offsetof(struct user32, regs.fs):
|
||||
*val = child->thread.fs;
|
||||
*val = child->thread.fsindex;
|
||||
break;
|
||||
case offsetof(struct user32, regs.gs):
|
||||
*val = child->thread.gs;
|
||||
*val = child->thread.gsindex;
|
||||
break;
|
||||
case offsetof(struct user32, regs.ds):
|
||||
*val = child->thread.ds;
|
||||
|
|
|
@ -36,6 +36,7 @@ static unsigned long bank[NR_BANKS] = { [0 ... NR_BANKS-1] = ~0UL };
|
|||
static unsigned long console_logged;
|
||||
static int notify_user;
|
||||
static int rip_msr;
|
||||
static int mce_bootlog;
|
||||
|
||||
/*
|
||||
* Lockless MCE logging infrastructure.
|
||||
|
@ -197,10 +198,11 @@ void do_machine_check(struct pt_regs * regs, long error_code)
|
|||
rdmsrl(MSR_IA32_MC0_ADDR + i*4, m.addr);
|
||||
|
||||
mce_get_rip(&m, regs);
|
||||
if (error_code != -1)
|
||||
if (error_code >= 0)
|
||||
rdtscll(m.tsc);
|
||||
wrmsrl(MSR_IA32_MC0_STATUS + i*4, 0);
|
||||
mce_log(&m);
|
||||
if (error_code != -2)
|
||||
mce_log(&m);
|
||||
|
||||
/* Did this bank cause the exception? */
|
||||
/* Assume that the bank with uncorrectable errors did it,
|
||||
|
@ -315,7 +317,7 @@ static void mce_init(void *dummy)
|
|||
|
||||
/* Log the machine checks left over from the previous reset.
|
||||
This also clears all registers */
|
||||
do_machine_check(NULL, -1);
|
||||
do_machine_check(NULL, mce_bootlog ? -1 : -2);
|
||||
|
||||
set_in_cr4(X86_CR4_MCE);
|
||||
|
||||
|
@ -476,11 +478,17 @@ static int __init mcheck_disable(char *str)
|
|||
}
|
||||
|
||||
/* mce=off disables machine check. Note you can reenable it later
|
||||
using sysfs */
|
||||
using sysfs.
|
||||
mce=bootlog Log MCEs from before booting. Disabled by default to work
|
||||
around buggy BIOS that leave bogus MCEs. */
|
||||
static int __init mcheck_enable(char *str)
|
||||
{
|
||||
if (*str == '=')
|
||||
str++;
|
||||
if (!strcmp(str, "off"))
|
||||
mce_dont_init = 1;
|
||||
else if (!strcmp(str, "bootlog"))
|
||||
mce_bootlog = 1;
|
||||
else
|
||||
printk("mce= argument %s ignored. Please use /sys", str);
|
||||
return 0;
|
||||
|
|
|
@ -645,15 +645,15 @@ void __init setup_arch(char **cmdline_p)
|
|||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
sparse_init();
|
||||
|
||||
#ifdef CONFIG_KEXEC
|
||||
if (crashk_res.start != crashk_res.end) {
|
||||
reserve_bootmem(crashk_res.start,
|
||||
crashk_res.end - crashk_res.start + 1);
|
||||
}
|
||||
#endif
|
||||
|
||||
sparse_init();
|
||||
|
||||
paging_init();
|
||||
|
||||
check_ioapic();
|
||||
|
|
|
@ -439,13 +439,13 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code)
|
|||
* the fault.
|
||||
*/
|
||||
switch (handle_mm_fault(mm, vma, address, write)) {
|
||||
case 1:
|
||||
case VM_FAULT_MINOR:
|
||||
tsk->min_flt++;
|
||||
break;
|
||||
case 2:
|
||||
case VM_FAULT_MAJOR:
|
||||
tsk->maj_flt++;
|
||||
break;
|
||||
case 0:
|
||||
case VM_FAULT_SIGBUS:
|
||||
goto do_sigbus;
|
||||
default:
|
||||
goto out_of_memory;
|
||||
|
|
|
@ -1283,8 +1283,7 @@ static void do_fd_request(request_queue_t* q)
|
|||
if (fdc_busy) return;
|
||||
save_flags(flags);
|
||||
cli();
|
||||
while (fdc_busy)
|
||||
sleep_on(&fdc_wait);
|
||||
wait_event(fdc_wait, !fdc_busy);
|
||||
fdc_busy = 1;
|
||||
ENABLE_IRQ();
|
||||
restore_flags(flags);
|
||||
|
|
|
@ -133,9 +133,10 @@ config ACPI_HOTKEY
|
|||
depends on ACPI_INTERPRETER
|
||||
depends on EXPERIMENTAL
|
||||
depends on !IA64_SGI_SN
|
||||
default m
|
||||
default n
|
||||
help
|
||||
ACPI generic hotkey
|
||||
Experimental consolidated hotkey driver.
|
||||
If you are unsure, say N.
|
||||
|
||||
config ACPI_FAN
|
||||
tristate "Fan"
|
||||
|
|
|
@ -26,6 +26,9 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
|
||||
|
@ -33,6 +36,9 @@
|
|||
#define ACPI_BUTTON_COMPONENT 0x00080000
|
||||
#define ACPI_BUTTON_DRIVER_NAME "ACPI Button Driver"
|
||||
#define ACPI_BUTTON_CLASS "button"
|
||||
#define ACPI_BUTTON_FILE_INFO "info"
|
||||
#define ACPI_BUTTON_FILE_STATE "state"
|
||||
#define ACPI_BUTTON_TYPE_UNKNOWN 0x00
|
||||
#define ACPI_BUTTON_NOTIFY_STATUS 0x80
|
||||
|
||||
#define ACPI_BUTTON_SUBCLASS_POWER "power"
|
||||
|
@ -64,6 +70,8 @@ MODULE_LICENSE("GPL");
|
|||
|
||||
static int acpi_button_add (struct acpi_device *device);
|
||||
static int acpi_button_remove (struct acpi_device *device, int type);
|
||||
static int acpi_button_info_open_fs(struct inode *inode, struct file *file);
|
||||
static int acpi_button_state_open_fs(struct inode *inode, struct file *file);
|
||||
|
||||
static struct acpi_driver acpi_button_driver = {
|
||||
.name = ACPI_BUTTON_DRIVER_NAME,
|
||||
|
@ -82,6 +90,179 @@ struct acpi_button {
|
|||
unsigned long pushed;
|
||||
};
|
||||
|
||||
static struct file_operations acpi_button_info_fops = {
|
||||
.open = acpi_button_info_open_fs,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static struct file_operations acpi_button_state_fops = {
|
||||
.open = acpi_button_state_open_fs,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
/* --------------------------------------------------------------------------
|
||||
FS Interface (/proc)
|
||||
-------------------------------------------------------------------------- */
|
||||
|
||||
static struct proc_dir_entry *acpi_button_dir;
|
||||
|
||||
static int acpi_button_info_seq_show(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct acpi_button *button = (struct acpi_button *) seq->private;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_button_info_seq_show");
|
||||
|
||||
if (!button || !button->device)
|
||||
return_VALUE(0);
|
||||
|
||||
seq_printf(seq, "type: %s\n",
|
||||
acpi_device_name(button->device));
|
||||
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
static int acpi_button_info_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_button_info_seq_show, PDE(inode)->data);
|
||||
}
|
||||
|
||||
static int acpi_button_state_seq_show(struct seq_file *seq, void *offset)
|
||||
{
|
||||
struct acpi_button *button = (struct acpi_button *) seq->private;
|
||||
acpi_status status;
|
||||
unsigned long state;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_button_state_seq_show");
|
||||
|
||||
if (!button || !button->device)
|
||||
return_VALUE(0);
|
||||
|
||||
status = acpi_evaluate_integer(button->handle,"_LID",NULL,&state);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
seq_printf(seq, "state: unsupported\n");
|
||||
}
|
||||
else{
|
||||
seq_printf(seq, "state: %s\n", (state ? "open" : "closed"));
|
||||
}
|
||||
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
static int acpi_button_state_open_fs(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, acpi_button_state_seq_show, PDE(inode)->data);
|
||||
}
|
||||
|
||||
static struct proc_dir_entry *acpi_power_dir;
|
||||
static struct proc_dir_entry *acpi_sleep_dir;
|
||||
static struct proc_dir_entry *acpi_lid_dir;
|
||||
|
||||
static int
|
||||
acpi_button_add_fs (
|
||||
struct acpi_device *device)
|
||||
{
|
||||
struct proc_dir_entry *entry = NULL;
|
||||
struct acpi_button *button = NULL;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_button_add_fs");
|
||||
|
||||
if (!device || !acpi_driver_data(device))
|
||||
return_VALUE(-EINVAL);
|
||||
|
||||
button = acpi_driver_data(device);
|
||||
|
||||
switch (button->type) {
|
||||
case ACPI_BUTTON_TYPE_POWER:
|
||||
case ACPI_BUTTON_TYPE_POWERF:
|
||||
if (!acpi_power_dir)
|
||||
acpi_power_dir = proc_mkdir(ACPI_BUTTON_SUBCLASS_POWER,
|
||||
acpi_button_dir);
|
||||
entry = acpi_power_dir;
|
||||
break;
|
||||
case ACPI_BUTTON_TYPE_SLEEP:
|
||||
case ACPI_BUTTON_TYPE_SLEEPF:
|
||||
if (!acpi_sleep_dir)
|
||||
acpi_sleep_dir = proc_mkdir(ACPI_BUTTON_SUBCLASS_SLEEP,
|
||||
acpi_button_dir);
|
||||
entry = acpi_sleep_dir;
|
||||
break;
|
||||
case ACPI_BUTTON_TYPE_LID:
|
||||
if (!acpi_lid_dir)
|
||||
acpi_lid_dir = proc_mkdir(ACPI_BUTTON_SUBCLASS_LID,
|
||||
acpi_button_dir);
|
||||
entry = acpi_lid_dir;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!entry)
|
||||
return_VALUE(-ENODEV);
|
||||
entry->owner = THIS_MODULE;
|
||||
|
||||
acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device), entry);
|
||||
if (!acpi_device_dir(device))
|
||||
return_VALUE(-ENODEV);
|
||||
acpi_device_dir(device)->owner = THIS_MODULE;
|
||||
|
||||
/* 'info' [R] */
|
||||
entry = create_proc_entry(ACPI_BUTTON_FILE_INFO,
|
||||
S_IRUGO, acpi_device_dir(device));
|
||||
if (!entry)
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
|
||||
"Unable to create '%s' fs entry\n",
|
||||
ACPI_BUTTON_FILE_INFO));
|
||||
else {
|
||||
entry->proc_fops = &acpi_button_info_fops;
|
||||
entry->data = acpi_driver_data(device);
|
||||
entry->owner = THIS_MODULE;
|
||||
}
|
||||
|
||||
/* show lid state [R] */
|
||||
if (button->type == ACPI_BUTTON_TYPE_LID) {
|
||||
entry = create_proc_entry(ACPI_BUTTON_FILE_STATE,
|
||||
S_IRUGO, acpi_device_dir(device));
|
||||
if (!entry)
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
|
||||
"Unable to create '%s' fs entry\n",
|
||||
ACPI_BUTTON_FILE_INFO));
|
||||
else {
|
||||
entry->proc_fops = &acpi_button_state_fops;
|
||||
entry->data = acpi_driver_data(device);
|
||||
entry->owner = THIS_MODULE;
|
||||
}
|
||||
}
|
||||
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
acpi_button_remove_fs (
|
||||
struct acpi_device *device)
|
||||
{
|
||||
struct acpi_button *button = NULL;
|
||||
|
||||
ACPI_FUNCTION_TRACE("acpi_button_remove_fs");
|
||||
|
||||
button = acpi_driver_data(device);
|
||||
if (acpi_device_dir(device)) {
|
||||
if (button->type == ACPI_BUTTON_TYPE_LID)
|
||||
remove_proc_entry(ACPI_BUTTON_FILE_STATE,
|
||||
acpi_device_dir(device));
|
||||
remove_proc_entry(ACPI_BUTTON_FILE_INFO,
|
||||
acpi_device_dir(device));
|
||||
|
||||
remove_proc_entry(acpi_device_bid(device),
|
||||
acpi_device_dir(device)->parent);
|
||||
acpi_device_dir(device) = NULL;
|
||||
}
|
||||
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Driver Interface
|
||||
-------------------------------------------------------------------------- */
|
||||
|
@ -121,7 +302,8 @@ acpi_button_notify_fixed (
|
|||
|
||||
ACPI_FUNCTION_TRACE("acpi_button_notify_fixed");
|
||||
|
||||
BUG_ON(!button);
|
||||
if (!button)
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
|
||||
acpi_button_notify(button->handle, ACPI_BUTTON_NOTIFY_STATUS, button);
|
||||
|
||||
|
@ -197,6 +379,10 @@ acpi_button_add (
|
|||
goto end;
|
||||
}
|
||||
|
||||
result = acpi_button_add_fs(device);
|
||||
if (result)
|
||||
goto end;
|
||||
|
||||
switch (button->type) {
|
||||
case ACPI_BUTTON_TYPE_POWERF:
|
||||
status = acpi_install_fixed_event_handler (
|
||||
|
@ -240,6 +426,7 @@ acpi_button_add (
|
|||
|
||||
end:
|
||||
if (result) {
|
||||
acpi_button_remove_fs(device);
|
||||
kfree(button);
|
||||
}
|
||||
|
||||
|
@ -280,6 +467,8 @@ acpi_button_remove (struct acpi_device *device, int type)
|
|||
ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
|
||||
"Error removing notify handler\n"));
|
||||
|
||||
acpi_button_remove_fs(device);
|
||||
|
||||
kfree(button);
|
||||
|
||||
return_VALUE(0);
|
||||
|
@ -293,14 +482,20 @@ acpi_button_init (void)
|
|||
|
||||
ACPI_FUNCTION_TRACE("acpi_button_init");
|
||||
|
||||
acpi_button_dir = proc_mkdir(ACPI_BUTTON_CLASS, acpi_root_dir);
|
||||
if (!acpi_button_dir)
|
||||
return_VALUE(-ENODEV);
|
||||
acpi_button_dir->owner = THIS_MODULE;
|
||||
result = acpi_bus_register_driver(&acpi_button_driver);
|
||||
if (result < 0) {
|
||||
remove_proc_entry(ACPI_BUTTON_CLASS, acpi_root_dir);
|
||||
return_VALUE(-ENODEV);
|
||||
}
|
||||
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
|
||||
static void __exit
|
||||
acpi_button_exit (void)
|
||||
{
|
||||
|
@ -308,8 +503,17 @@ acpi_button_exit (void)
|
|||
|
||||
acpi_bus_unregister_driver(&acpi_button_driver);
|
||||
|
||||
if (acpi_power_dir)
|
||||
remove_proc_entry(ACPI_BUTTON_SUBCLASS_POWER, acpi_button_dir);
|
||||
if (acpi_sleep_dir)
|
||||
remove_proc_entry(ACPI_BUTTON_SUBCLASS_SLEEP, acpi_button_dir);
|
||||
if (acpi_lid_dir)
|
||||
remove_proc_entry(ACPI_BUTTON_SUBCLASS_LID, acpi_button_dir);
|
||||
remove_proc_entry(ACPI_BUTTON_CLASS, acpi_root_dir);
|
||||
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
|
||||
module_init(acpi_button_init);
|
||||
module_exit(acpi_button_exit);
|
||||
|
|
|
@ -491,12 +491,6 @@ acpi_ds_load2_begin_op (
|
|||
if ((!(walk_state->op_info->flags & AML_NSOPCODE) &&
|
||||
(walk_state->opcode != AML_INT_NAMEPATH_OP)) ||
|
||||
(!(walk_state->op_info->flags & AML_NAMED))) {
|
||||
if ((walk_state->op_info->class == AML_CLASS_EXECUTE) ||
|
||||
(walk_state->op_info->class == AML_CLASS_CONTROL)) {
|
||||
ACPI_REPORT_WARNING ((
|
||||
"Encountered executable code at module level, [%s]\n",
|
||||
acpi_ps_get_opcode_name (walk_state->opcode)));
|
||||
}
|
||||
return_ACPI_STATUS (AE_OK);
|
||||
}
|
||||
|
||||
|
|
|
@ -76,13 +76,14 @@ static int acpi_ec_remove (struct acpi_device *device, int type);
|
|||
static int acpi_ec_start (struct acpi_device *device);
|
||||
static int acpi_ec_stop (struct acpi_device *device, int type);
|
||||
static int acpi_ec_burst_add ( struct acpi_device *device);
|
||||
static int acpi_ec_polling_add ( struct acpi_device *device);
|
||||
|
||||
static struct acpi_driver acpi_ec_driver = {
|
||||
.name = ACPI_EC_DRIVER_NAME,
|
||||
.class = ACPI_EC_CLASS,
|
||||
.ids = ACPI_EC_HID,
|
||||
.ops = {
|
||||
.add = acpi_ec_burst_add,
|
||||
.add = acpi_ec_polling_add,
|
||||
.remove = acpi_ec_remove,
|
||||
.start = acpi_ec_start,
|
||||
.stop = acpi_ec_stop,
|
||||
|
@ -164,7 +165,7 @@ static union acpi_ec *ec_ecdt;
|
|||
|
||||
/* External interfaces use first EC only, so remember */
|
||||
static struct acpi_device *first_ec;
|
||||
static int acpi_ec_polling_mode;
|
||||
static int acpi_ec_polling_mode = EC_POLLING;
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Transaction Management
|
||||
|
@ -1710,11 +1711,24 @@ static int __init acpi_fake_ecdt_setup(char *str)
|
|||
acpi_fake_ecdt_enabled = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
__setup("acpi_fake_ecdt", acpi_fake_ecdt_setup);
|
||||
static int __init acpi_ec_set_polling_mode(char *str)
|
||||
{
|
||||
acpi_ec_polling_mode = EC_POLLING;
|
||||
acpi_ec_driver.ops.add = acpi_ec_polling_add;
|
||||
int burst;
|
||||
|
||||
if (!get_option(&str, &burst))
|
||||
return 0;
|
||||
|
||||
if (burst) {
|
||||
acpi_ec_polling_mode = EC_BURST;
|
||||
acpi_ec_driver.ops.add = acpi_ec_burst_add;
|
||||
} else {
|
||||
acpi_ec_polling_mode = EC_POLLING;
|
||||
acpi_ec_driver.ops.add = acpi_ec_polling_add;
|
||||
}
|
||||
printk(KERN_INFO PREFIX "EC %s mode.\n",
|
||||
burst ? "burst": "polling");
|
||||
return 0;
|
||||
}
|
||||
__setup("ec_polling", acpi_ec_set_polling_mode);
|
||||
__setup("ec_burst=", acpi_ec_set_polling_mode);
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -43,7 +43,7 @@ ACPI_MODULE_NAME ("acpi_motherboard")
|
|||
*/
|
||||
#define IS_RESERVED_ADDR(base, len) \
|
||||
(((len) > 0) && ((base) > 0) && ((base) + (len) < IO_SPACE_LIMIT) \
|
||||
&& ((base) + (len) > PCIBIOS_MIN_IO))
|
||||
&& ((base) + (len) > 0x1000))
|
||||
|
||||
/*
|
||||
* Clearing the flag (IORESOURCE_BUSY) allows drivers to use
|
||||
|
|
|
@ -145,10 +145,14 @@ acpi_os_vprintf(const char *fmt, va_list args)
|
|||
#endif
|
||||
}
|
||||
|
||||
extern int acpi_in_resume;
|
||||
void *
|
||||
acpi_os_allocate(acpi_size size)
|
||||
{
|
||||
return kmalloc(size, GFP_KERNEL);
|
||||
if (acpi_in_resume)
|
||||
return kmalloc(size, GFP_ATOMIC);
|
||||
else
|
||||
return kmalloc(size, GFP_KERNEL);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -692,7 +692,18 @@ acpi_pci_link_free_irq(acpi_handle handle)
|
|||
return_VALUE(-1);
|
||||
}
|
||||
|
||||
#ifdef FUTURE_USE
|
||||
/*
|
||||
* The Link reference count allows us to _DISable an unused link
|
||||
* and suspend time, and set it again on resume.
|
||||
* However, 2.6.12 still has irq_router.resume
|
||||
* which blindly restores the link state.
|
||||
* So we disable the reference count method
|
||||
* to prevent duplicate acpi_pci_link_set()
|
||||
* which would harm some systems
|
||||
*/
|
||||
link->refcnt --;
|
||||
#endif
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"Link %s is dereferenced\n", acpi_device_bid(link->device)));
|
||||
|
||||
|
@ -787,6 +798,11 @@ acpi_pci_link_resume(
|
|||
return_VALUE(0);
|
||||
}
|
||||
|
||||
/*
|
||||
* FIXME: this is a workaround to avoid nasty warning. It will be removed
|
||||
* after every device calls pci_disable_device in .resume.
|
||||
*/
|
||||
int acpi_in_resume;
|
||||
static int
|
||||
irqrouter_resume(
|
||||
struct sys_device *dev)
|
||||
|
@ -796,6 +812,7 @@ irqrouter_resume(
|
|||
|
||||
ACPI_FUNCTION_TRACE("irqrouter_resume");
|
||||
|
||||
acpi_in_resume = 1;
|
||||
list_for_each(node, &acpi_link.entries) {
|
||||
link = list_entry(node, struct acpi_pci_link, node);
|
||||
if (!link) {
|
||||
|
@ -805,6 +822,7 @@ irqrouter_resume(
|
|||
}
|
||||
acpi_pci_link_resume(link);
|
||||
}
|
||||
acpi_in_resume = 0;
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
|
|
|
@ -86,12 +86,11 @@ static int set_max_cstate(struct dmi_system_id *id)
|
|||
if (max_cstate > ACPI_PROCESSOR_MAX_POWER)
|
||||
return 0;
|
||||
|
||||
printk(KERN_NOTICE PREFIX "%s detected - %s disabled."
|
||||
printk(KERN_NOTICE PREFIX "%s detected - limiting to C%ld max_cstate."
|
||||
" Override with \"processor.max_cstate=%d\"\n", id->ident,
|
||||
((int)id->driver_data == 1)? "C2,C3":"C3",
|
||||
ACPI_PROCESSOR_MAX_POWER + 1);
|
||||
(long)id->driver_data, ACPI_PROCESSOR_MAX_POWER + 1);
|
||||
|
||||
max_cstate = (int)id->driver_data;
|
||||
max_cstate = (long)id->driver_data;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -719,7 +719,7 @@ struct request *blk_queue_find_tag(request_queue_t *q, int tag)
|
|||
{
|
||||
struct blk_queue_tag *bqt = q->queue_tags;
|
||||
|
||||
if (unlikely(bqt == NULL || tag >= bqt->max_depth))
|
||||
if (unlikely(bqt == NULL || tag >= bqt->real_max_depth))
|
||||
return NULL;
|
||||
|
||||
return bqt->tag_index[tag];
|
||||
|
@ -798,6 +798,7 @@ init_tag_map(request_queue_t *q, struct blk_queue_tag *tags, int depth)
|
|||
|
||||
memset(tag_index, 0, depth * sizeof(struct request *));
|
||||
memset(tag_map, 0, nr_ulongs * sizeof(unsigned long));
|
||||
tags->real_max_depth = depth;
|
||||
tags->max_depth = depth;
|
||||
tags->tag_index = tag_index;
|
||||
tags->tag_map = tag_map;
|
||||
|
@ -871,12 +872,23 @@ int blk_queue_resize_tags(request_queue_t *q, int new_depth)
|
|||
if (!bqt)
|
||||
return -ENXIO;
|
||||
|
||||
/*
|
||||
* if we already have large enough real_max_depth. just
|
||||
* adjust max_depth. *NOTE* as requests with tag value
|
||||
* between new_depth and real_max_depth can be in-flight, tag
|
||||
* map can not be shrunk blindly here.
|
||||
*/
|
||||
if (new_depth <= bqt->real_max_depth) {
|
||||
bqt->max_depth = new_depth;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* save the old state info, so we can copy it back
|
||||
*/
|
||||
tag_index = bqt->tag_index;
|
||||
tag_map = bqt->tag_map;
|
||||
max_depth = bqt->max_depth;
|
||||
max_depth = bqt->real_max_depth;
|
||||
|
||||
if (init_tag_map(q, bqt, new_depth))
|
||||
return -ENOMEM;
|
||||
|
@ -913,7 +925,7 @@ void blk_queue_end_tag(request_queue_t *q, struct request *rq)
|
|||
|
||||
BUG_ON(tag == -1);
|
||||
|
||||
if (unlikely(tag >= bqt->max_depth))
|
||||
if (unlikely(tag >= bqt->real_max_depth))
|
||||
/*
|
||||
* This can happen after tag depth has been reduced.
|
||||
* FIXME: how about a warning or info message here?
|
||||
|
|
|
@ -367,11 +367,8 @@ static inline void bpa10x_free_urb(struct urb *urb)
|
|||
if (!urb)
|
||||
return;
|
||||
|
||||
if (urb->setup_packet)
|
||||
kfree(urb->setup_packet);
|
||||
|
||||
if (urb->transfer_buffer)
|
||||
kfree(urb->transfer_buffer);
|
||||
kfree(urb->setup_packet);
|
||||
kfree(urb->transfer_buffer);
|
||||
|
||||
usb_free_urb(urb);
|
||||
}
|
||||
|
|
|
@ -58,8 +58,6 @@
|
|||
#ifndef CONFIG_BT_HCIUART_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG( A... )
|
||||
#undef BT_DMP
|
||||
#define BT_DMP( A... )
|
||||
#endif
|
||||
|
||||
static int hciextn = 1;
|
||||
|
|
|
@ -57,8 +57,6 @@
|
|||
#ifndef CONFIG_BT_HCIUART_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG( A... )
|
||||
#undef BT_DMP
|
||||
#define BT_DMP( A... )
|
||||
#endif
|
||||
|
||||
/* Initialize protocol */
|
||||
|
@ -125,7 +123,6 @@ static inline int h4_check_data_len(struct h4_struct *h4, int len)
|
|||
|
||||
BT_DBG("len %d room %d", len, room);
|
||||
if (!len) {
|
||||
BT_DMP(h4->rx_skb->data, h4->rx_skb->len);
|
||||
hci_recv_frame(h4->rx_skb);
|
||||
} else if (len > room) {
|
||||
BT_ERR("Data length is too large");
|
||||
|
@ -169,8 +166,6 @@ static int h4_recv(struct hci_uart *hu, void *data, int count)
|
|||
case H4_W4_DATA:
|
||||
BT_DBG("Complete data");
|
||||
|
||||
BT_DMP(h4->rx_skb->data, h4->rx_skb->len);
|
||||
|
||||
hci_recv_frame(h4->rx_skb);
|
||||
|
||||
h4->rx_state = H4_W4_PACKET_TYPE;
|
||||
|
|
|
@ -57,8 +57,6 @@
|
|||
#ifndef CONFIG_BT_HCIUART_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG( A... )
|
||||
#undef BT_DMP
|
||||
#define BT_DMP( A... )
|
||||
#endif
|
||||
|
||||
static int reset = 0;
|
||||
|
|
|
@ -57,8 +57,6 @@
|
|||
#ifndef CONFIG_BT_HCIUSB_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#undef BT_DMP
|
||||
#define BT_DMP(D...)
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_BT_HCIUSB_ZERO_PACKET
|
||||
|
@ -110,6 +108,9 @@ static struct usb_device_id blacklist_ids[] = {
|
|||
/* Microsoft Wireless Transceiver for Bluetooth 2.0 */
|
||||
{ USB_DEVICE(0x045e, 0x009c), .driver_info = HCI_RESET },
|
||||
|
||||
/* Kensington Bluetooth USB adapter */
|
||||
{ USB_DEVICE(0x047d, 0x105d), .driver_info = HCI_RESET },
|
||||
|
||||
/* ISSC Bluetooth Adapter v3.1 */
|
||||
{ USB_DEVICE(0x1131, 0x1001), .driver_info = HCI_RESET },
|
||||
|
||||
|
@ -387,10 +388,8 @@ static void hci_usb_unlink_urbs(struct hci_usb *husb)
|
|||
urb = &_urb->urb;
|
||||
BT_DBG("%s freeing _urb %p type %d urb %p",
|
||||
husb->hdev->name, _urb, _urb->type, urb);
|
||||
if (urb->setup_packet)
|
||||
kfree(urb->setup_packet);
|
||||
if (urb->transfer_buffer)
|
||||
kfree(urb->transfer_buffer);
|
||||
kfree(urb->setup_packet);
|
||||
kfree(urb->transfer_buffer);
|
||||
_urb_free(_urb);
|
||||
}
|
||||
|
||||
|
|
|
@ -1209,6 +1209,7 @@ static int rtc_proc_open(struct inode *inode, struct file *file)
|
|||
|
||||
void rtc_get_rtc_time(struct rtc_time *rtc_tm)
|
||||
{
|
||||
unsigned long uip_watchdog = jiffies;
|
||||
unsigned char ctrl;
|
||||
#ifdef CONFIG_MACH_DECSTATION
|
||||
unsigned int real_year;
|
||||
|
@ -1224,8 +1225,10 @@ void rtc_get_rtc_time(struct rtc_time *rtc_tm)
|
|||
* Once the read clears, read the RTC time (again via ioctl). Easy.
|
||||
*/
|
||||
|
||||
if (rtc_is_updating() != 0)
|
||||
msleep(20);
|
||||
while (rtc_is_updating() != 0 && jiffies - uip_watchdog < 2*HZ/100) {
|
||||
barrier();
|
||||
cpu_relax();
|
||||
}
|
||||
|
||||
/*
|
||||
* Only the values that we read from the RTC are set. We leave
|
||||
|
|
|
@ -17,6 +17,8 @@ config TCG_TPM
|
|||
obtained at: <http://sourceforge.net/projects/trousers>. To
|
||||
compile this driver as a module, choose M here; the module
|
||||
will be called tpm. If unsure, say N.
|
||||
Note: For more TPM drivers enable CONFIG_PNP, CONFIG_ACPI_BUS
|
||||
and CONFIG_PNPACPI.
|
||||
|
||||
config TCG_NSC
|
||||
tristate "National Semiconductor TPM Interface"
|
||||
|
@ -36,12 +38,13 @@ config TCG_ATMEL
|
|||
as a module, choose M here; the module will be called tpm_atmel.
|
||||
|
||||
config TCG_INFINEON
|
||||
tristate "Infineon Technologies SLD 9630 TPM Interface"
|
||||
depends on TCG_TPM
|
||||
tristate "Infineon Technologies TPM Interface"
|
||||
depends on TCG_TPM && PNPACPI
|
||||
---help---
|
||||
If you have a TPM security chip from Infineon Technologies
|
||||
say Yes and it will be accessible from within Linux. To
|
||||
compile this driver as a module, choose M here; the module
|
||||
(either SLD 9630 TT 1.1 or SLB 9635 TT 1.2) say Yes and it
|
||||
will be accessible from within Linux.
|
||||
To compile this driver as a module, choose M here; the module
|
||||
will be called tpm_infineon.
|
||||
Further information on this driver and the supported hardware
|
||||
can be found at http://www.prosec.rub.de/tpm
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Description:
|
||||
* Device Driver for the Infineon Technologies
|
||||
* SLD 9630 TT Trusted Platform Module
|
||||
* SLD 9630 TT 1.1 and SLB 9635 TT 1.2 Trusted Platform Module
|
||||
* Specifications at www.trustedcomputinggroup.org
|
||||
*
|
||||
* Copyright (C) 2005, Marcel Selhorst <selhorst@crypto.rub.de>
|
||||
|
@ -12,9 +12,10 @@
|
|||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation, version 2 of the
|
||||
* License.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <linux/pnp.h>
|
||||
#include "tpm.h"
|
||||
|
||||
/* Infineon specific definitions */
|
||||
|
@ -26,8 +27,11 @@
|
|||
#define TPM_MSLEEP_TIME 3
|
||||
/* gives number of max. msleep()-calls before throwing timeout */
|
||||
#define TPM_MAX_TRIES 5000
|
||||
#define TCPA_INFINEON_DEV_VEN_VALUE 0x15D1
|
||||
#define TPM_DATA (TPM_ADDR + 1) & 0xff
|
||||
#define TPM_INFINEON_DEV_VEN_VALUE 0x15D1
|
||||
|
||||
/* These values will be filled after ACPI-call */
|
||||
static int TPM_INF_DATA = 0;
|
||||
static int TPM_INF_ADDR = 0;
|
||||
|
||||
/* TPM header definitions */
|
||||
enum infineon_tpm_header {
|
||||
|
@ -305,9 +309,10 @@ static int tpm_inf_send(struct tpm_chip *chip, u8 * buf, size_t count)
|
|||
|
||||
static void tpm_inf_cancel(struct tpm_chip *chip)
|
||||
{
|
||||
/* Nothing yet!
|
||||
This has something to do with the internal functions
|
||||
of the TPM. Abort isn't really necessary...
|
||||
/*
|
||||
Since we are using the legacy mode to communicate
|
||||
with the TPM, we have no cancel functions, but have
|
||||
a workaround for interrupting the TPM through WTX.
|
||||
*/
|
||||
}
|
||||
|
||||
|
@ -345,6 +350,32 @@ static struct tpm_vendor_specific tpm_inf = {
|
|||
.miscdev = {.fops = &inf_ops,},
|
||||
};
|
||||
|
||||
static const struct pnp_device_id tpm_pnp_tbl[] = {
|
||||
/* Infineon TPMs */
|
||||
{"IFX0101", 0},
|
||||
{"IFX0102", 0},
|
||||
{"", 0}
|
||||
};
|
||||
|
||||
static int __devinit tpm_inf_acpi_probe(struct pnp_dev *dev,
|
||||
const struct pnp_device_id *dev_id)
|
||||
{
|
||||
TPM_INF_ADDR = (pnp_port_start(dev, 0) & 0xff);
|
||||
TPM_INF_DATA = ((TPM_INF_ADDR + 1) & 0xff);
|
||||
tpm_inf.base = pnp_port_start(dev, 1);
|
||||
dev_info(&dev->dev, "Found %s with ID %s\n",
|
||||
dev->name, dev_id->id);
|
||||
if (!((tpm_inf.base >> 8) & 0xff))
|
||||
tpm_inf.base = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct pnp_driver tpm_inf_pnp = {
|
||||
.name = "tpm_inf_pnp",
|
||||
.id_table = tpm_pnp_tbl,
|
||||
.probe = tpm_inf_acpi_probe,
|
||||
};
|
||||
|
||||
static int __devinit tpm_inf_probe(struct pci_dev *pci_dev,
|
||||
const struct pci_device_id *pci_id)
|
||||
{
|
||||
|
@ -353,64 +384,99 @@ static int __devinit tpm_inf_probe(struct pci_dev *pci_dev,
|
|||
int vendorid[2];
|
||||
int version[2];
|
||||
int productid[2];
|
||||
char chipname[20];
|
||||
|
||||
if (pci_enable_device(pci_dev))
|
||||
return -EIO;
|
||||
|
||||
dev_info(&pci_dev->dev, "LPC-bus found at 0x%x\n", pci_id->device);
|
||||
|
||||
/* read IO-ports from ACPI */
|
||||
pnp_register_driver(&tpm_inf_pnp);
|
||||
pnp_unregister_driver(&tpm_inf_pnp);
|
||||
|
||||
/* Make sure, we have received valid config ports */
|
||||
if (!TPM_INF_ADDR) {
|
||||
pci_disable_device(pci_dev);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/* query chip for its vendor, its version number a.s.o. */
|
||||
outb(ENABLE_REGISTER_PAIR, TPM_ADDR);
|
||||
outb(IDVENL, TPM_ADDR);
|
||||
vendorid[1] = inb(TPM_DATA);
|
||||
outb(IDVENH, TPM_ADDR);
|
||||
vendorid[0] = inb(TPM_DATA);
|
||||
outb(IDPDL, TPM_ADDR);
|
||||
productid[1] = inb(TPM_DATA);
|
||||
outb(IDPDH, TPM_ADDR);
|
||||
productid[0] = inb(TPM_DATA);
|
||||
outb(CHIP_ID1, TPM_ADDR);
|
||||
version[1] = inb(TPM_DATA);
|
||||
outb(CHIP_ID2, TPM_ADDR);
|
||||
version[0] = inb(TPM_DATA);
|
||||
outb(ENABLE_REGISTER_PAIR, TPM_INF_ADDR);
|
||||
outb(IDVENL, TPM_INF_ADDR);
|
||||
vendorid[1] = inb(TPM_INF_DATA);
|
||||
outb(IDVENH, TPM_INF_ADDR);
|
||||
vendorid[0] = inb(TPM_INF_DATA);
|
||||
outb(IDPDL, TPM_INF_ADDR);
|
||||
productid[1] = inb(TPM_INF_DATA);
|
||||
outb(IDPDH, TPM_INF_ADDR);
|
||||
productid[0] = inb(TPM_INF_DATA);
|
||||
outb(CHIP_ID1, TPM_INF_ADDR);
|
||||
version[1] = inb(TPM_INF_DATA);
|
||||
outb(CHIP_ID2, TPM_INF_ADDR);
|
||||
version[0] = inb(TPM_INF_DATA);
|
||||
|
||||
if ((vendorid[0] << 8 | vendorid[1]) == (TCPA_INFINEON_DEV_VEN_VALUE)) {
|
||||
switch ((productid[0] << 8) | productid[1]) {
|
||||
case 6:
|
||||
sprintf(chipname, " (SLD 9630 TT 1.1)");
|
||||
break;
|
||||
case 11:
|
||||
sprintf(chipname, " (SLB 9635 TT 1.2)");
|
||||
break;
|
||||
default:
|
||||
sprintf(chipname, " (unknown chip)");
|
||||
break;
|
||||
}
|
||||
chipname[19] = 0;
|
||||
|
||||
/* read IO-ports from TPM */
|
||||
outb(IOLIMH, TPM_ADDR);
|
||||
ioh = inb(TPM_DATA);
|
||||
outb(IOLIML, TPM_ADDR);
|
||||
iol = inb(TPM_DATA);
|
||||
tpm_inf.base = (ioh << 8) | iol;
|
||||
if ((vendorid[0] << 8 | vendorid[1]) == (TPM_INFINEON_DEV_VEN_VALUE)) {
|
||||
|
||||
if (tpm_inf.base == 0) {
|
||||
dev_err(&pci_dev->dev, "No IO-ports set!\n");
|
||||
dev_err(&pci_dev->dev, "No IO-ports found!\n");
|
||||
pci_disable_device(pci_dev);
|
||||
return -ENODEV;
|
||||
return -EIO;
|
||||
}
|
||||
/* configure TPM with IO-ports */
|
||||
outb(IOLIMH, TPM_INF_ADDR);
|
||||
outb(((tpm_inf.base >> 8) & 0xff), TPM_INF_DATA);
|
||||
outb(IOLIML, TPM_INF_ADDR);
|
||||
outb((tpm_inf.base & 0xff), TPM_INF_DATA);
|
||||
|
||||
/* control if IO-ports are set correctly */
|
||||
outb(IOLIMH, TPM_INF_ADDR);
|
||||
ioh = inb(TPM_INF_DATA);
|
||||
outb(IOLIML, TPM_INF_ADDR);
|
||||
iol = inb(TPM_INF_DATA);
|
||||
|
||||
if ((ioh << 8 | iol) != tpm_inf.base) {
|
||||
dev_err(&pci_dev->dev,
|
||||
"Could not set IO-ports to %04x\n",
|
||||
tpm_inf.base);
|
||||
pci_disable_device(pci_dev);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/* activate register */
|
||||
outb(TPM_DAR, TPM_ADDR);
|
||||
outb(0x01, TPM_DATA);
|
||||
outb(DISABLE_REGISTER_PAIR, TPM_ADDR);
|
||||
outb(TPM_DAR, TPM_INF_ADDR);
|
||||
outb(0x01, TPM_INF_DATA);
|
||||
outb(DISABLE_REGISTER_PAIR, TPM_INF_ADDR);
|
||||
|
||||
/* disable RESET, LP and IRQC */
|
||||
outb(RESET_LP_IRQC_DISABLE, tpm_inf.base + CMD);
|
||||
|
||||
/* Finally, we're done, print some infos */
|
||||
dev_info(&pci_dev->dev, "TPM found: "
|
||||
"config base 0x%x, "
|
||||
"io base 0x%x, "
|
||||
"chip version %02x%02x, "
|
||||
"vendor id %x%x (Infineon), "
|
||||
"product id %02x%02x"
|
||||
"%s\n",
|
||||
TPM_INF_ADDR,
|
||||
tpm_inf.base,
|
||||
version[0], version[1],
|
||||
vendorid[0], vendorid[1],
|
||||
productid[0], productid[1], ((productid[0] == 0)
|
||||
&& (productid[1] ==
|
||||
6)) ?
|
||||
" (SLD 9630 TT 1.1)" : "");
|
||||
productid[0], productid[1], chipname);
|
||||
|
||||
rc = tpm_register_hardware(pci_dev, &tpm_inf);
|
||||
if (rc < 0) {
|
||||
|
@ -462,6 +528,6 @@ module_init(init_inf);
|
|||
module_exit(cleanup_inf);
|
||||
|
||||
MODULE_AUTHOR("Marcel Selhorst <selhorst@crypto.rub.de>");
|
||||
MODULE_DESCRIPTION("Driver for Infineon TPM SLD 9630 TT");
|
||||
MODULE_VERSION("1.4");
|
||||
MODULE_DESCRIPTION("Driver for Infineon TPM SLD 9630 TT 1.1 / SLB 9635 TT 1.2");
|
||||
MODULE_VERSION("1.5");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* i8xx_tco 0.07: TCO timer driver for i8xx chipsets
|
||||
* i8xx_tco: TCO timer driver for i8xx chipsets
|
||||
*
|
||||
* (c) Copyright 2000 kernel concepts <nils@kernelconcepts.de>, All Rights Reserved.
|
||||
* http://www.kernelconcepts.de
|
||||
|
@ -63,6 +63,9 @@
|
|||
* 20050128 Wim Van Sebroeck <wim@iguana.be>
|
||||
* 0.07 Added support for the ICH4-M, ICH6, ICH6R, ICH6-M, ICH6W and ICH6RW
|
||||
* chipsets. Also added support for the "undocumented" ICH7 chipset.
|
||||
* 20050807 Wim Van Sebroeck <wim@iguana.be>
|
||||
* 0.08 Make sure that the watchdog is only "armed" when started.
|
||||
* (Kernel Bug 4251)
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -87,7 +90,7 @@
|
|||
#include "i8xx_tco.h"
|
||||
|
||||
/* Module and version information */
|
||||
#define TCO_VERSION "0.07"
|
||||
#define TCO_VERSION "0.08"
|
||||
#define TCO_MODULE_NAME "i8xx TCO timer"
|
||||
#define TCO_DRIVER_NAME TCO_MODULE_NAME ", v" TCO_VERSION
|
||||
#define PFX TCO_MODULE_NAME ": "
|
||||
|
@ -125,10 +128,18 @@ static int tco_timer_start (void)
|
|||
unsigned char val;
|
||||
|
||||
spin_lock(&tco_lock);
|
||||
|
||||
/* disable chipset's NO_REBOOT bit */
|
||||
pci_read_config_byte (i8xx_tco_pci, 0xd4, &val);
|
||||
val &= 0xfd;
|
||||
pci_write_config_byte (i8xx_tco_pci, 0xd4, val);
|
||||
|
||||
/* Bit 11: TCO Timer Halt -> 0 = The TCO timer is enabled to count */
|
||||
val = inb (TCO1_CNT + 1);
|
||||
val &= 0xf7;
|
||||
outb (val, TCO1_CNT + 1);
|
||||
val = inb (TCO1_CNT + 1);
|
||||
|
||||
spin_unlock(&tco_lock);
|
||||
|
||||
if (val & 0x08)
|
||||
|
@ -138,13 +149,20 @@ static int tco_timer_start (void)
|
|||
|
||||
static int tco_timer_stop (void)
|
||||
{
|
||||
unsigned char val;
|
||||
unsigned char val, val1;
|
||||
|
||||
spin_lock(&tco_lock);
|
||||
/* Bit 11: TCO Timer Halt -> 1 = The TCO timer is disabled */
|
||||
val = inb (TCO1_CNT + 1);
|
||||
val |= 0x08;
|
||||
outb (val, TCO1_CNT + 1);
|
||||
val = inb (TCO1_CNT + 1);
|
||||
|
||||
/* Set the NO_REBOOT bit to prevent later reboots, just for sure */
|
||||
pci_read_config_byte (i8xx_tco_pci, 0xd4, &val1);
|
||||
val1 |= 0x02;
|
||||
pci_write_config_byte (i8xx_tco_pci, 0xd4, val1);
|
||||
|
||||
spin_unlock(&tco_lock);
|
||||
|
||||
if ((val & 0x08) == 0)
|
||||
|
@ -155,6 +173,7 @@ static int tco_timer_stop (void)
|
|||
static int tco_timer_keepalive (void)
|
||||
{
|
||||
spin_lock(&tco_lock);
|
||||
/* Reload the timer by writing to the TCO Timer Reload register */
|
||||
outb (0x01, TCO1_RLD);
|
||||
spin_unlock(&tco_lock);
|
||||
return 0;
|
||||
|
@ -417,9 +436,8 @@ static unsigned char __init i8xx_tco_getdevice (void)
|
|||
printk (KERN_ERR PFX "failed to get TCOBASE address\n");
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
* Check chipset's NO_REBOOT bit
|
||||
*/
|
||||
|
||||
/* Check chipset's NO_REBOOT bit */
|
||||
pci_read_config_byte (i8xx_tco_pci, 0xd4, &val1);
|
||||
if (val1 & 0x02) {
|
||||
val1 &= 0xfd;
|
||||
|
@ -430,6 +448,10 @@ static unsigned char __init i8xx_tco_getdevice (void)
|
|||
return 0; /* Cannot reset NO_REBOOT bit */
|
||||
}
|
||||
}
|
||||
/* Disable reboots untill the watchdog starts */
|
||||
val1 |= 0x02;
|
||||
pci_write_config_byte (i8xx_tco_pci, 0xd4, val1);
|
||||
|
||||
/* Set the TCO_EN bit in SMI_EN register */
|
||||
if (!request_region (SMI_EN + 1, 1, "i8xx TCO")) {
|
||||
printk (KERN_ERR PFX "I/O address 0x%04x already in use\n",
|
||||
|
@ -505,17 +527,10 @@ static int __init watchdog_init (void)
|
|||
|
||||
static void __exit watchdog_cleanup (void)
|
||||
{
|
||||
u8 val;
|
||||
|
||||
/* Stop the timer before we leave */
|
||||
if (!nowayout)
|
||||
tco_timer_stop ();
|
||||
|
||||
/* Set the NO_REBOOT bit to prevent later reboots, just for sure */
|
||||
pci_read_config_byte (i8xx_tco_pci, 0xd4, &val);
|
||||
val |= 0x02;
|
||||
pci_write_config_byte (i8xx_tco_pci, 0xd4, val);
|
||||
|
||||
/* Deregister */
|
||||
misc_deregister (&i8xx_tco_miscdev);
|
||||
unregister_reboot_notifier(&i8xx_tco_notifier);
|
||||
|
|
|
@ -36,13 +36,10 @@
|
|||
#include <asm/uaccess.h>
|
||||
|
||||
#define OSCR_FREQ CLOCK_TICK_RATE
|
||||
#define SA1100_CLOSE_MAGIC (0x5afc4453)
|
||||
|
||||
static unsigned long sa1100wdt_users;
|
||||
static int expect_close;
|
||||
static int pre_margin;
|
||||
static int boot_status;
|
||||
static int nowayout = WATCHDOG_NOWAYOUT;
|
||||
|
||||
/*
|
||||
* Allow only one person to hold it open
|
||||
|
@ -62,55 +59,33 @@ static int sa1100dog_open(struct inode *inode, struct file *file)
|
|||
}
|
||||
|
||||
/*
|
||||
* Shut off the timer.
|
||||
* Lock it in if it's a module and we defined ...NOWAYOUT
|
||||
* Oddly, the watchdog can only be enabled, but we can turn off
|
||||
* the interrupt, which appears to prevent the watchdog timing out.
|
||||
* The watchdog cannot be disabled.
|
||||
*
|
||||
* Previous comments suggested that turning off the interrupt by
|
||||
* clearing OIER[E3] would prevent the watchdog timing out but this
|
||||
* does not appear to be true (at least on the PXA255).
|
||||
*/
|
||||
static int sa1100dog_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
OSMR3 = OSCR + pre_margin;
|
||||
|
||||
if (expect_close == SA1100_CLOSE_MAGIC) {
|
||||
OIER &= ~OIER_E3;
|
||||
} else {
|
||||
printk(KERN_CRIT "WATCHDOG: WDT device closed unexpectedly. WDT will not stop!\n");
|
||||
}
|
||||
printk(KERN_CRIT "WATCHDOG: Device closed - timer will not stop\n");
|
||||
|
||||
clear_bit(1, &sa1100wdt_users);
|
||||
expect_close = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t sa1100dog_write(struct file *file, const char *data, size_t len, loff_t *ppos)
|
||||
{
|
||||
if (len) {
|
||||
if (!nowayout) {
|
||||
size_t i;
|
||||
|
||||
expect_close = 0;
|
||||
|
||||
for (i = 0; i != len; i++) {
|
||||
char c;
|
||||
|
||||
if (get_user(c, data + i))
|
||||
return -EFAULT;
|
||||
if (c == 'V')
|
||||
expect_close = SA1100_CLOSE_MAGIC;
|
||||
}
|
||||
}
|
||||
if (len)
|
||||
/* Refresh OSMR3 timer. */
|
||||
OSMR3 = OSCR + pre_margin;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
static struct watchdog_info ident = {
|
||||
.options = WDIOF_CARDRESET | WDIOF_MAGICCLOSE |
|
||||
WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING,
|
||||
.identity = "SA1100 Watchdog",
|
||||
.options = WDIOF_CARDRESET | WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING,
|
||||
.identity = "SA1100/PXA255 Watchdog",
|
||||
};
|
||||
|
||||
static int sa1100dog_ioctl(struct inode *inode, struct file *file,
|
||||
|
@ -172,7 +147,7 @@ static struct file_operations sa1100dog_fops =
|
|||
static struct miscdevice sa1100dog_miscdev =
|
||||
{
|
||||
.minor = WATCHDOG_MINOR,
|
||||
.name = "SA1100/PXA2xx watchdog",
|
||||
.name = "watchdog",
|
||||
.fops = &sa1100dog_fops,
|
||||
};
|
||||
|
||||
|
@ -194,7 +169,6 @@ static int __init sa1100dog_init(void)
|
|||
if (ret == 0)
|
||||
printk("SA1100/PXA2xx Watchdog Timer: timer margin %d sec\n",
|
||||
margin);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -212,8 +186,5 @@ MODULE_DESCRIPTION("SA1100/PXA2xx Watchdog");
|
|||
module_param(margin, int, 0);
|
||||
MODULE_PARM_DESC(margin, "Watchdog margin in seconds (default 60s)");
|
||||
|
||||
module_param(nowayout, int, 0);
|
||||
MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started");
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);
|
||||
|
|
|
@ -1004,8 +1004,8 @@ int fcp_scsi_dev_reset(Scsi_Cmnd *SCpnt)
|
|||
return FAILED;
|
||||
}
|
||||
fc->rst_pkt->eh_state = SCSI_STATE_UNUSED;
|
||||
return SUCCESS;
|
||||
#endif
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
static int __fcp_scsi_host_reset(Scsi_Cmnd *SCpnt)
|
||||
|
|
|
@ -23,8 +23,8 @@
|
|||
#include <asm/sibyte/sb1250_smbus.h>
|
||||
|
||||
static struct i2c_algo_sibyte_data sibyte_board_data[2] = {
|
||||
{ NULL, 0, (void *) (KSEG1+A_SMB_BASE(0)) },
|
||||
{ NULL, 1, (void *) (KSEG1+A_SMB_BASE(1)) }
|
||||
{ NULL, 0, (void *) (CKSEG1+A_SMB_BASE(0)) },
|
||||
{ NULL, 1, (void *) (CKSEG1+A_SMB_BASE(1)) }
|
||||
};
|
||||
|
||||
static struct i2c_adapter sibyte_board_adapter[2] = {
|
||||
|
|
|
@ -1220,7 +1220,7 @@ static int ide_disk_probe(struct device *dev)
|
|||
goto failed;
|
||||
|
||||
g = alloc_disk_node(1 << PARTN_BITS,
|
||||
pcibus_to_node(drive->hwif->pci_dev->bus));
|
||||
hwif_to_node(drive->hwif));
|
||||
if (!g)
|
||||
goto out_free_idkp;
|
||||
|
||||
|
|
|
@ -978,8 +978,7 @@ static int ide_init_queue(ide_drive_t *drive)
|
|||
* do not.
|
||||
*/
|
||||
|
||||
q = blk_init_queue_node(do_ide_request, &ide_lock,
|
||||
pcibus_to_node(drive->hwif->pci_dev->bus));
|
||||
q = blk_init_queue_node(do_ide_request, &ide_lock, hwif_to_node(hwif));
|
||||
if (!q)
|
||||
return 1;
|
||||
|
||||
|
@ -1048,6 +1047,8 @@ static int init_irq (ide_hwif_t *hwif)
|
|||
|
||||
BUG_ON(in_interrupt());
|
||||
BUG_ON(irqs_disabled());
|
||||
BUG_ON(hwif == NULL);
|
||||
|
||||
down(&ide_cfg_sem);
|
||||
hwif->hwgroup = NULL;
|
||||
#if MAX_HWIFS > 1
|
||||
|
@ -1097,7 +1098,7 @@ static int init_irq (ide_hwif_t *hwif)
|
|||
spin_unlock_irq(&ide_lock);
|
||||
} else {
|
||||
hwgroup = kmalloc_node(sizeof(ide_hwgroup_t), GFP_KERNEL,
|
||||
pcibus_to_node(hwif->drives[0].hwif->pci_dev->bus));
|
||||
hwif_to_node(hwif->drives[0].hwif));
|
||||
if (!hwgroup)
|
||||
goto out_up;
|
||||
|
||||
|
|
|
@ -169,7 +169,8 @@ enum ib_cm_rej_reason {
|
|||
IB_CM_REJ_INVALID_ALT_TRAFFIC_CLASS = __constant_htons(21),
|
||||
IB_CM_REJ_INVALID_ALT_HOP_LIMIT = __constant_htons(22),
|
||||
IB_CM_REJ_INVALID_ALT_PACKET_RATE = __constant_htons(23),
|
||||
IB_CM_REJ_PORT_REDIRECT = __constant_htons(24),
|
||||
IB_CM_REJ_PORT_CM_REDIRECT = __constant_htons(24),
|
||||
IB_CM_REJ_PORT_REDIRECT = __constant_htons(25),
|
||||
IB_CM_REJ_INVALID_MTU = __constant_htons(26),
|
||||
IB_CM_REJ_INSUFFICIENT_RESP_RESOURCES = __constant_htons(27),
|
||||
IB_CM_REJ_CONSUMER_DEFINED = __constant_htons(28),
|
||||
|
|
|
@ -600,9 +600,10 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
|
||||
ipoib_mcast_send(dev, (union ib_gid *) (phdr->hwaddr + 4), skb);
|
||||
} else {
|
||||
/* unicast GID -- should be ARP reply */
|
||||
/* unicast GID -- should be ARP or RARP reply */
|
||||
|
||||
if (be16_to_cpup((u16 *) skb->data) != ETH_P_ARP) {
|
||||
if ((be16_to_cpup((__be16 *) skb->data) != ETH_P_ARP) &&
|
||||
(be16_to_cpup((__be16 *) skb->data) != ETH_P_RARP)) {
|
||||
ipoib_warn(priv, "Unicast, no %s: type %04x, QPN %06x "
|
||||
IPOIB_GID_FMT "\n",
|
||||
skb->dst ? "neigh" : "dst",
|
||||
|
|
|
@ -1650,7 +1650,7 @@ static void __exit icn_exit(void)
|
|||
{
|
||||
isdn_ctrl cmd;
|
||||
icn_card *card = cards;
|
||||
icn_card *last;
|
||||
icn_card *last, *tmpcard;
|
||||
int i;
|
||||
unsigned long flags;
|
||||
|
||||
|
@ -1670,8 +1670,9 @@ static void __exit icn_exit(void)
|
|||
for (i = 0; i < ICN_BCH; i++)
|
||||
icn_free_queue(card, i);
|
||||
}
|
||||
card = card->next;
|
||||
tmpcard = card->next;
|
||||
spin_unlock_irqrestore(&card->lock, flags);
|
||||
card = tmpcard;
|
||||
}
|
||||
card = cards;
|
||||
cards = NULL;
|
||||
|
|
|
@ -818,8 +818,7 @@ int bitmap_unplug(struct bitmap *bitmap)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void bitmap_set_memory_bits(struct bitmap *bitmap, sector_t offset,
|
||||
unsigned long sectors, int in_sync);
|
||||
static void bitmap_set_memory_bits(struct bitmap *bitmap, sector_t offset);
|
||||
/* * bitmap_init_from_disk -- called at bitmap_create time to initialize
|
||||
* the in-memory bitmap from the on-disk bitmap -- also, sets up the
|
||||
* memory mapping of the bitmap file
|
||||
|
@ -828,7 +827,7 @@ static void bitmap_set_memory_bits(struct bitmap *bitmap, sector_t offset,
|
|||
* previously kicked from the array, we mark all the bits as
|
||||
* 1's in order to cause a full resync.
|
||||
*/
|
||||
static int bitmap_init_from_disk(struct bitmap *bitmap, int in_sync)
|
||||
static int bitmap_init_from_disk(struct bitmap *bitmap)
|
||||
{
|
||||
unsigned long i, chunks, index, oldindex, bit;
|
||||
struct page *page = NULL, *oldpage = NULL;
|
||||
|
@ -929,8 +928,7 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, int in_sync)
|
|||
}
|
||||
if (test_bit(bit, page_address(page))) {
|
||||
/* if the disk bit is set, set the memory bit */
|
||||
bitmap_set_memory_bits(bitmap,
|
||||
i << CHUNK_BLOCK_SHIFT(bitmap), 1, in_sync);
|
||||
bitmap_set_memory_bits(bitmap, i << CHUNK_BLOCK_SHIFT(bitmap));
|
||||
bit_cnt++;
|
||||
}
|
||||
}
|
||||
|
@ -1426,35 +1424,53 @@ void bitmap_close_sync(struct bitmap *bitmap)
|
|||
}
|
||||
}
|
||||
|
||||
static void bitmap_set_memory_bits(struct bitmap *bitmap, sector_t offset,
|
||||
unsigned long sectors, int in_sync)
|
||||
static void bitmap_set_memory_bits(struct bitmap *bitmap, sector_t offset)
|
||||
{
|
||||
/* For each chunk covered by any of these sectors, set the
|
||||
* counter to 1 and set resync_needed unless in_sync. They should all
|
||||
* counter to 1 and set resync_needed. They should all
|
||||
* be 0 at this point
|
||||
*/
|
||||
while (sectors) {
|
||||
int secs;
|
||||
bitmap_counter_t *bmc;
|
||||
spin_lock_irq(&bitmap->lock);
|
||||
bmc = bitmap_get_counter(bitmap, offset, &secs, 1);
|
||||
if (!bmc) {
|
||||
spin_unlock_irq(&bitmap->lock);
|
||||
return;
|
||||
}
|
||||
if (! *bmc) {
|
||||
struct page *page;
|
||||
*bmc = 1 | (in_sync? 0 : NEEDED_MASK);
|
||||
bitmap_count_page(bitmap, offset, 1);
|
||||
page = filemap_get_page(bitmap, offset >> CHUNK_BLOCK_SHIFT(bitmap));
|
||||
set_page_attr(bitmap, page, BITMAP_PAGE_CLEAN);
|
||||
}
|
||||
|
||||
int secs;
|
||||
bitmap_counter_t *bmc;
|
||||
spin_lock_irq(&bitmap->lock);
|
||||
bmc = bitmap_get_counter(bitmap, offset, &secs, 1);
|
||||
if (!bmc) {
|
||||
spin_unlock_irq(&bitmap->lock);
|
||||
if (sectors > secs)
|
||||
sectors -= secs;
|
||||
else
|
||||
sectors = 0;
|
||||
return;
|
||||
}
|
||||
if (! *bmc) {
|
||||
struct page *page;
|
||||
*bmc = 1 | NEEDED_MASK;
|
||||
bitmap_count_page(bitmap, offset, 1);
|
||||
page = filemap_get_page(bitmap, offset >> CHUNK_BLOCK_SHIFT(bitmap));
|
||||
set_page_attr(bitmap, page, BITMAP_PAGE_CLEAN);
|
||||
}
|
||||
spin_unlock_irq(&bitmap->lock);
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* flush out any pending updates
|
||||
*/
|
||||
void bitmap_flush(mddev_t *mddev)
|
||||
{
|
||||
struct bitmap *bitmap = mddev->bitmap;
|
||||
int sleep;
|
||||
|
||||
if (!bitmap) /* there was no bitmap */
|
||||
return;
|
||||
|
||||
/* run the daemon_work three time to ensure everything is flushed
|
||||
* that can be
|
||||
*/
|
||||
sleep = bitmap->daemon_sleep;
|
||||
bitmap->daemon_sleep = 0;
|
||||
bitmap_daemon_work(bitmap);
|
||||
bitmap_daemon_work(bitmap);
|
||||
bitmap_daemon_work(bitmap);
|
||||
bitmap->daemon_sleep = sleep;
|
||||
bitmap_update_sb(bitmap);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1565,7 +1581,8 @@ int bitmap_create(mddev_t *mddev)
|
|||
|
||||
/* now that we have some pages available, initialize the in-memory
|
||||
* bitmap from the on-disk bitmap */
|
||||
err = bitmap_init_from_disk(bitmap, mddev->recovery_cp == MaxSector);
|
||||
err = bitmap_init_from_disk(bitmap);
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue