tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: c3d0e3fd41b7f0f5d5d5b6022ab7e813f04ea727 commit: 58c909022a5a56cd1d9e89c8c5461fd1f6a27bb5 efi: Support for MOK variable config table date: 8 months ago config: ia64-allmodconfig (attached as .config) compiler: ia64-linux-gcc (GCC) 9.3.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # apt-get install sparse # sparse version: v0.6.3-341-g8af24329-dirty # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=58c909022a5a56cd1d9e89c8c5461fd1f6a27bb5 git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git git fetch --no-tags linus master git checkout 58c909022a5a56cd1d9e89c8c5461fd1f6a27bb5 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' W=1 ARCH=ia64 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot sparse warnings: (new ones prefixed by >>) >> drivers/firmware/efi/mokvar-table.c:142:33: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void volatile [noderef] __iomem *addr @@ got void *va @@ drivers/firmware/efi/mokvar-table.c:142:33: sparse: expected void volatile [noderef] __iomem *addr drivers/firmware/efi/mokvar-table.c:142:33: sparse: got void *va >> drivers/firmware/efi/mokvar-table.c:151:28: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected void *va @@ got void [noderef] __iomem * @@ drivers/firmware/efi/mokvar-table.c:151:28: sparse: expected void *va drivers/firmware/efi/mokvar-table.c:151:28: sparse: got void [noderef] __iomem * drivers/firmware/efi/mokvar-table.c:179:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void volatile [noderef] __iomem *addr @@ got void *va @@ drivers/firmware/efi/mokvar-table.c:179:17: sparse: expected void volatile [noderef] __iomem *addr drivers/firmware/efi/mokvar-table.c:179:17: sparse: got void *va vim +142 drivers/firmware/efi/mokvar-table.c 77 78 /* 79 * efi_mokvar_table_init() - Early boot validation of EFI MOK config table 80 * 81 * If present, validate and compute the size of the EFI MOK variable 82 * configuration table. This table may be provided by an EFI boot loader 83 * as an alternative to ordinary EFI variables, due to platform-dependent 84 * limitations. The memory occupied by this table is marked as reserved. 85 * 86 * This routine must be called before efi_free_boot_services() in order 87 * to guarantee that it can mark the table as reserved. 88 * 89 * Implicit inputs: 90 * efi.mokvar_table: Physical address of EFI MOK variable config table 91 * or special value that indicates no such table. 92 * 93 * Implicit outputs: 94 * efi_mokvar_table_size: Computed size of EFI MOK variable config table. 95 * The table is considered present and valid if this 96 * is non-zero. 97 */ 98 void __init efi_mokvar_table_init(void) 99 { 100 efi_memory_desc_t md; 101 u64 end_pa; 102 void *va = NULL; 103 size_t cur_offset = 0; 104 size_t offset_limit; 105 size_t map_size = 0; 106 size_t map_size_needed = 0; 107 size_t size; 108 struct efi_mokvar_table_entry *mokvar_entry; 109 int err = -EINVAL; 110 111 if (!efi_enabled(EFI_MEMMAP)) 112 return; 113 114 if (efi.mokvar_table == EFI_INVALID_TABLE_ADDR) 115 return; 116 /* 117 * The EFI MOK config table must fit within a single EFI memory 118 * descriptor range. 119 */ 120 err = efi_mem_desc_lookup(efi.mokvar_table, &md); 121 if (err) { 122 pr_warn("EFI MOKvar config table is not within the EFI memory map\n"); 123 return; 124 } 125 end_pa = efi_mem_desc_end(&md); 126 if (efi.mokvar_table >= end_pa) { 127 pr_err("EFI memory descriptor containing MOKvar config table is invalid\n"); 128 return; 129 } 130 offset_limit = end_pa - efi.mokvar_table; 131 /* 132 * Validate the MOK config table. Since there is no table header 133 * from which we could get the total size of the MOK config table, 134 * we compute the total size as we validate each variably sized 135 * entry, remapping as necessary. 136 */ 137 while (cur_offset + sizeof(*mokvar_entry) <= offset_limit) { 138 mokvar_entry = va + cur_offset; 139 map_size_needed = cur_offset + sizeof(*mokvar_entry); 140 if (map_size_needed > map_size) { 141 if (va) > 142 early_memunmap(va, map_size); 143 /* 144 * Map a little more than the fixed size entry 145 * header, anticipating some data. It's safe to 146 * do so as long as we stay within current memory 147 * descriptor. 148 */ 149 map_size = min(map_size_needed + 2*EFI_PAGE_SIZE, 150 offset_limit); > 151 va = early_memremap(efi.mokvar_table, map_size); 152 if (!va) { 153 pr_err("Failed to map EFI MOKvar config table pa=0x%lx, size=%zu.\n", 154 efi.mokvar_table, map_size); 155 return; 156 } 157 mokvar_entry = va + cur_offset; 158 } 159 160 /* Check for last sentinel entry */ 161 if (mokvar_entry->name[0] == '\0') { 162 if (mokvar_entry->data_size != 0) 163 break; 164 err = 0; 165 break; 166 } 167 168 /* Sanity check that the name is null terminated */ 169 size = strnlen(mokvar_entry->name, 170 sizeof(mokvar_entry->name)); 171 if (size >= sizeof(mokvar_entry->name)) 172 break; 173 174 /* Advance to the next entry */ 175 cur_offset = map_size_needed + mokvar_entry->data_size; 176 } 177 178 if (va) 179 early_memunmap(va, map_size); 180 if (err) { 181 pr_err("EFI MOKvar config table is not valid\n"); 182 return; 183 } 184 efi_mem_reserve(efi.mokvar_table, map_size_needed); 185 efi_mokvar_table_size = map_size_needed; 186 } 187 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org