/*
 * Definitions to support partitioning of the available
 * file descriptor space into three groups: local files,
 * rpc (aka, remote/helper) files, and rom files.
 * REMIND: Need to do this because psio doesn't support 256 file descriptors
 *
 * 0-----------------------31|32------------------95|96-----------------127
 * LOCAL_FDBASE   LOCAL_FDMAX|RPC_FDBASE   RPC_FDMAX|ROM_FDBASE   ROM_FDMAX
 *
 */
#define LOCAL_FDBASE	0
#define RPC_FDBASE	32
#define ROM_FDBASE	96
#define LOCAL_FDMAX	(RPC_FDBASE-1)
#define RPC_FDMAX	(ROM_FDBASE-1)
#define ROM_FDMAX	(127)

#define	RPC_TO_LOCAL(fd)	((fd)+rf_offset)
#define	LOCAL_TO_RPC(fd)	((fd)-rf_offset)

struct rom_filesystem {
    char *rfs_rbase;	/* base address of rom file data */
    char *rfs_ubase;	/* base address of uncompressed file data */
    int rfs_refcnt;	/* file reference count */
    int rfs_csize;	/* compressed file size */
    int rfs_usize;	/* uncompressed file size */
    char *rfs_name;	/* file name */
};

struct rom_file {
    struct rom_filesystem *rf_entry;	/* back pointer to filesystem entry */
    char *rf_ptr;	/* current file pointer */
};

extern int rf_search_order[];
int rf_offset;

#define	ISLOCALFILE(fd)		((fd) < RPC_FDBASE)
#define	ISRPCFILE(fd)		((fd) >= RPC_FDBASE && (fd) < ROM_FDBASE)
#define	ISROMFILE(fd)		((fd) >= ROM_FDBASE)

/* local fdset words */
#define fdset_word0(p) *((int *)(p))

/* remote fdset words */
#define fdset_word1(p) *(((int *)(p))+1)
#define fdset_word2(p) *(((int *)(p))+2)

/* rom fdset words */
#define fdset_word3(p) *(((int *)(p))+3)

/* not used - psio doesn't support fds above 127 */
#define fdset_word4(p) *(((int *)(p))+4)
#define fdset_word5(p) *(((int *)(p))+5)
#define fdset_word6(p) *(((int *)(p))+6)
#define fdset_word7(p) *(((int *)(p))+7)

/* these macros take a pointer to a fd_set */
#define	ISLOCALSET(fds)		(fds && fdset_word0(fds))
#define	ISRPCSET(fds)		(fds && (fdset_word1(fds) || fdset_word2(fds)))
#define	ISROMSET(fds)		(fds && fdset_word3(fds))

#define	ZEROLOCALSET(fds)	fdset_word0(fds) = 0;
#define	ZERORPCSET(fds)		fdset_word1(fds) = 0; \
				fdset_word2(fds) = 0;
#define	ZEROROMSET(fds)		fdset_word3(fds) = 0;
