tree: https://git.kernel.org/pub/scm/linux/kernel/git/mips/linux.git mips-next head: 7f028bff8a8e55a783eeb12e50bb3f5f18804459 commit: 45deb5faeb9e02951361ceba5ffee721745661c3 [73/76] MIPS: uaccess: Remove get_fs/set_fs call sites config: mips-randconfig-s032-20210406 (attached as .config) compiler: mips64-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-279-g6d5d9b42-dirty # https://git.kernel.org/pub/scm/linux/kernel/git/mips/linux.git/commit/?id=45deb5faeb9e02951361ceba5ffee721745661c3 git remote add mips-linux https://git.kernel.org/pub/scm/linux/kernel/git/mips/linux.git git fetch --no-tags mips-linux mips-next git checkout 45deb5faeb9e02951361ceba5ffee721745661c3 # 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__' ARCH=mips If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot sparse warnings: (new ones prefixed by >>) command-line: note: in included file: builtin:1:9: sparse: sparse: preprocessor token __ATOMIC_ACQUIRE redefined builtin:0:0: sparse: this was the original definition builtin:1:9: sparse: sparse: preprocessor token __ATOMIC_SEQ_CST redefined builtin:0:0: sparse: this was the original definition builtin:1:9: sparse: sparse: preprocessor token __ATOMIC_ACQ_REL redefined builtin:0:0: sparse: this was the original definition builtin:1:9: sparse: sparse: preprocessor token __ATOMIC_RELEASE redefined builtin:0:0: sparse: this was the original definition >> arch/mips/kernel/unaligned.c:127:34: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected unsigned int [usertype] *p @@ got unsigned int [noderef] __user *pc @@ arch/mips/kernel/unaligned.c:127:34: sparse: expected unsigned int [usertype] *p arch/mips/kernel/unaligned.c:127:34: sparse: got unsigned int [noderef] __user *pc arch/mips/kernel/unaligned.c:1475:17: sparse: sparse: symbol 'do_ade' was not declared. Should it be static? arch/mips/kernel/unaligned.c: note: in included file: >> arch/mips/kernel/access-helper.h:17:23: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned int const [noderef] __user *__gu_ptr @@ got unsigned int [usertype] *p @@ arch/mips/kernel/access-helper.h:17:23: sparse: expected unsigned int const [noderef] __user *__gu_ptr arch/mips/kernel/access-helper.h:17:23: sparse: got unsigned int [usertype] *p -- command-line: note: in included file: builtin:1:9: sparse: sparse: preprocessor token __ATOMIC_ACQUIRE redefined builtin:0:0: sparse: this was the original definition builtin:1:9: sparse: sparse: preprocessor token __ATOMIC_SEQ_CST redefined builtin:0:0: sparse: this was the original definition builtin:1:9: sparse: sparse: preprocessor token __ATOMIC_ACQ_REL redefined builtin:0:0: sparse: this was the original definition builtin:1:9: sparse: sparse: preprocessor token __ATOMIC_RELEASE redefined builtin:0:0: sparse: this was the original definition arch/mips/kernel/traps.c:519:14: sparse: sparse: symbol 'll_bit' was not declared. Should it be static? arch/mips/kernel/traps.c:520:20: sparse: sparse: symbol 'll_task' was not declared. Should it be static? arch/mips/kernel/traps.c:746:17: sparse: sparse: symbol 'do_ov' was not declared. Should it be static? arch/mips/kernel/traps.c:1023:17: sparse: sparse: symbol 'do_bp' was not declared. Should it be static? arch/mips/kernel/traps.c:1110:17: sparse: sparse: symbol 'do_tr' was not declared. Should it be static? arch/mips/kernel/traps.c:1174:47: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void [noderef] __user *fault_addr @@ got unsigned long * @@ arch/mips/kernel/traps.c:1174:47: sparse: expected void [noderef] __user *fault_addr arch/mips/kernel/traps.c:1174:47: sparse: got unsigned long * arch/mips/kernel/traps.c:1147:17: sparse: sparse: symbol 'do_ri' was not declared. Should it be static? arch/mips/kernel/traps.c:1398:17: sparse: sparse: symbol 'do_cpu' was not declared. Should it be static? arch/mips/kernel/traps.c:1503:17: sparse: sparse: symbol 'do_msa_fpe' was not declared. Should it be static? arch/mips/kernel/traps.c:1523:17: sparse: sparse: symbol 'do_msa' was not declared. Should it be static? arch/mips/kernel/traps.c:1544:17: sparse: sparse: symbol 'do_mdmx' was not declared. Should it be static? arch/mips/kernel/traps.c:1556:17: sparse: sparse: symbol 'do_watch' was not declared. Should it be static? arch/mips/kernel/traps.c:1583:17: sparse: sparse: symbol 'do_mcheck' was not declared. Should it be static? arch/mips/kernel/traps.c:1608:17: sparse: sparse: symbol 'do_mt' was not declared. Should it be static? arch/mips/kernel/traps.c:1644:17: sparse: sparse: symbol 'do_dsp' was not declared. Should it be static? arch/mips/kernel/traps.c:1652:17: sparse: sparse: symbol 'do_reserved' was not declared. Should it be static? arch/mips/kernel/traps.c:1876:17: sparse: sparse: symbol 'do_ftlb' was not declared. Should it be static? arch/mips/kernel/traps.c:1905:17: sparse: sparse: symbol 'do_gsexc' was not declared. Should it be static? arch/mips/kernel/traps.c:2002:15: sparse: sparse: symbol 'vi_handlers' was not declared. Should it be static? arch/mips/kernel/traps.c: note: in included file: >> arch/mips/kernel/access-helper.h:7:23: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned long const [noderef] __user *__gu_ptr @@ got unsigned long *p @@ arch/mips/kernel/access-helper.h:7:23: sparse: expected unsigned long const [noderef] __user *__gu_ptr arch/mips/kernel/access-helper.h:7:23: sparse: got unsigned long *p >> arch/mips/kernel/access-helper.h:7:23: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned long const [noderef] __user *__gu_ptr @@ got unsigned long *p @@ arch/mips/kernel/access-helper.h:7:23: sparse: expected unsigned long const [noderef] __user *__gu_ptr arch/mips/kernel/access-helper.h:7:23: sparse: got unsigned long *p >> arch/mips/kernel/access-helper.h:12:23: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned short const [noderef] __user *__gu_ptr @@ got unsigned short [usertype] *p @@ arch/mips/kernel/access-helper.h:12:23: sparse: expected unsigned short const [noderef] __user *__gu_ptr arch/mips/kernel/access-helper.h:12:23: sparse: got unsigned short [usertype] *p >> arch/mips/kernel/access-helper.h:17:23: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned int const [noderef] __user *__gu_ptr @@ got unsigned int [usertype] *p @@ arch/mips/kernel/access-helper.h:17:23: sparse: expected unsigned int const [noderef] __user *__gu_ptr arch/mips/kernel/access-helper.h:17:23: sparse: got unsigned int [usertype] *p >> arch/mips/kernel/access-helper.h:12:23: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned short const [noderef] __user *__gu_ptr @@ got unsigned short [usertype] *p @@ arch/mips/kernel/access-helper.h:12:23: sparse: expected unsigned short const [noderef] __user *__gu_ptr arch/mips/kernel/access-helper.h:12:23: sparse: got unsigned short [usertype] *p >> arch/mips/kernel/access-helper.h:12:23: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned short const [noderef] __user *__gu_ptr @@ got unsigned short [usertype] *p @@ arch/mips/kernel/access-helper.h:12:23: sparse: expected unsigned short const [noderef] __user *__gu_ptr arch/mips/kernel/access-helper.h:12:23: sparse: got unsigned short [usertype] *p >> arch/mips/kernel/access-helper.h:17:23: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned int const [noderef] __user *__gu_ptr @@ got unsigned int [usertype] *p @@ arch/mips/kernel/access-helper.h:17:23: sparse: expected unsigned int const [noderef] __user *__gu_ptr arch/mips/kernel/access-helper.h:17:23: sparse: got unsigned int [usertype] *p >> arch/mips/kernel/access-helper.h:12:23: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned short const [noderef] __user *__gu_ptr @@ got unsigned short [usertype] *p @@ arch/mips/kernel/access-helper.h:12:23: sparse: expected unsigned short const [noderef] __user *__gu_ptr arch/mips/kernel/access-helper.h:12:23: sparse: got unsigned short [usertype] *p >> arch/mips/kernel/access-helper.h:12:23: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned short const [noderef] __user *__gu_ptr @@ got unsigned short [usertype] *p @@ arch/mips/kernel/access-helper.h:12:23: sparse: expected unsigned short const [noderef] __user *__gu_ptr arch/mips/kernel/access-helper.h:12:23: sparse: got unsigned short [usertype] *p >> arch/mips/kernel/access-helper.h:17:23: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned int const [noderef] __user *__gu_ptr @@ got unsigned int [usertype] *p @@ arch/mips/kernel/access-helper.h:17:23: sparse: expected unsigned int const [noderef] __user *__gu_ptr arch/mips/kernel/access-helper.h:17:23: sparse: got unsigned int [usertype] *p arch/mips/kernel/traps.c: note: in included file (through arch/mips/include/asm/mips-cps.h): arch/mips/include/asm/mips-cm.h:151:1: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __iomem *mem @@ got void * @@ arch/mips/include/asm/mips-cm.h:151:1: sparse: expected void const volatile [noderef] __iomem *mem arch/mips/include/asm/mips-cm.h:151:1: sparse: got void * arch/mips/include/asm/mips-cm.h:151:1: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __iomem *mem @@ got void * @@ arch/mips/include/asm/mips-cm.h:151:1: sparse: expected void const volatile [noderef] __iomem *mem arch/mips/include/asm/mips-cm.h:151:1: sparse: got void * arch/mips/include/asm/mips-cm.h:151:1: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __iomem *mem @@ got void * @@ arch/mips/include/asm/mips-cm.h:151:1: sparse: expected void const volatile [noderef] __iomem *mem arch/mips/include/asm/mips-cm.h:151:1: sparse: got void * arch/mips/include/asm/mips-cm.h:151:1: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __iomem *mem @@ got void * @@ arch/mips/include/asm/mips-cm.h:151:1: sparse: expected void const volatile [noderef] __iomem *mem arch/mips/include/asm/mips-cm.h:151:1: sparse: got void * arch/mips/include/asm/mips-cm.h:151:1: sparse: sparse: incorrect type in return expression (different address spaces) @@ expected void * @@ got void [noderef] __iomem * @@ arch/mips/include/asm/mips-cm.h:151:1: sparse: expected void * arch/mips/include/asm/mips-cm.h:151:1: sparse: got void [noderef] __iomem * arch/mips/include/asm/mips-cm.h:151:1: sparse: sparse: incorrect type in return expression (different address spaces) @@ expected void * @@ got void [noderef] __iomem * @@ arch/mips/include/asm/mips-cm.h:151:1: sparse: expected void * arch/mips/include/asm/mips-cm.h:151:1: sparse: got void [noderef] __iomem * arch/mips/include/asm/mips-cm.h:151:1: sparse: sparse: incorrect type in return expression (different address spaces) @@ expected void * @@ got void [noderef] __iomem * @@ arch/mips/include/asm/mips-cm.h:151:1: sparse: expected void * arch/mips/include/asm/mips-cm.h:151:1: sparse: got void [noderef] __iomem * arch/mips/include/asm/mips-cm.h:151:1: sparse: sparse: incorrect type in return expression (different address spaces) @@ expected void * @@ got void [noderef] __iomem * @@ arch/mips/include/asm/mips-cm.h:151:1: sparse: expected void * arch/mips/include/asm/mips-cm.h:151:1: sparse: got void [noderef] __iomem * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __iomem *mem @@ got void * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void const volatile [noderef] __iomem *mem arch/mips/include/asm/mips-cm.h:165:1: sparse: got void * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __iomem *mem @@ got void * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void const volatile [noderef] __iomem *mem arch/mips/include/asm/mips-cm.h:165:1: sparse: got void * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __iomem *mem @@ got void * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void const volatile [noderef] __iomem *mem arch/mips/include/asm/mips-cm.h:165:1: sparse: got void * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __iomem *mem @@ got void * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void const volatile [noderef] __iomem *mem arch/mips/include/asm/mips-cm.h:165:1: sparse: got void * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in return expression (different address spaces) @@ expected void * @@ got void [noderef] __iomem * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void * arch/mips/include/asm/mips-cm.h:165:1: sparse: got void [noderef] __iomem * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in return expression (different address spaces) @@ expected void * @@ got void [noderef] __iomem * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void * arch/mips/include/asm/mips-cm.h:165:1: sparse: got void [noderef] __iomem * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in return expression (different address spaces) @@ expected void * @@ got void [noderef] __iomem * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void * arch/mips/include/asm/mips-cm.h:165:1: sparse: got void [noderef] __iomem * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in return expression (different address spaces) @@ expected void * @@ got void [noderef] __iomem * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void * arch/mips/include/asm/mips-cm.h:165:1: sparse: got void [noderef] __iomem * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void volatile [noderef] __iomem *mem @@ got void * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void volatile [noderef] __iomem *mem arch/mips/include/asm/mips-cm.h:165:1: sparse: got void * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void volatile [noderef] __iomem *mem @@ got void * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void volatile [noderef] __iomem *mem arch/mips/include/asm/mips-cm.h:165:1: sparse: got void * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void volatile [noderef] __iomem *mem @@ got void * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void volatile [noderef] __iomem *mem arch/mips/include/asm/mips-cm.h:165:1: sparse: got void * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected void volatile [noderef] __iomem *mem @@ got void * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void volatile [noderef] __iomem *mem arch/mips/include/asm/mips-cm.h:165:1: sparse: got void * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in return expression (different address spaces) @@ expected void * @@ got void [noderef] __iomem * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void * arch/mips/include/asm/mips-cm.h:165:1: sparse: got void [noderef] __iomem * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in return expression (different address spaces) @@ expected void * @@ got void [noderef] __iomem * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void * arch/mips/include/asm/mips-cm.h:165:1: sparse: got void [noderef] __iomem * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in return expression (different address spaces) @@ expected void * @@ got void [noderef] __iomem * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void * arch/mips/include/asm/mips-cm.h:165:1: sparse: got void [noderef] __iomem * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in return expression (different address spaces) @@ expected void * @@ got void [noderef] __iomem * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void * arch/mips/include/asm/mips-cm.h:165:1: sparse: got void [noderef] __iomem * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __iomem *mem @@ got void * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void const volatile [noderef] __iomem *mem arch/mips/include/asm/mips-cm.h:165:1: sparse: got void * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __iomem *mem @@ got void * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void const volatile [noderef] __iomem *mem arch/mips/include/asm/mips-cm.h:165:1: sparse: got void * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __iomem *mem @@ got void * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void const volatile [noderef] __iomem *mem arch/mips/include/asm/mips-cm.h:165:1: sparse: got void * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __iomem *mem @@ got void * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void const volatile [noderef] __iomem *mem arch/mips/include/asm/mips-cm.h:165:1: sparse: got void * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in return expression (different address spaces) @@ expected void * @@ got void [noderef] __iomem * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void * arch/mips/include/asm/mips-cm.h:165:1: sparse: got void [noderef] __iomem * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in return expression (different address spaces) @@ expected void * @@ got void [noderef] __iomem * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void * arch/mips/include/asm/mips-cm.h:165:1: sparse: got void [noderef] __iomem * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in return expression (different address spaces) @@ expected void * @@ got void [noderef] __iomem * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void * arch/mips/include/asm/mips-cm.h:165:1: sparse: got void [noderef] __iomem * arch/mips/include/asm/mips-cm.h:165:1: sparse: sparse: incorrect type in return expression (different address spaces) @@ expected void * @@ got void [noderef] __iomem * @@ arch/mips/include/asm/mips-cm.h:165:1: sparse: expected void * arch/mips/include/asm/mips-cm.h:165:1: sparse: got void [noderef] __iomem * vim +127 arch/mips/kernel/unaligned.c 110 111 static void emulate_load_store_insn(struct pt_regs *regs, 112 void __user *addr, unsigned int __user *pc) 113 { 114 unsigned long origpc, orig31, value; 115 union mips_instruction insn; 116 unsigned int res; 117 bool user = user_mode(regs); 118 119 origpc = (unsigned long)pc; 120 orig31 = regs->regs[31]; 121 122 perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS, 1, regs, 0); 123 124 /* 125 * This load never faults. 126 */ > 127 __get_inst32(&insn.word, pc, user); 128 129 switch (insn.i_format.opcode) { 130 /* 131 * These are instructions that a compiler doesn't generate. We 132 * can assume therefore that the code is MIPS-aware and 133 * really buggy. Emulating these instructions would break the 134 * semantics anyway. 135 */ 136 case ll_op: 137 case lld_op: 138 case sc_op: 139 case scd_op: 140 141 /* 142 * For these instructions the only way to create an address 143 * error is an attempted access to kernel/supervisor address 144 * space. 145 */ 146 case ldl_op: 147 case ldr_op: 148 case lwl_op: 149 case lwr_op: 150 case sdl_op: 151 case sdr_op: 152 case swl_op: 153 case swr_op: 154 case lb_op: 155 case lbu_op: 156 case sb_op: 157 goto sigbus; 158 159 /* 160 * The remaining opcodes are the ones that are really of 161 * interest. 162 */ 163 case spec3_op: 164 if (insn.dsp_format.func == lx_op) { 165 switch (insn.dsp_format.op) { 166 case lwx_op: 167 if (user && !access_ok(addr, 4)) 168 goto sigbus; 169 LoadW(addr, value, res); 170 if (res) 171 goto fault; 172 compute_return_epc(regs); 173 regs->regs[insn.dsp_format.rd] = value; 174 break; 175 case lhx_op: 176 if (user && !access_ok(addr, 2)) 177 goto sigbus; 178 LoadHW(addr, value, res); 179 if (res) 180 goto fault; 181 compute_return_epc(regs); 182 regs->regs[insn.dsp_format.rd] = value; 183 break; 184 default: 185 goto sigill; 186 } 187 } 188 #ifdef CONFIG_EVA 189 else { 190 /* 191 * we can land here only from kernel accessing user 192 * memory, so we need to "switch" the address limit to 193 * user space, so that address check can work properly. 194 */ 195 switch (insn.spec3_format.func) { 196 case lhe_op: 197 if (!access_ok(addr, 2)) 198 goto sigbus; 199 LoadHWE(addr, value, res); 200 if (res) 201 goto fault; 202 compute_return_epc(regs); 203 regs->regs[insn.spec3_format.rt] = value; 204 break; 205 case lwe_op: 206 if (!access_ok(addr, 4)) 207 goto sigbus; 208 LoadWE(addr, value, res); 209 if (res) 210 goto fault; 211 compute_return_epc(regs); 212 regs->regs[insn.spec3_format.rt] = value; 213 break; 214 case lhue_op: 215 if (!access_ok(addr, 2)) 216 goto sigbus; 217 LoadHWUE(addr, value, res); 218 if (res) 219 goto fault; 220 compute_return_epc(regs); 221 regs->regs[insn.spec3_format.rt] = value; 222 break; 223 case she_op: 224 if (!access_ok(addr, 2)) 225 goto sigbus; 226 compute_return_epc(regs); 227 value = regs->regs[insn.spec3_format.rt]; 228 StoreHWE(addr, value, res); 229 if (res) 230 goto fault; 231 break; 232 case swe_op: 233 if (!access_ok(addr, 4)) 234 goto sigbus; 235 compute_return_epc(regs); 236 value = regs->regs[insn.spec3_format.rt]; 237 StoreWE(addr, value, res); 238 if (res) 239 goto fault; 240 break; 241 default: 242 goto sigill; 243 } 244 } 245 #endif 246 break; 247 case lh_op: 248 if (user && !access_ok(addr, 2)) 249 goto sigbus; 250 251 if (IS_ENABLED(CONFIG_EVA) && user) 252 LoadHWE(addr, value, res); 253 else 254 LoadHW(addr, value, res); 255 256 if (res) 257 goto fault; 258 compute_return_epc(regs); 259 regs->regs[insn.i_format.rt] = value; 260 break; 261 262 case lw_op: 263 if (user && !access_ok(addr, 4)) 264 goto sigbus; 265 266 if (IS_ENABLED(CONFIG_EVA) && user) 267 LoadWE(addr, value, res); 268 else 269 LoadW(addr, value, res); 270 271 if (res) 272 goto fault; 273 compute_return_epc(regs); 274 regs->regs[insn.i_format.rt] = value; 275 break; 276 277 case lhu_op: 278 if (user && !access_ok(addr, 2)) 279 goto sigbus; 280 281 if (IS_ENABLED(CONFIG_EVA) && user) 282 LoadHWUE(addr, value, res); 283 else 284 LoadHWU(addr, value, res); 285 286 if (res) 287 goto fault; 288 compute_return_epc(regs); 289 regs->regs[insn.i_format.rt] = value; 290 break; 291 292 case lwu_op: 293 #ifdef CONFIG_64BIT 294 /* 295 * A 32-bit kernel might be running on a 64-bit processor. But 296 * if we're on a 32-bit processor and an i-cache incoherency 297 * or race makes us see a 64-bit instruction here the sdl/sdr 298 * would blow up, so for now we don't handle unaligned 64-bit 299 * instructions on 32-bit kernels. 300 */ 301 if (user && !access_ok(addr, 4)) 302 goto sigbus; 303 304 LoadWU(addr, value, res); 305 if (res) 306 goto fault; 307 compute_return_epc(regs); 308 regs->regs[insn.i_format.rt] = value; 309 break; 310 #endif /* CONFIG_64BIT */ 311 312 /* Cannot handle 64-bit instructions in 32-bit kernel */ 313 goto sigill; 314 315 case ld_op: 316 #ifdef CONFIG_64BIT 317 /* 318 * A 32-bit kernel might be running on a 64-bit processor. But 319 * if we're on a 32-bit processor and an i-cache incoherency 320 * or race makes us see a 64-bit instruction here the sdl/sdr 321 * would blow up, so for now we don't handle unaligned 64-bit 322 * instructions on 32-bit kernels. 323 */ 324 if (user && !access_ok(addr, 8)) 325 goto sigbus; 326 327 LoadDW(addr, value, res); 328 if (res) 329 goto fault; 330 compute_return_epc(regs); 331 regs->regs[insn.i_format.rt] = value; 332 break; 333 #endif /* CONFIG_64BIT */ 334 335 /* Cannot handle 64-bit instructions in 32-bit kernel */ 336 goto sigill; 337 338 case sh_op: 339 if (user && !access_ok(addr, 2)) 340 goto sigbus; 341 342 compute_return_epc(regs); 343 value = regs->regs[insn.i_format.rt]; 344 345 if (IS_ENABLED(CONFIG_EVA) && user) 346 StoreHWE(addr, value, res); 347 else 348 StoreHW(addr, value, res); 349 350 if (res) 351 goto fault; 352 break; 353 354 case sw_op: 355 if (user && !access_ok(addr, 4)) 356 goto sigbus; 357 358 compute_return_epc(regs); 359 value = regs->regs[insn.i_format.rt]; 360 361 if (IS_ENABLED(CONFIG_EVA) && user) 362 StoreWE(addr, value, res); 363 else 364 StoreW(addr, value, res); 365 366 if (res) 367 goto fault; 368 break; 369 370 case sd_op: 371 #ifdef CONFIG_64BIT 372 /* 373 * A 32-bit kernel might be running on a 64-bit processor. But 374 * if we're on a 32-bit processor and an i-cache incoherency 375 * or race makes us see a 64-bit instruction here the sdl/sdr 376 * would blow up, so for now we don't handle unaligned 64-bit 377 * instructions on 32-bit kernels. 378 */ 379 if (user && !access_ok(addr, 8)) 380 goto sigbus; 381 382 compute_return_epc(regs); 383 value = regs->regs[insn.i_format.rt]; 384 StoreDW(addr, value, res); 385 if (res) 386 goto fault; 387 break; 388 #endif /* CONFIG_64BIT */ 389 390 /* Cannot handle 64-bit instructions in 32-bit kernel */ 391 goto sigill; 392 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org