summaryrefslogtreecommitdiffstats
path: root/sys/ia64/ia64/exception.S
diff options
context:
space:
mode:
Diffstat (limited to 'sys/ia64/ia64/exception.S')
-rw-r--r--sys/ia64/ia64/exception.S220
1 files changed, 172 insertions, 48 deletions
diff --git a/sys/ia64/ia64/exception.S b/sys/ia64/ia64/exception.S
index 5a15270..4a927e7 100644
--- a/sys/ia64/ia64/exception.S
+++ b/sys/ia64/ia64/exception.S
@@ -50,63 +50,185 @@ __FBSDID("$FreeBSD$");
.section .ivt.data, "aw"
+ .align 8
.global ia64_kptdir
+ .size ia64_kptdir, 8
ia64_kptdir: data8 0
-#ifdef EXCEPTION_TRACING
+#ifdef XTRACE
- .global xtrace, xhead
-xtrace: .space 1024*5*8
-xhead: data8 xtrace
+ .align 8
+ .global ia64_xtrace_mask
+ .size ia64_xtrace_mask, 8
+ia64_xtrace_mask: data8 0
-#define XTRACE(offset) \
-{ .mmi ; \
- mov r24=ar.itc ; \
- mov r25=cr.iip ; \
- mov r27=offset ; \
-} ; \
-{ .mlx ; \
- mov r28=cr.ifa ; \
- movl r29=xhead ;; \
-} ; \
-{ .mmi ; \
- ld8 r29=[r29] ;; \
- st8 [r29]=r24,8 ; \
- nop 0 ;; \
-} ; \
-{ .mmi ; \
- st8 [r29]=r27,8 ;; \
- mov r24=cr.isr ; \
- add r27=8,r29 ;; \
-} ; \
-{ .mmi ; \
- st8 [r29]=r25,16 ;; \
- st8 [r27]=r28,16 ; \
- mov r25=pr ;; \
+ .align 4
+ .global ia64_xtrace_enabled
+ .size ia64_xtrace_enabled, 4
+ia64_xtrace_enabled: data4 0
+
+#define XTRACE_HOOK(offset) \
+{ .mii ; \
+ nop 0 ; \
+ mov r31 = b7 ; \
+ mov r28 = pr ; \
} ; \
-{ .mlx ; \
- st8 [r29]=r24 ; \
- movl r28=xhead ;; \
+{ .mib ; \
+ nop 0 ; \
+ mov r25 = ip ; \
+ br.sptk ia64_xtrace_write ;; \
} ; \
{ .mii ; \
- cmp.eq p15,p0=r27,r28 ; \
- addl r29=1024*5*8,r0 ;; \
-(p15) sub r27=r28,r29 ;; \
-} ; \
-{ .mmi ; \
- st8 [r28]=r27 ; \
- nop 0 ; \
- mov pr=r25,0x1ffff ;; \
+ nop 0 ; \
+ mov b7 = r31 ; \
+ mov pr = r28, 0x1ffff ;; \
}
-#else
+ .section .ivt.text, "ax"
-#define XTRACE(offset)
+// We can only use r25, r26 & r27
+ENTRY_NOPROFILE(ia64_xtrace_write, 0)
+{ .mlx
+ add r25 = 16, r25
+ movl r26 = ia64_xtrace_enabled
+ ;;
+}
+{ .mmi
+ mov r27 = ar.k3
+ ld4 r26 = [r26]
+ mov b7 = r25
+ ;;
+}
+{ .mib
+ add r25 = -32, r25
+ cmp.eq p15,p0 = r0, r26
+(p15) br.dptk.few b7
+ ;;
+}
+{ .mib
+ nop 0
+ cmp.eq p15,p0 = r0, r27
+(p15) br.dptk.few b7
+ ;;
+}
+{ .mmi
+ st8 [r27] = r25, 8 // 0x00 IVT
+ mov r26 = ar.itc
+ nop 0
+ ;;
+}
+{ .mmi
+ st8 [r27] = r26, 8 // 0x08 ITC
+ mov r25 = cr.iip
+ nop 0
+ ;;
+}
+{ .mmi
+ st8 [r27] = r25, 8 // 0x10 IIP
+ mov r26 = cr.ifa
+ nop 0
+ ;;
+}
+{ .mmi
+ st8 [r27] = r26, 8 // 0x18 IFA
+ mov r25 = cr.isr
+ nop 0
+ ;;
+}
+{ .mmi
+ st8 [r27] = r25, 8 // 0x20 ISR
+ mov r26 = cr.ipsr
+ nop 0
+ ;;
+}
+{ .mmi
+ st8 [r27] = r26, 8 // 0x28 IPSR
+ mov r25 = cr.itir
+ nop 0
+ ;;
+}
+{ .mmi
+ st8 [r27] = r25, 8 // 0x30 ITIR
+ mov r26 = cr.iipa
+ nop 0
+ ;;
+}
+{ .mmi
+ st8 [r27] = r26, 8 // 0x38 IIPA
+ mov r25 = cr.ifs
+ nop 0
+ ;;
+}
+{ .mmi
+ st8 [r27] = r25, 8 // 0x40 IFS
+ mov r26 = cr.iim
+ nop 0
+ ;;
+}
+{ .mmi
+ st8 [r27] = r26, 8 // 0x48 IIM
+ mov r25 = cr.iha
+ nop 0
+ ;;
+}
+{ .mmi
+ st8 [r27] = r25, 8 // 0x50 IHA
+ mov r26 = ar.unat
+ nop 0
+ ;;
+}
+{ .mmi
+ st8 [r27] = r26, 8 // 0x58 UNAT
+ mov r25 = ar.rsc
+ nop 0
+ ;;
+}
+{ .mmi
+ st8 [r27] = r25, 8 // 0x60 RSC
+ mov r26 = ar.bsp
+ nop 0
+ ;;
+}
+{ .mmi
+ st8 [r27] = r26, 8 // 0x68 BSP
+ mov r25 = r13
+ nop 0
+ ;;
+}
+{ .mmi
+ st8 [r27] = r25, 8 // 0x70 PCPU/TLS
+ mov r26 = r12
+ nop 0
+ ;;
+}
+{ .mlx
+ st8 [r27] = r26, 8 // 0x78 SP
+ movl r25 = ia64_xtrace_mask
+ ;;
+}
+{ .mmi
+ ld8 r26 = [r25]
+ ;;
+ and r25 = r27, r26
+ nop 0
+ ;;
+}
+{ .mib
+ mov ar.k3 = r25
+ nop 0
+ br.sptk b7
+ ;;
+}
+END(ia64_xtrace_write)
-#endif
+#else /* XTRACE */
+
+#define XTRACE_HOOK(offset)
.section .ivt.text, "ax"
+#endif /* XTRACE */
+
/*
* exception_save: save interrupted state
*
@@ -632,6 +754,7 @@ ENTRY_NOPROFILE(exception_restore, 0)
ssm psr.dt
;;
srlz.d
+ mov r16 = r25
exception_restore_restart:
{ .mmi
@@ -649,20 +772,21 @@ exception_restore_restart:
;;
}
{ .mmi
+ mov cr.ifs=r16
mov ar.k6=r31
- mov ar.rnat=r21
- nop 0
+ mov pr=r18,0x1ffff
;;
}
{ .mmi
- mov ar.unat=r17
mov cr.iip=r19
+ mov ar.unat=r17
nop 0
+ ;;
}
{ .mmi
mov cr.ipsr=r24
- mov cr.ifs=r25
- mov pr=r18,0x1ffff
+ mov ar.rnat=r21
+ nop 0
;;
}
{ .mmb
@@ -713,7 +837,7 @@ END(exception_restore)
.save rp, r0; \
.body; \
ivt_##name: \
- XTRACE(offset)
+ XTRACE_HOOK(offset)
#define IVT_END(name) \
.endp ivt_##name
OpenPOWER on IntegriCloud