Module Name: src
Committed By: maxv
Date: Thu Jun 25 17:01:20 UTC 2020
Modified Files:
src/sys/dev/nvmm: files.nvmm nvmm.c
src/sys/modules/nvmm: nvmm.ioconf
Log Message:
Register NVMM as an actual pseudo-device. Without PMF handler, to
explicitly disallow ACPI suspend if NVMM is running.
Should fix PR/55406.
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/dev/nvmm/files.nvmm
cvs rdiff -u -r1.30 -r1.31 src/sys/dev/nvmm/nvmm.c
cvs rdiff -u -r1.1 -r1.2 src/sys/modules/nvmm/nvmm.ioconf
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/nvmm/files.nvmm
diff -u src/sys/dev/nvmm/files.nvmm:1.2 src/sys/dev/nvmm/files.nvmm:1.3
--- src/sys/dev/nvmm/files.nvmm:1.2 Thu Mar 28 19:00:40 2019
+++ src/sys/dev/nvmm/files.nvmm Thu Jun 25 17:01:19 2020
@@ -1,6 +1,6 @@
-# $NetBSD: files.nvmm,v 1.2 2019/03/28 19:00:40 maxv Exp $
+# $NetBSD: files.nvmm,v 1.3 2020/06/25 17:01:19 maxv Exp $
-defpseudo nvmm
+defpseudodev nvmm
file dev/nvmm/nvmm.c nvmm
Index: src/sys/dev/nvmm/nvmm.c
diff -u src/sys/dev/nvmm/nvmm.c:1.30 src/sys/dev/nvmm/nvmm.c:1.31
--- src/sys/dev/nvmm/nvmm.c:1.30 Sun May 24 08:08:49 2020
+++ src/sys/dev/nvmm/nvmm.c Thu Jun 25 17:01:19 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: nvmm.c,v 1.30 2020/05/24 08:08:49 maxv Exp $ */
+/* $NetBSD: nvmm.c,v 1.31 2020/06/25 17:01:19 maxv Exp $ */
/*
* Copyright (c) 2018-2019 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nvmm.c,v 1.30 2020/05/24 08:08:49 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvmm.c,v 1.31 2020/06/25 17:01:19 maxv Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -44,7 +44,7 @@ __KERNEL_RCSID(0, "$NetBSD: nvmm.c,v 1.3
#include <sys/mman.h>
#include <sys/file.h>
#include <sys/filedesc.h>
-#include <sys/kauth.h>
+#include <sys/device.h>
#include <uvm/uvm.h>
#include <uvm/uvm_page.h>
@@ -960,22 +960,27 @@ nvmm_ctl(struct nvmm_owner *owner, struc
/* -------------------------------------------------------------------------- */
+static const struct nvmm_impl *
+nvmm_ident(void)
+{
+ size_t i;
+
+ for (i = 0; i < __arraycount(nvmm_impl_list); i++) {
+ if ((*nvmm_impl_list[i]->ident)())
+ return nvmm_impl_list[i];
+ }
+
+ return NULL;
+}
+
static int
nvmm_init(void)
{
size_t i, n;
- for (i = 0; i < __arraycount(nvmm_impl_list); i++) {
- if (!(*nvmm_impl_list[i]->ident)()) {
- continue;
- }
- nvmm_impl = nvmm_impl_list[i];
- break;
- }
- if (nvmm_impl == NULL) {
- printf("NVMM: CPU not supported\n");
+ nvmm_impl = nvmm_ident();
+ if (nvmm_impl == NULL)
return ENOTSUP;
- }
for (i = 0; i < NVMM_MAX_MACHINES; i++) {
machines[i].machid = i;
@@ -1169,6 +1174,53 @@ nvmm_ioctl(file_t *fp, u_long cmd, void
/* -------------------------------------------------------------------------- */
+static int nvmm_match(device_t, cfdata_t, void *);
+static void nvmm_attach(device_t, device_t, void *);
+static int nvmm_detach(device_t, int);
+
+extern struct cfdriver nvmm_cd;
+
+CFATTACH_DECL_NEW(nvmm, 0, nvmm_match, nvmm_attach, nvmm_detach, NULL);
+
+static struct cfdata nvmm_cfdata[] = {
+ {
+ .cf_name = "nvmm",
+ .cf_atname = "nvmm",
+ .cf_unit = 0,
+ .cf_fstate = FSTATE_STAR,
+ .cf_loc = NULL,
+ .cf_flags = 0,
+ .cf_pspec = NULL,
+ },
+ { NULL, NULL, 0, FSTATE_NOTFOUND, NULL, 0, NULL }
+};
+
+static int
+nvmm_match(device_t self, cfdata_t cfdata, void *arg)
+{
+ return 1;
+}
+
+static void
+nvmm_attach(device_t parent, device_t self, void *aux)
+{
+ int error;
+
+ error = nvmm_init();
+ if (error)
+ panic("%s: impossible", __func__);
+ aprint_normal_dev(self, "attached\n");
+}
+
+static int
+nvmm_detach(device_t self, int flags)
+{
+ if (nmachines > 0)
+ return EBUSY;
+ nvmm_fini();
+ return 0;
+}
+
void
nvmmattach(int nunits)
{
@@ -1177,51 +1229,83 @@ nvmmattach(int nunits)
MODULE(MODULE_CLASS_MISC, nvmm, NULL);
+#if defined(_MODULE)
+CFDRIVER_DECL(nvmm, DV_VIRTUAL, NULL);
+#endif
+
static int
nvmm_modcmd(modcmd_t cmd, void *arg)
{
+#if defined(_MODULE)
+ devmajor_t bmajor = NODEVMAJOR;
+ devmajor_t cmajor = 345;
+#endif
int error;
switch (cmd) {
case MODULE_CMD_INIT:
- error = nvmm_init();
+ if (nvmm_ident() == NULL) {
+ aprint_error("%s: cpu not supported\n",
+ nvmm_cd.cd_name);
+ return ENOTSUP;
+ }
+#if defined(_MODULE)
+ error = config_cfdriver_attach(&nvmm_cd);
if (error)
return error;
+#endif
+ error = config_cfattach_attach(nvmm_cd.cd_name, &nvmm_ca);
+ if (error) {
+ config_cfdriver_detach(&nvmm_cd);
+ aprint_error("%s: config_cfattach_attach failed\n",
+ nvmm_cd.cd_name);
+ return error;
+ }
+
+ error = config_cfdata_attach(nvmm_cfdata, 1);
+ if (error) {
+ config_cfattach_detach(nvmm_cd.cd_name, &nvmm_ca);
+ config_cfdriver_detach(&nvmm_cd);
+ aprint_error("%s: unable to register cfdata\n",
+ nvmm_cd.cd_name);
+ return error;
+ }
+
+ if (config_attach_pseudo(nvmm_cfdata) == NULL) {
+ aprint_error("%s: config_attach_pseudo failed\n",
+ nvmm_cd.cd_name);
+ config_cfattach_detach(nvmm_cd.cd_name, &nvmm_ca);
+ config_cfdriver_detach(&nvmm_cd);
+ return ENXIO;
+ }
#if defined(_MODULE)
- {
- devmajor_t bmajor = NODEVMAJOR;
- devmajor_t cmajor = 345;
-
- /* mknod /dev/nvmm c 345 0 */
- error = devsw_attach("nvmm", NULL, &bmajor,
- &nvmm_cdevsw, &cmajor);
- if (error) {
- nvmm_fini();
- return error;
- }
+ /* mknod /dev/nvmm c 345 0 */
+ error = devsw_attach(nvmm_cd.cd_name, NULL, &bmajor,
+ &nvmm_cdevsw, &cmajor);
+ if (error) {
+ aprint_error("%s: unable to register devsw\n",
+ nvmm_cd.cd_name);
+ config_cfattach_detach(nvmm_cd.cd_name, &nvmm_ca);
+ config_cfdriver_detach(&nvmm_cd);
+ return error;
}
#endif
return 0;
-
case MODULE_CMD_FINI:
- if (nmachines > 0) {
- return EBUSY;
- }
+ error = config_cfdata_detach(nvmm_cfdata);
+ if (error)
+ return error;
+ error = config_cfattach_detach(nvmm_cd.cd_name, &nvmm_ca);
+ if (error)
+ return error;
#if defined(_MODULE)
- {
- error = devsw_detach(NULL, &nvmm_cdevsw);
- if (error) {
- return error;
- }
- }
+ config_cfdriver_detach(&nvmm_cd);
+ devsw_detach(NULL, &nvmm_cdevsw);
#endif
- nvmm_fini();
return 0;
-
case MODULE_CMD_AUTOUNLOAD:
return EBUSY;
-
default:
return ENOTTY;
}
Index: src/sys/modules/nvmm/nvmm.ioconf
diff -u src/sys/modules/nvmm/nvmm.ioconf:1.1 src/sys/modules/nvmm/nvmm.ioconf:1.2
--- src/sys/modules/nvmm/nvmm.ioconf:1.1 Wed Nov 7 07:43:08 2018
+++ src/sys/modules/nvmm/nvmm.ioconf Thu Jun 25 17:01:20 2020
@@ -1,7 +1,8 @@
-# $NetBSD: nvmm.ioconf,v 1.1 2018/11/07 07:43:08 maxv Exp $
+# $NetBSD: nvmm.ioconf,v 1.2 2020/06/25 17:01:20 maxv Exp $
ioconf nvmm
include "conf/files"
+include "dev/nvmm/files.nvmm"
pseudo-device nvmm