| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  * include/asm-m68k/processor.h | 
 | 3 |  * | 
 | 4 |  * Copyright (C) 1995 Hamish Macdonald | 
 | 5 |  */ | 
 | 6 |  | 
 | 7 | #ifndef __ASM_M68K_PROCESSOR_H | 
 | 8 | #define __ASM_M68K_PROCESSOR_H | 
 | 9 |  | 
 | 10 | /* | 
 | 11 |  * Default implementation of macro that returns current | 
 | 12 |  * instruction pointer ("program counter"). | 
 | 13 |  */ | 
 | 14 | #define current_text_addr() ({ __label__ _l; _l: &&_l;}) | 
 | 15 |  | 
| Al Viro | abd0375 | 2005-11-13 16:06:58 -0800 | [diff] [blame] | 16 | #include <linux/thread_info.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 17 | #include <asm/segment.h> | 
 | 18 | #include <asm/fpu.h> | 
 | 19 | #include <asm/ptrace.h> | 
 | 20 |  | 
 | 21 | static inline unsigned long rdusp(void) | 
 | 22 | { | 
 | 23 | 	unsigned long usp; | 
 | 24 |  | 
 | 25 | 	__asm__ __volatile__("move %/usp,%0" : "=a" (usp)); | 
 | 26 | 	return usp; | 
 | 27 | } | 
 | 28 |  | 
 | 29 | static inline void wrusp(unsigned long usp) | 
 | 30 | { | 
 | 31 | 	__asm__ __volatile__("move %0,%/usp" : : "a" (usp)); | 
 | 32 | } | 
 | 33 |  | 
 | 34 | /* | 
 | 35 |  * User space process size: 3.75GB. This is hardcoded into a few places, | 
 | 36 |  * so don't change it unless you know what you are doing. | 
 | 37 |  */ | 
 | 38 | #ifndef CONFIG_SUN3 | 
 | 39 | #define TASK_SIZE	(0xF0000000UL) | 
 | 40 | #else | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 41 | #define TASK_SIZE	(0x0E000000UL) | 
 | 42 | #endif | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 43 |  | 
| David Howells | 922a70d | 2008-02-08 04:19:26 -0800 | [diff] [blame] | 44 | #ifdef __KERNEL__ | 
 | 45 | #define STACK_TOP	TASK_SIZE | 
 | 46 | #define STACK_TOP_MAX	STACK_TOP | 
 | 47 | #endif | 
 | 48 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 49 | /* This decides where the kernel will search for a free chunk of vm | 
 | 50 |  * space during mmap's. | 
 | 51 |  */ | 
 | 52 | #ifndef CONFIG_SUN3 | 
 | 53 | #define TASK_UNMAPPED_BASE	0xC0000000UL | 
 | 54 | #else | 
 | 55 | #define TASK_UNMAPPED_BASE	0x0A000000UL | 
 | 56 | #endif | 
 | 57 | #define TASK_UNMAPPED_ALIGN(addr, off)	PAGE_ALIGN(addr) | 
 | 58 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 59 | struct thread_struct { | 
 | 60 | 	unsigned long  ksp;		/* kernel stack pointer */ | 
 | 61 | 	unsigned long  usp;		/* user stack pointer */ | 
 | 62 | 	unsigned short sr;		/* saved status register */ | 
 | 63 | 	unsigned short fs;		/* saved fs (sfc, dfc) */ | 
 | 64 | 	unsigned long  crp[2];		/* cpu root pointer */ | 
 | 65 | 	unsigned long  esp0;		/* points to SR of stack frame */ | 
 | 66 | 	unsigned long  faddr;		/* info about last fault */ | 
 | 67 | 	int            signo, code; | 
 | 68 | 	unsigned long  fp[8*3]; | 
 | 69 | 	unsigned long  fpcntl[3];	/* fp control regs */ | 
 | 70 | 	unsigned char  fpstate[FPSTATESIZE];  /* floating point state */ | 
| Al Viro | abd0375 | 2005-11-13 16:06:58 -0800 | [diff] [blame] | 71 | 	struct thread_info info; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 72 | }; | 
 | 73 |  | 
 | 74 | #define INIT_THREAD  {							\ | 
| Roman Zippel | f6c4192 | 2006-06-23 02:04:55 -0700 | [diff] [blame] | 75 | 	.ksp	= sizeof(init_stack) + (unsigned long) init_stack,	\ | 
 | 76 | 	.sr	= PS_S,							\ | 
 | 77 | 	.fs	= __KERNEL_DS,						\ | 
 | 78 | 	.info	= INIT_THREAD_INFO(init_task),				\ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 79 | } | 
 | 80 |  | 
 | 81 | /* | 
 | 82 |  * Do necessary setup to start up a newly executed thread. | 
 | 83 |  */ | 
 | 84 | static inline void start_thread(struct pt_regs * regs, unsigned long pc, | 
 | 85 | 				unsigned long usp) | 
 | 86 | { | 
 | 87 | 	/* reads from user space */ | 
 | 88 | 	set_fs(USER_DS); | 
 | 89 |  | 
 | 90 | 	regs->pc = pc; | 
 | 91 | 	regs->sr &= ~0x2000; | 
 | 92 | 	wrusp(usp); | 
 | 93 | } | 
 | 94 |  | 
 | 95 | /* Forward declaration, a strange C thing */ | 
 | 96 | struct task_struct; | 
 | 97 |  | 
 | 98 | /* Free all resources held by a thread. */ | 
 | 99 | static inline void release_thread(struct task_struct *dead_task) | 
 | 100 | { | 
 | 101 | } | 
 | 102 |  | 
 | 103 | /* Prepare to copy thread state - unlazy all lazy status */ | 
 | 104 | #define prepare_to_copy(tsk)	do { } while (0) | 
 | 105 |  | 
 | 106 | extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); | 
 | 107 |  | 
 | 108 | /* | 
 | 109 |  * Free current thread data structures etc.. | 
 | 110 |  */ | 
 | 111 | static inline void exit_thread(void) | 
 | 112 | { | 
 | 113 | } | 
 | 114 |  | 
 | 115 | extern unsigned long thread_saved_pc(struct task_struct *tsk); | 
 | 116 |  | 
 | 117 | unsigned long get_wchan(struct task_struct *p); | 
 | 118 |  | 
 | 119 | #define	KSTK_EIP(tsk)	\ | 
 | 120 |     ({			\ | 
 | 121 | 	unsigned long eip = 0;	 \ | 
 | 122 | 	if ((tsk)->thread.esp0 > PAGE_SIZE && \ | 
 | 123 | 	    (virt_addr_valid((tsk)->thread.esp0))) \ | 
 | 124 | 	      eip = ((struct pt_regs *) (tsk)->thread.esp0)->pc; \ | 
 | 125 | 	eip; }) | 
 | 126 | #define	KSTK_ESP(tsk)	((tsk) == current ? rdusp() : (tsk)->thread.usp) | 
 | 127 |  | 
 | 128 | #define cpu_relax()	barrier() | 
 | 129 |  | 
 | 130 | #endif |