f2a42b79f0c1a22ae007f1ce23518227f1e37aea
[monolithium.git] / kernel / include / process.h
1 /*
2  * process.h
3  *
4  * Copyright (C) 2016 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 _PROCESS_H_
21 #define _PROCESS_H_
22
23 #include <common.h>
24 #include <object.h>
25 #include <memory.h>
26 #include <clock.h>
27 #include <pipe.h>
28 #include <thread.h>
29 #include <vm86.h>
30 #include <user.h>
31
32 #define MAX_PROCESSES 2097152
33 #define PROCESS_POOL_ADDRESS NULL
34 #define PROCESS_POOL_SIZE 524288
35 #define STARTUP_HANDLE_TABLE_SIZE (256 * sizeof(handle_info_t))
36
37 #define CLONE_MAGIC 0x79706F43
38
39 #define PROCESS_CREATE_NO_INHERIT    (1 << 0)
40 #define PROCESS_CREATE_NO_THREADS    (1 << 1)
41 #define PROCESS_CREATE_FROZEN_THREAD (1 << 2)
42
43 typedef enum
44 {
45     PROCESS_PID_INFO,
46     PROCESS_NAME_INFO,
47     PROCESS_START_TIME_INFO,
48     PROCESS_MEMORY_INFO,
49     PROCESS_EXIT_CODE_INFO,
50     PROCESS_USER_INFO,
51     PROCESS_THREAD_INFO,
52     PROCESS_HANDLE_INFO,
53 } process_info_t;
54
55 #ifndef THREAD_TYPEDEF
56 #define THREAD_TYPEDEF
57 typedef struct thread thread_t;
58 #endif
59
60 typedef struct
61 {
62     object_t *obj; /* strong reference */
63     access_flags_t access_flags;
64 } handle_info_t;
65
66 struct process
67 {
68     object_t header;
69     dword_t pid;
70     char *name;
71     memory_address_space_t memory_space;
72     dword_t exit_code;
73     bool_t terminating;
74     dword_t terminated;
75     clock_time_t start_time;
76     clock_time_t end_time;
77     list_entry_t threads;
78     resource_t thread_list_res;
79     handle_info_t *handle_table;
80     dword_t handle_count, handle_table_size;
81     resource_t handle_table_res;
82     user_t *original_user; /* weak reference */
83     user_t *current_user; /* strong reference */
84 };
85
86 #ifndef PROCESS_TYPEDEF
87 #define PROCESS_TYPEDEF
88 typedef struct process process_t;
89 #endif
90
91 typedef struct
92 {
93     char *command_line;
94     handle_t standard_input;
95     handle_t standard_output;
96     handle_t standard_error;
97 } process_params_t;
98
99 extern process_t *kernel_process;
100
101 process_t *get_current_process();
102 dword_t open_process(dword_t pid, handle_t *handle);
103 void init_user_stack(uintptr_t *stack_pointer, process_params_t *parameters);
104 dword_t create_process(const char *path, dword_t flags, process_params_t *parameters, handle_t *process_handle, handle_t *thread_handle);
105 void process_cleanup(object_t *proc);
106 void destroy_process(process_t *process);
107 dword_t terminate(handle_t handle, dword_t exit_code);
108 dword_t get_process_id();
109 dword_t query_process(handle_t handle, process_info_t info_type, void *buffer, dword_t size);
110 dword_t enum_processes(dword_t *pid_array, dword_t *count);
111 dword_t wait_process(handle_t handle, dword_t timeout);
112 process_t *switch_process(process_t *new_process);
113 void process_init();
114
115 #endif