Skip to content

Commit

Permalink
[block] Add dummy SAN device
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
mcb30 committed Mar 26, 2017
1 parent 6bc4a8a commit c212597
Show file tree
Hide file tree
Showing 4 changed files with 135 additions and 0 deletions.
115 changes: 115 additions & 0 deletions 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 );
18 changes: 18 additions & 0 deletions 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 */
1 change: 1 addition & 0 deletions src/include/ipxe/errfile.h
Expand Up @@ -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 )
Expand Down
1 change: 1 addition & 0 deletions src/include/ipxe/sanboot.h
Expand Up @@ -90,6 +90,7 @@ struct san_device {

/* Include all architecture-independent sanboot API headers */
#include <ipxe/null_sanboot.h>
#include <ipxe/dummy_sanboot.h>
#include <ipxe/efi/efi_block.h>

/* Include all architecture-dependent sanboot API headers */
Expand Down

0 comments on commit c212597

Please sign in to comment.