Skip to content

Commit 030912e

Browse files
iii-ivivier
authored andcommitted
linux-user/elfload: byteswap i386 registers when dumping core
Core dumps from emulating x86_64 on big-endian hosts contain incorrect register values. Signed-off-by: Ilya Leoshkevich <[email protected]> Reviewed-by: Peter Maydell <[email protected]> Reviewed-by: Philippe Mathieu-Daudé <[email protected]> Message-Id: <[email protected]> Signed-off-by: Laurent Vivier <[email protected]>
1 parent 0c40c18 commit 030912e

File tree

1 file changed

+44
-44
lines changed

1 file changed

+44
-44
lines changed

linux-user/elfload.c

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -172,33 +172,33 @@ typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
172172
*/
173173
static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUX86State *env)
174174
{
175-
(*regs)[0] = env->regs[15];
176-
(*regs)[1] = env->regs[14];
177-
(*regs)[2] = env->regs[13];
178-
(*regs)[3] = env->regs[12];
179-
(*regs)[4] = env->regs[R_EBP];
180-
(*regs)[5] = env->regs[R_EBX];
181-
(*regs)[6] = env->regs[11];
182-
(*regs)[7] = env->regs[10];
183-
(*regs)[8] = env->regs[9];
184-
(*regs)[9] = env->regs[8];
185-
(*regs)[10] = env->regs[R_EAX];
186-
(*regs)[11] = env->regs[R_ECX];
187-
(*regs)[12] = env->regs[R_EDX];
188-
(*regs)[13] = env->regs[R_ESI];
189-
(*regs)[14] = env->regs[R_EDI];
190-
(*regs)[15] = env->regs[R_EAX]; /* XXX */
191-
(*regs)[16] = env->eip;
192-
(*regs)[17] = env->segs[R_CS].selector & 0xffff;
193-
(*regs)[18] = env->eflags;
194-
(*regs)[19] = env->regs[R_ESP];
195-
(*regs)[20] = env->segs[R_SS].selector & 0xffff;
196-
(*regs)[21] = env->segs[R_FS].selector & 0xffff;
197-
(*regs)[22] = env->segs[R_GS].selector & 0xffff;
198-
(*regs)[23] = env->segs[R_DS].selector & 0xffff;
199-
(*regs)[24] = env->segs[R_ES].selector & 0xffff;
200-
(*regs)[25] = env->segs[R_FS].selector & 0xffff;
201-
(*regs)[26] = env->segs[R_GS].selector & 0xffff;
175+
(*regs)[0] = tswapreg(env->regs[15]);
176+
(*regs)[1] = tswapreg(env->regs[14]);
177+
(*regs)[2] = tswapreg(env->regs[13]);
178+
(*regs)[3] = tswapreg(env->regs[12]);
179+
(*regs)[4] = tswapreg(env->regs[R_EBP]);
180+
(*regs)[5] = tswapreg(env->regs[R_EBX]);
181+
(*regs)[6] = tswapreg(env->regs[11]);
182+
(*regs)[7] = tswapreg(env->regs[10]);
183+
(*regs)[8] = tswapreg(env->regs[9]);
184+
(*regs)[9] = tswapreg(env->regs[8]);
185+
(*regs)[10] = tswapreg(env->regs[R_EAX]);
186+
(*regs)[11] = tswapreg(env->regs[R_ECX]);
187+
(*regs)[12] = tswapreg(env->regs[R_EDX]);
188+
(*regs)[13] = tswapreg(env->regs[R_ESI]);
189+
(*regs)[14] = tswapreg(env->regs[R_EDI]);
190+
(*regs)[15] = tswapreg(env->regs[R_EAX]); /* XXX */
191+
(*regs)[16] = tswapreg(env->eip);
192+
(*regs)[17] = tswapreg(env->segs[R_CS].selector & 0xffff);
193+
(*regs)[18] = tswapreg(env->eflags);
194+
(*regs)[19] = tswapreg(env->regs[R_ESP]);
195+
(*regs)[20] = tswapreg(env->segs[R_SS].selector & 0xffff);
196+
(*regs)[21] = tswapreg(env->segs[R_FS].selector & 0xffff);
197+
(*regs)[22] = tswapreg(env->segs[R_GS].selector & 0xffff);
198+
(*regs)[23] = tswapreg(env->segs[R_DS].selector & 0xffff);
199+
(*regs)[24] = tswapreg(env->segs[R_ES].selector & 0xffff);
200+
(*regs)[25] = tswapreg(env->segs[R_FS].selector & 0xffff);
201+
(*regs)[26] = tswapreg(env->segs[R_GS].selector & 0xffff);
202202
}
203203

204204
#else
@@ -244,23 +244,23 @@ typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
244244
*/
245245
static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUX86State *env)
246246
{
247-
(*regs)[0] = env->regs[R_EBX];
248-
(*regs)[1] = env->regs[R_ECX];
249-
(*regs)[2] = env->regs[R_EDX];
250-
(*regs)[3] = env->regs[R_ESI];
251-
(*regs)[4] = env->regs[R_EDI];
252-
(*regs)[5] = env->regs[R_EBP];
253-
(*regs)[6] = env->regs[R_EAX];
254-
(*regs)[7] = env->segs[R_DS].selector & 0xffff;
255-
(*regs)[8] = env->segs[R_ES].selector & 0xffff;
256-
(*regs)[9] = env->segs[R_FS].selector & 0xffff;
257-
(*regs)[10] = env->segs[R_GS].selector & 0xffff;
258-
(*regs)[11] = env->regs[R_EAX]; /* XXX */
259-
(*regs)[12] = env->eip;
260-
(*regs)[13] = env->segs[R_CS].selector & 0xffff;
261-
(*regs)[14] = env->eflags;
262-
(*regs)[15] = env->regs[R_ESP];
263-
(*regs)[16] = env->segs[R_SS].selector & 0xffff;
247+
(*regs)[0] = tswapreg(env->regs[R_EBX]);
248+
(*regs)[1] = tswapreg(env->regs[R_ECX]);
249+
(*regs)[2] = tswapreg(env->regs[R_EDX]);
250+
(*regs)[3] = tswapreg(env->regs[R_ESI]);
251+
(*regs)[4] = tswapreg(env->regs[R_EDI]);
252+
(*regs)[5] = tswapreg(env->regs[R_EBP]);
253+
(*regs)[6] = tswapreg(env->regs[R_EAX]);
254+
(*regs)[7] = tswapreg(env->segs[R_DS].selector & 0xffff);
255+
(*regs)[8] = tswapreg(env->segs[R_ES].selector & 0xffff);
256+
(*regs)[9] = tswapreg(env->segs[R_FS].selector & 0xffff);
257+
(*regs)[10] = tswapreg(env->segs[R_GS].selector & 0xffff);
258+
(*regs)[11] = tswapreg(env->regs[R_EAX]); /* XXX */
259+
(*regs)[12] = tswapreg(env->eip);
260+
(*regs)[13] = tswapreg(env->segs[R_CS].selector & 0xffff);
261+
(*regs)[14] = tswapreg(env->eflags);
262+
(*regs)[15] = tswapreg(env->regs[R_ESP]);
263+
(*regs)[16] = tswapreg(env->segs[R_SS].selector & 0xffff);
264264
}
265265
#endif
266266

0 commit comments

Comments
 (0)