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 */
3738extern const int version_major ;
3839static 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+
7884static 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-
585569static 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