예제 #1
0
/**
 * Execute El Torito image
 *
 * @v image		El Torito image
 * @ret rc		Return status code
 */
static int eltorito_exec ( struct image *image ) {
	struct ramdisk ramdisk;
	struct int13_drive int13_drive;
	unsigned int load_segment = image->priv.ul;
	unsigned int load_offset = ( load_segment ? 0 : 0x7c00 );
	int rc;

	memset ( &ramdisk, 0, sizeof ( ramdisk ) );
	init_ramdisk ( &ramdisk, image->data, image->len, ISO9660_BLKSIZE );
	
	memset ( &int13_drive, 0, sizeof ( int13_drive ) );
	int13_drive.blockdev = &ramdisk.blockdev;
	register_int13_drive ( &int13_drive );

	if ( ( rc = call_bootsector ( load_segment, load_offset, 
				      int13_drive.drive ) ) != 0 ) {
		DBGC ( image, "ElTorito %p boot failed: %s\n",
		       image, strerror ( rc ) );
		goto err;
	}
	
	rc = -ECANCELED; /* -EIMPOSSIBLE */
 err:
	unregister_int13_drive ( &int13_drive );
	return rc;
}
예제 #2
0
static int aoeboot ( const char *root_path ) {
    struct ata_device ata;
    struct int13_drive drive;
    int rc;

    memset ( &ata, 0, sizeof ( ata ) );
    memset ( &drive, 0, sizeof ( drive ) );

    printf ( "AoE booting from %s\n", root_path );

    /* FIXME: ugly, ugly hack */
    struct net_device *netdev = last_opened_netdev();

    if ( ( rc = aoe_attach ( &ata, netdev, root_path ) ) != 0 ) {
        printf ( "Could not attach AoE device: %s\n",
                 strerror ( rc ) );
        goto error_attach;
    }
    if ( ( rc = init_atadev ( &ata ) ) != 0 ) {
        printf ( "Could not initialise AoE device: %s\n",
                 strerror ( rc ) );
        goto error_init;
    }

    /* FIXME: ugly, ugly hack */
    struct aoe_session *aoe =
        container_of ( ata.backend, struct aoe_session, refcnt );
    abft_fill_data ( aoe );

    drive.blockdev = &ata.blockdev;

    register_int13_drive ( &drive );
    printf ( "Registered as BIOS drive %#02x\n", drive.drive );
    printf ( "Booting from BIOS drive %#02x\n", drive.drive );
    rc = int13_boot ( drive.drive );
    printf ( "Boot failed\n" );

    printf ( "Unregistering BIOS drive %#02x\n", drive.drive );
    unregister_int13_drive ( &drive );

error_init:
    aoe_detach ( &ata );
error_attach:
    return rc;
}
예제 #3
0
static int iscsiboot ( const char *root_path ) {
	struct scsi_device *scsi;
	struct int13_drive *drive;
	int keep_san;
	int rc;

	scsi = zalloc ( sizeof ( *scsi ) );
	if ( ! scsi ) {
		rc = -ENOMEM;
		goto err_alloc_scsi;
	}
	drive = zalloc ( sizeof ( *drive ) );
	if ( ! drive ) {
		rc = -ENOMEM;
		goto err_alloc_drive;
	}

	printf ( "iSCSI booting from %s\n", root_path );

	if ( ( rc = iscsi_attach ( scsi, root_path ) ) != 0 ) {
		printf ( "Could not attach iSCSI device: %s\n",
			 strerror ( rc ) );
		goto err_attach;
	}
	if ( ( rc = init_scsidev ( scsi ) ) != 0 ) {
		printf ( "Could not initialise iSCSI device: %s\n",
			 strerror ( rc ) );
		goto err_init;
	}

	drive->blockdev = &scsi->blockdev;

	/* FIXME: ugly, ugly hack */
	struct net_device *netdev = last_opened_netdev();
	struct iscsi_session *iscsi =
		container_of ( scsi->backend, struct iscsi_session, refcnt );
	ibft_fill_data ( netdev, iscsi );

	register_int13_drive ( drive );
	printf ( "Registered as BIOS drive %#02x\n", drive->drive );
	printf ( "Booting from BIOS drive %#02x\n", drive->drive );
	rc = int13_boot ( drive->drive );
	printf ( "Boot failed\n" );

	/* Leave drive registered, if instructed to do so */
	keep_san = fetch_intz_setting ( NULL, &keep_san_setting );
	if ( keep_san ) {
		printf ( "Preserving connection to SAN disk\n" );
		shutdown_exit_flags |= SHUTDOWN_KEEP_DEVICES;
		return rc;
	}

	printf ( "Unregistering BIOS drive %#02x\n", drive->drive );
	unregister_int13_drive ( drive );

 err_init:
	iscsi_detach ( scsi );
 err_attach:
	free ( drive );
 err_alloc_drive:
	free ( scsi );
 err_alloc_scsi:
	return rc;
}