Mail Archives: djgpp/1998/04/10/21:45:27
From: | Michele Manzato <aragorn AT dei DOT unipd DOT it>
|
Newsgroups: | comp.os.msdos.djgpp
|
Subject: | Creating and using a protected stack area: how?
|
Date: | Fri, 10 Apr 1998 13:25:02 +0200
|
Organization: | BBS - Universita' di Padova - Italia
|
Lines: | 52
|
Message-ID: | <Pine.GSO.3.93.980410130622.5959A-100000@ogni9>
|
NNTP-Posting-Host: | ogni9.dei.unipd.it
|
Mime-Version: | 1.0
|
To: | djgpp AT delorie DOT com
|
DJ-Gateway: | from newsgroup comp.os.msdos.djgpp
|
I am writing a multithreading library for DJGPP, so I have to manage stack
switches from a thread to another thread. Obviously the stacks are private
to the thread and are allocated via malloc(). Stack switching works
very vell... as long as I use DS as SS.
Now I want to have a protected stack for every thread, so I want to set up
a selector for the thread's private stack. This is the code I wrote, I
hope it is self explaining:
// stack base is stack_base (long *)
// stack length is _stackLength (int)
// stack pointer is stack_pointer (long *)
unsigned long baseaddr;
short sel;
int r;
unsigned short SS;
unsigned long ESP;
r = __dpmi_get_segment_base_address(_my_ds(), &baseaddr);
baseaddr += (unsigned long) (stack_base);
sel = __dpmi_create_alias_descriptor(_my_ds());
r = __dpmi_set_segment_base_address(sel, baseaddr);
r = __dpmi_set_segment_limit(sel, _stackLength);
SS = sel;
ESP = (long *) ((long) stack_pointer - (long)
(stack_base));
then when I have to switch the stack I simply copy SS to %ss and ESP to
%esp (with an assembly procedure). No way! Debugging the program I can
see that the stack is OK (it contains what it must) and the program
runs correctly until it finds a 'retf' instruction. Then it returns... to
nowhere, the debugger only shows rubbish. Please note that without using
the new SS:ESP it works fine. I suspect that changing SS influences CS
as well, or at least it influences the way 'retf' works... but I don't
know how.
Can anybody help me? Any suggestion will be greatly appreciated.
Ciao (bye)
Michele
-- Michele Manzato -------------------------------------------------------
Home: via Aldo Moro, 30 - 37066 School: via dei Savonarola, 176
Sommacampagna VR ITALY PADOVA PD ITALY
Phone no. +45 896 0281 Phone no. +49 871 9777
e-mail: aragorn AT resurrection DOT com WWW: www.dei.unipd.it/~aragorn
--------------------------------------------------------------------------
- Raw text -