Improve IRQ handling in DOS builds

Co-authored-by: sezero <sezero@users.noreply.github.com>
master
Cameron Cawley 4 years ago committed by Ozkan Sezer
parent 902a8bad43
commit 66a314674c
  1. 43
      src/dos/dosirq.c
  2. 6
      src/dos/dosirq.h
  3. 13
      src/dos/dossb.c

@ -129,7 +129,7 @@ static void _free_iret_wrapper(_go32_dpmi_seginfo * info)
free((void *)info->pm_offset);
}
struct irq_handle *irq_hook(int irqno, irq_handler handler, void (*end)())
struct irq_handle *irq_hook(int irqno, irq_handler handler, irq_handler end)
{
int interrupt;
struct irq_handle *irq;
@ -215,7 +215,7 @@ void irq_unhook(struct irq_handle *irq)
#elif defined(__WATCOMC__)
struct irq_handle *irq_hook(int irqno, irq_handler handler, void (*end)())
struct irq_handle *irq_hook(int irqno, irq_handler handler, irq_handler end)
{
unsigned long size = (char *)end - (char near *)handler;
int intno = (irqno > 7) ? (irqno + 104) : (irqno + 8);
@ -290,9 +290,6 @@ static void INTERRUPT_ATTRIBUTES NO_REORDER __irq##irqno##_handler () \
__irq_mask |= (1 << irqno); \
} \
irq_ack (__irqs [irqno]); \
} \
static void NO_REORDER __irq##irqno##_end(void) \
{ \
}
/* *INDENT-OFF* */
@ -312,28 +309,28 @@ DECLARE_IRQ_HANDLER(12)
DECLARE_IRQ_HANDLER(13)
DECLARE_IRQ_HANDLER(14)
DECLARE_IRQ_HANDLER(15)
static void INTERRUPT_ATTRIBUTES NO_REORDER __irq_end(void) { }
/* *INDENT-ON* */
static struct {
irq_handler handler;
void (*end)();
irq_handler handler, end;
} __irq_handlers[16] = {
{ __irq0_handler, __irq0_end },
{ __irq1_handler, __irq1_end },
{ __irq2_handler, __irq2_end },
{ __irq3_handler, __irq3_end },
{ __irq4_handler, __irq4_end },
{ __irq5_handler, __irq5_end },
{ __irq6_handler, __irq6_end },
{ __irq7_handler, __irq7_end },
{ __irq8_handler, __irq8_end },
{ __irq9_handler, __irq9_end },
{ __irq10_handler, __irq10_end },
{ __irq11_handler, __irq11_end },
{ __irq12_handler, __irq12_end },
{ __irq13_handler, __irq13_end },
{ __irq14_handler, __irq14_end },
{ __irq15_handler, __irq15_end }
{ __irq0_handler, __irq1_handler },
{ __irq1_handler, __irq2_handler },
{ __irq2_handler, __irq3_handler },
{ __irq3_handler, __irq4_handler },
{ __irq4_handler, __irq5_handler },
{ __irq5_handler, __irq6_handler },
{ __irq6_handler, __irq7_handler },
{ __irq7_handler, __irq8_handler },
{ __irq8_handler, __irq9_handler },
{ __irq9_handler, __irq10_handler },
{ __irq10_handler, __irq11_handler },
{ __irq11_handler, __irq12_handler },
{ __irq12_handler, __irq13_handler },
{ __irq13_handler, __irq14_handler },
{ __irq14_handler, __irq15_handler },
{ __irq15_handler, __irq_end }
};
void irq_detect_start(unsigned int irqs, int (*irq_confirm) (int irqno))

@ -17,8 +17,8 @@
#define PIC1_BASE 0x20 /* PIC1 base */
#define PIC2_BASE 0xA0 /* PIC2 base */
#ifdef __GNUC__
#define NO_REORDER __attribute__((no_reorder))
#if defined(__GNUC__) && (__GNUC__ >= 5)
#define NO_REORDER __attribute__((no_reorder,no_icf,noinline,noclone))
#else
#define NO_REORDER
#endif
@ -107,7 +107,7 @@ static inline int irq_check(struct irq_handle * irq)
/* Hook a specific IRQ; NOTE: IRQ is disabled upon return, irq_enable() it */
extern struct irq_handle *irq_hook(int irqno, irq_handler handler,
void (*end)());
irq_handler end);
/* Unhook a previously hooked IRQ */
extern void irq_unhook(struct irq_handle * irq);
/* Start IRQ detection process (IRQ list is given with irq mask) */

@ -42,6 +42,13 @@ _func_noclone
inportb(SB_DSP_RESET);
}
#if defined(__WATCOMC__)
static void nop (void);
#pragma aux nop = "nop"
#else
#define nop()
#endif
static void INTERRUPT_ATTRIBUTES NO_REORDER sb_irq()
{
/* Make sure its not a spurious IRQ */
@ -68,8 +75,9 @@ static void INTERRUPT_ATTRIBUTES NO_REORDER sb_irq()
sb.timer_callback();
}
static void NO_REORDER sb_irq_end()
static void NO_REORDER INTERRUPT_ATTRIBUTES sb_irq_end()
{
nop();
}
static boolean __sb_reset()
@ -127,8 +135,9 @@ static void INTERRUPT_ATTRIBUTES NO_REORDER __sb_irq_dmadetect()
irq_ack(sb.irq_handle);
}
static void NO_REORDER __sb_irq_dmadetect_end()
static void INTERRUPT_ATTRIBUTES NO_REORDER __sb_irq_dmadetect_end()
{
nop();
}
static boolean __sb_detect()

Loading…
Cancel
Save