This commit was generated by cvs2svn to compensate for changes in r925,
[linux-2.6.git] / include / asm-i386 / crash_dump.h
1 /* asm-i386/crash_dump.h */
2 #include <linux/bootmem.h>
3 #include <linux/irq.h>
4 #include <asm/apic.h>
5
6 #ifdef CONFIG_CRASH_DUMP
7 extern unsigned int dump_enabled;
8 extern unsigned int crashed;
9
10 extern void __crash_relocate_mem(unsigned long, unsigned long);
11 extern unsigned long __init find_max_low_pfn(void);
12 extern void __init find_max_pfn(void);
13
14 extern struct pt_regs crash_smp_regs[NR_CPUS];
15 extern long crash_smp_current_task[NR_CPUS];
16 extern void crash_dump_save_this_cpu(struct pt_regs *, int);
17 extern void __crash_dump_stop_cpus(void);
18 extern void crash_get_current_regs(struct pt_regs *regs);
19
20 #define CRASH_BACKUP_BASE ((unsigned long)CONFIG_BACKUP_BASE * 0x100000)
21 #define CRASH_BACKUP_SIZE ((unsigned long)CONFIG_BACKUP_SIZE * 0x100000)
22 #define CRASH_RELOCATE_SIZE 0xa0000
23
24 static inline void crash_relocate_mem(void)
25 {
26         if (crashed)
27                 __crash_relocate_mem(CRASH_BACKUP_BASE + CRASH_BACKUP_SIZE,
28                                         CRASH_RELOCATE_SIZE);
29 }
30
31 static inline void set_saved_max_pfn(void)
32 {
33         find_max_pfn();
34         saved_max_pfn = find_max_low_pfn();
35 }
36
37 static inline void crash_reserve_bootmem(void)
38 {
39         if (!dump_enabled) {
40                 reserve_bootmem(CRASH_BACKUP_BASE,
41                         CRASH_BACKUP_SIZE + CRASH_RELOCATE_SIZE + PAGE_SIZE);
42         }
43 }
44
45 static inline void crash_dump_stop_cpus(void)
46 {
47         int cpu;
48
49         if (!crashed)
50                 return;
51
52         cpu = smp_processor_id();
53
54         crash_smp_current_task[cpu] = (long)current;
55         crash_get_current_regs(&crash_smp_regs[cpu]);
56
57         /* This also captures the register states of the other cpus */
58         __crash_dump_stop_cpus();
59 #if defined(CONFIG_X86_IO_APIC)
60         disable_IO_APIC();
61 #endif
62 #if defined(CONFIG_X86_LOCAL_APIC)
63         disconnect_bsp_APIC();
64 #endif
65 }
66
67 static inline void crash_dump_save_registers(void)
68 {
69         void *addr;
70
71         addr = __va(CRASH_BACKUP_BASE + CRASH_BACKUP_SIZE + CRASH_RELOCATE_SIZE);
72         memcpy(addr, crash_smp_regs, (sizeof(struct pt_regs)*NR_CPUS));
73         addr += sizeof(struct pt_regs)*NR_CPUS;
74         memcpy(addr, crash_smp_current_task, (sizeof(long)*NR_CPUS));
75 }
76 #else
77 #define crash_relocate_mem() do { } while(0)
78 #define set_saved_max_pfn() do { } while(0)
79 #define crash_reserve_bootmem() do { } while(0)
80 #define crash_dump_stop_cpus() do { } while(0)
81 #define crash_dump_save_registers() do { } while(0)
82 #endif