119 lines
3.0 KiB
C
119 lines
3.0 KiB
C
#ifndef __SCHEDULE_H
|
|
#define __SCHEDULE_H
|
|
|
|
#include "vfs.h"
|
|
#include "interrupts.h"
|
|
|
|
#define TASK_RUNNING 1
|
|
#define TASK_NOTRUNNING 2
|
|
#define TASK_FINISHED 3
|
|
#define TASK_WAITING 4
|
|
#define TASK_SLEEPING 5
|
|
#define TASK_SEM_WAIT 6
|
|
#define TASK_ZOMBIE 7
|
|
|
|
#define SLEEP_USER 1
|
|
#define SLEEP_TCP_ACCEPT 2
|
|
#define SLEEP_TCP_READ 3
|
|
#define SLEEP_YIELD 4
|
|
|
|
#ifndef KRNL_STACK_SIZE
|
|
# define KRNL_STACK_SIZE 0x4000
|
|
#endif
|
|
|
|
#ifndef USER_STACK_SIZE
|
|
# define USER_STACK_SIZE 0x16000
|
|
#endif
|
|
|
|
struct semaphore_t {
|
|
unsigned int id;
|
|
unsigned char state;
|
|
unsigned int timeout;
|
|
};
|
|
|
|
struct mailbox_t {
|
|
unsigned int id;
|
|
char *data;
|
|
unsigned int size;
|
|
};
|
|
|
|
struct task_t {
|
|
unsigned int esp;
|
|
unsigned int ss;
|
|
unsigned int kstack;
|
|
unsigned int ustack;
|
|
unsigned int cr3;
|
|
unsigned int pid;
|
|
unsigned int parent;
|
|
int timetorun;
|
|
unsigned char state;
|
|
struct task_t *next_task;
|
|
struct task_t *parent_task;
|
|
char name[32];
|
|
unsigned int stack_pages[KRNL_STACK_SIZE / 0x1000];
|
|
struct vfs_file_handle_t filehandles[256];
|
|
unsigned int user_pages_at;
|
|
unsigned int user_pages_cnt;
|
|
unsigned int *user_pages;
|
|
unsigned int *user_pages_virt;
|
|
unsigned int user_stack_pages[USER_STACK_SIZE / 0x1000];
|
|
unsigned int user_env_pages[64];
|
|
unsigned int priority;
|
|
struct vfs_device_t *selected_device;
|
|
char *cwd;
|
|
struct window_t **window_list;
|
|
unsigned int window_count;
|
|
unsigned char fpu_enabled;
|
|
unsigned char fpu_data[512];
|
|
char *mail;
|
|
int mail_len;
|
|
struct socket_t *waiting_sockets[25];
|
|
struct ptr_vector sockets;
|
|
int waiting_socket_count;
|
|
unsigned int exit_status;
|
|
int sleep_reason;
|
|
char zombie_ttl;
|
|
struct semaphore_t **semaphores;
|
|
unsigned int sem_count;
|
|
};
|
|
|
|
struct tss_t {
|
|
unsigned short backlink, __blh;
|
|
unsigned int esp0;
|
|
unsigned short ss0, __ss0h;
|
|
unsigned int esp1;
|
|
unsigned short ss1, __ss1h;
|
|
unsigned int esp2;
|
|
unsigned short ss2, __ss2h;
|
|
unsigned int cr3;
|
|
unsigned int eip;
|
|
unsigned int eflags;
|
|
unsigned inteax, ecx, edx, ebx;
|
|
unsigned int esp, ebp, esi, edi;
|
|
unsigned short es, __esh;
|
|
unsigned short cs, __csh;
|
|
unsigned short ss, __ssh;
|
|
unsigned short ds, __dsh;
|
|
unsigned short fs, __fsh;
|
|
unsigned short gs, __gsh;
|
|
unsigned short ldt, __ldth;
|
|
unsigned short trace, bitmap;
|
|
};
|
|
|
|
|
|
extern void init_scheduler(void);
|
|
extern void wait(struct regs *r);
|
|
extern void yield(struct regs *r);
|
|
extern struct task_t *sched_new_task();
|
|
extern void schedule(struct regs *r);
|
|
extern unsigned int sched_sem_new(unsigned char state);
|
|
extern void sched_sem_free(unsigned int id);
|
|
extern void sched_sem_signal(unsigned int id, unsigned char state);
|
|
extern void sched_sem_wait(struct regs *r, unsigned int id, int timeout);
|
|
extern int sched_proc_info(unsigned char *buffer, int len, int last_pid);
|
|
extern int sched_kill_pid(unsigned int pid);
|
|
extern void sched_remove_socket(struct socket_t *s);
|
|
extern void sched_remove_socket_from_all_tasks(struct socket_t *s);
|
|
extern void sched_tcp_read_wakeup(struct socket_t *s);
|
|
#endif
|