From 5beb1d8b0d25d64be2cb1cd1d381980141606bb6 Mon Sep 17 00:00:00 2001 From: bmax Date: Sun, 17 Mar 2024 23:14:05 +0800 Subject: [PATCH] 1. fix kallsym: find kallsyms_marker error, newest oneplus12 (not noly oneplus12) is ok now, 2. try to fix module install os error 22 or 5, I'm not sure --- kernel/patch/android/userd.c | 2 +- tools/kallsym.c | 44 +++++++++++++++++++++++++++++++++++- tools/patch.c | 3 ++- version | 2 +- 4 files changed, 47 insertions(+), 4 deletions(-) diff --git a/kernel/patch/android/userd.c b/kernel/patch/android/userd.c index c9bd8fe8..1a47bea5 100644 --- a/kernel/patch/android/userd.c +++ b/kernel/patch/android/userd.c @@ -251,7 +251,7 @@ static void after_execveat(hook_fargs5_t *args, void *udata) handle_after_execve(&args->local); } -#define ORIGIN_RC_FILE "/init.environ.rc" +#define ORIGIN_RC_FILE "/system/etc/init/atrace.rc" #define REPLACE_RC_FILE "/dev/anduser.rc" static const char user_rc_data[] = { // diff --git a/tools/kallsym.c b/tools/kallsym.c index cfecb7ac..c8ca6581 100644 --- a/tools/kallsym.c +++ b/tools/kallsym.c @@ -445,7 +445,7 @@ static int find_num_syms(kallsym_t *info, char *img, int32_t imglen) return 0; } -static int find_markers(kallsym_t *info, char *img, int32_t imglen) +static int find_markers_1(kallsym_t *info, char *img, int32_t imglen) { int32_t elem_size = get_markers_elem_size(info); int32_t cand = info->kallsyms_token_table_offset - elem_size; @@ -472,6 +472,48 @@ static int find_markers(kallsym_t *info, char *img, int32_t imglen) return 0; } +static int find_markers_2(kallsym_t *info, char *img, int32_t imglen) +{ + int32_t elem_size = get_markers_elem_size(info); + int32_t cand = info->kallsyms_token_table_offset - KSYM_MIN_MARKER * elem_size; + + int64_t marker, last_marker = 0x7fffffff; + int count = 0; + while (cand > 0x1000) { + marker = int_unpack(img + cand, elem_size, info->is_be); + if (last_marker > marker) { + count++; + if (!marker && count > KSYM_MIN_MARKER) break; + } else { + count = 0; + last_marker = 0x7fffffff; + } + + last_marker = marker; + cand -= elem_size; + } + + if (count < KSYM_MIN_MARKER) { + tools_logw("find kallsyms_markers error\n"); + return -1; + } + + int32_t marker_end = cand + count * elem_size + elem_size; + info->kallsyms_markers_offset = cand; + info->_marker_num = count; + + tools_logi("kallsyms_markers range: [0x%08x, 0x%08x), count: 0x%08x\n", cand, marker_end, count); + return 0; +} + +static inline int find_markers(kallsym_t *info, char *img, int32_t imglen) +{ + // todo: remove one + int rc = find_markers_1(info, img, imglen); + if (!rc) return rc; + return find_markers_2(info, img, imglen); +} + static int decompress_symbol_name(kallsym_t *info, char *img, int32_t *pos_to_next, char *out_type, char *out_symbol) { int32_t pos = *pos_to_next; diff --git a/tools/patch.c b/tools/patch.c index 21599100..0e1c01e9 100644 --- a/tools/patch.c +++ b/tools/patch.c @@ -207,11 +207,12 @@ int print_image_patch_info(patched_kimg_t *pimg) if (pimg->banner[strlen(pimg->banner) - 1] != '\n') fprintf(stdout, "\n"); fprintf(stdout, "patched=%s\n", preset ? "true" : "false"); - fprintf(stdout, "extra_num=%d\n", pimg->embed_item_num); if (preset) { print_preset_info(preset); + fprintf(stdout, "extra_num=%d\n", pimg->embed_item_num); + fprintf(stdout, INFO_EXTRA_SESSION "\n"); fprintf(stdout, "num=%d\n", pimg->embed_item_num); diff --git a/version b/version index 20b53d0c..3daf75d1 100644 --- a/version +++ b/version @@ -1,3 +1,3 @@ #define MAJOR 0 #define MINOR 10 -#define PATCH 3 +#define PATCH 4