[lkml]   [2009]   [Jan]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Subjectinline asm semantics: output constraint width smaller than input

    I am trying to build the kernel with LLVM 2.5 prerelease (using
    llvm-gcc-4.2 frontend), however I am running into some inline asm
    semantics issues, and after some discussion on LLVM bugzilla I would
    like to know if you would be accepting patches for this:

    The problem is when "a" output constraint is used with a variable of
    smaller width than the
    "0" input constraint.

    Here are 2 examples:

    int __ret_pu; unsigned long __pu_val;
    return ({asm volatile("call __put_user_" "8" : "=a" (__ret_pu) :"0"
    (__pu_val), "c"(addr) : "ebx"); __ret_pu;});

    unsigned char return_code; /* %al */
    unsigned long address; /* %ebx */
    unsigned long length; /* %ecx */
    unsigned long entry; /* %edx */
    unsigned long flags;
    __asm__("lcall *(%%edi); cld"
    : "=a" (return_code),
    "=b" (address),
    "=c" (length),
    "=d" (entry)
    : "0" (service),
    "1" (0),
    "D" (&bios32_indirect));

    There are 2 cases:
    1. output is wider than input
    2. output is narrower than input

    Case 2 seems to occur lots of times on 64-bit (due to sizeof(int) != sizeof(unsigned long)),
    and a few times on 32-bit as well.

    Would you accept patches that increase the portability of the inline asm statements?
    (essentially by adding casts for case 1, and introducing a temporary of correct width for case 2).

    Please see:

    Best regards,

     \ /
      Last update: 2009-01-23 18:59    [W:0.021 / U:35.376 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site