Re: [PATCH 2/2] support kdump when AMD secure memory encryption is active

From: kbuild test robot
Date: Tue May 15 2018 - 13:38:08 EST


Hi Lianbo,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[also build test WARNING on v4.17-rc5 next-20180514]
[cannot apply to tip/x86/core]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url: https://github.com/0day-ci/linux/commits/Lianbo-Jiang/support-kdump-for-AMD-secure-memory-encryption-sme/20180515-135732
reproduce:
# apt-get install sparse
make ARCH=x86_64 allmodconfig
make C=1 CF=-D__CHECK_ENDIAN__


sparse warnings: (new ones prefixed by >>)

>> drivers/iommu/amd_iommu_init.c:899:27: sparse: incorrect type in assignment (different address spaces) @@ expected struct dev_table_entry *old_devtb @@ got truct dev_table_entry *old_devtb @@
drivers/iommu/amd_iommu_init.c:899:27: expected struct dev_table_entry *old_devtb
drivers/iommu/amd_iommu_init.c:899:27: got void [noderef] <asn:2>*
drivers/iommu/amd_iommu_init.c:1740:39: sparse: expression using sizeof(void)
drivers/iommu/amd_iommu_init.c:1740:39: sparse: expression using sizeof(void)
drivers/iommu/amd_iommu_init.c:1750:49: sparse: expression using sizeof(void)
drivers/iommu/amd_iommu_init.c:1750:49: sparse: expression using sizeof(void)
drivers/iommu/amd_iommu_init.c:2950:18: sparse: symbol 'get_amd_iommu' was not declared. Should it be static?
drivers/iommu/amd_iommu_init.c:2969:4: sparse: symbol 'amd_iommu_pc_get_max_banks' was not declared. Should it be static?
drivers/iommu/amd_iommu_init.c:2980:6: sparse: symbol 'amd_iommu_pc_supported' was not declared. Should it be static?
drivers/iommu/amd_iommu_init.c:2986:4: sparse: symbol 'amd_iommu_pc_get_max_counters' was not declared. Should it be static?
drivers/iommu/amd_iommu_init.c:3035:5: sparse: symbol 'amd_iommu_pc_get_reg' was not declared. Should it be static?
drivers/iommu/amd_iommu_init.c:3044:5: sparse: symbol 'amd_iommu_pc_set_reg' was not declared. Should it be static?

vim +899 drivers/iommu/amd_iommu_init.c

854
855
856 static bool copy_device_table(void)
857 {
858 u64 int_ctl, int_tab_len, entry = 0, last_entry = 0;
859 struct dev_table_entry *old_devtb = NULL;
860 u32 lo, hi, devid, old_devtb_size;
861 phys_addr_t old_devtb_phys;
862 struct amd_iommu *iommu;
863 u16 dom_id, dte_v, irq_v;
864 gfp_t gfp_flag;
865 u64 tmp;
866
867 if (!amd_iommu_pre_enabled)
868 return false;
869
870 pr_warn("Translation is already enabled - trying to copy translation structures\n");
871 for_each_iommu(iommu) {
872 /* All IOMMUs should use the same device table with the same size */
873 lo = readl(iommu->mmio_base + MMIO_DEV_TABLE_OFFSET);
874 hi = readl(iommu->mmio_base + MMIO_DEV_TABLE_OFFSET + 4);
875 entry = (((u64) hi) << 32) + lo;
876 if (last_entry && last_entry != entry) {
877 pr_err("IOMMU:%d should use the same dev table as others!\n",
878 iommu->index);
879 return false;
880 }
881 last_entry = entry;
882
883 old_devtb_size = ((entry & ~PAGE_MASK) + 1) << 12;
884 if (old_devtb_size != dev_table_size) {
885 pr_err("The device table size of IOMMU:%d is not expected!\n",
886 iommu->index);
887 return false;
888 }
889 }
890
891 old_devtb_phys = entry & PAGE_MASK;
892 if (sme_active() && is_kdump_kernel())
893 old_devtb_phys = __sme_clr(old_devtb_phys);
894 if (old_devtb_phys >= 0x100000000ULL) {
895 pr_err("The address of old device table is above 4G, not trustworthy!\n");
896 return false;
897 }
898 if (sme_active() && is_kdump_kernel())
> 899 old_devtb = ioremap_encrypted(old_devtb_phys,
900 dev_table_size);
901 else
902 old_devtb = memremap(old_devtb_phys,
903 dev_table_size, MEMREMAP_WB);
904 if (!old_devtb)
905 return false;
906
907 gfp_flag = GFP_KERNEL | __GFP_ZERO | GFP_DMA32;
908 old_dev_tbl_cpy = (void *)__get_free_pages(gfp_flag,
909 get_order(dev_table_size));
910 if (old_dev_tbl_cpy == NULL) {
911 pr_err("Failed to allocate memory for copying old device table!\n");
912 return false;
913 }
914
915 for (devid = 0; devid <= amd_iommu_last_bdf; ++devid) {
916 old_dev_tbl_cpy[devid] = old_devtb[devid];
917 dom_id = old_devtb[devid].data[1] & DEV_DOMID_MASK;
918 dte_v = old_devtb[devid].data[0] & DTE_FLAG_V;
919
920 if (dte_v && dom_id) {
921 old_dev_tbl_cpy[devid].data[0] = old_devtb[devid].data[0];
922 old_dev_tbl_cpy[devid].data[1] = old_devtb[devid].data[1];
923 __set_bit(dom_id, amd_iommu_pd_alloc_bitmap);
924 /* If gcr3 table existed, mask it out */
925 if (old_devtb[devid].data[0] & DTE_FLAG_GV) {
926 tmp = DTE_GCR3_VAL_B(~0ULL) << DTE_GCR3_SHIFT_B;
927 tmp |= DTE_GCR3_VAL_C(~0ULL) << DTE_GCR3_SHIFT_C;
928 old_dev_tbl_cpy[devid].data[1] &= ~tmp;
929 tmp = DTE_GCR3_VAL_A(~0ULL) << DTE_GCR3_SHIFT_A;
930 tmp |= DTE_FLAG_GV;
931 old_dev_tbl_cpy[devid].data[0] &= ~tmp;
932 }
933 }
934
935 irq_v = old_devtb[devid].data[2] & DTE_IRQ_REMAP_ENABLE;
936 int_ctl = old_devtb[devid].data[2] & DTE_IRQ_REMAP_INTCTL_MASK;
937 int_tab_len = old_devtb[devid].data[2] & DTE_IRQ_TABLE_LEN_MASK;
938 if (irq_v && (int_ctl || int_tab_len)) {
939 if ((int_ctl != DTE_IRQ_REMAP_INTCTL) ||
940 (int_tab_len != DTE_IRQ_TABLE_LEN)) {
941 pr_err("Wrong old irq remapping flag: %#x\n", devid);
942 return false;
943 }
944
945 old_dev_tbl_cpy[devid].data[2] = old_devtb[devid].data[2];
946 }
947 }
948 memunmap(old_devtb);
949
950 return true;
951 }
952

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation