| 
									
										
										
										
											2008-04-16 23:28:09 -05:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * 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_ASM_H__
 | 
					
						
							|  |  |  | #define __POWERPC_KVM_ASM_H__
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-25 13:48:54 +02:00
										 |  |  | #ifdef __ASSEMBLY__
 | 
					
						
							| 
									
										
										
										
											2012-04-25 01:26:43 +00:00
										 |  |  | #ifdef CONFIG_64BIT
 | 
					
						
							|  |  |  | #define PPC_STD(sreg, offset, areg)  std sreg, (offset)(areg)
 | 
					
						
							|  |  |  | #define PPC_LD(treg, offset, areg)   ld treg, (offset)(areg)
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #define PPC_STD(sreg, offset, areg)  stw sreg, (offset+4)(areg)
 | 
					
						
							|  |  |  | #define PPC_LD(treg, offset, areg)   lwz treg, (offset+4)(areg)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2012-04-25 13:48:54 +02:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2012-04-25 01:26:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-16 23:28:09 -05:00
										 |  |  | /* IVPR must be 64KiB-aligned. */ | 
					
						
							|  |  |  | #define VCPU_SIZE_ORDER 4
 | 
					
						
							|  |  |  | #define VCPU_SIZE_LOG   (VCPU_SIZE_ORDER + 12)
 | 
					
						
							|  |  |  | #define VCPU_TLB_PGSZ   PPC44x_TLB_64K
 | 
					
						
							|  |  |  | #define VCPU_SIZE_BYTES (1<<VCPU_SIZE_LOG)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_CRITICAL 0
 | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_MACHINE_CHECK 1
 | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_DATA_STORAGE 2
 | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_INST_STORAGE 3
 | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_EXTERNAL 4
 | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_ALIGNMENT 5
 | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_PROGRAM 6
 | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_FP_UNAVAIL 7
 | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_SYSCALL 8
 | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_AP_UNAVAIL 9
 | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_DECREMENTER 10
 | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_FIT 11
 | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_WATCHDOG 12
 | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_DTLB_MISS 13
 | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_ITLB_MISS 14
 | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_DEBUG 15
 | 
					
						
							| 
									
										
										
										
											2009-01-03 16:23:13 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* E500 */ | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_SPE_UNAVAIL 32
 | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_SPE_FP_DATA 33
 | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_SPE_FP_ROUND 34
 | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_PERFORMANCE_MONITOR 35
 | 
					
						
							| 
									
										
										
										
											2011-12-20 15:34:43 +00:00
										 |  |  | #define BOOKE_INTERRUPT_DOORBELL 36
 | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_DOORBELL_CRITICAL 37
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* booke_hv */ | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_GUEST_DBELL 38
 | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_GUEST_DBELL_CRIT 39
 | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_HV_SYSCALL 40
 | 
					
						
							|  |  |  | #define BOOKE_INTERRUPT_HV_PRIV 41
 | 
					
						
							| 
									
										
										
										
											2008-04-16 23:28:09 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-30 05:47:03 +00:00
										 |  |  | /* book3s */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define BOOK3S_INTERRUPT_SYSTEM_RESET	0x100
 | 
					
						
							|  |  |  | #define BOOK3S_INTERRUPT_MACHINE_CHECK	0x200
 | 
					
						
							|  |  |  | #define BOOK3S_INTERRUPT_DATA_STORAGE	0x300
 | 
					
						
							|  |  |  | #define BOOK3S_INTERRUPT_DATA_SEGMENT	0x380
 | 
					
						
							|  |  |  | #define BOOK3S_INTERRUPT_INST_STORAGE	0x400
 | 
					
						
							|  |  |  | #define BOOK3S_INTERRUPT_INST_SEGMENT	0x480
 | 
					
						
							|  |  |  | #define BOOK3S_INTERRUPT_EXTERNAL	0x500
 | 
					
						
							| 
									
										
										
										
											2010-08-30 10:44:15 +02:00
										 |  |  | #define BOOK3S_INTERRUPT_EXTERNAL_LEVEL	0x501
 | 
					
						
							| 
									
										
										
										
											2011-04-05 14:20:31 +10:00
										 |  |  | #define BOOK3S_INTERRUPT_EXTERNAL_HV	0x502
 | 
					
						
							| 
									
										
										
										
											2009-10-30 05:47:03 +00:00
										 |  |  | #define BOOK3S_INTERRUPT_ALIGNMENT	0x600
 | 
					
						
							|  |  |  | #define BOOK3S_INTERRUPT_PROGRAM	0x700
 | 
					
						
							|  |  |  | #define BOOK3S_INTERRUPT_FP_UNAVAIL	0x800
 | 
					
						
							|  |  |  | #define BOOK3S_INTERRUPT_DECREMENTER	0x900
 | 
					
						
							| 
									
										
											  
											
												KVM: PPC: Add support for Book3S processors in hypervisor mode
This adds support for KVM running on 64-bit Book 3S processors,
specifically POWER7, in hypervisor mode.  Using hypervisor mode means
that the guest can use the processor's supervisor mode.  That means
that the guest can execute privileged instructions and access privileged
registers itself without trapping to the host.  This gives excellent
performance, but does mean that KVM cannot emulate a processor
architecture other than the one that the hardware implements.
This code assumes that the guest is running paravirtualized using the
PAPR (Power Architecture Platform Requirements) interface, which is the
interface that IBM's PowerVM hypervisor uses.  That means that existing
Linux distributions that run on IBM pSeries machines will also run
under KVM without modification.  In order to communicate the PAPR
hypercalls to qemu, this adds a new KVM_EXIT_PAPR_HCALL exit code
to include/linux/kvm.h.
Currently the choice between book3s_hv support and book3s_pr support
(i.e. the existing code, which runs the guest in user mode) has to be
made at kernel configuration time, so a given kernel binary can only
do one or the other.
This new book3s_hv code doesn't support MMIO emulation at present.
Since we are running paravirtualized guests, this isn't a serious
restriction.
With the guest running in supervisor mode, most exceptions go straight
to the guest.  We will never get data or instruction storage or segment
interrupts, alignment interrupts, decrementer interrupts, program
interrupts, single-step interrupts, etc., coming to the hypervisor from
the guest.  Therefore this introduces a new KVMTEST_NONHV macro for the
exception entry path so that we don't have to do the KVM test on entry
to those exception handlers.
We do however get hypervisor decrementer, hypervisor data storage,
hypervisor instruction storage, and hypervisor emulation assist
interrupts, so we have to handle those.
In hypervisor mode, real-mode accesses can access all of RAM, not just
a limited amount.  Therefore we put all the guest state in the vcpu.arch
and use the shadow_vcpu in the PACA only for temporary scratch space.
We allocate the vcpu with kzalloc rather than vzalloc, and we don't use
anything in the kvmppc_vcpu_book3s struct, so we don't allocate it.
We don't have a shared page with the guest, but we still need a
kvm_vcpu_arch_shared struct to store the values of various registers,
so we include one in the vcpu_arch struct.
The POWER7 processor has a restriction that all threads in a core have
to be in the same partition.  MMU-on kernel code counts as a partition
(partition 0), so we have to do a partition switch on every entry to and
exit from the guest.  At present we require the host and guest to run
in single-thread mode because of this hardware restriction.
This code allocates a hashed page table for the guest and initializes
it with HPTEs for the guest's Virtual Real Memory Area (VRMA).  We
require that the guest memory is allocated using 16MB huge pages, in
order to simplify the low-level memory management.  This also means that
we can get away without tracking paging activity in the host for now,
since huge pages can't be paged or swapped.
This also adds a few new exports needed by the book3s_hv code.
Signed-off-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Alexander Graf <agraf@suse.de>
											
										 
											2011-06-29 00:21:34 +00:00
										 |  |  | #define BOOK3S_INTERRUPT_HV_DECREMENTER	0x980
 | 
					
						
							| 
									
										
										
										
											2009-10-30 05:47:03 +00:00
										 |  |  | #define BOOK3S_INTERRUPT_SYSCALL	0xc00
 | 
					
						
							|  |  |  | #define BOOK3S_INTERRUPT_TRACE		0xd00
 | 
					
						
							| 
									
										
											  
											
												KVM: PPC: Add support for Book3S processors in hypervisor mode
This adds support for KVM running on 64-bit Book 3S processors,
specifically POWER7, in hypervisor mode.  Using hypervisor mode means
that the guest can use the processor's supervisor mode.  That means
that the guest can execute privileged instructions and access privileged
registers itself without trapping to the host.  This gives excellent
performance, but does mean that KVM cannot emulate a processor
architecture other than the one that the hardware implements.
This code assumes that the guest is running paravirtualized using the
PAPR (Power Architecture Platform Requirements) interface, which is the
interface that IBM's PowerVM hypervisor uses.  That means that existing
Linux distributions that run on IBM pSeries machines will also run
under KVM without modification.  In order to communicate the PAPR
hypercalls to qemu, this adds a new KVM_EXIT_PAPR_HCALL exit code
to include/linux/kvm.h.
Currently the choice between book3s_hv support and book3s_pr support
(i.e. the existing code, which runs the guest in user mode) has to be
made at kernel configuration time, so a given kernel binary can only
do one or the other.
This new book3s_hv code doesn't support MMIO emulation at present.
Since we are running paravirtualized guests, this isn't a serious
restriction.
With the guest running in supervisor mode, most exceptions go straight
to the guest.  We will never get data or instruction storage or segment
interrupts, alignment interrupts, decrementer interrupts, program
interrupts, single-step interrupts, etc., coming to the hypervisor from
the guest.  Therefore this introduces a new KVMTEST_NONHV macro for the
exception entry path so that we don't have to do the KVM test on entry
to those exception handlers.
We do however get hypervisor decrementer, hypervisor data storage,
hypervisor instruction storage, and hypervisor emulation assist
interrupts, so we have to handle those.
In hypervisor mode, real-mode accesses can access all of RAM, not just
a limited amount.  Therefore we put all the guest state in the vcpu.arch
and use the shadow_vcpu in the PACA only for temporary scratch space.
We allocate the vcpu with kzalloc rather than vzalloc, and we don't use
anything in the kvmppc_vcpu_book3s struct, so we don't allocate it.
We don't have a shared page with the guest, but we still need a
kvm_vcpu_arch_shared struct to store the values of various registers,
so we include one in the vcpu_arch struct.
The POWER7 processor has a restriction that all threads in a core have
to be in the same partition.  MMU-on kernel code counts as a partition
(partition 0), so we have to do a partition switch on every entry to and
exit from the guest.  At present we require the host and guest to run
in single-thread mode because of this hardware restriction.
This code allocates a hashed page table for the guest and initializes
it with HPTEs for the guest's Virtual Real Memory Area (VRMA).  We
require that the guest memory is allocated using 16MB huge pages, in
order to simplify the low-level memory management.  This also means that
we can get away without tracking paging activity in the host for now,
since huge pages can't be paged or swapped.
This also adds a few new exports needed by the book3s_hv code.
Signed-off-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Alexander Graf <agraf@suse.de>
											
										 
											2011-06-29 00:21:34 +00:00
										 |  |  | #define BOOK3S_INTERRUPT_H_DATA_STORAGE	0xe00
 | 
					
						
							|  |  |  | #define BOOK3S_INTERRUPT_H_INST_STORAGE	0xe20
 | 
					
						
							|  |  |  | #define BOOK3S_INTERRUPT_H_EMUL_ASSIST	0xe40
 | 
					
						
							| 
									
										
										
										
											2009-10-30 05:47:03 +00:00
										 |  |  | #define BOOK3S_INTERRUPT_PERFMON	0xf00
 | 
					
						
							|  |  |  | #define BOOK3S_INTERRUPT_ALTIVEC	0xf20
 | 
					
						
							|  |  |  | #define BOOK3S_INTERRUPT_VSX		0xf40
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define BOOK3S_IRQPRIO_SYSTEM_RESET		0
 | 
					
						
							|  |  |  | #define BOOK3S_IRQPRIO_DATA_SEGMENT		1
 | 
					
						
							|  |  |  | #define BOOK3S_IRQPRIO_INST_SEGMENT		2
 | 
					
						
							|  |  |  | #define BOOK3S_IRQPRIO_DATA_STORAGE		3
 | 
					
						
							|  |  |  | #define BOOK3S_IRQPRIO_INST_STORAGE		4
 | 
					
						
							|  |  |  | #define BOOK3S_IRQPRIO_ALIGNMENT		5
 | 
					
						
							|  |  |  | #define BOOK3S_IRQPRIO_PROGRAM			6
 | 
					
						
							|  |  |  | #define BOOK3S_IRQPRIO_FP_UNAVAIL		7
 | 
					
						
							|  |  |  | #define BOOK3S_IRQPRIO_ALTIVEC			8
 | 
					
						
							|  |  |  | #define BOOK3S_IRQPRIO_VSX			9
 | 
					
						
							|  |  |  | #define BOOK3S_IRQPRIO_SYSCALL			10
 | 
					
						
							|  |  |  | #define BOOK3S_IRQPRIO_MACHINE_CHECK		11
 | 
					
						
							|  |  |  | #define BOOK3S_IRQPRIO_DEBUG			12
 | 
					
						
							|  |  |  | #define BOOK3S_IRQPRIO_EXTERNAL			13
 | 
					
						
							|  |  |  | #define BOOK3S_IRQPRIO_DECREMENTER		14
 | 
					
						
							|  |  |  | #define BOOK3S_IRQPRIO_PERFORMANCE_MONITOR	15
 | 
					
						
							| 
									
										
										
										
											2010-08-30 10:44:15 +02:00
										 |  |  | #define BOOK3S_IRQPRIO_EXTERNAL_LEVEL		16
 | 
					
						
							|  |  |  | #define BOOK3S_IRQPRIO_MAX			17
 | 
					
						
							| 
									
										
										
										
											2009-10-30 05:47:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define BOOK3S_HFLAG_DCBZ32			0x1
 | 
					
						
							| 
									
										
										
										
											2009-11-30 03:02:02 +00:00
										 |  |  | #define BOOK3S_HFLAG_SLB			0x2
 | 
					
						
							| 
									
										
										
										
											2010-02-19 11:00:32 +01:00
										 |  |  | #define BOOK3S_HFLAG_PAIRED_SINGLE		0x4
 | 
					
						
							| 
									
										
										
										
											2010-04-20 02:49:54 +02:00
										 |  |  | #define BOOK3S_HFLAG_NATIVE_PS			0x8
 | 
					
						
							| 
									
										
										
										
											2009-10-30 05:47:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-16 23:28:09 -05:00
										 |  |  | #define RESUME_FLAG_NV          (1<<0)  /* Reload guest nonvolatile state? */
 | 
					
						
							|  |  |  | #define RESUME_FLAG_HOST        (1<<1)  /* Resume host? */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define RESUME_GUEST            0
 | 
					
						
							|  |  |  | #define RESUME_GUEST_NV         RESUME_FLAG_NV
 | 
					
						
							|  |  |  | #define RESUME_HOST             RESUME_FLAG_HOST
 | 
					
						
							|  |  |  | #define RESUME_HOST_NV          (RESUME_FLAG_HOST|RESUME_FLAG_NV)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-08 02:58:04 +01:00
										 |  |  | #define KVM_GUEST_MODE_NONE	0
 | 
					
						
							|  |  |  | #define KVM_GUEST_MODE_GUEST	1
 | 
					
						
							|  |  |  | #define KVM_GUEST_MODE_SKIP	2
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define KVM_INST_FETCH_FAILED	-1
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-16 23:28:09 -05:00
										 |  |  | #endif /* __POWERPC_KVM_ASM_H__ */
 |