diff --git a/tmm_driver/src/tmm_driver.c b/tmm_driver/src/tmm_driver.c index fc2e195b294e59d153287250873bff0dc0089cbf..1fbb1b8547255c4b4d031e7ff2153b007883c733 100644 --- a/tmm_driver/src/tmm_driver.c +++ b/tmm_driver/src/tmm_driver.c @@ -13,6 +13,7 @@ #include #include #include +#include MODULE_LICENSE("GPL"); MODULE_AUTHOR("Chenzheng "); @@ -25,6 +26,7 @@ MODULE_DESCRIPTION("Get tmm base memory info module"); #define ORDERED_PAGE_SIZE (1ULL << 21) #define MBS_PER_GB 1024 +#define _4K_PER_M 256 #define _2M_PER_GB 512 #define _4K_PER_2M 512 #define _4K_PER_GB (_2M_PER_GB * _4K_PER_2M) @@ -38,6 +40,8 @@ MODULE_DESCRIPTION("Get tmm base memory info module"); #define VIRTCCA_TTT_MAX 8192 #define VIRTCCA_PAGE_ENTRY_NUM 512 #define VIRTCCA_MAX_ENTRY_NUM (VIRTCCA_TTT_MAX * VIRTCCA_PAGE_ENTRY_NUM) +#define BITS_PER_BYTE 8 +#define CRC_INPUT_CNT 3 struct node_mem { uint32_t nr_free[MAX_PAGE_ORDER_NUM]; @@ -91,6 +95,10 @@ static is_virtcca_available_t is_virtcca_available_func = NULL; typedef uint64_t (*tmi_tmm_info_show_t)(uint64_t option, uint64_t tmm_info_addr); static tmi_tmm_info_show_t tmi_tmm_info_show_func = NULL; +typedef uint64_t (*virtcca_config_crc_t) + (uint64_t crc_addr_start, uint64_t crc_addr_end, uint64_t crc_granularity, bool is_secure); +static virtcca_config_crc_t virtcca_config_crc_func = NULL; + static atomic_t g_mig_check_src_ok = ATOMIC_INIT(0); static atomic_t g_mig_check_dst_ok = ATOMIC_INIT(0); @@ -138,6 +146,12 @@ static int get_symbol_from_kernel(void) return -1; } + virtcca_config_crc_func = (virtcca_config_crc_t)fn_kallsyms_lookup_name("virtcca_config_crc"); + if (!virtcca_config_crc_func) { + pr_err("tmm_driver: cannot get function virtcca_config_crc\n"); + return -1; + } + return 0; } @@ -759,6 +773,40 @@ out: return count; } +static ssize_t sec_memory_check_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, size_t count) +{ + int ret = 0; + uint64_t ipa_start = 0; + uint64_t ipa_end = 0; + uint64_t granularity = 0; + + ret = sscanf(buf, "%llx-%llx-%llx", &ipa_start, &ipa_end, &granularity); + if (ret != CRC_INPUT_CNT) + return -EINVAL; + + virtcca_config_crc_func(ipa_start, ipa_end, granularity, true); + return count; +} + +static ssize_t ns_memory_check_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, size_t count) +{ + int ret = 0; + uint64_t ipa_start = 0; + uint64_t ipa_end = 0; + uint64_t granularity = 0; + + ret = sscanf(buf, "%llx-%llx-%llx", &ipa_start, &ipa_end, &granularity); + if (ret != CRC_INPUT_CNT) + return -EINVAL; + + virtcca_config_crc_func(ipa_start, ipa_end, granularity, false); + return count; +} + 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); @@ -769,6 +817,8 @@ static struct kobject *tmm_kobj; /* helper sysfs for cvm live migration */ static struct kobj_attribute mig_check_src_attr = __ATTR_RW(mig_check_src); static struct kobj_attribute mig_check_dst_attr = __ATTR_RW(mig_check_dst); +static struct kobj_attribute sec_memory_check_attr = __ATTR_WO(sec_memory_check); +static struct kobj_attribute ns_memory_check_attr = __ATTR_WO(ns_memory_check); static struct kobject *tmm_mig_kobj; static struct attribute *tmm_attrs[] = { @@ -783,6 +833,8 @@ static struct attribute *tmm_attrs[] = { static struct attribute *tmm_mig_attrs[] = { &mig_check_src_attr.attr, &mig_check_dst_attr.attr, + &sec_memory_check_attr.attr, + &ns_memory_check_attr.attr, NULL, };