All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Chris Friesen" <cfriesen@nortel.com>
To: Ralf Baechle <ralf@linux-mips.org>
Cc: linux-mips@linux-mips.org
Subject: Re: quick question on 64-bit values with 32-bit inline assembly
Date: Tue, 22 Jan 2008 12:55:45 -0600	[thread overview]
Message-ID: <47963C31.2000403@nortel.com> (raw)
In-Reply-To: <20080122175734.GA31013@linux-mips.org>

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

Chris

  parent reply	other threads:[~2008-01-22 18:56 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
2008-01-22 18:02   ` Geert Uytterhoeven
2008-01-22 18:26     ` Ralf Baechle
2008-01-22 18:55   ` Chris Friesen [this message]
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=47963C31.2000403@nortel.com \
    --to=cfriesen@nortel.com \
    --cc=linux-mips@linux-mips.org \
    --cc=ralf@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.