예제 #1
0
/**
 * Execute PXE image
 *
 * @v image		PXE image
 * @ret rc		Return status code
 */
static int pxe_exec ( struct image *image ) {
	int rc;

	/* Ensure that PXE stack is ready to use */
	pxe_init_structures();
	pxe_hook_int1a();

	/* Arbitrarily pick the most recently opened network device */
	pxe_set_netdev ( last_opened_netdev() );

	/* Many things will break if pxe_netdev is NULL */
	if ( ! pxe_netdev ) {
		DBGC ( image, "IMAGE %p could not locate PXE net device\n",
		       image );
		return -ENODEV;
	}

	/* Start PXE NBP */
	rc = pxe_start_nbp();

	/* Deactivate PXE */
	pxe_set_netdev ( NULL );
	pxe_unhook_int1a();

	return rc;
}
예제 #2
0
/**
 * Execute PXE image
 *
 * @v image		PXE image
 * @ret rc		Return status code
 */
static int pxe_exec ( struct image *image ) {
	userptr_t buffer = real_to_user ( 0, 0x7c00 );
	struct net_device *netdev;
	int rc;

	/* Verify and prepare segment */
	if ( ( rc = prep_segment ( buffer, image->len, image->len ) ) != 0 ) {
		DBGC ( image, "IMAGE %p could not prepare segment: %s\n",
		       image, strerror ( rc ) );
		return rc;
	}

	/* Copy image to segment */
	memcpy_user ( buffer, 0, image->data, 0, image->len );

	/* Arbitrarily pick the most recently opened network device */
	if ( ( netdev = last_opened_netdev() ) == NULL ) {
		DBGC ( image, "IMAGE %p could not locate PXE net device\n",
		       image );
		return -ENODEV;
	}
	netdev_get ( netdev );

	/* Activate PXE */
	pxe_activate ( netdev );

	/* Construct fake DHCP packets */
	pxe_fake_cached_info();

	/* Set PXE command line */
	pxe_cmdline = image->cmdline;

	/* Reset console since PXE NBP will probably use it */
	console_reset();

	/* Disable IRQ, if applicable */
	if ( netdev_irq_supported ( netdev ) && netdev->dev->desc.irq )
		disable_irq ( netdev->dev->desc.irq );

	/* Start PXE NBP */
	rc = pxe_start_nbp();

	/* Clear PXE command line */
	pxe_cmdline = NULL;

	/* Deactivate PXE */
	pxe_deactivate();

	/* Try to reopen network device.  Ignore errors, since the NBP
	 * may have called PXENV_STOP_UNDI.
	 */
	netdev_open ( netdev );
	netdev_put ( netdev );

	return rc;
}
예제 #3
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;
}
예제 #4
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;
}