Revision 2c62f08d hw/display/g364fb.c

b/hw/display/g364fb.c
294 294
    g364fb_invalidate_display(s);
295 295
}
296 296

  
297
static void g364fb_screen_dump(void *opaque, const char *filename, bool cswitch,
298
                               Error **errp)
299
{
300
    G364State *s = opaque;
301
    int ret, y, x;
302
    uint8_t index;
303
    uint8_t *data_buffer;
304
    FILE *f;
305

  
306
    qemu_flush_coalesced_mmio_buffer();
307

  
308
    if (s->depth != 8) {
309
        error_setg(errp, "g364: unknown guest depth %d", s->depth);
310
        return;
311
    }
312

  
313
    f = fopen(filename, "wb");
314
    if (!f) {
315
        error_setg(errp, "failed to open file '%s': %s", filename,
316
                   strerror(errno));
317
        return;
318
    }
319

  
320
    if (s->ctla & CTLA_FORCE_BLANK) {
321
        /* blank screen */
322
        ret = fprintf(f, "P4\n%d %d\n", s->width, s->height);
323
        if (ret < 0) {
324
            goto write_err;
325
        }
326
        for (y = 0; y < s->height; y++)
327
            for (x = 0; x < s->width; x++) {
328
                ret = fputc(0, f);
329
                if (ret == EOF) {
330
                    goto write_err;
331
                }
332
            }
333
    } else {
334
        data_buffer = s->vram + s->top_of_screen;
335
        ret = fprintf(f, "P6\n%d %d\n%d\n", s->width, s->height, 255);
336
        if (ret < 0) {
337
            goto write_err;
338
        }
339
        for (y = 0; y < s->height; y++)
340
            for (x = 0; x < s->width; x++, data_buffer++) {
341
                index = *data_buffer;
342
                ret = fputc(s->color_palette[index][0], f);
343
                if (ret == EOF) {
344
                    goto write_err;
345
                }
346
                ret = fputc(s->color_palette[index][1], f);
347
                if (ret == EOF) {
348
                    goto write_err;
349
                }
350
                ret = fputc(s->color_palette[index][2], f);
351
                if (ret == EOF) {
352
                    goto write_err;
353
                }
354
        }
355
    }
356

  
357
out:
358
    fclose(f);
359
    return;
360

  
361
write_err:
362
    error_setg(errp, "failed to write to file '%s': %s", filename,
363
               strerror(errno));
364
    unlink(filename);
365
    goto out;
366
}
367

  
368 297
/* called for accesses to io ports */
369 298
static uint64_t g364fb_ctrl_read(void *opaque,
370 299
                                 hwaddr addr,
......
552 481

  
553 482
    s->con = graphic_console_init(g364fb_update_display,
554 483
                                  g364fb_invalidate_display,
555
                                  g364fb_screen_dump, NULL, s);
484
                                  NULL, s);
556 485

  
557 486
    memory_region_init_io(&s->mem_ctrl, &g364fb_ctrl_ops, s, "ctrl", 0x180000);
558 487
    memory_region_init_ram_ptr(&s->mem_vram, "vram",

Also available in: Unified diff