public inbox for llvm@lists.linux.dev
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: "Mike Rapoport (IBM)" <rppt@kernel.org>
Cc: llvm@lists.linux.dev, oe-kbuild-all@lists.linux.dev,
	Mike Rapoport <rppt@kernel.org>
Subject: [rppt:execmem/x86-rox/rfc-v2 21/25] arch/x86/kernel/alternative.c:417:17: error: call to undeclared function 'module_writable_address'; ISO C99 and later do not support implicit function declarations
Date: Mon, 6 May 2024 23:43:06 +0800	[thread overview]
Message-ID: <202405062340.eU4eWKR3-lkp@intel.com> (raw)

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/rppt/linux.git execmem/x86-rox/rfc-v2
head:   0caa8ac5e8f2f6de2e75cd2ddd552e8756779944
commit: 4527045f6e1892edac12176b8d82094c35427cdf [21/25] x86/module: perpare module loading for ROX allocations of text
config: x86_64-allnoconfig (https://download.01.org/0day-ci/archive/20240506/202405062340.eU4eWKR3-lkp@intel.com/config)
compiler: clang version 18.1.4 (https://github.com/llvm/llvm-project e6c3289804a67ea0bb6a86fadbe454dd93b8d855)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240506/202405062340.eU4eWKR3-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/202405062340.eU4eWKR3-lkp@intel.com/

All errors (new ones prefixed by >>):

>> arch/x86/kernel/alternative.c:417:17: error: call to undeclared function 'module_writable_address'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
     417 |         u8 *wr_instr = module_writable_address(mod, instr);
         |                        ^
>> arch/x86/kernel/alternative.c:417:6: error: incompatible integer to pointer conversion initializing 'u8 *' (aka 'unsigned char *') with an expression of type 'int' [-Wint-conversion]
     417 |         u8 *wr_instr = module_writable_address(mod, instr);
         |             ^          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/x86/kernel/alternative.c:500:14: error: call to undeclared function 'module_writable_address'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
     500 |                 wr_instr = module_writable_address(mod, instr);
         |                            ^
>> arch/x86/kernel/alternative.c:500:12: error: incompatible integer to pointer conversion assigning to 'u8 *' (aka 'unsigned char *') from 'int' [-Wint-conversion]
     500 |                 wr_instr = module_writable_address(mod, instr);
         |                          ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   arch/x86/kernel/alternative.c:503:18: error: incompatible integer to pointer conversion assigning to 'u8 *' (aka 'unsigned char *') from 'int' [-Wint-conversion]
     503 |                 wr_replacement = module_writable_address(mod, replacement);
         |                                ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   5 errors generated.


vim +/module_writable_address +417 arch/x86/kernel/alternative.c

   409	
   410	/*
   411	 * Rewrite the "call BUG_func" replacement to point to the target of the
   412	 * indirect pv_ops call "call *disp(%ip)".
   413	 */
   414	static int alt_replace_call(u8 *instr, u8 *insn_buff, struct alt_instr *a,
   415				    struct module *mod)
   416	{
 > 417		u8 *wr_instr = module_writable_address(mod, instr);
   418		void *target, *bug = &BUG_func;
   419		s32 disp;
   420	
   421		if (a->replacementlen != 5 || insn_buff[0] != CALL_INSN_OPCODE) {
   422			pr_err("ALT_FLAG_DIRECT_CALL set for a non-call replacement instruction\n");
   423			BUG();
   424		}
   425	
   426		if (a->instrlen != 6 ||
   427		    wr_instr[0] != CALL_RIP_REL_OPCODE ||
   428		    wr_instr[1] != CALL_RIP_REL_MODRM) {
   429			pr_err("ALT_FLAG_DIRECT_CALL set for unrecognized indirect call\n");
   430			BUG();
   431		}
   432	
   433		/* Skip CALL_RIP_REL_OPCODE and CALL_RIP_REL_MODRM */
   434		disp = *(s32 *)(wr_instr + 2);
   435	#ifdef CONFIG_X86_64
   436		/* ff 15 00 00 00 00   call   *0x0(%rip) */
   437		/* target address is stored at "next instruction + disp". */
   438		target = *(void **)(instr + a->instrlen + disp);
   439	#else
   440		/* ff 15 00 00 00 00   call   *0x0 */
   441		/* target address is stored at disp. */
   442		target = *(void **)disp;
   443	#endif
   444		if (!target)
   445			target = bug;
   446	
   447		/* (BUG_func - .) + (target - BUG_func) := target - . */
   448		*(s32 *)(insn_buff + 1) += target - bug;
   449	
   450		if (target == &nop_func)
   451			return 0;
   452	
   453		return 5;
   454	}
   455	
   456	/*
   457	 * Replace instructions with better alternatives for this CPU type. This runs
   458	 * before SMP is initialized to avoid SMP problems with self modifying code.
   459	 * This implies that asymmetric systems where APs have less capabilities than
   460	 * the boot processor are not handled. Tough. Make sure you disable such
   461	 * features by hand.
   462	 *
   463	 * Marked "noinline" to cause control flow change and thus insn cache
   464	 * to refetch changed I$ lines.
   465	 */
   466	void __init_or_module noinline apply_alternatives(struct alt_instr *start,
   467							  struct alt_instr *end,
   468							  struct module *mod)
   469	{
   470		struct alt_instr *a;
   471		u8 *instr, *replacement;
   472		u8 insn_buff[MAX_PATCH_LEN];
   473	
   474		DPRINTK(ALT, "alt table %px, -> %px", start, end);
   475	
   476		/*
   477		 * In the case CONFIG_X86_5LEVEL=y, KASAN_SHADOW_START is defined using
   478		 * cpu_feature_enabled(X86_FEATURE_LA57) and is therefore patched here.
   479		 * During the process, KASAN becomes confused seeing partial LA57
   480		 * conversion and triggers a false-positive out-of-bound report.
   481		 *
   482		 * Disable KASAN until the patching is complete.
   483		 */
   484		kasan_disable_current();
   485	
   486		/*
   487		 * The scan order should be from start to end. A later scanned
   488		 * alternative code can overwrite previously scanned alternative code.
   489		 * Some kernel functions (e.g. memcpy, memset, etc) use this order to
   490		 * patch code.
   491		 *
   492		 * So be careful if you want to change the scan order to any other
   493		 * order.
   494		 */
   495		for (a = start; a < end; a++) {
   496			int insn_buff_sz = 0;
   497			u8 *wr_instr, *wr_replacement;
   498	
   499			instr = (u8 *)&a->instr_offset + a->instr_offset;
 > 500			wr_instr = module_writable_address(mod, instr);
   501	
   502			replacement = (u8 *)&a->repl_offset + a->repl_offset;
   503			wr_replacement = module_writable_address(mod, replacement);
   504	
   505			BUG_ON(a->instrlen > sizeof(insn_buff));
   506			BUG_ON(a->cpuid >= (NCAPINTS + NBUGINTS) * 32);
   507	
   508			/*
   509			 * Patch if either:
   510			 * - feature is present
   511			 * - feature not present but ALT_FLAG_NOT is set to mean,
   512			 *   patch if feature is *NOT* present.
   513			 */
   514			if (!boot_cpu_has(a->cpuid) == !(a->flags & ALT_FLAG_NOT)) {
   515				optimize_nops_inplace(wr_instr, a->instrlen);
   516				continue;
   517			}
   518	
   519			DPRINTK(ALT, "feat: %d*32+%d, old: (%pS (%px) len: %d), repl: (%px, len: %d) flags: 0x%x",
   520				a->cpuid >> 5,
   521				a->cpuid & 0x1f,
   522				instr, instr, a->instrlen,
   523				replacement, a->replacementlen, a->flags);
   524	
   525			memcpy(insn_buff, wr_replacement, a->replacementlen);
   526			insn_buff_sz = a->replacementlen;
   527	
   528			if (a->flags & ALT_FLAG_DIRECT_CALL) {
   529				insn_buff_sz = alt_replace_call(instr, insn_buff, a,
   530								mod);
   531				if (insn_buff_sz < 0)
   532					continue;
   533			}
   534	
   535			for (; insn_buff_sz < a->instrlen; insn_buff_sz++)
   536				insn_buff[insn_buff_sz] = 0x90;
   537	
   538			apply_relocation(insn_buff, a->instrlen, instr, replacement, a->replacementlen);
   539	
   540			DUMP_BYTES(ALT, wr_instr, a->instrlen, "%px:   old_insn: ", instr);
   541			DUMP_BYTES(ALT, replacement, a->replacementlen, "%px:   rpl_insn: ", replacement);
   542			DUMP_BYTES(ALT, insn_buff, insn_buff_sz, "%px: final_insn: ", instr);
   543	
   544			text_poke_early(wr_instr, insn_buff, insn_buff_sz);
   545		}
   546	
   547		kasan_enable_current();
   548	}
   549	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

                 reply	other threads:[~2024-05-06 15:43 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

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=202405062340.eU4eWKR3-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=llvm@lists.linux.dev \
    --cc=oe-kbuild-all@lists.linux.dev \
    --cc=rppt@kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox