Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[driver] Allow for easier expansion to handle multiple table types
Signed-off-by: Michael Brown <mbrown@fensystems.co.uk>
  • Loading branch information
mcb30 committed Sep 13, 2010
1 parent 2676cd7 commit 43a46e1
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 56 deletions.
5 changes: 3 additions & 2 deletions src/driver/ibft.c
Expand Up @@ -584,9 +584,10 @@ static VOID parse_ibft_target ( PIBFT_TABLE ibft, PIBFT_TARGET target ) {
/**
* Parse iBFT
*
* @v ibft iBFT
* @v acpi ACPI description header
*/
VOID parse_ibft ( PIBFT_TABLE ibft ) {
VOID parse_ibft ( PACPI_DESCRIPTION_HEADER acpi ) {
PIBFT_TABLE ibft = ( PIBFT_TABLE ) acpi;
PIBFT_CONTROL control = &ibft->control;
PUSHORT offset;
PIBFT_HEADER header;
Expand Down
2 changes: 1 addition & 1 deletion src/driver/ibft.h
Expand Up @@ -266,6 +266,6 @@ typedef struct _IBFT_TABLE {
} IBFT_TABLE, *PIBFT_TABLE;
#pragma pack()

extern VOID parse_ibft ( PIBFT_TABLE ibft );
extern VOID parse_ibft ( PACPI_DESCRIPTION_HEADER acpi );

#endif /* _IBFT_H */
115 changes: 65 additions & 50 deletions src/driver/sanbootconf.c
Expand Up @@ -31,9 +31,9 @@
/** Device private data */
typedef struct _SANBOOTCONF_PRIV {
/* Copy of iBFT, if any */
PIBFT_TABLE ibft;
PACPI_DESCRIPTION_HEADER ibft;
/* Copy of sBFT, if any */
PSBFT_TABLE sbft;
PACPI_DESCRIPTION_HEADER sbft;
} SANBOOTCONF_PRIV, *PSANBOOTCONF_PRIV;

/** Unique GUID for IoCreateDeviceSecure() */
Expand Down Expand Up @@ -76,6 +76,33 @@ static NTSTATUS sanbootconf_dummy_irp ( PDEVICE_OBJECT device, PIRP irp ) {
return STATUS_SUCCESS;
}

/**
* Fetch ACPI table copy
*
* @v signature Table signature
* @v acpi ACPI header
* @v buf Buffer
* @v len Length of buffer
* @ret ntstatus NT status
*/
static NTSTATUS fetch_acpi_table_copy ( PCHAR signature,
PACPI_DESCRIPTION_HEADER acpi,
PCHAR buf, ULONG len ) {

DbgPrint ( "%s requested\n", signature );

if ( ! acpi ) {
DbgPrint ( "No %s available!\n", signature );
return STATUS_NO_SUCH_FILE;
}

if ( len > acpi->length )
len = acpi->length;
RtlCopyMemory ( buf, acpi, len );

return STATUS_SUCCESS;
}

/**
* IoControl IRP handler
*
Expand All @@ -86,35 +113,18 @@ static NTSTATUS sanbootconf_dummy_irp ( PDEVICE_OBJECT device, PIRP irp ) {
static NTSTATUS sanbootconf_iocontrol_irp ( PDEVICE_OBJECT device, PIRP irp ) {
PIO_STACK_LOCATION irpsp = IoGetCurrentIrpStackLocation ( irp );
PSANBOOTCONF_PRIV priv = device->DeviceExtension;
PCHAR buf = irp->AssociatedIrp.SystemBuffer;
ULONG len = irpsp->Parameters.DeviceIoControl.OutputBufferLength;
NTSTATUS status;

switch ( irpsp->Parameters.DeviceIoControl.IoControlCode ) {
case IOCTL_SANBOOTCONF_IBFT:
DbgPrint ( "iBFT requested\n" );
if ( priv->ibft ) {
if ( len > priv->ibft->acpi.length )
len = priv->ibft->acpi.length;
RtlCopyMemory ( irp->AssociatedIrp.SystemBuffer,
priv->ibft, len );
status = STATUS_SUCCESS;
} else {
DbgPrint ( "No iBFT available!\n" );
status = STATUS_NO_SUCH_FILE;
}
status = fetch_acpi_table_copy ( IBFT_SIG, priv->ibft,
buf, len );
break;
case IOCTL_SANBOOTCONF_SBFT:
DbgPrint ( "sBFT requested\n" );
if ( priv->sbft ) {
if ( len > priv->sbft->acpi.length )
len = priv->sbft->acpi.length;
RtlCopyMemory ( irp->AssociatedIrp.SystemBuffer,
priv->sbft, len );
status = STATUS_SUCCESS;
} else {
DbgPrint ( "No sbft available!\n" );
status = STATUS_NO_SUCH_FILE;
}
status = fetch_acpi_table_copy ( SBFT_SIG, priv->sbft,
buf, len );
break;
default:
DbgPrint ( "Unrecognised IoControl %x\n",
Expand Down Expand Up @@ -261,7 +271,8 @@ static NTSTATUS check_system_disk ( PUNICODE_STRING name,
&device );
if ( ! NT_SUCCESS ( status ) ) {
/* Most probably not yet attached */
DbgPrint ( " Disk unavailable (%lx): \"%wZ\"\n", status, name );
DbgPrint ( " Disk unavailable (%lx): \"%wZ\"\n",
status, name );
goto err_iogetdeviceobjectpointer;
}

Expand Down Expand Up @@ -412,6 +423,30 @@ static VOID sanbootconf_wait ( PDRIVER_OBJECT driver, PVOID context,
context );
}

/**
* Try to find ACPI table
*
* @v signature Table signature
* @v parse Table parser
* @ret table_copy Copy of table, or NULL
* @ret found Table was found
*/
static BOOLEAN try_find_acpi_table ( PCHAR signature,
VOID ( *parse )
( PACPI_DESCRIPTION_HEADER acpi ),
PACPI_DESCRIPTION_HEADER *table_copy ) {
NTSTATUS status;

status = find_acpi_table ( signature, table_copy );
if ( ! NT_SUCCESS ( status ) ) {
DbgPrint ( "No %s found\n", signature );
return FALSE;
}

parse ( *table_copy );
return TRUE;
}

/**
* Driver entry point
*
Expand All @@ -423,9 +458,8 @@ NTSTATUS DriverEntry ( IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath ) {
PDEVICE_OBJECT device;
PSANBOOTCONF_PRIV priv;
PACPI_DESCRIPTION_HEADER table;
NTSTATUS status;
BOOLEAN found_san = FALSE;
BOOLEAN found_san;

DbgPrint ( "SAN Boot Configuration Driver initialising\n" );

Expand All @@ -442,29 +476,10 @@ NTSTATUS DriverEntry ( IN PDRIVER_OBJECT DriverObject,
goto err_create_sanbootconf_device;
priv = device->DeviceExtension;

/* Look for an iBFT */
status = find_acpi_table ( IBFT_SIG, &table );
if ( NT_SUCCESS ( status ) ) {
priv->ibft = ( ( PIBFT_TABLE ) table );
parse_ibft ( priv->ibft );
found_san = TRUE;
} else {
/* Lack of an iBFT is not necessarily an error */
DbgPrint ( "No iBFT found\n" );
status = STATUS_SUCCESS;
}

/* Look for an sBFT */
status = find_acpi_table ( SBFT_SIG, &table );
if ( NT_SUCCESS ( status ) ) {
priv->sbft = ( ( PSBFT_TABLE ) table );
parse_sbft ( priv->sbft );
found_san = TRUE;
} else {
/* Lack of an sBFT is not necessarily an error */
DbgPrint ( "No sBFT found\n" );
status = STATUS_SUCCESS;
}
/* Look for boot firmware tables*/
found_san =
( try_find_acpi_table ( IBFT_SIG, parse_ibft, &priv->ibft ) |
try_find_acpi_table ( SBFT_SIG, parse_sbft, &priv->sbft ) );

/* Wait for system disk, if booting from SAN */
if ( found_san ) {
Expand Down
5 changes: 3 additions & 2 deletions src/driver/sbft.c
Expand Up @@ -101,9 +101,10 @@ static VOID parse_sbft_ib ( PSBFT_TABLE sbft, PSBFT_IB_SUBTABLE ib ) {
/**
* Parse sBFT
*
* @v sbft sBFT
* @v acpi ACPI description header
*/
VOID parse_sbft ( PSBFT_TABLE sbft ) {
VOID parse_sbft ( PACPI_DESCRIPTION_HEADER acpi ) {
PSBFT_TABLE sbft = ( PSBFT_TABLE ) acpi;
PSBFT_SCSI_SUBTABLE scsi;
PSBFT_SRP_SUBTABLE srp;
PSBFT_IB_SUBTABLE ib;
Expand Down
2 changes: 1 addition & 1 deletion src/driver/sbft.h
Expand Up @@ -139,6 +139,6 @@ typedef struct _SBFT_IB_SUBTABLE {
} SBFT_IB_SUBTABLE, *PSBFT_IB_SUBTABLE;
#pragma pack()

extern VOID parse_sbft ( PSBFT_TABLE sbft );
extern VOID parse_sbft ( PACPI_DESCRIPTION_HEADER acpi );

#endif /* _SBFT_H */

0 comments on commit 43a46e1

Please sign in to comment.