[Top] [All Lists]

Re: quick question on 64-bit values with 32-bit inline assembly

To: Ralf Baechle <>
Subject: Re: quick question on 64-bit values with 32-bit inline assembly
From: "Chris Friesen" <>
Date: Tue, 22 Jan 2008 12:55:45 -0600
In-reply-to: <>
Original-recipient: rfc822;
References: <> <>
User-agent: Mozilla Thunderbird 1.0.2-6 (X11/20050513)
Ralf Baechle wrote:
On Mon, Jan 21, 2008 at 12:09:37PM -0600, Chris Friesen wrote:

We're running a 64-bit kernel and 32-bit userspace. We've got some code that is trying to get a 64-bit timestamp in userspace.

The following code seems to work fine in the kernel but in userspace it appears to be swapping the two words in the result.

  unsigned long long result;

  asm volatile ("rdhwr %0,$31" : "=r" (result));

Ah, Cavium.

Yes indeed. Any peculiarities that we should be watching out for? Previous mailing list threads would be great.

Ouch.  You found a nasty special case.  Normally 32-bit userspace should
not use 64-bit values but since you're running a 64-bit kernel.

I haven't done mips in years and was a bit surprised that the instruction set didn't provide for ways to read high and low words of a 64-bit value the way that ppc32 does.

unsigned long long gethrtime(void)
        unsigned long long result;

        asm volatile(
        "  .set    mips64r2                \n"
        "  rdhwr   %M0, $31                \n"
        "  sll     %L0, %M0, 0             \n"
        "  dsra    %M0, 32                 \n"
        "  .set    mips0                   \n"
        : "=r" (result));

        return result;

Note this wouldn't possibly work on a 32-bit kernel because 32-bit kernels
will corrupt the upper 32-bit of integer registers so you might lose the
result value before you can stash it away.  Also 32-bit kernels don't allow
the execution of 64-bit instructions, not even on 64-bit processors.

I was a bit worried looking at the mips32 architecture manuals...didn't realize that you could just flip to 64-bit mode like that.

Thanks for all the help.


<Prev in Thread] Current Thread [Next in Thread>