}
}
-static void
+void VISIBLE16
invoke_mouse_handler(void)
{
+ if (!CONFIG_MOUSE)
+ return;
if (need_hop_back()) {
- stack_hop_back(0, 0, invoke_mouse_handler);
+ extern void _cfunc16_invoke_mouse_handler(void);
+ stack_hop_back(0, 0, _cfunc16_invoke_mouse_handler);
return;
}
+ ASSERT16();
u16 ebda_seg = get_ebda_seg();
u16 status = GET_EBDA(ebda_seg, mouse_data[0]);
u16 X = GET_EBDA(ebda_seg, mouse_data[1]);
u32
stack_hop_back(u32 eax, u32 edx, void *func)
{
+ if (!MODESEGMENT)
+ return call16big(eax, edx, func);
if (!on_extra_stack())
return ((u32 (*)(u32, u32))func)(eax, edx);
ASSERT16();
void VISIBLE16
_farcall16(struct bregs *callregs, u16 callregseg)
{
- ASSERT16();
if (need_hop_back()) {
- stack_hop_back((u32)callregs, callregseg, _farcall16);
+ extern void _cfunc16__farcall16(void);
+ stack_hop_back((u32)callregs, callregseg, _cfunc16__farcall16);
return;
}
+ ASSERT16();
asm volatile(
"calll __farcall16\n"
: "+a" (callregs), "+m" (*callregs), "+d" (callregseg)
check_irqs(void)
{
if (need_hop_back()) {
- stack_hop_back(0, 0, check_irqs);
+ extern void _cfunc16_check_irqs(void);
+ stack_hop_back(0, 0, _cfunc16_check_irqs);
return;
}
asm volatile("sti ; nop ; rep ; nop ; cli ; cld" : : :"memory");
void
yield(void)
{
- if (MODESEGMENT) {
+ if (MODESEGMENT || !CONFIG_THREADS) {
check_irqs();
return;
}
- extern void _cfunc16_check_irqs(void);
- if (!CONFIG_THREADS) {
- call16big(0, 0, _cfunc16_check_irqs);
- return;
- }
struct thread_info *cur = getCurThread();
if (cur == &MainThread)
// Permit irqs to fire
- call16big(0, 0, _cfunc16_check_irqs);
+ check_irqs();
// Switch to the next thread
switch_next(cur);
wait_irq(void)
{
if (need_hop_back()) {
- stack_hop_back(0, 0, wait_irq);
+ extern void _cfunc16_wait_irq(void);
+ stack_hop_back(0, 0, _cfunc16_wait_irq);
return;
}
asm volatile("sti ; hlt ; cli ; cld": : :"memory");
void
yield_toirq(void)
{
- if (MODESEGMENT) {
- wait_irq();
- return;
- }
- if (have_threads()) {
+ if (!MODESEGMENT && have_threads()) {
// Threads still active - do a yield instead.
yield();
return;
}
- extern void _cfunc16_wait_irq(void);
- call16big(0, 0, _cfunc16_wait_irq);
+ wait_irq();
}
// Wait for all threads (other than the main thread) to complete.