david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

[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>
This commit is contained in:
Michael Brown 2017-03-26 15:42:52 +03:00
parent 6bc4a8ac91
commit c212597336
4 changed files with 135 additions and 0 deletions

115
src/core/dummy_sanboot.c Normal file
View File

@ -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 );

View File

@ -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 */

View File

@ -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 )

View File

@ -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 */