1 1.6 bouyer /* $NetBSD: pvh_consinit.c,v 1.6 2023/10/17 13:27:58 bouyer Exp $ */ 2 1.1 bouyer 3 1.1 bouyer /* 4 1.1 bouyer * Copyright (c) 2020 Manuel Bouyer. 5 1.1 bouyer * 6 1.1 bouyer * Redistribution and use in source and binary forms, with or without 7 1.1 bouyer * modification, are permitted provided that the following conditions 8 1.1 bouyer * are met: 9 1.1 bouyer * 1. Redistributions of source code must retain the above copyright 10 1.1 bouyer * notice, this list of conditions and the following disclaimer. 11 1.1 bouyer * 2. Redistributions in binary form must reproduce the above copyright 12 1.1 bouyer * notice, this list of conditions and the following disclaimer in the 13 1.1 bouyer * documentation and/or other materials provided with the distribution. 14 1.1 bouyer * 15 1.1 bouyer * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 1.1 bouyer * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 1.1 bouyer * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 1.1 bouyer * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 1.1 bouyer * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 1.1 bouyer * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 1.1 bouyer * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 1.1 bouyer * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 1.1 bouyer * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 1.1 bouyer * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 1.1 bouyer * 26 1.1 bouyer */ 27 1.1 bouyer 28 1.1 bouyer #include <sys/cdefs.h> 29 1.6 bouyer __KERNEL_RCSID(0, "$NetBSD: pvh_consinit.c,v 1.6 2023/10/17 13:27:58 bouyer Exp $"); 30 1.1 bouyer 31 1.1 bouyer #include "xencons.h" 32 1.1 bouyer #include <sys/param.h> 33 1.1 bouyer #include <sys/systm.h> 34 1.1 bouyer #include <sys/device.h> 35 1.1 bouyer #include <uvm/uvm_extern.h> 36 1.1 bouyer #include <uvm/uvm_prot.h> 37 1.1 bouyer 38 1.1 bouyer #include <dev/cons.h> 39 1.1 bouyer #include <xen/xen.h> 40 1.1 bouyer #include <xen/hypervisor.h> 41 1.1 bouyer #include <xen/include/public/hvm/hvm_op.h> 42 1.1 bouyer #include <xen/include/public/hvm/params.h> 43 1.1 bouyer 44 1.4 mrg #include "xen_def_cons.h" 45 1.4 mrg 46 1.3 bouyer int 47 1.1 bouyer xen_pvh_consinit(void) 48 1.1 bouyer { 49 1.1 bouyer /* 50 1.1 bouyer * hugly hack because we're called multiple times at different 51 1.1 bouyer * boot stage. 52 1.1 bouyer */ 53 1.1 bouyer static int initted = 0; 54 1.6 bouyer 55 1.6 bouyer if (initted == 0) { 56 1.6 bouyer /* fall back to printk() until we can setup our console */ 57 1.6 bouyer xen_early_console(); 58 1.6 bouyer } 59 1.3 bouyer if (xendomain_is_dom0()) { 60 1.3 bouyer union xen_cmdline_parseinfo xcp; 61 1.3 bouyer xen_parse_cmdline(XEN_PARSE_CONSOLE, &xcp); 62 1.3 bouyer #ifdef CONS_OVERRIDE 63 1.3 bouyer if (strcmp(default_consinfo.devname, "tty0") == 0 || 64 1.3 bouyer strcmp(default_consinfo.devname, "pc") == 0) { 65 1.3 bouyer #else 66 1.3 bouyer if (strcmp(xcp.xcp_console, "tty0") == 0 || /* linux name */ 67 1.3 bouyer strcmp(xcp.xcp_console, "pc") == 0) { /* NetBSD name */ 68 1.3 bouyer #endif /* CONS_OVERRIDE */ 69 1.6 bouyer initted++; 70 1.3 bouyer return 0; /* native console code will do it */ 71 1.3 bouyer } 72 1.3 bouyer } 73 1.2 bouyer if (initted == 0 && !xendomain_is_dom0()) { 74 1.6 bouyer /* pmap not up yet */ 75 1.1 bouyer initted++; 76 1.3 bouyer return 1; 77 1.1 bouyer } else if (initted > 1) { 78 1.3 bouyer return 1; 79 1.1 bouyer } 80 1.1 bouyer initted++; 81 1.2 bouyer if (xendomain_is_dom0()) { 82 1.3 bouyer /* we know we're using Xen's console at this point */ 83 1.2 bouyer xenconscn_attach(); /* no ring in this case */ 84 1.2 bouyer initted++; /* don't init console twice */ 85 1.3 bouyer return 1; 86 1.2 bouyer } 87 1.3 bouyer 88 1.1 bouyer #if NXENCONS > 0 89 1.1 bouyer /* we can now map the xencons rings. */ 90 1.1 bouyer struct xen_hvm_param xen_hvm_param; 91 1.1 bouyer 92 1.1 bouyer 93 1.1 bouyer xen_hvm_param.domid = DOMID_SELF; 94 1.1 bouyer xen_hvm_param.index = HVM_PARAM_CONSOLE_PFN; 95 1.1 bouyer 96 1.1 bouyer if ( HYPERVISOR_hvm_op(HVMOP_get_param, &xen_hvm_param) < 0) 97 1.1 bouyer panic("xen_pvh_consinit: can't get console PFN"); 98 1.1 bouyer 99 1.1 bouyer xen_start_info.console.domU.mfn = xen_hvm_param.value; 100 1.1 bouyer pmap_kenter_pa((vaddr_t) xencons_interface, ptoa(xen_hvm_param.value), 101 1.1 bouyer VM_PROT_READ|VM_PROT_WRITE, 0); 102 1.1 bouyer 103 1.1 bouyer xen_hvm_param.domid = DOMID_SELF; 104 1.1 bouyer xen_hvm_param.index = HVM_PARAM_CONSOLE_EVTCHN; 105 1.1 bouyer 106 1.1 bouyer if ( HYPERVISOR_hvm_op(HVMOP_get_param, &xen_hvm_param) < 0) 107 1.1 bouyer panic("xen_pvh_consinit: can't get console event"); 108 1.1 bouyer 109 1.1 bouyer xen_start_info.console.domU.evtchn = xen_hvm_param.value; 110 1.1 bouyer xenconscn_attach(); 111 1.1 bouyer #endif 112 1.3 bouyer return 1; 113 1.1 bouyer } 114