Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/aoe-2.6
[sfrench/cifs-2.6.git] / arch / h8300 / kernel / process.c
index 27f1fce64ce465026ee90c0cffd2e25717843075..16ccddc69c2bbb579e97784b0e66913395a67bf9 100644 (file)
 #include <asm/setup.h>
 #include <asm/pgtable.h>
 
+void (*pm_power_off)(void) = NULL;
+EXPORT_SYMBOL(pm_power_off);
+
 asmlinkage void ret_from_fork(void);
 
 /*
  * The idle loop on an H8/300..
  */
 #if !defined(CONFIG_H8300H_SIM) && !defined(CONFIG_H8S_SIM)
-void default_idle(void)
+static void default_idle(void)
 {
-       while(1) {
-               if (!need_resched()) {
-                       local_irq_enable();
-                       __asm__("sleep");
-                       local_irq_disable();
-               }
-               schedule();
-       }
+       local_irq_disable();
+       if (!need_resched()) {
+               local_irq_enable();
+               /* XXX: race here! What if need_resched() gets set now? */
+               __asm__("sleep");
+       } else
+               local_irq_enable();
 }
 #else
-void default_idle(void)
+static void default_idle(void)
 {
-       while(1) {
-               if (need_resched())
-                       schedule();
-       }
+       cpu_relax();
 }
 #endif
 void (*idle)(void) = default_idle;
@@ -81,7 +80,13 @@ void (*idle)(void) = default_idle;
  */
 void cpu_idle(void)
 {
-       idle();
+       while (1) {
+               while (!need_resched())
+                       idle();
+               preempt_enable_no_resched();
+               schedule();
+               preempt_disable();
+       }
 }
 
 void machine_restart(char * __unused)
@@ -193,7 +198,7 @@ int copy_thread(int nr, unsigned long clone_flags,
 {
        struct pt_regs * childregs;
 
-       childregs = ((struct pt_regs *) (THREAD_SIZE + (unsigned long) p->thread_info)) - 1;
+       childregs = (struct pt_regs *) (THREAD_SIZE + task_stack_page(p)) - 1;
 
        *childregs = *regs;
        childregs->retpc = (unsigned long) ret_from_fork;
@@ -205,34 +210,6 @@ int copy_thread(int nr, unsigned long clone_flags,
        return 0;
 }
 
-/*
- * fill in the user structure for a core dump..
- */
-void dump_thread(struct pt_regs * regs, struct user * dump)
-{
-/* changed the size calculations - should hopefully work better. lbt */
-       dump->magic = CMAGIC;
-       dump->start_code = 0;
-       dump->start_stack = rdusp() & ~(PAGE_SIZE - 1);
-       dump->u_tsize = ((unsigned long) current->mm->end_code) >> PAGE_SHIFT;
-       dump->u_dsize = ((unsigned long) (current->mm->brk +
-                                         (PAGE_SIZE-1))) >> PAGE_SHIFT;
-       dump->u_dsize -= dump->u_tsize;
-       dump->u_ssize = 0;
-
-       dump->u_ar0 = (struct user_regs_struct *)(((int)(&dump->regs)) -((int)(dump)));
-       dump->regs.er0 = regs->er0;
-       dump->regs.er1 = regs->er1;
-       dump->regs.er2 = regs->er2;
-       dump->regs.er3 = regs->er3;
-       dump->regs.er4 = regs->er4;
-       dump->regs.er5 = regs->er5;
-       dump->regs.er6 = regs->er6;
-       dump->regs.orig_er0 = regs->orig_er0;
-       dump->regs.ccr = regs->ccr;
-       dump->regs.pc  = regs->pc;
-}
-
 /*
  * sys_execve() executes a new program.
  */