1 #include <mach/mach_types.h>
5 #include <miscfs/devfs/devfs.h>
7 #define DEBUG_SUBSYSTEM S_LNET
8 #include <libcfs/libcfs.h>
9 #include <libcfs/kp30.h>
11 int libcfs_ioctl_getdata(char *buf, char *end, void *arg)
13 struct libcfs_ioctl_hdr *hdr;
14 struct libcfs_ioctl_data *data;
18 hdr = (struct libcfs_ioctl_hdr *)buf;
19 data = (struct libcfs_ioctl_data *)buf;
20 /* libcfs_ioctl_data has been copied in by ioctl of osx */
21 memcpy(buf, arg, sizeof(struct libcfs_ioctl_data));
23 if (hdr->ioc_version != LIBCFS_IOCTL_VERSION) {
24 CERROR("LIBCFS: version mismatch kernel vs application\n");
28 if (hdr->ioc_len + buf >= end) {
29 CERROR("LIBCFS: user buffer exceeds kernel buffer\n");
33 if (hdr->ioc_len < sizeof(struct libcfs_ioctl_data)) {
34 CERROR("LIBCFS: user buffer too small for ioctl\n");
37 buf += size_round(sizeof(*data));
39 if (data->ioc_inllen1) {
40 err = copy_from_user(buf, data->ioc_inlbuf1, size_round(data->ioc_inllen1));
43 data->ioc_inlbuf1 = buf;
44 buf += size_round(data->ioc_inllen1);
47 if (data->ioc_inllen2) {
48 copy_from_user(buf, data->ioc_inlbuf2, size_round(data->ioc_inllen2));
51 data->ioc_inlbuf2 = buf;
57 int libcfs_ioctl_popdata(void *arg, void *data, int size)
60 * system call will copy out ioctl arg to user space
62 memcpy(arg, data, size);
66 extern struct cfs_psdev_ops libcfs_psdev_ops;
67 struct libcfs_device_userstate *mdev_state[16];
70 libcfs_psdev_open(dev_t dev, int flags, int devtype, struct proc *p)
72 struct libcfs_device_userstate *mstat = NULL;
77 if (devid > 16) return (ENXIO);
79 if (libcfs_psdev_ops.p_open != NULL)
80 rc = -libcfs_psdev_ops.p_open(0, &mstat);
84 mdev_state[devid] = mstat;
89 libcfs_psdev_close(dev_t dev, int flags, int mode, struct proc *p)
95 if (devid > 16) return (ENXIO);
97 if (libcfs_psdev_ops.p_close != NULL)
98 rc = -libcfs_psdev_ops.p_close(0, mdev_state[devid]);
102 mdev_state[devid] = NULL;
107 libcfs_ioctl (dev_t dev, u_long cmd, caddr_t arg, int flag, struct proc *p)
110 struct cfs_psdev_file pfile;
114 if (devid > 16) return (ENXIO);
120 pfile.private_data = mdev_state[devid];
122 if (libcfs_psdev_ops.p_ioctl != NULL)
123 rc = -libcfs_psdev_ops.p_ioctl(&pfile, cmd, (void *)arg);
129 static struct cdevsw libcfs_devsw =
131 .d_open = libcfs_psdev_open,
132 .d_close = libcfs_psdev_close,
134 .d_write = eno_rdwrt,
135 .d_ioctl = libcfs_ioctl,
137 .d_reset = eno_reset,
139 .d_select = eno_select,
141 .d_strategy = eno_strat,
147 cfs_psdev_t libcfs_dev = {
155 extern spinlock_t trace_cpu_serializer;
156 extern void cfs_sync_init(void);
157 extern void cfs_sync_fini(void);
158 extern int cfs_sysctl_init(void);
159 extern void cfs_sysctl_fini(void);
160 extern int cfs_mem_init(void);
161 extern int cfs_mem_fini(void);
162 extern void raw_page_death_row_clean(void);
163 extern void cfs_thread_agent_init(void);
164 extern void cfs_thread_agent_fini(void);
165 extern void cfs_symbol_init(void);
166 extern void cfs_symbol_fini(void);
168 int libcfs_arch_init(void)
173 cfs_thread_agent_init();
176 spin_lock_init(&trace_cpu_serializer);
181 void libcfs_arch_cleanup(void)
183 spin_lock_done(&trace_cpu_serializer);
186 cfs_thread_agent_fini();