Port-amd64 archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Weird assembly code behavior
Following up my experiment with running multiboot2_pre_reloc() on amd64.
I described here the weird things that happened when running that
function on amd64 with qemu:
http://mail-index.netbsd.org/port-amd64/2020/02/02/msg003145.html
Since the problem seemed linked to r8 usage, a first solution that
worked around the problem was to build the function as 32 bit code. I
since discovered that building with -O0 was enough to remove r8-r15
usage in x86 assembly generated by gcc.
With -O0, multiboot2_pre_reloc seems to behave better, but things get
bad again when memcpy() is called: the function corrupts the stack
pointer for no reason I can understand.
Here is memcpy ran using gdb's single instruction step:
0xe85d50 <memcpy>: mov %rdx,%rcx
Here rsp = 0x18001a4
0xe85d51 <memcpy+1>: mov %edx,%ecx
0xe85d53 <memcpy+3>: mov %rdi,%rax
0xe85d54 <memcpy+4>: mov %edi,%eax
0xe85d56 <memcpy+6>: mov %rdi,%r11
0xe85d57 <memcpy+7>: mov %edi,%ebx
0xe85d59 <memcpy+9>: shr $0x3,%rcx
0xe85d5a <memcpy+10>: shr $0x3,%ecx
0xe85d5d <memcpy+13>: je 0xe85d9c <memcpy+76>
0xe85d5f <memcpy+15>: lea -0x8(%rdi,%rdx,1),%r9
That instruction changed rsp to 0x18001a3
0xe85d60 <memcpy+16>: lea -0x8(%rdi,%rdx,1),%ecx
0xe85d64 <memcpy+20>: mov -0x8(%rsi,%rdx,1),%r10
That instruction changed rsp to 0x18001a2
0xe85d65 <memcpy+21>: mov -0x8(%rsi,%rdx,1),%edx
Does that ring a bell to someone? Is that some weird x86_64 behavior, or
should I look for a qemu bug?
--
Emmanuel Dreyfus
http://hcpnet.free.fr/pubz
manu%netbsd.org@localhost
Home |
Main Index |
Thread Index |
Old Index