www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1997/07/05/00:51:13

From: Roberto Garza <robgarza AT infosel DOT net DOT mx>
Subject: Re: IRQ trap with stack change, very intersting!
Message-ID: <ypQRT0Mi8GA.212@cidintnews>
Newsgroups: alt.msdos.programmer,comp.os.msdos.djgpp,comp.os.msdos.programmer
Date: Fri, 04 Jul 1997 17:53:23 -0500
Lines: 41
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp

text esto es una prueba

-----------------------------------------------------

"Romano Signorelli" <signorelli AT gefran DOT it> escribe:
> Hi,
> i'm using Borland C++ 4.52 with DOS powerpack which provide DPMI16 and
> DPMI32 support.
> I'm trying to trap IRQ 10 (interrupt 0x71), also IRQ 8 (interrupt 0x1c).
> 
> I want to write a dual-task program. Each time the interrupt come, i want
> to do a stack switch (íve provided 2 separated stacks, allocated at
> start-time), save the registers, change the return CS:IP in the stack to
> point to the next task and, then, do an IRET.
> Here are some source code (simplified for debugging purposes):
> -- Start code:
> InitCode();
> #ifdef DEBUG_VERSION
>  geninterrupt(0x71);
> #endif
> do{
> while(1==1);
> 
> -- Task1 code:
> do{
>   task1_counter++;
>   #ifdef DEBUG_VERSION
>    geninterrupt(0x71);
>   #endif
> } while (1==1);
> 
> -- Task2 code:
> do{
>   task2_counter++;
>   #ifdef DEBUG_VERSION
>    geninterrupt(0x71);
>   #endif
> }while (1==1);
> 
> With DEBUG_VERSION defined, my INT routine works well, it does a correct
> stack switch and the 2 tasks take 50% CPU time each.
> The problem comes when i try to install my INT routine over an hardware
> interrupt (my IRQ 10 or the PC's IRQ 8). The stack isn't my program stack
> (i think it is the DPMI server INT stack) and i cannot find the correct
> return CS:IP in it.
> Please HELP ME!!!
> 
> Thanks in advance, bye.
> Note: please don't flame with messages like "Why don't you use OS/2" or
> similar. I have to do it in pure DOS. Thanks.
> 

ip archive with the DJGPP cross compiling
# stuff
djcrx=~/ftp/pub/simtelnet/gnu/djgpp/v2/djcrx201.zip

# I tested it on a PPro 200Mhz and there uname -m prints 'i686' which
# is unknown for binutils
host=i486-unknown-linux

# this will be fixed in the future, but currently the targets for
# DJGPP are named different in the binutils and gcc
bnu_target=i386-coff-go32
gcc_target=i386-go32-msdos

# this should be almost ${gcc_target}, because it is hardcoded
# in gcc for directory searching
install_target=${gcc_target}

mkdir -p ${build_dir}
cd ${build_dir}
tar -xzvf ${bnu_src}
mkdir dos-binutils
cd dos-binutils

../binutils-${bnu_ver}/configure --host=${host} --target=${bnu_target}
--prefix=${prefix_dir}

# NOTE: The above is one long line
 
make CFLAGS=-O2
mkdir -p ${prefix_dir}/i386-go32-msdos/bin
cd binutils
cp ar c++filt objcopy objdump size ${prefix_dir}/i386-go32-msdos/bin
cp nm.new ${prefix_dir}/i386-go32-msdos/bin/nm
cp strip.new ${prefix_dir}/i386-go32-msdos/bin/strip
cd ../gas
cp as.new ${prefix_dir}/i386-go32-msdos/bin/as
cp gasp.new ${prefix_dir}/i386-go32-msdos/bin/gasp
cd ../ld
cp ld.new ${prefix_dir}/i386-go32-msdos/bin/ld
cd ../..

# If you have not so much disk space, you can do now
# rm -rf binutils-${bnu_ver} dos-binutils

tar -xzvf ${gcc_src}
mkdir dos-gcc
cd dos-gcc

../gcc-${gcc_ver}/configure --host=i486-unknown-linux
--target=${gcc_target} --prefix=${prefix_dir}

# NOTE: the above is one long line

make LANGUAGES="c c++" CFLAGS=-O2
mkdir -p ${prefix_dir}/bin
cp xgcc ${prefix_dir}/bin/gcc-dos
cp cc1 ${prefix_dir}/i386-go32-msdos/bin/cc1
cp cccp ${prefix_dir}/i386-go32-msdos/bin/cpp
cp cc1plus ${prefix_dir}/i386-go32-msdos/bin/cc1plus
cd ${prefix_dir}
mkdir djgpp
cd djgpp
unzip -a ${djcrx}

# this is a needed patch and can be removed from bnu 2.8.2 on
cd lib
cp djgpp.djl djgpp.djl.ori
sed 's,coff-go32,coff-i386,g' djgpp.djl.ori > djgpp.djl
cd ..

# build the stubify program
cd src/stub
make stubify
cp stubify ${prefix_dir}/i386-go32-msdos/bin
mkdir -p ${prefix_dir}/lib/gcc-lib/i386-go32-msdos/${gcc_ver}

# create some symbolic links
cd ${prefix_dir}/lib/gcc-lib/i386-go32-msdos/${gcc_ver}
ln -s ${prefix_dir}/djgpp/include .
ln -s ${prefix_dir}/djgpp/lib/* .
echo Now I am testing the installation.
echo Errors will be redirected to ${build_dir}/Errs
echo Output will be redirected to ${build_dir}/Out
cd ${prefix_dir}/djgpp/src/stub

${prefix_dir}/bin/gcc-dos -v -o stubify.exe stubify.c 2>${build_dir}/Err
>${build_dir}/Out

# NOTE: the above is one long line

rm stubify.exe
echo Now I am ready. Do not forget to add ${prefix_dir}/bin to your PATH
echo and then you can use gcc-dos to compile/link for DJGPP.

-----------CUT here----------------------

BTW: I executed some minutes ago the following on a linux
machine with a PPro 200Mhz and 256 MB RAM!!

date > date1; cross.sh; date >> date1

and here is the contents of the file date1:

Tue Jul  1 11:01:16 MET DST 1997
Tue Jul  1 11:10:37 MET DST 1997

As you can see it took me about 9 minutes!!!!

Robert
-- 
*****************************************************************
* Robert Hoehne, Fakultaet fuer Mathematik, TU-Chemnitz-Zwickau *
* Post:    Am Berg 3, D-09573 Dittmannsdorf                     *
* e-Mail:  Robert DOT Hoehne AT Mathematik DOT TU-Chemnitz DOT DE              *
* WWW:     http://www.tu-chemnitz.de/~rho                       *
*****************************************************************

- Raw text -


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