37e947ba52eee9e57d99d1a4ef4681df697cfc27
[monolithium.git] / kernel / include / thread.h
1 /*
2  * thread.h
3  *
4  * Copyright (C) 2013 Aleksandar Andrejevic <theflash@sdf.lonestar.org>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU Affero General Public License as
8  * published by the Free Software Foundation, either version 3 of the
9  * License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU Affero General Public License for more details.
15  *
16  * You should have received a copy of the GNU Affero General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #ifndef _THREAD_H_
21 #define _THREAD_H_
22
23 #include <common.h>
24 #include <object.h>
25 #include <exception.h>
26 #include <sdk/list.h>
27 #include <sync.h>
28 #include <interrupt.h>
29 #include <syscalls.h>
30 #include <sdk/thread.h>
31
32 #define QUANTUM 30
33 #define MAX_THREADS 2097152
34 #define KERNEL_STACK_SIZE 262144
35
36 #define SAFE_EFLAGS_MASK 0x00000CD5
37
38 typedef enum
39 {
40     WAIT_NEVER,
41     WAIT_ALWAYS,
42     WAIT_UNTIL_EQUAL,
43     WAIT_UNTIL_NOT_EQUAL,
44     WAIT_UNTIL_LESS,
45     WAIT_UNTIL_NOT_LESS,
46     WAIT_UNTIL_GREATER,
47     WAIT_UNTIL_NOT_GREATER
48 } wait_condition_t;
49
50 typedef enum
51 {
52     WAIT_TIMED_OUT,
53     WAIT_CONDITION_HIT,
54     WAIT_CANCELED
55 } wait_result_t;
56
57 #ifndef PROCESS_TYPEDEF
58 #define PROCESS_TYPEDEF
59 typedef struct process process_t;
60 #endif
61
62 struct thread
63 {
64     object_t header;
65     list_entry_t in_queue_list;
66     list_entry_t in_process_list;
67     dword_t tid;
68     priority_t priority;
69     dword_t affinity;
70     thread_state_t state;
71     dword_t exit_code;
72     dword_t quantum;
73     qword_t running_ticks;
74     process_t *owner_process; /* weak reference */
75     dword_t terminated;
76     int32_t frozen;
77
78     void *kernel_stack;
79     uintptr_t kernel_esp;
80
81     lock_t syscall_lock;
82     registers_t *syscall_regs;
83     bool_t cancel_io;
84     processor_mode_t previous_mode;
85
86     wait_condition_t wait_condition;
87     wait_result_t wait_result;
88     qword_t wait_timestamp;
89     dword_t wait_timeout;
90     dword_t *wait_pointer;
91     dword_t wait_value;
92
93     exception_handler_t kernel_handler;
94     exception_info_t kernel_exception_info;
95     exception_handler_t user_handler;
96     exception_info_t user_exception_info;
97 };
98
99 #ifndef THREAD_TYPEDEF
100 #define THREAD_TYPEDEF
101 typedef struct thread thread_t;
102 #endif
103
104 extern bool_t scheduler_enabled;
105
106 thread_t *get_current_thread();
107 dword_t create_thread_internal(process_t *proc, thread_state_t *initial_state, dword_t flags, priority_t priority, void *kernel_stack, thread_t **new_thread);
108 dword_t terminate_thread_internal(thread_t *thread, dword_t return_value);
109 void scheduler(registers_t *regs);
110 wait_result_t scheduler_wait(wait_condition_t condition, dword_t timeout, uintptr_t *pointer, uintptr_t value);
111 dword_t create_system_thread(thread_procedure_t routine, dword_t flags, priority_t priority, dword_t stack_size, void *param, thread_t **new_thread);
112 void thread_lazy_fpu(void);
113 void thread_cleanup(object_t *thread);
114 void thread_init(void);
115
116 #endif