mirror of
https://github.com/xcat2/xNBA.git
synced 2026-01-12 18:12:32 +00:00
The block device interface used in gPXE predates the invention of even
the old gPXE data-transfer interface, let alone the current iPXE
generic asynchronous interface mechanism. Bring this old code up to
date, with the following benefits:
o Block device commands can be cancelled by the requestor. The INT 13
layer uses this to provide a global timeout on all INT 13 calls,
with the result that an unexpected passive failure mode (such as
an iSCSI target ACKing the request but never sending a response)
will lead to a timeout that gets reported back to the INT 13 user,
rather than simply freezing the system.
o INT 13,00 (reset drive) is now able to reset the underlying block
device. INT 13 users, such as DOS, that use INT 13,00 as a method
for error recovery now have a chance of recovering.
o All block device commands are tagged, with a numerical tag that
will show up in debugging output and in packet captures; this will
allow easier interpretation of bug reports that include both
sources of information.
o The extremely ugly hacks used to generate the boot firmware tables
have been eradicated and replaced with a generic acpi_describe()
method (exploiting the ability of iPXE interfaces to pass through
methods to an underlying interface). The ACPI tables are now
built in a shared data block within .bss16, rather than each
requiring dedicated space in .data16.
o The architecture-independent concept of a SAN device has been
exposed to the iPXE core through the sanboot API, which provides
calls to hook, unhook, boot, and describe SAN devices. This
allows for much more flexible usage patterns (such as hooking an
empty SAN device and then running an OS installer via TFTP).
Signed-off-by: Michael Brown <mcb30@ipxe.org>
56 lines
1.5 KiB
C
56 lines
1.5 KiB
C
#ifndef _IPXE_BLOCKDEV_H
|
|
#define _IPXE_BLOCKDEV_H
|
|
|
|
/**
|
|
* @file
|
|
*
|
|
* Block devices
|
|
*
|
|
*/
|
|
|
|
FILE_LICENCE ( GPL2_OR_LATER );
|
|
|
|
#include <stdint.h>
|
|
#include <ipxe/uaccess.h>
|
|
#include <ipxe/interface.h>
|
|
|
|
/** Block device capacity */
|
|
struct block_device_capacity {
|
|
/** Total number of blocks */
|
|
uint64_t blocks;
|
|
/** Block size */
|
|
size_t blksize;
|
|
/** Maximum number of blocks per single transfer */
|
|
unsigned int max_count;
|
|
};
|
|
|
|
extern int block_read ( struct interface *control, struct interface *data,
|
|
uint64_t lba, unsigned int count,
|
|
userptr_t buffer, size_t len );
|
|
#define block_read_TYPE( object_type ) \
|
|
typeof ( int ( object_type, struct interface *data, \
|
|
uint64_t lba, unsigned int count, \
|
|
userptr_t buffer, size_t len ) )
|
|
|
|
extern int block_write ( struct interface *control, struct interface *data,
|
|
uint64_t lba, unsigned int count,
|
|
userptr_t buffer, size_t len );
|
|
#define block_write_TYPE( object_type ) \
|
|
typeof ( int ( object_type, struct interface *data, \
|
|
uint64_t lba, unsigned int count, \
|
|
userptr_t buffer, size_t len ) )
|
|
|
|
extern int block_read_capacity ( struct interface *control,
|
|
struct interface *data );
|
|
#define block_read_capacity_TYPE( object_type ) \
|
|
typeof ( int ( object_type, struct interface *data ) )
|
|
|
|
extern void block_capacity ( struct interface *intf,
|
|
struct block_device_capacity *capacity );
|
|
#define block_capacity_TYPE( object_type ) \
|
|
typeof ( void ( object_type, \
|
|
struct block_device_capacity *capacity ) )
|
|
|
|
|
|
#endif /* _IPXE_BLOCKDEV_H */
|