Subversion Repositories shark

Rev

Rev 120 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/* Project:     OSLib
 * Description: The OS Construction Kit
 * Date:                1.6.2000
 * Idea by:             Luca Abeni & Gerardo Lamastra
 *
 * OSLib is an SO project aimed at developing a common, easy-to-use
 * low-level infrastructure for developing OS kernels and Embedded
 * Applications; it partially derives from the HARTIK project but it
 * currently is independently developed.
 *
 * OSLib is distributed under GPL License, and some of its code has
 * been derived from the Linux kernel source; also some important
 * ideas come from studying the DJGPP go32 extender.
 *
 * We acknowledge the Linux Community, Free Software Foundation,
 * D.J. Delorie and all the other developers who believe in the
 * freedom of software and ideas.
 *
 * For legalese, check out the included GPL license.
 */


/*      Advanced Timer
 *      Date: 8.4.2003
 *      Author: Giacomo Guidi <giacomo@gandalf.sssup.it>
 *
 */


#ifndef __ADVTIMER_H__
#define __ADVTIMER_H__

#include <ll/i386/defs.h>
BEGIN_DEF

/* TSC */

#define rdtsc(low,high) \
     __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high))


#define rdtscll(val) \
     __asm__ __volatile__("rdtsc" : "=A" (val))


/* RTC */

#define RTC_PORT(x)     (0x70 + (x))

#define CMOS_READ(addr,val)     \
{                               \
outp(RTC_PORT(0),(addr));       \
val = inp(RTC_PORT(1));         \
}


#define CMOS_WRITE(addr,val)    \
{                               \
outp(RTC_PORT(0),(addr));       \
outp(RTC_PORT(1),(val));        \
}


#define RTC_IRQ 8

extern signed long long clk_per_msec;

extern __inline__ void UNSIGNED_TSC2NSEC(unsigned long long tsc, unsigned long long *n)
{

        unsigned long nl,nh;

        nl = *n & 0xFFFFFFFF;
        nh = *n >> 32;
       
        __asm__("mull %%ecx\n\t"
                "movl %%eax,%%esi\n\t"
                "movl %%edx,%%edi\n\t"
                "xorl %%edx,%%edx\n\t"
                "movl %6,%%eax\n\t"
                "mull %%ecx\n\t"
                "addl %%edi,%%eax\n\t"
                "adcl $0,%%edx\n\t"
                "movl %5,%%ecx\n\t"
                "divl %%ecx\n\t"
                "xchgl %%eax,%%esi\n\t"
                "divl %%ecx\n\t"
                : "=a" (nl), "=S" (nh)
                : "c" (1000000), "a" ((unsigned long)(tsc & 0xFFFFFFFF)), "d" (0),
                  "m" ((unsigned long)(clk_per_msec)), "m" ((unsigned long)(tsc >> 32)),
                  "S" (0), "D" (0));

        *n = nh;
        *n <<= 32;
        *n |= nl;

}

void ll_init_advtimer(void);
void ll_restore_CMOS(void);

END_DEF
#endif