static TAPTR rfb_modopen(RFBDISPLAY *mod, TTAGITEM *tags) { TBOOL success = TFALSE; TExecLock(mod->rfb_ExecBase, mod->rfb_Lock); if (mod->rfb_RefCount == 0) success = rfb_init(mod, tags); if (success) mod->rfb_RefCount++; TExecUnlock(mod->rfb_ExecBase, mod->rfb_Lock); if (success) return mod; return TNULL; }
static TAPTR rfb_modopen(struct rfb_Display *mod, TTAGITEM *tags) { TBOOL success = TTRUE; TExecLock(mod->rfb_ExecBase, mod->rfb_Lock); if (mod->rfb_RefCount == 0) success = rfb_init(mod, tags); if (success) mod->rfb_RefCount++; TExecUnlock(mod->rfb_ExecBase, mod->rfb_Lock); if (success) { /* Attributes that can be queried during open: */ TTAG p = TGetTag(tags, TVisual_HaveWindowManager, TNULL); if (p) *((TBOOL *) p) = TFALSE; return mod; } return TNULL; }
static int pci_fbuf_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts) { int error, prot; struct pci_fbuf_softc *sc; if (fbuf_sc != NULL) { fprintf(stderr, "Only one frame buffer device is allowed.\n"); return (-1); } sc = calloc(1, sizeof(struct pci_fbuf_softc)); pi->pi_arg = sc; /* initialize config space */ pci_set_cfgdata16(pi, PCIR_DEVICE, 0x40FB); pci_set_cfgdata16(pi, PCIR_VENDOR, 0xFB5D); pci_set_cfgdata8(pi, PCIR_CLASS, PCIC_DISPLAY); pci_set_cfgdata8(pi, PCIR_SUBCLASS, PCIS_DISPLAY_VGA); error = pci_emul_alloc_bar(pi, 0, PCIBAR_MEM32, DMEMSZ); assert(error == 0); error = pci_emul_alloc_bar(pi, 1, PCIBAR_MEM32, FB_SIZE); assert(error == 0); error = pci_emul_add_msicap(pi, PCI_FBUF_MSI_MSGS); assert(error == 0); sc->fbaddr = pi->pi_bar[1].addr; sc->memregs.fbsize = FB_SIZE; sc->memregs.width = COLS_DEFAULT; sc->memregs.height = ROWS_DEFAULT; sc->memregs.depth = 32; sc->fsc_pi = pi; error = pci_fbuf_parse_opts(sc, opts); if (error != 0) goto done; sc->fb_base = vm_create_devmem(ctx, VM_FRAMEBUFFER, "framebuffer", FB_SIZE); if (sc->fb_base == MAP_FAILED) { error = -1; goto done; } DPRINTF(DEBUG_INFO, ("fbuf frame buffer base: %p [sz %lu]\r\n", sc->fb_base, FB_SIZE)); /* * Map the framebuffer into the guest address space. * XXX This may fail if the BAR is different than a prior * run. In this case flag the error. This will be fixed * when a change_memseg api is available. */ prot = PROT_READ | PROT_WRITE; if (vm_mmap_memseg(ctx, sc->fbaddr, VM_FRAMEBUFFER, 0, FB_SIZE, prot) != 0) { fprintf(stderr, "pci_fbuf: mapseg failed - try deleting VM and restarting\n"); error = -1; goto done; } console_init(sc->memregs.width, sc->memregs.height, sc->fb_base); console_fb_register(pci_fbuf_render, sc); sc->vgasc = vga_init(!sc->use_vga); sc->gc_image = console_get_image(); fbuf_sc = sc; memset((void *)sc->fb_base, 0, FB_SIZE); error = rfb_init(sc->rfb_host, sc->rfb_port, sc->rfb_wait); done: if (error) free(sc); return (error); }
int main(int argc, char **argv) { log_init(NAME); if (argc <= 3) { syntax_print(); return 1; } const char *rfb_name = argv[1]; char *endptr; unsigned long width = strtoul(argv[2], &endptr, 0); if (*endptr != 0) { fprintf(stderr, "Invalid width\n"); syntax_print(); return 1; } unsigned long height = strtoul(argv[3], &endptr, 0); if (*endptr != 0) { fprintf(stderr, "Invalid height\n"); syntax_print(); return 1; } unsigned long port = 5900; if (argc > 4) { port = strtoul(argv[4], &endptr, 0); if (*endptr != 0) { fprintf(stderr, "Invalid port number\n"); syntax_print(); return 1; } } rfb_init(&rfb, width, height, rfb_name); vis = malloc(sizeof(visualizer_t)); if (vis == NULL) { fprintf(stderr, "Failed allocating visualizer struct\n"); return 3; } graph_init_visualizer(vis); pixel_mode.mode.index = 0; pixel_mode.mode.version = 0; pixel_mode.mode.refresh_rate = 0; pixel_mode.mode.screen_aspect.width = rfb.width; pixel_mode.mode.screen_aspect.height = rfb.height; pixel_mode.mode.screen_width = rfb.width; pixel_mode.mode.screen_height = rfb.height; pixel_mode.mode.cell_aspect.width = 1; pixel_mode.mode.cell_aspect.height = 1; pixel_mode.mode.cell_visual.pixel_visual = VISUAL_RGB_8_8_8; link_initialize(&pixel_mode.link); list_append(&pixel_mode.link, &vis->modes); vis->def_mode_idx = 0; vis->ops = rfb_ops; vis->dev_ctx = NULL; async_set_fallback_port_handler(client_connection, NULL); int rc = loc_server_register(NAME); if (rc != EOK) { printf("%s: Unable to register server.\n", NAME); return rc; } char *service_name; rc = asprintf(&service_name, "rfb/%s", rfb_name); if (rc < 0) { printf(NAME ": Unable to create service name\n"); return rc; } service_id_t service_id; rc = loc_service_register(service_name, &service_id); if (rc != EOK) { printf(NAME ": Unable to register service %s.\n", service_name); return rc; } free(service_name); category_id_t visualizer_category; rc = loc_category_get_id("visualizer", &visualizer_category, IPC_FLAG_BLOCKING); if (rc != EOK) { fprintf(stderr, NAME ": Unable to get visualizer category id.\n"); return 1; } rc = loc_service_add_to_cat(service_id, visualizer_category); if (rc != EOK) { fprintf(stderr, NAME ": Unable to add service to visualizer category.\n"); return 1; } rc = rfb_listen(&rfb, port); if (rc != EOK) { fprintf(stderr, NAME ": Unable to listen at rfb port\n"); return 2; } printf("%s: Accepting connections\n", NAME); task_retval(0); async_manager(); /* Not reached */ return 0; }