1 // Misc function and variable declarations.
5 #include "types.h" // u32
7 #define CALL32SMM_CMDID 0xb5
8 #define CALL32SMM_ENTERID 0x1234
9 #define CALL32SMM_RETURNID 0x5678
12 extern int HaveSmmCall32;
13 u32 __call32(void *func, u32 eax, u32 errret);
14 #define call32(func, eax, errret) ({ \
15 extern void _cfunc32flat_ ##func (void); \
16 __call32( _cfunc32flat_ ##func , (u32)(eax), (errret)); \
18 extern u8 ExtraStack[], *StackPos;
19 u32 __stack_hop(u32 eax, u32 edx, void *func);
20 #define stack_hop(func, eax, edx) \
21 __stack_hop((u32)(eax), (u32)(edx), (func))
22 u32 __stack_hop_back(u32 eax, u32 edx, void *func);
23 #define stack_hop_back(func, eax, edx) ({ \
24 extern void _cfunc16_ ##func (void); \
25 __stack_hop_back((u32)(eax), (u32)(edx), _cfunc16_ ##func ); \
27 int on_extra_stack(void);
29 void farcall16(struct bregs *callregs);
30 void farcall16big(struct bregs *callregs);
31 void __call16_int(struct bregs *callregs, u16 offset);
32 #define call16_int(nr, callregs) do { \
33 extern void irq_trampoline_ ##nr (void); \
34 __call16_int((callregs), (u32)&irq_trampoline_ ##nr ); \
37 extern struct thread_info MainThread;
38 struct thread_info *getCurThread(void);
40 void yield_toirq(void);
41 void thread_setup(void);
42 int threads_during_optionroms(void);
43 void run_thread(void (*func)(void*), void *data);
44 void wait_threads(void);
45 struct mutex_s { u32 isLocked; };
46 void mutex_lock(struct mutex_s *mutex);
47 void mutex_unlock(struct mutex_s *mutex);
48 void start_preempt(void);
49 void finish_preempt(void);
50 int wait_preempt(void);
51 void check_preempt(void);
52 u32 __call32_params(void *func, u32 eax, u32 edx, u32 ecx, u32 errret);
53 #define call32_params(func, eax, edx, ecx, errret) ({ \
54 extern void _cfunc32flat_ ##func (void); \
55 __call32_params( _cfunc32flat_ ##func , (u32)(eax), (u32)(edx) \
56 , (u32)(ecx), (errret)); \
61 // Check if a call to stack_hop_back is needed.
65 return !MODESEGMENT || on_extra_stack();