diff options
| author | fishsoupisgood <github@madingley.org> | 2019-04-29 01:17:54 +0100 | 
|---|---|---|
| committer | fishsoupisgood <github@madingley.org> | 2019-05-27 03:43:43 +0100 | 
| commit | 3f2546b2ef55b661fd8dd69682b38992225e86f6 (patch) | |
| tree | 65ca85f13617aee1dce474596800950f266a456c /linux-headers | |
| download | qemu-master.tar.gz qemu-master.tar.bz2 qemu-master.zip  | |
Diffstat (limited to 'linux-headers')
24 files changed, 4866 insertions, 0 deletions
diff --git a/linux-headers/COPYING b/linux-headers/COPYING new file mode 100644 index 00000000..ca442d31 --- /dev/null +++ b/linux-headers/COPYING @@ -0,0 +1,356 @@ + +   NOTE! This copyright does *not* cover user programs that use kernel + services by normal system calls - this is merely considered normal use + of the kernel, and does *not* fall under the heading of "derived work". + Also note that the GPL below is copyrighted by the Free Software + Foundation, but the instance of code that it refers to (the Linux + kernel) is copyrighted by me and others who actually wrote it. + + Also note that the only valid version of the GPL as far as the kernel + is concerned is _this_ particular version of the license (ie v2, not + v2.2 or v3.x or whatever), unless explicitly otherwise stated. + +			Linus Torvalds + +---------------------------------------- + +		    GNU GENERAL PUBLIC LICENSE +		       Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. +                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +			    Preamble + +  The licenses for most software are designed to take away your +freedom to share and change it.  By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users.  This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it.  (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.)  You can apply it to +your programs, too. + +  When we speak of free software, we are referring to freedom, not +price.  Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +  To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +  For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have.  You must make sure that they, too, receive or can get the +source code.  And you must show them these terms so they know their +rights. + +  We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +  Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software.  If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +  Finally, any free program is threatened constantly by software +patents.  We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary.  To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + +  The precise terms and conditions for copying, distribution and +modification follow. + +		    GNU GENERAL PUBLIC LICENSE +   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +  0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License.  The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language.  (Hereinafter, translation is included without limitation in +the term "modification".)  Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope.  The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +  1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +  2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +    a) You must cause the modified files to carry prominent notices +    stating that you changed the files and the date of any change. + +    b) You must cause any work that you distribute or publish, that in +    whole or in part contains or is derived from the Program or any +    part thereof, to be licensed as a whole at no charge to all third +    parties under the terms of this License. + +    c) If the modified program normally reads commands interactively +    when run, you must cause it, when started running for such +    interactive use in the most ordinary way, to print or display an +    announcement including an appropriate copyright notice and a +    notice that there is no warranty (or else, saying that you provide +    a warranty) and that users may redistribute the program under +    these conditions, and telling the user how to view a copy of this +    License.  (Exception: if the Program itself is interactive but +    does not normally print such an announcement, your work based on +    the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole.  If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works.  But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +  3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +    a) Accompany it with the complete corresponding machine-readable +    source code, which must be distributed under the terms of Sections +    1 and 2 above on a medium customarily used for software interchange; or, + +    b) Accompany it with a written offer, valid for at least three +    years, to give any third party, for a charge no more than your +    cost of physically performing source distribution, a complete +    machine-readable copy of the corresponding source code, to be +    distributed under the terms of Sections 1 and 2 above on a medium +    customarily used for software interchange; or, + +    c) Accompany it with the information you received as to the offer +    to distribute corresponding source code.  (This alternative is +    allowed only for noncommercial distribution and only if you +    received the program in object code or executable form with such +    an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it.  For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable.  However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +  4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License.  Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +  5. You are not required to accept this License, since you have not +signed it.  However, nothing else grants you permission to modify or +distribute the Program or its derivative works.  These actions are +prohibited by law if you do not accept this License.  Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +  6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions.  You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +  7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License.  If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all.  For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices.  Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +  8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded.  In such case, this License incorporates +the limitation as if written in the body of this License. + +  9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time.  Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number.  If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation.  If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +  10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission.  For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this.  Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +			    NO WARRANTY + +  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +		     END OF TERMS AND CONDITIONS + +	    How to Apply These Terms to Your New Programs + +  If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +  To do so, attach the following notices to the program.  It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + +    <one line to give the program's name and a brief idea of what it does.> +    Copyright (C) <year>  <name of author> + +    This program is free software; you can redistribute it and/or modify +    it under the terms of the GNU General Public License as published by +    the Free Software Foundation; either version 2 of the License, or +    (at your option) any later version. + +    This program is distributed in the hope that it will be useful, +    but WITHOUT ANY WARRANTY; without even the implied warranty of +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +    GNU General Public License for more details. + +    You should have received a copy of the GNU General Public License +    along with this program; if not, write to the Free Software +    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +    Gnomovision version 69, Copyright (C) year name of author +    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +    This is free software, and you are welcome to redistribute it +    under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License.  Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary.  Here is a sample; alter the names: + +  Yoyodyne, Inc., hereby disclaims all copyright interest in the program +  `Gnomovision' (which makes passes at compilers) written by James Hacker. + +  <signature of Ty Coon>, 1 April 1989 +  Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs.  If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library.  If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/linux-headers/README b/linux-headers/README new file mode 100644 index 00000000..5c9026b3 --- /dev/null +++ b/linux-headers/README @@ -0,0 +1,2 @@ +Automatically imported Linux kernel headers. +Only use scripts/update-linux-headers.sh to update! diff --git a/linux-headers/asm-arm/kvm.h b/linux-headers/asm-arm/kvm.h new file mode 100644 index 00000000..c98e4dc4 --- /dev/null +++ b/linux-headers/asm-arm/kvm.h @@ -0,0 +1,222 @@ +/* + * Copyright (C) 2012 - Virtual Open Systems and Columbia University + * Author: Christoffer Dall <c.dall@virtualopensystems.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License, version 2, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. + */ + +#ifndef __ARM_KVM_H__ +#define __ARM_KVM_H__ + +#include <linux/types.h> +#include <linux/psci.h> +#include <asm/ptrace.h> + +#define __KVM_HAVE_GUEST_DEBUG +#define __KVM_HAVE_IRQ_LINE +#define __KVM_HAVE_READONLY_MEM + +#define KVM_REG_SIZE(id)						\ +	(1U << (((id) & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT)) + +/* Valid for svc_regs, abt_regs, und_regs, irq_regs in struct kvm_regs */ +#define KVM_ARM_SVC_sp		svc_regs[0] +#define KVM_ARM_SVC_lr		svc_regs[1] +#define KVM_ARM_SVC_spsr	svc_regs[2] +#define KVM_ARM_ABT_sp		abt_regs[0] +#define KVM_ARM_ABT_lr		abt_regs[1] +#define KVM_ARM_ABT_spsr	abt_regs[2] +#define KVM_ARM_UND_sp		und_regs[0] +#define KVM_ARM_UND_lr		und_regs[1] +#define KVM_ARM_UND_spsr	und_regs[2] +#define KVM_ARM_IRQ_sp		irq_regs[0] +#define KVM_ARM_IRQ_lr		irq_regs[1] +#define KVM_ARM_IRQ_spsr	irq_regs[2] + +/* Valid only for fiq_regs in struct kvm_regs */ +#define KVM_ARM_FIQ_r8		fiq_regs[0] +#define KVM_ARM_FIQ_r9		fiq_regs[1] +#define KVM_ARM_FIQ_r10		fiq_regs[2] +#define KVM_ARM_FIQ_fp		fiq_regs[3] +#define KVM_ARM_FIQ_ip		fiq_regs[4] +#define KVM_ARM_FIQ_sp		fiq_regs[5] +#define KVM_ARM_FIQ_lr		fiq_regs[6] +#define KVM_ARM_FIQ_spsr	fiq_regs[7] + +struct kvm_regs { +	struct pt_regs usr_regs;	/* R0_usr - R14_usr, PC, CPSR */ +	unsigned long svc_regs[3];	/* SP_svc, LR_svc, SPSR_svc */ +	unsigned long abt_regs[3];	/* SP_abt, LR_abt, SPSR_abt */ +	unsigned long und_regs[3];	/* SP_und, LR_und, SPSR_und */ +	unsigned long irq_regs[3];	/* SP_irq, LR_irq, SPSR_irq */ +	unsigned long fiq_regs[8];	/* R8_fiq - R14_fiq, SPSR_fiq */ +}; + +/* Supported Processor Types */ +#define KVM_ARM_TARGET_CORTEX_A15	0 +#define KVM_ARM_TARGET_CORTEX_A7	1 +#define KVM_ARM_NUM_TARGETS		2 + +/* KVM_ARM_SET_DEVICE_ADDR ioctl id encoding */ +#define KVM_ARM_DEVICE_TYPE_SHIFT	0 +#define KVM_ARM_DEVICE_TYPE_MASK	(0xffff << KVM_ARM_DEVICE_TYPE_SHIFT) +#define KVM_ARM_DEVICE_ID_SHIFT		16 +#define KVM_ARM_DEVICE_ID_MASK		(0xffff << KVM_ARM_DEVICE_ID_SHIFT) + +/* Supported device IDs */ +#define KVM_ARM_DEVICE_VGIC_V2		0 + +/* Supported VGIC address types  */ +#define KVM_VGIC_V2_ADDR_TYPE_DIST	0 +#define KVM_VGIC_V2_ADDR_TYPE_CPU	1 + +#define KVM_VGIC_V2_DIST_SIZE		0x1000 +#define KVM_VGIC_V2_CPU_SIZE		0x2000 + +#define KVM_ARM_VCPU_POWER_OFF		0 /* CPU is started in OFF state */ +#define KVM_ARM_VCPU_PSCI_0_2		1 /* CPU uses PSCI v0.2 */ + +struct kvm_vcpu_init { +	__u32 target; +	__u32 features[7]; +}; + +struct kvm_sregs { +}; + +struct kvm_fpu { +}; + +struct kvm_guest_debug_arch { +}; + +struct kvm_debug_exit_arch { +}; + +struct kvm_sync_regs { +}; + +struct kvm_arch_memory_slot { +}; + +/* If you need to interpret the index values, here is the key: */ +#define KVM_REG_ARM_COPROC_MASK		0x000000000FFF0000 +#define KVM_REG_ARM_COPROC_SHIFT	16 +#define KVM_REG_ARM_32_OPC2_MASK	0x0000000000000007 +#define KVM_REG_ARM_32_OPC2_SHIFT	0 +#define KVM_REG_ARM_OPC1_MASK		0x0000000000000078 +#define KVM_REG_ARM_OPC1_SHIFT		3 +#define KVM_REG_ARM_CRM_MASK		0x0000000000000780 +#define KVM_REG_ARM_CRM_SHIFT		7 +#define KVM_REG_ARM_32_CRN_MASK		0x0000000000007800 +#define KVM_REG_ARM_32_CRN_SHIFT	11 + +#define ARM_CP15_REG_SHIFT_MASK(x,n) \ +	(((x) << KVM_REG_ARM_ ## n ## _SHIFT) & KVM_REG_ARM_ ## n ## _MASK) + +#define __ARM_CP15_REG(op1,crn,crm,op2) \ +	(KVM_REG_ARM | (15 << KVM_REG_ARM_COPROC_SHIFT) | \ +	ARM_CP15_REG_SHIFT_MASK(op1, OPC1) | \ +	ARM_CP15_REG_SHIFT_MASK(crn, 32_CRN) | \ +	ARM_CP15_REG_SHIFT_MASK(crm, CRM) | \ +	ARM_CP15_REG_SHIFT_MASK(op2, 32_OPC2)) + +#define ARM_CP15_REG32(...) (__ARM_CP15_REG(__VA_ARGS__) | KVM_REG_SIZE_U32) + +#define __ARM_CP15_REG64(op1,crm) \ +	(__ARM_CP15_REG(op1, 0, crm, 0) | KVM_REG_SIZE_U64) +#define ARM_CP15_REG64(...) __ARM_CP15_REG64(__VA_ARGS__) + +#define KVM_REG_ARM_TIMER_CTL		ARM_CP15_REG32(0, 14, 3, 1) +#define KVM_REG_ARM_TIMER_CNT		ARM_CP15_REG64(1, 14)  +#define KVM_REG_ARM_TIMER_CVAL		ARM_CP15_REG64(3, 14)  + +/* Normal registers are mapped as coprocessor 16. */ +#define KVM_REG_ARM_CORE		(0x0010 << KVM_REG_ARM_COPROC_SHIFT) +#define KVM_REG_ARM_CORE_REG(name)	(offsetof(struct kvm_regs, name) / 4) + +/* Some registers need more space to represent values. */ +#define KVM_REG_ARM_DEMUX		(0x0011 << KVM_REG_ARM_COPROC_SHIFT) +#define KVM_REG_ARM_DEMUX_ID_MASK	0x000000000000FF00 +#define KVM_REG_ARM_DEMUX_ID_SHIFT	8 +#define KVM_REG_ARM_DEMUX_ID_CCSIDR	(0x00 << KVM_REG_ARM_DEMUX_ID_SHIFT) +#define KVM_REG_ARM_DEMUX_VAL_MASK	0x00000000000000FF +#define KVM_REG_ARM_DEMUX_VAL_SHIFT	0 + +/* VFP registers: we could overload CP10 like ARM does, but that's ugly. */ +#define KVM_REG_ARM_VFP			(0x0012 << KVM_REG_ARM_COPROC_SHIFT) +#define KVM_REG_ARM_VFP_MASK		0x000000000000FFFF +#define KVM_REG_ARM_VFP_BASE_REG	0x0 +#define KVM_REG_ARM_VFP_FPSID		0x1000 +#define KVM_REG_ARM_VFP_FPSCR		0x1001 +#define KVM_REG_ARM_VFP_MVFR1		0x1006 +#define KVM_REG_ARM_VFP_MVFR0		0x1007 +#define KVM_REG_ARM_VFP_FPEXC		0x1008 +#define KVM_REG_ARM_VFP_FPINST		0x1009 +#define KVM_REG_ARM_VFP_FPINST2		0x100A + +/* Device Control API: ARM VGIC */ +#define KVM_DEV_ARM_VGIC_GRP_ADDR	0 +#define KVM_DEV_ARM_VGIC_GRP_DIST_REGS	1 +#define KVM_DEV_ARM_VGIC_GRP_CPU_REGS	2 +#define   KVM_DEV_ARM_VGIC_CPUID_SHIFT	32 +#define   KVM_DEV_ARM_VGIC_CPUID_MASK	(0xffULL << KVM_DEV_ARM_VGIC_CPUID_SHIFT) +#define   KVM_DEV_ARM_VGIC_OFFSET_SHIFT	0 +#define   KVM_DEV_ARM_VGIC_OFFSET_MASK	(0xffffffffULL << KVM_DEV_ARM_VGIC_OFFSET_SHIFT) +#define KVM_DEV_ARM_VGIC_GRP_NR_IRQS	3 +#define KVM_DEV_ARM_VGIC_GRP_CTRL       4 +#define   KVM_DEV_ARM_VGIC_CTRL_INIT    0 + +/* KVM_IRQ_LINE irq field index values */ +#define KVM_ARM_IRQ_TYPE_SHIFT		24 +#define KVM_ARM_IRQ_TYPE_MASK		0xff +#define KVM_ARM_IRQ_VCPU_SHIFT		16 +#define KVM_ARM_IRQ_VCPU_MASK		0xff +#define KVM_ARM_IRQ_NUM_SHIFT		0 +#define KVM_ARM_IRQ_NUM_MASK		0xffff + +/* irq_type field */ +#define KVM_ARM_IRQ_TYPE_CPU		0 +#define KVM_ARM_IRQ_TYPE_SPI		1 +#define KVM_ARM_IRQ_TYPE_PPI		2 + +/* out-of-kernel GIC cpu interrupt injection irq_number field */ +#define KVM_ARM_IRQ_CPU_IRQ		0 +#define KVM_ARM_IRQ_CPU_FIQ		1 + +/* + * This used to hold the highest supported SPI, but it is now obsolete + * and only here to provide source code level compatibility with older + * userland. The highest SPI number can be set via KVM_DEV_ARM_VGIC_GRP_NR_IRQS. + */ +#define KVM_ARM_IRQ_GIC_MAX		127 + +/* One single KVM irqchip, ie. the VGIC */ +#define KVM_NR_IRQCHIPS          1 + +/* PSCI interface */ +#define KVM_PSCI_FN_BASE		0x95c1ba5e +#define KVM_PSCI_FN(n)			(KVM_PSCI_FN_BASE + (n)) + +#define KVM_PSCI_FN_CPU_SUSPEND		KVM_PSCI_FN(0) +#define KVM_PSCI_FN_CPU_OFF		KVM_PSCI_FN(1) +#define KVM_PSCI_FN_CPU_ON		KVM_PSCI_FN(2) +#define KVM_PSCI_FN_MIGRATE		KVM_PSCI_FN(3) + +#define KVM_PSCI_RET_SUCCESS		PSCI_RET_SUCCESS +#define KVM_PSCI_RET_NI			PSCI_RET_NOT_SUPPORTED +#define KVM_PSCI_RET_INVAL		PSCI_RET_INVALID_PARAMS +#define KVM_PSCI_RET_DENIED		PSCI_RET_DENIED + +#endif /* __ARM_KVM_H__ */ diff --git a/linux-headers/asm-arm/kvm_para.h b/linux-headers/asm-arm/kvm_para.h new file mode 100644 index 00000000..14fab8f0 --- /dev/null +++ b/linux-headers/asm-arm/kvm_para.h @@ -0,0 +1 @@ +#include <asm-generic/kvm_para.h> diff --git a/linux-headers/asm-arm64/kvm.h b/linux-headers/asm-arm64/kvm.h new file mode 100644 index 00000000..c8abf257 --- /dev/null +++ b/linux-headers/asm-arm64/kvm.h @@ -0,0 +1,217 @@ +/* + * Copyright (C) 2012,2013 - ARM Ltd + * Author: Marc Zyngier <marc.zyngier@arm.com> + * + * Derived from arch/arm/include/uapi/asm/kvm.h: + * Copyright (C) 2012 - Virtual Open Systems and Columbia University + * Author: Christoffer Dall <c.dall@virtualopensystems.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef __ARM_KVM_H__ +#define __ARM_KVM_H__ + +#define KVM_SPSR_EL1	0 +#define KVM_SPSR_SVC	KVM_SPSR_EL1 +#define KVM_SPSR_ABT	1 +#define KVM_SPSR_UND	2 +#define KVM_SPSR_IRQ	3 +#define KVM_SPSR_FIQ	4 +#define KVM_NR_SPSR	5 + +#ifndef __ASSEMBLY__ +#include <linux/psci.h> +#include <asm/types.h> +#include <asm/ptrace.h> + +#define __KVM_HAVE_GUEST_DEBUG +#define __KVM_HAVE_IRQ_LINE +#define __KVM_HAVE_READONLY_MEM + +#define KVM_REG_SIZE(id)						\ +	(1U << (((id) & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT)) + +struct kvm_regs { +	struct user_pt_regs regs;	/* sp = sp_el0 */ + +	__u64	sp_el1; +	__u64	elr_el1; + +	__u64	spsr[KVM_NR_SPSR]; + +	struct user_fpsimd_state fp_regs; +}; + +/* Supported Processor Types */ +#define KVM_ARM_TARGET_AEM_V8		0 +#define KVM_ARM_TARGET_FOUNDATION_V8	1 +#define KVM_ARM_TARGET_CORTEX_A57	2 +#define KVM_ARM_TARGET_XGENE_POTENZA	3 +#define KVM_ARM_TARGET_CORTEX_A53	4 + +#define KVM_ARM_NUM_TARGETS		5 + +/* KVM_ARM_SET_DEVICE_ADDR ioctl id encoding */ +#define KVM_ARM_DEVICE_TYPE_SHIFT	0 +#define KVM_ARM_DEVICE_TYPE_MASK	(0xffff << KVM_ARM_DEVICE_TYPE_SHIFT) +#define KVM_ARM_DEVICE_ID_SHIFT		16 +#define KVM_ARM_DEVICE_ID_MASK		(0xffff << KVM_ARM_DEVICE_ID_SHIFT) + +/* Supported device IDs */ +#define KVM_ARM_DEVICE_VGIC_V2		0 + +/* Supported VGIC address types  */ +#define KVM_VGIC_V2_ADDR_TYPE_DIST	0 +#define KVM_VGIC_V2_ADDR_TYPE_CPU	1 + +#define KVM_VGIC_V2_DIST_SIZE		0x1000 +#define KVM_VGIC_V2_CPU_SIZE		0x2000 + +/* Supported VGICv3 address types  */ +#define KVM_VGIC_V3_ADDR_TYPE_DIST	2 +#define KVM_VGIC_V3_ADDR_TYPE_REDIST	3 + +#define KVM_VGIC_V3_DIST_SIZE		SZ_64K +#define KVM_VGIC_V3_REDIST_SIZE		(2 * SZ_64K) + +#define KVM_ARM_VCPU_POWER_OFF		0 /* CPU is started in OFF state */ +#define KVM_ARM_VCPU_EL1_32BIT		1 /* CPU running a 32bit VM */ +#define KVM_ARM_VCPU_PSCI_0_2		2 /* CPU uses PSCI v0.2 */ + +struct kvm_vcpu_init { +	__u32 target; +	__u32 features[7]; +}; + +struct kvm_sregs { +}; + +struct kvm_fpu { +}; + +struct kvm_guest_debug_arch { +}; + +struct kvm_debug_exit_arch { +}; + +struct kvm_sync_regs { +}; + +struct kvm_arch_memory_slot { +}; + +/* If you need to interpret the index values, here is the key: */ +#define KVM_REG_ARM_COPROC_MASK		0x000000000FFF0000 +#define KVM_REG_ARM_COPROC_SHIFT	16 + +/* Normal registers are mapped as coprocessor 16. */ +#define KVM_REG_ARM_CORE		(0x0010 << KVM_REG_ARM_COPROC_SHIFT) +#define KVM_REG_ARM_CORE_REG(name)	(offsetof(struct kvm_regs, name) / sizeof(__u32)) + +/* Some registers need more space to represent values. */ +#define KVM_REG_ARM_DEMUX		(0x0011 << KVM_REG_ARM_COPROC_SHIFT) +#define KVM_REG_ARM_DEMUX_ID_MASK	0x000000000000FF00 +#define KVM_REG_ARM_DEMUX_ID_SHIFT	8 +#define KVM_REG_ARM_DEMUX_ID_CCSIDR	(0x00 << KVM_REG_ARM_DEMUX_ID_SHIFT) +#define KVM_REG_ARM_DEMUX_VAL_MASK	0x00000000000000FF +#define KVM_REG_ARM_DEMUX_VAL_SHIFT	0 + +/* AArch64 system registers */ +#define KVM_REG_ARM64_SYSREG		(0x0013 << KVM_REG_ARM_COPROC_SHIFT) +#define KVM_REG_ARM64_SYSREG_OP0_MASK	0x000000000000c000 +#define KVM_REG_ARM64_SYSREG_OP0_SHIFT	14 +#define KVM_REG_ARM64_SYSREG_OP1_MASK	0x0000000000003800 +#define KVM_REG_ARM64_SYSREG_OP1_SHIFT	11 +#define KVM_REG_ARM64_SYSREG_CRN_MASK	0x0000000000000780 +#define KVM_REG_ARM64_SYSREG_CRN_SHIFT	7 +#define KVM_REG_ARM64_SYSREG_CRM_MASK	0x0000000000000078 +#define KVM_REG_ARM64_SYSREG_CRM_SHIFT	3 +#define KVM_REG_ARM64_SYSREG_OP2_MASK	0x0000000000000007 +#define KVM_REG_ARM64_SYSREG_OP2_SHIFT	0 + +#define ARM64_SYS_REG_SHIFT_MASK(x,n) \ +	(((x) << KVM_REG_ARM64_SYSREG_ ## n ## _SHIFT) & \ +	KVM_REG_ARM64_SYSREG_ ## n ## _MASK) + +#define __ARM64_SYS_REG(op0,op1,crn,crm,op2) \ +	(KVM_REG_ARM64 | KVM_REG_ARM64_SYSREG | \ +	ARM64_SYS_REG_SHIFT_MASK(op0, OP0) | \ +	ARM64_SYS_REG_SHIFT_MASK(op1, OP1) | \ +	ARM64_SYS_REG_SHIFT_MASK(crn, CRN) | \ +	ARM64_SYS_REG_SHIFT_MASK(crm, CRM) | \ +	ARM64_SYS_REG_SHIFT_MASK(op2, OP2)) + +#define ARM64_SYS_REG(...) (__ARM64_SYS_REG(__VA_ARGS__) | KVM_REG_SIZE_U64) + +#define KVM_REG_ARM_TIMER_CTL		ARM64_SYS_REG(3, 3, 14, 3, 1) +#define KVM_REG_ARM_TIMER_CNT		ARM64_SYS_REG(3, 3, 14, 3, 2) +#define KVM_REG_ARM_TIMER_CVAL		ARM64_SYS_REG(3, 3, 14, 0, 2) + +/* Device Control API: ARM VGIC */ +#define KVM_DEV_ARM_VGIC_GRP_ADDR	0 +#define KVM_DEV_ARM_VGIC_GRP_DIST_REGS	1 +#define KVM_DEV_ARM_VGIC_GRP_CPU_REGS	2 +#define   KVM_DEV_ARM_VGIC_CPUID_SHIFT	32 +#define   KVM_DEV_ARM_VGIC_CPUID_MASK	(0xffULL << KVM_DEV_ARM_VGIC_CPUID_SHIFT) +#define   KVM_DEV_ARM_VGIC_OFFSET_SHIFT	0 +#define   KVM_DEV_ARM_VGIC_OFFSET_MASK	(0xffffffffULL << KVM_DEV_ARM_VGIC_OFFSET_SHIFT) +#define KVM_DEV_ARM_VGIC_GRP_NR_IRQS	3 +#define KVM_DEV_ARM_VGIC_GRP_CTRL	4 +#define   KVM_DEV_ARM_VGIC_CTRL_INIT	0 + +/* KVM_IRQ_LINE irq field index values */ +#define KVM_ARM_IRQ_TYPE_SHIFT		24 +#define KVM_ARM_IRQ_TYPE_MASK		0xff +#define KVM_ARM_IRQ_VCPU_SHIFT		16 +#define KVM_ARM_IRQ_VCPU_MASK		0xff +#define KVM_ARM_IRQ_NUM_SHIFT		0 +#define KVM_ARM_IRQ_NUM_MASK		0xffff + +/* irq_type field */ +#define KVM_ARM_IRQ_TYPE_CPU		0 +#define KVM_ARM_IRQ_TYPE_SPI		1 +#define KVM_ARM_IRQ_TYPE_PPI		2 + +/* out-of-kernel GIC cpu interrupt injection irq_number field */ +#define KVM_ARM_IRQ_CPU_IRQ		0 +#define KVM_ARM_IRQ_CPU_FIQ		1 + +/* + * This used to hold the highest supported SPI, but it is now obsolete + * and only here to provide source code level compatibility with older + * userland. The highest SPI number can be set via KVM_DEV_ARM_VGIC_GRP_NR_IRQS. + */ +#define KVM_ARM_IRQ_GIC_MAX		127 + +/* One single KVM irqchip, ie. the VGIC */ +#define KVM_NR_IRQCHIPS          1 + +/* PSCI interface */ +#define KVM_PSCI_FN_BASE		0x95c1ba5e +#define KVM_PSCI_FN(n)			(KVM_PSCI_FN_BASE + (n)) + +#define KVM_PSCI_FN_CPU_SUSPEND		KVM_PSCI_FN(0) +#define KVM_PSCI_FN_CPU_OFF		KVM_PSCI_FN(1) +#define KVM_PSCI_FN_CPU_ON		KVM_PSCI_FN(2) +#define KVM_PSCI_FN_MIGRATE		KVM_PSCI_FN(3) + +#define KVM_PSCI_RET_SUCCESS		PSCI_RET_SUCCESS +#define KVM_PSCI_RET_NI			PSCI_RET_NOT_SUPPORTED +#define KVM_PSCI_RET_INVAL		PSCI_RET_INVALID_PARAMS +#define KVM_PSCI_RET_DENIED		PSCI_RET_DENIED + +#endif + +#endif /* __ARM_KVM_H__ */ diff --git a/linux-headers/asm-arm64/kvm_para.h b/linux-headers/asm-arm64/kvm_para.h new file mode 100644 index 00000000..14fab8f0 --- /dev/null +++ b/linux-headers/asm-arm64/kvm_para.h @@ -0,0 +1 @@ +#include <asm-generic/kvm_para.h> diff --git a/linux-headers/asm-generic/kvm_para.h b/linux-headers/asm-generic/kvm_para.h new file mode 100644 index 00000000..486f0af7 --- /dev/null +++ b/linux-headers/asm-generic/kvm_para.h @@ -0,0 +1,4 @@ +/* + * There isn't anything here, but the file must not be empty or patch + * will delete it. + */ diff --git a/linux-headers/asm-mips/kvm.h b/linux-headers/asm-mips/kvm.h new file mode 100644 index 00000000..6985eb59 --- /dev/null +++ b/linux-headers/asm-mips/kvm.h @@ -0,0 +1,208 @@ +/* + * This file is subject to the terms and conditions of the GNU General Public + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2012  MIPS Technologies, Inc.  All rights reserved. + * Copyright (C) 2013 Cavium, Inc. + * Authors: Sanjay Lal <sanjayl@kymasys.com> + */ + +#ifndef __LINUX_KVM_MIPS_H +#define __LINUX_KVM_MIPS_H + +#include <linux/types.h> + +/* + * KVM MIPS specific structures and definitions. + * + * Some parts derived from the x86 version of this file. + */ + +/* + * for KVM_GET_REGS and KVM_SET_REGS + * + * If Config[AT] is zero (32-bit CPU), the register contents are + * stored in the lower 32-bits of the struct kvm_regs fields and sign + * extended to 64-bits. + */ +struct kvm_regs { +	/* out (KVM_GET_REGS) / in (KVM_SET_REGS) */ +	__u64 gpr[32]; +	__u64 hi; +	__u64 lo; +	__u64 pc; +}; + +/* + * for KVM_GET_FPU and KVM_SET_FPU + */ +struct kvm_fpu { +}; + + +/* + * For MIPS, we use KVM_SET_ONE_REG and KVM_GET_ONE_REG to access various + * registers.  The id field is broken down as follows: + * + *  bits[63..52] - As per linux/kvm.h + *  bits[51..32] - Must be zero. + *  bits[31..16] - Register set. + * + * Register set = 0: GP registers from kvm_regs (see definitions below). + * + * Register set = 1: CP0 registers. + *  bits[15..8]  - Must be zero. + *  bits[7..3]   - Register 'rd'  index. + *  bits[2..0]   - Register 'sel' index. + * + * Register set = 2: KVM specific registers (see definitions below). + * + * Register set = 3: FPU / MSA registers (see definitions below). + * + * Other sets registers may be added in the future.  Each set would + * have its own identifier in bits[31..16]. + */ + +#define KVM_REG_MIPS_GP		(KVM_REG_MIPS | 0x0000000000000000ULL) +#define KVM_REG_MIPS_CP0	(KVM_REG_MIPS | 0x0000000000010000ULL) +#define KVM_REG_MIPS_KVM	(KVM_REG_MIPS | 0x0000000000020000ULL) +#define KVM_REG_MIPS_FPU	(KVM_REG_MIPS | 0x0000000000030000ULL) + + +/* + * KVM_REG_MIPS_GP - General purpose registers from kvm_regs. + */ + +#define KVM_REG_MIPS_R0		(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 |  0) +#define KVM_REG_MIPS_R1		(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 |  1) +#define KVM_REG_MIPS_R2		(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 |  2) +#define KVM_REG_MIPS_R3		(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 |  3) +#define KVM_REG_MIPS_R4		(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 |  4) +#define KVM_REG_MIPS_R5		(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 |  5) +#define KVM_REG_MIPS_R6		(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 |  6) +#define KVM_REG_MIPS_R7		(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 |  7) +#define KVM_REG_MIPS_R8		(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 |  8) +#define KVM_REG_MIPS_R9		(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 |  9) +#define KVM_REG_MIPS_R10	(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 10) +#define KVM_REG_MIPS_R11	(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 11) +#define KVM_REG_MIPS_R12	(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 12) +#define KVM_REG_MIPS_R13	(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 13) +#define KVM_REG_MIPS_R14	(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 14) +#define KVM_REG_MIPS_R15	(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 15) +#define KVM_REG_MIPS_R16	(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 16) +#define KVM_REG_MIPS_R17	(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 17) +#define KVM_REG_MIPS_R18	(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 18) +#define KVM_REG_MIPS_R19	(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 19) +#define KVM_REG_MIPS_R20	(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 20) +#define KVM_REG_MIPS_R21	(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 21) +#define KVM_REG_MIPS_R22	(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 22) +#define KVM_REG_MIPS_R23	(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 23) +#define KVM_REG_MIPS_R24	(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 24) +#define KVM_REG_MIPS_R25	(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 25) +#define KVM_REG_MIPS_R26	(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 26) +#define KVM_REG_MIPS_R27	(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 27) +#define KVM_REG_MIPS_R28	(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 28) +#define KVM_REG_MIPS_R29	(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 29) +#define KVM_REG_MIPS_R30	(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 30) +#define KVM_REG_MIPS_R31	(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 31) + +#define KVM_REG_MIPS_HI		(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 32) +#define KVM_REG_MIPS_LO		(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 33) +#define KVM_REG_MIPS_PC		(KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 34) + + +/* + * KVM_REG_MIPS_KVM - KVM specific control registers. + */ + +/* + * CP0_Count control + * DC:    Set 0: Master disable CP0_Count and set COUNT_RESUME to now + *        Set 1: Master re-enable CP0_Count with unchanged bias, handling timer + *               interrupts since COUNT_RESUME + *        This can be used to freeze the timer to get a consistent snapshot of + *        the CP0_Count and timer interrupt pending state, while also resuming + *        safely without losing time or guest timer interrupts. + * Other: Reserved, do not change. + */ +#define KVM_REG_MIPS_COUNT_CTL	    (KVM_REG_MIPS_KVM | KVM_REG_SIZE_U64 | 0) +#define KVM_REG_MIPS_COUNT_CTL_DC	0x00000001 + +/* + * CP0_Count resume monotonic nanoseconds + * The monotonic nanosecond time of the last set of COUNT_CTL.DC (master + * disable). Any reads and writes of Count related registers while + * COUNT_CTL.DC=1 will appear to occur at this time. When COUNT_CTL.DC is + * cleared again (master enable) any timer interrupts since this time will be + * emulated. + * Modifications to times in the future are rejected. + */ +#define KVM_REG_MIPS_COUNT_RESUME   (KVM_REG_MIPS_KVM | KVM_REG_SIZE_U64 | 1) +/* + * CP0_Count rate in Hz + * Specifies the rate of the CP0_Count timer in Hz. Modifications occur without + * discontinuities in CP0_Count. + */ +#define KVM_REG_MIPS_COUNT_HZ	    (KVM_REG_MIPS_KVM | KVM_REG_SIZE_U64 | 2) + + +/* + * KVM_REG_MIPS_FPU - Floating Point and MIPS SIMD Architecture (MSA) registers. + * + *  bits[15..8]  - Register subset (see definitions below). + *  bits[7..5]   - Must be zero. + *  bits[4..0]   - Register number within register subset. + */ + +#define KVM_REG_MIPS_FPR	(KVM_REG_MIPS_FPU | 0x0000000000000000ULL) +#define KVM_REG_MIPS_FCR	(KVM_REG_MIPS_FPU | 0x0000000000000100ULL) +#define KVM_REG_MIPS_MSACR	(KVM_REG_MIPS_FPU | 0x0000000000000200ULL) + +/* + * KVM_REG_MIPS_FPR - Floating point / Vector registers. + */ +#define KVM_REG_MIPS_FPR_32(n)	(KVM_REG_MIPS_FPR | KVM_REG_SIZE_U32  | (n)) +#define KVM_REG_MIPS_FPR_64(n)	(KVM_REG_MIPS_FPR | KVM_REG_SIZE_U64  | (n)) +#define KVM_REG_MIPS_VEC_128(n)	(KVM_REG_MIPS_FPR | KVM_REG_SIZE_U128 | (n)) + +/* + * KVM_REG_MIPS_FCR - Floating point control registers. + */ +#define KVM_REG_MIPS_FCR_IR	(KVM_REG_MIPS_FCR | KVM_REG_SIZE_U32 |  0) +#define KVM_REG_MIPS_FCR_CSR	(KVM_REG_MIPS_FCR | KVM_REG_SIZE_U32 | 31) + +/* + * KVM_REG_MIPS_MSACR - MIPS SIMD Architecture (MSA) control registers. + */ +#define KVM_REG_MIPS_MSA_IR	 (KVM_REG_MIPS_MSACR | KVM_REG_SIZE_U32 |  0) +#define KVM_REG_MIPS_MSA_CSR	 (KVM_REG_MIPS_MSACR | KVM_REG_SIZE_U32 |  1) + + +/* + * KVM MIPS specific structures and definitions + * + */ +struct kvm_debug_exit_arch { +	__u64 epc; +}; + +/* for KVM_SET_GUEST_DEBUG */ +struct kvm_guest_debug_arch { +}; + +/* definition of registers in kvm_run */ +struct kvm_sync_regs { +}; + +/* dummy definition */ +struct kvm_sregs { +}; + +struct kvm_mips_interrupt { +	/* in */ +	__u32 cpu; +	__u32 irq; +}; + +#endif /* __LINUX_KVM_MIPS_H */ diff --git a/linux-headers/asm-mips/kvm_para.h b/linux-headers/asm-mips/kvm_para.h new file mode 100644 index 00000000..dbb2464f --- /dev/null +++ b/linux-headers/asm-mips/kvm_para.h @@ -0,0 +1,5 @@ +#ifndef _ASM_MIPS_KVM_PARA_H +#define _ASM_MIPS_KVM_PARA_H + + +#endif /* _ASM_MIPS_KVM_PARA_H */ diff --git a/linux-headers/asm-powerpc/epapr_hcalls.h b/linux-headers/asm-powerpc/epapr_hcalls.h new file mode 100644 index 00000000..06f72478 --- /dev/null +++ b/linux-headers/asm-powerpc/epapr_hcalls.h @@ -0,0 +1,98 @@ +/* + * ePAPR hcall interface + * + * Copyright 2008-2011 Freescale Semiconductor, Inc. + * + * Author: Timur Tabi <timur@freescale.com> + * + * This file is provided under a dual BSD/GPL license.  When using or + * redistributing this file, you may do so under either license. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + *     * Redistributions of source code must retain the above copyright + *       notice, this list of conditions and the following disclaimer. + *     * Redistributions in binary form must reproduce the above copyright + *       notice, this list of conditions and the following disclaimer in the + *       documentation and/or other materials provided with the distribution. + *     * Neither the name of Freescale Semiconductor nor the + *       names of its contributors may be used to endorse or promote products + *       derived from this software without specific prior written permission. + * + * + * ALTERNATIVELY, this software may be distributed under the terms of the + * GNU General Public License ("GPL") as published by the Free Software + * Foundation, either version 2 of that License or (at your option) any + * later version. + * + * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _ASM_POWERPC_EPAPR_HCALLS_H +#define _ASM_POWERPC_EPAPR_HCALLS_H + +#define EV_BYTE_CHANNEL_SEND		1 +#define EV_BYTE_CHANNEL_RECEIVE		2 +#define EV_BYTE_CHANNEL_POLL		3 +#define EV_INT_SET_CONFIG		4 +#define EV_INT_GET_CONFIG		5 +#define EV_INT_SET_MASK			6 +#define EV_INT_GET_MASK			7 +#define EV_INT_IACK			9 +#define EV_INT_EOI			10 +#define EV_INT_SEND_IPI			11 +#define EV_INT_SET_TASK_PRIORITY	12 +#define EV_INT_GET_TASK_PRIORITY	13 +#define EV_DOORBELL_SEND		14 +#define EV_MSGSND			15 +#define EV_IDLE				16 + +/* vendor ID: epapr */ +#define EV_LOCAL_VENDOR_ID		0	/* for private use */ +#define EV_EPAPR_VENDOR_ID		1 +#define EV_FSL_VENDOR_ID		2	/* Freescale Semiconductor */ +#define EV_IBM_VENDOR_ID		3	/* IBM */ +#define EV_GHS_VENDOR_ID		4	/* Green Hills Software */ +#define EV_ENEA_VENDOR_ID		5	/* Enea */ +#define EV_WR_VENDOR_ID			6	/* Wind River Systems */ +#define EV_AMCC_VENDOR_ID		7	/* Applied Micro Circuits */ +#define EV_KVM_VENDOR_ID		42	/* KVM */ + +/* The max number of bytes that a byte channel can send or receive per call */ +#define EV_BYTE_CHANNEL_MAX_BYTES	16 + + +#define _EV_HCALL_TOKEN(id, num) (((id) << 16) | (num)) +#define EV_HCALL_TOKEN(hcall_num) _EV_HCALL_TOKEN(EV_EPAPR_VENDOR_ID, hcall_num) + +/* epapr return codes */ +#define EV_SUCCESS		0 +#define EV_EPERM		1	/* Operation not permitted */ +#define EV_ENOENT		2	/*  Entry Not Found */ +#define EV_EIO			3	/* I/O error occured */ +#define EV_EAGAIN		4	/* The operation had insufficient +					 * resources to complete and should be +					 * retried +					 */ +#define EV_ENOMEM		5	/* There was insufficient memory to +					 * complete the operation */ +#define EV_EFAULT		6	/* Bad guest address */ +#define EV_ENODEV		7	/* No such device */ +#define EV_EINVAL		8	/* An argument supplied to the hcall +					   was out of range or invalid */ +#define EV_INTERNAL		9	/* An internal error occured */ +#define EV_CONFIG		10	/* A configuration error was detected */ +#define EV_INVALID_STATE	11	/* The object is in an invalid state */ +#define EV_UNIMPLEMENTED	12	/* Unimplemented hypercall */ +#define EV_BUFFER_OVERFLOW	13	/* Caller-supplied buffer too small */ + +#endif /* _ASM_POWERPC_EPAPR_HCALLS_H */ diff --git a/linux-headers/asm-powerpc/kvm.h b/linux-headers/asm-powerpc/kvm.h new file mode 100644 index 00000000..ab4d4732 --- /dev/null +++ b/linux-headers/asm-powerpc/kvm.h @@ -0,0 +1,603 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License, version 2, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. + * + * Copyright IBM Corp. 2007 + * + * Authors: Hollis Blanchard <hollisb@us.ibm.com> + */ + +#ifndef __LINUX_KVM_POWERPC_H +#define __LINUX_KVM_POWERPC_H + +#include <linux/types.h> + +/* Select powerpc specific features in <linux/kvm.h> */ +#define __KVM_HAVE_SPAPR_TCE +#define __KVM_HAVE_PPC_SMT +#define __KVM_HAVE_IRQCHIP +#define __KVM_HAVE_IRQ_LINE +#define __KVM_HAVE_GUEST_DEBUG + +struct kvm_regs { +	__u64 pc; +	__u64 cr; +	__u64 ctr; +	__u64 lr; +	__u64 xer; +	__u64 msr; +	__u64 srr0; +	__u64 srr1; +	__u64 pid; + +	__u64 sprg0; +	__u64 sprg1; +	__u64 sprg2; +	__u64 sprg3; +	__u64 sprg4; +	__u64 sprg5; +	__u64 sprg6; +	__u64 sprg7; + +	__u64 gpr[32]; +}; + +#define KVM_SREGS_E_IMPL_NONE	0 +#define KVM_SREGS_E_IMPL_FSL	1 + +#define KVM_SREGS_E_FSL_PIDn	(1 << 0) /* PID1/PID2 */ + +/* + * Feature bits indicate which sections of the sregs struct are valid, + * both in KVM_GET_SREGS and KVM_SET_SREGS.  On KVM_SET_SREGS, registers + * corresponding to unset feature bits will not be modified.  This allows + * restoring a checkpoint made without that feature, while keeping the + * default values of the new registers. + * + * KVM_SREGS_E_BASE contains: + * CSRR0/1 (refers to SRR2/3 on 40x) + * ESR + * DEAR + * MCSR + * TSR + * TCR + * DEC + * TB + * VRSAVE (USPRG0) + */ +#define KVM_SREGS_E_BASE		(1 << 0) + +/* + * KVM_SREGS_E_ARCH206 contains: + * + * PIR + * MCSRR0/1 + * DECAR + * IVPR + */ +#define KVM_SREGS_E_ARCH206		(1 << 1) + +/* + * Contains EPCR, plus the upper half of 64-bit registers + * that are 32-bit on 32-bit implementations. + */ +#define KVM_SREGS_E_64			(1 << 2) + +#define KVM_SREGS_E_SPRG8		(1 << 3) +#define KVM_SREGS_E_MCIVPR		(1 << 4) + +/* + * IVORs are used -- contains IVOR0-15, plus additional IVORs + * in combination with an appropriate feature bit. + */ +#define KVM_SREGS_E_IVOR		(1 << 5) + +/* + * Contains MAS0-4, MAS6-7, TLBnCFG, MMUCFG. + * Also TLBnPS if MMUCFG[MAVN] = 1. + */ +#define KVM_SREGS_E_ARCH206_MMU		(1 << 6) + +/* DBSR, DBCR, IAC, DAC, DVC */ +#define KVM_SREGS_E_DEBUG		(1 << 7) + +/* Enhanced debug -- DSRR0/1, SPRG9 */ +#define KVM_SREGS_E_ED			(1 << 8) + +/* Embedded Floating Point (SPE) -- IVOR32-34 if KVM_SREGS_E_IVOR */ +#define KVM_SREGS_E_SPE			(1 << 9) + +/* + * DEPRECATED! USE ONE_REG FOR THIS ONE! + * External Proxy (EXP) -- EPR + */ +#define KVM_SREGS_EXP			(1 << 10) + +/* External PID (E.PD) -- EPSC/EPLC */ +#define KVM_SREGS_E_PD			(1 << 11) + +/* Processor Control (E.PC) -- IVOR36-37 if KVM_SREGS_E_IVOR */ +#define KVM_SREGS_E_PC			(1 << 12) + +/* Page table (E.PT) -- EPTCFG */ +#define KVM_SREGS_E_PT			(1 << 13) + +/* Embedded Performance Monitor (E.PM) -- IVOR35 if KVM_SREGS_E_IVOR */ +#define KVM_SREGS_E_PM			(1 << 14) + +/* + * Special updates: + * + * Some registers may change even while a vcpu is not running. + * To avoid losing these changes, by default these registers are + * not updated by KVM_SET_SREGS.  To force an update, set the bit + * in u.e.update_special corresponding to the register to be updated. + * + * The update_special field is zero on return from KVM_GET_SREGS. + * + * When restoring a checkpoint, the caller can set update_special + * to 0xffffffff to ensure that everything is restored, even new features + * that the caller doesn't know about. + */ +#define KVM_SREGS_E_UPDATE_MCSR		(1 << 0) +#define KVM_SREGS_E_UPDATE_TSR		(1 << 1) +#define KVM_SREGS_E_UPDATE_DEC		(1 << 2) +#define KVM_SREGS_E_UPDATE_DBSR		(1 << 3) + +/* + * In KVM_SET_SREGS, reserved/pad fields must be left untouched from a + * previous KVM_GET_REGS. + * + * Unless otherwise indicated, setting any register with KVM_SET_SREGS + * directly sets its value.  It does not trigger any special semantics such + * as write-one-to-clear.  Calling KVM_SET_SREGS on an unmodified struct + * just received from KVM_GET_SREGS is always a no-op. + */ +struct kvm_sregs { +	__u32 pvr; +	union { +		struct { +			__u64 sdr1; +			struct { +				struct { +					__u64 slbe; +					__u64 slbv; +				} slb[64]; +			} ppc64; +			struct { +				__u32 sr[16]; +				__u64 ibat[8]; +				__u64 dbat[8]; +			} ppc32; +		} s; +		struct { +			union { +				struct { /* KVM_SREGS_E_IMPL_FSL */ +					__u32 features; /* KVM_SREGS_E_FSL_ */ +					__u32 svr; +					__u64 mcar; +					__u32 hid0; + +					/* KVM_SREGS_E_FSL_PIDn */ +					__u32 pid1, pid2; +				} fsl; +				__u8 pad[256]; +			} impl; + +			__u32 features; /* KVM_SREGS_E_ */ +			__u32 impl_id;	/* KVM_SREGS_E_IMPL_ */ +			__u32 update_special; /* KVM_SREGS_E_UPDATE_ */ +			__u32 pir;	/* read-only */ +			__u64 sprg8; +			__u64 sprg9;	/* E.ED */ +			__u64 csrr0; +			__u64 dsrr0;	/* E.ED */ +			__u64 mcsrr0; +			__u32 csrr1; +			__u32 dsrr1;	/* E.ED */ +			__u32 mcsrr1; +			__u32 esr; +			__u64 dear; +			__u64 ivpr; +			__u64 mcivpr; +			__u64 mcsr;	/* KVM_SREGS_E_UPDATE_MCSR */ + +			__u32 tsr;	/* KVM_SREGS_E_UPDATE_TSR */ +			__u32 tcr; +			__u32 decar; +			__u32 dec;	/* KVM_SREGS_E_UPDATE_DEC */ + +			/* +			 * Userspace can read TB directly, but the +			 * value reported here is consistent with "dec". +			 * +			 * Read-only. +			 */ +			__u64 tb; + +			__u32 dbsr;	/* KVM_SREGS_E_UPDATE_DBSR */ +			__u32 dbcr[3]; +			/* +			 * iac/dac registers are 64bit wide, while this API +			 * interface provides only lower 32 bits on 64 bit +			 * processors. ONE_REG interface is added for 64bit +			 * iac/dac registers. +			 */ +			__u32 iac[4]; +			__u32 dac[2]; +			__u32 dvc[2]; +			__u8 num_iac;	/* read-only */ +			__u8 num_dac;	/* read-only */ +			__u8 num_dvc;	/* read-only */ +			__u8 pad; + +			__u32 epr;	/* EXP */ +			__u32 vrsave;	/* a.k.a. USPRG0 */ +			__u32 epcr;	/* KVM_SREGS_E_64 */ + +			__u32 mas0; +			__u32 mas1; +			__u64 mas2; +			__u64 mas7_3; +			__u32 mas4; +			__u32 mas6; + +			__u32 ivor_low[16]; /* IVOR0-15 */ +			__u32 ivor_high[18]; /* IVOR32+, plus room to expand */ + +			__u32 mmucfg;	/* read-only */ +			__u32 eptcfg;	/* E.PT, read-only */ +			__u32 tlbcfg[4];/* read-only */ +			__u32 tlbps[4]; /* read-only */ + +			__u32 eplc, epsc; /* E.PD */ +		} e; +		__u8 pad[1020]; +	} u; +}; + +struct kvm_fpu { +	__u64 fpr[32]; +}; + +/* + * Defines for h/w breakpoint, watchpoint (read, write or both) and + * software breakpoint. + * These are used as "type" in KVM_SET_GUEST_DEBUG ioctl and "status" + * for KVM_DEBUG_EXIT. + */ +#define KVMPPC_DEBUG_NONE		0x0 +#define KVMPPC_DEBUG_BREAKPOINT		(1UL << 1) +#define KVMPPC_DEBUG_WATCH_WRITE	(1UL << 2) +#define KVMPPC_DEBUG_WATCH_READ		(1UL << 3) +struct kvm_debug_exit_arch { +	__u64 address; +	/* +	 * exiting to userspace because of h/w breakpoint, watchpoint +	 * (read, write or both) and software breakpoint. +	 */ +	__u32 status; +	__u32 reserved; +}; + +/* for KVM_SET_GUEST_DEBUG */ +struct kvm_guest_debug_arch { +	struct { +		/* H/W breakpoint/watchpoint address */ +		__u64 addr; +		/* +		 * Type denotes h/w breakpoint, read watchpoint, write +		 * watchpoint or watchpoint (both read and write). +		 */ +		__u32 type; +		__u32 reserved; +	} bp[16]; +}; + +/* Debug related defines */ +/* + * kvm_guest_debug->control is a 32 bit field. The lower 16 bits are generic + * and upper 16 bits are architecture specific. Architecture specific defines + * that ioctl is for setting hardware breakpoint or software breakpoint. + */ +#define KVM_GUESTDBG_USE_SW_BP		0x00010000 +#define KVM_GUESTDBG_USE_HW_BP		0x00020000 + +/* definition of registers in kvm_run */ +struct kvm_sync_regs { +}; + +#define KVM_INTERRUPT_SET	-1U +#define KVM_INTERRUPT_UNSET	-2U +#define KVM_INTERRUPT_SET_LEVEL	-3U + +#define KVM_CPU_440		1 +#define KVM_CPU_E500V2		2 +#define KVM_CPU_3S_32		3 +#define KVM_CPU_3S_64		4 +#define KVM_CPU_E500MC		5 + +/* for KVM_CAP_SPAPR_TCE */ +struct kvm_create_spapr_tce { +	__u64 liobn; +	__u32 window_size; +}; + +/* for KVM_ALLOCATE_RMA */ +struct kvm_allocate_rma { +	__u64 rma_size; +}; + +/* for KVM_CAP_PPC_RTAS */ +struct kvm_rtas_token_args { +	char name[120]; +	__u64 token;	/* Use a token of 0 to undefine a mapping */ +}; + +struct kvm_book3e_206_tlb_entry { +	__u32 mas8; +	__u32 mas1; +	__u64 mas2; +	__u64 mas7_3; +}; + +struct kvm_book3e_206_tlb_params { +	/* +	 * For mmu types KVM_MMU_FSL_BOOKE_NOHV and KVM_MMU_FSL_BOOKE_HV: +	 * +	 * - The number of ways of TLB0 must be a power of two between 2 and +	 *   16. +	 * - TLB1 must be fully associative. +	 * - The size of TLB0 must be a multiple of the number of ways, and +	 *   the number of sets must be a power of two. +	 * - The size of TLB1 may not exceed 64 entries. +	 * - TLB0 supports 4 KiB pages. +	 * - The page sizes supported by TLB1 are as indicated by +	 *   TLB1CFG (if MMUCFG[MAVN] = 0) or TLB1PS (if MMUCFG[MAVN] = 1) +	 *   as returned by KVM_GET_SREGS. +	 * - TLB2 and TLB3 are reserved, and their entries in tlb_sizes[] +	 *   and tlb_ways[] must be zero. +	 * +	 * tlb_ways[n] = tlb_sizes[n] means the array is fully associative. +	 * +	 * KVM will adjust TLBnCFG based on the sizes configured here, +	 * though arrays greater than 2048 entries will have TLBnCFG[NENTRY] +	 * set to zero. +	 */ +	__u32 tlb_sizes[4]; +	__u32 tlb_ways[4]; +	__u32 reserved[8]; +}; + +/* For KVM_PPC_GET_HTAB_FD */ +struct kvm_get_htab_fd { +	__u64	flags; +	__u64	start_index; +	__u64	reserved[2]; +}; + +/* Values for kvm_get_htab_fd.flags */ +#define KVM_GET_HTAB_BOLTED_ONLY	((__u64)0x1) +#define KVM_GET_HTAB_WRITE		((__u64)0x2) + +/* + * Data read on the file descriptor is formatted as a series of + * records, each consisting of a header followed by a series of + * `n_valid' HPTEs (16 bytes each), which are all valid.  Following + * those valid HPTEs there are `n_invalid' invalid HPTEs, which + * are not represented explicitly in the stream.  The same format + * is used for writing. + */ +struct kvm_get_htab_header { +	__u32	index; +	__u16	n_valid; +	__u16	n_invalid; +}; + +/* Per-vcpu XICS interrupt controller state */ +#define KVM_REG_PPC_ICP_STATE	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x8c) + +#define  KVM_REG_PPC_ICP_CPPR_SHIFT	56	/* current proc priority */ +#define  KVM_REG_PPC_ICP_CPPR_MASK	0xff +#define  KVM_REG_PPC_ICP_XISR_SHIFT	32	/* interrupt status field */ +#define  KVM_REG_PPC_ICP_XISR_MASK	0xffffff +#define  KVM_REG_PPC_ICP_MFRR_SHIFT	24	/* pending IPI priority */ +#define  KVM_REG_PPC_ICP_MFRR_MASK	0xff +#define  KVM_REG_PPC_ICP_PPRI_SHIFT	16	/* pending irq priority */ +#define  KVM_REG_PPC_ICP_PPRI_MASK	0xff + +/* Device control API: PPC-specific devices */ +#define KVM_DEV_MPIC_GRP_MISC		1 +#define   KVM_DEV_MPIC_BASE_ADDR	0	/* 64-bit */ + +#define KVM_DEV_MPIC_GRP_REGISTER	2	/* 32-bit */ +#define KVM_DEV_MPIC_GRP_IRQ_ACTIVE	3	/* 32-bit */ + +/* One-Reg API: PPC-specific registers */ +#define KVM_REG_PPC_HIOR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x1) +#define KVM_REG_PPC_IAC1	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x2) +#define KVM_REG_PPC_IAC2	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x3) +#define KVM_REG_PPC_IAC3	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x4) +#define KVM_REG_PPC_IAC4	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x5) +#define KVM_REG_PPC_DAC1	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x6) +#define KVM_REG_PPC_DAC2	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x7) +#define KVM_REG_PPC_DABR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x8) +#define KVM_REG_PPC_DSCR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x9) +#define KVM_REG_PPC_PURR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xa) +#define KVM_REG_PPC_SPURR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xb) +#define KVM_REG_PPC_DAR		(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xc) +#define KVM_REG_PPC_DSISR	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xd) +#define KVM_REG_PPC_AMR		(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xe) +#define KVM_REG_PPC_UAMOR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xf) + +#define KVM_REG_PPC_MMCR0	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x10) +#define KVM_REG_PPC_MMCR1	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x11) +#define KVM_REG_PPC_MMCRA	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x12) +#define KVM_REG_PPC_MMCR2	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x13) +#define KVM_REG_PPC_MMCRS	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x14) +#define KVM_REG_PPC_SIAR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x15) +#define KVM_REG_PPC_SDAR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x16) +#define KVM_REG_PPC_SIER	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x17) + +#define KVM_REG_PPC_PMC1	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x18) +#define KVM_REG_PPC_PMC2	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x19) +#define KVM_REG_PPC_PMC3	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x1a) +#define KVM_REG_PPC_PMC4	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x1b) +#define KVM_REG_PPC_PMC5	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x1c) +#define KVM_REG_PPC_PMC6	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x1d) +#define KVM_REG_PPC_PMC7	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x1e) +#define KVM_REG_PPC_PMC8	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x1f) + +/* 32 floating-point registers */ +#define KVM_REG_PPC_FPR0	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x20) +#define KVM_REG_PPC_FPR(n)	(KVM_REG_PPC_FPR0 + (n)) +#define KVM_REG_PPC_FPR31	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x3f) + +/* 32 VMX/Altivec vector registers */ +#define KVM_REG_PPC_VR0		(KVM_REG_PPC | KVM_REG_SIZE_U128 | 0x40) +#define KVM_REG_PPC_VR(n)	(KVM_REG_PPC_VR0 + (n)) +#define KVM_REG_PPC_VR31	(KVM_REG_PPC | KVM_REG_SIZE_U128 | 0x5f) + +/* 32 double-width FP registers for VSX */ +/* High-order halves overlap with FP regs */ +#define KVM_REG_PPC_VSR0	(KVM_REG_PPC | KVM_REG_SIZE_U128 | 0x60) +#define KVM_REG_PPC_VSR(n)	(KVM_REG_PPC_VSR0 + (n)) +#define KVM_REG_PPC_VSR31	(KVM_REG_PPC | KVM_REG_SIZE_U128 | 0x7f) + +/* FP and vector status/control registers */ +#define KVM_REG_PPC_FPSCR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x80) +/* + * VSCR register is documented as a 32-bit register in the ISA, but it can + * only be accesses via a vector register. Expose VSCR as a 32-bit register + * even though the kernel represents it as a 128-bit vector. + */ +#define KVM_REG_PPC_VSCR	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x81) + +/* Virtual processor areas */ +/* For SLB & DTL, address in high (first) half, length in low half */ +#define KVM_REG_PPC_VPA_ADDR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x82) +#define KVM_REG_PPC_VPA_SLB	(KVM_REG_PPC | KVM_REG_SIZE_U128 | 0x83) +#define KVM_REG_PPC_VPA_DTL	(KVM_REG_PPC | KVM_REG_SIZE_U128 | 0x84) + +#define KVM_REG_PPC_EPCR	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x85) +#define KVM_REG_PPC_EPR		(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x86) + +/* Timer Status Register OR/CLEAR interface */ +#define KVM_REG_PPC_OR_TSR	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x87) +#define KVM_REG_PPC_CLEAR_TSR	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x88) +#define KVM_REG_PPC_TCR		(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x89) +#define KVM_REG_PPC_TSR		(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x8a) + +/* Debugging: Special instruction for software breakpoint */ +#define KVM_REG_PPC_DEBUG_INST	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x8b) + +/* MMU registers */ +#define KVM_REG_PPC_MAS0	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x8c) +#define KVM_REG_PPC_MAS1	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x8d) +#define KVM_REG_PPC_MAS2	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x8e) +#define KVM_REG_PPC_MAS7_3	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x8f) +#define KVM_REG_PPC_MAS4	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x90) +#define KVM_REG_PPC_MAS6	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x91) +#define KVM_REG_PPC_MMUCFG	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x92) +/* + * TLBnCFG fields TLBnCFG_N_ENTRY and TLBnCFG_ASSOC can be changed only using + * KVM_CAP_SW_TLB ioctl + */ +#define KVM_REG_PPC_TLB0CFG	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x93) +#define KVM_REG_PPC_TLB1CFG	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x94) +#define KVM_REG_PPC_TLB2CFG	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x95) +#define KVM_REG_PPC_TLB3CFG	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x96) +#define KVM_REG_PPC_TLB0PS	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x97) +#define KVM_REG_PPC_TLB1PS	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x98) +#define KVM_REG_PPC_TLB2PS	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x99) +#define KVM_REG_PPC_TLB3PS	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x9a) +#define KVM_REG_PPC_EPTCFG	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x9b) + +/* Timebase offset */ +#define KVM_REG_PPC_TB_OFFSET	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x9c) + +/* POWER8 registers */ +#define KVM_REG_PPC_SPMC1	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x9d) +#define KVM_REG_PPC_SPMC2	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0x9e) +#define KVM_REG_PPC_IAMR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x9f) +#define KVM_REG_PPC_TFHAR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xa0) +#define KVM_REG_PPC_TFIAR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xa1) +#define KVM_REG_PPC_TEXASR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xa2) +#define KVM_REG_PPC_FSCR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xa3) +#define KVM_REG_PPC_PSPB	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xa4) +#define KVM_REG_PPC_EBBHR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xa5) +#define KVM_REG_PPC_EBBRR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xa6) +#define KVM_REG_PPC_BESCR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xa7) +#define KVM_REG_PPC_TAR		(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xa8) +#define KVM_REG_PPC_DPDES	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xa9) +#define KVM_REG_PPC_DAWR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xaa) +#define KVM_REG_PPC_DAWRX	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xab) +#define KVM_REG_PPC_CIABR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xac) +#define KVM_REG_PPC_IC		(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xad) +#define KVM_REG_PPC_VTB		(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xae) +#define KVM_REG_PPC_CSIGR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xaf) +#define KVM_REG_PPC_TACR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xb0) +#define KVM_REG_PPC_TCSCR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xb1) +#define KVM_REG_PPC_PID		(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xb2) +#define KVM_REG_PPC_ACOP	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xb3) + +#define KVM_REG_PPC_VRSAVE	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xb4) +#define KVM_REG_PPC_LPCR	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xb5) +#define KVM_REG_PPC_LPCR_64	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xb5) +#define KVM_REG_PPC_PPR		(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xb6) + +/* Architecture compatibility level */ +#define KVM_REG_PPC_ARCH_COMPAT	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xb7) + +#define KVM_REG_PPC_DABRX	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xb8) +#define KVM_REG_PPC_WORT	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xb9) +#define KVM_REG_PPC_SPRG9	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xba) +#define KVM_REG_PPC_DBSR	(KVM_REG_PPC | KVM_REG_SIZE_U32 | 0xbb) + +/* Transactional Memory checkpointed state: + * This is all GPRs, all VSX regs and a subset of SPRs + */ +#define KVM_REG_PPC_TM		(KVM_REG_PPC | 0x80000000) +/* TM GPRs */ +#define KVM_REG_PPC_TM_GPR0	(KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0) +#define KVM_REG_PPC_TM_GPR(n)	(KVM_REG_PPC_TM_GPR0 + (n)) +#define KVM_REG_PPC_TM_GPR31	(KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x1f) +/* TM VSX */ +#define KVM_REG_PPC_TM_VSR0	(KVM_REG_PPC_TM | KVM_REG_SIZE_U128 | 0x20) +#define KVM_REG_PPC_TM_VSR(n)	(KVM_REG_PPC_TM_VSR0 + (n)) +#define KVM_REG_PPC_TM_VSR63	(KVM_REG_PPC_TM | KVM_REG_SIZE_U128 | 0x5f) +/* TM SPRS */ +#define KVM_REG_PPC_TM_CR	(KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x60) +#define KVM_REG_PPC_TM_LR	(KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x61) +#define KVM_REG_PPC_TM_CTR	(KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x62) +#define KVM_REG_PPC_TM_FPSCR	(KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x63) +#define KVM_REG_PPC_TM_AMR	(KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x64) +#define KVM_REG_PPC_TM_PPR	(KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x65) +#define KVM_REG_PPC_TM_VRSAVE	(KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x66) +#define KVM_REG_PPC_TM_VSCR	(KVM_REG_PPC_TM | KVM_REG_SIZE_U32 | 0x67) +#define KVM_REG_PPC_TM_DSCR	(KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x68) +#define KVM_REG_PPC_TM_TAR	(KVM_REG_PPC_TM | KVM_REG_SIZE_U64 | 0x69) + +/* PPC64 eXternal Interrupt Controller Specification */ +#define KVM_DEV_XICS_GRP_SOURCES	1	/* 64-bit source attributes */ + +/* Layout of 64-bit source attribute values */ +#define  KVM_XICS_DESTINATION_SHIFT	0 +#define  KVM_XICS_DESTINATION_MASK	0xffffffffULL +#define  KVM_XICS_PRIORITY_SHIFT	32 +#define  KVM_XICS_PRIORITY_MASK		0xff +#define  KVM_XICS_LEVEL_SENSITIVE	(1ULL << 40) +#define  KVM_XICS_MASKED		(1ULL << 41) +#define  KVM_XICS_PENDING		(1ULL << 42) + +#endif /* __LINUX_KVM_POWERPC_H */ diff --git a/linux-headers/asm-powerpc/kvm_para.h b/linux-headers/asm-powerpc/kvm_para.h new file mode 100644 index 00000000..2abcc463 --- /dev/null +++ b/linux-headers/asm-powerpc/kvm_para.h @@ -0,0 +1,97 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License, version 2, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. + * + * Copyright IBM Corp. 2008 + * + * Authors: Hollis Blanchard <hollisb@us.ibm.com> + */ + +#ifndef __POWERPC_KVM_PARA_H__ +#define __POWERPC_KVM_PARA_H__ + +#include <linux/types.h> + +/* + * Additions to this struct must only occur at the end, and should be + * accompanied by a KVM_MAGIC_FEAT flag to advertise that they are present + * (albeit not necessarily relevant to the current target hardware platform). + * + * Struct fields are always 32 or 64 bit aligned, depending on them being 32 + * or 64 bit wide respectively. + * + * See Documentation/virtual/kvm/ppc-pv.txt + */ +struct kvm_vcpu_arch_shared { +	__u64 scratch1; +	__u64 scratch2; +	__u64 scratch3; +	__u64 critical;		/* Guest may not get interrupts if == r1 */ +	__u64 sprg0; +	__u64 sprg1; +	__u64 sprg2; +	__u64 sprg3; +	__u64 srr0; +	__u64 srr1; +	__u64 dar;		/* dear on BookE */ +	__u64 msr; +	__u32 dsisr; +	__u32 int_pending;	/* Tells the guest if we have an interrupt */ +	__u32 sr[16]; +	__u32 mas0; +	__u32 mas1; +	__u64 mas7_3; +	__u64 mas2; +	__u32 mas4; +	__u32 mas6; +	__u32 esr; +	__u32 pir; + +	/* +	 * SPRG4-7 are user-readable, so we can only keep these consistent +	 * between the shared area and the real registers when there's an +	 * intervening exit to KVM.  This also applies to SPRG3 on some +	 * chips. +	 * +	 * This suffices for access by guest userspace, since in PR-mode +	 * KVM, an exit must occur when changing the guest's MSR[PR]. +	 * If the guest kernel writes to SPRG3-7 via the shared area, it +	 * must also use the shared area for reading while in kernel space. +	 */ +	__u64 sprg4; +	__u64 sprg5; +	__u64 sprg6; +	__u64 sprg7; +}; + +#define KVM_SC_MAGIC_R0		0x4b564d21 /* "KVM!" */ + +#define KVM_HCALL_TOKEN(num)     _EV_HCALL_TOKEN(EV_KVM_VENDOR_ID, num) + +#include <asm/epapr_hcalls.h> + +#define KVM_FEATURE_MAGIC_PAGE	1 + +/* Magic page flags from host to guest */ + +#define KVM_MAGIC_FEAT_SR		(1 << 0) + +/* MASn, ESR, PIR, and high SPRGs */ +#define KVM_MAGIC_FEAT_MAS0_TO_SPRG7	(1 << 1) + +/* Magic page flags from guest to host */ + +#define MAGIC_PAGE_FLAG_NOT_MAPPED_NX	(1 << 0) + + +#endif /* __POWERPC_KVM_PARA_H__ */ diff --git a/linux-headers/asm-s390/kvm.h b/linux-headers/asm-s390/kvm.h new file mode 100644 index 00000000..512d8f1d --- /dev/null +++ b/linux-headers/asm-s390/kvm.h @@ -0,0 +1,182 @@ +#ifndef __LINUX_KVM_S390_H +#define __LINUX_KVM_S390_H +/* + * KVM s390 specific structures and definitions + * + * Copyright IBM Corp. 2008 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License (version 2 only) + * as published by the Free Software Foundation. + * + *    Author(s): Carsten Otte <cotte@de.ibm.com> + *               Christian Borntraeger <borntraeger@de.ibm.com> + */ +#include <linux/types.h> + +#define __KVM_S390 +#define __KVM_HAVE_GUEST_DEBUG + +/* Device control API: s390-specific devices */ +#define KVM_DEV_FLIC_GET_ALL_IRQS	1 +#define KVM_DEV_FLIC_ENQUEUE		2 +#define KVM_DEV_FLIC_CLEAR_IRQS		3 +#define KVM_DEV_FLIC_APF_ENABLE		4 +#define KVM_DEV_FLIC_APF_DISABLE_WAIT	5 +#define KVM_DEV_FLIC_ADAPTER_REGISTER	6 +#define KVM_DEV_FLIC_ADAPTER_MODIFY	7 +/* + * We can have up to 4*64k pending subchannels + 8 adapter interrupts, + * as well as up  to ASYNC_PF_PER_VCPU*KVM_MAX_VCPUS pfault done interrupts. + * There are also sclp and machine checks. This gives us + * sizeof(kvm_s390_irq)*(4*65536+8+64*64+1+1) = 72 * 266250 = 19170000 + * Lets round up to 8192 pages. + */ +#define KVM_S390_MAX_FLOAT_IRQS	266250 +#define KVM_S390_FLIC_MAX_BUFFER	0x2000000 + +struct kvm_s390_io_adapter { +	__u32 id; +	__u8 isc; +	__u8 maskable; +	__u8 swap; +	__u8 pad; +}; + +#define KVM_S390_IO_ADAPTER_MASK 1 +#define KVM_S390_IO_ADAPTER_MAP 2 +#define KVM_S390_IO_ADAPTER_UNMAP 3 + +struct kvm_s390_io_adapter_req { +	__u32 id; +	__u8 type; +	__u8 mask; +	__u16 pad0; +	__u64 addr; +}; + +/* kvm attr_group  on vm fd */ +#define KVM_S390_VM_MEM_CTRL		0 +#define KVM_S390_VM_TOD			1 +#define KVM_S390_VM_CRYPTO		2 +#define KVM_S390_VM_CPU_MODEL		3 + +/* kvm attributes for mem_ctrl */ +#define KVM_S390_VM_MEM_ENABLE_CMMA	0 +#define KVM_S390_VM_MEM_CLR_CMMA	1 +#define KVM_S390_VM_MEM_LIMIT_SIZE	2 + +/* kvm attributes for KVM_S390_VM_TOD */ +#define KVM_S390_VM_TOD_LOW		0 +#define KVM_S390_VM_TOD_HIGH		1 + +/* kvm attributes for KVM_S390_VM_CPU_MODEL */ +/* processor related attributes are r/w */ +#define KVM_S390_VM_CPU_PROCESSOR	0 +struct kvm_s390_vm_cpu_processor { +	__u64 cpuid; +	__u16 ibc; +	__u8  pad[6]; +	__u64 fac_list[256]; +}; + +/* machine related attributes are r/o */ +#define KVM_S390_VM_CPU_MACHINE		1 +struct kvm_s390_vm_cpu_machine { +	__u64 cpuid; +	__u32 ibc; +	__u8  pad[4]; +	__u64 fac_mask[256]; +	__u64 fac_list[256]; +}; + +/* kvm attributes for crypto */ +#define KVM_S390_VM_CRYPTO_ENABLE_AES_KW	0 +#define KVM_S390_VM_CRYPTO_ENABLE_DEA_KW	1 +#define KVM_S390_VM_CRYPTO_DISABLE_AES_KW	2 +#define KVM_S390_VM_CRYPTO_DISABLE_DEA_KW	3 + +/* for KVM_GET_REGS and KVM_SET_REGS */ +struct kvm_regs { +	/* general purpose regs for s390 */ +	__u64 gprs[16]; +}; + +/* for KVM_GET_SREGS and KVM_SET_SREGS */ +struct kvm_sregs { +	__u32 acrs[16]; +	__u64 crs[16]; +}; + +/* for KVM_GET_FPU and KVM_SET_FPU */ +struct kvm_fpu { +	__u32 fpc; +	__u64 fprs[16]; +}; + +#define KVM_GUESTDBG_USE_HW_BP		0x00010000 + +#define KVM_HW_BP			1 +#define KVM_HW_WP_WRITE			2 +#define KVM_SINGLESTEP			4 + +struct kvm_debug_exit_arch { +	__u64 addr; +	__u8 type; +	__u8 pad[7]; /* Should be set to 0 */ +}; + +struct kvm_hw_breakpoint { +	__u64 addr; +	__u64 phys_addr; +	__u64 len; +	__u8 type; +	__u8 pad[7]; /* Should be set to 0 */ +}; + +/* for KVM_SET_GUEST_DEBUG */ +struct kvm_guest_debug_arch { +	__u32 nr_hw_bp; +	__u32 pad; /* Should be set to 0 */ +	struct kvm_hw_breakpoint *hw_bp; +}; + +/* for KVM_SYNC_PFAULT and KVM_REG_S390_PFTOKEN */ +#define KVM_S390_PFAULT_TOKEN_INVALID	0xffffffffffffffffULL + +#define KVM_SYNC_PREFIX (1UL << 0) +#define KVM_SYNC_GPRS   (1UL << 1) +#define KVM_SYNC_ACRS   (1UL << 2) +#define KVM_SYNC_CRS    (1UL << 3) +#define KVM_SYNC_ARCH0  (1UL << 4) +#define KVM_SYNC_PFAULT (1UL << 5) +#define KVM_SYNC_VRS    (1UL << 6) +/* definition of registers in kvm_run */ +struct kvm_sync_regs { +	__u64 prefix;	/* prefix register */ +	__u64 gprs[16];	/* general purpose registers */ +	__u32 acrs[16];	/* access registers */ +	__u64 crs[16];	/* control registers */ +	__u64 todpr;	/* tod programmable register [ARCH0] */ +	__u64 cputm;	/* cpu timer [ARCH0] */ +	__u64 ckc;	/* clock comparator [ARCH0] */ +	__u64 pp;	/* program parameter [ARCH0] */ +	__u64 gbea;	/* guest breaking-event address [ARCH0] */ +	__u64 pft;	/* pfault token [PFAULT] */ +	__u64 pfs;	/* pfault select [PFAULT] */ +	__u64 pfc;	/* pfault compare [PFAULT] */ +	__u64 vrs[32][2];	/* vector registers */ +	__u8  reserved[512];	/* for future vector expansion */ +	__u32 fpc;	/* only valid with vector registers */ +}; + +#define KVM_REG_S390_TODPR	(KVM_REG_S390 | KVM_REG_SIZE_U32 | 0x1) +#define KVM_REG_S390_EPOCHDIFF	(KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x2) +#define KVM_REG_S390_CPU_TIMER  (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x3) +#define KVM_REG_S390_CLOCK_COMP (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x4) +#define KVM_REG_S390_PFTOKEN	(KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x5) +#define KVM_REG_S390_PFCOMPARE	(KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x6) +#define KVM_REG_S390_PFSELECT	(KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x7) +#define KVM_REG_S390_PP		(KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x8) +#define KVM_REG_S390_GBEA	(KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x9) +#endif diff --git a/linux-headers/asm-s390/kvm_para.h b/linux-headers/asm-s390/kvm_para.h new file mode 100644 index 00000000..ff1f4e7b --- /dev/null +++ b/linux-headers/asm-s390/kvm_para.h @@ -0,0 +1,11 @@ +/* + * User API definitions for paravirtual devices on s390 + * + * Copyright IBM Corp. 2008 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License (version 2 only) + * as published by the Free Software Foundation. + * + *    Author(s): Christian Borntraeger <borntraeger@de.ibm.com> + */ diff --git a/linux-headers/asm-x86/hyperv.h b/linux-headers/asm-x86/hyperv.h new file mode 100644 index 00000000..8fba544e --- /dev/null +++ b/linux-headers/asm-x86/hyperv.h @@ -0,0 +1,250 @@ +#ifndef _ASM_X86_HYPERV_H +#define _ASM_X86_HYPERV_H + +#include <linux/types.h> + +/* + * The below CPUID leaves are present if VersionAndFeatures.HypervisorPresent + * is set by CPUID(HvCpuIdFunctionVersionAndFeatures). + */ +#define HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS	0x40000000 +#define HYPERV_CPUID_INTERFACE			0x40000001 +#define HYPERV_CPUID_VERSION			0x40000002 +#define HYPERV_CPUID_FEATURES			0x40000003 +#define HYPERV_CPUID_ENLIGHTMENT_INFO		0x40000004 +#define HYPERV_CPUID_IMPLEMENT_LIMITS		0x40000005 + +#define HYPERV_HYPERVISOR_PRESENT_BIT		0x80000000 +#define HYPERV_CPUID_MIN			0x40000005 +#define HYPERV_CPUID_MAX			0x4000ffff + +/* + * Feature identification. EAX indicates which features are available + * to the partition based upon the current partition privileges. + */ + +/* VP Runtime (HV_X64_MSR_VP_RUNTIME) available */ +#define HV_X64_MSR_VP_RUNTIME_AVAILABLE		(1 << 0) +/* Partition Reference Counter (HV_X64_MSR_TIME_REF_COUNT) available*/ +#define HV_X64_MSR_TIME_REF_COUNT_AVAILABLE	(1 << 1) + +/* A partition's reference time stamp counter (TSC) page */ +#define HV_X64_MSR_REFERENCE_TSC		0x40000021 + +/* + * There is a single feature flag that signifies the presence of the MSR + * that can be used to retrieve both the local APIC Timer frequency as + * well as the TSC frequency. + */ + +/* Local APIC timer frequency MSR (HV_X64_MSR_APIC_FREQUENCY) is available */ +#define HV_X64_MSR_APIC_FREQUENCY_AVAILABLE (1 << 11) + +/* TSC frequency MSR (HV_X64_MSR_TSC_FREQUENCY) is available */ +#define HV_X64_MSR_TSC_FREQUENCY_AVAILABLE (1 << 11) + +/* + * Basic SynIC MSRs (HV_X64_MSR_SCONTROL through HV_X64_MSR_EOM + * and HV_X64_MSR_SINT0 through HV_X64_MSR_SINT15) available + */ +#define HV_X64_MSR_SYNIC_AVAILABLE		(1 << 2) +/* + * Synthetic Timer MSRs (HV_X64_MSR_STIMER0_CONFIG through + * HV_X64_MSR_STIMER3_COUNT) available + */ +#define HV_X64_MSR_SYNTIMER_AVAILABLE		(1 << 3) +/* + * APIC access MSRs (HV_X64_MSR_EOI, HV_X64_MSR_ICR and HV_X64_MSR_TPR) + * are available + */ +#define HV_X64_MSR_APIC_ACCESS_AVAILABLE	(1 << 4) +/* Hypercall MSRs (HV_X64_MSR_GUEST_OS_ID and HV_X64_MSR_HYPERCALL) available*/ +#define HV_X64_MSR_HYPERCALL_AVAILABLE		(1 << 5) +/* Access virtual processor index MSR (HV_X64_MSR_VP_INDEX) available*/ +#define HV_X64_MSR_VP_INDEX_AVAILABLE		(1 << 6) +/* Virtual system reset MSR (HV_X64_MSR_RESET) is available*/ +#define HV_X64_MSR_RESET_AVAILABLE		(1 << 7) + /* +  * Access statistics pages MSRs (HV_X64_MSR_STATS_PARTITION_RETAIL_PAGE, +  * HV_X64_MSR_STATS_PARTITION_INTERNAL_PAGE, HV_X64_MSR_STATS_VP_RETAIL_PAGE, +  * HV_X64_MSR_STATS_VP_INTERNAL_PAGE) available +  */ +#define HV_X64_MSR_STAT_PAGES_AVAILABLE		(1 << 8) + +/* + * Feature identification: EBX indicates which flags were specified at + * partition creation. The format is the same as the partition creation + * flag structure defined in section Partition Creation Flags. + */ +#define HV_X64_CREATE_PARTITIONS		(1 << 0) +#define HV_X64_ACCESS_PARTITION_ID		(1 << 1) +#define HV_X64_ACCESS_MEMORY_POOL		(1 << 2) +#define HV_X64_ADJUST_MESSAGE_BUFFERS		(1 << 3) +#define HV_X64_POST_MESSAGES			(1 << 4) +#define HV_X64_SIGNAL_EVENTS			(1 << 5) +#define HV_X64_CREATE_PORT			(1 << 6) +#define HV_X64_CONNECT_PORT			(1 << 7) +#define HV_X64_ACCESS_STATS			(1 << 8) +#define HV_X64_DEBUGGING			(1 << 11) +#define HV_X64_CPU_POWER_MANAGEMENT		(1 << 12) +#define HV_X64_CONFIGURE_PROFILER		(1 << 13) + +/* + * Feature identification. EDX indicates which miscellaneous features + * are available to the partition. + */ +/* The MWAIT instruction is available (per section MONITOR / MWAIT) */ +#define HV_X64_MWAIT_AVAILABLE				(1 << 0) +/* Guest debugging support is available */ +#define HV_X64_GUEST_DEBUGGING_AVAILABLE		(1 << 1) +/* Performance Monitor support is available*/ +#define HV_X64_PERF_MONITOR_AVAILABLE			(1 << 2) +/* Support for physical CPU dynamic partitioning events is available*/ +#define HV_X64_CPU_DYNAMIC_PARTITIONING_AVAILABLE	(1 << 3) +/* + * Support for passing hypercall input parameter block via XMM + * registers is available + */ +#define HV_X64_HYPERCALL_PARAMS_XMM_AVAILABLE		(1 << 4) +/* Support for a virtual guest idle state is available */ +#define HV_X64_GUEST_IDLE_STATE_AVAILABLE		(1 << 5) + +/* + * Implementation recommendations. Indicates which behaviors the hypervisor + * recommends the OS implement for optimal performance. + */ + /* +  * Recommend using hypercall for address space switches rather +  * than MOV to CR3 instruction +  */ +#define HV_X64_MWAIT_RECOMMENDED		(1 << 0) +/* Recommend using hypercall for local TLB flushes rather + * than INVLPG or MOV to CR3 instructions */ +#define HV_X64_LOCAL_TLB_FLUSH_RECOMMENDED	(1 << 1) +/* + * Recommend using hypercall for remote TLB flushes rather + * than inter-processor interrupts + */ +#define HV_X64_REMOTE_TLB_FLUSH_RECOMMENDED	(1 << 2) +/* + * Recommend using MSRs for accessing APIC registers + * EOI, ICR and TPR rather than their memory-mapped counterparts + */ +#define HV_X64_APIC_ACCESS_RECOMMENDED		(1 << 3) +/* Recommend using the hypervisor-provided MSR to initiate a system RESET */ +#define HV_X64_SYSTEM_RESET_RECOMMENDED		(1 << 4) +/* + * Recommend using relaxed timing for this partition. If used, + * the VM should disable any watchdog timeouts that rely on the + * timely delivery of external interrupts + */ +#define HV_X64_RELAXED_TIMING_RECOMMENDED	(1 << 5) + +/* MSR used to identify the guest OS. */ +#define HV_X64_MSR_GUEST_OS_ID			0x40000000 + +/* MSR used to setup pages used to communicate with the hypervisor. */ +#define HV_X64_MSR_HYPERCALL			0x40000001 + +/* MSR used to provide vcpu index */ +#define HV_X64_MSR_VP_INDEX			0x40000002 + +/* MSR used to read the per-partition time reference counter */ +#define HV_X64_MSR_TIME_REF_COUNT		0x40000020 + +/* MSR used to retrieve the TSC frequency */ +#define HV_X64_MSR_TSC_FREQUENCY		0x40000022 + +/* MSR used to retrieve the local APIC timer frequency */ +#define HV_X64_MSR_APIC_FREQUENCY		0x40000023 + +/* Define the virtual APIC registers */ +#define HV_X64_MSR_EOI				0x40000070 +#define HV_X64_MSR_ICR				0x40000071 +#define HV_X64_MSR_TPR				0x40000072 +#define HV_X64_MSR_APIC_ASSIST_PAGE		0x40000073 + +/* Define synthetic interrupt controller model specific registers. */ +#define HV_X64_MSR_SCONTROL			0x40000080 +#define HV_X64_MSR_SVERSION			0x40000081 +#define HV_X64_MSR_SIEFP			0x40000082 +#define HV_X64_MSR_SIMP				0x40000083 +#define HV_X64_MSR_EOM				0x40000084 +#define HV_X64_MSR_SINT0			0x40000090 +#define HV_X64_MSR_SINT1			0x40000091 +#define HV_X64_MSR_SINT2			0x40000092 +#define HV_X64_MSR_SINT3			0x40000093 +#define HV_X64_MSR_SINT4			0x40000094 +#define HV_X64_MSR_SINT5			0x40000095 +#define HV_X64_MSR_SINT6			0x40000096 +#define HV_X64_MSR_SINT7			0x40000097 +#define HV_X64_MSR_SINT8			0x40000098 +#define HV_X64_MSR_SINT9			0x40000099 +#define HV_X64_MSR_SINT10			0x4000009A +#define HV_X64_MSR_SINT11			0x4000009B +#define HV_X64_MSR_SINT12			0x4000009C +#define HV_X64_MSR_SINT13			0x4000009D +#define HV_X64_MSR_SINT14			0x4000009E +#define HV_X64_MSR_SINT15			0x4000009F + +/* + * Synthetic Timer MSRs. Four timers per vcpu. + */ +#define HV_X64_MSR_STIMER0_CONFIG		0x400000B0 +#define HV_X64_MSR_STIMER0_COUNT		0x400000B1 +#define HV_X64_MSR_STIMER1_CONFIG		0x400000B2 +#define HV_X64_MSR_STIMER1_COUNT		0x400000B3 +#define HV_X64_MSR_STIMER2_CONFIG		0x400000B4 +#define HV_X64_MSR_STIMER2_COUNT		0x400000B5 +#define HV_X64_MSR_STIMER3_CONFIG		0x400000B6 +#define HV_X64_MSR_STIMER3_COUNT		0x400000B7 + +/* Hyper-V guest crash notification MSR's */ +#define HV_X64_MSR_CRASH_P0			0x40000100 +#define HV_X64_MSR_CRASH_P1			0x40000101 +#define HV_X64_MSR_CRASH_P2			0x40000102 +#define HV_X64_MSR_CRASH_P3			0x40000103 +#define HV_X64_MSR_CRASH_P4			0x40000104 +#define HV_X64_MSR_CRASH_CTL			0x40000105 +#define HV_X64_MSR_CRASH_CTL_NOTIFY		(1ULL << 63) +#define HV_X64_MSR_CRASH_PARAMS		\ +		(1 + (HV_X64_MSR_CRASH_P4 - HV_X64_MSR_CRASH_P0)) + +#define HV_X64_MSR_HYPERCALL_ENABLE		0x00000001 +#define HV_X64_MSR_HYPERCALL_PAGE_ADDRESS_SHIFT	12 +#define HV_X64_MSR_HYPERCALL_PAGE_ADDRESS_MASK	\ +		(~((1ull << HV_X64_MSR_HYPERCALL_PAGE_ADDRESS_SHIFT) - 1)) + +/* Declare the various hypercall operations. */ +#define HV_X64_HV_NOTIFY_LONG_SPIN_WAIT		0x0008 + +#define HV_X64_MSR_APIC_ASSIST_PAGE_ENABLE		0x00000001 +#define HV_X64_MSR_APIC_ASSIST_PAGE_ADDRESS_SHIFT	12 +#define HV_X64_MSR_APIC_ASSIST_PAGE_ADDRESS_MASK	\ +		(~((1ull << HV_X64_MSR_APIC_ASSIST_PAGE_ADDRESS_SHIFT) - 1)) + +#define HV_X64_MSR_TSC_REFERENCE_ENABLE		0x00000001 +#define HV_X64_MSR_TSC_REFERENCE_ADDRESS_SHIFT	12 + +#define HV_PROCESSOR_POWER_STATE_C0		0 +#define HV_PROCESSOR_POWER_STATE_C1		1 +#define HV_PROCESSOR_POWER_STATE_C2		2 +#define HV_PROCESSOR_POWER_STATE_C3		3 + +/* hypercall status code */ +#define HV_STATUS_SUCCESS			0 +#define HV_STATUS_INVALID_HYPERCALL_CODE	2 +#define HV_STATUS_INVALID_HYPERCALL_INPUT	3 +#define HV_STATUS_INVALID_ALIGNMENT		4 +#define HV_STATUS_INSUFFICIENT_MEMORY		11 +#define HV_STATUS_INVALID_CONNECTION_ID		18 +#define HV_STATUS_INSUFFICIENT_BUFFERS		19 + +typedef struct _HV_REFERENCE_TSC_PAGE { +	__u32 tsc_sequence; +	__u32 res1; +	__u64 tsc_scale; +	__s64 tsc_offset; +} HV_REFERENCE_TSC_PAGE, *PHV_REFERENCE_TSC_PAGE; + +#endif diff --git a/linux-headers/asm-x86/kvm.h b/linux-headers/asm-x86/kvm.h new file mode 100644 index 00000000..a4ae82eb --- /dev/null +++ b/linux-headers/asm-x86/kvm.h @@ -0,0 +1,360 @@ +#ifndef _ASM_X86_KVM_H +#define _ASM_X86_KVM_H + +/* + * KVM x86 specific structures and definitions + * + */ + +#include <linux/types.h> +#include <linux/ioctl.h> + +#define DE_VECTOR 0 +#define DB_VECTOR 1 +#define BP_VECTOR 3 +#define OF_VECTOR 4 +#define BR_VECTOR 5 +#define UD_VECTOR 6 +#define NM_VECTOR 7 +#define DF_VECTOR 8 +#define TS_VECTOR 10 +#define NP_VECTOR 11 +#define SS_VECTOR 12 +#define GP_VECTOR 13 +#define PF_VECTOR 14 +#define MF_VECTOR 16 +#define AC_VECTOR 17 +#define MC_VECTOR 18 +#define XM_VECTOR 19 +#define VE_VECTOR 20 + +/* Select x86 specific features in <linux/kvm.h> */ +#define __KVM_HAVE_PIT +#define __KVM_HAVE_IOAPIC +#define __KVM_HAVE_IRQ_LINE +#define __KVM_HAVE_MSI +#define __KVM_HAVE_USER_NMI +#define __KVM_HAVE_GUEST_DEBUG +#define __KVM_HAVE_MSIX +#define __KVM_HAVE_MCE +#define __KVM_HAVE_PIT_STATE2 +#define __KVM_HAVE_XEN_HVM +#define __KVM_HAVE_VCPU_EVENTS +#define __KVM_HAVE_DEBUGREGS +#define __KVM_HAVE_XSAVE +#define __KVM_HAVE_XCRS +#define __KVM_HAVE_READONLY_MEM + +/* Architectural interrupt line count. */ +#define KVM_NR_INTERRUPTS 256 + +struct kvm_memory_alias { +	__u32 slot;  /* this has a different namespace than memory slots */ +	__u32 flags; +	__u64 guest_phys_addr; +	__u64 memory_size; +	__u64 target_phys_addr; +}; + +/* for KVM_GET_IRQCHIP and KVM_SET_IRQCHIP */ +struct kvm_pic_state { +	__u8 last_irr;	/* edge detection */ +	__u8 irr;		/* interrupt request register */ +	__u8 imr;		/* interrupt mask register */ +	__u8 isr;		/* interrupt service register */ +	__u8 priority_add;	/* highest irq priority */ +	__u8 irq_base; +	__u8 read_reg_select; +	__u8 poll; +	__u8 special_mask; +	__u8 init_state; +	__u8 auto_eoi; +	__u8 rotate_on_auto_eoi; +	__u8 special_fully_nested_mode; +	__u8 init4;		/* true if 4 byte init */ +	__u8 elcr;		/* PIIX edge/trigger selection */ +	__u8 elcr_mask; +}; + +#define KVM_IOAPIC_NUM_PINS  24 +struct kvm_ioapic_state { +	__u64 base_address; +	__u32 ioregsel; +	__u32 id; +	__u32 irr; +	__u32 pad; +	union { +		__u64 bits; +		struct { +			__u8 vector; +			__u8 delivery_mode:3; +			__u8 dest_mode:1; +			__u8 delivery_status:1; +			__u8 polarity:1; +			__u8 remote_irr:1; +			__u8 trig_mode:1; +			__u8 mask:1; +			__u8 reserve:7; +			__u8 reserved[4]; +			__u8 dest_id; +		} fields; +	} redirtbl[KVM_IOAPIC_NUM_PINS]; +}; + +#define KVM_IRQCHIP_PIC_MASTER   0 +#define KVM_IRQCHIP_PIC_SLAVE    1 +#define KVM_IRQCHIP_IOAPIC       2 +#define KVM_NR_IRQCHIPS          3 + +#define KVM_RUN_X86_SMM		 (1 << 0) + +/* for KVM_GET_REGS and KVM_SET_REGS */ +struct kvm_regs { +	/* out (KVM_GET_REGS) / in (KVM_SET_REGS) */ +	__u64 rax, rbx, rcx, rdx; +	__u64 rsi, rdi, rsp, rbp; +	__u64 r8,  r9,  r10, r11; +	__u64 r12, r13, r14, r15; +	__u64 rip, rflags; +}; + +/* for KVM_GET_LAPIC and KVM_SET_LAPIC */ +#define KVM_APIC_REG_SIZE 0x400 +struct kvm_lapic_state { +	char regs[KVM_APIC_REG_SIZE]; +}; + +struct kvm_segment { +	__u64 base; +	__u32 limit; +	__u16 selector; +	__u8  type; +	__u8  present, dpl, db, s, l, g, avl; +	__u8  unusable; +	__u8  padding; +}; + +struct kvm_dtable { +	__u64 base; +	__u16 limit; +	__u16 padding[3]; +}; + + +/* for KVM_GET_SREGS and KVM_SET_SREGS */ +struct kvm_sregs { +	/* out (KVM_GET_SREGS) / in (KVM_SET_SREGS) */ +	struct kvm_segment cs, ds, es, fs, gs, ss; +	struct kvm_segment tr, ldt; +	struct kvm_dtable gdt, idt; +	__u64 cr0, cr2, cr3, cr4, cr8; +	__u64 efer; +	__u64 apic_base; +	__u64 interrupt_bitmap[(KVM_NR_INTERRUPTS + 63) / 64]; +}; + +/* for KVM_GET_FPU and KVM_SET_FPU */ +struct kvm_fpu { +	__u8  fpr[8][16]; +	__u16 fcw; +	__u16 fsw; +	__u8  ftwx;  /* in fxsave format */ +	__u8  pad1; +	__u16 last_opcode; +	__u64 last_ip; +	__u64 last_dp; +	__u8  xmm[16][16]; +	__u32 mxcsr; +	__u32 pad2; +}; + +struct kvm_msr_entry { +	__u32 index; +	__u32 reserved; +	__u64 data; +}; + +/* for KVM_GET_MSRS and KVM_SET_MSRS */ +struct kvm_msrs { +	__u32 nmsrs; /* number of msrs in entries */ +	__u32 pad; + +	struct kvm_msr_entry entries[0]; +}; + +/* for KVM_GET_MSR_INDEX_LIST */ +struct kvm_msr_list { +	__u32 nmsrs; /* number of msrs in entries */ +	__u32 indices[0]; +}; + + +struct kvm_cpuid_entry { +	__u32 function; +	__u32 eax; +	__u32 ebx; +	__u32 ecx; +	__u32 edx; +	__u32 padding; +}; + +/* for KVM_SET_CPUID */ +struct kvm_cpuid { +	__u32 nent; +	__u32 padding; +	struct kvm_cpuid_entry entries[0]; +}; + +struct kvm_cpuid_entry2 { +	__u32 function; +	__u32 index; +	__u32 flags; +	__u32 eax; +	__u32 ebx; +	__u32 ecx; +	__u32 edx; +	__u32 padding[3]; +}; + +#define KVM_CPUID_FLAG_SIGNIFCANT_INDEX		BIT(0) +#define KVM_CPUID_FLAG_STATEFUL_FUNC		BIT(1) +#define KVM_CPUID_FLAG_STATE_READ_NEXT		BIT(2) + +/* for KVM_SET_CPUID2 */ +struct kvm_cpuid2 { +	__u32 nent; +	__u32 padding; +	struct kvm_cpuid_entry2 entries[0]; +}; + +/* for KVM_GET_PIT and KVM_SET_PIT */ +struct kvm_pit_channel_state { +	__u32 count; /* can be 65536 */ +	__u16 latched_count; +	__u8 count_latched; +	__u8 status_latched; +	__u8 status; +	__u8 read_state; +	__u8 write_state; +	__u8 write_latch; +	__u8 rw_mode; +	__u8 mode; +	__u8 bcd; +	__u8 gate; +	__s64 count_load_time; +}; + +struct kvm_debug_exit_arch { +	__u32 exception; +	__u32 pad; +	__u64 pc; +	__u64 dr6; +	__u64 dr7; +}; + +#define KVM_GUESTDBG_USE_SW_BP		0x00010000 +#define KVM_GUESTDBG_USE_HW_BP		0x00020000 +#define KVM_GUESTDBG_INJECT_DB		0x00040000 +#define KVM_GUESTDBG_INJECT_BP		0x00080000 + +/* for KVM_SET_GUEST_DEBUG */ +struct kvm_guest_debug_arch { +	__u64 debugreg[8]; +}; + +struct kvm_pit_state { +	struct kvm_pit_channel_state channels[3]; +}; + +#define KVM_PIT_FLAGS_HPET_LEGACY  0x00000001 + +struct kvm_pit_state2 { +	struct kvm_pit_channel_state channels[3]; +	__u32 flags; +	__u32 reserved[9]; +}; + +struct kvm_reinject_control { +	__u8 pit_reinject; +	__u8 reserved[31]; +}; + +/* When set in flags, include corresponding fields on KVM_SET_VCPU_EVENTS */ +#define KVM_VCPUEVENT_VALID_NMI_PENDING	0x00000001 +#define KVM_VCPUEVENT_VALID_SIPI_VECTOR	0x00000002 +#define KVM_VCPUEVENT_VALID_SHADOW	0x00000004 +#define KVM_VCPUEVENT_VALID_SMM		0x00000008 + +/* Interrupt shadow states */ +#define KVM_X86_SHADOW_INT_MOV_SS	0x01 +#define KVM_X86_SHADOW_INT_STI		0x02 + +/* for KVM_GET/SET_VCPU_EVENTS */ +struct kvm_vcpu_events { +	struct { +		__u8 injected; +		__u8 nr; +		__u8 has_error_code; +		__u8 pad; +		__u32 error_code; +	} exception; +	struct { +		__u8 injected; +		__u8 nr; +		__u8 soft; +		__u8 shadow; +	} interrupt; +	struct { +		__u8 injected; +		__u8 pending; +		__u8 masked; +		__u8 pad; +	} nmi; +	__u32 sipi_vector; +	__u32 flags; +	struct { +		__u8 smm; +		__u8 pending; +		__u8 smm_inside_nmi; +		__u8 latched_init; +	} smi; +	__u32 reserved[9]; +}; + +/* for KVM_GET/SET_DEBUGREGS */ +struct kvm_debugregs { +	__u64 db[4]; +	__u64 dr6; +	__u64 dr7; +	__u64 flags; +	__u64 reserved[9]; +}; + +/* for KVM_CAP_XSAVE */ +struct kvm_xsave { +	__u32 region[1024]; +}; + +#define KVM_MAX_XCRS	16 + +struct kvm_xcr { +	__u32 xcr; +	__u32 reserved; +	__u64 value; +}; + +struct kvm_xcrs { +	__u32 nr_xcrs; +	__u32 flags; +	struct kvm_xcr xcrs[KVM_MAX_XCRS]; +	__u64 padding[16]; +}; + +/* definition of registers in kvm_run */ +struct kvm_sync_regs { +}; + +#define KVM_QUIRK_LINT0_REENABLED	(1 << 0) +#define KVM_QUIRK_CD_NW_CLEARED		(1 << 1) + +#endif /* _ASM_X86_KVM_H */ diff --git a/linux-headers/asm-x86/kvm_para.h b/linux-headers/asm-x86/kvm_para.h new file mode 100644 index 00000000..e41c5c1a --- /dev/null +++ b/linux-headers/asm-x86/kvm_para.h @@ -0,0 +1,101 @@ +#ifndef _ASM_X86_KVM_PARA_H +#define _ASM_X86_KVM_PARA_H + +#include <linux/types.h> +#include <asm/hyperv.h> + +/* This CPUID returns the signature 'KVMKVMKVM' in ebx, ecx, and edx.  It + * should be used to determine that a VM is running under KVM. + */ +#define KVM_CPUID_SIGNATURE	0x40000000 + +/* This CPUID returns a feature bitmap in eax.  Before enabling a particular + * paravirtualization, the appropriate feature bit should be checked. + */ +#define KVM_CPUID_FEATURES	0x40000001 +#define KVM_FEATURE_CLOCKSOURCE		0 +#define KVM_FEATURE_NOP_IO_DELAY	1 +#define KVM_FEATURE_MMU_OP		2 +/* This indicates that the new set of kvmclock msrs + * are available. The use of 0x11 and 0x12 is deprecated + */ +#define KVM_FEATURE_CLOCKSOURCE2        3 +#define KVM_FEATURE_ASYNC_PF		4 +#define KVM_FEATURE_STEAL_TIME		5 +#define KVM_FEATURE_PV_EOI		6 +#define KVM_FEATURE_PV_UNHALT		7 + +/* The last 8 bits are used to indicate how to interpret the flags field + * in pvclock structure. If no bits are set, all flags are ignored. + */ +#define KVM_FEATURE_CLOCKSOURCE_STABLE_BIT	24 + +#define MSR_KVM_WALL_CLOCK  0x11 +#define MSR_KVM_SYSTEM_TIME 0x12 + +#define KVM_MSR_ENABLED 1 +/* Custom MSRs falls in the range 0x4b564d00-0x4b564dff */ +#define MSR_KVM_WALL_CLOCK_NEW  0x4b564d00 +#define MSR_KVM_SYSTEM_TIME_NEW 0x4b564d01 +#define MSR_KVM_ASYNC_PF_EN 0x4b564d02 +#define MSR_KVM_STEAL_TIME  0x4b564d03 +#define MSR_KVM_PV_EOI_EN      0x4b564d04 + +struct kvm_steal_time { +	__u64 steal; +	__u32 version; +	__u32 flags; +	__u32 pad[12]; +}; + +#define KVM_STEAL_ALIGNMENT_BITS 5 +#define KVM_STEAL_VALID_BITS ((-1ULL << (KVM_STEAL_ALIGNMENT_BITS + 1))) +#define KVM_STEAL_RESERVED_MASK (((1 << KVM_STEAL_ALIGNMENT_BITS) - 1 ) << 1) + +#define KVM_MAX_MMU_OP_BATCH           32 + +#define KVM_ASYNC_PF_ENABLED			(1 << 0) +#define KVM_ASYNC_PF_SEND_ALWAYS		(1 << 1) + +/* Operations for KVM_HC_MMU_OP */ +#define KVM_MMU_OP_WRITE_PTE            1 +#define KVM_MMU_OP_FLUSH_TLB	        2 +#define KVM_MMU_OP_RELEASE_PT	        3 + +/* Payload for KVM_HC_MMU_OP */ +struct kvm_mmu_op_header { +	__u32 op; +	__u32 pad; +}; + +struct kvm_mmu_op_write_pte { +	struct kvm_mmu_op_header header; +	__u64 pte_phys; +	__u64 pte_val; +}; + +struct kvm_mmu_op_flush_tlb { +	struct kvm_mmu_op_header header; +}; + +struct kvm_mmu_op_release_pt { +	struct kvm_mmu_op_header header; +	__u64 pt_phys; +}; + +#define KVM_PV_REASON_PAGE_NOT_PRESENT 1 +#define KVM_PV_REASON_PAGE_READY 2 + +struct kvm_vcpu_pv_apf_data { +	__u32 reason; +	__u8 pad[60]; +	__u32 enabled; +}; + +#define KVM_PV_EOI_BIT 0 +#define KVM_PV_EOI_MASK (0x1 << KVM_PV_EOI_BIT) +#define KVM_PV_EOI_ENABLED KVM_PV_EOI_MASK +#define KVM_PV_EOI_DISABLED 0x0 + + +#endif /* _ASM_X86_KVM_PARA_H */ diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h new file mode 100644 index 00000000..3bac8736 --- /dev/null +++ b/linux-headers/linux/kvm.h @@ -0,0 +1,1258 @@ +#ifndef __LINUX_KVM_H +#define __LINUX_KVM_H + +/* + * Userspace interface for /dev/kvm - kernel based virtual machine + * + * Note: you must update KVM_API_VERSION if you change this interface. + */ + +#include <linux/types.h> + +#include <linux/ioctl.h> +#include <asm/kvm.h> + +#define KVM_API_VERSION 12 + +/* *** Deprecated interfaces *** */ + +#define KVM_TRC_SHIFT           16 + +#define KVM_TRC_ENTRYEXIT       (1 << KVM_TRC_SHIFT) +#define KVM_TRC_HANDLER         (1 << (KVM_TRC_SHIFT + 1)) + +#define KVM_TRC_VMENTRY         (KVM_TRC_ENTRYEXIT + 0x01) +#define KVM_TRC_VMEXIT          (KVM_TRC_ENTRYEXIT + 0x02) +#define KVM_TRC_PAGE_FAULT      (KVM_TRC_HANDLER + 0x01) + +#define KVM_TRC_HEAD_SIZE       12 +#define KVM_TRC_CYCLE_SIZE      8 +#define KVM_TRC_EXTRA_MAX       7 + +#define KVM_TRC_INJ_VIRQ         (KVM_TRC_HANDLER + 0x02) +#define KVM_TRC_REDELIVER_EVT    (KVM_TRC_HANDLER + 0x03) +#define KVM_TRC_PEND_INTR        (KVM_TRC_HANDLER + 0x04) +#define KVM_TRC_IO_READ          (KVM_TRC_HANDLER + 0x05) +#define KVM_TRC_IO_WRITE         (KVM_TRC_HANDLER + 0x06) +#define KVM_TRC_CR_READ          (KVM_TRC_HANDLER + 0x07) +#define KVM_TRC_CR_WRITE         (KVM_TRC_HANDLER + 0x08) +#define KVM_TRC_DR_READ          (KVM_TRC_HANDLER + 0x09) +#define KVM_TRC_DR_WRITE         (KVM_TRC_HANDLER + 0x0A) +#define KVM_TRC_MSR_READ         (KVM_TRC_HANDLER + 0x0B) +#define KVM_TRC_MSR_WRITE        (KVM_TRC_HANDLER + 0x0C) +#define KVM_TRC_CPUID            (KVM_TRC_HANDLER + 0x0D) +#define KVM_TRC_INTR             (KVM_TRC_HANDLER + 0x0E) +#define KVM_TRC_NMI              (KVM_TRC_HANDLER + 0x0F) +#define KVM_TRC_VMMCALL          (KVM_TRC_HANDLER + 0x10) +#define KVM_TRC_HLT              (KVM_TRC_HANDLER + 0x11) +#define KVM_TRC_CLTS             (KVM_TRC_HANDLER + 0x12) +#define KVM_TRC_LMSW             (KVM_TRC_HANDLER + 0x13) +#define KVM_TRC_APIC_ACCESS      (KVM_TRC_HANDLER + 0x14) +#define KVM_TRC_TDP_FAULT        (KVM_TRC_HANDLER + 0x15) +#define KVM_TRC_GTLB_WRITE       (KVM_TRC_HANDLER + 0x16) +#define KVM_TRC_STLB_WRITE       (KVM_TRC_HANDLER + 0x17) +#define KVM_TRC_STLB_INVAL       (KVM_TRC_HANDLER + 0x18) +#define KVM_TRC_PPC_INSTR        (KVM_TRC_HANDLER + 0x19) + +struct kvm_user_trace_setup { +	__u32 buf_size; +	__u32 buf_nr; +}; + +#define __KVM_DEPRECATED_MAIN_W_0x06 \ +	_IOW(KVMIO, 0x06, struct kvm_user_trace_setup) +#define __KVM_DEPRECATED_MAIN_0x07 _IO(KVMIO, 0x07) +#define __KVM_DEPRECATED_MAIN_0x08 _IO(KVMIO, 0x08) + +#define __KVM_DEPRECATED_VM_R_0x70 _IOR(KVMIO, 0x70, struct kvm_assigned_irq) + +struct kvm_breakpoint { +	__u32 enabled; +	__u32 padding; +	__u64 address; +}; + +struct kvm_debug_guest { +	__u32 enabled; +	__u32 pad; +	struct kvm_breakpoint breakpoints[4]; +	__u32 singlestep; +}; + +#define __KVM_DEPRECATED_VCPU_W_0x87 _IOW(KVMIO, 0x87, struct kvm_debug_guest) + +/* *** End of deprecated interfaces *** */ + + +/* for KVM_CREATE_MEMORY_REGION */ +struct kvm_memory_region { +	__u32 slot; +	__u32 flags; +	__u64 guest_phys_addr; +	__u64 memory_size; /* bytes */ +}; + +/* for KVM_SET_USER_MEMORY_REGION */ +struct kvm_userspace_memory_region { +	__u32 slot; +	__u32 flags; +	__u64 guest_phys_addr; +	__u64 memory_size; /* bytes */ +	__u64 userspace_addr; /* start of the userspace allocated memory */ +}; + +/* + * The bit 0 ~ bit 15 of kvm_memory_region::flags are visible for userspace, + * other bits are reserved for kvm internal use which are defined in + * include/linux/kvm_host.h. + */ +#define KVM_MEM_LOG_DIRTY_PAGES	(1UL << 0) +#define KVM_MEM_READONLY	(1UL << 1) + +/* for KVM_IRQ_LINE */ +struct kvm_irq_level { +	/* +	 * ACPI gsi notion of irq. +	 * For IA-64 (APIC model) IOAPIC0: irq 0-23; IOAPIC1: irq 24-47.. +	 * For X86 (standard AT mode) PIC0/1: irq 0-15. IOAPIC0: 0-23.. +	 * For ARM: See Documentation/virtual/kvm/api.txt +	 */ +	union { +		__u32 irq; +		__s32 status; +	}; +	__u32 level; +}; + + +struct kvm_irqchip { +	__u32 chip_id; +	__u32 pad; +        union { +		char dummy[512];  /* reserving space */ +#ifdef __KVM_HAVE_PIT +		struct kvm_pic_state pic; +#endif +#ifdef __KVM_HAVE_IOAPIC +		struct kvm_ioapic_state ioapic; +#endif +	} chip; +}; + +/* for KVM_CREATE_PIT2 */ +struct kvm_pit_config { +	__u32 flags; +	__u32 pad[15]; +}; + +#define KVM_PIT_SPEAKER_DUMMY     1 + +struct kvm_s390_skeys { +	__u64 start_gfn; +	__u64 count; +	__u64 skeydata_addr; +	__u32 flags; +	__u32 reserved[9]; +}; +#define KVM_S390_GET_SKEYS_NONE   1 +#define KVM_S390_SKEYS_MAX        1048576 + +#define KVM_EXIT_UNKNOWN          0 +#define KVM_EXIT_EXCEPTION        1 +#define KVM_EXIT_IO               2 +#define KVM_EXIT_HYPERCALL        3 +#define KVM_EXIT_DEBUG            4 +#define KVM_EXIT_HLT              5 +#define KVM_EXIT_MMIO             6 +#define KVM_EXIT_IRQ_WINDOW_OPEN  7 +#define KVM_EXIT_SHUTDOWN         8 +#define KVM_EXIT_FAIL_ENTRY       9 +#define KVM_EXIT_INTR             10 +#define KVM_EXIT_SET_TPR          11 +#define KVM_EXIT_TPR_ACCESS       12 +#define KVM_EXIT_S390_SIEIC       13 +#define KVM_EXIT_S390_RESET       14 +#define KVM_EXIT_DCR              15 /* deprecated */ +#define KVM_EXIT_NMI              16 +#define KVM_EXIT_INTERNAL_ERROR   17 +#define KVM_EXIT_OSI              18 +#define KVM_EXIT_PAPR_HCALL	  19 +#define KVM_EXIT_S390_UCONTROL	  20 +#define KVM_EXIT_WATCHDOG         21 +#define KVM_EXIT_S390_TSCH        22 +#define KVM_EXIT_EPR              23 +#define KVM_EXIT_SYSTEM_EVENT     24 +#define KVM_EXIT_S390_STSI        25 + +/* For KVM_EXIT_INTERNAL_ERROR */ +/* Emulate instruction failed. */ +#define KVM_INTERNAL_ERROR_EMULATION	1 +/* Encounter unexpected simultaneous exceptions. */ +#define KVM_INTERNAL_ERROR_SIMUL_EX	2 +/* Encounter unexpected vm-exit due to delivery event. */ +#define KVM_INTERNAL_ERROR_DELIVERY_EV	3 + +/* for KVM_RUN, returned by mmap(vcpu_fd, offset=0) */ +struct kvm_run { +	/* in */ +	__u8 request_interrupt_window; +	__u8 padding1[7]; + +	/* out */ +	__u32 exit_reason; +	__u8 ready_for_interrupt_injection; +	__u8 if_flag; +	__u16 flags; + +	/* in (pre_kvm_run), out (post_kvm_run) */ +	__u64 cr8; +	__u64 apic_base; + +#ifdef __KVM_S390 +	/* the processor status word for s390 */ +	__u64 psw_mask; /* psw upper half */ +	__u64 psw_addr; /* psw lower half */ +#endif +	union { +		/* KVM_EXIT_UNKNOWN */ +		struct { +			__u64 hardware_exit_reason; +		} hw; +		/* KVM_EXIT_FAIL_ENTRY */ +		struct { +			__u64 hardware_entry_failure_reason; +		} fail_entry; +		/* KVM_EXIT_EXCEPTION */ +		struct { +			__u32 exception; +			__u32 error_code; +		} ex; +		/* KVM_EXIT_IO */ +		struct { +#define KVM_EXIT_IO_IN  0 +#define KVM_EXIT_IO_OUT 1 +			__u8 direction; +			__u8 size; /* bytes */ +			__u16 port; +			__u32 count; +			__u64 data_offset; /* relative to kvm_run start */ +		} io; +		struct { +			struct kvm_debug_exit_arch arch; +		} debug; +		/* KVM_EXIT_MMIO */ +		struct { +			__u64 phys_addr; +			__u8  data[8]; +			__u32 len; +			__u8  is_write; +		} mmio; +		/* KVM_EXIT_HYPERCALL */ +		struct { +			__u64 nr; +			__u64 args[6]; +			__u64 ret; +			__u32 longmode; +			__u32 pad; +		} hypercall; +		/* KVM_EXIT_TPR_ACCESS */ +		struct { +			__u64 rip; +			__u32 is_write; +			__u32 pad; +		} tpr_access; +		/* KVM_EXIT_S390_SIEIC */ +		struct { +			__u8 icptcode; +			__u16 ipa; +			__u32 ipb; +		} s390_sieic; +		/* KVM_EXIT_S390_RESET */ +#define KVM_S390_RESET_POR       1 +#define KVM_S390_RESET_CLEAR     2 +#define KVM_S390_RESET_SUBSYSTEM 4 +#define KVM_S390_RESET_CPU_INIT  8 +#define KVM_S390_RESET_IPL       16 +		__u64 s390_reset_flags; +		/* KVM_EXIT_S390_UCONTROL */ +		struct { +			__u64 trans_exc_code; +			__u32 pgm_code; +		} s390_ucontrol; +		/* KVM_EXIT_DCR (deprecated) */ +		struct { +			__u32 dcrn; +			__u32 data; +			__u8  is_write; +		} dcr; +		struct { +			__u32 suberror; +			/* Available with KVM_CAP_INTERNAL_ERROR_DATA: */ +			__u32 ndata; +			__u64 data[16]; +		} internal; +		/* KVM_EXIT_OSI */ +		struct { +			__u64 gprs[32]; +		} osi; +		struct { +			__u64 nr; +			__u64 ret; +			__u64 args[9]; +		} papr_hcall; +		/* KVM_EXIT_S390_TSCH */ +		struct { +			__u16 subchannel_id; +			__u16 subchannel_nr; +			__u32 io_int_parm; +			__u32 io_int_word; +			__u32 ipb; +			__u8 dequeued; +		} s390_tsch; +		/* KVM_EXIT_EPR */ +		struct { +			__u32 epr; +		} epr; +		/* KVM_EXIT_SYSTEM_EVENT */ +		struct { +#define KVM_SYSTEM_EVENT_SHUTDOWN       1 +#define KVM_SYSTEM_EVENT_RESET          2 +			__u32 type; +			__u64 flags; +		} system_event; +		/* KVM_EXIT_S390_STSI */ +		struct { +			__u64 addr; +			__u8 ar; +			__u8 reserved; +			__u8 fc; +			__u8 sel1; +			__u16 sel2; +		} s390_stsi; +		/* Fix the size of the union. */ +		char padding[256]; +	}; + +	/* +	 * shared registers between kvm and userspace. +	 * kvm_valid_regs specifies the register classes set by the host +	 * kvm_dirty_regs specified the register classes dirtied by userspace +	 * struct kvm_sync_regs is architecture specific, as well as the +	 * bits for kvm_valid_regs and kvm_dirty_regs +	 */ +	__u64 kvm_valid_regs; +	__u64 kvm_dirty_regs; +	union { +		struct kvm_sync_regs regs; +		char padding[2048]; +	} s; +}; + +/* for KVM_REGISTER_COALESCED_MMIO / KVM_UNREGISTER_COALESCED_MMIO */ + +struct kvm_coalesced_mmio_zone { +	__u64 addr; +	__u32 size; +	__u32 pad; +}; + +struct kvm_coalesced_mmio { +	__u64 phys_addr; +	__u32 len; +	__u32 pad; +	__u8  data[8]; +}; + +struct kvm_coalesced_mmio_ring { +	__u32 first, last; +	struct kvm_coalesced_mmio coalesced_mmio[0]; +}; + +#define KVM_COALESCED_MMIO_MAX \ +	((PAGE_SIZE - sizeof(struct kvm_coalesced_mmio_ring)) / \ +	 sizeof(struct kvm_coalesced_mmio)) + +/* for KVM_TRANSLATE */ +struct kvm_translation { +	/* in */ +	__u64 linear_address; + +	/* out */ +	__u64 physical_address; +	__u8  valid; +	__u8  writeable; +	__u8  usermode; +	__u8  pad[5]; +}; + +/* for KVM_S390_MEM_OP */ +struct kvm_s390_mem_op { +	/* in */ +	__u64 gaddr;		/* the guest address */ +	__u64 flags;		/* flags */ +	__u32 size;		/* amount of bytes */ +	__u32 op;		/* type of operation */ +	__u64 buf;		/* buffer in userspace */ +	__u8 ar;		/* the access register number */ +	__u8 reserved[31];	/* should be set to 0 */ +}; +/* types for kvm_s390_mem_op->op */ +#define KVM_S390_MEMOP_LOGICAL_READ	0 +#define KVM_S390_MEMOP_LOGICAL_WRITE	1 +/* flags for kvm_s390_mem_op->flags */ +#define KVM_S390_MEMOP_F_CHECK_ONLY		(1ULL << 0) +#define KVM_S390_MEMOP_F_INJECT_EXCEPTION	(1ULL << 1) + +/* for KVM_INTERRUPT */ +struct kvm_interrupt { +	/* in */ +	__u32 irq; +}; + +/* for KVM_GET_DIRTY_LOG */ +struct kvm_dirty_log { +	__u32 slot; +	__u32 padding1; +	union { +		void *dirty_bitmap; /* one bit per page */ +		__u64 padding2; +	}; +}; + +/* for KVM_SET_SIGNAL_MASK */ +struct kvm_signal_mask { +	__u32 len; +	__u8  sigset[0]; +}; + +/* for KVM_TPR_ACCESS_REPORTING */ +struct kvm_tpr_access_ctl { +	__u32 enabled; +	__u32 flags; +	__u32 reserved[8]; +}; + +/* for KVM_SET_VAPIC_ADDR */ +struct kvm_vapic_addr { +	__u64 vapic_addr; +}; + +/* for KVM_SET_MP_STATE */ + +/* not all states are valid on all architectures */ +#define KVM_MP_STATE_RUNNABLE          0 +#define KVM_MP_STATE_UNINITIALIZED     1 +#define KVM_MP_STATE_INIT_RECEIVED     2 +#define KVM_MP_STATE_HALTED            3 +#define KVM_MP_STATE_SIPI_RECEIVED     4 +#define KVM_MP_STATE_STOPPED           5 +#define KVM_MP_STATE_CHECK_STOP        6 +#define KVM_MP_STATE_OPERATING         7 +#define KVM_MP_STATE_LOAD              8 + +struct kvm_mp_state { +	__u32 mp_state; +}; + +struct kvm_s390_psw { +	__u64 mask; +	__u64 addr; +}; + +/* valid values for type in kvm_s390_interrupt */ +#define KVM_S390_SIGP_STOP		0xfffe0000u +#define KVM_S390_PROGRAM_INT		0xfffe0001u +#define KVM_S390_SIGP_SET_PREFIX	0xfffe0002u +#define KVM_S390_RESTART		0xfffe0003u +#define KVM_S390_INT_PFAULT_INIT	0xfffe0004u +#define KVM_S390_INT_PFAULT_DONE	0xfffe0005u +#define KVM_S390_MCHK			0xfffe1000u +#define KVM_S390_INT_CLOCK_COMP		0xffff1004u +#define KVM_S390_INT_CPU_TIMER		0xffff1005u +#define KVM_S390_INT_VIRTIO		0xffff2603u +#define KVM_S390_INT_SERVICE		0xffff2401u +#define KVM_S390_INT_EMERGENCY		0xffff1201u +#define KVM_S390_INT_EXTERNAL_CALL	0xffff1202u +/* Anything below 0xfffe0000u is taken by INT_IO */ +#define KVM_S390_INT_IO(ai,cssid,ssid,schid)   \ +	(((schid)) |			       \ +	 ((ssid) << 16) |		       \ +	 ((cssid) << 18) |		       \ +	 ((ai) << 26)) +#define KVM_S390_INT_IO_MIN		0x00000000u +#define KVM_S390_INT_IO_MAX		0xfffdffffu + + +struct kvm_s390_interrupt { +	__u32 type; +	__u32 parm; +	__u64 parm64; +}; + +struct kvm_s390_io_info { +	__u16 subchannel_id; +	__u16 subchannel_nr; +	__u32 io_int_parm; +	__u32 io_int_word; +}; + +struct kvm_s390_ext_info { +	__u32 ext_params; +	__u32 pad; +	__u64 ext_params2; +}; + +struct kvm_s390_pgm_info { +	__u64 trans_exc_code; +	__u64 mon_code; +	__u64 per_address; +	__u32 data_exc_code; +	__u16 code; +	__u16 mon_class_nr; +	__u8 per_code; +	__u8 per_atmid; +	__u8 exc_access_id; +	__u8 per_access_id; +	__u8 op_access_id; +	__u8 pad[3]; +}; + +struct kvm_s390_prefix_info { +	__u32 address; +}; + +struct kvm_s390_extcall_info { +	__u16 code; +}; + +struct kvm_s390_emerg_info { +	__u16 code; +}; + +#define KVM_S390_STOP_FLAG_STORE_STATUS	0x01 +struct kvm_s390_stop_info { +	__u32 flags; +}; + +struct kvm_s390_mchk_info { +	__u64 cr14; +	__u64 mcic; +	__u64 failing_storage_address; +	__u32 ext_damage_code; +	__u32 pad; +	__u8 fixed_logout[16]; +}; + +struct kvm_s390_irq { +	__u64 type; +	union { +		struct kvm_s390_io_info io; +		struct kvm_s390_ext_info ext; +		struct kvm_s390_pgm_info pgm; +		struct kvm_s390_emerg_info emerg; +		struct kvm_s390_extcall_info extcall; +		struct kvm_s390_prefix_info prefix; +		struct kvm_s390_stop_info stop; +		struct kvm_s390_mchk_info mchk; +		char reserved[64]; +	} u; +}; + +struct kvm_s390_irq_state { +	__u64 buf; +	__u32 flags; +	__u32 len; +	__u32 reserved[4]; +}; + +/* for KVM_SET_GUEST_DEBUG */ + +#define KVM_GUESTDBG_ENABLE		0x00000001 +#define KVM_GUESTDBG_SINGLESTEP		0x00000002 + +struct kvm_guest_debug { +	__u32 control; +	__u32 pad; +	struct kvm_guest_debug_arch arch; +}; + +enum { +	kvm_ioeventfd_flag_nr_datamatch, +	kvm_ioeventfd_flag_nr_pio, +	kvm_ioeventfd_flag_nr_deassign, +	kvm_ioeventfd_flag_nr_virtio_ccw_notify, +	kvm_ioeventfd_flag_nr_fast_mmio, +	kvm_ioeventfd_flag_nr_max, +}; + +#define KVM_IOEVENTFD_FLAG_DATAMATCH (1 << kvm_ioeventfd_flag_nr_datamatch) +#define KVM_IOEVENTFD_FLAG_PIO       (1 << kvm_ioeventfd_flag_nr_pio) +#define KVM_IOEVENTFD_FLAG_DEASSIGN  (1 << kvm_ioeventfd_flag_nr_deassign) +#define KVM_IOEVENTFD_FLAG_VIRTIO_CCW_NOTIFY \ +	(1 << kvm_ioeventfd_flag_nr_virtio_ccw_notify) + +#define KVM_IOEVENTFD_VALID_FLAG_MASK  ((1 << kvm_ioeventfd_flag_nr_max) - 1) + +struct kvm_ioeventfd { +	__u64 datamatch; +	__u64 addr;        /* legal pio/mmio address */ +	__u32 len;         /* 1, 2, 4, or 8 bytes; or 0 to ignore length */ +	__s32 fd; +	__u32 flags; +	__u8  pad[36]; +}; + +/* for KVM_ENABLE_CAP */ +struct kvm_enable_cap { +	/* in */ +	__u32 cap; +	__u32 flags; +	__u64 args[4]; +	__u8  pad[64]; +}; + +/* for KVM_PPC_GET_PVINFO */ +struct kvm_ppc_pvinfo { +	/* out */ +	__u32 flags; +	__u32 hcall[4]; +	__u8  pad[108]; +}; + +/* for KVM_PPC_GET_SMMU_INFO */ +#define KVM_PPC_PAGE_SIZES_MAX_SZ	8 + +struct kvm_ppc_one_page_size { +	__u32 page_shift;	/* Page shift (or 0) */ +	__u32 pte_enc;		/* Encoding in the HPTE (>>12) */ +}; + +struct kvm_ppc_one_seg_page_size { +	__u32 page_shift;	/* Base page shift of segment (or 0) */ +	__u32 slb_enc;		/* SLB encoding for BookS */ +	struct kvm_ppc_one_page_size enc[KVM_PPC_PAGE_SIZES_MAX_SZ]; +}; + +#define KVM_PPC_PAGE_SIZES_REAL		0x00000001 +#define KVM_PPC_1T_SEGMENTS		0x00000002 + +struct kvm_ppc_smmu_info { +	__u64 flags; +	__u32 slb_size; +	__u32 pad; +	struct kvm_ppc_one_seg_page_size sps[KVM_PPC_PAGE_SIZES_MAX_SZ]; +}; + +#define KVM_PPC_PVINFO_FLAGS_EV_IDLE   (1<<0) + +#define KVMIO 0xAE + +/* machine type bits, to be used as argument to KVM_CREATE_VM */ +#define KVM_VM_S390_UCONTROL	1 + +/* on ppc, 0 indicate default, 1 should force HV and 2 PR */ +#define KVM_VM_PPC_HV 1 +#define KVM_VM_PPC_PR 2 + +#define KVM_S390_SIE_PAGE_OFFSET 1 + +/* + * ioctls for /dev/kvm fds: + */ +#define KVM_GET_API_VERSION       _IO(KVMIO,   0x00) +#define KVM_CREATE_VM             _IO(KVMIO,   0x01) /* returns a VM fd */ +#define KVM_GET_MSR_INDEX_LIST    _IOWR(KVMIO, 0x02, struct kvm_msr_list) + +#define KVM_S390_ENABLE_SIE       _IO(KVMIO,   0x06) +/* + * Check if a kvm extension is available.  Argument is extension number, + * return is 1 (yes) or 0 (no, sorry). + */ +#define KVM_CHECK_EXTENSION       _IO(KVMIO,   0x03) +/* + * Get size for mmap(vcpu_fd) + */ +#define KVM_GET_VCPU_MMAP_SIZE    _IO(KVMIO,   0x04) /* in bytes */ +#define KVM_GET_SUPPORTED_CPUID   _IOWR(KVMIO, 0x05, struct kvm_cpuid2) +#define KVM_TRACE_ENABLE          __KVM_DEPRECATED_MAIN_W_0x06 +#define KVM_TRACE_PAUSE           __KVM_DEPRECATED_MAIN_0x07 +#define KVM_TRACE_DISABLE         __KVM_DEPRECATED_MAIN_0x08 +#define KVM_GET_EMULATED_CPUID	  _IOWR(KVMIO, 0x09, struct kvm_cpuid2) + +/* + * Extension capability list. + */ +#define KVM_CAP_IRQCHIP	  0 +#define KVM_CAP_HLT	  1 +#define KVM_CAP_MMU_SHADOW_CACHE_CONTROL 2 +#define KVM_CAP_USER_MEMORY 3 +#define KVM_CAP_SET_TSS_ADDR 4 +#define KVM_CAP_VAPIC 6 +#define KVM_CAP_EXT_CPUID 7 +#define KVM_CAP_CLOCKSOURCE 8 +#define KVM_CAP_NR_VCPUS 9       /* returns recommended max vcpus per vm */ +#define KVM_CAP_NR_MEMSLOTS 10   /* returns max memory slots per vm */ +#define KVM_CAP_PIT 11 +#define KVM_CAP_NOP_IO_DELAY 12 +#define KVM_CAP_PV_MMU 13 +#define KVM_CAP_MP_STATE 14 +#define KVM_CAP_COALESCED_MMIO 15 +#define KVM_CAP_SYNC_MMU 16  /* Changes to host mmap are reflected in guest */ +#define KVM_CAP_IOMMU 18 +/* Bug in KVM_SET_USER_MEMORY_REGION fixed: */ +#define KVM_CAP_DESTROY_MEMORY_REGION_WORKS 21 +#define KVM_CAP_USER_NMI 22 +#ifdef __KVM_HAVE_GUEST_DEBUG +#define KVM_CAP_SET_GUEST_DEBUG 23 +#endif +#ifdef __KVM_HAVE_PIT +#define KVM_CAP_REINJECT_CONTROL 24 +#endif +#define KVM_CAP_IRQ_ROUTING 25 +#define KVM_CAP_IRQ_INJECT_STATUS 26 +#define KVM_CAP_ASSIGN_DEV_IRQ 29 +/* Another bug in KVM_SET_USER_MEMORY_REGION fixed: */ +#define KVM_CAP_JOIN_MEMORY_REGIONS_WORKS 30 +#ifdef __KVM_HAVE_MCE +#define KVM_CAP_MCE 31 +#endif +#define KVM_CAP_IRQFD 32 +#ifdef __KVM_HAVE_PIT +#define KVM_CAP_PIT2 33 +#endif +#define KVM_CAP_SET_BOOT_CPU_ID 34 +#ifdef __KVM_HAVE_PIT_STATE2 +#define KVM_CAP_PIT_STATE2 35 +#endif +#define KVM_CAP_IOEVENTFD 36 +#define KVM_CAP_SET_IDENTITY_MAP_ADDR 37 +#ifdef __KVM_HAVE_XEN_HVM +#define KVM_CAP_XEN_HVM 38 +#endif +#define KVM_CAP_ADJUST_CLOCK 39 +#define KVM_CAP_INTERNAL_ERROR_DATA 40 +#ifdef __KVM_HAVE_VCPU_EVENTS +#define KVM_CAP_VCPU_EVENTS 41 +#endif +#define KVM_CAP_S390_PSW 42 +#define KVM_CAP_PPC_SEGSTATE 43 +#define KVM_CAP_HYPERV 44 +#define KVM_CAP_HYPERV_VAPIC 45 +#define KVM_CAP_HYPERV_SPIN 46 +#define KVM_CAP_PCI_SEGMENT 47 +#define KVM_CAP_PPC_PAIRED_SINGLES 48 +#define KVM_CAP_INTR_SHADOW 49 +#ifdef __KVM_HAVE_DEBUGREGS +#define KVM_CAP_DEBUGREGS 50 +#endif +#define KVM_CAP_X86_ROBUST_SINGLESTEP 51 +#define KVM_CAP_PPC_OSI 52 +#define KVM_CAP_PPC_UNSET_IRQ 53 +#define KVM_CAP_ENABLE_CAP 54 +#ifdef __KVM_HAVE_XSAVE +#define KVM_CAP_XSAVE 55 +#endif +#ifdef __KVM_HAVE_XCRS +#define KVM_CAP_XCRS 56 +#endif +#define KVM_CAP_PPC_GET_PVINFO 57 +#define KVM_CAP_PPC_IRQ_LEVEL 58 +#define KVM_CAP_ASYNC_PF 59 +#define KVM_CAP_TSC_CONTROL 60 +#define KVM_CAP_GET_TSC_KHZ 61 +#define KVM_CAP_PPC_BOOKE_SREGS 62 +#define KVM_CAP_SPAPR_TCE 63 +#define KVM_CAP_PPC_SMT 64 +#define KVM_CAP_PPC_RMA	65 +#define KVM_CAP_MAX_VCPUS 66       /* returns max vcpus per vm */ +#define KVM_CAP_PPC_HIOR 67 +#define KVM_CAP_PPC_PAPR 68 +#define KVM_CAP_SW_TLB 69 +#define KVM_CAP_ONE_REG 70 +#define KVM_CAP_S390_GMAP 71 +#define KVM_CAP_TSC_DEADLINE_TIMER 72 +#define KVM_CAP_S390_UCONTROL 73 +#define KVM_CAP_SYNC_REGS 74 +#define KVM_CAP_PCI_2_3 75 +#define KVM_CAP_KVMCLOCK_CTRL 76 +#define KVM_CAP_SIGNAL_MSI 77 +#define KVM_CAP_PPC_GET_SMMU_INFO 78 +#define KVM_CAP_S390_COW 79 +#define KVM_CAP_PPC_ALLOC_HTAB 80 +#define KVM_CAP_READONLY_MEM 81 +#define KVM_CAP_IRQFD_RESAMPLE 82 +#define KVM_CAP_PPC_BOOKE_WATCHDOG 83 +#define KVM_CAP_PPC_HTAB_FD 84 +#define KVM_CAP_S390_CSS_SUPPORT 85 +#define KVM_CAP_PPC_EPR 86 +#define KVM_CAP_ARM_PSCI 87 +#define KVM_CAP_ARM_SET_DEVICE_ADDR 88 +#define KVM_CAP_DEVICE_CTRL 89 +#define KVM_CAP_IRQ_MPIC 90 +#define KVM_CAP_PPC_RTAS 91 +#define KVM_CAP_IRQ_XICS 92 +#define KVM_CAP_ARM_EL1_32BIT 93 +#define KVM_CAP_SPAPR_MULTITCE 94 +#define KVM_CAP_EXT_EMUL_CPUID 95 +#define KVM_CAP_HYPERV_TIME 96 +#define KVM_CAP_IOAPIC_POLARITY_IGNORED 97 +#define KVM_CAP_ENABLE_CAP_VM 98 +#define KVM_CAP_S390_IRQCHIP 99 +#define KVM_CAP_IOEVENTFD_NO_LENGTH 100 +#define KVM_CAP_VM_ATTRIBUTES 101 +#define KVM_CAP_ARM_PSCI_0_2 102 +#define KVM_CAP_PPC_FIXUP_HCALL 103 +#define KVM_CAP_PPC_ENABLE_HCALL 104 +#define KVM_CAP_CHECK_EXTENSION_VM 105 +#define KVM_CAP_S390_USER_SIGP 106 +#define KVM_CAP_S390_VECTOR_REGISTERS 107 +#define KVM_CAP_S390_MEM_OP 108 +#define KVM_CAP_S390_USER_STSI 109 +#define KVM_CAP_S390_SKEYS 110 +#define KVM_CAP_MIPS_FPU 111 +#define KVM_CAP_MIPS_MSA 112 +#define KVM_CAP_S390_INJECT_IRQ 113 +#define KVM_CAP_S390_IRQ_STATE 114 +#define KVM_CAP_PPC_HWRNG 115 +#define KVM_CAP_DISABLE_QUIRKS 116 +#define KVM_CAP_X86_SMM 117 +#define KVM_CAP_MULTI_ADDRESS_SPACE 118 + +#ifdef KVM_CAP_IRQ_ROUTING + +struct kvm_irq_routing_irqchip { +	__u32 irqchip; +	__u32 pin; +}; + +struct kvm_irq_routing_msi { +	__u32 address_lo; +	__u32 address_hi; +	__u32 data; +	__u32 pad; +}; + +struct kvm_irq_routing_s390_adapter { +	__u64 ind_addr; +	__u64 summary_addr; +	__u64 ind_offset; +	__u32 summary_offset; +	__u32 adapter_id; +}; + +/* gsi routing entry types */ +#define KVM_IRQ_ROUTING_IRQCHIP 1 +#define KVM_IRQ_ROUTING_MSI 2 +#define KVM_IRQ_ROUTING_S390_ADAPTER 3 + +struct kvm_irq_routing_entry { +	__u32 gsi; +	__u32 type; +	__u32 flags; +	__u32 pad; +	union { +		struct kvm_irq_routing_irqchip irqchip; +		struct kvm_irq_routing_msi msi; +		struct kvm_irq_routing_s390_adapter adapter; +		__u32 pad[8]; +	} u; +}; + +struct kvm_irq_routing { +	__u32 nr; +	__u32 flags; +	struct kvm_irq_routing_entry entries[0]; +}; + +#endif + +#ifdef KVM_CAP_MCE +/* x86 MCE */ +struct kvm_x86_mce { +	__u64 status; +	__u64 addr; +	__u64 misc; +	__u64 mcg_status; +	__u8 bank; +	__u8 pad1[7]; +	__u64 pad2[3]; +}; +#endif + +#ifdef KVM_CAP_XEN_HVM +struct kvm_xen_hvm_config { +	__u32 flags; +	__u32 msr; +	__u64 blob_addr_32; +	__u64 blob_addr_64; +	__u8 blob_size_32; +	__u8 blob_size_64; +	__u8 pad2[30]; +}; +#endif + +#define KVM_IRQFD_FLAG_DEASSIGN (1 << 0) +/* + * Available with KVM_CAP_IRQFD_RESAMPLE + * + * KVM_IRQFD_FLAG_RESAMPLE indicates resamplefd is valid and specifies + * the irqfd to operate in resampling mode for level triggered interrupt + * emulation.  See Documentation/virtual/kvm/api.txt. + */ +#define KVM_IRQFD_FLAG_RESAMPLE (1 << 1) + +struct kvm_irqfd { +	__u32 fd; +	__u32 gsi; +	__u32 flags; +	__u32 resamplefd; +	__u8  pad[16]; +}; + +struct kvm_clock_data { +	__u64 clock; +	__u32 flags; +	__u32 pad[9]; +}; + +#define KVM_MMU_FSL_BOOKE_NOHV		0 +#define KVM_MMU_FSL_BOOKE_HV		1 + +struct kvm_config_tlb { +	__u64 params; +	__u64 array; +	__u32 mmu_type; +	__u32 array_len; +}; + +struct kvm_dirty_tlb { +	__u64 bitmap; +	__u32 num_dirty; +}; + +/* Available with KVM_CAP_ONE_REG */ + +#define KVM_REG_ARCH_MASK	0xff00000000000000ULL +#define KVM_REG_GENERIC		0x0000000000000000ULL + +/* + * Architecture specific registers are to be defined in arch headers and + * ORed with the arch identifier. + */ +#define KVM_REG_PPC		0x1000000000000000ULL +#define KVM_REG_X86		0x2000000000000000ULL +#define KVM_REG_IA64		0x3000000000000000ULL +#define KVM_REG_ARM		0x4000000000000000ULL +#define KVM_REG_S390		0x5000000000000000ULL +#define KVM_REG_ARM64		0x6000000000000000ULL +#define KVM_REG_MIPS		0x7000000000000000ULL + +#define KVM_REG_SIZE_SHIFT	52 +#define KVM_REG_SIZE_MASK	0x00f0000000000000ULL +#define KVM_REG_SIZE_U8		0x0000000000000000ULL +#define KVM_REG_SIZE_U16	0x0010000000000000ULL +#define KVM_REG_SIZE_U32	0x0020000000000000ULL +#define KVM_REG_SIZE_U64	0x0030000000000000ULL +#define KVM_REG_SIZE_U128	0x0040000000000000ULL +#define KVM_REG_SIZE_U256	0x0050000000000000ULL +#define KVM_REG_SIZE_U512	0x0060000000000000ULL +#define KVM_REG_SIZE_U1024	0x0070000000000000ULL + +struct kvm_reg_list { +	__u64 n; /* number of regs */ +	__u64 reg[0]; +}; + +struct kvm_one_reg { +	__u64 id; +	__u64 addr; +}; + +struct kvm_msi { +	__u32 address_lo; +	__u32 address_hi; +	__u32 data; +	__u32 flags; +	__u8  pad[16]; +}; + +struct kvm_arm_device_addr { +	__u64 id; +	__u64 addr; +}; + +/* + * Device control API, available with KVM_CAP_DEVICE_CTRL + */ +#define KVM_CREATE_DEVICE_TEST		1 + +struct kvm_create_device { +	__u32	type;	/* in: KVM_DEV_TYPE_xxx */ +	__u32	fd;	/* out: device handle */ +	__u32	flags;	/* in: KVM_CREATE_DEVICE_xxx */ +}; + +struct kvm_device_attr { +	__u32	flags;		/* no flags currently defined */ +	__u32	group;		/* device-defined */ +	__u64	attr;		/* group-defined */ +	__u64	addr;		/* userspace address of attr data */ +}; + +#define  KVM_DEV_VFIO_GROUP			1 +#define   KVM_DEV_VFIO_GROUP_ADD			1 +#define   KVM_DEV_VFIO_GROUP_DEL			2 + +enum kvm_device_type { +	KVM_DEV_TYPE_FSL_MPIC_20	= 1, +#define KVM_DEV_TYPE_FSL_MPIC_20	KVM_DEV_TYPE_FSL_MPIC_20 +	KVM_DEV_TYPE_FSL_MPIC_42, +#define KVM_DEV_TYPE_FSL_MPIC_42	KVM_DEV_TYPE_FSL_MPIC_42 +	KVM_DEV_TYPE_XICS, +#define KVM_DEV_TYPE_XICS		KVM_DEV_TYPE_XICS +	KVM_DEV_TYPE_VFIO, +#define KVM_DEV_TYPE_VFIO		KVM_DEV_TYPE_VFIO +	KVM_DEV_TYPE_ARM_VGIC_V2, +#define KVM_DEV_TYPE_ARM_VGIC_V2	KVM_DEV_TYPE_ARM_VGIC_V2 +	KVM_DEV_TYPE_FLIC, +#define KVM_DEV_TYPE_FLIC		KVM_DEV_TYPE_FLIC +	KVM_DEV_TYPE_ARM_VGIC_V3, +#define KVM_DEV_TYPE_ARM_VGIC_V3	KVM_DEV_TYPE_ARM_VGIC_V3 +	KVM_DEV_TYPE_MAX, +}; + +/* + * ioctls for VM fds + */ +#define KVM_SET_MEMORY_REGION     _IOW(KVMIO,  0x40, struct kvm_memory_region) +/* + * KVM_CREATE_VCPU receives as a parameter the vcpu slot, and returns + * a vcpu fd. + */ +#define KVM_CREATE_VCPU           _IO(KVMIO,   0x41) +#define KVM_GET_DIRTY_LOG         _IOW(KVMIO,  0x42, struct kvm_dirty_log) +/* KVM_SET_MEMORY_ALIAS is obsolete: */ +#define KVM_SET_MEMORY_ALIAS      _IOW(KVMIO,  0x43, struct kvm_memory_alias) +#define KVM_SET_NR_MMU_PAGES      _IO(KVMIO,   0x44) +#define KVM_GET_NR_MMU_PAGES      _IO(KVMIO,   0x45) +#define KVM_SET_USER_MEMORY_REGION _IOW(KVMIO, 0x46, \ +					struct kvm_userspace_memory_region) +#define KVM_SET_TSS_ADDR          _IO(KVMIO,   0x47) +#define KVM_SET_IDENTITY_MAP_ADDR _IOW(KVMIO,  0x48, __u64) + +/* enable ucontrol for s390 */ +struct kvm_s390_ucas_mapping { +	__u64 user_addr; +	__u64 vcpu_addr; +	__u64 length; +}; +#define KVM_S390_UCAS_MAP        _IOW(KVMIO, 0x50, struct kvm_s390_ucas_mapping) +#define KVM_S390_UCAS_UNMAP      _IOW(KVMIO, 0x51, struct kvm_s390_ucas_mapping) +#define KVM_S390_VCPU_FAULT	 _IOW(KVMIO, 0x52, unsigned long) + +/* Device model IOC */ +#define KVM_CREATE_IRQCHIP        _IO(KVMIO,   0x60) +#define KVM_IRQ_LINE              _IOW(KVMIO,  0x61, struct kvm_irq_level) +#define KVM_GET_IRQCHIP           _IOWR(KVMIO, 0x62, struct kvm_irqchip) +#define KVM_SET_IRQCHIP           _IOR(KVMIO,  0x63, struct kvm_irqchip) +#define KVM_CREATE_PIT            _IO(KVMIO,   0x64) +#define KVM_GET_PIT               _IOWR(KVMIO, 0x65, struct kvm_pit_state) +#define KVM_SET_PIT               _IOR(KVMIO,  0x66, struct kvm_pit_state) +#define KVM_IRQ_LINE_STATUS       _IOWR(KVMIO, 0x67, struct kvm_irq_level) +#define KVM_REGISTER_COALESCED_MMIO \ +			_IOW(KVMIO,  0x67, struct kvm_coalesced_mmio_zone) +#define KVM_UNREGISTER_COALESCED_MMIO \ +			_IOW(KVMIO,  0x68, struct kvm_coalesced_mmio_zone) +#define KVM_ASSIGN_PCI_DEVICE     _IOR(KVMIO,  0x69, \ +				       struct kvm_assigned_pci_dev) +#define KVM_SET_GSI_ROUTING       _IOW(KVMIO,  0x6a, struct kvm_irq_routing) +/* deprecated, replaced by KVM_ASSIGN_DEV_IRQ */ +#define KVM_ASSIGN_IRQ            __KVM_DEPRECATED_VM_R_0x70 +#define KVM_ASSIGN_DEV_IRQ        _IOW(KVMIO,  0x70, struct kvm_assigned_irq) +#define KVM_REINJECT_CONTROL      _IO(KVMIO,   0x71) +#define KVM_DEASSIGN_PCI_DEVICE   _IOW(KVMIO,  0x72, \ +				       struct kvm_assigned_pci_dev) +#define KVM_ASSIGN_SET_MSIX_NR    _IOW(KVMIO,  0x73, \ +				       struct kvm_assigned_msix_nr) +#define KVM_ASSIGN_SET_MSIX_ENTRY _IOW(KVMIO,  0x74, \ +				       struct kvm_assigned_msix_entry) +#define KVM_DEASSIGN_DEV_IRQ      _IOW(KVMIO,  0x75, struct kvm_assigned_irq) +#define KVM_IRQFD                 _IOW(KVMIO,  0x76, struct kvm_irqfd) +#define KVM_CREATE_PIT2		  _IOW(KVMIO,  0x77, struct kvm_pit_config) +#define KVM_SET_BOOT_CPU_ID       _IO(KVMIO,   0x78) +#define KVM_IOEVENTFD             _IOW(KVMIO,  0x79, struct kvm_ioeventfd) +#define KVM_XEN_HVM_CONFIG        _IOW(KVMIO,  0x7a, struct kvm_xen_hvm_config) +#define KVM_SET_CLOCK             _IOW(KVMIO,  0x7b, struct kvm_clock_data) +#define KVM_GET_CLOCK             _IOR(KVMIO,  0x7c, struct kvm_clock_data) +/* Available with KVM_CAP_PIT_STATE2 */ +#define KVM_GET_PIT2              _IOR(KVMIO,  0x9f, struct kvm_pit_state2) +#define KVM_SET_PIT2              _IOW(KVMIO,  0xa0, struct kvm_pit_state2) +/* Available with KVM_CAP_PPC_GET_PVINFO */ +#define KVM_PPC_GET_PVINFO	  _IOW(KVMIO,  0xa1, struct kvm_ppc_pvinfo) +/* Available with KVM_CAP_TSC_CONTROL */ +#define KVM_SET_TSC_KHZ           _IO(KVMIO,  0xa2) +#define KVM_GET_TSC_KHZ           _IO(KVMIO,  0xa3) +/* Available with KVM_CAP_PCI_2_3 */ +#define KVM_ASSIGN_SET_INTX_MASK  _IOW(KVMIO,  0xa4, \ +				       struct kvm_assigned_pci_dev) +/* Available with KVM_CAP_SIGNAL_MSI */ +#define KVM_SIGNAL_MSI            _IOW(KVMIO,  0xa5, struct kvm_msi) +/* Available with KVM_CAP_PPC_GET_SMMU_INFO */ +#define KVM_PPC_GET_SMMU_INFO	  _IOR(KVMIO,  0xa6, struct kvm_ppc_smmu_info) +/* Available with KVM_CAP_PPC_ALLOC_HTAB */ +#define KVM_PPC_ALLOCATE_HTAB	  _IOWR(KVMIO, 0xa7, __u32) +#define KVM_CREATE_SPAPR_TCE	  _IOW(KVMIO,  0xa8, struct kvm_create_spapr_tce) +/* Available with KVM_CAP_RMA */ +#define KVM_ALLOCATE_RMA	  _IOR(KVMIO,  0xa9, struct kvm_allocate_rma) +/* Available with KVM_CAP_PPC_HTAB_FD */ +#define KVM_PPC_GET_HTAB_FD	  _IOW(KVMIO,  0xaa, struct kvm_get_htab_fd) +/* Available with KVM_CAP_ARM_SET_DEVICE_ADDR */ +#define KVM_ARM_SET_DEVICE_ADDR	  _IOW(KVMIO,  0xab, struct kvm_arm_device_addr) +/* Available with KVM_CAP_PPC_RTAS */ +#define KVM_PPC_RTAS_DEFINE_TOKEN _IOW(KVMIO,  0xac, struct kvm_rtas_token_args) + +/* ioctl for vm fd */ +#define KVM_CREATE_DEVICE	  _IOWR(KVMIO,  0xe0, struct kvm_create_device) + +/* ioctls for fds returned by KVM_CREATE_DEVICE */ +#define KVM_SET_DEVICE_ATTR	  _IOW(KVMIO,  0xe1, struct kvm_device_attr) +#define KVM_GET_DEVICE_ATTR	  _IOW(KVMIO,  0xe2, struct kvm_device_attr) +#define KVM_HAS_DEVICE_ATTR	  _IOW(KVMIO,  0xe3, struct kvm_device_attr) + +/* + * ioctls for vcpu fds + */ +#define KVM_RUN                   _IO(KVMIO,   0x80) +#define KVM_GET_REGS              _IOR(KVMIO,  0x81, struct kvm_regs) +#define KVM_SET_REGS              _IOW(KVMIO,  0x82, struct kvm_regs) +#define KVM_GET_SREGS             _IOR(KVMIO,  0x83, struct kvm_sregs) +#define KVM_SET_SREGS             _IOW(KVMIO,  0x84, struct kvm_sregs) +#define KVM_TRANSLATE             _IOWR(KVMIO, 0x85, struct kvm_translation) +#define KVM_INTERRUPT             _IOW(KVMIO,  0x86, struct kvm_interrupt) +/* KVM_DEBUG_GUEST is no longer supported, use KVM_SET_GUEST_DEBUG instead */ +#define KVM_DEBUG_GUEST           __KVM_DEPRECATED_VCPU_W_0x87 +#define KVM_GET_MSRS              _IOWR(KVMIO, 0x88, struct kvm_msrs) +#define KVM_SET_MSRS              _IOW(KVMIO,  0x89, struct kvm_msrs) +#define KVM_SET_CPUID             _IOW(KVMIO,  0x8a, struct kvm_cpuid) +#define KVM_SET_SIGNAL_MASK       _IOW(KVMIO,  0x8b, struct kvm_signal_mask) +#define KVM_GET_FPU               _IOR(KVMIO,  0x8c, struct kvm_fpu) +#define KVM_SET_FPU               _IOW(KVMIO,  0x8d, struct kvm_fpu) +#define KVM_GET_LAPIC             _IOR(KVMIO,  0x8e, struct kvm_lapic_state) +#define KVM_SET_LAPIC             _IOW(KVMIO,  0x8f, struct kvm_lapic_state) +#define KVM_SET_CPUID2            _IOW(KVMIO,  0x90, struct kvm_cpuid2) +#define KVM_GET_CPUID2            _IOWR(KVMIO, 0x91, struct kvm_cpuid2) +/* Available with KVM_CAP_VAPIC */ +#define KVM_TPR_ACCESS_REPORTING  _IOWR(KVMIO, 0x92, struct kvm_tpr_access_ctl) +/* Available with KVM_CAP_VAPIC */ +#define KVM_SET_VAPIC_ADDR        _IOW(KVMIO,  0x93, struct kvm_vapic_addr) +/* valid for virtual machine (for floating interrupt)_and_ vcpu */ +#define KVM_S390_INTERRUPT        _IOW(KVMIO,  0x94, struct kvm_s390_interrupt) +/* store status for s390 */ +#define KVM_S390_STORE_STATUS_NOADDR    (-1ul) +#define KVM_S390_STORE_STATUS_PREFIXED  (-2ul) +#define KVM_S390_STORE_STATUS	  _IOW(KVMIO,  0x95, unsigned long) +/* initial ipl psw for s390 */ +#define KVM_S390_SET_INITIAL_PSW  _IOW(KVMIO,  0x96, struct kvm_s390_psw) +/* initial reset for s390 */ +#define KVM_S390_INITIAL_RESET    _IO(KVMIO,   0x97) +#define KVM_GET_MP_STATE          _IOR(KVMIO,  0x98, struct kvm_mp_state) +#define KVM_SET_MP_STATE          _IOW(KVMIO,  0x99, struct kvm_mp_state) +/* Available with KVM_CAP_USER_NMI */ +#define KVM_NMI                   _IO(KVMIO,   0x9a) +/* Available with KVM_CAP_SET_GUEST_DEBUG */ +#define KVM_SET_GUEST_DEBUG       _IOW(KVMIO,  0x9b, struct kvm_guest_debug) +/* MCE for x86 */ +#define KVM_X86_SETUP_MCE         _IOW(KVMIO,  0x9c, __u64) +#define KVM_X86_GET_MCE_CAP_SUPPORTED _IOR(KVMIO,  0x9d, __u64) +#define KVM_X86_SET_MCE           _IOW(KVMIO,  0x9e, struct kvm_x86_mce) +/* Available with KVM_CAP_VCPU_EVENTS */ +#define KVM_GET_VCPU_EVENTS       _IOR(KVMIO,  0x9f, struct kvm_vcpu_events) +#define KVM_SET_VCPU_EVENTS       _IOW(KVMIO,  0xa0, struct kvm_vcpu_events) +/* Available with KVM_CAP_DEBUGREGS */ +#define KVM_GET_DEBUGREGS         _IOR(KVMIO,  0xa1, struct kvm_debugregs) +#define KVM_SET_DEBUGREGS         _IOW(KVMIO,  0xa2, struct kvm_debugregs) +/* + * vcpu version available with KVM_ENABLE_CAP + * vm version available with KVM_CAP_ENABLE_CAP_VM + */ +#define KVM_ENABLE_CAP            _IOW(KVMIO,  0xa3, struct kvm_enable_cap) +/* Available with KVM_CAP_XSAVE */ +#define KVM_GET_XSAVE		  _IOR(KVMIO,  0xa4, struct kvm_xsave) +#define KVM_SET_XSAVE		  _IOW(KVMIO,  0xa5, struct kvm_xsave) +/* Available with KVM_CAP_XCRS */ +#define KVM_GET_XCRS		  _IOR(KVMIO,  0xa6, struct kvm_xcrs) +#define KVM_SET_XCRS		  _IOW(KVMIO,  0xa7, struct kvm_xcrs) +/* Available with KVM_CAP_SW_TLB */ +#define KVM_DIRTY_TLB		  _IOW(KVMIO,  0xaa, struct kvm_dirty_tlb) +/* Available with KVM_CAP_ONE_REG */ +#define KVM_GET_ONE_REG		  _IOW(KVMIO,  0xab, struct kvm_one_reg) +#define KVM_SET_ONE_REG		  _IOW(KVMIO,  0xac, struct kvm_one_reg) +/* VM is being stopped by host */ +#define KVM_KVMCLOCK_CTRL	  _IO(KVMIO,   0xad) +#define KVM_ARM_VCPU_INIT	  _IOW(KVMIO,  0xae, struct kvm_vcpu_init) +#define KVM_ARM_PREFERRED_TARGET  _IOR(KVMIO,  0xaf, struct kvm_vcpu_init) +#define KVM_GET_REG_LIST	  _IOWR(KVMIO, 0xb0, struct kvm_reg_list) +/* Available with KVM_CAP_S390_MEM_OP */ +#define KVM_S390_MEM_OP		  _IOW(KVMIO,  0xb1, struct kvm_s390_mem_op) +/* Available with KVM_CAP_S390_SKEYS */ +#define KVM_S390_GET_SKEYS      _IOW(KVMIO, 0xb2, struct kvm_s390_skeys) +#define KVM_S390_SET_SKEYS      _IOW(KVMIO, 0xb3, struct kvm_s390_skeys) +/* Available with KVM_CAP_S390_INJECT_IRQ */ +#define KVM_S390_IRQ              _IOW(KVMIO,  0xb4, struct kvm_s390_irq) +/* Available with KVM_CAP_S390_IRQ_STATE */ +#define KVM_S390_SET_IRQ_STATE	  _IOW(KVMIO, 0xb5, struct kvm_s390_irq_state) +#define KVM_S390_GET_IRQ_STATE	  _IOW(KVMIO, 0xb6, struct kvm_s390_irq_state) +/* Available with KVM_CAP_X86_SMM */ +#define KVM_SMI                   _IO(KVMIO,   0xb7) + +#define KVM_DEV_ASSIGN_ENABLE_IOMMU	(1 << 0) +#define KVM_DEV_ASSIGN_PCI_2_3		(1 << 1) +#define KVM_DEV_ASSIGN_MASK_INTX	(1 << 2) + +struct kvm_assigned_pci_dev { +	__u32 assigned_dev_id; +	__u32 busnr; +	__u32 devfn; +	__u32 flags; +	__u32 segnr; +	union { +		__u32 reserved[11]; +	}; +}; + +#define KVM_DEV_IRQ_HOST_INTX    (1 << 0) +#define KVM_DEV_IRQ_HOST_MSI     (1 << 1) +#define KVM_DEV_IRQ_HOST_MSIX    (1 << 2) + +#define KVM_DEV_IRQ_GUEST_INTX   (1 << 8) +#define KVM_DEV_IRQ_GUEST_MSI    (1 << 9) +#define KVM_DEV_IRQ_GUEST_MSIX   (1 << 10) + +#define KVM_DEV_IRQ_HOST_MASK	 0x00ff +#define KVM_DEV_IRQ_GUEST_MASK   0xff00 + +struct kvm_assigned_irq { +	__u32 assigned_dev_id; +	__u32 host_irq; /* ignored (legacy field) */ +	__u32 guest_irq; +	__u32 flags; +	union { +		__u32 reserved[12]; +	}; +}; + +struct kvm_assigned_msix_nr { +	__u32 assigned_dev_id; +	__u16 entry_nr; +	__u16 padding; +}; + +#define KVM_MAX_MSIX_PER_DEV		256 +struct kvm_assigned_msix_entry { +	__u32 assigned_dev_id; +	__u32 gsi; +	__u16 entry; /* The index of entry in the MSI-X table */ +	__u16 padding[3]; +}; + +#endif /* __LINUX_KVM_H */ diff --git a/linux-headers/linux/kvm_para.h b/linux-headers/linux/kvm_para.h new file mode 100644 index 00000000..e61661ed --- /dev/null +++ b/linux-headers/linux/kvm_para.h @@ -0,0 +1,32 @@ +#ifndef __LINUX_KVM_PARA_H +#define __LINUX_KVM_PARA_H + +/* + * This header file provides a method for making a hypercall to the host + * Architectures should define: + * - kvm_hypercall0, kvm_hypercall1... + * - kvm_arch_para_features + * - kvm_para_available + */ + +/* Return values for hypercalls */ +#define KVM_ENOSYS		1000 +#define KVM_EFAULT		EFAULT +#define KVM_E2BIG		E2BIG +#define KVM_EPERM		EPERM + +#define KVM_HC_VAPIC_POLL_IRQ		1 +#define KVM_HC_MMU_OP			2 +#define KVM_HC_FEATURES			3 +#define KVM_HC_PPC_MAP_MAGIC_PAGE	4 +#define KVM_HC_KICK_CPU			5 +#define KVM_HC_MIPS_GET_CLOCK_FREQ	6 +#define KVM_HC_MIPS_EXIT_VM		7 +#define KVM_HC_MIPS_CONSOLE_OUTPUT	8 + +/* + * hypercalls use architecture specific + */ +#include <asm/kvm_para.h> + +#endif /* __LINUX_KVM_PARA_H */ diff --git a/linux-headers/linux/psci.h b/linux-headers/linux/psci.h new file mode 100644 index 00000000..5a767630 --- /dev/null +++ b/linux-headers/linux/psci.h @@ -0,0 +1,90 @@ +/* + * ARM Power State and Coordination Interface (PSCI) header + * + * This header holds common PSCI defines and macros shared + * by: ARM kernel, ARM64 kernel, KVM ARM/ARM64 and user space. + * + * Copyright (C) 2014 Linaro Ltd. + * Author: Anup Patel <anup.patel@linaro.org> + */ + +#ifndef _LINUX_PSCI_H +#define _LINUX_PSCI_H + +/* + * PSCI v0.1 interface + * + * The PSCI v0.1 function numbers are implementation defined. + * + * Only PSCI return values such as: SUCCESS, NOT_SUPPORTED, + * INVALID_PARAMS, and DENIED defined below are applicable + * to PSCI v0.1. + */ + +/* PSCI v0.2 interface */ +#define PSCI_0_2_FN_BASE			0x84000000 +#define PSCI_0_2_FN(n)				(PSCI_0_2_FN_BASE + (n)) +#define PSCI_0_2_64BIT				0x40000000 +#define PSCI_0_2_FN64_BASE			\ +					(PSCI_0_2_FN_BASE + PSCI_0_2_64BIT) +#define PSCI_0_2_FN64(n)			(PSCI_0_2_FN64_BASE + (n)) + +#define PSCI_0_2_FN_PSCI_VERSION		PSCI_0_2_FN(0) +#define PSCI_0_2_FN_CPU_SUSPEND			PSCI_0_2_FN(1) +#define PSCI_0_2_FN_CPU_OFF			PSCI_0_2_FN(2) +#define PSCI_0_2_FN_CPU_ON			PSCI_0_2_FN(3) +#define PSCI_0_2_FN_AFFINITY_INFO		PSCI_0_2_FN(4) +#define PSCI_0_2_FN_MIGRATE			PSCI_0_2_FN(5) +#define PSCI_0_2_FN_MIGRATE_INFO_TYPE		PSCI_0_2_FN(6) +#define PSCI_0_2_FN_MIGRATE_INFO_UP_CPU		PSCI_0_2_FN(7) +#define PSCI_0_2_FN_SYSTEM_OFF			PSCI_0_2_FN(8) +#define PSCI_0_2_FN_SYSTEM_RESET		PSCI_0_2_FN(9) + +#define PSCI_0_2_FN64_CPU_SUSPEND		PSCI_0_2_FN64(1) +#define PSCI_0_2_FN64_CPU_ON			PSCI_0_2_FN64(3) +#define PSCI_0_2_FN64_AFFINITY_INFO		PSCI_0_2_FN64(4) +#define PSCI_0_2_FN64_MIGRATE			PSCI_0_2_FN64(5) +#define PSCI_0_2_FN64_MIGRATE_INFO_UP_CPU	PSCI_0_2_FN64(7) + +/* PSCI v0.2 power state encoding for CPU_SUSPEND function */ +#define PSCI_0_2_POWER_STATE_ID_MASK		0xffff +#define PSCI_0_2_POWER_STATE_ID_SHIFT		0 +#define PSCI_0_2_POWER_STATE_TYPE_SHIFT		16 +#define PSCI_0_2_POWER_STATE_TYPE_MASK		\ +				(0x1 << PSCI_0_2_POWER_STATE_TYPE_SHIFT) +#define PSCI_0_2_POWER_STATE_AFFL_SHIFT		24 +#define PSCI_0_2_POWER_STATE_AFFL_MASK		\ +				(0x3 << PSCI_0_2_POWER_STATE_AFFL_SHIFT) + +/* PSCI v0.2 affinity level state returned by AFFINITY_INFO */ +#define PSCI_0_2_AFFINITY_LEVEL_ON		0 +#define PSCI_0_2_AFFINITY_LEVEL_OFF		1 +#define PSCI_0_2_AFFINITY_LEVEL_ON_PENDING	2 + +/* PSCI v0.2 multicore support in Trusted OS returned by MIGRATE_INFO_TYPE */ +#define PSCI_0_2_TOS_UP_MIGRATE			0 +#define PSCI_0_2_TOS_UP_NO_MIGRATE		1 +#define PSCI_0_2_TOS_MP				2 + +/* PSCI version decoding (independent of PSCI version) */ +#define PSCI_VERSION_MAJOR_SHIFT		16 +#define PSCI_VERSION_MINOR_MASK			\ +		((1U << PSCI_VERSION_MAJOR_SHIFT) - 1) +#define PSCI_VERSION_MAJOR_MASK			~PSCI_VERSION_MINOR_MASK +#define PSCI_VERSION_MAJOR(ver)			\ +		(((ver) & PSCI_VERSION_MAJOR_MASK) >> PSCI_VERSION_MAJOR_SHIFT) +#define PSCI_VERSION_MINOR(ver)			\ +		((ver) & PSCI_VERSION_MINOR_MASK) + +/* PSCI return values (inclusive of all PSCI versions) */ +#define PSCI_RET_SUCCESS			0 +#define PSCI_RET_NOT_SUPPORTED			-1 +#define PSCI_RET_INVALID_PARAMS			-2 +#define PSCI_RET_DENIED				-3 +#define PSCI_RET_ALREADY_ON			-4 +#define PSCI_RET_ON_PENDING			-5 +#define PSCI_RET_INTERNAL_FAILURE		-6 +#define PSCI_RET_NOT_PRESENT			-7 +#define PSCI_RET_DISABLED			-8 + +#endif /* _LINUX_PSCI_H */ diff --git a/linux-headers/linux/vfio.h b/linux-headers/linux/vfio.h new file mode 100644 index 00000000..aa276bce --- /dev/null +++ b/linux-headers/linux/vfio.h @@ -0,0 +1,594 @@ +/* + * VFIO API definition + * + * Copyright (C) 2012 Red Hat, Inc.  All rights reserved. + *     Author: Alex Williamson <alex.williamson@redhat.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef VFIO_H +#define VFIO_H + +#include <linux/types.h> +#include <linux/ioctl.h> + +#define VFIO_API_VERSION	0 + + +/* Kernel & User level defines for VFIO IOCTLs. */ + +/* Extensions */ + +#define VFIO_TYPE1_IOMMU		1 +#define VFIO_SPAPR_TCE_IOMMU		2 +#define VFIO_TYPE1v2_IOMMU		3 +/* + * IOMMU enforces DMA cache coherence (ex. PCIe NoSnoop stripping).  This + * capability is subject to change as groups are added or removed. + */ +#define VFIO_DMA_CC_IOMMU		4 + +/* Check if EEH is supported */ +#define VFIO_EEH			5 + +/* Two-stage IOMMU */ +#define VFIO_TYPE1_NESTING_IOMMU	6	/* Implies v2 */ + +#define VFIO_SPAPR_TCE_v2_IOMMU		7 + +/* + * The IOCTL interface is designed for extensibility by embedding the + * structure length (argsz) and flags into structures passed between + * kernel and userspace.  We therefore use the _IO() macro for these + * defines to avoid implicitly embedding a size into the ioctl request. + * As structure fields are added, argsz will increase to match and flag + * bits will be defined to indicate additional fields with valid data. + * It's *always* the caller's responsibility to indicate the size of + * the structure passed by setting argsz appropriately. + */ + +#define VFIO_TYPE	(';') +#define VFIO_BASE	100 + +/* -------- IOCTLs for VFIO file descriptor (/dev/vfio/vfio) -------- */ + +/** + * VFIO_GET_API_VERSION - _IO(VFIO_TYPE, VFIO_BASE + 0) + * + * Report the version of the VFIO API.  This allows us to bump the entire + * API version should we later need to add or change features in incompatible + * ways. + * Return: VFIO_API_VERSION + * Availability: Always + */ +#define VFIO_GET_API_VERSION		_IO(VFIO_TYPE, VFIO_BASE + 0) + +/** + * VFIO_CHECK_EXTENSION - _IOW(VFIO_TYPE, VFIO_BASE + 1, __u32) + * + * Check whether an extension is supported. + * Return: 0 if not supported, 1 (or some other positive integer) if supported. + * Availability: Always + */ +#define VFIO_CHECK_EXTENSION		_IO(VFIO_TYPE, VFIO_BASE + 1) + +/** + * VFIO_SET_IOMMU - _IOW(VFIO_TYPE, VFIO_BASE + 2, __s32) + * + * Set the iommu to the given type.  The type must be supported by an + * iommu driver as verified by calling CHECK_EXTENSION using the same + * type.  A group must be set to this file descriptor before this + * ioctl is available.  The IOMMU interfaces enabled by this call are + * specific to the value set. + * Return: 0 on success, -errno on failure + * Availability: When VFIO group attached + */ +#define VFIO_SET_IOMMU			_IO(VFIO_TYPE, VFIO_BASE + 2) + +/* -------- IOCTLs for GROUP file descriptors (/dev/vfio/$GROUP) -------- */ + +/** + * VFIO_GROUP_GET_STATUS - _IOR(VFIO_TYPE, VFIO_BASE + 3, + *						struct vfio_group_status) + * + * Retrieve information about the group.  Fills in provided + * struct vfio_group_info.  Caller sets argsz. + * Return: 0 on succes, -errno on failure. + * Availability: Always + */ +struct vfio_group_status { +	__u32	argsz; +	__u32	flags; +#define VFIO_GROUP_FLAGS_VIABLE		(1 << 0) +#define VFIO_GROUP_FLAGS_CONTAINER_SET	(1 << 1) +}; +#define VFIO_GROUP_GET_STATUS		_IO(VFIO_TYPE, VFIO_BASE + 3) + +/** + * VFIO_GROUP_SET_CONTAINER - _IOW(VFIO_TYPE, VFIO_BASE + 4, __s32) + * + * Set the container for the VFIO group to the open VFIO file + * descriptor provided.  Groups may only belong to a single + * container.  Containers may, at their discretion, support multiple + * groups.  Only when a container is set are all of the interfaces + * of the VFIO file descriptor and the VFIO group file descriptor + * available to the user. + * Return: 0 on success, -errno on failure. + * Availability: Always + */ +#define VFIO_GROUP_SET_CONTAINER	_IO(VFIO_TYPE, VFIO_BASE + 4) + +/** + * VFIO_GROUP_UNSET_CONTAINER - _IO(VFIO_TYPE, VFIO_BASE + 5) + * + * Remove the group from the attached container.  This is the + * opposite of the SET_CONTAINER call and returns the group to + * an initial state.  All device file descriptors must be released + * prior to calling this interface.  When removing the last group + * from a container, the IOMMU will be disabled and all state lost, + * effectively also returning the VFIO file descriptor to an initial + * state. + * Return: 0 on success, -errno on failure. + * Availability: When attached to container + */ +#define VFIO_GROUP_UNSET_CONTAINER	_IO(VFIO_TYPE, VFIO_BASE + 5) + +/** + * VFIO_GROUP_GET_DEVICE_FD - _IOW(VFIO_TYPE, VFIO_BASE + 6, char) + * + * Return a new file descriptor for the device object described by + * the provided string.  The string should match a device listed in + * the devices subdirectory of the IOMMU group sysfs entry.  The + * group containing the device must already be added to this context. + * Return: new file descriptor on success, -errno on failure. + * Availability: When attached to container + */ +#define VFIO_GROUP_GET_DEVICE_FD	_IO(VFIO_TYPE, VFIO_BASE + 6) + +/* --------------- IOCTLs for DEVICE file descriptors --------------- */ + +/** + * VFIO_DEVICE_GET_INFO - _IOR(VFIO_TYPE, VFIO_BASE + 7, + *						struct vfio_device_info) + * + * Retrieve information about the device.  Fills in provided + * struct vfio_device_info.  Caller sets argsz. + * Return: 0 on success, -errno on failure. + */ +struct vfio_device_info { +	__u32	argsz; +	__u32	flags; +#define VFIO_DEVICE_FLAGS_RESET	(1 << 0)	/* Device supports reset */ +#define VFIO_DEVICE_FLAGS_PCI	(1 << 1)	/* vfio-pci device */ +#define VFIO_DEVICE_FLAGS_PLATFORM (1 << 2)	/* vfio-platform device */ +#define VFIO_DEVICE_FLAGS_AMBA  (1 << 3)	/* vfio-amba device */ +	__u32	num_regions;	/* Max region index + 1 */ +	__u32	num_irqs;	/* Max IRQ index + 1 */ +}; +#define VFIO_DEVICE_GET_INFO		_IO(VFIO_TYPE, VFIO_BASE + 7) + +/** + * VFIO_DEVICE_GET_REGION_INFO - _IOWR(VFIO_TYPE, VFIO_BASE + 8, + *				       struct vfio_region_info) + * + * Retrieve information about a device region.  Caller provides + * struct vfio_region_info with index value set.  Caller sets argsz. + * Implementation of region mapping is bus driver specific.  This is + * intended to describe MMIO, I/O port, as well as bus specific + * regions (ex. PCI config space).  Zero sized regions may be used + * to describe unimplemented regions (ex. unimplemented PCI BARs). + * Return: 0 on success, -errno on failure. + */ +struct vfio_region_info { +	__u32	argsz; +	__u32	flags; +#define VFIO_REGION_INFO_FLAG_READ	(1 << 0) /* Region supports read */ +#define VFIO_REGION_INFO_FLAG_WRITE	(1 << 1) /* Region supports write */ +#define VFIO_REGION_INFO_FLAG_MMAP	(1 << 2) /* Region supports mmap */ +	__u32	index;		/* Region index */ +	__u32	resv;		/* Reserved for alignment */ +	__u64	size;		/* Region size (bytes) */ +	__u64	offset;		/* Region offset from start of device fd */ +}; +#define VFIO_DEVICE_GET_REGION_INFO	_IO(VFIO_TYPE, VFIO_BASE + 8) + +/** + * VFIO_DEVICE_GET_IRQ_INFO - _IOWR(VFIO_TYPE, VFIO_BASE + 9, + *				    struct vfio_irq_info) + * + * Retrieve information about a device IRQ.  Caller provides + * struct vfio_irq_info with index value set.  Caller sets argsz. + * Implementation of IRQ mapping is bus driver specific.  Indexes + * using multiple IRQs are primarily intended to support MSI-like + * interrupt blocks.  Zero count irq blocks may be used to describe + * unimplemented interrupt types. + * + * The EVENTFD flag indicates the interrupt index supports eventfd based + * signaling. + * + * The MASKABLE flags indicates the index supports MASK and UNMASK + * actions described below. + * + * AUTOMASKED indicates that after signaling, the interrupt line is + * automatically masked by VFIO and the user needs to unmask the line + * to receive new interrupts.  This is primarily intended to distinguish + * level triggered interrupts. + * + * The NORESIZE flag indicates that the interrupt lines within the index + * are setup as a set and new subindexes cannot be enabled without first + * disabling the entire index.  This is used for interrupts like PCI MSI + * and MSI-X where the driver may only use a subset of the available + * indexes, but VFIO needs to enable a specific number of vectors + * upfront.  In the case of MSI-X, where the user can enable MSI-X and + * then add and unmask vectors, it's up to userspace to make the decision + * whether to allocate the maximum supported number of vectors or tear + * down setup and incrementally increase the vectors as each is enabled. + */ +struct vfio_irq_info { +	__u32	argsz; +	__u32	flags; +#define VFIO_IRQ_INFO_EVENTFD		(1 << 0) +#define VFIO_IRQ_INFO_MASKABLE		(1 << 1) +#define VFIO_IRQ_INFO_AUTOMASKED	(1 << 2) +#define VFIO_IRQ_INFO_NORESIZE		(1 << 3) +	__u32	index;		/* IRQ index */ +	__u32	count;		/* Number of IRQs within this index */ +}; +#define VFIO_DEVICE_GET_IRQ_INFO	_IO(VFIO_TYPE, VFIO_BASE + 9) + +/** + * VFIO_DEVICE_SET_IRQS - _IOW(VFIO_TYPE, VFIO_BASE + 10, struct vfio_irq_set) + * + * Set signaling, masking, and unmasking of interrupts.  Caller provides + * struct vfio_irq_set with all fields set.  'start' and 'count' indicate + * the range of subindexes being specified. + * + * The DATA flags specify the type of data provided.  If DATA_NONE, the + * operation performs the specified action immediately on the specified + * interrupt(s).  For example, to unmask AUTOMASKED interrupt [0,0]: + * flags = (DATA_NONE|ACTION_UNMASK), index = 0, start = 0, count = 1. + * + * DATA_BOOL allows sparse support for the same on arrays of interrupts. + * For example, to mask interrupts [0,1] and [0,3] (but not [0,2]): + * flags = (DATA_BOOL|ACTION_MASK), index = 0, start = 1, count = 3, + * data = {1,0,1} + * + * DATA_EVENTFD binds the specified ACTION to the provided __s32 eventfd. + * A value of -1 can be used to either de-assign interrupts if already + * assigned or skip un-assigned interrupts.  For example, to set an eventfd + * to be trigger for interrupts [0,0] and [0,2]: + * flags = (DATA_EVENTFD|ACTION_TRIGGER), index = 0, start = 0, count = 3, + * data = {fd1, -1, fd2} + * If index [0,1] is previously set, two count = 1 ioctls calls would be + * required to set [0,0] and [0,2] without changing [0,1]. + * + * Once a signaling mechanism is set, DATA_BOOL or DATA_NONE can be used + * with ACTION_TRIGGER to perform kernel level interrupt loopback testing + * from userspace (ie. simulate hardware triggering). + * + * Setting of an event triggering mechanism to userspace for ACTION_TRIGGER + * enables the interrupt index for the device.  Individual subindex interrupts + * can be disabled using the -1 value for DATA_EVENTFD or the index can be + * disabled as a whole with: flags = (DATA_NONE|ACTION_TRIGGER), count = 0. + * + * Note that ACTION_[UN]MASK specify user->kernel signaling (irqfds) while + * ACTION_TRIGGER specifies kernel->user signaling. + */ +struct vfio_irq_set { +	__u32	argsz; +	__u32	flags; +#define VFIO_IRQ_SET_DATA_NONE		(1 << 0) /* Data not present */ +#define VFIO_IRQ_SET_DATA_BOOL		(1 << 1) /* Data is bool (u8) */ +#define VFIO_IRQ_SET_DATA_EVENTFD	(1 << 2) /* Data is eventfd (s32) */ +#define VFIO_IRQ_SET_ACTION_MASK	(1 << 3) /* Mask interrupt */ +#define VFIO_IRQ_SET_ACTION_UNMASK	(1 << 4) /* Unmask interrupt */ +#define VFIO_IRQ_SET_ACTION_TRIGGER	(1 << 5) /* Trigger interrupt */ +	__u32	index; +	__u32	start; +	__u32	count; +	__u8	data[]; +}; +#define VFIO_DEVICE_SET_IRQS		_IO(VFIO_TYPE, VFIO_BASE + 10) + +#define VFIO_IRQ_SET_DATA_TYPE_MASK	(VFIO_IRQ_SET_DATA_NONE | \ +					 VFIO_IRQ_SET_DATA_BOOL | \ +					 VFIO_IRQ_SET_DATA_EVENTFD) +#define VFIO_IRQ_SET_ACTION_TYPE_MASK	(VFIO_IRQ_SET_ACTION_MASK | \ +					 VFIO_IRQ_SET_ACTION_UNMASK | \ +					 VFIO_IRQ_SET_ACTION_TRIGGER) +/** + * VFIO_DEVICE_RESET - _IO(VFIO_TYPE, VFIO_BASE + 11) + * + * Reset a device. + */ +#define VFIO_DEVICE_RESET		_IO(VFIO_TYPE, VFIO_BASE + 11) + +/* + * The VFIO-PCI bus driver makes use of the following fixed region and + * IRQ index mapping.  Unimplemented regions return a size of zero. + * Unimplemented IRQ types return a count of zero. + */ + +enum { +	VFIO_PCI_BAR0_REGION_INDEX, +	VFIO_PCI_BAR1_REGION_INDEX, +	VFIO_PCI_BAR2_REGION_INDEX, +	VFIO_PCI_BAR3_REGION_INDEX, +	VFIO_PCI_BAR4_REGION_INDEX, +	VFIO_PCI_BAR5_REGION_INDEX, +	VFIO_PCI_ROM_REGION_INDEX, +	VFIO_PCI_CONFIG_REGION_INDEX, +	/* +	 * Expose VGA regions defined for PCI base class 03, subclass 00. +	 * This includes I/O port ranges 0x3b0 to 0x3bb and 0x3c0 to 0x3df +	 * as well as the MMIO range 0xa0000 to 0xbffff.  Each implemented +	 * range is found at it's identity mapped offset from the region +	 * offset, for example 0x3b0 is region_info.offset + 0x3b0.  Areas +	 * between described ranges are unimplemented. +	 */ +	VFIO_PCI_VGA_REGION_INDEX, +	VFIO_PCI_NUM_REGIONS +}; + +enum { +	VFIO_PCI_INTX_IRQ_INDEX, +	VFIO_PCI_MSI_IRQ_INDEX, +	VFIO_PCI_MSIX_IRQ_INDEX, +	VFIO_PCI_ERR_IRQ_INDEX, +	VFIO_PCI_REQ_IRQ_INDEX, +	VFIO_PCI_NUM_IRQS +}; + +/** + * VFIO_DEVICE_GET_PCI_HOT_RESET_INFO - _IORW(VFIO_TYPE, VFIO_BASE + 12, + *					      struct vfio_pci_hot_reset_info) + * + * Return: 0 on success, -errno on failure: + *	-enospc = insufficient buffer, -enodev = unsupported for device. + */ +struct vfio_pci_dependent_device { +	__u32	group_id; +	__u16	segment; +	__u8	bus; +	__u8	devfn; /* Use PCI_SLOT/PCI_FUNC */ +}; + +struct vfio_pci_hot_reset_info { +	__u32	argsz; +	__u32	flags; +	__u32	count; +	struct vfio_pci_dependent_device	devices[]; +}; + +#define VFIO_DEVICE_GET_PCI_HOT_RESET_INFO	_IO(VFIO_TYPE, VFIO_BASE + 12) + +/** + * VFIO_DEVICE_PCI_HOT_RESET - _IOW(VFIO_TYPE, VFIO_BASE + 13, + *				    struct vfio_pci_hot_reset) + * + * Return: 0 on success, -errno on failure. + */ +struct vfio_pci_hot_reset { +	__u32	argsz; +	__u32	flags; +	__u32	count; +	__s32	group_fds[]; +}; + +#define VFIO_DEVICE_PCI_HOT_RESET	_IO(VFIO_TYPE, VFIO_BASE + 13) + +/* -------- API for Type1 VFIO IOMMU -------- */ + +/** + * VFIO_IOMMU_GET_INFO - _IOR(VFIO_TYPE, VFIO_BASE + 12, struct vfio_iommu_info) + * + * Retrieve information about the IOMMU object. Fills in provided + * struct vfio_iommu_info. Caller sets argsz. + * + * XXX Should we do these by CHECK_EXTENSION too? + */ +struct vfio_iommu_type1_info { +	__u32	argsz; +	__u32	flags; +#define VFIO_IOMMU_INFO_PGSIZES (1 << 0)	/* supported page sizes info */ +	__u64	iova_pgsizes;		/* Bitmap of supported page sizes */ +}; + +#define VFIO_IOMMU_GET_INFO _IO(VFIO_TYPE, VFIO_BASE + 12) + +/** + * VFIO_IOMMU_MAP_DMA - _IOW(VFIO_TYPE, VFIO_BASE + 13, struct vfio_dma_map) + * + * Map process virtual addresses to IO virtual addresses using the + * provided struct vfio_dma_map. Caller sets argsz. READ &/ WRITE required. + */ +struct vfio_iommu_type1_dma_map { +	__u32	argsz; +	__u32	flags; +#define VFIO_DMA_MAP_FLAG_READ (1 << 0)		/* readable from device */ +#define VFIO_DMA_MAP_FLAG_WRITE (1 << 1)	/* writable from device */ +	__u64	vaddr;				/* Process virtual address */ +	__u64	iova;				/* IO virtual address */ +	__u64	size;				/* Size of mapping (bytes) */ +}; + +#define VFIO_IOMMU_MAP_DMA _IO(VFIO_TYPE, VFIO_BASE + 13) + +/** + * VFIO_IOMMU_UNMAP_DMA - _IOWR(VFIO_TYPE, VFIO_BASE + 14, + *							struct vfio_dma_unmap) + * + * Unmap IO virtual addresses using the provided struct vfio_dma_unmap. + * Caller sets argsz.  The actual unmapped size is returned in the size + * field.  No guarantee is made to the user that arbitrary unmaps of iova + * or size different from those used in the original mapping call will + * succeed. + */ +struct vfio_iommu_type1_dma_unmap { +	__u32	argsz; +	__u32	flags; +	__u64	iova;				/* IO virtual address */ +	__u64	size;				/* Size of mapping (bytes) */ +}; + +#define VFIO_IOMMU_UNMAP_DMA _IO(VFIO_TYPE, VFIO_BASE + 14) + +/* + * IOCTLs to enable/disable IOMMU container usage. + * No parameters are supported. + */ +#define VFIO_IOMMU_ENABLE	_IO(VFIO_TYPE, VFIO_BASE + 15) +#define VFIO_IOMMU_DISABLE	_IO(VFIO_TYPE, VFIO_BASE + 16) + +/* -------- Additional API for SPAPR TCE (Server POWERPC) IOMMU -------- */ + +/* + * The SPAPR TCE DDW info struct provides the information about + * the details of Dynamic DMA window capability. + * + * @pgsizes contains a page size bitmask, 4K/64K/16M are supported. + * @max_dynamic_windows_supported tells the maximum number of windows + * which the platform can create. + * @levels tells the maximum number of levels in multi-level IOMMU tables; + * this allows splitting a table into smaller chunks which reduces + * the amount of physically contiguous memory required for the table. + */ +struct vfio_iommu_spapr_tce_ddw_info { +	__u64 pgsizes;			/* Bitmap of supported page sizes */ +	__u32 max_dynamic_windows_supported; +	__u32 levels; +}; + +/* + * The SPAPR TCE info struct provides the information about the PCI bus + * address ranges available for DMA, these values are programmed into + * the hardware so the guest has to know that information. + * + * The DMA 32 bit window start is an absolute PCI bus address. + * The IOVA address passed via map/unmap ioctls are absolute PCI bus + * addresses too so the window works as a filter rather than an offset + * for IOVA addresses. + * + * Flags supported: + * - VFIO_IOMMU_SPAPR_INFO_DDW: informs the userspace that dynamic DMA windows + *   (DDW) support is present. @ddw is only supported when DDW is present. + */ +struct vfio_iommu_spapr_tce_info { +	__u32 argsz; +	__u32 flags; +#define VFIO_IOMMU_SPAPR_INFO_DDW	(1 << 0)	/* DDW supported */ +	__u32 dma32_window_start;	/* 32 bit window start (bytes) */ +	__u32 dma32_window_size;	/* 32 bit window size (bytes) */ +	struct vfio_iommu_spapr_tce_ddw_info ddw; +}; + +#define VFIO_IOMMU_SPAPR_TCE_GET_INFO	_IO(VFIO_TYPE, VFIO_BASE + 12) + +/* + * EEH PE operation struct provides ways to: + * - enable/disable EEH functionality; + * - unfreeze IO/DMA for frozen PE; + * - read PE state; + * - reset PE; + * - configure PE; + * - inject EEH error. + */ +struct vfio_eeh_pe_err { +	__u32 type; +	__u32 func; +	__u64 addr; +	__u64 mask; +}; + +struct vfio_eeh_pe_op { +	__u32 argsz; +	__u32 flags; +	__u32 op; +	union { +		struct vfio_eeh_pe_err err; +	}; +}; + +#define VFIO_EEH_PE_DISABLE		0	/* Disable EEH functionality */ +#define VFIO_EEH_PE_ENABLE		1	/* Enable EEH functionality  */ +#define VFIO_EEH_PE_UNFREEZE_IO		2	/* Enable IO for frozen PE   */ +#define VFIO_EEH_PE_UNFREEZE_DMA	3	/* Enable DMA for frozen PE  */ +#define VFIO_EEH_PE_GET_STATE		4	/* PE state retrieval        */ +#define  VFIO_EEH_PE_STATE_NORMAL	0	/* PE in functional state    */ +#define  VFIO_EEH_PE_STATE_RESET	1	/* PE reset in progress      */ +#define  VFIO_EEH_PE_STATE_STOPPED	2	/* Stopped DMA and IO        */ +#define  VFIO_EEH_PE_STATE_STOPPED_DMA	4	/* Stopped DMA only          */ +#define  VFIO_EEH_PE_STATE_UNAVAIL	5	/* State unavailable         */ +#define VFIO_EEH_PE_RESET_DEACTIVATE	5	/* Deassert PE reset         */ +#define VFIO_EEH_PE_RESET_HOT		6	/* Assert hot reset          */ +#define VFIO_EEH_PE_RESET_FUNDAMENTAL	7	/* Assert fundamental reset  */ +#define VFIO_EEH_PE_CONFIGURE		8	/* PE configuration          */ +#define VFIO_EEH_PE_INJECT_ERR		9	/* Inject EEH error          */ + +#define VFIO_EEH_PE_OP			_IO(VFIO_TYPE, VFIO_BASE + 21) + +/** + * VFIO_IOMMU_SPAPR_REGISTER_MEMORY - _IOW(VFIO_TYPE, VFIO_BASE + 17, struct vfio_iommu_spapr_register_memory) + * + * Registers user space memory where DMA is allowed. It pins + * user pages and does the locked memory accounting so + * subsequent VFIO_IOMMU_MAP_DMA/VFIO_IOMMU_UNMAP_DMA calls + * get faster. + */ +struct vfio_iommu_spapr_register_memory { +	__u32	argsz; +	__u32	flags; +	__u64	vaddr;				/* Process virtual address */ +	__u64	size;				/* Size of mapping (bytes) */ +}; +#define VFIO_IOMMU_SPAPR_REGISTER_MEMORY	_IO(VFIO_TYPE, VFIO_BASE + 17) + +/** + * VFIO_IOMMU_SPAPR_UNREGISTER_MEMORY - _IOW(VFIO_TYPE, VFIO_BASE + 18, struct vfio_iommu_spapr_register_memory) + * + * Unregisters user space memory registered with + * VFIO_IOMMU_SPAPR_REGISTER_MEMORY. + * Uses vfio_iommu_spapr_register_memory for parameters. + */ +#define VFIO_IOMMU_SPAPR_UNREGISTER_MEMORY	_IO(VFIO_TYPE, VFIO_BASE + 18) + +/** + * VFIO_IOMMU_SPAPR_TCE_CREATE - _IOWR(VFIO_TYPE, VFIO_BASE + 19, struct vfio_iommu_spapr_tce_create) + * + * Creates an additional TCE table and programs it (sets a new DMA window) + * to every IOMMU group in the container. It receives page shift, window + * size and number of levels in the TCE table being created. + * + * It allocates and returns an offset on a PCI bus of the new DMA window. + */ +struct vfio_iommu_spapr_tce_create { +	__u32 argsz; +	__u32 flags; +	/* in */ +	__u32 page_shift; +	__u64 window_size; +	__u32 levels; +	/* out */ +	__u64 start_addr; +}; +#define VFIO_IOMMU_SPAPR_TCE_CREATE	_IO(VFIO_TYPE, VFIO_BASE + 19) + +/** + * VFIO_IOMMU_SPAPR_TCE_REMOVE - _IOW(VFIO_TYPE, VFIO_BASE + 20, struct vfio_iommu_spapr_tce_remove) + * + * Unprograms a TCE table from all groups in the container and destroys it. + * It receives a PCI bus offset as a window id. + */ +struct vfio_iommu_spapr_tce_remove { +	__u32 argsz; +	__u32 flags; +	/* in */ +	__u64 start_addr; +}; +#define VFIO_IOMMU_SPAPR_TCE_REMOVE	_IO(VFIO_TYPE, VFIO_BASE + 20) + +/* ***************************************************************** */ + +#endif /* VFIO_H */ diff --git a/linux-headers/linux/vhost.h b/linux-headers/linux/vhost.h new file mode 100644 index 00000000..ead86db9 --- /dev/null +++ b/linux-headers/linux/vhost.h @@ -0,0 +1,172 @@ +#ifndef _LINUX_VHOST_H +#define _LINUX_VHOST_H +/* Userspace interface for in-kernel virtio accelerators. */ + +/* vhost is used to reduce the number of system calls involved in virtio. + * + * Existing virtio net code is used in the guest without modification. + * + * This header includes interface used by userspace hypervisor for + * device configuration. + */ + +#include <linux/types.h> + +#include <linux/ioctl.h> +#include <linux/virtio_config.h> +#include <linux/virtio_ring.h> + +struct vhost_vring_state { +	unsigned int index; +	unsigned int num; +}; + +struct vhost_vring_file { +	unsigned int index; +	int fd; /* Pass -1 to unbind from file. */ + +}; + +struct vhost_vring_addr { +	unsigned int index; +	/* Option flags. */ +	unsigned int flags; +	/* Flag values: */ +	/* Whether log address is valid. If set enables logging. */ +#define VHOST_VRING_F_LOG 0 + +	/* Start of array of descriptors (virtually contiguous) */ +	__u64 desc_user_addr; +	/* Used structure address. Must be 32 bit aligned */ +	__u64 used_user_addr; +	/* Available structure address. Must be 16 bit aligned */ +	__u64 avail_user_addr; +	/* Logging support. */ +	/* Log writes to used structure, at offset calculated from specified +	 * address. Address must be 32 bit aligned. */ +	__u64 log_guest_addr; +}; + +struct vhost_memory_region { +	__u64 guest_phys_addr; +	__u64 memory_size; /* bytes */ +	__u64 userspace_addr; +	__u64 flags_padding; /* No flags are currently specified. */ +}; + +/* All region addresses and sizes must be 4K aligned. */ +#define VHOST_PAGE_SIZE 0x1000 + +struct vhost_memory { +	__u32 nregions; +	__u32 padding; +	struct vhost_memory_region regions[0]; +}; + +/* ioctls */ + +#define VHOST_VIRTIO 0xAF + +/* Features bitmask for forward compatibility.  Transport bits are used for + * vhost specific features. */ +#define VHOST_GET_FEATURES	_IOR(VHOST_VIRTIO, 0x00, __u64) +#define VHOST_SET_FEATURES	_IOW(VHOST_VIRTIO, 0x00, __u64) + +/* Set current process as the (exclusive) owner of this file descriptor.  This + * must be called before any other vhost command.  Further calls to + * VHOST_OWNER_SET fail until VHOST_OWNER_RESET is called. */ +#define VHOST_SET_OWNER _IO(VHOST_VIRTIO, 0x01) +/* Give up ownership, and reset the device to default values. + * Allows subsequent call to VHOST_OWNER_SET to succeed. */ +#define VHOST_RESET_OWNER _IO(VHOST_VIRTIO, 0x02) + +/* Set up/modify memory layout */ +#define VHOST_SET_MEM_TABLE	_IOW(VHOST_VIRTIO, 0x03, struct vhost_memory) + +/* Write logging setup. */ +/* Memory writes can optionally be logged by setting bit at an offset + * (calculated from the physical address) from specified log base. + * The bit is set using an atomic 32 bit operation. */ +/* Set base address for logging. */ +#define VHOST_SET_LOG_BASE _IOW(VHOST_VIRTIO, 0x04, __u64) +/* Specify an eventfd file descriptor to signal on log write. */ +#define VHOST_SET_LOG_FD _IOW(VHOST_VIRTIO, 0x07, int) + +/* Ring setup. */ +/* Set number of descriptors in ring. This parameter can not + * be modified while ring is running (bound to a device). */ +#define VHOST_SET_VRING_NUM _IOW(VHOST_VIRTIO, 0x10, struct vhost_vring_state) +/* Set addresses for the ring. */ +#define VHOST_SET_VRING_ADDR _IOW(VHOST_VIRTIO, 0x11, struct vhost_vring_addr) +/* Base value where queue looks for available descriptors */ +#define VHOST_SET_VRING_BASE _IOW(VHOST_VIRTIO, 0x12, struct vhost_vring_state) +/* Get accessor: reads index, writes value in num */ +#define VHOST_GET_VRING_BASE _IOWR(VHOST_VIRTIO, 0x12, struct vhost_vring_state) + +/* Set the vring byte order in num. Valid values are VHOST_VRING_LITTLE_ENDIAN + * or VHOST_VRING_BIG_ENDIAN (other values return -EINVAL). + * The byte order cannot be changed while the device is active: trying to do so + * returns -EBUSY. + * This is a legacy only API that is simply ignored when VIRTIO_F_VERSION_1 is + * set. + * Not all kernel configurations support this ioctl, but all configurations that + * support SET also support GET. + */ +#define VHOST_VRING_LITTLE_ENDIAN 0 +#define VHOST_VRING_BIG_ENDIAN 1 +#define VHOST_SET_VRING_ENDIAN _IOW(VHOST_VIRTIO, 0x13, struct vhost_vring_state) +#define VHOST_GET_VRING_ENDIAN _IOW(VHOST_VIRTIO, 0x14, struct vhost_vring_state) + +/* The following ioctls use eventfd file descriptors to signal and poll + * for events. */ + +/* Set eventfd to poll for added buffers */ +#define VHOST_SET_VRING_KICK _IOW(VHOST_VIRTIO, 0x20, struct vhost_vring_file) +/* Set eventfd to signal when buffers have beed used */ +#define VHOST_SET_VRING_CALL _IOW(VHOST_VIRTIO, 0x21, struct vhost_vring_file) +/* Set eventfd to signal an error */ +#define VHOST_SET_VRING_ERR _IOW(VHOST_VIRTIO, 0x22, struct vhost_vring_file) + +/* VHOST_NET specific defines */ + +/* Attach virtio net ring to a raw socket, or tap device. + * The socket must be already bound to an ethernet device, this device will be + * used for transmit.  Pass fd -1 to unbind from the socket and the transmit + * device.  This can be used to stop the ring (e.g. for migration). */ +#define VHOST_NET_SET_BACKEND _IOW(VHOST_VIRTIO, 0x30, struct vhost_vring_file) + +/* Feature bits */ +/* Log all write descriptors. Can be changed while device is active. */ +#define VHOST_F_LOG_ALL 26 +/* vhost-net should add virtio_net_hdr for RX, and strip for TX packets. */ +#define VHOST_NET_F_VIRTIO_NET_HDR 27 + +/* VHOST_SCSI specific definitions */ + +/* + * Used by QEMU userspace to ensure a consistent vhost-scsi ABI. + * + * ABI Rev 0: July 2012 version starting point for v3.6-rc merge candidate + + *            RFC-v2 vhost-scsi userspace.  Add GET_ABI_VERSION ioctl usage + * ABI Rev 1: January 2013. Ignore vhost_tpgt filed in struct vhost_scsi_target. + *            All the targets under vhost_wwpn can be seen and used by guset. + */ + +#define VHOST_SCSI_ABI_VERSION	1 + +struct vhost_scsi_target { +	int abi_version; +	char vhost_wwpn[224]; /* TRANSPORT_IQN_LEN */ +	unsigned short vhost_tpgt; +	unsigned short reserved; +}; + +#define VHOST_SCSI_SET_ENDPOINT _IOW(VHOST_VIRTIO, 0x40, struct vhost_scsi_target) +#define VHOST_SCSI_CLEAR_ENDPOINT _IOW(VHOST_VIRTIO, 0x41, struct vhost_scsi_target) +/* Changing this breaks userspace. */ +#define VHOST_SCSI_GET_ABI_VERSION _IOW(VHOST_VIRTIO, 0x42, int) +/* Set and get the events missed flag */ +#define VHOST_SCSI_SET_EVENTS_MISSED _IOW(VHOST_VIRTIO, 0x43, __u32) +#define VHOST_SCSI_GET_EVENTS_MISSED _IOW(VHOST_VIRTIO, 0x44, __u32) + +#endif diff --git a/linux-headers/linux/virtio_config.h b/linux-headers/linux/virtio_config.h new file mode 100644 index 00000000..5590f7d4 --- /dev/null +++ b/linux-headers/linux/virtio_config.h @@ -0,0 +1 @@ +#include "standard-headers/linux/virtio_config.h" diff --git a/linux-headers/linux/virtio_ring.h b/linux-headers/linux/virtio_ring.h new file mode 100644 index 00000000..c6f0fb6c --- /dev/null +++ b/linux-headers/linux/virtio_ring.h @@ -0,0 +1 @@ +#include "standard-headers/linux/virtio_ring.h"  | 
