static int cmd_vscreen_unbind(struct vmm_chardev *cdev, const char *fb_name) { struct fb_info *info; if (fb_name) { info = fb_find(fb_name); } else { info = fb_find("fb0"); } if (!info) { vmm_cprintf(cdev, "Failed to find fb_info\n"); return VMM_ENODEV; } return vscreen_unbind(info); }
int __init arch_board_final_init(void) { int rc; struct vmm_devtree_node *node; #if defined(CONFIG_VTEMU) struct fb_info *info; #endif /* All VMM API's are available here */ /* We can register a Board specific resource here */ /* Find simple-bus node */ node = vmm_devtree_find_compatible(NULL, NULL, "simple-bus"); if (!node) { return VMM_ENODEV; } /* Do platform device probing using device driver framework */ rc = vmm_platform_probe(node); vmm_devtree_dref_node(node); if (rc) { return rc; } /* Create VTEMU instace if available */ #if defined(CONFIG_VTEMU) info = fb_find("fb0"); if (info) { generic_vt = vtemu_create(info->name, info, NULL); } #endif /* Final init of generic boards with * matching nodeid table enteries. */ if (generic_board_matches) { vmm_devtree_iterate_matching(NULL, generic_board_matches, generic_board_final, NULL); } return VMM_OK; }
static int cmd_vscreen_bind(struct vmm_chardev *cdev, bool is_hard, const char *guest_name, const char *refresh_rate, const char *fb_name, const char *vdisplay_name, const char *vkeyboard_name, const char *vmouse_name) { int rc; u32 rate, ekey[3]; struct fb_info *info; struct vmm_guest *guest = NULL; struct vmm_vdisplay *vdis = NULL; struct vmm_vkeyboard *vkbd = NULL; struct vmm_vmouse *vmou = NULL; struct vscreen_iter iter; guest = vmm_manager_guest_find(guest_name); if (!guest) { vmm_cprintf(cdev, "Failed to find guest %s\n", guest_name); return VMM_ENOTAVAIL; } if (refresh_rate) { rate = (u32)strtoul(refresh_rate, NULL, 10); } else { rate = VSCREEN_REFRESH_RATE_GOOD; } if ((rate < VSCREEN_REFRESH_RATE_MIN) || (VSCREEN_REFRESH_RATE_MAX < rate)) { vmm_cprintf(cdev, "Invalid refresh rate %d\n", rate); vmm_cprintf(cdev, "Refresh rate should be " "between %d and %d\n", VSCREEN_REFRESH_RATE_MIN, VSCREEN_REFRESH_RATE_MAX); return VMM_EINVALID; } if (fb_name) { info = fb_find(fb_name); } else { info = fb_find("fb0"); } if (!info) { vmm_cprintf(cdev, "Failed to find fb_info %s\n", fb_name); return VMM_ENOTAVAIL; } if (vdisplay_name) { vdis = vmm_vdisplay_find(vdisplay_name); } else { iter.found = FALSE; iter.print = FALSE; iter.cdev = cdev; iter.guest = guest; iter.vdis = NULL; iter.vkbd = NULL; iter.vmou = NULL; vmm_vdisplay_iterate(NULL, &iter, cmd_vscreen_vdisplay_iter); vdis = (iter.found) ? iter.vdis : NULL; } if (!vdis) { vmm_cprintf(cdev, "Failed to find virtual display%s %s\n", (vdisplay_name) ? "" : " for guest", (vdisplay_name) ? vdisplay_name : guest->name); return VMM_ENOTAVAIL; } if (vkeyboard_name) { vkbd = vmm_vkeyboard_find(vkeyboard_name); } else { iter.found = FALSE; iter.print = FALSE; iter.cdev = cdev; iter.guest = guest; iter.vdis = NULL; iter.vkbd = NULL; iter.vmou = NULL; vmm_vkeyboard_iterate(NULL, &iter, cmd_vscreen_vkeyboard_iter); vkbd = (iter.found) ? iter.vkbd : NULL; } if (!vkbd && vkeyboard_name) { vmm_cprintf(cdev, "Failed to find virtual keyboard %s\n", vkeyboard_name); return VMM_ENOTAVAIL; } if (vmouse_name) { vmou = vmm_vmouse_find(vmouse_name); } else { iter.found = FALSE; iter.print = FALSE; iter.cdev = cdev; iter.guest = guest; iter.vdis = NULL; iter.vkbd = NULL; iter.vmou = NULL; vmm_vmouse_iterate(NULL, &iter, cmd_vscreen_vmouse_iter); vmou = (iter.found) ? iter.vmou : NULL; } if (!vmou && vmouse_name) { vmm_cprintf(cdev, "Failed to find virtual mouse %s\n", vmouse_name); return VMM_ENOTAVAIL; } ekey[0] = KEY_ESC; ekey[1] = KEY_X; ekey[2] = KEY_Q; vmm_cprintf(cdev, "Guest name : %s\n", guest->name); if (!is_hard) { vmm_cprintf(cdev, "Refresh rate : %d per-second\n", rate); } vmm_cprintf(cdev, "Escape Keys : ESC+X+Q\n"); vmm_cprintf(cdev, "Frame buffer : %s\n", info->name); vmm_cprintf(cdev, "Virtual display : %s\n", vdis->name); vmm_cprintf(cdev, "Virtual keyboard: %s\n", (vkbd) ? vkbd->name : "---"); vmm_cprintf(cdev, "Virtual mouse : %s\n", (vmou) ? vmou->name : "---"); if (is_hard) { rc = vscreen_hard_bind(ekey[0], ekey[1], ekey[2], info, vdis, vkbd, vmou); } else { rc = vscreen_soft_bind(rate, ekey[0], ekey[1], ekey[2], info, vdis, vkbd, vmou); } return rc; }