blob: 137e35c3d4ae49955cc1fc0aa5190c45bd1231ab (
plain) (
blame)
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
|
#include "process.h"
#include "api/process.h"
#include "hal/smp.h"
#include "sys/objdir.h"
#include <string.h>
struct rbtree_node *pcb_tree;
pid_t __next_pid = 1;
int
pcb_new(jove_owned_obj_t *pcb_obj, size_t size, jove_owned_obj_t *rootdir_obj)
{
struct pcb_header *pcb_header = obj_deref(pcb_obj);
memset(pcb_header, 0, size);
pcb_header->size = size;
pcb_header->pid = __next_pid++;
pcb_header->rootdir = obj_asunowned(rootdir_obj);
pcb_header->tree_node.get_key = (void*)pcb_getpid;
pcb_tree = rbtree_insert(pcb_tree, &pcb_header->tree_node);
pcb_header->state = PCB_STATE_EMBRYO;
pcb_header->ksp = (void*)pcb_obj + size - sizeof(uintmax_t);
return _pcb_new_arch((pcb_t*)pcb_header);
}
pcb_t *pcb_frompid(pid_t pid)
{
return (pcb_t*)rbtree_search((struct rbtree_node*)pcb_tree, pid);
}
jove_owned_obj_t*
process_current(void)
{
return processor_getpcb(((processor_t*)processor_current()));
}
pid_t
pcb_getpid(pcb_t *pcb)
{
return ((struct pcb_header*)pcb)->pid;
}
jove_obj_t*
pcb_getrootdir(pcb_t *pcb)
{
return ((struct pcb_header*)pcb)->rootdir;
}
jove_owned_obj_t*
pcb_getpagedir(jove_owned_obj_t *rootdir_obj)
{
return objdir_getlocal(rootdir_obj, PCB_ROOTDIR_PAGEDIR_I);
}
jove_owned_obj_t*
pcb_getself(jove_owned_obj_t *rootdir_obj)
{
return objdir_getlocal(rootdir_obj, PCB_ROOTDIR_SELF_I);
}
enum pcb_state
pcb_getstate(pcb_t *pcb)
{
return ((struct pcb_header*)pcb)->state;
}
intmax_t
pcb_getstatecode(pcb_t *pcb)
{
return ((struct pcb_header*)pcb)->state_code;
}
void*
pcb_getksp(pcb_t *pcb)
{
return ((struct pcb_header*)pcb)->ksp;
}
void**
pcb_getksp_ref(pcb_t *pcb)
{
return &((struct pcb_header*)pcb)->ksp;
}
|