summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/io/cons.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/io/cons.c')
-rw-r--r--usr/src/uts/common/io/cons.c54
1 files changed, 39 insertions, 15 deletions
diff --git a/usr/src/uts/common/io/cons.c b/usr/src/uts/common/io/cons.c
index 8635023fe3..e651ea636a 100644
--- a/usr/src/uts/common/io/cons.c
+++ b/usr/src/uts/common/io/cons.c
@@ -94,7 +94,7 @@ static struct cb_ops cn_cb_ops = {
cnioctl, /* ioctl */
nodev, /* devmap */
nodev, /* mmap */
- nodev, /* segmap */
+ nodev, /* segmap */
cnpoll, /* poll */
ddi_prop_op, /* cb_prop_op */
0, /* streamtab */
@@ -237,9 +237,9 @@ cn_detach(dev_info_t *devi, ddi_detach_cmd_t cmd)
return (DDI_SUCCESS);
}
-/* ARGSUSED */
static int
-cn_info(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result)
+cn_info(dev_info_t *dip __unused, ddi_info_cmd_t infocmd, void *arg,
+ void **result)
{
int error = DDI_FAILURE;
@@ -346,9 +346,8 @@ cnopen(dev_t *dev, int flag, int state, struct cred *cred)
return (0);
}
-/* ARGSUSED */
static int
-cnclose(dev_t dev, int flag, int state, struct cred *cred)
+cnclose(dev_t dev __unused, int flag, int state, struct cred *cred)
{
int err = 0;
vnode_t *vp;
@@ -374,9 +373,8 @@ cnclose(dev_t dev, int flag, int state, struct cred *cred)
return (err);
}
-/* ARGSUSED */
static int
-cnread(dev_t dev, struct uio *uio, struct cred *cred)
+cnread(dev_t dev __unused, struct uio *uio, struct cred *cred)
{
kcondvar_t sleep_forever;
kmutex_t sleep_forever_mutex;
@@ -402,9 +400,8 @@ cnread(dev_t dev, struct uio *uio, struct cred *cred)
return (cdev_read(rconsdev, uio, cred));
}
-/* ARGSUSED */
static int
-cnwrite(dev_t dev, struct uio *uio, struct cred *cred)
+cnwrite(dev_t dev __unused, struct uio *uio, struct cred *cred)
{
if (rconsvp == NULL) {
uio->uio_resid = 0;
@@ -442,13 +439,40 @@ cnwrite(dev_t dev, struct uio *uio, struct cred *cred)
return (cdev_write(rconsdev, uio, cred));
}
-/* ARGSUSED */
static int
-cnprivateioc(dev_t dev, int cmd, intptr_t arg, int flag, struct cred *cred,
- int *rvalp)
+cnprivateioc(dev_t dev __unused, int cmd, intptr_t arg, int flag,
+ struct cred *cred, int *rvalp)
{
+ if (cmd == CONS_GETDEV) {
+ /*
+ * The user has requested the device number of the redirection
+ * client.
+ */
+ STRUCT_DECL(cons_getdev, cnd);
+ STRUCT_INIT(cnd, flag);
+
+ bzero(STRUCT_BUF(cnd), STRUCT_SIZE(cnd));
+
+ if ((flag & DATAMODEL_MASK) == DATAMODEL_ILP32) {
+ dev32_t rconsdev32;
+
+ if (cmpldev(&rconsdev32, rconsdev) != 1) {
+ return (EOVERFLOW);
+ }
+
+ STRUCT_FSET(cnd, cnd_rconsdev, rconsdev32);
+ } else {
+ STRUCT_FSET(cnd, cnd_rconsdev, rconsdev);
+ }
+
+ if (ddi_copyout(STRUCT_BUF(cnd), (void *)arg,
+ STRUCT_SIZE(cnd), flag) != 0) {
+ return (EFAULT);
+ }
+
+ return (0);
+ }
- /* currently we only support one ioctl */
if (cmd != CONS_GETTERM)
return (EINVAL);
@@ -470,7 +494,7 @@ cnprivateioc(dev_t dev, int cmd, intptr_t arg, int flag, struct cred *cred,
/* ARGSUSED */
static int
cnioctl(dev_t dev, int cmd, intptr_t arg, int flag, struct cred *cred,
- int *rvalp)
+ int *rvalp)
{
if (rconsvp == NULL)
return (0);
@@ -498,7 +522,7 @@ cnioctl(dev_t dev, int cmd, intptr_t arg, int flag, struct cred *cred,
/* ARGSUSED */
static int
cnpoll(dev_t dev, short events, int anyyet, short *reventsp,
- struct pollhead **phpp)
+ struct pollhead **phpp)
{
if (rconsvp == NULL)
return (nochpoll(dev, events, anyyet, reventsp, phpp));