This commit was manufactured by cvs2svn to create branch
[linux-2.6.git] / include / asm-x86_64 / crashdump.h
1 /*
2  * include/asm-x86_64/crashdump.h
3  *
4  * Copyright (C) Hitachi, Ltd. 2004
5  * Written by Satoshi Oshima (oshima@sdl.hitachi.co.jp)
6  *
7  * Derived from include/asm-i386/diskdump.h
8  * Copyright (c) 2004 FUJITSU LIMITED
9  * Copyright (c) 2003 Red Hat, Inc. All rights reserved.
10  *
11  */
12
13 #ifndef _ASM_X86_64_CRASHDUMP_H
14 #define _ASM_X86_64_CRASHDUMP_H
15
16 #ifdef __KERNEL__
17
18 #include <linux/elf.h>
19
20 extern int page_is_ram(unsigned long);
21 extern unsigned long next_ram_page(unsigned long);
22
23 #define platform_fix_regs() \
24 {                                                                      \
25        unsigned long rsp;                                              \
26        unsigned short ss;                                              \
27        rsp = (unsigned long) ((char *)regs + sizeof (struct pt_regs)); \
28        ss = __KERNEL_DS;                                               \
29        if (regs->cs & 3) {                                             \
30                rsp = regs->rsp;                                        \
31                ss = regs->ss & 0xffff;                                 \
32        }                                                               \
33        myregs = *regs;                                                 \
34        myregs.rsp = rsp;                                               \
35        myregs.ss = (myregs.ss & (~0xffff)) | ss;                       \
36 }
37
38 #define platform_timestamp(x) rdtscll(x)
39
40 #define platform_freeze_cpu()                                   \
41 {                                                               \
42         for (;;) local_irq_disable();                           \
43 }
44
45 static inline void platform_init_stack(void **stackptr)
46 {
47         struct page *page;
48
49         if ((page = alloc_page(GFP_KERNEL)))
50                 *stackptr = (void *)page_address(page);
51
52         if (*stackptr)
53                 memset(*stackptr, 0, PAGE_SIZE);
54         else
55                 printk(KERN_WARNING
56                     "crashdump: unable to allocate separate stack\n");
57 }
58
59 #define platform_cleanup_stack(stackptr)               \
60 do {                                                   \
61         if (stackptr)                                  \
62                 free_page((unsigned long)stackptr);    \
63 } while (0)
64
65 typedef asmlinkage void (*crashdump_func_t)(struct pt_regs *, void *);
66
67 static inline void platform_start_crashdump(void *stackptr,
68                                             crashdump_func_t dumpfunc,
69                                             struct pt_regs *regs)
70 {                                                               
71         static unsigned long old_rsp;
72         unsigned long new_rsp;
73
74         if (stackptr) {
75                 asm volatile("movq %%rsp,%0" : "=r" (old_rsp));
76                 new_rsp = (unsigned long)stackptr + PAGE_SIZE;
77                 asm volatile("movq %0,%%rsp" :: "r" (new_rsp));
78                 dumpfunc(regs, NULL);
79                 asm volatile("movq %0,%%rsp" :: "r" (old_rsp));
80         } else
81                 dumpfunc(regs, NULL);
82 }
83
84 #endif /* __KERNEL__ */
85
86 #endif /* _ASM_X86_64_CRASHDUMP_H */