2005-04-17 02:20:36 +04:00
/*
2006-10-04 01:01:26 +04:00
* include / asm - m68knommu / processor . h
2005-04-17 02:20:36 +04:00
*
* Copyright ( C ) 1995 Hamish Macdonald
*/
# ifndef __ASM_M68K_PROCESSOR_H
# define __ASM_M68K_PROCESSOR_H
/*
* Default implementation of macro that returns current
* instruction pointer ( " program counter " ) .
*/
# define current_text_addr() ({ __label__ _l; _l: &&_l;})
2006-07-08 20:10:29 +04:00
# include <linux/compiler.h>
2005-04-17 02:20:36 +04:00
# include <linux/threads.h>
# include <asm/types.h>
# include <asm/segment.h>
# include <asm/fpu.h>
# include <asm/ptrace.h>
# include <asm/current.h>
2005-11-02 07:42:03 +03:00
static inline unsigned long rdusp ( void )
2005-04-17 02:20:36 +04:00
{
# ifdef CONFIG_COLDFIRE
extern unsigned int sw_usp ;
return ( sw_usp ) ;
# else
unsigned long usp ;
__asm__ __volatile__ ( " move %/usp,%0 " : " =a " ( usp ) ) ;
return usp ;
# endif
}
2005-11-02 07:42:03 +03:00
static inline void wrusp ( unsigned long usp )
2005-04-17 02:20:36 +04:00
{
# ifdef CONFIG_COLDFIRE
extern unsigned int sw_usp ;
sw_usp = usp ;
# else
__asm__ __volatile__ ( " move %0,%/usp " : : " a " ( usp ) ) ;
# endif
}
/*
* User space process size : 3.75 GB . This is hardcoded into a few places ,
* so don ' t change it unless you know what you are doing .
*/
# define TASK_SIZE (0xF0000000UL)
/*
* This decides where the kernel will search for a free chunk of vm
* space during mmap ' s . We won ' t be using it
*/
# define TASK_UNMAPPED_BASE 0
/*
* if you change this structure , you must change the code and offsets
* in m68k / machasm . S
*/
struct thread_struct {
unsigned long ksp ; /* kernel stack pointer */
unsigned long usp ; /* user stack pointer */
unsigned short sr ; /* saved status register */
unsigned short fs ; /* saved fs (sfc, dfc) */
unsigned long crp [ 2 ] ; /* cpu root pointer */
unsigned long esp0 ; /* points to SR of stack frame */
unsigned long fp [ 8 * 3 ] ;
unsigned long fpcntl [ 3 ] ; /* fp control regs */
unsigned char fpstate [ FPSTATESIZE ] ; /* floating point state */
} ;
# define INIT_THREAD { \
sizeof ( init_stack ) + ( unsigned long ) init_stack , 0 , \
PS_S , __KERNEL_DS , \
{ 0 , 0 } , 0 , { 0 , } , { 0 , 0 , 0 } , { 0 , } , \
}
2006-06-26 05:01:32 +04:00
/*
* Coldfire stacks need to be re - aligned on trap exit , conventional
* 68 k can handle this case cleanly .
*/
# if defined(CONFIG_COLDFIRE)
# define reformat(_regs) do { (_regs)->format = 0x4; } while(0)
# else
# define reformat(_regs) do { } while (0)
# endif
2005-04-17 02:20:36 +04:00
/*
* Do necessary setup to start up a newly executed thread .
*
* pass the data segment into user programs if it exists ,
* it can ' t hurt anything as far as I can tell
*/
2006-06-26 05:01:32 +04:00
# define start_thread(_regs, _pc, _usp) \
do { \
set_fs ( USER_DS ) ; /* reads from user space */ \
( _regs ) - > pc = ( _pc ) ; \
( ( struct switch_stack * ) ( _regs ) ) [ - 1 ] . a6 = 0 ; \
reformat ( _regs ) ; \
if ( current - > mm ) \
( _regs ) - > d5 = current - > mm - > start_data ; \
( _regs ) - > sr & = ~ 0x2000 ; \
wrusp ( _usp ) ; \
2005-04-17 02:20:36 +04:00
} while ( 0 )
/* Forward declaration, a strange C thing */
struct task_struct ;
/* Free all resources held by a thread. */
static inline void release_thread ( struct task_struct * dead_task )
{
}
/* Prepare to copy thread state - unlazy all lazy status */
# define prepare_to_copy(tsk) do { } while (0)
extern int kernel_thread ( int ( * fn ) ( void * ) , void * arg , unsigned long flags ) ;
/*
* Free current thread data structures etc . .
*/
static inline void exit_thread ( void )
{
}
unsigned long thread_saved_pc ( struct task_struct * tsk ) ;
unsigned long get_wchan ( struct task_struct * p ) ;
# define KSTK_EIP(tsk) \
( { \
unsigned long eip = 0 ; \
if ( ( tsk ) - > thread . esp0 > PAGE_SIZE & & \
( virt_addr_valid ( ( tsk ) - > thread . esp0 ) ) ) \
eip = ( ( struct pt_regs * ) ( tsk ) - > thread . esp0 ) - > pc ; \
eip ; } )
# define KSTK_ESP(tsk) ((tsk) == current ? rdusp() : (tsk)->thread.usp)
2006-07-08 20:10:29 +04:00
# define cpu_relax() barrier()
2005-04-17 02:20:36 +04:00
# endif