1*ca987d46SWarner Losh /*- 2*ca987d46SWarner Losh * Copyright (c) 2011 Doug Rabson 3*ca987d46SWarner Losh * All rights reserved. 4*ca987d46SWarner Losh * 5*ca987d46SWarner Losh * Redistribution and use in source and binary forms, with or without 6*ca987d46SWarner Losh * modification, are permitted provided that the following conditions 7*ca987d46SWarner Losh * are met: 8*ca987d46SWarner Losh * 1. Redistributions of source code must retain the above copyright 9*ca987d46SWarner Losh * notice, this list of conditions and the following disclaimer. 10*ca987d46SWarner Losh * 2. Redistributions in binary form must reproduce the above copyright 11*ca987d46SWarner Losh * notice, this list of conditions and the following disclaimer in the 12*ca987d46SWarner Losh * documentation and/or other materials provided with the distribution. 13*ca987d46SWarner Losh * 14*ca987d46SWarner Losh * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15*ca987d46SWarner Losh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16*ca987d46SWarner Losh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17*ca987d46SWarner Losh * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18*ca987d46SWarner Losh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19*ca987d46SWarner Losh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20*ca987d46SWarner Losh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21*ca987d46SWarner Losh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22*ca987d46SWarner Losh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23*ca987d46SWarner Losh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24*ca987d46SWarner Losh * SUCH DAMAGE. 25*ca987d46SWarner Losh * 26*ca987d46SWarner Losh * $FreeBSD$ 27*ca987d46SWarner Losh */ 28*ca987d46SWarner Losh 29*ca987d46SWarner Losh /* 30*ca987d46SWarner Losh * USERBOOT interface versions 31*ca987d46SWarner Losh */ 32*ca987d46SWarner Losh #define USERBOOT_VERSION_1 1 33*ca987d46SWarner Losh #define USERBOOT_VERSION_2 2 34*ca987d46SWarner Losh #define USERBOOT_VERSION_3 3 35*ca987d46SWarner Losh 36*ca987d46SWarner Losh /* 37*ca987d46SWarner Losh * Version 4 added more generic callbacks for setting up 38*ca987d46SWarner Losh * registers and descriptors. The callback structure is 39*ca987d46SWarner Losh * backward compatible (new callbacks have been added at 40*ca987d46SWarner Losh * the tail end). 41*ca987d46SWarner Losh */ 42*ca987d46SWarner Losh #define USERBOOT_VERSION_4 4 43*ca987d46SWarner Losh 44*ca987d46SWarner Losh /* 45*ca987d46SWarner Losh * Exit codes from the loader 46*ca987d46SWarner Losh */ 47*ca987d46SWarner Losh #define USERBOOT_EXIT_QUIT 1 48*ca987d46SWarner Losh #define USERBOOT_EXIT_REBOOT 2 49*ca987d46SWarner Losh 50*ca987d46SWarner Losh struct loader_callbacks { 51*ca987d46SWarner Losh /* 52*ca987d46SWarner Losh * Console i/o 53*ca987d46SWarner Losh */ 54*ca987d46SWarner Losh 55*ca987d46SWarner Losh /* 56*ca987d46SWarner Losh * Wait until a key is pressed on the console and then return it 57*ca987d46SWarner Losh */ 58*ca987d46SWarner Losh int (*getc)(void *arg); 59*ca987d46SWarner Losh 60*ca987d46SWarner Losh /* 61*ca987d46SWarner Losh * Write the character ch to the console 62*ca987d46SWarner Losh */ 63*ca987d46SWarner Losh void (*putc)(void *arg, int ch); 64*ca987d46SWarner Losh 65*ca987d46SWarner Losh /* 66*ca987d46SWarner Losh * Return non-zero if a key can be read from the console 67*ca987d46SWarner Losh */ 68*ca987d46SWarner Losh int (*poll)(void *arg); 69*ca987d46SWarner Losh 70*ca987d46SWarner Losh /* 71*ca987d46SWarner Losh * Host filesystem i/o 72*ca987d46SWarner Losh */ 73*ca987d46SWarner Losh 74*ca987d46SWarner Losh /* 75*ca987d46SWarner Losh * Open a file in the host filesystem 76*ca987d46SWarner Losh */ 77*ca987d46SWarner Losh int (*open)(void *arg, const char *filename, void **h_return); 78*ca987d46SWarner Losh 79*ca987d46SWarner Losh /* 80*ca987d46SWarner Losh * Close a file 81*ca987d46SWarner Losh */ 82*ca987d46SWarner Losh int (*close)(void *arg, void *h); 83*ca987d46SWarner Losh 84*ca987d46SWarner Losh /* 85*ca987d46SWarner Losh * Return non-zero if the file is a directory 86*ca987d46SWarner Losh */ 87*ca987d46SWarner Losh int (*isdir)(void *arg, void *h); 88*ca987d46SWarner Losh 89*ca987d46SWarner Losh /* 90*ca987d46SWarner Losh * Read size bytes from a file. The number of bytes remaining 91*ca987d46SWarner Losh * in dst after reading is returned in *resid_return 92*ca987d46SWarner Losh */ 93*ca987d46SWarner Losh int (*read)(void *arg, void *h, void *dst, size_t size, 94*ca987d46SWarner Losh size_t *resid_return); 95*ca987d46SWarner Losh 96*ca987d46SWarner Losh /* 97*ca987d46SWarner Losh * Read an entry from a directory. The entry's inode number is 98*ca987d46SWarner Losh * returned in *fileno_return, its type in *type_return and 99*ca987d46SWarner Losh * the name length in *namelen_return. The name itself is 100*ca987d46SWarner Losh * copied to the buffer name which must be at least PATH_MAX 101*ca987d46SWarner Losh * in size. 102*ca987d46SWarner Losh */ 103*ca987d46SWarner Losh int (*readdir)(void *arg, void *h, uint32_t *fileno_return, 104*ca987d46SWarner Losh uint8_t *type_return, size_t *namelen_return, char *name); 105*ca987d46SWarner Losh 106*ca987d46SWarner Losh /* 107*ca987d46SWarner Losh * Seek to a location within an open file 108*ca987d46SWarner Losh */ 109*ca987d46SWarner Losh int (*seek)(void *arg, void *h, uint64_t offset, 110*ca987d46SWarner Losh int whence); 111*ca987d46SWarner Losh 112*ca987d46SWarner Losh /* 113*ca987d46SWarner Losh * Return some stat(2) related information about the file 114*ca987d46SWarner Losh */ 115*ca987d46SWarner Losh int (*stat)(void *arg, void *h, int *mode_return, 116*ca987d46SWarner Losh int *uid_return, int *gid_return, uint64_t *size_return); 117*ca987d46SWarner Losh 118*ca987d46SWarner Losh /* 119*ca987d46SWarner Losh * Disk image i/o 120*ca987d46SWarner Losh */ 121*ca987d46SWarner Losh 122*ca987d46SWarner Losh /* 123*ca987d46SWarner Losh * Read from a disk image at the given offset 124*ca987d46SWarner Losh */ 125*ca987d46SWarner Losh int (*diskread)(void *arg, int unit, uint64_t offset, 126*ca987d46SWarner Losh void *dst, size_t size, size_t *resid_return); 127*ca987d46SWarner Losh 128*ca987d46SWarner Losh /* 129*ca987d46SWarner Losh * Guest virtual machine i/o 130*ca987d46SWarner Losh */ 131*ca987d46SWarner Losh 132*ca987d46SWarner Losh /* 133*ca987d46SWarner Losh * Copy to the guest address space 134*ca987d46SWarner Losh */ 135*ca987d46SWarner Losh int (*copyin)(void *arg, const void *from, 136*ca987d46SWarner Losh uint64_t to, size_t size); 137*ca987d46SWarner Losh 138*ca987d46SWarner Losh /* 139*ca987d46SWarner Losh * Copy from the guest address space 140*ca987d46SWarner Losh */ 141*ca987d46SWarner Losh int (*copyout)(void *arg, uint64_t from, 142*ca987d46SWarner Losh void *to, size_t size); 143*ca987d46SWarner Losh 144*ca987d46SWarner Losh /* 145*ca987d46SWarner Losh * Set a guest register value 146*ca987d46SWarner Losh */ 147*ca987d46SWarner Losh void (*setreg)(void *arg, int, uint64_t); 148*ca987d46SWarner Losh 149*ca987d46SWarner Losh /* 150*ca987d46SWarner Losh * Set a guest MSR value 151*ca987d46SWarner Losh */ 152*ca987d46SWarner Losh void (*setmsr)(void *arg, int, uint64_t); 153*ca987d46SWarner Losh 154*ca987d46SWarner Losh /* 155*ca987d46SWarner Losh * Set a guest CR value 156*ca987d46SWarner Losh */ 157*ca987d46SWarner Losh void (*setcr)(void *arg, int, uint64_t); 158*ca987d46SWarner Losh 159*ca987d46SWarner Losh /* 160*ca987d46SWarner Losh * Set the guest GDT address 161*ca987d46SWarner Losh */ 162*ca987d46SWarner Losh void (*setgdt)(void *arg, uint64_t, size_t); 163*ca987d46SWarner Losh 164*ca987d46SWarner Losh /* 165*ca987d46SWarner Losh * Transfer control to the guest at the given address 166*ca987d46SWarner Losh */ 167*ca987d46SWarner Losh void (*exec)(void *arg, uint64_t pc); 168*ca987d46SWarner Losh 169*ca987d46SWarner Losh /* 170*ca987d46SWarner Losh * Misc 171*ca987d46SWarner Losh */ 172*ca987d46SWarner Losh 173*ca987d46SWarner Losh /* 174*ca987d46SWarner Losh * Sleep for usec microseconds 175*ca987d46SWarner Losh */ 176*ca987d46SWarner Losh void (*delay)(void *arg, int usec); 177*ca987d46SWarner Losh 178*ca987d46SWarner Losh /* 179*ca987d46SWarner Losh * Exit with the given exit code 180*ca987d46SWarner Losh */ 181*ca987d46SWarner Losh void (*exit)(void *arg, int v); 182*ca987d46SWarner Losh 183*ca987d46SWarner Losh /* 184*ca987d46SWarner Losh * Return guest physical memory map details 185*ca987d46SWarner Losh */ 186*ca987d46SWarner Losh void (*getmem)(void *arg, uint64_t *lowmem, 187*ca987d46SWarner Losh uint64_t *highmem); 188*ca987d46SWarner Losh 189*ca987d46SWarner Losh /* 190*ca987d46SWarner Losh * ioctl interface to the disk device 191*ca987d46SWarner Losh */ 192*ca987d46SWarner Losh int (*diskioctl)(void *arg, int unit, u_long cmd, 193*ca987d46SWarner Losh void *data); 194*ca987d46SWarner Losh 195*ca987d46SWarner Losh /* 196*ca987d46SWarner Losh * Returns an environment variable in the form "name=value". 197*ca987d46SWarner Losh * 198*ca987d46SWarner Losh * If there are no more variables that need to be set in the 199*ca987d46SWarner Losh * loader environment then return NULL. 200*ca987d46SWarner Losh * 201*ca987d46SWarner Losh * 'num' is used as a handle for the callback to identify which 202*ca987d46SWarner Losh * environment variable to return next. It will begin at 0 and 203*ca987d46SWarner Losh * each invocation will add 1 to the previous value of 'num'. 204*ca987d46SWarner Losh */ 205*ca987d46SWarner Losh const char * (*getenv)(void *arg, int num); 206*ca987d46SWarner Losh 207*ca987d46SWarner Losh /* 208*ca987d46SWarner Losh * Version 4 additions. 209*ca987d46SWarner Losh */ 210*ca987d46SWarner Losh int (*vm_set_register)(void *arg, int vcpu, int reg, uint64_t val); 211*ca987d46SWarner Losh int (*vm_set_desc)(void *arg, int vcpu, int reg, uint64_t base, 212*ca987d46SWarner Losh u_int limit, u_int access); 213*ca987d46SWarner Losh }; 214