This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/69575] New: [interrupt] The direction flag DF in the FLAGS register may be wrong in interrupt handler
- From: "hjl.tools at gmail dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Sun, 31 Jan 2016 04:00:44 +0000
- Subject: [Bug target/69575] New: [interrupt] The direction flag DF in the FLAGS register may be wrong in interrupt handler
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69575
Bug ID: 69575
Summary: [interrupt] The direction flag DF in the FLAGS
register may be wrong in interrupt handler
Product: gcc
Version: 6.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: hjl.tools at gmail dot com
CC: vaalfreja at gmail dot com
Target Milestone: ---
Target: x86
The x86 psABI says
The direction flag DF in the FLAGS register must be clear (set to âforwardâ
direction) on function entry and return. Other user flags have no specified
role in the standard calling sequence and are not preserved across calls
Since the direction flag DF in the FLAGS register is unknown in interrupt
handler, the result will be wrong if DF isn't cleared:
[hjl@gnu-tools-1 gcc]$ cat /tmp/x.i
extern void *a;
extern int b;
__attribute__ ((interrupt))
void
foo (void *frame)
{
__builtin_memset (a, b, 40);
}
[hjl@gnu-tools-1 gcc]$ ./xgcc -B./ -c -Os /tmp/x.i
[hjl@gnu-tools-1 gcc]$ objdump -dwr x.o
x.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <foo>:
0: 57 push %rdi
1: 48 8b 3d 00 00 00 00 mov 0x0(%rip),%rdi # 8 <foo+0x8>
4: R_X86_64_PC32 a-0x4
8: 51 push %rcx
9: 50 push %rax
a: b9 28 00 00 00 mov $0x28,%ecx
f: 8a 05 00 00 00 00 mov 0x0(%rip),%al # 15 <foo+0x15>
11: R_X86_64_PC32 b-0x4
15: f3 aa rep stos %al,%es:(%rdi)
17: 58 pop %rax
18: 59 pop %rcx
19: 5f pop %rdi
1a: 48 cf iretq
[hjl@gnu-tools-1 gcc]$