Page MenuHomeFreeBSD

D59651.1793599541.diff
No OneTemporary

Authored By
Unknown
Size
17 KB
Referenced Files
None
Subscribers
None

D59651.1793599541.diff

diff --git a/sys/conf/ldscript.powerpc b/sys/conf/ldscript.powerpc
--- a/sys/conf/ldscript.powerpc
+++ b/sys/conf/ldscript.powerpc
@@ -64,6 +64,7 @@
*(.note.gnu.build-id)
PROVIDE (__build_id_end = .);
}
+ .eh_frame : { KEEP (*(.eh_frame)) }
.sdata2 : { *(.sdata2) }
.sbss2 : { *(.sbss2) }
/* Adjust the address for the data segment to the next page up. */
diff --git a/sys/conf/ldscript.powerpc64 b/sys/conf/ldscript.powerpc64
--- a/sys/conf/ldscript.powerpc64
+++ b/sys/conf/ldscript.powerpc64
@@ -74,6 +74,7 @@
.fini : { *(.fini) } =0
.rodata : { *(.rodata) *(.gnu.linkonce.r*) }
.rodata1 : { *(.rodata1) }
+ .eh_frame : { KEEP (*(.eh_frame)) }
.sdata2 : { *(.sdata2) }
.sbss2 : { *(.sbss2) }
/* Adjust the address for the data segment to the next page up. */
diff --git a/sys/conf/ldscript.powerpc64le b/sys/conf/ldscript.powerpc64le
--- a/sys/conf/ldscript.powerpc64le
+++ b/sys/conf/ldscript.powerpc64le
@@ -74,6 +74,7 @@
.fini : { *(.fini) } =0
.rodata : { *(.rodata) *(.gnu.linkonce.r*) }
.rodata1 : { *(.rodata1) }
+ .eh_frame : { KEEP (*(.eh_frame)) }
.sdata2 : { *(.sdata2) }
.sbss2 : { *(.sbss2) }
/* Adjust the address for the data segment to the next page up. */
diff --git a/sys/powerpc/aim/locore32.S b/sys/powerpc/aim/locore32.S
--- a/sys/powerpc/aim/locore32.S
+++ b/sys/powerpc/aim/locore32.S
@@ -120,4 +120,6 @@
/* mi_startup() does not return */
b .
+ .cfi_sections .eh_frame
+
#include <powerpc/aim/trap_subr32.S>
diff --git a/sys/powerpc/aim/locore64.S b/sys/powerpc/aim/locore64.S
--- a/sys/powerpc/aim/locore64.S
+++ b/sys/powerpc/aim/locore64.S
@@ -284,4 +284,6 @@
nop
ASEND(__restartkernel)
+ .cfi_sections .eh_frame
+
#include <powerpc/aim/trap_subr64.S>
diff --git a/sys/powerpc/aim/trap_subr32.S b/sys/powerpc/aim/trap_subr32.S
--- a/sys/powerpc/aim/trap_subr32.S
+++ b/sys/powerpc/aim/trap_subr32.S
@@ -38,6 +38,8 @@
* #include <powerpc/aim/trap_subr.S>
*/
+#include <machine/trap_cfi.h>
+
/*
* Save/restore segment registers
*/
@@ -90,7 +92,7 @@
* r1 kernel stack
* SRR0/1 as at start of trap
*/
-#define FRAME_SETUP(savearea) \
+#define FRAME_SETUP(savearea, emit_cfi) \
/* Have to enable translation to allow access of kernel stack: */ \
GET_CPUINFO(%r31); \
mfsrr0 %r30; \
@@ -103,45 +105,80 @@
isync; \
mfsprg1 %r31; /* get saved SP */ \
stwu %r31,-FRAMELEN(%r1); /* save it in the callframe */ \
+ .if emit_cfi; .cfi_def_cfa %r1, CFI_TF_SIZE; .endif; \
stw %r0, FRAME_0+8(%r1); /* save r0 in the trapframe */ \
+ .if emit_cfi; trap_cfi_saved 0, FRAME_0; .endif; \
stw %r31,FRAME_1+8(%r1); /* save SP " " */ \
+ .if emit_cfi; trap_cfi_saved 1, FRAME_1; .endif; \
stw %r2, FRAME_2+8(%r1); /* save r2 " " */ \
+ .if emit_cfi; trap_cfi_saved 2, FRAME_2; .endif; \
stw %r28,FRAME_LR+8(%r1); /* save LR " " */ \
+ .if emit_cfi; trap_cfi_saved CFI_LR, FRAME_LR; .endif; \
stw %r29,FRAME_CR+8(%r1); /* save CR " " */ \
+ .if emit_cfi; trap_cfi_saved CFI_CR, FRAME_CR; .endif; \
GET_CPUINFO(%r2); \
lwz %r28,(savearea+CPUSAVE_R28)(%r2); /* get saved r28 */ \
lwz %r29,(savearea+CPUSAVE_R29)(%r2); /* get saved r29 */ \
lwz %r30,(savearea+CPUSAVE_R30)(%r2); /* get saved r30 */ \
lwz %r31,(savearea+CPUSAVE_R31)(%r2); /* get saved r31 */ \
stw %r3, FRAME_3+8(%r1); /* save r3-r31 */ \
+ .if emit_cfi; trap_cfi_saved 3, FRAME_3; .endif; \
stw %r4, FRAME_4+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 4, FRAME_4; .endif; \
stw %r5, FRAME_5+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 5, FRAME_5; .endif; \
stw %r6, FRAME_6+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 6, FRAME_6; .endif; \
stw %r7, FRAME_7+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 7, FRAME_7; .endif; \
stw %r8, FRAME_8+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 8, FRAME_8; .endif; \
stw %r9, FRAME_9+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 9, FRAME_9; .endif; \
stw %r10, FRAME_10+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 10, FRAME_10; .endif; \
stw %r11, FRAME_11+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 11, FRAME_11; .endif; \
stw %r12, FRAME_12+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 12, FRAME_12; .endif; \
stw %r13, FRAME_13+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 13, FRAME_13; .endif; \
stw %r14, FRAME_14+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 14, FRAME_14; .endif; \
stw %r15, FRAME_15+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 15, FRAME_15; .endif; \
stw %r16, FRAME_16+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 16, FRAME_16; .endif; \
stw %r17, FRAME_17+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 17, FRAME_17; .endif; \
stw %r18, FRAME_18+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 18, FRAME_18; .endif; \
stw %r19, FRAME_19+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 19, FRAME_19; .endif; \
stw %r20, FRAME_20+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 20, FRAME_20; .endif; \
stw %r21, FRAME_21+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 21, FRAME_21; .endif; \
stw %r22, FRAME_22+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 22, FRAME_22; .endif; \
stw %r23, FRAME_23+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 23, FRAME_23; .endif; \
stw %r24, FRAME_24+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 24, FRAME_24; .endif; \
stw %r25, FRAME_25+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 25, FRAME_25; .endif; \
stw %r26, FRAME_26+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 26, FRAME_26; .endif; \
stw %r27, FRAME_27+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 27, FRAME_27; .endif; \
stw %r28, FRAME_28+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 28, FRAME_28; .endif; \
stw %r29, FRAME_29+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 29, FRAME_29; .endif; \
stw %r30, FRAME_30+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 30, FRAME_30; .endif; \
stw %r31, FRAME_31+8(%r1); \
+ .if emit_cfi; trap_cfi_saved 31, FRAME_31; .endif; \
lwz %r28,(savearea+CPUSAVE_AIM_DAR)(%r2); /* saved DAR */ \
lwz %r29,(savearea+CPUSAVE_AIM_DSISR)(%r2);/* saved DSISR */\
lwz %r30,(savearea+CPUSAVE_SRR0)(%r2); /* saved SRR0 */ \
@@ -150,11 +187,14 @@
mfctr %r4; \
mfsprg3 %r5; \
stw %r3, FRAME_XER+8(1); /* save xer/ctr/exc */ \
+ .if emit_cfi; trap_cfi_saved CFI_XER, FRAME_XER; .endif; \
stw %r4, FRAME_CTR+8(1); \
+ .if emit_cfi; trap_cfi_saved CFI_CTR, FRAME_CTR; .endif; \
stw %r5, FRAME_EXC+8(1); \
stw %r28,FRAME_AIM_DAR+8(1); \
stw %r29,FRAME_AIM_DSISR+8(1); /* save dsisr/srr0/srr1 */ \
stw %r30,FRAME_SRR0+8(1); \
+ .if emit_cfi; trap_cfi_saved CFI_PC, FRAME_SRR0; .endif; \
stw %r31,FRAME_SRR1+8(1); \
lwz %r2,PC_CURTHREAD(%r2) /* set curthread pointer */
@@ -210,6 +250,7 @@
lwz %r2, FRAME_2+8(%r1); \
lwz %r0, FRAME_0+8(%r1); \
lwz %r1, FRAME_1+8(%r1); \
+ .cfi_def_cfa %r1, 0; .cfi_undefined CFI_PC; \
/* Can't touch %r1 from here on */ \
mtsprg2 %r2; /* save r2 & r3 */ \
mtsprg3 %r3; \
@@ -776,7 +817,7 @@
* Now the common trap catching code.
*/
k_trap:
- FRAME_SETUP(PC_TEMPSAVE)
+ FRAME_SETUP(PC_TEMPSAVE, 0)
/* Restore USER_SR */
GET_CPUINFO(%r30)
lwz %r30,PC_CURPCB(%r30)
@@ -784,6 +825,8 @@
mtsr USER_SR,%r30; sync; isync
/* Call C interrupt dispatcher: */
trapagain:
+ .cfi_startproc
+ trap_cfi_entry trapframe
addi %r3,%r1,8
bl CNAME(powerpc_interrupt)
.globl CNAME(trapexit) /* backtrace code sentinel */
@@ -823,6 +866,7 @@
.globl CNAME(rfid_patch)
CNAME(rfid_patch):
rfid
+ .cfi_endproc
#if defined(KDB)
/*
@@ -830,6 +874,8 @@
*/
.globl CNAME(breakpoint)
CNAME(breakpoint):
+ .cfi_startproc
+ trap_cfi_entry
mtsprg1 %r1
mfmsr %r3
mtsrr1 %r3
@@ -860,7 +906,8 @@
lwz %r1,trapstk@got(%r1)
addi %r1,%r1,TRAPSTKSZ-16
- FRAME_SETUP(PC_DBSAVE)
+ FRAME_SETUP(PC_DBSAVE, 1)
+ trap_cfi_trapframe
/* Call C trap code: */
addi %r3,%r1,8
bl CNAME(db_trap_glue)
@@ -926,4 +973,5 @@
mtlr %r1
blrl
CNAME(dbend):
+ .cfi_endproc
#endif /* KDB */
diff --git a/sys/powerpc/aim/trap_subr64.S b/sys/powerpc/aim/trap_subr64.S
--- a/sys/powerpc/aim/trap_subr64.S
+++ b/sys/powerpc/aim/trap_subr64.S
@@ -38,6 +38,8 @@
* #include <powerpc/aim/trap_subr.S>
*/
+#include <machine/trap_cfi.h>
+
/* Locate the per-CPU data structure */
#define GET_CPUINFO(r) \
mfsprg0 r
@@ -132,7 +134,7 @@
* NOTE: SPRG1 is never used while the MMU is on, making it safe to reuse
* in any real-mode fault handler, including those handling double faults.
*/
-#define FRAME_SETUP(savearea) \
+#define FRAME_SETUP(savearea, emit_cfi) \
/* Have to enable translation to allow access of kernel stack: */ \
GET_CPUINFO(%r31); \
mfsrr0 %r30; \
@@ -145,11 +147,17 @@
mtmsr %r30; /* stack can now be accessed */ \
isync; \
stdu %r31,-(FRAMELEN+288)(%r1); /* save it in the callframe */ \
+ .if emit_cfi; .cfi_def_cfa %r1, CFI_TF_SIZE; .endif; \
std %r0, FRAME_0+48(%r1); /* save r0 in the trapframe */ \
+ .if emit_cfi; trap_cfi_saved 0, FRAME_0; .endif; \
std %r31,FRAME_1+48(%r1); /* save SP " " */ \
+ .if emit_cfi; trap_cfi_saved 1, FRAME_1; .endif; \
std %r2, FRAME_2+48(%r1); /* save r2 " " */ \
+ .if emit_cfi; trap_cfi_saved 2, FRAME_2; .endif; \
std %r28,FRAME_LR+48(%r1); /* save LR " " */ \
+ .if emit_cfi; trap_cfi_saved CFI_LR, FRAME_LR; .endif; \
std %r29,FRAME_CR+48(%r1); /* save CR " " */ \
+ .if emit_cfi; trap_cfi_saved CFI_CR, FRAME_CR; .endif; \
GET_CPUINFO(%r2); \
ld %r27,(savearea+CPUSAVE_R27)(%r2); /* get saved r27 */ \
ld %r28,(savearea+CPUSAVE_R28)(%r2); /* get saved r28 */ \
@@ -157,34 +165,63 @@
ld %r30,(savearea+CPUSAVE_R30)(%r2); /* get saved r30 */ \
ld %r31,(savearea+CPUSAVE_R31)(%r2); /* get saved r31 */ \
std %r3, FRAME_3+48(%r1); /* save r3-r31 */ \
+ .if emit_cfi; trap_cfi_saved 3, FRAME_3; .endif; \
std %r4, FRAME_4+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 4, FRAME_4; .endif; \
std %r5, FRAME_5+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 5, FRAME_5; .endif; \
std %r6, FRAME_6+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 6, FRAME_6; .endif; \
std %r7, FRAME_7+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 7, FRAME_7; .endif; \
std %r8, FRAME_8+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 8, FRAME_8; .endif; \
std %r9, FRAME_9+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 9, FRAME_9; .endif; \
std %r10, FRAME_10+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 10, FRAME_10; .endif; \
std %r11, FRAME_11+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 11, FRAME_11; .endif; \
std %r12, FRAME_12+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 12, FRAME_12; .endif; \
std %r13, FRAME_13+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 13, FRAME_13; .endif; \
std %r14, FRAME_14+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 14, FRAME_14; .endif; \
std %r15, FRAME_15+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 15, FRAME_15; .endif; \
std %r16, FRAME_16+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 16, FRAME_16; .endif; \
std %r17, FRAME_17+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 17, FRAME_17; .endif; \
std %r18, FRAME_18+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 18, FRAME_18; .endif; \
std %r19, FRAME_19+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 19, FRAME_19; .endif; \
std %r20, FRAME_20+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 20, FRAME_20; .endif; \
std %r21, FRAME_21+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 21, FRAME_21; .endif; \
std %r22, FRAME_22+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 22, FRAME_22; .endif; \
std %r23, FRAME_23+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 23, FRAME_23; .endif; \
std %r24, FRAME_24+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 24, FRAME_24; .endif; \
std %r25, FRAME_25+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 25, FRAME_25; .endif; \
std %r26, FRAME_26+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 26, FRAME_26; .endif; \
std %r27, FRAME_27+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 27, FRAME_27; .endif; \
std %r28, FRAME_28+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 28, FRAME_28; .endif; \
std %r29, FRAME_29+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 29, FRAME_29; .endif; \
std %r30, FRAME_30+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 30, FRAME_30; .endif; \
std %r31, FRAME_31+48(%r1); \
+ .if emit_cfi; trap_cfi_saved 31, FRAME_31; .endif; \
ld %r28,(savearea+CPUSAVE_AIM_DAR)(%r2); /* saved DAR */ \
ld %r29,(savearea+CPUSAVE_AIM_DSISR)(%r2);/* saved DSISR */\
ld %r30,(savearea+CPUSAVE_SRR0)(%r2); /* saved SRR0 */ \
@@ -193,11 +230,14 @@
mfctr %r4; \
mfsprg3 %r5; \
std %r3, FRAME_XER+48(1); /* save xer/ctr/exc */ \
+ .if emit_cfi; trap_cfi_saved CFI_XER, FRAME_XER; .endif; \
std %r4, FRAME_CTR+48(1); \
+ .if emit_cfi; trap_cfi_saved CFI_CTR, FRAME_CTR; .endif; \
std %r5, FRAME_EXC+48(1); \
std %r28,FRAME_AIM_DAR+48(1); \
std %r29,FRAME_AIM_DSISR+48(1); /* save dsisr/srr0/srr1 */ \
std %r30,FRAME_SRR0+48(1); \
+ .if emit_cfi; trap_cfi_saved CFI_PC, FRAME_SRR0; .endif; \
std %r31,FRAME_SRR1+48(1); \
ld %r13,PC_CURTHREAD(%r2) /* set kernel curthread */
@@ -253,6 +293,7 @@
ld %r2, FRAME_2+48(%r1); \
ld %r0, FRAME_0+48(%r1); \
ld %r1, FRAME_1+48(%r1); \
+ .cfi_def_cfa %r1, 0; .cfi_undefined CFI_PC; \
/* Can't touch %r1 from here on */ \
mtsprg3 %r3; /* save r3 */ \
/* Disable translation, machine check and recoverability: */ \
@@ -849,9 +890,11 @@
* Now the common trap catching code.
*/
k_trap:
- FRAME_SETUP(PC_TEMPSAVE)
+ FRAME_SETUP(PC_TEMPSAVE, 0)
/* Call C interrupt dispatcher: */
trapagain:
+ .cfi_startproc
+ trap_cfi_entry trapframe
GET_TOCBASE(%r2)
addi %r3,%r1,48
bl CNAME(powerpc_interrupt)
@@ -887,12 +930,14 @@
1:
FRAME_LEAVE(PC_TEMPSAVE)
rfid
+ .cfi_endproc
#if defined(KDB)
/*
* Deliberate entry to dbtrap
*/
ASENTRY_NOPROF(breakpoint)
+ trap_cfi_entry
mtsprg1 %r1
mfmsr %r3
mtsrr1 %r3
@@ -925,7 +970,8 @@
ld %r1,TOC_REF(trapstk)@l(%r1)
addi %r1,%r1,(TRAPSTKSZ-48)
- FRAME_SETUP(PC_DBSAVE)
+ FRAME_SETUP(PC_DBSAVE, 1)
+ trap_cfi_trapframe
/* Call C trap code: */
GET_TOCBASE(%r2)
addi %r3,%r1,48
diff --git a/sys/powerpc/booke/locore.S b/sys/powerpc/booke/locore.S
--- a/sys/powerpc/booke/locore.S
+++ b/sys/powerpc/booke/locore.S
@@ -974,4 +974,6 @@
.globl kernbase
.set kernbase, KERNBASE
+ .cfi_sections .eh_frame
+
#include <powerpc/booke/trap_subr.S>
diff --git a/sys/powerpc/booke/trap_subr.S b/sys/powerpc/booke/trap_subr.S
--- a/sys/powerpc/booke/trap_subr.S
+++ b/sys/powerpc/booke/trap_subr.S
@@ -66,6 +66,8 @@
* #include <powerpc/booke/trap_subr.S>
*/
+#include <machine/trap_cfi.h>
+
/*
* SPRG usage notes
*
@@ -1037,6 +1039,8 @@
* Common trap code
****************************************************************************/
trap_common:
+ .cfi_startproc
+ trap_cfi_entry trapframe
/* Call C trap dispatcher */
GET_TOCBASE(%r2)
addi %r3, %r1, CALLSIZE
@@ -1071,6 +1075,7 @@
1:
FRAME_LEAVE(SPR_SPRG1, PC_TEMPSAVE, SPR_SRR0, SPR_SRR1)
rfi
+ .cfi_endproc
#if defined(KDB)
@@ -1079,6 +1084,7 @@
*/
/* .globl CNAME(breakpoint)*/
ASENTRY_NOPROF(breakpoint)
+ trap_cfi_entry
mtsprg1 %r1
mfmsr %r3
mtsrr1 %r3
@@ -1112,6 +1118,7 @@
*/
dbtrap:
FRAME_SETUP(SPR_SPRG1, PC_DBSAVE, EXC_DEBUG)
+ trap_cfi_trapframe
/* Call C trap code: */
GET_TOCBASE(%r2)
addi %r3, %r1, CALLSIZE
diff --git a/sys/powerpc/include/frame.h b/sys/powerpc/include/frame.h
--- a/sys/powerpc/include/frame.h
+++ b/sys/powerpc/include/frame.h
@@ -47,6 +47,8 @@
* between processes using the FPU.
*
* Change ordering to cluster together these register_t's. XXX
+ *
+ * NOTE: keep this structure in sync with the trap frame CFI information.
*/
struct trapframe {
register_t fixreg[32];
diff --git a/sys/powerpc/include/trap_cfi.h b/sys/powerpc/include/trap_cfi.h
new file mode 100644
--- /dev/null
+++ b/sys/powerpc/include/trap_cfi.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2026 FreeBSD Foundation
+ *
+ * This software was developed by Minsoo Choo under sponsorship from the
+ * FreeBSD Foundation.
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#ifndef _MACHINE_TRAP_CFI_H_
+#define _MACHINE_TRAP_CFI_H_
+
+#include "assym.inc"
+
+#ifdef __powerpc64__
+#define CFI_WORD_SIZE 8
+#define CFI_TF_PREFIX 48
+#if defined(__LITTLE_ENDIAN__) || \
+ (defined(_CALL_ELF) && _CALL_ELF == 2)
+#define CFI_CR 68
+#define CFI_XER 76
+#define CFI_LR 65
+#define CFI_CTR 66
+#define CFI_PC 118
+#else
+#define CFI_CR 64
+#define CFI_XER 100
+#define CFI_LR 108
+#define CFI_CTR 109
+#define CFI_PC 357
+#endif
+#else
+#define CFI_WORD_SIZE 4
+#define CFI_TF_PREFIX 8
+#define CFI_CR 64
+#define CFI_XER 101
+#define CFI_LR 108
+#define CFI_CTR 109
+#define CFI_PC 110
+#endif
+
+#define CFI_TF_SIZE (CFI_TF_PREFIX + 42 * CFI_WORD_SIZE)
+
+.macro trap_cfi_entry state=empty
+ .cfi_signal_frame
+ .cfi_return_column CFI_PC
+ .cfi_def_cfa %r1, 0
+ .cfi_undefined CFI_PC
+.ifc \state,trapframe
+ trap_cfi_trapframe
+.endif
+.ifc \state,terminal
+ .cfi_def_cfa %r1, CFI_TF_SIZE
+.endif
+.endm
+
+.macro trap_cfi_saved reg, off
+ .cfi_offset \reg, CFI_TF_PREFIX + \off - CFI_TF_SIZE
+.endm
+
+.macro trap_cfi_trapframe
+ .cfi_def_cfa %r1, CFI_TF_SIZE
+ .irp n,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
+ .cfi_offset \n, CFI_TF_PREFIX + \n * CFI_WORD_SIZE - CFI_TF_SIZE
+ .endr
+ trap_cfi_saved CFI_LR, FRAME_LR
+ trap_cfi_saved CFI_CR, FRAME_CR
+ trap_cfi_saved CFI_XER, FRAME_XER
+ trap_cfi_saved CFI_CTR, FRAME_CTR
+ trap_cfi_saved CFI_PC, FRAME_SRR0
+.endm
+
+#endif /* _MACHINE_TRAP_CFI_H_ */

File Metadata

Mime Type
text/plain
Expires
Mon, Nov 2, 6:05 AM (16 h, 27 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
41309378
Default Alt Text
D59651.1793599541.diff (17 KB)

Event Timeline