X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f From: "Rod Pemberton" Newsgroups: comp.os.msdos.djgpp Subject: failure of __dpmi_set_segment_limit() problem Date: Sun, 5 Oct 2008 20:52:41 -0400 Organization: Aioe.org NNTP Server Lines: 125 Message-ID: NNTP-Posting-Host: mQokHQeKeRC37oD/Mq9UYg.user.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-Complaints-To: abuse AT aioe DOT org X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1933 X-Newsreader: Microsoft Outlook Express 6.00.2800.1933 X-Priority: 3 X-MSMail-Priority: Normal To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com I added some *inactive* code to a routine in a program I was working on when it began faulting in main(). I traced the problem to __dpmi_set_segment_limit() from the fault info. The limit hadn't been changed. __dpmi_set_segment_limit wasn't returning an error code either. The problem appears as __dpmi_set_segment_limit() working at first, but then the selector limit is being reset to its pre-call value. I.e., two back-to-back calls to __dpmi_get_segment_limit return two different values, sometimes. The following C code represents the issue, but won't run as is since it doesn't align main() properly. The assembly code below has been adjusted (.space 0x7167) for the missing code and will need to be compiled as "gcc -o test.exe test.s". I've tested this under RM MS-DOS v7.10 w/DJGPP v2.03 (GCC 3.4.1), DJGPP v2.04 (GCC 4.1.0), CWSDPMI v5 old and new, CWSDPMI three 6b versions, PMODETSR, etc. All combinations I've tried fail. I'm not sure why this only happens under these circumstances. Am I doing something wrong? Any help? ---C--- #include #include #include unsigned int misc[60]; unsigned int stack[4096]; #if 0 /* bunch of removed code which aligns main() to offset 0x7617 */ #endif /* first call to get limit prints: ffffffff */ /* second call to get limit should print: ffffffff */ /* second call usually prints ffffffff */ /* but, second call prints 0000afff when main() is at offset 0x7617 */ int main(void) { unsigned long i; unsigned char k[256]="ABCD"; __dpmi_set_segment_limit(_my_ds(),0xFFFFFFFF); printf("%08lx\n",__dpmi_get_segment_limit(_my_ds())); printf("%08lx\n",__dpmi_get_segment_limit(_my_ds())); return(0); } ---assembly--- .file "test.c" .section .text .space 0x7617 LC1: .ascii "%08lx\12\0" LC0: .ascii "ABCD\0" .space 251 .globl _main _main: leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx) pushl %ebp movl %esp, %ebp pushl %ecx subl $276, %esp movl LC0, %eax movl %eax, -264(%ebp) movb LC0+4, %al movb %al, -260(%ebp) leal -259(%ebp), %edx movl $251, %eax subl $4, %esp pushl %eax pushl $0 pushl %edx call _memset addl $16, %esp call __my_ds subl $8, %esp pushl $-1 pushl %eax call ___dpmi_set_segment_limit addl $16, %esp call __my_ds subl $12, %esp pushl %eax call ___dpmi_get_segment_limit addl $16, %esp subl $8, %esp pushl %eax pushl $LC1 call _printf addl $16, %esp call __my_ds subl $12, %esp pushl %eax call ___dpmi_get_segment_limit addl $16, %esp subl $8, %esp pushl %eax pushl $LC1 call _printf addl $16, %esp movl $0, %eax movl -4(%ebp), %ecx leave leal -4(%ecx), %esp ret __my_ds: pushl %ebp movl %esp, %ebp subl $16, %esp /APP movw %ds,%ax /NO_APP movw %ax, -2(%ebp) movw -2(%ebp), %ax andl $65535, %eax leave ret .comm _misc,240 .comm _stack,16384 Rod Pemberton