aboutsummaryrefslogtreecommitdiffstats
path: root/src/kernel/task.h
blob: b67147eb307c67ed24b3646abf695e4fad69de39 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/**
 * @file task.h
 * Provides multitasking functionality
 *
 * Copyright (C) 2018 Clyne Sullivan
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

#ifndef TASK_H_
#define TASK_H_

#include <stdint.h>

#define WIFEXITED(w)   (w & (1 << 8))
#define WEXITSTATUS(w) (w & 0xFF)
typedef uint16_t pid_t;

/**
 * A structure to contain task data.
 */
typedef struct task_t {
	struct task_t *next; /**< pointer to the next task_t instance */
	uint32_t *sp;        /**< pointer to the task's last sp register value */
	uint32_t *stack;     /**< pointer to the task's stack */
	uint32_t *heap;
	pid_t pid;           /**< Task (Process) ID */
	pid_t pgid;          /**< Process Group ID */
	struct {
		uint32_t state : 8;
		uint32_t value : 24;
	} status;
} task_t;

enum TASK_STATUS_FLAGS {
	TASK_RUNNING,  /**< Task is actively running */
	TASK_SLEEPING, /**< Task is sleeping for task_t.sleep ms */
	TASK_EXITED,   /**< Task has exited, task_t.sleep has code */
	TASK_ZOMBIE    /**< Task exited, accounted for, ready to go bye bye */
};

/**
 * Enters multitasking mode. The given function acts as the initial thread.
 * This task is given a 4kb stack.
 * @param init the initial thread to run
 */
void task_init(void (*init)(void), uint16_t stackSize);

/**
 * Starts a new task.
 * @param task the code to run
 * @param stackSize how many bytes of stack to give the thread
 */
void task_start(void (*task)(void), uint16_t stackSize);

/**
 * Allows task switching to be disabled, for low-level/time-critical  operations.
 * Multiple holds can be placed, and all must be removed to continue task
 * switching.
 * @param hold non-zero for hold, zero to remove hold
 */
void task_hold(uint8_t hold);

/**
 * Puts the task to sleep for the given duration.
 * @param ms Milliseconds to sleep for
 */
void task_sleep(uint32_t ms);

/**
 * Called by the task when it's ready to exit.
 * @param code Task's exit code
 */
void task_exit(int code);

/**
 * Forks the task into two processes.
 */
int task_fork(void);

/**
 * Gets the task's PID.
 */
pid_t task_getpid(void);

/**
 * Waits for a task to change state (TODO confirm).
 */
pid_t task_waitpid(pid_t pid, int *wstatus, int options);

/**
 * TODO
 */
void *task_sbrk(uint32_t bytes);

#endif // TASK_H_