1819833afSPeter Tyser /* 2819833afSPeter Tyser * linux/include/asm-arm/processor.h 3819833afSPeter Tyser * 4819833afSPeter Tyser * Copyright (C) 1995-2002 Russell King 5819833afSPeter Tyser * 6819833afSPeter Tyser * This program is free software; you can redistribute it and/or modify 7819833afSPeter Tyser * it under the terms of the GNU General Public License version 2 as 8819833afSPeter Tyser * published by the Free Software Foundation. 9819833afSPeter Tyser */ 10819833afSPeter Tyser 11819833afSPeter Tyser #ifndef __ASM_ARM_PROCESSOR_H 12819833afSPeter Tyser #define __ASM_ARM_PROCESSOR_H 13819833afSPeter Tyser 14819833afSPeter Tyser /* 15819833afSPeter Tyser * Default implementation of macro that returns current 16819833afSPeter Tyser * instruction pointer ("program counter"). 17819833afSPeter Tyser */ 18819833afSPeter Tyser #define current_text_addr() ({ __label__ _l; _l: &&_l;}) 19819833afSPeter Tyser 20819833afSPeter Tyser #define FP_SIZE 35 21819833afSPeter Tyser 22819833afSPeter Tyser struct fp_hard_struct { 23819833afSPeter Tyser unsigned int save[FP_SIZE]; /* as yet undefined */ 24819833afSPeter Tyser }; 25819833afSPeter Tyser 26819833afSPeter Tyser struct fp_soft_struct { 27819833afSPeter Tyser unsigned int save[FP_SIZE]; /* undefined information */ 28819833afSPeter Tyser }; 29819833afSPeter Tyser 30819833afSPeter Tyser union fp_state { 31819833afSPeter Tyser struct fp_hard_struct hard; 32819833afSPeter Tyser struct fp_soft_struct soft; 33819833afSPeter Tyser }; 34819833afSPeter Tyser 35819833afSPeter Tyser typedef unsigned long mm_segment_t; /* domain register */ 36819833afSPeter Tyser 37819833afSPeter Tyser #ifdef __KERNEL__ 38819833afSPeter Tyser 39819833afSPeter Tyser #define EISA_bus 0 40819833afSPeter Tyser #define MCA_bus 0 41819833afSPeter Tyser #define MCA_bus__is_a_macro 42819833afSPeter Tyser 43819833afSPeter Tyser #include <asm/atomic.h> 44819833afSPeter Tyser #include <asm/ptrace.h> 45819833afSPeter Tyser #if 0 /* XXX###XXX */ 46819833afSPeter Tyser #include <asm/arch/memory.h> 47819833afSPeter Tyser #endif /* XXX###XXX */ 48*7d89982bSVasili Galka #include <asm/proc-armv/processor.h> 49819833afSPeter Tyser #include <asm/types.h> 50819833afSPeter Tyser 51819833afSPeter Tyser union debug_insn { 52819833afSPeter Tyser u32 arm; 53819833afSPeter Tyser u16 thumb; 54819833afSPeter Tyser }; 55819833afSPeter Tyser 56819833afSPeter Tyser struct debug_entry { 57819833afSPeter Tyser u32 address; 58819833afSPeter Tyser union debug_insn insn; 59819833afSPeter Tyser }; 60819833afSPeter Tyser 61819833afSPeter Tyser struct debug_info { 62819833afSPeter Tyser int nsaved; 63819833afSPeter Tyser struct debug_entry bp[2]; 64819833afSPeter Tyser }; 65819833afSPeter Tyser 66819833afSPeter Tyser struct thread_struct { 67819833afSPeter Tyser atomic_t refcount; 68819833afSPeter Tyser /* fault info */ 69819833afSPeter Tyser unsigned long address; 70819833afSPeter Tyser unsigned long trap_no; 71819833afSPeter Tyser unsigned long error_code; 72819833afSPeter Tyser /* floating point */ 73819833afSPeter Tyser union fp_state fpstate; 74819833afSPeter Tyser /* debugging */ 75819833afSPeter Tyser struct debug_info debug; 76819833afSPeter Tyser /* context info */ 77819833afSPeter Tyser struct context_save_struct *save; 78819833afSPeter Tyser EXTRA_THREAD_STRUCT 79819833afSPeter Tyser }; 80819833afSPeter Tyser 81819833afSPeter Tyser #define INIT_THREAD { \ 82819833afSPeter Tyser refcount: ATOMIC_INIT(1), \ 83819833afSPeter Tyser EXTRA_THREAD_STRUCT_INIT \ 84819833afSPeter Tyser } 85819833afSPeter Tyser 86819833afSPeter Tyser /* 87819833afSPeter Tyser * Return saved PC of a blocked thread. 88819833afSPeter Tyser */ thread_saved_pc(struct thread_struct * t)89819833afSPeter Tyserstatic inline unsigned long thread_saved_pc(struct thread_struct *t) 90819833afSPeter Tyser { 91819833afSPeter Tyser return t->save ? pc_pointer(t->save->pc) : 0; 92819833afSPeter Tyser } 93819833afSPeter Tyser thread_saved_fp(struct thread_struct * t)94819833afSPeter Tyserstatic inline unsigned long thread_saved_fp(struct thread_struct *t) 95819833afSPeter Tyser { 96819833afSPeter Tyser return t->save ? t->save->fp : 0; 97819833afSPeter Tyser } 98819833afSPeter Tyser 99819833afSPeter Tyser /* Forward declaration, a strange C thing */ 100819833afSPeter Tyser struct task_struct; 101819833afSPeter Tyser 102819833afSPeter Tyser /* Free all resources held by a thread. */ 103819833afSPeter Tyser extern void release_thread(struct task_struct *); 104819833afSPeter Tyser 105819833afSPeter Tyser /* Copy and release all segment info associated with a VM */ 106819833afSPeter Tyser #define copy_segments(tsk, mm) do { } while (0) 107819833afSPeter Tyser #define release_segments(mm) do { } while (0) 108819833afSPeter Tyser 109819833afSPeter Tyser unsigned long get_wchan(struct task_struct *p); 110819833afSPeter Tyser 111819833afSPeter Tyser #define THREAD_SIZE (8192) 112819833afSPeter Tyser 113819833afSPeter Tyser extern struct task_struct *alloc_task_struct(void); 114819833afSPeter Tyser extern void __free_task_struct(struct task_struct *); 115819833afSPeter Tyser #define get_task_struct(p) atomic_inc(&(p)->thread.refcount) 116819833afSPeter Tyser #define free_task_struct(p) \ 117819833afSPeter Tyser do { \ 118819833afSPeter Tyser if (atomic_dec_and_test(&(p)->thread.refcount)) \ 119819833afSPeter Tyser __free_task_struct((p)); \ 120819833afSPeter Tyser } while (0) 121819833afSPeter Tyser 122819833afSPeter Tyser #define init_task (init_task_union.task) 123819833afSPeter Tyser #define init_stack (init_task_union.stack) 124819833afSPeter Tyser 125819833afSPeter Tyser #define cpu_relax() barrier() 126819833afSPeter Tyser 127819833afSPeter Tyser /* 128819833afSPeter Tyser * Create a new kernel thread 129819833afSPeter Tyser */ 130819833afSPeter Tyser extern int arch_kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); 131819833afSPeter Tyser 132819833afSPeter Tyser #endif 133819833afSPeter Tyser 134819833afSPeter Tyser #endif /* __ASM_ARM_PROCESSOR_H */ 135