mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-09-27 05:25:53 +08:00
feat[kmpp_obj]: Sync to new KmppEntry share object
NOTE: kernel should update to after commit: feat[kmpp_obj]: Modify KmppLocTbl to KmppEntry 1. Change basic share info between kernel and userspace. 2. Add entry function to trie. 3. Update object init function to access object base address. 4. Fix kmpp_buffer crash on releasing buf after releasing group. Signed-off-by: Herman Chen <herman.chen@rock-chips.com> Change-Id: I5c82c3052229abdf1af85d2fd15284897b549ea0
This commit is contained in:
@@ -9,53 +9,146 @@
|
||||
#include <linux/types.h>
|
||||
#include "mpp_trie.h"
|
||||
|
||||
|
||||
/*
|
||||
* kernel - userspace transaction trie node ctx info (64 bit) definition
|
||||
*
|
||||
* +------+--------------------+---------------------------+
|
||||
* | 8bit | 24 bit | 32 bit |
|
||||
* +------+--------------------+---------------------------+
|
||||
*
|
||||
* bit 0~3 - 4-bit entry type (EntryType)
|
||||
* 0 - invalid entry
|
||||
* 1 - trie self info node
|
||||
* 2 - access location table node
|
||||
* 3 - ioctl cmd node
|
||||
*
|
||||
* bit 4~7 - 4-bit entry flag (EntryFlag) for different entry type
|
||||
*/
|
||||
typedef enum EntryType_e {
|
||||
/* commaon fix size value */
|
||||
ENTRY_TYPE_FIX = 0x0,
|
||||
ENTRY_TYPE_s32 = (ENTRY_TYPE_FIX + 0),
|
||||
ENTRY_TYPE_u32 = (ENTRY_TYPE_FIX + 1),
|
||||
ENTRY_TYPE_s64 = (ENTRY_TYPE_FIX + 2),
|
||||
ENTRY_TYPE_u64 = (ENTRY_TYPE_FIX + 3),
|
||||
/* value only structure */
|
||||
ENTRY_TYPE_st = (ENTRY_TYPE_FIX + 4),
|
||||
|
||||
/* kernel and userspace share data */
|
||||
ENTRY_TYPE_SHARE = 0x6,
|
||||
/* share memory between kernel and userspace */
|
||||
ENTRY_TYPE_shm = (ENTRY_TYPE_SHARE + 0),
|
||||
|
||||
/* kernel access only data */
|
||||
ENTRY_TYPE_KERNEL = 0x8,
|
||||
/* kenrel object poineter */
|
||||
ENTRY_TYPE_kobj = (ENTRY_TYPE_KERNEL + 0),
|
||||
/* kenrel normal data poineter */
|
||||
ENTRY_TYPE_kptr = (ENTRY_TYPE_KERNEL + 1),
|
||||
/* kernel function poineter */
|
||||
ENTRY_TYPE_kfp = (ENTRY_TYPE_KERNEL + 2),
|
||||
|
||||
/* userspace access only data */
|
||||
ENTRY_TYPE_USER = 0xc,
|
||||
/* userspace object poineter */
|
||||
ENTRY_TYPE_uobj = (ENTRY_TYPE_USER + 0),
|
||||
/* userspace normal data poineter */
|
||||
ENTRY_TYPE_uptr = (ENTRY_TYPE_USER + 1),
|
||||
/* userspace function poineter */
|
||||
ENTRY_TYPE_ufp = (ENTRY_TYPE_USER + 2),
|
||||
|
||||
ENTRY_TYPE_BUTT = 0xf,
|
||||
ENTRY_TYPE_NONE = 0x0, /* invalid entry type */
|
||||
ENTRY_TYPE_VAL = 0x1, /* 32-bit value */
|
||||
ENTRY_TYPE_STR = 0x2, /* string info property */
|
||||
ENTRY_TYPE_LOC_TBL = 0x3, /* entry location table */
|
||||
ENTRY_TYPE_BUTT,
|
||||
} EntryType;
|
||||
|
||||
/* location table */
|
||||
typedef union MppLocTbl_u {
|
||||
rk_u64 val;
|
||||
struct {
|
||||
rk_u16 data_offset;
|
||||
rk_u16 data_size : 12;
|
||||
EntryType data_type : 4;
|
||||
rk_u16 flag_offset;
|
||||
rk_u16 flag_value;
|
||||
/*
|
||||
* 4-bit extention flag for different entry property
|
||||
* EntryValFlag - for ENTRY_TYPE_VAL
|
||||
* EntryValFlag - for ENTRY_TYPE_STR
|
||||
* EntryLocTblFlag - for ENTRY_TYPE_LOC_TBL
|
||||
*/
|
||||
typedef enum EntryValFlag_e {
|
||||
/*
|
||||
* 0 - value is unsigned value
|
||||
* 1 - value is signed value
|
||||
*/
|
||||
VALUE_SIGNED = 0x1,
|
||||
} EntryValFlag;
|
||||
|
||||
typedef enum EntryValUsage_e {
|
||||
VALUE_NORMAL = 0x0,
|
||||
|
||||
VALUE_TRIE = 0x10,
|
||||
/* trie info value */
|
||||
VALUE_TRIE_INFO = (VALUE_TRIE + 1),
|
||||
/* trie offset from the trie root */
|
||||
VALUE_TRIE_OFFSET = (VALUE_TRIE + 2),
|
||||
|
||||
/* ioctl cmd */
|
||||
VALUE_IOCTL_CMD = 0x20,
|
||||
} EntryValUsage;
|
||||
|
||||
typedef enum EntryStrFlag_e {
|
||||
STRING_NORMAL = 0x0,
|
||||
/* string is trie self info */
|
||||
STRING_TRIE = 0x1,
|
||||
} EntryStrFlag;
|
||||
|
||||
typedef enum EntryLocTblFlag_e {
|
||||
/*
|
||||
* bit 4 - element can be accessed by kernel
|
||||
* bit 5 - element can be accessed by userspace
|
||||
* bit 6 - element is read-only
|
||||
*/
|
||||
LOCTBL_KERNEL = 0x1,
|
||||
LOCTBL_USERSPACE = 0x2,
|
||||
LOCTBL_READONLY = 0x4,
|
||||
} EntryLocTblFlag;
|
||||
|
||||
typedef enum ElemType_e {
|
||||
/* commaon fix size value */
|
||||
ELEM_TYPE_FIX = 0x0,
|
||||
ELEM_TYPE_s32 = (ELEM_TYPE_FIX + 0),
|
||||
ELEM_TYPE_u32 = (ELEM_TYPE_FIX + 1),
|
||||
ELEM_TYPE_s64 = (ELEM_TYPE_FIX + 2),
|
||||
ELEM_TYPE_u64 = (ELEM_TYPE_FIX + 3),
|
||||
/* pointer type stored by 64-bit */
|
||||
ELEM_TYPE_ptr = (ELEM_TYPE_FIX + 4),
|
||||
/* value only structure */
|
||||
ELEM_TYPE_st = (ELEM_TYPE_FIX + 5),
|
||||
|
||||
/* kernel and userspace share data */
|
||||
ELEM_TYPE_SHARE = 0x6,
|
||||
/* share memory between kernel and userspace */
|
||||
ELEM_TYPE_shm = (ELEM_TYPE_SHARE + 0),
|
||||
|
||||
/* kernel access only data */
|
||||
ELEM_TYPE_KERNEL = 0x8,
|
||||
/* kenrel object poineter */
|
||||
ELEM_TYPE_kobj = (ELEM_TYPE_KERNEL + 0),
|
||||
/* kenrel normal data poineter */
|
||||
ELEM_TYPE_kptr = (ELEM_TYPE_KERNEL + 1),
|
||||
/* kernel function poineter */
|
||||
ELEM_TYPE_kfp = (ELEM_TYPE_KERNEL + 2),
|
||||
|
||||
/* userspace access only data */
|
||||
ELEM_TYPE_USER = 0xc,
|
||||
/* userspace object poineter */
|
||||
ELEM_TYPE_uobj = (ELEM_TYPE_USER + 0),
|
||||
/* userspace normal data poineter */
|
||||
ELEM_TYPE_uptr = (ELEM_TYPE_USER + 1),
|
||||
/* userspace function poineter */
|
||||
ELEM_TYPE_ufp = (ELEM_TYPE_USER + 2),
|
||||
|
||||
ELEM_TYPE_BUTT = 0xf,
|
||||
} ElemType;
|
||||
|
||||
/* element update flag type */
|
||||
typedef enum ElemFlagType_e {
|
||||
ELEM_FLAG_NONE, /* element without update flag */
|
||||
ELEM_FLAG_START, /* element update flag will align to new 32bit */
|
||||
ELEM_FLAG_UPDATE, /* element flag increase by one */
|
||||
ELEM_FLAG_HOLD, /* element flag equal to previous one */
|
||||
} ElemFlagType;
|
||||
|
||||
typedef union KmppEntry_u {
|
||||
rk_u64 val;
|
||||
union {
|
||||
EntryType type : 4;
|
||||
struct {
|
||||
EntryType prop : 4;
|
||||
EntryValFlag flag : 4;
|
||||
EntryValUsage usage : 24;
|
||||
rk_u32 val;
|
||||
} v;
|
||||
struct {
|
||||
EntryType prop : 4;
|
||||
EntryValFlag flag : 4;
|
||||
rk_u32 len : 24;
|
||||
rk_u32 offset;
|
||||
} str;
|
||||
struct {
|
||||
EntryType type : 4;
|
||||
EntryLocTblFlag flag : 4;
|
||||
ElemType elem_type : 8;
|
||||
rk_u16 elem_size;
|
||||
rk_u16 elem_offset;
|
||||
rk_u16 flag_offset; /* define by ElemFlagType */
|
||||
} tbl;
|
||||
};
|
||||
} KmppLocTbl;
|
||||
} KmppEntry;
|
||||
|
||||
/* MUST be the same to the KmppObjShm in rk-mpp-kobj.h */
|
||||
typedef struct KmppShmPtr_t {
|
||||
@@ -127,16 +220,16 @@ rk_s32 kmpp_obj_set_u64(KmppObj obj, const char *name, rk_u64 val);
|
||||
rk_s32 kmpp_obj_get_u64(KmppObj obj, const char *name, rk_u64 *val);
|
||||
rk_s32 kmpp_obj_set_st(KmppObj obj, const char *name, void *val);
|
||||
rk_s32 kmpp_obj_get_st(KmppObj obj, const char *name, void *val);
|
||||
rk_s32 kmpp_obj_tbl_set_s32(KmppObj obj, KmppLocTbl *tbl, rk_s32 val);
|
||||
rk_s32 kmpp_obj_tbl_get_s32(KmppObj obj, KmppLocTbl *tbl, rk_s32 *val);
|
||||
rk_s32 kmpp_obj_tbl_set_u32(KmppObj obj, KmppLocTbl *tbl, rk_u32 val);
|
||||
rk_s32 kmpp_obj_tbl_get_u32(KmppObj obj, KmppLocTbl *tbl, rk_u32 *val);
|
||||
rk_s32 kmpp_obj_tbl_set_s64(KmppObj obj, KmppLocTbl *tbl, rk_s64 val);
|
||||
rk_s32 kmpp_obj_tbl_get_s64(KmppObj obj, KmppLocTbl *tbl, rk_s64 *val);
|
||||
rk_s32 kmpp_obj_tbl_set_u64(KmppObj obj, KmppLocTbl *tbl, rk_u64 val);
|
||||
rk_s32 kmpp_obj_tbl_get_u64(KmppObj obj, KmppLocTbl *tbl, rk_u64 *val);
|
||||
rk_s32 kmpp_obj_tbl_set_st(KmppObj obj, KmppLocTbl *tbl, void *val);
|
||||
rk_s32 kmpp_obj_tbl_get_st(KmppObj obj, KmppLocTbl *tbl, void *val);
|
||||
rk_s32 kmpp_obj_tbl_set_s32(KmppObj obj, KmppEntry *tbl, rk_s32 val);
|
||||
rk_s32 kmpp_obj_tbl_get_s32(KmppObj obj, KmppEntry *tbl, rk_s32 *val);
|
||||
rk_s32 kmpp_obj_tbl_set_u32(KmppObj obj, KmppEntry *tbl, rk_u32 val);
|
||||
rk_s32 kmpp_obj_tbl_get_u32(KmppObj obj, KmppEntry *tbl, rk_u32 *val);
|
||||
rk_s32 kmpp_obj_tbl_set_s64(KmppObj obj, KmppEntry *tbl, rk_s64 val);
|
||||
rk_s32 kmpp_obj_tbl_get_s64(KmppObj obj, KmppEntry *tbl, rk_s64 *val);
|
||||
rk_s32 kmpp_obj_tbl_set_u64(KmppObj obj, KmppEntry *tbl, rk_u64 val);
|
||||
rk_s32 kmpp_obj_tbl_get_u64(KmppObj obj, KmppEntry *tbl, rk_u64 *val);
|
||||
rk_s32 kmpp_obj_tbl_set_st(KmppObj obj, KmppEntry *tbl, void *val);
|
||||
rk_s32 kmpp_obj_tbl_get_st(KmppObj obj, KmppEntry *tbl, void *val);
|
||||
|
||||
/* userspace access only function */
|
||||
rk_s32 kmpp_obj_set_obj(KmppObj obj, const char *name, KmppObj val);
|
||||
@@ -145,18 +238,18 @@ rk_s32 kmpp_obj_set_ptr(KmppObj obj, const char *name, void *val);
|
||||
rk_s32 kmpp_obj_get_ptr(KmppObj obj, const char *name, void **val);
|
||||
rk_s32 kmpp_obj_set_fp(KmppObj obj, const char *name, void *val);
|
||||
rk_s32 kmpp_obj_get_fp(KmppObj obj, const char *name, void **val);
|
||||
rk_s32 kmpp_obj_tbl_set_obj(KmppObj obj, KmppLocTbl *tbl, KmppObj val);
|
||||
rk_s32 kmpp_obj_tbl_get_obj(KmppObj obj, KmppLocTbl *tbl, KmppObj *val);
|
||||
rk_s32 kmpp_obj_tbl_set_ptr(KmppObj obj, KmppLocTbl *tbl, void *val);
|
||||
rk_s32 kmpp_obj_tbl_get_ptr(KmppObj obj, KmppLocTbl *tbl, void **val);
|
||||
rk_s32 kmpp_obj_tbl_set_fp(KmppObj obj, KmppLocTbl *tbl, void *val);
|
||||
rk_s32 kmpp_obj_tbl_get_fp(KmppObj obj, KmppLocTbl *tbl, void **val);
|
||||
rk_s32 kmpp_obj_tbl_set_obj(KmppObj obj, KmppEntry *tbl, KmppObj val);
|
||||
rk_s32 kmpp_obj_tbl_get_obj(KmppObj obj, KmppEntry *tbl, KmppObj *val);
|
||||
rk_s32 kmpp_obj_tbl_set_ptr(KmppObj obj, KmppEntry *tbl, void *val);
|
||||
rk_s32 kmpp_obj_tbl_get_ptr(KmppObj obj, KmppEntry *tbl, void **val);
|
||||
rk_s32 kmpp_obj_tbl_set_fp(KmppObj obj, KmppEntry *tbl, void *val);
|
||||
rk_s32 kmpp_obj_tbl_get_fp(KmppObj obj, KmppEntry *tbl, void **val);
|
||||
|
||||
/* share access function */
|
||||
rk_s32 kmpp_obj_set_shm(KmppObj obj, const char *name, KmppShmPtr *val);
|
||||
rk_s32 kmpp_obj_get_shm(KmppObj obj, const char *name, KmppShmPtr *val);
|
||||
rk_s32 kmpp_obj_tbl_set_shm(KmppObj obj, KmppLocTbl *tbl, KmppShmPtr *val);
|
||||
rk_s32 kmpp_obj_tbl_get_shm(KmppObj obj, KmppLocTbl *tbl, KmppShmPtr *val);
|
||||
rk_s32 kmpp_obj_tbl_set_shm(KmppObj obj, KmppEntry *tbl, KmppShmPtr *val);
|
||||
rk_s32 kmpp_obj_tbl_get_shm(KmppObj obj, KmppEntry *tbl, KmppShmPtr *val);
|
||||
|
||||
/* helper for get share object from a share memory element */
|
||||
rk_s32 kmpp_obj_set_shm_obj(KmppObj obj, const char *name, KmppObj val);
|
||||
|
@@ -38,7 +38,7 @@
|
||||
|
||||
#define ENTRY_TO_TRIE1(ftype, type, f1) \
|
||||
do { \
|
||||
KmppLocTbl tbl = FIELD_TO_LOCTBL_ACCESS1(f1, ftype); \
|
||||
KmppEntry tbl = FIELD_TO_LOCTBL_ACCESS1(f1, ftype); \
|
||||
kmpp_objdef_add_entry(KMPP_OBJ_IMPL_DEF, #f1, &tbl); \
|
||||
} while (0);
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
|
||||
#define ENTRY_TO_TRIE2(ftype, type, f1, f2) \
|
||||
do { \
|
||||
KmppLocTbl tbl = FIELD_TO_LOCTBL_ACCESS2(KMPP_OBJ_IMPL_TYPE, f1, f2, ftype); \
|
||||
KmppEntry tbl = FIELD_TO_LOCTBL_ACCESS2(KMPP_OBJ_IMPL_TYPE, f1, f2, ftype); \
|
||||
kmpp_objdef_add_entry(KMPP_OBJ_IMPL_DEF, #f1":"#f2, &tbl); \
|
||||
} while (0);
|
||||
|
||||
|
@@ -8,25 +8,25 @@
|
||||
|
||||
#include "kmpp_obj.h"
|
||||
|
||||
rk_s32 kmpp_obj_impl_set_s32(KmppLocTbl *tbl, void *entry, rk_s32 val);
|
||||
rk_s32 kmpp_obj_impl_get_s32(KmppLocTbl *tbl, void *entry, rk_s32 *val);
|
||||
rk_s32 kmpp_obj_impl_set_u32(KmppLocTbl *tbl, void *entry, rk_u32 val);
|
||||
rk_s32 kmpp_obj_impl_get_u32(KmppLocTbl *tbl, void *entry, rk_u32 *val);
|
||||
rk_s32 kmpp_obj_impl_set_s64(KmppLocTbl *tbl, void *entry, rk_s64 val);
|
||||
rk_s32 kmpp_obj_impl_get_s64(KmppLocTbl *tbl, void *entry, rk_s64 *val);
|
||||
rk_s32 kmpp_obj_impl_set_u64(KmppLocTbl *tbl, void *entry, rk_u64 val);
|
||||
rk_s32 kmpp_obj_impl_get_u64(KmppLocTbl *tbl, void *entry, rk_u64 *val);
|
||||
rk_s32 kmpp_obj_impl_set_st(KmppLocTbl *tbl, void *entry, void *val);
|
||||
rk_s32 kmpp_obj_impl_get_st(KmppLocTbl *tbl, void *entry, void *val);
|
||||
rk_s32 kmpp_obj_impl_set_s32(KmppEntry *tbl, void *entry, rk_s32 val);
|
||||
rk_s32 kmpp_obj_impl_get_s32(KmppEntry *tbl, void *entry, rk_s32 *val);
|
||||
rk_s32 kmpp_obj_impl_set_u32(KmppEntry *tbl, void *entry, rk_u32 val);
|
||||
rk_s32 kmpp_obj_impl_get_u32(KmppEntry *tbl, void *entry, rk_u32 *val);
|
||||
rk_s32 kmpp_obj_impl_set_s64(KmppEntry *tbl, void *entry, rk_s64 val);
|
||||
rk_s32 kmpp_obj_impl_get_s64(KmppEntry *tbl, void *entry, rk_s64 *val);
|
||||
rk_s32 kmpp_obj_impl_set_u64(KmppEntry *tbl, void *entry, rk_u64 val);
|
||||
rk_s32 kmpp_obj_impl_get_u64(KmppEntry *tbl, void *entry, rk_u64 *val);
|
||||
rk_s32 kmpp_obj_impl_set_st(KmppEntry *tbl, void *entry, void *val);
|
||||
rk_s32 kmpp_obj_impl_get_st(KmppEntry *tbl, void *entry, void *val);
|
||||
|
||||
rk_s32 kmpp_obj_impl_set_shm(KmppLocTbl *tbl, void *entry, KmppShmPtr *val);
|
||||
rk_s32 kmpp_obj_impl_get_shm(KmppLocTbl *tbl, void *entry, KmppShmPtr *val);
|
||||
rk_s32 kmpp_obj_impl_set_shm(KmppEntry *tbl, void *entry, KmppShmPtr *val);
|
||||
rk_s32 kmpp_obj_impl_get_shm(KmppEntry *tbl, void *entry, KmppShmPtr *val);
|
||||
|
||||
rk_s32 kmpp_obj_impl_set_obj(KmppLocTbl *tbl, void *entry, void *val);
|
||||
rk_s32 kmpp_obj_impl_get_obj(KmppLocTbl *tbl, void *entry, void **val);
|
||||
rk_s32 kmpp_obj_impl_set_ptr(KmppLocTbl *tbl, void *entry, void *val);
|
||||
rk_s32 kmpp_obj_impl_get_ptr(KmppLocTbl *tbl, void *entry, void **val);
|
||||
rk_s32 kmpp_obj_impl_set_fp(KmppLocTbl *tbl, void *entry, void *val);
|
||||
rk_s32 kmpp_obj_impl_get_fp(KmppLocTbl *tbl, void *entry, void **val);
|
||||
rk_s32 kmpp_obj_impl_set_obj(KmppEntry *tbl, void *entry, void *val);
|
||||
rk_s32 kmpp_obj_impl_get_obj(KmppEntry *tbl, void *entry, void **val);
|
||||
rk_s32 kmpp_obj_impl_set_ptr(KmppEntry *tbl, void *entry, void *val);
|
||||
rk_s32 kmpp_obj_impl_get_ptr(KmppEntry *tbl, void *entry, void **val);
|
||||
rk_s32 kmpp_obj_impl_set_fp(KmppEntry *tbl, void *entry, void *val);
|
||||
rk_s32 kmpp_obj_impl_get_fp(KmppEntry *tbl, void *entry, void **val);
|
||||
|
||||
#endif /* __KMPP_OBJ_IMPL_H__ */
|
@@ -45,7 +45,7 @@
|
||||
|
||||
#define U64_TO_PTR(ptr) ((void *)(intptr_t)(ptr))
|
||||
|
||||
#define ENTRY_TO_PTR(tbl, entry) (((char *)entry) + tbl->data_offset)
|
||||
#define ENTRY_TO_PTR(tbl, entry) (((char *)entry) + tbl->tbl.elem_offset)
|
||||
#define ENTRY_TO_s32_PTR(tbl, entry) ((rk_s32 *)ENTRY_TO_PTR(tbl, entry))
|
||||
#define ENTRY_TO_u32_PTR(tbl, entry) ((rk_u32 *)ENTRY_TO_PTR(tbl, entry))
|
||||
#define ENTRY_TO_s64_PTR(tbl, entry) ((rk_s64 *)ENTRY_TO_PTR(tbl, entry))
|
||||
@@ -56,7 +56,19 @@
|
||||
#define ENTRY_TO_st_PTR(tbl, entry) ((void *)ENTRY_TO_PTR(tbl, entry))
|
||||
#define ENTRY_TO_shm_PTR(tbl, entry) ((void *)ENTRY_TO_PTR(tbl, entry))
|
||||
|
||||
#define ENTRY_TO_FLAG_PTR(tbl, entry) ((rk_u16 *)((char *)entry + tbl->flag_offset))
|
||||
/* 32bit unsigned long pointer */
|
||||
#define ELEM_FLAG_U32_POS(offset) (((offset) & (~31)) / 8)
|
||||
#define ELEM_FLAG_BIT_POS(offset) ((offset) & 31)
|
||||
#define ENTRY_TO_FLAG_PTR(tbl, entry) ((rk_ul *)((rk_u8 *)entry + ELEM_FLAG_U32_POS(tbl->tbl.flag_offset)))
|
||||
|
||||
#define ENTRY_SET_FLAG(tbl, entry) \
|
||||
*ENTRY_TO_FLAG_PTR(tbl, entry) |= 1ul << (ELEM_FLAG_BIT_POS(tbl->tbl.flag_offset))
|
||||
|
||||
#define ENTRY_CLR_FLAG(tbl, entry) \
|
||||
*ENTRY_TO_FLAG_PTR(tbl, entry) &= ~(1ul << (ELEM_FLAG_BIT_POS(tbl->tbl.flag_offset)))
|
||||
|
||||
#define ENTRY_TEST_FLAG(tbl, entry) \
|
||||
(*ENTRY_TO_FLAG_PTR(tbl, entry) & 1ul << (ELEM_FLAG_BIT_POS(tbl->tbl.flag_offset))) ? 1 : 0
|
||||
|
||||
/* kernel object share memory get / put ioctl data */
|
||||
typedef struct KmppObjIocArg_t {
|
||||
@@ -118,52 +130,52 @@ static KmppObjs *objs = NULL;
|
||||
|
||||
const char *strof_entry_type(EntryType type)
|
||||
{
|
||||
static const char *entry_type_names[] = {
|
||||
[ENTRY_TYPE_s32] = "s32",
|
||||
[ENTRY_TYPE_u32] = "u32",
|
||||
[ENTRY_TYPE_s64] = "s64",
|
||||
[ENTRY_TYPE_u64] = "u64",
|
||||
[ENTRY_TYPE_st] = "struct",
|
||||
[ENTRY_TYPE_shm] = "shm_ptr",
|
||||
[ENTRY_TYPE_kobj] = "kobj",
|
||||
[ENTRY_TYPE_kptr] = "kptr",
|
||||
[ENTRY_TYPE_kfp] = "kfunc_ptr",
|
||||
[ENTRY_TYPE_uobj] = "uobj",
|
||||
[ENTRY_TYPE_uptr] = "uptr",
|
||||
[ENTRY_TYPE_ufp] = "ufunc_ptr",
|
||||
static const char *ELEM_TYPE_names[] = {
|
||||
[ELEM_TYPE_s32] = "s32",
|
||||
[ELEM_TYPE_u32] = "u32",
|
||||
[ELEM_TYPE_s64] = "s64",
|
||||
[ELEM_TYPE_u64] = "u64",
|
||||
[ELEM_TYPE_st] = "struct",
|
||||
[ELEM_TYPE_shm] = "shm_ptr",
|
||||
[ELEM_TYPE_kobj] = "kobj",
|
||||
[ELEM_TYPE_kptr] = "kptr",
|
||||
[ELEM_TYPE_kfp] = "kfunc_ptr",
|
||||
[ELEM_TYPE_uobj] = "uobj",
|
||||
[ELEM_TYPE_uptr] = "uptr",
|
||||
[ELEM_TYPE_ufp] = "ufunc_ptr",
|
||||
};
|
||||
static const char *invalid_type_str = "invalid";
|
||||
|
||||
if (type & (~ENTRY_TYPE_BUTT))
|
||||
if (type & (~ELEM_TYPE_BUTT))
|
||||
return invalid_type_str;
|
||||
|
||||
return entry_type_names[type] ? entry_type_names[type] : invalid_type_str;
|
||||
return ELEM_TYPE_names[type] ? ELEM_TYPE_names[type] : invalid_type_str;
|
||||
}
|
||||
|
||||
#define MPP_OBJ_ACCESS_IMPL(type, base_type, log_str) \
|
||||
rk_s32 kmpp_obj_impl_set_##type(KmppLocTbl *tbl, void *entry, base_type val) \
|
||||
rk_s32 kmpp_obj_impl_set_##type(KmppEntry *tbl, void *entry, base_type val) \
|
||||
{ \
|
||||
base_type *dst = ENTRY_TO_##type##_PTR(tbl, entry); \
|
||||
base_type old = dst[0]; \
|
||||
dst[0] = val; \
|
||||
if (!tbl->flag_value) { \
|
||||
obj_dbg_set("%p + %x set " #type " change " #log_str " -> " #log_str "\n", entry, tbl->data_offset, old, val); \
|
||||
if (!tbl->tbl.flag_offset) { \
|
||||
obj_dbg_set("%p + %x set " #type " change " #log_str " -> " #log_str "\n", entry, tbl->tbl.elem_offset, old, val); \
|
||||
} else { \
|
||||
if (old != val) { \
|
||||
obj_dbg_set("%p + %x set " #type " update " #log_str " -> " #log_str " flag %d|%x\n", \
|
||||
entry, tbl->data_offset, old, val, tbl->flag_offset, tbl->flag_value); \
|
||||
ENTRY_TO_FLAG_PTR(tbl, entry)[0] |= tbl->flag_value; \
|
||||
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_SET_FLAG(tbl, entry); \
|
||||
} else { \
|
||||
obj_dbg_set("%p + %x set " #type " keep " #log_str "\n", entry, tbl->data_offset, old); \
|
||||
obj_dbg_set("%p + %x set " #type " keep " #log_str "\n", entry, tbl->tbl.elem_offset, old); \
|
||||
} \
|
||||
} \
|
||||
return MPP_OK; \
|
||||
} \
|
||||
rk_s32 kmpp_obj_impl_get_##type(KmppLocTbl *tbl, void *entry, base_type *val) \
|
||||
rk_s32 kmpp_obj_impl_get_##type(KmppEntry *tbl, void *entry, base_type *val) \
|
||||
{ \
|
||||
if (tbl && tbl->data_size) { \
|
||||
if (tbl && tbl->tbl.elem_size) { \
|
||||
base_type *src = ENTRY_TO_##type##_PTR(tbl, entry); \
|
||||
obj_dbg_get("%p + %x get " #type " value " #log_str "\n", entry, tbl->data_offset, src[0]); \
|
||||
obj_dbg_get("%p + %x get " #type " value " #log_str "\n", entry, tbl->tbl.elem_offset, src[0]); \
|
||||
val[0] = src[0]; \
|
||||
return MPP_OK; \
|
||||
} \
|
||||
@@ -179,32 +191,32 @@ MPP_OBJ_ACCESS_IMPL(ptr, void *, % p)
|
||||
MPP_OBJ_ACCESS_IMPL(fp, void *, % p)
|
||||
|
||||
#define MPP_OBJ_STRUCT_ACCESS_IMPL(type, base_type, log_str) \
|
||||
rk_s32 kmpp_obj_impl_set_##type(KmppLocTbl *tbl, void *entry, base_type *val) \
|
||||
rk_s32 kmpp_obj_impl_set_##type(KmppEntry *tbl, void *entry, base_type *val) \
|
||||
{ \
|
||||
void *dst = ENTRY_TO_##type##_PTR(tbl, entry); \
|
||||
if (!tbl->flag_value) { \
|
||||
if (!tbl->tbl.flag_offset) { \
|
||||
/* simple copy */ \
|
||||
obj_dbg_set("%p + %x set " #type " size %d change %p -> %p\n", entry, tbl->data_offset, tbl->data_size, dst, val); \
|
||||
memcpy(dst, val, tbl->data_size); \
|
||||
obj_dbg_set("%p + %x set " #type " size %d change %p -> %p\n", entry, tbl->tbl.elem_offset, tbl->tbl.elem_size, dst, val); \
|
||||
memcpy(dst, val, tbl->tbl.elem_size); \
|
||||
return MPP_OK; \
|
||||
} \
|
||||
/* copy with flag check and updata */ \
|
||||
if (memcmp(dst, val, tbl->data_size)) { \
|
||||
obj_dbg_set("%p + %x set " #type " size %d update %p -> %p flag %d|%x\n", \
|
||||
entry, tbl->data_offset, tbl->data_size, dst, val, tbl->flag_offset, tbl->flag_value); \
|
||||
memcpy(dst, val, tbl->data_size); \
|
||||
ENTRY_TO_FLAG_PTR(tbl, entry)[0] |= tbl->flag_value; \
|
||||
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); \
|
||||
memcpy(dst, val, tbl->tbl.elem_size); \
|
||||
ENTRY_SET_FLAG(tbl, entry); \
|
||||
} else { \
|
||||
obj_dbg_set("%p + %x set " #type " size %d keep %p\n", entry, tbl->data_offset, tbl->data_size, dst); \
|
||||
obj_dbg_set("%p + %x set " #type " size %d keep %p\n", entry, tbl->tbl.elem_offset, tbl->tbl.elem_size, dst); \
|
||||
} \
|
||||
return MPP_OK; \
|
||||
} \
|
||||
rk_s32 kmpp_obj_impl_get_##type(KmppLocTbl *tbl, void *entry, base_type *val) \
|
||||
rk_s32 kmpp_obj_impl_get_##type(KmppEntry *tbl, void *entry, base_type *val) \
|
||||
{ \
|
||||
if (tbl && tbl->data_size) { \
|
||||
if (tbl && tbl->tbl.elem_size) { \
|
||||
void *src = ENTRY_TO_##type##_PTR(tbl, entry); \
|
||||
obj_dbg_get("%p + %x get " #type " size %d value " #log_str "\n", entry, tbl->data_offset, tbl->data_size, src); \
|
||||
memcpy(val, src, tbl->data_size); \
|
||||
obj_dbg_get("%p + %x get " #type " size %d value " #log_str "\n", entry, tbl->tbl.elem_offset, tbl->tbl.elem_size, src); \
|
||||
memcpy(val, src, tbl->tbl.elem_size); \
|
||||
return MPP_OK; \
|
||||
} \
|
||||
return MPP_NOK; \
|
||||
@@ -436,11 +448,11 @@ rk_s32 kmpp_objdef_dump(KmppObjDef def)
|
||||
while (info) {
|
||||
name = mpp_trie_info_name(info);
|
||||
if (!strstr(name, "__")) {
|
||||
KmppLocTbl *tbl = (KmppLocTbl *)mpp_trie_info_ctx(info);
|
||||
KmppEntry *tbl = (KmppEntry *)mpp_trie_info_ctx(info);
|
||||
rk_s32 idx = i++;
|
||||
|
||||
mpp_logi("%-2d - %-16s offset %4d size %d\n", idx,
|
||||
name, tbl->data_offset, tbl->data_size);
|
||||
name, tbl->tbl.elem_offset, tbl->tbl.elem_size);
|
||||
}
|
||||
info = mpp_trie_get_info_next(trie, info);
|
||||
}
|
||||
@@ -778,10 +790,10 @@ rk_s32 kmpp_obj_get_offset(KmppObj obj, const char *name)
|
||||
MppTrieInfo *info = mpp_trie_get_info(impl->trie, name);
|
||||
|
||||
if (info) {
|
||||
KmppLocTbl *tbl = (KmppLocTbl *)mpp_trie_info_ctx(info);
|
||||
KmppEntry *tbl = (KmppEntry *)mpp_trie_info_ctx(info);
|
||||
|
||||
if (tbl)
|
||||
return tbl->data_offset;
|
||||
return tbl->tbl.elem_offset;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -798,7 +810,7 @@ rk_s32 kmpp_obj_get_offset(KmppObj obj, const char *name)
|
||||
if (impl->trie) { \
|
||||
MppTrieInfo *info = mpp_trie_get_info(impl->trie, name); \
|
||||
if (info) { \
|
||||
KmppLocTbl *tbl = (KmppLocTbl *)mpp_trie_info_ctx(info); \
|
||||
KmppEntry *tbl = (KmppEntry *)mpp_trie_info_ctx(info); \
|
||||
ret = kmpp_obj_impl_set_##type(tbl, impl->entry, val); \
|
||||
} \
|
||||
} \
|
||||
@@ -814,7 +826,7 @@ rk_s32 kmpp_obj_get_offset(KmppObj obj, const char *name)
|
||||
if (impl->trie) { \
|
||||
MppTrieInfo *info = mpp_trie_get_info(impl->trie, name); \
|
||||
if (info) { \
|
||||
KmppLocTbl *tbl = (KmppLocTbl *)mpp_trie_info_ctx(info); \
|
||||
KmppEntry *tbl = (KmppEntry *)mpp_trie_info_ctx(info); \
|
||||
ret = kmpp_obj_impl_get_##type(tbl, impl->entry, val); \
|
||||
} \
|
||||
} \
|
||||
@@ -840,7 +852,7 @@ MPP_OBJ_ACCESS(fp, void *)
|
||||
if (impl->trie) { \
|
||||
MppTrieInfo *info = mpp_trie_get_info(impl->trie, name); \
|
||||
if (info) { \
|
||||
KmppLocTbl *tbl = (KmppLocTbl *)mpp_trie_info_ctx(info); \
|
||||
KmppEntry *tbl = (KmppEntry *)mpp_trie_info_ctx(info); \
|
||||
ret = kmpp_obj_impl_set_##type(tbl, impl->entry, val); \
|
||||
} \
|
||||
} \
|
||||
@@ -856,7 +868,7 @@ MPP_OBJ_ACCESS(fp, void *)
|
||||
if (impl->trie) { \
|
||||
MppTrieInfo *info = mpp_trie_get_info(impl->trie, name); \
|
||||
if (info) { \
|
||||
KmppLocTbl *tbl = (KmppLocTbl *)mpp_trie_info_ctx(info); \
|
||||
KmppEntry *tbl = (KmppEntry *)mpp_trie_info_ctx(info); \
|
||||
ret = kmpp_obj_impl_get_##type(tbl, impl->entry, val); \
|
||||
} \
|
||||
} \
|
||||
@@ -870,7 +882,7 @@ MPP_OBJ_STRUCT_ACCESS(st, void)
|
||||
MPP_OBJ_STRUCT_ACCESS(shm, KmppShmPtr)
|
||||
|
||||
#define MPP_OBJ_TBL_ACCESS(type, base_type) \
|
||||
rk_s32 kmpp_obj_tbl_set_##type(KmppObj obj, KmppLocTbl *tbl, base_type val) \
|
||||
rk_s32 kmpp_obj_tbl_set_##type(KmppObj obj, KmppEntry *tbl, base_type val) \
|
||||
{ \
|
||||
KmppObjImpl *impl = (KmppObjImpl *)obj; \
|
||||
rk_s32 ret = MPP_NOK; \
|
||||
@@ -881,7 +893,7 @@ MPP_OBJ_STRUCT_ACCESS(shm, KmppShmPtr)
|
||||
impl ? impl->def ? impl->def->name : NULL : NULL, tbl ? tbl->val : 0, ret); \
|
||||
return ret; \
|
||||
} \
|
||||
rk_s32 kmpp_obj_tbl_get_##type(KmppObj obj, KmppLocTbl *tbl, base_type *val) \
|
||||
rk_s32 kmpp_obj_tbl_get_##type(KmppObj obj, KmppEntry *tbl, base_type *val) \
|
||||
{ \
|
||||
KmppObjImpl *impl = (KmppObjImpl *)obj; \
|
||||
rk_s32 ret = MPP_NOK; \
|
||||
@@ -902,7 +914,7 @@ MPP_OBJ_TBL_ACCESS(ptr, void *)
|
||||
MPP_OBJ_TBL_ACCESS(fp, void *)
|
||||
|
||||
#define MPP_OBJ_STRUCT_TBL_ACCESS(type, base_type) \
|
||||
rk_s32 kmpp_obj_tbl_set_##type(KmppObj obj, KmppLocTbl *tbl, base_type *val) \
|
||||
rk_s32 kmpp_obj_tbl_set_##type(KmppObj obj, KmppEntry *tbl, base_type *val) \
|
||||
{ \
|
||||
KmppObjImpl *impl = (KmppObjImpl *)obj; \
|
||||
rk_s32 ret = MPP_NOK; \
|
||||
@@ -913,7 +925,7 @@ MPP_OBJ_TBL_ACCESS(fp, void *)
|
||||
impl ? impl->def ? impl->def->name : NULL : NULL, tbl ? tbl->val : 0, ret); \
|
||||
return ret; \
|
||||
} \
|
||||
rk_s32 kmpp_obj_tbl_get_##type(KmppObj obj, KmppLocTbl *tbl, base_type *val) \
|
||||
rk_s32 kmpp_obj_tbl_get_##type(KmppObj obj, KmppEntry *tbl, base_type *val) \
|
||||
{ \
|
||||
KmppObjImpl *impl = (KmppObjImpl *)obj; \
|
||||
rk_s32 ret = MPP_NOK; \
|
||||
@@ -987,7 +999,7 @@ rk_s32 kmpp_obj_run(KmppObj obj, const char *name)
|
||||
void *val = NULL;
|
||||
|
||||
if (info) {
|
||||
KmppLocTbl *tbl = (KmppLocTbl *)mpp_trie_info_ctx(info);
|
||||
KmppEntry *tbl = (KmppEntry *)mpp_trie_info_ctx(info);
|
||||
|
||||
ret = kmpp_obj_impl_get_fp(tbl, impl->entry, &val);
|
||||
}
|
||||
@@ -1023,11 +1035,11 @@ rk_s32 kmpp_obj_udump_f(KmppObj obj, const char *caller)
|
||||
while (info) {
|
||||
name = mpp_trie_info_name(info);
|
||||
if (!strstr(name, "__")) {
|
||||
KmppLocTbl *tbl = (KmppLocTbl *)mpp_trie_info_ctx(info);
|
||||
KmppEntry *tbl = (KmppEntry *)mpp_trie_info_ctx(info);
|
||||
rk_s32 idx = i++;
|
||||
|
||||
switch (tbl->data_type) {
|
||||
case ENTRY_TYPE_s32 : {
|
||||
switch (tbl->tbl.elem_type) {
|
||||
case ELEM_TYPE_s32 : {
|
||||
rk_s32 val;
|
||||
rk_s32 val_chk;
|
||||
|
||||
@@ -1041,7 +1053,7 @@ rk_s32 kmpp_obj_udump_f(KmppObj obj, const char *caller)
|
||||
if (val != val_chk)
|
||||
mpp_loge("%-2d - %-16s s32 check failed\n", idx, name);
|
||||
} break;
|
||||
case ENTRY_TYPE_u32 : {
|
||||
case ELEM_TYPE_u32 : {
|
||||
rk_u32 val;
|
||||
rk_u32 val_chk;
|
||||
|
||||
@@ -1055,7 +1067,7 @@ rk_s32 kmpp_obj_udump_f(KmppObj obj, const char *caller)
|
||||
if (val != val_chk)
|
||||
mpp_loge("%-2d - %-16s u32 check failed\n", idx, name);
|
||||
} break;
|
||||
case ENTRY_TYPE_s64 : {
|
||||
case ELEM_TYPE_s64 : {
|
||||
rk_s64 val;
|
||||
rk_s64 val_chk;
|
||||
|
||||
@@ -1069,7 +1081,7 @@ rk_s32 kmpp_obj_udump_f(KmppObj obj, const char *caller)
|
||||
if (val != val_chk)
|
||||
mpp_loge("%-2d - %-16s s64 check failed\n", idx, name);
|
||||
} break;
|
||||
case ENTRY_TYPE_u64 : {
|
||||
case ELEM_TYPE_u64 : {
|
||||
rk_u64 val;
|
||||
rk_u64 val_chk;
|
||||
|
||||
@@ -1083,10 +1095,10 @@ rk_s32 kmpp_obj_udump_f(KmppObj obj, const char *caller)
|
||||
if (val != val_chk)
|
||||
mpp_loge("%-2d - %-16s u64 check failed\n", idx, name);
|
||||
} break;
|
||||
case ENTRY_TYPE_st : {
|
||||
void *val_chk = mpp_malloc_size(void, tbl->data_size);
|
||||
void *val = mpp_malloc_size(void, tbl->data_size);
|
||||
rk_s32 data_size = tbl->data_size;
|
||||
case ELEM_TYPE_st : {
|
||||
void *val_chk = mpp_malloc_size(void, tbl->tbl.elem_size);
|
||||
void *val = mpp_malloc_size(void, tbl->tbl.elem_size);
|
||||
rk_s32 data_size = tbl->tbl.elem_size;
|
||||
char logs[128];
|
||||
|
||||
ret = kmpp_obj_tbl_get_st(obj, tbl, val);
|
||||
@@ -1094,7 +1106,7 @@ rk_s32 kmpp_obj_udump_f(KmppObj obj, const char *caller)
|
||||
rk_s32 pos;
|
||||
|
||||
mpp_logi("%-2d - %-16s st %d:%d\n",
|
||||
idx, name, tbl->data_offset, data_size);
|
||||
idx, name, tbl->tbl.elem_offset, data_size);
|
||||
|
||||
i = 0;
|
||||
for (; i < data_size / 4 - 8; i += 8) {
|
||||
@@ -1116,7 +1128,7 @@ rk_s32 kmpp_obj_udump_f(KmppObj obj, const char *caller)
|
||||
mpp_loge("%-2d - %-16s st get failed\n", idx, name);
|
||||
|
||||
kmpp_obj_get_st(obj, name, val_chk);
|
||||
if (memcmp(val, val_chk, tbl->data_size)) {
|
||||
if (memcmp(val, val_chk, tbl->tbl.elem_size)) {
|
||||
mpp_loge("%-2d - %-16s st check failed\n", idx, name);
|
||||
mpp_loge("val %p\n", val);
|
||||
mpp_loge("val_chk %p\n", val_chk);
|
||||
@@ -1125,9 +1137,9 @@ rk_s32 kmpp_obj_udump_f(KmppObj obj, const char *caller)
|
||||
MPP_FREE(val);
|
||||
MPP_FREE(val_chk);
|
||||
} break;
|
||||
case ENTRY_TYPE_shm : {
|
||||
KmppShmPtr *val_chk = mpp_malloc_size(void, tbl->data_size);
|
||||
KmppShmPtr *val = mpp_malloc_size(void, tbl->data_size);
|
||||
case ELEM_TYPE_shm : {
|
||||
KmppShmPtr *val_chk = mpp_malloc_size(void, tbl->tbl.elem_size);
|
||||
KmppShmPtr *val = mpp_malloc_size(void, tbl->tbl.elem_size);
|
||||
|
||||
ret = kmpp_obj_tbl_get_st(obj, tbl, val);
|
||||
if (!ret)
|
||||
@@ -1137,7 +1149,7 @@ rk_s32 kmpp_obj_udump_f(KmppObj obj, const char *caller)
|
||||
mpp_loge("%-2d - %-16s shm get failed\n", idx, name);
|
||||
|
||||
kmpp_obj_get_st(obj, name, val_chk);
|
||||
if (memcmp(val, val_chk, tbl->data_size)) {
|
||||
if (memcmp(val, val_chk, tbl->tbl.elem_size)) {
|
||||
mpp_loge("%-2d - %-16s shm check failed\n", idx, name);
|
||||
mpp_loge("val %p - %#llx:%#llx\n", val, val->uaddr, val->kaddr);
|
||||
mpp_loge("val_chk %p - %#llx:%#llx\n", val_chk, val_chk->uaddr, val_chk->kaddr);
|
||||
@@ -1146,7 +1158,7 @@ rk_s32 kmpp_obj_udump_f(KmppObj obj, const char *caller)
|
||||
MPP_FREE(val);
|
||||
MPP_FREE(val_chk);
|
||||
} break;
|
||||
case ENTRY_TYPE_uptr : {
|
||||
case ELEM_TYPE_uptr : {
|
||||
void *val;
|
||||
void *val_chk;
|
||||
|
||||
@@ -1160,7 +1172,7 @@ rk_s32 kmpp_obj_udump_f(KmppObj obj, const char *caller)
|
||||
if (val != val_chk)
|
||||
mpp_loge("%-2d - %-16s ptr check failed\n", idx, name);
|
||||
} break;
|
||||
case ENTRY_TYPE_ufp : {
|
||||
case ELEM_TYPE_ufp : {
|
||||
void *val;
|
||||
void *val_chk;
|
||||
|
||||
@@ -1175,7 +1187,7 @@ rk_s32 kmpp_obj_udump_f(KmppObj obj, const char *caller)
|
||||
mpp_loge("%-2d - %-16s fp check failed\n", idx, name);
|
||||
} break;
|
||||
default : {
|
||||
mpp_loge("%-2d - %-16s found invalid type %d\n", idx, name, tbl->data_type);
|
||||
mpp_loge("%-2d - %-16s found invalid type %d\n", idx, name, tbl->tbl.elem_type);
|
||||
ret = MPP_NOK;
|
||||
} break;
|
||||
}
|
||||
|
Reference in New Issue
Block a user