]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | #ifndef __ASM_CRIS_ARCH_PROCESSOR_H |
2 | #define __ASM_CRIS_ARCH_PROCESSOR_H | |
3 | ||
4 | /* | |
5 | * Default implementation of macro that returns current | |
6 | * instruction pointer ("program counter"). | |
7 | */ | |
8 | #define current_text_addr() ({void *pc; __asm__ ("move.d $pc,%0" : "=rm" (pc)); pc; }) | |
9 | ||
10 | /* CRIS has no problems with write protection */ | |
11 | #define wp_works_ok 1 | |
12 | ||
13 | /* CRIS thread_struct. this really has nothing to do with the processor itself, since | |
14 | * CRIS does not do any hardware task-switching, but it's here for legacy reasons. | |
15 | * The thread_struct here is used when task-switching using _resume defined in entry.S. | |
16 | * The offsets here are hardcoded into _resume - if you change this struct, you need to | |
17 | * change them as well!!! | |
18 | */ | |
19 | ||
20 | struct thread_struct { | |
21 | unsigned long ksp; /* kernel stack pointer */ | |
22 | unsigned long usp; /* user stack pointer */ | |
23 | unsigned long dccr; /* saved flag register */ | |
24 | }; | |
25 | ||
26 | /* | |
27 | * User space process size. This is hardcoded into a few places, | |
28 | * so don't change it unless you know what you are doing. | |
29 | */ | |
30 | ||
31 | #ifdef CONFIG_CRIS_LOW_MAP | |
32 | #define TASK_SIZE (0x50000000UL) /* 1.25 GB */ | |
33 | #else | |
34 | #define TASK_SIZE (0xA0000000UL) /* 2.56 GB */ | |
35 | #endif | |
36 | ||
37 | #define INIT_THREAD { \ | |
38 | 0, 0, 0x20 } /* ccr = int enable, nothing else */ | |
39 | ||
40 | #define KSTK_EIP(tsk) \ | |
41 | ({ \ | |
42 | unsigned long eip = 0; \ | |
cfa0f29b | 43 | unsigned long regs = (unsigned long)task_pt_regs(tsk); \ |
1da177e4 LT |
44 | if (regs > PAGE_SIZE && \ |
45 | virt_addr_valid(regs)) \ | |
46 | eip = ((struct pt_regs *)regs)->irp; \ | |
47 | eip; \ | |
48 | }) | |
49 | ||
50 | /* give the thread a program location | |
51 | * set user-mode (The 'U' flag (User mode flag) is CCR/DCCR bit 8) | |
52 | * switch user-stackpointer | |
53 | */ | |
54 | ||
55 | #define start_thread(regs, ip, usp) do { \ | |
1da177e4 LT |
56 | regs->irp = ip; \ |
57 | regs->dccr |= 1 << U_DCCR_BITNR; \ | |
58 | wrusp(usp); \ | |
59 | } while(0) | |
60 | ||
cb09f540 MS |
61 | /* Called when handling a kernel bus fault fixup. |
62 | * | |
63 | * After a fixup we do not want to return by restoring the CPU-state | |
64 | * anymore, so switch frame-types (see ptrace.h) | |
65 | */ | |
66 | #define arch_fixup(regs) \ | |
67 | regs->frametype = CRIS_FRAME_NORMAL; | |
68 | ||
1da177e4 | 69 | #endif |