2018-09-25 09:22:51 -07:00
|
|
|
/* See COPYRIGHT for copyright information. */
|
|
|
|
|
|
|
|
#ifndef JOS_KERN_ENV_H
|
|
|
|
#define JOS_KERN_ENV_H
|
|
|
|
|
|
|
|
#include <inc/env.h>
|
2018-10-06 06:52:47 -07:00
|
|
|
#include <kern/cpu.h>
|
2018-09-25 09:22:51 -07:00
|
|
|
|
|
|
|
extern struct Env *envs; // All environments
|
2018-10-06 06:52:47 -07:00
|
|
|
#define curenv (thiscpu->cpu_env) // Current environment
|
2018-09-25 09:22:51 -07:00
|
|
|
extern struct Segdesc gdt[];
|
|
|
|
|
|
|
|
void env_init(void);
|
|
|
|
void env_init_percpu(void);
|
|
|
|
int env_alloc(struct Env **e, envid_t parent_id);
|
|
|
|
void env_free(struct Env *e);
|
|
|
|
void env_create(uint8_t *binary, enum EnvType type);
|
|
|
|
void env_destroy(struct Env *e); // Does not return if e == curenv
|
|
|
|
|
|
|
|
int envid2env(envid_t envid, struct Env **env_store, bool checkperm);
|
|
|
|
// The following two functions do not return
|
|
|
|
void env_run(struct Env *e) __attribute__((noreturn));
|
|
|
|
void env_pop_tf(struct Trapframe *tf) __attribute__((noreturn));
|
|
|
|
|
|
|
|
// Without this extra macro, we couldn't pass macros like TEST to
|
|
|
|
// ENV_CREATE because of the C pre-processor's argument prescan rule.
|
|
|
|
#define ENV_PASTE3(x, y, z) x ## y ## z
|
|
|
|
|
|
|
|
#define ENV_CREATE(x, type) \
|
|
|
|
do { \
|
|
|
|
extern uint8_t ENV_PASTE3(_binary_obj_, x, _start)[]; \
|
|
|
|
env_create(ENV_PASTE3(_binary_obj_, x, _start), \
|
|
|
|
type); \
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
#endif // !JOS_KERN_ENV_H
|