From: kernel test robot <lkp@intel.com>
To: Huacai Chen <chenhuacai@loongson.cn>
Cc: oe-kbuild-all@lists.linux.dev, linux-kernel@vger.kernel.org
Subject: arch/loongarch/kernel/signal.c:370:47: sparse: sparse: incorrect type in initializer (different address spaces)
Date: Fri, 1 Dec 2023 10:08:38 +0800 [thread overview]
Message-ID: <202312011002.Ruq1PBC9-lkp@intel.com> (raw)
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 2594faafeee2f4406ff82790604e4e3f55037d60
commit: 616500232e632dba8b03981eeccadacf2fbf1c30 LoongArch: Add vector extensions support
date: 5 months ago
config: loongarch-randconfig-r034-20230511 (https://download.01.org/0day-ci/archive/20231201/202312011002.Ruq1PBC9-lkp@intel.com/config)
compiler: loongarch64-linux-gcc (GCC) 12.3.0
reproduce: (https://download.01.org/0day-ci/archive/20231201/202312011002.Ruq1PBC9-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202312011002.Ruq1PBC9-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
arch/loongarch/kernel/signal.c:94:36: sparse: sparse: cast removes address space '__user' of expression
arch/loongarch/kernel/signal.c:94:36: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned long long [noderef] [usertype] __user *regs @@ got unsigned long long [usertype] * @@
arch/loongarch/kernel/signal.c:94:36: sparse: expected unsigned long long [noderef] [usertype] __user *regs
arch/loongarch/kernel/signal.c:94:36: sparse: got unsigned long long [usertype] *
arch/loongarch/kernel/signal.c:114:36: sparse: sparse: cast removes address space '__user' of expression
arch/loongarch/kernel/signal.c:114:36: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned long long [noderef] [usertype] __user *regs @@ got unsigned long long [usertype] * @@
arch/loongarch/kernel/signal.c:114:36: sparse: expected unsigned long long [noderef] [usertype] __user *regs
arch/loongarch/kernel/signal.c:114:36: sparse: got unsigned long long [usertype] *
arch/loongarch/kernel/signal.c:132:36: sparse: sparse: cast removes address space '__user' of expression
arch/loongarch/kernel/signal.c:132:36: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned long long [noderef] [usertype] __user *regs @@ got unsigned long long [usertype] * @@
arch/loongarch/kernel/signal.c:132:36: sparse: expected unsigned long long [noderef] [usertype] __user *regs
arch/loongarch/kernel/signal.c:132:36: sparse: got unsigned long long [usertype] *
arch/loongarch/kernel/signal.c:153:36: sparse: sparse: cast removes address space '__user' of expression
arch/loongarch/kernel/signal.c:153:36: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned long long [noderef] [usertype] __user *regs @@ got unsigned long long [usertype] * @@
arch/loongarch/kernel/signal.c:153:36: sparse: expected unsigned long long [noderef] [usertype] __user *regs
arch/loongarch/kernel/signal.c:153:36: sparse: got unsigned long long [usertype] *
arch/loongarch/kernel/signal.c:173:36: sparse: sparse: cast removes address space '__user' of expression
arch/loongarch/kernel/signal.c:173:36: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned long long [noderef] [usertype] __user *regs @@ got unsigned long long [usertype] * @@
arch/loongarch/kernel/signal.c:173:36: sparse: expected unsigned long long [noderef] [usertype] __user *regs
arch/loongarch/kernel/signal.c:173:36: sparse: got unsigned long long [usertype] *
arch/loongarch/kernel/signal.c:198:36: sparse: sparse: cast removes address space '__user' of expression
arch/loongarch/kernel/signal.c:198:36: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned long long [noderef] [usertype] __user *regs @@ got unsigned long long [usertype] * @@
arch/loongarch/kernel/signal.c:198:36: sparse: expected unsigned long long [noderef] [usertype] __user *regs
arch/loongarch/kernel/signal.c:198:36: sparse: got unsigned long long [usertype] *
arch/loongarch/kernel/signal.c:223:36: sparse: sparse: cast removes address space '__user' of expression
arch/loongarch/kernel/signal.c:223:36: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned long long [noderef] [usertype] __user *regs @@ got unsigned long long [usertype] * @@
arch/loongarch/kernel/signal.c:223:36: sparse: expected unsigned long long [noderef] [usertype] __user *regs
arch/loongarch/kernel/signal.c:223:36: sparse: got unsigned long long [usertype] *
arch/loongarch/kernel/signal.c:232:36: sparse: sparse: cast removes address space '__user' of expression
arch/loongarch/kernel/signal.c:232:36: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned long long [noderef] [usertype] __user *regs @@ got unsigned long long [usertype] * @@
arch/loongarch/kernel/signal.c:232:36: sparse: expected unsigned long long [noderef] [usertype] __user *regs
arch/loongarch/kernel/signal.c:232:36: sparse: got unsigned long long [usertype] *
arch/loongarch/kernel/signal.c:241:36: sparse: sparse: cast removes address space '__user' of expression
arch/loongarch/kernel/signal.c:241:36: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned long long [noderef] [usertype] __user *regs @@ got unsigned long long [usertype] * @@
arch/loongarch/kernel/signal.c:241:36: sparse: expected unsigned long long [noderef] [usertype] __user *regs
arch/loongarch/kernel/signal.c:241:36: sparse: got unsigned long long [usertype] *
arch/loongarch/kernel/signal.c:250:36: sparse: sparse: cast removes address space '__user' of expression
arch/loongarch/kernel/signal.c:250:36: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned long long [noderef] [usertype] __user *regs @@ got unsigned long long [usertype] * @@
arch/loongarch/kernel/signal.c:250:36: sparse: expected unsigned long long [noderef] [usertype] __user *regs
arch/loongarch/kernel/signal.c:250:36: sparse: got unsigned long long [usertype] *
arch/loongarch/kernel/signal.c:259:36: sparse: sparse: cast removes address space '__user' of expression
arch/loongarch/kernel/signal.c:259:36: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned long long [noderef] [usertype] __user *regs @@ got unsigned long long [usertype] * @@
arch/loongarch/kernel/signal.c:259:36: sparse: expected unsigned long long [noderef] [usertype] __user *regs
arch/loongarch/kernel/signal.c:259:36: sparse: got unsigned long long [usertype] *
arch/loongarch/kernel/signal.c:268:36: sparse: sparse: cast removes address space '__user' of expression
arch/loongarch/kernel/signal.c:268:36: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned long long [noderef] [usertype] __user *regs @@ got unsigned long long [usertype] * @@
arch/loongarch/kernel/signal.c:268:36: sparse: expected unsigned long long [noderef] [usertype] __user *regs
arch/loongarch/kernel/signal.c:268:36: sparse: got unsigned long long [usertype] *
arch/loongarch/kernel/signal.c:300:52: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct sctx_info [noderef] __user *info @@ got struct sctx_info *addr @@
arch/loongarch/kernel/signal.c:300:52: sparse: expected struct sctx_info [noderef] __user *info
arch/loongarch/kernel/signal.c:300:52: sparse: got struct sctx_info *addr
arch/loongarch/kernel/signal.c:301:92: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct sctx_info *info @@ got struct sctx_info [noderef] __user *info @@
arch/loongarch/kernel/signal.c:301:92: sparse: expected struct sctx_info *info
arch/loongarch/kernel/signal.c:301:92: sparse: got struct sctx_info [noderef] __user *info
arch/loongarch/kernel/signal.c:301:47: sparse: sparse: cast removes address space '__user' of expression
arch/loongarch/kernel/signal.c:301:47: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct fpu_context [noderef] __user *fpu_ctx @@ got struct fpu_context * @@
arch/loongarch/kernel/signal.c:301:47: sparse: expected struct fpu_context [noderef] __user *fpu_ctx
arch/loongarch/kernel/signal.c:301:47: sparse: got struct fpu_context *
arch/loongarch/kernel/signal.c:302:36: sparse: sparse: cast removes address space '__user' of expression
arch/loongarch/kernel/signal.c:302:36: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned long long [noderef] [usertype] __user *regs @@ got unsigned long long [usertype] * @@
arch/loongarch/kernel/signal.c:302:36: sparse: expected unsigned long long [noderef] [usertype] __user *regs
arch/loongarch/kernel/signal.c:302:36: sparse: got unsigned long long [usertype] *
arch/loongarch/kernel/signal.c:334:52: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct sctx_info [noderef] __user *info @@ got struct sctx_info *addr @@
arch/loongarch/kernel/signal.c:334:52: sparse: expected struct sctx_info [noderef] __user *info
arch/loongarch/kernel/signal.c:334:52: sparse: got struct sctx_info *addr
arch/loongarch/kernel/signal.c:335:92: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct sctx_info *info @@ got struct sctx_info [noderef] __user *info @@
arch/loongarch/kernel/signal.c:335:92: sparse: expected struct sctx_info *info
arch/loongarch/kernel/signal.c:335:92: sparse: got struct sctx_info [noderef] __user *info
arch/loongarch/kernel/signal.c:335:47: sparse: sparse: cast removes address space '__user' of expression
arch/loongarch/kernel/signal.c:335:47: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct fpu_context [noderef] __user *fpu_ctx @@ got struct fpu_context * @@
arch/loongarch/kernel/signal.c:335:47: sparse: expected struct fpu_context [noderef] __user *fpu_ctx
arch/loongarch/kernel/signal.c:335:47: sparse: got struct fpu_context *
arch/loongarch/kernel/signal.c:336:36: sparse: sparse: cast removes address space '__user' of expression
arch/loongarch/kernel/signal.c:336:36: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned long long [noderef] [usertype] __user *regs @@ got unsigned long long [usertype] * @@
arch/loongarch/kernel/signal.c:336:36: sparse: expected unsigned long long [noderef] [usertype] __user *regs
arch/loongarch/kernel/signal.c:336:36: sparse: got unsigned long long [usertype] *
arch/loongarch/kernel/signal.c:369:52: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct sctx_info [noderef] __user *info @@ got struct sctx_info *addr @@
arch/loongarch/kernel/signal.c:369:52: sparse: expected struct sctx_info [noderef] __user *info
arch/loongarch/kernel/signal.c:369:52: sparse: got struct sctx_info *addr
arch/loongarch/kernel/signal.c:370:92: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct sctx_info *info @@ got struct sctx_info [noderef] __user *info @@
arch/loongarch/kernel/signal.c:370:92: sparse: expected struct sctx_info *info
arch/loongarch/kernel/signal.c:370:92: sparse: got struct sctx_info [noderef] __user *info
arch/loongarch/kernel/signal.c:370:47: sparse: sparse: cast removes address space '__user' of expression
>> arch/loongarch/kernel/signal.c:370:47: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct lsx_context [noderef] __user *lsx_ctx @@ got struct lsx_context * @@
arch/loongarch/kernel/signal.c:370:47: sparse: expected struct lsx_context [noderef] __user *lsx_ctx
arch/loongarch/kernel/signal.c:370:47: sparse: got struct lsx_context *
arch/loongarch/kernel/signal.c:371:36: sparse: sparse: cast removes address space '__user' of expression
arch/loongarch/kernel/signal.c:371:36: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned long long [noderef] [usertype] __user *regs @@ got unsigned long long [usertype] * @@
arch/loongarch/kernel/signal.c:371:36: sparse: expected unsigned long long [noderef] [usertype] __user *regs
arch/loongarch/kernel/signal.c:371:36: sparse: got unsigned long long [usertype] *
arch/loongarch/kernel/signal.c:406:52: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct sctx_info [noderef] __user *info @@ got struct sctx_info *addr @@
arch/loongarch/kernel/signal.c:406:52: sparse: expected struct sctx_info [noderef] __user *info
arch/loongarch/kernel/signal.c:406:52: sparse: got struct sctx_info *addr
arch/loongarch/kernel/signal.c:407:92: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct sctx_info *info @@ got struct sctx_info [noderef] __user *info @@
arch/loongarch/kernel/signal.c:407:92: sparse: expected struct sctx_info *info
arch/loongarch/kernel/signal.c:407:92: sparse: got struct sctx_info [noderef] __user *info
arch/loongarch/kernel/signal.c:407:47: sparse: sparse: cast removes address space '__user' of expression
arch/loongarch/kernel/signal.c:407:47: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct lsx_context [noderef] __user *lsx_ctx @@ got struct lsx_context * @@
arch/loongarch/kernel/signal.c:407:47: sparse: expected struct lsx_context [noderef] __user *lsx_ctx
arch/loongarch/kernel/signal.c:407:47: sparse: got struct lsx_context *
arch/loongarch/kernel/signal.c:408:36: sparse: sparse: cast removes address space '__user' of expression
arch/loongarch/kernel/signal.c:408:36: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned long long [noderef] [usertype] __user *regs @@ got unsigned long long [usertype] * @@
arch/loongarch/kernel/signal.c:408:36: sparse: expected unsigned long long [noderef] [usertype] __user *regs
arch/loongarch/kernel/signal.c:408:36: sparse: got unsigned long long [usertype] *
arch/loongarch/kernel/signal.c:444:53: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct sctx_info [noderef] __user *info @@ got struct sctx_info *addr @@
arch/loongarch/kernel/signal.c:444:53: sparse: expected struct sctx_info [noderef] __user *info
arch/loongarch/kernel/signal.c:444:53: sparse: got struct sctx_info *addr
arch/loongarch/kernel/signal.c:446:64: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct sctx_info *info @@ got struct sctx_info [noderef] __user *info @@
arch/loongarch/kernel/signal.c:446:64: sparse: expected struct sctx_info *info
arch/loongarch/kernel/signal.c:446:64: sparse: got struct sctx_info [noderef] __user *info
arch/loongarch/kernel/signal.c:446:18: sparse: sparse: cast removes address space '__user' of expression
>> arch/loongarch/kernel/signal.c:446:18: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct lasx_context [noderef] __user *lasx_ctx @@ got struct lasx_context * @@
arch/loongarch/kernel/signal.c:446:18: sparse: expected struct lasx_context [noderef] __user *lasx_ctx
arch/loongarch/kernel/signal.c:446:18: sparse: got struct lasx_context *
arch/loongarch/kernel/signal.c:447:36: sparse: sparse: cast removes address space '__user' of expression
arch/loongarch/kernel/signal.c:447:36: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned long long [noderef] [usertype] __user *regs @@ got unsigned long long [usertype] * @@
arch/loongarch/kernel/signal.c:447:36: sparse: expected unsigned long long [noderef] [usertype] __user *regs
arch/loongarch/kernel/signal.c:447:36: sparse: got unsigned long long [usertype] *
arch/loongarch/kernel/signal.c:484:53: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct sctx_info [noderef] __user *info @@ got struct sctx_info *addr @@
arch/loongarch/kernel/signal.c:484:53: sparse: expected struct sctx_info [noderef] __user *info
arch/loongarch/kernel/signal.c:484:53: sparse: got struct sctx_info *addr
arch/loongarch/kernel/signal.c:486:64: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct sctx_info *info @@ got struct sctx_info [noderef] __user *info @@
arch/loongarch/kernel/signal.c:486:64: sparse: expected struct sctx_info *info
arch/loongarch/kernel/signal.c:486:64: sparse: got struct sctx_info [noderef] __user *info
arch/loongarch/kernel/signal.c:486:18: sparse: sparse: cast removes address space '__user' of expression
arch/loongarch/kernel/signal.c:486:18: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct lasx_context [noderef] __user *lasx_ctx @@ got struct lasx_context * @@
arch/loongarch/kernel/signal.c:486:18: sparse: expected struct lasx_context [noderef] __user *lasx_ctx
arch/loongarch/kernel/signal.c:486:18: sparse: got struct lasx_context *
arch/loongarch/kernel/signal.c:487:36: sparse: sparse: cast removes address space '__user' of expression
arch/loongarch/kernel/signal.c:487:36: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned long long [noderef] [usertype] __user *regs @@ got unsigned long long [usertype] * @@
arch/loongarch/kernel/signal.c:487:36: sparse: expected unsigned long long [noderef] [usertype] __user *regs
arch/loongarch/kernel/signal.c:487:36: sparse: got unsigned long long [usertype] *
arch/loongarch/kernel/signal.c:543:14: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sctx_info [noderef] __user *info @@ got struct sctx_info * @@
arch/loongarch/kernel/signal.c:543:14: sparse: expected struct sctx_info [noderef] __user *info
arch/loongarch/kernel/signal.c:543:14: sparse: got struct sctx_info *
arch/loongarch/kernel/signal.c:570:42: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sctx_info *addr @@ got struct sctx_info [noderef] __user *info @@
arch/loongarch/kernel/signal.c:570:42: sparse: expected struct sctx_info *addr
arch/loongarch/kernel/signal.c:570:42: sparse: got struct sctx_info [noderef] __user *info
arch/loongarch/kernel/signal.c:577:42: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sctx_info *addr @@ got struct sctx_info [noderef] __user *info @@
arch/loongarch/kernel/signal.c:577:42: sparse: expected struct sctx_info *addr
arch/loongarch/kernel/signal.c:577:42: sparse: got struct sctx_info [noderef] __user *info
arch/loongarch/kernel/signal.c:584:43: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sctx_info *addr @@ got struct sctx_info [noderef] __user *info @@
arch/loongarch/kernel/signal.c:584:43: sparse: expected struct sctx_info *addr
arch/loongarch/kernel/signal.c:584:43: sparse: got struct sctx_info [noderef] __user *info
arch/loongarch/kernel/signal.c:591:46: sparse: sparse: cast removes address space '__user' of expression
arch/loongarch/kernel/signal.c:591:22: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sctx_info [noderef] __user *info @@ got struct sctx_info * @@
arch/loongarch/kernel/signal.c:591:22: sparse: expected struct sctx_info [noderef] __user *info
arch/loongarch/kernel/signal.c:591:22: sparse: got struct sctx_info *
arch/loongarch/kernel/signal.c:737:17: sparse: sparse: symbol 'sys_rt_sigreturn' was not declared. Should it be static?
arch/loongarch/kernel/signal.c: note: in included file:
arch/loongarch/include/asm/fpu.h:72:17: sparse: sparse: undefined identifier '__builtin_loongarch_csrrd_w'
arch/loongarch/include/asm/fpu.h:72:17: sparse: sparse: cast from unknown type
arch/loongarch/include/asm/fpu.h:72:17: sparse: sparse: cast from unknown type
arch/loongarch/include/asm/fpu.h:81:17: sparse: sparse: undefined identifier '__builtin_loongarch_csrrd_w'
arch/loongarch/include/asm/fpu.h:81:17: sparse: sparse: cast from unknown type
arch/loongarch/include/asm/fpu.h:72:17: sparse: sparse: cast from unknown type
arch/loongarch/include/asm/fpu.h:81:17: sparse: sparse: cast from unknown type
arch/loongarch/include/asm/fpu.h:72:17: sparse: sparse: cast from unknown type
arch/loongarch/include/asm/fpu.h:72:17: sparse: sparse: cast from unknown type
arch/loongarch/include/asm/fpu.h:81:17: sparse: sparse: cast from unknown type
arch/loongarch/kernel/signal.c: note: in included file (through arch/loongarch/include/asm/cpu-info.h, arch/loongarch/include/asm/processor.h, ...):
arch/loongarch/include/asm/loongarch.h:1281:1: sparse: sparse: undefined identifier '__builtin_loongarch_csrrd_w'
arch/loongarch/include/asm/loongarch.h:1281:1: sparse: sparse: cast from unknown type
arch/loongarch/include/asm/loongarch.h:1281:1: sparse: sparse: undefined identifier '__builtin_loongarch_csrwr_w'
arch/loongarch/include/asm/loongarch.h:1281:1: sparse: sparse: cast from unknown type
arch/loongarch/kernel/signal.c: note: in included file:
arch/loongarch/include/asm/fpu.h:81:17: sparse: sparse: cast from unknown type
arch/loongarch/kernel/signal.c: note: in included file (through arch/loongarch/include/asm/cpu-info.h, arch/loongarch/include/asm/processor.h, ...):
arch/loongarch/include/asm/loongarch.h:1281:1: sparse: sparse: cast from unknown type
arch/loongarch/include/asm/loongarch.h:1281:1: sparse: sparse: cast from unknown type
vim +370 arch/loongarch/kernel/signal.c
365
366 static int protected_save_lsx_context(struct extctx_layout *extctx)
367 {
368 int err = 0;
369 struct sctx_info __user *info = extctx->lsx.addr;
> 370 struct lsx_context __user *lsx_ctx = (struct lsx_context *)get_ctx_through_ctxinfo(info);
371 uint64_t __user *regs = (uint64_t *)&lsx_ctx->regs;
372 uint64_t __user *fcc = &lsx_ctx->fcc;
373 uint32_t __user *fcsr = &lsx_ctx->fcsr;
374
375 while (1) {
376 lock_fpu_owner();
377 if (is_lsx_enabled())
378 err = save_hw_lsx_context(lsx_ctx);
379 else {
380 if (is_fpu_owner())
381 save_fp(current);
382 err = copy_lsx_to_sigcontext(lsx_ctx);
383 }
384 unlock_fpu_owner();
385
386 err |= __put_user(LSX_CTX_MAGIC, &info->magic);
387 err |= __put_user(extctx->lsx.size, &info->size);
388
389 if (likely(!err))
390 break;
391 /* Touch the LSX context and try again */
392 err = __put_user(0, ®s[0]) |
393 __put_user(0, ®s[32*2-1]) |
394 __put_user(0, fcc) |
395 __put_user(0, fcsr);
396 if (err)
397 return err; /* really bad sigcontext */
398 }
399
400 return err;
401 }
402
403 static int protected_restore_lsx_context(struct extctx_layout *extctx)
404 {
405 int err = 0, sig = 0, tmp __maybe_unused;
406 struct sctx_info __user *info = extctx->lsx.addr;
407 struct lsx_context __user *lsx_ctx = (struct lsx_context *)get_ctx_through_ctxinfo(info);
408 uint64_t __user *regs = (uint64_t *)&lsx_ctx->regs;
409 uint64_t __user *fcc = &lsx_ctx->fcc;
410 uint32_t __user *fcsr = &lsx_ctx->fcsr;
411
412 err = sig = fcsr_pending(fcsr);
413 if (err < 0)
414 return err;
415
416 while (1) {
417 lock_fpu_owner();
418 if (is_lsx_enabled())
419 err = restore_hw_lsx_context(lsx_ctx);
420 else {
421 err = copy_lsx_from_sigcontext(lsx_ctx);
422 if (is_fpu_owner())
423 restore_fp(current);
424 }
425 unlock_fpu_owner();
426
427 if (likely(!err))
428 break;
429 /* Touch the LSX context and try again */
430 err = __get_user(tmp, ®s[0]) |
431 __get_user(tmp, ®s[32*2-1]) |
432 __get_user(tmp, fcc) |
433 __get_user(tmp, fcsr);
434 if (err)
435 break; /* really bad sigcontext */
436 }
437
438 return err ?: sig;
439 }
440
441 static int protected_save_lasx_context(struct extctx_layout *extctx)
442 {
443 int err = 0;
444 struct sctx_info __user *info = extctx->lasx.addr;
445 struct lasx_context __user *lasx_ctx =
> 446 (struct lasx_context *)get_ctx_through_ctxinfo(info);
447 uint64_t __user *regs = (uint64_t *)&lasx_ctx->regs;
448 uint64_t __user *fcc = &lasx_ctx->fcc;
449 uint32_t __user *fcsr = &lasx_ctx->fcsr;
450
451 while (1) {
452 lock_fpu_owner();
453 if (is_lasx_enabled())
454 err = save_hw_lasx_context(lasx_ctx);
455 else {
456 if (is_lsx_enabled())
457 save_lsx(current);
458 else if (is_fpu_owner())
459 save_fp(current);
460 err = copy_lasx_to_sigcontext(lasx_ctx);
461 }
462 unlock_fpu_owner();
463
464 err |= __put_user(LASX_CTX_MAGIC, &info->magic);
465 err |= __put_user(extctx->lasx.size, &info->size);
466
467 if (likely(!err))
468 break;
469 /* Touch the LASX context and try again */
470 err = __put_user(0, ®s[0]) |
471 __put_user(0, ®s[32*4-1]) |
472 __put_user(0, fcc) |
473 __put_user(0, fcsr);
474 if (err)
475 return err; /* really bad sigcontext */
476 }
477
478 return err;
479 }
480
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
next reply other threads:[~2023-12-01 2:09 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-01 2:08 kernel test robot [this message]
-- strict thread matches above, loose matches on Subject: below --
2024-04-01 12:23 arch/loongarch/kernel/signal.c:370:47: sparse: sparse: incorrect type in initializer (different address spaces) kernel test robot
2023-11-30 4:02 kernel test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202312011002.Ruq1PBC9-lkp@intel.com \
--to=lkp@intel.com \
--cc=chenhuacai@loongson.cn \
--cc=linux-kernel@vger.kernel.org \
--cc=oe-kbuild-all@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.