1 #ifndef __X86_64_ELF_H__
2 #define __X86_64_ELF_H__
3 
4 #include <asm/msr.h>
5 #include <asm/regs.h>
6 
7 typedef struct {
8     unsigned long r15;
9     unsigned long r14;
10     unsigned long r13;
11     unsigned long r12;
12     unsigned long rbp;
13     unsigned long rbx;
14     unsigned long r11;
15     unsigned long r10;
16     unsigned long r9;
17     unsigned long r8;
18     unsigned long rax;
19     unsigned long rcx;
20     unsigned long rdx;
21     unsigned long rsi;
22     unsigned long rdi;
23     unsigned long orig_rax;
24     unsigned long rip;
25     unsigned long cs;
26     unsigned long rflags;
27     unsigned long rsp;
28     unsigned long ss;
29     unsigned long thread_fs;
30     unsigned long thread_gs;
31     unsigned long ds;
32     unsigned long es;
33     unsigned long fs;
34     unsigned long gs;
35 } ELF_Gregset;
36 
elf_core_save_regs(ELF_Gregset * core_regs,crash_xen_core_t * xen_core_regs)37 static inline void elf_core_save_regs(ELF_Gregset *core_regs,
38                                       crash_xen_core_t *xen_core_regs)
39 {
40     asm ( "movq %%r15, %0" : "=m" (core_regs->r15) );
41     asm ( "movq %%r14, %0" : "=m" (core_regs->r14) );
42     asm ( "movq %%r13, %0" : "=m" (core_regs->r13) );
43     asm ( "movq %%r12, %0" : "=m" (core_regs->r12) );
44     asm ( "movq %%rbp, %0" : "=m" (core_regs->rbp) );
45     asm ( "movq %%rbx, %0" : "=m" (core_regs->rbx) );
46     asm ( "movq %%r11, %0" : "=m" (core_regs->r11) );
47     asm ( "movq %%r10, %0" : "=m" (core_regs->r10) );
48     asm ( "movq %%r9, %0" : "=m" (core_regs->r9) );
49     asm ( "movq %%r8, %0" : "=m" (core_regs->r8) );
50     asm ( "movq %%rax, %0" : "=m" (core_regs->rax) );
51     asm ( "movq %%rcx, %0" : "=m" (core_regs->rcx) );
52     asm ( "movq %%rdx, %0" : "=m" (core_regs->rdx) );
53     asm ( "movq %%rsi, %0" : "=m" (core_regs->rsi) );
54     asm ( "movq %%rdi, %0" : "=m" (core_regs->rdi) );
55 
56     /* orig_rax not filled in for now */
57     asm ( "call 0f; 0: popq %0" : "=m" (core_regs->rip) );
58     core_regs->cs = read_sreg(cs);
59     asm ( "pushfq; popq %0" : "=m" (core_regs->rflags) );
60     asm ( "movq %%rsp, %0" : "=m" (core_regs->rsp) );
61     core_regs->ss = read_sreg(ss);
62     rdmsrl(MSR_FS_BASE, core_regs->thread_fs);
63     rdmsrl(MSR_GS_BASE, core_regs->thread_gs);
64     core_regs->ds = read_sreg(ds);
65     core_regs->es = read_sreg(es);
66     core_regs->fs = read_sreg(fs);
67     core_regs->gs = read_sreg(gs);
68 
69     asm ( "mov %%cr0, %0" : "=r" (xen_core_regs->cr0) );
70     asm ( "mov %%cr2, %0" : "=r" (xen_core_regs->cr2) );
71     asm ( "mov %%cr3, %0" : "=r" (xen_core_regs->cr3) );
72     asm ( "mov %%cr4, %0" : "=r" (xen_core_regs->cr4) );
73 }
74 
75 #endif /* __X86_64_ELF_H__ */
76 
77 /*
78  * Local variables:
79  * mode: C
80  * c-file-style: "BSD"
81  * c-basic-offset: 4
82  * tab-width: 4
83  * indent-tabs-mode: nil
84  * End:
85  */
86