Subversion Repositories shark

Rev

Rev 301 | 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

#include <ll/sys/ll/time.h>

/* TSC */

#define rdtsc(low,high) \
     __asm__ __volatile__("xorl %%eax,%%eax\n\t" \
                          "cpuid\n\t"            \
                          "rdtsc\n\t"            \
                          "movl %%eax,%%esi\n\t" \
                          "movl %%edx,%%edi\n\t" \
                          "xorl %%eax,%%eax\n\t" \
                          "cpuid"                \
                          : "=S" (low), "=D" (high) \
                          :: "ebx", "ecx")


#define rdtscll(val) \
     __asm__ __volatile__("xorl %%eax,%%eax\n\t" \
                          "cpuid\n\t"            \
                          "rdtsc\n\t"            \
                          "pushl %%eax\n\t"      \
                          "pushl %%edx\n\t"      \
                          "xorl %%eax,%%eax\n\t" \
                          "cpuid\n\t"            \
                          "popl %%edx\n\t"       \
                          "popl %%eax\n\t"       \
                          : "=A" (val)           \
                          :: "ebx","ecx")


//Low level time read function
extern __inline__ void ll_read_timespec(struct timespec *tspec)
{
    extern unsigned int clk_per_msec;
    extern unsigned long long *ptr_init_nsec;
    extern unsigned long long *ptr_init_tsc;

    if (clk_per_msec == 0) {
            NULL_TIMESPEC(tspec);
            return;
    }
   
    __asm__("xorl %%eax,%%eax\n\t"
            "cpuid\n\t"  
            "rdtsc\n\t"
            "pushl %%eax\n\t"
            "pushl %%edx\n\t"
            "xorl %%eax,%%eax\n\t"
            "cpuid\n\t"
            "popl %%edx\n\t"
            "popl %%eax\n\t"
            "movl %4,%%ebx\n\t"
            "subl (%%edi),%%eax\n\t"
            "sbbl 4(%%edi),%%edx\n\t"
            "movl %%edx,%%ecx\n\t"
            "movl $1000000,%%edi\n\t"
            "mull %%edi\n\t"
            "pushl %%eax\n\t"
            "movl %%ecx,%%eax\n\t"
            "movl %%edx,%%ecx\n\t"
            "mull %%edi\n\t"
            "addl %%ecx,%%eax\n\t"
            "adcl $0,%%edx\n\t"
            "divl %%ebx\n\t"
            "movl %%eax,%%ecx\n\t"
            "popl %%eax\n\t"
            "divl %%ebx\n\t"
            "movl %%ecx,%%edx\n\t"
            "addl (%%esi),%%eax\n\t"
            "adcl 4(%%esi),%%edx\n\t"
            "movl $1000000000,%%edi\n\t"
            "divl %%edi\n\t"       
            : "=a" (tspec->tv_sec), "=d" (tspec->tv_nsec)
            : "D" (ptr_init_tsc), "S" (ptr_init_nsec), "m" (clk_per_msec)
            : "ebx", "ecx");
             
}

#define rdmsr(msr,val1,val2) \
     __asm__ __volatile__("rdmsr" \
                          : "=a" (val1), "=d" (val2) \
                          : "c" (msr))

                                                                                                                             
#define wrmsr(msr,val1,val2) \
     __asm__ __volatile__("wrmsr" \
                          : /* no outputs */ \
                          : "c" (msr), "a" (val1), "d" (val2))


/* 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

void ll_init_advtimer(void);
void ll_restore_adv(void);

END_DEF
#endif