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 / h8300 / kernel / process.c
index b5f83e9..16ccddc 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)
@@ -90,8 +95,6 @@ void machine_restart(char * __unused)
        __asm__("jmp @@0"); 
 }
 
-EXPORT_SYMBOL(machine_restart);
-
 void machine_halt(void)
 {
        local_irq_disable();
@@ -99,8 +102,6 @@ void machine_halt(void)
        for (;;);
 }
 
-EXPORT_SYMBOL(machine_halt);
-
 void machine_power_off(void)
 {
        local_irq_disable();
@@ -108,8 +109,6 @@ void machine_power_off(void)
        for (;;);
 }
 
-EXPORT_SYMBOL(machine_power_off);
-
 void show_regs(struct pt_regs * regs)
 {
        printk("\nPC: %08lx  Status: %02x",
@@ -199,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;
@@ -211,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.
  */