Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * linux/include/asm-arm26/processor.h | |
3 | * | |
4 | * Copyright (C) 1995 Russell King | |
5 | * Copyright (C) 2003 Ian Molton | |
6 | * | |
7 | * This program is free software; you can redistribute it and/or modify | |
8 | * it under the terms of the GNU General Public License version 2 as | |
9 | * published by the Free Software Foundation. | |
10 | */ | |
11 | ||
12 | #ifndef __ASM_ARM_PROCESSOR_H | |
13 | #define __ASM_ARM_PROCESSOR_H | |
14 | ||
15 | /* | |
16 | * Default implementation of macro that returns current | |
17 | * instruction pointer ("program counter"). | |
18 | */ | |
19 | #define current_text_addr() ({ __label__ _l; _l: &&_l;}) | |
20 | ||
21 | #ifdef __KERNEL__ | |
22 | ||
23 | #include <asm/atomic.h> | |
24 | #include <asm/ptrace.h> | |
25 | #include <linux/string.h> | |
26 | ||
27 | #define KERNEL_STACK_SIZE 4096 | |
28 | ||
29 | typedef struct { | |
30 | void (*put_byte)(void); /* Special calling convention */ | |
31 | void (*get_byte)(void); /* Special calling convention */ | |
32 | void (*put_half)(void); /* Special calling convention */ | |
33 | void (*get_half)(void); /* Special calling convention */ | |
34 | void (*put_word)(void); /* Special calling convention */ | |
35 | void (*get_word)(void); /* Special calling convention */ | |
36 | void (*put_dword)(void); /* Special calling convention */ | |
37 | unsigned long (*copy_from_user)(void *to, const void *from, unsigned long sz); | |
38 | unsigned long (*copy_to_user)(void *to, const void *from, unsigned long sz); | |
39 | unsigned long (*clear_user)(void *addr, unsigned long sz); | |
40 | unsigned long (*strncpy_from_user)(char *to, const char *from, unsigned long sz); | |
41 | unsigned long (*strnlen_user)(const char *s, long n); | |
42 | } uaccess_t; | |
43 | ||
44 | extern uaccess_t uaccess_user, uaccess_kernel; | |
45 | ||
46 | #define EXTRA_THREAD_STRUCT \ | |
47 | uaccess_t *uaccess; /* User access functions*/ | |
48 | ||
49 | #define EXTRA_THREAD_STRUCT_INIT \ | |
50 | .uaccess = &uaccess_kernel, | |
51 | ||
52 | // FIXME?!! | |
53 | ||
54 | #define start_thread(regs,pc,sp) \ | |
55 | ({ \ | |
56 | unsigned long *stack = (unsigned long *)sp; \ | |
57 | set_fs(USER_DS); \ | |
58 | memzero(regs->uregs, sizeof (regs->uregs)); \ | |
59 | regs->ARM_pc = pc | ~0xfc000003; /* pc */ \ | |
60 | regs->ARM_sp = sp; /* sp */ \ | |
61 | regs->ARM_r2 = stack[2]; /* r2 (envp) */ \ | |
62 | regs->ARM_r1 = stack[1]; /* r1 (argv) */ \ | |
63 | regs->ARM_r0 = stack[0]; /* r0 (argc) */ \ | |
64 | }) | |
65 | ||
66 | #define KSTK_EIP(tsk) (((unsigned long *)(4096+(unsigned long)(tsk)))[1020]) | |
67 | #define KSTK_ESP(tsk) (((unsigned long *)(4096+(unsigned long)(tsk)))[1018]) | |
68 | ||
69 | struct debug_entry { | |
70 | u32 address; | |
71 | u32 insn; | |
72 | }; | |
73 | ||
74 | struct debug_info { | |
75 | int nsaved; | |
76 | struct debug_entry bp[2]; | |
77 | }; | |
78 | ||
79 | struct thread_struct { | |
80 | /* fault info */ | |
81 | unsigned long address; | |
82 | unsigned long trap_no; | |
83 | unsigned long error_code; | |
84 | /* debugging */ | |
85 | struct debug_info debug; | |
86 | EXTRA_THREAD_STRUCT | |
87 | }; | |
88 | ||
89 | #define INIT_THREAD { \ | |
90 | EXTRA_THREAD_STRUCT_INIT \ | |
91 | } | |
92 | ||
93 | /* Forward declaration, a strange C thing */ | |
94 | struct task_struct; | |
95 | ||
96 | /* Free all resources held by a thread. */ | |
97 | extern void release_thread(struct task_struct *); | |
98 | ||
99 | unsigned long get_wchan(struct task_struct *p); | |
100 | ||
101 | #define cpu_relax() barrier() | |
102 | ||
103 | /* Prepare to copy thread state - unlazy all lazy status */ | |
104 | #define prepare_to_copy(tsk) do { } while (0) | |
105 | ||
106 | /* | |
107 | * Create a new kernel thread | |
108 | */ | |
109 | extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); | |
110 | ||
111 | #endif | |
112 | ||
113 | #endif /* __ASM_ARM_PROCESSOR_H */ |