From b68672dbb2a4a92177212e5df167a5bb6a3a8fd7 Mon Sep 17 00:00:00 2001 From: Herman Chen Date: Thu, 11 Sep 2025 17:59:29 +0800 Subject: [PATCH] fix[kmpp_obj]: Fix obj update flag update issue Signed-off-by: Herman Chen Change-Id: I7bee6599ac9e7328af28a4f096fe9b84eb7c1bf7 --- kmpp/base/inc/kmpp_obj.h | 4 +- kmpp/base/inc/kmpp_obj_helper.h | 5 ++- kmpp/base/kmpp_obj.c | 68 +++++++++++++++------------------ 3 files changed, 37 insertions(+), 40 deletions(-) diff --git a/kmpp/base/inc/kmpp_obj.h b/kmpp/base/inc/kmpp_obj.h index 10ece7f5..2a5f7590 100644 --- a/kmpp/base/inc/kmpp_obj.h +++ b/kmpp/base/inc/kmpp_obj.h @@ -48,8 +48,6 @@ rk_s32 kmpp_objdef_dump(KmppObjDef def); /* mpp objcet internal element set / get function */ const char *kmpp_objdef_get_name(KmppObjDef def); rk_s32 kmpp_objdef_get_entry_size(KmppObjDef def); -rk_s32 kmpp_objdef_get_flags_base(KmppObjDef def); -rk_s32 kmpp_objdef_get_flags_size(KmppObjDef def); MppTrie kmpp_objdef_get_trie(KmppObjDef def); /* import kernel object ref */ @@ -78,6 +76,8 @@ rk_s32 kmpp_obj_ioctl(KmppObj obj, rk_s32 cmd, KmppObj in, KmppObj out, const ch /* check a object is kobject or not */ rk_s32 kmpp_obj_is_kobj(KmppObj obj); +/* object to its objdef */ +KmppObjDef kmpp_obj_to_objdef(KmppObj obj); /* object implement element update flags access */ void *kmpp_obj_to_flags(KmppObj obj); rk_s32 kmpp_obj_to_flags_size(KmppObj obj); diff --git a/kmpp/base/inc/kmpp_obj_helper.h b/kmpp/base/inc/kmpp_obj_helper.h index d348c971..96b5d761 100644 --- a/kmpp/base/inc/kmpp_obj_helper.h +++ b/kmpp/base/inc/kmpp_obj_helper.h @@ -341,7 +341,10 @@ rk_s32 CONCAT_US(KMPP_OBJ_NAME, put)(KMPP_OBJ_INTF_TYPE obj) rk_s32 CONCAT_US(KMPP_OBJ_NAME, dump)(KMPP_OBJ_INTF_TYPE obj, const char *caller) { - return kmpp_obj_kdump_f(obj, caller); + if (!obj) + return rk_nok; + + return kmpp_obj_is_kobj(obj) ? kmpp_obj_kdump_f(obj, caller) : kmpp_obj_udump_f(obj, caller); } #if !defined(KMPP_OBJ_FUNC_EXPORT_DISABLE) && defined(__KERNEL__) diff --git a/kmpp/base/kmpp_obj.c b/kmpp/base/kmpp_obj.c index 2ac70555..450fd75a 100644 --- a/kmpp/base/kmpp_obj.c +++ b/kmpp/base/kmpp_obj.c @@ -105,7 +105,6 @@ typedef struct KmppObjDefImpl_t { MppMemPool pool; /* object define from kernel or userspace */ rk_s32 is_kobj; - rk_s32 flag_base; KmppObjInit init; KmppObjDeinit deinit; KmppObjPreset preset; @@ -825,20 +824,6 @@ rk_s32 kmpp_objdef_get_entry_size(KmppObjDef def) return impl ? impl->entry_size : 0; } -rk_s32 kmpp_objdef_get_flags_base(KmppObjDef def) -{ - KmppObjDefImpl *impl = (KmppObjDefImpl *)def; - - return impl ? impl->flag_base : 0; -} - -rk_s32 kmpp_objdef_get_flags_size(KmppObjDef def) -{ - KmppObjDefImpl *impl = (KmppObjDefImpl *)def; - - return (impl && impl->flag_base) ? (impl->flag_max_pos - impl->flag_base) : 0; -} - MppTrie kmpp_objdef_get_trie(KmppObjDef def) { KmppObjDefImpl *impl = (KmppObjDefImpl *)def; @@ -1186,6 +1171,20 @@ rk_s32 kmpp_obj_ioctl(KmppObj obj, rk_s32 cmd, KmppObj in, KmppObj out, const ch return ret; } +rk_s32 kmpp_obj_is_kobj(KmppObj obj) +{ + KmppObjImpl *impl = (KmppObjImpl *)obj; + + return (impl && impl->def) ? impl->def->is_kobj : 0; +} + +KmppObjDef kmpp_obj_to_objdef(KmppObj obj) +{ + KmppObjImpl *impl = (KmppObjImpl *)obj; + + return impl ? impl->def : NULL; +} + void *kmpp_obj_to_flags(KmppObj obj) { KmppObjImpl *impl = (KmppObjImpl *)obj; @@ -1238,16 +1237,6 @@ const char *kmpp_obj_get_name(KmppObj obj) return NULL; } -rk_s32 kmpp_obj_is_kobj(KmppObj obj) -{ - KmppObjImpl *impl = (KmppObjImpl *)obj; - - if (impl && impl->def) - return impl->def->is_kobj; - - return 0; -} - void *kmpp_obj_to_priv(KmppObj obj) { KmppObjImpl *impl = (KmppObjImpl *)obj; @@ -1525,17 +1514,22 @@ rk_s32 kmpp_obj_update(KmppObj dst, KmppObj src) } } while ((info = mpp_trie_get_info_next(trie, info))); - { - /* copy update flag to dst */ - rk_s32 offset = kmpp_objdef_get_flags_base(src_impl->def); - rk_s32 size = kmpp_objdef_get_flags_size(src_impl->def); - rk_s32 i; + if (src_impl->def) { + KmppObjDefImpl *def = src_impl->def; + rk_s32 flag_offset = def->flag_offset; + rk_s32 flag_size = kmpp_obj_to_flags_size(src); - for (i = offset; i < offset + size; i += 4) - obj_dbg_update("obj %s %p update flag at %04x - %04x\n", src_impl->name, - dst, i, *((rk_u32 *)((rk_u8 *)src_impl->entry + i))); + if (flag_offset && flag_size) { + rk_s32 i; - memcpy(dst_impl->entry + offset, src_impl->entry + offset, size); + for (i = flag_offset; i < flag_offset + flag_size; i += 4) + obj_dbg_update("obj %s %p update flag at %#06x - %08x\n", src_impl->def->name, + dst, i, *((rk_u32 *)((rk_u8 *)src_impl->entry + i))); + + memcpy(dst_impl->entry + flag_offset, + src_impl->entry + flag_offset, flag_size); + memset(src_impl->entry + flag_offset, 0, flag_size); + } } return rk_ok; @@ -1587,8 +1581,8 @@ rk_s32 kmpp_obj_copy_entry(KmppObj dst, KmppObj src) memcpy(dst_impl->entry, src_impl->entry, src_impl->def->entry_size); { /* NOTE: clear dst update flags */ - rk_s32 offset = kmpp_objdef_get_flags_base(src_impl->def); - rk_s32 size = kmpp_objdef_get_flags_size(src_impl->def); + rk_s32 offset = src_impl->def->flag_offset; + rk_s32 size = kmpp_obj_to_flags_size(src); memset(dst_impl->entry + offset, 0, size); } @@ -1658,7 +1652,7 @@ rk_s32 kmpp_obj_udump_f(KmppObj obj, const char *caller) e = (KmppEntry *)mpp_trie_info_ctx(info); name = mpp_trie_info_name(info); - if (strstr(name, "__")) + if (mpp_trie_info_is_self(info)) continue; idx = i++;