userboot.h revision 239058
190075Sobrien/*-
290075Sobrien * Copyright (c) 2011 Doug Rabson
3169689Skan * All rights reserved.
4169689Skan *
590075Sobrien * Redistribution and use in source and binary forms, with or without
690075Sobrien * modification, are permitted provided that the following conditions
790075Sobrien * are met:
890075Sobrien * 1. Redistributions of source code must retain the above copyright
990075Sobrien *    notice, this list of conditions and the following disclaimer.
1090075Sobrien * 2. Redistributions in binary form must reproduce the above copyright
1190075Sobrien *    notice, this list of conditions and the following disclaimer in the
1290075Sobrien *    documentation and/or other materials provided with the distribution.
1390075Sobrien *
1490075Sobrien * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1590075Sobrien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1690075Sobrien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1790075Sobrien * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1890075Sobrien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1990075Sobrien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20169689Skan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21169689Skan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2290075Sobrien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2390075Sobrien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24132718Skan * SUCH DAMAGE.
2590075Sobrien *
2690075Sobrien * $FreeBSD: head/sys/boot/userboot/userboot.h 239058 2012-08-05 12:15:15Z ae $
2790075Sobrien */
2890075Sobrien
2990075Sobrien/*
3090075Sobrien * USERBOOT interface versions
3190075Sobrien */
3290075Sobrien#define	USERBOOT_VERSION_1      1
3390075Sobrien
3490075Sobrien/*
3590075Sobrien * Exit codes from the loader
3690075Sobrien */
3790075Sobrien#define	USERBOOT_EXIT_QUIT      1
3890075Sobrien#define	USERBOOT_EXIT_REBOOT    2
3990075Sobrien
4090075Sobrienstruct loader_callbacks_v1 {
4190075Sobrien	/*
42117395Skan	 * Console i/o
43132718Skan	 */
44132718Skan
45132718Skan        /*
46132718Skan         * Wait until a key is pressed on the console and then return it
4790075Sobrien         */
4890075Sobrien	int		(*getc)(void *arg);
4990075Sobrien
5090075Sobrien        /*
51132718Skan         * Write the character ch to the console
52132718Skan         */
5390075Sobrien	void		(*putc)(void *arg, int ch);
5490075Sobrien
5590075Sobrien        /*
5690075Sobrien         * Return non-zero if a key can be read from the console
5790075Sobrien         */
5890075Sobrien	int		(*poll)(void *arg);
5990075Sobrien
6090075Sobrien	/*
6190075Sobrien	 * Host filesystem i/o
6290075Sobrien	 */
6390075Sobrien
64169689Skan        /*
65169689Skan         * Open a file in the host filesystem
66169689Skan         */
67169689Skan	int		(*open)(void *arg, const char *filename, void **h_return);
68132718Skan
6990075Sobrien        /*
7090075Sobrien         * Close a file
7190075Sobrien         */
72169689Skan	int		(*close)(void *arg, void *h);
7390075Sobrien
74132718Skan        /*
75132718Skan         * Return non-zero if the file is a directory
7690075Sobrien         */
77169689Skan	int		(*isdir)(void *arg, void *h);
78169689Skan
7990075Sobrien        /*
8090075Sobrien         * Read size bytes from a file. The number of bytes remaining
8190075Sobrien         * in dst after reading is returned in *resid_return
82132718Skan         */
8390075Sobrien	int		(*read)(void *arg, void *h, void *dst, size_t size,
84169689Skan            size_t *resid_return);
85169689Skan
8690075Sobrien        /*
87169689Skan         * Read an entry from a directory. The entry's inode number is
88169689Skan         * returned in *fileno_return, its type in *type_return and
89169689Skan         * the name length in *namelen_return. The name itself is
90169689Skan         * copied to the buffer name which must be at least PATH_MAX
91169689Skan         * in size.
92169689Skan         */
9390075Sobrien	int		(*readdir)(void *arg, void *h, uint32_t *fileno_return,
9490075Sobrien            uint8_t *type_return, size_t *namelen_return, char *name);
9590075Sobrien
9690075Sobrien        /*
9790075Sobrien         * Seek to a location within an open file
9890075Sobrien         */
99169689Skan	int		(*seek)(void *arg, void *h, uint64_t offset,
10090075Sobrien            int whence);
10190075Sobrien
102169689Skan        /*
10390075Sobrien         * Return some stat(2) related information about the file
10490075Sobrien         */
10590075Sobrien	int		(*stat)(void *arg, void *h, int *mode_return,
10690075Sobrien            int *uid_return, int *gid_return, uint64_t *size_return);
10790075Sobrien
108132718Skan	/*
10990075Sobrien	 * Disk image i/o
110117395Skan	 */
11190075Sobrien
112169689Skan        /*
11390075Sobrien         * Read from a disk image at the given offset
114117395Skan         */
11590075Sobrien	int		(*diskread)(void *arg, int unit, uint64_t offset,
116169689Skan            void *dst, size_t size, size_t *resid_return);
117169689Skan
118169689Skan	/*
119169689Skan	 * Guest virtual machine i/o
12090075Sobrien	 */
12190075Sobrien
122169689Skan        /*
123169689Skan         * Copy to the guest address space
124169689Skan         */
125169689Skan	int		(*copyin)(void *arg, const void *from,
12690075Sobrien            uint64_t to, size_t size);
127169689Skan
12890075Sobrien        /*
12990075Sobrien         * Copy from the guest address space
13090075Sobrien         */
13190075Sobrien	int		(*copyout)(void *arg, uint64_t from,
13290075Sobrien            void *to, size_t size);
133132718Skan
13490075Sobrien        /*
13590075Sobrien         * Set a guest register value
136169689Skan         */
13790075Sobrien	void		(*setreg)(void *arg, int, uint64_t);
13890075Sobrien
13990075Sobrien        /*
140117395Skan         * Set a guest MSR value
141117395Skan         */
142132718Skan	void		(*setmsr)(void *arg, int, uint64_t);
143117395Skan
144117395Skan        /*
145117395Skan         * Set a guest CR value
146117395Skan         */
147117395Skan	void		(*setcr)(void *arg, int, uint64_t);
148117395Skan
14990075Sobrien        /*
150117395Skan         * Set the guest GDT address
15190075Sobrien         */
152132718Skan        void            (*setgdt)(void *arg, uint64_t, size_t);
15396263Sobrien
154117395Skan        /*
155117395Skan         * Transfer control to the guest at the given address
156169689Skan         */
157169689Skan	void		(*exec)(void *arg, uint64_t pc);
158117395Skan
159117395Skan	/*
160117395Skan	 * Misc
161117395Skan	 */
162132718Skan
163117395Skan        /*
164117395Skan         * Sleep for usec microseconds
165117395Skan         */
166132718Skan	void		(*delay)(void *arg, int usec);
167169689Skan
168169689Skan        /*
169169689Skan         * Exit with the given exit code
170169689Skan         */
171169689Skan	void		(*exit)(void *arg, int v);
172117395Skan
173169689Skan        /*
174117395Skan         * Return guest physical memory map details
175117395Skan         */
176117395Skan	void		(*getmem)(void *arg, uint64_t *lowmem,
177117395Skan            uint64_t *highmem);
178169689Skan	/*
179117395Skan	 * ioctl interface to the disk device
180169689Skan	 */
181169689Skan	int		(*diskioctl)(void *arg, int unit, u_long cmd,
182169689Skan	    void *data);
183117395Skan};
184117395Skan