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