Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 304 → Rev 305

/shark/trunk/oslib/kl/event.c
36,6 → 36,7
#include <ll/i386/pit.h>
#include <ll/i386/apic.h>
#include <ll/i386/advtimer.h>
#include <ll/i386/64bit.h>
 
#include <ll/sys/ll/ll-data.h>
#include <ll/sys/ll/ll-instr.h>
72,9 → 73,7
extern void (*evt_prol) (void);
extern void (*evt_epil) (void);
 
extern unsigned char use_tsc;
extern unsigned char use_apic;
extern signed long long apic_clk_per_msec;
extern unsigned int apic_clk_per_msec;
 
void event_setlasthandler(void *p)
{
167,13 → 166,15
void periodic_wake_up(void)
{ /* CHANGE the NAME, please... */
struct event *p, *pp;
WORD tmp;
#ifndef __TSC__
WORD tmp;
#endif
 
if(!use_tsc) {
#ifndef __TSC__
tmp = pit_read(frc);
ADDPITSPEC((WORD) (lastTime - tmp), &globalCounter);
lastTime = tmp;
}
#endif
activeInt++;
if (activeInt == 1 && evt_prol != NULL) {
180,11 → 181,11
evt_prol();
}
 
if (!use_tsc) {
#ifndef __TSC__
ADDNANO2TIMESPEC(nts, &actTime);
} else {
#else
ll_read_timespec(&actTime);
}
#endif
for (p = firstevent; p != NULL; p = pp) {
/*
217,25 → 218,30
int i;
BYTE mask;
TIME t;
DWORD apic_clk;
#ifdef __APIC__
DWORD apic_clk;
#endif
 
if (use_tsc) ll_init_advtimer();
#ifdef __TSC__
ll_init_advtimer();
#endif
 
if (!use_apic)
#ifndef __APIC__
IDT_place(0x40,ll_timer);
else
#else
IDT_place(0x39,ll_apic_timer);
#endif
 
if (l->mode != LL_PERIODIC) {
message("One-shot mode\n");
t = 0;
if (!use_apic) {
#ifndef __APIC__
/* Mode: Binary/Mode 4/16 bit Time_const/Counter 0 */
pit_init(0, TMR_MD4, 0xFFFF); /* Timer 0, Mode 4, constant 0xFFFF */
} else {
#else
set_APIC_timer(0xFFFFFFFF);
enable_APIC_timer();
}
#endif
} else {
t = l->tick;
248,10 → 254,10
/* If T-C == 0 -> T-C = 65536 (Max available) */
ticksize = t;
 
if (!use_apic) {
t = (signed long long)(t) * 1193182 / 1000000;
#ifndef __APIC__
 
mul32div32to32(t,1197,1000,t);
 
/* Only for security! This should cause timer overrun */
/* While 0 would set maximum period on timer */
if (t == 0)
260,17 → 266,17
/* Mode: Binary/Mode 2/16 bit Time_const/Counter 0 */
pit_init(0, TMR_MD2, t); /* Timer 0, Mode 2, Time constant t */
} else {
#else
 
apic_clk = (signed long long)(t) * apic_clk_per_msec / 1000;
mul32div32to32(t,apic_clk_per_msec,1000,apic_clk);
set_APIC_timer(apic_clk);
enable_APIC_timer();
 
}
#endif
}
timermode = l->mode;
if (!use_apic) {
#ifndef __APIC__
if (ll_arch.x86.cpu > 4) {
/* Timer1: mode 0, time const 0... */
pit_init(1, TMR_MD0, 0);
280,7 → 286,7
pit_init(2, TMR_MD0, 0);
outp(0x61, 3);
}
}
#endif
 
mask = ll_in(0x21);
mask &= 0xFE; /* 0xFE = ~0x01 */
316,6 → 322,8
}
 
/* Last but not least... */
if (!use_apic) irq_unmask(0);
#ifndef __APIC__
irq_unmask(0);
#endif
 
}