Commit 01ebb77b31149d847726a8847ad0d37631d7f049
Committed by
Linus Torvalds
1 parent
386dcafaac
Exists in
master
and in
4 other branches
[PATCH] x86_64: Save original IST values for checking stack addresses
The values in init_tss.ist[] can change when an IST event occurs. Save the original IST values for checking stack addresses when debugging or doing stack traces. Signed-off-by: Keith Owens <kaos@ocs.com.au> Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Showing 4 changed files with 14 additions and 2 deletions Side-by-side Diff
arch/x86_64/kernel/init_task.c
| ... | ... | @@ -46,5 +46,10 @@ |
| 46 | 46 | */ |
| 47 | 47 | DEFINE_PER_CPU(struct tss_struct, init_tss) ____cacheline_internodealigned_in_smp = INIT_TSS; |
| 48 | 48 | |
| 49 | +/* Copies of the original ist values from the tss are only accessed during | |
| 50 | + * debugging, no special alignment required. | |
| 51 | + */ | |
| 52 | +DEFINE_PER_CPU(struct orig_ist, orig_ist); | |
| 53 | + | |
| 49 | 54 | #define ALIGN_TO_4K __attribute__((section(".data.init_task"))) |
arch/x86_64/kernel/setup64.c
| ... | ... | @@ -189,6 +189,7 @@ |
| 189 | 189 | { |
| 190 | 190 | int cpu = stack_smp_processor_id(); |
| 191 | 191 | struct tss_struct *t = &per_cpu(init_tss, cpu); |
| 192 | + struct orig_ist *orig_ist = &per_cpu(orig_ist, cpu); | |
| 192 | 193 | unsigned long v; |
| 193 | 194 | char *estacks = NULL; |
| 194 | 195 | struct task_struct *me; |
| ... | ... | @@ -256,7 +257,7 @@ |
| 256 | 257 | estacks += EXCEPTION_STKSZ; |
| 257 | 258 | break; |
| 258 | 259 | } |
| 259 | - t->ist[v] = (unsigned long)estacks; | |
| 260 | + orig_ist->ist[v] = t->ist[v] = (unsigned long)estacks; | |
| 260 | 261 | } |
| 261 | 262 | |
| 262 | 263 | t->io_bitmap_base = offsetof(struct tss_struct, io_bitmap); |
arch/x86_64/kernel/traps.c
include/asm-x86_64/processor.h
| ... | ... | @@ -232,8 +232,14 @@ |
| 232 | 232 | unsigned long io_bitmap[IO_BITMAP_LONGS + 1]; |
| 233 | 233 | } __attribute__((packed)) ____cacheline_aligned; |
| 234 | 234 | |
| 235 | + | |
| 235 | 236 | extern struct cpuinfo_x86 boot_cpu_data; |
| 236 | 237 | DECLARE_PER_CPU(struct tss_struct,init_tss); |
| 238 | +/* Save the original ist values for checking stack pointers during debugging */ | |
| 239 | +struct orig_ist { | |
| 240 | + unsigned long ist[7]; | |
| 241 | +}; | |
| 242 | +DECLARE_PER_CPU(struct orig_ist, orig_ist); | |
| 237 | 243 | |
| 238 | 244 | #ifdef CONFIG_X86_VSMP |
| 239 | 245 | #define ARCH_MIN_TASKALIGN (1 << INTERNODE_CACHE_SHIFT) |