[lkml]   [2008]   [Mar]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    SubjectLinux doesn't follow x86/x86-64 ABI wrt direction flag
    Hi all,

    Since version 4.3, gcc changed its behaviour concerning the x86/x86-64
    ABI and the direction flag, that is it now assumes that the direction
    flag is cleared at the entry of a function and it doesn't clear once
    more if needed.

    This causes some problems with the Linux kernel which does not clear
    the direction flag when entering a signal handler. The small code below
    (for x86-64) demonstrates that.

    If the signal handler is using code that need the direction flag cleared
    (for example bzero() or memset()), the code is incorrectly executed.

    I guess this has to be fixed on the kernel side, but also gcc-4.3 could
    revert back to the old behaviour, that is clearing the direction flag
    when entering a routine that touches it until most people are running a
    fixed kernel.

    Kind regards,


    #include <stdint.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <signal.h>

    void handler(int signal) {
    uint64_t rflags;

    asm volatile("pushfq ; popq %0" : "=g" (rflags));

    if (rflags & (1 << 10))
    printf("DF = 1\n");
    printf("DF = 0\n");

    int main() {
    signal(SIGUSR1, handler);

    asm volatile("std\r\n");

    return 0;

    .''`. Aurelien Jarno | GPG: 1024D/F1BCDB73
    : :' : Debian developer | Electrical Engineer
    `. `' |
    `- |

     \ /
      Last update: 2008-03-05 16:33    [W:0.020 / U:11.012 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site