From c212597336fd055de854043b83425cbdf1f42603 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sun, 26 Mar 2017 15:42:52 +0300 Subject: [PATCH] [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 --- src/core/dummy_sanboot.c | 115 +++++++++++++++++++++++++++++++ src/include/ipxe/dummy_sanboot.h | 18 +++++ src/include/ipxe/errfile.h | 1 + src/include/ipxe/sanboot.h | 1 + 4 files changed, 135 insertions(+) create mode 100644 src/core/dummy_sanboot.c create mode 100644 src/include/ipxe/dummy_sanboot.h 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 . + * + * 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 +#include + +/** + * 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 ); diff --git a/src/include/ipxe/dummy_sanboot.h b/src/include/ipxe/dummy_sanboot.h new file mode 100644 index 00000000..9c9d942a --- /dev/null +++ b/src/include/ipxe/dummy_sanboot.h @@ -0,0 +1,18 @@ +#ifndef _IPXE_DUMMY_SANBOOT_H +#define _IPXE_DUMMY_SANBOOT_H + +/** @file + * + * Dummy SAN device + * + */ + +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); + +#ifdef SANBOOT_DUMMY +#define SANBOOT_PREFIX_dummy +#else +#define SANBOOT_PREFIX_dummy __dummy_ +#endif + +#endif /* _IPXE_DUMMY_SANBOOT_H */ diff --git a/src/include/ipxe/errfile.h b/src/include/ipxe/errfile.h index cd5c1959..703f4565 100644 --- a/src/include/ipxe/errfile.h +++ b/src/include/ipxe/errfile.h @@ -73,6 +73,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #define ERRFILE_pixbuf ( ERRFILE_CORE | 0x00210000 ) #define ERRFILE_efi_block ( ERRFILE_CORE | 0x00220000 ) #define ERRFILE_sanboot ( ERRFILE_CORE | 0x00230000 ) +#define ERRFILE_dummy_sanboot ( ERRFILE_CORE | 0x00240000 ) #define ERRFILE_eisa ( ERRFILE_DRIVER | 0x00000000 ) #define ERRFILE_isa ( ERRFILE_DRIVER | 0x00010000 ) diff --git a/src/include/ipxe/sanboot.h b/src/include/ipxe/sanboot.h index 3e7ed1c8..c2e57f71 100644 --- a/src/include/ipxe/sanboot.h +++ b/src/include/ipxe/sanboot.h @@ -90,6 +90,7 @@ struct san_device { /* Include all architecture-independent sanboot API headers */ #include +#include #include /* Include all architecture-dependent sanboot API headers */