Commit aaed909a495e78364abc6812df672d2e764961a8

Authored by bellard
1 parent 7d77bf20

added cpu_model parameter to cpu_init()


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3562 c046a42c-6fe2-441c-8c8c-71466251a162
darwin-user/main.c
... ... @@ -785,6 +785,7 @@ int main(int argc, char **argv)
785 785 int optind;
786 786 short use_gdbstub = 0;
787 787 const char *r;
  788 + const char *cpu_model;
788 789  
789 790 if (argc <= 1)
790 791 usage();
... ... @@ -855,7 +856,15 @@ int main(int argc, char **argv)
855 856  
856 857 /* NOTE: we need to init the CPU at this stage to get
857 858 qemu_host_page_size */
858   - env = cpu_init();
  859 +#if defined(TARGET_I386)
  860 + cpu_model = "qemu32";
  861 +#elif defined(TARGET_PPC)
  862 + cpu_model = "750";
  863 +#else
  864 +#error unsupported CPU
  865 +#endif
  866 +
  867 + env = cpu_init(cpu_model);
859 868  
860 869 printf("Starting %s with qemu\n----------------\n", filename);
861 870  
... ...
... ... @@ -1314,6 +1314,8 @@ void cpu_abort(CPUState *env, const char *fmt, ...)
1314 1314  
1315 1315 CPUState *cpu_copy(CPUState *env)
1316 1316 {
  1317 +#if 0
  1318 + /* XXX: broken, must be handled by each CPU */
1317 1319 CPUState *new_env = cpu_init();
1318 1320 /* preserve chaining and index */
1319 1321 CPUState *next_cpu = new_env->next_cpu;
... ... @@ -1322,6 +1324,9 @@ CPUState *cpu_copy(CPUState *env)
1322 1324 new_env->next_cpu = next_cpu;
1323 1325 new_env->cpu_index = cpu_index;
1324 1326 return new_env;
  1327 +#else
  1328 + return NULL;
  1329 +#endif
1325 1330 }
1326 1331  
1327 1332 #if !defined(CONFIG_USER_ONLY)
... ...
hw/an5206.c
... ... @@ -37,10 +37,10 @@ static void an5206_init(int ram_size, int vga_ram_size, const char *boot_device,
37 37 uint64_t elf_entry;
38 38 target_ulong entry;
39 39  
40   - env = cpu_init();
41 40 if (!cpu_model)
42 41 cpu_model = "m5206";
43   - if (cpu_m68k_set_model(env, cpu_model)) {
  42 + env = cpu_init(cpu_model);
  43 + if (!env) {
44 44 cpu_abort(env, "Unable to find m68k CPU definition\n");
45 45 }
46 46  
... ...
hw/etraxfs.c
... ... @@ -121,7 +121,7 @@ void bareetraxfs_init (int ram_size, int vga_ram_size, const char *boot_device,
121 121 if (cpu_model == NULL) {
122 122 cpu_model = "crisv32";
123 123 }
124   - env = cpu_init();
  124 + env = cpu_init(cpu_model);
125 125 /* register_savevm("cpu", 0, 3, cpu_save, cpu_load, env); */
126 126 qemu_register_reset(main_cpu_reset, env);
127 127 irqs = qemu_allocate_irqs(dummy_cpu_set_irq, env, 32);
... ...
hw/integratorcp.c
... ... @@ -473,10 +473,13 @@ static void integratorcp_init(int ram_size, int vga_ram_size,
473 473 qemu_irq *pic;
474 474 qemu_irq *cpu_pic;
475 475  
476   - env = cpu_init();
477 476 if (!cpu_model)
478 477 cpu_model = "arm926";
479   - cpu_arm_set_model(env, cpu_model);
  478 + env = cpu_init(cpu_model);
  479 + if (!env) {
  480 + fprintf(stderr, "Unable to find CPU definition\n");
  481 + exit(1);
  482 + }
480 483 bios_offset = ram_size + vga_ram_size;
481 484 /* ??? On a real system the first 1Mb is mapped as SSRAM or boot flash. */
482 485 /* ??? RAM shoud repeat to fill physical memory space. */
... ...
hw/mcf5208.c
... ... @@ -209,11 +209,12 @@ static void mcf5208evb_init(int ram_size, int vga_ram_size,
209 209 target_ulong entry;
210 210 qemu_irq *pic;
211 211  
212   - env = cpu_init();
213 212 if (!cpu_model)
214 213 cpu_model = "m5208";
215   - if (cpu_m68k_set_model(env, cpu_model)) {
216   - cpu_abort(env, "Unable to find m68k CPU definition\n");
  214 + env = cpu_init(cpu_model);
  215 + if (!env) {
  216 + fprintf(stderr, "Unable to find m68k CPU definition\n");
  217 + exit(1);
217 218 }
218 219  
219 220 /* Initialize CPU registers. */
... ...
hw/mips_malta.c
... ... @@ -735,7 +735,6 @@ static void main_cpu_reset(void *opaque)
735 735 {
736 736 CPUState *env = opaque;
737 737 cpu_reset(env);
738   - cpu_mips_register(env, NULL);
739 738  
740 739 /* The bootload does not need to be rewritten as it is located in a
741 740 read only location. The kernel location and the arguments table
... ... @@ -761,7 +760,6 @@ void mips_malta_init (int ram_size, int vga_ram_size, const char *boot_device,
761 760 /* fdctrl_t *floppy_controller; */
762 761 MaltaFPGAState *malta_fpga;
763 762 int ret;
764   - mips_def_t *def;
765 763 qemu_irq *i8259;
766 764 int piix4_devfn;
767 765 uint8_t *eeprom_buf;
... ... @@ -776,10 +774,11 @@ void mips_malta_init (int ram_size, int vga_ram_size, const char *boot_device,
776 774 cpu_model = "24Kf";
777 775 #endif
778 776 }
779   - if (mips_find_by_name(cpu_model, &def) != 0)
780   - def = NULL;
781   - env = cpu_init();
782   - cpu_mips_register(env, def);
  777 + env = cpu_init(cpu_model);
  778 + if (!env) {
  779 + fprintf(stderr, "Unable to find CPU definition\n");
  780 + exit(1);
  781 + }
783 782 register_savevm("cpu", 0, 3, cpu_save, cpu_load, env);
784 783 qemu_register_reset(main_cpu_reset, env);
785 784  
... ...
hw/mips_mipssim.c
... ... @@ -94,7 +94,6 @@ static void main_cpu_reset(void *opaque)
94 94 {
95 95 CPUState *env = opaque;
96 96 cpu_reset(env);
97   - cpu_mips_register(env, NULL);
98 97  
99 98 if (loaderparams.kernel_filename)
100 99 load_kernel (env);
... ... @@ -120,10 +119,11 @@ mips_mipssim_init (int ram_size, int vga_ram_size, const char *boot_device,
120 119 cpu_model = "24Kf";
121 120 #endif
122 121 }
123   - if (mips_find_by_name(cpu_model, &def) != 0)
124   - def = NULL;
125   - env = cpu_init();
126   - cpu_mips_register(env, def);
  122 + env = cpu_init(cpu_model);
  123 + if (!env) {
  124 + fprintf(stderr, "Unable to find CPU definition\n");
  125 + exit(1);
  126 + }
127 127 register_savevm("cpu", 0, 3, cpu_save, cpu_load, env);
128 128 qemu_register_reset(main_cpu_reset, env);
129 129  
... ...
hw/mips_pica61.c
... ... @@ -51,7 +51,6 @@ static void main_cpu_reset(void *opaque)
51 51 {
52 52 CPUState *env = opaque;
53 53 cpu_reset(env);
54   - cpu_mips_register(env, NULL);
55 54 }
56 55  
57 56 static
... ... @@ -78,10 +77,11 @@ void mips_pica61_init (int ram_size, int vga_ram_size, const char *boot_device,
78 77 cpu_model = "24Kf";
79 78 #endif
80 79 }
81   - if (mips_find_by_name(cpu_model, &def) != 0)
82   - def = NULL;
83   - env = cpu_init();
84   - cpu_mips_register(env, def);
  80 + env = cpu_init(cpu_model);
  81 + if (!env) {
  82 + fprintf(stderr, "Unable to find CPU definition\n");
  83 + exit(1);
  84 + }
85 85 register_savevm("cpu", 0, 3, cpu_save, cpu_load, env);
86 86 qemu_register_reset(main_cpu_reset, env);
87 87  
... ...
hw/mips_r4k.c
... ... @@ -135,7 +135,6 @@ static void main_cpu_reset(void *opaque)
135 135 {
136 136 CPUState *env = opaque;
137 137 cpu_reset(env);
138   - cpu_mips_register(env, NULL);
139 138  
140 139 if (loaderparams.kernel_filename)
141 140 load_kernel (env);
... ... @@ -164,10 +163,11 @@ void mips_r4k_init (int ram_size, int vga_ram_size, const char *boot_device,
164 163 cpu_model = "24Kf";
165 164 #endif
166 165 }
167   - if (mips_find_by_name(cpu_model, &def) != 0)
168   - def = NULL;
169   - env = cpu_init();
170   - cpu_mips_register(env, def);
  166 + env = cpu_init(cpu_model);
  167 + if (!env) {
  168 + fprintf(stderr, "Unable to find CPU definition\n");
  169 + exit(1);
  170 + }
171 171 register_savevm("cpu", 0, 3, cpu_save, cpu_load, env);
172 172 qemu_register_reset(main_cpu_reset, env);
173 173  
... ...
hw/omap.c
... ... @@ -4620,15 +4620,20 @@ struct omap_mpu_state_s *omap310_mpu_init(unsigned long sdram_size,
4620 4620 struct omap_mpu_state_s *s = (struct omap_mpu_state_s *)
4621 4621 qemu_mallocz(sizeof(struct omap_mpu_state_s));
4622 4622 ram_addr_t imif_base, emiff_base;
  4623 +
  4624 + if (!core)
  4625 + core = "ti925t";
4623 4626  
4624 4627 /* Core */
4625 4628 s->mpu_model = omap310;
4626   - s->env = cpu_init();
  4629 + s->env = cpu_init(core);
  4630 + if (!s->env) {
  4631 + fprintf(stderr, "Unable to find CPU definition\n");
  4632 + exit(1);
  4633 + }
4627 4634 s->sdram_size = sdram_size;
4628 4635 s->sram_size = OMAP15XX_SRAM_SIZE;
4629 4636  
4630   - cpu_arm_set_model(s->env, core ?: "ti925t");
4631   -
4632 4637 s->wakeup = qemu_allocate_irqs(omap_mpu_wakeup, s, 1)[0];
4633 4638  
4634 4639 /* Clocks */
... ...
... ... @@ -700,12 +700,12 @@ static void pc_init1(int ram_size, int vga_ram_size, const char *boot_device,
700 700 #endif
701 701 }
702 702  
703   - if (x86_find_cpu_by_name(cpu_model)) {
704   - fprintf(stderr, "Unable to find x86 CPU definition\n");
705   - exit(1);
706   - }
707 703 for(i = 0; i < smp_cpus; i++) {
708   - env = cpu_init();
  704 + env = cpu_init(cpu_model);
  705 + if (!env) {
  706 + fprintf(stderr, "Unable to find x86 CPU definition\n");
  707 + exit(1);
  708 + }
709 709 if (i != 0)
710 710 env->hflags |= HF_HALTED_MASK;
711 711 if (smp_cpus > 1) {
... ...
hw/ppc4xx_devs.c
... ... @@ -37,17 +37,14 @@ CPUState *ppc4xx_init (const unsigned char *cpu_model,
37 37 uint32_t sysclk)
38 38 {
39 39 CPUState *env;
40   - ppc_def_t *def;
41 40  
42 41 /* init CPUs */
43   - env = cpu_init();
44   - ppc_find_by_name(cpu_model, &def);
45   - if (def == NULL) {
46   - cpu_abort(env, "Unable to find PowerPC %s CPU definition\n",
47   - cpu_model);
  42 + env = cpu_init(cpu_model);
  43 + if (!env) {
  44 + fprintf(stderr, "Unable to find PowerPC %s CPU definition\n",
  45 + cpu_model);
  46 + exit(1);
48 47 }
49   - cpu_ppc_register(env, def);
50   - cpu_ppc_reset(env);
51 48 cpu_clk->cb = NULL; /* We don't care about CPU clock frequency changes */
52 49 cpu_clk->opaque = env;
53 50 /* Set time-base frequency to sysclk */
... ...
hw/ppc_chrp.c
... ... @@ -56,14 +56,13 @@ static void ppc_core99_init (int ram_size, int vga_ram_size,
56 56 const char *initrd_filename,
57 57 const char *cpu_model)
58 58 {
59   - CPUState *env, *envs[MAX_CPUS];
  59 + CPUState *env = NULL, *envs[MAX_CPUS];
60 60 char buf[1024];
61 61 qemu_irq *pic, **openpic_irqs;
62 62 int unin_memory;
63 63 int linux_boot, i;
64 64 unsigned long bios_offset, vga_bios_offset;
65 65 uint32_t kernel_base, kernel_size, initrd_base, initrd_size;
66   - ppc_def_t *def;
67 66 PCIBus *pci_bus;
68 67 nvram_t nvram;
69 68 #if 0
... ... @@ -80,16 +79,14 @@ static void ppc_core99_init (int ram_size, int vga_ram_size,
80 79 linux_boot = (kernel_filename != NULL);
81 80  
82 81 /* init CPUs */
83   - env = cpu_init();
84 82 if (cpu_model == NULL)
85 83 cpu_model = "default";
86   - ppc_find_by_name(cpu_model, &def);
87   - if (def == NULL) {
88   - cpu_abort(env, "Unable to find PowerPC CPU definition\n");
89   - }
90 84 for (i = 0; i < smp_cpus; i++) {
91   - cpu_ppc_register(env, def);
92   - cpu_ppc_reset(env);
  85 + env = cpu_init(cpu_model);
  86 + if (!env) {
  87 + fprintf(stderr, "Unable to find PowerPC CPU definition\n");
  88 + exit(1);
  89 + }
93 90 /* Set time-base frequency to 100 Mhz */
94 91 cpu_ppc_tb_init(env, 100UL * 1000UL * 1000UL);
95 92 #if 0
... ...
hw/ppc_oldworld.c
... ... @@ -100,7 +100,7 @@ static void ppc_heathrow_init (int ram_size, int vga_ram_size,
100 100 const char *initrd_filename,
101 101 const char *cpu_model)
102 102 {
103   - CPUState *env, *envs[MAX_CPUS];
  103 + CPUState *env = NULL, *envs[MAX_CPUS];
104 104 char buf[1024];
105 105 qemu_irq *pic, **heathrow_irqs;
106 106 nvram_t nvram;
... ... @@ -108,7 +108,6 @@ static void ppc_heathrow_init (int ram_size, int vga_ram_size,
108 108 int linux_boot, i;
109 109 unsigned long bios_offset, vga_bios_offset;
110 110 uint32_t kernel_base, kernel_size, initrd_base, initrd_size;
111   - ppc_def_t *def;
112 111 PCIBus *pci_bus;
113 112 MacIONVRAMState *nvr;
114 113 int vga_bios_size, bios_size;
... ... @@ -119,16 +118,14 @@ static void ppc_heathrow_init (int ram_size, int vga_ram_size,
119 118 linux_boot = (kernel_filename != NULL);
120 119  
121 120 /* init CPUs */
122   - env = cpu_init();
123 121 if (cpu_model == NULL)
124 122 cpu_model = "default";
125   - ppc_find_by_name(cpu_model, &def);
126   - if (def == NULL) {
127   - cpu_abort(env, "Unable to find PowerPC CPU definition\n");
128   - }
129 123 for (i = 0; i < smp_cpus; i++) {
130   - cpu_ppc_register(env, def);
131   - cpu_ppc_reset(env);
  124 + env = cpu_init(cpu_model);
  125 + if (!env) {
  126 + fprintf(stderr, "Unable to find PowerPC CPU definition\n");
  127 + exit(1);
  128 + }
132 129 /* Set time-base frequency to 100 Mhz */
133 130 cpu_ppc_tb_init(env, 100UL * 1000UL * 1000UL);
134 131 env->osi_call = vga_osi_call;
... ...
hw/ppc_prep.c
... ... @@ -536,7 +536,6 @@ static void ppc_prep_init (int ram_size, int vga_ram_size, const char *boot_devi
536 536 int linux_boot, i, nb_nics1, bios_size;
537 537 unsigned long bios_offset;
538 538 uint32_t kernel_base, kernel_size, initrd_base, initrd_size;
539   - ppc_def_t *def;
540 539 PCIBus *pci_bus;
541 540 qemu_irq *i8259;
542 541 int ppc_boot_device = boot_device[0];
... ... @@ -548,16 +547,14 @@ static void ppc_prep_init (int ram_size, int vga_ram_size, const char *boot_devi
548 547 linux_boot = (kernel_filename != NULL);
549 548  
550 549 /* init CPUs */
551   - env = cpu_init();
552 550 if (cpu_model == NULL)
553 551 cpu_model = "default";
554   - ppc_find_by_name(cpu_model, &def);
555   - if (def == NULL) {
556   - cpu_abort(env, "Unable to find PowerPC CPU definition\n");
557   - }
558 552 for (i = 0; i < smp_cpus; i++) {
559   - cpu_ppc_register(env, def);
560   - cpu_ppc_reset(env);
  553 + env = cpu_init(cpu_model);
  554 + if (!env) {
  555 + fprintf(stderr, "Unable to find PowerPC CPU definition\n");
  556 + exit(1);
  557 + }
561 558 /* Set time-base frequency to 100 Mhz */
562 559 cpu_ppc_tb_init(env, 100UL * 1000UL * 1000UL);
563 560 qemu_register_reset(&cpu_ppc_reset, env);
... ...
hw/pxa2xx.c
... ... @@ -2023,9 +2023,14 @@ struct pxa2xx_state_s *pxa270_init(unsigned int sdram_size,
2023 2023 fprintf(stderr, "Machine requires a PXA27x processor.\n");
2024 2024 exit(1);
2025 2025 }
2026   -
2027   - s->env = cpu_init();
2028   - cpu_arm_set_model(s->env, revision ?: "pxa270");
  2026 + if (!revision)
  2027 + revision = "pxa270";
  2028 +
  2029 + s->env = cpu_init(revision);
  2030 + if (!s->env) {
  2031 + fprintf(stderr, "Unable to find CPU definition\n");
  2032 + exit(1);
  2033 + }
2029 2034 register_savevm("cpu", 0, 0, cpu_save, cpu_load, s->env);
2030 2035  
2031 2036 /* SDRAM & Internal Memory Storage */
... ... @@ -2132,10 +2137,14 @@ struct pxa2xx_state_s *pxa255_init(unsigned int sdram_size,
2132 2137 struct pxa2xx_state_s *s;
2133 2138 struct pxa2xx_ssp_s *ssp;
2134 2139 int iomemtype, i;
  2140 +
2135 2141 s = (struct pxa2xx_state_s *) qemu_mallocz(sizeof(struct pxa2xx_state_s));
2136 2142  
2137   - s->env = cpu_init();
2138   - cpu_arm_set_model(s->env, "pxa255");
  2143 + s->env = cpu_init("pxa255");
  2144 + if (!s->env) {
  2145 + fprintf(stderr, "Unable to find CPU definition\n");
  2146 + exit(1);
  2147 + }
2139 2148 register_savevm("cpu", 0, 0, cpu_save, cpu_load, s->env);
2140 2149  
2141 2150 /* SDRAM & Internal Memory Storage */
... ...
hw/r2d.c
... ... @@ -35,7 +35,14 @@ static void r2d_init(int ram_size, int vga_ram_size, const char *boot_device,
35 35 CPUState *env;
36 36 struct SH7750State *s;
37 37  
38   - env = cpu_init();
  38 + if (!cpu_model)
  39 + cpu_model = "any";
  40 +
  41 + env = cpu_init(cpu_model);
  42 + if (!env) {
  43 + fprintf(stderr, "Unable to find CPU definition\n");
  44 + exit(1);
  45 + }
39 46  
40 47 /* Allocate memory space */
41 48 cpu_register_physical_memory(SDRAM_BASE, SDRAM_SIZE, 0);
... ...
hw/realview.c
... ... @@ -26,10 +26,14 @@ static void realview_init(int ram_size, int vga_ram_size,
26 26 int n;
27 27 int done_smc = 0;
28 28  
29   - env = cpu_init();
30 29 if (!cpu_model)
31 30 cpu_model = "arm926";
32   - cpu_arm_set_model(env, cpu_model);
  31 + env = cpu_init(cpu_model);
  32 + if (!env) {
  33 + fprintf(stderr, "Unable to find CPU definition\n");
  34 + exit(1);
  35 + }
  36 +
33 37 /* ??? RAM shoud repeat to fill physical memory space. */
34 38 /* SDRAM at address zero. */
35 39 cpu_register_physical_memory(0, ram_size, IO_MEM_RAM);
... ...
hw/shix.c
... ... @@ -70,9 +70,12 @@ static void shix_init(int ram_size, int vga_ram_size, const char *boot_device,
70 70 int ret;
71 71 CPUState *env;
72 72 struct SH7750State *s;
  73 +
  74 + if (!cpu_model)
  75 + cpu_model = "any";
73 76  
74 77 printf("Initializing CPU\n");
75   - env = cpu_init();
  78 + env = cpu_init(cpu_model);
76 79  
77 80 /* Allocate memory space */
78 81 printf("Allocating ROM\n");
... ...
hw/sun4m.c
... ... @@ -313,21 +313,19 @@ static void *sun4m_hw_init(const struct hwdef *hwdef, int RAM_size,
313 313 CPUState *env, *envs[MAX_CPUS];
314 314 unsigned int i;
315 315 void *iommu, *espdma, *ledma, *main_esp, *nvram;
316   - const sparc_def_t *def;
317 316 qemu_irq *cpu_irqs[MAX_CPUS], *slavio_irq, *slavio_cpu_irq,
318 317 *espdma_irq, *ledma_irq;
319 318 qemu_irq *esp_reset, *le_reset;
320 319  
321 320 /* init CPUs */
322   - sparc_find_by_name(cpu_model, &def);
323   - if (def == NULL) {
324   - fprintf(stderr, "Unable to find Sparc CPU definition\n");
325   - exit(1);
326   - }
327 321  
328 322 for(i = 0; i < smp_cpus; i++) {
329   - env = cpu_init();
330   - cpu_sparc_register(env, def, i);
  323 + env = cpu_init(cpu_model);
  324 + if (!env) {
  325 + fprintf(stderr, "Unable to find Sparc CPU definition\n");
  326 + exit(1);
  327 + }
  328 + cpu_sparc_set_id(env, i);
331 329 envs[i] = env;
332 330 if (i == 0) {
333 331 qemu_register_reset(main_cpu_reset, env);
... ...
hw/sun4u.c
... ... @@ -343,7 +343,6 @@ static void sun4u_init(int ram_size, int vga_ram_size, const char *boot_device,
343 343 unsigned int i;
344 344 long prom_offset, initrd_size, kernel_size;
345 345 PCIBus *pci_bus;
346   - const sparc_def_t *def;
347 346 QEMUBH *bh;
348 347 qemu_irq *irq;
349 348  
... ... @@ -352,13 +351,11 @@ static void sun4u_init(int ram_size, int vga_ram_size, const char *boot_device,
352 351 /* init CPUs */
353 352 if (cpu_model == NULL)
354 353 cpu_model = "TI UltraSparc II";
355   - sparc_find_by_name(cpu_model, &def);
356   - if (def == NULL) {
  354 + env = cpu_init(cpu_model);
  355 + if (!env) {
357 356 fprintf(stderr, "Unable to find Sparc CPU definition\n");
358 357 exit(1);
359 358 }
360   - env = cpu_init();
361   - cpu_sparc_register(env, def, 0);
362 359 bh = qemu_bh_new(tick_irq, env);
363 360 env->tick = ptimer_init(bh);
364 361 ptimer_set_period(env->tick, 1ULL);
... ...
hw/versatilepb.c
... ... @@ -167,10 +167,13 @@ static void versatile_init(int ram_size, int vga_ram_size,
167 167 int n;
168 168 int done_smc = 0;
169 169  
170   - env = cpu_init();
171 170 if (!cpu_model)
172 171 cpu_model = "arm926";
173   - cpu_arm_set_model(env, cpu_model);
  172 + env = cpu_init(cpu_model);
  173 + if (!env) {
  174 + fprintf(stderr, "Unable to find CPU definition\n");
  175 + exit(1);
  176 + }
174 177 /* ??? RAM shoud repeat to fill physical memory space. */
175 178 /* SDRAM at address zero. */
176 179 cpu_register_physical_memory(0, ram_size, IO_MEM_RAM);
... ...
linux-user/main.c
... ... @@ -1970,26 +1970,42 @@ int main(int argc, char **argv)
1970 1970 /* Scan interp_prefix dir for replacement files. */
1971 1971 init_paths(interp_prefix);
1972 1972  
1973   -#if defined(TARGET_I386)
1974   - /* must be done before cpu_init() for x86 XXX: suppress this hack
1975   - by adding a new parameter to cpu_init and by suppressing
1976   - cpu_xxx_register() */
1977 1973 if (cpu_model == NULL) {
  1974 +#if defined(TARGET_I386)
1978 1975 #ifdef TARGET_X86_64
1979 1976 cpu_model = "qemu64";
1980 1977 #else
1981 1978 cpu_model = "qemu32";
1982 1979 #endif
1983   - }
1984   - if (x86_find_cpu_by_name(cpu_model)) {
1985   - fprintf(stderr, "Unable to find x86 CPU definition\n");
1986   - exit(1);
1987   - }
  1980 +#elif defined(TARGET_ARM)
  1981 + cpu_model = "arm926";
  1982 +#elif defined(TARGET_M68K)
  1983 + cpu_model = "any";
  1984 +#elif defined(TARGET_SPARC)
  1985 +#ifdef TARGET_SPARC64
  1986 + cpu_model = "TI UltraSparc II";
  1987 +#else
  1988 + cpu_model = "Fujitsu MB86904";
1988 1989 #endif
1989   -
  1990 +#elif defined(TARGET_MIPS)
  1991 +#if defined(TARGET_ABI_MIPSN32) || defined(TARGET_ABI_MIPSN64)
  1992 + cpu_model = "20Kc";
  1993 +#else
  1994 + cpu_model = "24Kf";
  1995 +#endif
  1996 +#elif defined(TARGET_PPC)
  1997 + cpu_model = "750";
  1998 +#else
  1999 + cpu_model = "any";
  2000 +#endif
  2001 + }
1990 2002 /* NOTE: we need to init the CPU at this stage to get
1991 2003 qemu_host_page_size */
1992   - env = cpu_init();
  2004 + env = cpu_init(cpu_model);
  2005 + if (!env) {
  2006 + fprintf(stderr, "Unable to find CPU definition\n");
  2007 + exit(1);
  2008 + }
1993 2009 global_env = env;
1994 2010  
1995 2011 if(getenv("QEMU_STRACE") ){
... ... @@ -2130,9 +2146,6 @@ int main(int argc, char **argv)
2130 2146 #elif defined(TARGET_ARM)
2131 2147 {
2132 2148 int i;
2133   - if (cpu_model == NULL)
2134   - cpu_model = "arm926";
2135   - cpu_arm_set_model(env, cpu_model);
2136 2149 cpsr_write(env, regs->uregs[16], 0xffffffff);
2137 2150 for(i = 0; i < 16; i++) {
2138 2151 env->regs[i] = regs->uregs[i];
... ... @@ -2141,20 +2154,6 @@ int main(int argc, char **argv)
2141 2154 #elif defined(TARGET_SPARC)
2142 2155 {
2143 2156 int i;
2144   - const sparc_def_t *def;
2145   -#ifdef TARGET_SPARC64
2146   - if (cpu_model == NULL)
2147   - cpu_model = "TI UltraSparc II";
2148   -#else
2149   - if (cpu_model == NULL)
2150   - cpu_model = "Fujitsu MB86904";
2151   -#endif
2152   - sparc_find_by_name(cpu_model, &def);
2153   - if (def == NULL) {
2154   - fprintf(stderr, "Unable to find Sparc CPU definition\n");
2155   - exit(1);
2156   - }
2157   - cpu_sparc_register(env, def, 0);
2158 2157 env->pc = regs->pc;
2159 2158 env->npc = regs->npc;
2160 2159 env->y = regs->y;
... ... @@ -2165,19 +2164,8 @@ int main(int argc, char **argv)
2165 2164 }
2166 2165 #elif defined(TARGET_PPC)
2167 2166 {
2168   - ppc_def_t *def;
2169 2167 int i;
2170 2168  
2171   - /* Choose and initialise CPU */
2172   - if (cpu_model == NULL)
2173   - cpu_model = "750";
2174   - ppc_find_by_name(cpu_model, &def);
2175   - if (def == NULL) {
2176   - cpu_abort(env,
2177   - "Unable to find PowerPC CPU definition\n");
2178   - }
2179   - cpu_ppc_register(env, def);
2180   - cpu_ppc_reset(env);
2181 2169 #if defined(TARGET_PPC64)
2182 2170 #if defined(TARGET_ABI32)
2183 2171 env->msr &= ~((target_ulong)1 << MSR_SF);
... ... @@ -2192,12 +2180,6 @@ int main(int argc, char **argv)
2192 2180 }
2193 2181 #elif defined(TARGET_M68K)
2194 2182 {
2195   - if (cpu_model == NULL)
2196   - cpu_model = "any";
2197   - if (cpu_m68k_set_model(env, cpu_model)) {
2198   - cpu_abort(cpu_single_env,
2199   - "Unable to find m68k CPU definition\n");
2200   - }
2201 2183 env->pc = regs->pc;
2202 2184 env->dregs[0] = regs->d0;
2203 2185 env->dregs[1] = regs->d1;
... ... @@ -2220,21 +2202,8 @@ int main(int argc, char **argv)
2220 2202 }
2221 2203 #elif defined(TARGET_MIPS)
2222 2204 {
2223   - mips_def_t *def;
2224 2205 int i;
2225 2206  
2226   - /* Choose and initialise CPU */
2227   - if (cpu_model == NULL)
2228   -#if defined(TARGET_ABI_MIPSN32) || defined(TARGET_ABI_MIPSN64)
2229   - cpu_model = "20Kc";
2230   -#else
2231   - cpu_model = "24Kf";
2232   -#endif
2233   - mips_find_by_name(cpu_model, &def);
2234   - if (def == NULL)
2235   - cpu_abort(env, "Unable to find MIPS CPU definition\n");
2236   - cpu_mips_register(env, def);
2237   -
2238 2207 for(i = 0; i < 32; i++) {
2239 2208 env->gpr[i][env->current_tc] = regs->regs[i];
2240 2209 }
... ...
target-alpha/cpu.h
... ... @@ -396,7 +396,7 @@ enum {
396 396 IR_ZERO = 31,
397 397 };
398 398  
399   -CPUAlphaState * cpu_alpha_init (void);
  399 +CPUAlphaState * cpu_alpha_init (const char *cpu_model);
400 400 int cpu_alpha_exec(CPUAlphaState *s);
401 401 /* you can call this signal handler from your SIGBUS and SIGSEGV
402 402 signal handlers to inform the virtual CPU of exceptions. non zero
... ...
target-alpha/translate.c
... ... @@ -2095,7 +2095,7 @@ int gen_intermediate_code_pc (CPUState *env, struct TranslationBlock *tb)
2095 2095 return gen_intermediate_code_internal(env, tb, 1);
2096 2096 }
2097 2097  
2098   -CPUAlphaState * cpu_alpha_init (void)
  2098 +CPUAlphaState * cpu_alpha_init (const char *cpu_model)
2099 2099 {
2100 2100 CPUAlphaState *env;
2101 2101 uint64_t hwpcb;
... ... @@ -2133,3 +2133,4 @@ CPUAlphaState * cpu_alpha_init (void)
2133 2133  
2134 2134 return env;
2135 2135 }
  2136 +
... ...
target-arm/cpu.h
... ... @@ -164,7 +164,7 @@ typedef struct CPUARMState {
164 164 target_phys_addr_t loader_start;
165 165 } CPUARMState;
166 166  
167   -CPUARMState *cpu_arm_init(void);
  167 +CPUARMState *cpu_arm_init(const char *cpu_model);
168 168 int cpu_arm_exec(CPUARMState *s);
169 169 void cpu_arm_close(CPUARMState *s);
170 170 void do_interrupt(CPUARMState *);
... ... @@ -263,7 +263,6 @@ static inline int arm_feature(CPUARMState *env, int feature)
263 263 }
264 264  
265 265 void arm_cpu_list(FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...));
266   -void cpu_arm_set_model(CPUARMState *env, const char *name);
267 266  
268 267 void cpu_arm_set_cp_io(CPUARMState *env, int cpnum,
269 268 ARMReadCPFunc *cp_read, ARMWriteCPFunc *cp_write,
... ...
target-arm/helper.c
... ... @@ -5,6 +5,8 @@
5 5 #include "cpu.h"
6 6 #include "exec-all.h"
7 7  
  8 +static uint32_t cpu_arm_find_by_name(const char *name);
  9 +
8 10 static inline void set_feature(CPUARMState *env, int feature)
9 11 {
10 12 env->features |= 1u << feature;
... ... @@ -89,14 +91,19 @@ void cpu_reset(CPUARMState *env)
89 91 tlb_flush(env, 1);
90 92 }
91 93  
92   -CPUARMState *cpu_arm_init(void)
  94 +CPUARMState *cpu_arm_init(const char *cpu_model)
93 95 {
94 96 CPUARMState *env;
  97 + uint32_t id;
95 98  
  99 + id = cpu_arm_find_by_name(cpu_model);
  100 + if (id == 0)
  101 + return NULL;
96 102 env = qemu_mallocz(sizeof(CPUARMState));
97 103 if (!env)
98 104 return NULL;
99 105 cpu_exec_init(env);
  106 + env->cp15.c0_cpuid = id;
100 107 cpu_reset(env);
101 108 return env;
102 109 }
... ... @@ -136,24 +143,20 @@ void arm_cpu_list(FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
136 143 }
137 144 }
138 145  
139   -void cpu_arm_set_model(CPUARMState *env, const char *name)
  146 +/* return 0 if not found */
  147 +static uint32_t cpu_arm_find_by_name(const char *name)
140 148 {
141 149 int i;
142 150 uint32_t id;
143 151  
144 152 id = 0;
145   - i = 0;
146 153 for (i = 0; arm_cpu_names[i].name; i++) {
147 154 if (strcmp(name, arm_cpu_names[i].name) == 0) {
148 155 id = arm_cpu_names[i].id;
149 156 break;
150 157 }
151 158 }
152   - if (!id) {
153   - cpu_abort(env, "Unknown CPU '%s'", name);
154   - return;
155   - }
156   - cpu_reset_model_id(env, id);
  159 + return id;
157 160 }
158 161  
159 162 void cpu_arm_close(CPUARMState *env)
... ...
target-cris/cpu.h
... ... @@ -147,7 +147,7 @@ typedef struct CPUCRISState {
147 147 CPU_COMMON
148 148 } CPUCRISState;
149 149  
150   -CPUCRISState *cpu_cris_init(void);
  150 +CPUCRISState *cpu_cris_init(const char *cpu_model);
151 151 int cpu_cris_exec(CPUCRISState *s);
152 152 void cpu_cris_close(CPUCRISState *s);
153 153 void do_interrupt(CPUCRISState *env);
... ... @@ -201,10 +201,6 @@ enum {
201 201 #define CRIS_SSP 0
202 202 #define CRIS_USP 1
203 203  
204   -typedef struct cris_def_t cris_def_t;
205   -
206   -int cpu_cris_set_model(CPUCRISState *env, const char * name);
207   -
208 204 void cris_set_irq_level(CPUCRISState *env, int level, uint8_t vector);
209 205 void cris_set_macsr(CPUCRISState *env, uint32_t val);
210 206 void cris_switch_sp(CPUCRISState *env);
... ...
target-cris/translate.c
... ... @@ -2488,7 +2488,7 @@ void cpu_dump_state (CPUState *env, FILE *f,
2488 2488  
2489 2489 }
2490 2490  
2491   -CPUCRISState *cpu_cris_init (void)
  2491 +CPUCRISState *cpu_cris_init (const char *cpu_model)
2492 2492 {
2493 2493 CPUCRISState *env;
2494 2494  
... ...
target-i386/cpu.h
... ... @@ -585,10 +585,9 @@ typedef struct CPUX86State {
585 585 struct APICState *apic_state;
586 586 } CPUX86State;
587 587  
588   -CPUX86State *cpu_x86_init(void);
  588 +CPUX86State *cpu_x86_init(const char *cpu_model);
589 589 int cpu_x86_exec(CPUX86State *s);
590 590 void cpu_x86_close(CPUX86State *s);
591   -int x86_find_cpu_by_name (const unsigned char *name);
592 591 void x86_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt,
593 592 ...));
594 593 int cpu_get_pic_interrupt(CPUX86State *s);
... ...
target-i386/helper2.c
... ... @@ -31,9 +31,7 @@
31 31  
32 32 //#define DEBUG_MMU
33 33  
34   -static struct x86_def_t *x86_cpu_def;
35   -typedef struct x86_def_t x86_def_t;
36   -static int cpu_x86_register (CPUX86State *env, const x86_def_t *def);
  34 +static int cpu_x86_register (CPUX86State *env, const char *cpu_model);
37 35  
38 36 static void add_flagname_to_bitmaps(char *flagname, uint32_t *features,
39 37 uint32_t *ext_features,
... ... @@ -92,7 +90,7 @@ static void add_flagname_to_bitmaps(char *flagname, uint32_t *features,
92 90 fprintf(stderr, "CPU feature %s not found\n", flagname);
93 91 }
94 92  
95   -CPUX86State *cpu_x86_init(void)
  93 +CPUX86State *cpu_x86_init(const char *cpu_model)
96 94 {
97 95 CPUX86State *env;
98 96 static int inited;
... ... @@ -107,7 +105,10 @@ CPUX86State *cpu_x86_init(void)
107 105 inited = 1;
108 106 optimize_flags_init();
109 107 }
110   - cpu_x86_register(env, x86_cpu_def);
  108 + if (cpu_x86_register(env, cpu_model) < 0) {
  109 + cpu_x86_close(env);
  110 + return NULL;
  111 + }
111 112 cpu_reset(env);
112 113 #ifdef USE_KQEMU
113 114 kqemu_init(env);
... ... @@ -115,7 +116,7 @@ CPUX86State *cpu_x86_init(void)
115 116 return env;
116 117 }
117 118  
118   -struct x86_def_t {
  119 +typedef struct x86_def_t {
119 120 const char *name;
120 121 uint32_t vendor1, vendor2, vendor3;
121 122 int family;
... ... @@ -123,7 +124,7 @@ struct x86_def_t {
123 124 int stepping;
124 125 uint32_t features, ext_features, ext2_features, ext3_features;
125 126 uint32_t xlevel;
126   -};
  127 +} x86_def_t;
127 128  
128 129 #define PPRO_FEATURES (CPUID_FP87 | CPUID_DE | CPUID_PSE | CPUID_TSC | \
129 130 CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_PGE | CPUID_CMOV | \
... ... @@ -194,10 +195,10 @@ static x86_def_t x86_defs[] = {
194 195 },
195 196 };
196 197  
197   -int x86_find_cpu_by_name(const unsigned char *cpu_model)
  198 +static int cpu_x86_find_by_name(x86_def_t *x86_cpu_def, const char *cpu_model)
198 199 {
199   - int ret;
200 200 unsigned int i;
  201 + x86_def_t *def;
201 202  
202 203 char *s = strdup(cpu_model);
203 204 char *featurestr, *name = strtok(s, ",");
... ... @@ -205,17 +206,16 @@ int x86_find_cpu_by_name(const unsigned char *cpu_model)
205 206 uint32_t minus_features = 0, minus_ext_features = 0, minus_ext2_features = 0, minus_ext3_features = 0;
206 207 int family = -1, model = -1, stepping = -1;
207 208  
208   - ret = -1;
209   - x86_cpu_def = NULL;
  209 + def = NULL;
210 210 for (i = 0; i < sizeof(x86_defs) / sizeof(x86_def_t); i++) {
211 211 if (strcmp(name, x86_defs[i].name) == 0) {
212   - x86_cpu_def = &x86_defs[i];
213   - ret = 0;
  212 + def = &x86_defs[i];
214 213 break;
215 214 }
216 215 }
217   - if (!x86_cpu_def)
  216 + if (!def)
218 217 goto error;
  218 + memcpy(x86_cpu_def, def, sizeof(*def));
219 219  
220 220 featurestr = strtok(NULL, ",");
221 221  
... ... @@ -274,10 +274,12 @@ int x86_find_cpu_by_name(const unsigned char *cpu_model)
274 274 x86_cpu_def->ext_features &= ~minus_ext_features;
275 275 x86_cpu_def->ext2_features &= ~minus_ext2_features;
276 276 x86_cpu_def->ext3_features &= ~minus_ext3_features;
  277 + free(s);
  278 + return 0;
277 279  
278 280 error:
279 281 free(s);
280   - return ret;
  282 + return -1;
281 283 }
282 284  
283 285 void x86_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
... ... @@ -288,8 +290,12 @@ void x86_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
288 290 (*cpu_fprintf)(f, "x86 %16s\n", x86_defs[i].name);
289 291 }
290 292  
291   -int cpu_x86_register (CPUX86State *env, const x86_def_t *def)
  293 +static int cpu_x86_register (CPUX86State *env, const char *cpu_model)
292 294 {
  295 + x86_def_t def1, *def = &def1;
  296 +
  297 + if (cpu_x86_find_by_name(def, cpu_model) < 0)
  298 + return -1;
293 299 if (def->vendor1) {
294 300 env->cpuid_vendor1 = def->vendor1;
295 301 env->cpuid_vendor2 = def->vendor2;
... ...
target-m68k/cpu.h
... ... @@ -100,8 +100,6 @@ typedef struct CPUM68KState {
100 100 uint32_t rambar0;
101 101 uint32_t cacr;
102 102  
103   - uint32_t features;
104   -
105 103 /* ??? remove this. */
106 104 uint32_t t1;
107 105  
... ... @@ -118,9 +116,11 @@ typedef struct CPUM68KState {
118 116 uint32_t qregs[MAX_QREGS];
119 117  
120 118 CPU_COMMON
  119 +
  120 + uint32_t features;
121 121 } CPUM68KState;
122 122  
123   -CPUM68KState *cpu_m68k_init(void);
  123 +CPUM68KState *cpu_m68k_init(const char *cpu_model);
124 124 int cpu_m68k_exec(CPUM68KState *s);
125 125 void cpu_m68k_close(CPUM68KState *s);
126 126 void do_interrupt(int is_hw);
... ... @@ -174,10 +174,6 @@ enum {
174 174 #define MACSR_V 0x002
175 175 #define MACSR_EV 0x001
176 176  
177   -typedef struct m68k_def_t m68k_def_t;
178   -
179   -int cpu_m68k_set_model(CPUM68KState *env, const char * name);
180   -
181 177 void m68k_set_irq_level(CPUM68KState *env, int level, uint8_t vector);
182 178 void m68k_set_macsr(CPUM68KState *env, uint32_t val);
183 179 void m68k_switch_sp(CPUM68KState *env);
... ...
target-m68k/helper.c
... ... @@ -33,6 +33,8 @@ enum m68k_cpuid {
33 33 M68K_CPUID_ANY,
34 34 };
35 35  
  36 +typedef struct m68k_def_t m68k_def_t;
  37 +
36 38 struct m68k_def_t {
37 39 const char * name;
38 40 enum m68k_cpuid id;
... ... @@ -51,7 +53,7 @@ static void m68k_set_feature(CPUM68KState *env, int feature)
51 53 env->features |= (1u << feature);
52 54 }
53 55  
54   -int cpu_m68k_set_model(CPUM68KState *env, const char * name)
  56 +static int cpu_m68k_set_model(CPUM68KState *env, const char *name)
55 57 {
56 58 m68k_def_t *def;
57 59  
... ... @@ -60,7 +62,7 @@ int cpu_m68k_set_model(CPUM68KState *env, const char * name)
60 62 break;
61 63 }
62 64 if (!def->name)
63   - return 1;
  65 + return -1;
64 66  
65 67 switch (def->id) {
66 68 case M68K_CPUID_M5206:
... ... @@ -98,8 +100,43 @@ int cpu_m68k_set_model(CPUM68KState *env, const char * name)
98 100 }
99 101  
100 102 register_m68k_insns(env);
  103 +}
  104 +
  105 +void cpu_reset(CPUM68KState *env)
  106 +{
  107 + memset(env, 0, offsetof(CPUM68KState, breakpoints));
  108 +#if !defined (CONFIG_USER_ONLY)
  109 + env->sr = 0x2700;
  110 +#endif
  111 + m68k_switch_sp(env);
  112 + /* ??? FP regs should be initialized to NaN. */
  113 + env->cc_op = CC_OP_FLAGS;
  114 + /* TODO: We should set PC from the interrupt vector. */
  115 + env->pc = 0;
  116 + tlb_flush(env, 1);
  117 +}
101 118  
102   - return 0;
  119 +CPUM68KState *cpu_m68k_init(const char *cpu_model)
  120 +{
  121 + CPUM68KState *env;
  122 +
  123 + env = malloc(sizeof(CPUM68KState));
  124 + if (!env)
  125 + return NULL;
  126 + cpu_exec_init(env);
  127 +
  128 + if (cpu_m68k_set_model(env, cpu_model) < 0) {
  129 + cpu_m68k_close(env);
  130 + return NULL;
  131 + }
  132 +
  133 + cpu_reset(env);
  134 + return env;
  135 +}
  136 +
  137 +void cpu_m68k_close(CPUM68KState *env)
  138 +{
  139 + qemu_free(env);
103 140 }
104 141  
105 142 void cpu_m68k_flush_flags(CPUM68KState *env, int cc_op)
... ...
target-m68k/translate.c
... ... @@ -3279,38 +3279,6 @@ int gen_intermediate_code_pc(CPUState *env, TranslationBlock *tb)
3279 3279 return gen_intermediate_code_internal(env, tb, 1);
3280 3280 }
3281 3281  
3282   -void cpu_reset(CPUM68KState *env)
3283   -{
3284   - memset(env, 0, offsetof(CPUM68KState, breakpoints));
3285   -#if !defined (CONFIG_USER_ONLY)
3286   - env->sr = 0x2700;
3287   -#endif
3288   - m68k_switch_sp(env);
3289   - /* ??? FP regs should be initialized to NaN. */
3290   - env->cc_op = CC_OP_FLAGS;
3291   - /* TODO: We should set PC from the interrupt vector. */
3292   - env->pc = 0;
3293   - tlb_flush(env, 1);
3294   -}
3295   -
3296   -CPUM68KState *cpu_m68k_init(void)
3297   -{
3298   - CPUM68KState *env;
3299   -
3300   - env = malloc(sizeof(CPUM68KState));
3301   - if (!env)
3302   - return NULL;
3303   - cpu_exec_init(env);
3304   -
3305   - cpu_reset(env);
3306   - return env;
3307   -}
3308   -
3309   -void cpu_m68k_close(CPUM68KState *env)
3310   -{
3311   - free(env);
3312   -}
3313   -
3314 3282 void cpu_dump_state(CPUState *env, FILE *f,
3315 3283 int (*cpu_fprintf)(FILE *f, const char *fmt, ...),
3316 3284 int flags)
... ...
target-mips/cpu.h
... ... @@ -456,7 +456,7 @@ struct CPUMIPSState {
456 456  
457 457 CPU_COMMON
458 458  
459   - mips_def_t *cpu_model;
  459 + const mips_def_t *cpu_model;
460 460 #ifndef CONFIG_USER_ONLY
461 461 void *irq[8];
462 462 #endif
... ... @@ -474,9 +474,7 @@ void r4k_do_tlbwi (void);
474 474 void r4k_do_tlbwr (void);
475 475 void r4k_do_tlbp (void);
476 476 void r4k_do_tlbr (void);
477   -int mips_find_by_name (const unsigned char *name, mips_def_t **def);
478 477 void mips_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...));
479   -int cpu_mips_register (CPUMIPSState *env, mips_def_t *def);
480 478  
481 479 void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec,
482 480 int unused);
... ... @@ -560,7 +558,7 @@ enum {
560 558 };
561 559  
562 560 int cpu_mips_exec(CPUMIPSState *s);
563   -CPUMIPSState *cpu_mips_init(void);
  561 +CPUMIPSState *cpu_mips_init(const char *cpu_model);
564 562 uint32_t cpu_mips_get_clock (void);
565 563 int cpu_mips_signal_handler(int host_signum, void *pinfo, void *puc);
566 564  
... ...
target-mips/translate.c
... ... @@ -6725,13 +6725,21 @@ void cpu_dump_state (CPUState *env, FILE *f,
6725 6725 #endif
6726 6726 }
6727 6727  
6728   -CPUMIPSState *cpu_mips_init (void)
  6728 +#include "translate_init.c"
  6729 +
  6730 +CPUMIPSState *cpu_mips_init (const char *cpu_model)
6729 6731 {
6730 6732 CPUMIPSState *env;
  6733 + const mips_def_t *def;
6731 6734  
  6735 + def = cpu_mips_find_by_name(cpu_model);
  6736 + if (!def)
  6737 + return NULL;
6732 6738 env = qemu_mallocz(sizeof(CPUMIPSState));
6733 6739 if (!env)
6734 6740 return NULL;
  6741 + env->cpu_model = def;
  6742 +
6735 6743 cpu_exec_init(env);
6736 6744 cpu_reset(env);
6737 6745 return env;
... ... @@ -6780,6 +6788,5 @@ void cpu_reset (CPUMIPSState *env)
6780 6788 #else
6781 6789 env->hflags = MIPS_HFLAG_CP0;
6782 6790 #endif
  6791 + cpu_mips_register(env, env->cpu_model);
6783 6792 }
6784   -
6785   -#include "translate_init.c"
... ...
target-mips/translate_init.c
... ... @@ -53,7 +53,6 @@
53 53 Define a major version 1, minor version 0. */
54 54 #define MIPS_FCR0 ((0 << FCR0_S) | (0x1 << FCR0_PRID) | (0x10 << FCR0_REV))
55 55  
56   -
57 56 struct mips_def_t {
58 57 const unsigned char *name;
59 58 int32_t CP0_PRid;
... ... @@ -300,21 +299,16 @@ static mips_def_t mips_defs[] =
300 299 #endif
301 300 };
302 301  
303   -int mips_find_by_name (const unsigned char *name, mips_def_t **def)
  302 +static const mips_def_t *cpu_mips_find_by_name (const unsigned char *name)
304 303 {
305   - int i, ret;
  304 + int i;
306 305  
307   - ret = -1;
308   - *def = NULL;
309 306 for (i = 0; i < sizeof(mips_defs) / sizeof(mips_defs[0]); i++) {
310 307 if (strcasecmp(name, mips_defs[i].name) == 0) {
311   - *def = &mips_defs[i];
312   - ret = 0;
313   - break;
  308 + return &mips_defs[i];
314 309 }
315 310 }
316   -
317   - return ret;
  311 + return NULL;
318 312 }
319 313  
320 314 void mips_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
... ... @@ -328,19 +322,19 @@ void mips_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
328 322 }
329 323  
330 324 #ifndef CONFIG_USER_ONLY
331   -static void no_mmu_init (CPUMIPSState *env, mips_def_t *def)
  325 +static void no_mmu_init (CPUMIPSState *env, const mips_def_t *def)
332 326 {
333 327 env->tlb->nb_tlb = 1;
334 328 env->tlb->map_address = &no_mmu_map_address;
335 329 }
336 330  
337   -static void fixed_mmu_init (CPUMIPSState *env, mips_def_t *def)
  331 +static void fixed_mmu_init (CPUMIPSState *env, const mips_def_t *def)
338 332 {
339 333 env->tlb->nb_tlb = 1;
340 334 env->tlb->map_address = &fixed_mmu_map_address;
341 335 }
342 336  
343   -static void r4k_mmu_init (CPUMIPSState *env, mips_def_t *def)
  337 +static void r4k_mmu_init (CPUMIPSState *env, const mips_def_t *def)
344 338 {
345 339 env->tlb->nb_tlb = 1 + ((def->CP0_Config1 >> CP0C1_MMU) & 63);
346 340 env->tlb->map_address = &r4k_map_address;
... ... @@ -350,7 +344,7 @@ static void r4k_mmu_init (CPUMIPSState *env, mips_def_t *def)
350 344 env->tlb->do_tlbr = r4k_do_tlbr;
351 345 }
352 346  
353   -static void mmu_init (CPUMIPSState *env, mips_def_t *def)
  347 +static void mmu_init (CPUMIPSState *env, const mips_def_t *def)
354 348 {
355 349 env->tlb = qemu_mallocz(sizeof(CPUMIPSTLBContext));
356 350  
... ... @@ -376,7 +370,7 @@ static void mmu_init (CPUMIPSState *env, mips_def_t *def)
376 370 }
377 371 #endif /* CONFIG_USER_ONLY */
378 372  
379   -static void fpu_init (CPUMIPSState *env, mips_def_t *def)
  373 +static void fpu_init (CPUMIPSState *env, const mips_def_t *def)
380 374 {
381 375 env->fpu = qemu_mallocz(sizeof(CPUMIPSFPUContext));
382 376  
... ... @@ -389,7 +383,7 @@ static void fpu_init (CPUMIPSState *env, mips_def_t *def)
389 383 #endif
390 384 }
391 385  
392   -static void mvp_init (CPUMIPSState *env, mips_def_t *def)
  386 +static void mvp_init (CPUMIPSState *env, const mips_def_t *def)
393 387 {
394 388 env->mvp = qemu_mallocz(sizeof(CPUMIPSMVPContext));
395 389  
... ... @@ -415,13 +409,8 @@ static void mvp_init (CPUMIPSState *env, mips_def_t *def)
415 409 (0x1 << CP0MVPC1_PCP1);
416 410 }
417 411  
418   -int cpu_mips_register (CPUMIPSState *env, mips_def_t *def)
  412 +static int cpu_mips_register (CPUMIPSState *env, const mips_def_t *def)
419 413 {
420   - if (!def)
421   - def = env->cpu_model;
422   - if (!def)
423   - cpu_abort(env, "Unable to find MIPS CPU definition\n");
424   - env->cpu_model = def;
425 414 env->CP0_PRid = def->CP0_PRid;
426 415 env->CP0_Config0 = def->CP0_Config0;
427 416 #ifdef TARGET_WORDS_BIGENDIAN
... ...
target-ppc/cpu.h
... ... @@ -675,7 +675,7 @@ struct mmu_ctx_t {
675 675 };
676 676  
677 677 /*****************************************************************************/
678   -CPUPPCState *cpu_ppc_init (void);
  678 +CPUPPCState *cpu_ppc_init (const char *cpu_model);
679 679 int cpu_ppc_exec (CPUPPCState *s);
680 680 void cpu_ppc_close (CPUPPCState *s);
681 681 /* you can call this signal handler from your SIGBUS and SIGSEGV
... ... @@ -719,13 +719,12 @@ void ppc_store_xer (CPUPPCState *env, target_ulong value);
719 719 void ppc_store_msr (CPUPPCState *env, target_ulong value);
720 720  
721 721 void cpu_ppc_reset (void *opaque);
722   -CPUPPCState *cpu_ppc_init (void);
723   -void cpu_ppc_close(CPUPPCState *env);
724 722  
725   -int ppc_find_by_name (const unsigned char *name, ppc_def_t **def);
726   -int ppc_find_by_pvr (uint32_t apvr, ppc_def_t **def);
727 723 void ppc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...));
728   -int cpu_ppc_register (CPUPPCState *env, ppc_def_t *def);
  724 +
  725 +const ppc_def_t *cpu_ppc_find_by_name (const unsigned char *name);
  726 +const ppc_def_t *cpu_ppc_find_by_pvr (uint32_t pvr);
  727 +int cpu_ppc_register_internal (CPUPPCState *env, const ppc_def_t *def);
729 728  
730 729 /* Time-base and decrementer management */
731 730 #ifndef NO_CPU_IO_DEFS
... ...
target-ppc/helper.c
... ... @@ -2970,20 +2970,26 @@ void cpu_ppc_reset (void *opaque)
2970 2970 tlb_flush(env, 1);
2971 2971 }
2972 2972  
2973   -CPUPPCState *cpu_ppc_init (void)
  2973 +CPUPPCState *cpu_ppc_init (const char *cpu_model)
2974 2974 {
2975 2975 CPUPPCState *env;
  2976 + const ppc_def_t *def;
  2977 +
  2978 + def = cpu_ppc_find_by_name(cpu_model);
  2979 + if (!def)
  2980 + return NULL;
2976 2981  
2977 2982 env = qemu_mallocz(sizeof(CPUPPCState));
2978 2983 if (!env)
2979 2984 return NULL;
2980 2985 cpu_exec_init(env);
2981   -
  2986 + cpu_ppc_register_internal(env, def);
  2987 + cpu_ppc_reset(env);
2982 2988 return env;
2983 2989 }
2984 2990  
2985 2991 void cpu_ppc_close (CPUPPCState *env)
2986 2992 {
2987 2993 /* Should also remove all opcode tables... */
2988   - free(env);
  2994 + qemu_free(env);
2989 2995 }
... ...
target-ppc/translate_init.c
... ... @@ -5931,7 +5931,7 @@ static ppc_def_t ppc_defs[] = {
5931 5931  
5932 5932 /*****************************************************************************/
5933 5933 /* Generic CPU instanciation routine */
5934   -static void init_ppc_proc (CPUPPCState *env, ppc_def_t *def)
  5934 +static void init_ppc_proc (CPUPPCState *env, const ppc_def_t *def)
5935 5935 {
5936 5936 #if !defined(CONFIG_USER_ONLY)
5937 5937 int i;
... ... @@ -6276,7 +6276,7 @@ static void fix_opcode_tables (opc_handler_t **ppc_opcodes)
6276 6276 }
6277 6277  
6278 6278 /*****************************************************************************/
6279   -static int create_ppc_opcodes (CPUPPCState *env, ppc_def_t *def)
  6279 +static int create_ppc_opcodes (CPUPPCState *env, const ppc_def_t *def)
6280 6280 {
6281 6281 opcode_t *opc, *start, *end;
6282 6282  
... ... @@ -6351,7 +6351,7 @@ static void dump_ppc_insns (CPUPPCState *env)
6351 6351 }
6352 6352 #endif
6353 6353  
6354   -int cpu_ppc_register (CPUPPCState *env, ppc_def_t *def)
  6354 +int cpu_ppc_register_internal (CPUPPCState *env, const ppc_def_t *def)
6355 6355 {
6356 6356 env->msr_mask = def->msr_mask;
6357 6357 env->mmu_model = def->mmu_model;
... ... @@ -6514,41 +6514,31 @@ int cpu_ppc_register (CPUPPCState *env, ppc_def_t *def)
6514 6514 return 0;
6515 6515 }
6516 6516  
6517   -int ppc_find_by_name (const unsigned char *name, ppc_def_t **def)
  6517 +const ppc_def_t *cpu_ppc_find_by_name (const unsigned char *name)
6518 6518 {
6519   - int i, max, ret;
  6519 + int i, max;
6520 6520  
6521   - ret = -1;
6522   - *def = NULL;
6523 6521 max = sizeof(ppc_defs) / sizeof(ppc_def_t);
6524 6522 for (i = 0; i < max; i++) {
6525 6523 if (strcasecmp(name, ppc_defs[i].name) == 0) {
6526   - *def = &ppc_defs[i];
6527   - ret = 0;
6528   - break;
  6524 + return &ppc_defs[i];
6529 6525 }
6530 6526 }
6531   -
6532   - return ret;
  6527 + return NULL;
6533 6528 }
6534 6529  
6535   -int ppc_find_by_pvr (uint32_t pvr, ppc_def_t **def)
  6530 +const ppc_def_t *cpu_ppc_find_by_pvr (uint32_t pvr)
6536 6531 {
6537   - int i, max, ret;
  6532 + int i, max;
6538 6533  
6539   - ret = -1;
6540   - *def = NULL;
6541 6534 max = sizeof(ppc_defs) / sizeof(ppc_def_t);
6542 6535 for (i = 0; i < max; i++) {
6543 6536 if ((pvr & ppc_defs[i].pvr_mask) ==
6544 6537 (ppc_defs[i].pvr & ppc_defs[i].pvr_mask)) {
6545   - *def = &ppc_defs[i];
6546   - ret = 0;
6547   - break;
  6538 + return &ppc_defs[i];
6548 6539 }
6549 6540 }
6550   -
6551   - return ret;
  6541 + return NULL;
6552 6542 }
6553 6543  
6554 6544 void ppc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
... ...
target-sh4/cpu.h
... ... @@ -123,7 +123,7 @@ typedef struct CPUSH4State {
123 123 tlb_t itlb[ITLB_SIZE]; /* instruction translation table */
124 124 } CPUSH4State;
125 125  
126   -CPUSH4State *cpu_sh4_init(void);
  126 +CPUSH4State *cpu_sh4_init(const char *cpu_model);
127 127 int cpu_sh4_exec(CPUSH4State * s);
128 128 int cpu_sh4_signal_handler(int host_signum, void *pinfo,
129 129 void *puc);
... ...
target-sh4/translate.c
... ... @@ -141,7 +141,7 @@ void cpu_sh4_reset(CPUSH4State * env)
141 141 env->mmucr = 0;
142 142 }
143 143  
144   -CPUSH4State *cpu_sh4_init(void)
  144 +CPUSH4State *cpu_sh4_init(const char *cpu_model)
145 145 {
146 146 CPUSH4State *env;
147 147  
... ...
target-sparc/cpu.h
... ... @@ -165,8 +165,6 @@
165 165 /* 2 <= NWINDOWS <= 32. In QEMU it must also be a power of two. */
166 166 #define NWINDOWS 8
167 167  
168   -typedef struct sparc_def_t sparc_def_t;
169   -
170 168 #if !defined(TARGET_SPARC64)
171 169 #define NB_MMU_MODES 2
172 170 #else
... ... @@ -270,14 +268,12 @@ typedef struct CPUSPARCState {
270 268 } while (0)
271 269 #endif
272 270  
273   -CPUSPARCState *cpu_sparc_init(void);
  271 +CPUSPARCState *cpu_sparc_init(const char *cpu_model);
274 272 int cpu_sparc_exec(CPUSPARCState *s);
275 273 int cpu_sparc_close(CPUSPARCState *s);
276   -int sparc_find_by_name (const unsigned char *name, const sparc_def_t **def);
277 274 void sparc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt,
278 275 ...));
279   -int cpu_sparc_register (CPUSPARCState *env, const sparc_def_t *def,
280   - unsigned int cpu);
  276 +void cpu_sparc_set_id(CPUSPARCState *env, unsigned int cpu);
281 277  
282 278 #define GET_PSR(env) (env->version | (env->psr & PSR_ICC) | \
283 279 (env->psref? PSR_EF : 0) | \
... ...
target-sparc/translate.c
... ... @@ -54,6 +54,8 @@ typedef struct DisasContext {
54 54 struct TranslationBlock *tb;
55 55 } DisasContext;
56 56  
  57 +typedef struct sparc_def_t sparc_def_t;
  58 +
57 59 struct sparc_def_t {
58 60 const unsigned char *name;
59 61 target_ulong iu_version;
... ... @@ -62,6 +64,8 @@ struct sparc_def_t {
62 64 uint32_t mmu_bm;
63 65 };
64 66  
  67 +static const sparc_def_t *cpu_sparc_find_by_name(const unsigned char *name);
  68 +
65 69 static uint16_t *gen_opc_ptr;
66 70 static uint32_t *gen_opparam_ptr;
67 71 extern FILE *logfile;
... ... @@ -3489,15 +3493,36 @@ void cpu_reset(CPUSPARCState *env)
3489 3493 #endif
3490 3494 }
3491 3495  
3492   -CPUSPARCState *cpu_sparc_init(void)
  3496 +CPUSPARCState *cpu_sparc_init(const char *cpu_model)
3493 3497 {
3494 3498 CPUSPARCState *env;
  3499 + const sparc_def_t *def;
  3500 +
  3501 + def = cpu_sparc_find_by_name(cpu_model);
  3502 + if (!def)
  3503 + return NULL;
3495 3504  
3496 3505 env = qemu_mallocz(sizeof(CPUSPARCState));
3497 3506 if (!env)
3498 3507 return NULL;
3499 3508 cpu_exec_init(env);
3500   - return (env);
  3509 + env->version = def->iu_version;
  3510 + env->fsr = def->fpu_version;
  3511 +#if !defined(TARGET_SPARC64)
  3512 + env->mmu_bm = def->mmu_bm;
  3513 + env->mmuregs[0] |= def->mmu_version;
  3514 + cpu_sparc_set_id(env, 0);
  3515 +#endif
  3516 + cpu_reset(env);
  3517 +
  3518 + return env;
  3519 +}
  3520 +
  3521 +void cpu_sparc_set_id(CPUSPARCState *env, unsigned int cpu)
  3522 +{
  3523 +#if !defined(TARGET_SPARC64)
  3524 + env->mxccregs[7] = ((cpu + 8) & 0xf) << 24;
  3525 +#endif
3501 3526 }
3502 3527  
3503 3528 static const sparc_def_t sparc_defs[] = {
... ... @@ -3744,22 +3769,16 @@ static const sparc_def_t sparc_defs[] = {
3744 3769 #endif
3745 3770 };
3746 3771  
3747   -int sparc_find_by_name(const unsigned char *name, const sparc_def_t **def)
  3772 +static const sparc_def_t *cpu_sparc_find_by_name(const unsigned char *name)
3748 3773 {
3749   - int ret;
3750 3774 unsigned int i;
3751 3775  
3752   - ret = -1;
3753   - *def = NULL;
3754 3776 for (i = 0; i < sizeof(sparc_defs) / sizeof(sparc_def_t); i++) {
3755 3777 if (strcasecmp(name, sparc_defs[i].name) == 0) {
3756   - *def = &sparc_defs[i];
3757   - ret = 0;
3758   - break;
  3778 + return &sparc_defs[i];
3759 3779 }
3760 3780 }
3761   -
3762   - return ret;
  3781 + return NULL;
3763 3782 }
3764 3783  
3765 3784 void sparc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
... ... @@ -3775,19 +3794,6 @@ void sparc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
3775 3794 }
3776 3795 }
3777 3796  
3778   -int cpu_sparc_register (CPUSPARCState *env, const sparc_def_t *def, unsigned int cpu)
3779   -{
3780   - env->version = def->iu_version;
3781   - env->fsr = def->fpu_version;
3782   -#if !defined(TARGET_SPARC64)
3783   - env->mmu_bm = def->mmu_bm;
3784   - env->mmuregs[0] |= def->mmu_version;
3785   - env->mxccregs[7] = ((cpu + 8) & 0xf) << 24;
3786   -#endif
3787   - cpu_reset(env);
3788   - return 0;
3789   -}
3790   -
3791 3797 #define GET_FLAG(a,b) ((env->psr & a)?b:'-')
3792 3798  
3793 3799 void cpu_dump_state(CPUState *env, FILE *f,
... ...
tests/qruncom.c
... ... @@ -197,7 +197,7 @@ int main(int argc, char **argv)
197 197  
198 198 // cpu_set_log(CPU_LOG_TB_IN_ASM | CPU_LOG_TB_OUT_ASM | CPU_LOG_EXEC);
199 199  
200   - env = cpu_init();
  200 + env = cpu_init("qemu32");
201 201  
202 202 /* disable code copy to simplify debugging */
203 203 code_copy_enabled = 0;
... ...