69 lines
2.3 KiB
C
69 lines
2.3 KiB
C
// Misc function and variable declarations.
|
|
#ifndef __STACKS_H
|
|
#define __STACKS_H
|
|
|
|
#include "types.h" // u32
|
|
|
|
#define CALL32SMM_CMDID 0xb5
|
|
#define CALL32SMM_ENTERID 0x1234
|
|
#define CALL32SMM_RETURNID 0x5678
|
|
|
|
// stacks.c
|
|
extern int HaveSmmCall32;
|
|
u32 __call32(void *func, u32 eax, u32 errret);
|
|
#define call32(func, eax, errret) ({ \
|
|
extern void _cfunc32flat_ ##func (void); \
|
|
__call32( _cfunc32flat_ ##func , (u32)(eax), (errret)); \
|
|
})
|
|
extern u8 ExtraStack[], *StackPos;
|
|
u32 __stack_hop(u32 eax, u32 edx, void *func);
|
|
#define stack_hop(func, eax, edx) \
|
|
__stack_hop((u32)(eax), (u32)(edx), (func))
|
|
u32 __stack_hop_back(u32 eax, u32 edx, void *func);
|
|
#define stack_hop_back(func, eax, edx) ({ \
|
|
extern void _cfunc16_ ##func (void); \
|
|
__stack_hop_back((u32)(eax), (u32)(edx), _cfunc16_ ##func ); \
|
|
})
|
|
int on_extra_stack(void);
|
|
struct bregs;
|
|
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 (void); \
|
|
__call16_int((callregs), (u32)&irq_trampoline_ ##nr ); \
|
|
} while (0)
|
|
void reset(void);
|
|
extern struct thread_info MainThread;
|
|
struct thread_info *getCurThread(void);
|
|
void yield(void);
|
|
void yield_toirq(void);
|
|
void thread_setup(void);
|
|
int threads_during_optionroms(void);
|
|
void run_thread(void (*func)(void*), void *data);
|
|
void wait_threads(void);
|
|
struct mutex_s { u32 isLocked; };
|
|
void mutex_lock(struct mutex_s *mutex);
|
|
void mutex_unlock(struct mutex_s *mutex);
|
|
void start_preempt(void);
|
|
void finish_preempt(void);
|
|
int wait_preempt(void);
|
|
void check_preempt(void);
|
|
u32 __call32_params(void *func, u32 eax, u32 edx, u32 ecx, u32 errret);
|
|
#define call32_params(func, eax, edx, ecx, errret) ({ \
|
|
extern void _cfunc32flat_ ##func (void); \
|
|
__call32_params( _cfunc32flat_ ##func , (u32)(eax), (u32)(edx) \
|
|
, (u32)(ecx), (errret)); \
|
|
})
|
|
|
|
// Inline functions
|
|
|
|
// Check if a call to stack_hop_back is needed.
|
|
static inline int
|
|
need_hop_back(void)
|
|
{
|
|
return !MODESEGMENT || on_extra_stack();
|
|
}
|
|
|
|
#endif // stacks.h
|