2008-01-28 16:29:21 +01:00
/*
2005-04-16 15:20:36 -07:00
* linux / arch / cris / kernel / process . c
*
* Copyright ( C ) 1995 Linus Torvalds
* Copyright ( C ) 2000 - 2002 Axis Communications AB
*
* Authors : Bjorn Wesen ( bjornw @ axis . com )
*
*/
/*
* This file handles the architecture - dependent parts of process handling . .
*/
2011-07-26 16:09:06 -07:00
# include <linux/atomic.h>
2005-04-16 15:20:36 -07:00
# include <asm/pgtable.h>
# include <asm/uaccess.h>
# include <asm/irq.h>
# include <linux/module.h>
# include <linux/spinlock.h>
# include <linux/init_task.h>
# include <linux/sched.h>
# include <linux/fs.h>
# include <linux/user.h>
# include <linux/elfcore.h>
# include <linux/mqueue.h>
2005-07-26 11:32:34 -06:00
# include <linux/reboot.h>
2012-08-22 17:27:34 +02:00
# include <linux/rcupdate.h>
2005-04-16 15:20:36 -07:00
//#define DEBUG
/*
* The hlt_counter , disable_hlt and enable_hlt is just here as a hook if
* there would ever be a halt sequence ( for power save when idle ) with
* some largish delay when halting or resuming * and * a driver that can ' t
* afford that delay . The hlt_counter would then be checked before
* executing the halt sequence , and the driver marks the unhaltable
* region by enable_hlt / disable_hlt .
*/
2005-07-27 11:44:43 -07:00
int cris_hlt_counter = 0 ;
2005-04-16 15:20:36 -07:00
void disable_hlt ( void )
{
2005-07-27 11:44:43 -07:00
cris_hlt_counter + + ;
2005-04-16 15:20:36 -07:00
}
EXPORT_SYMBOL ( disable_hlt ) ;
void enable_hlt ( void )
{
2005-07-27 11:44:43 -07:00
cris_hlt_counter - - ;
2005-04-16 15:20:36 -07:00
}
EXPORT_SYMBOL ( enable_hlt ) ;
/*
* The following aren ' t currently used .
*/
void ( * pm_idle ) ( void ) ;
2007-11-14 17:00:59 -08:00
extern void default_idle ( void ) ;
void ( * pm_power_off ) ( void ) ;
EXPORT_SYMBOL ( pm_power_off ) ;
2005-04-16 15:20:36 -07:00
/*
* The idle thread . There ' s no useful work to be
* done , so just try to conserve power and have a
* low exit latency ( ie sit in a loop waiting for
* somebody to say that they ' d like to reschedule )
*/
2008-01-28 16:29:21 +01:00
2005-04-16 15:20:36 -07:00
void cpu_idle ( void )
{
/* endless idle loop with no priority at all */
while ( 1 ) {
2012-08-22 17:27:34 +02:00
rcu_idle_enter ( ) ;
2005-04-16 15:20:36 -07:00
while ( ! need_resched ( ) ) {
2005-07-27 11:44:43 -07:00
void ( * idle ) ( void ) ;
/*
* Mark this as an RCU critical section so that
* synchronize_kernel ( ) in the unload path waits
* for our completion .
*/
idle = pm_idle ;
2005-04-16 15:20:36 -07:00
if ( ! idle )
idle = default_idle ;
idle ( ) ;
}
2012-08-22 17:27:34 +02:00
rcu_idle_exit ( ) ;
2011-03-21 12:33:18 +01:00
schedule_preempt_disabled ( ) ;
2005-04-16 15:20:36 -07:00
}
}
void hard_reset_now ( void ) ;
2005-07-26 11:32:34 -06:00
void machine_restart ( char * cmd )
2005-04-16 15:20:36 -07:00
{
hard_reset_now ( ) ;
}
/*
* Similar to machine_power_off , but don ' t shut off power . Add code
* here to freeze the system for e . g . post - mortem debug purpose when
* possible . This halt has nothing to do with the idle halt .
*/
void machine_halt ( void )
{
}
/* If or when software power-off is implemented, add code here. */
void machine_power_off ( void )
{
}
/*
* When a process does an " exec " , machine state like FPU and debug
* registers need to be reset . This is a hook function for that .
* Currently we don ' t have any such state to reset , so this is empty .
*/
void flush_thread ( void )
{
}
/* Fill in the fpu structure for a core dump. */
int dump_fpu ( struct pt_regs * regs , elf_fpregset_t * fpu )
{
return 0 ;
}