Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F176906428
D59651.1793599541.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
17 KB
Referenced Files
None
Subscribers
None
D59651.1793599541.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D59651: trap_cfi(9): introduce powerpc implemenation
Attached
Detach File
Event Timeline