Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}