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