| 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 |