#ifndef _SYS_CONF_H_
#define _SYS_CONF_H_ 1
#include <sys/appleapiopts.h>
#include <sys/cdefs.h>
#include <sys/queue.h>
#include <stdint.h>
struct buf;
struct proc;
struct tty;
struct uio;
struct vnode;
#define D_TAPE 1
#define D_DISK 2
#define D_TTY 3
#ifdef KERNEL
typedef int open_close_fcn_t(dev_t dev, int flags, int devtype,
struct proc *p);
typedef struct tty *d_devtotty_t(dev_t dev);
typedef void strategy_fcn_t(struct buf *bp);
typedef int ioctl_fcn_t(dev_t dev, u_long cmd, caddr_t data,
int fflag, struct proc *p);
typedef int dump_fcn_t(void);
typedef int psize_fcn_t(dev_t dev);
typedef int read_write_fcn_t(dev_t dev, struct uio *uio, int ioflag);
typedef int stop_fcn_t(struct tty *tp, int rw);
typedef int reset_fcn_t(int uban);
typedef int select_fcn_t(dev_t dev, int which, void * wql, struct proc *p);
typedef int mmap_fcn_t(void);
#define d_open_t open_close_fcn_t
#define d_close_t open_close_fcn_t
#define d_read_t read_write_fcn_t
#define d_write_t read_write_fcn_t
#define d_ioctl_t ioctl_fcn_t
#define d_stop_t stop_fcn_t
#define d_reset_t reset_fcn_t
#define d_select_t select_fcn_t
#define d_mmap_t mmap_fcn_t
#define d_strategy_t strategy_fcn_t
__BEGIN_DECLS
int enodev(void);
void enodev_strat(void);
__END_DECLS
#define eno_opcl ((open_close_fcn_t *)&enodev)
#define eno_strat ((strategy_fcn_t *)&enodev_strat)
#define eno_ioctl ((ioctl_fcn_t *)&enodev)
#define eno_dump ((dump_fcn_t *)&enodev)
#define eno_psize ((psize_fcn_t *)&enodev)
#define eno_rdwrt ((read_write_fcn_t *)&enodev)
#define eno_stop ((stop_fcn_t *)&enodev)
#define eno_reset ((reset_fcn_t *)&enodev)
#define eno_mmap ((mmap_fcn_t *)&enodev)
#define eno_select ((select_fcn_t *)&enodev)
#define eno_getc ((void *)&enodev)
#define eno_putc ((void *)&enodev)
struct bdevsw {
open_close_fcn_t *d_open;
open_close_fcn_t *d_close;
strategy_fcn_t *d_strategy;
ioctl_fcn_t *d_ioctl;
dump_fcn_t *d_dump;
psize_fcn_t *d_psize;
int d_type;
};
d_devtotty_t nodevtotty;
d_write_t nowrite;
#ifdef KERNEL_PRIVATE
extern struct bdevsw bdevsw[];
extern int (*bootcache_contains_block)(dev_t device, u_int64_t blkno);
#endif
#define NO_BDEVICE \
{ eno_opcl, eno_opcl, eno_strat, eno_ioctl, \
eno_dump, eno_psize, 0 }
struct cdevsw {
open_close_fcn_t *d_open;
open_close_fcn_t *d_close;
read_write_fcn_t *d_read;
read_write_fcn_t *d_write;
ioctl_fcn_t *d_ioctl;
stop_fcn_t *d_stop;
reset_fcn_t *d_reset;
struct tty **d_ttys;
select_fcn_t *d_select;
mmap_fcn_t *d_mmap;
strategy_fcn_t *d_strategy;
void *d_reserved_1;
void *d_reserved_2;
int d_type;
};
#ifdef BSD_KERNEL_PRIVATE
extern uint64_t cdevsw_flags[];
#define CDEVSW_SELECT_KQUEUE 0x01
#define CDEVSW_USE_OFFSET 0x02
#define CDEVSW_IS_PTC 0x04
#define CDEVSW_IS_PTS 0x08
struct thread;
typedef struct devsw_lock {
TAILQ_ENTRY(devsw_lock) dl_list;
struct thread *dl_thread;
dev_t dl_dev;
int dl_mode;
} *devsw_lock_t;
#endif
#define NO_CDEVICE \
{ \
eno_opcl, eno_opcl, eno_rdwrt, eno_rdwrt, \
eno_ioctl, eno_stop, eno_reset, 0, \
(select_fcn_t *)seltrue, eno_mmap, eno_strat, eno_getc, \
eno_putc, 0 \
}
#endif
#ifdef KERNEL_PRIVATE
typedef int l_open_t (dev_t dev, struct tty *tp);
typedef int l_close_t(struct tty *tp, int flags);
typedef int l_read_t (struct tty *tp, struct uio *uio, int flag);
typedef int l_write_t(struct tty *tp, struct uio *uio, int flag);
typedef int l_ioctl_t(struct tty *tp, u_long cmd, caddr_t data, int flag,
struct proc *p);
typedef int l_rint_t (int c, struct tty *tp);
typedef void l_start_t(struct tty *tp);
typedef int l_modem_t(struct tty *tp, int flag);
struct linesw {
l_open_t *l_open;
l_close_t *l_close;
l_read_t *l_read;
l_write_t *l_write;
l_ioctl_t *l_ioctl;
l_rint_t *l_rint;
l_start_t *l_start;
l_modem_t *l_modem;
};
extern struct linesw linesw[];
extern const int nlinesw;
int ldisc_register(int, struct linesw *);
void ldisc_deregister(int);
#define LDISC_LOAD -1
#endif
#ifdef BSD_KERNEL_PRIVATE
struct swdevt {
dev_t sw_dev;
int sw_flags;
int sw_nblks;
struct vnode *sw_vp;
};
#define SW_FREED 0x01
#define SW_SEQUENTIAL 0x02
#define sw_freed sw_flags
extern struct swdevt swdevt[];
#endif
#ifdef KERNEL
__BEGIN_DECLS
#ifdef KERNEL_PRIVATE
void devsw_init(void);
extern struct cdevsw cdevsw[];
extern int cdevsw_setkqueueok(int, struct cdevsw*, int);
#endif
#ifdef BSD_KERNEL_PRIVATE
extern void devsw_lock(dev_t, int);
extern void devsw_unlock(dev_t, int);
#endif
int bdevsw_isfree(int);
int bdevsw_add(int, struct bdevsw *);
int bdevsw_remove(int, struct bdevsw *);
int cdevsw_isfree(int);
int cdevsw_add(int, struct cdevsw *);
int cdevsw_add_with_bdev(int index, struct cdevsw * csw, int bdev);
int cdevsw_remove(int, struct cdevsw *);
int isdisk(dev_t, int);
__END_DECLS
#endif
#endif