Commit 01ebb77b31149d847726a8847ad0d37631d7f049

Authored by Keith Owens
Committed by Linus Torvalds
1 parent 386dcafaac

[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
... ... @@ -178,7 +178,7 @@
178 178 break;
179 179 #endif
180 180 default:
181   - end = per_cpu(init_tss, cpu).ist[k];
  181 + end = per_cpu(orig_ist, cpu).ist[k];
182 182 break;
183 183 }
184 184 /*
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)