/* Copyright (c) 2009, 2010 The Regents of the University of California
 * Barret Rhoden <brho@cs.berkeley.edu>
 * See LICENSE for details.
 *
 * All things processes!  As we move away from the old envs to processes,
 * we'll move things into here that are designed for multicore processes. */

#pragma once

#include <ros/common.h>
#include <ros/event.h>
#include <trap.h>
#include <atomic.h>
#include <kref.h>
#include <schedule.h>

/* Process States.  Not 100% on the names yet.  RUNNABLE_* are waiting to go to
 * RUNNING_*.  For instance, RUNNABLE_M is expecting to go to RUNNING_M.  It
 * could be waiting for it's timeslice, or possibly for all the cores it asked
 * for.
 *
 * Difference between the _M and the _S states:
 * - _S : legacy process mode
 * - RUNNING_M implies *guaranteed* core(s).  You can be a single core in the
 *   RUNNING_M state.  The guarantee is subject to time slicing, but when you
 *   run, you get all of your cores.
 * - The time slicing is at a coarser granularity for _M states.  This means
 *   that when you run an _S on a core, it should be interrupted/time sliced
 *   more often, which also means the core should be classified differently for
 *   a while.  Possibly even using its local APIC timer.
 * - A process in an _M state will be informed about changes to its state, e.g.,
 *   will have a handler run in the event of a page fault
 *
 * DYING vs. DYING_ABORT:
 * - DYING is the initial stage when a process is dying, but before all of its
 * syscalls should abort.  At this point, we start closing FDs and blocking
 * certain new operations.
 * - DYING_ABORT is after all FDs were closed and all outstanding syscalls are
 * aborted.
 */

#define PROC_CREATED			0x01
#define PROC_RUNNABLE_S			0x02
#define PROC_RUNNING_S			0x04
#define PROC_WAITING			0x08 // can split out to INT and UINT
#define PROC_DYING				0x10
#define PROC_DYING_ABORT		0x20
#define PROC_RUNNABLE_M			0x40
#define PROC_RUNNING_M			0x80

#define procstate2str(state) ((state) == PROC_CREATED     ? "CREATED"     : \
                              (state) == PROC_RUNNABLE_S  ? "RUNNABLE_S"  : \
                              (state) == PROC_RUNNING_S   ? "RUNNING_S"   : \
                              (state) == PROC_WAITING     ? "WAITING"     : \
                              (state) == PROC_DYING       ? "DYING"       : \
                              (state) == PROC_DYING_ABORT ? "DYING_ABORT" : \
                              (state) == PROC_RUNNABLE_M  ? "RUNNABLE_M"  : \
                              (state) == PROC_RUNNING_M   ? "RUNNING_M"   : \
                                                            "UNKNOWN")

#define DEFAULT_PROGNAME ""

#include <env.h>

static bool proc_is_dying(struct proc *p)
{
	return (p->state == PROC_DYING) || (p->state == PROC_DYING_ABORT);
}

struct process_set {
	size_t num_processes;
	size_t size;
	struct proc **procs;
};

/* Can use a htable iterator to iterate through all active procs */
extern struct hashtable *pid_hash;
extern spinlock_t pid_hash_lock;

/* Initialization */
void proc_init(void);
void proc_set_username(struct proc *p, char *name);
void proc_inherit_parent_username(struct proc *child, struct proc *parent);
void proc_set_progname(struct proc *p, char *name);
void proc_replace_binary_path(struct proc *p, char *path);
void proc_init_procinfo(struct proc* p);
void proc_init_procdata(struct proc* p);

/* Process management: */
struct proc *pid_nth(unsigned int n);
error_t proc_alloc(struct proc **pp, struct proc *parent, int flags);
void __proc_ready(struct proc *p);
struct proc *proc_create(struct file_or_chan *prog, char **argv, char **envp);
int __proc_set_state(struct proc *p, uint32_t state);
struct proc *pid2proc(pid_t pid);
bool proc_controls(struct proc *actor, struct proc *target);
void proc_incref(struct proc *p, unsigned int val);
void proc_decref(struct proc *p);
void proc_run_s(struct proc *p);
void __proc_run_m(struct proc *p);
void __proc_startcore(struct proc *p, struct user_context *ctx);
void proc_restartcore(void);
void proc_destroy(struct proc *p);
void proc_signal_parent(struct proc *child);
int __proc_disown_child(struct proc *parent, struct proc *child);
int proc_change_to_m(struct proc *p);
void __proc_save_fpu_s(struct proc *p);
void __proc_save_context_s(struct proc *p);
void proc_yield(struct proc *p, bool being_nice);
void proc_notify(struct proc *p, uint32_t vcoreid);
void proc_wakeup(struct proc *p);
bool __proc_is_mcp(struct proc *p);
bool proc_is_vcctx_ready(struct proc *p);
int proc_change_to_vcore(struct proc *p, uint32_t new_vcoreid,
                         bool enable_my_notif);
void proc_get_set(struct process_set *pset);
void proc_free_set(struct process_set *pset);

/* Vcoremap info: */
uint32_t proc_get_vcoreid(struct proc *p);
/* TODO: make all of these inline once we gut the Env crap */
bool vcore_is_mapped(struct proc *p, uint32_t vcoreid);
uint32_t vcore2vcoreid(struct proc *p, struct vcore *vc);
struct vcore *vcoreid2vcore(struct proc *p, uint32_t vcoreid);

/* Process core management.  Only call these if you are RUNNING_M or RUNNABLE_M.
 * These all adjust the vcoremap and take appropriate actions (like __startcore
 * if you were already RUNNING_M.  You could be RUNNABLE_M with no vcores when
 * these are done (basically preempted, and waiting to get run again).
 *
 * These are internal functions.  Error checking is to catch bugs, and you
 * shouldn't call these functions with parameters you are not sure about (like
 * an invalid corelist).
 *
 * WARNING: YOU MUST HOLD THE PROC_LOCK BEFORE CALLING THESE! */
/* Gives process p the additional num cores listed in corelist */
int __proc_give_cores(struct proc *p, uint32_t *pc_arr, uint32_t num);
/* Takes from process p the num cores listed in pc_arr */
void __proc_take_corelist(struct proc *p, uint32_t *pc_arr, uint32_t num,
                          bool preempt);
/* Takes all cores, returns the count, fills in pc_arr with their pcoreid */
uint32_t __proc_take_allcores(struct proc *p, uint32_t *pc_arr, bool preempt);

/* Exposed for now for convenience */
void __map_vcore(struct proc *p, uint32_t vcoreid, uint32_t pcoreid);
void __unmap_vcore(struct proc *p, uint32_t vcoreid);
void vcore_account_online(struct proc *p, uint32_t vcoreid);
void vcore_account_offline(struct proc *p, uint32_t vcoreid);
uint64_t vcore_account_gettotal(struct proc *p, uint32_t vcoreid);

/* Preemption management.  Some of these will change */
void __proc_preempt_warn(struct proc *p, uint32_t vcoreid, uint64_t when);
void __proc_preempt_warnall(struct proc *p, uint64_t when);
void __proc_preempt_core(struct proc *p, uint32_t pcoreid);
uint32_t __proc_preempt_all(struct proc *p, uint32_t *pc_arr);
bool proc_preempt_core(struct proc *p, uint32_t pcoreid, uint64_t usec);
void proc_preempt_all(struct proc *p, uint64_t usec);

/* Current / cr3 / context management */
uintptr_t switch_to(struct proc *new_p);
void switch_back(struct proc *new_p, uintptr_t old_ret);
void abandon_core(void);
void clear_owning_proc(uint32_t coreid);
void proc_tlbshootdown(struct proc *p, uintptr_t start, uintptr_t end);

/* Kernel message handlers for process management */
void __startcore(uint32_t srcid, long a0, long a1, long a2);
void __set_curctx(uint32_t srcid, long a0, long a1, long a2);
void __notify(uint32_t srcid, long a0, long a1, long a2);
void __preempt(uint32_t srcid, long a0, long a1, long a2);
void __death(uint32_t srcid, long a0, long a1, long a2);
void __tlbshootdown(uint32_t srcid, long a0, long a1, long a2);

/* Arch Specific */
void proc_pop_ctx(struct user_context *ctx) __attribute__((noreturn));
void proc_init_ctx(struct user_context *ctx, uint32_t vcoreid, uintptr_t entryp,
                   uintptr_t stack_top, uintptr_t tls_desc);
void proc_secure_ctx(struct user_context *ctx);
void __abandon_core(void);
void __clear_owning_proc(uint32_t coreid);

/* Degubbing */
void print_allpids(void);
void print_proc_info(pid_t pid, int verbosity);
