xref: /openbmc/u-boot/arch/arm/include/asm/processor.h (revision dab5e3469d294a4e1ffed8407d296a78e02cc01f)
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 Tyser static 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 Tyser static 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