Hello all,
attached a try to minmize the testcase to just the affected instruction.
Kind regards,
Bernhard
/*
bernhard@rechner:~$ uname -a
Linux rechner 4.18.0-1-amd64 #1 SMP Debian 4.18.6-1 (2018-09-06) x86_64 GNU/Linux
bernhard@rechner:~$ gcc -m32 -g -O0 -static 910571_test_2.c -o 910571_test_2
*/
#include <stdio.h>
#include <stdint.h>
int main(void)
{
uint8_t in[7];
uint8_t out[7];
in[0] = 'A';
in[1] = 'B';
in[2] = 'C';
in[3] = 'D';
in[4] = 'E';
in[5] = 'F';
in[6] = 0;
out[0] = 'A';
out[1] = 'B';
out[2] = ' ';
out[3] = ' ';
out[4] = 'E';
out[5] = 'F';
out[6] = 0;
__asm (
"movsw %%ds:(%%esi),%%es:(%%edi)\n"
:
: "S" (in+2), "D" (out+2)
: "memory");
printf((char*)in);
printf("\n");
printf((char*)out);
printf("\n");
return 0;
}
/*
On amd64/i386:
bernhard@rechner:~$ uname -a
Linux rechner 4.18.0-1-amd64 #1 SMP Debian 4.18.6-1 (2018-09-06) x86_64 GNU/Linux
bernhard@rechner:~$ ./910571_test_2
ABCDEF
ABCDEF
bernhard@rechner:~$ qemu-i386-static --version
qemu-i386 version 2.12.0 (Debian 1:2.12+dfsg-3)
bernhard@rechner:~$ qemu-i386-static ./910571_test_2
ABCDEF
ABCDEF
gdb -q --args 910571_test_2
...
1: x/i $pc
=> 0x80497dc <main+103>: movsw %ds:(%esi),%es:(%edi)
2: x/s in 0xffffd0f9: "ABCDEF"
3: x/s out 0xffffd0f2: "AB EF"
(gdb) nexti
37 printf((char*)in);
1: x/i $pc
=> 0x80497de <main+105>: sub $0xc,%esp
2: x/s in 0xffffd0f9: "ABCDEF"
3: x/s out 0xffffd0f2: "ABCDEF"
On armel:
root@nas3c3b5d:/home# uname -a
Linux nas3c3b5d 3.16.0-4-kirkwood #1 Debian 3.16.43-2+deb8u1 (2017-06-18) armv5tel GNU/Linux
bernhard@nas3c3b5d:~$ qemu-i386-static -version
qemu-i386 version 2.1.2 (Debian 1:2.1+dfsg-12+deb8u7), Copyright (c) 2003-2008 Fabrice Bellard
bernhard@nas3c3b5d:~$ qemu-i386-static 910571_test_2
ABCDEF
BCEFEF
--> printf iself looks like being affected already.
bernhard@nas3c3b5d:~$ qemu-i386-static -g 50000 910571_test_2
bernhard@rechner:~$ gdb -q --args 910571_test_2
(gdb) target remote nas3c3b5d:50000
...
1: x/i $pc
=> 0x80497dc <main+103>: movsw %ds:(%esi),%es:(%edi)
2: x/s in 0x40800699: "ABCDEF"
3: x/s out 0x40800692: "AB EF"
(gdb) nexti
37 printf((char*)in);
1: x/i $pc
=> 0x80497de <main+105>: sub $0xc,%esp
2: x/s in 0x40800699: "ABCDEF"
3: x/s out 0x40800692: "ABBCEF"
*/