delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2004/12/14/19:10:26

X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f
Date: Wed, 15 Dec 2004 01:12:34 -0200
From: Jonatan Liljedahl <lijon AT kymatica DOT com>
To: djgpp AT delorie DOT com
Subject: Problems with timer interrupt chaining and SmartDrv
Message-Id: <20041215011234.44376f01.lijon@kymatica.com>
Organization: Kymatica
X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; i686-pc-linux-gnu)
Mime-Version: 1.0
Reply-To: djgpp AT delorie DOT com

Hi! I'm having some problems with hardware interrupts and smartdrv in my
compositional environment (see http://kymatica.com/kyce if you're
interrested).

Situation: I'm replacing the timer interrupt handler with my own
protected mode handler. I'm also reprogramming the PIT chip to 600Hz
frequency. I keep a counter so that I can call the original realmode
handler at 18.2Hz interval.

Now, everything works fine if I do NOT have smartdrv installed. But if
smartdrv is installed, the computer hangs when smartdrv is writing from
cache to disc. And, if I turn off write-cache (> smartdrv /X) then it
works fine!

If I DON'T chain to the original handler, then it works too (as the
original handler, where smartdrv has it hook, never gets called -
smartdrv never runs, and cache is only written when I put back the
original handler again).

Any help/thoughts about this would make me very happy! Am I doing
something wrong? Is smartdrv a hopeless piece of bugs? If so, can I work
around it somehow? I'd love to not have to write "You must disable
smartdrv's write-cache or this program will hang your computer" in the
manual!

Here's the (simplified) code:

#define TIMER_INTR 8

static _go32_dpmi_seginfo new_vector, old_vector, rm_old_vector;
static _go32_dpmi_registers r;

void clocktick(void) {
  disable();

  /* ...do stuff... */

  if(time_to_call_original_handler) {
    memset(&r,0,sizeof(r));
    r.x.cs = rm_old_vector.rm_segment;
    r.x.ip = rm_old_vector.rm_offset;
    _go32_dpmi_simulate_fcall_iret(&r);
  } else {
    outportb(0x20,0x20);
  }

  enable();
}

void install_handler(void) {
  disable()
  _go32_dpmi_get_protected_mode_interrupt_vector(TIMER_INTR,
&old_vector);
  _go32_dpmi_get_real_mode_interrupt_vector (TIMER_INTR,
&rm_old_vector);
  new_vector.pm_offset = (int) clocktick;
  new_vector.pm_selector = _go32_my_cs();
  _go32_dpmi_allocate_iret_wrapper(&new_vector);
  _go32_dpmi_set_protected_mode_interrupt_vector(TIMER_INTR,
&new_vector)

  outportb(0x43,0x34);
  outportb(0x40,PITFREQ&0xff);
  outportb(0x40,PITFREQ>>8);
  enable();
}

/Jonatan    -=( http://kymatica.com )=-

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019