Commit cc1daa40f188ec3ea6c37db546887488a419e900
1 parent
2d618793
added -M machine option - permit to put CDROM on hdb on PPC to handle the case w…
…here a single IDE controller is present git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1444 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
88 additions
and
35 deletions
vl.c
| @@ -2494,6 +2494,33 @@ static int ram_load(QEMUFile *f, void *opaque, int version_id) | @@ -2494,6 +2494,33 @@ static int ram_load(QEMUFile *f, void *opaque, int version_id) | ||
| 2494 | } | 2494 | } |
| 2495 | 2495 | ||
| 2496 | /***********************************************************/ | 2496 | /***********************************************************/ |
| 2497 | +/* machine registration */ | ||
| 2498 | + | ||
| 2499 | +QEMUMachine *first_machine = NULL; | ||
| 2500 | + | ||
| 2501 | +int qemu_register_machine(QEMUMachine *m) | ||
| 2502 | +{ | ||
| 2503 | + QEMUMachine **pm; | ||
| 2504 | + pm = &first_machine; | ||
| 2505 | + while (*pm != NULL) | ||
| 2506 | + pm = &(*pm)->next; | ||
| 2507 | + m->next = NULL; | ||
| 2508 | + *pm = m; | ||
| 2509 | + return 0; | ||
| 2510 | +} | ||
| 2511 | + | ||
| 2512 | +QEMUMachine *find_machine(const char *name) | ||
| 2513 | +{ | ||
| 2514 | + QEMUMachine *m; | ||
| 2515 | + | ||
| 2516 | + for(m = first_machine; m != NULL; m = m->next) { | ||
| 2517 | + if (!strcmp(m->name, name)) | ||
| 2518 | + return m; | ||
| 2519 | + } | ||
| 2520 | + return NULL; | ||
| 2521 | +} | ||
| 2522 | + | ||
| 2523 | +/***********************************************************/ | ||
| 2497 | /* main execution loop */ | 2524 | /* main execution loop */ |
| 2498 | 2525 | ||
| 2499 | void gui_update(void *opaque) | 2526 | void gui_update(void *opaque) |
| @@ -2735,6 +2762,7 @@ void help(void) | @@ -2735,6 +2762,7 @@ void help(void) | ||
| 2735 | "'disk_image' is a raw hard image image for IDE hard disk 0\n" | 2762 | "'disk_image' is a raw hard image image for IDE hard disk 0\n" |
| 2736 | "\n" | 2763 | "\n" |
| 2737 | "Standard options:\n" | 2764 | "Standard options:\n" |
| 2765 | + "-M machine select emulated machine (-M ? for list)\n" | ||
| 2738 | "-fda/-fdb file use 'file' as floppy disk 0/1 image\n" | 2766 | "-fda/-fdb file use 'file' as floppy disk 0/1 image\n" |
| 2739 | "-hda/-hdb file use 'file' as IDE hard disk 0/1 image\n" | 2767 | "-hda/-hdb file use 'file' as IDE hard disk 0/1 image\n" |
| 2740 | "-hdc/-hdd file use 'file' as IDE hard disk 2/3 image\n" | 2768 | "-hdc/-hdd file use 'file' as IDE hard disk 2/3 image\n" |
| @@ -2752,9 +2780,6 @@ void help(void) | @@ -2752,9 +2780,6 @@ void help(void) | ||
| 2752 | #ifdef TARGET_I386 | 2780 | #ifdef TARGET_I386 |
| 2753 | "-win2k-hack use it when installing Windows 2000 to avoid a disk full bug\n" | 2781 | "-win2k-hack use it when installing Windows 2000 to avoid a disk full bug\n" |
| 2754 | #endif | 2782 | #endif |
| 2755 | -#ifdef TARGET_PPC | ||
| 2756 | - "-prep Simulate a PREP system (default is PowerMAC)\n" | ||
| 2757 | -#endif | ||
| 2758 | #if defined(TARGET_PPC) || defined(TARGET_SPARC) | 2783 | #if defined(TARGET_PPC) || defined(TARGET_SPARC) |
| 2759 | "-g WxH[xDEPTH] Set the initial graphical resolution and depth\n" | 2784 | "-g WxH[xDEPTH] Set the initial graphical resolution and depth\n" |
| 2760 | #endif | 2785 | #endif |
| @@ -2835,6 +2860,7 @@ void help(void) | @@ -2835,6 +2860,7 @@ void help(void) | ||
| 2835 | enum { | 2860 | enum { |
| 2836 | QEMU_OPTION_h, | 2861 | QEMU_OPTION_h, |
| 2837 | 2862 | ||
| 2863 | + QEMU_OPTION_M, | ||
| 2838 | QEMU_OPTION_fda, | 2864 | QEMU_OPTION_fda, |
| 2839 | QEMU_OPTION_fdb, | 2865 | QEMU_OPTION_fdb, |
| 2840 | QEMU_OPTION_hda, | 2866 | QEMU_OPTION_hda, |
| @@ -2896,6 +2922,7 @@ typedef struct QEMUOption { | @@ -2896,6 +2922,7 @@ typedef struct QEMUOption { | ||
| 2896 | const QEMUOption qemu_options[] = { | 2922 | const QEMUOption qemu_options[] = { |
| 2897 | { "h", 0, QEMU_OPTION_h }, | 2923 | { "h", 0, QEMU_OPTION_h }, |
| 2898 | 2924 | ||
| 2925 | + { "M", HAS_ARG, QEMU_OPTION_M }, | ||
| 2899 | { "fda", HAS_ARG, QEMU_OPTION_fda }, | 2926 | { "fda", HAS_ARG, QEMU_OPTION_fda }, |
| 2900 | { "fdb", HAS_ARG, QEMU_OPTION_fdb }, | 2927 | { "fdb", HAS_ARG, QEMU_OPTION_fdb }, |
| 2901 | { "hda", HAS_ARG, QEMU_OPTION_hda }, | 2928 | { "hda", HAS_ARG, QEMU_OPTION_hda }, |
| @@ -3007,6 +3034,20 @@ static void read_passwords(void) | @@ -3007,6 +3034,20 @@ static void read_passwords(void) | ||
| 3007 | } | 3034 | } |
| 3008 | } | 3035 | } |
| 3009 | 3036 | ||
| 3037 | +/* XXX: currently we cannot use simultaneously different CPUs */ | ||
| 3038 | +void register_machines(void) | ||
| 3039 | +{ | ||
| 3040 | +#if defined(TARGET_I386) | ||
| 3041 | + qemu_register_machine(&pc_machine); | ||
| 3042 | +#elif defined(TARGET_PPC) | ||
| 3043 | + qemu_register_machine(&heathrow_machine); | ||
| 3044 | + qemu_register_machine(&core99_machine); | ||
| 3045 | + qemu_register_machine(&prep_machine); | ||
| 3046 | +#elif defined(TARGET_SPARC) | ||
| 3047 | + qemu_register_machine(&sun4m_machine); | ||
| 3048 | +#endif | ||
| 3049 | +} | ||
| 3050 | + | ||
| 3010 | #define NET_IF_TUN 0 | 3051 | #define NET_IF_TUN 0 |
| 3011 | #define NET_IF_USER 1 | 3052 | #define NET_IF_USER 1 |
| 3012 | #define NET_IF_DUMMY 2 | 3053 | #define NET_IF_DUMMY 2 |
| @@ -3016,7 +3057,7 @@ int main(int argc, char **argv) | @@ -3016,7 +3057,7 @@ int main(int argc, char **argv) | ||
| 3016 | #ifdef CONFIG_GDBSTUB | 3057 | #ifdef CONFIG_GDBSTUB |
| 3017 | int use_gdbstub, gdbstub_port; | 3058 | int use_gdbstub, gdbstub_port; |
| 3018 | #endif | 3059 | #endif |
| 3019 | - int i, has_cdrom; | 3060 | + int i, cdrom_index; |
| 3020 | int snapshot, linux_boot; | 3061 | int snapshot, linux_boot; |
| 3021 | CPUState *env; | 3062 | CPUState *env; |
| 3022 | const char *initrd_filename; | 3063 | const char *initrd_filename; |
| @@ -3036,11 +3077,14 @@ int main(int argc, char **argv) | @@ -3036,11 +3077,14 @@ int main(int argc, char **argv) | ||
| 3036 | char parallel_devices[MAX_PARALLEL_PORTS][128]; | 3077 | char parallel_devices[MAX_PARALLEL_PORTS][128]; |
| 3037 | int parallel_device_index; | 3078 | int parallel_device_index; |
| 3038 | const char *loadvm = NULL; | 3079 | const char *loadvm = NULL; |
| 3039 | - | 3080 | + QEMUMachine *machine; |
| 3081 | + | ||
| 3040 | #if !defined(CONFIG_SOFTMMU) | 3082 | #if !defined(CONFIG_SOFTMMU) |
| 3041 | /* we never want that malloc() uses mmap() */ | 3083 | /* we never want that malloc() uses mmap() */ |
| 3042 | mallopt(M_MMAP_THRESHOLD, 4096 * 1024); | 3084 | mallopt(M_MMAP_THRESHOLD, 4096 * 1024); |
| 3043 | #endif | 3085 | #endif |
| 3086 | + register_machines(); | ||
| 3087 | + machine = first_machine; | ||
| 3044 | initrd_filename = NULL; | 3088 | initrd_filename = NULL; |
| 3045 | for(i = 0; i < MAX_FD; i++) | 3089 | for(i = 0; i < MAX_FD; i++) |
| 3046 | fd_filename[i] = NULL; | 3090 | fd_filename[i] = NULL; |
| @@ -3058,7 +3102,11 @@ int main(int argc, char **argv) | @@ -3058,7 +3102,11 @@ int main(int argc, char **argv) | ||
| 3058 | nographic = 0; | 3102 | nographic = 0; |
| 3059 | kernel_filename = NULL; | 3103 | kernel_filename = NULL; |
| 3060 | kernel_cmdline = ""; | 3104 | kernel_cmdline = ""; |
| 3061 | - has_cdrom = 1; | 3105 | +#ifdef TARGET_PPC |
| 3106 | + cdrom_index = 1; | ||
| 3107 | +#else | ||
| 3108 | + cdrom_index = 2; | ||
| 3109 | +#endif | ||
| 3062 | cyls = heads = secs = 0; | 3110 | cyls = heads = secs = 0; |
| 3063 | translation = BIOS_ATA_TRANSLATION_AUTO; | 3111 | translation = BIOS_ATA_TRANSLATION_AUTO; |
| 3064 | pstrcpy(monitor_device, sizeof(monitor_device), "vc"); | 3112 | pstrcpy(monitor_device, sizeof(monitor_device), "vc"); |
| @@ -3118,14 +3166,33 @@ int main(int argc, char **argv) | @@ -3118,14 +3166,33 @@ int main(int argc, char **argv) | ||
| 3118 | } | 3166 | } |
| 3119 | 3167 | ||
| 3120 | switch(popt->index) { | 3168 | switch(popt->index) { |
| 3169 | + case QEMU_OPTION_M: | ||
| 3170 | + machine = find_machine(optarg); | ||
| 3171 | + if (!machine) { | ||
| 3172 | + QEMUMachine *m; | ||
| 3173 | + printf("Supported machines are:\n"); | ||
| 3174 | + for(m = first_machine; m != NULL; m = m->next) { | ||
| 3175 | + printf("%-10s %s%s\n", | ||
| 3176 | + m->name, m->desc, | ||
| 3177 | + m == first_machine ? " (default)" : ""); | ||
| 3178 | + } | ||
| 3179 | + exit(1); | ||
| 3180 | + } | ||
| 3181 | + break; | ||
| 3121 | case QEMU_OPTION_initrd: | 3182 | case QEMU_OPTION_initrd: |
| 3122 | initrd_filename = optarg; | 3183 | initrd_filename = optarg; |
| 3123 | break; | 3184 | break; |
| 3124 | case QEMU_OPTION_hda: | 3185 | case QEMU_OPTION_hda: |
| 3125 | - hd_filename[0] = optarg; | ||
| 3126 | - break; | ||
| 3127 | case QEMU_OPTION_hdb: | 3186 | case QEMU_OPTION_hdb: |
| 3128 | - hd_filename[1] = optarg; | 3187 | + case QEMU_OPTION_hdc: |
| 3188 | + case QEMU_OPTION_hdd: | ||
| 3189 | + { | ||
| 3190 | + int hd_index; | ||
| 3191 | + hd_index = popt->index - QEMU_OPTION_hda; | ||
| 3192 | + hd_filename[hd_index] = optarg; | ||
| 3193 | + if (hd_index == cdrom_index) | ||
| 3194 | + cdrom_index = -1; | ||
| 3195 | + } | ||
| 3129 | break; | 3196 | break; |
| 3130 | case QEMU_OPTION_snapshot: | 3197 | case QEMU_OPTION_snapshot: |
| 3131 | snapshot = 1; | 3198 | snapshot = 1; |
| @@ -3192,16 +3259,10 @@ int main(int argc, char **argv) | @@ -3192,16 +3259,10 @@ int main(int argc, char **argv) | ||
| 3192 | } | 3259 | } |
| 3193 | } | 3260 | } |
| 3194 | break; | 3261 | break; |
| 3195 | - case QEMU_OPTION_hdc: | ||
| 3196 | - hd_filename[2] = optarg; | ||
| 3197 | - has_cdrom = 0; | ||
| 3198 | - break; | ||
| 3199 | - case QEMU_OPTION_hdd: | ||
| 3200 | - hd_filename[3] = optarg; | ||
| 3201 | - break; | ||
| 3202 | case QEMU_OPTION_cdrom: | 3262 | case QEMU_OPTION_cdrom: |
| 3203 | - hd_filename[2] = optarg; | ||
| 3204 | - has_cdrom = 1; | 3263 | + if (cdrom_index >= 0) { |
| 3264 | + hd_filename[cdrom_index] = optarg; | ||
| 3265 | + } | ||
| 3205 | break; | 3266 | break; |
| 3206 | case QEMU_OPTION_boot: | 3267 | case QEMU_OPTION_boot: |
| 3207 | boot_device = optarg[0]; | 3268 | boot_device = optarg[0]; |
| @@ -3421,7 +3482,9 @@ int main(int argc, char **argv) | @@ -3421,7 +3482,9 @@ int main(int argc, char **argv) | ||
| 3421 | 3482 | ||
| 3422 | linux_boot = (kernel_filename != NULL); | 3483 | linux_boot = (kernel_filename != NULL); |
| 3423 | 3484 | ||
| 3424 | - if (!linux_boot && hd_filename[0] == '\0' && hd_filename[2] == '\0' && | 3485 | + if (!linux_boot && |
| 3486 | + hd_filename[0] == '\0' && | ||
| 3487 | + (cdrom_index >= 0 && hd_filename[cdrom_index] == '\0') && | ||
| 3425 | fd_filename[0] == '\0') | 3488 | fd_filename[0] == '\0') |
| 3426 | help(); | 3489 | help(); |
| 3427 | 3490 | ||
| @@ -3531,9 +3594,9 @@ int main(int argc, char **argv) | @@ -3531,9 +3594,9 @@ int main(int argc, char **argv) | ||
| 3531 | 3594 | ||
| 3532 | /* we always create the cdrom drive, even if no disk is there */ | 3595 | /* we always create the cdrom drive, even if no disk is there */ |
| 3533 | bdrv_init(); | 3596 | bdrv_init(); |
| 3534 | - if (has_cdrom) { | ||
| 3535 | - bs_table[2] = bdrv_new("cdrom"); | ||
| 3536 | - bdrv_set_type_hint(bs_table[2], BDRV_TYPE_CDROM); | 3597 | + if (cdrom_index >= 0) { |
| 3598 | + bs_table[cdrom_index] = bdrv_new("cdrom"); | ||
| 3599 | + bdrv_set_type_hint(bs_table[cdrom_index], BDRV_TYPE_CDROM); | ||
| 3537 | } | 3600 | } |
| 3538 | 3601 | ||
| 3539 | /* open the virtual block devices */ | 3602 | /* open the virtual block devices */ |
| @@ -3684,19 +3747,9 @@ int main(int argc, char **argv) | @@ -3684,19 +3747,9 @@ int main(int argc, char **argv) | ||
| 3684 | #endif | 3747 | #endif |
| 3685 | init_timers(); | 3748 | init_timers(); |
| 3686 | 3749 | ||
| 3687 | -#if defined(TARGET_I386) | ||
| 3688 | - pc_init(ram_size, vga_ram_size, boot_device, | ||
| 3689 | - ds, fd_filename, snapshot, | ||
| 3690 | - kernel_filename, kernel_cmdline, initrd_filename); | ||
| 3691 | -#elif defined(TARGET_PPC) | ||
| 3692 | - ppc_init(ram_size, vga_ram_size, boot_device, | ||
| 3693 | - ds, fd_filename, snapshot, | ||
| 3694 | - kernel_filename, kernel_cmdline, initrd_filename); | ||
| 3695 | -#elif defined(TARGET_SPARC) | ||
| 3696 | - sun4m_init(ram_size, vga_ram_size, boot_device, | ||
| 3697 | - ds, fd_filename, snapshot, | ||
| 3698 | - kernel_filename, kernel_cmdline, initrd_filename); | ||
| 3699 | -#endif | 3750 | + machine->init(ram_size, vga_ram_size, boot_device, |
| 3751 | + ds, fd_filename, snapshot, | ||
| 3752 | + kernel_filename, kernel_cmdline, initrd_filename); | ||
| 3700 | 3753 | ||
| 3701 | gui_timer = qemu_new_timer(rt_clock, gui_update, NULL); | 3754 | gui_timer = qemu_new_timer(rt_clock, gui_update, NULL); |
| 3702 | qemu_mod_timer(gui_timer, qemu_get_clock(rt_clock)); | 3755 | qemu_mod_timer(gui_timer, qemu_get_clock(rt_clock)); |