~jderose/ubuntu/raring/qemu/vde-again

« back to all changes in this revision

Viewing changes to hw/sun4u.c

Tags: upstream-0.9.0+20070816
ImportĀ upstreamĀ versionĀ 0.9.0+20070816

Show diffs side-by-side

added added

removed removed

Lines of Context:
29
29
#define INITRD_LOAD_ADDR     0x00300000
30
30
#define PROM_SIZE_MAX        (512 * 1024)
31
31
#define PROM_ADDR            0x1fff0000000ULL
 
32
#define PROM_VADDR           0x000ffd00000ULL
32
33
#define APB_SPECIAL_BASE     0x1fe00000000ULL
33
34
#define APB_MEM_BASE         0x1ff00000000ULL
34
35
#define VGA_BASE             (APB_MEM_BASE + 0x400000ULL)
170
171
    return crc;
171
172
}
172
173
 
 
174
static uint32_t nvram_set_var (m48t59_t *nvram, uint32_t addr,
 
175
                                const unsigned char *str)
 
176
{
 
177
    uint32_t len;
 
178
 
 
179
    len = strlen(str) + 1;
 
180
    NVRAM_set_string(nvram, addr, str, len);
 
181
 
 
182
    return addr + len;
 
183
}
 
184
 
 
185
static void nvram_finish_partition (m48t59_t *nvram, uint32_t start,
 
186
                                    uint32_t end)
 
187
{
 
188
    unsigned int i, sum;
 
189
 
 
190
    // Length divided by 16
 
191
    m48t59_write(nvram, start + 2, ((end - start) >> 12) & 0xff);
 
192
    m48t59_write(nvram, start + 3, ((end - start) >> 4) & 0xff);
 
193
    // Checksum
 
194
    sum = m48t59_read(nvram, start);
 
195
    for (i = 0; i < 14; i++) {
 
196
        sum += m48t59_read(nvram, start + 2 + i);
 
197
        sum = (sum + ((sum & 0xff00) >> 8)) & 0xff;
 
198
    }
 
199
    m48t59_write(nvram, start + 1, sum & 0xff);
 
200
}
 
201
 
173
202
extern int nographic;
174
203
 
175
204
int sun4u_NVRAM_set_params (m48t59_t *nvram, uint16_t NVRAM_size,
182
211
                          int width, int height, int depth)
183
212
{
184
213
    uint16_t crc;
 
214
    unsigned int i;
 
215
    uint32_t start, end;
185
216
 
186
217
    /* Set parameters for Open Hack'Ware BIOS */
187
218
    NVRAM_set_string(nvram, 0x00, "QEMU_BIOS", 16);
212
243
    crc = NVRAM_compute_crc(nvram, 0x00, 0xF8);
213
244
    NVRAM_set_word(nvram,  0xFC, crc);
214
245
 
 
246
    // OpenBIOS nvram variables
 
247
    // Variable partition
 
248
    start = 256;
 
249
    m48t59_write(nvram, start, 0x70);
 
250
    NVRAM_set_string(nvram, start + 4, "system", 12);
 
251
 
 
252
    end = start + 16;
 
253
    for (i = 0; i < nb_prom_envs; i++)
 
254
        end = nvram_set_var(nvram, end, prom_envs[i]);
 
255
 
 
256
    m48t59_write(nvram, end++ , 0);
 
257
    end = start + ((end - start + 15) & ~15);
 
258
    nvram_finish_partition(nvram, start, end);
 
259
 
 
260
    // free partition
 
261
    start = end;
 
262
    m48t59_write(nvram, start, 0x7f);
 
263
    NVRAM_set_string(nvram, start + 4, "free", 12);
 
264
 
 
265
    end = 0x1fd0;
 
266
    nvram_finish_partition(nvram, start, end);
 
267
 
215
268
    return 0;
216
269
}
217
270
 
223
276
{
224
277
}
225
278
 
226
 
void pic_set_irq(int irq, int level)
227
 
{
228
 
}
229
 
 
230
 
void pic_set_irq_new(void *opaque, int irq, int level)
231
 
{
232
 
}
233
 
 
234
279
void qemu_system_powerdown(void)
235
280
{
236
281
}
238
283
static void main_cpu_reset(void *opaque)
239
284
{
240
285
    CPUState *env = opaque;
 
286
 
241
287
    cpu_reset(env);
 
288
    ptimer_set_limit(env->tick, 0x7fffffffffffffffULL, 1);
 
289
    ptimer_run(env->tick, 0);
 
290
    ptimer_set_limit(env->stick, 0x7fffffffffffffffULL, 1);
 
291
    ptimer_run(env->stick, 0);
 
292
    ptimer_set_limit(env->hstick, 0x7fffffffffffffffULL, 1);
 
293
    ptimer_run(env->hstick, 0);
 
294
}
 
295
 
 
296
void tick_irq(void *opaque)
 
297
{
 
298
    CPUState *env = opaque;
 
299
 
 
300
    cpu_interrupt(env, CPU_INTERRUPT_TIMER);
 
301
}
 
302
 
 
303
void stick_irq(void *opaque)
 
304
{
 
305
    CPUState *env = opaque;
 
306
 
 
307
    cpu_interrupt(env, CPU_INTERRUPT_TIMER);
 
308
}
 
309
 
 
310
void hstick_irq(void *opaque)
 
311
{
 
312
    CPUState *env = opaque;
 
313
 
 
314
    cpu_interrupt(env, CPU_INTERRUPT_TIMER);
 
315
}
 
316
 
 
317
static void dummy_cpu_set_irq(void *opaque, int irq, int level)
 
318
{
242
319
}
243
320
 
244
321
static const int ide_iobase[2] = { 0x1f0, 0x170 };
257
334
static void sun4u_init(int ram_size, int vga_ram_size, int boot_device,
258
335
             DisplayState *ds, const char **fd_filename, int snapshot,
259
336
             const char *kernel_filename, const char *kernel_cmdline,
260
 
             const char *initrd_filename)
 
337
             const char *initrd_filename, const char *cpu_model)
261
338
{
262
339
    CPUState *env;
263
340
    char buf[1024];
266
343
    unsigned int i;
267
344
    long prom_offset, initrd_size, kernel_size;
268
345
    PCIBus *pci_bus;
 
346
    const sparc_def_t *def;
 
347
    QEMUBH *bh;
 
348
    qemu_irq *irq;
269
349
 
270
350
    linux_boot = (kernel_filename != NULL);
271
351
 
 
352
    /* init CPUs */
 
353
    if (cpu_model == NULL)
 
354
        cpu_model = "TI UltraSparc II";
 
355
    sparc_find_by_name(cpu_model, &def);
 
356
    if (def == NULL) {
 
357
        fprintf(stderr, "Unable to find Sparc CPU definition\n");
 
358
        exit(1);
 
359
    }
272
360
    env = cpu_init();
 
361
    cpu_sparc_register(env, def);
 
362
    bh = qemu_bh_new(tick_irq, env);
 
363
    env->tick = ptimer_init(bh);
 
364
    ptimer_set_period(env->tick, 1ULL);
 
365
 
 
366
    bh = qemu_bh_new(stick_irq, env);
 
367
    env->stick = ptimer_init(bh);
 
368
    ptimer_set_period(env->stick, 1ULL);
 
369
 
 
370
    bh = qemu_bh_new(hstick_irq, env);
 
371
    env->hstick = ptimer_init(bh);
 
372
    ptimer_set_period(env->hstick, 1ULL);
273
373
    register_savevm("cpu", 0, 3, cpu_save, cpu_load, env);
274
374
    qemu_register_reset(main_cpu_reset, env);
 
375
    main_cpu_reset(env);
275
376
 
276
377
    /* allocate RAM */
277
378
    cpu_register_physical_memory(0, ram_size, 0);
282
383
                                 prom_offset | IO_MEM_ROM);
283
384
 
284
385
    snprintf(buf, sizeof(buf), "%s/%s", bios_dir, PROM_FILENAME);
285
 
    ret = load_elf(buf, 0, NULL);
 
386
    ret = load_elf(buf, PROM_ADDR - PROM_VADDR, NULL, NULL, NULL);
286
387
    if (ret < 0) {
287
388
        fprintf(stderr, "qemu: could not load prom '%s'\n", 
288
389
                buf);
293
394
    initrd_size = 0;
294
395
    if (linux_boot) {
295
396
        /* XXX: put correct offset */
296
 
        kernel_size = load_elf(kernel_filename, 0, NULL);
 
397
        kernel_size = load_elf(kernel_filename, 0, NULL, NULL, NULL);
297
398
        if (kernel_size < 0)
298
399
            kernel_size = load_aout(kernel_filename, phys_ram_base + KERNEL_LOAD_ADDR);
299
400
        if (kernel_size < 0)
330
431
 
331
432
    for(i = 0; i < MAX_SERIAL_PORTS; i++) {
332
433
        if (serial_hds[i]) {
333
 
            serial_init(&pic_set_irq_new, NULL,
334
 
                        serial_io[i], serial_irq[i], serial_hds[i]);
 
434
            serial_init(serial_io[i], NULL/*serial_irq[i]*/, serial_hds[i]);
335
435
        }
336
436
    }
337
437
 
338
438
    for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
339
439
        if (parallel_hds[i]) {
340
 
            parallel_init(parallel_io[i], parallel_irq[i], parallel_hds[i]);
 
440
            parallel_init(parallel_io[i], NULL/*parallel_irq[i]*/, parallel_hds[i]);
341
441
        }
342
442
    }
343
443
 
347
447
        pci_nic_init(pci_bus, &nd_table[i], -1);
348
448
    }
349
449
 
350
 
    pci_cmd646_ide_init(pci_bus, bs_table, 1);
351
 
    kbd_init();
352
 
    floppy_controller = fdctrl_init(6, 2, 0, 0x3f0, fd_table);
353
 
    nvram = m48t59_init(8, 0, 0x0074, NVRAM_SIZE, 59);
 
450
    irq = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, 32);
 
451
    // XXX pci_cmd646_ide_init(pci_bus, bs_table, 1);
 
452
    pci_piix3_ide_init(pci_bus, bs_table, -1, irq);
 
453
    /* FIXME: wire up interrupts.  */
 
454
    i8042_init(NULL/*1*/, NULL/*12*/, 0x60);
 
455
    floppy_controller = fdctrl_init(NULL/*6*/, 2, 0, 0x3f0, fd_table);
 
456
    nvram = m48t59_init(NULL/*8*/, 0, 0x0074, NVRAM_SIZE, 59);
354
457
    sun4u_NVRAM_set_params(nvram, NVRAM_SIZE, "Sun4u", ram_size, boot_device,
355
458
                         KERNEL_LOAD_ADDR, kernel_size,
356
459
                         kernel_cmdline,