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