40 lines
1.1 KiB
C
40 lines
1.1 KiB
C
|
#ifndef THREADS_SWITCH_H
|
||
|
#define THREADS_SWITCH_H
|
||
|
|
||
|
#ifndef __ASSEMBLER__
|
||
|
/* switch_thread()'s stack frame. */
|
||
|
struct switch_threads_frame
|
||
|
{
|
||
|
uint32_t edi; /* 0: Saved %edi. */
|
||
|
uint32_t esi; /* 4: Saved %esi. */
|
||
|
uint32_t ebp; /* 8: Saved %ebp. */
|
||
|
uint32_t ebx; /* 12: Saved %ebx. */
|
||
|
void (*eip) (void); /* 16: Return address. */
|
||
|
struct thread *cur; /* 20: switch_threads()'s CUR argument. */
|
||
|
struct thread *next; /* 24: switch_threads()'s NEXT argument. */
|
||
|
};
|
||
|
|
||
|
/* Switches from CUR, which must be the running thread, to NEXT,
|
||
|
which must also be running switch_threads(), returning CUR in
|
||
|
NEXT's context. */
|
||
|
struct thread *switch_threads (struct thread *cur, struct thread *next);
|
||
|
|
||
|
/* Stack frame for switch_entry(). */
|
||
|
struct switch_entry_frame
|
||
|
{
|
||
|
void (*eip) (void);
|
||
|
};
|
||
|
|
||
|
void switch_entry (void);
|
||
|
|
||
|
/* Pops the CUR and NEXT arguments off the stack, for use in
|
||
|
initializing threads. */
|
||
|
void switch_thunk (void);
|
||
|
#endif
|
||
|
|
||
|
/* Offsets used by switch.S. */
|
||
|
#define SWITCH_CUR 20
|
||
|
#define SWITCH_NEXT 24
|
||
|
|
||
|
#endif /* threads/switch.h */
|