git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git]
/
arch
/
sparc
/
kernel
/
process.c
diff --git
a/arch/sparc/kernel/process.c
b/arch/sparc/kernel/process.c
index
277883d
..
118cac8
100644
(file)
--- a/
arch/sparc/kernel/process.c
+++ b/
arch/sparc/kernel/process.c
@@
-45,7
+45,7
@@
/*
* Power management idle function
/*
* Power management idle function
- * Set in pm platform drivers
+ * Set in pm platform drivers
(apc.c and pmc.c)
*/
void (*pm_idle)(void);
*/
void (*pm_idle)(void);
@@
-54,7
+54,7
@@
void (*pm_idle)(void);
* This is done via auxio, but could be used as a fallback
* handler when auxio is not present-- unused for now...
*/
* This is done via auxio, but could be used as a fallback
* handler when auxio is not present-- unused for now...
*/
-void (*pm_power_off)(void);
+void (*pm_power_off)(void)
= machine_power_off
;
/*
* sysctl - toggle power-off restriction for serial console
/*
* sysctl - toggle power-off restriction for serial console
@@
-67,13
+67,6
@@
extern void fpsave(unsigned long *, unsigned long *, void *, unsigned long *);
struct task_struct *last_task_used_math = NULL;
struct thread_info *current_set[NR_CPUS];
struct task_struct *last_task_used_math = NULL;
struct thread_info *current_set[NR_CPUS];
-/*
- * default_idle is new in 2.5. XXX Review, currently stolen from sparc64.
- */
-void default_idle(void)
-{
-}
-
#ifndef CONFIG_SMP
#define SUN4C_FAULT_HIGH 100
#ifndef CONFIG_SMP
#define SUN4C_FAULT_HIGH 100
@@
-81,13
+74,8
@@
void default_idle(void)
/*
* the idle loop on a Sparc... ;)
*/
/*
* the idle loop on a Sparc... ;)
*/
-
int
cpu_idle(void)
+
void
cpu_idle(void)
{
{
- int ret = -EPERM;
-
- if (current->pid != 0)
- goto out;
-
/* endless idle loop with no priority at all */
for (;;) {
if (ARCH_SUN4C_SUN4) {
/* endless idle loop with no priority at all */
for (;;) {
if (ARCH_SUN4C_SUN4) {
@@
-97,12
+85,11
@@
int cpu_idle(void)
static unsigned long fps;
unsigned long now;
unsigned long faults;
static unsigned long fps;
unsigned long now;
unsigned long faults;
- unsigned long flags;
extern unsigned long sun4c_kernel_faults;
extern void sun4c_grow_kernel_ring(void);
extern unsigned long sun4c_kernel_faults;
extern void sun4c_grow_kernel_ring(void);
- local_irq_
save(flags
);
+ local_irq_
disable(
);
now = jiffies;
count -= (now - last_jiffies);
last_jiffies = now;
now = jiffies;
count -= (now - last_jiffies);
last_jiffies = now;
@@
-118,33
+105,37
@@
int cpu_idle(void)
sun4c_grow_kernel_ring();
}
}
sun4c_grow_kernel_ring();
}
}
- local_irq_
restore(flags
);
+ local_irq_
enable(
);
}
}
- while((!need_resched()) && pm_idle) {
- (*pm_idle)(); /* XXX Huh? On sparc?! */
+ if (pm_idle) {
+ while (!need_resched())
+ (*pm_idle)();
+ } else {
+ while (!need_resched())
+ cpu_relax();
}
}
-
+ preempt_enable_no_resched();
schedule();
schedule();
+ preempt_disable();
check_pgt_cache();
}
check_pgt_cache();
}
- ret = 0;
-out:
- return ret;
}
#else
/* This is being executed in task 0 'user space'. */
}
#else
/* This is being executed in task 0 'user space'. */
-
int
cpu_idle(void)
+
void
cpu_idle(void)
{
{
+ set_thread_flag(TIF_POLLING_NRFLAG);
/* endless idle loop with no priority at all */
while(1) {
/* endless idle loop with no priority at all */
while(1) {
- if(need_resched()) {
- schedule();
- check_pgt_cache();
- }
- barrier(); /* or else gcc optimizes... */
+ while (!need_resched())
+ cpu_relax();
+ preempt_enable_no_resched();
+ schedule();
+ preempt_disable();
+ check_pgt_cache();
}
}
}
}
@@
-166,8
+157,6
@@
void machine_halt(void)
panic("Halt failed!");
}
panic("Halt failed!");
}
-EXPORT_SYMBOL(machine_halt);
-
void machine_restart(char * cmd)
{
char *p;
void machine_restart(char * cmd)
{
char *p;
@@
-188,8
+177,6
@@
void machine_restart(char * cmd)
panic("Reboot failed!");
}
panic("Reboot failed!");
}
-EXPORT_SYMBOL(machine_restart);
-
void machine_power_off(void)
{
#ifdef CONFIG_SUN_AUXIO
void machine_power_off(void)
{
#ifdef CONFIG_SUN_AUXIO
@@
-199,9
+186,7
@@
void machine_power_off(void)
machine_halt();
}
machine_halt();
}
-EXPORT_SYMBOL(machine_power_off);
-
-static spinlock_t sparc_backtrace_lock = SPIN_LOCK_UNLOCKED;
+static DEFINE_SPINLOCK(sparc_backtrace_lock);
void __show_backtrace(unsigned long fp)
{
void __show_backtrace(unsigned long fp)
{
@@
-317,7
+302,7
@@
void show_stack(struct task_struct *tsk, unsigned long *_ksp)
int count = 0;
if (tsk != NULL)
int count = 0;
if (tsk != NULL)
- task_base = (unsigned long) t
sk->thread_info
;
+ task_base = (unsigned long) t
ask_stack_page(tsk)
;
else
task_base = (unsigned long) current_thread_info();
else
task_base = (unsigned long) current_thread_info();
@@
-336,12
+321,23
@@
void show_stack(struct task_struct *tsk, unsigned long *_ksp)
printk("\n");
}
printk("\n");
}
+void dump_stack(void)
+{
+ unsigned long *ksp;
+
+ __asm__ __volatile__("mov %%fp, %0"
+ : "=r" (ksp));
+ show_stack(current, ksp);
+}
+
+EXPORT_SYMBOL(dump_stack);
+
/*
* Note: sparc64 has a pretty intricated thread_saved_pc, check it out.
*/
unsigned long thread_saved_pc(struct task_struct *tsk)
{
/*
* Note: sparc64 has a pretty intricated thread_saved_pc, check it out.
*/
unsigned long thread_saved_pc(struct task_struct *tsk)
{
- return t
sk->thread_info
->kpc;
+ return t
ask_thread_info(tsk)
->kpc;
}
/*
}
/*
@@
-396,7
+392,7
@@
void flush_thread(void)
/* We must fixup kregs as well. */
/* XXX This was not fixed for ti for a while, worked. Unused? */
current->thread.kregs = (struct pt_regs *)
/* We must fixup kregs as well. */
/* XXX This was not fixed for ti for a while, worked. Unused? */
current->thread.kregs = (struct pt_regs *)
- (
(char *)current->thread_info
+ (THREAD_SIZE - TRACEREG_SZ));
+ (
task_stack_page(current)
+ (THREAD_SIZE - TRACEREG_SZ));
}
}
}
}
@@
-435,8
+431,6
@@
asmlinkage int sparc_do_fork(unsigned long clone_flags,
{
unsigned long parent_tid_ptr, child_tid_ptr;
{
unsigned long parent_tid_ptr, child_tid_ptr;
- clone_flags &= ~CLONE_IDLETASK;
-
parent_tid_ptr = regs->u_regs[UREG_I2];
child_tid_ptr = regs->u_regs[UREG_I4];
parent_tid_ptr = regs->u_regs[UREG_I2];
child_tid_ptr = regs->u_regs[UREG_I4];
@@
-465,7
+459,7
@@
int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
unsigned long unused,
struct task_struct *p, struct pt_regs *regs)
{
unsigned long unused,
struct task_struct *p, struct pt_regs *regs)
{
- struct thread_info *ti =
p->thread_info
;
+ struct thread_info *ti =
task_thread_info(p)
;
struct pt_regs *childregs;
char *new_stack;
struct pt_regs *childregs;
char *new_stack;
@@
-482,15
+476,13
@@
int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
#endif
}
#endif
}
- p->set_child_tid = p->clear_child_tid = NULL;
-
/*
* p->thread_info new_stack childregs
* ! ! ! {if(PSR_PS) }
* V V (stk.fr.) V (pt_regs) { (stk.fr.) }
* +----- - - - - - ------+===========+============={+==========}+
*/
/*
* p->thread_info new_stack childregs
* ! ! ! {if(PSR_PS) }
* V V (stk.fr.) V (pt_regs) { (stk.fr.) }
* +----- - - - - - ------+===========+============={+==========}+
*/
- new_stack =
(char*)ti
+ THREAD_SIZE;
+ new_stack =
task_stack_page(p)
+ THREAD_SIZE;
if (regs->psr & PSR_PS)
new_stack -= STACKFRAME_SZ;
new_stack -= STACKFRAME_SZ + TRACEREG_SZ;
if (regs->psr & PSR_PS)
new_stack -= STACKFRAME_SZ;
new_stack -= STACKFRAME_SZ + TRACEREG_SZ;
@@
-556,6
+548,11
@@
int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
}
}
}
}
+#ifdef CONFIG_SMP
+ /* FPU must be disabled on SMP. */
+ childregs->psr &= ~PSR_EF;
+#endif
+
/* Set the return value for the child. */
childregs->u_regs[UREG_I0] = current->pid;
childregs->u_regs[UREG_I1] = 1;
/* Set the return value for the child. */
childregs->u_regs[UREG_I0] = current->pid;
childregs->u_regs[UREG_I1] = 1;
@@
-606,7
+603,7
@@
void dump_thread(struct pt_regs * regs, struct user * dump)
*/
int dump_fpu (struct pt_regs * regs, elf_fpregset_t * fpregs)
{
*/
int dump_fpu (struct pt_regs * regs, elf_fpregset_t * fpregs)
{
- if (
current->used_math == 0
) {
+ if (
used_math()
) {
memset(fpregs, 0, sizeof(*fpregs));
fpregs->pr_q_entrysize = 8;
return 1;
memset(fpregs, 0, sizeof(*fpregs));
fpregs->pr_q_entrysize = 8;
return 1;
@@
-628,7
+625,7
@@
int dump_fpu (struct pt_regs * regs, elf_fpregset_t * fpregs)
¤t->thread.fpqueue[0], ¤t->thread.fpqdepth);
if (regs != NULL) {
regs->psr &= ~(PSR_EF);
¤t->thread.fpqueue[0], ¤t->thread.fpqdepth);
if (regs != NULL) {
regs->psr &= ~(PSR_EF);
- last_task_used_math =
0
;
+ last_task_used_math =
NULL
;
}
}
#endif
}
}
#endif
@@
-672,8
+669,11
@@
asmlinkage int sparc_execve(struct pt_regs *regs)
(char __user * __user *)regs->u_regs[base + UREG_I2],
regs);
putname(filename);
(char __user * __user *)regs->u_regs[base + UREG_I2],
regs);
putname(filename);
- if (error == 0)
+ if (error == 0) {
+ task_lock(current);
current->ptrace &= ~PT_DTRACE;
current->ptrace &= ~PT_DTRACE;
+ task_unlock(current);
+ }
out:
return error;
}
out:
return error;
}
@@
-724,7
+724,7
@@
unsigned long get_wchan(struct task_struct *task)
task->state == TASK_RUNNING)
goto out;
task->state == TASK_RUNNING)
goto out;
- fp = task
->thread_info
->ksp + bias;
+ fp = task
_thread_info(task)
->ksp + bias;
do {
/* Bogus frame pointer? */
if (fp < (task_base + sizeof(struct thread_info)) ||
do {
/* Bogus frame pointer? */
if (fp < (task_base + sizeof(struct thread_info)) ||