Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / seabios / src / stacks.h
1 // Misc function and variable declarations.
2 #ifndef __STACKS_H
3 #define __STACKS_H
4
5 #include "types.h" // u32
6
7 #define CALL32SMM_CMDID    0xb5
8 #define CALL32SMM_ENTERID  0x1234
9 #define CALL32SMM_RETURNID 0x5678
10
11 // stacks.c
12 extern int HaveSmmCall32;
13 u32 call32(void *func, u32 eax, u32 errret);
14 extern u8 ExtraStack[], *StackPos;
15 u32 stack_hop(u32 eax, u32 edx, void *func);
16 u32 stack_hop_back(u32 eax, u32 edx, void *func);
17 int on_extra_stack(void);
18 struct bregs;
19 void farcall16(struct bregs *callregs);
20 void farcall16big(struct bregs *callregs);
21 void __call16_int(struct bregs *callregs, u16 offset);
22 #define call16_int(nr, callregs) do {                           \
23         extern void irq_trampoline_ ##nr ();                    \
24         __call16_int((callregs), (u32)&irq_trampoline_ ##nr );  \
25     } while (0)
26 void reset(void);
27 extern struct thread_info MainThread;
28 struct thread_info *getCurThread(void);
29 void yield(void);
30 void yield_toirq(void);
31 void thread_init(void);
32 int threads_during_optionroms(void);
33 void run_thread(void (*func)(void*), void *data);
34 void wait_threads(void);
35 struct mutex_s { u32 isLocked; };
36 void mutex_lock(struct mutex_s *mutex);
37 void mutex_unlock(struct mutex_s *mutex);
38 void start_preempt(void);
39 void finish_preempt(void);
40 int wait_preempt(void);
41 void check_preempt(void);
42 u32 call32_params(void *func, u32 eax, u32 edx, u32 ecx, u32 errret);
43
44 // Inline functions
45
46 // Check if a call to stack_hop_back is needed.
47 static inline int
48 need_hop_back(void)
49 {
50     return !MODESEGMENT || on_extra_stack();
51 }
52
53 #endif // stacks.h