1*819833afSPeter Tyser /* 2*819833afSPeter Tyser * linux/include/asm-arm/processor.h 3*819833afSPeter Tyser * 4*819833afSPeter Tyser * Copyright (C) 1995-2002 Russell King 5*819833afSPeter Tyser * 6*819833afSPeter Tyser * This program is free software; you can redistribute it and/or modify 7*819833afSPeter Tyser * it under the terms of the GNU General Public License version 2 as 8*819833afSPeter Tyser * published by the Free Software Foundation. 9*819833afSPeter Tyser */ 10*819833afSPeter Tyser 11*819833afSPeter Tyser #ifndef __ASM_ARM_PROCESSOR_H 12*819833afSPeter Tyser #define __ASM_ARM_PROCESSOR_H 13*819833afSPeter Tyser 14*819833afSPeter Tyser /* 15*819833afSPeter Tyser * Default implementation of macro that returns current 16*819833afSPeter Tyser * instruction pointer ("program counter"). 17*819833afSPeter Tyser */ 18*819833afSPeter Tyser #define current_text_addr() ({ __label__ _l; _l: &&_l;}) 19*819833afSPeter Tyser 20*819833afSPeter Tyser #define FP_SIZE 35 21*819833afSPeter Tyser 22*819833afSPeter Tyser struct fp_hard_struct { 23*819833afSPeter Tyser unsigned int save[FP_SIZE]; /* as yet undefined */ 24*819833afSPeter Tyser }; 25*819833afSPeter Tyser 26*819833afSPeter Tyser struct fp_soft_struct { 27*819833afSPeter Tyser unsigned int save[FP_SIZE]; /* undefined information */ 28*819833afSPeter Tyser }; 29*819833afSPeter Tyser 30*819833afSPeter Tyser union fp_state { 31*819833afSPeter Tyser struct fp_hard_struct hard; 32*819833afSPeter Tyser struct fp_soft_struct soft; 33*819833afSPeter Tyser }; 34*819833afSPeter Tyser 35*819833afSPeter Tyser typedef unsigned long mm_segment_t; /* domain register */ 36*819833afSPeter Tyser 37*819833afSPeter Tyser #ifdef __KERNEL__ 38*819833afSPeter Tyser 39*819833afSPeter Tyser #define EISA_bus 0 40*819833afSPeter Tyser #define MCA_bus 0 41*819833afSPeter Tyser #define MCA_bus__is_a_macro 42*819833afSPeter Tyser 43*819833afSPeter Tyser #include <asm/atomic.h> 44*819833afSPeter Tyser #include <asm/ptrace.h> 45*819833afSPeter Tyser #if 0 /* XXX###XXX */ 46*819833afSPeter Tyser #include <asm/arch/memory.h> 47*819833afSPeter Tyser #endif /* XXX###XXX */ 48*819833afSPeter Tyser #include <asm/proc/processor.h> 49*819833afSPeter Tyser #include <asm/types.h> 50*819833afSPeter Tyser 51*819833afSPeter Tyser union debug_insn { 52*819833afSPeter Tyser u32 arm; 53*819833afSPeter Tyser u16 thumb; 54*819833afSPeter Tyser }; 55*819833afSPeter Tyser 56*819833afSPeter Tyser struct debug_entry { 57*819833afSPeter Tyser u32 address; 58*819833afSPeter Tyser union debug_insn insn; 59*819833afSPeter Tyser }; 60*819833afSPeter Tyser 61*819833afSPeter Tyser struct debug_info { 62*819833afSPeter Tyser int nsaved; 63*819833afSPeter Tyser struct debug_entry bp[2]; 64*819833afSPeter Tyser }; 65*819833afSPeter Tyser 66*819833afSPeter Tyser struct thread_struct { 67*819833afSPeter Tyser atomic_t refcount; 68*819833afSPeter Tyser /* fault info */ 69*819833afSPeter Tyser unsigned long address; 70*819833afSPeter Tyser unsigned long trap_no; 71*819833afSPeter Tyser unsigned long error_code; 72*819833afSPeter Tyser /* floating point */ 73*819833afSPeter Tyser union fp_state fpstate; 74*819833afSPeter Tyser /* debugging */ 75*819833afSPeter Tyser struct debug_info debug; 76*819833afSPeter Tyser /* context info */ 77*819833afSPeter Tyser struct context_save_struct *save; 78*819833afSPeter Tyser EXTRA_THREAD_STRUCT 79*819833afSPeter Tyser }; 80*819833afSPeter Tyser 81*819833afSPeter Tyser #define INIT_THREAD { \ 82*819833afSPeter Tyser refcount: ATOMIC_INIT(1), \ 83*819833afSPeter Tyser EXTRA_THREAD_STRUCT_INIT \ 84*819833afSPeter Tyser } 85*819833afSPeter Tyser 86*819833afSPeter Tyser /* 87*819833afSPeter Tyser * Return saved PC of a blocked thread. 88*819833afSPeter Tyser */ 89*819833afSPeter Tyser static inline unsigned long thread_saved_pc(struct thread_struct *t) 90*819833afSPeter Tyser { 91*819833afSPeter Tyser return t->save ? pc_pointer(t->save->pc) : 0; 92*819833afSPeter Tyser } 93*819833afSPeter Tyser 94*819833afSPeter Tyser static inline unsigned long thread_saved_fp(struct thread_struct *t) 95*819833afSPeter Tyser { 96*819833afSPeter Tyser return t->save ? t->save->fp : 0; 97*819833afSPeter Tyser } 98*819833afSPeter Tyser 99*819833afSPeter Tyser /* Forward declaration, a strange C thing */ 100*819833afSPeter Tyser struct task_struct; 101*819833afSPeter Tyser 102*819833afSPeter Tyser /* Free all resources held by a thread. */ 103*819833afSPeter Tyser extern void release_thread(struct task_struct *); 104*819833afSPeter Tyser 105*819833afSPeter Tyser /* Copy and release all segment info associated with a VM */ 106*819833afSPeter Tyser #define copy_segments(tsk, mm) do { } while (0) 107*819833afSPeter Tyser #define release_segments(mm) do { } while (0) 108*819833afSPeter Tyser 109*819833afSPeter Tyser unsigned long get_wchan(struct task_struct *p); 110*819833afSPeter Tyser 111*819833afSPeter Tyser #define THREAD_SIZE (8192) 112*819833afSPeter Tyser 113*819833afSPeter Tyser extern struct task_struct *alloc_task_struct(void); 114*819833afSPeter Tyser extern void __free_task_struct(struct task_struct *); 115*819833afSPeter Tyser #define get_task_struct(p) atomic_inc(&(p)->thread.refcount) 116*819833afSPeter Tyser #define free_task_struct(p) \ 117*819833afSPeter Tyser do { \ 118*819833afSPeter Tyser if (atomic_dec_and_test(&(p)->thread.refcount)) \ 119*819833afSPeter Tyser __free_task_struct((p)); \ 120*819833afSPeter Tyser } while (0) 121*819833afSPeter Tyser 122*819833afSPeter Tyser #define init_task (init_task_union.task) 123*819833afSPeter Tyser #define init_stack (init_task_union.stack) 124*819833afSPeter Tyser 125*819833afSPeter Tyser #define cpu_relax() barrier() 126*819833afSPeter Tyser 127*819833afSPeter Tyser /* 128*819833afSPeter Tyser * Create a new kernel thread 129*819833afSPeter Tyser */ 130*819833afSPeter Tyser extern int arch_kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); 131*819833afSPeter Tyser 132*819833afSPeter Tyser #endif 133*819833afSPeter Tyser 134*819833afSPeter Tyser #endif /* __ASM_ARM_PROCESSOR_H */ 135