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 16#include <linux/config.h> 17#include <asm/segment.h> 18#include <asm/fpu.h> 19#include <asm/ptrace.h> 20 21extern inline unsigned long rdusp(void) { 22 unsigned long usp; 23 24 __asm__ __volatile__("move %/usp,%0" : "=a" (usp)); 25 return usp; 26} 27 28extern inline void wrusp(unsigned long usp) { 29 __asm__ __volatile__("move %0,%/usp" : : "a" (usp)); 30} 31 32/* 33 * User space process size: 3.75GB. This is hardcoded into a few places, 34 * so don't change it unless you know what you are doing. 35 */ 36#ifndef CONFIG_SUN3 37#define TASK_SIZE (0xF0000000UL) 38#else 39#ifdef __ASSEMBLY__ 40#define TASK_SIZE (0x0E000000) 41#else 42#define TASK_SIZE (0x0E000000UL) 43#endif 44#endif 45 46/* This decides where the kernel will search for a free chunk of vm 47 * space during mmap's. 48 */ 49#ifndef CONFIG_SUN3 50#define TASK_UNMAPPED_BASE 0xC0000000UL 51#else 52#define TASK_UNMAPPED_BASE 0x0A000000UL 53#endif 54#define TASK_UNMAPPED_ALIGN(addr, off) PAGE_ALIGN(addr) 55 56/* 57 * Bus types 58 */ 59#define EISA_bus 0 60#define MCA_bus 0 61 62/* 63 * if you change this structure, you must change the code and offsets 64 * in m68k/machasm.S 65 */ 66 67struct thread_struct { 68 unsigned long ksp; /* kernel stack pointer */ 69 unsigned long usp; /* user stack pointer */ 70 unsigned short sr; /* saved status register */ 71 unsigned short fs; /* saved fs (sfc, dfc) */ 72 unsigned long crp[2]; /* cpu root pointer */ 73 unsigned long esp0; /* points to SR of stack frame */ 74 unsigned long faddr; /* info about last fault */ 75 int signo, code; 76 unsigned long fp[8*3]; 77 unsigned long fpcntl[3]; /* fp control regs */ 78 unsigned char fpstate[FPSTATESIZE]; /* floating point state */ 79}; 80 81#define INIT_THREAD { \ 82 sizeof(init_stack) + (unsigned long) init_stack, 0, \ 83 PS_S, __KERNEL_DS, \ 84} 85 86/* 87 * Do necessary setup to start up a newly executed thread. 88 */ 89static inline void start_thread(struct pt_regs * regs, unsigned long pc, 90 unsigned long usp) 91{ 92 /* reads from user space */ 93 set_fs(USER_DS); 94 95 regs->pc = pc; 96 regs->sr &= ~0x2000; 97 wrusp(usp); 98} 99 100/* Forward declaration, a strange C thing */ 101struct task_struct; 102 103/* Free all resources held by a thread. */ 104static inline void release_thread(struct task_struct *dead_task) 105{ 106} 107 108extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); 109 110#define copy_segments(tsk, mm) do { } while (0) 111#define release_segments(mm) do { } while (0) 112 113/* 114 * Free current thread data structures etc.. 115 */ 116static inline void exit_thread(void) 117{ 118} 119 120/* 121 * Return saved PC of a blocked thread. 122 */ 123extern inline unsigned long thread_saved_pc(struct thread_struct *t) 124{ 125 extern void scheduling_functions_start_here(void); 126 extern void scheduling_functions_end_here(void); 127 struct switch_stack *sw = (struct switch_stack *)t->ksp; 128 /* Check whether the thread is blocked in resume() */ 129 if (sw->retpc > (unsigned long)scheduling_functions_start_here && 130 sw->retpc < (unsigned long)scheduling_functions_end_here) 131 return ((unsigned long *)sw->a6)[1]; 132 else 133 return sw->retpc; 134} 135 136unsigned long get_wchan(struct task_struct *p); 137 138#define KSTK_EIP(tsk) \ 139 ({ \ 140 unsigned long eip = 0; \ 141 if ((tsk)->thread.esp0 > PAGE_SIZE && \ 142 (VALID_PAGE(virt_to_page((tsk)->thread.esp0)))) \ 143 eip = ((struct pt_regs *) (tsk)->thread.esp0)->pc; \ 144 eip; }) 145#define KSTK_ESP(tsk) ((tsk) == current ? rdusp() : (tsk)->thread.usp) 146 147#define THREAD_SIZE (2*PAGE_SIZE) 148 149/* Allocation and freeing of basic task resources. */ 150#define alloc_task_struct() \ 151 ((struct task_struct *) __get_free_pages(GFP_KERNEL,1)) 152#define free_task_struct(p) free_pages((unsigned long)(p),1) 153#define get_task_struct(tsk) atomic_inc(&virt_to_page(tsk)->count) 154 155#define init_task (init_task_union.task) 156#define init_stack (init_task_union.stack) 157 158#define cpu_relax() do { } while (0) 159 160#endif 161