blob: 568494dbbbb5b169581b656ed5126a0164b5a621 [file] [log] [blame]
Christoffer Dall749cf76c2013-01-20 18:28:06 -05001/*
2 * Copyright (C) 2012 - Virtual Open Systems and Columbia University
3 * Author: Christoffer Dall <c.dall@virtualopensystems.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License, version 2, as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 */
Christoffer Dall342cd0a2013-01-20 18:28:06 -050018
19#include <linux/linkage.h>
20#include <linux/const.h>
21#include <asm/unified.h>
22#include <asm/page.h>
Christoffer Dallf7ed45b2013-01-20 18:47:42 -050023#include <asm/ptrace.h>
Christoffer Dall749cf76c2013-01-20 18:28:06 -050024#include <asm/asm-offsets.h>
25#include <asm/kvm_asm.h>
Christoffer Dall342cd0a2013-01-20 18:28:06 -050026#include <asm/kvm_arm.h>
Christoffer Dallf7ed45b2013-01-20 18:47:42 -050027#include <asm/vfpmacros.h>
28#include "interrupts_head.S"
Christoffer Dall342cd0a2013-01-20 18:28:06 -050029
30 .text
31
32__kvm_hyp_code_start:
33 .globl __kvm_hyp_code_start
34
35/********************************************************************
36 * Flush per-VMID TLBs
Christoffer Dallf7ed45b2013-01-20 18:47:42 -050037 *
Marc Zyngier48762762013-01-28 15:27:00 +000038 * void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa);
Christoffer Dallf7ed45b2013-01-20 18:47:42 -050039 *
40 * We rely on the hardware to broadcast the TLB invalidation to all CPUs
41 * inside the inner-shareable domain (which is the case for all v7
42 * implementations). If we come across a non-IS SMP implementation, we'll
43 * have to use an IPI based mechanism. Until then, we stick to the simple
44 * hardware assisted version.
Marc Zyngier48762762013-01-28 15:27:00 +000045 *
46 * As v7 does not support flushing per IPA, just nuke the whole TLB
47 * instead, ignoring the ipa value.
Christoffer Dall342cd0a2013-01-20 18:28:06 -050048 */
Marc Zyngier48762762013-01-28 15:27:00 +000049ENTRY(__kvm_tlb_flush_vmid_ipa)
Christoffer Dallf7ed45b2013-01-20 18:47:42 -050050 push {r2, r3}
51
Marc Zyngier479c5ae2013-06-21 13:08:47 +010052 dsb ishst
Christoffer Dallf7ed45b2013-01-20 18:47:42 -050053 add r0, r0, #KVM_VTTBR
54 ldrd r2, r3, [r0]
Victor Kamensky19b0e602014-06-12 09:30:02 -070055 mcrr p15, 6, rr_lo_hi(r2, r3), c2 @ Write VTTBR
Christoffer Dallf7ed45b2013-01-20 18:47:42 -050056 isb
57 mcr p15, 0, r0, c8, c3, 0 @ TLBIALLIS (rt ignored)
Will Deacone3ab5472013-05-13 12:08:06 +010058 dsb ish
Christoffer Dallf7ed45b2013-01-20 18:47:42 -050059 isb
60 mov r2, #0
61 mov r3, #0
62 mcrr p15, 6, r2, r3, c2 @ Back to VMID #0
63 isb @ Not necessary if followed by eret
64
65 pop {r2, r3}
Christoffer Dalld5d81842013-01-20 18:28:07 -050066 bx lr
Marc Zyngier48762762013-01-28 15:27:00 +000067ENDPROC(__kvm_tlb_flush_vmid_ipa)
Christoffer Dalld5d81842013-01-20 18:28:07 -050068
Mario Smarduch72fc36b2015-01-15 15:58:55 -080069/**
70 * void __kvm_tlb_flush_vmid(struct kvm *kvm) - Flush per-VMID TLBs
71 *
72 * Reuses __kvm_tlb_flush_vmid_ipa() for ARMv7, without passing address
73 * parameter
74 */
75
76ENTRY(__kvm_tlb_flush_vmid)
77 b __kvm_tlb_flush_vmid_ipa
78ENDPROC(__kvm_tlb_flush_vmid)
79
Christoffer Dalld5d81842013-01-20 18:28:07 -050080/********************************************************************
Christoffer Dallf7ed45b2013-01-20 18:47:42 -050081 * Flush TLBs and instruction caches of all CPUs inside the inner-shareable
82 * domain, for all VMIDs
83 *
84 * void __kvm_flush_vm_context(void);
Christoffer Dalld5d81842013-01-20 18:28:07 -050085 */
Christoffer Dall342cd0a2013-01-20 18:28:06 -050086ENTRY(__kvm_flush_vm_context)
Christoffer Dallf7ed45b2013-01-20 18:47:42 -050087 mov r0, #0 @ rn parameter for c15 flushes is SBZ
88
89 /* Invalidate NS Non-Hyp TLB Inner Shareable (TLBIALLNSNHIS) */
90 mcr p15, 4, r0, c8, c3, 4
91 /* Invalidate instruction caches Inner Shareable (ICIALLUIS) */
92 mcr p15, 0, r0, c7, c1, 0
Will Deacone3ab5472013-05-13 12:08:06 +010093 dsb ish
Christoffer Dallf7ed45b2013-01-20 18:47:42 -050094 isb @ Not necessary if followed by eret
95
Christoffer Dall342cd0a2013-01-20 18:28:06 -050096 bx lr
97ENDPROC(__kvm_flush_vm_context)
98
Christoffer Dallf7ed45b2013-01-20 18:47:42 -050099
Christoffer Dall342cd0a2013-01-20 18:28:06 -0500100/********************************************************************
101 * Hypervisor world-switch code
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500102 *
103 *
104 * int __kvm_vcpu_run(struct kvm_vcpu *vcpu)
Christoffer Dall342cd0a2013-01-20 18:28:06 -0500105 */
106ENTRY(__kvm_vcpu_run)
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500107 @ Save the vcpu pointer
108 mcr p15, 4, vcpu, c13, c0, 2 @ HTPIDR
109
110 save_host_regs
111
Marc Zyngier1a89dd92013-01-21 19:36:12 -0500112 restore_vgic_state
Marc Zyngier53e72402013-01-23 13:21:58 -0500113 restore_timer_state
Marc Zyngier1a89dd92013-01-21 19:36:12 -0500114
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500115 @ Store hardware CP15 state and load guest state
116 read_cp15_state store_to_vcpu = 0
117 write_cp15_state read_from_vcpu = 1
118
119 @ If the host kernel has not been configured with VFPv3 support,
120 @ then it is safer if we deny guests from using it as well.
121#ifdef CONFIG_VFPv3
122 @ Set FPEXC_EN so the guest doesn't trap floating point instructions
123 VFPFMRX r2, FPEXC @ VMRS
124 push {r2}
125 orr r2, r2, #FPEXC_EN
126 VFPFMXR FPEXC, r2 @ VMSR
127#endif
128
129 @ Configure Hyp-role
130 configure_hyp_role vmentry
131
132 @ Trap coprocessor CRx accesses
133 set_hstr vmentry
134 set_hcptr vmentry, (HCPTR_TTA | HCPTR_TCP(10) | HCPTR_TCP(11))
135 set_hdcr vmentry
136
137 @ Write configured ID register into MIDR alias
138 ldr r1, [vcpu, #VCPU_MIDR]
139 mcr p15, 4, r1, c0, c0, 0
140
141 @ Write guest view of MPIDR into VMPIDR
142 ldr r1, [vcpu, #CP15_OFFSET(c0_MPIDR)]
143 mcr p15, 4, r1, c0, c0, 5
144
145 @ Set up guest memory translation
146 ldr r1, [vcpu, #VCPU_KVM]
147 add r1, r1, #KVM_VTTBR
148 ldrd r2, r3, [r1]
Victor Kamensky19b0e602014-06-12 09:30:02 -0700149 mcrr p15, 6, rr_lo_hi(r2, r3), c2 @ Write VTTBR
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500150
151 @ We're all done, just restore the GPRs and go to the guest
152 restore_guest_regs
153 clrex @ Clear exclusive monitor
154 eret
155
156__kvm_vcpu_return:
157 /*
158 * return convention:
159 * guest r0, r1, r2 saved on the stack
160 * r0: vcpu pointer
161 * r1: exception code
162 */
163 save_guest_regs
164
165 @ Set VMID == 0
166 mov r2, #0
167 mov r3, #0
168 mcrr p15, 6, r2, r3, c2 @ Write VTTBR
169
170 @ Don't trap coprocessor accesses for host kernel
171 set_hstr vmexit
172 set_hdcr vmexit
Marc Zyngier85e84ba2015-03-16 10:59:43 +0000173 set_hcptr vmexit, (HCPTR_TTA | HCPTR_TCP(10) | HCPTR_TCP(11)), after_vfp_restore
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500174
175#ifdef CONFIG_VFPv3
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500176 @ Switch VFP/NEON hardware state to the host's
177 add r7, vcpu, #VCPU_VFP_GUEST
178 store_vfp_state r7
179 add r7, vcpu, #VCPU_VFP_HOST
180 ldr r7, [r7]
181 restore_vfp_state r7
182
183after_vfp_restore:
184 @ Restore FPEXC_EN which we clobbered on entry
185 pop {r2}
186 VFPFMXR FPEXC, r2
Marc Zyngier85e84ba2015-03-16 10:59:43 +0000187#else
188after_vfp_restore:
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500189#endif
190
191 @ Reset Hyp-role
192 configure_hyp_role vmexit
193
194 @ Let host read hardware MIDR
195 mrc p15, 0, r2, c0, c0, 0
196 mcr p15, 4, r2, c0, c0, 0
197
198 @ Back to hardware MPIDR
199 mrc p15, 0, r2, c0, c0, 5
200 mcr p15, 4, r2, c0, c0, 5
201
202 @ Store guest CP15 state and restore host state
203 read_cp15_state store_to_vcpu = 1
204 write_cp15_state read_from_vcpu = 0
205
Marc Zyngier53e72402013-01-23 13:21:58 -0500206 save_timer_state
Marc Zyngier1a89dd92013-01-21 19:36:12 -0500207 save_vgic_state
208
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500209 restore_host_regs
210 clrex @ Clear exclusive monitor
Victor Kamensky6d7311b2014-06-12 09:30:03 -0700211#ifndef CONFIG_CPU_ENDIAN_BE8
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500212 mov r0, r1 @ Return the return code
213 mov r1, #0 @ Clear upper bits in return value
Victor Kamensky6d7311b2014-06-12 09:30:03 -0700214#else
215 @ r1 already has return code
216 mov r0, #0 @ Clear upper bits in return value
217#endif /* CONFIG_CPU_ENDIAN_BE8 */
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500218 bx lr @ return to IOCTL
Christoffer Dall342cd0a2013-01-20 18:28:06 -0500219
220/********************************************************************
221 * Call function in Hyp mode
222 *
223 *
224 * u64 kvm_call_hyp(void *hypfn, ...);
225 *
226 * This is not really a variadic function in the classic C-way and care must
227 * be taken when calling this to ensure parameters are passed in registers
228 * only, since the stack will change between the caller and the callee.
229 *
230 * Call the function with the first argument containing a pointer to the
231 * function you wish to call in Hyp mode, and subsequent arguments will be
232 * passed as r0, r1, and r2 (a maximum of 3 arguments in addition to the
233 * function pointer can be passed). The function being called must be mapped
234 * in Hyp mode (see init_hyp_mode in arch/arm/kvm/arm.c). Return values are
235 * passed in r0 and r1.
236 *
Marc Zyngierb20c9f22014-02-26 18:47:36 +0000237 * A function pointer with a value of 0xffffffff has a special meaning,
238 * and is used to implement __hyp_get_vectors in the same way as in
239 * arch/arm/kernel/hyp_stub.S.
240 *
Christoffer Dall342cd0a2013-01-20 18:28:06 -0500241 * The calling convention follows the standard AAPCS:
242 * r0 - r3: caller save
243 * r12: caller save
244 * rest: callee save
245 */
246ENTRY(kvm_call_hyp)
247 hvc #0
248 bx lr
249
250/********************************************************************
251 * Hypervisor exception vector and handlers
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500252 *
253 *
254 * The KVM/ARM Hypervisor ABI is defined as follows:
255 *
256 * Entry to Hyp mode from the host kernel will happen _only_ when an HVC
257 * instruction is issued since all traps are disabled when running the host
258 * kernel as per the Hyp-mode initialization at boot time.
259 *
Jonghwan Choi0b5e3ba2013-02-19 15:19:32 +0900260 * HVC instructions cause a trap to the vector page + offset 0x14 (see hyp_hvc
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500261 * below) when the HVC instruction is called from SVC mode (i.e. a guest or the
Jonghwan Choi0b5e3ba2013-02-19 15:19:32 +0900262 * host kernel) and they cause a trap to the vector page + offset 0x8 when HVC
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500263 * instructions are called from within Hyp-mode.
264 *
265 * Hyp-ABI: Calling HYP-mode functions from host (in SVC mode):
266 * Switching to Hyp mode is done through a simple HVC #0 instruction. The
267 * exception vector code will check that the HVC comes from VMID==0 and if
268 * so will push the necessary state (SPSR, lr_usr) on the Hyp stack.
269 * - r0 contains a pointer to a HYP function
270 * - r1, r2, and r3 contain arguments to the above function.
271 * - The HYP function will be called with its arguments in r0, r1 and r2.
272 * On HYP function return, we return directly to SVC.
273 *
274 * Note that the above is used to execute code in Hyp-mode from a host-kernel
275 * point of view, and is a different concept from performing a world-switch and
276 * executing guest code SVC mode (with a VMID != 0).
Christoffer Dall342cd0a2013-01-20 18:28:06 -0500277 */
278
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500279/* Handle undef, svc, pabt, or dabt by crashing with a user notice */
280.macro bad_exception exception_code, panic_str
281 push {r0-r2}
282 mrrc p15, 6, r0, r1, c2 @ Read VTTBR
283 lsr r1, r1, #16
284 ands r1, r1, #0xff
285 beq 99f
286
287 load_vcpu @ Load VCPU pointer
288 .if \exception_code == ARM_EXCEPTION_DATA_ABORT
289 mrc p15, 4, r2, c5, c2, 0 @ HSR
290 mrc p15, 4, r1, c6, c0, 0 @ HDFAR
291 str r2, [vcpu, #VCPU_HSR]
292 str r1, [vcpu, #VCPU_HxFAR]
293 .endif
294 .if \exception_code == ARM_EXCEPTION_PREF_ABORT
295 mrc p15, 4, r2, c5, c2, 0 @ HSR
296 mrc p15, 4, r1, c6, c0, 2 @ HIFAR
297 str r2, [vcpu, #VCPU_HSR]
298 str r1, [vcpu, #VCPU_HxFAR]
299 .endif
300 mov r1, #\exception_code
301 b __kvm_vcpu_return
302
303 @ We were in the host already. Let's craft a panic-ing return to SVC.
30499: mrs r2, cpsr
305 bic r2, r2, #MODE_MASK
306 orr r2, r2, #SVC_MODE
307THUMB( orr r2, r2, #PSR_T_BIT )
308 msr spsr_cxsf, r2
309 mrs r1, ELR_hyp
Russell King58902982015-04-21 14:16:05 +0100310 ldr r2, =panic
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500311 msr ELR_hyp, r2
312 ldr r0, =\panic_str
Marc Zyngier22cfbb62013-06-21 13:08:48 +0100313 clrex @ Clear exclusive monitor
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500314 eret
315.endm
316
317 .text
318
Christoffer Dall342cd0a2013-01-20 18:28:06 -0500319 .align 5
320__kvm_hyp_vector:
321 .globl __kvm_hyp_vector
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500322
323 @ Hyp-mode exception vector
324 W(b) hyp_reset
325 W(b) hyp_undef
326 W(b) hyp_svc
327 W(b) hyp_pabt
328 W(b) hyp_dabt
329 W(b) hyp_hvc
330 W(b) hyp_irq
331 W(b) hyp_fiq
332
333 .align
334hyp_reset:
335 b hyp_reset
336
337 .align
338hyp_undef:
339 bad_exception ARM_EXCEPTION_UNDEFINED, und_die_str
340
341 .align
342hyp_svc:
343 bad_exception ARM_EXCEPTION_HVC, svc_die_str
344
345 .align
346hyp_pabt:
347 bad_exception ARM_EXCEPTION_PREF_ABORT, pabt_die_str
348
349 .align
350hyp_dabt:
351 bad_exception ARM_EXCEPTION_DATA_ABORT, dabt_die_str
352
353 .align
354hyp_hvc:
355 /*
356 * Getting here is either becuase of a trap from a guest or from calling
357 * HVC from the host kernel, which means "switch to Hyp mode".
358 */
359 push {r0, r1, r2}
360
361 @ Check syndrome register
362 mrc p15, 4, r1, c5, c2, 0 @ HSR
363 lsr r0, r1, #HSR_EC_SHIFT
364#ifdef CONFIG_VFPv3
365 cmp r0, #HSR_EC_CP_0_13
366 beq switch_to_guest_vfp
367#endif
368 cmp r0, #HSR_EC_HVC
369 bne guest_trap @ Not HVC instr.
370
371 /*
372 * Let's check if the HVC came from VMID 0 and allow simple
373 * switch to Hyp mode
374 */
375 mrrc p15, 6, r0, r2, c2
376 lsr r2, r2, #16
377 and r2, r2, #0xff
378 cmp r2, #0
379 bne guest_trap @ Guest called HVC
380
381host_switch_to_hyp:
382 pop {r0, r1, r2}
383
Marc Zyngierb20c9f22014-02-26 18:47:36 +0000384 /* Check for __hyp_get_vectors */
385 cmp r0, #-1
386 mrceq p15, 4, r0, c12, c0, 0 @ get HVBAR
387 beq 1f
388
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500389 push {lr}
390 mrs lr, SPSR
391 push {lr}
392
393 mov lr, r0
394 mov r0, r1
395 mov r1, r2
396 mov r2, r3
397
398THUMB( orr lr, #1)
399 blx lr @ Call the HYP function
400
401 pop {lr}
402 msr SPSR_csxf, lr
403 pop {lr}
Marc Zyngierb20c9f22014-02-26 18:47:36 +00004041: eret
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500405
406guest_trap:
407 load_vcpu @ Load VCPU pointer to r0
408 str r1, [vcpu, #VCPU_HSR]
409
410 @ Check if we need the fault information
411 lsr r1, r1, #HSR_EC_SHIFT
412 cmp r1, #HSR_EC_IABT
413 mrceq p15, 4, r2, c6, c0, 2 @ HIFAR
414 beq 2f
415 cmp r1, #HSR_EC_DABT
416 bne 1f
417 mrc p15, 4, r2, c6, c0, 0 @ HDFAR
418
4192: str r2, [vcpu, #VCPU_HxFAR]
420
421 /*
422 * B3.13.5 Reporting exceptions taken to the Non-secure PL2 mode:
423 *
424 * Abort on the stage 2 translation for a memory access from a
425 * Non-secure PL1 or PL0 mode:
426 *
427 * For any Access flag fault or Translation fault, and also for any
428 * Permission fault on the stage 2 translation of a memory access
429 * made as part of a translation table walk for a stage 1 translation,
430 * the HPFAR holds the IPA that caused the fault. Otherwise, the HPFAR
431 * is UNKNOWN.
432 */
433
434 /* Check for permission fault, and S1PTW */
435 mrc p15, 4, r1, c5, c2, 0 @ HSR
436 and r0, r1, #HSR_FSC_TYPE
437 cmp r0, #FSC_PERM
438 tsteq r1, #(1 << 7) @ S1PTW
439 mrcne p15, 4, r2, c6, c0, 4 @ HPFAR
440 bne 3f
441
Marc Zyngier6a077e42013-06-21 13:08:46 +0100442 /* Preserve PAR */
443 mrrc p15, 0, r0, r1, c7 @ PAR
444 push {r0, r1}
445
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500446 /* Resolve IPA using the xFAR */
447 mcr p15, 0, r2, c7, c8, 0 @ ATS1CPR
448 isb
449 mrrc p15, 0, r0, r1, c7 @ PAR
450 tst r0, #1
451 bne 4f @ Failed translation
452 ubfx r2, r0, #12, #20
453 lsl r2, r2, #4
454 orr r2, r2, r1, lsl #24
455
Marc Zyngier6a077e42013-06-21 13:08:46 +0100456 /* Restore PAR */
457 pop {r0, r1}
458 mcrr p15, 0, r0, r1, c7 @ PAR
459
Christoffer Dallf7ed45b2013-01-20 18:47:42 -05004603: load_vcpu @ Load VCPU pointer to r0
461 str r2, [r0, #VCPU_HPFAR]
462
4631: mov r1, #ARM_EXCEPTION_HVC
464 b __kvm_vcpu_return
465
Marc Zyngier6a077e42013-06-21 13:08:46 +01004664: pop {r0, r1} @ Failed translation, return to guest
467 mcrr p15, 0, r0, r1, c7 @ PAR
Marc Zyngier22cfbb62013-06-21 13:08:48 +0100468 clrex
Marc Zyngier6a077e42013-06-21 13:08:46 +0100469 pop {r0, r1, r2}
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500470 eret
471
472/*
473 * If VFPv3 support is not available, then we will not switch the VFP
474 * registers; however cp10 and cp11 accesses will still trap and fallback
475 * to the regular coprocessor emulation code, which currently will
476 * inject an undefined exception to the guest.
477 */
478#ifdef CONFIG_VFPv3
479switch_to_guest_vfp:
480 load_vcpu @ Load VCPU pointer to r0
481 push {r3-r7}
482
483 @ NEON/VFP used. Turn on VFP access.
Marc Zyngier85e84ba2015-03-16 10:59:43 +0000484 set_hcptr vmtrap, (HCPTR_TCP(10) | HCPTR_TCP(11))
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500485
486 @ Switch VFP/NEON hardware state to the guest's
487 add r7, r0, #VCPU_VFP_HOST
488 ldr r7, [r7]
489 store_vfp_state r7
490 add r7, r0, #VCPU_VFP_GUEST
491 restore_vfp_state r7
492
493 pop {r3-r7}
494 pop {r0-r2}
Marc Zyngier22cfbb62013-06-21 13:08:48 +0100495 clrex
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500496 eret
497#endif
498
499 .align
500hyp_irq:
501 push {r0, r1, r2}
502 mov r1, #ARM_EXCEPTION_IRQ
503 load_vcpu @ Load VCPU pointer to r0
504 b __kvm_vcpu_return
505
506 .align
507hyp_fiq:
508 b hyp_fiq
509
510 .ltorg
Christoffer Dall342cd0a2013-01-20 18:28:06 -0500511
512__kvm_hyp_code_end:
513 .globl __kvm_hyp_code_end
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500514
515 .section ".rodata"
516
517und_die_str:
Christoffer Dall1fe40f62013-08-14 12:33:48 -0700518 .ascii "unexpected undefined exception in Hyp mode at: %#08x\n"
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500519pabt_die_str:
Christoffer Dall1fe40f62013-08-14 12:33:48 -0700520 .ascii "unexpected prefetch abort in Hyp mode at: %#08x\n"
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500521dabt_die_str:
Christoffer Dall1fe40f62013-08-14 12:33:48 -0700522 .ascii "unexpected data abort in Hyp mode at: %#08x\n"
Christoffer Dallf7ed45b2013-01-20 18:47:42 -0500523svc_die_str:
Christoffer Dall1fe40f62013-08-14 12:33:48 -0700524 .ascii "unexpected HVC/SVC trap in Hyp mode at: %#08x\n"