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