xref: /rk3399_rockchip-uboot/arch/arm/include/asm/processor.h (revision 819833af39a91fa1c1e8252862bbda6f5a602f7b)
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