From: "Paolo Gava" Newsgroups: comp.os.msdos.djgpp Subject: critical section again Lines: 209 X-Newsreader: Microsoft Outlook Express 4.72.3110.1 X-MimeOLE: Produced By Microsoft MimeOLE V4.72.3110.3 Message-ID: Date: Wed, 13 Oct 1999 22:58:00 +1000 NNTP-Posting-Host: 203.41.169.57 X-Complaints-To: abuse AT telstra DOT net X-Trace: nsw.nnrp.telstra.net 939819123 203.41.169.57 (Wed, 13 Oct 1999 22:52:03 EST) NNTP-Posting-Date: Wed, 13 Oct 1999 22:52:03 EST Organization: Customer of Telstra Big Pond Direct To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com Hi, I still have problem to implement a critical section. I wrote here some code that I'm using, hope someone can find what it is wrong... I'm using DJGPP version 2.02 withWindows98 Here is the code: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /* irq_wrapper.s */ .text .globl _irq_wrapper .align 4 _irq_wrapper: pushw %ds pushw %es pushw %fs pushw %gs pushal movb $0x0C, %al outb %al, $0x70 inb $0x71, %al movb $0x20, %al outb %al, $0xA0 outb %al, $0x20 .byte 0x2E movw ___djgpp_ds_alias, %ax movw %ax, %ds movw %ax, %es movw %ax, %fs movw %ax, %gs leal _irq_stack, %ebx movl %esp, %ecx movw %ss, %dx movl (%ebx), %esp movw %ax, %ss pushl %edx pushl %ecx pushl %ebx cld call _MyHandler cli nop popl %ebx popl %ecx popl %edx movl %esp, (%ebx) movw %dx, %ss movl %ecx, %esp popal popw %gs popw %fs popw %es popw %ds ljmp %cs:_old_timer_irq popal popw %gs popw %fs popw %es popw %ds sti iret .globl _irq_wrapper_end .align 4 _irq_wrapper_end: ret /* main.c */ #include #include #include #include #include #include #include extern void irq_wrapper(void); extern void irq_wrapper_end(void); void MyHandler(void); void MyHandler_end(void); __dpmi_paddr old_timer_irq; unsigned char *irq_stack; unsigned ulCount=0; #define STACK_SIZE 8*1024 #define END_OF_FUNCTION(x) void x##_end(void) { } #define LOCK_DATA(d,s) _go32_dpmi_lock_data((d), (s)) #define LOCK_CODE(c,s) _go32_dpmi_lock_code((c), (s)) #define UNLOCK_DATA(d,s) _unlock_dpmi_data((d), (s)) #define LOCK_VARIABLE(x) LOCK_DATA((void *)&x, sizeof(x)) #define LOCK_FUNCTION(x) LOCK_CODE(x, (long)x##_end - (long)x) void install_irq(int num, void (*handler)(void), __dpmi_paddr *old_irq) { __dpmi_paddr addr; addr.selector = _my_cs(); addr.offset32 = (long)handler; __dpmi_get_protected_mode_interrupt_vector(num, old_irq); __dpmi_set_protected_mode_interrupt_vector(num, &addr); } void remove_irq(int num, __dpmi_paddr old_irq) { __dpmi_set_protected_mode_interrupt_vector(num, &old_irq); } void sys_call(void) { long l; for (l=0; l<50000; l++) printf("%ld, %ld\n", ulCount); } void MyHandler(void) { ulCount += 1; } END_OF_FUNCTION(MyHandler); int main(void) { LOCK_VARIABLE(irq_stack); LOCK_VARIABLE(ulCount); LOCK_VARIABLE(old_timer_irq); LOCK_FUNCTION(irq_wrapper); LOCK_FUNCTION(MyHandler); irq_stack = malloc(STACK_SIZE); if (irq_stack) { LOCK_DATA(irq_stack, STACK_SIZE); irq_stack += STACK_SIZE - 32; } install_irq(0x8, irq_wrapper, &old_timer_irq); disable(); sys_call(); enable(); remove_irq(0x8, old_timer_irq); } As you can see this code install the function irq_wrapper to the interrupt number 0x8 that is the timer interrupt. irq_wrapper is an assembler routine that call my interrupt timer handler (MyHandler). Actually this handler just increase a counter (ulCount). When I call sys_call() the interrupt should be disable, but when I print ulCount, I see that it is increased. By the way most of this code comes from Allegro... Paolo