Skip to content
This repository was archived by the owner on Jan 28, 2023. It is now read-only.

Commit 746ed03

Browse files
authored
Merge pull request #144 from intel/darwin-ignore-tty-ioctl
darwin: Suppress unknown ioctl error for TIOCSCTTY
2 parents 5993f56 + c990157 commit 746ed03

File tree

1 file changed

+43
-26
lines changed

1 file changed

+43
-26
lines changed

platforms/darwin/com_intel_hax_ui.c

Lines changed: 43 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,15 @@
3232

3333
#include <libkern/version.h>
3434
#include <sys/proc.h>
35+
#include <sys/ttycom.h>
3536

3637
/* Major version number of Darwin/XNU kernel */
3738
extern const int version_major;
3839
static int hax_vcpu_major = 0;
3940

41+
/* MAXCOMLEN + 1 == 17 (see bsd/sys/param.h) */
42+
#define TASK_NAME_LEN 17
43+
4044
/*
4145
* A tricky point of the vcpu/vm reference count:
4246
* There is no explicitly vcpu/vm destroy from QEMU, except when failure at
@@ -75,6 +79,8 @@ static int hax_vcpu_major = 0;
7579
#define HAX_VM_DEVFS_FMT_COMPAT "hax_vm*/vm%02d"
7680
#define HAX_VM_DEVFS_FMT "hax_vm/vm%02d"
7781

82+
static void handle_unknown_ioctl(dev_t dev, ulong cmd, struct proc *p);
83+
7884
static struct vcpu_t * get_vcpu_by_dev(dev_t dev) {
7985
int vm_id = minor2vcpuvmmid(dev);
8086
int vcpu_id = minor2vcpuid(dev);
@@ -238,15 +244,7 @@ static int hax_vcpu_ioctl(dev_t dev, ulong cmd, caddr_t data, int flag,
238244
break;
239245
}
240246
default: {
241-
int pid;
242-
char task_name[17];
243-
244-
pid = proc_pid(p);
245-
proc_name(pid, task_name, sizeof(task_name));
246-
hax_error("Unknown vcpu ioctl 0x%lx, pid=%d ('%s')\n", cmd, pid,
247-
task_name);
248-
//printf("set regs ioctl %lx get regs %lx", HAX_VCPU_SET_REGS,
249-
// HAX_VCPU_GET_REGS);
247+
handle_unknown_ioctl(dev, cmd, p);
250248
ret = -ENOSYS;
251249
break;
252250
}
@@ -442,8 +440,7 @@ static int hax_vm_ioctl(dev_t dev, ulong cmd, caddr_t data, int flag,
442440
#endif
443441
case HAX_VM_IOCTL_NOTIFY_QEMU_VERSION: {
444442
int pid;
445-
/* MAXCOMLEN + 1 == 17 (see bsd/sys/param.h) */
446-
char task_name[17];
443+
char task_name[TASK_NAME_LEN];
447444
struct hax_qemu_version *info;
448445

449446
pid = proc_pid(p);
@@ -461,14 +458,8 @@ static int hax_vm_ioctl(dev_t dev, ulong cmd, caddr_t data, int flag,
461458
break;
462459
}
463460
default: {
464-
int pid;
465-
char task_name[17];
466-
461+
handle_unknown_ioctl(dev, cmd, p);
467462
ret = -ENOSYS;
468-
pid = proc_pid(p);
469-
proc_name(pid, task_name, sizeof(task_name));
470-
hax_error("Unknown VM IOCTL 0x%lx, pid=%d ('%s')\n", cmd, pid,
471-
task_name);
472463
break;
473464
}
474465
}
@@ -567,21 +558,14 @@ static int hax_ioctl(dev_t dev, u_long cmd, caddr_t data, int flag,
567558
}
568559

569560
default: {
570-
int pid;
571-
char task_name[17];
572-
561+
handle_unknown_ioctl(dev, cmd, p);
573562
ret = -ENOSYS;
574-
pid = proc_pid(p);
575-
proc_name(pid, task_name, sizeof(task_name));
576-
hax_error("Unknown ioctl 0x%lx, pid=%d ('%s')\n", cmd, pid,
577-
task_name);
578563
break;
579564
}
580565
}
581566
return ret;
582567
}
583568

584-
585569
static int hax_open(dev_t dev, int flags, __unused int devtype,
586570
__unused struct proc *p)
587571
{
@@ -685,3 +669,36 @@ int com_intel_hax_exit_ui(void)
685669

686670
return 0;
687671
}
672+
673+
static void handle_unknown_ioctl(dev_t dev, ulong cmd, struct proc *p)
674+
{
675+
int dev_major = major(dev);
676+
const char *dev_name = NULL;
677+
int pid;
678+
char task_name[TASK_NAME_LEN];
679+
680+
if (cmd == TIOCSCTTY) {
681+
/* Because HAXM cdevsw's are created with d_type == D_TTY, the Darwin
682+
* kernel may send us an TIOCSCTTY ioctl while servicing an open()
683+
* syscall on these devices (see open1() in bsd/vfs/vfs_syscall.c).
684+
* Suppress the bogus warning for this ioctl to avoid confusion.
685+
*/
686+
return;
687+
}
688+
689+
if (dev_major == hax_major) {
690+
dev_name = "HAX";
691+
} else if (dev_major == hax_vm_major) {
692+
dev_name = "VM";
693+
} else if (dev_major == hax_vcpu_major) {
694+
dev_name = "VCPU";
695+
} else {
696+
dev_name = "??";
697+
hax_error("%s: Unknown device major %d\n", __func__, dev_major);
698+
}
699+
700+
pid = proc_pid(p);
701+
proc_name(pid, task_name, sizeof(task_name));
702+
hax_warning("Unknown %s ioctl 0x%lx from pid=%d ('%s')\n", dev_name, cmd,
703+
pid, task_name);
704+
}

0 commit comments

Comments
 (0)