~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Linux/include/asm-m68k/processor.h

Version: ~ [ 2.4.0 ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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 
 21 extern inline unsigned long rdusp(void) {
 22         unsigned long usp;
 23 
 24         __asm__ __volatile__("move %/usp,%0" : "=a" (usp));
 25         return usp;
 26 }
 27 
 28 extern 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    
 67 struct 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_MMAP { &init_mm, 0, 0x40000000, NULL, __pgprot(_PAGE_PRESENT|_PAGE_ACCESSED), VM_READ | VM_WRITE | VM_EXEC, 1, NULL, NULL }
 82 
 83 #define INIT_THREAD  { \
 84         sizeof(init_stack) + (unsigned long) init_stack, 0, \
 85         PS_S, __KERNEL_DS, \
 86 }
 87 
 88 /*
 89  * Do necessary setup to start up a newly executed thread.
 90  */
 91 static inline void start_thread(struct pt_regs * regs, unsigned long pc,
 92                                 unsigned long usp)
 93 {
 94         /* reads from user space */
 95         set_fs(USER_DS);
 96 
 97         regs->pc = pc;
 98         regs->sr &= ~0x2000;
 99         wrusp(usp);
100 }
101 
102 /* Forward declaration, a strange C thing */
103 struct task_struct;
104 
105 /* Free all resources held by a thread. */
106 static inline void release_thread(struct task_struct *dead_task)
107 {
108 }
109 
110 extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
111 
112 #define copy_segments(tsk, mm)          do { } while (0)
113 #define release_segments(mm)            do { } while (0)
114 
115 /*
116  * Free current thread data structures etc..
117  */
118 static inline void exit_thread(void)
119 {
120 }
121 
122 /*
123  * Return saved PC of a blocked thread.
124  */
125 extern inline unsigned long thread_saved_pc(struct thread_struct *t)
126 {
127         extern void scheduling_functions_start_here(void);
128         extern void scheduling_functions_end_here(void);
129         struct switch_stack *sw = (struct switch_stack *)t->ksp;
130         /* Check whether the thread is blocked in resume() */
131         if (sw->retpc > (unsigned long)scheduling_functions_start_here &&
132             sw->retpc < (unsigned long)scheduling_functions_end_here)
133                 return ((unsigned long *)sw->a6)[1];
134         else
135                 return sw->retpc;
136 }
137 
138 unsigned long get_wchan(struct task_struct *p);
139 
140 #define KSTK_EIP(tsk)   \
141     ({                  \
142         unsigned long eip = 0;   \
143         if ((tsk)->thread.esp0 > PAGE_SIZE && \
144             (VALID_PAGE(virt_to_page((tsk)->thread.esp0)))) \
145               eip = ((struct pt_regs *) (tsk)->thread.esp0)->pc; \
146         eip; })
147 #define KSTK_ESP(tsk)   ((tsk) == current ? rdusp() : (tsk)->thread.usp)
148 
149 #define THREAD_SIZE (2*PAGE_SIZE)
150 
151 /* Allocation and freeing of basic task resources. */
152 #define alloc_task_struct() \
153         ((struct task_struct *) __get_free_pages(GFP_KERNEL,1))
154 #define free_task_struct(p)     free_pages((unsigned long)(p),1)
155 #define get_task_struct(tsk)      atomic_inc(&virt_to_page(tsk)->count)
156 
157 #define init_task       (init_task_union.task)
158 #define init_stack      (init_task_union.stack)
159 
160 #endif
161 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.