Skip to contentSkip to conversation

The do_fast_gettimeoffset function

DISCUSSION Carsten Langgaard 2 participants 2 messages Nov 13, 2000 – Nov 14, 2000 MIPS

lore
Share & tools
lore
#0 lore raw

The do_fast_gettimeoffset function below (taken from arch/mips/kernel/time.c) can only be used on 64-bit processors. I would like to be able to use this on a 32-bit processor. As I'm not completely sure what this function does, can someone who does please help me out ?

/Carsten

static unsigned long do_fast_gettimeoffset(void)
{
u32 count;
unsigned long res, tmp;

/* Last jiffy when do_fast_gettimeoffset() was called. */ static unsigned long last_jiffies=0;
unsigned long quotient;

/*
* Cached "1/(clocks per usec)*2^32" value.
* It has to be recalculated once each jiffy.
*/
static unsigned long cached_quotient=0;

tmp = jiffies;

quotient = cached_quotient;

if (tmp && last_jiffies != tmp) {
last_jiffies = tmp;
__asm__(".set\tnoreorder\n\t"
".set\tnoat\n\t"
".set\tmips3\n\t"
"lwu\t%0,%2\n\t"
"dsll32\t$1,%1,0\n\t"
"or\t$1,$1,%0\n\t"
"ddivu\t$0,$1,%3\n\t"
"mflo\t$1\n\t"
"dsll32\t%0,%4,0\n\t"
"nop\n\t"
"ddivu\t$0,%0,$1\n\t"
"mflo\t%0\n\t"
".set\tmips0\n\t"
".set\tat\n\t"
".set\treorder"
:"=&r" (quotient)
:"r" (timerhi),

    "m" (timerlo),
    "r" (tmp),
    "r" (USECS_PER_JIFFY)

:"$1");
cached_quotient = quotient;
}

/* Get last timer tick in absolute kernel time */ count = read_32bit_cp0_register(CP0_COUNT);

/* .. relative to previous jiffy (32 bits is enough) */ count -= timerlo;

__asm__("multu\t%1,%2\n\t"
"mfhi\t%0"
:"=r" (res)
:"r" (count),
"r" (quotient));

/*
* Due to possible jiffies inconsistencies, we need to check
* the result so that we'll get a timer that is monotonic. */
if (res >= USECS_PER_JIFFY)
res = USECS_PER_JIFFY-1;

return res;
}

--

_    _ ____  ___   Carsten Langgaard   Mailto:[email protected]
|\  /|||___)(___   MIPS Denmark        Direct: +45 4486 5527
| \/ |||    ____)  Lautrupvang 4B      Switch: +45 4486 5555
  TECHNOLOGIES     2750 Ballerup       Fax...: +45 4486 5556
                   Denmark             http://www.mips.com
#1 lore raw
Quoted 5 lines · Carsten Langgaard

The do_fast_gettimeoffset function below (taken from arch/mips/kernel/time.c) can only be used on 64-bit processors. I would like to be able to use this on a 32-bit processor. As I'm not completely sure what this function does, can someone who does please help me out ?

The function performs a 64-bit division. You may look at
do_ioasic_gettimeoffset which is almost identical (merging of these two functions into a single one is actually on my TODO list) but it works for 32-bit processors.

Signature · 3 lines
+  Maciej W. Rozycki, Technical University of Gdansk, Poland   +
+--------------------------------------------------------------+
+        e-mail: [email protected], PGP key available        +