diff --git a/drivers/crypto/ccp/hygon/psp-dev.c b/drivers/crypto/ccp/hygon/psp-dev.c index 1c554e4d08b8ee651f93786e28cd21f66d1aae87..96480ee66b2d9b3a19e3c913dad0364f73d7adb7 100644 --- a/drivers/crypto/ccp/hygon/psp-dev.c +++ b/drivers/crypto/ccp/hygon/psp-dev.c @@ -380,6 +380,8 @@ int hygon_psp_additional_setup(struct sp_device *sp) if (!hygon_psp_hooks.sev_dev_hooks_installed) return -ENODEV; + init_waitqueue_head(&psp_int_queue); + if (!psp_misc) { struct miscdevice *misc; diff --git a/drivers/crypto/ccp/hygon/tdm-dev.c b/drivers/crypto/ccp/hygon/tdm-dev.c index 9ff6a8906686129a9667a27aede4c8724683e23a..4241dba1bc73b418c159fe97c35ec3324c253aba 100644 --- a/drivers/crypto/ccp/hygon/tdm-dev.c +++ b/drivers/crypto/ccp/hygon/tdm-dev.c @@ -23,7 +23,8 @@ #include #include #include -#include "tdm-dev.h" +#include "tdm-dev.h +#include "psp-dev.h" #ifdef pr_fmt #undef pr_fmt @@ -533,8 +534,12 @@ int psp_check_tdm_support(void) { int ret = 0; struct tdm_version version; + struct psp_device *psp = psp_master; - if (boot_cpu_data.x86_vendor == X86_VENDOR_HYGON) { + if (!psp) + goto end; + + if (is_vendor_hygon() && (psp->capability & PSP_CAPABILITY_SEV)) { if (tdm_support) goto end; @@ -671,8 +676,7 @@ int psp_create_measure_task(struct addr_range_info *range, struct measure_data * } paddr_range_info->count = info_index; - addr_range_info_len = paddr_range_info->count * sizeof(struct addr_info) + - sizeof(struct addr_range_info); + addr_range_info_len = paddr_range_info->count * sizeof(struct addr_info); } else { /*check if physics address valid*/ ret = tdm_verify_phy_addr_valid(range); @@ -680,8 +684,7 @@ int psp_create_measure_task(struct addr_range_info *range, struct measure_data * pr_err("range address is abnormal!\n"); goto end; } - addr_range_info_len = range->count * sizeof(struct addr_info) + - sizeof(struct addr_range_info); + addr_range_info_len = range->count * sizeof(struct addr_info); } tdm_cmdresp_data = kzalloc(TDM_C2P_CMD_SIZE, GFP_KERNEL); @@ -704,10 +707,14 @@ int psp_create_measure_task(struct addr_range_info *range, struct measure_data * goto free_cmdresp; } - if (flag & TASK_CREATE_VADDR) - memcpy(&create_cmd->range_info, paddr_range_info, addr_range_info_len); - else - memcpy(&create_cmd->range_info, range, addr_range_info_len); + if (flag & TASK_CREATE_VADDR) { + create_cmd->range_info.count = paddr_range_info->count; + memcpy(&create_cmd->range_info.addr[0], &paddr_range_info->addr[0], + addr_range_info_len); + } else { + create_cmd->range_info.count = range->count; + memcpy(&create_cmd->range_info.addr[0], &range->addr[0], addr_range_info_len); + } ret = tdm_do_cmd(0, (void *)create_cmd, &error); if (ret && ret != -EIO) { @@ -1306,7 +1313,7 @@ int tdm_get_report(uint32_t task_id, struct task_selection_2b *selection, *length = needed_length; ret = -DYN_ERR_SIZE_SMALL; } else { - memcpy(report_buffer, report_resp, needed_length); + memcpy(report_buffer, (uint8_t *)report_resp, needed_length); } free_cmdresp: diff --git a/drivers/crypto/ccp/hygon/tdm-kernel-guard.c b/drivers/crypto/ccp/hygon/tdm-kernel-guard.c index c3afe888ea04d77ed2eb53d67364423915e9b300..0e52d5d385e45a65f0625f325a2b7ed8d4ad9c17 100644 --- a/drivers/crypto/ccp/hygon/tdm-kernel-guard.c +++ b/drivers/crypto/ccp/hygon/tdm-kernel-guard.c @@ -23,8 +23,33 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt static int eh_obj = -1; +static char *tdm_guard; module_param(eh_obj, int, 0644); -MODULE_PARM_DESC(eh_obj, "security enhance object for TDM"); +MODULE_PARM_DESC(eh_obj, + "Bitmap of kernel targets protected by Hygon TDM(bit0: SCT, bit1: IDT, default: both)"); +module_param(tdm_guard, charp, 0644); +MODULE_PARM_DESC(tdm_guard, + "Enable TDM protection for selected targets(on=enable, off=disable, default:off)"); + +static bool tdm_guard_enabled; + +static int __init __maybe_unused parse_tdm_guard(char *str) +{ + if (!str) + return 0; + + if (!strncmp(str, "off", 3)) { + tdm_guard_enabled = false; + pr_info("Hygon TDM Guard: Disabled(cmdline)\n"); + } else if (!strncmp(str, "on", 2)) { + tdm_guard_enabled = true; + pr_info("Hygon TDM Guard: Enabled(cmdline)\n"); + } + + return 0; +} + +__setup("tdm_guard=", parse_tdm_guard); /* Objects are protected by TDM now * SCT: 0 @@ -292,6 +317,16 @@ static int __init kernel_security_enhance_init(void) goto end; } + if (tdm_guard) { + if (!strncmp(tdm_guard, "off", 3)) + tdm_guard_enabled = false; + else if (!strncmp(tdm_guard, "on", 2)) + tdm_guard_enabled = true; + } + + if (tdm_guard_enabled == false) + goto end; + asm("sidt %0":"=m"(idtr)); if (!psp_check_tdm_support()) @@ -327,6 +362,9 @@ static void __exit kernel_security_enhance_exit(void) { int i = 0; + if (tdm_guard_enabled == false) + return; + if (!psp_check_tdm_support()) return; diff --git a/drivers/crypto/ccp/psp-dev.c b/drivers/crypto/ccp/psp-dev.c index a5f0a816b2de4b15ac47e2c1dd41621ec98abc28..04fae268b33e9caa8d5ba8989a55ca6a20c1b343 100644 --- a/drivers/crypto/ccp/psp-dev.c +++ b/drivers/crypto/ccp/psp-dev.c @@ -217,9 +217,6 @@ int psp_dev_init(struct sp_device *sp) if (ret) goto e_irq; - if (is_vendor_hygon()) - init_waitqueue_head(&psp_int_queue); - /** * hygon_psp_additional_setup() needs to wait for * sev_dev_install_hooks() to complete before it can be called. diff --git a/mm/memory-tiers.c b/mm/memory-tiers.c index 9a8f23a2377b4871897b9d19e682d29f8c28d53e..629f4bdd2da6cd8bd465eaa0c3b691a945c8eea2 100644 --- a/mm/memory-tiers.c +++ b/mm/memory-tiers.c @@ -669,10 +669,10 @@ int mt_set_default_dram_perf(int nid, struct node_hmem_attrs *perf, pr_info( "memory-tiers: the performance of DRAM node %d mismatches that of the reference\n" "DRAM node %d.\n", nid, default_dram_perf_ref_nid); - pr_info(" performance of reference DRAM node %d:\n", - default_dram_perf_ref_nid); + pr_info(" performance of reference DRAM node %d from %s:\n", + default_dram_perf_ref_nid, default_dram_perf_ref_source); dump_hmem_attrs(&default_dram_perf, " "); - pr_info(" performance of DRAM node %d:\n", nid); + pr_info(" performance of DRAM node %d from %s:\n", nid, source); dump_hmem_attrs(perf, " "); pr_info( " disable default DRAM node performance based abstract distance algorithm.\n");