aboutsummaryrefslogtreecommitdiffstats
path: root/extras/mini-os/arch/ia64/ivt.S
diff options
context:
space:
mode:
Diffstat (limited to 'extras/mini-os/arch/ia64/ivt.S')
-rw-r--r--extras/mini-os/arch/ia64/ivt.S774
1 files changed, 0 insertions, 774 deletions
diff --git a/extras/mini-os/arch/ia64/ivt.S b/extras/mini-os/arch/ia64/ivt.S
deleted file mode 100644
index 863a498213..0000000000
--- a/extras/mini-os/arch/ia64/ivt.S
+++ /dev/null
@@ -1,774 +0,0 @@
-/*
- * Copyright (c) 2007 Dietmar Hahn <dietmar.hahn@fujitsu-siemens.com>
- * Description: ia64 specific trap handling.
- *
- ****************************************************************************
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- */
-
-
-#include <mini-os/asm.h>
-#include <mini-os/page.h>
-#include <mini-os/ia64_cpu.h>
-#include <mini-os/privop.h>
-#include <mini-os/offsets.h>
-
-
-/* General register usage in interrupt handling:
- * r16, r17, ... are used for input parameters of sub-routines
- * r29: used to access memory which may raise nested TLB fault
- * r30: b0 save register
- * r31: predicates save register
- * p30,p31: used for TLB stuff: (0,1)=data, (1,0)=instruction
- */
-
-
-#define FILL_FP_PAIR(f1, f2, b1, b2) \
- ldf.fill f1=[b1],32 ;\
- ldf.fill f2=[b2],32 ;\
- ;;
-
-#define SPILL_FP_PAIR(f1, f2, b1, b2) \
- stf.spill [b1]=f1,32 ;\
- stf.spill [b2]=f2,32 ;\
- ;;
-
-#define FILL_REG_PAIR(r1, r2, b1, b2) \
- ld8.fill r1=[b1],16 ;\
- ld8.fill r2=[b2],16 ;\
- ;;
-
-#define SPILL_REG_PAIR(r1, r2, b1, b2) \
- .mem.offset 0,0 ;\
- st8.spill [b1]=r1,16 ;\
- .mem.offset 8,0 ;\
- st8.spill [b2]=r2,16 ;\
- ;;
-
-
-/**
- * The function does a store of the current processor context
- * to the given exception frame address.
- * These are some special and the scratch registers for calling
- * C-functions later.
- * The bspstore will be the same. A clean RSE is made with the
- * cover instruction.
- *
- * The return is done through a jump to the next bundle after ip (r16).
- *
- * Used register: r16, r18, r19, r20, r21, r22 of bank 0
- *
- * @param: r16 ip of the bundle with the jump.
- * @param: r18 pointer to the trap frame.
- * @param: r23 trap number/err val
- *
- */
-
-ENTRY(save_tf_rse_switch)
- movl r21=XSI_IPSR // XEN !!
- movl r22=XSI_IIP // XEN !!
- ;;
- ld8 r21=[r21] // XEN.ipsr
- ld8 r22=[r22];; // XEN.iip
- add r19=TF_IPSR,r18
- add r20=TF_IIP,r18
- ;;
- st8 [r19]=r21 // store cr.ipsr
- st8 [r20]=r22 // store cr.iip
- ;;
- //// r16 return jump pointer, r18 - trap frame base,
- add r19=TF_UNAT,r18
- mov r20=ar.unat
- ;;
- st8 [r19]=r20 // store scratch unat
- ;;
-
- add r19=TF_GP,r18
- add r20=TF_SP,r18
- ;;
- st8 [r19]=gp,TF_TP-TF_GP // store gp
- st8 [r20]=sp,TF_PR-TF_SP // store sp
- mov r21=pr
- ;;
- st8 [r19]=r13 // store tp
- st8 [r20]=r21 // store pr
- ;;
- add r19=TF_GREG2,r18 // Now first general regs.
- add r20=TF_GREG3,r18
- ;;
- SPILL_REG_PAIR( r2, r3,r19,r20)
- SPILL_REG_PAIR( r8, r9,r19,r20)
- SPILL_REG_PAIR(r10,r11,r19,r20)
- SPILL_REG_PAIR(r14,r15,r19,r20)
- ;;
- mov r14=r18 // move trap frame base for bsw
- mov r15=r16 // save return address
- ;;
- //bsw.1 // switch to bank 1 for saving these registers.
- movl r30=XSI_BANKNUM // Switch to bank 1.
- mov r31=1;;
- st4 [r30]=r31
- ;;
- /*
- * On XEN the hypervisor has stored the bank 1 registers
- * r16-r31. I must reload these registers here to get
- * access.
- */
- movl r30=XSI_BANK1_R16;
- movl r31=XSI_BANK1_R16+8;;
- ld8 r16=[r30],16; ld8 r17=[r31],16;;
- ld8 r18=[r30],16; ld8 r19=[r31],16;;
- ld8 r20=[r30],16; ld8 r21=[r31],16;;
- ld8 r22=[r30],16; ld8 r23=[r31],16;;
- ld8 r24=[r30],16; ld8 r25=[r31],16;;
- ld8 r26=[r30],16; ld8 r27=[r31],16;;
- ld8 r28=[r30],16; ld8 r29=[r31],16;;
- ld8 r30=[r30]; ld8 r31=[r31];;
- add r2=TF_GREG16,r14
- add r3=TF_GREG17,r14
- ;;
- SPILL_REG_PAIR(r16,r17,r2,r3)
- SPILL_REG_PAIR(r18,r19,r2,r3)
- SPILL_REG_PAIR(r20,r21,r2,r3)
- SPILL_REG_PAIR(r22,r23,r2,r3)
- SPILL_REG_PAIR(r24,r25,r2,r3)
- SPILL_REG_PAIR(r26,r27,r2,r3)
- SPILL_REG_PAIR(r28,r29,r2,r3)
- SPILL_REG_PAIR(r30,r31,r2,r3)
- ;;
- //bsw.0 // back to interrupt bank 0
- movl r2=XSI_BANKNUM;;
- st4 [r2]=r0
- ;;
- mov r18=r14 // restore context pointer
- mov r16=r15 // restore return address
- ;;
- //// r16 return jump pointer, r18 - trap frame base,
- add r19=TF_CCV,r18
- add r20=TF_CSD,r18
- mov r21=ar.ccv
- mov r22=ar.csd
- ;;
- st8 [r19]=r21 // ar.ccv
- st8 [r20]=r22 // ar.csd
- ;;
- add r19=TF_SSD,r18
- mov r21=ar.ssd
- ;;
- st8 [r19]=r21 // ar.ssd
- ;;
- add r19=TF_FREG6,r18
- add r20=TF_FREG7,r18
- ;;
- SPILL_FP_PAIR(f6, f7, r19, r20)
- SPILL_FP_PAIR(f8, f9, r19, r20)
- SPILL_FP_PAIR(f10, f11, r19, r20)
-
- add r19=TF_BREG0,r18 // b0, b6, b7
- add r20=TF_BREG6,r18
- mov r21=b0
- mov r22=b6
- ;;
- st8 [r19]=r21,TF_BREG7-TF_BREG0 // store b0
- st8 [r20]=r22,16 // store b6
- ;;
- mov r21=b7
- ;;
- st8 [r19]=r21 // store b7
-
- //// r16 return jump pointer, r18 - trap frame base,
-
- // Read and save RSC, PFS
- add r19=TF_PFS,r18
- add r20=TF_RSC,r18
- mov r21=ar.pfs
- mov r22=ar.rsc
- ;;
-{ .mmb
- st8 [r19]=r21 // store ar.pfs
- st8 [r20]=r22 // store ar.rsc
- // Issue cover instruction
- cover // must be the last instruction in bundle
- //XEN_HYPER_COVER
- ;;
-}
- // Read and save IFS
- add r19=TF_IFS,r18
- add r20=TF_CFM,r18
- /* xen special handling for possibly lazy cover */
- movl r8=XSI_PRECOVER_IFS;
- ;;
- ld8 r21=[r8]
- ;;
- st8 [r19]=r21 // store cr.ifs
- dep.z r22=r21,0,38 // copy ifm part from ifs.ifm
- ;;
- st8 [r20]=r22 // store cfm
- // RSE in enforced lazy mode
- mov ar.rsc=IA64_RSE_LAZY
- ;;
- // Read and save BSPSTORE and RNAT
- add r19=TF_BSP,r18
- add r20=TF_RNAT,r18
- mov r21=ar.bspstore
- mov r22=ar.rnat
- ;;
- st8 [r19]=r21 // store ar.bspstore
- st8 [r20]=r22 // store ar.rnat
- ;;
- // Write new BSPSTORE
- //mov r21=ar.bsp
- //;;
- mov r22=r21 // new bspstore equal to old
- ;;
- mov ar.bspstore=r22 // the new bspstore
- ;;
- // Read and save the new BSP for calculating number of dirty regs.
- mov r21=ar.bsp
- ;;
- sub r21=r21,r22 // r21 -> ndirty
- add r19=TF_NDIRTY-TF_BSP,r19 // TF_NDIRTY pos in r19
- ;;
- st8 [r19]=r21 // store ndirty
- ;;
- mov ar.rsc=IA64_RSE_EAGER // RSE on again
- ;;
- add r19=TF_FPSR,r18
- ;;
- mov r21=ar.fpsr
- ;;
- st8 [r19]=r21 // ar.fpsr
- ;;
- //// r16 return jump pointer, r18 - trap frame base,
- // Load the gp with our module __gp
- movl gp=__gp
- ;;
- add r16=16,r16 // for jump to next bundle
- ;;
- mov b7=r16
- ;;
-
-{ .mfb
- srlz.d
- nop 0
- br.sptk b7
- ;;
-}
-
-END(save_tf_rse_switch)
-
-
-/**
- * The function reloads the processor context stored in
- * save_tf_rse_switch().
- *
- * On calling the function the bank 0 must be activ.
- * The return is done through a rfi.
- * Used register: b7, r16, r18, r19, r20, r21, r22 of bank 0
- *
- * @param: r18 pointer to the exception frame
- *
- */
-ENTRY(restore_tf_rse_switch)
- add r19=TF_IPSR,r18
- add r20=TF_IIP,r18
- ;;
- ld8 r21=[r19] // load cr.ipsr
- ld8 r22=[r20] // load cr.iip
- movl r16=XSI_IPSR // XEN !!
- ;;
- st8 [r16]=r21,XSI_IIP_OFS-XSI_IPSR_OFS // XEN.ipsr
- mov r2=r21 // save for fp stuff below
- ;;
- st8 [r16]=r22 // XEN.iip
- ;;
- //// r18 - trap frame base
- // Allocate a zero sized frame
- alloc r30=ar.pfs,0,0,0,0 // discard current frame
- ;;
- // calc number of dirty regs and put this into rsc.loardrs
- add r19=TF_NDIRTY,r18
- ;;
- ld8 r22=[r19] // ndirty
- ;;
- shl r21=r22,16 // value for ar.rsc
- ;;
- mov ar.rsc=r21 // setup for loadrs
- ;;
- // Issue a loadrs instruction
-{ .mmi
- loadrs // must be the first instruction
- ;;
- nop 0x0
- nop 0x0
-}
- // Restore BSPSTORE from interrupted context
- add r19=TF_BSP,r18
- add r20=TF_RNAT,r18
- ;;
- ld8 r21=[r19] // load ar.bspstore
- ld8 r22=[r20] // load ar.rnat
- ;;
- mov ar.bspstore=r21 // set ar.bspstore
- ;;
- // Restore RNAT
- mov ar.rnat=r22 // set ar.rnat
- ;;
- // Restore PFS and IFS
- add r19=TF_PFS,r18
- add r20=TF_IFS,r18
- movl r16=XSI_IFS // XEN !!
- ;;
- ld8 r21=[r19] // load ar.pfs
- ld8 r22=[r20] // load cr.ifs
- ;;
- add r19=TF_RSC,r18
- mov ar.pfs=r21
- st8 [r16]=r22 // XEN.ifs
- ;;
- // Restore RSC
- ld8 r21=[r19] // load ar.rsc
- ;;
- mov ar.rsc=r21 // set ar.rsc
- //// r18 - trap frame base
- add r19=TF_GP,r18
- add r20=TF_SP,r18
- ;;
- ld8 gp=[r19],TF_TP-TF_GP // load gp
- ld8 sp=[r20],TF_PR-TF_SP // load sp
- ;;
- ld8 r13=[r19] // load tp
- ld8 r21=[r20] // load pr
- ;;
- mov pr=r21,-1 // set pr
- ;;
- add r19=TF_BREG0,r18
- add r20=TF_BREG6,r18
- ;;
- ld8 r21=[r19],TF_BREG7-TF_BREG0 // load b0
- ld8 r22=[r20],16 // load b6
- ;;
- mov b0=r21
- mov b6=r22
- ;;
- ld8 r21=[r19] // load b7
- ld8 r22=[r20],16 // load b3
- ;;
- mov b7=r21
- //// r18 - trap frame base
- mov r14=r18 // Save the context pointer
- ;;
- // bsw.1
- movl r30=XSI_BANKNUM // Switch to bank 1.
- mov r31=1;;
- st4 [r30]=r31
- ;;
- add r2=TF_GREG16,r14
- add r3=TF_GREG17,r14
- ;;
- FILL_REG_PAIR(r16,r17,r2,r3)
- FILL_REG_PAIR(r18,r19,r2,r3)
- FILL_REG_PAIR(r20,r21,r2,r3)
- FILL_REG_PAIR(r22,r23,r2,r3)
- FILL_REG_PAIR(r24,r25,r2,r3)
- FILL_REG_PAIR(r26,r27,r2,r3)
- FILL_REG_PAIR(r28,r29,r2,r3)
- FILL_REG_PAIR(r30,r31,r2,r3)
-
- /*
- * On XEN I have to store the bank 1 register into the
- * global XSI_... area.
- */
- // r16-r31 all now hold bank1 values
- movl r2=XSI_BANK1_R16
- movl r3=XSI_BANK1_R16+8
- ;;
- .mem.offset 0,0; st8.spill [r2]=r16,16
- .mem.offset 8,0; st8.spill [r3]=r17,16
- ;;
- .mem.offset 0,0; st8.spill [r2]=r18,16
- .mem.offset 8,0; st8.spill [r3]=r19,16
- ;;
- .mem.offset 0,0; st8.spill [r2]=r20,16
- .mem.offset 8,0; st8.spill [r3]=r21,16
- ;;
- .mem.offset 0,0; st8.spill [r2]=r22,16
- .mem.offset 8,0; st8.spill [r3]=r23,16
- ;;
- .mem.offset 0,0; st8.spill [r2]=r24,16
- .mem.offset 8,0; st8.spill [r3]=r25,16
- ;;
- .mem.offset 0,0; st8.spill [r2]=r26,16
- .mem.offset 8,0; st8.spill [r3]=r27,16
- ;;
- .mem.offset 0,0; st8.spill [r2]=r28,16
- .mem.offset 8,0; st8.spill [r3]=r29,16
- ;;
- .mem.offset 0,0; st8.spill [r2]=r30,16
- .mem.offset 8,0; st8.spill [r3]=r31,16
- ;;
- // bsw.0
- movl r2=XSI_BANKNUM;;
- st4 [r2]=r0;
-
- mov r18=r14 // Move back the context pointer
- ;;
- add r19=TF_GREG2,r18
- add r20=TF_GREG3,r18
- ;;
- FILL_REG_PAIR( r2, r3,r19,r20)
- FILL_REG_PAIR( r8, r9,r19,r20)
- FILL_REG_PAIR(r10,r11,r19,r20)
- FILL_REG_PAIR(r14,r15,r19,r20)
-
- //// r18 - trap frame base,
-
- add r19=TF_CCV,r18
- add r20=TF_CSD,r18
- ;;
- ld8 r21=[r19] // ar.ccv
- ld8 r22=[r20] // ar.csd
- ;;
- mov ar.ccv=r21
- mov ar.csd=r22
- add r19=TF_SSD,r18
- ;;
- ld8 r21=[r19] // ar.ssd
- ;;
- mov ar.ssd=r21
- add r19=TF_FREG6,r18
- add r20=TF_FREG7,r18
- ;;
- FILL_FP_PAIR(f6, f7, r19, r20)
- FILL_FP_PAIR(f8, f9, r19, r20)
- FILL_FP_PAIR(f10, f11, r19, r20)
- add r19=TF_FPSR,r18
- ;;
- ld8 r21=[r19] // ar.fpsr
- ;;
- mov ar.fpsr=r21
- add r19=TF_UNAT,r18
- ;;
- ld8 r21=[r19]
- ;;
- mov ar.unat=r21
- ;;
- srlz.i
- ;;
- //rfi
- XEN_HYPER_RFI;
- ;;
-END(restore_tf_rse_switch)
-
-
-ENTRY(save_special_regs)
- alloc loc0=ar.pfs,1,7,0,0
- movl loc1=XSI_IFA // XEN !!
- movl loc2=XSI_ISR // XEN !!
- ;;
- ld8 loc3=[loc1],XSI_IIM_OFS-XSI_IFA_OFS // load XEN.ifa
- ld8 loc4=[loc2],XSI_IIPA_OFS-XSI_ISR_OFS // load XEN.isr
- add loc5=TF_IFA,in0
- add loc6=TF_ISR,in0
- ;;
- st8 [loc5]=loc3,TF_IIM-TF_IFA // store cr.ifa
- st8 [loc6]=loc4 // store cr.isr
- ;;
- ld8 loc3=[loc1] // load XEN.iim
- ;;
- st8 [loc5]=loc3 // store cr.iim
- ;;
- mov ar.pfs=loc0
- ;;
- br.ret.sptk.few rp
-END(save_special_regs)
-
-
-ENTRY(hypervisor_callback)
- /*
- * Use the thread stack here for storing the trap frame.
- * It's not wired mapped, so nested data tlb faults may occur!
- */
- add r18=-TF_SIZE,sp
- ;;
-{ .mib
- nop 0x02
- mov r16=ip // for jump back from save_tf_rse_switch
- br.sptk save_tf_rse_switch
- ;;
-}
- add sp=-16,r18 // the new stack
- alloc r15=ar.pfs,0,0,1,0 // 1 out for do_hypervisor_callback
- ;;
- mov out0=r18 // the trap frame
- movl r22=XSI_PSR_IC
- mov r23=1;;
- st8 [r22]=r23 // ssm psr.ic
- ;;
- br.call.sptk.few rp = do_hypervisor_callback
-
- movl r22=XSI_PSR_IC
- ;;
- st4 [r22]=r0 // rsm psr.ic
- add r18=16,sp // load EF-pointer again
- ;;
- // must have r18-efp, calls rfi at the end.
- br.sptk restore_tf_rse_switch
- ;;
-END(hypervisor_callback)
-
- /*
- * In: r30 - trap number
- */
-ENTRY(trap_error)
- // Calculate the stack address for storing.
- add r18=-TF_SIZE,sp
- ;;
- add r20=TF_TRAP_NUM,r18
- ;;
- st2 [r20]=r30 // save trap number
- ;;
-
-{ .mib
- nop 0x02
- mov r16=ip // for jumping back from save_tf_rse_switch
- // Used register: r16, r18, r19, r20, r21, r22 of bank 0
- br.sptk save_tf_rse_switch
- ;;
-}
-
- alloc r15=ar.pfs,0,0,1,0 // 1 out for do_trap_error
- ;;
- mov out0=r18 // the trap frame
- add sp=-16,r18 // C-call abi
- ;;
- movl r30=XSI_BANKNUM // bsw.1
- mov r31=1;;
- st4 [r30]=r31;;
-
- /* Save extra interrupt registers to the trap frame. */
- br.call.sptk.few rp = save_special_regs
- ;;
-
- movl r22=XSI_PSR_IC
- movl r23=XSI_PSR_I_ADDR
- ;;
- ld8 r23=[r23]
- mov r25=1
- ;;
- st4 [r22]=r25 // ssm psr.ic
- st1 [r23]=r0 // ssm psr.i
- ;;
-
- br.call.sptk.few rp = do_trap_error
- ;;
- // --> currently not reached!!!
- movl r23=XSI_PSR_I_ADDR
- movl r22=XSI_PSR_IC
- ;;
- ld8 r23=[r23]
- mov r25=1
- ;;
- st1 [r23]=r25
- st4 [r22]=r0 // note: clears both vpsr.i and vpsr.ic!
- ;;
- bsw.0
- ;;
- add r18=16,sp // load EF-pointer again
- ;;
- mov sp=r18
- // must have r18-efp, calls rfi at the end.
- br.sptk restore_tf_rse_switch
- ;;
-END(trap_error)
-
-
-/*
- * The trap handler stuff.
- */
-
-#define TRAP_ERR(num) \
- mov r30 = num; \
- ;; ; \
- br.sptk trap_error \
- ;;
-
-#define IVT_ENTRY(name, offset) \
- .org ia64_trap_table + offset; \
- .global hivt_##name; \
- .proc hivt_##name; \
- .prologue; \
- .body; \
-hivt_##name:
-
-#define IVT_END(name) \
- .endp hivt_##name; \
- .align 0x100
-
-#define IVT_ERR(name, num, offset) \
- IVT_ENTRY(name, offset); \
- TRAP_ERR(num); \
- IVT_END(name)
-/*
- * The IA64 Interrupt Vector Table (IVT) contains 20 slots with 64
- * bundles per vector and 48 slots with 16 bundles per vector.
- */
-
- .section .text.hivt,"ax"
- .align 32768
- .global ia64_trap_table
- .size ia64_trap_table, 32768
-ia64_trap_table:
-
-IVT_ERR(VHPT_Translation, 0, 0x0)
-IVT_ERR(Instruction_TLB, 1, 0x0400)
-IVT_ERR(Data_TLB, 2, 0x0800)
-IVT_ERR(Alternate_Instruction_TLB, 3, 0x0c00)
-
-
-IVT_ENTRY(Alternate_Data_TLB, 0x1000)
- mov r30=4 // trap number
-adt_common:
- mov r16=cr.ifa // where did it happen
- mov r31=pr // save predicates
- ;;
- extr.u r17=r16,IA64_RR_IDX_POS,3 // get region number
- ;;
- cmp.eq p14,p15=7,r17
- ;;
-//(p14) br.sptk adt_regf_addr // Check for region 7 - phys addresses
-// ;;
-// br.sptk trap_error
-// // No return
-//
-//adt_regf_addr:
-// extr.u r17=r16,60,4 // get region number
-// ;;
-// cmp.eq p14,p15=0xf,r17
-// ;;
-(p14) br.sptk adt_reg7_addr // Check for region 7 - phys addresses
- ;;
- br.sptk trap_error
-
-adt_reg7_addr:
- /*
- * region 7 addresses are only directly mapped physically
- * addresses. Currently I don't do a check.
- */
- movl r20=~((7 << IA64_RR_IDX_POS) | 0xfff)
- movl r18=((PTE_PS_16K<<IA64_ITIR_PS)|(IA64_KEY_REG7<<IA64_ITIR_KEY))
- ;;
- movl r19= ((1<<PTE_OFF_P) | (PTE_MA_WB<<PTE_OFF_MA) | \
- (1<<PTE_OFF_A) | (1<<PTE_OFF_D) | \
- (PTE_PL_KERN<<PTE_OFF_PL) | (PTE_AR_RW<<PTE_OFF_AR))
- // clear the region bits and 0-11
- // extract the pfn from the ifa
- mov cr.itir=r18
- and r20=r20, r16
- ;;
- or r20=r20,r19 // put pfn into pte
- ;;
- mov pr=r31,-1 // restore predicates
- itc.d r20
- ;;
- XEN_HYPER_RFI;
- ;;
-
-IVT_END(Alternate_Data_TLB)
-
-/*
- * Handling of nested data tlb is needed, because in hypervisor_callback()
- * the stack is used to store the register trap frame. This stack is allocated
- * dynamically (as identity mapped address) and therewidth no tr mapped page!
- */
-IVT_ENTRY(Data_Nested_TLB, 0x1400)
-
- mov r30=5 // trap number
- add r28=-TF_SIZE,sp // r28 is never used in trap handling
- ;;
- mov cr.ifa=r28
- ;;
- br.sptk adt_common
-IVT_END(Data_Nested_TLB)
-
-
-
-IVT_ERR(Instruction_Key_Miss, 6, 0x1800)
-IVT_ERR(Data_Key_Miss, 7, 0x1c00)
-IVT_ERR(Dirty_Bit, 8, 0x2000)
-IVT_ERR(Instruction_Access_Bit, 9, 0x2400)
-IVT_ERR(Data_Access_Bit, 10, 0x2800)
-IVT_ERR(Break_Instruction, 11, 0x2c00)
-IVT_ERR(External_Interrupt, 12, 0x3000)
-IVT_ERR(Reserved_3400, 13, 0x3400)
-IVT_ERR(Reserved_3800, 14, 0x3800)
-IVT_ERR(Reserved_3c00, 15, 0x3c00)
-IVT_ERR(Reserved_4000, 16, 0x4000)
-IVT_ERR(Reserved_4400, 17, 0x4400)
-IVT_ERR(Reserved_4800, 18, 0x4800)
-IVT_ERR(Reserved_4c00, 19, 0x4c00)
-IVT_ERR(Page_Not_Present, 20, 0x5000)
-IVT_ERR(Key_Permission, 21, 0x5100)
-IVT_ERR(Instruction_Access_Rights, 22, 0x5200)
-IVT_ERR(Data_Access_Rights, 23, 0x5300)
-IVT_ERR(General_Exception, 24, 0x5400)
-IVT_ERR(Disabled_FP_Register, 25, 0x5500)
-IVT_ERR(NaT_Consumption, 26, 0x5600)
-IVT_ERR(Speculation, 27, 0x5700)
-IVT_ERR(Reserved_5800, 28, 0x5800)
-IVT_ERR(Debug, 29, 0x5900)
-IVT_ERR(Unaligned_Reference, 30, 0x5a00)
-IVT_ERR(Unsupported_Data_Reference, 31, 0x5b00)
-IVT_ERR(Floating_Point_Fault, 32, 0x5c00)
-IVT_ERR(Floating_Point_Trap, 33, 0x5d00)
-IVT_ERR(Lower_Privilege_Transfer_Trap, 34, 0x5e00)
-IVT_ERR(Taken_Branch_Trap, 35, 0x5f00)
-IVT_ERR(Single_Step_Trap, 36, 0x6000)
-IVT_ERR(Reserved_6100, 37, 0x6100)
-IVT_ERR(Reserved_6200, 38, 0x6200)
-IVT_ERR(Reserved_6300, 39, 0x6300)
-IVT_ERR(Reserved_6400, 40, 0x6400)
-IVT_ERR(Reserved_6500, 41, 0x6500)
-IVT_ERR(Reserved_6600, 42, 0x6600)
-IVT_ERR(Reserved_6700, 43, 0x6700)
-IVT_ERR(Reserved_6800, 44, 0x6800)
-IVT_ERR(IA_32_Exception, 45, 0x6900)
-IVT_ERR(IA_32_Intercept, 46, 0x6a00)
-IVT_ERR(IA_32_Interrupt, 47, 0x6b00)
-IVT_ERR(Reserved_6c00, 48, 0x6c00)
-IVT_ERR(Reserved_6d00, 49, 0x6d00)
-IVT_ERR(Reserved_6e00, 50, 0x6e00)
-IVT_ERR(Reserved_6f00, 51, 0x6f00)
-IVT_ERR(Reserved_7000, 52, 0x7000)
-IVT_ERR(Reserved_7100, 53, 0x7100)
-IVT_ERR(Reserved_7200, 54, 0x7200)
-IVT_ERR(Reserved_7300, 55, 0x7300)
-IVT_ERR(Reserved_7400, 56, 0x7400)
-IVT_ERR(Reserved_7500, 57, 0x7500)
-IVT_ERR(Reserved_7600, 58, 0x7600)
-IVT_ERR(Reserved_7700, 59, 0x7700)
-IVT_ERR(Reserved_7800, 60, 0x7800)
-IVT_ERR(Reserved_7900, 61, 0x7900)
-IVT_ERR(Reserved_7a00, 62, 0x7a00)
-IVT_ERR(Reserved_7b00, 63, 0x7b00)
-IVT_ERR(Reserved_7c00, 64, 0x7c00)
-IVT_ERR(Reserved_7d00, 65, 0x7d00)
-IVT_ERR(Reserved_7e00, 66, 0x7e00)
-IVT_ERR(Reserved_7f00, 67, 0x7f00)