2020-07-25 16:54:37 -05:00
/**
* \ file
*/
2020-07-22 19:26:55 -05:00
# ifndef KERN_TASKING_H
# define KERN_TASKING_H
2019-02-11 09:30:28 -06:00
# include <stdint.h>
2020-07-22 19:35:23 -05:00
# include <sys/types.h>
2020-08-02 14:37:23 -05:00
# include "rpc.h"
2019-02-11 09:30:28 -06:00
2020-07-12 14:28:58 -05:00
# ifndef TASKING_H
2020-07-22 19:26:55 -05:00
2020-07-25 16:54:37 -05:00
/**
* Represents the state of a thread
*/
2020-07-25 18:00:53 -05:00
typedef enum thread_state {
2020-07-25 16:54:37 -05:00
THREAD_RUNNING , //!< The state of a running thread
THREAD_READY , //!< The state of a ready to run thread
THREAD_EXITED , //!< The state of an exited thread
2020-08-02 14:37:23 -05:00
THREAD_BLOCKED , //!< The state of a generically blocked thread
THREAD_WAITING_FOR_RPC , //!< The state of a thread waiting for an RPC call to return
THREAD_WAITING_FOR_RPC_INIT //!< The state of a thread waiting for a process to fully initilaize it's RPC functions
2020-07-25 18:00:53 -05:00
} thread_state ;
2020-07-22 19:26:55 -05:00
2020-07-12 14:28:58 -05:00
# endif
2020-07-20 09:51:30 -05:00
struct Thread ;
2020-07-25 16:54:37 -05:00
/**
* Represents a process
*/
2020-07-20 09:51:30 -05:00
typedef struct Process {
2020-07-25 16:54:37 -05:00
char priv ; //!< Whether the process is privileged (can execute syscalls to acesss all of memory/has acess to IO ports).
pid_t pid ; //!< The PID of this process
pid_t next_tid ; //!< The TID that the next created thread will use.
2020-07-28 06:50:26 -05:00
int num_threads ; //!< The number of threads in this process
int num_threads_blocked ; //!< The number of blocked threads in this process
struct Thread * first_thread ; //!< A pointer to the head of the linked list of threads for this process.
2020-07-20 09:51:30 -05:00
} Process ;
2020-07-25 16:54:37 -05:00
/**
* Represents a thread of a process
*/
2020-07-20 09:51:30 -05:00
typedef struct Thread {
2020-07-25 16:54:37 -05:00
void * kernel_esp ; //!< The thread's kernel stack.
void * kernel_esp_top ; //!< The top of the thread's kernel stack.
2020-07-29 07:27:12 -05:00
void * address_space ; //!< The address space of this thread. (it is in here and not in the process to simplify the task switch asembly)
2020-07-25 16:54:37 -05:00
pid_t tid ; //!< The TID of this thread.
2020-07-25 18:00:53 -05:00
thread_state state ; //!< The state of this thread. (running,ready to run,blocked,etc.)
2020-07-25 16:54:37 -05:00
int errno ; //!< The errno value for this thread.
2020-07-28 06:50:26 -05:00
struct Thread * next_thread_in_process ; //!< The next thread in the process.
struct Thread * prev_thread_in_process ; //!< The previous thread in the process.
struct Thread * next_ready_to_run ; //!< If the thread is in the ready to run list, this is the next ready to run thread. (potentially in a different process)
struct Thread * prev_ready_to_run ; //!< If the thread is in the ready to run list, this is the previous ready to run thread. (potentially in a different process)
2020-07-25 16:54:37 -05:00
Process * process ; //!< The thread's process.
2020-08-02 14:37:23 -05:00
pid_t rpc_calling_pid ; //!< The PID of the thread that called this RPC (only used for RPC handler threads)
pid_t rpc_calling_tid ; //!< The TID of the thread that called this RPC (only used for RPC handler threads)
void * rpc_ret_buf ; //!< The return buffer of the RPC call that the thread made
2020-07-20 09:51:30 -05:00
} Thread ;
2019-02-11 09:30:28 -06:00
2020-07-25 18:00:53 -05:00
extern Thread * current_thread ;
2020-07-22 19:26:55 -05:00
2020-07-25 16:54:37 -05:00
/**
* Create a task
* \ param eip The start address of the task
2020-07-29 07:27:12 -05:00
* \ param address_space The address space of the task
2020-07-25 16:54:37 -05:00
* \ param kmode Whether the task is a kernel mode task
2020-07-29 10:35:04 -05:00
* \ param param1 The thread ' s start function first parameter
* \ param param2 The thread ' s start function second parameter
* \ param isThread Whether we are creating a new process or a thread in a process . If we are creating a theead , param2_arg becomes the PID for the newly created thread .
2020-07-25 16:54:37 -05:00
*/
2020-07-29 10:35:04 -05:00
void tasking_create_task ( void * eip , void * address_space , char kmode , void * param1 , void * param2 , char isThread ) ;
2020-07-25 16:54:37 -05:00
/**
* Initialize tasking
*/
2020-07-22 19:26:55 -05:00
void tasking_init ( ) ;
2020-07-25 16:54:37 -05:00
/**
* Check whether the current process is privleged
2020-07-25 18:01:05 -05:00
* \ return whether the current process is privleged
2020-07-25 16:54:37 -05:00
*/
2020-07-25 18:00:53 -05:00
char tasking_is_privleged ( ) ;
2020-07-25 16:54:37 -05:00
/**
* Get the PID of the current thread .
2020-07-25 18:01:05 -05:00
* \ return The current thread ' s PID
2020-07-25 16:54:37 -05:00
*/
2020-07-25 18:00:53 -05:00
pid_t tasking_get_PID ( ) ;
2020-08-02 14:37:23 -05:00
/**
* Get the TID of the current thread .
* \ return The current thread ' s TID
*/
pid_t tasking_get_TID ( ) ;
2020-07-25 16:54:37 -05:00
/**
* Get the adddress of errno for the current thread
2020-07-25 18:01:05 -05:00
* \ return The address of errno
2020-07-25 16:54:37 -05:00
*/
2020-07-22 19:26:55 -05:00
int * tasking_get_errno_address ( ) ;
2020-07-25 16:54:37 -05:00
/**
* Create a new thread
* \ param start The start address of the task
* \ param pid The PID that gets the new thread
2020-07-29 10:35:04 -05:00
* \ param param The thread ' s start function parameter
2020-07-25 16:54:37 -05:00
* \ return the TID of the thread
*/
2020-07-29 10:35:04 -05:00
pid_t tasking_new_thread ( void * start , pid_t pid , void * param ) ;
2020-07-22 19:26:55 -05:00
2020-07-25 16:54:37 -05:00
/**
* Terminate the current thread
* If the main thread terminates , the whole process terminates .
* \ note Currently , calling tasking_exit from any thread terminates the whole process .
2020-07-25 18:01:05 -05:00
* \ param code The exit code of the thread
2020-07-25 16:54:37 -05:00
*/
2020-07-23 11:50:23 -05:00
void tasking_exit ( int code ) ;
2020-07-25 16:54:37 -05:00
/**
* Block the current thread & yield
* \ param newstate The state to block it in
*/
2020-07-25 18:00:53 -05:00
void tasking_block ( thread_state newstate ) ;
2020-07-25 16:54:37 -05:00
/**
* Unblock a thread
* \ param pid The PID that contains the thread to unblock
* \ param tid The TID in the process to unblock .
*/
2020-07-23 11:50:23 -05:00
void tasking_unblock ( pid_t pid , pid_t tid ) ;
2020-07-25 16:54:37 -05:00
/**
* Yield to the next ready thread in any process
*/
2020-07-22 19:26:55 -05:00
void tasking_yield ( ) ;
2020-08-01 10:11:37 -05:00
/**
* Get the address_space of a process
* \ param pid the PID of the process
* \ return the address_space of the process
*/
void * tasking_get_address_space ( pid_t pid ) ;
2020-07-22 19:26:55 -05:00
2020-08-02 14:37:23 -05:00
/**
* Set the RPC calling thread for an RPC handler thread to the current threasd
* \ param pid The PID of the handler thread
* \ param tid The TID of the handler thread
*/
void tasking_set_rpc_calling_thread ( pid_t pid , pid_t tid ) ;
/**
* Get the RPC calling thread for the current thread
* \ param tid A pointer to a pid_t to store the return TID
* \ return the return PID
* \ note This is only applicable for an RPC handler thread
*/
pid_t tasking_get_rpc_calling_thread ( pid_t * tid ) ;
/**
* Set the RPC return buffer for the calling thread
* \ param buf The return buffer
*/
void tasking_set_rpc_ret_buf ( void * buf ) ;
/**
* Get the RPC return buffer for the current thread
* \ return the return buffer
*/
void * tasking_get_rpc_ret_buf ( ) ;
/**
* Terminate the current thread
*/
void tasking_thread_exit ( ) ;
/**
* Check if a process exists
* \ param pid The param of the process to check
* \ return Whether the process exists
*/
char tasking_check_proc_exists ( pid_t pid ) ;
2019-02-11 09:30:28 -06:00
# endif