// Main public header file for our user-land support library,
// whose code lives in the lib directory.
// This library is roughly our OS's version of a standard C library,
// and is intended to be linked into all user-mode applications
// (NOT the kernel or boot loader).

#ifndef ROS_INC_PARLIB_H
#define ROS_INC_PARLIB_H 1

#ifndef __ASSEMBLER__

#include <ros/common.h>
#include <ros/memlayout.h>
#include <ros/syscall.h>
#include <ros/procinfo.h>
#include <ros/procdata.h>
#include <signal.h>
#include <stdint.h>
#include <errno.h>
#include <ros_debug.h>

enum {
	PG_RDONLY = 4,
	PG_RDWR   = 6,
};

#ifdef __cplusplus
extern "C" {
#endif

ssize_t     sys_cputs(const uint8_t *s, size_t len);
uint16_t    sys_cgetc(void);
int         sys_null(void);
size_t      sys_getpcoreid(void);
/* Process Management */
int         sys_getpid(void);
int         sys_proc_destroy(int pid, int exitcode);
void        sys_yield(bool being_nice);
int         sys_proc_create(char *path, size_t path_l, char *argv[],
                            char *envp[], int flags);
int         sys_proc_run(int pid);
ssize_t     sys_shared_page_alloc(void *COUNT(PGSIZE) *addr, pid_t p2, 
                                  int p1_flags, int p2_flags);
ssize_t     sys_shared_page_free(void *COUNT(PGSIZE) addr, pid_t p2);
void        sys_reboot();
void *COUNT(length) sys_mmap(void *SNT addr, size_t length, int prot, int flags,
                             int fd, size_t offset);
int			sys_provision(int pid, unsigned int res_type, long res_val);
int         sys_notify(int pid, unsigned int ev_type, struct event_msg *u_msg);
int         sys_self_notify(uint32_t vcoreid, unsigned int ev_type,
                            struct event_msg *u_msg, bool priv);
int         sys_halt_core(unsigned int usec);
void*		sys_init_arsc();
int         sys_block(unsigned int usec);
int         sys_change_vcore(uint32_t vcoreid, bool enable_my_notif);
int         sys_change_to_m(void);
int         sys_poke_ksched(int pid, unsigned int res_type);
int         sys_abort_sysc(struct syscall *sysc);
int         sys_abort_sysc_fd(int fd);

long		syscall_async(struct syscall *sysc, unsigned long num, ...);

/* Posix signal related stuff */
struct sigdata {
	struct user_context u_ctx;
	struct ancillary_state as;
	struct siginfo info;
	void *stack;
};
void init_posix_signals(void);
struct sigdata *alloc_sigdata();
void free_sigdata(struct sigdata *sigdata);
void trigger_posix_signal(int sig_nr, struct siginfo *info, void *aux);

#ifdef __cplusplus
}
#endif

#endif	// !ASSEMBLER

#endif	// !ROS_INC_PARLIB_H
