source: bootcd/isolinux/syslinux-6.03/gpxe/src/arch/i386/interface/pcbios/iscsiboot.c

Last change on this file was e16e8f2, checked in by Edwin Eefting <edwin@datux.nl>, 3 years ago

bootstuff

  • Property mode set to 100644
File size: 1.7 KB
Line 
1#include <stdint.h>
2#include <string.h>
3#include <stdlib.h>
4#include <stdio.h>
5#include <errno.h>
6#include <gpxe/iscsi.h>
7#include <gpxe/netdevice.h>
8#include <gpxe/ibft.h>
9#include <gpxe/sanboot.h>
10#include <int13.h>
11
12FILE_LICENCE ( GPL2_OR_LATER );
13
14static int iscsiboot ( const char *root_path ) {
15        struct scsi_device *scsi;
16        struct int13_drive *drive;
17        int rc;
18
19        scsi = zalloc ( sizeof ( *scsi ) );
20        if ( ! scsi ) {
21                rc = -ENOMEM;
22                goto err_alloc_scsi;
23        }
24        drive = zalloc ( sizeof ( *drive ) );
25        if ( ! drive ) {
26                rc = -ENOMEM;
27                goto err_alloc_drive;
28        }
29
30        if ( ( rc = iscsi_attach ( scsi, root_path ) ) != 0 ) {
31                printf ( "Could not attach iSCSI device: %s\n",
32                         strerror ( rc ) );
33                goto err_attach;
34        }
35        if ( ( rc = init_scsidev ( scsi ) ) != 0 ) {
36                printf ( "Could not initialise iSCSI device: %s\n",
37                         strerror ( rc ) );
38                goto err_init;
39        }
40
41        drive->blockdev = &scsi->blockdev;
42
43        /* FIXME: ugly, ugly hack */
44        struct net_device *netdev = last_opened_netdev();
45        struct iscsi_session *iscsi =
46                container_of ( scsi->backend, struct iscsi_session, refcnt );
47        ibft_fill_data ( netdev, iscsi );
48
49        register_int13_drive ( drive );
50        printf ( "Registered as BIOS drive %#02x\n", drive->drive );
51        printf ( "Booting from BIOS drive %#02x\n", drive->drive );
52        rc = int13_boot ( drive->drive );
53        printf ( "Boot failed\n" );
54
55        /* Leave drive registered, if instructed to do so */
56        if ( keep_san() )
57                return rc;
58
59        printf ( "Unregistering BIOS drive %#02x\n", drive->drive );
60        unregister_int13_drive ( drive );
61
62 err_init:
63        iscsi_detach ( scsi );
64 err_attach:
65        free ( drive );
66 err_alloc_drive:
67        free ( scsi );
68 err_alloc_scsi:
69        return rc;
70}
71
72struct sanboot_protocol iscsi_sanboot_protocol __sanboot_protocol = {
73        .prefix = "iscsi:",
74        .boot = iscsiboot,
75};
Note: See TracBrowser for help on using the repository browser.