2 * writing ELF notes for s390x arch
5 * Copyright IBM Corp. 2012, 2013
7 * Ekaterina Tumanova <tumanova@linux.vnet.ibm.com>
9 * This work is licensed under the terms of the GNU GPL, version 2 or later.
10 * See the COPYING file in the top-level directory.
16 #include "exec/cpu-all.h"
17 #include "sysemu/dump.h"
18 #include "sysemu/kvm.h"
21 struct S390xUserRegsStruct
{
27 typedef struct S390xUserRegsStruct S390xUserRegs
;
29 struct S390xElfPrstatusStruct
{
37 typedef struct S390xElfPrstatusStruct S390xElfPrstatus
;
39 struct S390xElfFpregsetStruct
{
45 typedef struct S390xElfFpregsetStruct S390xElfFpregset
;
47 typedef struct noteStruct
{
52 S390xElfPrstatus prstatus
;
53 S390xElfFpregset fpregset
;
62 static void s390x_write_elf64_prstatus(Note
*note
, S390CPU
*cpu
)
67 note
->hdr
.n_type
= cpu_to_be32(NT_PRSTATUS
);
69 regs
= &(note
->contents
.prstatus
.regs
);
70 regs
->psw
[0] = cpu_to_be64(cpu
->env
.psw
.mask
);
71 regs
->psw
[1] = cpu_to_be64(cpu
->env
.psw
.addr
);
72 for (i
= 0; i
<= 15; i
++) {
73 regs
->acrs
[i
] = cpu_to_be32(cpu
->env
.aregs
[i
]);
74 regs
->gprs
[i
] = cpu_to_be64(cpu
->env
.regs
[i
]);
78 static void s390x_write_elf64_fpregset(Note
*note
, S390CPU
*cpu
)
82 note
->hdr
.n_type
= cpu_to_be32(NT_FPREGSET
);
83 note
->contents
.fpregset
.fpc
= cpu_to_be32(cpu
->env
.fpc
);
84 for (i
= 0; i
<= 15; i
++) {
85 note
->contents
.fpregset
.fprs
[i
] = cpu_to_be64(cpu
->env
.fregs
[i
].ll
);
90 static void s390x_write_elf64_timer(Note
*note
, S390CPU
*cpu
)
92 note
->hdr
.n_type
= cpu_to_be32(NT_S390_TIMER
);
93 note
->contents
.timer
= cpu_to_be64((uint64_t)(cpu
->env
.cputm
));
96 static void s390x_write_elf64_todcmp(Note
*note
, S390CPU
*cpu
)
98 note
->hdr
.n_type
= cpu_to_be32(NT_S390_TODCMP
);
99 note
->contents
.todcmp
= cpu_to_be64((uint64_t)(cpu
->env
.ckc
));
102 static void s390x_write_elf64_todpreg(Note
*note
, S390CPU
*cpu
)
104 note
->hdr
.n_type
= cpu_to_be32(NT_S390_TODPREG
);
105 note
->contents
.todpreg
= cpu_to_be32((uint32_t)(cpu
->env
.todpr
));
108 static void s390x_write_elf64_ctrs(Note
*note
, S390CPU
*cpu
)
112 note
->hdr
.n_type
= cpu_to_be32(NT_S390_CTRS
);
114 for (i
= 0; i
<= 15; i
++) {
115 note
->contents
.ctrs
[i
] = cpu_to_be64(cpu
->env
.cregs
[i
]);
119 static void s390x_write_elf64_prefix(Note
*note
, S390CPU
*cpu
)
121 note
->hdr
.n_type
= cpu_to_be32(NT_S390_PREFIX
);
122 note
->contents
.prefix
= cpu_to_be32((uint32_t)(cpu
->env
.psa
));
126 static const struct NoteFuncDescStruct
{
128 void (*note_contents_func
)(Note
*note
, S390CPU
*cpu
);
130 {sizeof(((Note
*)0)->contents
.prstatus
), s390x_write_elf64_prstatus
},
131 {sizeof(((Note
*)0)->contents
.prefix
), s390x_write_elf64_prefix
},
132 {sizeof(((Note
*)0)->contents
.fpregset
), s390x_write_elf64_fpregset
},
133 {sizeof(((Note
*)0)->contents
.ctrs
), s390x_write_elf64_ctrs
},
134 {sizeof(((Note
*)0)->contents
.timer
), s390x_write_elf64_timer
},
135 {sizeof(((Note
*)0)->contents
.todcmp
), s390x_write_elf64_todcmp
},
136 {sizeof(((Note
*)0)->contents
.todpreg
), s390x_write_elf64_todpreg
},
140 typedef struct NoteFuncDescStruct NoteFuncDesc
;
143 static int s390x_write_all_elf64_notes(const char *note_name
,
144 WriteCoreDumpFunction f
,
145 S390CPU
*cpu
, int id
,
149 const NoteFuncDesc
*nf
;
153 for (nf
= note_func
; nf
->note_contents_func
; nf
++) {
154 memset(¬e
, 0, sizeof(note
));
155 note
.hdr
.n_namesz
= cpu_to_be32(sizeof(note
.name
));
156 note
.hdr
.n_descsz
= cpu_to_be32(nf
->contents_size
);
157 strncpy(note
.name
, note_name
, sizeof(note
.name
));
158 (*nf
->note_contents_func
)(¬e
, cpu
);
160 note_size
= sizeof(note
) - sizeof(note
.contents
) + nf
->contents_size
;
161 ret
= f(¬e
, note_size
, opaque
);
173 int s390_cpu_write_elf64_note(WriteCoreDumpFunction f
, CPUState
*cs
,
174 int cpuid
, void *opaque
)
176 S390CPU
*cpu
= S390_CPU(cs
);
177 return s390x_write_all_elf64_notes("CORE", f
, cpu
, cpuid
, opaque
);
180 int cpu_get_dump_info(ArchDumpInfo
*info
,
181 const struct GuestPhysBlockList
*guest_phys_blocks
)
183 info
->d_machine
= EM_S390
;
184 info
->d_endian
= ELFDATA2MSB
;
185 info
->d_class
= ELFCLASS64
;
190 ssize_t
cpu_get_note_size(int class, int machine
, int nr_cpus
)
192 int name_size
= 8; /* "CORE" or "QEMU" rounded */
193 size_t elf_note_size
= 0;
195 const NoteFuncDesc
*nf
;
197 assert(class == ELFCLASS64
);
198 assert(machine
== EM_S390
);
200 note_head_size
= sizeof(Elf64_Nhdr
);
202 for (nf
= note_func
; nf
->note_contents_func
; nf
++) {
203 elf_note_size
= elf_note_size
+ note_head_size
+ name_size
+
207 return (elf_note_size
) * nr_cpus
;
210 int s390_cpu_write_elf64_qemunote(WriteCoreDumpFunction f
,
211 CPUState
*cpu
, void *opaque
)