All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ralf Baechle <ralf@linux-mips.org>
To: Chris Friesen <cfriesen@nortel.com>
Cc: linux-mips@linux-mips.org
Subject: Re: quick question on 64-bit values with 32-bit inline assembly
Date: Tue, 22 Jan 2008 17:57:34 +0000	[thread overview]
Message-ID: <20080122175734.GA31013@linux-mips.org> (raw)
In-Reply-To: <4794DFE1.5040805@nortel.com>

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.
>
> gethrtime(void)
> {
>    unsigned long long result;
>
>    asm volatile ("rdhwr %0,$31" : "=r" (result));

Ah, Cavium.

>    return result;
> }
>
> Do I need to do something special because userspace is 32-bit?  If so, can 
> someone point me to a reference?

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.

unsigned long long gethrtime(void)
{
	unsigned 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.

  Ralf

  reply	other threads:[~2008-01-22 17:57 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-01-21 18:09 quick question on 64-bit values with 32-bit inline assembly Chris Friesen
2008-01-22 17:57 ` Ralf Baechle [this message]
2008-01-22 18:02   ` Geert Uytterhoeven
2008-01-22 18:26     ` Ralf Baechle
2008-01-22 18:55   ` Chris Friesen
2008-01-22 20:07     ` Ralf Baechle
2008-01-28 21:02       ` M. Warner Losh
2008-01-28 21:18         ` Ralf Baechle
2008-01-28 21:26           ` M. Warner Losh
2008-01-29 10:16             ` Maciej W. Rozycki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080122175734.GA31013@linux-mips.org \
    --to=ralf@linux-mips.org \
    --cc=cfriesen@nortel.com \
    --cc=linux-mips@linux-mips.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.