xref: /freebsd/usr.sbin/bhyve/console.c (revision 4d65a7c6951cea0333f1a0c1b32c38489cdfa6c5)
12cf9911fSPeter Grehan /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3ce80faa4SMarcelo Araujo  *
42cf9911fSPeter Grehan  * Copyright (c) 2015 Tycho Nightingale <tycho.nightingale@pluribusnetworks.com>
52cf9911fSPeter Grehan  * All rights reserved.
62cf9911fSPeter Grehan  *
72cf9911fSPeter Grehan  * Redistribution and use in source and binary forms, with or without
82cf9911fSPeter Grehan  * modification, are permitted provided that the following conditions
92cf9911fSPeter Grehan  * are met:
102cf9911fSPeter Grehan  * 1. Redistributions of source code must retain the above copyright
112cf9911fSPeter Grehan  *    notice, this list of conditions and the following disclaimer.
122cf9911fSPeter Grehan  * 2. Redistributions in binary form must reproduce the above copyright
132cf9911fSPeter Grehan  *    notice, this list of conditions and the following disclaimer in the
142cf9911fSPeter Grehan  *    documentation and/or other materials provided with the distribution.
152cf9911fSPeter Grehan  *
162cf9911fSPeter Grehan  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
172cf9911fSPeter Grehan  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
182cf9911fSPeter Grehan  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
192cf9911fSPeter Grehan  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
202cf9911fSPeter Grehan  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
212cf9911fSPeter Grehan  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
222cf9911fSPeter Grehan  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
232cf9911fSPeter Grehan  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
242cf9911fSPeter Grehan  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
252cf9911fSPeter Grehan  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
262cf9911fSPeter Grehan  * SUCH DAMAGE.
272cf9911fSPeter Grehan  */
282cf9911fSPeter Grehan 
292cf9911fSPeter Grehan #include <sys/types.h>
302cf9911fSPeter Grehan 
312cf9911fSPeter Grehan #include "bhyvegc.h"
322cf9911fSPeter Grehan #include "console.h"
332cf9911fSPeter Grehan 
342cf9911fSPeter Grehan static struct {
352cf9911fSPeter Grehan 	struct bhyvegc		*gc;
362cf9911fSPeter Grehan 
372cf9911fSPeter Grehan 	fb_render_func_t	fb_render_cb;
382cf9911fSPeter Grehan 	void			*fb_arg;
392cf9911fSPeter Grehan 
402cf9911fSPeter Grehan 	kbd_event_func_t	kbd_event_cb;
412cf9911fSPeter Grehan 	void			*kbd_arg;
422cf9911fSPeter Grehan 	int			kbd_priority;
432cf9911fSPeter Grehan 
442cf9911fSPeter Grehan 	ptr_event_func_t	ptr_event_cb;
452cf9911fSPeter Grehan 	void			*ptr_arg;
462cf9911fSPeter Grehan 	int			ptr_priority;
472cf9911fSPeter Grehan } console;
482cf9911fSPeter Grehan 
492cf9911fSPeter Grehan void
console_init(int w,int h,void * fbaddr)502cf9911fSPeter Grehan console_init(int w, int h, void *fbaddr)
512cf9911fSPeter Grehan {
522cf9911fSPeter Grehan 	console.gc = bhyvegc_init(w, h, fbaddr);
532cf9911fSPeter Grehan }
542cf9911fSPeter Grehan 
552cf9911fSPeter Grehan void
console_set_fbaddr(void * fbaddr)562cf9911fSPeter Grehan console_set_fbaddr(void *fbaddr)
572cf9911fSPeter Grehan {
582cf9911fSPeter Grehan 	bhyvegc_set_fbaddr(console.gc, fbaddr);
592cf9911fSPeter Grehan }
602cf9911fSPeter Grehan 
612cf9911fSPeter Grehan struct bhyvegc_image *
console_get_image(void)622cf9911fSPeter Grehan console_get_image(void)
632cf9911fSPeter Grehan {
642cf9911fSPeter Grehan 	struct bhyvegc_image *bhyvegc_image;
652cf9911fSPeter Grehan 
662cf9911fSPeter Grehan 	bhyvegc_image = bhyvegc_get_image(console.gc);
672cf9911fSPeter Grehan 
682cf9911fSPeter Grehan 	return (bhyvegc_image);
692cf9911fSPeter Grehan }
702cf9911fSPeter Grehan 
712cf9911fSPeter Grehan void
console_fb_register(fb_render_func_t render_cb,void * arg)722cf9911fSPeter Grehan console_fb_register(fb_render_func_t render_cb, void *arg)
732cf9911fSPeter Grehan {
742cf9911fSPeter Grehan 	console.fb_render_cb = render_cb;
752cf9911fSPeter Grehan 	console.fb_arg = arg;
762cf9911fSPeter Grehan }
772cf9911fSPeter Grehan 
782cf9911fSPeter Grehan void
console_refresh(void)792cf9911fSPeter Grehan console_refresh(void)
802cf9911fSPeter Grehan {
812cf9911fSPeter Grehan 	if (console.fb_render_cb)
822cf9911fSPeter Grehan 		(*console.fb_render_cb)(console.gc, console.fb_arg);
832cf9911fSPeter Grehan }
842cf9911fSPeter Grehan 
852cf9911fSPeter Grehan void
console_kbd_register(kbd_event_func_t event_cb,void * arg,int pri)862cf9911fSPeter Grehan console_kbd_register(kbd_event_func_t event_cb, void *arg, int pri)
872cf9911fSPeter Grehan {
882cf9911fSPeter Grehan 	if (pri > console.kbd_priority) {
892cf9911fSPeter Grehan 		console.kbd_event_cb = event_cb;
902cf9911fSPeter Grehan 		console.kbd_arg = arg;
912cf9911fSPeter Grehan 		console.kbd_priority = pri;
922cf9911fSPeter Grehan 	}
932cf9911fSPeter Grehan }
942cf9911fSPeter Grehan 
952cf9911fSPeter Grehan void
console_ptr_register(ptr_event_func_t event_cb,void * arg,int pri)962cf9911fSPeter Grehan console_ptr_register(ptr_event_func_t event_cb, void *arg, int pri)
972cf9911fSPeter Grehan {
982cf9911fSPeter Grehan 	if (pri > console.ptr_priority) {
992cf9911fSPeter Grehan 		console.ptr_event_cb = event_cb;
1002cf9911fSPeter Grehan 		console.ptr_arg = arg;
1012cf9911fSPeter Grehan 		console.ptr_priority = pri;
1022cf9911fSPeter Grehan 	}
1032cf9911fSPeter Grehan }
1042cf9911fSPeter Grehan 
1052cf9911fSPeter Grehan void
console_key_event(int down,uint32_t keysym,uint32_t keycode)106b563ff5dSMichael Reifenberger console_key_event(int down, uint32_t keysym, uint32_t keycode)
1072cf9911fSPeter Grehan {
1082cf9911fSPeter Grehan 	if (console.kbd_event_cb)
109b563ff5dSMichael Reifenberger 		(*console.kbd_event_cb)(down, keysym, keycode, console.kbd_arg);
1102cf9911fSPeter Grehan }
1112cf9911fSPeter Grehan 
1122cf9911fSPeter Grehan void
console_ptr_event(uint8_t button,int x,int y)1132cf9911fSPeter Grehan console_ptr_event(uint8_t button, int x, int y)
1142cf9911fSPeter Grehan {
1152cf9911fSPeter Grehan 	if (console.ptr_event_cb)
1162cf9911fSPeter Grehan 		(*console.ptr_event_cb)(button, x, y, console.ptr_arg);
1172cf9911fSPeter Grehan }
118