Revision 28c5af54

b/hw/pc.c
173 173
static void cmos_init(int ram_size, const char *boot_device, BlockDriverState **hd_table)
174 174
{
175 175
    RTCState *s = rtc_state;
176
    int nbds, bds[3] = { 0, };
176 177
    int val;
177 178
    int fd0, fd1, nb;
178 179
    int i;
......
202 203
    rtc_set_memory(s, 0x35, val >> 8);
203 204

  
204 205
    /* set boot devices, and disable floppy signature check if requested */
205
    rtc_set_memory(s, 0x3d,
206
            boot_device2nibble(boot_device[1]) << 4 |
207
            boot_device2nibble(boot_device[0]) );
208
    rtc_set_memory(s, 0x38,
209
            boot_device2nibble(boot_device[2]) << 4 | (fd_bootchk ?  0x0 : 0x1));
206
#define PC_MAX_BOOT_DEVICES 3
207
    nbds = strlen(boot_device);
208
    if (nbds > PC_MAX_BOOT_DEVICES) {
209
        fprintf(stderr, "Too many boot devices for PC\n");
210
        exit(1);
211
    }
212
    for (i = 0; i < nbds; i++) {
213
        bds[i] = boot_device2nibble(boot_device[i]);
214
        if (bds[i] == 0) {
215
            fprintf(stderr, "Invalid boot device for PC: '%c'\n",
216
                    boot_device[i]);
217
            exit(1);
218
        }
219
    }
220
    rtc_set_memory(s, 0x3d, (bds[1] << 4) | bds[0]);
221
    rtc_set_memory(s, 0x38, (bds[2] << 4) | (fd_bootchk ?  0x0 : 0x1));
210 222

  
211 223
    /* floppy type */
212 224

  
b/hw/ppc_chrp.c
74 74
    qemu_irq *dummy_irq;
75 75
    int pic_mem_index, dbdma_mem_index, cuda_mem_index;
76 76
    int ide_mem_index[2];
77
    int ppc_boot_device = boot_device[0];
77
    int ppc_boot_device;
78 78

  
79 79
    linux_boot = (kernel_filename != NULL);
80 80

  
......
175 175
        kernel_size = 0;
176 176
        initrd_base = 0;
177 177
        initrd_size = 0;
178
        ppc_boot_device = '\0';
179
        /* We consider that NewWorld PowerMac never have any floppy drive
180
         * For now, OHW cannot boot from the network.
181
         */
182
        for (i = 0; i < boot_device[i] != '\0'; i++) {
183
            ppc_boot_device = boot_device[i];
184
            if (ppc_boot_device >= 'c' && ppc_boot_device <= 'f')
185
                break;
186
        }
187
        if (ppc_boot_device == '\0') {
188
            fprintf(stderr, "No valid boot device for Mac99 machine\n");
189
            exit(1);
190
        }
178 191
    }
179 192

  
180 193
    isa_mem_base = 0x80000000;
b/hw/ppc_oldworld.c
113 113
    int vga_bios_size, bios_size;
114 114
    qemu_irq *dummy_irq;
115 115
    int pic_mem_index, nvram_mem_index, dbdma_mem_index, cuda_mem_index;
116
    int ppc_boot_device = boot_device[0];
116
    int ppc_boot_device;
117 117

  
118 118
    linux_boot = (kernel_filename != NULL);
119 119

  
......
212 212
        kernel_size = 0;
213 213
        initrd_base = 0;
214 214
        initrd_size = 0;
215
        ppc_boot_device = '\0';
216
        for (i = 0; i < boot_device[i] != '\0'; i++) {
217
            ppc_boot_device = boot_device[i];
218
            /* TOFIX: for now, the second IDE channel is not properly
219
             *        emulated. The Mac floppy disk are not emulated.
220
             *        For now, OHW cannot boot from the network.
221
             */
222
#if 0
223
            if (ppc_boot_device >= 'a' && ppc_boot_device <= 'f')
224
                break;
225
#else
226
            if (ppc_boot_device >= 'c' && ppc_boot_device <= 'd')
227
                break;
228
#endif
229
        }
230
        if (ppc_boot_device == '\0') {
231
            fprintf(stderr, "No valid boot device for Mac99 machine\n");
232
            exit(1);
233
        }
215 234
    }
216 235

  
217 236
    isa_mem_base = 0x80000000;
......
272 291
    pmac_format_nvram_partition(nvr, 0x2000);
273 292

  
274 293
    dbdma_init(&dbdma_mem_index);
275
    
294

  
276 295
    macio_init(pci_bus, 0x0017, 1, pic_mem_index, dbdma_mem_index,
277 296
               cuda_mem_index, nvr, 0, NULL);
278 297

  
b/hw/ppc_prep.c
521 521
#define NVRAM_SIZE        0x2000
522 522

  
523 523
/* PowerPC PREP hardware initialisation */
524
static void ppc_prep_init (int ram_size, int vga_ram_size, const char *boot_device,
524
static void ppc_prep_init (int ram_size, int vga_ram_size,
525
                           const char *boot_device,
525 526
                           DisplayState *ds, const char **fd_filename,
526 527
                           int snapshot, const char *kernel_filename,
527 528
                           const char *kernel_cmdline,
......
538 539
    uint32_t kernel_base, kernel_size, initrd_base, initrd_size;
539 540
    PCIBus *pci_bus;
540 541
    qemu_irq *i8259;
541
    int ppc_boot_device = boot_device[0];
542
    int ppc_boot_device;
542 543

  
543 544
    sysctrl = qemu_mallocz(sizeof(sysctrl_t));
544 545
    if (sysctrl == NULL)
......
611 612
        kernel_size = 0;
612 613
        initrd_base = 0;
613 614
        initrd_size = 0;
615
        ppc_boot_device = '\0';
616
        /* For now, OHW cannot boot from the network. */
617
        for (i = 0; i < boot_device[i] != '\0'; i++) {
618
            ppc_boot_device = boot_device[i];
619
            if (ppc_boot_device >= 'a' && ppc_boot_device <= 'f')
620
                break;
621
        }
622
        if (ppc_boot_device == '\0') {
623
            fprintf(stderr, "No valid boot device for Mac99 machine\n");
624
            exit(1);
625
        }
614 626
    }
615 627

  
616 628
    isa_mem_base = 0xc0000000;
b/vl.c
162 162
int nographic;
163 163
const char* keyboard_layout = NULL;
164 164
int64_t ticks_per_sec;
165
#if defined(TARGET_I386)
166
#define MAX_BOOT_DEVICES 3
167
#else
168
#define MAX_BOOT_DEVICES 1
169
#endif
170
static char boot_device[MAX_BOOT_DEVICES + 1];
171 165
int ram_size;
172 166
int pit_min_timer_count = 0;
173 167
int nb_nics;
......
7587 7581
    int use_gdbstub;
7588 7582
    const char *gdbstub_port;
7589 7583
#endif
7584
    uint32_t boot_devices_bitmap = 0;
7590 7585
    int i, cdrom_index, pflash_index;
7591
    int snapshot, linux_boot;
7586
    int snapshot, linux_boot, net_boot;
7592 7587
    const char *initrd_filename;
7593 7588
    const char *hd_filename[MAX_DISKS], *fd_filename[MAX_FD];
7594 7589
    const char *pflash_filename[MAX_PFLASH];
7595 7590
    const char *sd_filename;
7596 7591
    const char *mtd_filename;
7597 7592
    const char *kernel_filename, *kernel_cmdline;
7593
    const char *boot_devices = "";
7598 7594
    DisplayState *ds = &display_state;
7599 7595
    int cyls, heads, secs, translation;
7600 7596
    char net_clients[MAX_NET_CLIENTS][256];
......
7846 7842
                }
7847 7843
                break;
7848 7844
            case QEMU_OPTION_boot:
7849
                if (strlen(optarg) > MAX_BOOT_DEVICES) {
7850
                    fprintf(stderr, "qemu: too many boot devices\n");
7851
                    exit(1);
7852
                }
7853
                strncpy(boot_device, optarg, MAX_BOOT_DEVICES);
7854
#if defined(TARGET_SPARC) || defined(TARGET_I386)
7855
#define BOOTCHARS "acdn"
7856
#else
7857
#define BOOTCHARS "acd"
7858
#endif
7859
                if (strlen(boot_device) != strspn(boot_device, BOOTCHARS)) {
7860
                    fprintf(stderr, "qemu: invalid boot device "
7861
                                    "sequence '%s'\n", boot_device);
7862
                    exit(1);
7845
                boot_devices = optarg;
7846
                /* We just do some generic consistency checks */
7847
                {
7848
                    /* Could easily be extended to 64 devices if needed */
7849
                    const unsigned char *p;
7850
                    
7851
                    boot_devices_bitmap = 0;
7852
                    for (p = boot_devices; *p != '\0'; p++) {
7853
                        /* Allowed boot devices are:
7854
                         * a b     : floppy disk drives
7855
                         * c ... f : IDE disk drives
7856
                         * g ... m : machine implementation dependant drives
7857
                         * n ... p : network devices
7858
                         * It's up to each machine implementation to check
7859
                         * if the given boot devices match the actual hardware
7860
                         * implementation and firmware features.
7861
                         */
7862
                        if (*p < 'a' || *p > 'q') {
7863
                            fprintf(stderr, "Invalid boot device '%c'\n", *p);
7864
                            exit(1);
7865
                        }
7866
                        if (boot_devices_bitmap & (1 << (*p - 'a'))) {
7867
                            fprintf(stderr,
7868
                                    "Boot device '%c' was given twice\n",*p);
7869
                            exit(1);
7870
                        }
7871
                        boot_devices_bitmap |= 1 << (*p - 'a');
7872
                    }
7863 7873
                }
7864 7874
                break;
7865 7875
            case QEMU_OPTION_fda:
......
8243 8253
        kqemu_allowed = 0;
8244 8254
#endif
8245 8255
    linux_boot = (kernel_filename != NULL);
8246

  
8247
    if (!linux_boot &&
8248
        (!strchr(boot_device, 'n')) &&
8256
    net_boot = (boot_devices_bitmap >> ('n' - 'a')) && 0xF;
8257
    
8258
    /* XXX: this should not be: some embedded targets just have flash */
8259
    if (!linux_boot && net_boot == 0 &&
8249 8260
        hd_filename[0] == '\0' &&
8250 8261
        (cdrom_index >= 0 && hd_filename[cdrom_index] == '\0') &&
8251 8262
        fd_filename[0] == '\0')
8252 8263
        help(1);
8253 8264

  
8254 8265
    /* boot to floppy or the default cd if no hard disk defined yet */
8255
    if (!boot_device[0]) {
8266
    if (!boot_devices[0]) {
8256 8267
        if (hd_filename[0] != '\0')
8257
            boot_device[0] = 'c';
8268
            boot_devices = "c";
8258 8269
        else if (fd_filename[0] != '\0')
8259
            boot_device[0] = 'a';
8270
            boot_devices = "a";
8260 8271
        else
8261
            boot_device[0] = 'd';
8262
        boot_device[1] = 0;
8272
            boot_devices = "d";
8263 8273
    }
8264 8274
    setvbuf(stdout, NULL, _IOLBF, 0);
8265 8275

  
......
8299 8309
    }
8300 8310

  
8301 8311
#ifdef TARGET_I386
8302
    if (strchr(boot_device, 'n')) {
8303
	for (i = 0; i < nb_nics; i++) {
8312
    /* XXX: this should be moved in the PC machine instanciation code */
8313
    if (net_boot != 0) {
8314
        int netroms = 0;
8315
	for (i = 0; i < nb_nics && i < 4; i++) {
8304 8316
	    const char *model = nd_table[i].model;
8305 8317
	    char buf[1024];
8306
	    if (model == NULL)
8307
		model = "ne2k_pci";
8308
	    snprintf(buf, sizeof(buf), "%s/pxe-%s.bin", bios_dir, model);
8309
	    if (get_image_size(buf) > 0) {
8310
		option_rom[nb_option_roms] = strdup(buf);
8311
		nb_option_roms++;
8312
		break;
8313
	    }
8318
            if (net_boot & (1 << i)) {
8319
                if (model == NULL)
8320
                    model = "ne2k_pci";
8321
                snprintf(buf, sizeof(buf), "%s/pxe-%s.bin", bios_dir, model);
8322
                if (get_image_size(buf) > 0) {
8323
                    if (nb_option_roms >= MAX_OPTION_ROMS) {
8324
                        fprintf(stderr, "Too many option ROMs\n");
8325
                        exit(1);
8326
                    }
8327
                    option_rom[nb_option_roms] = strdup(buf);
8328
                    nb_option_roms++;
8329
                    netroms++;
8330
                }
8331
            }
8314 8332
	}
8315
	if (i == nb_nics) {
8333
	if (netroms == 0) {
8316 8334
	    fprintf(stderr, "No valid PXE rom found for network device\n");
8317 8335
	    exit(1);
8318 8336
	}
......
8492 8510
        }
8493 8511
    }
8494 8512

  
8495
    machine->init(ram_size, vga_ram_size, boot_device,
8513
    machine->init(ram_size, vga_ram_size, boot_devices,
8496 8514
                  ds, fd_filename, snapshot,
8497 8515
                  kernel_filename, kernel_cmdline, initrd_filename, cpu_model);
8498 8516

  

Also available in: Unified diff