Home | History | Annotate | Line # | Download | only in x86
      1 /* $NetBSD: vmt.c,v 1.22 2024/05/09 12:09:59 pho Exp $ */
      2 /* $OpenBSD: vmt.c,v 1.11 2011/01/27 21:29:25 dtucker Exp $ */
      3 
      4 /*
      5  * Copyright (c) 2007 David Crawshaw <david (at) zentus.com>
      6  * Copyright (c) 2008 David Gwynne <dlg (at) openbsd.org>
      7  *
      8  * Permission to use, copy, modify, and distribute this software for any
      9  * purpose with or without fee is hereby granted, provided that the above
     10  * copyright notice and this permission notice appear in all copies.
     11  *
     12  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     13  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     14  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     15  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     16  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     17  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     18  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     19  */
     20 
     21 /*
     22  * Protocol reverse engineered by Ken Kato:
     23  * https://sites.google.com/site/chitchatvmback/backdoor (dead link)
     24  * https://web.archive.org/web/20230325103442/https://sites.google.com/site/chitchatvmback/backdoor (archive)
     25  */
     26 
     27 #include <sys/param.h>
     28 #include <sys/types.h>
     29 #include <sys/device.h>
     30 #include <sys/module.h>
     31 #include <machine/cpuvar.h>
     32 
     33 #include <dev/sysmon/sysmonvar.h>
     34 #include <dev/vmt/vmtreg.h>
     35 #include <dev/vmt/vmtvar.h>
     36 
     37 static int	vmt_match(device_t, cfdata_t, void *);
     38 static void	vmt_attach(device_t, device_t, void *);
     39 static int	vmt_detach(device_t, int);
     40 
     41 CFATTACH_DECL_NEW(vmt, sizeof(struct vmt_softc),
     42 	vmt_match, vmt_attach, vmt_detach, NULL);
     43 
     44 static int
     45 vmt_match(device_t parent, cfdata_t match, void *aux)
     46 {
     47 	struct cpufeature_attach_args *cfaa = aux;
     48 	struct cpu_info *ci = cfaa->ci;
     49 
     50 	if (strcmp(cfaa->name, "vm") != 0)
     51 		return 0;
     52 	if ((ci->ci_flags & (CPUF_BSP|CPUF_SP|CPUF_PRIMARY)) == 0)
     53 		return 0;
     54 
     55 	return vmt_probe();
     56 }
     57 
     58 static void
     59 vmt_attach(device_t parent, device_t self, void *aux)
     60 {
     61 	struct vmt_softc *sc = device_private(self);
     62 
     63 	aprint_naive("\n");
     64 	aprint_normal("\n");
     65 
     66 	sc->sc_dev = self;
     67 	vmt_common_attach(sc);
     68 }
     69 
     70 static int
     71 vmt_detach(device_t self, int flags)
     72 {
     73 	struct vmt_softc *sc = device_private(self);
     74 
     75 	return vmt_common_detach(sc);
     76 }
     77 
     78 MODULE(MODULE_CLASS_DRIVER, vmt, "sysmon_power,sysmon_taskq");
     79 
     80 #ifdef _MODULE
     81 #include "ioconf.c"
     82 #endif
     83 
     84 static int
     85 vmt_modcmd(modcmd_t cmd, void *aux)
     86 {
     87 	int error = 0;
     88 
     89 	switch (cmd) {
     90 	case MODULE_CMD_INIT:
     91 #ifdef _MODULE
     92 		error = config_init_component(cfdriver_ioconf_vmt,
     93 		    cfattach_ioconf_vmt, cfdata_ioconf_vmt);
     94 #endif
     95 		break;
     96 	case MODULE_CMD_FINI:
     97 #ifdef _MODULE
     98 		error = config_fini_component(cfdriver_ioconf_vmt,
     99 		    cfattach_ioconf_vmt, cfdata_ioconf_vmt);
    100 #endif
    101 		break;
    102 	case MODULE_CMD_AUTOUNLOAD:
    103 		error = EBUSY;
    104 		break;
    105 	default:
    106 		error = ENOTTY;
    107 		break;
    108 	}
    109 
    110 	return error;
    111 }
    112