diff options
-rw-r--r-- | arch/powerpc/include/asm/kvm_book3s.h | 1 | ||||
-rw-r--r-- | arch/powerpc/include/asm/kvm_ppc.h | 2 | ||||
-rw-r--r-- | arch/powerpc/include/asm/reg.h | 4 | ||||
-rw-r--r-- | arch/powerpc/kvm/book3s.c | 7 | ||||
-rw-r--r-- | arch/powerpc/kvm/booke.c | 3 | ||||
-rw-r--r-- | arch/powerpc/kvm/emulate.c | 2 |
6 files changed, 14 insertions, 5 deletions
diff --git a/arch/powerpc/include/asm/kvm_book3s.h b/arch/powerpc/include/asm/kvm_book3s.h index c91be0ff0232..79ab8faf18e7 100644 --- a/arch/powerpc/include/asm/kvm_book3s.h +++ b/arch/powerpc/include/asm/kvm_book3s.h | |||
@@ -91,6 +91,7 @@ struct kvmppc_vcpu_book3s { | |||
91 | u64 vsid_next; | 91 | u64 vsid_next; |
92 | u64 vsid_max; | 92 | u64 vsid_max; |
93 | int context_id; | 93 | int context_id; |
94 | ulong prog_flags; /* flags to inject when giving a 700 trap */ | ||
94 | }; | 95 | }; |
95 | 96 | ||
96 | #define CONTEXT_HOST 0 | 97 | #define CONTEXT_HOST 0 |
diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h index 89c5d79c3479..09816da9e950 100644 --- a/arch/powerpc/include/asm/kvm_ppc.h +++ b/arch/powerpc/include/asm/kvm_ppc.h | |||
@@ -80,7 +80,7 @@ extern void kvmppc_core_vcpu_put(struct kvm_vcpu *vcpu); | |||
80 | 80 | ||
81 | extern void kvmppc_core_deliver_interrupts(struct kvm_vcpu *vcpu); | 81 | extern void kvmppc_core_deliver_interrupts(struct kvm_vcpu *vcpu); |
82 | extern int kvmppc_core_pending_dec(struct kvm_vcpu *vcpu); | 82 | extern int kvmppc_core_pending_dec(struct kvm_vcpu *vcpu); |
83 | extern void kvmppc_core_queue_program(struct kvm_vcpu *vcpu); | 83 | extern void kvmppc_core_queue_program(struct kvm_vcpu *vcpu, ulong flags); |
84 | extern void kvmppc_core_queue_dec(struct kvm_vcpu *vcpu); | 84 | extern void kvmppc_core_queue_dec(struct kvm_vcpu *vcpu); |
85 | extern void kvmppc_core_dequeue_dec(struct kvm_vcpu *vcpu); | 85 | extern void kvmppc_core_dequeue_dec(struct kvm_vcpu *vcpu); |
86 | extern void kvmppc_core_queue_external(struct kvm_vcpu *vcpu, | 86 | extern void kvmppc_core_queue_external(struct kvm_vcpu *vcpu, |
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h index bc8dd53f718a..5572e86223f4 100644 --- a/arch/powerpc/include/asm/reg.h +++ b/arch/powerpc/include/asm/reg.h | |||
@@ -426,6 +426,10 @@ | |||
426 | #define SRR1_WAKEMT 0x00280000 /* mtctrl */ | 426 | #define SRR1_WAKEMT 0x00280000 /* mtctrl */ |
427 | #define SRR1_WAKEDEC 0x00180000 /* Decrementer interrupt */ | 427 | #define SRR1_WAKEDEC 0x00180000 /* Decrementer interrupt */ |
428 | #define SRR1_WAKETHERM 0x00100000 /* Thermal management interrupt */ | 428 | #define SRR1_WAKETHERM 0x00100000 /* Thermal management interrupt */ |
429 | #define SRR1_PROGFPE 0x00100000 /* Floating Point Enabled */ | ||
430 | #define SRR1_PROGPRIV 0x00040000 /* Privileged instruction */ | ||
431 | #define SRR1_PROGTRAP 0x00020000 /* Trap */ | ||
432 | #define SRR1_PROGADDR 0x00010000 /* SRR0 contains subsequent addr */ | ||
429 | #define SPRN_HSRR0 0x13A /* Save/Restore Register 0 */ | 433 | #define SPRN_HSRR0 0x13A /* Save/Restore Register 0 */ |
430 | #define SPRN_HSRR1 0x13B /* Save/Restore Register 1 */ | 434 | #define SPRN_HSRR1 0x13B /* Save/Restore Register 1 */ |
431 | 435 | ||
diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c index 13173922b678..66b5924e1748 100644 --- a/arch/powerpc/kvm/book3s.c +++ b/arch/powerpc/kvm/book3s.c | |||
@@ -168,8 +168,9 @@ void kvmppc_book3s_queue_irqprio(struct kvm_vcpu *vcpu, unsigned int vec) | |||
168 | } | 168 | } |
169 | 169 | ||
170 | 170 | ||
171 | void kvmppc_core_queue_program(struct kvm_vcpu *vcpu) | 171 | void kvmppc_core_queue_program(struct kvm_vcpu *vcpu, ulong flags) |
172 | { | 172 | { |
173 | to_book3s(vcpu)->prog_flags = flags; | ||
173 | kvmppc_book3s_queue_irqprio(vcpu, BOOK3S_INTERRUPT_PROGRAM); | 174 | kvmppc_book3s_queue_irqprio(vcpu, BOOK3S_INTERRUPT_PROGRAM); |
174 | } | 175 | } |
175 | 176 | ||
@@ -198,6 +199,7 @@ int kvmppc_book3s_irqprio_deliver(struct kvm_vcpu *vcpu, unsigned int priority) | |||
198 | { | 199 | { |
199 | int deliver = 1; | 200 | int deliver = 1; |
200 | int vec = 0; | 201 | int vec = 0; |
202 | ulong flags = 0ULL; | ||
201 | 203 | ||
202 | switch (priority) { | 204 | switch (priority) { |
203 | case BOOK3S_IRQPRIO_DECREMENTER: | 205 | case BOOK3S_IRQPRIO_DECREMENTER: |
@@ -231,6 +233,7 @@ int kvmppc_book3s_irqprio_deliver(struct kvm_vcpu *vcpu, unsigned int priority) | |||
231 | break; | 233 | break; |
232 | case BOOK3S_IRQPRIO_PROGRAM: | 234 | case BOOK3S_IRQPRIO_PROGRAM: |
233 | vec = BOOK3S_INTERRUPT_PROGRAM; | 235 | vec = BOOK3S_INTERRUPT_PROGRAM; |
236 | flags = to_book3s(vcpu)->prog_flags; | ||
234 | break; | 237 | break; |
235 | case BOOK3S_IRQPRIO_VSX: | 238 | case BOOK3S_IRQPRIO_VSX: |
236 | vec = BOOK3S_INTERRUPT_VSX; | 239 | vec = BOOK3S_INTERRUPT_VSX; |
@@ -261,7 +264,7 @@ int kvmppc_book3s_irqprio_deliver(struct kvm_vcpu *vcpu, unsigned int priority) | |||
261 | #endif | 264 | #endif |
262 | 265 | ||
263 | if (deliver) | 266 | if (deliver) |
264 | kvmppc_inject_interrupt(vcpu, vec, 0ULL); | 267 | kvmppc_inject_interrupt(vcpu, vec, flags); |
265 | 268 | ||
266 | return deliver; | 269 | return deliver; |
267 | } | 270 | } |
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c index 338baf9f6b28..e283e44e9f16 100644 --- a/arch/powerpc/kvm/booke.c +++ b/arch/powerpc/kvm/booke.c | |||
@@ -82,8 +82,9 @@ static void kvmppc_booke_queue_irqprio(struct kvm_vcpu *vcpu, | |||
82 | set_bit(priority, &vcpu->arch.pending_exceptions); | 82 | set_bit(priority, &vcpu->arch.pending_exceptions); |
83 | } | 83 | } |
84 | 84 | ||
85 | void kvmppc_core_queue_program(struct kvm_vcpu *vcpu) | 85 | void kvmppc_core_queue_program(struct kvm_vcpu *vcpu, ulong flags) |
86 | { | 86 | { |
87 | /* BookE does flags in ESR, so ignore those we get here */ | ||
87 | kvmppc_booke_queue_irqprio(vcpu, BOOKE_IRQPRIO_PROGRAM); | 88 | kvmppc_booke_queue_irqprio(vcpu, BOOKE_IRQPRIO_PROGRAM); |
88 | } | 89 | } |
89 | 90 | ||
diff --git a/arch/powerpc/kvm/emulate.c b/arch/powerpc/kvm/emulate.c index 04e317c1bbee..8b0ba0b69c2a 100644 --- a/arch/powerpc/kvm/emulate.c +++ b/arch/powerpc/kvm/emulate.c | |||
@@ -154,7 +154,7 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu) | |||
154 | #else | 154 | #else |
155 | vcpu->arch.esr |= ESR_PTR; | 155 | vcpu->arch.esr |= ESR_PTR; |
156 | #endif | 156 | #endif |
157 | kvmppc_core_queue_program(vcpu); | 157 | kvmppc_core_queue_program(vcpu, SRR1_PROGTRAP); |
158 | advance = 0; | 158 | advance = 0; |
159 | break; | 159 | break; |
160 | 160 | ||