From 47ba2a350e60e329006cf11bfa97327872eebc6d Mon Sep 17 00:00:00 2001 From: Herman Chen Date: Thu, 29 May 2025 16:26:11 +0800 Subject: [PATCH] chore[kmpp_obj]: Add more obj function 1. Add update flag copy function. 2. Add entry copy function. 3. Fix register log. Signed-off-by: Herman Chen Change-Id: I4059c63cd3bbcab86144eaad38c0fc30c9ee52a8 --- kmpp/base/inc/kmpp_obj.h | 5 +++ kmpp/base/inc/kmpp_obj_helper.h | 2 +- kmpp/base/kmpp_obj.c | 73 +++++++++++++++++++++++++++++---- 3 files changed, 71 insertions(+), 9 deletions(-) diff --git a/kmpp/base/inc/kmpp_obj.h b/kmpp/base/inc/kmpp_obj.h index f5c7db2e..37d8e400 100644 --- a/kmpp/base/inc/kmpp_obj.h +++ b/kmpp/base/inc/kmpp_obj.h @@ -45,6 +45,8 @@ 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_flag_base(KmppObjDef def); +rk_s32 kmpp_objdef_get_flag_size(KmppObjDef def); MppTrie kmpp_objdef_get_trie(KmppObjDef def); /* import kernel object ref */ @@ -127,6 +129,9 @@ rk_s32 kmpp_obj_tbl_test(KmppObj obj, KmppEntry *tbl); rk_s32 kmpp_obj_update(KmppObj dst, KmppObj src); rk_s32 kmpp_obj_update_entry(void *entry, KmppObj src); +/* copy entry value from src to dst */ +rk_s32 kmpp_obj_copy_entry(KmppObj dst, KmppObj src); + /* run a callback function */ rk_s32 kmpp_obj_run(KmppObj obj, const char *name); /* dump by userspace */ diff --git a/kmpp/base/inc/kmpp_obj_helper.h b/kmpp/base/inc/kmpp_obj_helper.h index b4d5ebc9..0a44dc80 100644 --- a/kmpp/base/inc/kmpp_obj_helper.h +++ b/kmpp/base/inc/kmpp_obj_helper.h @@ -264,7 +264,7 @@ void CONCAT_US(KMPP_OBJ_NAME, register)(void) (void) __flag_prev; (void) __flag_record; - mpp_env_get_u32(TO_STR(CONCAT_US(KMPP_OBJ_NAME, debug)), &KMPP_OBJ_DEF_DEUBG(KMPP_OBJ_NAME), 1); + mpp_env_get_u32(TO_STR(CONCAT_US(KMPP_OBJ_NAME, debug)), &KMPP_OBJ_DEF_DEUBG(KMPP_OBJ_NAME), 0); KMPP_OBJ_DBG_LOG("register enter\n"); diff --git a/kmpp/base/kmpp_obj.c b/kmpp/base/kmpp_obj.c index a8b1206f..eabd57c9 100644 --- a/kmpp/base/kmpp_obj.c +++ b/kmpp/base/kmpp_obj.c @@ -33,6 +33,7 @@ #define OBJ_DBG_ENTRY (0x00000004) #define OBJ_DBG_HOOK (0x00000008) #define OBJ_DBG_IOCTL (0x00000010) +#define OBJ_DBG_UPDATE (0x00000020) #define OBJ_DBG_SET (0x00000040) #define OBJ_DBG_GET (0x00000080) @@ -43,6 +44,7 @@ #define obj_dbg_entry(fmt, ...) obj_dbg(OBJ_DBG_ENTRY, fmt, ## __VA_ARGS__) #define obj_dbg_hook(fmt, ...) obj_dbg(OBJ_DBG_HOOK, fmt, ## __VA_ARGS__) #define obj_dbg_ioctl(fmt, ...) obj_dbg(OBJ_DBG_IOCTL, fmt, ## __VA_ARGS__) +#define obj_dbg_update(fmt, ...) obj_dbg(OBJ_DBG_UPDATE, fmt, ## __VA_ARGS__) #define obj_dbg_set(fmt, ...) obj_dbg(OBJ_DBG_SET, fmt, ## __VA_ARGS__) #define obj_dbg_get(fmt, ...) obj_dbg(OBJ_DBG_GET, fmt, ## __VA_ARGS__) @@ -100,8 +102,8 @@ typedef struct KmppObjDefImpl_t { /* userspace objdef */ MppCfgObj cfg; MppMemPool pool; + rk_s32 flag_base; rk_s32 flag_max_pos; - rk_s32 flag_offset; rk_s32 buf_size; KmppObjInit init; KmppObjDeinit deinit; @@ -195,7 +197,7 @@ const char *strof_elem_type(ElemType type) } else { \ if (old != val) { \ obj_dbg_set("%p + %x set " #type " update " #log_str " -> " #log_str " flag %d\n", \ - entry, tbl->tbl.elem_offset, old, val, tbl->tbl.flag_offset); \ + entry, tbl->tbl.elem_offset, old, val, tbl->tbl.flag_offset); \ ENTRY_SET_FLAG(tbl, entry); \ } else { \ obj_dbg_set("%p + %x set " #type " keep " #log_str "\n", entry, tbl->tbl.elem_offset, old); \ @@ -235,7 +237,7 @@ MPP_OBJ_ACCESS_IMPL(fp, void *, % p) /* copy with flag check and updata */ \ if (memcmp(dst, val, tbl->tbl.elem_size)) { \ obj_dbg_set("%p + %x set " #type " size %d update %p -> %p flag %d\n", \ - entry, tbl->tbl.elem_offset, tbl->tbl.elem_size, dst, val, tbl->tbl.flag_offset); \ + entry, tbl->tbl.elem_offset, tbl->tbl.elem_size, dst, val, tbl->tbl.flag_offset); \ memcpy(dst, val, tbl->tbl.elem_size); \ ENTRY_SET_FLAG(tbl, entry); \ } else { \ @@ -460,7 +462,7 @@ rk_s32 kmpp_objdef_register(KmppObjDef *def, rk_s32 size, const char *name) impl->buf_size = size + sizeof(KmppObjImpl); impl->ref_cnt = 1; - obj_dbg_flow("kmpp_objdef_register %-16s size %d\n", name, impl, size); + obj_dbg_flow("kmpp_objdef_register %-16s size %4d - %p\n", name, size, impl); *def = impl; @@ -542,9 +544,12 @@ rk_s32 kmpp_objdef_add_entry(KmppObjDef def, const char *name, KmppEntry *tbl) /* When last entry finish update and create memory pool */ if (impl->flag_max_pos) { - rk_s32 flag_size = MPP_ALIGN(impl->flag_max_pos, 8) / 8; + rk_s32 flag_max_pos = MPP_ALIGN(impl->flag_max_pos, 8); + rk_s32 flag_size = flag_max_pos / 8; + + impl->flag_base = impl->entry_size; + impl->flag_max_pos = flag_size; - impl->flag_offset = impl->buf_size; flag_size -= impl->entry_size; flag_size = MPP_ALIGN(flag_size, 4); impl->buf_size += flag_size; @@ -755,6 +760,20 @@ rk_s32 kmpp_objdef_get_entry_size(KmppObjDef def) return impl ? impl->entry_size : 0; } +rk_s32 kmpp_objdef_get_flag_base(KmppObjDef def) +{ + KmppObjDefImpl *impl = (KmppObjDefImpl *)def; + + return impl ? impl->flag_base : 0; +} + +rk_s32 kmpp_objdef_get_flag_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; @@ -1375,14 +1394,29 @@ rk_s32 kmpp_obj_update(KmppObj dst, KmppObj src) continue; e = (KmppEntry *)mpp_trie_info_ctx(info); - if (ENTRY_TEST_FLAG(e, src_impl->entry)) { + if (e->tbl.flag_offset && ENTRY_TEST_FLAG(e, src_impl->entry)) { rk_s32 offset = e->tbl.elem_offset; rk_s32 size = e->tbl.elem_size; + obj_dbg_update("obj %s %p update %s\n", src_impl->name, + dst, mpp_trie_info_name(info)); memcpy(dst_impl->entry + offset, src_impl->entry + offset, size); } } while ((info = mpp_trie_get_info_next(trie, info))); + { + /* copy update flag to dst */ + rk_s32 offset = kmpp_objdef_get_flag_base(src_impl->def); + rk_s32 size = kmpp_objdef_get_flag_size(src_impl->def); + rk_s32 i; + + 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))); + + memcpy(dst_impl->entry + offset, src_impl->entry + offset, size); + } + return rk_ok; } @@ -1407,10 +1441,12 @@ rk_s32 kmpp_obj_update_entry(void *entry, KmppObj src) continue; e = (KmppEntry *)mpp_trie_info_ctx(info); - if (ENTRY_TEST_FLAG(e, src_impl->entry)) { + if (e->tbl.flag_offset && ENTRY_TEST_FLAG(e, src_impl->entry)) { rk_s32 offset = e->tbl.elem_offset; rk_s32 size = e->tbl.elem_size; + obj_dbg_update("obj %s %p -> %p update %s\n", src_impl->name, + src_impl, entry, mpp_trie_info_name(info)); memcpy(entry + offset, src_impl->entry + offset, size); } } while ((info = mpp_trie_get_info_next(trie, info))); @@ -1418,6 +1454,27 @@ rk_s32 kmpp_obj_update_entry(void *entry, KmppObj src) return rk_ok; } +rk_s32 kmpp_obj_copy_entry(KmppObj dst, KmppObj src) +{ + KmppObjImpl *dst_impl = (KmppObjImpl *)dst; + KmppObjImpl *src_impl = (KmppObjImpl *)src; + + if (kmpp_obj_check_f(src) || kmpp_obj_check_f(dst) || src_impl->def != dst_impl->def) { + mpp_loge_f("obj %p copy entry to %p failed invalid param\n", src, dst); + return rk_nok; + } + + memcpy(dst_impl->entry, src_impl->entry, src_impl->def->entry_size); + { /* NOTE: clear dst update flags */ + rk_s32 offset = kmpp_objdef_get_flag_base(src_impl->def); + rk_s32 size = kmpp_objdef_get_flag_size(src_impl->def); + + memset(dst_impl->entry + offset, 0, size); + } + + return rk_ok; +} + static rk_s32 kmpp_obj_impl_run(rk_s32 (*run)(void *ctx), void *ctx) { return run(ctx);