diff options
author | Vineet Gupta <vgupta@synopsys.com> | 2013-01-18 04:42:17 -0500 |
---|---|---|
committer | Vineet Gupta <vgupta@synopsys.com> | 2013-02-11 09:30:34 -0500 |
commit | 3be80aaef861a60b85a9323462ebb5f623774f7a (patch) | |
tree | b5224ff6c43f4a5787b72a18b83b6d4de7dbddf7 /arch/arc/include/asm/processor.h | |
parent | ca15c8ecd588dda4377d18d6d27bc1e87b4177cb (diff) |
ARC: Fundamental ARCH data-types/defines
* L1_CACHE_SHIFT
* PAGE_SIZE, PAGE_OFFSET
* struct pt_regs, struct user_regs_struct
* struct thread_struct, cpu_relax(), task_pt_regs(), start_thread(), ...
* struct thread_info, THREAD_SIZE, INIT_THREAD_INFO(), TIF_*, ...
* BUG()
* ELF_*
* Elf_*
To disallow user-space visibility into some of the core kernel data-types
such as struct pt_regs, #ifdef __KERNEL__ which also makes the UAPI header
spit (further patch in the series) to NOT export it to asm/uapi/ptrace.h
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
Cc: Jonas Bonn <jonas.bonn@gmail.com>
Cc: Al Viro <viro@ZenIV.linux.org.uk>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to 'arch/arc/include/asm/processor.h')
-rw-r--r-- | arch/arc/include/asm/processor.h | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/arch/arc/include/asm/processor.h b/arch/arc/include/asm/processor.h new file mode 100644 index 000000000000..bf88cfbc9128 --- /dev/null +++ b/arch/arc/include/asm/processor.h | |||
@@ -0,0 +1,143 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | * vineetg: March 2009 | ||
9 | * -Implemented task_pt_regs( ) | ||
10 | * | ||
11 | * Amit Bhor, Sameer Dhavale, Ashwin Chaugule: Codito Technologies 2004 | ||
12 | */ | ||
13 | |||
14 | #ifndef __ASM_ARC_PROCESSOR_H | ||
15 | #define __ASM_ARC_PROCESSOR_H | ||
16 | |||
17 | #ifdef __KERNEL__ | ||
18 | |||
19 | #ifndef __ASSEMBLY__ | ||
20 | |||
21 | #include <asm/arcregs.h> /* for STATUS_E1_MASK et all */ | ||
22 | |||
23 | /* Arch specific stuff which needs to be saved per task. | ||
24 | * However these items are not so important so as to earn a place in | ||
25 | * struct thread_info | ||
26 | */ | ||
27 | struct thread_struct { | ||
28 | unsigned long ksp; /* kernel mode stack pointer */ | ||
29 | unsigned long callee_reg; /* pointer to callee regs */ | ||
30 | unsigned long fault_address; /* dbls as brkpt holder as well */ | ||
31 | unsigned long cause_code; /* Exception Cause Code (ECR) */ | ||
32 | }; | ||
33 | |||
34 | #define INIT_THREAD { \ | ||
35 | .ksp = sizeof(init_stack) + (unsigned long) init_stack, \ | ||
36 | } | ||
37 | |||
38 | /* Forward declaration, a strange C thing */ | ||
39 | struct task_struct; | ||
40 | |||
41 | /* | ||
42 | * Return saved PC of a blocked thread. | ||
43 | */ | ||
44 | unsigned long thread_saved_pc(struct task_struct *t); | ||
45 | |||
46 | #define task_pt_regs(p) \ | ||
47 | ((struct pt_regs *)(THREAD_SIZE - 4 + (void *)task_stack_page(p)) - 1) | ||
48 | |||
49 | /* Free all resources held by a thread. */ | ||
50 | #define release_thread(thread) do { } while (0) | ||
51 | |||
52 | /* Prepare to copy thread state - unlazy all lazy status */ | ||
53 | #define prepare_to_copy(tsk) do { } while (0) | ||
54 | |||
55 | #define cpu_relax() do { } while (0) | ||
56 | |||
57 | /* | ||
58 | * Create a new kernel thread | ||
59 | */ | ||
60 | |||
61 | extern int kernel_thread(int (*fn) (void *), void *arg, unsigned long flags); | ||
62 | |||
63 | #define copy_segments(tsk, mm) do { } while (0) | ||
64 | #define release_segments(mm) do { } while (0) | ||
65 | |||
66 | #define KSTK_EIP(tsk) (task_pt_regs(tsk)->ret) | ||
67 | |||
68 | /* | ||
69 | * Where abouts of Task's sp, fp, blink when it was last seen in kernel mode. | ||
70 | * These can't be derived from pt_regs as that would give correp user-mode val | ||
71 | */ | ||
72 | #define KSTK_ESP(tsk) (tsk->thread.ksp) | ||
73 | #define KSTK_BLINK(tsk) (*((unsigned int *)((KSTK_ESP(tsk)) + (13+1+1)*4))) | ||
74 | #define KSTK_FP(tsk) (*((unsigned int *)((KSTK_ESP(tsk)) + (13+1)*4))) | ||
75 | |||
76 | /* | ||
77 | * Do necessary setup to start up a newly executed thread. | ||
78 | * | ||
79 | * E1,E2 so that Interrupts are enabled in user mode | ||
80 | * L set, so Loop inhibited to begin with | ||
81 | * lp_start and lp_end seeded with bogus non-zero values so to easily catch | ||
82 | * the ARC700 sr to lp_start hardware bug | ||
83 | */ | ||
84 | #define start_thread(_regs, _pc, _usp) \ | ||
85 | do { \ | ||
86 | set_fs(USER_DS); /* reads from user space */ \ | ||
87 | (_regs)->ret = (_pc); \ | ||
88 | /* Interrupts enabled in User Mode */ \ | ||
89 | (_regs)->status32 = STATUS_U_MASK | STATUS_L_MASK \ | ||
90 | | STATUS_E1_MASK | STATUS_E2_MASK; \ | ||
91 | (_regs)->sp = (_usp); \ | ||
92 | /* bogus seed values for debugging */ \ | ||
93 | (_regs)->lp_start = 0x10; \ | ||
94 | (_regs)->lp_end = 0x80; \ | ||
95 | } while (0) | ||
96 | |||
97 | extern unsigned int get_wchan(struct task_struct *p); | ||
98 | |||
99 | /* | ||
100 | * Default implementation of macro that returns current | ||
101 | * instruction pointer ("program counter"). | ||
102 | * Should the PC register be read instead ? This macro does not seem to | ||
103 | * be used in many places so this wont be all that bad. | ||
104 | */ | ||
105 | #define current_text_addr() ({ __label__ _l; _l: &&_l; }) | ||
106 | |||
107 | #endif /* !__ASSEMBLY__ */ | ||
108 | |||
109 | /* Kernels Virtual memory area. | ||
110 | * Unlike other architectures(MIPS, sh, cris ) ARC 700 does not have a | ||
111 | * "kernel translated" region (like KSEG2 in MIPS). So we use a upper part | ||
112 | * of the translated bottom 2GB for kernel virtual memory and protect | ||
113 | * these pages from user accesses by disabling Ru, Eu and Wu. | ||
114 | */ | ||
115 | #define VMALLOC_SIZE (0x10000000) /* 256M */ | ||
116 | #define VMALLOC_START (PAGE_OFFSET - VMALLOC_SIZE) | ||
117 | #define VMALLOC_END (PAGE_OFFSET) | ||
118 | |||
119 | /* Most of the architectures seem to be keeping some kind of padding between | ||
120 | * userspace TASK_SIZE and PAGE_OFFSET. i.e TASK_SIZE != PAGE_OFFSET. | ||
121 | */ | ||
122 | #define USER_KERNEL_GUTTER 0x10000000 | ||
123 | |||
124 | /* User address space: | ||
125 | * On ARC700, CPU allows the entire lower half of 32 bit address space to be | ||
126 | * translated. Thus potentially 2G (0:0x7FFF_FFFF) could be User vaddr space. | ||
127 | * However we steal 256M for kernel addr (0x7000_0000:0x7FFF_FFFF) and another | ||
128 | * 256M (0x6000_0000:0x6FFF_FFFF) is gutter between user/kernel spaces | ||
129 | * Thus total User vaddr space is (0:0x5FFF_FFFF) | ||
130 | */ | ||
131 | #define TASK_SIZE (PAGE_OFFSET - VMALLOC_SIZE - USER_KERNEL_GUTTER) | ||
132 | |||
133 | #define STACK_TOP TASK_SIZE | ||
134 | #define STACK_TOP_MAX STACK_TOP | ||
135 | |||
136 | /* This decides where the kernel will search for a free chunk of vm | ||
137 | * space during mmap's. | ||
138 | */ | ||
139 | #define TASK_UNMAPPED_BASE (TASK_SIZE / 3) | ||
140 | |||
141 | #endif /* __KERNEL__ */ | ||
142 | |||
143 | #endif /* __ASM_ARC_PROCESSOR_H */ | ||