#ifndef __LUNAIX_PROCESS_H
#define __LUNAIX_PROCESS_H
-#include <arch/x86/interrupts.h>
#include <lunaix/clock.h>
#include <lunaix/ds/waitq.h>
#include <lunaix/fs.h>
+#include <lunaix/iopoll.h>
#include <lunaix/mm/mm.h>
#include <lunaix/mm/region.h>
#include <lunaix/signal.h>
#include <lunaix/timer.h>
#include <lunaix/types.h>
#include <stdint.h>
+#include <sys/interrupts.h>
// 虽然内核不是进程,但为了区分,这里使用Pid=-1来指代内核。这主要是方便物理页所有权检查。
#define KERNEL_PID -1
{
/*
Any change to *critical section*, including layout, size
- must be reflected in arch/x86/interrupt.S.inc to avoid
+ must be reflected in arch/i386/interrupt.S.inc to avoid
disaster!
*/
struct v_fdtable* fdtable;
struct v_dnode* cwd;
pid_t pgid;
+
+ struct iopoll pollctx;
};
extern volatile struct proc_info* __current;
+#define resume_process(proc) (proc)->state = PS_READY
+#define pause_process(proc) (proc)->state = PS_PAUSED
+#define block_process(proc) (proc)->state = PS_BLOCKED
+
static inline void
block_current()
{
- __current->state = PS_BLOCKED;
+ block_process(__current);
}
static inline void
pause_current()
{
- __current->state = PS_PAUSED;
+ pause_process(__current);
}
static inline void
resume_current()
{
- __current->state = PS_RUNNING;
+ resume_process(__current);
}
/**
void
proc_clear_signal(struct proc_info* proc);
+// enable interrupt upon transfer
+#define TRANSFER_IE 1
+
+/**
+ * @brief Setup process initial context, used to initiate first switch
+ *
+ * @param proc
+ * @param stop
+ * @param target
+ * @param flags
+ */
+void
+proc_init_transfer(struct proc_info* proc, ptr_t stop, ptr_t target, int flags);
+
#endif /* __LUNAIX_PROCESS_H */