This RFC fixup is POC to demonstrate how the SFrame validation code would adjust if introducing an internal FDE representation (struct sframe_fde_internal) similar to the used internal FRE representation (struct sframe_fre) in the SFrame reading code. The goal is to eliminate the passing through of fde_start_base in many places as well as the various computations of the effective function start address (= *fde_start_base + fde->start_addr) throughout this module. The internal FDE representation simply conveys the effective function start address via the "unsigned long func_start_addr" field. Signed-off-by: Jens Remus --- kernel/unwind/sframe.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/kernel/unwind/sframe.c b/kernel/unwind/sframe.c index f88fc2c92c58..f2977c010117 100644 --- a/kernel/unwind/sframe.c +++ b/kernel/unwind/sframe.c @@ -354,21 +354,21 @@ int sframe_find(unsigned long ip, struct unwind_user_frame *frame) #ifdef CONFIG_SFRAME_VALIDATION static int safe_read_fde(struct sframe_section *sec, - unsigned int fde_num, struct sframe_fde *fde, - unsigned long *fde_start_base) + unsigned int fde_num, struct sframe_fde_internal *fde) { int ret; if (!user_read_access_begin((void __user *)sec->sframe_start, sec->sframe_end - sec->sframe_start)) return -EFAULT; - ret = __read_fde(sec, fde_num, fde, fde_start_base); + ret = __read_fde(sec, fde_num, fde); user_read_access_end(); return ret; } static int safe_read_fre(struct sframe_section *sec, - struct sframe_fde *fde, unsigned long fre_addr, + struct sframe_fde_internal *fde, + unsigned long fre_addr, struct sframe_fre *fre) { int ret; @@ -388,18 +388,18 @@ static int sframe_validate_section(struct sframe_section *sec) for (i = 0; i < sec->num_fdes; i++) { struct sframe_fre *fre, *prev_fre = NULL; - unsigned long ip, fde_start_base, fre_addr; - struct sframe_fde fde; + unsigned long ip, fre_addr; + struct sframe_fde_internal fde; struct sframe_fre fres[2]; bool which = false; unsigned int j; int ret; - ret = safe_read_fde(sec, i, &fde, &fde_start_base); + ret = safe_read_fde(sec, i, &fde); if (ret) return ret; - ip = fde_start_base + fde.start_addr; + ip = fde.func_start_addr; if (ip <= prev_ip) { dbg_sec("fde %u not sorted\n", i); return -EFAULT; @@ -416,8 +416,8 @@ static int sframe_validate_section(struct sframe_section *sec) ret = safe_read_fre(sec, &fde, fre_addr, fre); if (ret) { dbg_sec("fde %u: __read_fre(%u) failed\n", i, j); - dbg_sec("FDE: start_addr:0x%x func_size:0x%x fres_off:0x%x fres_num:%d info:%u rep_size:%u\n", - fde.start_addr, fde.func_size, + dbg_sec("FDE: func_start_addr:0x%lx func_size:0x%x fres_off:0x%x fres_num:%d info:%u rep_size:%u\n", + fde.func_start_addr, fde.func_size, fde.fres_off, fde.fres_num, fde.info, fde.rep_size); return ret; -- 2.48.1