From a4eb6ec3402bc30f379418f8a8ffe57d86d1afbd Mon Sep 17 00:00:00 2001 From: panhengchang Date: Fri, 11 Apr 2025 21:56:14 +0800 Subject: [PATCH 1/3] use loops to simplify sysfs create code --- tmm_driver/src/tmm_driver.c | 47 +++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/tmm_driver/src/tmm_driver.c b/tmm_driver/src/tmm_driver.c index e3a1480..4686e70 100644 --- a/tmm_driver/src/tmm_driver.c +++ b/tmm_driver/src/tmm_driver.c @@ -375,9 +375,16 @@ static struct kobj_attribute slab_info_attr = __ATTR_RO(slab_info); static struct kobj_attribute buddy_info_attr = __ATTR_RO(buddy_info); static struct kobject *tmm_kobj; +static struct attribute *tmm_attrs[] = { + &memory_info_attr.attr, + &slab_info_attr.attr, + &buddy_info_attr.attr, + NULL, +}; + static int __init tmm_driver_init(void) { - int rc; + int rc, i; tmm_kobj = kobject_create_and_add("tmm", kernel_kobj); if (tmm_kobj == NULL) { @@ -385,22 +392,12 @@ static int __init tmm_driver_init(void) return -1; } - rc = sysfs_create_file(tmm_kobj, &memory_info_attr.attr); - if (rc) { - pr_err("tmm_driver: unable to create memory_info sysfs file (%d)\n", rc); - goto err; - } - - rc = sysfs_create_file(tmm_kobj, &slab_info_attr.attr); - if (rc) { - pr_err("tmm_driver: unable to create slab_info sysfs file (%d)\n", rc); - goto err; - } - - rc = sysfs_create_file(tmm_kobj, &buddy_info_attr.attr); - if (rc) { - pr_err("tmm_driver: unable to create buddy_info sysfs file (%d)\n", rc); - goto err; + for (i = 0; tmm_attrs[i] != NULL; i++) { + rc = sysfs_create_file(tmm_kobj, tmm_attrs[i]); + if (rc) { + pr_err("tmm_driver: unable to create sysfs file (%d)\n", rc); + goto err; + } } rc = get_symbol_from_kernel(); @@ -410,9 +407,10 @@ static int __init tmm_driver_init(void) return 0; err: - sysfs_remove_file(tmm_kobj, &memory_info_attr.attr); - sysfs_remove_file(tmm_kobj, &slab_info_attr.attr); - sysfs_remove_file(tmm_kobj, &buddy_info_attr.attr); + for (--i; i >= 0; i--) { + sysfs_remove_file(tmm_kobj, tmm_attrs[i]); + } + kobject_put(tmm_kobj); return rc; @@ -420,9 +418,12 @@ err: static void __exit tmm_driver_exit(void) { - sysfs_remove_file(tmm_kobj, &memory_info_attr.attr); - sysfs_remove_file(tmm_kobj, &slab_info_attr.attr); - sysfs_remove_file(tmm_kobj, &buddy_info_attr.attr); + int i; + + for (i = 0; tmm_attrs[i] != NULL; i++) { + sysfs_remove_file(tmm_kobj, tmm_attrs[i]); + } + kobject_put(tmm_kobj); printk(KERN_INFO "tmm_driver_exit!\n"); } -- Gitee From bd3f96729af88c0ed5b68f9bd9df6c7cdb49665d Mon Sep 17 00:00:00 2001 From: panhengchang Date: Fri, 11 Apr 2025 21:57:43 +0800 Subject: [PATCH 2/3] add virtcca detection capability --- tmm_driver/src/tmm_driver.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/tmm_driver/src/tmm_driver.c b/tmm_driver/src/tmm_driver.c index 4686e70..9eaa551 100644 --- a/tmm_driver/src/tmm_driver.c +++ b/tmm_driver/src/tmm_driver.c @@ -64,6 +64,11 @@ static kallsyms_lookup_name_t fn_kallsyms_lookup_name = NULL; typedef uint64_t (*tmi_mem_info_show_t)(uint64_t addr); static tmi_mem_info_show_t tmi_mem_info_show_func = NULL; +typedef bool (*is_virtcca_cvm_enable_t)(void); +static is_virtcca_cvm_enable_t is_virtcca_cvm_enable_func = NULL; + +static struct static_key_false *virtcca_cvm_is_available_ptr = NULL; + static struct kprobe kp_sym_lookup = { .symbol_name = "kallsyms_lookup_name", }; @@ -86,7 +91,7 @@ static int get_symbol_from_kernel(void) get_kallsyms_lookup_name(); if (!fn_kallsyms_lookup_name) { pr_err("tmm_driver: cannot get function kallsyms_lookup_name\n"); - return -1; + return -1; } tmi_mem_info_show_func = (tmi_mem_info_show_t)fn_kallsyms_lookup_name("tmi_mem_info_show"); @@ -95,9 +100,29 @@ static int get_symbol_from_kernel(void) return -1; } + is_virtcca_cvm_enable_func = (is_virtcca_cvm_enable_t)fn_kallsyms_lookup_name("is_virtcca_cvm_enable"); + if (!is_virtcca_cvm_enable_func) { + pr_err("tmm_driver: cannot get function is_virtcca_cvm_enable\n"); + return -1; + } + + virtcca_cvm_is_available_ptr = (struct static_key_false *)fn_kallsyms_lookup_name("virtcca_cvm_is_available"); + if (!virtcca_cvm_is_available_ptr) { + pr_err("tmm_driver: cannot get key virtcca_cvm_is_available\n"); + return -1; + } + return 0; } +static ssize_t virtcca_enabled_show(struct kobject *kobj, + struct kobj_attribute *attr, + char *buf) +{ + return sysfs_emit(buf, "%d\n", + (static_key_enabled(virtcca_cvm_is_available_ptr) && is_virtcca_cvm_enable_func())); +} + static int get_tmm_memory_info(tmm_memory_info_s *memory_info) { return tmi_mem_info_show_func((uint64_t)memory_info); @@ -370,12 +395,14 @@ static ssize_t buddy_info_show(struct kobject *kobj, return buddy_info_size; } +static struct kobj_attribute virtcca_enabled_attr = __ATTR_RO(virtcca_enabled); static struct kobj_attribute memory_info_attr = __ATTR_RO(memory_info); static struct kobj_attribute slab_info_attr = __ATTR_RO(slab_info); static struct kobj_attribute buddy_info_attr = __ATTR_RO(buddy_info); static struct kobject *tmm_kobj; static struct attribute *tmm_attrs[] = { + &virtcca_enabled_attr.attr, &memory_info_attr.attr, &slab_info_attr.attr, &buddy_info_attr.attr, -- Gitee From 911e9634bb8345b629274ddff0008e813879465f Mon Sep 17 00:00:00 2001 From: panhengchang Date: Sat, 12 Apr 2025 11:52:08 +0800 Subject: [PATCH 3/3] use the exposed interface to get virtcca cap rather than variable --- tmm_driver/src/tmm_driver.c | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/tmm_driver/src/tmm_driver.c b/tmm_driver/src/tmm_driver.c index 9eaa551..bf060da 100644 --- a/tmm_driver/src/tmm_driver.c +++ b/tmm_driver/src/tmm_driver.c @@ -64,10 +64,8 @@ static kallsyms_lookup_name_t fn_kallsyms_lookup_name = NULL; typedef uint64_t (*tmi_mem_info_show_t)(uint64_t addr); static tmi_mem_info_show_t tmi_mem_info_show_func = NULL; -typedef bool (*is_virtcca_cvm_enable_t)(void); -static is_virtcca_cvm_enable_t is_virtcca_cvm_enable_func = NULL; - -static struct static_key_false *virtcca_cvm_is_available_ptr = NULL; +typedef bool (*is_virtcca_available_t)(void); +static is_virtcca_available_t is_virtcca_available_func = NULL; static struct kprobe kp_sym_lookup = { .symbol_name = "kallsyms_lookup_name", @@ -100,15 +98,9 @@ static int get_symbol_from_kernel(void) return -1; } - is_virtcca_cvm_enable_func = (is_virtcca_cvm_enable_t)fn_kallsyms_lookup_name("is_virtcca_cvm_enable"); - if (!is_virtcca_cvm_enable_func) { - pr_err("tmm_driver: cannot get function is_virtcca_cvm_enable\n"); - return -1; - } - - virtcca_cvm_is_available_ptr = (struct static_key_false *)fn_kallsyms_lookup_name("virtcca_cvm_is_available"); - if (!virtcca_cvm_is_available_ptr) { - pr_err("tmm_driver: cannot get key virtcca_cvm_is_available\n"); + is_virtcca_available_func = (is_virtcca_available_t)fn_kallsyms_lookup_name("is_virtcca_available"); + if (!is_virtcca_available_func) { + pr_err("tmm_driver: cannot get function is_virtcca_available\n"); return -1; } @@ -119,8 +111,7 @@ static ssize_t virtcca_enabled_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) { - return sysfs_emit(buf, "%d\n", - (static_key_enabled(virtcca_cvm_is_available_ptr) && is_virtcca_cvm_enable_func())); + return sysfs_emit(buf, "%d\n", is_virtcca_available_func()); } static int get_tmm_memory_info(tmm_memory_info_s *memory_info) -- Gitee