Skip to content

Commit dee6424

Browse files
committed
Merge remote-tracking branch 'remotes/vivier2/tags/linux-user-for-6.1-pull-request' into staging
linux-user pull request 20210806 Fix endianness and addresses in i386 linux-user target # gpg: Signature made Fri 06 Aug 2021 10:16:32 BST # gpg: using RSA key CD2F75DDC8E3A4DC2E4F5173F30C38BD3F2FBE3C # gpg: issuer "[email protected]" # gpg: Good signature from "Laurent Vivier <[email protected]>" [full] # gpg: aka "Laurent Vivier <[email protected]>" [full] # gpg: aka "Laurent Vivier (Red Hat) <[email protected]>" [full] # Primary key fingerprint: CD2F 75DD C8E3 A4DC 2E4F 5173 F30C 38BD 3F2F BE3C * remotes/vivier2/tags/linux-user-for-6.1-pull-request: linux-user/elfload: byteswap i386 registers when dumping core linux-user: fix guest/host address mixup in i386 setup_rt_frame() Signed-off-by: Peter Maydell <[email protected]>
2 parents ca92f16 + 030912e commit dee6424

File tree

2 files changed

+48
-48
lines changed

2 files changed

+48
-48
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

linux-user/i386/signal.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -436,13 +436,13 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
436436

437437
#ifndef TARGET_X86_64
438438
env->regs[R_EAX] = sig;
439-
env->regs[R_EDX] = (unsigned long)&frame->info;
440-
env->regs[R_ECX] = (unsigned long)&frame->uc;
439+
env->regs[R_EDX] = frame_addr + offsetof(struct rt_sigframe, info);
440+
env->regs[R_ECX] = frame_addr + offsetof(struct rt_sigframe, uc);
441441
#else
442442
env->regs[R_EAX] = 0;
443443
env->regs[R_EDI] = sig;
444-
env->regs[R_ESI] = (unsigned long)&frame->info;
445-
env->regs[R_EDX] = (unsigned long)&frame->uc;
444+
env->regs[R_ESI] = frame_addr + offsetof(struct rt_sigframe, info);
445+
env->regs[R_EDX] = frame_addr + offsetof(struct rt_sigframe, uc);
446446
#endif
447447

448448
cpu_x86_load_seg(env, R_DS, __USER_DS);

0 commit comments

Comments
 (0)