2005-04-21 16:53:53 +02:00
|
|
|
/* Function prototypes. */
|
|
|
|
|
2005-06-17 15:41:12 +02:00
|
|
|
#include "timers.h"
|
2006-10-25 15:40:36 +02:00
|
|
|
#include "request.h"
|
2006-06-20 12:12:09 +02:00
|
|
|
|
2005-04-21 16:53:53 +02:00
|
|
|
/* Structs used in prototypes must be declared as such first. */
|
|
|
|
struct filp;
|
2006-05-11 16:57:23 +02:00
|
|
|
struct fproc;
|
2006-10-25 15:40:36 +02:00
|
|
|
struct vmnt;
|
|
|
|
struct vnode;
|
2005-04-21 16:53:53 +02:00
|
|
|
|
|
|
|
/* device.c */
|
|
|
|
_PROTOTYPE( int dev_open, (Dev_t dev, int proc, int flags) );
|
dev_close needs the filp number for asynch I/O, dev_io gets suspend_reopen
flag to suspend a process until the filedescriptor is re-opened. Added
dev_reopen, asyn_io, suspended_ep, reopen_reply, asynsend, diag_repl,
close_filp, close_reply, unpause, select_reply1, select_reply2.
2008-02-22 15:03:14 +01:00
|
|
|
_PROTOTYPE( int dev_reopen, (Dev_t dev, int filp_no, int flags) );
|
|
|
|
_PROTOTYPE( int dev_close, (Dev_t dev, int filp_no) );
|
2005-04-21 16:53:53 +02:00
|
|
|
_PROTOTYPE( int dev_io, (int op, Dev_t dev, int proc, void *buf,
|
dev_close needs the filp number for asynch I/O, dev_io gets suspend_reopen
flag to suspend a process until the filedescriptor is re-opened. Added
dev_reopen, asyn_io, suspended_ep, reopen_reply, asynsend, diag_repl,
close_filp, close_reply, unpause, select_reply1, select_reply2.
2008-02-22 15:03:14 +01:00
|
|
|
u64_t pos, int bytes, int flags, int suspend_reopen) );
|
2005-04-21 16:53:53 +02:00
|
|
|
_PROTOTYPE( int gen_opcl, (int op, Dev_t dev, int proc, int flags) );
|
2006-03-15 14:37:20 +01:00
|
|
|
_PROTOTYPE( int gen_io, (int task_nr, message *mess_ptr) );
|
dev_close needs the filp number for asynch I/O, dev_io gets suspend_reopen
flag to suspend a process until the filedescriptor is re-opened. Added
dev_reopen, asyn_io, suspended_ep, reopen_reply, asynsend, diag_repl,
close_filp, close_reply, unpause, select_reply1, select_reply2.
2008-02-22 15:03:14 +01:00
|
|
|
_PROTOTYPE( int asyn_io, (int task_nr, message *mess_ptr) );
|
2005-08-02 17:29:17 +02:00
|
|
|
_PROTOTYPE( int no_dev, (int op, Dev_t dev, int proc, int flags) );
|
2006-03-15 14:37:20 +01:00
|
|
|
_PROTOTYPE( int no_dev_io, (int, message *) );
|
2005-04-21 16:53:53 +02:00
|
|
|
_PROTOTYPE( int tty_opcl, (int op, Dev_t dev, int proc, int flags) );
|
|
|
|
_PROTOTYPE( int ctty_opcl, (int op, Dev_t dev, int proc, int flags) );
|
|
|
|
_PROTOTYPE( int clone_opcl, (int op, Dev_t dev, int proc, int flags) );
|
2006-03-15 14:37:20 +01:00
|
|
|
_PROTOTYPE( int ctty_io, (int task_nr, message *mess_ptr) );
|
2005-04-21 16:53:53 +02:00
|
|
|
_PROTOTYPE( int do_ioctl, (void) );
|
2006-05-11 16:57:23 +02:00
|
|
|
_PROTOTYPE( void pm_setsid, (int proc_e) );
|
2005-08-02 17:29:17 +02:00
|
|
|
_PROTOTYPE( void dev_status, (message *) );
|
2005-10-20 21:39:32 +02:00
|
|
|
_PROTOTYPE( void dev_up, (int major) );
|
dev_close needs the filp number for asynch I/O, dev_io gets suspend_reopen
flag to suspend a process until the filedescriptor is re-opened. Added
dev_reopen, asyn_io, suspended_ep, reopen_reply, asynsend, diag_repl,
close_filp, close_reply, unpause, select_reply1, select_reply2.
2008-02-22 15:03:14 +01:00
|
|
|
_PROTOTYPE( endpoint_t suspended_ep, (endpoint_t driver,
|
|
|
|
cp_grant_id_t g) );
|
|
|
|
_PROTOTYPE( void reopen_reply, (void) );
|
2005-04-21 16:53:53 +02:00
|
|
|
|
|
|
|
/* dmap.c */
|
2005-08-02 17:29:17 +02:00
|
|
|
_PROTOTYPE( int do_devctl, (void) );
|
2006-05-11 16:57:23 +02:00
|
|
|
_PROTOTYPE( int fs_devctl, (int req, int dev, int proc_nr_e, int style,
|
|
|
|
int force) );
|
2007-08-07 14:52:47 +02:00
|
|
|
_PROTOTYPE( int do_mapdriver, (void) );
|
2005-08-05 20:57:20 +02:00
|
|
|
_PROTOTYPE( void build_dmap, (void) );
|
2006-05-11 16:57:23 +02:00
|
|
|
_PROTOTYPE( int map_driver, (int major, int proc_nr, int dev_style,
|
|
|
|
int force) );
|
2009-09-22 23:48:26 +02:00
|
|
|
_PROTOTYPE( int dmap_driver_match, (endpoint_t proc, int major) );
|
endpoint-aware conversion of servers.
'who', indicating caller number in pm and fs and some other servers, has
been removed in favour of 'who_e' (endpoint) and 'who_p' (proc nr.).
In both PM and FS, isokendpt() convert endpoints to process slot
numbers, returning OK if it was a valid and consistent endpoint number.
okendpt() does the same but panic()s if it doesn't succeed. (In PM,
this is pm_isok..)
pm and fs keep their own records of process endpoints in their proc tables,
which are needed to make kernel calls about those processes.
message field names have changed.
fs drivers are endpoints.
fs now doesn't try to get out of driver deadlock, as the protocol isn't
supposed to let that happen any more. (A warning is printed if ELOCKED
is detected though.)
fproc[].fp_task (indicating which driver the process is suspended on)
became an int.
PM and FS now get endpoint numbers of initial boot processes from the
kernel. These happen to be the same as the old proc numbers, to let
user processes reach them with the old numbers, but FS and PM don't know
that. All new processes after INIT, even after the generation number
wraps around, get endpoint numbers with generation 1 and higher, so
the first instances of the boot processes are the only processes ever
to have endpoint numbers in the old proc number range.
More return code checks of sys_* functions have been added.
IS has become endpoint-aware. Ditched the 'text' and 'data' fields
in the kernel dump (which show locations, not sizes, so aren't terribly
useful) in favour of the endpoint number. Proc number is still visible.
Some other dumps (e.g. dmap, rs) show endpoint numbers now too which got
the formatting changed.
PM reading segments using rw_seg() has changed - it uses other fields
in the message now instead of encoding the segment and process number and
fd in the fd field. For that it uses _read_pm() and _write_pm() which to
_taskcall()s directly in pm/misc.c.
PM now sys_exit()s itself on panic(), instead of sys_abort().
RS also talks in endpoints instead of process numbers.
2006-03-03 11:20:58 +01:00
|
|
|
_PROTOTYPE( void dmap_unmap_by_endpt, (int proc_nr) );
|
|
|
|
_PROTOTYPE( void dmap_endpt_up, (int proc_nr) );
|
2005-04-21 16:53:53 +02:00
|
|
|
|
2006-05-11 16:57:23 +02:00
|
|
|
/* exec.c */
|
|
|
|
_PROTOTYPE( int pm_exec, (int proc_e, char *path, vir_bytes path_len,
|
|
|
|
char *frame, vir_bytes frame_len) );
|
|
|
|
|
2005-04-21 16:53:53 +02:00
|
|
|
/* filedes.c */
|
2006-10-25 15:40:36 +02:00
|
|
|
_PROTOTYPE( struct filp *find_filp, (struct vnode *vp, mode_t bits) );
|
|
|
|
_PROTOTYPE( int get_fd, (int start, mode_t bits, int *k,
|
2008-11-19 13:26:10 +01:00
|
|
|
struct filp **fpt) );
|
2005-04-21 16:53:53 +02:00
|
|
|
_PROTOTYPE( struct filp *get_filp, (int fild) );
|
2006-05-11 16:57:23 +02:00
|
|
|
_PROTOTYPE( struct filp *get_filp2, (struct fproc *rfp, int fild) );
|
2006-03-09 17:00:33 +01:00
|
|
|
_PROTOTYPE( int inval_filp, (struct filp *) );
|
2005-04-21 16:53:53 +02:00
|
|
|
|
2009-05-11 12:02:28 +02:00
|
|
|
/* fscall.c */
|
|
|
|
_PROTOTYPE( void nested_fs_call, (message *m) );
|
|
|
|
|
dev_close needs the filp number for asynch I/O, dev_io gets suspend_reopen
flag to suspend a process until the filedescriptor is re-opened. Added
dev_reopen, asyn_io, suspended_ep, reopen_reply, asynsend, diag_repl,
close_filp, close_reply, unpause, select_reply1, select_reply2.
2008-02-22 15:03:14 +01:00
|
|
|
/* kputc.c */
|
|
|
|
_PROTOTYPE( void diag_repl, (void) );
|
|
|
|
|
2005-04-21 16:53:53 +02:00
|
|
|
/* link.c */
|
|
|
|
_PROTOTYPE( int do_link, (void) );
|
|
|
|
_PROTOTYPE( int do_unlink, (void) );
|
|
|
|
_PROTOTYPE( int do_rename, (void) );
|
2006-01-11 18:14:51 +01:00
|
|
|
_PROTOTYPE( int do_truncate, (void) );
|
|
|
|
_PROTOTYPE( int do_ftruncate, (void) );
|
2007-01-05 17:36:55 +01:00
|
|
|
_PROTOTYPE( int truncate_vn, (struct vnode *vp, off_t newsize) );
|
2005-04-21 16:53:53 +02:00
|
|
|
|
|
|
|
/* lock.c */
|
|
|
|
_PROTOTYPE( int lock_op, (struct filp *f, int req) );
|
|
|
|
_PROTOTYPE( void lock_revive, (void) );
|
|
|
|
|
|
|
|
/* main.c */
|
2005-08-25 14:30:43 +02:00
|
|
|
_PROTOTYPE( int main, (void) );
|
2005-04-21 16:53:53 +02:00
|
|
|
_PROTOTYPE( void reply, (int whom, int result) );
|
|
|
|
|
|
|
|
/* misc.c */
|
|
|
|
_PROTOTYPE( int do_dup, (void) );
|
2006-05-11 16:57:23 +02:00
|
|
|
_PROTOTYPE( void pm_exit, (int proc) );
|
2005-04-21 16:53:53 +02:00
|
|
|
_PROTOTYPE( int do_fcntl, (void) );
|
2006-05-11 16:57:23 +02:00
|
|
|
_PROTOTYPE( void pm_fork, (int pproc, int cproc, int cpid) );
|
|
|
|
_PROTOTYPE( void pm_setgid, (int proc_e, int egid, int rgid) );
|
|
|
|
_PROTOTYPE( void pm_setuid, (int proc_e, int euid, int ruid) );
|
2005-04-21 16:53:53 +02:00
|
|
|
_PROTOTYPE( int do_sync, (void) );
|
2005-09-11 18:45:46 +02:00
|
|
|
_PROTOTYPE( int do_fsync, (void) );
|
2006-05-11 16:57:23 +02:00
|
|
|
_PROTOTYPE( void pm_reboot, (void) );
|
2005-04-21 16:53:53 +02:00
|
|
|
_PROTOTYPE( int do_svrctl, (void) );
|
|
|
|
_PROTOTYPE( int do_getsysinfo, (void) );
|
2006-05-11 16:57:23 +02:00
|
|
|
_PROTOTYPE( int pm_dumpcore, (int proc_e, struct mem_map *seg_ptr) );
|
2005-04-21 16:53:53 +02:00
|
|
|
|
2008-11-19 13:26:10 +01:00
|
|
|
/* mmap.c */
|
|
|
|
_PROTOTYPE( int do_vm_mmap, (void) );
|
|
|
|
|
2005-04-21 16:53:53 +02:00
|
|
|
/* mount.c */
|
2006-10-25 15:40:36 +02:00
|
|
|
_PROTOTYPE( int do_fslogin, (void) );
|
2005-04-21 16:53:53 +02:00
|
|
|
_PROTOTYPE( int do_mount, (void) );
|
|
|
|
_PROTOTYPE( int do_umount, (void) );
|
|
|
|
_PROTOTYPE( int unmount, (Dev_t dev) );
|
|
|
|
|
|
|
|
/* open.c */
|
|
|
|
_PROTOTYPE( int do_close, (void) );
|
2006-05-11 16:57:23 +02:00
|
|
|
_PROTOTYPE( int close_fd, (struct fproc *rfp, int fd_nr) );
|
dev_close needs the filp number for asynch I/O, dev_io gets suspend_reopen
flag to suspend a process until the filedescriptor is re-opened. Added
dev_reopen, asyn_io, suspended_ep, reopen_reply, asynsend, diag_repl,
close_filp, close_reply, unpause, select_reply1, select_reply2.
2008-02-22 15:03:14 +01:00
|
|
|
_PROTOTYPE( void close_filp, (struct filp *fp) );
|
|
|
|
_PROTOTYPE( void close_reply, (void) );
|
2005-04-21 16:53:53 +02:00
|
|
|
_PROTOTYPE( int do_creat, (void) );
|
|
|
|
_PROTOTYPE( int do_lseek, (void) );
|
2006-11-27 15:21:43 +01:00
|
|
|
_PROTOTYPE( int do_llseek, (void) );
|
2005-04-21 16:53:53 +02:00
|
|
|
_PROTOTYPE( int do_mknod, (void) );
|
|
|
|
_PROTOTYPE( int do_mkdir, (void) );
|
|
|
|
_PROTOTYPE( int do_open, (void) );
|
2006-10-25 15:40:36 +02:00
|
|
|
_PROTOTYPE( int do_slink, (void) );
|
2008-11-19 13:26:10 +01:00
|
|
|
_PROTOTYPE( int do_vm_open, (void) );
|
|
|
|
_PROTOTYPE( int do_vm_close, (void) );
|
2005-04-21 16:53:53 +02:00
|
|
|
|
|
|
|
/* path.c */
|
2007-08-07 14:52:47 +02:00
|
|
|
_PROTOTYPE( int lookup_rel_vp, (struct vnode *start_node, int flags,
|
2008-11-19 13:26:10 +01:00
|
|
|
int use_realuid, struct vnode **vpp) );
|
2007-08-07 14:52:47 +02:00
|
|
|
_PROTOTYPE( int lookup_vp, (int flags, int use_realuid,
|
2008-11-19 13:26:10 +01:00
|
|
|
struct vnode **vpp) );
|
2007-08-07 14:52:47 +02:00
|
|
|
_PROTOTYPE( int lookup_lastdir_rel, (struct vnode *start_node,
|
2008-11-19 13:26:10 +01:00
|
|
|
int use_realuid, struct vnode **vpp) );
|
2007-08-07 14:52:47 +02:00
|
|
|
_PROTOTYPE( int lookup_lastdir, (int use_realuid, struct vnode **vpp) );
|
2005-04-21 16:53:53 +02:00
|
|
|
|
|
|
|
/* pipe.c */
|
|
|
|
_PROTOTYPE( int do_pipe, (void) );
|
dev_close needs the filp number for asynch I/O, dev_io gets suspend_reopen
flag to suspend a process until the filedescriptor is re-opened. Added
dev_reopen, asyn_io, suspended_ep, reopen_reply, asynsend, diag_repl,
close_filp, close_reply, unpause, select_reply1, select_reply2.
2008-02-22 15:03:14 +01:00
|
|
|
_PROTOTYPE( void unpause, (int proc_nr_e) );
|
2007-08-07 14:52:47 +02:00
|
|
|
_PROTOTYPE( int Xpipe_check, (struct vnode *vp, int rw_flag,
|
|
|
|
int oflags, int bytes, u64_t position, int notouch) );
|
2006-10-25 15:40:36 +02:00
|
|
|
_PROTOTYPE( void release, (struct vnode *vp, int call_nr, int count) );
|
2005-04-21 16:53:53 +02:00
|
|
|
_PROTOTYPE( void revive, (int proc_nr, int bytes) );
|
|
|
|
_PROTOTYPE( void suspend, (int task) );
|
2007-08-07 14:52:47 +02:00
|
|
|
_PROTOTYPE( void pipe_suspend, (int rw_flag, int fd_nr, char *buf,
|
|
|
|
size_t size) );
|
2005-09-11 18:45:46 +02:00
|
|
|
_PROTOTYPE( int select_request_pipe, (struct filp *f, int *ops, int bl) );
|
2005-06-17 15:41:12 +02:00
|
|
|
_PROTOTYPE( int select_cancel_pipe, (struct filp *f) );
|
|
|
|
_PROTOTYPE( int select_match_pipe, (struct filp *f) );
|
2009-09-22 23:48:26 +02:00
|
|
|
_PROTOTYPE( void unsuspend_by_endpt, (endpoint_t) );
|
dev_close needs the filp number for asynch I/O, dev_io gets suspend_reopen
flag to suspend a process until the filedescriptor is re-opened. Added
dev_reopen, asyn_io, suspended_ep, reopen_reply, asynsend, diag_repl,
close_filp, close_reply, unpause, select_reply1, select_reply2.
2008-02-22 15:03:14 +01:00
|
|
|
_PROTOTYPE( void select_reply1, (void) );
|
|
|
|
_PROTOTYPE( void select_reply2, (void) );
|
2009-05-08 15:56:41 +02:00
|
|
|
#if DO_SANITYCHECKS
|
|
|
|
_PROTOTYPE( int check_pipe, (void) );
|
|
|
|
#endif
|
2005-04-21 16:53:53 +02:00
|
|
|
|
|
|
|
/* protect.c */
|
|
|
|
_PROTOTYPE( int do_access, (void) );
|
|
|
|
_PROTOTYPE( int do_chmod, (void) );
|
|
|
|
_PROTOTYPE( int do_chown, (void) );
|
|
|
|
_PROTOTYPE( int do_umask, (void) );
|
2007-08-07 14:52:47 +02:00
|
|
|
_PROTOTYPE( int forbidden, (struct vnode *vp,
|
|
|
|
mode_t access_desired, int use_realuid) );
|
2007-01-05 17:36:55 +01:00
|
|
|
_PROTOTYPE( int read_only, (struct vnode *vp) );
|
2005-04-21 16:53:53 +02:00
|
|
|
|
|
|
|
/* read.c */
|
|
|
|
_PROTOTYPE( int do_read, (void) );
|
2006-11-09 17:22:54 +01:00
|
|
|
_PROTOTYPE( int do_getdents, (void) );
|
2005-04-21 16:53:53 +02:00
|
|
|
_PROTOTYPE( int read_write, (int rw_flag) );
|
2007-08-07 14:52:47 +02:00
|
|
|
_PROTOTYPE( int rw_pipe, (int rw_flag, endpoint_t usr,
|
|
|
|
int fd_nr, struct filp *f, char *buf, size_t req_size) );
|
2006-10-25 15:40:36 +02:00
|
|
|
|
|
|
|
/* request.c */
|
2007-08-07 14:52:47 +02:00
|
|
|
_PROTOTYPE( int req_breadwrite, (endpoint_t fs_e, endpoint_t user_e,
|
|
|
|
Dev_t dev, u64_t pos, unsigned int num_of_bytes,
|
|
|
|
char *user_addr, int rw_flag,
|
|
|
|
u64_t *new_posp, unsigned int *cum_iop) );
|
|
|
|
_PROTOTYPE( int req_chmod, (int fs_e, ino_t inode_nr, _mnx_Mode_t rmode,
|
|
|
|
mode_t *new_modep) );
|
|
|
|
_PROTOTYPE( int req_chown, (endpoint_t fs_e, ino_t inode_nr,
|
|
|
|
_mnx_Uid_t newuid, _mnx_Gid_t newgid, mode_t *new_modep) );
|
2007-01-05 17:36:55 +01:00
|
|
|
_PROTOTYPE( int req_create, (int fs_e, ino_t inode_nr, int omode,
|
|
|
|
int uid, int gid, char *path, node_details_t *res) );
|
2007-08-07 14:52:47 +02:00
|
|
|
_PROTOTYPE( int req_flush, (endpoint_t fs_e, Dev_t dev) );
|
2007-08-17 13:20:59 +02:00
|
|
|
_PROTOTYPE( int req_fstatfs, (int fs_e, int who_e, char *buf) );
|
2007-08-07 14:52:47 +02:00
|
|
|
_PROTOTYPE( int req_ftrunc, (endpoint_t fs_e, ino_t inode_nr,
|
|
|
|
off_t start, off_t end) );
|
|
|
|
_PROTOTYPE( int req_getdents, (endpoint_t fs_e, ino_t inode_nr,
|
|
|
|
off_t pos, cp_grant_id_t gid, size_t size, off_t *pos_change) );
|
|
|
|
_PROTOTYPE( int req_inhibread, (endpoint_t fs_e, ino_t inode_nr) );
|
|
|
|
_PROTOTYPE( int req_link, (endpoint_t fs_e, ino_t link_parent,
|
|
|
|
char *lastc, ino_t linked_file) );
|
|
|
|
_PROTOTYPE( int req_lookup, (endpoint_t fs_e, size_t path_off,
|
|
|
|
ino_t dir_ino, ino_t root_ino, _mnx_Uid_t uid,
|
|
|
|
_mnx_Gid_t gid, int flags, lookup_res_t *res) );
|
|
|
|
_PROTOTYPE( int req_mkdir, (endpoint_t fs_e, ino_t inode_nr,
|
|
|
|
char *lastc, _mnx_Uid_t uid, _mnx_Gid_t gid, _mnx_Mode_t dmode) );
|
|
|
|
_PROTOTYPE( int req_mknod, (endpoint_t fs_e, ino_t inode_nr,
|
|
|
|
char *lastc, _mnx_Uid_t uid, _mnx_Gid_t gid,
|
|
|
|
_mnx_Mode_t dmode, Dev_t dev) );
|
|
|
|
_PROTOTYPE( int req_mountpoint, (endpoint_t fs_e, ino_t inode_nr) );
|
|
|
|
_PROTOTYPE( int req_newnode, (endpoint_t fs_e, _mnx_Uid_t uid,
|
|
|
|
_mnx_Gid_t gid, _mnx_Mode_t dmode,
|
|
|
|
Dev_t dev, struct node_details *res) );
|
|
|
|
_PROTOTYPE( int req_putnode, (int fs_e, ino_t inode_nr, int count) );
|
|
|
|
_PROTOTYPE( int req_rdlink, (endpoint_t fs_e, ino_t inode_nr,
|
|
|
|
endpoint_t who_e, vir_bytes buf, size_t len) );
|
|
|
|
_PROTOTYPE( int req_readsuper, (endpoint_t fs_e, char *driver_name,
|
|
|
|
Dev_t dev, int readonly, int isroot,
|
|
|
|
struct node_details *res_nodep) );
|
|
|
|
_PROTOTYPE( int req_readwrite, (endpoint_t fs_e, ino_t inode_nr,
|
|
|
|
int inode_index, u64_t pos, int rw_flag,
|
|
|
|
endpoint_t user_e, char *user_addr,
|
|
|
|
unsigned int num_of_bytes, u64_t *new_posp,
|
|
|
|
unsigned int *cum_iop) );
|
|
|
|
_PROTOTYPE( int req_rename, (endpoint_t fs_e, ino_t old_dir,
|
|
|
|
char *old_name, ino_t new_dir, char *new_name) );
|
|
|
|
_PROTOTYPE( int req_rmdir, (endpoint_t fs_e, ino_t inode_nr,
|
|
|
|
char *lastc) );
|
|
|
|
_PROTOTYPE(int req_slink, (endpoint_t fs_e, ino_t inode_nr, char *lastc,
|
|
|
|
endpoint_t who_e, char *path_addr,
|
|
|
|
int path_length, _mnx_Uid_t uid, _mnx_Gid_t gid) );
|
|
|
|
_PROTOTYPE( int req_stat, (int fs_e, ino_t inode_nr, int who_e,
|
|
|
|
char *buf, int pos) );
|
2006-10-25 15:40:36 +02:00
|
|
|
_PROTOTYPE( int req_sync, (endpoint_t fs_e) );
|
2007-08-07 14:52:47 +02:00
|
|
|
_PROTOTYPE( int req_unlink, (endpoint_t fs_e, ino_t inode_nr,
|
|
|
|
char *lastc) );
|
2006-10-25 15:40:36 +02:00
|
|
|
_PROTOTYPE( int req_unmount, (endpoint_t fs_e) );
|
2007-08-07 14:52:47 +02:00
|
|
|
_PROTOTYPE( int req_utime, (endpoint_t fs_e, ino_t inode_nr,
|
|
|
|
time_t actime, time_t modtime) );
|
2006-10-25 15:40:36 +02:00
|
|
|
_PROTOTYPE( int req_newdriver, (endpoint_t fs_e, Dev_t dev,
|
|
|
|
endpoint_t driver_e) );
|
2005-04-21 16:53:53 +02:00
|
|
|
|
|
|
|
/* stadir.c */
|
|
|
|
_PROTOTYPE( int do_chdir, (void) );
|
2005-06-29 21:28:26 +02:00
|
|
|
_PROTOTYPE( int do_fchdir, (void) );
|
2005-04-21 16:53:53 +02:00
|
|
|
_PROTOTYPE( int do_chroot, (void) );
|
|
|
|
_PROTOTYPE( int do_fstat, (void) );
|
|
|
|
_PROTOTYPE( int do_stat, (void) );
|
|
|
|
_PROTOTYPE( int do_fstatfs, (void) );
|
2005-12-20 15:23:44 +01:00
|
|
|
_PROTOTYPE( int do_rdlink, (void) );
|
|
|
|
_PROTOTYPE( int do_lstat, (void) );
|
2005-04-21 16:53:53 +02:00
|
|
|
|
|
|
|
/* time.c */
|
|
|
|
_PROTOTYPE( int do_utime, (void) );
|
2005-05-31 11:50:51 +02:00
|
|
|
|
2005-04-21 16:53:53 +02:00
|
|
|
/* utility.c */
|
|
|
|
_PROTOTYPE( time_t clock_time, (void) );
|
|
|
|
_PROTOTYPE( unsigned conv2, (int norm, int w) );
|
|
|
|
_PROTOTYPE( long conv4, (int norm, long x) );
|
|
|
|
_PROTOTYPE( int fetch_name, (char *path, int len, int flag) );
|
|
|
|
_PROTOTYPE( int no_sys, (void) );
|
endpoint-aware conversion of servers.
'who', indicating caller number in pm and fs and some other servers, has
been removed in favour of 'who_e' (endpoint) and 'who_p' (proc nr.).
In both PM and FS, isokendpt() convert endpoints to process slot
numbers, returning OK if it was a valid and consistent endpoint number.
okendpt() does the same but panic()s if it doesn't succeed. (In PM,
this is pm_isok..)
pm and fs keep their own records of process endpoints in their proc tables,
which are needed to make kernel calls about those processes.
message field names have changed.
fs drivers are endpoints.
fs now doesn't try to get out of driver deadlock, as the protocol isn't
supposed to let that happen any more. (A warning is printed if ELOCKED
is detected though.)
fproc[].fp_task (indicating which driver the process is suspended on)
became an int.
PM and FS now get endpoint numbers of initial boot processes from the
kernel. These happen to be the same as the old proc numbers, to let
user processes reach them with the old numbers, but FS and PM don't know
that. All new processes after INIT, even after the generation number
wraps around, get endpoint numbers with generation 1 and higher, so
the first instances of the boot processes are the only processes ever
to have endpoint numbers in the old proc number range.
More return code checks of sys_* functions have been added.
IS has become endpoint-aware. Ditched the 'text' and 'data' fields
in the kernel dump (which show locations, not sizes, so aren't terribly
useful) in favour of the endpoint number. Proc number is still visible.
Some other dumps (e.g. dmap, rs) show endpoint numbers now too which got
the formatting changed.
PM reading segments using rw_seg() has changed - it uses other fields
in the message now instead of encoding the segment and process number and
fd in the fd field. For that it uses _read_pm() and _write_pm() which to
_taskcall()s directly in pm/misc.c.
PM now sys_exit()s itself on panic(), instead of sys_abort().
RS also talks in endpoints instead of process numbers.
2006-03-03 11:20:58 +01:00
|
|
|
_PROTOTYPE( int isokendpt_f, (char *f, int l, int e, int *p, int ft));
|
2005-06-01 16:31:00 +02:00
|
|
|
_PROTOTYPE( void panic, (char *who, char *mess, int num) );
|
2005-04-21 16:53:53 +02:00
|
|
|
|
endpoint-aware conversion of servers.
'who', indicating caller number in pm and fs and some other servers, has
been removed in favour of 'who_e' (endpoint) and 'who_p' (proc nr.).
In both PM and FS, isokendpt() convert endpoints to process slot
numbers, returning OK if it was a valid and consistent endpoint number.
okendpt() does the same but panic()s if it doesn't succeed. (In PM,
this is pm_isok..)
pm and fs keep their own records of process endpoints in their proc tables,
which are needed to make kernel calls about those processes.
message field names have changed.
fs drivers are endpoints.
fs now doesn't try to get out of driver deadlock, as the protocol isn't
supposed to let that happen any more. (A warning is printed if ELOCKED
is detected though.)
fproc[].fp_task (indicating which driver the process is suspended on)
became an int.
PM and FS now get endpoint numbers of initial boot processes from the
kernel. These happen to be the same as the old proc numbers, to let
user processes reach them with the old numbers, but FS and PM don't know
that. All new processes after INIT, even after the generation number
wraps around, get endpoint numbers with generation 1 and higher, so
the first instances of the boot processes are the only processes ever
to have endpoint numbers in the old proc number range.
More return code checks of sys_* functions have been added.
IS has become endpoint-aware. Ditched the 'text' and 'data' fields
in the kernel dump (which show locations, not sizes, so aren't terribly
useful) in favour of the endpoint number. Proc number is still visible.
Some other dumps (e.g. dmap, rs) show endpoint numbers now too which got
the formatting changed.
PM reading segments using rw_seg() has changed - it uses other fields
in the message now instead of encoding the segment and process number and
fd in the fd field. For that it uses _read_pm() and _write_pm() which to
_taskcall()s directly in pm/misc.c.
PM now sys_exit()s itself on panic(), instead of sys_abort().
RS also talks in endpoints instead of process numbers.
2006-03-03 11:20:58 +01:00
|
|
|
#define okendpt(e, p) isokendpt_f(__FILE__, __LINE__, (e), (p), 1)
|
|
|
|
#define isokendpt(e, p) isokendpt_f(__FILE__, __LINE__, (e), (p), 0)
|
|
|
|
|
2006-10-25 15:40:36 +02:00
|
|
|
/* vmnt.c */
|
|
|
|
_PROTOTYPE( struct vmnt *get_free_vmnt, (short *index) );
|
|
|
|
_PROTOTYPE( struct vmnt *find_vmnt, (int fs_e) );
|
|
|
|
|
|
|
|
/* vnode.c */
|
2007-01-05 17:36:55 +01:00
|
|
|
_PROTOTYPE( struct vnode *get_free_vnode, (char *file, int line) );
|
2006-10-25 15:40:36 +02:00
|
|
|
_PROTOTYPE( struct vnode *find_vnode, (int fs_e, int numb) );
|
|
|
|
_PROTOTYPE( void dup_vnode, (struct vnode *vp) );
|
|
|
|
_PROTOTYPE( void put_vnode, (struct vnode *vp) );
|
2007-01-05 17:36:55 +01:00
|
|
|
_PROTOTYPE( void vnode_clean_refs, (struct vnode *vp) );
|
2009-05-08 15:56:41 +02:00
|
|
|
#if DO_SANITYCHECKS
|
2009-01-20 14:43:00 +01:00
|
|
|
_PROTOTYPE( int check_vrefs, (void) );
|
2009-05-08 15:56:41 +02:00
|
|
|
#endif
|
2006-10-25 15:40:36 +02:00
|
|
|
|
2005-04-21 16:53:53 +02:00
|
|
|
/* write.c */
|
|
|
|
_PROTOTYPE( int do_write, (void) );
|
2005-06-06 13:40:32 +02:00
|
|
|
|
|
|
|
/* select.c */
|
|
|
|
_PROTOTYPE( int do_select, (void) );
|
2005-06-17 15:41:12 +02:00
|
|
|
_PROTOTYPE( int select_callback, (struct filp *, int ops) );
|
|
|
|
_PROTOTYPE( void select_forget, (int fproc) );
|
|
|
|
_PROTOTYPE( void select_timeout_check, (timer_t *) );
|
2005-07-22 20:28:32 +02:00
|
|
|
_PROTOTYPE( void init_select, (void) );
|
2009-09-22 23:48:26 +02:00
|
|
|
_PROTOTYPE( void select_unsuspend_by_endpt, (endpoint_t proc) );
|
2005-09-11 18:45:46 +02:00
|
|
|
_PROTOTYPE( int select_notified, (int major, int minor, int ops) );
|
2005-06-17 15:41:12 +02:00
|
|
|
|
|
|
|
/* timers.c */
|
2006-10-25 15:40:36 +02:00
|
|
|
_PROTOTYPE( void fs_set_timer, (timer_t *tp, int delta,
|
|
|
|
tmr_func_t watchdog, int arg) );
|
2005-08-02 17:29:17 +02:00
|
|
|
_PROTOTYPE( void fs_expire_timers, (clock_t now) );
|
|
|
|
_PROTOTYPE( void fs_cancel_timer, (timer_t *tp) );
|
|
|
|
_PROTOTYPE( void fs_init_timer, (timer_t *tp) );
|
2006-10-25 15:40:36 +02:00
|
|
|
|
Mostly bugfixes of bugs triggered by the test set.
bugfixes:
SYSTEM:
. removed
rc->p_priv->s_flags = 0;
for the priv struct shared by all user processes in get_priv(). this
should only be done once. doing a SYS_PRIV_USER in sys_privctl()
caused the flags of all user processes to be reset, so they were no
longer PREEMPTIBLE. this happened when RS executed a policy script.
(this broke test1 in the test set)
VFS/MFS:
. chown can change the mode of a file, and chmod arguments are only
part of the full file mode so the full filemode is slightly magic.
changed these calls so that the final modes are returned to VFS, so
that the vnode can be kept up-to-date.
(this broke test11 in the test set)
MFS:
. lookup() checked for sizeof(string) instead of sizeof(user_path),
truncating long path names
(caught by test 23)
. truncate functions neglected to update ctime
(this broke test16)
VFS:
. corner case of an empty filename lookup caused fields of a request
not to be filled in in the lookup functions, not making it clear
that the lookup had failed, causing messages to garbage processes,
causing strange failures.
(caught by test 30)
. trust v_size in vnode when doing reads or writes on non-special
files, truncating i/o where necessary; this is necessary for pipes,
as MFS can't tell when a pipe has been truncated without it being
told explicitly each time.
when the last reader/writer on a pipe closes, tell FS about
the new size using truncate_vn().
(this broke test 25, among others)
. permission check for chdir() had disappeared; added a
forbidden() call
(caught by test 23)
new code, shouldn't change anything:
. introduced RTS_SET, RTS_UNSET, and RTS_ISSET macro's, and their
LOCK variants. These macros set and clear the p_rts_flags field,
causing a lot of duplicated logic like
old_flags = rp->p_rts_flags; /* save value of the flags */
rp->p_rts_flags &= ~NO_PRIV;
if (old_flags != 0 && rp->p_rts_flags == 0) lock_enqueue(rp);
to change into the simpler
RTS_LOCK_UNSET(rp, NO_PRIV);
so the macros take care of calling dequeue() and enqueue() (or lock_*()),
as the case may be). This makes the code a bit more readable and a
bit less fragile.
. removed return code from do_clocktick in CLOCK as it currently
never replies
. removed some debug code from VFS
. fixed grant debug message in device.c
preemptive checks, tests, changes:
. added return code checks of receive() to SYSTEM and CLOCK
. O_TRUNC should never arrive at MFS (added sanity check and removed
O_TRUNC code)
. user_path declared with PATH_MAX+1 to let it be null-terminated
. checks in MFS to see if strings passed by VFS are null-terminated
IS:
. static irq name table thrown out
2007-02-01 18:50:02 +01:00
|
|
|
|