With this change, farcall16() is only used for external API calls and is only invoked from a 32bit mode entered directly via transition32. farcall16big() is also only used for external API calls and is only invoked from a 32bit mode entered directly via transition32.
call16_int() now calls _farcall16() directly, and it will use normal 16bit mode or big real mode as required.
Signed-off-by: Kevin O'Connor kevin@koconnor.net --- src/stacks.c | 26 ++++++++++++-------------- src/stacks.h | 6 +++--- 2 files changed, 15 insertions(+), 17 deletions(-)
diff --git a/src/stacks.c b/src/stacks.c index 5674d0a..a36f643 100644 --- a/src/stacks.c +++ b/src/stacks.c @@ -236,34 +236,32 @@ _farcall16(struct bregs *callregs, u16 callregseg) : "ebx", "ecx", "esi", "edi", "cc", "memory"); }
-inline void +void farcall16(struct bregs *callregs) { - if (MODE16) { - _farcall16(callregs, GET_SEG(SS)); - return; - } extern void _cfunc16__farcall16(void); - call16((u32)callregs - StackSeg * 16, StackSeg, _cfunc16__farcall16); + call16((u32)callregs, 0, _cfunc16__farcall16); }
-inline void +void farcall16big(struct bregs *callregs) { extern void _cfunc16__farcall16(void); - call16big((u32)callregs - StackSeg * 16, StackSeg, _cfunc16__farcall16); + call16big((u32)callregs, 0, _cfunc16__farcall16); }
// Invoke a 16bit software interrupt. -inline void +void __call16_int(struct bregs *callregs, u16 offset) { - if (MODESEGMENT) - callregs->code.seg = GET_SEG(CS); - else - callregs->code.seg = SEG_BIOS; callregs->code.offset = offset; - farcall16(callregs); + if (!MODESEGMENT) { + callregs->code.seg = SEG_BIOS; + _farcall16((void*)callregs - StackSeg * 16, StackSeg); + return; + } + callregs->code.seg = GET_SEG(CS); + _farcall16(callregs, GET_SEG(SS)); }
// Reset the machine diff --git a/src/stacks.h b/src/stacks.h index cbc5f4f..c3ddc17 100644 --- a/src/stacks.h +++ b/src/stacks.h @@ -11,9 +11,9 @@ u32 stack_hop(u32 eax, u32 edx, void *func); u32 stack_hop_back(u32 eax, u32 edx, void *func); int on_extra_stack(void); struct bregs; -inline void farcall16(struct bregs *callregs); -inline void farcall16big(struct bregs *callregs); -inline void __call16_int(struct bregs *callregs, u16 offset); +void farcall16(struct bregs *callregs); +void farcall16big(struct bregs *callregs); +void __call16_int(struct bregs *callregs, u16 offset); #define call16_int(nr, callregs) do { \ extern void irq_trampoline_ ##nr (); \ __call16_int((callregs), (u32)&irq_trampoline_ ##nr ); \