|
|
1.1 root 1: #ifndef _DS_OSKIT_H_
2: #define _DS_OSKIT_H_
3:
4: #include <device/device_types.h>
5: #include <device/net_status.h>
6: #include <device/if_hdr.h>
7: #include "device_interface.h"
8: #include "ds_routines.h"
9:
10: #include <oskit/dev/error.h>
11: #include <oskit/dev/osenv.h>
12:
13: #include <mach/port.h>
14: #include <mach/message.h>
15: #include <kern/lock.h>
16: #include <kern/queue.h>
17:
18: #include <cpus.h>
19:
20: struct device_ops {
21: io_return_t (*write) (device_t, ipc_port_t, mach_msg_type_name_t,
22: dev_mode_t, recnum_t, io_buf_ptr_t, unsigned, int *);
23: io_return_t (*write_inband) (device_t, ipc_port_t, mach_msg_type_name_t,
24: dev_mode_t, recnum_t, io_buf_ptr_inband_t,
25: unsigned, int *);
26: io_return_t (*read) (device_t, ipc_port_t, mach_msg_type_name_t,
27: dev_mode_t, recnum_t, int, io_buf_ptr_t *, unsigned *);
28: io_return_t (*read_inband) (device_t, ipc_port_t, mach_msg_type_name_t,
29: dev_mode_t, recnum_t, int, char *, unsigned *);
30: io_return_t (*set_status) (device_t, dev_flavor_t, dev_status_t,
31: mach_msg_type_number_t);
32: io_return_t (*get_status) (device_t, dev_flavor_t, dev_status_t,
33: mach_msg_type_number_t *);
34: io_return_t (*set_filter) (device_t, ipc_port_t, int, filter_t [], unsigned);
35:
36: io_return_t (*write_trap) (device_t, dev_mode_t,
37: recnum_t, vm_offset_t, vm_size_t);
38: io_return_t (*writev_trap) (device_t, dev_mode_t,
39: recnum_t, io_buf_vec_t *, vm_size_t);
40:
41: /* Called with PA == 0 to check if mapping is allowed,
42: and with PA != 0 to get an actual physical address. */
43: io_return_t (*map) (device_t, vm_prot_t, vm_offset_t, vm_size_t,
44: oskit_addr_t *pa);
45:
46: void (*close) (device_t);
47: };
48:
49:
50: #include <oskit/dev/device.h>
51: #include <oskit/io/blkio.h>
52: #include <oskit/diskpart/diskpart.h>
53: #include <oskit/com/stream.h>
54: #include <oskit/io/asyncio.h>
55: #include <oskit/dev/net.h>
56: #include <oskit/io/netio.h>
57: #if defined(__i386__)
58: #include <machine/io_perm.h>
59: #endif
60:
61: struct device {
62: const struct device_ops *ops;
63:
64: decl_simple_lock_data(,ref_lock) /* lock for reference count */
65: int ref_count; /* reference count */
66: decl_simple_lock_data(, lock) /* lock for rest of state */
67:
68: struct ipc_port *port; /* open port */
69: dev_mode_t mode; /* D_READ and/or D_WRITE */
70:
71: /* This COM object is the generic handle on the device. We never use
72: this object after device_open, but its pointer serves as our unique
73: identifier for the device so we can detect a second open. To be sure
74: the pointer remains unique, we keep the COM object alive as long as
75: this device port lives. */
76: oskit_device_t *com_device;
77: queue_chain_t hash_chain;
78:
79: union {
80: struct {
81: oskit_blkio_t *io;
82: oskit_u32_t size; /* block size */
83: #define MAX_PARTS 30
84: diskpart_t *parts;
85: } blk;
86: struct {
87: device_t blk; /* underlying device_t, which is blk type */
88: diskpart_t *part; /* which partition this is */
89: } blkpart;
90: struct {
91: oskit_stream_t *io;
92: oskit_asyncio_t *aio;
93: oskit_s32_t listening; /* OSKIT_ASYNCIO_* */
94: queue_head_t read_queue, write_queue; /* queued requests */
95: queue_chain_t ready_queue; /* when on device_ready_queue */
96: oskit_listener_t listener; /* my life as a COM object */
97: } stream;
98: struct {
99: char *contents;
100: oskit_size_t size;
101: } bus;
102: struct {
103: vm_offset_t pa;
104: vm_size_t size, recsize;
105: } mem;
106: struct {
107: oskit_netio_t *sendi;
108: oskit_netio_t recvi; /* my life as a COM object: incoming packets */
109: struct ifnet ifnet; /* cruft for net_io.c */
110: } net;
111: #if defined(__i386__)
112: struct
113: {
114: io_port_t from, to;
115: } io_perm;
116: #endif
117: } com;
118: };
119:
120: /*
121: * To lock and unlock state and open-count
122: */
123: #define device_lock(device) simple_lock(&(device)->lock)
124: #define device_unlock(device) simple_unlock(&(device)->lock)
125:
126: /* These macros are used to take a global lock around entering
127: any oskit driver code. */
128: #if ! MULTIPROCESSOR
129: #else
130: # warning SMP support in oskit-mach is incomplete
131: #endif
132: #define DEV_LOCK_INIT ((void)0)
133: #define DEV_LOCK(dev) ((void)0)
134: #define DEV_UNLOCK(dev) ((void)0)
135:
136: extern const struct device_ops no_device_ops;
137: extern const struct device_ops stream_device_ops;
138: extern const struct device_ops asyncio_device_ops;
139: extern const struct device_ops block_device_ops;
140: extern const struct device_ops block_partition_device_ops;
141: extern const struct device_ops net_device_ops;
142: extern const struct device_ops mem_device_ops;
143: extern const struct device_ops bus_device_ops;
144:
145: extern oskit_error_t ds_netdev_open (device_t dev, oskit_netdev_t *netdev);
146:
147:
148: /* #define INVALOP while (1) asm volatile ("int $3") */
149: /* #define INVALSZ while (1) asm volatile ("int $3") */
150: #define INVALOP return D_INVALID_OPERATION
151: #define INVALSZ return D_INVALID_SIZE
152: #define INVALREC return D_INVALID_RECNUM
153: /*#define INVALREC ({dump_stack_trace();panic("invalid record");})*/
154:
155:
156: static inline io_return_t
157: oskit_to_mach_error (oskit_error_t rc)
158: {
159: switch (rc)
160: {
161: case 0: return D_SUCCESS;
162: case OSKIT_E_DEV_NOSUCH_DEV: return D_NO_SUCH_DEVICE;
163: case OSKIT_E_DEV_NOSUCH_CHILD: return D_NO_SUCH_DEVICE;
164: case OSKIT_E_DEV_NOMORE_CHILDREN: return D_NO_SUCH_DEVICE;
165: case OSKIT_E_DEV_BADOP: INVALOP;
166: case OSKIT_E_DEV_BADPARAM: INVALOP;
167: case OSKIT_E_OUTOFMEMORY: return D_NO_MEMORY;
168: case OSKIT_EWOULDBLOCK: return D_WOULD_BLOCK;
169: default:
170: assert (OSKIT_FAILED (rc));
171: return D_IO_ERROR;
172: }
173: }
174:
175:
176: extern oskit_osenv_t *mach_osenv;
177: extern oskit_stream_t *ds_console_stream;
178: extern oskit_stream_t *kmsg_stream;
179: extern unsigned int kmsg_readers;
180: extern void kmsg_init (void);
181:
182:
183: #define splio spltty /* XXX */
184: #define SPLIO SPLTTY /* XXX */
185:
186: #define sploskit splio
187: #define SPLOSKIT SPLIO
188:
189:
190: extern zone_t io_inband_zone; /* for inband reads */
191:
192: extern void oskit_softint (void); /* osenv_softirq.c */
193:
194:
195: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.