struct fbfront_dev *fb_open(void *fb, int width, int height, int depth) { unsigned long *mfns; int linesize = width * (depth / 8); int memsize = linesize * height; int numpages = (memsize + PAGE_SIZE - 1) / PAGE_SIZE; int i; create_thread("kbdfront", kbd_thread, &kbd_sem); mfns = malloc(numpages * sizeof(*mfns)); for (i = 0; i < numpages; i++) { memset(fb + i * PAGE_SIZE, 0, PAGE_SIZE); mfns[i] = virtual_to_mfn(fb + i * PAGE_SIZE); } fb_dev = init_fbfront(NULL, mfns, width, height, depth, linesize, numpages); free(mfns); if (!fb_dev) return NULL; down(&kbd_sem); if (!kbd_dev) return NULL; return fb_dev; }
int xenfb_pv_display_start(void *data) { DisplayState *ds; struct fbfront_dev *fb_dev; int kbd_fd, fb_fd; int offset = 0; unsigned long *mfns; int n = VGA_RAM_SIZE / PAGE_SIZE; int i; if (!fb_path || !kbd_path) return 0; ds = xs->ds; xs->vga_vram = data; mfns = malloc(2 * n * sizeof(*mfns)); for (i = 0; i < n; i++) mfns[i] = virtual_to_mfn(xs->vga_vram + i * PAGE_SIZE); for (i = 0; i < n; i++) mfns[n + i] = virtual_to_mfn(xs->nonshared_vram + i * PAGE_SIZE); fb_dev = init_fbfront(fb_path, mfns, ds->width, ds->height, ds->depth, ds->linesize, 2 * n); free(mfns); if (!fb_dev) { fprintf(stderr,"can't open frame buffer\n"); exit(1); } free(fb_path); if (ds->shared_buf) { offset = (void*) ds->data - xs->vga_vram; } else { offset = VGA_RAM_SIZE; ds->data = xs->nonshared_vram; } if (offset) fbfront_resize(fb_dev, ds->width, ds->height, ds->linesize, ds->depth, offset); down(&xs->kbd_sem); free(kbd_path); kbd_fd = kbdfront_open(xs->kbd_dev); qemu_set_fd_handler(kbd_fd, xenfb_kbd_handler, NULL, xs); fb_fd = fbfront_open(fb_dev); qemu_set_fd_handler(fb_fd, xenfb_fb_handler, NULL, xs); xs->fb_dev = fb_dev; return 0; }