#include "signal.h"
#include "sched.h"
#include "idle.h"
#include "proc_struct.h"
#include <fd.h>
#include <vm.h>
#include <system.h>
#include <system_data_structs.h>
#include <asm.h>
#include <errno.h>
#include <string.h>
#include <stddef.h>
int is_idle()
{
return current == idle;
}
int get_pid()
{
return current->id;
}
int get_pgid()
{
return current->group->id;
}
struct file_struct *get_wd()
{
return current->wd;
}
static int get_free_fd(int start, int *fd)
{
for (*fd = start; *fd < OPEN_MAX; (*fd)++)
if (!current->file_descr_table[*fd])
return 1;
return 0;
}
int alloc_fd(int start, struct file_descr_struct *file_descr, int *fd)
{
if (!get_free_fd(start, fd))
return -EMFILE;
current->file_descr_table[*fd] = file_descr;
return 0;
}
void free_fd(int fd)
{
current->file_descr_table[fd] = NULL;
}
struct file_descr_struct *get_file_descr(int fd)
{
if (fd < 0 || fd >= OPEN_MAX)
return NULL;
return current->file_descr_table[fd];
}
int is_child(const struct proc_struct *proc)
{
return proc->parent == current;
}
void signal_self(int sig)
{
signal(current, sig);
}
void yield()
{
int intr;
disable_intr(intr);
schedule();
restore_intr(intr);
}
static inline int is_user_fs()
{
unsigned short fs;
struct sel_data_struct sel_data;
get_fs(fs);
get_sel(&fs, &sel_data);
return sel_data.rpl;
}
int verify_area(const void *fs_ptr, unsigned int size, int access)
{
return is_user_fs() ? vm_verify_area(¤t->vm, (unsigned long)fs_ptr, size, access) : 1;
}
int verify_str(const char *fs_str, unsigned int n, unsigned int *len)
{
if (!is_user_fs()) {
if (len)
*len = strnlen(fs_str, n);
return 1;
}
else
return vm_verify_str(¤t->vm, (unsigned long)fs_str, n, len);
}
void *memory_map(void *addr, unsigned int len, int prot, int fd, long off)
{
struct file_descr_struct *file_descr;
int rv;
if (!addr)
if (!(addr = (void *)vm_get_free_area(¤t->vm, 0, MAPS_TOP, len, 0)))
return (void *)-ENOMEM;
if (fd != -1) {
if (!(file_descr = current->file_descr_table[fd]))
return (void *)-EBADF;
if ((rv = fd_map(¤t->vm, (unsigned long)addr, len, prot, file_descr, off)) < 0)
return (void *)rv;
}
else
if ((rv = vm_map_anon(¤t->vm, (unsigned long)addr, len, prot, 0, NULL)) < 0)
return (void *)rv;
return addr;
}
int memory_unmap(void *addr, unsigned int len)
{
return vm_unmap(¤t->vm, (unsigned long)addr, len);
}
int memory_protect(void *addr, unsigned int len, int prot)
{
return vm_protect(¤t->vm, (unsigned long)addr, len, prot);
}
int handle_page_fault(int cause, int access, unsigned long stack_top, unsigned long laddr)
{
return vm_handle_page_fault(¤t->vm, cause, access, stack_top, laddr);
}