Added shared info/data pages and removed UENVS
[akaros.git] / inc / env.h
1 /* See COPYRIGHT for copyright information. */
2
3 #ifndef ROS_INC_ENV_H
4 #define ROS_INC_ENV_H
5
6 #include <inc/types.h>
7 #include <inc/queue.h>
8 #include <inc/trap.h>
9 #include <inc/memlayout.h>
10
11 struct Env;
12 typedef struct Env env_t;
13
14 typedef int32_t envid_t;
15
16 // An environment ID 'envid_t' has three parts:
17 //
18 // +1+---------------21-----------------+--------10--------+
19 // |0|          Uniqueifier             |   Environment    |
20 // | |                                  |      Index       |
21 // +------------------------------------+------------------+
22 //                                       \--- ENVX(eid) --/
23 //
24 // The environment index ENVX(eid) equals the environment's offset in the
25 // 'envs[]' array.  The uniqueifier distinguishes environments that were
26 // created at different times, but share the same environment index.
27 //
28 // All real environments are greater than 0 (so the sign bit is zero).
29 // envid_ts less than 0 signify errors.  The envid_t == 0 is special, and
30 // stands for the current environment.
31
32 #define LOG2NENV                10
33 #define NENV                    (1 << LOG2NENV)
34 #define ENVX(envid)             ((envid) & (NENV - 1))
35
36 // Values of env_status in struct Env
37 #define ENV_FREE                0
38 #define ENV_RUNNABLE            1
39 #define ENV_NOT_RUNNABLE        2
40
41 struct Env {
42         trapframe_t env_tf;                     // Saved registers
43         LIST_ENTRY(env_t) env_link;     // Free list link pointers
44         envid_t env_id;                         // Unique environment identifier
45         envid_t env_parent_id;          // env_id of this env's parent
46         unsigned env_status;            // Status of the environment
47         uint32_t env_runs;                      // Number of times environment has run
48
49         // Address space
50         pde_t *env_pgdir;                       // Kernel virtual address of page dir
51         physaddr_t env_cr3;                     // Physical address of page dir
52         // TODO - give these two proper types (pointers to structs)
53         void* env_procinfo;     // KVA of per-process shared info table (RO)
54         void* env_procdata;     // KVA of per-process shared data table (RW)
55 };
56
57 #endif // !ROS_INC_ENV_H