Enable architectures, such as s390, which store SFrame CFA offset values encoded, to e.g. make (better) use of unsigned 8-bit SFrame offsets.
Signed-off-by: Jens Remus <[email protected]> --- Notes (jremus): Changes in RFC v2: - Rename generic_sframe_cfa_offset_decode() to sframe_cfa_offset_decode(). (Josh) include/asm-generic/unwind_user_sframe.h | 8 ++++++++ kernel/unwind/sframe.c | 2 ++ 2 files changed, 10 insertions(+) diff --git a/include/asm-generic/unwind_user_sframe.h b/include/asm-generic/unwind_user_sframe.h index 8c9ac47bc8bd..117b05e1dcab 100644 --- a/include/asm-generic/unwind_user_sframe.h +++ b/include/asm-generic/unwind_user_sframe.h @@ -9,4 +9,12 @@ #define SFRAME_SP_OFFSET 0 #endif +#ifndef sframe_cfa_offset_decode +static inline s32 sframe_cfa_offset_decode(s32 offset) +{ + return offset; +} +#define sframe_cfa_offset_decode sframe_cfa_offset_decode +#endif + #endif /* _ASM_GENERIC_UNWIND_USER_SFRAME_H */ diff --git a/kernel/unwind/sframe.c b/kernel/unwind/sframe.c index 6a6221ce6d12..5ac502f16bad 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -209,6 +209,7 @@ __read_regular_fre_datawords(struct sframe_section *sec, UNSAFE_GET_USER_INC(cfa_off, cur, dataword_size, Efault); dataword_count--; + cfa_off = sframe_cfa_offset_decode(cfa_off); ra_off = sec->ra_off; if (!ra_off && dataword_count) { @@ -258,6 +259,7 @@ __read_flex_fde_fre_datawords(struct sframe_section *sec, UNSAFE_GET_USER_INC(cfa_ctl, cur, dataword_size, Efault); UNSAFE_GET_USER_INC(cfa_off, cur, dataword_size, Efault); dataword_count -= 2; + cfa_off = sframe_cfa_offset_decode(cfa_off); ra_off = sec->ra_off; ra_ctl = ra_off ? 2 : 0; /* regnum=0, deref_p=(ra_off != 0), reg_p=0 */ -- 2.51.0
