File: | hw/arm/realview.c |
Location: | line 156, column 13 |
Description: | Function call argument is an uninitialized value |
1 | /* | |||
2 | * ARM RealView Baseboard System emulation. | |||
3 | * | |||
4 | * Copyright (c) 2006-2007 CodeSourcery. | |||
5 | * Written by Paul Brook | |||
6 | * | |||
7 | * This code is licensed under the GPL. | |||
8 | */ | |||
9 | ||||
10 | #include "hw/sysbus.h" | |||
11 | #include "hw/arm/arm.h" | |||
12 | #include "hw/arm/primecell.h" | |||
13 | #include "hw/devices.h" | |||
14 | #include "hw/pci/pci.h" | |||
15 | #include "net/net.h" | |||
16 | #include "sysemu/sysemu.h" | |||
17 | #include "hw/boards.h" | |||
18 | #include "hw/i2c/i2c.h" | |||
19 | #include "sysemu/blockdev.h" | |||
20 | #include "exec/address-spaces.h" | |||
21 | ||||
22 | #define SMP_BOOT_ADDR0xe0000000 0xe0000000 | |||
23 | #define SMP_BOOTREG_ADDR0x10000030 0x10000030 | |||
24 | ||||
25 | /* Board init. */ | |||
26 | ||||
27 | static struct arm_boot_info realview_binfo = { | |||
28 | .smp_loader_start = SMP_BOOT_ADDR0xe0000000, | |||
29 | .smp_bootreg_addr = SMP_BOOTREG_ADDR0x10000030, | |||
30 | }; | |||
31 | ||||
32 | /* The following two lists must be consistent. */ | |||
33 | enum realview_board_type { | |||
34 | BOARD_EB, | |||
35 | BOARD_EB_MPCORE, | |||
36 | BOARD_PB_A8, | |||
37 | BOARD_PBX_A9, | |||
38 | }; | |||
39 | ||||
40 | static const int realview_board_id[] = { | |||
41 | 0x33b, | |||
42 | 0x33b, | |||
43 | 0x769, | |||
44 | 0x76d | |||
45 | }; | |||
46 | ||||
47 | static void realview_init(QEMUMachineInitArgs *args, | |||
48 | enum realview_board_type board_type) | |||
49 | { | |||
50 | ARMCPU *cpu = NULL((void*)0); | |||
51 | CPUARMState *env; | |||
52 | MemoryRegion *sysmem = get_system_memory(); | |||
53 | MemoryRegion *ram_lo = g_new(MemoryRegion, 1)((MemoryRegion *) g_malloc_n ((1), sizeof (MemoryRegion))); | |||
54 | MemoryRegion *ram_hi = g_new(MemoryRegion, 1)((MemoryRegion *) g_malloc_n ((1), sizeof (MemoryRegion))); | |||
55 | MemoryRegion *ram_alias = g_new(MemoryRegion, 1)((MemoryRegion *) g_malloc_n ((1), sizeof (MemoryRegion))); | |||
56 | MemoryRegion *ram_hack = g_new(MemoryRegion, 1)((MemoryRegion *) g_malloc_n ((1), sizeof (MemoryRegion))); | |||
57 | DeviceState *dev, *sysctl, *gpio2, *pl041; | |||
58 | SysBusDevice *busdev; | |||
59 | qemu_irq pic[64]; | |||
60 | qemu_irq mmc_irq[2]; | |||
61 | PCIBus *pci_bus = NULL((void*)0); | |||
62 | NICInfo *nd; | |||
63 | i2c_bus *i2c; | |||
64 | int n; | |||
65 | int done_nic = 0; | |||
66 | qemu_irq cpu_irq[4]; | |||
67 | int is_mpcore = 0; | |||
68 | int is_pb = 0; | |||
69 | uint32_t proc_id = 0; | |||
70 | uint32_t sys_id; | |||
71 | ram_addr_t low_ram_size; | |||
72 | ram_addr_t ram_size = args->ram_size; | |||
73 | ||||
74 | switch (board_type) { | |||
| ||||
75 | case BOARD_EB: | |||
76 | break; | |||
77 | case BOARD_EB_MPCORE: | |||
78 | is_mpcore = 1; | |||
79 | break; | |||
80 | case BOARD_PB_A8: | |||
81 | is_pb = 1; | |||
82 | break; | |||
83 | case BOARD_PBX_A9: | |||
84 | is_mpcore = 1; | |||
85 | is_pb = 1; | |||
86 | break; | |||
87 | } | |||
88 | for (n = 0; n < smp_cpus; n++) { | |||
89 | cpu = cpu_arm_init(args->cpu_model); | |||
90 | if (!cpu) { | |||
91 | fprintf(stderrstderr, "Unable to find CPU definition\n"); | |||
92 | exit(1); | |||
93 | } | |||
94 | cpu_irq[n] = qdev_get_gpio_in(DEVICE(cpu)((DeviceState *)object_dynamic_cast_assert(((Object *)((cpu)) ), ("device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/arm/realview.c" , 94, __func__)), ARM_CPU_IRQ0); | |||
95 | } | |||
96 | env = &cpu->env; | |||
97 | if (arm_feature(env, ARM_FEATURE_V7)) { | |||
98 | if (is_mpcore) { | |||
99 | proc_id = 0x0c000000; | |||
100 | } else { | |||
101 | proc_id = 0x0e000000; | |||
102 | } | |||
103 | } else if (arm_feature(env, ARM_FEATURE_V6K)) { | |||
104 | proc_id = 0x06000000; | |||
105 | } else if (arm_feature(env, ARM_FEATURE_V6)) { | |||
106 | proc_id = 0x04000000; | |||
107 | } else { | |||
108 | proc_id = 0x02000000; | |||
109 | } | |||
110 | ||||
111 | if (is_pb && ram_size > 0x20000000) { | |||
112 | /* Core tile RAM. */ | |||
113 | low_ram_size = ram_size - 0x20000000; | |||
114 | ram_size = 0x20000000; | |||
115 | memory_region_init_ram(ram_lo, NULL((void*)0), "realview.lowmem", low_ram_size); | |||
116 | vmstate_register_ram_global(ram_lo); | |||
117 | memory_region_add_subregion(sysmem, 0x20000000, ram_lo); | |||
118 | } | |||
119 | ||||
120 | memory_region_init_ram(ram_hi, NULL((void*)0), "realview.highmem", ram_size); | |||
121 | vmstate_register_ram_global(ram_hi); | |||
122 | low_ram_size = ram_size; | |||
123 | if (low_ram_size > 0x10000000) | |||
124 | low_ram_size = 0x10000000; | |||
125 | /* SDRAM at address zero. */ | |||
126 | memory_region_init_alias(ram_alias, NULL((void*)0), "realview.alias", | |||
127 | ram_hi, 0, low_ram_size); | |||
128 | memory_region_add_subregion(sysmem, 0, ram_alias); | |||
129 | if (is_pb) { | |||
130 | /* And again at a high address. */ | |||
131 | memory_region_add_subregion(sysmem, 0x70000000, ram_hi); | |||
132 | } else { | |||
133 | ram_size = low_ram_size; | |||
134 | } | |||
135 | ||||
136 | sys_id = is_pb ? 0x01780500 : 0xc1400400; | |||
137 | sysctl = qdev_create(NULL((void*)0), "realview_sysctl"); | |||
138 | qdev_prop_set_uint32(sysctl, "sys_id", sys_id); | |||
139 | qdev_prop_set_uint32(sysctl, "proc_id", proc_id); | |||
140 | qdev_init_nofail(sysctl); | |||
141 | sysbus_mmio_map(SYS_BUS_DEVICE(sysctl)((SysBusDevice *)object_dynamic_cast_assert(((Object *)((sysctl ))), ("sys-bus-device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/arm/realview.c" , 141, __func__)), 0, 0x10000000); | |||
142 | ||||
143 | if (is_mpcore) { | |||
144 | hwaddr periphbase; | |||
145 | dev = qdev_create(NULL((void*)0), is_pb ? "a9mpcore_priv": "realview_mpcore"); | |||
146 | qdev_prop_set_uint32(dev, "num-cpu", smp_cpus); | |||
147 | qdev_init_nofail(dev); | |||
148 | busdev = SYS_BUS_DEVICE(dev)((SysBusDevice *)object_dynamic_cast_assert(((Object *)((dev) )), ("sys-bus-device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/arm/realview.c" , 148, __func__)); | |||
149 | if (is_pb) { | |||
150 | periphbase = 0x1f000000; | |||
151 | } else { | |||
152 | periphbase = 0x10100000; | |||
153 | } | |||
154 | sysbus_mmio_map(busdev, 0, periphbase); | |||
155 | for (n = 0; n < smp_cpus; n++) { | |||
156 | sysbus_connect_irq(busdev, n, cpu_irq[n]); | |||
| ||||
157 | } | |||
158 | sysbus_create_varargs("l2x0", periphbase + 0x2000, NULL((void*)0)); | |||
159 | /* Both A9 and 11MPCore put the GIC CPU i/f at base + 0x100 */ | |||
160 | realview_binfo.gic_cpu_if_addr = periphbase + 0x100; | |||
161 | } else { | |||
162 | uint32_t gic_addr = is_pb ? 0x1e000000 : 0x10040000; | |||
163 | /* For now just create the nIRQ GIC, and ignore the others. */ | |||
164 | dev = sysbus_create_simple("realview_gic", gic_addr, cpu_irq[0]); | |||
165 | } | |||
166 | for (n = 0; n < 64; n++) { | |||
167 | pic[n] = qdev_get_gpio_in(dev, n); | |||
168 | } | |||
169 | ||||
170 | pl041 = qdev_create(NULL((void*)0), "pl041"); | |||
171 | qdev_prop_set_uint32(pl041, "nc_fifo_depth", 512); | |||
172 | qdev_init_nofail(pl041); | |||
173 | sysbus_mmio_map(SYS_BUS_DEVICE(pl041)((SysBusDevice *)object_dynamic_cast_assert(((Object *)((pl041 ))), ("sys-bus-device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/arm/realview.c" , 173, __func__)), 0, 0x10004000); | |||
174 | sysbus_connect_irq(SYS_BUS_DEVICE(pl041)((SysBusDevice *)object_dynamic_cast_assert(((Object *)((pl041 ))), ("sys-bus-device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/arm/realview.c" , 174, __func__)), 0, pic[19]); | |||
175 | ||||
176 | sysbus_create_simple("pl050_keyboard", 0x10006000, pic[20]); | |||
177 | sysbus_create_simple("pl050_mouse", 0x10007000, pic[21]); | |||
178 | ||||
179 | sysbus_create_simple("pl011", 0x10009000, pic[12]); | |||
180 | sysbus_create_simple("pl011", 0x1000a000, pic[13]); | |||
181 | sysbus_create_simple("pl011", 0x1000b000, pic[14]); | |||
182 | sysbus_create_simple("pl011", 0x1000c000, pic[15]); | |||
183 | ||||
184 | /* DMA controller is optional, apparently. */ | |||
185 | sysbus_create_simple("pl081", 0x10030000, pic[24]); | |||
186 | ||||
187 | sysbus_create_simple("sp804", 0x10011000, pic[4]); | |||
188 | sysbus_create_simple("sp804", 0x10012000, pic[5]); | |||
189 | ||||
190 | sysbus_create_simple("pl061", 0x10013000, pic[6]); | |||
191 | sysbus_create_simple("pl061", 0x10014000, pic[7]); | |||
192 | gpio2 = sysbus_create_simple("pl061", 0x10015000, pic[8]); | |||
193 | ||||
194 | sysbus_create_simple("pl111", 0x10020000, pic[23]); | |||
195 | ||||
196 | dev = sysbus_create_varargs("pl181", 0x10005000, pic[17], pic[18], NULL((void*)0)); | |||
197 | /* Wire up MMC card detect and read-only signals. These have | |||
198 | * to go to both the PL061 GPIO and the sysctl register. | |||
199 | * Note that the PL181 orders these lines (readonly,inserted) | |||
200 | * and the PL061 has them the other way about. Also the card | |||
201 | * detect line is inverted. | |||
202 | */ | |||
203 | mmc_irq[0] = qemu_irq_split( | |||
204 | qdev_get_gpio_in(sysctl, ARM_SYSCTL_GPIO_MMC_WPROT0), | |||
205 | qdev_get_gpio_in(gpio2, 1)); | |||
206 | mmc_irq[1] = qemu_irq_split( | |||
207 | qdev_get_gpio_in(sysctl, ARM_SYSCTL_GPIO_MMC_CARDIN1), | |||
208 | qemu_irq_invert(qdev_get_gpio_in(gpio2, 0))); | |||
209 | qdev_connect_gpio_out(dev, 0, mmc_irq[0]); | |||
210 | qdev_connect_gpio_out(dev, 1, mmc_irq[1]); | |||
211 | ||||
212 | sysbus_create_simple("pl031", 0x10017000, pic[10]); | |||
213 | ||||
214 | if (!is_pb) { | |||
215 | dev = qdev_create(NULL((void*)0), "realview_pci"); | |||
216 | busdev = SYS_BUS_DEVICE(dev)((SysBusDevice *)object_dynamic_cast_assert(((Object *)((dev) )), ("sys-bus-device"), "/home/stefan/src/qemu/qemu.org/qemu/hw/arm/realview.c" , 216, __func__)); | |||
217 | qdev_init_nofail(dev); | |||
218 | sysbus_mmio_map(busdev, 0, 0x10019000); /* PCI controller registers */ | |||
219 | sysbus_mmio_map(busdev, 1, 0x60000000); /* PCI self-config */ | |||
220 | sysbus_mmio_map(busdev, 2, 0x61000000); /* PCI config */ | |||
221 | sysbus_mmio_map(busdev, 3, 0x62000000); /* PCI I/O */ | |||
222 | sysbus_mmio_map(busdev, 4, 0x63000000); /* PCI memory window 1 */ | |||
223 | sysbus_mmio_map(busdev, 5, 0x64000000); /* PCI memory window 2 */ | |||
224 | sysbus_mmio_map(busdev, 6, 0x68000000); /* PCI memory window 3 */ | |||
225 | sysbus_connect_irq(busdev, 0, pic[48]); | |||
226 | sysbus_connect_irq(busdev, 1, pic[49]); | |||
227 | sysbus_connect_irq(busdev, 2, pic[50]); | |||
228 | sysbus_connect_irq(busdev, 3, pic[51]); | |||
229 | pci_bus = (PCIBus *)qdev_get_child_bus(dev, "pci"); | |||
230 | if (usb_enabled(false0)) { | |||
231 | pci_create_simple(pci_bus, -1, "pci-ohci"); | |||
232 | } | |||
233 | n = drive_get_max_bus(IF_SCSI); | |||
234 | while (n >= 0) { | |||
235 | pci_create_simple(pci_bus, -1, "lsi53c895a"); | |||
236 | n--; | |||
237 | } | |||
238 | } | |||
239 | for(n = 0; n < nb_nics; n++) { | |||
240 | nd = &nd_table[n]; | |||
241 | ||||
242 | if (!done_nic && (!nd->model || | |||
243 | strcmp(nd->model, is_pb ? "lan9118" : "smc91c111") == 0)) { | |||
244 | if (is_pb) { | |||
245 | lan9118_init(nd, 0x4e000000, pic[28]); | |||
246 | } else { | |||
247 | smc91c111_init(nd, 0x4e000000, pic[28]); | |||
248 | } | |||
249 | done_nic = 1; | |||
250 | } else { | |||
251 | if (pci_bus) { | |||
252 | pci_nic_init_nofail(nd, pci_bus, "rtl8139", NULL((void*)0)); | |||
253 | } | |||
254 | } | |||
255 | } | |||
256 | ||||
257 | dev = sysbus_create_simple("versatile_i2c", 0x10002000, NULL((void*)0)); | |||
258 | i2c = (i2c_bus *)qdev_get_child_bus(dev, "i2c"); | |||
259 | i2c_create_slave(i2c, "ds1338", 0x68); | |||
260 | ||||
261 | /* Memory map for RealView Emulation Baseboard: */ | |||
262 | /* 0x10000000 System registers. */ | |||
263 | /* 0x10001000 System controller. */ | |||
264 | /* 0x10002000 Two-Wire Serial Bus. */ | |||
265 | /* 0x10003000 Reserved. */ | |||
266 | /* 0x10004000 AACI. */ | |||
267 | /* 0x10005000 MCI. */ | |||
268 | /* 0x10006000 KMI0. */ | |||
269 | /* 0x10007000 KMI1. */ | |||
270 | /* 0x10008000 Character LCD. (EB) */ | |||
271 | /* 0x10009000 UART0. */ | |||
272 | /* 0x1000a000 UART1. */ | |||
273 | /* 0x1000b000 UART2. */ | |||
274 | /* 0x1000c000 UART3. */ | |||
275 | /* 0x1000d000 SSPI. */ | |||
276 | /* 0x1000e000 SCI. */ | |||
277 | /* 0x1000f000 Reserved. */ | |||
278 | /* 0x10010000 Watchdog. */ | |||
279 | /* 0x10011000 Timer 0+1. */ | |||
280 | /* 0x10012000 Timer 2+3. */ | |||
281 | /* 0x10013000 GPIO 0. */ | |||
282 | /* 0x10014000 GPIO 1. */ | |||
283 | /* 0x10015000 GPIO 2. */ | |||
284 | /* 0x10002000 Two-Wire Serial Bus - DVI. (PB) */ | |||
285 | /* 0x10017000 RTC. */ | |||
286 | /* 0x10018000 DMC. */ | |||
287 | /* 0x10019000 PCI controller config. */ | |||
288 | /* 0x10020000 CLCD. */ | |||
289 | /* 0x10030000 DMA Controller. */ | |||
290 | /* 0x10040000 GIC1. (EB) */ | |||
291 | /* 0x10050000 GIC2. (EB) */ | |||
292 | /* 0x10060000 GIC3. (EB) */ | |||
293 | /* 0x10070000 GIC4. (EB) */ | |||
294 | /* 0x10080000 SMC. */ | |||
295 | /* 0x1e000000 GIC1. (PB) */ | |||
296 | /* 0x1e001000 GIC2. (PB) */ | |||
297 | /* 0x1e002000 GIC3. (PB) */ | |||
298 | /* 0x1e003000 GIC4. (PB) */ | |||
299 | /* 0x40000000 NOR flash. */ | |||
300 | /* 0x44000000 DoC flash. */ | |||
301 | /* 0x48000000 SRAM. */ | |||
302 | /* 0x4c000000 Configuration flash. */ | |||
303 | /* 0x4e000000 Ethernet. */ | |||
304 | /* 0x4f000000 USB. */ | |||
305 | /* 0x50000000 PISMO. */ | |||
306 | /* 0x54000000 PISMO. */ | |||
307 | /* 0x58000000 PISMO. */ | |||
308 | /* 0x5c000000 PISMO. */ | |||
309 | /* 0x60000000 PCI. */ | |||
310 | /* 0x60000000 PCI Self Config. */ | |||
311 | /* 0x61000000 PCI Config. */ | |||
312 | /* 0x62000000 PCI IO. */ | |||
313 | /* 0x63000000 PCI mem 0. */ | |||
314 | /* 0x64000000 PCI mem 1. */ | |||
315 | /* 0x68000000 PCI mem 2. */ | |||
316 | ||||
317 | /* ??? Hack to map an additional page of ram for the secondary CPU | |||
318 | startup code. I guess this works on real hardware because the | |||
319 | BootROM happens to be in ROM/flash or in memory that isn't clobbered | |||
320 | until after Linux boots the secondary CPUs. */ | |||
321 | memory_region_init_ram(ram_hack, NULL((void*)0), "realview.hack", 0x1000); | |||
322 | vmstate_register_ram_global(ram_hack); | |||
323 | memory_region_add_subregion(sysmem, SMP_BOOT_ADDR0xe0000000, ram_hack); | |||
324 | ||||
325 | realview_binfo.ram_size = ram_size; | |||
326 | realview_binfo.kernel_filename = args->kernel_filename; | |||
327 | realview_binfo.kernel_cmdline = args->kernel_cmdline; | |||
328 | realview_binfo.initrd_filename = args->initrd_filename; | |||
329 | realview_binfo.nb_cpus = smp_cpus; | |||
330 | realview_binfo.board_id = realview_board_id[board_type]; | |||
331 | realview_binfo.loader_start = (board_type == BOARD_PB_A8 ? 0x70000000 : 0); | |||
332 | arm_load_kernel(ARM_CPU(first_cpu)((ARMCPU *)object_dynamic_cast_assert(((Object *)((((&cpus )->tqh_first)))), ("arm-cpu"), "/home/stefan/src/qemu/qemu.org/qemu/hw/arm/realview.c" , 332, __func__)), &realview_binfo); | |||
333 | } | |||
334 | ||||
335 | static void realview_eb_init(QEMUMachineInitArgs *args) | |||
336 | { | |||
337 | if (!args->cpu_model) { | |||
338 | args->cpu_model = "arm926"; | |||
339 | } | |||
340 | realview_init(args, BOARD_EB); | |||
341 | } | |||
342 | ||||
343 | static void realview_eb_mpcore_init(QEMUMachineInitArgs *args) | |||
344 | { | |||
345 | if (!args->cpu_model) { | |||
346 | args->cpu_model = "arm11mpcore"; | |||
347 | } | |||
348 | realview_init(args, BOARD_EB_MPCORE); | |||
349 | } | |||
350 | ||||
351 | static void realview_pb_a8_init(QEMUMachineInitArgs *args) | |||
352 | { | |||
353 | if (!args->cpu_model) { | |||
354 | args->cpu_model = "cortex-a8"; | |||
355 | } | |||
356 | realview_init(args, BOARD_PB_A8); | |||
357 | } | |||
358 | ||||
359 | static void realview_pbx_a9_init(QEMUMachineInitArgs *args) | |||
360 | { | |||
361 | if (!args->cpu_model) { | |||
362 | args->cpu_model = "cortex-a9"; | |||
363 | } | |||
364 | realview_init(args, BOARD_PBX_A9); | |||
365 | } | |||
366 | ||||
367 | static QEMUMachine realview_eb_machine = { | |||
368 | .name = "realview-eb", | |||
369 | .desc = "ARM RealView Emulation Baseboard (ARM926EJ-S)", | |||
370 | .init = realview_eb_init, | |||
371 | .block_default_type = IF_SCSI, | |||
372 | }; | |||
373 | ||||
374 | static QEMUMachine realview_eb_mpcore_machine = { | |||
375 | .name = "realview-eb-mpcore", | |||
376 | .desc = "ARM RealView Emulation Baseboard (ARM11MPCore)", | |||
377 | .init = realview_eb_mpcore_init, | |||
378 | .block_default_type = IF_SCSI, | |||
379 | .max_cpus = 4, | |||
380 | }; | |||
381 | ||||
382 | static QEMUMachine realview_pb_a8_machine = { | |||
383 | .name = "realview-pb-a8", | |||
384 | .desc = "ARM RealView Platform Baseboard for Cortex-A8", | |||
385 | .init = realview_pb_a8_init, | |||
386 | }; | |||
387 | ||||
388 | static QEMUMachine realview_pbx_a9_machine = { | |||
389 | .name = "realview-pbx-a9", | |||
390 | .desc = "ARM RealView Platform Baseboard Explore for Cortex-A9", | |||
391 | .init = realview_pbx_a9_init, | |||
392 | .block_default_type = IF_SCSI, | |||
393 | .max_cpus = 4, | |||
394 | }; | |||
395 | ||||
396 | static void realview_machine_init(void) | |||
397 | { | |||
398 | qemu_register_machine(&realview_eb_machine); | |||
399 | qemu_register_machine(&realview_eb_mpcore_machine); | |||
400 | qemu_register_machine(&realview_pb_a8_machine); | |||
401 | qemu_register_machine(&realview_pbx_a9_machine); | |||
402 | } | |||
403 | ||||
404 | machine_init(realview_machine_init)static void __attribute__((constructor)) do_qemu_init_realview_machine_init (void) { register_module_init(realview_machine_init, MODULE_INIT_MACHINE ); }; |