summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
authorMichael Brown2017-03-26 14:42:52 +0200
committerMichael Brown2017-03-26 15:03:29 +0200
commitc212597336fd055de854043b83425cbdf1f42603 (patch)
treedb048ce647b51e1c69c03f3cae8041ceedcde66f /src/core
parent[scsi] Avoid duplicate call to scsicmd_close() on TEST UNIT READY failure (diff)
downloadipxe-c212597336fd055de854043b83425cbdf1f42603.tar.gz
ipxe-c212597336fd055de854043b83425cbdf1f42603.tar.xz
ipxe-c212597336fd055de854043b83425cbdf1f42603.zip
[block] Add dummy SAN device
Add a dummy SAN device which allows the "sanhook" command to be tested even when no SAN booting capability is present on the platform. This allows substantial portions of the SAN boot code to be run in Linux under Valgrind. Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/core')
-rw-r--r--src/core/dummy_sanboot.c115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/core/dummy_sanboot.c b/src/core/dummy_sanboot.c
new file mode 100644
index 00000000..16347747
--- /dev/null
+++ b/src/core/dummy_sanboot.c
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2017 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ *
+ * You can also choose to distribute this program under the terms of
+ * the Unmodified Binary Distribution Licence (as given in the file
+ * COPYING.UBDL), provided that you have satisfied its requirements.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
+
+/** @file
+ *
+ * Dummy SAN device
+ *
+ */
+
+#include <errno.h>
+#include <ipxe/sanboot.h>
+
+/**
+ * Hook dummy SAN device
+ *
+ * @v uri URI
+ * @v drive Drive number
+ * @ret drive Drive number, or negative error
+ */
+static int dummy_san_hook ( struct uri *uri, unsigned int drive ) {
+ struct san_device *sandev;
+ int rc;
+
+ /* Allocate SAN device */
+ sandev = alloc_sandev ( uri, 0 );
+ if ( ! sandev ) {
+ rc = -ENOMEM;
+ goto err_alloc;
+ }
+ sandev->drive = drive;
+
+ /* Register SAN device */
+ if ( ( rc = register_sandev ( sandev ) ) != 0 ) {
+ DBGC ( sandev, "SAN %#02x could not register: %s\n",
+ sandev->drive, strerror ( rc ) );
+ goto err_register;
+ }
+
+ return drive;
+
+ unregister_sandev ( sandev );
+ err_register:
+ sandev_put ( sandev );
+ err_alloc:
+ return rc;
+}
+
+/**
+ * Unhook dummy SAN device
+ *
+ * @v drive Drive number
+ */
+static void dummy_san_unhook ( unsigned int drive ) {
+ struct san_device *sandev;
+
+ /* Find drive */
+ sandev = sandev_find ( drive );
+ if ( ! sandev ) {
+ DBG ( "SAN %#02x does not exist\n", drive );
+ return;
+ }
+
+ /* Unregister SAN device */
+ unregister_sandev ( sandev );
+
+ /* Drop reference to drive */
+ sandev_put ( sandev );
+}
+
+/**
+ * Boot from dummy SAN device
+ *
+ * @v drive Drive number
+ */
+static int dummy_san_boot ( unsigned int drive __unused ) {
+
+ return -EOPNOTSUPP;
+}
+
+/**
+ * Describe dummy SAN device
+ *
+ * @v drive Drive number
+ */
+static int dummy_san_describe ( unsigned int drive __unused ) {
+
+ return 0;
+}
+
+PROVIDE_SANBOOT ( dummy, san_hook, dummy_san_hook );
+PROVIDE_SANBOOT ( dummy, san_unhook, dummy_san_unhook );
+PROVIDE_SANBOOT ( dummy, san_boot, dummy_san_boot );
+PROVIDE_SANBOOT ( dummy, san_describe, dummy_san_describe );